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

Arvelt's software technology memo

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

 

How Google Worksを読んでのメモ

所感

非常におもしろい。今まで漏れ聞こえていたGoogleの仕事のやり方だとかを、1つのものとして読み取ることができる。優秀な人材を揃え、彼らに自由と権限を与える。言葉にするとただそれだけのことが、実際にやるとどれほど難しいことか。それを実現するためににいかにして取り組んできたかを読むことができる。

これと「小さなチーム大きな仕事」も合わせて読むとかなり意識が高まってやってやるぜっていう気持ちになるのでそちらもおすすめである。

 

内容のメモ 

文化について

・スマートクリエイティブ。彼らはコンセプトを考えるだけではなく実行力がある。プロダクトを作ることができる。専門性とビジネススキルと想像力を持ち合わせた人材。
・責任と自由を与える
・チームは小さく

戦略について

・楽しさとはイノベーティブと同じであり、許されることの境界が広いのが重要
・イノベーティブな技術的アイデアを見つける方法の1つは、組み合わせることだ。もう1つは小さな問題の解決策を、スケールさせることだ。
・問題を新しい方法で解決し急速に成長して拡大できるプロダクト。それを有する企業は成功できる。

 

人材について

・情熱のある人間はそれを表にださない。本人が興味あることを話させてみると人となりがつかみやすくなる。
・知力だけではなく変化に対応できる人物を採用するべきである。過去の失敗、直近の重大な現象を振り返ってもらいそれについて話してもらおう。
・面接スキルは誰しもに必要なスキルだ。経験はそこから何を学んだかとセットで聞き出すのもよいだろう。
・キャリアを考えるのなら、一番はじめにどの業界かを選ぶかが大事だ。企業の選択はその次にくる。

 

意思決定について

・正しい意思決定には、正しい選択をすることだけでなく、そのプロセス、タイミング、実行手段についても重要だ。
・幹部が身に付けるべきスキルは、自ら決定する問題と、部下に任せるべき問題を見分ける能力だ。意思決定の回数は少ない方がよい。

 

コミュニケーションについて

・情報は、法律あるいは規制で禁じられているごくわずかな事柄をのぞきすべて共有する

 

イノベーションについて

・グーグルとアップルは「コントロール」に対する考え方が違う。しかし消費者にとって最高のユーザー・エクスペリエンスを生み出したいということは共通している
・急速に成長しており競合がひしめく市場ではイノベーションが起きやすい。巨大な市場と、新しい技術がそれを生み出す。
・ユーザーに焦点を絞れば、利益は後からついてくる。
・発想は大きくする。スケールの大きい問題として捉え直すことで新しい考え方へたどり着く。
・20%ルールとは、時間のことではなく自由な裁量のことを意味する。重要なのはそこから学びが生まれることだ。
・世に出してから手直しする。そのプロセスを最も早く繰り返す企業が勝つ。しかし、それはあとで改善することを前提に質の低いプロダクトをだしてもいいという考え方ではない。
・これまでの投資額に関わらずに、失敗は失敗と判断することは何よりも重要。

 

未来について

・自分たちの事業で聞かれたら最も嫌な質問を問い掛け合う。何が起こりえるのかという想像力を働かせる。

 

 

How Google Works (ハウ・グーグル・ワークス)  ―私たちの働き方とマネジメント

How Google Works (ハウ・グーグル・ワークス) ―私たちの働き方とマネジメント

 

 

2014年を振り返って

・前年度にたてた目標

勉強ってことなので、上から下まで全部自分で1つ、Paas使ったのが1つ、ライブラリが1つ。みたいに形態の違うものにそれぞれ挑戦したいですね。
それと、退職しました記事書いたらホッテントリ入りしてしまいましたので、SIerからWebに転職したよアフターもぜひ書きたいです。8月頃に。

 

 ・今年やったこと

1月。ステートフルJavascriptを読んで色々やっていた。Unityを触った。母艦のPCをWindows8にした。pythonアップローダみたいなの書いた。

2月。デブサミに行った。

3月。three.jsを触った。ドラクエモンスターズ2やった。

4月。パーフェクトpython読んで、pythonさわってた。ダクソ2やってた。

