arveltのソフトウェア技術メモ

Arvelt's software technology memo

2015年を振り返って

去年立てた目標 

Paasで何か1つ作る。ライブラリのようなものを1つ作る。フロントエンドに関する潮流を追いかける。品質管理に関する学習をする。扱う対象について。Javascriptcss、それらを扱うフレームワークGoogle製品全般、pythonとそれらを扱うフレームワーク。このへんを深めていきたいと思います。

趣味の目標としては、Unityを触って1品ゲームを作ること。DirectXを触って3Dへの造形を深めること。漫画の練習をすること。

 

目標を達成したか

・Paasで何か1つ作る

 →やってない。

・ライブラリのようなものを1つ作る。

 →やった。ダンジョン生成プログラムを作ってPyPiに登録した話

・フロントエンドに関する潮流を追いかける。

 →一応やってた。

・品質管理を学習。

 →やってない。

・Unityで作る。

 →やってない。

DirectX触る。

 →やってない。

・漫画の練習

 →一応やってた。

 

所感

2015年は非常に自分が書いたブログ記事が少なくて、これはつまり何もしていなかったので書くことがなかったのだと気づいた。立てた目標もすっかり忘れてたいたし。ゲームのことは別ブログに書くことにしているが、そっちは大量に記事があってなるほどね?みたいな気持ちになった。そういうことだったかー。

Unityでローグライクを作ろうとしてダンジョン生成のアルゴリズムの試作として作ったライブラリを公開したのはよかったが、結局Unityがめんどくさくて作り始めることができなかった。私はUnityの使い方を覚えたいのではなくて、ゲームのアルゴリズムを考えたいのだ。

なにか流行りの技術を試そうとしてhello worldと表示してみても、何も頭に残らずとても触ったとはいえない。そういうものを、一通りまとまった機能の束として試さなくては何も身につかない。そういう開発の環境と公開できる環境がどうしても必要だが、それを用意するハードルが想像以上に高いものだと気づいてきた。どうにかしたい。

最近プログラミングをすることが嫌になってきている気がする。転職して以降仕事ではフロントエンドをやっていたのだが、それが合わなかったのだろうか?これからはサーバー側に行ってみてもいいかもしれない。

プログラミングがそもそも好きじゃないというのはこの仕事についた瞬間から自覚していて自分にとってはいまさら過ぎる話ではある。それと仕様を考えるっていうのがとにかくできなくてどうすればそういうのがうまくなるのかいまだにわからないのでその辺りを勉強したいとずっと思っている。

YAPCとPyconに行った。たまにいくと自分もなんかやらなきゃ!!!みたいな気持ちが3日くらいは維持できるのでそれなりに有効だと思う。

 

2016年の目標

フロントエンドは諦めたので、サーバー側の勉強をしていく。いかしたAPIはどういうものか?そのための適切な設計は?テストの書き方は?そういう感じのこと。

品質について体系的なことを知りたい、というのは諦めない。

ブログをちゃんと書く。ちゃんと普段から勉強してれば月に1つくらいは書くことあるというのは経験上わかっている。それができるくらいには学習を怠らないようにしなくてはいけない。

やらない言い訳のために自分でハードル上げてしまっている気がするので、もっと気軽にアプリケーションを作りたい。ライブラリだか、ゲームだかはわからないけれど、とりあえず3日くらい勢いで書いて公開方法はあとから考えるくらいの気軽さで取り組めるメンタルに変えていきたい。

あと漫画かけるようになりたい。

 

PyconJP2015に行ってきた話

いってきました。

起きられないので基調講演とか行ってないです。

聞いたやつ 

 

1日目

MinecraftをPythonで遊ぶ

mcpiがpython3に対応してないからフォークして直したし、すぐ動かせるdockerファイルも用意したよ!とかいう素敵な内容でした。試してみたらちゃんと動いてたし凄い。

 

Pythonで作る俺様サウンドエフェクター

ギター片手にスピーチ。入力した音をpythonでいじって遊ぼうみたいな感じでおもしろかった。私もやってみたい。

 

【混沌と秩序】pip/Virtualenv(venv)/setuptoolsそしてWarehouse… パッケージング最前線 #PyConJP_M #pyconjp - Togetterまとめ

資料見つからないんですけど公開してないんでしょうか…?こういうのこそ見直したいのに…

 

あとあーらんの話もいたけど英語だったのでさっぱりわからなかった。

 

2日目

Pyconjp2015 - Python で作って学ぶ形態素解析

形態素解析ってどういうときに使うんでしょう。検索エンジンとか、辞書アプリとかですかね。

 

PyPIデビュー2015

