02092011 Python
すっかり忘れてたがこんなのです。
shallow = [[1,2,3]] * 3 shallow[1][1] = 0 shallow # [[1, 0, 3], [1, 0, 3], [1, 0, 3]] deep = [[1,2,3 ] for f in [1,2,3]] deep[1][1] = 0 deep # [[1, 2, 3], [1, 0, 3], [1, 2, 3]]
という備忘録
02092011 Python
すっかり忘れてたがこんなのです。
shallow = [[1,2,3]] * 3 shallow[1][1] = 0 shallow # [[1, 0, 3], [1, 0, 3], [1, 0, 3]] deep = [[1,2,3 ] for f in [1,2,3]] deep[1][1] = 0 deep # [[1, 2, 3], [1, 0, 3], [1, 2, 3]]
という備忘録
01092011 Go
devquizで初めて触ったら意外に面白かった。好みかも。
というわけでGoのチュートリアルを読んでたらゴルーチンが楽そうだった。
フィボナッチ
// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package main import "fmt" // Send the sequence 2, 3, 4, ... to channel 'ch'. func generate(ch chan int) { for i := 2; ; i++ { ch <- i // Send 'i' to channel 'ch'. } } // Copy the values from channel 'in' to channel 'out', // removing those divisible by 'prime'. func filter(in, out chan int, prime int) { for { i := <-in // Receive value of new variable 'i' from 'in'. if i % prime != 0 { out <- i // Send 'i' to channel 'out'. } } } // The prime sieve: Daisy-chain filter processes together. func main() { ch := make(chan int) // Create a new channel. go generate(ch) // Start generate() as a goroutine. for i := 0; i < 100; i++ { // Print the first hundred primes. prime := <-ch fmt.Println(prime) ch1 := make(chan int) go filter(ch, ch1, prime) ch = ch1 } }
プログラミングコンテストチャレンジブックをGoでやってみようかと思う。
31082011 Python
スタッフ、スピーカーのみなさんお疲れ様でした。とても楽しませてもらいました。 私用によりLTを見られなかったのが残念だったが、色々刺激をうけて大変満足な一日だった。
参加したのは以下のセッション。
TarekのKeynoteは文句なく良かったが、個人的にもっとも興味深かく聞けたのはC APIの話ですね。あれは面白かった。
実務的にはWebフォームウィジェットの話が参考になった。Flaskばっか使っているのでWTFormsを使おうと思った。
PythonとMongoDBの話はちょっと展開がはやすぎて追いづらかった。というか、うっかりTornadoのドキュメントを読むのにトラップされて、追いていかれた感が。スライドとかコードとか公開されてんのかな?あとで調べる。
最後にGAEのPython2.7対応の話を聞けてよかった。かなり楽しみな感じなので、なんかサービス作っておこうっと。
30082011 life
そろそろ、来期の読書会の本を決めないといけないでしょうと、みな薄々感づいているはず。
@yajuが「7つの言語7つの世界」推しをしていたので、僕も考えてみた。ちなみにこの本は読んだことないのでちょっと興味はあるなぁ。あと7つの言語のなかではIo以外は触ったことがあるけど1章でScalaとかPrologとか説明するってことは相当事前知識が要りそうな気がすんだけどどうなんだろう?
ちなみにある程度薄いのをチョイスしてます。
入門ってついてるけど、HTMLをよく知っている人がHTML5に入門するという内容かなぁ。初心者向けではないような。
Dive Into HTML5で全文英語で読めるので、内容はこっちで確認
javascript the good partsを読んでいた流れでさらにjavascript
デザインパターンとかクラスの作り方とか実用的な内容。javascriptの技をもう一段上に引き上げたいプログラマーとか開発者向け。
名著、悟りが開ける気がする。
簡単な内容から、徐々に難易度を上げていき、コラッツの問題,アッカーマン関数が出てきて最後にY-combinatorという感動すら覚える構成。
手を動かしながら読んでいけるのも楽しい。
入門HTML5は読み物だった。
というわけで、プログラミングコンテストチャレンジブックを挙げておこう
30082011 Python
multiprocessingのpmapは普通に書いたpythonプログラムをちょっと書き直せば並行して実行できるようになる。
しかもmapしたいところで、
p = Pool(2) p.map(answer, problems)
って、書くだけなので超お手軽。
ちょっとがんばってc++で書いたほうがよかったかなーと思うプログラムをPythonで書いてしまい、高速化で悩んだのだけど、2コアだとこれだけで2倍近くはやくなるし4コアだと相当はやい。
8コアは試してない。
multiprocessingを試す前にpypyでもと思いコンパイル(1.6の64bitバイナリは10.5では動かなかった)したら、いつまでたってもコンパイルが終わらなくて投げ出した。
というわけで、明日の朝起きたら110の壁を超えている予定。
28082011 life
pyconjp2011行きのバスの中で読んで流し読み終わった。
アイスブレークの時にfrom静岡は僕一人だったので、もう少しShiz.py的な人を増やしたいところ。
教える
「どうしようか、どうしようか」と自問自答するくらいの段階に達してない者には、おしえようがないもんだよ
訴訟
全員が悪く言うからと鵜呑みにせず、きちんと調べてみるべきだ。全員がよく言ってる時も同じ事だよ
25082011 chemoinformatics work life
デザインの骨格は良書ですなーとおもっていたが、デザインの輪郭も負けず劣らず素晴らしい本であった。
「デザインの輪郭」という言葉は、この本のためだけに思いついたわけではない。これは、「デザインとはいったい何であるか」という問いに答えるときに思い浮かぶ像のようなものである。
あまり言語化すると、ゆるふわっとしたものが失われるのでエッセイくらいで感覚として伝えるというこの方式のほうがよく伝わってくる感があった。
選択圧自体は人為的なものではなくて、いわゆる「状況」なんです。状況が、それが生き残るかどうかということを常に選択しているということです。
仕事のやり方に関してはここらへんの言葉が好きですね。
ピラミッドは頂点から組む。
下から組み上げても台形にしかならない場合があるから
これも理想でしょう。
オフィスは肥えた土壌のようなものです。 スタッフと毎日耕している
ブレーンストーミングもやらないし、 アイデアをたくさんだそうともしない
25082011 javascript
作付け状況をcanvasを使って表示するやつをExpress+Jade+CoffeeScript+jQueryという構成でやってみた。以前書いたやつは単にCanvasの練習を兼ねたものだったが、今回はデータをAjaxでとってきて描画することにした。

