KQ言語ジェネレーターを作ってみた。

ちまたを賑わしているKQ言語ですが、 KQ利用者としてこの流れに乗っかるべくKQ言語ジェネレーターを作ってみました。

# 勢いで作った→ほとんどテストしてないので動かなかったらごめんなさい_| ̄|○

これは何?

指定した文字列をKQ言語に変換するモノです。

やっつけコード

#!/usr/bin/env ruby
## -*- coding: utf-8 -*-
# 
# # Programming Language KQ Reverse Compiler

# define kq
def r(mark)
    kq = {
        '>' => 'ダァイェス',
        '<' => 'イェスダァ',
        '+' => 'ダァダァ',
        '-' => 'シエリシエリ',
        ',' => 'ダァシエリ',
        '.' => 'シエリダァ', # print
        '[' => 'シエリイェス',
        ']' => 'イェスシエリ',
    }
    sep = '!' * (rand(2) + 1)
    kq[mark] + sep 
end 

# get string 
input = STDIN.readlines.join.chomp.force_encoding('UTF-8')
buffer = []
input.each_byte{|c| buffer.push(c)}

# local
def local(buffer)
    res = ''
    len = buffer.length
    exit if len < 1
    0.upto(len-1) {|i|
        0.upto(buffer[i] - 1) { res += r('+') }
        res += r('.')
        res += r('>') if i < (len - 1)
    }
    return res
end

# express
def express(buffer)
    res = ''
    len = buffer.length
    exit if len < 1
    0.upto(buffer[0] - 1) { res += r('+') }
    res += r('.')
    return res if len < 2
    1.upto(len-1) {|i|
        diff = buffer[i] - buffer[i-1]
        (0 < diff) ? diff.downto(1) { res += r('+') } : diff.abs.downto(1) { res += r('-') }
        res += r('.')
    }
    return res
end


# limited_express
""" just idea now implementing can't execute
def limited_express(buffer)
    res = ''
    len = buffer.length
    exit if len < 1
    half = buffer[0] / 2
    res += r('+')  if buffer[0] % 2
    res += r('>') + r('[') + r('<')
    0.upto(half - 1) { res += r('+') }
    res += r('>') + r(']') + r('<') + r('.')
    return res if len < 2
    1.upto(len-1) {|i|
        diff = buffer[i] - buffer[i-1]
        (0 < diff) ? diff.downto(1) { res += r('+') } : diff.abs.downto(0) { res += r('-') }
        res += r('.')
    }
    return res
    
end
""" 
#p local(buffer)
p express(buffer)
#p limited_express(buffer)


# TODO : より短く 
# limited express
# Green Limited Express
# wing

実行結果

例えば"hello"という文字列は次のようになります。

"ダァダァ!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!ダァダァ!ダァダァ!ダァダァ!シエリダァ!シエリシエリ!シエリシエリ!シエリシエリ!!シエリダァ!!ダァダァ!ダァダァ!ダァダァ!!ダァダァ!!ダァダァ!ダァダァ!ダァダァ!シエリダァ!シエリダァ!ダァダァ!!ダァダァ!ダァダァ!!シエリダァ!!"

使い方?

これによって

朝の挨拶も→ダァシエリイェス!!
あの子へのI love youも→ダァシエリイェス!!
機密文書も→ダァシエリイェス!!


今のところ単純変換の普通(local)、ASCIIカウントを再利用して若干効率化した急行まではやっつけました。。。が、まだ利用していないネスト系を使って大幅圧縮を行う特急を現在実装中です。

今後の予定

今後の目標としてはさらなる高みの快特、究極のKQジェネレーターであるWingを実現できればいいなぁ。。。と。

あ、githubで公開してるので、適当に改良してください。あと誰か俺にrubyらしさを教えてください_| ̄|○
https://github.com/plasticscafe/KQ-Language-Generator

それにしても初めてのrubyをこんな風に経験することになるとは。。。

