2012-05-07
第4回学生のためのUnity勉強会に参加しました
最近こういうのに参加出来てなかったから、そろそろまた行き始めようと思って、ちょうど見つけた第4回学生のためのUnity勉強会 in リクルート メディアテクノロジーラボ : ATNDに参加しました。UnityはJavaScript(UnityScript)*1で書いてたけど、本来のJavaScriptに慣れていればいるほど、UnityのJavaScriptで出来ないことが気になってしまうので、C#でやってみたいと思ってたところだったりします。
感想
ちょうどUnityはC#でやりたいと思っていたところ、学生のためのとある名前の通り、Unityの事だけじゃなくてC#の基本的な事も話して貰えました。というよりC#の基本的なところを詰め込みで話しつつ、Unityでの使いやすさみたいなのに触れる形でよかったです。スライドのタイトルも「Unityで覚えるC#」だし。
スライド57ページを1時間ちょいでという事もあって、かなり駆け足で進んでたので、最初は理解が説明についてけるかなと思ったけど、説明やスライドへのまとめ方がうまいのか、聞いてるだけで普通についてけてました。C#ならではの機能も結構紹介されてて、1時間ちょっとの聞いただけだけど、C#の事を分かった気分になりました。
学生のための勉強会だけど、学生じゃなくても参加しても良いという事で参加しましたが、周りをみるとあまり学生っぽい人は多くなかったです。会の最後に挙手でざっくりと数えてたけど、半分弱って感じでした。
URL
スライド
勉強会のサイト
Facebookグループがサイト代わりぽい。
メモ
スライドが公開されてるので、以下は自分がメモした事を的当に、スライドとかぶってるかもだけど書いておきます。
ここに書くにあたって、勉強会で取ったメモと記憶を頼りに、自分の言葉で書いてるので、勘違いとか間違いとかニュアンス違うとか、あると思います。
リファレンスはMSDNを見ろ
この辺かな?
コンポーネント志向
Unityでは継承よりコンポーネントとしてコード書いた方が良い場合が多い。端的に言えばMonoBehaviorを継承するとUpdate()やAwake()などが使えるから、その辺使って作ればコンポーネントになる。GameObjectを継承するより、そうやって作ったコンポーネントをGameObjectに付けたり外したりするやり方。
例えば、キャラクターのGameObjectに、プレーヤーキャラクターになるコンポーネント付けたり、敵として振舞うコンポーネント付けたり、サポートキャラになるコンポーネントと付け替えたりするみたいな事、だと思う。継承で作ってしまうと、敵から仲間に代わるみたいなGameObjectが作れない*2ことになってしまう。
コンストラクタ
MonoBehaviorを継承したクラスは、コンストラクタを実装する事はUnity側から非推奨。Awake()やStart()を使うべきで、そうじゃないとUnityがそのオブジェクトを管理できない。
デストラクタ
C#はGCがあるので、基本的に使わない。
iOSではSystem.GC.Collect();を定期的に呼んだほうがいいらしい | PC向けに作成していたものをiOSへ移植する時のTips - 強火で進め http://goo.gl/CgLyi #uniben4
Twitter
ハッシュタグでちらっと見かけた。
プロパティ
いわゆるクラスのプロパティではなく、C#の機能の事らしい。
public Vector3 velocity{ get { return rigidbody.velocity; } set { rigidbody.velocity = value; } }
getter/setterを簡潔に書ける。setterを書かずにRead Onlyにしたり、アクセス修飾子も書ける。C#の便利な機能だけど、残念ながらこの書き方だとUnityのインスペクタからは見えない。
インデクサー
スライド18ページ目だけど、どうやらスライドに間違いがあるらしい。ただ、Unityではあまり使わないという話だったので、さらっと流れました。
アトリビュート
クラスやメソッドにメタデータを付けられるC#の機能。例えばSerializable属性をつけるとインスペクタから見えるようになるらしい。
namespace
多分普通にnamespace。Unity的には、MonoBehaviorを継承したクラスはnamespaceの中に入れると、なんか見つからなくなってしまうらしいので、namespace外にしないとのこと。
ジェネリック
かなり便利で一押しなC#の機能。だがUnityが提供するメソッドはあまりジェネリックを使ったものが多くないらしい。
ラムダ式
無名関数的な。イベントリスナー*3に登録するメソッドで、そのイベントでのみ使用するものを作るときに便利。インスタンスメソッドとして作っちゃうと、本来イベントからしか呼ばれない想定のメソッドなのに、別の開発者が勝手に使ったりするかもしれないし、機械生成APIにも載って煩わしい。
MonoDevelopは便利
MonoDevelopのリファクタリング機能を使えば、クラス名やメンバー*4名を変えると、呼んでる所や参照してる所も合わせて変えてくれる。Unity側でもちゃんと変わってる。
とあるメソッドの宣言へのジャンプや、何処から呼んでるかも、コンテキストメニューから出せる。普通にIDE。
ただし、sendMessage()は引数が文字列リテラルだから、リファクタリング機能が通用しない。
MonoDevelopにvimモードがある
どの程度のサポートか、どこから設定するかは忘れたけど、たしかあったはずとの事。
ブレークポイントのトレース
Run > Attach to processでUnityのプロセスにアタッチすれば、ブレークポイント置いてトレースできる。ただし、ブレークしたまま放置したりすると、MonoDevelopが不安定になりやすいとか。
MonoDevelopの.NETのバージョン
MonoDevelopでコンパイルを実行する事で、C#のコードとしてちゃんと書けてるか確認できる。これはUnityとは無関係のものなので、Unityの中で発生するエラーは当然分からない。Unityは.NET 4.0だが、MonoDevelopの対象バージョンが.NET 3.5になっている事があるので、4.0に設定しておくとエラー検出もより正確になる。
ほかにもメモは書いたけど
割とスライドにも、Unityではって話も書いてあるので、劣化コピーみたいな内容になりそうなのでこのくらいにしておきます。
その他
前回
学生のためのUnity勉強会「1時間でFPSを作る」チュートリアル(前編) - mikami’s dialy
前回は「1時間でFPSを作る」という内容だったらしい。面白そうだし、探せば資料はあるはずだと思うけど、とりあえずまとまってるエントリーがあったのでURLだけ置いておきます。
会場
またまた開催します!学生限定イベント『TechCafe for Students 2012 summer』|Media Technology Labs (MTL) : メディアテクノロジーラボ
会場提供はリクルートメディアテクノロジーラボなんだけど、なんか学生限定イベントがあるので学生の方良かったら参加してください的な話が最後にありました。そういう告知する為の会場提供って意味合いもあると思うんだけど、学生じゃなくてすいません。
ついで
http://dl.dropbox.com/u/5606304/JSvsCSharp.pdf
JavaScriptとC#で同じコードを書いて、殆ど変わらないよねってPDF。
2012-02-03
gumiStudy#12 x ニューフォリア HTML5勉強会に行ってきました
これもそこそこ時間経っちゃったけど、1月13日に gumiStudy#12 x ニューフォリア HTML5勉強会 : ATNDに行ってきました。最近HTML5の動向を見てないなと思ってたので、これはちょうど良いという事で、HTML5について聞いてきました。
感想
久しぶりにHTML5の話を聞けて楽しかったです。特に、1パート目の話は、技術的なとこよりも、HTML5を取り巻く状況というような話だったけど、今よりも将来的に使われるであろうHTML5なので、未来を感じる話が多かったです。かなり込んでて最初は立ち見でメモも取れず、残念ながら資料は非公開との事だったので、思い出しながら書くにも限度があるけど、面白い話を聞いてHTML5やりたいなと思ったのは覚えてます。
フィーチャービジョン
未来の話としてテクノロジー企業などが発表する、架空の技術を使った近未来の想定映像をフィーチャービジョンというらしいです。発表ではマイクロソフトのものが紹介されたけど、実際にフィーチャービジョンで検索するとマイクロソフトのばっかり出てくるので、マイクロソフトのがフィーチャービジョンって名前で、ジャンル名としては他にあるのかも。
ともあれ、フィーチャービジョンは見るだけでも面白いので沢山見たいなと思ったんだけど、検索してもあまり見つからない。でも、今までもいくつかの企業がそういうの発表してると言うのを、たまに見聞きした覚えはあるので、どっかにあるはず。
という事で、見かけたらTumblrに放り込む事にしました。まだあんまり見つかってないけど、5個ほど投げ込んでます。もっと色々見たいので、何かこんなの知ってる人がいたらコメントくれるとうれしいです。
AERIAL IMAGING
未来的なものとして紹介されていた、空中ディスプレイ。日本の企業で既に実現されているんだとか。AERIAL IMAGINGはどっかで実物を見てみたい。HTML5とどういうつながりがあるのか覚えてないけど、これに限らず、いろんな表示部分がHTML5を採用して、PC・スマートフォンだけじゃなく色んなデバイスがシームレスに繋がるとか、そんな話だった気がする。AERIAL IMAGINGが実際にHTML5を採用してるのかどうかは知らない。
Polyfill
レガシーブラウザを救済するライブラリをPolyfillと呼ぶんだとか。
- html5shiv
- innerShiv
- html5media
- CSS3 PIE
- Raphael
- ExplorerCanvas
- socket.io
ざっとでこんなものがある。
各API
HTML5になって要素もそれなりに追加/削除があったけど、HTML5という話題はHTMLだけじゃなく、どちらかというとJavaScriptから使うAPIの事を指してます。位置情報だったりストレージだったり音だったりを扱う大量のAPIなど。

