Home

mootoh.log

VimM #2 に行ってきた

VimM #2 に行ってきました。の歩く姿を拝み、肉声を生で聴くことのできる貴重な機会でした。Vimコンサルはおっくせんまん。

Life Changing だったこと:

  • readline でも vi モードがつかえる → irb でも vi キーバインディングが!
  • set cursorline
  • Vim script で非同期処理をやりたいときは、スレッドじゃなくてプロセスをつかうとよい

宴会では、Vimを主軸にしつつもみんな好き勝手な話題をしゃべりたくるという素晴しい場が提供されました。Vimはきっかけであり、多様な人をつなぐハブでありました。オフラインミーティングはたのしくて重要なのです。


次までにはCVANをつくっておきたいところですね。

NVISION 08

  • 2008-09-01 (Mon)

NVISION 08 に行ってきました。NVIDIAによるテクニカル & ゲームイベント。

NVIDIAは、Visual Computing の盟主になろうとしてて、それが成功しつつある。 正直、NVIDIA単独によるイベントで3日ももたんだろー、とか予想してましたが、あんなにもたくさんの人々が参加するとは。しかもたいへんな盛り上がりだった。IDF、HotChipsとおじさん系イベントが続いていただけに、若いひとびとが「キエエエェェェェェッッッッ」と叫んでたり指笛をピィピィ鳴らすキーノートにはたまげました。ゲーマーが多数いたことを差し引いても、ああいう場をつくることに成功したNVIDIAには勢いを感じます。

まぁそんなことよりも、最後の最後、クロージングセレモニーであったこのアトラクションがすばらしすぎた。必見です。

CPUとGPUってどう違うの? という幼子のまっすぐな問いにガチで答えるすばらしい物理ショー。(参考) 並列処理のすさまじさが、目と耳と皮膚で感じられました。

ユビキタスな家電には Visual Computing をベースにした immersive UI がのってきます。 そのときにコアとなる能力を提供するもののひとつがGPUになる。組込み屋さんは massively data parallel なプログラミングに慣れといたほうがいいですね。


細かいログは 8/26, 8/27, 8/28 あたりにあります。

HOT CHIPS Tutorial

Stanford Memorial Auditorium

HOT CHIPS 20 のゼロ日目、チュートリアルに参加してきました。Stanfordは素晴しいですね。

It’s the Memory, Stupid

マルチコアになって何がたいへんかというと、実はメモリなんだ! というのが斬新でした。 コアが増えるにつれメモリへのアクセスがどっと混むので、帯域が問題になる。マルチコア時代にはレイテンシを下げないといけなくて、メニーコアになるにつれスループットがネックになってくる。 キャッシュの階層を増やすなどして、レイテンシを隠す。3D スタッキングのようなアクロバティックな技術をつかってコアとメモリの距離を近づけてあげる。

CUDAというNVIDIAの並列プログラミングモデルでは、メモリ階層のことをかなり意識して書かないと、ちゃんと速くならない。データがGPUコアの中にあるのか、スクラッチパッドにあるのか、コア間の共有メモリにあるのか、それともDRAMにあるのか。 いかにも最高性能を目指すゲームプログラミング向きだなーと。それに対して Larrabee ではコンパイラやライブラリにそうした泥臭い作業を任せる。プログラマはロジックとアルゴリズムに集中できる。ただし性能がどうなるかは分かりませんね。


Stanford univ.

とにかくStanfordのキャンパスはすばらしかった。広くて重厚ですね。 なんとかして入れないものか。

Github Tシャツ共同購入しませんか

2008.08.30 追記: 買いました。 送料込みの単価は ¥2,475 になりました。 受け渡しのときにくださいな。


Github Tシャツ なるものがあるらしいです。 かっこいい! 背中にIDを油性ペンで書き込むのだ!!

で、値段は $22 なのですが送料が $11 かかります。 安いもんなんですが、ちょっとでも節約したいですよねJK。 いっしょに買いませんか?

数人あつまったら決行しましょう。

受け渡し

なにかの勉強会/カンファレンスのときに受け渡してもよいですし、受け渡し会をやってもよいです。

方法

gist:7099 を fork してください。

