noir_neo’s blog

140字より長い文章を投稿するところ

1ヶ月ニートした結果www

ねおりんアドベントカレンダー 1日目の記事です。

これはなに

しばらくニートしたのでそのときのログです。

なぜニートしたのか

会社やめた*1ので年休消化 + 無職で1ヶ月くらい休もうと思っていました。

ニートと言いつつも次の会社は決まっていて、12月からでという話をしていました。タイトルは釣りです。

いつニートしたのか

1ヶ月も休みませんでした。タイトルは完全に釣りです。

11/1~19 が年休消化で、11/20から働きはじめました。無職期間はなしになりました。

休み飽きたなって思ってツイートしたら

という感じ入社早まりました。

ぶっちゃけ貯蓄が思ってたより無くて、給与が当月払い→翌月払いになるのもあって下手したら年を越せないってのもありました。

ニート中にしたこと

睡眠

めちゃめちゃ寝ました。寝て起きて酒飲んで寝るみたいな生活もしました。

めちゃめちゃ寝ても目の下のくまは消えませんでした。

なにもしない

なにもしないをしました。

秋アニメ消化

全然見れてなかったので、何作品か4話か5話くらいまで一気に追いつきました。

『色づく世界の明日から』と『やがて君になる』は絶対に見てください。

www.iroduku.jp

yagakimi.com

sun-ma の追加のレベルデザイン

24時間でゲーム作るやつで9月に作った sun-ma*2というゲームがあります。

これのモバイル版を開発していて、バージョンアップで追加するレベルをいろいろ検討していました。

f:id:noir_neo:20181129002937g:plain
ワームホールのレベルのプロトタイプ

UnityARKitMultipeerConnectivity の機能追加

ちょっと前に作ってた Unity のプラグインを更新しました。

github.com

何しようかなって考えていたときに、あんまりやる気ないけどとりあえず issue だけ作っておくかーと思って作った issue に反応があったので、嬉しくなってぐわっと実装しました。

github.com

なんかめっちゃ喜んでくれてすごく嬉しかったです。

未来ラジオと人工鳩

妹攻略して学園のマドンナを攻略してる途中で積んでたのを最後までやりました。

laplacian.jp

教授を攻略したのは初めての体験でしたし、かぐや√は非常に高度なえっちさがあってとてもよかったです。

f:id:noir_neo:20181129232218p:plain

ニート中にできなかったこと

過去作アニメ消化

一気に見ようと思ってた過去作品、まったく見れませんでした。

魔法少女リリカルなのはViVid』『変態王子と笑わない猫。』あたりはこの機に一気に見ておきたかった。

ちょっと遠い喫茶店に行く

人生のバックログに載ってる級の喫茶店とかお菓子屋さん? に行きたかったけど、一切遠出しませんでした。

ねおりんにニートは向いてない

ということがわかったニート期間でした。無限に休みがあると無限にダラダラしてしまう。

長期休暇よりも週休3日がいい。

明日は Sho2010 さんのなんかです。 予約投稿できないことにキレているのは観測しましたが、何を書いているのかは知りません。楽しみです。

*1:http://noir-neo.hatenablog.com/entry/2018/11/01/154235

*2:sun-ma Android 版 はこちら に。iOS版は無限に審査されてるのでまだリリースできてません

App store review 通過に6週間かかった話

24時間でゲーム作るやつ で9月に作った sun-ma というゲームがあります。

これの iOS 版を10月に開発していましたが、 10月20日に審査中になってから通過したのが12月5日と、審査に47日かかりました。

アクティビティ

f:id:noir_neo:20181116031535p:plain

メタデータ却下

ゲームがシンプルすぎるせいか(?)怪しまれたようでした。

Guideline 2.1 - Information Needed


This type of app has been identified as one that may violate one or more of the following App Store Review Guidelines. Specifically, these types of apps often:

1.1.6 - Include false information, features, or misleading metadata.
2.3.0 - Undergo significant concept changes after approval
2.3.1 - Have hidden or undocumented features, including hidden "switches" that redirect to a gambling or lottery website
3.1.1 - Use payment mechanisms other than in-app purchase to unlock features or functionality in the app
3.2.1 - Do not come from the financial institution performing the loan services
4.3.0 - Are a duplicate of another app or are conspicuously similar to another app
5.2.1 - Were not submitted by the legal entity that owns and is responsible for offering any services provided by the app
5.2.3 - Facilitate illegal file sharing or include the ability to save, convert, or download media from third party sources without explicit authorization from those sources
5.3.4 - Do not have the necessary licensing and permissions for all the locations where the app is used

