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'
つぎからが本番ですね。がんばろう。
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クライアント
プログラミング環境
いや、べつにTerminalでiPhoneの中にフルアクセスできなくてもいいから、REPL環境だけは欲しい。どこでもプログラミングしたい。
こういうふうに、デスクトップ/ノートの延長で思考するのがそもそも時代遅れなのかもしれませんね。 既存のアイデアをiPhoneにそのままもっていっても仕方ないし、 iPhoneというデバイスに適したアプリケーションのかたちをつくっていくべきなのかも。
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
夏ライオン作者のが煽ったWassrTwitterクライアント作者ミーティングに参加してきました。勢いで二次会までいた。
ほとんどTwitterの話はしてなかったんだけど、クライアントづくりというつながりでいろんな人が集まることができるTwitterはやっぱり素晴しいプラットフォームなんだな。
あんなにたくさんの人がいたのにほんの数人の方としか話せなかった。 次の機会が待たれますね。
記憶の断片:
- twjの人とwassrの中の人が隣同士に座ってた
- これからはマルチポストクライアントの時代。マルチポストモダン
-
がアツい
- iPhone development XXXXs!
- Objective-CかわいいよObjective-C
- Twitterシールもらった
- 二次会ではSCMについてのまじめトークの傍ら、カラオケで吉幾三が歌われていた
- Twitter作者の男:女比率 (Tokyo/Japan) は 100:0
みなさま、ではまた!
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クライアントをつくってるひとは対応してみては! (夏ラ希望)