2008.08.26 追記: gist がなんだか調子悪いので、コメントくださるかはてぶるなどして参加表明ください。

賛同者

Twitterで深夜に呼びかけて4人集まりました。Twitterすごい。

2008.08.26 追記: 2345名捕獲しました。

いちいちエントリに加筆するのは面倒なので Google Spreadsheet にしました。

IDF

IDF 2008

Intel Developer Forum 2008 Fall に参加してきました。 世間的にはNehalemとかAtomが目玉でしたが、ここでは Concurrency に絞って振り返ってみます。

2つの世界

並列で書く世界になるとプログラマは2つに分かれる:

  • 下回りに並列化はまかせてロジックに集中する上流階級
  • 並列プログラミングモデルで細かい並列記述をがしがし書いて、最高の性能を引き出そうとする低レイヤ野郎

高水準言語とアセンブラとの関係と相似ですね。 上流階級が7割を占めて、ゲームやグラフィックス、組み込みといった低レイヤのひとたちが3割くらいでしょうか。 上流階級はデータ並列のプログラミングモデルであり、低レイヤはタスク並列も使い倒す。

これからは並列プログラミングができないと、コアが増えてプロセッサが速くなっても恩恵を受けれませんよ! というアジテーション。 Intelのツールをいま使えば、将来コアが増えても自動的にちゃーんとスケールするので使ってよ、という分かりやすいストーリーですね。Intelは下回りのツールを提供するので、みなさんは上流階級をエンジョイしてくださいね、というスタンスで、それはどう聞いてもベストの道なんだけど果たしてそううまくいくかどうか。

並列プログラミングモデル

インテルバイク

TBB (Threading Building Blocks) がいますぐ使えるツールとしてあり、研究中のプロジェクトとして Ct がある。 いずれも C/C++ をベースとしていて、関数型ライクに並列プログラムを書ける。

並列プログラミング、特にデータ並列には関数型というか高階関数で書ける言語が向いているそうな。Map Reduce なんかもそうですよね。

アプリケーション

今見えているアプリケーション例として、よりきれいなグラフィックスのレンダリングとか物理シミュレーションなどがあがっていました。 いかにも計算量が必要そうなもの。 でも、ふつうのユーザはそんな計算量を必要とするんだろうか。 ふつうのユーザのコンピューティング環境はモバイルに移行しているというこの時に。

モバイルでこそマルチコアは生きてきますよね。低消費電力で高性能になるはずなので。 そこでいかに高速で電力効率の良いプログラムを書くことができるかが大切になってくるのでは。

Larrabee

Plane

Larrabeeはフリーダムすぎてすごい。なんとも遊びがいがありそうです。 ぱっと見たかんじはCellっぽいんだけどプログラマが楽をできるような工夫がこらされていて涙が出る。

それぞれのx86コアではμOSのようなものが動いているんだけど、これも自分で書けるそうな。 オレオレ分散OSが1チップで動く時代ですよ。たのしい。

LarrabeeはCPUなの? GPUなの? という質問をしている人がいて、「Larrabeeは革命的なプロセッサなんだ!」と答えていたのが印象的だった。 Larrabeeやばい。

難しさ

並列プログラミングでむずかしいのは、非決定性 (実行するたびに動作が変わる) とそれにまつわるデバッグです。 プログラム中のある行にブレークポイントを張ってデバッガで捕まえたとしても、他のコアの実行は非決定的なので、再現させるのが難しい。 その他の問題 (スケーラビリティ、同期など) については解決してきたけれど、非決定性についてはまだ決め手がない。 ブレークスルーが求められています。

Continuation

シリコンバレーの夕暮れ

カンファレンスというのは一回行っただけでは本当のところは分からない。 何度か連続していくことでトレンドが見えてくるものですね。


ひとことでまとめると、英語がんばろうということでした… ><

まとまってないメモは以下:

SIGGRAPH 2008

SIGGRAPH2008

SIGGRAPH2008 に参加してきました。Connecting the Dots を感じた一週間でした。

Parallelism

OpenGL 3.0 T-shirt (rear)