サーバー側はExpressで。expressコマンドでスケルトン生成してくれるので地味に便利すぎですね。ちょっと試して終ったら消せるので心理的負担も少ない。coffeescriptのスケルトンを出力するオプションで切り替えられるようになっているとさらに嬉しいかもとおもったけどあるのかな?
express allot
cd allot
npm install -d
これでスケルトンが作られるのでapp.jsとviews/index.jadeを書き換える
/jsonにアクセスしたらデータをJSONで返すようにする。
// Routes app.get('/', function(req, res){ res.render('index', { title: 'Express' }); }); app.get('/json', function(req, res){ var allotment_data = [ {name:"なにもうえてない", x:10, y:10, width:480, height:120, color:"#CCCCCC"}, {name:"浅葱", x:10, y:140, width:140, height:120, color:"#66CC66"}, {name:"ニンニク", x:160, y:140, width:80, height:120, color:"#993300"}, {name:"春菊", x:250, y:140, width:80, height:120, color:"#339933"}, {name:"ジャガイモ", x:340, y:140, width:150, height:120, color:"#CC6600"}, {name:"ソラマメ", x:10, y:340, width:70, height:150, color:"#339933"}, {name:"エンドウ", x:10, y:270, width:70, height:60, color:"#339933"}, {name:"ジャガイモ", x:90, y:270, width:400, height:110, color:"#CC6600"}, {name:"ミョウガ", x:90, y:390, width:400, height:100, color:"#CC9966"} ]; res.send(JSON.stringify(allotment_data)); });
h1= title canvas#allotment(width=500, height=500) script(type="text/javascript", src="http://jashkenas.github.com/coffee-script/extras/coffee-script.js") script(type="text/javascript", src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js") script(type="text/coffeescript") | draw = () -> | $.getJSON('/json', (data) -> drawCanvas(data)) | | drawCanvas = (allotment_data) -> | ctx = document.getElementById('allotment').getContext('2d') | ctx.save() | ctx.font = "20px" | for alt in allotment_data | ctx.fillStyle = alt.color | ctx.fillRect( alt.x, alt.y, alt.width, alt.height) | ctx.fillStyle = "#000" | ctx.fillText(alt.name, 12 + alt.x, 32 + alt.y) | ctx.restore() | | draw()
もとのと比べるとcoffeescriptのコードのほうがシンプルで見やすくなっていいですね。普段Python使っているのでインデントはわかりやすいし、for in ループはpythonそのものだし、文の終わりに;が必要ないのもいい。
24082011 javascript
ブーム到来。2冊買った。
Dive into HTML5の和訳なので、原著がおもしろそうだったら買えばいいと思います。
PythonistaだったらDive into Pythonでおなじみの著者ですね。
HTML5 Canvas: Native Interactivity and Animation for the Webこっちは、Canvasでちょっとしたゲームくらい作れるようになりたいなぁということで購入。値段の割に分厚い。
CanvasとかAudioが使えるようになりたいところ。
24082011 javascript
Node.jsでWikiを作っているわけですが。
jeditableのドキュメントをきちんと読んだら、loadurlでraw_text引っ張ればmarkdownでもなんでもいいらしいので。
script.jeditable $(".editable_textarea").editable("#{title}", { type : 'textarea', submitdata: { _method: "post" }, name : 'body', loadurl : '/md/' + "#{title}", rows : 10, submit : 'OK', cancel : 'cancel', cssclass : "editable" });
htmlに変換する前のmarkdown書式のテキストを返すURLを追加した
app.get('/md/:title', function(req, res){ WikiContent.findOne({title: req.params.title}, function (err, content) { res.send(content.body); }); });