第4回梅田Pythonごはんの会 参加者募集のお知らせ
posted by jun-g at 15:44
[ | Permalink | 0 Comments/TBs ]
posted by jun-g at 15:44
[ | Permalink | 0 Comments/TBs ]
先日chumbyを購入しまして、早速asahi.comのニュースを表示するウィジェットを作ってみました。
まだ日本語が表示できないようなので、CGI側でニューステキストから画像を生成し、Flash側でその画像を横スクロールで表示するようにしてみました。
まずはCGI側。gdを使ってテキストを画像化します。news.cgiという名前で保存して適当なサーバに置きましょう。crossdomain.xmlも忘れずに。
#!/usr/bin/env python
# coding: utf-8
from cStringIO import StringIO
import random
import sys
import urllib2
from xml.etree.ElementTree import ElementTree
import gd
FEED_URL = "http://rss.asahi.com/f/asahi_newsheadlines"
WIDTH = 320
HEIGHT = 240
FONT_SIZE = int(HEIGHT * 0.8)
FONT_NAME = "ipag.ttf"
def _get_news():
f = urllib2.urlopen(FEED_URL)
dom = ElementTree(file=f)
f.close()
news = list()
titletag = "{http://purl.org/rss/1.0/}title"
for item in dom.getiterator()[1:]:
if item.tag == titletag:
text = item.text
if text.startswith(u"AD:"):
continue
news.append(item.text)
return random.choice(news)
def main():
news = _get_news()
width = int(HEIGHT * len(news) * 1.07) + (WIDTH * 2)
img = gd.image((width, HEIGHT))
color_white = img.colorAllocate((255, 255, 255))
color_black = img.colorAllocate((0, 0, 0))
img.fill((0, 0), color_white)
img.string_ttf(FONT_NAME, FONT_SIZE, 0,
(WIDTH + 1, HEIGHT - int((HEIGHT - FONT_SIZE) / 2)),
news.encode("euc-jp", "replace"), color_black)
f = StringIO()
img.writeJpeg(f, 20)
f.seek(0)
sys.stdout.write("Content-type: image/jpeg\n")
sys.stdout.write("\n")
sys.stdout.write(f.read())
f.close()
if __name__ == '__main__':
main()
次はActionScript。showNewsImage.asという名前で保存。適当なサンプルを見ながら勢いで書いたので変な事してるところがあるかも。ツッコミ歓迎。
class ShowNewsImage {
private var mcName:String = "NewsImage";
private var imageURL:String = "http://example.com/cgi-bin/news.cgi";
private var displayWidth:Number = 320;
private var intervalId:Number = 0;
public function ShowNewsImage(mc:MovieClip) {
loadImage(mc);
}
private function loadImage(mc:MovieClip) {
mc.createEmptyMovieClip(mcName, mc.getNextHighestDepth());
var mcl:MovieClipLoader = new MovieClipLoader();
var listener:Object = new Object();
var me:ShowNewsImage = this;
listener.onLoadInit = function(lmc:MovieClip) {
lmc._x = 0;
lmc._y = 0;
me.intervalId = setInterval(me, "onTick", 10);
}
mcl.addListener(listener);
mcl.loadClip(imageURL, mc[mcName]);
}
private function onTick():Void {
if (_root[mcName]._width + _root[mcName]._x - 5 < displayWidth) {
clearInterval(intervalId);
loadImage(_root);
return
}
_root[mcName]._x += -5;
}
static function main() {
var app:ShowNewsImage = new ShowNewsImage(_root);
}
}
でもってコンパイル。MTASCを使用。
$ mtasc -swf showNewsImage.swf -main ./showNewsImage.as -header 320:240:12
swfが出来たらprofile.xmlを作って一緒にUSBメモリに入れ、chumbyに突っ込んでブート。
これですべて上手く行くと思ったんですが…以下の問題が。
画像が切れる問題はFlashPlayerでも再現しました。swfdec-playerだと問題ないんですが…。
続きはまた来週。
posted by jun-g at 00:33
[ | Permalink | 0 Comments/TBs ]
という訳で第3回も無事終了。参加された皆様、ありがとうございました。幹事の@kfuruhataもお疲れ様でした。相変わらずほとんどPythonと関係の無い話ばかりしてましたが楽しかったです。あと遅刻してすみませんでした…。
次回のごはん会の参加者募集も近日中に開始すると思います。開発合宿しようぜ的な話も出ているので、興味のある方は是非Python関西にご参加下さい。
posted by jun-g at 00:56
[ | Permalink | 0 Comments/TBs ]
直前にTwitterで参加者を募集したりしつつ、9/27に第2回梅田Pythonごはんの会を開催しました。
今回も参加者の皆様から色々と楽しいお話が聞けて非常に楽しかったです。ちなみに今回は子育ての話と職場におけるシャア(アズナブル)の存在について、といった話などで盛り上がりました。
そして次回第3回が10/25に開催されます。とりあえず集まってごはんでも食べましょう、という感じでゆるくやっているので、なんとなく興味のある方は是非一緒にご飯を食べましょう!!
そして、ごはんの会の延長というか、定期的に集まりつつ勉強会なんかもやっていきたいね、ということでPython関西が発足しました。ごはんの会と合わせてこちらもよろしくお願いします~。
posted by jun-g at 23:51
[ | Permalink | 0 Comments/TBs ]
PYthonでAMFを扱うためのライブラリにPyAMFというのがありまして、こいつにはDjangoやGAE、WSGI上で動作させる為のゲートウェイモジュールが含まれていて、サイトに掲載されているサンプルもそれらを利用したものになっているのですが、そもそもそういったフレームワークが使えない、WSGI準拠でもない既存の環境で使用するにはどうすれば良いのか今ひとつわからなかったので、ちょろっと調べて、サイトにあるHelloWorldを動作させる為のシンプルなCGIを書いてみました。
#!/usr/bin/env python
# coding: utf-8
import sys
import pyamf
import pyamf.remoting.gateway
def echo(value):
return value
services = {"echo": echo}
base_gateway = pyamf.remoting.gateway.BaseGateway(services)
context = pyamf.get_context(pyamf.AMF0)
pyamf_request = pyamf.remoting.decode(sys.stdin.read(), context)
pyamf_response = pyamf.remoting.Envelope(pyamf_request.amfVersion,
pyamf_request.clientType)
for name, message in pyamf_request:
pyamf_response[name] = base_gateway.getProcessor(message)(message)
print "Content-type: %s\n" % pyamf.remoting.CONTENT_TYPE
print pyamf.remoting.encode(pyamf_response, context).getvalue()
とまあ、こんな感じで、リクエストデータをPythonオブジェクトに変換、処理結果をAMFに変換してレスポンス、とすれば良いみたいです。何者にも依存しない最小の処理が分かれば既存の環境への組み込み方も考え易くなりますね。
ちなみに、Flexを全然触っていないので、AMF3で新たに扱えるようになったオブジェクトがそれぞれどういったものなのか、さっぱりわかっていません…。まずい…。
あと、FreeBSD portsにPyAMFが存在しなかったので、作ってsend-prしておきました。ports/125573です。
そんなこんなで、今日もわさびむの更新は無しです。という言い訳を書きたかっただけなのでした。
posted by jun-g at 01:39
[ | Permalink | 0 Comments/TBs ]