ぼくは市井のしがない並列プログラマなので、GPGPU/CUDA/OpenCL/Larrabee の動向をウォッチするのがミッションでした。そのへんが既にSIGGRAPH的ではありませんが… 今回来たのは当たりだったと思います。なかなかマルチ/メニーコアを特集している学会はなく、各ベンダが主催するイベントで情報を集めているのが現状なので、まとめて見れたのはよかった。

OpenCL/Larrabeeについては初発表だったこともあってたくさんの人が集まっていました。世間の関心が伺えます。

簡単にこの分野のテクノロジーを表にしてみました。

この分野はいまが旬で、来年になったら新しい話はなくなっているのかなあと感じます。今はたくさんプラットフォームがあって、プログラミングモデルが乱立しているけれど、近いうちに淘汰されて1つか2つにまとまっていくことでしょう。そのとき覇権をとるのはどれか。 マルチプラットフォームで、プログラミングしやすいものが支持を得ることはあたりまえですね。OpenCLが有望だと思うのですが、果たしてそうなれるか。

Graphics

実物大カンフーパンダ

4年前はぼくもGraphics屋さんだったのでした。Volume Rendering っていう分野があって、Cell Projectionというアルゴリズムを並列化したよ、という論文を書いたりしていたのです。

何の気なしに聴いていたセッションで、ばりばりの Volume Rendering 話をしている人がいて、おおお懐しいぞこれは! と聴いていたらその人が Kwan-Liu Ma という大御所だと発表の最後で知ってのけぞった。実装してるとき、論文書いてるときに何度も参照してた論文の人が目の前でしゃべってる… ロックスターを目撃したようなものです。

続く発表では、その Volume Rendering がいかに医療の現場で役立っているか、というのを感動的な事例を基に病院のひとが話していた。衝撃でした。自分では、これ何の役に立つんだろう? と思いながら研究していたものが、真剣にやっているひとのところではちゃんと人の命を救っている。

同じ時間をつかうなら、純粋に時間を溝に捨てるようなことばかりしていないで、たくさんの人のためになるようなことに取り組まないと!

インタラクション, インターフェイス

S Figueroa St

New Tech ていう展示ではインタラクティブな何かがたくさんあって楽しめました。AVRとかすごい未来っぽい。 昔からずっとインタラクティブな何かワナビーなんですよね。いまだにそっち方面に行くことはないのですが…

Twitter

現地で、Twitterで知り合った @atusi さんと @sonson_twit とごはんを食べたりだべったりしました。 会場の情報をシェアしたり、お互いのバックグラウンドについて話し合ったりしたのは貴重な体験でした。1人でほそぼそと過ごすだけだったはずの一週間がずいぶんとカラフルになったのは、Twitterがあったからこそです。Twitterはぼくの現実を拡張している。

Connecting the Dots

W Adams Blvd

いまは並列プログラミングを食い扶持としていますが、その昔は画像処理をやってたり、レンダラを書いてたり、ユーザーインターフェイスワナビーしたりしてました。なんともばらばらなことやってきたもんです。でも今回それらの経験がちゃんと生きてることを感じられました。巨大なレンダリングには並列計算が要るし、画像処理とレンダリングはいとこみたいなものだ。関心をもって調べまわっていたことは、だれかのアンテナにひっかかる。自分のやってきたことはどこかで今につながる。


まとまってないログはこちら: 1日目, 2日目 (1, 2), 3日目, 4日目, 5日目

VimM その1 に参加してきた

  • 2008-07-21 (Mon)

関東にいるVim好きの集まりであるVimMに参加してきました。ついでに15分ほどしゃべった。

なぜ私は10年間Vimを使い続けているのか (PDF)

タイトルは釣りで、じっさいは Vim のソースをかるい気持ちで読んでみよう、というライブコードリーディングでした。 分かりあえるようになるには、まずお互いのことをよく知ることからですよね。

実行中のVimにgdbでアタッチして動きをみるという動的読みをしました。 つかった Vim のソースは、svn:vim7@1070 。 gdb vim pid のイディオムを知らない方が何人かいたようでしたので、これを機にgdbをキメることをおすすめします。

懇親会はVimでつながることの多様性を感じ、二次会では渋谷の魑魅魍魎に蹂躙されるなどしてたいへん楽しめました。主宰のHashさん、ありがとうございました。

