Archive for July, 2008

VimM その1 に参加してきた

July 21st, 2008  |  Published in Uncategorized

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

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

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

実行中のVimにgdbでアタッチして動きをみるという動的読みをしました。 つかった Vim のソースは、svn:vim7 。 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

July 19th, 2008  |  Published in Uncategorized

に参加してます。

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; = to end
def start_at?(at) == 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); @ = x; end def Train.tt; @; end
def initialize(at) = at end
def departure(to) = to + @ end
def to_s; "Train@:#{}"; end def inspect; to_s; end end # Train
class Station attr_accessor :trains, :arrows, :count
def initialize(arrows) = [] = arrows = 0 end
def train_available_at(at) t = { |train| train.available_at <= at } if t (t) t else += 1 Train.new(at) end end
def to_s 'Station: ' + [ {|x| x.to_s}, {|x| x.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'


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

Tags: ,

iPhoneで欲しいソフト

July 13th, 2008  |  Published in Uncategorized

初日に買えなくてが、かくかくしかじかで、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というデバイスに適したアプリケーションのかたちをつくっていくべきなのかも。

Tags:

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

July 6th, 2008  |  Published in book

その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にカタストロフィが起きる

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

Tags: wewlc, 読書会

Twitterクライアント作者ミーティングに行ってきた

July 6th, 2008  |  Published in Uncategorized

ツイッタークライアントmtg座席表

夏ライオン作者のが煽ったWassrTwitterクライアント作者ミーティングに参加してきました。勢いで二次会までいた。

ほとんどTwitterの話はしてなかったんだけど、クライアントづくりというつながりでいろんな人が集まることができるTwitterはやっぱり素晴しいプラットフォームなんだな。

あんなにたくさんの人がいたのにほんの数人の方としか話せなかった。 次の機会が待たれますね。

記憶の断片:

  • twjの人とwassrの中の人が隣同士に座ってた
  • これからはマルチポストクライアントの時代。マルチポストモダン
  • がアツい
  • iPhone development XXXXs!
  • Objective-CかわいいよObjective-C
  • Twitterシールもらった
  • 二次会ではSCMについてのまじめトークの傍ら、カラオケで吉幾三が歌われていた
  • Twitter作者の男:女比率 (Tokyo/Japan) は 100:0

みなさま、ではまた!

Tags: ,

QSWassr

July 3rd, 2008  |  Published in hack

さいきんのTwitterの狼藉には目が余るわッッ! wassr やろうぜ!! みたいな意見をよく目にするようになったので、QSTwitterのwassr版、QSWassrをつくってみました。15分間ハッキング。

やったこと

ほとんど s//api.wassr.jp/gなだけです。APIのエンドポイントを差し替えただけですね。QSTwitterは送信専用クライアントなので、おきらくでした。 とってもダーティなハック (following処理とかtwitterのがそのまま残ってる) なのですが、とりあえずでも動くものがあるほうがよいと思って公開しています。 興味をもたれた物好きな方は、ためしてみてください。

つかいかた

インストール方法、トリガーの設定方法なんかは、QSTwitterのやり方がほとんどそのまま使えます (s/QSTwitter/QSWassr/に注意)。

注意

QSTwitterといっしょに動かせません。 どういうわけか、Quicksilverのプラグインとして、RubyCocoaで書かれたものが複数存在できないようなのです (軽く調べた程度でですが)。

今後

やるとすれば。

  • QSTwitterと融合
    • Twitter, wassr の (両方に | 選択的に) ポストできるように
    • そうすると、ほかのミニブログとも融合したいところ
  • following対応
    • 融合させた場合も、ちゃんとTwitter,wassrそれぞれのfollowingをうまく扱えるようにしたい

その他

ミニブログを移ると、これまで築いてきたfollow関係がもっていけないから… と躊躇しがちですが、そこはそれ、心機一転すっきりと人間関係をつくりなおすのも面白いとおもいます。ナンバーポータビリティなんか気にしない! 人間関係は定期的にリセットするんだ! 的な心情ですね。

まとめ

wassrはTwitter ライクなAPIをもってるので、Twitterクライアントをつくってるひとは対応してみては! (夏ラ希望)

Tags: ,