みんからきりまで

きりみんです。

自動化ゲーのFactorioにハマりすぎて生活がヤバイ

最近Factorioというゲームを狂ったようにやってる。

Factorio on Steam

どういうゲームかというと、工場のラインをひたすら構築してアイテムを自動で大量生産してゆく、というシミュレーションゲームです。
宇宙船が墜落して未開の惑星に放り出された主人公はロケットを作るために資源を採取して部品を大量生産する必要があるのです。

トレーラーを見るとだいたいどんな感じか分かると思う。

www.youtube.com

www.youtube.com

一見シムシティのような感じですが、自キャラを操作するのでどちらかというとMinecraftに近くて、ざっくり言えばMinecraft釜戸とホッパーを繋ぐような作業をひたすらやり続けるゲーム。
もしくはリアルタイムストラテジーの内政をひたすらやるゲーム。定期的に敵が攻めてくるのでタレットを配置して防衛したりする必要もあります。

このゲーム、安かったので軽い気持ちで買ったのですが、予想を遥かに超える中毒性があり、購入から1週間半で既に42時間もプレイしてます。そろそろFallout4のプレイ時間を超えそうです。
一度やり始めると何時間でも無心でやってしまい生活が破綻し始めているので、そろそろFactorio禁した方がいい気がしてる。
常に生産ラインが動き続けているので眺めているだけでも楽しいのと、ラインはいくらでも改善できてどこかを効率化すると別のどこかがボトルネックになって…というのを無限に繰り返して止まらなくなります。

(最後の方は死んだ目で)30時間ほどプレイしてようやくクリアしたのですが、「もっと効率よくラインを構築すれば半分以下の時間でクリア出来たはずだ…」という思いが頭から離れず、2週目を始めてしまいました。
このゲームの面白さってプログラミングの面白さに似ているなぁと感じていて、手動で操作しても出来る事を一度の手間を惜しまず自動化する事で飛躍的に作業効率が上がる喜びと、より綺麗な設計を考えて何度もリファクタリングしてしまう奥の深さがあります。
というか、プログラマになったら一日中このゲームみたいな作業を黙々としていられるんだろうなぁと思っていたのに、実際の仕事では集中して自由にコーディング出来るような事は全然なくて会議やらExcelやら調査やらばっかりで複雑な気持ちになりますね。

Factorioをやってると普段の生活や仕事も全部ベルトコンベアとアームで自動化出来たらなぁ…と妄想してしまう。
オススメのゲームです。
あと、全然関係ないけどオデッセイの原作の「火星の人」を読みました。Factorioとテーマがちょっと似てる。

https://i.gyazo.com/1e17a8236c75a04ff6dbbf27de273d8b.png 現在プレイ中のライン

Live2Dに入門してAndroidで動かしたりして遊んだ

Live2Dという技術があります。 http://www.live2d.com/

二次元のイラストを3D化せずにそのまま動かせるという夢の技術。
最近だとFaceRigと組み合わせたこんなのが話題になったりした。

www.4gamer.net

3年くらい前にYoutubeで紹介動画を見た時からずっと応援している技術なんだけど、このLive2Dでキャラを動かすのを自分でも試してみた。

Cubism EditorでLive2Dモデルを作ってみる

Cubism Editor | Live2D

どうやらこのCubism EditorというソフトウェアでLive2Dモデルが作成出来るようなので、インストールした。
とりあえず公式のチュートリアルページを見ながら見よう見まねでやってみる。

入門チュートリアル - Live2D Cubism 2 マニュアル

元の絵はこんな感じです。

Live2Dの仕組みをざっくり説明すると、イラストのパーツ(目とか髪とか)を福笑いのように別テクスチャとして配置して、それをずらしたり歪ませたりする動きを設定する…という感じ。
なので、まずはパーツの切り出しを行う必要があります。
行いました。

実際には作り始めて見ないとどんな風に切り分ければいいのかよく分からなかったので5回くらい作業やり直してる。
(フリーモードだとパーツのサイズとかに色々制限があったりもする)

切り出したパーツをテクスチャとして取り込み、頑張って歪ませたりして動きのパターンを設定していく。

Cubism Animatorでアニメーションを作ってみる