いまはブロンズ聖闘士程度ですが、関東Vim四天王の座を狙って精進しようとおもいます。

IRCのログ

いちおう名前伏せで。

15:12:39    m***** はじまるですよ
15:12:40    H*** sorosoro
15:13:18    k*** 10ねん!
15:13:27    u****** wwwwwwwwwwwwwwwwwwwwwwww
15:13:27    k*** おい
15:13:30    r****** www
15:13:30    k*** oiwww
15:13:31    t*** wwww
15:13:31    t****** wwwww
15:13:33    u****** wwwwwwwwwwwwwwwwwwwwwww
15:13:40    k*** うぇーえーl!?
15:13:49    k***** chowww
15:14:00    k*** おおー
15:14:05    r****** oo
15:14:07    k***** oo
15:14:09    a***** emacsで行番号ってどうやって表示すんの?
15:14:48    k*** 37万行ぐらい読める(id:mootoh)
15:15:18    k*** ed→ex→vi→Vim
15:15:26    u****** 「37万行なら読むのに三日はかかりますね」(上野氏)
15:18:08    r****** gdbだけEmacsうらやましい。clewn、vimgdbもそれなりだけど
15:18:21    k*** 一応、バージョン番号は明示しておいた方が良いと思います。Vim 7.1.330等。
15:18:26    u****** 拡大縮小が酔うよー
15:18:51    k*** 関数単位なら良いですけど行番号は微妙にずれます
15:19:05    u****** mootohと書いたらgrowlとかでてくるかな
15:19:52    u****** 心臓の鼓動みたい
15:19:56    u****** > 拡大縮小
15:19:58    H*** ふぉーかすがひどいな
15:20:04    H*** しょうめんにいく
15:20:41    u****** {}++
15:20:59    u****** は***は精神的貴族
15:21:11    t*** h***++
15:21:15    H*** ふぉかすじちょう
15:21:21    r****** h***++
15:21:26    u****** ふぉぉぉかすぅぅぅぅ
15:21:33    u****** もうやめて! オレのライフは0よ!
15:21:38    t*** フォーカス--
15:21:49    y****** focus
15:22:04    u****** おもったんだけど
15:22:05    f********** 手動フォーカスにできねーの
15:22:08    r****** fmfm
15:22:11    f********** fmfm
15:22:16    u****** フォーカスが走った瞬間にH**が逆方向にカメラを動かせばいいんじゃね
15:22:18    k***** fmfm
15:22:20    t*** fmfm...?
15:22:28    H*** それなんてJOJO
15:24:22    r****** 8888
15:24:24    k*** 88888888
15:24:27    k***** 888888
15:24:28    t*** 888888
15:24:34    t****** 8888
15:24:34    k*** Operator関連のコードは魔界村
15:24:38    u**** 888
15:25:49    s***** gdb Vim `ps xa | grep '/Applications/Vim' | cut -f 1 -d ' '`
15:26:42    u****** 大阪のVim勉強会#3では本体のソースよみますか
15:26:47    k*** Vim プチハックのメモ - http://www.k3.dion.ne.jp/~jod/vimhack.html
15:27:35    b********** vimのundoはブランチがつくれる?
15:27:37    k*** ノシ
15:27:37    m******* undo.cのコメントが凄い。
15:27:41    k*** :help undotree
15:27:43    r****** undoブランチ使いこなせてない
15:27:53    k*** matigaeta
15:27:56    k*** :help undo-tree
15:28:04    m***** アン ドゥ トロワ
15:28:12    b********** へー
15:28:28    u****** 888888888
15:28:29    r****** 8888
15:28:32    t*** 88888

Google Code Jam 2008 Qualification Round

Google Code Jam 2008 に参加してます。

Qualification Round は A,B を解いて Score:50、Rank:2246 でした。Cむずいよ。 Rubyで書いてます。irbがつかえるこの幸せ。 irbでインタラクティブにデバッグしつつ、本番の入出力をケアするためのコードを最終行にいれてます。

A. Saving the Universe

