noir_neo’s blog

日記と偶にスマホゲームの感想と、重箱の隅をつつくようなUI/UX批評

ゆいゆい*カンパニーにジョインしました

現職は退職していませんが、昨年の12月から ゆいゆい*カンパニー でオタクとして働いています。

f:id:noir_neo:20180419225612j:plain
今日ようやく社員証をもらえました (社員番号は念のため伏せておきます)

入社のきっかけ

社長の小倉唯さんのことは数年前から一方的に知っていたのですが、 声、演技、歌、トーク、ルックス、どれをとっても非常に魅力のある方だなと以前から思っていました。

今回新会社の立ち上げという話を耳にした際に、ぜひ参加したいとこちらから申し出て入社に至りました。

業務内容

現職を続けつつスポットでお手伝いするような働き方をしています。

詳しいことはもちろん守秘義務違反なので書けませんが、

などといった感じです。

これから

小倉唯歴で4年程度、実務経験は1年未満とまだまだ経験が浅いので、まずはできることを増やしていきたいと思っています。 具体的には、 社長 Instagram社長 LINE ブログ へのコメントや前述ラジオへのメールなど、社長へのフィードバック業務が直近で覚えたい仕事です。

さいごに

ところで、武蔵野の森をうっかり2枚チケット取ってしまったのですが、連番希望の方は社内外問わずご連絡ください。

Unity で System.Net.WebSockets を使ったゲームサーバー書こうとしたらうまくいかない

今週ずっと悩んでる。

動機

なんとなくリアルタイムサーバーっていうか、 websocket でクライアントと繋がってるサーバーがどうなってるのかよくわかってなかったので、雑に書いてみたかった。 Unity をリアルタイムサーバーにしたければ、 NetworkManager とか使えばすぐできるのはわかってて、 適当に体験する分には楽かなと思って .Net 4.5 で入ったらしいそれで雑に書いてみたかった。

うまくいかないこと

HttpListener でリクエストを受け取って、ハンドシェイクするところが、どうにも websocket として判定されない。

var httpListener = new HttpListener();
httpListener.Prefixes.Add(uriPrefix);
httpListener.Start();

