pologでタグ ruby が指定されているエントリー

2008年05月03日

会社周辺のレストラン情報をGoogle Earth上でだら見する

会社が白金台に引っ越しました。外苑前と比べると人がすごく少なかったり、オフィスの隣には都内有数の森があったり、窓からその森が見えたり、僕がその窓際に座っていたり、座って作業していると半径10mに人が1人もいなかったり(前のオフィスは30人くらいいた)して、かなりいい感じです。
そんなカッチョいいオフィスで社会と会社と己のマニーのために働いている僕ですが、先日社長が"カッチョいいディスプレイを会社のフロントに置くから、そこでなんかやってよ"などとおっしゃってまして、ちょっとしたデモを作ることにしました。

2008年01月04日

あけましておめでとうございます

新年です。Perlです。

puts (a=(h=lambda{{101,[2,9,13,15],114,
[32],32,[10,19,29],97,[0,4],100,[14],109,
[3,12,27],115,[5,24,34],121,[30],117,
[18,38],107,[1,20,37],104,[6,25,35],111,
[11,17,21,23,28,31,33],105,[7,26,36],116,
[8,16,22]}}).call.keys.map{|k|h.call[k].map{|v|
[v,k]}}.flatten).map{@i=@i?@i+=1:0;@i%2==0?
[a[@i],a[@i+1]]:nil}.compact.sort_by{|v|
v[0]}.map{|v|"%x"%v[1]}.join.to_a.pack('H*')

flattenの手前あたりでめげそうになりました。誰か直して下さい。

体調も新年からここ4日ずっと寝込んでいたりしたのですが、やっと若干上向いてきました。
今年も何とか頑張ります。

2007年12月24日

数値をサーモグラフィーっぽく色変換する

先日"これスコアリングの結果わかりやすく見せらんないかな?"って社長とペアプロ時に言われて、オレオレ変換で色・サイズのタグクラウド作ったら色の方だけ速攻却下喰らった。超くやしい。
と言う訳でちょっと勉強がてら書いてみた。
今一適当なarticleが見つからなかったのでjQueryのHeatColor pluginの中身をそのまんま実装。

2007年12月15日

漢字を類似度検索可能にする

アイデアとしては単純で、画像情報に落としたあとで全漢字pairに対して全pixelの一致数をカウントするだけ。
これの時にはリアルに全漢字でやろうとしてたんだけど、2万字=>4億ペアなので断念した。常用漢字1945文字を対象とする。
ActiveRecordやら何やら使いたかったけど、普通にやると結構面倒だったのでrailsでプロジェクト作ってscript/runnerした。

2007年12月01日

Rubyで全ての漢字を列挙する

正しくは"UTF-8で表現できる"が接頭辞につきます。また、前提として僕はエンコードやらバイナリやらに関してはドがつく素人です。


すべての漢字を取り出す正規表現を以前読んでいて、ちょっと作りたいものがあって全ての漢字の列挙を行いたかったのでこれを参考にやってみた。
多分だけど、Rangeで範囲内の全ての漢字を取り出せるかなあと思って、まずは単純にirbで

("一".."龠").step(1){|s| puts s}

ってやった所、数百文字で止まり、しかも途中からは漢字ではない??みたいなのが出力されている。おかしい。どれくらいの範囲が確保されていて、どれくらい漢字でないものが含まれているんだろう。
unpackしてバイト列に直したものを10進数に変換してみる。
>> "一".unpack('C*').map{|i| i.to_s(16)}.join
=> "e4b880"
>> 0xe4b880
=> 14989440
>> "龠".unpack('C*').map{|i| i.to_s(16)}.join
=> "e9bea0"
>> 0xe9bea0
=> 15318688

ワオ、1文字3byteで、30万種類以上の漢字が詰め込めることになってる。多過ぎだろ漢字。ひょっとしたら詰め込み方にパターンがあるかもしれないので、とりあえず該当する文字と各バイトコードを全て取り出して、傾向を見てみる。今度は最初のコードみたく止まらずに出力された。
(14989440..15318688).step(1) do |i|
chr_a = i.to_s(16).scan(/../).map{|s| eval("0x#{s}")}
puts "#{chr_a.map{|i| i.chr}.join}\t#{chr_a.join(',')}"
end