実際dungeon-generatorっていうライブラリをpypiに上げてみたときに色々やりました。ちゃんとできてない気がするので見なおそうかな…という気持ちです。

 

所感

・どこかでもう言ってたけどpyconは真面目な雰囲気で心地良い。つまらん悪ノリとかあまりない感じ。

・その分内容は難しい気がする…?

・今回の最年少スピーカーが15歳ということで、私もがんばらねばーみたいな気持ちになった。カンファレンスはこのやる気をもらうために行ってる感じがします。

・そのうち発表とかしてみたいけど、普段python使ってないですね

・弊社サービスはGAEで運用しておりますゆえpythonと言えば、Google App Engineだと思ってたんですけど、その話してる人まったくいなくてpythonの人達の間でさえそんな扱いなのか…という悲しい気持ちになりました。

 ・プレゼントでTシャツが当たりました。ありがとうございます。

 

YAPC2015に行った話

満を持して2日間チケットかったんですけど、1日のしかも午後からしかいってないので、もうちょい考えてから購入するべきだったと反省しております。だからトークも2つしか聞いてない。

 

Adventures in Refactoring - YAPC::Asia Tokyo 2015

https://s3.amazonaws.com/dinosaur/refactoring+-+yapc+2015.pdf

なぜリファクタリングするのか?

1.開発者のハッピーのため

2.開発者の教育のため

リファクタリングの評価は?

1.カバレッジ

2.減らした行数

3.性能向上

リファクタ前とリファクタ後のコードレベルでのA/Bテストみたいなことをするツールを使って計測する → github/scientist · GitHub

 

英語わからないので半分くらいしかわかってないけど多分こういう感じの話。正しいことを正しくやるためにいろいろ工夫してがんばろうという感じで、さすがGithubだなーという思った。

 

 

HTTP2 時代の Web - web over http2

mozaic.fmでおなじみのjxckさんのトーク。HTTP2はもうRFCとして公布されたので、いよいよ使うフェーズになりましたね。という感じの内容。

http://www.rfc-editor.org/rfc/rfc7540.txt → 日本語訳「http://summerwind.jp/docs/rfc7540/

HTTP2を使うことで、Server Push、Cachのコントロール、Service Worcker、Httpsが(基本的に)必須、とかそういう風に変わっていくのよ。じゃあ対応するの?しないの?みたいな内容。

ブラウザ側はもう対応し始めているので、次はサーバー側。みんなサーバーの実装をし始めている。有名どころではnginxが2015年中には対応したい的なことを表明しているらしい。

 

所感

冒頭に書いたけど、2日チケット買ったのに実質半日分しか享受できなかったので、ちゃんと考えてから買うべきだった。でも一番聞きたかったjxckさんの話聞けたのでよかった。あとrebuildリスナーとしては、歴代なんちゃらのトークできていたらしいmiyagawaさんを目撃したのがラッキー感あった。あれが生miyagawaか…!!!みたいな感じ。なんか勝手に長身だと思い込んでたけど違った。

あと、ベストトーク賞が、Http2の話2つきてしまいどうなるんだーってところで、Perlの話が1位になっていたのは大円団感があって非常によかった。終わりよければすべてよし。

実は去年行った後で、ヤプシーの内輪ノリ感をディスる感想を一言書いたんだけど、今回はなんかそういう雰囲気を極力排除しようとしている気がした。気がしただけでほんとのところはわからない。その記事は.pmリファラーで読まれていたので、一意見として届いていたのかもしれない。

コミュニティーを古参が壊す、というのは万事においての真実なので、YAPC::Asiaとしては一旦クローズするのは、そこらへんを見越してなのかなーとか邪推していた。ユーザーベースなのに大きくなりすぎて大変そう、というのは外から見ていて感じていたし。

言うには言ったけど、ヤプシーが面白い面白くないかでいったら確実に面白いものだったとは思っている。何はともあれ、立ち上げや運営に関わったり盛り上げたりした人達へ、おつかれさまでした、ありがとうございました。という気持ちでいっぱいなのです。

 

すでにあるWebサービスをElectronを使ってネイティブアプリのように見せるやり方

Electron触って全く意味がわからなかったので手順を残す

 

Electronでアプリケーションを作ってみよう - Qiita

環境の作成と配布用パッケージングについてはこれを読む

 

ElectronでChatworkをデスクトップアプリ化 (Webview + badge) - Qiita

中身を表示するやりかたはこれを読む

 

流れ

・npm -g install electron-prebuilt する

・中身を書く

・表示したいWebはwebviewタグを使って表示する

・npm -g install asar する

・asar pack . ~/tmp/app.asarする

・Electronのディストリビュートをダウンロードしてapp.asarを設置する