そしてKQ言語作った@nvsoftsさんすげーな、と思いまった。複数文字横断のネストとか激アツすぎる(`・ω・´)

今回のまとめ

このコードの大半がKQの中で書かれているということ。

おまけ

最近こんなのも作ってます→芋煮会戦

地震やらの天災に備えての防災品リストを挙げてみる

311こと東日本大震災から5ヶ月が過ぎ、かつ関東の生活にも慣れてきつつある中でふんどしを締め直す意味でも防災品準備リストをまとめ直してみるのです。

基本的には地震なんかで一部損程度の被害はあったものの家には住める状態、ただし数週間程度は電気・ガス・水道等のインフラが止まりまっせ!という自分が体験した内容に基づいていますデス。

いわゆる防災品

とりあえずの必需品としては大型店の防災品売り場にあるようなものなどを。

被害発生直後は疾風のように売り場からなくなってしまうものなので事前に確保しておくのが吉です。その後の入荷は各地の支援によって比較的迅速に行われる可能性が高いのですが、超人気アイテムなのでiPad2発売程度の行列は覚悟しておく必要がありマス。

電池系

ラジオや携帯電話のエネルギー源の電池関連っすね。311の時は単3電池はわり早めに補充されたにもかかわらず単1、単2がなかなか入らずにレアアイテム化した記憶があります。特に単一電池は防災関係の電化製品でよく使うので、自分が所持しているモノで利用できるものはまんべんなく確保しておくのがヨさそうです。

いわゆる電池系のアイテムは次のような感じですかね。

  • 乾電池
  • 乾電池式ランタン
  • 乾電池式ラジオ
  • 乾電池式携帯充電器

自分は被害直後にラジオを持ってなかったのですが、被害範囲やその他公的な情報を仕入れるのに出遅れてしまった感がありました。結局津波の被害を知ったのは近所の友人が持ってきてくれた手回しラジオに出会えた数日後になってからでした。

また、初期〜中期はお店の開店情報や携帯電話が充電可能な場所情報等がラジオやテレビを通じて提供されたので公的機関の情報侮るなかれですな。なおラジオ自体の入荷はしばらくなかった記憶があるので、事前準備が吉だと思いました。

カセットコンロ系
  • カセットコンロ
  • カセットボンベ

インフラ停止時の日常生活の強い味方です。カセットコンロが使えれば、後は努力と知恵で大概の調理をこなすことができました。個人的には「カセットコンロ+圧力鍋→米が炊ける→炊き出しすっぞ!」をあの状況で発見・実行したうちの嫁さんはすげーと思いました。

お湯を沸かす事が可能になるとかなり精神的に余裕が出てくるので、蒸し鍋なんかのためにカセットコンロその他を所持していた我が家はかなりラッキーでした。

ただし、本格的に使い始めるとカセットボンベの消費が結構激しいのである程度のストックが必要になりますデス。なお311のとき仙台市内では比較的入荷が早かったので、数日分あれば何とかなったなぁ感がありましたが。

緊急日用品系

とりえず生き抜くための日用品ですね。被害発生から数日で入荷あるいは支給が始まったりしたのですが、それまでに必要な分量が補充されていると心の平穏に役たちます。

  • 水やお茶、ジュース等飲み物
  • カップラーメンや缶詰等の保存食料品
  • トイレットペーパーやティッシュペーパー

ちなみに水が使えない状況では食事後の洗い物ができないのでキャンプ風にティッシュペーパーで拭う、または後述のラップ大作戦で凌ぐことになりました。特に缶詰ものをよそったお皿は大半が油まみれになるので注意が必要です。

その他

気温や状況によるとは思うのですが、下記を用意しておくと安心かな…と。転ばぬ先の杖的な感はありますが、あると無いではかなり違うものなので。

  • 現金
  • 救急セット(常備薬含む)
  • 保温シート(冬用に)
  • 十徳ナイフ等の便利系ナイフ(梱包開けやサバイバー)
  • 軍手(被害箇所のお片づけ)
  • 折りたたみ式水タンク等

ATMはもちろんカードも使えなくなるので、買い出し用のまとまった現金が必要になります。被害発生後しばらくは一日の大半を買い出し(行列に数時間ならぶ簡単じゃないお仕事)に費やすことになるので、ある意味必須なものの一つでした。

また、特に折りたたみ式水タンクが無いと、給水所に行くのに鍋や薬缶を持っていくハメになるので結構大変です。我が家はすぐ近所に給水所があったのでそれでも何とかなりましたが、数キロ先まで遠征とかの人は本当に大変そうでした。

ちなみに、被害発生後すぐに開始される水の支給も長いところでは数時間待ちがあたりまえだったので、一日に何回も行けるものではなかったです。

日用生活編

防災品の扱いでは無いけどもあると便利だった日用品シリーズです。上記防災品よりも入荷優先順は高くなかったりするので、事前に確保してあるとちょっと楽になります。

  • ラップ
  • バケツ
  • ゴミ袋

ラップは洗い物軽減のために利用前のお皿にかぶせて使います。紙皿なんかよりもゴミの量が減らせるので超絶使い勝手が良いです。

またバケツは緊急洗濯などにももちろん使えるのですが「何かに使った水→トイレ用に確保」する際の受け皿になるので、トイレ使えませんが(´・ω・`)を防ぐという第一優先課題の解決に一躍かってくれますデス。