さいしょ、レポートの出力形式を間違っていて (#0から出力してた)、なんでこれで違うんだろうと首をかしげてた。1回ぶんのmiss submit。

戦略は以下:

  • 入力を先頭から順になめて、エンジンを set に追加
  • すべてのエンジンが set にはいったら、カウンタをあげて、setをリセット

電車の中で、この単純な解法に気づいたときはうれしかった。

#!/usr/bin/env ruby
# Saving the Universe
#   at Google Code Jam 2008, QR A
#
# use Ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]
#
# author:mootoh
#
require 'logger'
 
$log = Logger.new(STDOUT)
$log.level = Logger::ERROR
$log.datetime_format = ''
 
def test(engines, queries)
  state = []
  count = 0
 
  queries.each do |query|
    state.push query
    state.uniq!
    if state.size == engines.size
      $log.debug("change !")
      count += 1
      state = [query]
    end
 
    $log.debug(state)
  end
 
  count.to_s
end
 
def main(file)
  n = file.gets.chomp.to_i
  n.times do |i|
    s = file.gets.chomp.to_i
    engines = []
    s.times {|j| engines.push file.gets.chomp}
 
    q = file.gets.chomp.to_i
    queries = []
    q.times {|k| queries.push file.gets.chomp}
 
    puts "Case ##{i+1}: " + test(engines, queries)
  end
end
 
main(ARGF) unless $PROGRAM_NAME == 'irb'

Train Timetable

これも電車で解いた。 オブジェクト指向っぽく考えてたら、できそうな気がして。 遅いけど、実行時間は今回問われてないのでおk。

#!/usr/bin/env ruby
# Train Timetable
#   at Google Code Jam 2008, QR B
#
# use Ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]
#
# author:mootoh
#
require 'logger'
 
$log = Logger.new(STDOUT)
$log.level = Logger::ERROR
$log.datetime_format = ''
 
class Arrow
  attr_accessor :from, :to
  def initialize(from, to)
    @from = from; @to = to
  end
 
  def start_at?(at)
    @from == at
  end
  def to_s; "#{from} -> #{to}"; end
  def inspect; to_s; end
end # Arrow
 
class Train
  attr_accessor :available_at
 
  def Train.tt=(x); @@tt = x; end
  def Train.tt; @@tt; end
 
  def initialize(at)
    @available_at = at
  end
 
  def departure(to)
    @available_at = to + @@tt
  end
 
  def to_s; "Train@:#{@available_at}"; end
  def inspect; to_s; end
end # Train
 
class Station
  attr_accessor :trains, :arrows, :count
 
  def initialize(arrows)
    @trains = []
    @arrows = arrows
    @count = 0
  end
 
  def train_available_at(at)
    t = @trains.find { |train| train.available_at <= at }
    if t
      @trains.delete(t)
      t
    else
      @count += 1
      Train.new(at)
    end
  end
 
  def to_s
    'Station: ' + [
      @trains.map {|x| x.to_s},
      @arrows.map {|x| x.to_s},
      @count.to_s
    ].join(' : ')
  end
  def inspect; to_s; end
end # Station
 
 
def parse(n, file)
  ret = []
  n.times do |i|
    x = file.gets.chomp.split(/\s+/).map do |x|
      h, m = x.split(/:/).map {|y| y.to_i}
      h * 60 + m
    end
    ret.push Arrow.new(x[0], x[1])
  end
  ret
end
 
def main(file)
  n = file.gets.chomp.to_i
  n.times do |j|
    tt = file.gets.chomp.to_i
    Train.tt = tt
    na, nb = file.gets.chomp.split(/\s+/).map {|x| x.to_i}
 
    arrows = [na,nb].map {|x| parse(x, file)}
    starts = (arrows[0] + arrows[1]).map {|x| x.from}.sort.uniq
    stations = arrows.map {|x| Station.new(x)}
 
    starts.each do |start|
      $log.debug("start at #{start} --------------------")
      2.times do |i|
        st_i = stations[i]
        st_o = stations[(i+1)%2]
 
        departures = st_i.arrows.find_all {|x| x.start_at?(start)}
        $log.debug("departures=#{departures.size}")
        departures.each do |d|
          train = st_i.train_available_at(start)
          train.departure(d.to)
          st_o.trains.push train
          $log.debug(train)
        end
        st_i.arrows -= departures
 
        $log.debug("#{i == 0 ? 'A' : 'B'}: #{st_i}")
        $log.debug("#{i == 0 ? 'B' : 'A'}: #{st_o}")
      end
      $log.debug('------------------------------------')
    end
    puts "Case ##{j+1}: #{stations[0].count} #{stations[1].count}"
  end
end
 
main(ARGF) unless $PROGRAM_NAME == 'irb'

つぎからが本番ですね。がんばろう。

iPhoneで欲しいソフト

初日に買えなくて泣いたこともありましたが、かくかくしかじかで、2日目にしてなんとかiPhoneを買えました。iPhoneで日焼けした。 さっそくiPhone充を満喫しているうちに、欲しいというかつくりたいものがわんさか湧いてきたのでリストアップしてみます。

下まわり

  • モデム: Macとつないだときにモデムとして振るまってほしい。べつにBluetoothじゃなくてもいいよ。
  • 日本語入力: モーションセンサーを利用したSKKとかおもしろそう。

クライアントアプリ

  • Twitterクライアント
  • IRCクライアント
  • PDFビューア
  • テキストファイルビューア
  • Last.fm か muxtape を聴けるアプリ
  • ブログエディタ
  • Remember the Milk クライアント : 本家のはProアカウントが必要
  • mixiクライアント

プログラミング環境

  • Vim
  • Terminal

いや、べつにTerminalでiPhoneの中にフルアクセスできなくてもいいから、REPL環境だけは欲しい。どこでもプログラミングしたい。


こういうふうに、デスクトップ/ノートの延長で思考するのがそもそも時代遅れなのかもしれませんね。 既存のアイデアをiPhoneにそのままもっていっても仕方ないし、 iPhoneというデバイスに適したアプリケーションのかたちをつくっていくべきなのかも。

WEwLC 読書会 #2 に行ってきた

WEwLC 読書会 #2 Ch.7

WEwLC読書会 その2 に行き、7章を発表してきました。

ホワイトボード

前日まで、8章が担当だったと思い込んでいたせいもあり、資料をつくれずじまいだったのでホワイトボードにゆるいマインドマップを書いたりしながら話しました。 ホワイトボードに書きながら説明するというのは、うまくやれればとてもインタラクティブで良いと思うんですよね。読書会においてはとくに。

スライドをつくってみんなに発表、というのもいいのですが、せっかく本を持ち寄ってみんなで議論するのだし、発表者はあくまでもガイド役に徹した方がよいのかも。 概念図だけをスライドにしておいて、あとはその場でホワイトボードなりに描きながら議論していくと楽しそうです。

とはいえ今回はうまくできなかったので、もっとホワイトボードテクニックを磨きたいと思います。


ぼくが読書会でやりたいことってなんだろう、と考えてみると、

  • そのときのテーマについて自分が困っていることを話す
  • 他のひと、現場の生の声を共有する

とかですね。WEwLC読書会は、こうしたことができる、良い場だと思います。

懇親会

という名のExcelカンファレンス 第0会が行われました。 Excel SUGEEEE な話を4時間くらいぶっとおし。 次の技術的イベントに参加するときには、「Excelから来ました」と言えるくらい技術を見につけていたいと思います。

メモ:

  • SilverlightのDLRはやばい
  • IronScheme は名前勝ち
  • ふつうのExcelハッカーはTDDでExcel VBAを書く
  • 気の利いたExcelハッカーはOLEでIEコンポーネントを埋め込んだタブ(シート)ブラウザを書く
  • 真のExcelzハッカーはソケット通信でP2Pのコードを書く
  • Excel VBA 使ってていいのは小学生までだよねー
  • いるか (or 冴子先生) ハック
  • 第一回Excelカンファレンスが開催される流れ
  • Excelカンファレンスは、「経理から来ました」とかいうような日本に埋ずもれている幾多のハッカーを発掘できる良い機会になる
  • Excel内Twitterクライアントが全世界に普及すると、あまりの負荷でTwitterにカタストロフィが起きる

と、大変有意義な会でした。みなさまありがとうございました。

Home