こんにちわ、闇金業者です。 Cの練習とPEP333の実装として作っていたpicowsですが、せっかくなのでpypiにあげることしました。 名前も変えてmeinheldにしています。 Python Package Index : meinheld 0.1 あとbitbucketもなんだか寂しい気がしてきたのでgithubに移動しまし
09:00:00
こんにちわ、闇金業者です。 Cの練習とPEP333の実装として作っていたpicowsですが、せっかくなのでpypiにあげることしました。 名前も変えてmeinheldにしています。 Python Package Index : meinheld 0.1 あとbitbucketもなんだか寂しい気がしてきたのでgithubに移動しまし
09:00:00
<div class="section"> <p>講義資料の続き</p> <h4> PEPのススメ</h4> <p>さて、言語の設計の違いについて学ぶことは重要だが、不毛な議論で時間を浪費することは避けなければいけない。</p> <p>ならばどうするのがいいだろうか?</p> <p>正解はないが一つの案としてPEPを読むのはどうだろう?</p> <h4>PEPとは</h4> <p>Python Enhancement Proposals</p> <p><a href="http://www.python.org/dev/peps/" target="_blank">http://www.python.org/dev/peps/</a></p> <p>Pythonをこう改良したらいいんじゃない?という提案</p> <p>採用されることもあれば却下されることもある</p> <p>詳細はPEP 1で定義されているよ 和訳: <a href="http://sphinx-users.jp/articles/pep1.html" target="_blank">http://sphinx-users.jp/articles/pep1.html</a></p> <p>なかには本気かと思うような提案もある</p> <p>PEP 3117:Postfix type declarations</p> <p>「Unicodeの絵文字で型宣言をつけよう」</p> <pre> def normpath&#411;(path&#9998;)&#9998;: """Normalize path, eliminating double slashes, etc.""" if path&#9998; == '': return '.' initial_slashes&#10003; = path&#9998;.startswith&#411;('/')&#10003; </pre> <p>これはRejected(却下)されている。</p> <p>(はてなじゃ表示できないのか)</p> <h4> PEP一覧の俯瞰</h4> <ul> <li> Meta-PEPs: PEP自体や手続きに関するPEP</li> <li> Informational PEP: ガイドラインなど</li> <li> Accepted PEPs: 受理されて未実装</li> <li> Open PEPs: 議論中</li> <li> Finished PEPs: 実装済み</li> <li> Deferred, ... and Rejected PEPs: 却下など</li> <li> 番号順一覧</li> </ul> <p>Accepted PEPsとFinished PEPsの、それも互換性を失わせるような変更を重点的に読んでみよう。</p> <p>なぜなら互換性を捨てるような提案が採用されているということは、</p> <ul> <li> 互換性を捨ててまで採用するほど重要な問題で</li> <li> 説得力がある=それがなぜ重要であるのかが明確に説明されている</li> </ul> <p>ということだからだ。</p> <h4> _</h4> <ul> <li>ここにいくつかのPEPの概要などを入れてざっくり紹介する</li> <li>いくつかピックアップして解説をする <ul> <li> True division、数値の型階層から他の言語の比較、IEEE754などなど現実の理想的なモデルをプログラミングできるものに落としこむことの困難さについて話す?</li> <li> String Representationで、英語で発信することの重要さ、プログラマはプログラミングだけで世界を変えるのではなく、時には自然言語がとてもパワフルな道具になりうる、って話をする?</li> </ul> </li> </ul> <h4> 他の選択肢も挙げる</h4> <ul> <li> JSR</li> <li> SFRI</li> <li> EEP</li> <li> RFC</li> </ul> <h4> _</h4> <p>「ソースコードがドキュメントだ」という主張に対する反論</p> <p>ソースコードには「いま現在どうなっているか」しか書かれていない。「過去になにがあっていまこうなっているのか」や「未来にはこういう実装に変わるべきである」は書かれていない。</p> <p>PEPはPythonの過去や未来について書かれた文章だ。</p> </div>
02:08:07
<div class="section"> <blockquote> <p>「Pythonで長くなった行を折り返すのって難しくないの?」</p> <p>「全然難しくないよ。オフィシャルのコーディングスタイルガイドで79文字以下にすることが推奨されているくらいだし」</p> <p>「その時のインデントってどうすればいいの」</p> <p>「え?そんなの自由だよ」</p> <p>「え?そうなの?」</p> </blockquote> <p>というやりとりがあったので翻訳</p> <p>2. Lexical analysis — Python v2.7 documentation</p> <p><a href="http://docs.python.org/reference/lexical_analysis.html" target="_blank">http://docs.python.org/reference/lexical_analysis.html</a></p> <h4> 論理行</h4> <p>論理行の終わりはNEWLINEトークンで表現される。文は、構文規則でNEWLINEトークンが許されている場所以外で論理行の境界をまたぐことはできない。論理行は1行以上の物理行で構成される。その構成は後述の明示的行継続ルールと暗黙的行継続ルールに従う。</p> <p>(明示的行継続ルールってのは行末にバックスラッシュを置くと行がつながるってルールのことだ。翻訳はしない)</p> <h4> 暗黙的行継続</h4> <p>括弧、波括弧、大括弧で囲われた式はバックスラッシュなしで複数の物理行に分けることが出来る。例:</p> <pre class="syntax-highlight"> month_names = ['<span class="synConstant">Januari</span>', '<span class="synConstant">Februari</span>', '<span class="synConstant">Maart</span>', <span class="synComment"># These are the</span> '<span class="synConstant">April</span>', '<span class="synConstant">Mei</span>', '<span class="synConstant">Juni</span>', <span class="synComment"># Dutch names</span> '<span class="synConstant">Juli</span>', '<span class="synConstant">Augustus</span>', '<span class="synConstant">September</span>', <span class="synComment"># for the months</span> '<span class="synConstant">Oktober</span>', '<span class="synConstant">November</span>', '<span class="synConstant">December</span>'] <span class="synComment"># of the year</span> </pre> <p>継続行はコメントを持てる。継続行のインデントは重要ではない。空白の継続行は許される。暗黙の継続行の間にNEWLINEトークンはない。暗黙の継続行は後述の「三重引用符で囲われた文字列」の中にもできるが、こちらはコメントを持てない。</p> <h4> インデント</h4> <p>続く行のインデントレベルはスタックを使ってINDENT及びDEDENTトークンを作るのに使われる。</p> <p>最初の行が読まれる前に、一つの0がスタックにプッシュされる。この0はポップされない。スタックにプッシュされた値は常にスタックの底からてっぺんに向けて増加する。各々の論理行が始まるときに、その行のインデントレベルがスタックトップと比較される。もし同じ値ならなにもしない。もしその行のインデントレベルのほうが大きいなら、その値をプッシュし、INDENTトークンが作られる。もし小さいなら、インデントレベルはスタックの中にある数値のどれかでなくてはならず、スタックの中の値でインデントレベルよりも大きな値はすべてポップされ、そのポップごとに一つのDEDENTトークンが作られる。ファイルの最後で、残っている0より大きな値の数だけDEDENTトークンが作られる。</p> <p><hr /></p> <p>さて、もうおわかりかと思うが、例えばこんなインデントも許される。</p> <pre class="syntax-highlight"> >>> <span class="synStatement">if</span> True: ... <span class="synStatement">print</span> (1 + ... 2) ... 3 </pre> <p>Python的にはprintの次の行はprintの行の続きなので、print (1 + 2)って書いてあるのと変わらない。</p> <p>そういうわけで、普通の神経の持ち主が「見やすくするためにレイアウトしたい」と思うシチュエーションでPythonのルールがじゃまになることはないと言っていいだろう。少なくとも頭のおかしい人間が正方形プログラミングなんてやってしまう程度にはフリーレイアウトである。<a href="http://www.nishiohirokazu.org/blog/2007/08/post_323.html">西尾泰和のブログ: ワンライナーはダークサイド。改行をいれるべし</a></p> </div>
01:29:27
<div class="section"> <h4>概要</h4> <p>このPEPは、try/finally文の標準的な使い方を切り出すことが可能なように、Python言語に新しい文 "with" を追加する。</p> <p>このPEPの中で、「コンテキストマネージャ」はメソッド __enter__() および __exit__() を提供する。これはwith文に入る際と出る際に呼ばれるメソッドである。</p> <h4>導入</h4> <p>PEP 340とその代替案に関するたくさんの議論を経て、私は PEP 340 を撤回することに決めた。そして若干の変更を加えたものを PEP 310 で提案した。さらなる議論の末、throw()メソッドを使って停止中のジェネレータの中で例外を投げることの出来る機能と、そして新しい例外 GeneratorExit を投げる close() メソッドをを追加し直した。これらの追加は当初 python-dev [2] で提案され、全面的に賛同されたものである。また、キーワードをwithに変更した。</p> <h4>動機と要約</h4> <p>PEP 340, 無名ブロック文, はいくつものパワフルなアイデアを結びつけた。ジェネレータをブロックのテンプレートとして使う、ジェネレータに例外ハンドリングと終了処理を追加する、などである。一部の称賛を横目にたくさんの反対意見が出された。彼らは元々あった、だがはっきりとは見えていなかった、潜在的なループ構造が気に入らなかったのだ。つまり、ブロック文の中でのbreakやcontinueはそのブロック文をbreakしたりcontinueしたりする。たとえそれがループをしないリソース管理ツールとして使われていたとしても。</p> <p>しかし、とどめは私がRaymond Chenのフロー制御マクロについての暴言[1]を読んだときに刺された。Raymondは確信を持ってマクロのなかにフロー制御を隠してしまうのはコードを理解不能にすると主張した。そして私は、彼の主張がCと同様にPythonにも適用できる、と気づいた。PEP 340のテンプレートはあらゆる種類の制御フローを隠すことが出来る。たとえば、PEP 340の例4 (auto_retry()) は例外をキャッチしブロックを3回まで繰り返す。</p> <p>この点、PEP 310のwith文は、私の見解では制御フローを隠さない。finally節は一時的に制御フローを停止するだろうが、最終的には、finally節がまったくなかったのと同じ形に戻る。</p> </div>
00:19:54
<div class="section"> <p>final blow とどめ, 最後の一撃</p> <p>rant どなる、がなる、暴言</p> </div>
00:17:12
<div class="section"> <p>文字列の中に『%%』と書く。</p> <pre class="syntax-highlight"> >>> <span class="synStatement">print</span> "<span class="synConstant">%s%s%%</span>" % ("<span class="synConstant">シンクロ率、</span>", 41.3) シンクロ率、41.3% </pre> <br /> <br /> <br /> <p></p> </div>
<div class="section"> <p>今朝翻訳した PEP238ってすでに翻訳されてるじゃん</p> <p><a href="http://homepage3.nifty.com/text/script/python/pep-0238.ja.html" target="_blank">http://homepage3.nifty.com/text/script/python/pep-0238.ja.html</a></p> <p>PEP Indexに載ってるのを見落としたのかと思ったけど載ってないな</p> <p><a href="http://sourceforge.jp/projects/pythonjp/wiki/PEPIndex" target="_blank">http://sourceforge.jp/projects/pythonjp/wiki/PEPIndex</a></p> <p>今後の翻訳予定は下のようになっているのだが、チェックしよう</p> <pre> 概 SF 236 Back to the __future__ Peters 概 SF 227 Statically Nested Scopes Hylton SF 255 Simple Generators Schemenauer, Peters, Hetland 概 SF 238 Changing the Division Operator Zadka, GvR 概 SF 328 Imports: Multi-Line and Absolute/Relative Aahz SF 343 The "with" Statement GvR, Coghlan SF 3105 Make print a function Brandl SF 3112 Bytes literals in Python 3000 Orendorff http://docs.python.org/library/__future__.html </pre> <p>Simple Generatorsは翻訳済みだね。343は検索してみたけどとりあえず見当たらない。3105と3112もそうだけど、でもこれはあんまり面白くなさそうだなぁ。むしろ3141の方が面白そうだ。</p> </div>
20:19:47
<div class="section"> <h4>概要</h4> <p>現在の除算演算子 (/) は数値を引数として使った場合の意味が曖昧である。引数がintやlongの場合には、数学的な除算の結果を切り捨てたものを返す。しかし、引数がfloatやcomplexの場合には除算の結果の妥当な近似値を返す。</p> <p>この異なる演算のために異なる演算子を導入することによってこの問題を修正することを提案する: x/yを数学的な除算の結果の妥当な近似値を返す除算(真の除算), x//yを切り捨てた値を返す除算(切り捨て除算)とする。現在の、意味の混ざった x/y を「従来の除算」と呼ぶ。</p> <h4> 動機</h4> <p>従来の除算命令では任意の数値入力に対して正しい結果を返す数式を書くのが困難である。他の演算子全てに関しては x*y**2 + z などの式を書くことができ、どんな数値型(int, long, float, または complex)の入力であってもその計算結果は数学的な結果に近い(もちろん計算精度の範囲内で) しかし除算は問題を起こす。もし運悪く除算の両方の引数が整数型だったら、真の除算ではなく切り捨て除算になってしまう。</p> <p>この問題は動的型付け言語に特有のものである: Cのような静的に片付けされた言語では、入力(多くの場合関数の引数)はdoubleやfloatであると宣言されているだろう。そして整数を引数に渡して呼び出した場合、呼び出し時にdoubleやfloatに変換される。</p> <h4>訳注</h4> <p>これは個人的には「なぜそんな変更をしたのか謎だ」と思っていた、1 / 2 == 0.5 への変更についてのPEPだ。何が問題だと考えてこの変更を行ったのか腑に落ちた。</p> <p>しかし、OCamlみたいに「そもそも整数の演算と浮動小数点数の演算が別物なんだから全般的に演算子を分けるべきじゃないか」という意見や、Haskellみたいに「そもそも整数と浮動小数点数の演算を許しているのが問題なんじゃないのか」という意見、Schemeみたいに「いや1/10を0.1にした時点ですでに正しい計算じゃないだろ」という意見もあり、この解決方法が唯一の正解とはいえない。</p> <p>数の構造をどうやって言語の中にモデル化するか、という難問なんだな。</p> </div>
15:10:33
<div class="section"> <pre class="syntax-highlight"> $ irb >> <span class="synIdentifier">$o_o</span> = o_o =-~ ( <span class="synSpecial">"</span><span class="synConstant">o_o</span><span class="synSpecial">"</span> =~ <span class="synSpecial">/</span><span class="synConstant">o_o</span><span class="synSpecial">/</span> ) => <span class="synConstant">1</span> >> <span class="synPreProc">def </span><span class="synIdentifier">o_o</span> (o_o) <span class="synIdentifier">$o_o</span> + o_o <span class="synPreProc">end</span> => <span class="synConstant">nil</span> >> o_o => <span class="synConstant">1</span> >> o_o o_o => <span class="synConstant">2</span> >> o_o o_o o_o => <span class="synConstant">3</span> >> o_o o_o o_o o_o => <span class="synConstant">4</span> </pre> <p>個人的には関数と非関数で名前空間が分かれてるのか!と驚いたのだけど、でもまあメソッドとプロパティの名前空間が分かれてるって考えるとそれほど驚きでもないのかも知れない。むしろf f f が f (f f) と解釈されることも驚きなんだけど。</p> <p>なお最初は $o_o = o_o = 1 と書いていて「この1が顔文字だけれ作れればなぁ」って言っていたら <a href="http://d.hatena.ne.jp/hzkr/">id:hzkr</a> 氏に作ってもらえました。感謝♪</p> </div>
00:11:58
プログラミング言語の利用統計としてはTIOBE Indexが有名ですが,一方でデータの信頼性については疑問を呈する向きもあるようです。今回,ActiveStateが複数の統計を元に,6大動的言語と呼べるPerl,Python,JavaScript,PH...
19:04:54
<img src="http://takanory.net/takalog/images/2010-06-22%2001.24.20.jpg/image_mini" alt="手のりくりちゃん(1)" title="手のりくりちゃん(1)" height="150" width="200" /> <img src="http://takanory.net/takalog/images/2010-06-22%2001.24.33.jpg/image_mini" alt="手のりくりちゃん(2)" title="手のりくりちゃん(2)" height="150" width="200" /> <img src="http://takanory.net/takalog/images/2010-06-22%2001.24.53.jpg/image_mini" alt="手のりくろちゃん(1)" title="手のりくろちゃん(1)" height="150" width="200" /> <img src="http://takanory.net/takalog/images/2010-06-22%2001.25.12.jpg/image_mini" alt="手のりくろちゃん(2)" title="手のりくろちゃん(2)" height="150" width="200" /> <p>Yahoo!ペットの <a class="reference" href="http://contest.pets.yahoo.co.jp/hiroba/photocontest/contest/52/list/?page=1">第1回「手のり」コンテスト</a> という写真のコンテストは、見てもらえばわかりますがペットを手に乗せて撮った写真のコンテストです。</p> <p>で、当然ですがみんなかわいいーーー。</p> <p>しかし、100位まで見ても、あのペットがいないんです。そう、 <strong>フェレット</strong> が。</p> <p>というわけで、くやしいので勝手に「手のり」コンテストをしてみました。</p> <p>モデルはうちのフェレット、 <strong>くろちゃん</strong> と <strong>くりちゃん</strong> です。</p> <p>うーーーーーん。。。。</p> <p>フェレットは体が長いため「手のり」には不向きのようです。 写真を見ての通り、体が折れ曲がってなにがなにやらわからない状態になっています。</p> <p>赤ちゃんフェレットだったら、もうちょっとイケルかも。</p>
02:01:20
<div class="section"> <h4>概要</h4> <p>このPEPは Python 2.2 への静的にネストしたスコープ(レキシカルスコープ)の追加と、Python 2.1へのソースレベルでのオプションについて記述する。また、 Python 2.1はこの機能がenableされた場合に意味が変わるような構造について警告をする。</p> <p>従来の言語仕様(2.0以前)では、変数名を解決するのに用いる名前空間をちょうど3つ定義していた。ローカル、グローバル、そしてビルトインの名前空間である。ネストしたスコープの追加によって、未束縛のローカル変数名をそれを包む関数の名前空間で解決することが出来るようになる。</p> <p>この変更によるもっとも分かりやすい結果は、無名関数(や他のネストした関数)が、それを取り囲む名前空間で定義された変数を参照できるようになることである。現在、無名関数では(訳注:外で定義された変数を)無名関数の名前空間に明示的に束縛するためにデフォルト引数を頻繁に使わなければいけない。</p> <h4>導入</h4> <p>この提案は、Pythonの関数の中の自由変数を解決する方法を変更する。新しい名前解決の動作は Python 2.2 から効果を発揮する。この動作は Python 2.1 でもモジュールに"from __future__ import nested_scopes"と付けることで利用可能である。(PEP 236を参照)</p> <p>Python 2.0の仕様はそれぞれの名前を解決するのに、ちょうど3つの名前空間だけを定めていた。ローカル名前空間、グローバル名前空間、そしてビルトイン名前空間である。</p> <p>この定義により、もしある関数Aが別の関数Bの中で定義されている場合、Bの中で束縛されている名前はAの中からは見ることができない。この提案はこのルールを変更し、Bの中で束縛された名前がAの中でも見えるようにしよう(ただしAがBの束縛を隠してしまうような名前束縛を含まない場合に限る)というものである。</p> <p>この仕様はAlgol系の言語で普遍的なレキシカルスコープのルールを導入する。レキシカルスコープとすでにサポートされているファーストクラスの関数の組み合わせは、Schemeを連想させる。</p> <p>変更されるスコープのルールには2つの問題があった。ラムダ式(と一般にネストした関数)の限られた機能、そしてネストしたレキシカルスコープをサポートしている他の言語に慣れた新規ユーザが頻繁に混乱すること、例えば再帰的な関数はモジュールレベルでしか定義できないことなど、である。</p> <p>ラムダ式は一つの式だけを評価する名前のない関数を作る。これはよくコールバック関数として用いられる。下記の例(Python 2.0のルールを使って書かれている)では、ラムダの本体の中で使われている名前はすべて、明示的にラムダのデフォルト引数として渡さなければならない。</p> <pre class="syntax-highlight"> <span class="synPreProc">from</span> Tkinter <span class="synPreProc">import</span> * root = Tk() Button(root, text="<span class="synConstant">Click here</span>", command=<span class="synStatement">lambda</span> root=root: root.test.configure(text="<span class="synConstant">...</span>")) </pre> <p>このアプローチはめんどくさい。特にいくつもの名前がラムダの中で使われる場合には。</p> <p>デフォルト引数の長いリストはコードの目的を分かりにくくする。提案する方法では、ぶっきらぼうに言えば、デフォルト引数のアプローチを自動的に実装することでこの問題を解決する。この"root=root"という引数は削除できる。</p> <p>新しい名前解決の動作は Python 2.0 と異なる振る舞いが原因でいくつかの問題を起こす。ある場合にはプログラムのコンパイルができなくなり、またある場合では以前はグローバルの名前空間で解決されていた名前が外側の関数のローカルの名前空間で解決されるようになる。Python 2.1では、異なる挙動をする文すべてについて警告が発せられる。</p> </div>
23:56:06
<div class="section"> <h4> 導入</h4> <p>Python 3.0a1で変更可能なバイト列型を公開して以来、変更不可能なバイト列型を表現する方法を追加せよとの圧力が強まった。</p> <p>(中略)</p> <p>古いPyStringの実装を使い、ロケールサポートとユニコードとの間の暗黙の型変換を取り除いて変更不可能なバイト列型とし、新しいPyBytesの実装を変更可能なバイト列型としてとっておく。</p> <h4> 長所</h4> <p>変更不可能なバイト列型をもつことの一つの長所は、コードオブジェクトがそれを使うことができることだ。また、バイト列型をキーとするハッシュテーブルを効率的に作成できるようになる。これはHTTPやSMTPのような、バイト列に基づいてテキストを表現するプロトコルのパースに便利である。</p> <p>バイナリデータ(やエンコードされたテキスト)を扱うPython2.x用のコードの移植は、この新しいデザインでの方が、元の変更可能なバイト列を用いる3.0でのデザインよりも楽である。単にstrをbytesに置き換え、'...'リテラルをb'...'リテラルに置き換えるだけである。</p> <h4> 名前</h4> <p>下記のPythonレベルの型名を提案する</p> <ul> <li> ``bytes`` は変更不可能なバイトの配列 (PyString)</li> <li> ``bytearray`` は変更可能なバイトの配列 (PyBytes)</li> <li> ``memoryview`` は別のオブジェクトのバイトビュー (PyMemory)</li> </ul> <p>``buffer`` と呼ばれていた古い型はPEP 3118で導入された新しい型 ``memoryview`` に似すぎているので削除される。</p> <h4> 要約</h4> <pre> +--------------+-------------+------------+--------------------------+ | C name | 2.x repr | 3.0a1 repr | 3.0a2 repr | +--------------+-------------+------------+--------------------------+ | PyUnicode | unicode u'' | str '' | str '' | | PyString | str '' | str8 s'' | bytes b'' | | PyBytes | N/A | bytes b'' | bytearray bytearray(b'') | | PyBuffer | buffer | buffer | N/A | | PyMemoryView | N/A | memoryview | memoryview <...> | +--------------+-------------+------------+--------------------------+ </pre> </div>
11:00:58
<div class="section"> <p><a href="http://journal.mycom.co.jp/news/2010/07/27/007/index.html" target="_blank">http://journal.mycom.co.jp/news/2010/07/27/007/index.html</a> via @maeda</p> <blockquote> <p>「LISP」は、「ひだまりスケッチ」シリーズのゆの役や『WORKING!!』の種島ぽぷら役などでおなじみの人気声優・阿澄佳奈を中心に、『おねがいマイメロディ』で夢野歌役を演じた片岡あづさ、現役女子大生声優として注目される原紗友里の3人が集結。"キミとセツゾク"をコンセプトに、かつてない"毎日ファンとコミュニケーションする声優ユニット"として活動する。</p> </blockquote> <p>ラノベに進出したと思ったら次は声優ユニット化?! LISPはんぱねぇ!</p> <p>しかしやっぱり「コミュニケーション」はうりなのね。REPLですか</p> <p></p> </div>
09:37:44
<div class="section"> <h4> 概要</h4> <p>このPEPはPythonの関数に、任意のメタデータを追加するための構文を導入する。</p> <h4> 根拠</h4> <p>Python 2.x 系は関数の引数と返り値を修飾する方法を持たなかったため、数多くのツールやライブラリがそのギャップを埋めるために現れた。いくつかは PEP 318 で導入されたデコレータを使い、他のいくつかは関数のドキュメンテーション文字列をパースしてアノテーションを探す。</p> <p>このPEPは、このような情報を指定する、唯一の標準的な方法を提供し、今現在幅広い方法と構文のバリエーションが引き起こしている混乱を軽減することを目指している。</p> <h4> 関数アノテーションの前提</h4> <ul> <li>関数アノテーションは、パラメータと戻り値の両方とも、完全に任意。</li> <li>関数アノテーションはコンパイル時に任意のPythonの式を関数のさまざまな部分に関連付ける方法以上のなにものでもない。Pythonそれ自体はアノテーションに特定の意味をもたせることはしない。</li> </ul> <pre class="syntax-highlight"> <span class="synStatement">def</span> <span class="synIdentifier">compile</span>(source: "<span class="synConstant">something compilable</span>", filename: "<span class="synConstant">where the compilable thing comes from</span>", mode: "<span class="synConstant">is this a single statement or a suite?</span>"): ... </pre> <pre class="syntax-highlight"> <span class="synStatement">def</span> <span class="synIdentifier">haul</span>(item: Haulable, *vargs: PackAnimal) -> Distance: ... </pre> </div>
01:07:26
こんにちわ、情弱DQNです。 最近は寝かしていたpicowsを見直しています。 その時にとある事が気になったのでhttp_parserを乗せ変えました。 でその時の話。 以前まで 今まではmongrel, thinなどでも使われているZedの書いたragelベースのhttp parser を使用していました。
09:00:00
<div class="section"> <p>WindowsXP, Mercurial1.6で試した。</p> <h4>Q:\_sandbox\repo\.hg\hgrc</h4> <pre> [hooks] commit = "Q:\_sandbox\repo\.hg\test.py" </pre> <h4>Q:\_sandbox\repo\.hg\test.py</h4> <pre class="syntax-highlight"> <span class="synPreProc">import</span> os <span class="synStatement">print</span> "<span class="synConstant">hello</span>" <span class="synStatement">for</span> k,v <span class="synStatement">in</span> os.environ.iteritems(): <span class="synStatement">if</span> k.startswith("<span class="synConstant">HG</span>"): <span class="synStatement">print</span> "<span class="synConstant">%s=%s</span>" % (k, v) </pre> <h4>フックを動かしてみる</h4> <pre> Q:\_sandbox\repo>hg ci -m test hello HG_NODE=ececd2346b0a9e922ead35c4ffe8463ec11e5f21 HG=C:\Program Files\Mercurial\hg.exe HG_PARENT1=c36d660eb936a30e7c30c5e21e6e006351302641 HG_PARENT2= </pre> </div>
02:01:03
<div class="section"> <p>PEP 236 Back to the __future__</p> <h4>動機</h4> <p>時が立つにつれて、Pythonは言語コアの構造の広く知られた意味づけに互換性のない変更を加えたり、思いがけない(実装依存の)振る舞いを何らかの形で変更したりする。こういう変更は気まぐれには行われず、常に長期的に見て言語を改善する目的で行われるのだが、しかし短期的には論争と混乱を呼ぶものである。</p> <p>PEP 5, Guidelines for Language Evolution[1] は痛みを減らす方法を提案している。このPEPでは、それを実現するためのメカニズムを導入する。</p> <h4>意図</h4> <p>言語コア部分の構文や意味論に互換性のない変更を加える際は:</p> <p> 1. その変更が導入されるリリースCでは構文や意味論をデフォルトでは変更しない。</p> <p> 2. ある将来のリリースRを、そこでその構文や意味論が強制されるものとする。</p> <p> 3. PEP 3, Warning Framework[3] で説明されているメカニズムが、リリースRで意味を変えるであろう操作や構成について、可能な限りいつでも、警告を作成するのに使われる。</p> <p> 4. モジュールMの中のコードが現在のリリースCで新しい構文や意味論を使うことを要求するために、新しい future_statement (後述) を明示的にモジュールMに含めることが出来る。</p> <p>つまり、古いコードは少なくとも一つのリリースでデフォルトで動き続け、しかし新しい警告メッセージを表示しはじめるようになる。新しい構文や意味論への移行はこの期間中に進めることができ、future_statementを使って、それを含むモジュールがすでに新しい構文と意味論が強制されたあとであるかのように振舞うようにできる。</p> </div>
23:47:13
<div class="section"> <p>PEP3138 String representation in Python 3000</p> <h4>概要</h4> <p>この文章では、Python 3000用に文字列の新しい表現方法を提案する。 Python 3000以前のPythonでは、組み込み関数repr()はデバッグやログ出力のために、任意のオブジェクトを画面表示可能なASCIIの文字列に変換していた。 Python 3000ではユニコード標準に基づいて、より広い範囲の文字を「画面表示可能」とみなすべきである。</p> <h4>動機</h4> <p>Python2.*系では「表示可能な文字列を作成する関数」reprは、非ASCII文字をすべてエスケープする。文字列を構成する文字のほとんどがASCIIである場合には問題にならない。しかし、日本語などいくつかの言語ではほとんどの文字が非ASCIIであり、とても不便である。</p> <p>例えば open(japaneseFilemame) が何か例外を投げる場合、エラーメッセージは IOError: [Errno 2] No such file or directory: '\u65e5\u672c\u8a9e' といったものになる。</p> <p>Python 3000 には、非ASCII識別子など、ラテン文字以外を使用しているユーザーに優しい特徴がたくさん盛り込まれている。表示可能な文字列の作成に関しても同様に進化できればきっと役に立つことだろう。</p> </div>
22:56:13
<div class="section"> <p><a href="http://practical-scheme.net/trans/beating-the-averages-j.html">Beating the Averages</a></p> <blockquote> <p>プログラミング言語は半分技術で、半分は宗教なんだ [注6]</p> <p>...</p> <p>注6: 結果として、プログラミング言語の 比較は宗教戦争になるか、中立であろうとするあまりに 人類学の研究かと見まごうような学部生用の教科書にしかならない。 平和を好むか、大学での終身雇用を手に入れたい人は、この話題を避けて通る。 でも、宗教的な部分はこの問題の半分だけなんだ。他の部分には研究すべき価値がある。 特にあなたが新しい言語を設計したいと思っている時には。 </p> </blockquote> <p>というわけで、本当はもう少し宗教論争的な意味で炎上することを期待していたんだけどなー。真面目に書きすぎだと複数人に指摘された(苦笑)</p> <p>炎上してから公開するつもりだった原稿の続き:</p> <p><hr /></p> <p>賢者は歴史から学ぶ。愚者は経験からしか学ばない。</p> <p>自分で適当な設計で作って罠にはまる前に、既存の言語処理系を色々見比べて、どんな設計を採用したのか、どういう失敗をしたのかを学ぶことが重要だ。</p> <p>しかし言語間比較は不毛な論争を招きやすい。</p> <p>なぜか?</p> <p><hr /></p> <p>ある設計上の問題に対して解決策Aと解決策Bはどちらがよいのだろうか?</p> <p>例えばGCはデフォルトでONがいいのか、それとも必要な人だけ使えるのがいいのか?</p> <p>文字列は破壊的に変更できる方がいいのかできない方がいいのか?</p> <p>整数や多倍長整数や浮動小数点数や文字列の間の暗黙の型変換はある方がいいのかない方がいいのか?</p> <h4>「選択肢Aが正解だ」</h4> <p>と言えると思っている?</p> <p>それは視野が狭い。</p> <p>現実社会の問題の大部分は簡単に割り切れない「ケースバイケース」な問題だ。</p> <p>メモリの消費量や実行時間にシビアでないケースではGCまかせにしたほうがプログラマは楽かもしれない。</p> <p>しかし組み込みでメモリがとても少ない場合や、例えばシューティングゲームみたいにゲーム中にGCが走るとユーザがイラッとする場合などGCまかせにしたくないケースはいくつもある。</p> <ul> <li> 議論のしかた 「正しさ」の問題 <a href="http://iwatam-server.sakura.ne.jp/software/giron/giron/ar01s05.html" target="_blank">http://iwatam-server.sakura.ne.jp/software/giron/giron/ar01s05.html</a></li> </ul> <p>唯一の正解があるはずだという思い込みは不毛な議論を招きやすい。</p> <p><hr /></p> <p>よく起こる不毛な議論のパターン:「宗教論争」「自転車置場の議論」</p> <h4> 宗教論争とは</h4> <p>言語Xと言語Yのユーザがそれぞれ「自分の使っている言語の設計/機能が正しい」と考え、相手の言語の設計を「自分の信じる正しい言語と設計/機能が違う」という理由で互いに批判する状態。(一般的には言語の設計に限らずエディタやOS、政治、そして宗教も対象になる)</p> <p>言語Xの信者が主張する「正しさ」が「言語Xに近いこと」なので、何が正しいのかについて意見がまとまるはずがない。不毛な議論である。</p> <br /> <h4> 宗教論争はなぜ起こるか</h4> <p>全ての言語を均等に知っている人はいないので、どんな人の発言にも「彼の得意な言語がなんであるか」に起因する偏りがある。</p> <p>人間には自分の慣れたものに愛着を感じる傾向があるので、自分の得意な言語をほめすぎることが多い。</p> <p>また自分の知らないものの価値を認めることは難しい。よって自分の知らない言語のユーザが自分のよく知らないくだらない機能を高く評価し崇め奉っている「信者」にみえてしまう。</p> <p>また、特に1つの言語に愛着が強い場合、その言語の欠点を指摘されるとたとえ的を射ていようが「自分に対する攻撃」と感じてしまい、防衛のための反論をしがち。</p> <br /> <h4> 自転車置場の議論とは</h4> <p>駐輪場に屋根をつけるかどうか、何色に塗るか、といった些細な問題ほど議論に参加する人が多くなる現象。</p> <p>プログラミング言語で言えばsleepの引数が秒であるべきかミリ秒であるべきか、文字列のリストを結合するのはString#joinであるべきかList#joinであるべきか、配列の各要素に関数を適用するメソッドの名前が map であるべきか collect であるべきか、などの議論。</p> <p>こういう議論が無意味なわけではないが、大勢で考えなければいけないような問題でもないし、必死になって自分の主張を貫くような価値のある対象でもない。</p> <ul> <li>自転車置場の議論 - bkブログ</li> <li><a href="http://0xcc.net/blog/archives/000135.html" target="_blank">http://0xcc.net/blog/archives/000135.html</a></li> <li>FreeBSD FAQ</li> <li><a href="http://www.freebsd.org/doc/ja_JP.eucJP/books/faq/misc.html#BIKESHED-PAINTING" target="_blank">http://www.freebsd.org/doc/ja_JP.eucJP/books/faq/misc.html#BIKESHED-PAINTING</a></li> </ul> <h4> 自転車置き場の議論はなぜ起こるか</h4> <p>人間には「他者から関心・注目・反応が欲しい」という承認欲求がある。承認欲求に飢えている生き物にとって、大勢が参加する議論に加わるのはいいエサだし、万が一自分の意見が通りでもしようものならすごいご馳走だ。</p> <p>だから簡単そうな問題にはまず素早い人が口を挟み、議論の参加者が増えたことで自分も一言噛んでおこうと思う人でますます議論が紛糾し、そして彼らは自分の名誉と注目を守るために必死に他の意見を貶めようと発言する。</p> <br /> <h4> ある種の自然現象</h4> <p>宗教論争も駐車場の議論も、人間がそういう性質の生き物だから起きる自然現象だ。自分が起こさないように努力をすることは必要だが、起きてしまったことに嘆いたり怒ったりしても無意味。夏が暑くて時々夕立になることと同じ。夕立をふらせた雲に文句を言っても雨はやまない。</p> <p>夕立に怒るのでも夕立が降るのを嘆くのでもなく、夕立の時には雨宿りをして、濡れて風邪をひかないようにするのが賢明。</p> <p><hr /></p> <p>「PEPのススメ」に続く。</p> </div>
20:56:51
vim_bridgeを使うと,vim上で使えるPythonのヘルパー関数を定義できる。vimスクリプトの中にPythonのコードを書いて,デコレートするだけなので,とても簡単。 easy_installなどでvim_brigdeをインストール後,vi...
08:04:25
<div class="section"> <p><a href="http://www.amazon.co.jp/gp/product/4894717700?ie=UTF8&tag=nishiohirokaz-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4894717700">プログラミング言語の概念と構造</a>。例の原稿を書く前に<a href="http://d.hatena.ne.jp/yugui/">id:yugui</a>さんから借りたのに結局読みもせずに自分の記憶と勢いで原稿を書いてしまったのだが、今更読んでみた。っていうかこれはかなりいい本だ。というわけで返す前にレバレッジメモ作成。</p> <p>参考文献のリストの引き写しは今日はもう遅くて眠いのでまた今度。</p> <p><hr /></p> <p>マリナーI無人金星探査機は1962年7月22日発射から290秒後に爆破された。損失は1800から2000万ドルと見積もられる。notの欠落が原因である。</p> <p>1950年代には効率のよいプログラムは人がマシン語を書くことでのみ作られると信じられていた。この信念にFortranが挑戦した。</p> <p>最初はアセンブリ言語で書かれていたUNIXカーネルは1973年にプログラミング言語Cによって書き換えられた。利点は「新しいユーザとプログラム」「移植性」「可読性」 Ritchie[1978] <span class="footnote"><a href="http://d.hatena.ne.jp/nishiohirokazu/#f1" name="fn1" title="Dennis M. Ritchie The Evolution of the Unix Time-sharing System http://cm.bell-labs.com/cm/cs/who/dmr/hist.html ">*1</a></span></p> <p>BNFのNaurはAlgol60の報告書にBNF(当時はBackus Normal Form)を使った</p> <p>初期のFortranではIからNで始まる変数はint型、それ以外はreal型であり、異なる型の加減乗除は出来なかった。後にrealとintの計算の際にはintがrealへと強制型変換されるようになった。</p> <p>60年代の言語設計はAlgol60をどう改善するかに終始した。構文を指定するのにBNFを使うのもAlgolからの伝統。しかしAlgolにはデータ構造として配列しかなかった。</p> <p>「Algol60のコードをPascalに変換することは単純な転記と考えて差し支えない」 Wirth[1971] <span class="footnote"><a href="http://d.hatena.ne.jp/nishiohirokazu/#f2" name="fn2" title="The Programming Language Pascal. Acta Informatica, 1, (Jun 1971) 35-63. also in Programming Language Design, A.I.Wasserman, Ed., IEEE Computer Society Press, 1980. ">*2</a></span></p> <p>Modula-2は「Pascalのすべての側面を含んだ上で、重要なモジュール概念を持つように拡張した。」「あらゆる構造がキーワードで始まりキーワードで終わるようにした」</p> <p>「Cが提供する機能に加えて、C++は新しい型を定義する柔軟で効率的な機能を提供する」Stroustrp[1986] <span class="footnote"><a href="http://d.hatena.ne.jp/nishiohirokazu/#f3" name="fn3" title="The C++ Programming Language Addison-Wesley, ISBN 0-201-88954-4 and 0-201-70073-5.">*3</a></span> 新しい型はSimula67から借用したクラスを用いて定義される。</p> <p>今日のCと1972年のCの主な相違点は型検査に対する今日の厳格な態度である。現在ではある型へのポインターが整数や他の型へのポインターを装うことができなくなった。</p> <p>代入演算子: Cでは式の中に代入を書くことが出来る(Pascalではダメ)</p> <p>Knuth[1974]<span class="footnote"><a href="http://d.hatena.ne.jp/nishiohirokazu/#f4" name="fn4" title="Structured programming with go to statements (1974) http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf">*4</a></span>はgotoの有害性を最初に発表したのがNaur[1963a]で、Dijkstra[1968a]が流行らせたとしている。</p> <p>Lispではダイナミックスコープが伝統的に使用された。最近のLispではレキシカルスコープを採用する傾向がある。 --- 太古の極初期のLisp(とEmacsLisp)くらいかとおもったら「伝統的」だったのか。ダイナミックスコープが終わって僕らは生まれた、ダイナミックスコープを知らない子供たちさ〜♪</p> <p>値呼び出し: 右辺値を渡す、参照呼び出し: 左辺値を渡す、名前呼び出し: 名前の衝突を避けつつテキストそのものを渡す --- この簡潔なまとめは目からウロコ</p> <p>初期のFortranでは実参照パラメータが代入可能かどうかを検査しなかった。その結果、swap(1, 2)は定数の1と2を交換してしまうことがあった。言語によっては左辺値を持たない式が実引数に指定された場合には値呼び出しを用いることでこの問題を避ける。</p> <p>Cのマクロプリプロセッサは「名前の衝突」を無視した名前呼び出し。Algol60の名前呼び出しは衝突する際に局所名を変更するので大丈夫。</p> <p>モジュールはプログラムを適度なサイズに分割したものであり、公開されている部分と、公開されていない内部状態とがある。</p> <p>真の抽象仕様は実現が困難。実装隠蔽、カプセル化、表現独立によって、非公開部は外部に影響を与えることなく変更できる。</p> <p>Modula-2のモジュール=可視性+初期化 明示的なimport/exportなしにモジュールの境界を超えてアクセス出来ない。</p> <p>不透明な輸出(opaque export)とは型の名前だけのexport(構成要素を見せないの意)。代入と等価性のチェック、および明示的にexportされた他の操作だけしか使用できない。 --- HaskellのIOモナドの内部にアクセス出来ないのもこれだよね。</p> <p>C++の基本型/派生型は上位型/部分型(サブタイプ)より一般化されている。private継承をすれば導出クラスが部分型となることを防ぐことが出来る。</p> <p>List ProcessorであるLispはFortranのFLPL(Fortran List Processing Language)という拡張に萌芽がある。FLPLには再帰がなく、式の中に条件を書く事もできなかった。</p> <p>プログラミング言語に置ける並行性とハードウェアにおける並列性は互いに独立した概念である。ハードウェアの演算はそれが時間的に重なりあって行われるときに並列(parallel)であるという。ソーステキスト上の操作は、並列に実行されることが可能であれば並行(concurrent)であると言われるが、必ずしも並列に実行される必要はない。 --- 今まで聞いた中で一番わかり易いparallelとconcurrentの違いの説明だ!</p> <p>BNFに類似の表記法がサンスクリット語の複雑な文法を記述するために紀元前400年〜200年頃、古代インドの言語学者Paniniによって使用されていた Ingerman[1967]</p> <p></p> </div> <div class="footnote"> <p class="footnote"><a href="http://d.hatena.ne.jp/nishiohirokazu/#fn1" name="f1">*1</a>:Dennis M. Ritchie The Evolution of the Unix Time-sharing System <a href="http://cm.bell-labs.com/cm/cs/who/dmr/hist.html" target="_blank">http://cm.bell-labs.com/cm/cs/who/dmr/hist.html</a> </p> <p class="footnote"><a href="http://d.hatena.ne.jp/nishiohirokazu/#fn2" name="f2">*2</a>:The Programming Language Pascal. Acta Informatica, 1, (Jun 1971) 35-63. also in Programming Language Design, A.I.Wasserman, Ed., IEEE Computer Society Press, 1980. </p> <p class="footnote"><a href="http://d.hatena.ne.jp/nishiohirokazu/#fn3" name="f3">*3</a>:The C++ Programming Language Addison-Wesley, ISBN 0-201-88954-4 and 0-201-70073-5.</p> <p class="footnote"><a href="http://d.hatena.ne.jp/nishiohirokazu/#fn4" name="f4">*4</a>:Structured programming with go to statements (1974) <a href="http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf" target="_blank">http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf</a></p> </div>
01:27:07
<div class="section"> <p>最近、前から持っていたのに使っていなかった2リットルの麦茶を作る冷蔵庫に入れる容器の利用を開始した。片方のお茶がなくなると、即座に古いお茶パックを捨てて水を入れて冷蔵庫にしまう。そうするともう片方のお茶を飲み終わる頃には新しいお茶ができている。いつでも飲み物がある。</p> </div>
17:14:21
<div class="section"> <p>最近書いてないなと言われたので。</p> <p>洗濯物を干した。前回の洗濯物を取り入れた際に、たたんでかごに直していたので、下着干しやハンガーに十分余裕がある。すぐに干せる。洗濯を開始した時点で余裕が無いなら事前に実行しておくと洗濯が終わったあとで干すタスクにとりかかる際のイニシャルコストが削減できる。</p> <p>いままで洗濯物を干す際には、洗濯機の中で絡まった洗濯物をかごに入れて、1個とってハンガーor下着干しに装着して、また1個とる、というタスクを実行していた。これは事前に1工程増やして「下着とシャツを分離する」をしたほうがよい。一度ばらしていることで絡まったシャツなどの「予期しないインタラプト」が入らないし、下着干しとハンガーの間でのコンテキストスイッチがなくなって全体としてのパフォーマンスも上がる。</p> </div>
17:11:47
<div class="section"> <p>プログラミング言語は人が作ったもの。人は誤るもの。なので完璧なプログラミング言語は存在しない。</p> <p>「人は誤るもの、しかし誤りに固執するのは馬鹿の所業だ。」(キケロ) プログラミング言語も、間違った設計をして、馬鹿でない人がそれを修正することの繰り返しで発展してきた。</p> <p>というわけで言語間での設計判断の食い違いとか失敗した設計とかを収集中。一部抜粋して講義資料に入れるつもりなので他の事例をご存知でしたらぜひ情報をいただけるとありがたいです。</p> <h4> if(x = 0)</h4> <p>C言語では代入が式であるためif(x == 0)のつもりでif(x = 0)と書いてしまい、常に偽になってしまう。</p> <ul> <li> x = 0の値はint、条件式はboolでないといけないので型エラーだよ派: Java</li> <li> x = 0は式ではないので条件式に入れたら構文エラーだよ派: Python</li> <li> 条件式にx = 0をいれたらx == 0と解釈するよ派: HMMMML <span class="footnote"><a href="http://d.hatena.ne.jp/nishiohirokazu/#f1" name="fn1" title="http://twitter.com/HomeiMiyashita/status/19575507867">*1</a></span></li> </ul> <h4> 値渡し、参照渡し</h4> <p>C言語では関数を呼ぶ場合の引数の渡し方に、値渡ししかできなかった。変数のアドレスを取得し、それを値渡しし、呼び出し先でそのアドレスに間接アクセスすることで参照渡し風のことをすることができた。C++では呼び出し先で間接アクセスしないでいい参照渡しが導入された。</p> <p>Javaでは「変数のアドレスを取得する方法」を取り除いた。オブジェクトへのアクセスはC++の参照のような見かけで、しかし関数に渡す際にはアドレスの値渡しで行う(参照の値渡し)とした。それで十分であった。非オブジェクト(プリミティブ型)は従来通り値渡しにした。</p> <p>Pythonでは全てがオブジェクトのため、全てが参照の値渡しになった。整数や文字列などのプリミティブなものは変更不可能なオブジェクトにすることで「呼び出し先で破壊的変更を行うこと」を不可能にした。これによって参照が値渡しされていてもただの値渡しと同様になった。</p> <h4> 値の範囲の定義</h4> <p>C言語では環境によって「intが何ビットであるか」などがまちまちのためプログラマに無駄な労力をさかせていた。Javaでは言語仕様としてintなどのプリミティブ型の大きさと値の範囲が定められている。</p> <h4> 配列</h4> <p>Cの配列は長さを持たない。ただの「たまたま同じ型のデータが並んでいるメモリ領域の先頭へのポインタ」である。範囲外アクセスによる脆弱性の例は枚挙にいとまがない。Javaの配列は作成時点で長さが定められ、範囲外へのアクセスは例外を投げる。</p> <p>Javaの配列はファーストクラスのオブジェクトであり、関数の引数にそれ単体で渡すことができる。</p> <h4> 関数へのポインタ</h4> <p>Cは関数へのポインタを作成することが出来る。ポインタはファーストクラスのオブジェクトなので関数の引数に関数を渡すことが出来る。</p> <p>Javaではそもそも関数がない。リフレクションによってメソッドオブジェクトを取得することは出来る。</p> <p>C++では関数の呼び出しオペレータを定義したクラスを作ることが出来る。</p> <p>LispやHaskellやPythonの関数はファーストクラスのオブジェクトであり、なんら気兼ねなく関数の引数に渡すことが出来る。</p> <p>Pythonでも関数の呼び出しオペレータを定義したクラスを作ることが出来る。</p> <h4> 関数呼び出しの括弧</h4> <p>関数(メソッド)の呼び出しに</p> <ul> <li> たとえ引数がなくても括弧が必要派: Python</li> <li> たとえ引数がなくても括弧が必要、ただし外側にな、派: Lisp</li> <li> 引数がないときだけ括弧を省略できるよ派: D (thanks <a href="http://d.hatena.ne.jp/Dubhead/">id:Dubhead</a>)</li> <li> 括弧はいらないよ派: Perl, Ruby</li> <li> 括弧はいらないよ、引数が0個の関数?なにそれ定数じゃん派: Haskell</li> <li> 括弧はいらないよ、引数が0個の関数?引数に()を渡せ派: OCaml</li> <li> 関数はおろか演算子の結合順序を変える括弧もいらないよ、(1 + 2) * 3 は 1 2 + 3 * って書けよ派: Postscript, Forth</li> <li> 演算子の結合順序?計算は左からって決めればいいじゃん 1 + 2 * 3でいいよ派: Smalltalk</li> <li> 演算は右から順だよ派: APL, J (thanks: straggler)</li> </ul> <p>引数のない関数呼び出しに括弧がいらない、かつ関数がファーストクラスの言語では、逆に「その関数自体」を意味する式をつくるために新しい文法が必要になる。</p> <p>たとえばPythonでこう書けるところを:</p> <pre class="syntax-highlight"> >>> <span class="synStatement">def</span> <span class="synIdentifier">foo</span>(): ... <span class="synStatement">print</span> "<span class="synConstant">foo!</span>" ... >>> bar = foo >>> bar() foo! </pre> <p>Rubyではこう書く事になる</p> <pre class="syntax-highlight"> >> <span class="synPreProc">def </span><span class="synIdentifier">foo</span> >> p <span class="synSpecial">"</span><span class="synConstant">foo!</span><span class="synSpecial">"</span> >> <span class="synPreProc">end</span> => <span class="synConstant">nil</span> >> bar = <span class="synIdentifier">Object</span>.method(<span class="synIdentifier">:foo</span>) => <span class="synComment">#<Method: Class(Object)#foo></span> >> bar.call <span class="synSpecial">"</span><span class="synConstant">foo!</span><span class="synSpecial">"</span> => <span class="synConstant">nil</span> </pre> <h4> 演算子オーバーロード</h4> <p>C++では演算子の多重定義が可能である。たとえば「+」が再定義できる。これは乱用するととても読みにくいコードになる。</p> <p>Javaでは演算子の多重定義を許さないようにした。結果、独自定義のクラスについてx + yと書きたくてもx.add(y)と書かざるを得なくなり、プログラムの可読性を損ねる結果となった。</p> <p>PythonやRubyなどでは再び演算子の多重定義を許している。乱用するなよ、みんな大人でしょ、というスタンスである。</p> <h4> 多重継承</h4> <p>C++は任意のクラスを多重継承できる。これはたまたま同じシグニチャのメソッド実装が複数あった場合にどの実装が選ばれるのか、という問題を引き起こす。<span class="footnote"><a href="http://d.hatena.ne.jp/nishiohirokazu/#f2" name="fn2" title="菱形継承問題 - Wikipedia">*2</a></span></p> <p>Javaは実装を持ったクラスの継承は1つまでとすることでこの問題を回避した。実装を持たないクラス(インターフェイス)はいくつでも継承できる。しかしこれは「複数のクラスから実装を引き継げない」という不便さと引換である。Javaではこういうシチュエーションで、もっぱら実装のあるクラスFooへの参照を持っておいて自分のbarメソッドが呼ばれたらFooのbarメソッドを呼んでそっちに処理を任せるという書き方をする。</p> <p>Rubyは実装の継承を部分的に許すためにMix-inという概念を導入した。「インスタンスを作れず、クラスから継承もできない特殊なクラス」である「モジュール」をクラスに「混ぜ込む」構文を用意した。</p> <p>Pythonは多重継承をサポートして、メソッドの解決順序の決定にC3-Linearizationっていう比較的自然な結果が得られやすいアルゴリズムを採用して、「まあ、多重継承を乱用すると悲惨なことが起こるってみんな知ってるでしょ、大人でしょ、これで普通は問題起きないでしょ」というスタンスである。<span class="footnote"><a href="http://d.hatena.ne.jp/nishiohirokazu/#f3" name="fn3" title="PEP 283 -- Python 2.3 Release Schedule http://www.python.org/dev/peps/pep-0283/">*3</a></span></p> <br /> <h4> GC</h4> <ul> <li> GC必要でしょ、メモリのこと気にするのとかめんどくさいでしょ派: Lisp, Java, Python, Ruby, その他最近の言語のほとんど</li> <li> GCみたいなゆとりのための機能を入れて遅くなるとかありえん派: C</li> <li> GCみたいなゆとりのための機能を入れて遅くなるとかありえん、スマートポインタでだいたい用が済むだろ派: C++</li> <li> AutoreleasePoolでだいたい用は済むだろ、だけどやっぱりGCあった方が楽だよね派: Objective-C (thanks <a href="http://d.hatena.ne.jp/jmuk/">id:jmuk</a>)</li> <li> 普通はGCを使うけど必要ならmalloc/freeもできるよ派: D (thanks <a href="http://d.hatena.ne.jp/Dubhead/">id:Dubhead</a>)</li> <li> リージョン推論(region inference)試してみたけれど、リージョン推論だけでは速度が出なかった。なので GC も使う派: Haskell (thanks <a href="http://d.hatena.ne.jp/shelarcy/">id:shelarcy</a>)</li> </ul> <br /> <h4> 変数の初期化</h4> <ul> <li> 初期化が必要なら必要なときにプログラマがやればいい。デフォルトでやるなどというゆとりのための機能で遅くなるとかありえん派: C, C++</li> <li> 初期化されていない(値がなんだかわからない)変数の存在は危険なバグのもとであり許してはいけない、勝手に初期化しよう派: Java, D (thanks <a href="http://d.hatena.ne.jp/Dubhead/">id:Dubhead</a>)</li> <li> っていうか値を代入することでしか変数を作れないので未初期化の変数とかありえないし派: Python</li> <li> 未定義の変数に謎の値が入ってるのがダメなんだよ、「未定義」って値を入れとけばいいじゃん派: JS</li> </ul> <h4> グローバル変数</h4> <p>C言語はグローバル変数を定義できる。グローバル変数の乱用に起因する問題はプログラマの責任である。</p> <p>Javaではグローバル変数を定義できない。もしどこからでもアクセス可能なグローバル変数的なものが必要であれば、クラス名がどこからでもアクセス可能なことを利用する、というトリックがやはり場合により乱用されて問題を起こしたり。</p> <p>Pythonではグローバル変数を定義できるように見えるが、それはファイル単位のスコープである。グローバル変数を書き換えるには特別の「この関数はグローバル変数fooを書き換えるぞ」宣言が必要である。本当にどのファイルからでも参照できる変数が欲しければ__builtins__モジュールに動的に追加する。</p> <h4> 整除の丸め方向</h4> <p>C, C++では整数の除算が割り切れなかった場合に0方向に丸めるのかマイナス無限大方向に丸めるのかが環境依存である。つまり、-1/2は0にも-1にもなりえる。</p> <p>Javaでは常に0方向に丸める。C99も同様。</p> <p>Haskellでは整数同士を「/」で除算することはできない。divとquotという二つの整除関数がありdivが-1, quotが0を返す。</p> <h4> x / 0.0</h4> <p>x / 0.0 をエラーにすべきか否か</p> <p>Ruby1.8ではNaNやInfinityにする。</p> <p>Pythonでは例外を投げる。</p> <h4> 0xxx型の8進法リテラル</h4> <pre class="syntax-highlight"> >>> 1000 + 0100 + 0010 + 0001 1073 </pre> <ul> <li> 0100は64だよ派: Python2.*, Java, Scala</li> <li> 0o100と0O100は64だよ派: Python3.0, Haskell</li> </ul> <p>Haskellの仕様を見て大文字のOを許容するとかダメだろ、と思ったらPython3.0でも同じだった</p> <h4> long intのリテラルに小文字のエルを許す</h4> <p>大文字Oで思いついたので:</p> <pre class="syntax-highlight"> >>> 100l == 100 True </pre> <ul> <li> Yes: Python2.6</li> <li> No: D (>= 0.154 <a href="http://www.digitalmars.com/d/1.0/changelog2.html#new0154" target="_blank">http://www.digitalmars.com/d/1.0/changelog2.html#new0154</a> ) thanks <a href="http://d.hatena.ne.jp/hzkr/">id:hzkr</a></li> </ul> <h4> 整数演算の結果がintの範囲を超えたときに自動的に表現力の大きい型に変更する</h4> <p>Cで書かれたビット演算のコードとかを丸写しすると、「<<」で上位ビットが捨てられているようなところで長整数型に変わってしまって結果が合わないという罠。</p> <p>しかし数値をビットの塊として認識していない人にとっては「人間の都合で上限が定められていて、それを超えても例外を投げるでもなく変な値になるってのはおかしい」という主張もまあ一理ある。</p> <ul> <li>上限のない整数になるべきだ派: Python、Ruby</li> <li>勝手に変換するのはよくない派: C, Java</li> <li>ていうか整数なんてないし派: JS</li> <li>そもそも上限のない方がデフォルトだし派: Haskell</li> </ul> <h4> 変数への再代入を許すかどうか</h4> <ul> <li> え、当然許すよ何言ってんの派: Python</li> <li> 定数はあったほうがいいよね。大文字で始まるのは定数。まあ再代入しても警告しか出さないけど派: Ruby</li> <li> 再代入させたくないものだけconstとかfinalとかつけたらいいじゃん派: C++, Java</li> <li> 変数への再代入なんて諸悪の根源だ派: <ul> <li> だから一切認めないッッ派: Haskell</li> <li> でも完全に禁止すると実用的じゃないから書き込める場所を用意しましたor用意する方法を作りました派: Erlang, OCaml</li> </ul> </li> </ul> <h4> 演算子の優先順位について</h4> <p>Pascalでは加算演算子(+, -, orなど)は乗算演算子(*, /, andなど)より優先順位が低く、比較演算子(==, >など)はさらに低い。つまり 「4 + 1 * 2 == 3 * 2」は「(4 + (1 * 2)) == (3 * 2)」と解釈される。これは自然。しかし「0 < x and x < 9」は「0 < (x and x) < 9」になってコンパイルエラー</p> <p>他の多くの言語では条件演算子(and, or)が算術演算子(*, /, +, -など)より低い優先順位になっている。</p> <p>C では x == y & z が (x == y) & z となる(thanks @mametter)</p> <h4> 比較演算子の連続について</h4> <ul> <li> 0 < x && x <= 9とか頻出パターンだし複数の比較の連続で一つの式って構文にしようよ。 0 < x <= 9 って書けるよ派: Python</li> </ul> <h4> 単項演算子のマイナス</h4> <p>Haskellでは「f -1」が「f - 1」と解釈されるので「f (-1)」と書かなければいけない。逆に演算子の部分適用で(/ 2)は「2で割る関数」になるが(- 1)は-1と解釈される。</p> <p>SMLでは ~1、J言語では _1。</p> <h4> ループ</h4> <ul> <li> ループをするにはforとかwhileとかgotoとかいろいろな方法があるよ派: C</li> <li> gotoは悪だ、forとwhileだけでいいだろ派: Java</li> <li> 末尾再帰がジャンプに置き換えられるから再帰呼び出しでループするのもありだよ派: Lisp</li> <li> むしろループいらないよねmapとfoldlあるし派: Haskell</li> </ul> <h4> 空リストの型</h4> <p>Cambridge LCF の MLではかつてlet x = ref [] で polymorphic な \forall a. a list ref が作れた</p> <p>xにintの値を入れてからポインタとして取り出してアクセスすることができてしまう。</p> <p>SML '97 Types and Type Checking <a href="http://www.smlnj.org/doc/Conversion/types.html" target="_blank">http://www.smlnj.org/doc/Conversion/types.html</a></p> <p>thanks <a href="http://d.hatena.ne.jp/camlspotter/">id:camlspotter</a></p> <h4> インデントと実際の構造の不一致</h4> <p>C言語では下のようにif文を書くことができる。</p> <pre class="syntax-highlight"> <span class="synStatement">if</span> (x > <span class="synConstant">0</span>) when_x_is_positive(); </pre> <p>x > 0の時に別の処理を追加しようと考えてこんな書き方をしてはいけない</p> <pre class="syntax-highlight"> <span class="synStatement">if</span> (x > <span class="synConstant">0</span>) when_x_is_positive(); another_task(); </pre> <p>これは下のような意味であり、another_task()は常に実行される。</p> <pre class="syntax-highlight"> <span class="synStatement">if</span> (x > <span class="synConstant">0</span>) { when_x_is_positive(); } another_task(); </pre> <p>また下のコードにもインデントと構造の不一致がある。</p> <pre class="syntax-highlight"> <span class="synStatement">if</span> (x > <span class="synConstant">0</span>) <span class="synStatement">if</span> (y > <span class="synConstant">0</span>) all_positive(); <span class="synStatement">else</span> x_isnt_positive(); </pre> <p>x == -1の時にx_isnt_positive()は呼ばれない。代わりにx == 1, y == -1の時に呼ばれる。このコードは下のような構造である。</p> <pre class="syntax-highlight"> <span class="synStatement">if</span> (x > <span class="synConstant">0</span>) { <span class="synStatement">if</span> (y > <span class="synConstant">0</span>) { all_positive(); } <span class="synStatement">else</span> { x_isnt_positive(); } } </pre> <p>Cではプログラマが気をつけるか、braces {}を付けろ&正しくインデントしろというコーディング規約で回避する。</p> <p>Rubyではendで閉じる。</p> <p>Pythonでは発想を逆転してインデントをもとに構造を決める。下記のコードは見ためどおりに動く。</p> <pre class="syntax-highlight"> <span class="synStatement">if</span> x > 0: <span class="synStatement">if</span> y > 0: all_positive() <span class="synStatement">else</span>: x_isnt_positive() </pre> <p>QuickBASICやHMMMML<span class="footnote"><a href="http://d.hatena.ne.jp/nishiohirokazu/#f4" name="fn4" title=" http://miyashita.com/HMMMML.pdf ">*4</a></span>では他の言語における「end」や「}」でのブロック終了がどのブロックの終了であるのか分かりにくい点を改善するため「If ~ End If」(QB)「</if>」(HMMMML)などを用いる。</p> <h4> レシーバの受け取り方</h4> <p>obj.method(arg)的なコードを実行したときにmethodの中ではどうやってobjにアクセスするのかと言う話</p> <ul> <li> レシーバは明示的に仮引数として受け取る派: Python, C (thanks @mametter)</li> <li> メソッド内でanother_method()がobj.another_method()を意味しているのでレシーバを意識する必要はないけどレシーバ自体をどうこうしたい時にはthisに入っているよ派: Java</li> <li> レシーバ?それ単なる引数だろ、特別なものじゃないじゃん派: Common Lisp with CLOS, Haskell</li> </ul> <h4> 文字列オブジェクトは破壊的に変更できるか?</h4> <ul> <li> はい: Ruby, C++</li> <li> いいえ: Python, Java</li> <li> 文字列?なにそれ?char*のこと?: C</li> </ul> <h4> 文字列と数値を自動変換するか?</h4> <p>PHPの場合</p> <pre> $ php -r 'print "1" + "2";' 3 $ php -r 'print "1" . "2";' 12 $ php -r 'print "1" . 2;' 12 $ php -r 'print "1" + 2;' 3 </pre> <p>Perlも同じ</p> <ul> <li> 文字列と数値は自動的に変換するよ、だから文字列の結合と数値の足し算は別の演算子だよ派: Perl, PHP</li> <li> それは型エラーにするよ派: Python, Ruby</li> <li> 数値に限らずオブジェクトは自分の文字列化の方法を知っているはず(toString)だから文字列への変換はしてもいいんじゃない?派: Java</li> </ul> <h4> 1/2は何になる?</h4> <ul> <li> 整数の0だよ派: Python2.*, Ruby, OCaml</li> <li> 浮動小数点数の0.5だよ派: Python3.*</li> <li> 有理数の1/2だよ派: Scheme</li> <li> 念のために確認するとその1や2ってのは Int じゃなくて (Num a) => a だよな?だったら計算結果は(Fractional a) => a だな。これは浮動小数点数と有理数のどちらでもありうる型クラスで、どちらになるかは型推論で決まる。ちなみに推論によって決定できないときにはDefaultingと(省略されました。続きを読むには<a href="http://www.haskell.org/onlinereport/decls.html#sect4.3.4">こちら</a>): Haskell</li> </ul> <h4> オブジェクト指向</h4> <ul> <li> データと手続きを分けて管理するのは面倒だから、ひとまとめにしたオブジェクトとかクラスとかあると幸せになるんじゃない?: Simula</li> <li> すべてはオブジェクトとその間のメッセージのやりとりで表現できるんだよ!メッセージ!メッセージ!: Smalltalk</li> <li> なにそれ遅い…: C</li> <li> ふむ、Simulaのクラスって概念はいいものだ。採用!要するにstructで既存の型を組み合わせて新しい型を作ってたのの延長で、そこに関数も組み合わせてひとかたまりにできればいいわけだよね。あ、あと継承ね。これも便利。採用!アクセス制限?ふむ、これもいれとくか。メッセージ?…なにそれおいしいの?: C++</li> <li> プログラミングとはクラスを定義してオブジェクトを作ることなんだよ!オブジェクト!オブジェクト!え?プリミティブ型はオブジェクトじゃないじゃんって?えっと、まあ、それはそのパフォーマンスのためとかさ(ごにょごにょ): Java</li> <li> じゃじゃーん、整数とかもオブジェクトにしたよ!プリミティブ型も自動でオブジェクトに変換するよ!オブジェクト!オブジェクト!: Java 5</li> <li> っていうか要するにデータを持っておくハッシュと、関数の入っているモジュールを貼り合わせる手段があればいいだけだよね: Perl</li> <li> そもそも関数がファーストクラスのオブジェクトならハッシュにだって入るじゃん。これでいいんじゃない?: JavaScript</li> <li> そもそも名前空間自体が辞書(ハッシュ)だよね。手軽に名前空間を作れて関数を入れられて、ついでに継承とかメソッドとインスタンスのバインディングとか便利な機能がついてくる!これでよし!: Python</li> <li> privateとかいらないよねー派: Perl, JavaScript, Python</li> <li> 世間のスクリプト言語がprivateを軽視しすぎ!許せん!派: Ruby</li> </ul> <h4> 真偽値</h4> <ul> <li> 真と偽の値はこちらが用意する。それ以外を条件式に入れたら型エラーだぞ派: Java, Haskell</li> <li> 0がfalse、それ以外は真だよ派: C</li> <li> #fが偽、それ以外は(0も)真だよ派: Scheme</li> <li> falseとnilが偽、それ以外は(0も)真だよ派: Ruby</li> <li> falseとnullとundefinedと0と空文字列とNaNが偽だよ: JavaScript</li> <li> FalseとNoneと0なオブジェクトと空のオブジェクトが偽だよ: Python <span class="footnote"><a href="http://d.hatena.ne.jp/nishiohirokazu/#f5" name="fn5" title=" http://www.python.jp/doc/2.4/lib/truth.html ">*5</a></span></li> </ul> <h4> 配列の範囲外アクセス</h4> <ul> <li> 何か適当なものを返す: Ruby(nil), JavaScript(undefined)</li> <li> 例外を投げる: Python, Java</li> <li> 死ぬかも知れない: C</li> </ul> </div> <div class="footnote"> <p class="footnote"><a href="http://d.hatena.ne.jp/nishiohirokazu/#fn1" name="f1">*1</a>:<a href="http://twitter.com/HomeiMiyashita/status/19575507867" target="_blank">http://twitter.com/HomeiMiyashita/status/19575507867</a></p> <p class="footnote"><a href="http://d.hatena.ne.jp/nishiohirokazu/#fn2" name="f2">*2</a>:<a href="http://ja.wikipedia.org/wiki/%E8%8F%B1%E5%BD%A2%E7%B6%99%E6%89%BF%E5%95%8F%E9%A1%8C">菱形継承問題 - Wikipedia</a></p> <p class="footnote"><a href="http://d.hatena.ne.jp/nishiohirokazu/#fn3" name="f3">*3</a>:PEP 283 -- Python 2.3 Release Schedule <a href="http://www.python.org/dev/peps/pep-0283/" target="_blank">http://www.python.org/dev/peps/pep-0283/</a></p> <p class="footnote"><a href="http://d.hatena.ne.jp/nishiohirokazu/#fn4" name="f4">*4</a>: <a href="http://miyashita.com/HMMMML.pdf" target="_blank">http://miyashita.com/HMMMML.pdf</a> </p> <p class="footnote"><a href="http://d.hatena.ne.jp/nishiohirokazu/#fn5" name="f5">*5</a>: <a href="http://www.python.jp/doc/2.4/lib/truth.html" target="_blank">http://www.python.jp/doc/2.4/lib/truth.html</a> </p> </div>
04:30:39
<div class="section"> <p>もうちょっと早く着手すべきだったなー。締切りを知った時点で締め切りが一週間後という。</p> <p>公平性を重んじて偏りがないように慎重に書くよりも、炎上しそうなことを勢いで書いてしまって反論を受けて修正する方がスピードは速いわけだが、うむむ。</p> </div>
00:29:50
<div class="section"> <h4> gnuplotの使い方</h4> <ul> <li> fit a*(x**b) "data.txt" via a, b</li> <li> plot a*(x**b) "data.txt"</li> <li> using (log ($1)):(log ($2))</li> <li> set log x</li> <li> unset log x</li> </ul> <h4> GC</h4> <ul> <li> GCは想像以上にいろいろな処理のオーダーに影響を与える</li> </ul> <h4> 事実と解釈</h4> <p>他人と解釈が食い違う場合、特に自分がある事実Xを見て解釈している場合に、相手は事実を見ていないんじゃないか、と思い込みがちだが、別の事実Yを見ている可能性もある。非生産的な議論を避けるためには速やかに事実を共有する必要がある。</p> </div>
00:27:50
<div class="section"> <p>前日話の流れを時系列でまとめかけたけど、もはや情報量が多すぎて流れを追っていなかった人にとってはキャッチアップが困難かと思うので改めてまとめてみる。(情報量の多いほうがいい人はこちら: <a href="http://d.hatena.ne.jp/nishiohirokazu/20100720/1279595270">続:Haskellのfibが遅い件</a>)</p> <br /> <p>Haskellでフィボナッチ数列を定義する方法としては</p> <pre class="syntax-highlight"> fib <span class="synStatement">=</span> <span class="synConstant">1</span><span class="synStatement">:</span><span class="synConstant">1</span><span class="synStatement">:</span>zipWith (<span class="synStatement">+</span>) fib (tail fib) </pre> <p>が有名であり、Wikipediaには「次の定義は線形時間でフィボナッチ数列のリストを生成する」と紹介されている。しかし、少なくとも n = 10000 〜 300000 くらいの範囲ではO(n^2.6)くらいの計算時間が掛かっていて、事実に反する。 (グラフはこちら: <a href="http://shinh.skr.jp/m/?date=20100719#p01">はじめてのにき(2010-07-19)</a>)</p> <br /> <p>2.6という値がどこから出てきたのか?これはGCにO(n^3)くらいの時間がかかっていて、それが小さい係数で本来の計算時間O(n^2)に混ざっているため、O(n^2.6)ぐらいに見えている。</p> <br /> <p>なぜGCにO(n^3)ぐらいの時間がかかるのか?HaskellのGCは世代別GCであり、固定長のマイナーヒープがいっぱいになるとGCを始める。このとき、スタック上のオブジェクトはGCのルートとして使われるのでスタックの深さをmとしたときにO(m)の時間がかかる。今回のケースでは、スタックの深さをmとした場合にO(m)のメモリを確保するので、i回目のGCが起きたときの消費時間mは係数無視してi^0.5になり、これをiについて足しあわせるので積分してi^1.5になり、iがいくらまで増えるかというとメモリの消費量をマイナーヒープのサイズで割ったものだから係数無視してn^2なので、これを代入してn^3になる。というわけでGCの計算量はO(n^3)になる。</p> <br /> <p>この挙動はGHC 6.10.1以前では再現しないので、6.10.2で行われたGCに関する修正(<a href="http://hackage.haskell.org/trac/ghc/ticket/2747">#2747 (Excessive Memory Usage: space leak with foldl' on Integer) – GHC</a>)が原因と思われる。6.10.1ではnの2乗くらいのオーダーになるらしい。</p> <br /> <p>また、「スタックの上に大量の巨大なIntegerがある状況」が問題を引き起こしているので、Haskellでも素朴に末尾再帰で書けばO(n^2)になる。計算順序によっても挙動が変わる(<a href="http://d.hatena.ne.jp/mkotha/20100623/1277286946">無限リストを使っているfibでは30万番目を取るより30万番目までの和を取るほうが速い</a>)し、評価戦略でも変わる(<a href="http://d.hatena.ne.jp/kazu-yamamoto/20100624/1277348961">正格評価するzipWith'を作れば速い</a>)</p> <br /> <p>無限リストが絡むことで見かけが複雑になっているので、よりシンプルな「末尾再帰でない再帰呼び出しでnに比例して大きくなるメモリを確保しようとしたときにO(n ^ 2.6)の時間がかかる」事例(<a href="http://d.hatena.ne.jp/nishiohirokazu/20100721/1279687613">Haskellで単にn回7を掛けるだけでもO(n ^ 2.6)の時間がかかる</a>)を先に見たほうが分かりやすいのかも知れない</p> <br /> <p>「Haskellが遅い」という主張にエアリーディングした人もいたようだが、あくまで「fib = 1:1:zipWith (+) fib (tail fib)が遅い(n = 100000ではPythonで素朴にループで書いたコードよりも!)」ということなので勘違いなさらないよう。実際最初のエントリーでも素朴な末尾再帰で書いて速くなってるわけだし。</p> <br /> <br /> <p>こんな感じですかね。なんか間違っていたらご指摘よろしくお願いします。</p> </div>
23:49:28
こんにちわ、情弱です。 村崎百郎が殺されて少し動揺しています。 話は変わって。。。 perlなどは$0でプロセス名を変えたりできて便利ですよね。 でpythonではできるの?って話です。 ダメかと思ったが一応できるっぽい。 誰も書いてなさそうなので書いておきます。 PyObjec
09:00:00
<div class="section"> <p>レガシーコード := テストがないコード</p> <p>テストを作成するためには対象とするクラスから他のクラスへの影響を把握する必要がある。依存関係を排除しておけばニセのクラスを突っ込んで影響を直接観察できる。</p> <p>テストをするたびに本番コードを編集するわけには行かない、なのでコードを編集せずにテストに不都合な挙動を変えられる場所が必要である。これをseamという。どのseamも、その挙動を変更するenabling pointを持っている。</p> <p>日本語で「接合部」っていうとくっつけることに意識が向きがちだけど「そこで切り離せる」というほうが重要なのだな。</p> <h4>既存のレガシーコードに機能追加をする方法</h4> <p>1: スプラウトメソッド</p> <p>テストされてない既存のコードに書き足すのではなく、新しいメソッドを作ってそれを呼び出すようにし、その新しいメソッドにテストを書く</p> <p>2: ラップメソッド</p> <p>テストされていない既存のメソッドの前か後ろに処理を付け足す場合、テストされていないメソッドの名前を変えて、元の名前で古いメソッドと新しく追加する機能の入ったメソッドを呼び出すようにし、その新しいメソッドをテストする。</p> <h4>TDD</h4> <ul> <li>1: 失敗するテストを書く</li> <li>2: コンパイルが通るようにする</li> <li>3: テストを通過させる。この時既存のコードをなるべく変更しない。「これはFooメソッドとほとんど同じで一部だけ違うから抽象化しよう」と考えずにFooメソッドをコピペして作る。抽象化はリファクタリングなのでテストに通ってから。</li> <li>4: コードをきれいにする</li> <li>5: 1に戻る</li> </ul> <h4>Liscovの置換原則</h4> <p>サブクラスYのオブジェクトはいつでもスーパークラスXのオブジェクトとして使えなければならない。さもないとユーザがあるX型の変数に入っているオブジェクトが実際にはY型であることを意識しなければいけないようになってしまう。</p> <h4>Nullを渡す</h4> <p>Javaのような実行時のnullに対するアクセスを察知できる言語なら、テスト用に作るのが面倒なオブジェクトが必要なときに単にnullを渡せばいい。必要なものは必要になったときに例外で教えてくれる。</p> <h4>影響の調査の仕方</h4> <p>影響スケッチを描く</p> <p>変数と戻り値が変わる可能性のあるメソッドをまるで囲む。影響を矢印で書く。</p> <p>よく設計されていればこれはシンプルになるはず。</p> <h4>_</h4> <p>依存性の排除によってカプセル化が壊れるケースがある。たとえばprivateを外すとクラスの中だけ調査していれば依存性を把握できたのが、パッケージ全体を見なければいけなくなったりする。依存性の排除はテストを書きやすくするための手段であり、目的ではない。同様にカプセル化も依存性をおいやすくするための手段であり目的ではない。著者はテストを優先する。</p> <h4>_</h4> <p>サードパーティのライブラリを直接呼んでいる部分はseamにできたはずのところ。サードパーティライブラリに密結合なせいでテストが出来ないとか本末転倒。ラッパーなどを使って疎結合にする。</p> <p>後半の具体例は斜め読みできないから今度じっくり読もう。</p> <p></p> </div>
19:16:50
EuroPythonで聞いた,OperaのBruce Lawsonさんのキーノートに出てきた話題。 OperaがMAMAというHTMLマークアップの構造を専門にあつかうクローラーを作って,世界中のHTMLを読んで解析したところ,HTMLで最もよく使わ...
18:49:59
今年はEuroPythonの前に日程を取って,ロンドンと近郊を観光してきた。連れの人と時間をあわせて休みを取って,二人で観光してきた:-D。 ホテルは中の上くらいのランクのところを取ったんだけど,部屋がうまく予約されていなかったからか,ダブルの部屋か...
17:52:06
<div class="section"> <p>僕がテキストデータとして持っている物をFAXで遅れという電話がかかってきたがFAXなんて持ってないし。というわけで検索してみてこういうサービスを発見:</p> <p><a href="http://internet.watch.impress.co.jp/docs/column/biz_tool /20090617_294353.html">【ビジネスに役立つ無料ツール】 Webブラウザから無料でFAX送信! 41カ国に送信可能な「MyFax Free」 -INTERNET Watch</a></p> <p>ちゃんと送れるかどうか不安だったけど(プレビューもないし)ちゃんと送れたようだ。2枚送られてきたと言われてびっくりしたが単にサイズが合わなくて2枚にわかれたってことだそうな。ちゃんと届いたか質問したが、受け取った側の人が「FAXの機械を使わずにブラウザから送信した」ってことを理解するのに時間がかかった。まあそれくらい特に変なところもなく送られたってことか。あとブラウザは専門用語なのでインターネットって言わないと通じないんだね!</p> </div>
12:00:00
<img src="http://takanory.net/takalog/images/2010-06-19%2013.05.12.jpg/image_mini" alt="Faith のチーズバーガー" title="Faith のチーズバーガー" height="150" width="200" /> <img src="http://takanory.net/takalog/images/2010-06-19%2020.22.33.jpg/image_mini" alt="Yotsuya Brewery が Trending Now" title="Yotsuya Brewery が Trending Now" height="200" width="150" /> <p>一ヶ月以上前のことですが、今週末は <a class="reference" href="http://atnd.org/events/5844">(第13回)Zope/Plone開発勉強会</a> だったりするので、宣伝を兼ねて前回の勉強会のことを書こうと思います。</p> <p><strong>やること</strong></p> <p>参加者のやること発言はこんな感じ。</p> <ul class="simple"> <li><a class="reference" href="http://twitter.com/shimizukawa">@shimizukawa</a> xdv の魅力を140文字で語る</li> <li><a class="reference" href="http://twitter.com/ytakeuch">@ytakeuch</a> <a class="reference" href="http://grok.zope.org/">grok</a> する</li> <li><a class="reference" href="http://twitter.com/takanory">@takanory</a> Plone Developer Manual の翻訳 と Mercurial + bitbucket でバージョン管理 <a class="reference" href="http://collective-docs.plone.org/index.html">http://collective-docs.plone.org/index.html</a></li> <li><a class="reference" href="http://twitter.com/tk0miya">@tk0miya</a> iPad を開発する(例: 水芸アプリ)</li> <li><a class="reference" href="http://twitter.com/zenich">@zenich</a> RapidCMS という SMS コミュニケーション用フレームワークを触ってみる <a class="reference" href="http://www.rapidsms.org/">http://www.rapidsms.org/</a></li> <li><a class="reference" href="http://twitter.com/terapyon">@terapyon</a> タスクトラッカーを作る(Plone で Archetypes ベース)</li> </ul>
01:30:16
先日の続き。<br />※ cassandraはmacportsで入れています。<br /><br /><pre name="code" class="sh">$ cd /opt/local/share/java/cassandra/interface/<br />$ thrift -gen py:new_style -o /tmp/pycassandra/ cassandra.thrift<br /></pre><br />これでpythonモジュールが出力されます。<div class="blogger-post-footer"><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/7544468520080751654-8304256828438476148?l=blog.liris.org" alt="" /></div>
15:08:48
<div class="section"> <p>追記: このタイトルはミスリーディングで、きっちり末尾再帰にすればO(n ^ 2)になります。</p> <p><hr /></p> <blockquote> <p>k.inaba (略) とりあえず多倍長とGCと原因切り分けませんか</p> </blockquote> <p><a href="http://shinh.skr.jp/m/?date=20100721#c01" target="_blank">http://shinh.skr.jp/m/?date=20100721#c01</a></p> <p>ということでとりあえず多倍長計算だけしてみた。(追記: これじゃ末尾再帰じゃないからスタックが伸びていってしまうじゃん、と指摘された。光成さんの末尾再帰版のコードではO(n^2)になった。下の方に自分で書いた末尾再帰版を追記。)</p> <pre class="syntax-highlight"> <span class="synPreProc">import</span> System pow <span class="synStatement">::</span> Integer <span class="synStatement">-></span> Integer pow <span class="synConstant">0</span> <span class="synStatement">=</span> <span class="synConstant">1</span> pow n <span class="synStatement">=</span> (<span class="synConstant">7</span> <span class="synStatement">*</span>) <span class="synStatement">$!</span> pow (n <span class="synStatement">-</span> <span class="synConstant">1</span>) main <span class="synStatement">=</span> <span class="synStatement">do</span> args <span class="synStatement"><-</span> getArgs print <span class="synStatement">$</span> (<span class="synConstant">0</span> <span class="synStatement">*</span>) <span class="synStatement">$</span> pow <span class="synStatement">$</span> read <span class="synStatement">$</span> args <span class="synStatement">!!</span> <span class="synConstant">0</span> </pre> <p><img src="http://gyazo.com/b05002c23736607043a43d3e6c6f3ea5.png" /></p> <p>ここでf(x) = (x ** a) * b, g(x) = c * x * xで、X軸はコマンドライン引数で与えるn、Y軸は処理にかかった秒数。下記のように作成した。</p> <pre> gnuplot> f(x) = (x ** a) * b gnuplot> fit f(x) "result.txt" via a, b (..snip..) Final set of parameters Asymptotic Standard Error ======================= ========================== a = 2.60015 +/- 0.09175 (3.529%) b = 2.3844e-13 +/- 2.772e-13 (116.3%) (..snip..) gnuplot> g(x) = x * x * c gnuplot> fit g(x) "result.txt" via c (..snip..) c = 4.1331e-10 +/- 1.394e-11 (3.373%) (..snip..) gnuplot> plot f(x), g(x), "result.txt" </pre> <p>なおGHC 6.10.4を使った。</p> <p>GCプロファイルとやらもやってみるか。</p> <pre> ./a.out 200000 +RTS -s 0 7,493,614,152 bytes allocated in the heap 644,664 bytes copied during GC 2,084,040 bytes maximum residency (2 sample(s)) 1,049,272 bytes maximum slop 5 MB total memory in use (1 MB lost due to fragmentation) Generation 0: 13674 collections, 0 parallel, 4.83s, 5.02s elapsed Generation 1: 2 collections, 0 parallel, 0.00s, 0.00s elapsed INIT time 0.00s ( 0.00s elapsed) MUT time 7.14s ( 7.35s elapsed) GC time 4.83s ( 5.02s elapsed) EXIT time 0.00s ( 0.00s elapsed) Total time 11.97s ( 12.37s elapsed) %GC time 40.4% (40.6% elapsed) Alloc rate 1,050,088,044 bytes per MUT second Productivity 59.6% of total user, 57.7% of total elapsed </pre> <p>GCが処理時間の40%を食っていることはわかった。他の見所がよくわからない。</p> <p><hr /></p> <p>こう書き換えてみる。多倍長演算ではあるが、桁数がO(n)で増えていかないようにしたのだ。</p> <pre class="syntax-highlight"> pow n <span class="synStatement">=</span> (<span class="synConstant">77777777777777777777</span> <span class="synStatement">+</span>) <span class="synStatement">$!</span> pow (n <span class="synStatement">-</span> <span class="synConstant">1</span>) </pre> <p>実行時間が短くて、イニシャルコストがグラフ上ではっきり見えるくらいあるのはフィッティングとしてどうなのかという気がするが、まあO(n ^ 2.6)じゃなくてO(n ^ 2)だと言っていいだろう。え?O(n ^ 2)???</p> <p><img src="http://gyazo.com/2491f32530d083c58e8b657623d31452.png" /></p> <pre> a = 1.99989 +/- 0.114 (5.703%) b = 2.13455e-12 +/- 3.064e-12 (143.5%) c = 2.13161e-12 +/- 4.891e-14 (2.295%) </pre> <p>GCにはあんまり差がない。</p> <pre> ./a.out 200000 +RTS -s 0 28,422,680 bytes allocated in the heap 6,416 bytes copied during GC 2,084,040 bytes maximum residency (2 sample(s)) 1,048,824 bytes maximum slop 5 MB total memory in use (1 MB lost due to fragmentation) Generation 0: 45 collections, 0 parallel, 0.02s, 0.02s elapsed Generation 1: 2 collections, 0 parallel, 0.01s, 0.01s elapsed INIT time 0.00s ( 0.00s elapsed) MUT time 0.05s ( 0.06s elapsed) GC time 0.03s ( 0.03s elapsed) EXIT time 0.00s ( 0.00s elapsed) Total time 0.08s ( 0.09s elapsed) %GC time 35.1% (33.7% elapsed) Alloc rate 538,644,986 bytes per MUT second Productivity 64.0% of total user, 59.0% of total elapsed </pre> <p>Haskell難しいなぁ。よくわからない。</p> <p><hr /></p> <p>最初のコードは末尾再帰じゃないじゃないかと指摘されたので書きなおしてみたらO(n ^ 2)になりました。</p> <pre class="syntax-highlight"> <span class="synPreProc">import</span> System pow <span class="synStatement">::</span> Integer <span class="synStatement">-></span> Integer <span class="synStatement">-></span> Integer pow x <span class="synConstant">0</span> <span class="synStatement">=</span> x pow x n <span class="synStatement">=</span> pow (<span class="synConstant">7</span> <span class="synStatement">*</span> x) (n <span class="synStatement">-</span> <span class="synConstant">1</span>) main <span class="synStatement">=</span> <span class="synStatement">do</span> args <span class="synStatement"><-</span> getArgs print <span class="synStatement">$</span> (<span class="synConstant">0</span> <span class="synStatement">*</span>) <span class="synStatement">$</span> pow <span class="synConstant">1</span> <span class="synStatement">$</span> read <span class="synStatement">$</span> args <span class="synStatement">!!</span> <span class="synConstant">0</span> </pre> <p><img src="http://gyazo.com/745d7da01d245b3dc211fa965db2ad82.png" /></p> </div>
13:46:53
<p>先週開催されていた <a class="reference" href="http://www8.ric.co.jp/expo/wj/">ワイヤレスジャパン2010</a> の <a class="reference" href="http://www8.ric.co.jp/expo/wj/conference.html#WC3">Android アプリ開発講座</a> という有料のプログラムに知り合いが出られなくなったということで代わりに話を聞いてきました。</p> <p>以下はその知り合いにも見てもらう意味も含めて書いたメモです。</p> <ul class="simple"> <li>開始前に諸注意。録音、録画、Ustream等での動画配信、写真撮影の禁止とのアナウンス。Ustreamって。</li> </ul> <div class="section" id="id2"> <h3><a name="id2">アンドロイドアプリのマルチ端末対応 - 画面レイアウト編</a></h3> <ul class="simple"> <li><a class="reference" href="http://www.c-lis.co.jp/">C-LIS</a> の有山 圭二さん</li> <li>MoreLocale 2、近藤昭雄シリーズ(憂鬱、退屈)、薬検索とか作っている人</li> <li>発表資料とサンプルコードは <a class="reference" href="http://dev.c-lis.co.jp/20100716-WJ.zip">http://dev.c-lis.co.jp/20100716-WJ.zip</a> からダウンロード可能</li> <li>とりあえずざくっと Android の基本的な説明</li> <li>Android の端末はたくさんあるので、一つのバイナリで複数の端末に対応する必要がある</li> </ul> <div class="section" id="id3"> <h4><a name="id3">Androidの画面設計</a></h4> <ul class="simple"> <li>画面に表示するテキストとか画像とかの部品はリソースとしてリソースマネージャーが管理する</li> </ul> <!-- csv-table: "リソースグループ", "説明" anim, アニメーション定義 color, 色定義 drawable, 画像データ layout, 画面定義 menu, メニュー定義 raw, その他のデータ values, 文字列、配列、スタイル等 xml, その他xml --> <ul> <li><p class="first">リソース修飾子はディレクトリに <tt class="docutils literal"><span class="pre">-修飾子</span></tt> という形で指定する</p> </li> <li><p class="first">複数のリソース修飾子を指定することが可能</p> </li> <li><p class="first">設定可能なリソース修飾子の一覧は <a class="reference" href="http://developer.android.com/guide/topics/resources/providing-resources.html">Providing Alternative Resources</a> を参照。</p> </li> <li><p class="first">多言語対応の場合は <tt class="docutils literal"><span class="pre">values/strings.xml</span></tt> と <tt class="docutils literal"><span class="pre">values-ja/strings.xml</span></tt> を作成することで実現できる。</p> </li> <li><p class="first">言語によって入力フィールドを変えたい場合は <tt class="docutils literal"><span class="pre">layout</span></tt> と <tt class="docutils literal"><span class="pre">layout-ja</span></tt> のような形で実現できる。</p> <div class="line-block"> <div class="line">→感想: あんまり言語によって入力フィールドを変えるとかはやらない方がいいと思うけど...</div> </div> </li> <li><p class="first">リソースマネージャーは指定されたリソースIDと環境、設定を元にして最適なリソースを返す処理をする。(なかった場合はデフォルトを返す)</p> </li> </ul> </div> <div class="section" id="id4"> <h4><a name="id4">リソース修飾子を使った解像度別の画面設計</a></h4> <ul> <li><p class="first">解像度の異なる端末への対応は以前は解像度を直接指定してた</p> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> <tr class="field"><th class="field-name">layout-480x320:</th><td class="field-body"><p class="first last">HT-03A</p> </td> </tr> <tr class="field"><th class="field-name">layout-800x480:</th><td class="field-body"><p class="first last">HTC Desire</p> </td> </tr> <tr class="field"><th class="field-name">layout-854x480:</th><td class="field-body"><p class="first last">Xperia, IS-01</p> </td> </tr> </tbody> </table> </li> <li><p class="first">この指定方法は非推奨で、ドキュメントからも削除された</p> </li> <li><p class="first">推奨される画面の指定方法</p> <ul class="simple"> <li>スクリーンサイズ(-small/normal/large)</li> <li>ピクセル密度(-mdpi(160)/hdpi(240)/ldpi(120))</li> <li>アスペクト比(-notlong(4:3)/-long)</li> <li>画面の向き(-port/-land)</li> </ul> </li> <li><p class="first">これらの組み合わせでも実際の解像度は認識できない→レイアウトの工夫でどうにかする</p> </li> <li><p class="first">相対指定</p> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> <tr class="field"><th class="field-name">fill_parent:</th><td class="field-body"><p class="first last">親要素一杯にする</p> </td> </tr> <tr class="field"><th class="field-name">wrap_content:</th><td class="field-body"><p class="first last">コンテンツの大きさに合わせる</p> </td> </tr> </tbody> </table> </li> <li><p class="first">絶対指定→px は使わない方がいいよ</p> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> <tr class="field"><th class="field-name">px:</th><td class="field-body"><p class="first last">ピクセル指定</p> </td> </tr> <tr class="field"><th class="field-name">dp:</th><td class="field-body"><p class="first last">ピクセル密度に合わせる</p> </td> </tr> <tr class="field"><th class="field-name">sp:</th><td class="field-body"><p class="first last">ピクセル密度とフォントサイズに</p> </td> </tr> </tbody> </table> </li> <li><p class="first">Style リソースで表示する要素のサイズや色を指定することができる。CSS っぽい感じ</p> <div class="line-block"> <div class="line">→Style の継承も可能</div> </div> </li> <li><p class="first">AndroidManifest.xml に対応する画面サイズの指定を書かないとマーケットに出てこないよ</p> </li> </ul> </div> <div class="section" id="id5"> <h4><a name="id5">新しい端末に備えて...</a></h4> <ul class="simple"> <li>デフォルトのリソースを活用</li> <li>SDK ドキュメントのリソースに関する記述(英語だけど)をチェック</li> </ul> </div> </div> <div class="section" id="id6"> <h3><a name="id6">アンドロイドアプリのマルチ端末対応 - コード編</a></h3> <div class="section" id="id7"> <h4><a name="id7">最適なロケーション・プロバイダーを選択する</a></h4> <ul> <li><p class="first">ロケーションプロバイダー: 位置情報を取得する情報元</p> </li> <li><p class="first">条件を指定して、最も良いロケーションプロバイダーを取得する</p> </li> <li><p class="first">検索条件</p> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> <tr class="field"><th class="field-name">Accuracy:</th><td class="field-body"><p class="first last">取得する位置情報の精密度(FINE・COARSE)</p> </td> </tr> <tr class="field"><th class="field-name" colspan="2">AltitudeRequired:</th></tr> <tr><td> </td><td class="field-body"><p class="first last">高度情報が必要→基地局とかは高度が取れない</p> </td> </tr> <tr class="field"><th class="field-name" colspan="2">BearingRequired:</th></tr> <tr><td> </td><td class="field-body"><p class="first last">方向情報が必要</p> </td> </tr> <tr class="field"><th class="field-name">SpeedRequired:</th><td class="field-body"><p class="first last">スピード情報が必要</p> </td> </tr> <tr class="field"><th class="field-name">CostAllowed:</th><td class="field-body"><p class="first last">位置情報の取得に費用がかかるのを認める</p> </td> </tr> <tr class="field"><th class="field-name" colspan="2">PowerRequirement:</th></tr> <tr><td> </td><td class="field-body"><p class="first last">消費電力(高・中・低)</p> </td> </tr> </tbody> </table> </li> </ul> </div> <div class="section" id="id8"> <h4><a name="id8">縦横切り替えを処理する</a></h4> <ul class="simple"> <li>縦横切替時には一旦 Activity が終了する</li> <li>onSaveInstanceState で状態を保存する</li> <li>Activity の復帰時に onRestoreInstanceState で保存されたものを取得する</li> <li>縦横切り替えでエラーが出る場合は AndroidManifest.xml に android:configChanges を書くと対処できるけど、あんまりおすすめではない。</li> </ul> </div> <div class="section" id="id9"> <h4><a name="id9">様々なテスト環境を作成する</a></h4> <ul class="simple"> <li>仮想デバイス(AVD)でテストする</li> <li>いろいろ指定できる</li> </ul> </div> <div class="section" id="id10"> <h4><a name="id10">解像度に依存しない画像素材を作る</a></h4> <ul class="simple"> <li>Draw 9-patch</li> <li>画像を 3x3 に分割して、拡大したときにきたなくならないようにする</li> <li>コンテンツの領域を決めると文字列がきちんと表示される</li> <li>Android の SDK に入っている <tt class="docutils literal"><span class="pre">tools/draw9patch.bat</span></tt> を実行する</li> </ul> </div> <div class="section" id="id11"> <h4><a name="id11">質疑応答</a></h4> <ul> <li><p class="first">言語リソースを管理しやすくするツールとか方法があるのか?</p> <div class="line-block"> <div class="line">→支援するツールは存在しない。言語によって順番が変わる(日付とか)ところとかの置き換えはサポートされている。</div> <div class="line">→男性、女性とかの対応はできないと言われた。</div> </div> </li> <li><p class="first">Android の開発とマーケットと iPhone の開発との違いは?</p> <div class="line-block"> <div class="line">→iPhone で開発したことはないので実際のところはわからない</div> </div> </li> <li><p class="first">Google Maps とかが乗っている端末は CTS (Compatibility Test Suite)に規定された試験を通っている</p> <div class="line-block"> <div class="line">→IS01の右側にメニューが出ているのは CTS を通すために画面サイズを小さくするためとのこと(へー)</div> </div> </li> <li><p class="first">各OSで書いたときにきちんと動くのか?</p> <div class="line-block"> <div class="line">→下位互換性はあることになっているが OS 1.5 で書いたは 1.6 で動作しない場合もある。ただその時は CTS がなかった。</div> </div> </li> </ul> </div> <div class="section" id="id12"> <h4><a name="id12">感想</a></h4> <ul class="simple"> <li>なんとなく、どんな端末でも動作する Android アプリを作るためのポイントはわかった</li> <li>そうは言っても、そもそも Android のアプリを作ったことがないので、まずはそこからなかなと...</li> <li>Draw 9-patch はなるほどなーといった感じ</li> </ul> </div> </div> <div class="section" id="id13"> <h3><a name="id13">デザイナと仕事する方法</a></h3> <ul class="simple"> <li>矢野りんさん</li> <li>NTT Docomo Android の Blocco のデザインをやっている</li> <li>ペルソナ作り: コンシューマ向けデザイン手法</li> <li>ムードボード: こういう人はこういう雰囲気の UI が好きなんじゃないか</li> <li>Smartphone の画面だと、画面遷移するよりも縦に長い1画面にまとめるほうがよかったりする</li> <li>イメージを表す写真から色を取り出すという手もある</li> </ul> <div class="section" id="id14"> <h4><a name="id14">感想</a></h4> <ul class="simple"> <li>ペルソナという言葉は初めて聞きました。コンシューマ向けをやるときには試してみようと思った。(やることあるのか?)</li> </ul> <p>内容的には私は無料で聞けたので問題ないですが、22,000円という価格設定は正直ちょっと高いかな感じました。偉そうですいません。</p> </div> </div>
01:51:43
<div class="section"> <p>とても勉強になる流れなのでとりあえずざっくりとまとめる</p> <ul> <li> <a href="http://d.hatena.ne.jp/nishiohirokazu/20100622/1277208908"> Haskellの「fib = 1:1:zipWith (+) fib (tail fib)」はとても遅い</a> <ul> <li> Haskellの有名なfibの定義は素朴なループでの定義に比べて格段に遅く、O(n^2.6)くらいの実行時間がかかり、N = 100000でPythonにすら負ける</li> </ul> </li> <li> <a href="http://togetter.com/li/31078">Togetter - 「Haskellの「fib = 1:1:zipWith (+) fib (tail fib)」はとても遅い件」</a> <ul> <li> Integerの足し算のコストとかも絡んでくるのでややこしいという話など</li> </ul> </li> <li> <a href="http://d.hatena.ne.jp/mkotha/20100623/1277286946">fib = 1 : 1 : zipWith (+) fib (tail fib) が遅いかどうかは、使い方に依存する - www.kotha.netの裏</a> <ul> <li> fibを先頭から順に使って行った場合(例:sum (take 300000 fib))の方が、fib !! 300000よりずっと速いという話</li> <li> 僕の書いた早いバージョンのfibは正格性が(コード上には明記されていないが)コンパイラによって推論されているという話</li> </ul> </li> <li> <a href="http://homepage1.nifty.com/herumi/diary/1006.html#23">melancholic afternoon</a> <ul> <li> 巨大なリストから要素1つだけを取り出す時と2つ以上取り出すときではかかる時間や消費メモリがぜんぜん違うという話</li> </ul> </li> <li> <a href="http://d.hatena.ne.jp/kazu-yamamoto/20100624/1277348961">Haskellの神話 - あどけない話</a> <ul> <li> 正格評価するzipWith'を作ればよい、という話など</li> </ul> </li> <li> <a href="http://d.hatena.ne.jp/nuc/20100716/p17">haskell の fib は遅くない - 白のカピバラの逆極限 S.144-3</a> <ul> <li> 空間計算量が一時的に影響与えたと考えるのが自然、という話</li> </ul> </li> <li> 「まずふたりともグラフを描くべきである」 <a href="http://twitter.com/gusmachine/status/18840198768" target="_blank">http://twitter.com/gusmachine/status/18840198768</a></li> <li> グラフ: <a href="http://shinh.skr.jp/m/?date=20100719#p01">はじめてのにき(2010-07-19)</a> <ul> <li> 「2.77618e-13*x^2.55 の方が 2.10854e-10*x^2 よりどう見てもマッチしてるな。特異的って感じもないと思う。」空間計算量が一時的に影響与えたのではないのではないか、という話</li> </ul> </li> <li> <a href="http://togetter.com/li/36609">Togetter - 「続:Haskellのfibが遅い件」</a> <ul> <li> 環境依存の可能性が高いという話、GCやメモリアロケータのせいでO(n)に見える処理に実際にはそれ以上に掛かるケースがある話(Rubyで過去にあった例)、など</li> </ul> </li> </ul> </div>
12:07:50
<div class="section"> <p><a href="http://f.hatena.ne.jp/nishiohirokazu/20100719124244" class="hatena-fotolife" target="_blank"><img src="http://f.hatena.ne.jp/images/fotolife/n/nishiohirokazu/20100719/20100719124244.jpg" alt="f:id:nishiohirokazu:20100719124244j:image" title="f:id:nishiohirokazu:20100719124244j:image" class="hatena-fotolife" /></a></p> <p>イッカク!これは1本だけある歯だそうな。超出っ歯。</p> </div>
09:30:16
Pythonは標準で、パッケージをzip圧縮しておいてこの中身を直接importすることができます。例えば: packages.zip + foo.py + bar.py このようなzipファイルを /path/to/packages....
21:12:22
モダンな Perl の開発環境の構築方法 モダンなPHPの開発環境の構築方法 まだPython版を書いてる人がいないみたいなので,書いてみるよ:-D。 下準備 コンパイラは必ずしも必要ないけど,Ma...
05:02:08
<div class="section"> <p>MurotoPongのコードとMurotoTesterのコードを公開しました</p> <p><a href="http://code.google.com/p/muroto/" target="_blank">http://code.google.com/p/muroto/</a></p> <p>MurotoPong:</p> <p></p> <p>MurotoTester:</p> <p></p> <p>ライブラリは個別のプロジェクトに入れずに /libs/muroto/に入れてあるのだけども、適宜プロジェクト内からln -sするなりコピーするなりして使ってください、って説明をどっかに書かなきゃいけないな。あとcocos2dのソースは配布していないのでその辺も解説書かなきゃ。続きはまた明日かな。</p> </div>
01:43:31
<div class="section"> <p>Mercurialなどでpushする際のアカウントには自分のGoogleアカウントのメアドを入れるけども、パスワードにはGoogleアカウントのパスワードではなく</p> <p><a href="https://code.google.com/hosting/settings" target="_blank">https://code.google.com/hosting/settings</a></p> <p>で見られるパスワードを使う。何が目的なのだろう?</p> </div>
01:36:08
<div class="section"> <p>Flaskで作ってみてます。ファイルをサーバにアップロードして、そこでコミットしたかったんだ。</p> <p><a href="http://bitbucket.org/tokibito/flask-hgwebcommit/wiki/Home" target="_blank">tokibito / flask-hgwebcommit / wiki / Home — bitbucket.org</a></p> <p><a href="http://f.hatena.ne.jp/nullpobug/20100718030410" class="hatena-fotolife" target="_blank"><img src="http://f.hatena.ne.jp/images/fotolife/n/nullpobug/20100718/20100718030410.png" alt="f:id:nullpobug:20100718030410p:image" title="f:id:nullpobug:20100718030410p:image" class="hatena-fotolife" /></a></p> </div>
00:52:16
Windows上のPythonでreadlineを使えるようにするパッケージ pyreadline 1.6 が2010/7/15にリリースされました。pyreadline-1.5ではCtrl+H押下時に以下の問題がありました。 Window...
12:51:54