noir_neo’s blog

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

Windows の Unity でビルドした mac app を送るときは zip に気をつける

問題

Windows の Unity で mac ビルドしたとき *.app ディレクトリを直接 zip すると mac で unzip したときに、 Contents ディレクトリがルートになってしまいアプリとして起動できない

送る側は

(試してないけど)

テキトウなディレクトリにネストして zip すれば問題ないはず

(もしくはそういう zip オプションもあった気がする)

もし送られてきたら

要は *.app ディレクトリをつくって中に Contents を放り込めば良い

ただし finder では *.app ディレクトリは作れない(正確には作れるがドラッグアンドドロップできない)ので

ターミナルで

mkdir Hoge.app
cp -R Contents Hoge.app

最後に

Windowsmac ビルドをしないといけない状況はなかなか起きないと思うけど、 いざというとき *.app ディレクトリの特殊さをしらないとハマりそうだなと思ったので記しておく

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

現職は退職していませんが、昨年の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分で終わるくらいの、ちょっとしたアニメーションをつける作業だけした。

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


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