Before we can continue with our review, please confirm that this app does not violate any of the above guidelines. You may reply to this message in Resolution Center or the App Review Information section in App Store Connect to verify this app’s compliance. 

Given the tendency for apps of this type to violate the aforementioned guidelines, this review will take additional time. If at any time we discover that this app is in violation of these guidelines, the app will be rejected and removed from the App Store, and it may result in the termination of your Apple Developer Program account.

Should you choose to resubmit this app without confirming this app’s compliance, the next submission of this app will still require a longer review time. Additionally, this app will not be eligible for an expedited review until we have received your confirmation.



Since your App Store Connect status is Metadata Rejected, we do NOT require a new binary. To revise the metadata, visit App Store Connect to select your app and revise the desired metadata values. Once you’ve completed all changes, reply to this message in Resolution Center and we will continue the review.

あんまりいろいろ書いても藪蛇だろうということで、シンプルに再確認しましたよと返したところ

Thank you for your reviewing.

I reconfirmed that this app does not violate any guidelines.

すぐに再び審査中になりました。

Hello,

Thank you for providing this information.

We will continue the review, and we will notify you if there are any further issues.

Best regards,

App Store Review

お問い合わせ(1)

審査中になって1週間経った10月27日、いくら時間がかかるとは言われても1週間もなに見るんだと思い、どんだけかかるのかと問い合わせをしました。

(審査待ちに1週間ならまだわかるけど、審査中になってからって…という気持ちです)

Hello,

It has been 7 days since the status of the app has changed to In Review. 
Please inform me how much longer should i wait?

Best regards,

これに対して10月30日に返事がありましたが、内容がない。見積もれない、というテンプレっぽい返答しか来ませんでした。

Hello,

Thank you for contacting App Store Review. We understand that you are concerned about the length of your app review. Therefore, you would like an update.

We can assure you that your app, "sun-ma," has not been forgotten and is proceeding through the review process. There are many factors that contribute to the time required for review, so it’s not possible to estimate when a review will be completed. Each app is unique, so review times will vary.

At this time, you don’t need to do anything else. When your app’s review is complete, you will be notified by email. If you have additional questions or concerns, however, please don’t hesitate to contact us.

Thank you for your patience.

Best regards,

お問い合わせ(2)

11月16日、流石にもう4週間になるぞと再び問い合わせました。 今回はこちらのエントリを参考にほぼそのまま、進捗どうですかしました。

In Review が長いときの催促(督促)方法|iTunesConnectでAppleの審査期間が長くなった場合の問い合わせ - HANAUTA

Dear App Review Team,

It has taken over than 27 days for "In Review", does it be proceeded?
And we would like to know the outcome earlier if possible.

Best regards,

これには4日後の11月20日に返事がありました。エスカレーションしてくれるそうです。

Hello,

Thank you for contacting App Store Review. We understand that you are concerned about the length of the review of your app, ‘sun-ma.' Therefore, you would like an update. 

We have escalated this inquiry to the appropriate internal team. If needed, they will follow up with you directly.
There is no further action that you need to take at this time. The review for your app is still in progress and requires additional time. We will provide further status updates as soon as we are able, or we will contact you if we require additional information.
We apologize for the delay.
Thank you for your continued patience.

Best regards,

Fernando
App Store Review

審査通過

12月5日、何事もなかったかのようにしれっと Pending Developer Release になりました。

株式会社Aimingを退職します

今日から有給消化です。

やっていたこと

早期出社のアルバイトから数えると、3年と3ヶ月勤めました。 ソフトウェアエンジニアという職種です。

Unity

最初の2年ほどは運用タイトルで、ほぼ Unity エンジニアとして機能追加や改修などをしていました。

クライアントの社内勉強会を(多い時で)毎週やったり、クライアントエンジニア間の情報共有の基盤作りにも注力しました。

Rails