5月。js、node、でtodoアプリを作ってみた。

6月。Dojo tool kitの勉強してた。

7月。DirectXの勉強を始めた。最新のDirectXでは機能が多すぎて死ぬので9の環境を作ってやった。マインクラフトやった。

8月。転職一年後の記事を書いた。

9月。YAPCにいった。Pyconにいった。ダクソ2のDLCやってた。

10月。Ansible触った。モンハンやってた。

11月。TESOやってた。サバゲやった。

12月。ドラクエ10やってた。

 

・目標を達成したか?

上から下までを1つ→×、Paasを使ったのが1つ→◯、ライブラリが1つ→×、転職一年後の記事を書く→◯。

nodeで書いたみたものと、転職後の記事を書くのは達成しましたが、それ以外はやっていませんね。今になって思うと私のスキルセットと時流を考えると上から下までを用意することはあまりためになるとは思えないですね。でもライブラリ組むのはやっておくべきでした。

 

・所感

私のスキルセットはフロントに寄り初めています。その方向を伸ばすことで考えます。そのためには下から上まで一気に把握することよりも、Paasの使い方を理解する方が私のためになるとも思います。またデザインやユースケース設計のことも視野にいれなければいけないなと思いました。その作ったものを正しくするための品質とは? 転職アフターで書いたようにいかにして良い物を作るのか、の部分に注力していきたいように思います。そろそろ何をやらないかということを決めないと行けない時期に来たように思いました。

あとゲーム作ることと東方漫画を書くことを始めたいです。それはなんというか人生の目標というか生きる目的というかそれをやりきったのなら死んでもいいとかそういうレベルでの夢なのですが、あまりにもなにもやってなさすすぎて、したことのない恋にこがれつづけるために本気で愛さないみたいな本末転倒になりつつあるので。ちゃんと始めようかと。

いろいろ諦めてUnityとかのレベルデザインツールを使うことでとにかく完成させる方向と、DirectXや3D数学の勉強をして裏のことをちゃんと知るという方向があります。あとイラストの真似事はしても漫画となるとさっぱりわからないのでそういうのを勉強をするということがあります。 

 

・来年の目標

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

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

 

 

Ansibleを使ってみた話

Python製のプロビジョニングツールAnsibleを使ってみました。

 

サーバーで遊ぶようにさくらのVPS借りてるんですが、VPSだから作って壊してを繰り返すじゃないですか。なのでセットアップ用のシェルを作ってたんですが、だんだんメンテしんどい感じになっていまして。

ここらでひとつはやりのプロビジョニングツールでも使ってみようかと思ったのです。これ系といえばChefですけれど、Chefはオレオレルールが多すぎてどうにも肌に合わなかったのです。入門記事読もうとしても意味がわからない。そこでansibleを知って、sshで色々やるんだよ。っていうのを見て、なるほどわかりやすいそれだ!ってなったので使うことにしました。

 

arvelt/myserver-setting-ansible · GitHub

というわけで書いたんですけれども。

 

基本のき、ベストプラクティス、Galaxy、パスワードどうすん? ていうことについてはReadmeにメモってあります。

