会社が白金台に引っ越しました。外苑前と比べると人がすごく少なかったり、オフィスの隣には都内有数の森があったり、窓からその森が見えたり、僕がその窓際に座っていたり、座って作業していると半径10mに人が1人もいなかったり(前のオフィスは30人くらいいた)して、かなりいい感じです。
そんなカッチョいいオフィスで社会と会社と己のマニーのために働いている僕ですが、先日社長が"カッチョいいディスプレイを会社のフロントに置くから、そこでなんかやってよ"などとおっしゃってまして、ちょっとしたデモを作ることにしました。
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日ずっと寝込んでいたりしたのですが、やっと若干上向いてきました。
今年も何とか頑張ります。
先日"これスコアリングの結果わかりやすく見せらんないかな?"って社長とペアプロ時に言われて、オレオレ変換で色・サイズのタグクラウド作ったら色の方だけ速攻却下喰らった。超くやしい。
と言う訳でちょっと勉強がてら書いてみた。
今一適当なarticleが見つからなかったのでjQueryのHeatColor pluginの中身をそのまんま実装。
アイデアとしては単純で、画像情報に落としたあとで全漢字pairに対して全pixelの一致数をカウントするだけ。
これの時にはリアルに全漢字でやろうとしてたんだけど、2万字=>4億ペアなので断念した。常用漢字1945文字を対象とする。
ActiveRecordやら何やら使いたかったけど、普通にやると結構面倒だったのでrailsでプロジェクト作ってscript/runnerした。
正しくは"UTF-8で表現できる"が接頭辞につきます。また、前提として僕はエンコードやらバイナリやらに関してはドがつく素人です。
すべての漢字を取り出す正規表現を以前読んでいて、ちょっと作りたいものがあって全ての漢字の列挙を行いたかったのでこれを参考にやってみた。
多分だけど、Rangeで範囲内の全ての漢字を取り出せるかなあと思って、まずは単純にirbで
("一".."龠").step(1){|s| puts s}>> "一".unpack('C*').map{|i| i.to_s(16)}.join
=> "e4b880"
>> 0xe4b880
=> 14989440
>> "龠".unpack('C*').map{|i| i.to_s(16)}.join
=> "e9bea0"
>> 0xe9bea0
=> 15318688(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
(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
どうも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'
#!/opt/local/bin/ruby -Kurequire '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'
endputs data.to_hash.to_yaml
で、気力切れ。
こういうDSLチックな事って自分でも良くやるんだけど、他人のオレオレ言語はなかなかキャズムを超えられない。苦痛。
素直にmechanize + hpricotしようと思う。
(追記)ちょっと修正
これで事例紹介プレゼンやってきました。割といろんなバックグラウンドの人と話せておもしろかったです。結構デカめのベンダーな人とかも来ていて、やっぱOSSって無視できないんだなーってのが肌で実感できる感じですね。
それにしても某社のエバンジェリストの方がすげー気さくで笑いました。「やっぱOS Xの人多いですよね。や、うちもそうなんすけど」みたいな。
Perlでニコニコ動画のflvとコメントxmlをダウンロードする (Yusukebe::Tech)
perl - 勝手に添削 - ニコニコ動画ダウンローダー (404 Blog Not Found)
と言う訳でRubyの勉強のためにネタをパクってきました。ソースは以下。
#!/usr/bin/env ruby -Ku使い方としては、要mechanizeで、
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
% sudo gem install mechanizeした後、
-をnico.yamlに保存して、
- your@mail.jp
-
- password
- yourpass
% 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が書けないよレベルからニコ動落とせるよレベルになれて嬉しい。あんまり変わってない気もするけど。
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}}
これが期待されるよね普通。何が分かってないんだろう?
業務歴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 }'
プログラミング言語の話です。
ねぎぽは基本的にPerlerです。このところRubyを触る必要性にかられていてその為にはてブしてたサイトがあるんだ。
新しいプログラミング言語を習得するための15の方法
今日30分ぐらい時間が出来たのでいくつか組もうと思った。ざっと見た所文字列操作は使うだろうし多くて良し、配列操作もいいけどやけに数値処理が多いなみたいなことを考えつつ、書きはじめてみていきなり詰まった挙げ句驚愕の事実に気づいた。
課題1. 無限ループ内に1,2,3,...を出力させ、このループを特定のキー入力で止める。
・・・キーボードイベントってPerlでどう見るの?
Perl/Tkでそう言うの昔組んだことあるけど、えーと、無理だろこれ。ねぎぽはPerlの習得を諦めました。
誰かRubyでやってよこれ。