tag:blogger.com,1999:blog-81660362043711816032024-02-20T20:23:38.648+09:00情報観測研究所Walkerhttp://www.blogger.com/profile/17823316959667462494noreply@blogger.comBlogger12125tag:blogger.com,1999:blog-8166036204371181603.post-24780384466452838252013-12-04T23:16:00.000+09:002013-12-04T23:16:02.437+09:00ブログ移転移転と言ってもBloggerからは移転せず、取得したドメインで作成したブログを新たに設置しました。<br />
<br />
<a href="http://www.jarfarm.com/">Jarfarm</a><br />
<br />
プライベートでいろいろとあったので完全に放置状態でしたが心機一転したいと思います。<br />
よろしくお願いします。Walkerhttp://www.blogger.com/profile/17823316959667462494noreply@blogger.com0tag:blogger.com,1999:blog-8166036204371181603.post-3772140250677578252013-04-22T23:50:00.000+09:002013-04-23T00:14:40.699+09:00Common Lisp (SBCL) を Windows で遊ぶサイボウズLiveで友人とちょっとやり取りがありました。<br />
Lispの話題がのぼった(というか私が発言した)ので<br />
ちょっとプログラマな彼に触ってみてもらいたい、<br />
という思いで記事を書き起こしてみます。<br />
<br />
といっても私自身 <i>Land of Lisp</i> を買って初めてLispに触ったクチで、<br />
要は完全に初学者なので、四苦八苦しながらも遊べる環境をWindowsで用意しました。<br />
「彼」の環境がWindowsだったはずなのでこれで触ってもらえるはず!<br />
そしてVimを以前使っていたのでSlimvで幸せになれるはず!<br />
たぶん。<br />
<br />
<div style="text-align: center;">
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=FFFFFF&IS2=1&nou=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=iol-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4873115876" style="height: 240px; width: 120px;"></iframe>
</div>
<div style="text-align: center;">
<i>Land of Lisp</i> 面白いよ <i>Land of Lisp</i> 。</div>
<br />
さて、<i>Land of Lisp</i> で扱っているのは<a href="http://www.clisp.org/">CLISP</a>でしたが<br />
CLISPの環境では後述の、swank-server(後述)を自動で起動できなかったので<br />
ここではSBCLで設定を進めていきます(Windows+CLISPがダメなのかも)。<br />
なお本来、<a href="http://ja.wikipedia.org/wiki/Common_Lisp">Common Lispの方言</a>は<a href="http://clojure.org/">Clojure</a>でも<a href="http://www.clozure.com/clozurecl.html">Clozure CL</a>でも<a href="http://www.sbcl.org/">SBCL</a>でも動くとのこと。<br />
加えて、<a href="http://schemers.org/">Scheme</a>とかも動くらしいですよ(ただしこれはLinux系に限る)。<br />
<br />
では早速インストーラーを用意しましょうか。<br />
必要なのは下記リスト。<br />
<br />
<br />
<ul>
<li><a href="http://www.sbcl.org/platform-table.html">SBCL1.1.4</a></li>
<li><a href="http://www.python.org/download/">python 2.7.x</a></li>
<li><a href="http://www.kaoriya.net/software/vim/">Vim7.3.x (kaoriya版)</a></li>
<li><a href="https://code.google.com/p/msysgit/downloads/list?can=3&q=&colspec=Filename+Summary+Uploaded+ReleaseDate+Size+DownloadCount">MsysGit1.8.1.2</a></li>
<li><a href="http://mercurial.selenic.com/downloads/">Mercurial 2.5.x</a></li>
</ul>
<br />
<br />
ごらんの通り、意地でも<a href="http://www.cygwin.com/">Cygwin</a>は使いません。<br />
理由はAll-in-Oneでいける反面、<b>個人的に</b>不便さを感じたためです。<br />
また注意点として、<b>Python3.x系ではこれから導入するvim-pluginが動作しません</b>。<br />
なお、ただCommon Lispに触れて遊ぶだけであれば<br />
いわゆるREPL( Read-eval-print loop )でOKなのですが、それじゃ面白くないでしょう?<br />
<br />
<br />
<br />
<h2>
インストール</h2>
<div>
<br /></div>
先のリンクからひと通りインストーラーおよび<br />
アーカイブをダウンロードしてインストールまで行いますが、<br />
Windowsのデフォルトインストール先となる "C:\Program Files\" ではなく<br />
C:\toybox\ などにこの環境をまとめてインストールします(<a href="http://www.atmarkit.co.jp/fwin2k/win2ktips/859disuac/disuac.html">UAC</a>とかうるさかったりするので)。<br />
<br />
ひと通りインストールが完了したら<a href="https://www.google.co.jp/search?q=windows+%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0&aq=f&oq=windows+%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0&aqs=chrome.0.57j0j5j0j62l2.3988&sourceid=chrome&ie=UTF-8">環境変数</a>を設定します。<br />
例えばインストール先がC:\toyboxであれば、<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">C:\toybox\clisp-2.49\;
C:\toybox\vim73\;
C:\toybox\msysgit\cmd\;
</pre>
<br />
という形で設定します。<br />
Mercurialについては<b>インストーラを用いれば自動で設定されるので省略</b>。<br />
Python2.7については後の設定で直接呼び出すだけなので<b>設定を行いません</b>。<br />
<br />
<br />
さて、インストール手順まで明記していくと冗長ですので<br />
例としてあげた C:\toybox\ 以下あたりに<br />
<br />
<ul>
<li>Steel Bank Common Lisp</li>
<li>Python27</li>
<li>vim73</li>
<li>msysgit</li>
</ul>
<br />
という感じでフォルダがならんでいればいいのでないでしょうか。<br />
<br />
<br />
SBCL自体はここで「ファイル名を指定して実行」( Windowsキー + r )に<br />
cmd か powershell と入力すればプロンプトが表示されるので<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">> sbcl
</pre>
<br />
とか入力するとすでに遊べる状態にあります。<br />
これがREPL(Read-eval-print loop)と呼ばれている画面です。<br />
<br />
終了させるには<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">* (exit)
</pre>
<br />
と入力すればプロンプトに戻ります。<br />
<br />
<h2>
GVimの設定</h2>
<br />
続いてVimからSlimvを利用する為の設定を行います。<br />
SlimvというのはVimプラグインのひとつなので<br />
プラグインを管理する環境を用意しておくとあとあと楽です。<br />
<br />
というわけでここで選択するのは<a href="https://github.com/Shougo/neobundle.vim">neobundle</a>。<br />
まずインストール先を用意してあげましょう。<br />
<br />
WindowsのVimは%HOMEPATH%以下の"vimfiles"フォルダ内を自動的に読み込みます。<br />
よってこのフォルダ内にプラグインや各種設定ファイルを置いておくと管理が楽です。<br />
たとえばプラグインであれば下記のようにフォルダを構成します。<br />
<br />
C:\Users\[ユーザ名]\vimfiles\bundle<br />
<br />
続いて次のようにプロンプトからコマンドを実行します。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">cd C:\Users\[ユーザ名]\vimfiles\bundle\
git clone https://github.com/Shougo/neobundle.vim.git
</pre>
<br />
これでneobundle.vimという名前のフォルダ内にGithubからcloneされたファイルが配置されます。<br />
続いてVimの設定ファイルを%HOMEPATH%以下に_vimrcという名前で作成します。<br />
下記は一例。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">set nocompatible
filetype off
if has("vim_starting")
set runtimepath+=$HOME\vimfiles\bundle\neobundle.vim\
call neobundle#rc(expand('$HOME\vimfiles\bundle\'))
endif
NeoBundle 'https://github.com/Shougo/neobundle.vim.git'
NeoBundle 'https://bitbucket.org/kovisoft/slimv'
filetype plugin on
filetype indent on
let g:slimv_python = 'C:/myTools/Python27/python.exe'
let g:slimv_swank_cmd = '!start "C:/myToolbox/Steel Bank Common Lisp/1.1.4/sbcl.exe" --load "C:/Users/[ユーザ名]/vimfiles/bundle/slimv/slime/start-swank.lisp"'
</pre>
<div>
<br />
これでneobundleを利用する準備が整いました。</div>
<div>
続いてSlimvのインストール。<br />
SlimvとはEmacsの対話型開発環境であるSlimeのVim版と考えてください。</div>
<div>
<br /></div>
<div>
GVimを起動して下記コマンドを入力するとインストールされます。</div>
<div>
<br /></div>
<div>
: NeoBundleInstall</div>
<div>
<br /></div>
<div>
しばらく待つと利用可能な状態になります。</div>
<div>
さて、これで一通りの環境が整いました。</div>
<div>
<br /></div>
<div>
あとは拡張子が".lisp"のファイルを開くなり新規作成するなりで</div>
<div>
GVimを起動するとSlimvは自動的にロードされる形です。</div>
<div>
使い方は",c"とタイプするとswank-serverの起動、</div>
<div>
",d"でその行をSBCLに渡して評価させることができます。<br />
<br />
swank-serverはCommon LispとSlimv間で<br />
データのやり取りを行うサーバで、コレがあることにより<br />
複数の方言で動作可能となっています。</div>
<div>
<br /></div>
<div>
さて、実施にやってみるとこんな画面になります。</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-u8umDzKBM0I/UXU-77X0gsI/AAAAAAAAA6Y/oFuYLTKwLTA/s1600/slimv.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="" border="0" height="211" src="http://2.bp.blogspot.com/-u8umDzKBM0I/UXU-77X0gsI/AAAAAAAAA6Y/oFuYLTKwLTA/s400/slimv.png" title="" width="400" /></a></div>
<div>
<br /></div>
<div>
画面左上の画面に書いた式を",d"で評価すると画面右側に評価内容が表示されています。</div>
<div>
これでもう遊ぶ環境は問題ありませんね。</div>
<div>
<br /></div>
<div>
ちなみにこの環境では左下にCLISPが起動しています。</div>
<div>
これはプラグインに<a href="https://github.com/Shougo/vimshell">VimShell</a>を用いているためです。</div>
<div>
VimShellはVimのウィンドウ内にシェルを呼び出すという面白いプラグインなので</div>
<div>
先ほどと同様の手順で導入してみると面白いかもしれません。</div>
<div>
ただし、Windowsの場合はVimProcライブラリをコンパイルしなければならないので</div>
<div>
MsysGit付属のmake(C:\toybox\msysgit\mingw\bin\make.exe)を<br />
用いてコンパイルしましょう。</div>
<div>
VimShellの導入方法は<a href="https://www.google.co.jp/search?q=vimshell+windows&aq=f&oq=vimshell+windows&aqs=chrome.0.57j0l3j60j62.4720j0&sourceid=chrome&ie=UTF-8">ググって</a>みてください。</div>
<div>
<br />
Common Lispの得意とする数学分野をより楽しみたいのであれば<br />
下記のような本に手を出すともっと楽しめます。<br />
<br />
<br />
<div style="text-align: center;">
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=FFFFFF&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=iol-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4486019245" style="height: 240px; width: 120px;"></iframe></div>
</div>
<div style="text-align: center;">
数学アレルギーを克服するくらい本当に面白い本だと思います。</div>
<br />
(exit)Walkerhttp://www.blogger.com/profile/17823316959667462494noreply@blogger.com0tag:blogger.com,1999:blog-8166036204371181603.post-49004853651655157422012-09-24T22:30:00.000+09:002012-09-24T22:30:04.712+09:00モダン環境物語 - アプリ開発編検証検証検証…とやってると現実逃避したくなりますこんにちは。<br />
<br />
前回に引き続き下記環境の組み上げです。<br />
組み上げといっても入れて終わりだともちろん面白くないので<br />
簡単なデータを入力できるアプリっぽい何かを作成するところまでやりましょう。<br />
OKとなっているところが前回までにインストールだけ完了した環境です。<br />
<br />
<ul>
<li>lighttpd(Web Server) <span style="color: red;">- OK</span></li>
<li>Nginx(Proxy) <span style="color: red;">- OK</span></li>
<li>HTML5</li>
<li>CSS3</li>
<li>jQuery(JavaScript)</li>
<li>Python3系 <span style="color: red;">- OK</span></li>
<li>MongoDB <span style="color: red;">- OK</span></li>
</ul>
<br />
<h2>
CGIを動かす</h2>
<br />
さてまずはちょっと寄り道をしましょうか。<br />
わかる人は読み飛ばしを。<br />
<br />
lighttpdでcgiを簡単にテストします。<br />
まあモチベーション維持のお遊び程度なのでおつきあいを。<br />
cgiを動かすためにはモジュールを有効化し、<br />
スクリプトを指定ディレクトリに配置するだけです。<br />
では早速モジュールを有効化し、cgiが動く状態にしましょう。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">% lighty-enable-mod cgi
% vi /etc/lighttpd/conf-enabled/10-cgi.conf
#/usr/share/doc/lighttpd-doc/cgi.txt
server.module += ("mod_cgi")
$HTTP["url"] =~ "^/cgi-bin/" {
cgi.assign = (".cgi" => "virtualenvで作成した仮想環境内のpython3.1")
}
</pre>
<br />
これでひとまず設定はOK。<br />
続いてスクリプトの設置ですが、<br />
デフォルトでは/usr/lib/cgi-bin/以下がcgi実行ディレクトリです。<br />
よって以下のようにしてみます。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">% vi /usr/lib/cgi-bin/pytest.cgi
import cgi
print("Content-Type: text/html")
print()
cgi.print_environ()
</pre>
<br />
あとはブラウザでURLを直打ちして確認してみましょう。<br />
"<b>http://[IP Address]/cgi-bin/pytest.cgi</b>"で確認可能です。<br />
<br />
以上、寄り道終了。<br />
<br />
<h2>
FastCGIで動かす(失敗しました)</h2>
<br />
普通に使うだけならcgiでも構わないんですが、<br />
最近はサーバリソースの効率的な運用という視点からか<br />
fastcgiでの運用がメジャーになっているように思います。<br />
というわけで設定を作り込んでいきましょう。<br />
<br />
さて試してみようとfcgiモジュールを下記のように変更。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">server.modules += ( "mod_fastcgi" )
fastcgi.server = (
".fcgi" => (
"localhost" => (
"socket" => "/lib/init/rw/lighttpd/fastcgi/fastcgi.python.socket-0",
"check-local" => "disable",
"broken-scriptfilename" => "enable",
)
)
)
</pre>
<br />
そして下記コマンドでスクリプトを起動しておき、Web Serverを再起動。<br />
あとはクライアントからのリクエストを待ち受けるだけとなります。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">% spawn-fcgi -a 127.0.0.1 -p 8080 /usr/lib/cgi-bin/pytest.cgi -u www-data -g www-data
spawn-fcgi: child exited with: 0
</pre>
<br />
…あれ、うまくいかない。<br />
調べてみるとプロセスも起動していません。<br />
ネットで見る限りだと"spawn-fcgi: child exited with: 0 successとやらが正しいようです。<br />
6時間くらい格闘しましたが結局うまくいかず、原因もわかりません。<br />
<br />
そこでもしかしてと思ってlibfcgi-devパッケージをインストール…ダメ。<br />
pipコマンドでpython-fastcgiパッケージをいれようとするとなぜかエラー。<br />
<br />
python3でfastcgiってもしかしてダメ?<br />
ちなみに<a href="http://py3ksupport.appspot.com/pypi/python-fastcgi">パッケージの対応状況</a>を見ると…やっぱりダメっぽい。<br />
<br />
<a href="http://docs.python.org/py3k/howto/webservers.html?highlight=fastcgi#fastcgi-and-scgi">公式ドキュメント</a>の該当部分曰く、<br />
<br />
<blockquote class="tr_bq">
lighttpd ships its own FastCGI module as well as an SCGI module.</blockquote>
<br />
ってことらしいのですが、前提条件としては、<br />
<br />
<blockquote class="tr_bq">
This is a simple WSGI application, but you need to install flup first, as flup handles the low level FastCGI access.</blockquote>
<br />
とある。<br />
<br />
flupが入るかっていうと実際にやってみればわかりますがダメ。<br />
で、<a href="http://py3ksupport.appspot.com/pypi/flup">対応状況</a>はというともちろんNG。<br />
<br />
というわけでFastCGIでの動作はあえなく断念。<br />
前項目のCGIでの動作で以下は進めます。<br />
教訓、公式ドキュメントの該当部分は一番に目を通しましょう。<br />
(たとえそれが間違っていても)<br />
<br />
ちなみにWSGI(Web3)も現状はまともに使えなさそう…。<br />
python3のWeb関連パッケージがPEP444に引っ張られて<br />
仕様が決まらないという理由から対応が遅れているとかなんとか。<br />
参考:<a href="http://blog.aodag.jp/2010/09/web3.html">http://blog.aodag.jp/2010/09/web3.html</a><br />
<br />
<br />
正直一気にモチベーションが下がった。<br />
<br />
えーと一応python3を利用してモダンな環境におけるWebアプリ開発の検証<br />
というのが目的だったんですが、あまりにもひどい状況のため断念します。<br />
一応MongoDBはPython3で扱えますし、<br />
HTML/CSSはJinja2に任せるつもりで弄った限りでは問題なさそうでした。<br />
<br />
検証は検証でしたが、ブログで他人様にお勧めできるような状態ではとてもありません。<br />
一応python3対応フレームワークとして<a href="http://pypi.python.org/pypi/qp/2.1">QP</a>といったようなものはあるようです。<br />
<br />
うーむ…python3.3がでる頃には改善しているこをと祈りたいですね。<br />
<br />
<br />
それでは、電波送信終了ー。Walkerhttp://www.blogger.com/profile/17823316959667462494noreply@blogger.com0tag:blogger.com,1999:blog-8166036204371181603.post-34220240963633918092012-09-17T00:00:00.000+09:002012-09-17T00:31:04.201+09:00モダン環境物語 - インストール編最近プロダクト開発の妄想ばっかりしてますこんにちは。<br />
<br />
その関係でいろんなものに手を出しては頭をかしげてるわけですが<br />
よくネットで目にする新しいあれこれだけで環境を組み上げられるか<br />
一度試してみたくなったというわけです。<br />
<br />
で、今回試してみる環境は以下。<br />
<br />
<ul>
<li>lighttpd(Web Server)</li>
<li>Nginx(Proxy)</li>
<li>HTML5</li>
<li>CSS3</li>
<li>jQuery(JavaScript)</li>
<li>Python3系</li>
<li>MongoDB</li>
</ul>
<br />
流行り物とはいえ若干ピークはすぎてますが<br />
この組合わせすべて載せたブログエントリを見ないのでやってみます。<br />
この中から2、3種類拾って組合わせってのはよく見るんですけどねー。<br />
ちなみにHTML5やCSS3はプログラミング言語とかパッケージとはまた違いますが<br />
流行りものということとPython3系でのJinja2の扱いを試す意味合いで選択しました。<br />
<br />
操作環境はざっくりと下記の通り。<br />
<ul>
<li>Debian Squeeze on Parallels</li>
<li>ZSH</li>
<li>Vim7.3</li>
</ul>
<div>
ちなみにbashやemacsを使っている人は読み替えて下さい。</div>
<div>
<br /></div>
<div>
<h2>
<a href="http://www.lighttpd.net/">lighttpd</a>のインストール</h2>
</div>
<div>
<br /></div>
<div>
NginxひとつでCGIを動かせるWebサーバをやらせても良いんですが<br />
CGIダメー(正確にはfcgiはOK)とか書いているので分離してみます。<br />
<br />
あとNginxに全部やらせるのではなくWeb Serverは<br />
別にあった方が良いのでは、という考もあります。<br />
<br />
<br />
下記コマンドで簡単に<br />
確認とインストールが完了します。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">% aptitude show lighttpd
% aptitude install lighttpd
</pre>
<br />
環境によってはX云々のwarningが出たりしますが、とりあえず無視。<br />
さてここで一気に起動スクリプトを叩いて起動したくなりますが、<br />
Apacheのように<b>It Works!</b>なindex.htmlが配置されていないため<br />
レスポンステスト用のファイルを作成してあげる必要があります。<br />
(より正確にはindex.lighttpd.htmlは配置されます。)<br />
<br />
デフォルト設定のドキュメントルートは<b>/var/www</b>になっています。<br />
ちなみにコンフィグファイルは<b>/etc/lighttpd/lighttpd.conf</b>です。<br />
そこで、適当に下記のようなhtmlファイルを作成してしまいましょう。<br />
<br />
<pre class="brush: html; first-line: 1; highlight: [,]" title=""><html>
<head>
<title>It Works!</title>
</head>
<body>
<h1>It Works!</title>
</body>
</html>
</pre>
<br />
さて、ようやくWebページの表示が可能になりました。<br />
細かな設定はひとまず横に置いておいて、<br />
サーバのIPもしくはホスト名等を指定してブラウザからアクセスしてみましょう。<br />
<br />
あなたの予想に反してこのページが見えているでしょうか?<a href="http://2.bp.blogspot.com/-57G62PIFoJw/UDuH3-27U6I/AAAAAAAAA50/kPRrMQgrZ40/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2012-08-27+23.42.42.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="192" src="http://2.bp.blogspot.com/-57G62PIFoJw/UDuH3-27U6I/AAAAAAAAA50/kPRrMQgrZ40/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2012-08-27+23.42.42.png" width="320" /></a><br />
<br />
というわけでWebサーバの起動は確認できました。<br />
続いてCGIの動作確認、と行きたいところですがいったん後回し。<br />
<br /></div>
<div>
<h2>
Nginxのインストール</h2>
</div>
<div>
<br /></div>
<div>
Nginxの役割は順当にProxyとし、<br />
静的ファイルの扱いのみを任せるために構成していきます。<br />
<br />
こちらもインストールだけは非常に単純。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">% aptitude show nginx
% aptitude install nginx
</pre>
<br />
ここではまだ何かをさせるわけではない(URLも決まってない)のでこのまま放置。<br />
<br /></div>
<div>
<h2>
Python3.1のインストール</h2>
</div>
<div>
<br /></div>
<div>
Pythonはそのままデータの処理を担当してもらいます。<br />
調べてみると現時点でDebianのPythonは3.1が最新の模様。<br />
よって手順は以下のようになります。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">% aptitude show python3
% aptitude install python3
</pre>
<br />
明示的に"python3.1"としないのには訳があって、<br />
依存して自動的にインストールされるパッケージが<br />
python3としておくと都合がいいという理由です。<br />
<br />
さて、pythonといえばeasy_installやpipといった<br />
PyPIを利用するためのコマンドが用意されています。<br />
<br />
そういったところを手軽に弄ることができるような環境も<br />
一緒に作ってしまった方が後々楽になります。<br />
なので、まずはpipを構築します。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">% aptitude show python-pip
% aptitude install python-pip
</pre>
<br />
場合によってはここで一度環境変数を再読み込みした方が良いです。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">% source $HOME/.zshrc
</pre>
<br />
で、インストールすべきはvirtualenvとvirtualenvwrapper。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">% pip install virtualenv virtualenvwrapper
</pre>
<br />
virtualenvwrapperを利用するためにはちょっとだけ設定が必要です。<br />
まず<b>$HOME/.zshrc</b>に下記を追記します。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">export WORKOH_HOME=$HOME/.virtualenvs
source `which virtualenvwrapper.sh`
</pre>
<br />
またまた環境変数を再読み込みすることで初期設定が行われます。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">% source $HOME/.zshrc
</pre>
<br />
さて、これでコマンドを利用する準備ができましたので<br />
早速環境のチェックもかねてコマンドを入力してみましょう。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">% pip freeze
% workon
</pre>
<br />
最初の"pip freeze"というコマンドでは何か文字が表示されたはずです。<br />
これは今デフォルトでインストールされているパッケージの一覧です。<br />
ただしpipコマンドが認識できる範囲のものしか表示されません。<br />
次のコマンドはvirtualenvwrapperのコマンドのひとつで、<br />
作成したpythonの仮想環境一覧を表示するためのものですが<br />
まだひとつも作成していないため何も表示されなかったはずです。<br />
<br />
そこで、まずは先ほどインストールしたpython3.1へ<br />
切り替えられるようにさっさと環境を作ってしまいましょう。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">% mkvirtualenv -p python3.1 python3.1
% python -V
python3.1.3
</pre>
<br />
mkvirtualenvの書式は"mkvirtualenv -p pythonのバージョン 仮想環境名"です。<br />
このコマンドを入力したことによっていくつか画面に表示がありました。<br />
そして実際にpythonのバージョンが切り替わっているのが確認できましたね。<br />
ここで再度"pip freeze"とでも入力すると表示する内容が変わっているはずです。<br />
mkvirtualenvコマンドのデフォルトでパッケージも<br />
作成した仮想環境ごとに切り替えられるよう設定されているためです。<br />
なお明示的にオプションを指定する場合は"--no-site-packages"で、<br />
システム環境のパッケージを継承する場合は"--system-site-packages"となります。<br />
なおpython3系では2系のパッケージをほとんど扱えないため、<br />
--system-site-packageとしてもエラーが出てしまいます。<br />
同系統のpythonでのみ利用するようにしましょう。<br />
<br />
さてここまでやると不安になるのが仮想環境から抜けたり消したりという動作。<br />
消すためには抜ける必要があるので以下のコマンドを入力します。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">% deactivate
</pre>
<br />
ちなみに抜けた後また仮想環境に入る場合は下記。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">% workon python3.1
</pre>
<br />
"workon 仮想環境名"というのが書式となるわけですね。<br />
そして環境の削除はさらに以下のコマンドを入力します。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">% rmvirtualenv python3.1
% workon
</pre>
<br />
削除されたのは確認できたでしょうか。<br />
今はこういった使い方でpython3.1を使うのが一般的なようです。<br />
というわけでとりあえずpythonの構築はここまで。<br />
<br /></div>
<div>
<h2>
MongoDBのインストール</h2>
</div>
<div>
<br />
PostgreSQLも考えたんですが9.1の不具合周りと<br />
9.2が公開されたばかりでdebianのリポジトリに無いということで<br />
MongoDBで行ってみたいと思います。<br />
というかPostgreSQLはモダンじゃないか。<br />
<br />
さてここまで来ると手順も似通ってきますが、<br />
以下のコマンドでインストール自体はさくっと完了します。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">% aptitude show mongodb
% aptitude install mongodb
</pre>
<br /></div>
ちなみに起動はこの時点でされていますので制御は下記コマンドのいずれかにて。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">% service mongodb {start|stop|force-stop|restart|force-reload|status}
</pre>
<br />
<h2>
ひと通り終えて</h2>
<br />
とりあえず個々の要素に関してはこれで完了となります。<br />
あとはそれぞれがしっかり連携するようにアレコレ弄っていくわけですが、<br />
これは次にまわしてみたいと思います。<br />
<br />
<br />
それでは、電波送信終了ー。Walkerhttp://www.blogger.com/profile/17823316959667462494noreply@blogger.com0tag:blogger.com,1999:blog-8166036204371181603.post-1121453297875847072012-05-21T22:00:00.000+09:002012-05-25T07:55:04.697+09:00Djang1.4修業中 - 初めてのDjango最近Djangoを初めて触ってみました。<br />
TwitterでもよくよくDjango Djangoと吠えてます。<br />
しかし、新しいバージョンの日本語のドキュメントはなく、<br />
レビュー記事にしてもバージョンが古い(1.4に関しては現在翻訳がすすめられてます)。<br />
初期状態のファイル構成とか細かいとこ変わってて大変。<br />
<br />
そこでせっかくだしオベンキョウがてら記事にしてみようかと。<br />
<br />
何でそのファイルが必要なの?<br />
何でこんなディレクトリ構成なの?<br />
何でそのコマンドをここで使うの?<br />
Djangoは最初から覚えることが多めなので、そんな「そもそもの疑問」をレポート。<br />
<br />
<h2>
概要</h2>
<div>
開発環境情報</div>
<div>
プロジェクトの作成とファイル構成の確認</div>
<div>
<br /></div>
<h2>
開発環境情報</h2>
<div>
Mac OS X 10.7.4</div>
<div>
Python 2.7.1(Darwin)</div>
<div>
Django 1.4(install from pip)</div>
<div>
<br /></div>
<h2>
プロジェクトの作成とファイル構成の確認</h2>
<div>
プロジェクトの作成は以下のコマンドとオプションを指定し、最後にプロジェクト名を指定。<br />
このコマンドの実行が完了すると[project name]と同じ名前のディレクトリが作成される。<br />
なおこのディレクトリ以下には初期構成のプロジェクトファイルも同時に生成される。</div>
<pre class="brush: plain; first-line: 0; highlight: [,]" title="">$ django-admin.py startproject [project name(destination)]</pre>
<div>
さてこのdjango-admin.pyですが、この後は(ゼロではないはずですが)使いません。<br />
プロジェクト作成後はmanage.pyというのを使います。<br />
<br />
django-adminは、例えば以下のコマンドでオプション一覧は確認できますが、<br />
詳細な理解はどう考えても<a href="https://docs.djangoproject.com/en/1.4/ref/django-admin/">公式ドキュメント</a>読んだ方が賢明かと。<br />
ちなみに後で出てくるmanage.pyでもほぼ同様の内容が表示されます(こっちの方が重要)。<br />
<pre class="brush: plain; first-line: 0; highlight: [,]" title="">$ django-admin.py -h | less
</pre>
<br />
続いて、生成されたディレクトリとファイルは以下。<br />
<br />
<i>[project name]</i><br />
├── manage.py<br />
└── <i>[project name]</i><br />
├── __init__.py<br />
├── settings.py<br />
├── urls.py<br />
└── wsgi.py<br />
<br /></div>
この構成に関する情報は<a href="https://docs.djangoproject.com/en/1.4/intro/tutorial01/">チュートリアルPart1</a>で簡潔に書かれています。<br />
つまるところこんな感じらしいです。<br />
<br />
■外側の[project name]<br />
<div>
プロジェクトのコンテナ。</div>
<div>
チュートリアルいわく、この名前は好きなときに書き換えて問題ないとのこと。</div>
<div>
<br /></div>
<div>
■manage.py</div>
<div>
このプロジェクトを管理するためのコマンドラインユーティリティ。</div>
<div>
チュートリアルにすら詳しくは<a href="https://docs.djangoproject.com/en/1.4/ref/django-admin/">django-admin.py and manage.py</a>を読めって書かれてます。</div>
<div>
で、読んでみるとmanage.pyはdjang-admin.pyに対するラッパで、</div>
<div>
単一プロジェクト内で使うのであればmanage.py使うのが楽ですよ、と。</div>
<div>
django-admin.pyでプロジェクトの操作を行うより</div>
<div>
manage.pyを使った方がいいからこっち使え、ってことと解釈してます。<br />
最初にdjango-admin.pyは使わなくなるよ、と書いたのはコレが理由。</div>
<div>
<br /></div>
<div>
■内側の[project name]</div>
<div>
外側の[project name]ディレクトリと違いこちらは実際のPython Packageです。</div>
<div>
なおこの[project name]というディレクトリ名はパッケージを利用する際に使う、とのこと。</div>
<div>
作り込んだ後にディレクトリ名変更すると事故ってしまう可能性が高くなりますね。</div>
<div>
プロジェクト作成直後はよくよくこのディレクトリ以下のファイルを操作してます。</div>
<div>
<br /></div>
<div>
■[project name]/__init__.py</div>
<div>
前の項目でこのファイルが配置されているディレクトリはPython Packageです、と書きました。</div>
<div>
pythonでPackageを構成するためにはいくつかの制約があります。</div>
<div>
そのうちのひとつがこの「__init.py__」です。</div>
<div>
ちなみにプロジェクト生成直後は空のファイル。</div>
<div>
このパッケージがインポートされる際に初期化を担当するファイルですが、</div>
<div>
初心者が最初からここにゴリゴリと書いていく必要はないように思います。</div>
<div>
<br />
■[project name]/settings.py<br />
チュートリアルをかじるとわかりますが、最初は結構な頻度で操作するファイルです。<br />
要はプロジェクトの設定を記載したファイルで、DBへの接続設定やテンプレートの配置先、<br />
Django内で扱うアプリケーションとかとか、設定をたくさん書いていきます。<br />
詳細は<a href="https://docs.djangoproject.com/en/1.4/topics/settings/">Django Settings</a>を読むといいらしい。<br />
<br />
■[project name]/urls.py<br />
ブラウザからアクセスする際のURLディレクティブ設定を記載するところ。<br />
ページ数が増えれば増えるほど手を入れることになりますね(手を抜く方法もあるようですが)。<br />
例に漏れずボリュームのある内容なのでチュートリアルでは<a href="https://docs.djangoproject.com/en/1.4/topics/http/urls/">URL Dispatcher</a>を読むようにと書いてます。<br />
<br />
■[project name]/wsgi.py<br />
プロジェクト内でWSGI互換Webサーバを利用するためのエントリーポイント、ってことでいいのかな。<br />
この辺りはまだ触れてないですが、やっぱり<a href="https://docs.djangoproject.com/en/1.4/howto/deployment/wsgi/">How To Deploy WSGI</a>を読むようにと書かれてます。<br />
ファイルの中を読む限り、開発用サーバでWSGIアプリを動かしたいときに使うみたいですね。<br />
<br />
<h2>
中休み</h2>
<div>
思いのほか長くなった、のでとりあえずはここまで。<br />
wsgi.pyとかの辺りは現状触ってないのでなんとも、という感じですが。<br />
特に明記はないので__init__.pyの扱いがどうなっているかまではわかってません。<br />
ここは実際に試してみる他ないかと。</div>
<br />
あ、そうそう。<br />
何でDjangoの日本語ドキュメントとか整備されないの?<br />
ブームが去ったとはいえそんなに触る人、情報公開する人少なくなったの?<br />
と思って調べてたらね、以下のスライドを見つけてね。<br />
<br />
<div id="__ss_5764590" style="width: 425px;">
<strong style="display: block; margin: 12px 0 4px;"><a href="http://www.slideshare.net/Isoparametric/django-5764590" target="_blank" title="Djangoの話">Djangoの話</a></strong> <iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/5764590?rel=0" width="425"></iframe> <br />
<div style="padding: 5px 0 12px;">
View more presentations from <a href="http://www.slideshare.net/Isoparametric" target="_blank">Isoparametric !</a> </div>
</div>
<br />
<b><span class="Apple-style-span" style="font-size: x-large;">日本でDjangoはとっくに枯れきってた</span></b>らしい。<br />
<br />
<br />
まあいいや、次は実際の動作確認と、動作手順を早めにレポートします。<br />
それでは、電波送信終了ー。</div>Walkerhttp://www.blogger.com/profile/17823316959667462494noreply@blogger.com0tag:blogger.com,1999:blog-8166036204371181603.post-52667291218615200932012-04-29T22:38:00.003+09:002012-04-29T22:55:33.230+09:00pythonanywhere ならPythonがブラウザで動く...が?いつもニコニコ<br />
あなたの隣に<br />
這い寄るPython<br />
<br />
<a href="http://www.pythonanywhere.com/">pythonanywhere</a> です!<br />
<br />
<br />
<br />
<br />
<br />
<h2>
<a href="http://www.pythonanywhere.com/">pythonanywhere</a> に出来ること</h2>
<br />
何コレすげえ!<br />
いずれこういうのは出るだろうとは思ってましたがついに出ました、<br />
ついにブラウザからコンソール操作が出来るように!<br />
ちなみにトップページにはどこでも開発や共同学習が出来るよ、と書いてます。<br />
<br />
ざっくりと触ってみたので簡単なご紹介を。<br />
アカウントの作成方法やコマンドの入力方法なんかは割愛します(※<a href="http://www.pythonanywhere.com/faq/">FAQ</a>もあるから読んでね)。<br />
<br />
ログインすると Dashboard からいくつかのバージョン、ツールが並んでいます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-bxatqM0OM3A/T50r1BxmnOI/AAAAAAAAA5I/g8f4nut-fpU/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2012-04-29+20.35.56.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="66" src="http://1.bp.blogspot.com/-bxatqM0OM3A/T50r1BxmnOI/AAAAAAAAA5I/g8f4nut-fpU/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2012-04-29+20.35.56.png" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
出来ることは、まんま言葉の意味そのままなのですが<br />
Python は 2.7/2.6/3.2、IPython(0.12) は 2.7/2.6/3.2<br />
PyPy(1.6) は 2.7 加えて Bash と MySQL が使えるとのこと。<br />
ちなみに Bash コンソールから確認したところ<br />
Python、Perl、Rubyはそれぞれ次のバージョンを使えることがわかります。<br />
<br />
Python 2.6.6<br />
Perl 5.10.1<br />
Ruby 1.8.7<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-W67YSJAfuv8/T5073rJzClI/AAAAAAAAA5c/ntQ0FLSR9nY/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2012-04-29+22.00.45.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="195" src="http://3.bp.blogspot.com/-W67YSJAfuv8/T5073rJzClI/AAAAAAAAA5c/ntQ0FLSR9nY/s400/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2012-04-29+22.00.45.png" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
さて、さらに機能としてDropbox連携でホームディレクトリ以下に<br />
ファイルを持ってこられたり、 Django やWeb2py、WSGI まで使えるらしいけど<br />
この辺りの機能については触っていません。<br />
これは次項の理由もあり、突っ込んで触って大丈夫か疑問に思ったからです。<br />
<br />
<h2>
<a href="http://www.pythonanywhere.com/">pythonanywhere</a> の
セキュリティについて</h2>
<br />
確かにtcpdumpすれば一見普通にhttps(443)で通信しているように見えるけど<br />
pythonanywhere のコンソールレスポンス以外にも何か別の通信をしているようです。<br />
<br />
これはコンソールのレスポンスは一貫して console-1.pythonanywhere.com という<br />
内容を含んだパケットとなっているが、別の受信ポートでもhttps通信しているのが居て、<br />
しかも同じタイミングで何かを投げている(内容はhttpsなので解析可否はともかくわからない)。<br />
ホスト元は同じなので状況証拠的にpythonanywhereなのは間違いなさそう、でも正直よくわからないです。<br />
<br />
使えるか使えないかは現状判断しかねますが(レスポンスが酷い)、<br />
セキュリティ的にどうなんだろうという点に関しては専門家の情報を待ちたいかな。<br />
コレがちゃんと使えるなら非常に良いと思うのだけれど、<br />
表向きhttp(80)で非同期通信(だけかどうかはともかく)は<br />
https(443)というやり方が本当に安全かどうか判断がつかないです。<br />
<br />
<a href="http://www.pythonanywhere.com/forums/">Forum</a> もあるのだけれどこの辺りのセキュリティについての言及は誰もしていないように見えます。<br />
プロジェクト単位での質問はあれど、このシステムについて言及が…ない。<br />
ブラックボックステストが出来るほどセキュリティ方面に詳しくないので<br />
コレばっかりは何とも言えないですが、漏れたら困るものを置くべきではないだろうし<br />
開発環境として使うというよりやはり学習のために限定して使うのが良いのかもしれないですね。<br />
(特にDropboxの同期は気をつけた方が良いと思う)<br />
<br />
そう考えるととても良い環境だと思うし、遊ぶ分には全く問題ない。<br />
昨今流行りのペアプログラミングとか捗る可能性があるかもね。<br />
<br />
<b>レスポンスさえどうにかなれば!( TOO LATE, pythonanywhere ! )</b><br />
<br />
それでは、電波送信終了ー。Walkerhttp://www.blogger.com/profile/17823316959667462494noreply@blogger.com0tag:blogger.com,1999:blog-8166036204371181603.post-30593333976611082092012-04-15T23:15:00.003+09:002012-04-26T21:24:30.520+09:00Jubatus を OS X Lion にインストールできた失敗していた環境については<a href="http://iolabo.blogspot.jp/2012/04/jubatusos-x-lion.html">前々回の記事</a>を参照。<br />
ログは<a href="http://iolabo.blogspot.jp/2012/04/jubatus-build.html">こんな感じ</a>で全くインストールできなかった。<br />
原因は単純でpficommonがMac OS Xの環境に対応していなかったからのようだ。<br />
詳しくは<a href="https://github.com/jubatus/jubatus/issues/33">Issues</a>の内容を読み進めて頂きたい。<br />
<br />
そんなわけで、結果としては<a href="https://twitter.com/#!/unnonouno">@unnonouno</a>氏にpficommonの<br />
Mac対応版(wscriptを編集した模様)を作成して頂いたので早速試したところ<br />
<br />
アッサリ、できた。<br />
<br />
クライアントこそまだ試してはいないが<br />
<a href="http://jubat.us/quickstart.html">QuickStart</a>にあるようなコマンドは正常に動いているように見える。<br />
正直なところもう1回くらい環境依存で失敗すると思っていたが<br />
本当にあっさり動いてくれたので感動した。<br />
原因を調査してくださった<a href="https://twitter.com/#!/kuenishi">@kuenishi</a>氏、パッチ作成をしてくださった<a href="https://twitter.com/#!/unnonouno">@unnonouno</a>氏、<br />
御二方とも、本当にありがとうございます。<br />
<br />
2012/04/26(木)追記==========================================<br />
一部手順に間違いがありました。<br />
以下の手順においてpficommonをgit cloneする必要があります。<br />
ただしclone先がpfiアカウントで公開されているpficommonではなく<br />
<a href="https://twitter.com/#!/unnonouno">@unnonouno</a> 氏のforkしたrepositoryからcloneする必要があります。<br />
つまり、以下のコマンドを入力することになります。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">$ git clone https://github.com/unnonouno/pficommon.git
</pre>
<br />
あとは以下の手順にてブランチを切り替え、インストールを行ってください。<br />
間違えた情報を記載したまま放置してしまい、申し訳ございませんでした。<br />
<br />
追記ここまで==============================================<br />
<br />
ちなみにpficommonは普通にcloneするだけじゃなくて、ブランチを切り替える必要があります。<br />
githubについては最近だと<a href="https://github.com/hatena/Git-for-Designers">はてなの教科書</a>がわかりやすかった。<br />
具体的にはpficommonをインストールする際、<br />
cloneした直後に以下のコマンドでブランチを切り替える。<br />
(最初の1行目だけコマンドで、そのした2行は結果です)<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">$ git checkout -t origin/wscript-for-mac
Branch wscript-for-mac set up to track remote branch wscript-for-mac from origin.
Switched to a new branch 'wscript-for-mac'
</pre>
<br />
この手順は今後cloneしただけでよくなるかもしれないし、<br />
homebrew環境の人はこの手順のままかもしれない。<br />
その辺りに関しては中の人次第ということで。<br />
あとは通常の手順通りjubatusもgit cloneしてインストールしましょう。<br />
<br />
jubatus、enjoyさせてもらいますよー、遊びますよー。<br />
<br />
それでは、電波送信終了ー。Walkerhttp://www.blogger.com/profile/17823316959667462494noreply@blogger.com0tag:blogger.com,1999:blog-8166036204371181603.post-30544966385422446842012-04-10T22:55:00.002+09:002012-04-10T22:55:35.377+09:00Jubatus を build できなかった際のエラーログREPORTED -> <a href="https://github.com/jubatus/jubatus/issues/33">jubatus Issue #33</a>
<br />
<br />
Mac OS X 10.7.3
<br />
Check System Requirements...
<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">$ brew --version
0.9
$ python -V
Python 2.7.1
$ brew list
fcgi gdbm gfortran glog gtest libevent libmpc mercurial msgpack nmap pkg-config readline zookeeper
gcc gflags git gmp jpeg libiconv libtiff mpfr nkf pcre r tmux zsh
$ which gcc
/usr/bin/gcc -> /usr/llvm-gcc-4.2/bin/llvm-gcc-4.2
$ which g++
usr/bin/g++ -> /usr/llvm-gcc-4.2/bin/llvm-g++-4.2
$ ls -l /usr/bin/llvm-cpp-4.2 /usr/bin/llvm-g++ /usr/bin/llvm-g++-4.2 /usr/bin/llvm-gcc /usr/bin/llvm-gcc-4.2
/usr/bin/llvm-cpp-4.2 -> ../llvm-gcc-4.2/bin/llvm-cpp-4.2
/usr/bin/llvm-g++ -> ../llvm-gcc-4.2/bin/llvm-g++-4.2
/usr/bin/llvm-g++-4.2 -> ../llvm-gcc-4.2/bin/llvm-g++-4.2
/usr/bin/llvm-gcc -> ../llvm-gcc-4.2/bin/llvm-gcc-4.2
/usr/bin/llvm-gcc-4.2 -> ../llvm-gcc-4.2/bin/llvm-gcc-4.2
$ pkg-config pficommon --cflags --libs
-I/usr/local/include -L/usr/local/lib
</pre>
<br />
Next Steps, configure & build (this approach failed).<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">$ ./waf configure --disable-re2
Checking for 'g++' (c++ compiler) : ok
Unpacking gtest : yes
Checking for library pthread : yes
Checking for library msgpack : yes
Checking for library glog : yes
Checking for library event : yes
Checking for header event.h : yes
Checking for program pkg-config : /usr/local/bin/pkg-config
Checking for 'pficommon' : yes
Checking for header pficommon/network/mprpc.h : yes
Checking for header unistd.h : yes
Checking for header sys/types.h : yes
Checking for header sys/wait.h : yes
Checking for header sys/stat.h : yes
Checking for header cxxabi.h : yes
Checking for header sys/socket.h net/if.h : yes
Checking for header sys/ioctl.h : yes
Checking for header fcntl.h : yes
Checking for header netinet/in.h : yes
Checking for header arpa/inet.h : yes
Checking for header dlfcn.h : yes
Checking for library dl : yes
Checking for header sys/socket.h net/if.h sys/ioctl.h : yes
Checking for header netinet/in.h arpa/inet.h : yes
'configure' finished successfully (5.741s)
$ ./waf build
.
.
[71/88] cxxshlib: build/src/classifier/classifier_base.cpp.1.o build/src/classifier/perceptron.cpp.1.o build/src/classifier/pa.cpp.1.o build/src/classifier/pa1.cpp.1.o build/src/classifier/pa2.cpp.1.o build/src/classifier/cw.cpp.1.o build/src/classifier/arow.cpp.1.o build/src/classifier/nherd.cpp.1.o build/src/classifier/classifier_factory.cpp.1.o -> build/src/classifier/libjubatus_classifier.dylib
[72/88] cxxshlib: build/src/common/mprpc/rpc_client.cpp.1.o build/src/common/mprpc/async_client.cpp.1.o -> build/src/common/mprpc/libjubacommon_mprpc.dylib
Undefined symbols for architecture x86_64:
"pfi::network::ipv4_address::~ipv4_address()", referenced from:
std::vector >::~vector()in async_client.cpp.1.o
"pfi::network::mprpc::socket::resolve(std::basic_string, std::allocator > const&, unsigned short)", referenced from:
jubatus::common::mprpc::async_sock::connect_async(std::basic_string, std::allocator > const&, unsigned short)in async_client.cpp.1.o
"pfi::network::ipv4_address::to_string() const", referenced from:
jubatus::common::mprpc::async_sock::connect_async(std::basic_string, std::allocator > const&, unsigned short)in async_client.cpp.1.o
"_msgpack_unpacker_expand_buffer", referenced from:
jubatus::common::mprpc::async_sock::recv_async() in async_client.cpp.1.o
jubatus::common::mprpc::async_sock::async_sock()in async_client.cpp.1.o
"_msgpack_unpacker_destroy", referenced from:
jubatus::common::mprpc::async_sock::~async_sock()in async_client.cpp.1.o
jubatus::common::mprpc::async_sock::~async_sock()in async_client.cpp.1.o
jubatus::common::mprpc::async_sock::async_sock()in async_client.cpp.1.o
"pfi::network::mprpc::socket::~socket()", referenced from:
jubatus::common::mprpc::async_sock::~async_sock()in async_client.cpp.1.o
jubatus::common::mprpc::async_sock::~async_sock()in async_client.cpp.1.o
jubatus::common::mprpc::async_sock::async_sock()in async_client.cpp.1.o
"pfi::network::mprpc::socket::socket(int)", referenced from:
jubatus::common::mprpc::async_sock::async_sock()in async_client.cpp.1.o
"_msgpack_unpacker_init", referenced from:
jubatus::common::mprpc::async_sock::async_sock()in async_client.cpp.1.o
"pfi::system::time::get_clock_time()", referenced from:
jubatus::common::mprpc::rpc_mclient::rpc_mclient(std::vector, std::allocator >, unsigned short>, std::allocator, std::allocator >, unsigned short> > > const&, int)in rpc_client.cpp.1.o
jubatus::common::mprpc::rpc_mclient::rpc_mclient(std::vector, std::allocator >, int>, std::allocator, std::allocator >, int> > > const&, int)in rpc_client.cpp.1.o
"_msgpack_unpacker_execute", referenced from:
msgpack::unpacker::next(msgpack::unpacked)in rpc_client.cpp.1.o
"_msgpack_zone_destroy", referenced from:
msgpack::unpacker::next(msgpack::unpacked)in rpc_client.cpp.1.o
bool jubatus::common::mprpc::async_sock::salvage >(msgpack::type::tuple&)in rpc_client.cpp.1.o
"_msgpack_unpacker_release_zone", referenced from:
msgpack::unpacker::next(msgpack::unpacked)in rpc_client.cpp.1.o
"_msgpack_unpacker_data", referenced from:
msgpack::unpacker::next(msgpack::unpacked)in rpc_client.cpp.1.o
"_msgpack_unpacker_reset", referenced from:
msgpack::unpacker::next(msgpack::unpacked*)in rpc_client.cpp.1.o
jubatus::common::mprpc::async_sock::recv_async() in async_client.cpp.1.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Waf: Leaving directory `/Users/[MYNAME]/Documents/src/jubatus/build'
Build failed
-> task failed (exit status 1):
{task 4478118736: cxxshlib rpc_client.cpp.1.o,async_client.cpp.1.o -> libjubacommon_mprpc.dylib}
['/usr/bin/g++', 'src/common/mprpc/rpc_client.cpp.1.o', 'src/common/mprpc/async_client.cpp.1.o', '-o', '/Users/[MYNAME]/Documents/src/jubatus/build/src/common/mprpc/libjubacommon_mprpc.dylib', '-L/usr/local/lib', '-lglog', '-levent', '-flat_namespace', '-dynamiclib']
</pre>
<br />
で、コメントを頂いたわけですが、ちょっと待って頂きたい。<br />
(というか最後まで英語で書かなくてごめんなさい)<br />
githubをそもそも使ってなかった身としてはササっとdevelopからbranchして<br />
pull requestするなど相当に難易度が高い(今回Issues報告に当たって初めてアカウント作った)。<br />
github活用してないなんてあり得ない! というのはまぁごもっともな意見ですが…。<br />
<br />
下記の行にMSGPACKを追記しなければならないようだが…。<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">$use = 'PFICOMMON LIBGLOG ZOOKEEPER_MT LIBEVENT'</pre>
<br />
つまりはこういうことでよろしいんですよね?
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">$use = 'PFICOMMON MSGPACK LIBGLOG ZOOKEEPER_MT LIBEVENT'</pre>
<br />
とすると以下のログが吐かれて失敗した。
But, Failed build too.
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">.
.
[70/88] test_input: src/server/test_input/config.json src/server/test_input/config_svmlight.json src/server/test_input/keywords -> build/src/server/test_input
[71/88] cxxshlib: build/src/common/mprpc/rpc_client.cpp.1.o build/src/common/mprpc/async_client.cpp.1.o -> build/src/common/mprpc/libjubacommon_mprpc.dylib
Undefined symbols for architecture x86_64:
"pfi::system::time::get_clock_time()", referenced from:
jubatus::common::mprpc::rpc_mclient::rpc_mclient(std::vector<std::pair<std::basic_string<char, std::char_traits<char="">, std::allocator<char> >, unsigned short>, std::allocator<std::pair<std::basic_string<char, std::char_traits<char="">, std::allocator<char> >, unsigned short> > > const&, int)in rpc_client.cpp.1.o
jubatus::common::mprpc::rpc_mclient::rpc_mclient(std::vector<std::pair<std::basic_string<char, std::char_traits<char="">, std::allocator<char> >, int>, std::allocator<std::pair<std::basic_string<char, std::char_traits<char="">, std::allocator<char> >, int> > > const&, int)in rpc_client.cpp.1.o
"pfi::network::ipv4_address::~ipv4_address()", referenced from:
std::vector<pfi::network::ipv4_address, std::allocator<pfi::network::ipv4_address=""> >::~vector()in async_client.cpp.1.o
"pfi::network::mprpc::socket::resolve(std::basic_string<char, std::char_traits<char="">, std::allocator<char> > const&, unsigned short)", referenced from:
jubatus::common::mprpc::async_sock::connect_async(std::basic_string<char, std::char_traits<char="">, std::allocator<char> > const&, unsigned short)in async_client.cpp.1.o
"pfi::network::ipv4_address::to_string() const", referenced from:
jubatus::common::mprpc::async_sock::connect_async(std::basic_string<char, std::char_traits<char="">, std::allocator<char> > const&, unsigned short)in async_client.cpp.1.o
"pfi::network::mprpc::socket::~socket()", referenced from:
jubatus::common::mprpc::async_sock::~async_sock()in async_client.cpp.1.o
jubatus::common::mprpc::async_sock::~async_sock()in async_client.cpp.1.o
jubatus::common::mprpc::async_sock::async_sock()in async_client.cpp.1.o
"pfi::network::mprpc::socket::socket(int)", referenced from:
jubatus::common::mprpc::async_sock::async_sock()in async_client.cpp.1.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Waf: Leaving directory `/Users/walker/Documents/src/jubatus/build'
Build failed
-> task failed (exit status 1):
{task 4365802320: cxxshlib rpc_client.cpp.1.o,async_client.cpp.1.o -> libjubacommon_mprpc.dylib}
['/usr/bin/g++', 'src/common/mprpc/rpc_client.cpp.1.o', 'src/common/mprpc/async_client.cpp.1.o', '-o', '/Users/walker/Documents/src/jubatus/build/src/common/mprpc/libjubacommon_mprpc.dylib', '-L/usr/local/lib', '-lmsgpack', '-lglog', '-levent', '-flat_namespace', '-dynamiclib']</pre>
<br />
現状だとこちらの環境が悪いのか、このアプローチが良くないのか判断がつかないので<br />
もうちょっと試してからコメントに返信をしたいと思います(あとgithubの使い方覚えます)。<br />
<br />
それでは、電波送信終了ー。Walkerhttp://www.blogger.com/profile/17823316959667462494noreply@blogger.com0tag:blogger.com,1999:blog-8166036204371181603.post-20560983870530480322012-04-08T23:35:00.000+09:002012-04-27T08:21:03.722+09:00JubatusをOS X Lionにインストール…できなかった2012/04/27(金)追記==================================<br />
今は以下の手順でインストール可能になっています。<br />
<a href="http://iolabo.blogspot.jp/2012/04/jubatus-os-x-lion.html">Jubatus を OS X Lion にインストールできた</a><br />
<br />
追記ここまで======================================<br />
<br />
以下の環境でインストールするよッ!<br />
<br />
OS X 10.7.3<br />
Xcode 4.3.2<br />
homebrew 0.9<br />
<br />
まず<a href="http://jubat.us/quickstart.html">Quick Start</a>にならって必要なものをインストール。<br />
<a href="http://msgpack.org/">MessagePack</a>のインストールはhomebrewから行う。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">$ homebrew search msgpack
msgpack msgpack-rpc
$ brew install msgpack --use-clang
</pre>
<br />
そう、オプションが1つ必要になった。<br />
出来る人はもしかしたらそのまま出来てしまうかもしれないけど<br />
googleで調べた限りだとhomebrewがgccの場所を把握できてないので<br />
結構な割合でコケるのではないかと思う。<br />
そこでこのオプションである。<br />
<br />
やったあとで気付いたがXcode4.3.xにあげた直後は<br />
% brew doctor にwarningがでている可能性がある。<br />
以下のコマンドを実行するように書かれていたら<br />
実行しておくことでオプションの件は不要になるかもしれない。<br />
<br />
<pre class="brush: plain; first-line: 1; highlight: [,]" title="">sudo xcode-select -switch /Developer
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
</pre>
<br />
次にpficommonだ。<br />
pficommonについては日本語の<a href="http://pfi.github.com/pficommon/about.html#id1">ドキュメント</a>がある。<br />
要は<a href="http://preferred.jp/">PFI</a>の方々が開発されたライブラリ群のようだ。<br />
ここではgitを利用するのでhomebrewからinstallしておくと良い。<br />
さらに必要となるパッケージは<a href="http://pfi.github.com/pficommon/install.html">pficommonのドキュメント</a>に記載されている。<br />
<br />
で、以下のコマンドでソースを落としてくる。<br />
<br />
<pre class="brush: shell; first-line: 1; highlight: [,]" title="">git clone git://github.com/jubatus/jubatus.git</pre>
<br />
ただしここで気付いたがmsgpackやpficommonの他、この環境では後2つパッケージが足りなかった。<br />
glogとpkg-configがそれだったので、入れておくといいと思われる。<br />
<br />
ここから先、現在もなおハマっている。<br />
純粋にbuildが通らない。<br />
原因は調査中だが、依存パッケージ、ライブラリ周りが怪しいように思う。<br />
(% brew list で確認した限りでは問題ないように見える)<br />
<a href="https://twitter.com/#!/kuenishi">@kuenishi</a> 氏に言及頂いたが、解決に至っていない。<br />
ちなみにLionのllvm-gcc42をgcc47に変更して<br />
再度buildを試みたが、やはり最後まで処理が走ることはなかった。<br />
<br />
解決策が発見されしだい手順をレポートしたい。<br />
<br />
2012/04/09 16:00 - 文言を一部修正。<br />
<br />
それでは、電波送信終了ー。Walkerhttp://www.blogger.com/profile/17823316959667462494noreply@blogger.com0tag:blogger.com,1999:blog-8166036204371181603.post-55804375751299853592012-04-05T22:45:00.000+09:002012-04-05T22:45:10.829+09:00GAE/Python(webapp)を使ってLingr botで遊ぶ(下)ではとりあえず目標としておうむ返しが出来るようにしましょうか。<br />
以前こんなことを書いていた。<br />
<br />
<br />
<blockquote class="tr_bq">
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 22px;"><i>any time a human being speaks in your room, we send a JSON message to the URL, embedded in the POST body (line feeds are not included)</i></span></div>
</blockquote>
<blockquote class="tr_bq">
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
ある時人間があなたの部屋で発言すると、JSONメッセージをPOSTへ組込んでURLへ送信します(ラインフィード(改行)は含まれないよ)</div>
</blockquote>
<br />
<br />
Q.あっれェー、受け取ったデータどこやった?<br />
<br />
<u>A.前回のソースにおいては完全に無視してました。</u><br />
<br />
とりあえず本題に入る前に、<a href="http://docs.webob.org/en/latest/reference.html">WebObのリファレンス</a>をざっと眺めて欲しい。<br />
そして以下のソースである。<br />
<br />
<pre class="brush: python; first-line: 1; highlight: [6]" title="">from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from django.utils import simplejson
class MainHandler(webapp.RequestHandler):
def post(self):
eventsdata = simplejson.loads(self.request.body)['events']
message = simplejson.dumps(eventsdata[0])
res = simplejson.loads(message)['message']['text']
self.response.headers["Content-Type"] = "text/plain"
self.response.out.write(res)
application = webapp.WSGIApplication(
[('/', MainHandler)],
debug=True)
def main():
run_wsgi_app(application)
if __name__ == '__main__':
main()
</pre>
<br />
6行目でJSONデータをまるっと受け取っている(self.request.bodyね)。<br />
そのためコレをそのまま表示するとLingr Bot APIの<br />
<a href="https://github.com/lingr/lingr/wiki/Lingr-Bot-API">チュートリアルページ</a>にあるような形式がそのまま発言として現れる。<br />
<br />
で、ここからが結構ハマった。<br />
simplejsonで受け取ったデータをlist型かdict型にぶち込みたかったんだけど<br />
どうにもネストを解釈してくれないようで、肝心の"events"以下がまるっとstr型だった。<br />
<br />
そこでself.request.bodyはJSON形式で受取れるので<br />
キーを['events']と指定してmessageとかそこら辺が含まれるデータを変数へ。<br />
しかしloads -> dumps -> loadsという流れ、つまりデコード、エンコード、デコードという<br />
アホなことをしてるのでものすごく鈍くさい。<br />
コレは他の方法があると思うんだけど、今のところ実現できないのでツッコミ待ち。<br />
(職業プログラマが実務でこんなことしたら多分怒られるんじゃないかと)<br />
<br />
ちなみに、他の人がどうやってるか見たところsimplejson.dumpsってのが多い(2008年前後の情報)。<br />
でもこれだとJSON形式をまたJSON形式にエンコードしてることになっちゃう。<br />
多分これはLingrの仕様が変わったことによって今は使えない手法なんじゃないかなー。<br />
simplejsonのリファレンスについては右のリンクから -> <a href="http://simplejson.readthedocs.org/en/latest/index.html">simplejson 2.5 doc</a><br />
<br />
ともあれ、コレで発言に対しておうむ返しをするbotもどきができ上がりました。<br />
まぁコレならスタートラインとして問題ないでしょう。<br />
textキーのvalueを<a href="http://developer.yahoo.co.jp/webapi/jlp/">Yahoo! テキスト解析Web API</a>なんかに喰わせて、<br />
datastoreに叩き込めばさらにアレコレ遊べると予想してるのでそれはそのうち実践。<br />
<br />
ま、そんな感じで。<br />
それでは、電波送信終了ー。Walkerhttp://www.blogger.com/profile/17823316959667462494noreply@blogger.com0tag:blogger.com,1999:blog-8166036204371181603.post-42444071109434025992012-04-04T23:30:00.000+09:002012-04-05T22:23:57.940+09:00GAE/Python(webapp)を使ってLingr botで遊ぶ(上)<a href="http://code.google.com/intl/ja/appengine/">GoogleAppEngine</a> Python(以下、GAE/Python)で<a href="http://lingr.com/">Lingr</a>用Botを作成しますよ。<br />
<a href="https://www.dotcloud.com/">dotcloud</a>でも良いんですが、メジャーなGoogleAppEngineで。<br />
pureなpythonでも良いんですが、まぁせっかくフレームワークがあるのでwebappで。<br />
ちなみに、GoogleAppEngineもwebappもdjangoもLingrも触るのは初めて。<br />
なので結構丁寧に書いてみたいと思う(大目に見てねってことじゃなくてむしろツッコミ歓迎)。<br />
<br />
さて用意するもの、以下3点。<br />
<br />
<ul>
<li>Python 2.5.x</li>
<li>GoogleAppEngineSDK</li>
<li>Lingrの部屋と登録したbot</li>
</ul>
<br />
LingrのアカウントはちゃちゃっとFacebookで連携認証する<span class="Apple-style-span" style="color: #999999;">(できたよね?)</span>なり<br />
新規で作成したあと、自分用の部屋をひとつテスト用で作成しておきましょう。<br />
settingsでcreate a new botとinvite a new botしたらとりあえずOKです。<br />
<br />
ソースはホントにざっくりと書きました。<br />
目的は誰かの発言に対して、固定の反応を(testと発言)させること。<br />
自動生成されるmain.pyの原形をなるべく崩さないようにしてあります。<br />
<br />
で、ソースは以下。<br />
<br />
<pre class="brush: python; first-line: 1; highlight: [5,6,7]" title="">from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
class MainHandler(webapp.RequestHandler):
def post(self):
self.response.headers["Content-Type"] = "text/plain"
self.response.out.write("test")
application = webapp.WSGIApplication(
[('/', MainHandler)],
debug=True)
def main():
run_wsgi_app(application)
if __name__ == '__main__':
main()
</pre>
<br />
5〜7行目がキモです。<br />
以下、行番ごとに簡単な解説。<br />
<br />
<pre class="brush: plain; first-line: 5; highlight: [,]" title="">POSTを受け取ったら
Content-Typeをtext/plainに指定して
responseにtestと出力
</pre>
<br />
各メソッドやらハンドラやらの解説は<a href="http://code.google.com/intl/ja/appengine/docs/python/tools/webapp/">公式のドキュメント</a>見た方が良い。<br />
たったこれだけでBotに「発言」させることが出来ます。<br />
<br />
さて、これで発言させるための枠が出来たので<br />
今度はJSONで渡されたデータからおうむ返しするように改造してみましょうかね。<br />
<br />
それでは、電波送信終了ー。Walkerhttp://www.blogger.com/profile/17823316959667462494noreply@blogger.com0tag:blogger.com,1999:blog-8166036204371181603.post-91989383214925132212012-04-03T21:46:00.000+09:002012-04-03T21:49:24.611+09:00Lingr用bot作成のための前知識具体的な手段に関しては<a href="https://github.com/lingr/lingr/wiki/Lingr-Bot-API">github</a>見ると一目瞭然。<br />
<br />
要は...<br />
<br />
<ol>
<li>botに何かさせるためのURLを用意する</li>
<li>bot IDと項番1のURLを<a href="http://lingr.com/developer">管理ページ</a>から登録する</li>
<li>botを滞在させたい部屋に登録したbotをinviteする</li>
</ol>
<div>
<br /></div>
<div>
と、以上3点で登録はすぐ出来る。</div>
<div>
項番1のURLはGAEでデプロイした先でよいかと。</div>
<div>
VPSや公開してる自宅サーバがある人はそっちのがいい場合もある。</div>
<div>
<br /></div>
<div>
Lingr Bot APIは基本、何か発言があったものに対してアクションをする。</div>
<div>
<a href="https://github.com/lingr/lingr/wiki/Lingr-Bot-API">github</a>のページにも以下のように書いてる。</div>
<blockquote class="tr_bq">
<span class="Apple-style-span" style="color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 22px;"><i>any time a human being speaks in your room, we send a JSON message to the URL, embedded in the POST body (line feeds are not included)</i></span></blockquote>
<blockquote class="tr_bq">
ある時人間があなたの部屋で発言すると、JSONメッセージをPOSTへ組込んでURLへ送信します(ラインフィード(改行)は含まれないよ)</blockquote>
<br />
訳は割と適当。<br />
<br />
bot自身の発言については以下のように書いてた。<br />
<br />
<blockquote class="tr_bq">
<span class="Apple-style-span" style="color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 22px;">and the response text your app returns (</span><span class="Apple-style-span" style="color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 22px;"><code style="background-color: #f8f8f8; border-bottom-color: rgb(234, 234, 234); border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-bottom-style: solid; border-bottom-width: 1px; border-color: initial; border-left-color: rgb(234, 234, 234); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(234, 234, 234); border-right-style: solid; border-right-width: 1px; border-style: initial; border-top-color: rgb(234, 234, 234); border-top-left-radius: 3px; border-top-right-radius: 3px; border-top-style: solid; border-top-width: 1px; font-size: 12px; font: normal normal normal 12px/normal 'Bitstream Vera Sans Mono', Courier, monospace; margin-bottom: 0px; margin-left: 2px; margin-right: 2px; margin-top: 0px; padding-bottom: 0px; padding-left: 5px; padding-right: 5px; padding-top: 0px; white-space: nowrap;">Content-Type: text/plain</code></span><span class="Apple-style-span" style="color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 22px;"> </span><span class="Apple-style-span" style="color: #333333; font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 22px;">is preferable) will appear as the bot's utterance in the room.</span></blockquote>
<blockquote class="tr_bq">
そして返信はあなたのアプリから(Content-Type: text/plain の形式が良いね)行えば部屋にbotの発言として現れるでしょう</blockquote>
<br />
訳はやっぱり適当。<br />
<br />
要するに以下の形で完結するようだ。<br />
<br />
<ol>
<li>人が発言する</li>
<li>botが反応して発言内容をJSON 形式で事前登録したbotのURLへPOST</li>
<li>Bot APIがURLからbotの発言内容をtext/plainで受けとれば部屋にbotが発言</li>
</ol>
<div>
<br /></div>
<div>
ね、<span class="Apple-style-span" style="color: #999999;">(理解するだけなら)</span>簡単でしょ?</div>
<div>
次回は実際にGAE Pythonで作ってみた内容を記載します。</div>
<div>
<br /></div>
<div>
それでは、電波送信終了ー。</div>
<br />Walkerhttp://www.blogger.com/profile/17823316959667462494noreply@blogger.com0