出力ファイル (5MBあるから開かない方が無難)
首尾よくパターンを見つけた。第2・第3バイトは128から191までしか使われていない。
(14989440..15318688).step(1) do |i|
chr_a = i.to_s(16).scan(/../).map{|s| eval("0x#{s}")}
next unless(
chr_a[1] >= 128 &&
chr_a[1] <= 191 &&
chr_a[2] >= 128 &&
chr_a[2] <= 191
)
puts "#{chr_a.map{|i| i.chr}.join}\t#{chr_a.join(',')}"
end

出力ファイル
20897文字。とりあえず目的のものが得られた。
隙間があるのは将来増える文字達の為なのかなとか思いつつ、128とか191とかをフックにして調べてみたら何となく分かって来た。UTF-8はもともとUnicodeのサブセットなので、Unicodeと同等の情報量を3バイトで表現する為に第1バイトの頭4ビット、第2、第3バイトの頭2ビットが固定されているって感じかな。
この辺のエンコードのストラテジな話はRuby会議で外人さんが喋っていた気がするが、当時興味が無かったので聞き飛ばしてしまった。回り道をしない為にもその内ちゃんと勉強しようと思う。

2007年11月11日

scRubytをちょこっと触ったけど挫折

どうもDSLが気持ち悪くて。。スンマセン。
dependencyにRubyInlineの3.6.3があるので、普通にgemやるとエラーが起きます。

% sudo gem install scrubyt
% sudo gem install RubyInline --version '= 3.6.3'
% sudo gem uninstall RubyInline --version '=3.6.5'

なんか間違ってる気がするけど気にせず小さなコードを書いてみた。tumblrのfollowings url list。
#!/opt/local/bin/ruby -Ku

require 'rubygems'
require 'scrubyt'
require 'yaml'

login = YAML.load_file('login.yaml')

data = Scrubyt::Extractor.define do
fetch 'http://www.tumblr.com/login'
fill_textfield 'email', login['email']
fill_textfield 'password', login['password']
submit
fetch 'http://www.tumblr.com/following'
url '//ul[@id="following"]/li/a[1]/@href'
end

puts data.to_hash.to_yaml


返り値はそのままじゃ使えないけどto_hashすると普通にアクセスできるハッシュになる。to_xmlな例しかWEBにないのはなんでなんだぜ?

で、気力切れ。
こういうDSLチックな事って自分でも良くやるんだけど、他人のオレオレ言語はなかなかキャズムを超えられない。苦痛。
素直にmechanize + hpricotしようと思う。


(追記)ちょっと修正

2007年08月25日

Award on Rails

これで事例紹介プレゼンやってきました。割といろんなバックグラウンドの人と話せておもしろかったです。結構デカめのベンダーな人とかも来ていて、やっぱOSSって無視できないんだなーってのが肌で実感できる感じですね。
それにしても某社のエバンジェリストの方がすげー気さくで笑いました。「やっぱOS Xの人多いですよね。や、うちもそうなんすけど」みたいな。

2007年08月05日

mechanize.rbでニコニコ動画のflvをダウンロード

Perlでニコニコ動画のflvとコメントxmlをダウンロードする (Yusukebe::Tech)
perl - 勝手に添削 - ニコニコ動画ダウンローダー (404 Blog Not Found)

と言う訳でRubyの勉強のためにネタをパクってきました。ソースは以下。

#!/usr/bin/env ruby -Ku
require 'yaml'
require 'rubygems'
require 'mechanize'
require 'cgi'

video_id = ARGV.first.scan(/sm\d+$/).first

agent = WWW::Mechanize.new
agent.post('http://www.nicovideo.jp/login', YAML.load_file('nico.yaml'))

agent.get_file('http://www.nicovideo.jp/watch/' + video_id)
content = agent.get_file('http://www.nicovideo.jp/api/getflv?v=' + video_id)
params = content.scan(/([^&]+)=([^&]*)/).inject({}){|h, v| h[v[0]] = v[1]; h}
video_url = CGI.unescape(params['url'])

puts "downloading url : " + video_url
video_file = open(video_id + '.flv', 'w')
video_file.print agent.get_file(video_url)
video_file.close

使い方としては、要mechanizeで、
% sudo gem install mechanize
した後、
- 
- mail
- your@mail.jp
-
- password
- yourpass
をnico.yamlに保存して、
% ruby nicodown.rb sm673443
な感じ。
% ruby nicodown.rb http://www.nicovideo.jp/watch/sm673443
もok。