W3CがHTML5の特設サイトを作っていて、HTML5の概要をまとめたり、webサイトに貼るこんなバッジを提供したりしてます。サイト名の通り、概要とかよりロゴに重きを置いてるきがするけど。
W3C HTML5 Logo
CONNECTIVITY / REALTIME
- More efficient connectivity means more real-time chats, faster games, and better communication. Web Sockets and Server-Sent Events are pushing (pun intended) data between client and server more efficiently than ever before.
CSS3 / STYLING
- CSS3 delivers a wide range of stylization and effects, enhancing the web app without sacrificing your semantic structure or performance. Additionally Web Open Font Format (WOFF) provides typographic flexibility and control far beyond anything the web has offered before.
DEVICE ACCESS
- Beginning with the Geolocation API, Web Applications can present rich, device-aware features and experiences. Incredible device access innovations are being developed and implemented, from audio/video input access to microphones and cameras, to local data such as contacts & events, and even tilt orientation.
3D, GRAPHICS & EFFECTS
- Between SVG, Canvas, WebGL, and CSS3 3D features, you're sure to amaze your users with stunning visuals natively rendered in the browser.
MULTIMEDIA
- Audio and video are first class citizens in the HTML5 web, living in harmony with your apps and sites. Lights, camera, action!
PERFORMANCE & INTEGRATION
- Make your Web Apps and dynamic web content faster with a variety of techniques and technologies such as Web Workers and XMLHttpRequest 2. No user should ever wait on your watch.
SEMANTICS
- Giving meaning to structure, semantics are front and center with HTML5. A richer set of tags, along with RDFa, microdata, and microformats, are enabling a more useful, data driven web for both programs and your users.
OFFLINE & STORAGE
- Web Apps can start faster and work even if there is no internet connection, thanks to the HTML5 App Cache, as well as the Local Storage, Indexed DB, and the File API specifications.
バッジにもあるアイコンはTECHNOLOGY CLASSEで、HTML5が含む技術の分類です。英文そのままだけど、こんな感じの分類になってます。HTML5は風呂敷広がりすぎて全体が中々分からないので、こうやって分類できる指針が見つかると色々捗りそう。どうやら、今後の拡張はバージョン番号を上げたりしないで、随時HTML5に追加していくらしいので、もっとごちゃごちゃとするだろうし。
Open Web
前述の通りHTML5では、HTMLの枠を超えてwebの技術をHTML5と括っている。これをW3CではOpen Webと呼んでいるんだとか。HTML5の他に用語が必要だったのかよく分からないけど。日本語だとWikipediaに記事もないし、あまり使われてない言葉なのかな。
勧告とは
今まで勧告*1というと、W3Cが議論で詰めてから出すものだったけど、HTML5からは2つ以上のブラウザで実装されたら勧告にするという方針になったんだとか。実装が先行するので、勧告出てから使い始めるより、勧告になりそうな有望なAPIというか仕様は先取りして使っていくのが良いらしい。
その他リンクなど残したいもの
*1:Recommendation
2012-02-01
Unity Game Jamに参加しました
例によって結構日が経ってますがUnity Game Jam : ATNDに参加しました。
Game Jamとは
ニュージャージー州マウントロイヤル, 2011年11月18日 – IGDA(国際ゲーム開発者協会)が開催する Global Game Jam™ (グローバル・ゲーム・ジャム,略称GGJ) では,参加申込の参加申込み受付を開始しました.このイベントに関心のある方は,世界各地の会場の中から一つを選んで参加することができます.今回で4年目になるこのイベントでは,学生,ホビイスト,同人,そしてプロが集まり,週末の間に即席チームを組んでゲームを完成させます.
News | Global Game Jam
これはGlobal Game Jamからの引用だけど、要するにこれに近いコンセプトで、今回はUnityがテーマというものです。一応、Global Game Jamとは主催は違います。
感想
Game Jamとはというのを、初めて体験出来たような気がします。SocialGameJam MeetUP!に参加しました - kanonjiの日記で、また別の方が主催する、SocialGameJam MeetUP!に参加してたけど、これは1日だけの番外編みたいなものでした。2日間泊り込みで開発だし、とはいっても寝なくても30時間くらいしかない中で作り上げないといけないし、かなりハードなイベントです。ただ、だからこそのスピード感とか、あとなんて言って良いか分からないけど、まぁとにかく楽しかったです。
Unityの経験不足
初心者向けのUnity勉強会に行ってきました - kanonjiの日記と第3回 UnityのためのCGとか勉強会に行ってきました - kanonjiの日記と、あとその復習はしてて、基本は押さえているつもりだったけど、やっぱり実践で使った事がないので、力不足でした。ただ、一応動くものが出来たわけだし、30時間思いっきりがんばれば何とかなるもんだ。ただ、ちゃんとした物が出来たとはやっぱり言えないので、ちゃんとってとこまで持ってく為には、やっぱりもっと経験が必要でした。
スピード感
Game Jamではテーマが与えられるので、それを元にどんなゲームを作るか、考えるところからはじまります。こういうのは時間がかかってしまいそうだけど、模造紙と付箋紙とホワイトボードを使って、かなりテンポ良く企画を立てれたのが印象的でした。ちなみに、今回のテーマは「広がり」でした。
- 「広がり」*1から連想する言葉を付箋紙に書いて出す。
- 出た言葉をグループ分けする。「空間が広がるもの系」「ソーシャル的な広がり系」など
- 言葉のグループを3つくらいに絞って、全員がそれぞれ、一言で説明できる程度の企画を考える。
- 全員の企画を発表して一覧に書き出し、最終的に1人3票の投票で作るものを決める。
こんな感じで、企画は進みました。それぞれ時間を区切ってやるので、お昼を食べる前には何を作るかは決まってた感じ。ちょっとお昼遅くなったけど。自分はこういうのに時間がかかるタイプなので、こういう進行をしてもらってかなり助かりました。
決まった企画
実際に決まったのは紙飛行機をモチーフにしたものでした。テーマから連想とかしておいてなんですが、これは途中で配ってもらったメモ用紙を、既にチームメンバーが模造紙持ってきてたので、紙飛行機でも作る?という冗談から、アイデアに組み込まれて、最終的に案として残ったものです。
紙飛行機を実際の地図上で飛ばして、到達場所とか飛行距離をFacebookに流して、他の人がその場所からさらに飛ばすというようなものを考えました。沢山飛べば地図が広がって、人にも繋げていくのがテーマへの答えです。
phperチーム
狙ったのか偶然なのか、5人中4人がphperというチームでした。なので自然と、サーバーサイドというかソーシャルとの連動を盛り込む案が出て、他のチームとはかなり変わったアプローチになった様子。ただ、この時代に出てきた開発ツールの割りに、意外とFacebookやTwitterとの連携がまだハマリどころあるらしく、ちょっと時間がかかってしまったり。なのでUnityに使えるはずの時間を、そっちに割かれてしまったのが残念でした。
自分の担当
下記の画像を見てからじゃないと分かりにくいですが、地図を読み込んで地面を生成するところを担当しました。なのでUnityはスクリプティングばっかりやってました。wwwクラスを使って画像をロードして、地面になるセルに張ってうまく並べるというような事をしました。結構はまりつつ試行錯誤をしたので、割と勉強になったのが良かった。ただ、一番時間がかかったのは、地図をずれ無くきれいに並べる為のピクセル-位置座標変換だったり・・・。
作ったもの
諸事情により画像のみです。
というのも、Unity内で出してる地図は、ガラケー用と思われるGoogle Static Maps APIを使っています。作ってる最中に気が付いたんですが、Google Static Maps APIはかなりリクエスト制限が厳しいです。完成度が低いというのもあるけど、ちゃんと作りこめても、この制限があるので一般公開はちょっと厳しい感じ。もう走り出してから気が付いたので、発表のとき読み込めれば良いかという事で進めました。
他にも、Facebookとの連携もしてるんですが、あまり画像で分かる機能じゃないんですよね。自分が地図周りにかかりっきりだったのでよく把握してないというのもあります。
その他リンクなど残したいもの
*1:繋がりだったかも?
2012-01-25
第1回「入門 ソーシャルデータ」真面目に勉強する会に行ってきました
第1回「入門 ソーシャルデータ」真面目に勉強する会 @外苑前 : ATNDに参加してきました。O’Reilly Japan - 入門 ソーシャルデータが2011年11月に発行になったので、それに合わせて1章ずつ読み進めていく事を目指した勉強会です。O’Reilly Japan - 集合知プログラミングの勉強会をやっていた方が主催していて、こっちはやってるのを知った時には半分以上進んでいたので、1回目から参加出来る入門ソーシャルデータは、ちょうど良いタイミングでした。入門ソーシャルデータの方は、副題にもある通り分析と可視化がテーマで、ガチ分析よりは可視化に興味がある自分にはぴったりな本です。
ちなみに、このエントリーを書いてる時点で、既に第2回目も開催済みです。もっと早く書かないとなぁ。
感想
一応第1章は読んでおいたんですが、実際に本に載ってるコードは動かしてみてから参加した方が良かったようです。この本では、Pythonが使われていて自分がまだPythonに不慣れというのもあるし、ソーシャルデータなのでAPIを叩くわけで、ちょっと本とは仕様が変わっている場合とかありました。その辺事前に知っておけば、当日にもっとスムーズに理解できたかなーと思います。
なお、第1章ではトレンドAPIに仕様変更があった様です。ちょうどこの本に関してのエントリーで ページが見つかりませんでした | holidayworking.org | Page 2に回避策が書いてありました。
Pythonを書く環境もあまり整備してなかったので、そこでも手間取りました。別にテキストエディタなら何でも良いといえばいいんですが、使いやすい道具として煩わしくない状態になっていて欲しいです。エキPy勉強会で知ったIPythonがいいかなーと思って導入しようとしてたら、参加してない人からTwitterでbpython interpreterを教えてもらって、かなり気に入りました。この勉強会とは関係ないけど、成果の1つです。
Pythonインストール
第1章を読み始めたら、いきなりPythonの環境構築から始まった。どうやらPythonはこういう分野に強いらしく、この本のサンプルコードはPythonで書かれている。Pythonを実務で使った事はないけど、ちょうど最近、エキスパートPythonプログラミングの読書会に参加しているので、割と好都合だったり。
$ pythonbrew switch 2.7.2 $ pythonbrew venv create socialdata01 $ pythonbrew venc use socialdata01 $ easy_install bpython
Pythonの環境構築の自分なりのまとめ+エキスパートPythonプログラミング読書会 第二期 01に行ってきました。 - kanonjiの日記でpythonbrew+virtualenvの環境は構築済みなので、今回用の環境を作りました。前述の通りbpythonが気に入ったので、bpythonでサンプルコードを書いて、うまくいったら保存したりします。vimで書くのもいいけど、Pythonにはまだ慣れてないので、タイプミスや文法ミスした時にすぐ分かるインタラクティブモードで書きたかった。bpythonだと補完や候補表示も分かりやすくて、Python初心者にはすごく良いと思う。
追記だけど、bpythonとかIpythonとかインタラクティブモードをREPLとは - はてなキーワードと言うらしい。Read-eval-print loop、対話型評価環境とも。
Twitterからデータの取得
第1章は、解析/可視化の体験入学的な楽しさを伝える章らしい。なのであまり難しい事はせず、流行もののTwitterのデータを使ったものになっていました。
$ easy_install twitter
import twitter ts = twitter.Twitter(domain="search.twitter.com") results = [] for page in range(1,3): results.append(ts.search(q="#social_data", rpp=100, page=page)) tweets = [ r['text'] \ for result in results \ for r in result['results'] ] words = [] for t in tweets: words += [ w for w in t.split()] print tweets print len(words) print len(set(words))
Search APIからデータを取ってきて、総ワード数/ユニークなワード数をprintしてます。ただ、洋書の和訳なので、スペースでワードが区切られている英語前提になってます。でもまぁサンプルだから。
trendsが取れない
本では、twitterパッケージの最初のサンプルとしてTrends APIからデータを取るコードが書いてあったけど、Twitter APIの仕様というかURLが変わったらしくてエラーになってしまった。あんまちゃんと調べてないけど、これがこの件のチケットぽいし、既にクローズされてるので、そのうちPyPIに新しいパッケージが載って動くようになるかも。
NetworkXでグラフの生成
NetworkXというパッケージでグラフを作る。ここで言うグラフというのは、折れ線グラフとかそういうのじゃなくグラフ理論 - Wikipediaのグラフ。
$ easy_install networkx
import networkx g=networkx.Graph() g.add_edge(1, 2) g.add_node('foo') print g.nodes() [1, 2, 'foo'] print g.edges() [(1, 2)]
add_node('foo')は、そのままfooというノードを作る。add_edge(1, 2)は1と2というノードを作って、その2つをエッジで繋ぐ。最初コードを見たときは、add_edge(1, 2)がノードを作ってる事が分からなくって、教えてもらいました。でも引数が数字だと、ノードIdみたいなのを指定してるのかなって思うよねぇ。
NLTKで自然言語処理
$ easy_install nltk
import nltk freq_dist = nltk.FreqDist(words) freq_dist.key()[:50] #50個の最も頻度が高いトークン freq_dist.key()[-50:] #50個の最も頻度が低いトークン
NLTKはNatural Language Toolkitの略らしく、自然言語処理をするパッケージ。本にあったサンプルはこんな感じで、頻度分析とかができたりする。やっぱり英語前提になっているというか、日本語だとうまく行かない。検索してみると、NLTKで日本語を扱う事についてそれなりにボリュームのあるページが出てくるので、奥が深そうな感じ。NLTKの機能だってFreqDist()だけじゃないだろうし。多分、後々の章で詳しくやるだろうと想定して、とりあえず深くは調べないで先に進みました。
ちなみに、上のコードのwordsには、前述のTwitterから取得したデータが入ってるという想定です。
『入門 ソーシャルデータ』で日本語を扱うために - Men talking over coffee with smoking Ark Royal.
勉強会に参加した人の中に、深くつっこんでエントリーにまとめた人がいました。
あとは、こんな感じのページとか。
MeCab
前述の通り、本のサンプルは英語前提で、ホワイトスペースでワード単位に分割してトークンとしています。日本語はホワイトスペースで分けれないので、形態素解析をする必要があり、勉強会でMeCabでやってみたという話が出てました。
なのでMeCabを入れてみました。MacPortsでMeCabを入れてPythonバインディングをvirtualenv環境に入れた - kanonjiの日記
その他リンクなど
2012-01-17
エキスパートPythonプログラミング読書会 第二期 02に行ってきてました
もう1ヶ月ほど前になっちゃったけど、エキスパートPythonプログラミング読書会 第二期 02 - connpassに参加してました。Pythonの環境構築の自分なりのまとめ+エキスパートPythonプログラミング読書会 第二期 01に行ってきました。 - kanonjiの日記に続けて第2回目です。なんか忙しくてブログ書けなかったけど、重要な章を進めた回だったから、思い出しながら書いてみます。
下書きで少しずつ書いてたら、濃い回だったので、結局書き上がったのが3回目の1時間前という・・・
感想
前回の第1章が環境構築だったので、今回は2章からという事になります。エキPyは後半になるほど、テストとかコード管理とかPythonそのものより、Pythonを取り巻く周辺について書いた章が増えていきます。逆に2章からPython独特の構文の説明が始まり、2章3章が一番難しいんだとか。実際かなり質問が多く、進んだのは2章の途中まででした。
そんなとこを1ヶ月もメモせずにいたのは、失敗だったなぁ。
注意
読書会で解説を聞きながら書いたメモを元にこのエントリーを書いています。仕組みを理解せず聞いた事を書いてたり、それがもしかしたら聞き間違いや勘違いしてる可能性もあるとおもうので、このエントリーはそんなくらいの正確さだと思います。
あと、間違いの指摘や補足などあったらコメント頂けるとうれしいです。
リスト内包表記
import keyword ["%d_%s" % x for x in enumerate(keyword.kwlist)] [func(i,k) % i,k for x in enumerate(keyword.kwlist)]
こんなやつ。
リスト内包表記は実行効率が高い。
なんかインタープリタ内部でごにょごにょするから速いらしいですが、現実問題として若干なので、読みやすさを犠牲に無理にリスト内包表記にするべきではない。
map(func, enumerate(keyword.kwlist))
こういう書き方もあるけど、リスト内包表記のほうが後から登場した構文で、やっぱりリスト内包表記が速いらしい。
短く書ける
普通にfor文を書くより短く書けて分かりやすくなります。ただ、ネストするような場合とか、複雑になると逆に読みにくくなるので、上記の通り無理して使うべきじゃない。
組み込み関数enumerate()
i = 0 seq = ["foo", "bar", "baz"] for element in seq: seq[i] = '%d: %s' % (i, element) i += 1
seq = ["foo", "bar", "baz"] for i, element in enumerate(seq): seq[i] = '%d: %s' % (i, element)
enumerate()を使うと、シークエンスのインデックスを簡単に取得できて、Pythonicに書けるんだとか。リスト内包表記でもfor文でも使えるなら使いたい。Pythonはインクリメントが無いので、そういった意味でもenumerate()を使うべきなのかな?
Pythonic
import this
Pythonらしい的な意味だと思う。これを実行すると、Pythonicとは何かを説明するThe Zen of Pythonという文章が英語で表示されるらしい。いわゆるイースターエッグ。http://www.python.jp/Zope/articles/misc/zenに日本語訳があります。
イテレーター
StopIteration
シークエンスの最後になると、StopIteration例外が発生します。for文はStopIterationでループを終わるようになっていて、例えばbreakなんかもStopIterationを発生させるんだとか。
プロトコル
StopIteration例外とか、イテレーターとして必要になるnext()と__iter__()を適切に実装する事で、独自のイテレーターを実装できる。イテレーターとして必要なものが書かれてればイテレーターという、ダックタイピング的な考え。
さらに、イテレータープロトコルというものがあって、それに沿っているべきという約束となっているらしい。プログラムの世界のイテレーターというのを、Pythonではこうなるという約束がプロトコルで、それをプログラム的に保証したりするのがABCs*1。
独自に、イテレーターは実装できるし、ダックタイピングとしてイテレーターになるけど、イテレータープロトコルに沿っていると、他の人から分かりやすいし使いやすくなる。
抽象オブジェクトレイヤ (abstract objects layer) — Python 2.7ja1 documentation
正直なところ、ちゃんとは理解しきれなかった。ドキュメントのここに、6個のプロトコルが書かれている。これだけなのか、他にもあるのかは不明。for文はイテレータープロトコルとシーケンス型プロトコルに対応しているとの事なので、プロトコルに沿う事でfor文やリスト内包表記で扱えるとも言えるのかも。
アダプタ
具体例から書くと、イテレータープロトコルに対して、next()がアダプタになる。プロトコルに対してアダプタを介して問い合わせるという考え。
勉強会の最中に書いたメモにはlen()はレングスプロトコルのアダプタというメモがあるんだけど、どうなんだろう。前述の6個のプロトコルには無いし、この辺はちゃんと理解しきれてる気がしない。
あと、ここで言うアダプタってのはアダプタパターンの事らしい。
ジェネレーター
関数をイテレータブルにするようなもの。本にはフィボナッチ数列を計算する例があります。
- フィボナッチ数列は無限に計算する事が可能なので、計算結果である数列を配列に入れてreturnできない。
- フィボナッチ数列は1個前の数値を計算に使うので、数列のn番目の数を求めるのに最初から計算する必要がある。
こういった事から、フィボナッチ数列の計算には、ジェネレーターが適しているようです。
def fibonacci(): a, b = 0, 1 //タプル代入 while True: yield b a, b = b, a + b fib = fibonacci() next(fib) //1 next(fib) //1 next(fib) //2 [next(fib) for i in range(10)] //[3,5,8,13,21,34,55,89,144,233]
ジェネレーターが作るのは特殊なイテレーターで、ジェネレーターオブジェクトと呼ばれる。この例の場合fibがジェネレーターオブジェクトで<generator object fibonacci at 0x100~~~の様に表現される。
使い道とか
フィボナッチ数列の計算は前回の数値を使って計算するので、メモリすごい使う事になるけど、ジェネレーターだとnext()都度計算して、古い値は捨ててるのでメモリ食わないんだとか。
使い道としては、大量にあるログの処理とかに便利らしい。あとは、10万行あるDBから読み出す際、全部読んでからカーソルを動かしてってのだとメモリを圧迫するので、ジェネレーターでラップして、必要ないレコードは捨てつつ読むとかで、使った事があると話してました。
本では、ループ処理を書く場合や、シーケンスを返す関数を実装する際には、ジェネレーターが使えないか考える事を推奨してました。
yield
ジェネレーターオブジェクトは、書かれたyieldの数だけの要素を持っている様なものになります。上記の例だと、無限にループするwhileの中にyieldがあるので、無限に要素を持っている様なものです。
def foo(): bar = 1 yield bar bar = 2 yield bar bar = 3 yield bar gen = foo()
例えばこの場合、yieldが3回分しかないのでgenは3回next()したら、ジェネレーターは終わった事になる。
python 2.5からのsend
>>> def foo(): ... for b in range(3): ... a = yield b ... print a >>> f = foo() >>> f.next() 0 //bの出力 >>> f.send('bar') bar //aの出力 1 //bの出力 >>> f.next() None //aの出力 2 //bの出力 >>> f.next() None //aの出力 Traceback (most recent call last): File "<input>", line 1, in <module> StopIteration >>> f.next() Traceback (most recent call last): File "<input>", line 1, in <module> StopIteration >>>
Python 2.5からsendでジェネレーターに値を渡せるようになった。
- aは、sendでジェネレーターに渡した値を受け取るもの
- bは、yieldで返すもの
最低1回はnext()してからsend()が使える
ok = my_generator()
ok.next()
ok.send('foo')
ng = my_generator()
ng.send('foo')
ジェネレーターオブジェクトを作って、いきなりsend()は使えない。1回はnext()して、yieldのとこまで処理を進める必要がある。
yieldは文から式に
Python 2.5からsend()が登場したため、yieldは文から式になった。従来はreturnと同じく文という扱いだったが、send()で送られてきた値を受け取るという代入の様な動きをするので式になった。
if( foo = bar() ) //ダメ
Pythonでは文と式が明確に分かれているので、例えばif文の中で代入とかはできない。
コルーチン
Pythonにはスレッドがあるけど、ジェネレーターとsend, throw, closeを使う事で、コルーチンの様なものが実装出来るらしい。
コルーチンはマルチスレッドじゃないけど並列実行する仕組みで、組み込みとかでスレッドがそもそもないけど、マルチタスクにしたいという時に使うらしい。
例えば、ジェネレーター2つ用意して相互に値をやり取りするんだとか。
- 1個目のジェネレーターは実際のタスクを持って、重たい処理なら細かくyieldで返す、軽い処理はある程度まとめて実行してからyieldする。
- 2個目のジェネレーターは、次に実行する処理のidとかを返す。
ジェネレーター式
リスト内包表記と似た形でジェネレーターが使える。
[x for x in enumerate(kw)] //全部が一気に出てしまう。 iter = (x for x in enumerate(kw)) //逐次実行できる iter.next()
for z in [x for x in enumerate(kw)]: //リスト内包表記が先に処理されて全部メモりにのっちゃって無駄 print z for z in (x for x in enumerate(kw)): //メモリが無駄じゃない print z
def foo(seq): for x in seq: print x //シークエンスを受ける関数foo()があって foo([x.upper() for x in kw[:5]]) //リスト内包表記でもいいけど、 foo((x.upper() for x in kw[:5])) //ジェネレーターならメモリ消費が少ない foo(x.upper() for x in kw[:5]) //さらにこの場合、Pythonのシンタックスとして()を省略出来る
xrange()の話
range(10) //リストが生成される xrange(10) //イテレータブルなオブジェクトが生成される
リスト内包表記や普通のシークエンスと、ジェネレーターの比較と同じように、xrange()の方がメモリ効率がいい。ただしPython3ではrange()がxrange()の動きをするようになり、xrange()が消えるんだとか。加えて、よほど広いレンジで生成しない限り、メモリ消費の差は少ないのでrange()使っておいた方がPython3への移行に手間がかからないという話も。
リスト内包表記が出る前についての余談
filter(lambda x:x%2, range(10))//リスト内包表記が出来る前はこれでやってた [1,3,5,7,9] [x for x in range(10) if x % 2] [1,3,5,7,9]
map() reduce() filter()はリスト内包表記で置き換えられつつあるらしい。
その他のリンクなど
- エキ Py 読書会02 2010/9/7
- 2.Adapter パターン 1 | TECHSCORE(テックスコア)
- import operator //四則演算などPythonのオペレーターが関数化されているモジュール
*1:abstract base classes