上で作成したモデルを付属のCubism Animatorというソフトウェアに読み込ませると、モデルを動かしたアニメーションが作成出来る。

こんな感じ。
動画のコマごとにモデルのパラメータを設定するだけで簡単にアニメーションが作れます。

そして実際に完成したアニメーションGifがこちらになります。

アニメーションや3Dの知識が全くなくても半日くらいでなんかそれっぽい動く絵が出来たぞ!
やったね!

Androidで動かしてみる

と、アニメーションGifを作っただけで終わってしまったらAndroidエンジニアとしては面白くないので、Androidアプリとして動かしてみる。

AndroidSDKがあったのでこれを使おう。

Android - Live2D Cubism 2 マニュアル

なんかサンプルがEclipseプロジェクトだったり、説明の殆どがEclipseの使い方でAPIの使い方についての説明が全然なかったりして不安になるが…。
とりあえずモデルが表示されるだけだったサンプルコードをちょっと書き換えてタッチイベントに反応するようにしてみた。

public class Live2dSurfaceView extends GLSurfaceView {
    private SampleGLRenderer renderer;

    public Live2dSurfaceView(Context context) {
        super(context);

        renderer = new SampleGLRenderer();
        setRenderer(renderer);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        renderer.updateAngle(event.getX());
        return true;
    }

    class SampleGLRenderer implements Renderer {
        private Live2DModelAndroid live2DModel;
        private final String MODEL_PATH = "live2d/model.moc";
        private final String TEXTURE_PATHS[] = {"live2d/model.2048/texture_00.png"};

        @Override
        public void onDrawFrame(GL10 gl) {
            gl.glMatrixMode(GL10.GL_MODELVIEW);
            gl.glLoadIdentity();
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
            gl.glEnable(GL10.GL_BLEND);
            gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
            gl.glDisable(GL10.GL_DEPTH_TEST);
            gl.glDisable(GL10.GL_CULL_FACE);

            live2DModel.setGL(gl);
            live2DModel.update();
            live2DModel.draw();
        }


        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            gl.glViewport(0, 0, width, height);

            gl.glMatrixMode(GL10.GL_PROJECTION);
            gl.glLoadIdentity();

            float modelWidth = live2DModel.getCanvasWidth();
            float visibleWidth = modelWidth * (3.0f / 4.0f);
            float margin = 0.5f * (modelWidth / 4.0f);

            gl.glOrthof(margin, margin + visibleWidth, visibleWidth * height / width, 0, 0.5f, -0.5f);
        }


        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            try {
                InputStream in = getContext().getAssets().open(MODEL_PATH);
                live2DModel = Live2DModelAndroid.loadModel(in);
                in.close();

                for (int i = 0; i < TEXTURE_PATHS.length; i++) {
                    InputStream tin = getContext().getAssets().open(TEXTURE_PATHS[i]);
                    int texNo = UtOpenGL.loadTexture(gl, tin, true);
                    live2DModel.setTexture(i, texNo);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void updateAngle(float param){
            Log.d("test", param / 30 + "");
            live2DModel.setParamFloat("PARAM_ANGLE_Z", param / 30);
        }
    }
}

こんな感じ

一応なんとなく動かせたけど、多分ほとんどの人はUnity用SDKを使ってるんだろうなぁ。

おまけ

決まった動きするキャラを表示させたいだけだったら、↓のライブラリとかでgifをそのまま画像として表示させた方が楽な気がした。

https://github.com/koral--/android-gif-drawable

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="me.kirimin.live2dsample.MainActivity">