それ以外だと。その渡すパスワードをコマンド叩いたときにいちいちタイプするのめんどいから、ローカルにおいてあるファイルにかいておいて、シェルで渡せばいいか、とか。Railsアプリ(ここではRedmine)のデプロイめんどくさすぎて、これに何の意味があるのか(哲学、みたいな感じになったりしていました。

 

そもそもReadmeにTipsとか書いてて、Readmeってそういうんじゃねえから!Wiki使え!っていう感じなんですがこれはこれで自分で見返すのが凄い楽なのでおすすめ感あります。

Wikiまでいくのめんどいです。みたいな。

 

しかし、プロビジョニングツールにすると言っておきながら、最初のトリガーがシェルになってるあたり微妙感があります。VPSのコンソールからOS入れたところから始まる、っていう想定なのでまずssh設定しないとansble通らないじゃん?ていうせちがらい事情があります。

そこらまで含めてがっちりできるのはChefをサバクラ構成したときなんでしょうかね・・・。

 

ですがベターシェルとして使うという観点でいくとかなり良いのではと思いました。OSごとの細かい話とか気にしたくないのでmoduleが吸収してくれているのがよいところだと思います。Galaxy bookもあるので共有できますし。と思ったらYUMとAPTとかあって、だからそういうの考えたくないんだよ!なめてんのか!とかなりますね。

 

というわけでansible。小・中規模のサーバー郡をプロビジョニングしたいとき、もしくは個人用サーバーのセットアップ等に使えばよいと思います。

 

pycon2014jpに行ってきた話

所感

django-debug-toolbarよさげ

pyramigばかりでflaskみなくなったけどflaskオワコンなの?

ラズパイ面白そうだから買う

非同期ライブラリはtornadoがいいらしい

pythonパッケージツールのことがさっぱりよくわからない。結局どうしたらいいんだ。virtualenvいいっていうけど結局それの操作覚えないといけないので面倒くささは何も変わらないなぁ。

python3はGAE SDKが対応したら粛々と移行を行うと思います。それ以上も以下もない。

 

 

面白かった話

CH03 Djangoアプリケーション、パフォーマンスチューニング (ja) - YouTube

【発表資料】PyConJp 2014 「OpenCVのpythonインターフェース入門」と、その補足説明 | DERiVE コンピュータビジョン ブログ & メルマガ

Python を支える技術 ディスクリプタ編 #pyconjp - Qiita

CH15 Pythonではじめる野球プログラミング (ja) - YouTube

CH01 Opening~Keynote: Kenneth Reitz - YouTube

Pythonによる非同期プログラミング入門

パッケージングの今

 

 

メモの供養。内容保証なし

pycon2014jp 1day

@hirokiky
SQLを吐きまくるコードは誰だ
インデックス
キャッシュ
アプリケーション外

django-debug-toolbar
dbログ出力
Funcload


python, Raspberry Pi, arduinoで作る商品電力モニター
@kironono

らずぱいとあるどいのの通信
シリアル通信
RS0232C
TX,RX,GNDがあればいい

Firmata
python-firmata

pySearial

電力の見える化
電流センサー
あるどいの
 センサー制御
らずぱい
 あるどいのと通信
 Webアプリ
 データ保持

電流センサ
CTL-10-CLS

 

リファクタリングツール
flake8
docformatter
eradicate
unify
pyformat
jedi
Rope
Code Climate
Radon
Sentry

 

 

pycon2014jp 2day
pythonの非同期プログラミング
@checkpoint
非同期処理の選択肢
twisted
 イベント駆動型ネットワーキングフレームワーク
 TCPUDPSSL、HTTP、SSHFTP
 Deferred使う
tornado
 Facebookが開発のOSS
 WebFW+非同期通信ライブラリ
 高速
gevent
thread, multi process, etc
asyncio
 python3.4から標準ライブラリ入り
 アーキテクチャ
 Event loop
 Corutines
 Future, Task
aiohttp
 非同期の使い方としてよいサンプル

 

 

パッケージングの今
パッケージを使う・作る・活用
pypi
pip
virtualenv
pip
-pre
-allow-external
-allow-univerified
python3.4以降からpipを利用可能になる
ローカルサーバーからインストール
 pip install pyramid -f url
requirements.txt
--no-indexとかある
wheel
 pip install wheel
 pip wheel pyramid
setuptools
 パッケージングするための必須ツール
setup.py
 パッケージのメタデータを書いておく
 内部ではsetuptoolsやdistutilsなどを呼ぶようにする
ローカルPyPIサーバー
 pip install devpi
devpi
 travisとかでpip wheelしておいてwheelhouseまるごとVCSに入れてしまうようにする
 devpiをLANに立てておくとか、Wheelしておくとか
requirements.txtを分けると使い勝手がよくなる(依存ライブラリとオプションとか)

使う
 pipが細かく進化してる
作る
 setuptools
公開
 wheelを使うとよい

 

 

sqlacodegen

 DB schemeからSQLAlchemyのModelコードを自動生成
Start Bootstrap
morris.js
 棒グラフ・折れ線グラフ
HIGHCHARS
 散布図
セイバーメトリクス
 BABIP
 ピタゴラス勝率