あとゴミの収集がストップするので特に生ゴミ等の二重三重梱包のための大量のゴミ袋が必要だったっす。

衛生用品

洗濯・入浴(シャワー含む)が基本的にストップ、状況によってはトイレ使用禁止になるので衛生状況を保つために下記があると結構便利そうです。

  • 汗ふきシートや制汗スプレー
  • ファブリ━━━.゚+.(・∀・)゚+.゚━━━ズ!!等々の除菌におい消し
  • トイレマジックリン等の消臭可能な洗剤

臭いが発生すると気が滅入ってしまうのでなんとか防止しようと必死でした。311時は気温が低かったのでまだ何とかなったのですが…夏場だともっと悲惨だったなぁと…それと次のようなものがあればありがたかったかも

  • 水のいらないシャンプー(キャンプ用品?)

また、どんなに対策しても1~2週間で限界が来る→体調崩すって人は出てくると思うので、特にそういった環境に弱いと自覚のある人(皮膚弱いとか)は事前に薬も常備しておいたほうが良いと思われます。

その他状況による品々

状況によっては必要になる品々です。基本的にお店への入荷が生活必需品や日用品よりも後回しになるモノなので、ある程度の余裕が無いとお店をかけずり回ることになります。

特に赤ちゃんのいる家庭は粉ミルク、オシメ等の確保がすごい大変そうだったので…事前の準備があったほうが良さ気です。また十分な備蓄がない状態で被害にあった場合は、近場では手に入らない可能性も見越して遠方の家族とかに確保してもらうっていう方法を考えるものありかもしれないです。

とりあえずのまとめ

基本的に必需品などについてはJIT的「必要なときになったら買う」から、ある程度バッファを持って「必要な分+αを備蓄する」に切り替える必要があるなぁ、、、と思っております。

また、今回の震災において自分の環境では「インフラが止まる→飲料以外の水が使えない」が一番インパクトが大きかったことなので、それを見越した防災品リストの作成と準備が必要だな…と思っている次第です。特に洗い物ができない&トイレが使えないは結構ジワジワとダメージが蓄積していくので、それを軽減する準備は必要だと痛感しました。

あと、被害当時から時間がたってしまって忘れているものもあるはずなので、思い出し次第追記していく所存です。また、コレも必要ってのがあればそちらも追記しますので教えてくださいm(__)m

おまけ

防災品準備というわけではないですが、心の準備として震災後は以下を心がけております

  • いざというときの避難ルートをまず確保
  • 被害発生後数分は携帯電話を使えるので身内への連絡は迅速に
  • パニックになって呆然とするよりもまず動く
  • キツイ現状にとらわれず楽しめるところは楽しんでしまう
  • 昨日よりも良くなっている今日探しをする

特に被害発生後すぐに何がしかの行動を起こしたかどうかで、その後の生活が変わる事例をたくさん見たので「まずは動くってのが大事」なんだなぁというのを肝に銘じておりますデス。

横浜市民になりまった

転入届が無事受理されたので、無事に横浜市民になりました。

生活拠点の変更は今回で2回目となりますが、大学進学のための仙台移動の前回とは違って今回は本当の意味での移住という心持ちになっております。

まあ、ある程度の生活基板ができていたものをマルッと変えることになったわけなので、それだけ大きな変化だという事になるのでしょうか…まあ、ひとつの区切りとしていろいろとチャレンジしていきたいと思っとります。