この1年ほどは新規開発のプロジェクトで、ゲームのバックエンドを書いてる時間が長く、ほぼ Rails エンジニアでした。

気づけばチーム内では spec 書けおじさんになっていました。

デュアルキーボード

デュアルキーボードと Dvorak 配列に出会い、始めました。

デュアルキーボードのことは開発者ブログに書いたりもしています。

https://developer.aiming-inc.com/misc/dual-keyboard/

インドカレー

インドカレー部に入部し、新宿のインドカレーをたくさん食べました。

一番多く通ったのは、代々木の ruchi というお店です。

退職理由

裁量労働制がなくなる

コアタイムが10時からのフレックスになることが決まりました。

この1年ほど、体調を崩しがちになってからいろいろ試していて、 やはりがんばって朝から働くより昼くらいに出社する方がパフォーマンスを出せることがわかってきたところでの決定でした。

ただし、非同期でゲーム作るのが難しいことも一部認めており、会社の判断として間違っているとは思っていません。音楽性の違いみたいなやつです。

給料が上がらなかった

入社以来半期ごとにコンスタントに上がっていましたが、6月の査定では上がりませんでした。

やることやって、チームの改善の取り組みも頑張っていて、評価も良かったのですが、給与には反映されませんでした。 理由としては退職の機運を隠していなかったのが大きかったようです。

つまりさっさとやめろってことだなと解釈しました。

組織の文化が合わなくなってきた

あんまり詳しく書くと怒られそう。

  • 風通しが悪くなってきた
  • マネジメントへの関心がなかなか高まらない

あたりで自分で変えられる限界を超えていると感じたので、自分が環境を変えることにしました。 良くも悪くも大企業っぽく(イメージです)なってきたな、という感想です。

良かったこと

エンジニアのレベルが高い

新卒入社なのでまだ他の会社を知らない私でもそう感じるほど、技術力が高い会社だと思いました。 クライアントもサーバーも、強い人たちにいろいろ教えてもらってかなり成長できました。

運用と開発からのリリース両方経験できた

スマホゲーム開発のいろんなフェーズを経験できたのはとても良かったです。

立ち上げからみたいなのはできなかったのが少し心残りです。

次何するか

11月いっぱいは有給休暇と無職でお休みします。

この間は、積んでるアニメやゲームの消化と、なんか作りたいものを思う存分に作ったりします。 飲みのお誘いなどは大歓迎です。

次の会社は決まっていますが、入社してからまた書く予定です。 Twitter 転職のこともその時に書いたりします。

ちなみに xR です。

ほしいものリスト

様式美としてほしいものリスト載せておきます。 http://amzn.asia/a3wSYBn

それからねおりん Advent Calendar もよろしくおねがいします。 adventar.org

さいごに

仕事でお世話になった方々、プロジェクトは一緒にできなかったけど勉強会に協力・参加してくれた皆さん、 times でたくさん助言をくださった方、 そしてお疲れ様会を開いてくれたり、飲みに誘ってくれたり、退職祝いをくれた方々に、改めて感謝します。ありがとうございました!

『Unity x ARKit 入門Meetup』で LT しました

こちらのイベントにLT枠で参加しました。

connpass.com

会社に入ってから、社外の勉強会で発表するのはもしかすると初めてかもしれません。

発表したこと

「Multiuser AR Experience を ARKit + Unity で実装する」と題して ARKit を使った共有体験を Unity で実装するにあたってどういう選択肢があるか、というお話をしました。

speakerdeck.com

こちらが発表の中でも紹介した MultipeerConnectivity の Unity 用ラッパーのリポジトリです。ふぁぼください。

github.com

フィードバックなどありましたら、(英語で書くのが億劫だったら日本語の Issue でもいいですし、 Twitter でもいいので!)いただければと思います。

ちなみに同じようなことを Qiita の記事にも書いています。

qiita.com

感想とか

AR の話こんなに濃密にできる時間が私には他にないんで、非常にエモという感じです。 引き続き個人としては AR やっていきの気持ちです。

あと勉強会の懇親会は、話しかけるのが苦手でぼっちになりがちなんですが、登壇しておくと話しかけてもらえるのでお得だなと思いました。 お話してくださった方、名刺交換してくださった方、どうもありがとうございました。

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}");
    }
}