プログラマ行進曲第二章

主にソフトウェア関連の技術をネタにした記事を執筆するためのブログ

Python Developers Festa 2011.10( #pyfes )に参加してきました

さて、何故10/15(土)に行われたイベントのことについて今更書いているのかって? 勉強からの現実逃避だよ!現実逃避!

…さて、イベントが行われてからかなり時間が経過したとはいえ、せっかくPythonistaにとって大きなイベントが行われたのだから、少しくらいは感想なりをブログにまとめておかないとバチが当たるかなと思って淡々と書いていくことにします。

ブログを書くついでに、このイベントに参加した(と思われる)計147名の内、追跡可能だった139名のTwitterリストも作成しました。参考にしたい方はどうぞ。

http://twitter.com/#!/takuan_osho/pyfes-2010-10

本筋の前に自己満足の自分語りでもしてみる

新卒の会社ではプログラマとして働いていたけれど、紆余曲折を経て今は何故か食品スーパーの従業員(※パート)として働いている現在ではありますが(誰か私を雇ってください)、個人的にプログラミングは細々と続けていて、Pythonは少しだけではありましたが素人なりに書き続けていました。

で、今回のイベントも何となく存在は認識していましたが、気づいたときには補欠の方がたくさん並んでいたので「どうせダメだろうな」と思いつつ、一応補欠登録していたら、当日までにキャンセル待ちが大量発生して行けることになったので、「これは行くしかない!」と思い、人生二度目*1のオラクル青山センターに向かいました。

午前中 = 初心者ハンズオンに参加

私は素人プログラマも良いところなので、午前中は迷わず初心者ハンズオンに参加。用意されたドキュメントを各自がこなしつつ、分からないことがあったら講師の@さんと@さんに質問して進めるという形式でした。お二人とも私より若いのに実力ある感じでうらやましかったです。プログラミング能力に年齢は関係ないのだとは知りつつ、うらやましかったですねー。いや、お二人ともしっかり努力されているからこそ講師として選ばれたのでしょうから、うらやましがるのも失礼な話しなんでしょうね、はい。

初心者ハンズオンに参加してみての感想は「凄く丁寧にまとめられたドキュメントと講師陣には文句なし。ただ、もう少し標準ライブラリの使い方が欲しかったな〜」というところです。

講師陣のお二方に抽象的な質問*2をしてしまったのですが、Pythonの勉強が出来るサイトの紹介や「ipython使うと良いですよ」と教えてくださるなど丁寧な対応をしてもらったので講師陣に全く不満はありませんでした。ただ「文法レベルではなく、自分の実現したいプログラムを(標準ライブラリなり外部ライブラリを使って)どう書くのか知りたい」という希望を初心者ハンズオンで叶えようとしたのがそもそもの間違いだったのかな?という印象です。

初心者だとWebサービスのAPIを使って何か楽しいことをしようと思っても、XMLやJSONのパースの仕方から分からなくて死亡、ということが多々あるので…XMLならElementTreeを使うことまでは分かっても「XPathって何ぞー!?」となることは必至です、ええ。実際なりました。

もう文法レベルを超える話になると独力で身につける話しなんだろうなとは思いつつ、逆引きレシピ集みたいなものがほしいなーなんて、私は思いました。

午後の部 = 発表

発表に関してはいろんな人がもう既にブログに書かれているので割愛。そうしないとこのブログの更新が出来ない!もう現時点で書く意欲が半減以下!

一言だけ感想を述べると、訳の分からない高度で異分野な発表が多かったですが、それだけ視野が広がったように思えるので、初心者でも楽しかったです。やることはたくさんあるんだなー、というレベルの確認も出来ましたし。

知人が発表する姿を初めて見ることができたのも面白かったポイントです(笑)

終わってみての感想

全体を通して「参加して良かった!」と思えるイベントでした。何が一番の収穫だったかというと、「よし、プログラミングしよう!」という意欲を補給できたことだと思います。実際、このイベントが終わってからコードを書く時間が増え、以前よりも素人なりにプログラミング能力が上がったかな、と思えるようになりました。

素晴らしいイベントを開催してくれた主催者の@さんを初めとするスタッフの皆様と、設備が完璧な会場を用意してくれたOracleさん、ありがとうございました!

本当はもっと書くべきことがあるはずなんですが、思いつかないのとそろそろ本格的にブログを書くモチベーションが尽きかけているので、最後にこのイベントが終わってから本格的に作り始めたコードでも晒してみようと思います。

個人的にニコニコ動画の非公式APIを利用したPythonのライブラリが欲しいなあ、と思っていたので、素人ながら作り始めてみました。今のところ出来ている機能は、「動画の番号を与えると動画の情報を辞書で返す関数」くらいしか出来てないのですが、私みたいなPython初心者には参考になるところもあるかな、と思います。ただ、エラー処理などメチャクチャ適当なのと「テスト?何それ、おいしいの?」状態なので、どんなエラーが出ても責任持てません!!

pynico.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from xml.etree.ElementTree import ElementTree
from xml.parsers.expat import ExpatError
import urllib2

NICO_API_PARAMS = {
    # フォーマット文字列の選択が以下でいいのか、技術力がないから分からない
    'getthumbinfo':'http://ext.nicovideo.jp/api/getthumbinfo/sm%s',
    'thumb':'http://ext.nicovideo.jp/thumb/sm%s',
    'getflv':'http://flapi.nicovideo.jp/api/getflv/sm%s',
    'getmarquee':'http://flapi.nicovideo.jp/api/getmarquee?',
    'getrelation':'http://flapi.nicovideo.jp/api/getrelation?page=%s&sort=%s&order=%s&video=sm%s',
    'msg':'http://msg.nicovideo.jp/%s/api',
    # 'rss':'http://www.nicovideo.jp/%s/%s?rss=atom or http://www.nicovideo.jp/%s/%s?rss=2.0'
}

NICO_LOGIN_URL = "https://secure.nicovideo.jp/secure/login?site=niconico"

def get_thumb_info(movie_number):
    '''
    動画の番号(sm○○○)を引数に取ると、
    その動画の各種パラメータを辞書で返す関数
    '''
    
    movie_params = {
        'video_id':'',
        'title':'',
        'description':'',
        'thumbnail_url':'',
        'first_retrieve':'',
        'length':'',
        'movie_type':'',
        'size_high':'',
        'size_low':'',
        'view_counter':'',
        'comment_num':'',
        'mylist_counter':'',
        'last_res_body':'',
        'watch_url':'',
        'thumb_type':'',
        'embeddable':'',
        'no_live_play':'',
        'tags':[],
    }
    
    request_url = NICO_API_PARAMS['getthumbinfo'] % movie_number
    try:
        movie_params_xml = urllib2.urlopen(request_url)
        try:
            movie_params_tree = ElementTree(file=movie_params_xml)
            movie_params_response_status = movie_params_tree.getroot().attrib['status']
            if movie_params_response_status == 'ok':
                # 動画情報が取得できたとき
                for key in movie_params.keys():
                    node = movie_params_tree.find('.//%s' % key)
                    if key == "tags":
                        # tags属性の子であるtag属性の要素は複数あるので、リストで保持する
                        tag_nodes = node.findall('.//tag')
                        movie_params[key] = [tag_node.text for tag_node in tag_nodes]
                    elif key in ('size_high', 'size_low', 'view_counter', 'comment_num',
                                    'mylist_counter', 'embeddable', 'no_live_play'):
                        # タグの内容が数値なので、文字列でなく数値で格納
                        try:
                            movie_params[key] = int(node.text)
                        except ValueError, e:
                            print "int() failed."
                    else:
                        movie_params[key] = node.text
            elif movie_params_response_status == 'fail':
            # 動画情報が取得できなかったときはNoneを返す
                return None
            else:
                return None
        except ExpatError:
            print "XML parse error."
            return None
        finally:
            movie_params_xml.close()
    except IOError:
        print "URL error."
        return None
    return movie_params
    
if __name__ == "__main__":
    onmyoji_params = get_thumb_info(9)
    for key, value in onmyoji_params.items():
        print key + ":"
        print value
        if key == "tags":
            for tag_text in onmyoji_params['tags']:
                print tag_text
        print "\n"

使ってない変数や、実装としておかしいところがたくさんあるのを承知の上で晒してみました。「動画の情報ってどんな風な情報が返ってくるのよ?」と思われた方は、python pynico.pyと実行してみてください。新・豪血寺一族 -煩悩解放 - レッツゴー!陰陽師 ‐ ニコニコ動画:Qの情報が出てくるはずです。

最後はPython Developers Festivalとは関係なくなってしまいましたが、まあ、いっかと思いつつ、記事を締めくくりたいと思います。

*1:一度目はSphinx + 翻訳Hack-a-thonでした

*2:「標準ライブラリの使い方とか、プログラミング能力を初心者レベルから一歩脱却するにはどうしたらいいですか?」といったような、あまりにも応えづらい質問をした気がします。