    <pl.droidsonroids.gif.GifImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/girl"
        android:layout_alignParentBottom="true"
        android:layout_centerInParent="true"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Live2Dだよ!!!!!!!"
        android:minLines="4"
        android:background="#CCCCCCCC"
        android:padding="8dp"
        android:layout_alignBottom="@+id/image"/>
</RelativeLayout>

こんな感じで。

2015年の仕事ふりかえり

あまり書くことも無いかなと思ったけど自分の整理のために振り返る。

やってた事

所属していたチームのプロジェクトがどんどん大規模化していき、品質要求が高いのにメンバーが次々に入れ替わり全員新人で自分だけ古参みたいな状態になったりしてた。
チームがピリピリしてる中で、あまり実装の仕事が出来ず設計やレビューなどを主にやっていたのもあって、チームのコミュニケーションとかマネジメントとはみたいな事ばっかり考えてた。
(別にそういう裁量ある立場にあったわけではないが)

10月からは現場内でチームが変わって、組織全体への情報共有や開発環境整備、レビュー、技術調査や啓発などを行うチームになったので、ますます組織内のコミュニケーションや業務改善みたいな事へ関心が強くなった。
僕は元々ひきこもっていたくらいだし人と一緒にいるのが苦手なので、エンジニアとしてもどちらかと言うと「マネジメントこわい!自分でコード書いて何かを作る事だけに集中して生きていきたいんだ!」みたいな気持ちがあったんだけど、最近は仕事の進め方や組織について考えるのが意外と好きな事が分かった。
また、とにかく仕事を楽しく平和にやりたいという気持ちが強いので、コミュニケーションや労働環境についても色々と思うところがあったりする。
もしかしたら将来はそういうマネジメント的な仕事もしてみたいのかもしれないなぁと思うようになった。

技術

2015年は業務的には色々な事をやったし、ビジネススキルは随分鍛えられたし喋るのも少しは上手くなったかなと思うけど、あまり外にアウトプット出来るような技術的な事はあまり出来なかったなぁという印象。
文章もQiita:Teamにばっかり投稿していた感じ。

趣味では3月頃からKotlinにハマってアプリをKotlinで書き換えたりしていた。
Kotlinの勉強をしたおかげでモダンな言語仕様や関数型っぽい書き方をずいぶん学べた気がする。
まだまだKotlinを使いこなせてるとは言い難いけど。

最近iOSも勉強したりしてるんだけど、KotlinのおかげでSwiftが違和感なく書けて捗った。

去年書いた人気記事ベスト5

去年は全然書いてないと思ったけど意外と書いてた。去年の1月とか遥か昔のように感じる。

kirimin.hatenablog.com

kirimin.hatenablog.com

kirimin.hatenablog.com

kirimin.hatenablog.com

kirimin.hatenablog.com

所感

2015年は私生活でも色々あったりして、たとえ後30年は働けるとしても環境や立場が変われば今みたいに自分の時間を自由に使ってがっつり新しい事に取り組んだり出来る状態がいつまでも続くとは限らないのだなぁと改めて思ったりした。
死ぬまでにやり遂げたいと思っている事はたくさんあって、いざ環境が変わるという時に迷ったり後悔したりしたくなければそういう事はいつか出来ると思わず常に今すぐやるしかないのだと強く感じた。

今年はもっと手を動かして変なもの作ったりどんどんアウトプットをしていきたい。
仕事的にはもっとコードが書けたらいいなぁ…。

今年買ってよかったもの8つと後悔してるもの2つ

買ってよかったもの

今年はいろいろ買った気がするのでまとめた。
だいたい以前にも書いたものだけど。

1 L字デスク

詳細は以下の記事で。 kirimin.hatenablog.com

作業スペースが広くてとても快適です。
キーボードをどかさなくてもご飯を食べたりノートPCを開いたり絵を描いたり出来る。

2 バロンチェア

休日はほぼずっと机に向かっているので、思い切ってバロンチェアを買った。

www.soho-honpo.com

肘なしのかなり安いモデルにしましたが全く不満は無く快適。
職場もバロンなので平日と同じ姿勢(椅子に埋まる)で作業出来るのが良い。

3 4kディスプレイ

詳細は以下の記事で。 kirimin.hatenablog.com

4kにして良かった。
やっぱり圧倒的に綺麗で目も疲れない。
難点はアプリケーションによってはスケール変更に対応してなくてUIがすごく細かくなったり文字が潰れたりする事。
あと複数の解像度を並べてると若干動作が不安定になる。
4kがもっと普及したら改善するかな。

4 ティファール鍋フライパンセット

引っ越しの時に買った。 www.amazon.co.jp

取手が取れるの便利だった。

5 ペンタブ

つい先日買った。

www.amazon.co.jp

使いこなせるか心配だったけど何日か練習したら慣れた。
やっぱり絵はマウスだと駄目でペンタブだとすごく描きやすい。

6 Cities Skylines

ここからはゲーム編です。

Steam で 60% オフ:Cities: Skylines

今年前半一番やったゲーム。
SimCity?ああそんなのもあったねwと言いたくなるほど非の打ち所の無い街作りゲーの傑作。
何故かシムシティほどやってる人を見かけないけど本当に凄いのでやってほしい。

7 Downwell

Downwell on Steam

めっちゃハマった。
空き時間についやってしまう。
どうしてもハードモードがクリア出来ない。

8 WiiU・スプラトゥーン

リンク貼る必要はないですよね?

今年後半一番やったゲーム。
FEZ廃人でFPS好きの僕には最高のゲームだしこういうゲームがブームになってネットの友達みんなで一緒に盛り上がれたのが最高の体験だった。
部屋という概念を作らずフレンドのマッチングに乱入出来る仕組みがTwitter廃人には丁度よかった。
最近はひたすらガチマッチやってゲームパッド床に叩きつけてる。

後悔しているもの

おまけです。

1 Zenfone2

やっぱり5.5インチはデカくて持ちづらいし物理的に重いし動作も不安定だしASUSのアプリはスパムみたいな挙動だし全然駄目だった。
何故もう少し待ってNexus5Xを買わなかったのかと後悔する日々。

2 引っ越し先

買い物ではないけど。
前の部屋が5.5畳のワンルームだったので次は広い所をと思って8畳と10畳の1LDKにしたらダイニングの使い道が全くなくて駄目だった。
一人で生活するのに部屋が2つあっても活かすのかなり難しいし10畳1kで十分だった。
家賃めっちゃ高いし厳しい。

所感

めっちゃ金で解決してる。

生活見直してどんどん痩せた

経緯

今年はいろいろ心労が絶えなくてストレスで身体を壊したり体重がどんどん増えたりしていた。
秋頃からようやく余裕が出てきたので、生活の改善と減量を試みた結果、どんどん痩せたし健康的になった。

推移

10月の後半くらいから真面目にやり始めて5kgくらい痩せた。
f:id:kirimin:20151227211438p:plain

やった事

食生活の改善

1日のカロリーがだいたい1300~1600kcalくらいに収まるようにした。
具体的には昼ごはんはあまり気にせず好きなものを食べて(多分だいたい1000kcal程度)、夜ごはんはうどんとか冷凍のパスタとか小さいコンビニ弁当とか300~500kcalで収まるようにした。
休日はほとんど活動してないのでもう少し抑えて1200~1300kcalくらいにした。節約はそんなにしてないのでコンビニのサラダとかはどんどん食べた。
※僕は1日2食です。

あと僕はカフェイン依存症で珈琲を毎日欠かさず飲んでいたら胃を壊してしまったので珈琲の代わりにお茶を飲むように変えたら改善した。(なんとお茶にもカフェインが入っている!!!!!)
冷たいお茶で喉が潤うのでジュースを買う頻度も減ってカロリー的にも良かった。

ちなみに以前、炭水化物を抜く取り組みをしてみたらみるみるうちに体調が悪くなっていったのでそれはやらなかった。

食後の散歩

職場の近くで一人でお昼食べると20分くらいで食べ終わるので、残りの40分を毎日ひたすら歩くようにした。
八重洲と丸の内を3往復したり出来てたのしい。

エレベーター使わないカツドウ

職場が7階なので緊急時以外エレベーターを使わず階段で登り降りするようにした。
だいたい1日3,4往復くらい。

スクワット

コスパがいいとネットに書いてあったスクワットを毎晩30回くらいやるようにした。(気が向いた時だけ)
これは痩せても腹筋を鍛えなければ内臓が持ち上がらず腹部が引き締まらないとの情報を入手したから。

毎日測定してグラフ化

毎日決まったタイミングで体重を計るようにしたら0.1kgの増減に一喜一憂するようになってモチベーションが保ちやすかった。
個人的に折れ線グラフが大好きなのでExcelで体重の増減と5日平均まで見れるようにしたらかなりゲームっぽくなって良かった。

効果

・全体的に痩せた。
・特にグニっとしたお腹がキュッとした。
・食べる量が減ったからか疲れにくくなった気がする。