とりあえず、既に半ばやられつつある関東の暑さに負けぬように頑張りたい…デス(´・ω・`)

あと「横浜市歌が歌えないやつは濱っ子じゃねー」と嫁に言われたので精進したいと思います(`・ω・´)

退職します(そして移住します)

正式な退職日は今月末なのですが、本日から有給消化期間に入ったので情報を公開します。

「開発者に俺はなる!」と、大学院(博士課程)を飛び出(中退)した自分を拾ってくれた現職には、5年弱にわたって開発現場の経験と収入という研究室では得難いモノを与えてもらい、大変お世話になりました。

特に、技術的側面についてはかなり好き勝手にやらせてもらった感もあり、実際の開発現場でしか得られないだろう、様々なことについて勉強させていただいたなぁ。。。と感謝に尽きません。

さて、今回は転職志向の退職となった経緯をザラッと書くと、もともと就職時に5年位を目処に転職を検討したうえで続けるかどうかを考えよう、等と社会人経験もない(年齢だけ高い)小童が小生意気にも思っていたことをなんとなく実行してみました(`・ω・´)ってことなんですが…

検討してみた結果、将来的なキャリアとか家庭的な何とかを鑑みるに転職してみようかな?と思うに至り、かつ非常に良い縁に恵まれてトントン拍子に転職がきまってしまい、今回の退職となったわけです。

# なんだかんだ仕事選びの面では毎回一社受験で決まってしまうという
# 非常に縁に恵まれた人生を送っておりますな…

そんなわけで、7月1日付で新しい会社へお世話になるのに伴い、今月下旬で関東へ移住することになります。職場は東京で生活の新天地は横浜になりますので、そちら方面の知り合いは遊んでくれるといいよ(・´з`・)

ちなみに、タイミング的に地震やら放射能の影響で東北脱出!と思われがちなのですが、関東移住はそれよりもずっと前から考えていたことなので…誤解です、誤解です(´・ω・`)と言い訳しておきます。。。その点については、被災者が被災地以外で被災地のためにできることは案外多いんでないかな?と色々考えてはおりますよ(`・ω・´)

以上、ひっさびさの記事ですが、一度は書いてみたかった退職します的記事でした。距離的には離れてしまう仙台の人も近くなる関東の人も、今後とも宜しくお願いいたしますデス。


あ、東北魂的に荒吐は意地でも行きますよ!!!

gitのsubmoduleだけを最新版にしたい場合のコマンドメモ の続き

すっかり間が開いてしまった前回の日記に、参照元の記事の方が即効で補足記事を書いてくれていたので今頃になって掲載してみるよ(`・ω・´)…つか、レスもらってから一ヶ月ほど寝かせてしまってごめんなさい、バタバタしすぎね(´・ω・`)

ということでうんたらかんたら日記で、git submodule関連でupdate周りの詳細な情報が掲載されておりました、要チェキ(゚Д゚)だ


…大分落ち着いてきたので、ぼちぼち更新再開していきますよ。うん、頑張る(`・ω・´)

gitのsubmoduleだけを最新版にしたい場合のコマンドメモ

以前からvimの各プラグインを、ここらへんを参考にgit submoduleで管理していたのだけど、git submodule updateしても各プラグインが最新版になってなかったのに気がついた…というより最新版になるものだとすっかり勘違いしていた…という恥書きメモ

今回起こった現象

・gitで管理しているvimの環境では、定期的にgit submodule updateしてるからsubmoduleで管理している各種プラグインも最新版になってるはず
 ↓
・とあるプラグインで、数カ月前に解決されているバグ修正が反映されてない…だ..と( ゚д゚ )
 ↓
・つか、各モジュールが全然更新されてないやん ← イマココ

git submodule updateの動作

どうやらgit submodule updateで持ってこれるのは、親プロジェクト(ここでは.vimrc他の管理プロジェクト)が指定したコミットということみたいで、各submoduleを最新版にするわけではないのよん(`・ω・´)ってことみたいです。

http://progit.org/book/ja/ch6-6.html

まあ、本来は自分の開発物の管理に利用して、親モジュールとサブモジュール間の依存関係を壊さないための仕組みっぽい(と勝手に思っております)ので、当然っちゃー、当然なんでしょうね(´・ω・`)

gitでsubmodule管理しているのを最新にするには次のコマンドを実行

んで、これを何とかしたいと思って探し回ったら、中途ハンパに翻訳されて非常に読みづらいと定評のw3supportで解決策が…

git submoduleに強引にpullコマンドを渡してやります(`・ω・´)