以下思った点。
1) mechanizeをログイン状態の保持だけに使うのは、狐狩りにミサイル持ってくるようなもんだと思うんだけど、何が適当なんだろ。
2) mechanizeでpostの引数がArray of Arrayなのが気持ち悪い。
3) まだ全然よく分かってない(ファイルの書き出しが分からなくてリファレンス引いたww)

まあでも2ヶ月でFizzBuzzが書けないよレベルからニコ動落とせるよレベルになれて嬉しい。あんまり変わってない気もするけど。

2007年08月01日

Hash.newよくわかんね

Hash.new()の引数に何かを与えると、デフォルト値が与えられて初期化しなくてすむ。と言う認識なんだけど、

irb(main):001:0> a = Hash.new({})
=> {}
irb(main):002:0> a['a']['b'] = 1
=> 1
irb(main):003:0> a
=> {}
irb(main):004:0> a['a']
=> {"b"=>1}

え?

irb(main):005:0> a = {}
=> {}
irb(main):006:0> a['a'] = {}
=> {}
irb(main):007:0> a['a']['b'] = 1
=> 1
irb(main):008:0> a
=> {"a"=>{"b"=>1}}

これが期待されるよね普通。何が分かってないんだろう?

2007年06月11日

Ruby Kaigi 2007

業務歴3ヶ月のぺーぺープログラマねぎぽです。土日はフルで日本 Ruby会議2007に参加してました。参加費は会社持ち!社長いつもありがとうございます :D


結論から言うと、今回のRuby Kaigiのテーマは"愛"。
会場にいると"俺はRubyを愛しているぜ"って言う参加者の熱気がもの凄かった。実際の所、僕はプログラミング系のでかいカンファレンスに参加した経験は今まで無かったのだけれど、YAPC::Asia 2007のビデオとかを見る限り、少なくともPerlに比してRubyコミュニティのプログラミング言語に対する愛は勝っている様に思う。Rubyを愛していないと、Rubyでバイナリいじって変態的プレゼンソフトなんて作れないだろうしゴールデンゲートブリッジを見て「Ruby色ですねえ」なんて感想は出て来ない
そして当然だけれど、Ruby愛は宗教じゃない。Dave Thomasさんが述べているように、みんながRubyを愛するのは、Rubyが自分を愛することを求めるのであれば、Rubyを愛することが必要だからである。そこには宗教的な無償の愛や熱狂ではなく、Rubyを愛することによって創出される筈の、より良いプロダクトに対する期待があるのだ。
Ruby愛以外に何か付け加えるものがあるとするならば、あとは、覚悟


僕はまだペーペーで、RubyじゃFizzBuzzもかけないプログラマだ(剰余ってどうやるんだっけ、%? ワンライナーを行う為のオプションは?)。だけど今回のカンファレンスでは、良いプロダクトを生産する為に何が必要なのか、と言う事を、魂に刻みこまれたように思う。プレゼンの上手さとか、プロダクトの凄さとかにも感動したけれど、それより重要なことを学んだ。社内ノウハウがないからなんだ。俺はやってやるぜ(たぶん)。


(余談)
"RubyじゃFizzBuzzもかけないプログラマ"のままじゃヤバいのでwとりあえず書いた

ruby -e '(1..100).each{|i| puts i%3==0 ? i%5==0 ? "FizzBuzz" : "Fizz" : i%5==0 ? "Buzz" : i }'

あれ、こんなに長かったっけ。とりあえずrubyじゃ0はtrueなことは学んだ。

2007年03月16日

言語を学ぶ為に

プログラミング言語の話です。
ねぎぽは基本的にPerlerです。このところRubyを触る必要性にかられていてその為にはてブしてたサイトがあるんだ。
新しいプログラミング言語を習得するための15の方法
今日30分ぐらい時間が出来たのでいくつか組もうと思った。ざっと見た所文字列操作は使うだろうし多くて良し、配列操作もいいけどやけに数値処理が多いなみたいなことを考えつつ、書きはじめてみていきなり詰まった挙げ句驚愕の事実に気づいた。

課題1. 無限ループ内に1,2,3,...を出力させ、このループを特定のキー入力で止める。

・・・キーボードイベントってPerlでどう見るの?
Perl/Tkでそう言うの昔組んだことあるけど、えーと、無理だろこれ。ねぎぽはPerlの習得を諦めました。
誰かRubyでやってよこれ。

購読

フィードリーダーを利用して検索結果を購読し、今後投稿されるエントリーでタグ「ruby」が指定されているものにアクセスできます。 [フィードとは]

フィードを取得 フィードを取得