2015年1月25日日曜日

Android端末をサーバにしてPyramidフレームワークを利用する

このブログ記事をはてなブックマークに追加

しばらく前に、PythonのWebフレームワークであるPyramidを利用した。これがなかなか良くできており、Android端末上でも動かしてみたくなったので載せてみた。

ところで、自分が利用しているキャリアはドコモなんだけど、spモードだとグローバルIPが割り振られないので外部から端末にアクセスできない。なので、spモードを契約せずに、mopera Uを利用している。mopera UであればグローバルIPが割り振られるのでアクセスすることができるからだ。このためだけに、spモードにせず、mopera Uにしていると言っても過言ではない。

閑話休題。まず、Pyramidを動作させるにはAndroid端末用のPython環境であるSL4Aを入れる必要がある。次にPyramidを入れるのだが、必要なモジュールなどが複数あるのでそれも一緒に入れる。一応、Hello Worldプログラムを動かすのに必要なものはすべて挙げたが、もし足りない場合は実行時に何が足りないかエラー表示が出るので、それを参考に入れて欲しい。また、Android SDKが導入されていることを前提にしている。


まず、Android端末にシェルで入ってプログラムを展開するディレクトリを準備する。環境に合わせてディレクトリは読み替えて欲しい。

> adb shell * daemon not running. starting it now on port 5037 * * daemon started successfully * $ cd /sdcard/sl4a/scripts $ mkdir pyramid $ exit

適当なディレクトリで以下のプログラム・モジュールをPC側で展開する。


PC側からAndroid端末にプログラム・モジュールをコピーする。

> adb push pyramid /sdcard/sl4a/scripts/pyramid/pyramid/ > adb push translationstring /sdcard/sl4a/scripts/pyramid/translationstring/ > adb push venusian /sdcard/sl4a/scripts/pyramid/venusian/ > adb push webob /sdcard/sl4a/scripts/pyramid/webob/ > adb push zope /sdcard/sl4a/scripts/pyramid/zope/ > adb push repoze /sdcard/sl4a/scripts/pyramid/repoze/

pkg_resources.pyについては、PCに入っているPythonのsite-packagesなどから適当に持ってきてコピーする。

> adb push pkg_resources.py /sdcard/sl4a/scripts/pyramid/

これでプログラム・モジュールについては準備完了だ。次に、Android端末側の設定をする。

まずはSL4Aを起動させる。pyramidディレクトリが作成されているはずなので、そこをタップして中を確認してみる。一通り、ファイルがあることを確認したら、メニューからViewをタップし、Interpretersを選択する。更にメニューを開き、Start Serverをタップして、Publicを選択する。これで、Android端末がサーバとして機能する。Androidの通知画面を開くと、SL4A Serviceという通知があるので、それをタップすることでServer情報を確認できる。そこに表示されたドメイン名でAndroid端末にアクセスできる。以前の記事でもサーバにする方法を書いたので、そちらも参考にしてほしい。

これで、Android端末をサーバとして機能させることができたので、こんどはHello Worldプログラムを動かして、動作確認をしてみる。

プログラムをhelloworld.pyとして保存した後、Android端末にコピーする。

> adb push helloworld.py /sdcard/sl4a/scripts/pyramid/

そして、コピー先のディレクトリにhelloworld.pyが表示されるので、それをタップして実行する。先ほど得られたドメイン名(ここでは 12345.mopera.net とする)にポート番号8080でアクセスする。


http://12345.mopera.net:8080/hello/world

これで以下の画面が表示されれば成功だ。


携帯の電波が届くところであればどこでも使えて、Pyramidが載っている手のひらWebサーバってなんか良い。

続きを読む...

2015年1月15日木曜日

IRCボットの作成

このブログ記事をはてなブックマークに追加

久々のブログ更新。書きたいときに書くというスタンスです。最近、会社でも技術ブログを立ち上げたので、そちらで書いても良いかも。

今回はIRCボットの作成について書いてみる。しばらく前から社内IRCで技術関連の雑談用チャンネルを利用している。技術系のメーリングリストもあるのだけど、わざわざメールで話題にするようなことでもない、軽い内容を気軽に議論できる場が欲しかったので有志で立ち上げた。IT企業にとって技術的な雑談をできる場はとても大事だと思う。

素のIRCの場合、発言内容がサーバに保存されず、途中から参加しても話題についていけないという問題が出たので、適当なボットで対応することにしたが、やはりエンジニアがメインの会社なのだからボットも自作が基本でしょ、ということでPythonで作ってみた。まあ、作ったといっても「Python でシンプルな IRC クライアントを作成する」のサイトを参考にさせてもらったのでスクラッチから作成したわけではない。

コマンド techlog: を入れると、その日の発言がボットからのtalkで返される。ただ、最初は1日分の発言しか取れない仕様だったので、日を跨ぐとその前の発言が取得できないし、一時的にチャットを抜けた分のログが欲しいだけでも強制的に1日分の発言を取得してしまう。

そこで、SQLite3を使ってユーザ毎にログイン・ログアウト時刻を管理して、ログアウトしてからログインするまでの発言を取得できるように変更することにした。新規に参加したメンバーでも自動的にデータベースに登録される。せっかくユーザの時刻情報があるのだから、techtime:, techtimeall: というコマンドを作って、それぞれ自分の滞在時間、ユーザ全員分の滞在時間も取得できるようにしてみた。

IRCサーバ上で以下のコマンドを実行すると、IRCにボットが常駐する。

$ ./irc_bot.py > irc_bot.log &

ソースコードは以下の通り。


そこそこ社内IRCも使えるようになったのだが、最近、別プロジェクトで利用を始めたSlackがかなり便利だったので、そこに技術系チャンネルを作ったところ、ほとんどのメンバーがSlackに流れてしまった…。次はSlackでボット作成かなぁ。

続きを読む...