# これで動作するのか...(´・ω・`)
git submodule foreach git pull origin master

参考:http://ja.w3support.net/index.php?db=so&id=1030169

とりあえず解決なのか?

うん、とりあえず手元の環境では、無事submoduleドモが最新版になったのです。ただ、正直w3supportで解決してしまったのがほんのり悔しいのはなぜだろう?

まあ…オフィシャルドキュメントを読み落としてるだけの可能性もあるので、もっといい方法があれば誰か教えてくださいm(__)m

nginx + uWSGI + Flaskを試してみる

nginxという軽量Webサーバの話を最近よく耳にするので、とりあえず試してみますヨ

とりあえずnginx上でFlaskアプリを動かすのを最終目標にゴニョゴニョしてみますデス

まずnginxをインストール

まずはnginx本体のインストールをしてみますよ→nginx

ここを参考に作業したらあっさり動きました。

とりあえず手順を羅列していきます

# 最新版の0.8.54をダウンロード
$ wget http://sysoev.ru/nginx/nginx-0.8.54.tar.gz

# nginx実行ユーザを作成
sudo useradd -s /sbin/nologin -d /usr/local/nginx -M nginx

コンパイルオプションが豊富なのでスクリプト形式で保存しておきます
# 参考サイトのものを参考に作成しました

#!/bin/sh
 
NGINX=nginx-0.8.54
 
# インストール先は /usr/local/nginx
cd $NGINX \
# 初回コンパイル時にはエラーになるのでコメントアウト
# 一度makeしたあとだとOK
#&& make clean \
#&& ./configure \
./configure \
  --conf-path=/etc/nginx/nginx.conf \
  --error-log-path=/var/log/nginx/error.log \
  --pid-path=/var/run/nginx/nginx.pid  \
  --lock-path=/var/lock/nginx.lock \
  --user=nginx \
  --group=nginx \
  --with-http_stub_status_module \
  --with-http_ssl_module \
  --with-http_gzip_static_module \
  --with-http_realip_module \
  --http-log-path=/var/log/nginx/access.log \
  --http-client-body-temp-path=/var/tmp/nginx/client/ \
  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
&& make

上記スクリプトでmakeまでしたらインストールしますよ

# インストール
sudo make install

# nginxが使用する各種ディレクトリを用意
sudo mkdir /var/tmp/nginx/{proxy,client,fcgi}

とりあえずお試し実行してみます

# サーバ起動コマンド
sudo /usr/local/nginx/sbin/nginx
 
# サーバ終了コマンド
sudo /usr/local/nginx/sbin/nginx -s quit

