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]]

という備忘録

遅れて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でやってみようかと思う。

ProductName プログラミングコンテストチャレンジブック
秋葉 拓哉
毎日コミュニケーションズ / 3444円 ( 2010-09-11 )


PyConJP2011に参加してきた

スタッフ、スピーカーのみなさんお疲れ様でした。とても楽しませてもらいました。 私用によりLTを見られなかったのが残念だったが、色々刺激をうけて大変満足な一日だった。

参加したのは以下のセッション。

  • Keynote [Tarek Ziade]
  • C API への誘(いざな)い / An Introduction to the C API
  • Webフォームウィジェットツールキットを総括する / Exploring Web Form Widget Toolkits
  • Python と MongoDB でWEB開発 / Web Application Development with Python and MongoDB
  • GAEのpython2.7対応の話

TarekのKeynoteは文句なく良かったが、個人的にもっとも興味深かく聞けたのはC APIの話ですね。あれは面白かった。

実務的にはWebフォームウィジェットの話が参考になった。Flaskばっか使っているのでWTFormsを使おうと思った。

PythonとMongoDBの話はちょっと展開がはやすぎて追いづらかった。というか、うっかりTornadoのドキュメントを読むのにトラップされて、追いていかれた感が。スライドとかコードとか公開されてんのかな?あとで調べる。

最後にGAEのPython2.7対応の話を聞けてよかった。かなり楽しみな感じなので、なんかサービス作っておこうっと。

ProductName エキスパートPythonプログラミング
Tarek Ziade
アスキー・メディアワークス / 3780円 ( 2010-05-28 )


次の読書会の本の候補を考えてみた。

そろそろ、来期の読書会の本を決めないといけないでしょうと、みな薄々感づいているはず。

@yajuが「7つの言語7つの世界」推しをしていたので、僕も考えてみた。ちなみにこの本は読んだことないのでちょっと興味はあるなぁ。あと7つの言語のなかではIo以外は触ったことがあるけど1章でScalaとかPrologとか説明するってことは相当事前知識が要りそうな気がすんだけどどうなんだろう?

ちなみにある程度薄いのをチョイスしてます。

入門 HTML5

入門ってついてるけど、HTMLをよく知っている人がHTML5に入門するという内容かなぁ。初心者向けではないような。

ProductName 入門 HTML5
Mark Pilgrim
オライリージャパン / 2415円 ( 2011-04-23 )


Dive Into HTML5で全文英語で読めるので、内容はこっちで確認

javasriptパターン

javascript the good partsを読んでいた流れでさらにjavascript

ProductName JavaScriptパターン ―優れたアプリケーションのための作法
Stoyan Stefanov
オライリージャパン / 2940円 ( 2011-02-16 )


デザインパターンとかクラスの作り方とか実用的な内容。javascriptの技をもう一段上に引き上げたいプログラマーとか開発者向け。

Scheme手習い

名著、悟りが開ける気がする。

ProductName Scheme手習い
Daniel P. Friedman
オーム社 / 2940円 ( 2010-10-22 )


簡単な内容から、徐々に難易度を上げていき、コラッツの問題,アッカーマン関数が出てきて最後にY-combinatorという感動すら覚える構成。

手を動かしながら読んでいけるのも楽しい。

追記 11.08.30

入門HTML5は読み物だった。

というわけで、プログラミングコンテストチャレンジブックを挙げておこう

ProductName プログラミングコンテストチャレンジブック
秋葉 拓哉
毎日コミュニケーションズ / 3444円 ( 2010-09-11 )


multiprocessingのpmapヤバイ

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の壁を超えている予定。

論語とmongoって似てるよね

pyconjp2011行きのバスの中で読んで流し読み終わった。

アイスブレークの時にfrom静岡は僕一人だったので、もう少しShiz.py的な人を増やしたいところ。

ProductName 高校生が感動した「論語」 (祥伝社新書)
佐久 協
祥伝社 / 840円 ( 2006-06-27 )


教える

「どうしようか、どうしようか」と自問自答するくらいの段階に達してない者には、おしえようがないもんだよ

訴訟

全員が悪く言うからと鵜呑みにせず、きちんと調べてみるべきだ。全員がよく言ってる時も同じ事だよ

デザインの輪郭は素晴らしいエッセイ

デザインの骨格は良書ですなーとおもっていたが、デザインの輪郭も負けず劣らず素晴らしい本であった。

「デザインの輪郭」という言葉は、この本のためだけに思いついたわけではない。これは、「デザインとはいったい何であるか」という問いに答えるときに思い浮かぶ像のようなものである。

ProductName デザインの輪郭
深澤 直人
TOTO出版 / 1890円 ( 2005-11-10 )


あまり言語化すると、ゆるふわっとしたものが失われるのでエッセイくらいで感覚として伝えるというこの方式のほうがよく伝わってくる感があった。

選択圧自体は人為的なものではなくて、いわゆる「状況」なんです。状況が、それが生き残るかどうかということを常に選択しているということです。

仕事のやり方に関してはここらへんの言葉が好きですね。

ピラミッドは頂点から組む。

下から組み上げても台形にしかならない場合があるから

これも理想でしょう。

オフィスは肥えた土壌のようなものです。 スタッフと毎日耕している

ブレーンストーミングもやらないし、 アイデアをたくさんだそうともしない

CoffeeScriptとjQueryを一緒に使ってみる

作付け状況をcanvasを使って表示するやつをExpress+Jade+CoffeeScript+jQueryという構成でやってみた。以前書いたやつは単にCanvasの練習を兼ねたものだったが、今回はデータをAjaxでとってきて描画することにした。

node_allot

サーバー側はExpressで。expressコマンドでスケルトン生成してくれるので地味に便利すぎですね。ちょっと試して終ったら消せるので心理的負担も少ない。coffeescriptのスケルトンを出力するオプションで切り替えられるようになっているとさらに嬉しいかもとおもったけどあるのかな?

express allot
cd allot
npm install -d

これでスケルトンが作られるのでapp.jsとviews/index.jadeを書き換える

app.js

/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));
});

views/index.jade

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そのものだし、文の終わりに;が必要ないのもいい。

HTML5楽しい

ブーム到来。2冊買った。

ProductName 入門 HTML5
Mark Pilgrim
オライリージャパン / 2415円 ( 2011-04-23 )


Dive into HTML5の和訳なので、原著がおもしろそうだったら買えばいいと思います。

PythonistaだったらDive into Pythonでおなじみの著者ですね。

ProductName HTML5 Canvas: Native Interactivity and Animation for the Web
Steve Fulton
Oreilly & Associates Inc / 2922円 ( 2011-05-13 )


こっちは、Canvasでちょっとしたゲームくらい作れるようになりたいなぁということで購入。値段の割に分厚い。

CanvasとかAudioが使えるようになりたいところ。

fjkwをMarkdownに対応させた

Node.jsでWikiを作っているわけですが。

jeditableのドキュメントをきちんと読んだら、loadurlでraw_text引っ張ればmarkdownでもなんでもいいらしいので。

wiki.jade

script.jeditable
  $(".editable_textarea").editable("#{title}", { 
      type   : 'textarea',
      submitdata: { _method: "post" },
      name     : 'body',
      loadurl  : '/md/' + "#{title}",
      rows     : 10,
      submit : 'OK',
      cancel : 'cancel',
      cssclass : "editable"
  });

app.js

htmlに変換する前のmarkdown書式のテキストを返すURLを追加した

app.get('/md/:title', function(req, res){
  WikiContent.findOne({title: req.params.title}, function (err, content) {
    res.send(content.body);
  });
});