while (true)
{
    var listenerContext = await httpListener.GetContextAsync();
    if (listenerContext.Request.IsWebSocketRequest) // これが true にならない
    {

全コードは最後に。

windows でも mac でもだめ。 Unity 2017.3 と 2018.1b10 は試した。 参考にした .Net のアプリケーションを実行しても同じだったので、 元のコードが悪そうだけど、どうすればいいのか検討もつかない。

Windows 7 で動かないという情報しか見つからない。久しぶりに"詰んだ"感覚を味わっている。

実装

一応載せておくけど、ほぼ下記のコピペ

WebSocket-Samples/Server.cs at master · paulbatum/WebSocket-Samples · GitHub

サーバー

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.WebSockets;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;

public class Server : MonoBehaviour
{
    [SerializeField] private string uriPrefix;

    void Awake()
    {
        StartServer(uriPrefix);
        Log("start.");
    }

    void OnDestroy()
    {
        Parallel.ForEach(_client,p=>
        {
            if (p.State == WebSocketState.Open) p.CloseAsync(WebSocketCloseStatus.NormalClosure, "", System.Threading.CancellationToken.None);
        });
    }

    static readonly List<WebSocket> _client = new List<WebSocket>();

    static async void StartServer(string uriPrefix)
    {
        var httpListener = new HttpListener();
        httpListener.Prefixes.Add(uriPrefix);
        httpListener.Start();

        while (true)
        {
            var listenerContext = await httpListener.GetContextAsync();
            if (listenerContext.Request.IsWebSocketRequest)
            {
                ProcessRequest(listenerContext);
            }
            else
            {
                listenerContext.Response.StatusCode = 400;
                listenerContext.Response.Close();
                Log("Response 400");
            }
        }
    }

    static async void ProcessRequest(HttpListenerContext listenerContext)
    {
        Log($"New Session:{listenerContext.Request.RemoteEndPoint.Address}");

        var ws = (await listenerContext.AcceptWebSocketAsync(null)).WebSocket;
        _client.Add(ws);

        while (ws.State == WebSocketState.Open)
        {
            try
            {
                var buff = new ArraySegment<byte>(new byte[1024]);

                var ret = await ws.ReceiveAsync(buff, System.Threading.CancellationToken.None);

                if (ret.MessageType == WebSocketMessageType.Text)
                {
                    Log($"String Received:{listenerContext.Request.RemoteEndPoint.Address}");
                    Log($"Message={Encoding.UTF8.GetString(buff.Take(ret.Count).ToArray())}");

                    Parallel.ForEach(_client,
                        p => p.SendAsync(new ArraySegment<byte>(buff.Take(ret.Count).ToArray()),
                        WebSocketMessageType.Text,
                        true,
                        System.Threading.CancellationToken.None));
                }
                else if(ret.MessageType == WebSocketMessageType.Close)
                {
                    Log($"Session Close:{listenerContext.Request.RemoteEndPoint.Address}");
                    break;
                }
            }
            catch
            {
                Log($"Session Abort:{listenerContext.Request.RemoteEndPoint.Address}");
                break;
            }
        }

        _client.Remove(ws);
        ws.Dispose();

    }

    private static void Log(object o)
    {
        Debug.Log($"Server: {o}");
    }
}

20171225 - 20171231

水曜日、みのりんのライブに行った。

仕事休んで昼夜通してよかった。 とても元気になった。

茅原実里|Minori with Strings Quartet 〜弦楽四重奏の調べ〜 12月28日より音楽配信スタート! | News | Lantis web site

ずっと聴いてる。


今週はまあまあ趣味のコード書いた。

ジェスチャー取るやつをリファクタリングしていた。

いい感じに書けていてすごく気持ちいい。


仕事はまあなんとか納まった。


金曜、焼肉してバー行って満足度の高い忘年だった。

おいしかった。


土曜、すしがコーヒー豆とお菓子持って来てくれたのでお茶した。

おいしかった。


帰省している。 予定どおりに家を出るのはやはり無理。

家庭環境比較的よくなっていて心は穏やか。

でもまあ本当はオタクコンテンツゆっくり楽しみながら年越ししたいし、 来年とかは正月に一泊とかだけしに来るくらいでいいかなって思ってたりする。。


今週は雑。

よいお年を。

広告を非表示にする

20171218 - 20171224

今週も相変わらず体調よくない日が続いた。寒い。

あんまり年末感ない。


今年一番くらいにめーっちゃめちゃめちゃめちゃうれしいニュースがあって

声優の石原夏織さんがソロアーティストデビューすることが発表された。

今年一番悲しかったニュースが、ゆいかおり活動休止で

ぼくは小倉唯ちゃんのファンなので、今年後半のゆいたまの活躍ぶりはそれはもちろんうれしかったのだけど、 一方で、たまに更新されるキャリさんのブログを見ては少し寂しい気持ちになったりしていた。

そんなわけで、なんとなくゆいかおりの曲を聴くのを避けていた時期もあったのだけど、 このニュースがあって、本当にうれしくて、ちゃんと前に進んでいるんだよかったーって。

ぼくもがんばろって思いました。

来年も、ふたりのことを応援していきたい。

t.co キャリさんの魅力がよく出ているインタビュー記事。良い。


ところで、ゆいゆい*カンパニー早速入社した。

fc.ogurayui.net


金曜は会社で飲酒LT大会した。

すごい盛り上がって楽しかったし 声かけた人みんな来てくれて、うれしかった。

ウイスキー飲みすぎてすごい泥酔した。


土曜日はうちで、だいたいいつもの感じで忘年会した。

食べ物がいっぱいあって幸せみが高かった。

最近の中では真面目なことしゃべった方な気がする。


日曜は、昼過ぎまで寝てて、部屋を片した後 バルド・マスターピース・クロニクルとカサブランカの騎士を開封した。

products.web-giga.com

www.silkysplus.jp

とりあえずCDが全部で15枚くらい取り込みして大変だった。

とにかく嬉しいのが、バルドスカイの主題歌音源が手に入ったこと。 めっちゃ好きなのでテンション上がっている。


今期アニメ、このはな奇譚と少女終末旅行は最終回も本当にすばらしく、尊かった。


開発はほとんどすすんでない


今週ただのオタクブログになってしまったな。

広告を非表示にする

20171211 - 20171217

今週はまあまあ楽しかった。


C#実践開発手法 デザインパターンとSOLID原則によるアジャイルなコーディング kindle 版が半額になっていたので買った。(もう戻ってるみたい)

わりと読みたかった本なのでうれしいのだけど、本読む機運が低いのでまだ読んでない。


会社のブログに書いた記事はちゃんと公開された。 そこそこシェアされたりしていて、承認欲求満たされまくっている。

一応、インターネット上で所属は明確には結び付けない方針なのでナイショ。 直接聞いてくれたらこっそり教える。


今週は仕事、結構集中してやった。 だいたい予定通り進んでいる気もする。

相変わらず朝はしんどくて遅刻する。


会社の金で結構飲み食いした。

高島屋でいいランチ食べたり、採用絡みの会食があったり、忘年会があった。


きららファンタジアがリリースされて、遊んでいる。

公式リセマラは、カレンの星5だけでやめた。 f:id:noir_neo:20171218011315p:plain

あんまり続かないだろうと思っているけど、毎日ログインだけじゃなくてちゃんとクエスト進めている。

NEW GAME の章まで来られたので、またしばらく続くかもしれない。


久しぶりに週末にちゃんとコード書いた。

github.com

pivot を指定して回転できるスクリプト。わりといい感じ。 そのうち Qiita とかに記事書く。


FF15 やった。めちゃ楽しかった。

広告を非表示にする

20171204 - 20171210

id:mentaiko_guma 氏に触発されて週間日記なるものを始めてみる。来週も投稿されるかは神の味噌汁。


今週も一回も定時に出社できなかった。

別に残業してやることはやってるし、そもそも裁量労働なので怒られたりはしない。けど、そろそろ定時に出社して定時に退勤する生活を送りたい。

仕事は、なんか予定していたことに付随してやらないといけないことが出てきたりして、そっちに時間かかってしまって、メインの予定していた仕事が持ち越しになってしまって週末を迎えている。まあいずれにせよやっておかないといけなかったことだし、(同僚のおかげで)多少の余裕はあるので精神的に厳しくはない。


今週の残業バッググラウンドアニメは天使の3Pだった。リアタイでも見てたので見直し。

先週くらいに、劇中歌でボーカルソフト音声として小倉唯ちゃんが歌っていた曲の音源が収録されていると知ってこれを買って、機運が高まっていた。

やっぱり小学生音楽は最高だぜ! という気持ちになる。

音楽、ゲームに関わるものの中で最も知識が薄いので、機会があればやりたい。と定期的に思っている気がする。

ちなみに OPED も今更買った。 「楔」めちゃくちゃかっこいいのでぜひフルで聞いて欲しいと思いました。

楔 - Single

楔 - Single

  • Baby's breath
  • アニメ
  • ¥500


今週は結構キーボードいじった。

SandS と Programmer Dvorak 突然思い立って初めたけど、かなりよさげ。詳しくはアドベントカレンダーの記事を。


木曜日くらいに、デュアルキーボードに関する記事を書いて社内のドキュメント共有サービスみたいなのに投稿した。

会社の開発者ブログ向けにもリライトしてあるので、できれば今週中に投稿したい。


土曜日はアドベントカレンダーの記事を書いてから、酒を買いに行った。

雪の茅舎の新酒を買った。クイーンズ伊勢丹は季節ものの日本酒が揃っているから神。

いま最後の一杯を飲んでいるので、土日で4合開けてしまった。 冬は日本酒がうまくて敵わない。

金土日と毎日、鍋かしゃぶしゃぶか湯豆腐かわからん雑な鍋ものを食って生きている。水菜が安くてうれしい。

これが日本酒とも合うからたまらん。


個人開発が全然進んでいない。

集中したら30分で終わるくらいの、ちょっとしたアニメーションをつける作業だけした。

シャワー浴びているときとかにやりたいことは思い浮かんでワクワクするので、やはりまずは定時出社定時退勤で平日の余暇生成をがんばりたい。


メロフラの時間なので今回はこの辺で。

広告を非表示にする

「入力」を大幅に見直した2017年

MD Advent Calendar 2017 10日目の記事です。

昨日は soymilk007 さんの ようこ — 「自担」とは何か? 【この記事はMD Advent Calendar 2017 9日目の記事です。】... でした。

とても真面目でしたね。「自担」って言葉は知りませんでした。私の知っている言葉だと、「ガチ恋」が近いかな?


改めましてこんにちは、メガネ美少女で有名な @noir_neo こと、ねおりんです。

MD を卒業できなかったタイプの人です。 普段は新宿の南口あたりでキーボードの音を奏でて生計を立てています。

これは大事なことなのですが、クリスマスイヴの予定はまだ空いておりますので、ぜひ Twitter などでお声がけください。25は仕事じゃ。


さて私の今日の話ですが、 今年は「入力」についてたくさんの見直しを行ってきた年だったので、その振り返りと布教をしたいと思います。

さて入力とはなんのことを言っているのかというと、当然コンピュータへの入力です。まあ具体的には、キーボードとマウスの話です。

Dvorak 配列にした

それではまず今年一番の大きな変化、配列の話からしていきましょう。

みなさんはどのようなキー配列を使っているでしょうか。おそらく多くの方は、左上が qwerty で始まる QWERTY 配列でタイピングしていると思います。 (配列とだけ書くと、 JIS とか US とかっていう配列もありますが、ここでは別の話です。ちなみに私は US 派です) ほとんどのキーボードに標準で印字されていて、標準で入力される配列ですね。

私は5月くらいから Dvorak という配列を使い始めました。 Dvorak 配列というのは、左上から dvorak... というわけではなく、ドボラックさんが考えた配列です。作曲家のドヴォルザーク(チェコ語の発音)さんの遠い親戚らしいです。

こんな感じの配列です。

https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/KB_United_States_Dvorak.svg/1080px-KB_United_States_Dvorak.svg.png Dvorak配列 - Wikipedia

おわかりのように、左手の中段に母音が集中しています。これによって右左右左とテンポの良い入力がしやすいのが特徴です。

使い始めのころの記事があるので、導入方法とか詳しくはそちらを見てみてください。

Dvorak 1日目 - noir_neo’s blog

初めはパソコン触りたてのようなおぼつかない入力でしたが、1ヶ月ほどですっかり慣れ、今ではもはや QWERTY が打てないほどになりました。(ぶっちゃけ、稀に職場で同僚のPCを触る必要があるときに困ります)

またこれは副作用ですが、習得時にとにかくホームポジションを守って指で覚えるようにしたため、今では綺麗なホームポジションでタイピングができるようになりました。

ところで、この Dvorak をさらにプログラマ向けに改良した Programmer Dvorak という配列があるのですが、つい最近これにしました。

https://www.kaufmann.no/roland/dvorak/images/dvp1.png Programmer Dvorak

ぱっと見の大きな違いは最上段の記号と数字の並びですね。一見ワケガワカラナイかもしれませんが、実際使ってみると、指で覚えやすい並びということがわかります。

そしてよく見ると気づくのですが、数字と記号が上下逆です。単体で押すと記号が、 shift を押しているときに数字が入力されます。なぜなら、プログラマーは数字よりも記号を打つことのほうが多いから!

さすがにハードル高いなーと思う人は、まず shift の逆転から始めるとよいです。わたしもしばらくそれでやっていました。これも過去の記事が参考になると思います。

Dvorak いじった - noir_neo’s blog

いろいろ拡張を入れていってる

Programmer Dvorak と同じタイミングなのでつい最近の話ですが、 SandS を入れました。

スペースバーを押しながら他のキーを押すと shift を押していることになる、という拡張です。スペースバーだけを押してそのまま上げるとスペースバー本来の働きをします。 だって shift とか小指を折り曲げないとだし、押しにくいじゃないですか。親指にもっと仕事をさせましょう!というやつですね。

まだ少し慣れていなくて、 へんかんSiyo みたいになることや、癖が抜けずに小指で shift 押していたりしますが、概ねとてもいい感じです。このまま慣れていきたい気持ちです。

他に、以前から入れている拡張だと、右 ⌘ と ijkl で矢印キーになるようにしたりしています。これはホームポジションを崩さずに右手だけで矢印キーを打てるのでとても便利です。

あとは ctrl + j (j は QWERTY での j)で esc になるのとか入れています。(今年 Touch Bar 搭載 MacBook Pro を買いました) いやでも、 Touch Bar の esc 云々以前に、頻繁に使うのに遠すぎですよね、 esc 。

デュアルキーボードをはじめた

ここまでソフトウェアの話をしてきましたが、次にハードウェアの話をします。

夏くらいにデュアルキーボードを始めました。 デュアルキーボードとは、2台のキーボードを左右に並べて、左のキーボードの左半分を左手、右のキーボードの右半分を右手でタイプするスタイルのことです。

そもそも分割キーボード(↓こういうの)に興味があったのですが、微妙に好みのものがなくて、

www.archisite.co.jp

会社にいる 変態 先達に倣って、手元にあった2台のキーボードでやってみたら快適だった、という経緯です。 左右それぞれの腕に対して楽な位置でタイプできるのもいいですし、スペースバーが2つになるのが素晴らしいです。(私は右のキーボードのスペースバーは ⌘ にしています)

MX ERGO でトラックボールデビューした

9月に ロジクール(Logitech)から7年ぶりの新作トラックボールマウスが発売されましたね。

www.logicool.co.jp

マウスでの Unity 作業にうんざりしていた私は、この機に購入しトラックボールを使い始めました。 もう最高ね。特にドラッグアンドドロップがとっっっっっっってもしやすいです。

さいごに

そんなわけで入力を見直してきた2017年ですが、いまの職場のデスクはこんな感じです。

f:id:noir_neo:20171209221017j:plain
Apple Wireless Keyboard(会社支給)、Majestouch2(私物)、Magic Trackpad(会社支給)、MX ERGO(私物) AbemaTV でアニメを見ているのは定時後だけです!!

まだまだ健全ですね。

以前は一日中コードを書いていると手首や指が痛くなったりして湿布を貼りつつ仕事をしていたのですが、最近はそういうことはなくなりました。 (設定をいじった直後とかは、意識しすぎて慣れない運指で攣りそうになることとかはあります)

諸々慣れるまでは決して楽ではありませんが、これまでの人生で入力した量と、これからの人生で入力する量を比較した時、移行コストが高すぎるということはないと思うのです。

コンピュータの入力に関して標準の環境というのは、改善の余地が多々あります。ぜひ自分のために、自分に合うものを選択しましょう。

この記事が、みなさんが一歩を踏み出すきっかけになれば幸いです。 私もまだまだ改善したい部分があるので、来年も引き続きやっていきます。

さて明日は Akkieeffect の日本酒クズの話ですね。 冬は、寒おろしはすごくうまみがあるし、新酒しぼりたては刺激的だし、日本酒がおいしい素晴らしい季節ですよね。 どんなお店を紹介してくれるのか楽しみです。