"Welcome to nginx!"という文字がブラウザに表示されればOKです(`・ω・´)

Flask動かす茨の道

とりあえずnginxがあっさり動くようになったので、これ幸いとFlaskを動かす設定をしてみます…が、なかなか上手く動かず四苦八苦するはめに…

とりあえず羅列するとこんな感じ
  • nginx用mod_wsgiがある(゚∀゚)
    • 0.8系ではmod_wsgiを組み込んだnginxコンパイルが通らない
    • 0.7系でもmod_wsgiを組み込んだnginxコンパイルが通らない
      • そもそもmod_wsgi内で呼び出されている関数が違うとか…云々
  • FastCGI...はとりあえず置いとこう…いや、なんとなく
  • 最近出てきたuWSGIとやらを試してみる
    • 0.8系ではコンパイルエラーに…
    • 0.7系では…なんとか動いた!_|\○_ヒャッ ε=\_○ノ ホーウ!!
uWSGIを採用シマス

...というわけでnginx + uWSGI + Flaskという構成で動かしてみることに

# 今になってnginx用mod_wsgiにパッチがあることを発見…あとで試しマス

uWSGIの導入

そんなわけでuWSGIを導入しますデス

uWSGIはWSGIアプリケーションのアプリケーションコンテナとして動作するらしく、そのフロントエンドとしてnginxが動作するイメージですネ

適当に図式化するとこんな感じですかね

[各種HTTPクライアント]
  ↓ HTTPでの問い合わせ
[nginx]:HTTPの通信を(80番とかで)受け付けて、uWSGIに処理をぶん投げ
  ↓ 実際のアプリケーション要求を中継
[uWSGI]:適当なポート番号で待ち受けて、要求された処理を実行
    
Apacheモジュールなんかとは違ってnginxにuWSGIを組み込むのではなく、各々が独立して動作しつつも連携するイメージが近いみたいです

# このイメージが最初出来なくて、イマイチ設定方法に戸惑ってました
# まあ、このイメージで合ってるのかというのも疑問が残りますが:(;゙゚'ω゚'):

とりあえず、まあインストール

インストール自体はこちらを参考におこないました。なお、nginxは0.7.68にダウングレードしております。

# ソースをゲットします
$wget http://projects.unbit.it/downloads/uwsgi-0.9.6.8.tar.gz

# 解凍してmakeしてバイナリを作成します
$ tar zxvf uwsgi-0.9.6.8.tar.gz
$ cd uwsgi-0.9.6.8
$ make

必要なディレクトリを用意します

mkdir tmp/ sock/ pid/ log/

とりあえず動かしてみますよ

# TCP:10000番で待ち受けるように起動
$  ./uwsgi -s 0.0.0.0:10000

うん、とりあえず動くみたいです

nginxにモジュールを組み込み

nginxのコンパイルオプションで--add-moduleでuWSGIを組み込みます

  --add-module=<解凍したuwsgiソースが置いてあるディレクトリ>/uwsgi-0.9.6.8/nginx/

上記オプションを追加して再びコンパイルしマス

コンパイルが完了したらnginx設定ファイルのnginx.confを編集シマス。とりあえず動けば良いや!って勢いで修正したので、間違ってたらゴメンナサイ(´・ω・`)

worker_processes  1;
pid               pid/nginx.pid;
error_log         log/nginx-error.log;
   
events {
  worker_connections  1024;
}
    
http {
  # Some sensible defaults.
  #include               mime.types;
  default_type          application/octet-stream;
  keepalive_timeout     10;
  client_max_body_size  20m;
  sendfile              on;
  gzip                  on;
      
  # Directories
  client_body_temp_path tmp/client_body/  2 2;
  fastcgi_temp_path     tmp/fastcgi/;
  proxy_temp_path       tmp/proxy/;
  uwsgi_temp_path       tmp/uwsgi/;
      
  # Logging
  access_log            log/nginx-access.log  combined;
      
  # uWSGI serving flask.
  upstream flask {
    server 127.0.0.1:10000;
  }
      
  server {
    listen      80;
    server_name example.com;
    charset     utf-8;
        
    location / {
      uwsgi_pass  flask;
      include     uwsgi_params;
    }
  }
}

とりあえずこんな設定でnginxを動かしてみますよ。また、nginxのuwsgiモジュール用の設定としてuwsgi_paramsファイルを次のように用意します

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;
Flaskアプリを用意します

環境を汚したくなかったのでvirtualenvで作成したPython環境でFlaskのテストアプリを用意します

$ virtualenv test
$ source test/bin/activate
$(test) pip intall flask

Flaskアプリはこんな感じのHelloWorld仕様です

# test.pyとして保存します
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()
uWSGIを起動します

virtualenv環境を指定しつつ、flaskアプリを起動してやります

# -Hで実行環境、-wでモジュール:アプリケーションを指定します
./uwsgi-0.9.6.8/uwsgi -s 0.0.0.0:10000 -H test/ -w test:app

うん、Helloworldが表示されました

とりあえず動くようになったかな?

今回は、何をおいてもFlaskアプリを動かしてみる、を目標に駆け足でnginxを触ってみました。

とりあえずnginxもなんとか動かせる、怖くない…と思えるようになったものの、実際の設定なんかについては置き去りにした箇所がかなりあるので、今後細かい項目をいじっていろいろと試してみたいと思いますデス。

…あと、この設定チゲーよ!ってのがあれば教えてください(´・ω・`)

と、今になって気づく事実

こちらをみてみるとnginx0.84以上にはuWSGIが既に組み込まれているとのこと…だからコンパイル通らなかったのね orz

あとで試してみます(´・ω・`)