・Electronのディストリビュートの名前を変えたりしてから、配布する。

 

配布するときにどうやるかとかはここにかいてある

electron/application-distribution.md at master · atom/electron · GitHub

 

Ubuntu+nginx+uwsgiのサーバーに、CicleCIを通したGithubプロジェクトをデプロイできるようにした話

Githubで管理しているflaskアプリを、CicleCiでグリーンになったら、Ubuntu+nginx+uwsgiのVPSサーバーにデプロイできるようにしました。

お遊びアプリ作るときのバックエンド用にさらっとアプリ置ける場所欲しいよね、と思って用意したものです。

 

使用したバージョン

Ubuntu 14.04.2 LTS

nginx/1.4.6

uwsgi 2.0.10

ansible 1.9.1

Vagrant 1.7.2(手元でテストするときに使った

 

実現するワークフロー

この結果以下の様なワークフローになります。

1.VpsにOSをインストールし、sshが通る状態にする

2.ansibleのスクリプトを使用し、プロビジョニングする。(ここでUbuntu+nginx+uwsgiのサーバーが完成

3.releace/*ブランチを作成しgithubにpushする

4.CicleCIのテストが動く。

5.グリーンであれば、2のサーバーにデプロイされる。(ここでアプリのデプロイが完了

6.http://arvelt.net/hello-flask でHello World!が表示される(複サブディレクトリを使用できるようにしました。

7.アップデートする場合は3から実施する。

 

仕組み 

2要素にわけて構成しました。

 

1.サーバーを整えるansibleスクリプトarvelt/simple-python-api-server-ansible-book · GitHub

表でnginxが振り分けて、うらでuwsgiが動くようになっています。uwsgiを選択したのは、バックエンドはpythonで作る予定だからです。

最初はansible-galaxyをなるべく使おうと思っていましたが、動かしてもあっちこっちの設定が知らないままにされているというようなことになってしまい、返ってハマりがちでした。結局最小の設定を自分で仕込むでいます。

nginxとuwsgiをつなぐ箇所が何度もつまり続けました。unixソケットファイルというのを使うのがよいらしいのですが、どうにもうまくいかないのでポートを使用するようにしています。

 

2.CicleCI用の設定ファイルを持ったGithubプロジェクト(arvelt/hello-flask · GitHub

このワークフローの構造を作るため取り組みなので、flaskを使用したhello-worldアプリです。cicleCI上でテストを実行しますが、cicle ciはデプロイの設定をすることができます。HerokuやAWSは元から用意されていますが、それ以外にも任意のスクリプトを実行させることができます。

私はデプロイスクリプトとしてansibleコマンドを指定することで、githubからcloneさせてデプロイできるようにしました。

cicle ciから別のサーバーにデプロイするために、CicleCIのProjectSettingからssh秘密鍵環境変数を登録できるようになっています。ansibleには変数で受け取るようにしておけばそれらの値を使うことができます。

特にsudoするときのパスワードをどう渡すかは大変苦慮しました。スクリプトではask-sudo-passは使えないからです。ansible-sudo-passwordという値があることに気づいてからは、いかにしてそれに渡すかということに腐心しました。なんとかうまくいってよかったです。

 

 所感

今回はVPSにデプロイできるようにしていますが、これは例えば、リリースブランチにpushするたびにAWSで新規インスタンスを作成して、その上にデプロイする、という様なことも簡単にできます。ここらへんはプロビジョニングツールを使った利点です。

データベース周りがないのですが、今回はそこまでいけずに力尽きたというのがあります。実務で使うものでもないので、MongoDBなどを選択して環境にするかもしれません。

これらのプロビジョニングツールを試したい場合、Vagrantを使用するのが非常に有効です。手元で作っては壊しを何度も繰り返せます。VPSもそれ自体はよいですが、なにぶん外部に公開されていますので、あまりおかしなことはできないというのもあります。

 

ところでこの仕組は私が考えたものではなく、先人がやっていたことを改めて手元でやってみたという確認です。大本はそちらのほうをごらんください。

GitHub 時代のデプロイ戦略 - naoyaのはてなダイアリー

 

ダンジョン生成プログラムを作ってPyPiに登録した話

 

https://pypi.python.org/pypi/dungeon-generator

しました。

 

https://github.com/arvelt/dungeon-generator

リポジトリはここで。Demoみたら雰囲気はわかると思います。

 

目次

 

背景

Unityでローグライクのゲームを作ろうとしているのですが、ダンジョン生成というのがよくわからないのでとりあえず手元で試そうと思ってPythonで作りました。

せっかく作ったのでpipyに登録しました。

SphinxPythonのdocstringを生成させたり、それをgithub-pageに登録させたり、テスト書いてみたりといった、エンジニアリング的に試してみたかったこともついでに試しました。

その辺のことを書きます。

 

 

エンジニアリング

1.Sphinxでdocstringを生成する

Sphinxを使ってみたかったので使ってみました。まず試したところはここに書きました。http://qiita.com/Arvelt/items/45428c5f9661cec3f513

その後実際にこのリポジトリに適用しドキュメントの生成をするようにしました。

 

2.Sphinxで生成したドキュメントをGithub-pageにする

それもできれば自動で。これうまくいってるかちょっと怪しいんですが、なんとかできたように思います。

masterのあるディレクトリにgithub-pageブランチのsubmoduleを作るということをしています。

このへんが参考になりました。ありがとうございます。

github のプロジェクトにSphinxドキュメントを良さげな感じにおきたい 其の一 - Study08.net 対シンバシ殲滅用人型機動兵器

github のプロジェクトにSphinxドキュメントを良さげな感じにおきたい 其の二 - Study08.net 対シンバシ殲滅用人型機動兵器

 

3.PyPiに登録

こういうのは決まりきった手順だと思いますが、知らないとなにからやったらいいのかわからないという系の話です。しかもPythonはパッケージ管理周りが非常にややこしいです。

このへんが参考になりました。ありがとうございます。

今どきのPythonのライブラリ自作からPyPIへの登録 - Qiita

 

 

アルゴリズム

せっかくなのでどのように作っているかを書きます。

ダンジョン生成のアルゴリズムは調べると色々とでてきます。

 

http://wise9.jp/archives/6964

いちばんわかりやすかったのはここです。最初はこれのクローンみたいなものを作ろうとしていました。しかし、二次配列を作ってそこにいろいろやっていく、というアプローチがどうしてもうまく実装できずに失敗してしまいました。

なので全部自分で考えることにしました。アプローチも変えて、ダンジョンのマス目を区切って色々やっていくのではなく、先に部屋クラスや道クラスがマス目をそれぞれ保持して、最後にマスの順に束ねていく、というやり方にしました。

もしかしたら遅いかもと思っていたのですが、実際動かしてみたところそれほど遅さを感じることはなかったので、Unity上でのこの実装を使おうと考えています。 せっかく独自の実装をしたので紹介しようと思います。

  

おおまかには以下の流れです。

1.部屋を作る。

2.部屋の場所を探す。

3.道を通す。

4.調整する。

 

例を挙げながら詳しく見ていきます。

 

1.部屋を作る

gyazo.com

 

2.部屋にドアを決める

gyazo.com

 

3.部屋の場所を探す

ある部屋を基準にした場合、他の部屋が東西南北のどの方向にあるかを調べます。

この例だと、基準にしている部屋の西に部屋が2つあるということがわかります。

 

gyazo.com

 

4.最短距離の部屋を探す

同じ方向に複数の部屋がある場合は1つに絞ります。最短距離の部屋を選ぶという仕様にしました。

この例だと実線で示した部屋の方が近いのでそちらが選ばれます。

gyazo.com 

 

5.ドアのペアを作る

gyazo.com

 

6.3と4と5をすべての部屋に対して行う

これで全ての部屋がどの方向に対して道を作っていくかがわかります。

またこの際に同じドアを逆から見た組み合わせができてしまうのでそれは省いておきます。 

 

7.道を伸ばす

5の時点で道が縦に伸びるか横に伸びるかは決められるので、部屋の方向に向かってお互いに道を伸ばします。

gyazo.com

 

8.道をつなぐ

縦に伸ばしている場合は横、横に伸ばしている場合は縦、がそろったらそちらの方向にも道を伸ばします。これで道がつながります。

gyazo.com

 

9.8を全てのドアの組み合わせに対して行う

これで全ての部屋がつながります。

またこの時に、部屋を横切ってしまうような道、部屋に隣接してしまう道、は作らないようにしています。

 

10.調整する

9で道を作らないパターンもあるので、孤立する部屋が発生します。

そのような部屋は削除してしまいます。

 

11.完成形

この例だとこのような完成形になります。

gyazo.com

 

以上です。

これをUnityに移してからが私のゲーム作りのスタートなのでがんばりたいと思います。

 

sphinxでpythonのdocstringを生成する話

を書いた。


Python - Sphinx入門。Sphinxでdocstringの生成 - Qiita

 

pythonで書いてるコードがあって、そのドキュメント用意しょうと思ったけどなかなかうまくできなくて困ってました。モジュールをインポートするとこがわからなくてつまっていたのですが、やっとこ解決したので書きました。