技術
October 24, 2008
一個前のエントリで、はてなダイアリーのウクレレ記法をけっこう使ってるだなんだって話をしましたが、私はどちらかというとウクレレとか全然弾かなくて、ギターばっかり弾いてたりするので、なんか Music::Image::Chord という、それっぽいモジュールがあったので使ってみたら、何だか色々と残念な結果だったなんてつぶやきました。
で、やっぱ、ギターのタブ譜を出力するのは大変だなーって思ってたら、コメント欄でようちゃんから
まず、ギターの場合、ウクレレと違って弦が 6 本なので、2 本追加して、フレットの長さを変えました。
それにともない、画像のサイズはウクレレのものより大きくしました。
ギターには、ミュート弦という概念があって「この弦は音を鳴らさないんだよー」なんていう場合に、弦の左はじのほうに、×マークがついてたりします。なので、その×マークを入れるスペースを左はじに確保しました。
ギターの場合、ローコードやバレーコードなど、ポジションによって押さえかたが異なるのですが、そんなことイチイチ言ってたらアレなので、アコースティックギター派の人向けにローコードを主に出力するようにしました。
もちろん、GD::Tab::Uklele 同様に、違うポジションでおさえたほうが指運がスムーズな場合は、
ちなみに、GD::Tab::Uklele の
![$uk->generate('D7', [0,2,0,2])->png $uk->generate('D7', [0,2,0,2])->png](https://livedoor.blogimg.jp/nipotan/imgs/e/1/e110a6bb.png)
こんな感じになりますが、これって、
少なくともギターやってる人間は 6 弦から 1 弦に向かってフレット番号を入れるほうがシックリくるので、
実際にこれを動かすと、

こんな風になります。
ウクレレに比べて、弦が多いので、コードの種類はだいぶ増えて複雑なコードも使えるようになっています。

もちろん、フレットを指定したりして、分数コードとかも出来て、音の幅が一層ひろがります。

こんな感じ。
ということで、ほとんどが GD::Tab::Ukulele を改造しただけなのですが、ギター人口はウクレレよりも高いような気がしたので、GD::Tab::Guitar を CPAN にうpっておきました。
もしよかったら、はてなで「ギター記法」とか出来ないかなーなんて勝手に期待しつつ、元の GD::Tab::Ukulele モジュールの作者である舘野氏 (リプライチャメント) に敬意を表します。
みなさん、よかったら使ってみてください。
で、やっぱ、ギターのタブ譜を出力するのは大変だなーって思ってたら、コメント欄でようちゃんから
むしろ、GD::Tab::Ukuleleを改造する方向でどうでしょう?と提案してもらったので、その方向で検討してみました。
まず、ギターの場合、ウクレレと違って弦が 6 本なので、2 本追加して、フレットの長さを変えました。
それにともない、画像のサイズはウクレレのものより大きくしました。
ギターには、ミュート弦という概念があって「この弦は音を鳴らさないんだよー」なんていう場合に、弦の左はじのほうに、×マークがついてたりします。なので、その×マークを入れるスペースを左はじに確保しました。
ギターの場合、ローコードやバレーコードなど、ポジションによって押さえかたが異なるのですが、そんなことイチイチ言ってたらアレなので、アコースティックギター派の人向けにローコードを主に出力するようにしました。
もちろん、GD::Tab::Uklele 同様に、違うポジションでおさえたほうが指運がスムーズな場合は、
chord() メソッドではなく、generate() メソッドを使って、より良いポジションが利用できます。ちなみに、GD::Tab::Uklele の
generate() メソッドを使う時、
$uk->generate('D7',[0,2,0,2])->png;
このようにするとこんな感じになりますが、これって、
[0,2,0,2] (1 弦から 4 弦) というよりは[2,0,2,0] (4 弦から 1 弦) の表現のほうがわかりやすいというか普通な気がします。少なくともギターやってる人間は 6 弦から 1 弦に向かってフレット番号を入れるほうがシックリくるので、
generate() メソッドを拡張して、こんな風に出来るようにしました。$gtr->generate('G', '355433')->png;
こんな風に、無名配列ではなく、文字列で渡せるようにしました。実際にこれを動かすと、

こんな風になります。
ウクレレに比べて、弦が多いので、コードの種類はだいぶ増えて複雑なコードも使えるようになっています。
$gtr->chord('A7(#9)')->png;
もちろん、フレットを指定したりして、分数コードとかも出来て、音の幅が一層ひろがります。
$gtr->generate('Bb/A', '5x333x')->png;
こんな感じ。
ということで、ほとんどが GD::Tab::Ukulele を改造しただけなのですが、ギター人口はウクレレよりも高いような気がしたので、GD::Tab::Guitar を CPAN にうpっておきました。
もしよかったら、はてなで「ギター記法」とか出来ないかなーなんて勝手に期待しつつ、元の GD::Tab::Ukulele モジュールの作者である舘野氏 (リプライチャメント) に敬意を表します。
みなさん、よかったら使ってみてください。
August 07, 2008
技術評論社さんより本日発売の [24 時間 365 日] サーバ/インフラを支える技術を、先日、献本いただきました。
技評さんと著者の皆様、ありがとうございました。
ちょうど技評さんから本が届いたその時間に、はてなの近藤社長のお子さんが誕生された直後だったので、この、「サーバ/インフラを支える技術」によって支えられている会社の社長のお宅に新たな命が誕生したんだなと思って、記念撮影してみましたw
この本に書かれている内容は、非常に実践的で、ネットワークインフラまわりからミドルウェアまわりにわたって、「落ちないシステム」をどう構築していくかの概念的なものから、実際に KLab さんやはてなさんで「こういう風に構築している」という実績に基いた構築方法の詳細が書かれている感じで、かなり面白いです。
例えば、自社で大量のトラフィックやアクセスを捌いたり、冗長化構成を作ったりをしたことがない方って、比較的少なくはないと思うのですが、そういったノウハウが蓄積できていない会社で運営しているサイトが、ある日突然ホッテントリに出て大人気サイトになっちゃって、これを落とそうもんなら責任重大だー!みたいな状況になっても、この本さえあれば、概念的にどこをどういう風にすることで、サービスをダウンさせずに問題を回避できるのかがよくわかると思います。
いや、むしろ実際は「転ばぬ先の杖」として、環境を作ることのほうが重要だとは思いますが、先にそういう状況を想定して、どうすれば良いのか、どういうところに落とし穴があるのか、それらを知っておくのと知らないのとでは、そういう時の対処法に大きな差が出ると思います。
「理論上はこうすればいい」とか思いついても、いざという時に果たしてそれで問題が解決するのかはまったくもって不明です。
そういう状況を経験したことがない人って、実践する時がやって来た場合、意外に、見えなかったいくつもの問題からは免れられないものなんだなと思っています。
そういう問題を幾度も経験した人たちが書いた本だからこそ、注意すべき点はどこなのか、非常にわかりやすく書かれている本だと思います。
また、ハードウェア性能をいかに効率良く使ってパフォーマンスを向上させるかの Tips もたくさん含まれていて、知らなきゃ損なことばかり。
内容的には非常にお得です。
技術者達が流した「血と汗」のにおいを感じた、とても面白い本でした。
安井 真伸 横川 和哉 ひろせ まさあき 伊藤 直也 田中 慎司 勝見 祐己
技術評論社
技術評論社
June 07, 2008
昨日で Wassr が 1 周年を迎えたとかいうので、その影響かわからないですが、Wassr の私に対して 24 時間の間で 10 人以上の方から更新を購読されました。
私の場合、基本的にあんまり自分から更新を購読はせず、「他の人から更新を購読されたらこちらからも更新を購読し返す」というポリシーで利用しているのですが、(時々ウザかったら購読を解除したりしつつ) ふと気がついたら数百人とかいう状況でした。
で、何やかんや今まで更新を購読されたら、イチイチブラウザでその人のページ開いて、絵文字だらけの画面でポチポチと更新を購読ボタンを押したりしてたんですが、昨日はさすがに更新を購読されまくったおかげで途中から段々とウザくなりました。
途中から「基本、更新を購読されたらし返すから、自動でいいじゃん」とか思いはじめたので、こんな感じで自動更新を購読するようにしました。
/home/nipotan/bin/wassr-autokoudoku.pl
あとは Wassr の登録アドレスを nipotan-wassr@example.com みたいにしておけば、メール本文から screen name を拾ってきて、自動的に更新を購読するようになります。
多分、これが動いている限りは私を更新を購読されたら、メチャっ早で更新を購読し返しますが、早いからと言ってずっと Wassr ばっかり見てるニートだとか勘違されると困ります。
ちなみに、WWW::Wassr は、CodeRepos から、こんなんして入れてください。
WWW::Wassr は、ツリー内に trunk とか掘らないで直下に入ってたので、動かしてもらったほうが良いかもですね。
あと、我ながら思ったのが、渡米して 2 ヶ月、渡米後一発目のエントリがコレかよと。。。
類似エントリ 追記:
なんか途中まで公開してたやつが、コピペミスで動かなかったので、なおしました。
追記 2: wassr には英語版があってそっち使ってる人から更新を購読されると自動で更新を購読出来なかったので、それをなおしました。
私の場合、基本的にあんまり自分から更新を購読はせず、「他の人から更新を購読されたらこちらからも更新を購読し返す」というポリシーで利用しているのですが、(時々ウザかったら購読を解除したりしつつ) ふと気がついたら数百人とかいう状況でした。
で、何やかんや今まで更新を購読されたら、イチイチブラウザでその人のページ開いて、絵文字だらけの画面でポチポチと更新を購読ボタンを押したりしてたんですが、昨日はさすがに更新を購読されまくったおかげで途中から段々とウザくなりました。
途中から「基本、更新を購読されたらし返すから、自動でいいじゃん」とか思いはじめたので、こんな感じで自動更新を購読するようにしました。
/home/nipotan/bin/wassr-autokoudoku.pl
#!/usr/local/bin/perl
use strict;
use WWW::Wassr;
my $wassr = WWW::Wassr->new(
user => 'username',
passwd => 'password',
);
$wassr->login;
my $message;
{
local $/ = undef;
$message = <STDIN>;
}
my($screen_name) =
$message =~ m{^http://wassr\.(?:jp|com)/user/(\w+)/[\r\n]+--[\r\n]}m;
exit 0 unless defined $screen_name; # res?
$wassr->follow($screen_name);
exit 0;
こんなん作っておいて
% chmod +x ~/bin/wassr-autokoudoku.pl % echo '| /home/nipotan/bin/wassr-autokoudoku.pl' > ~/.qmail-wassr % echo ./Maildir/ >> ~/.qmail-wassrとかしておきました。
あとは Wassr の登録アドレスを nipotan-wassr@example.com みたいにしておけば、メール本文から screen name を拾ってきて、自動的に更新を購読するようになります。
多分、これが動いている限りは私を更新を購読されたら、メチャっ早で更新を購読し返しますが、早いからと言ってずっと Wassr ばっかり見てるニートだとか勘違されると困ります。
ちなみに、WWW::Wassr は、CodeRepos から、こんなんして入れてください。
% svn co http://svn.coderepos.org/share/lang/perl/WWW-Wassr WWW-Wassr % cd WWW-Wassr % perl Makefile.PL && make && make test && sudo make installモジュールの依存関係とか問題ないようだったら、make install しないで、パスを通しておくだけのほうが良いかも知れません (そのほうが更新された時に svn up だけで済むし)。
WWW::Wassr は、ツリー内に trunk とか掘らないで直下に入ってたので、動かしてもらったほうが良いかもですね。
あと、我ながら思ったのが、渡米して 2 ヶ月、渡米後一発目のエントリがコレかよと。。。
類似エントリ 追記:
なんか途中まで公開してたやつが、コピペミスで動かなかったので、なおしました。
追記 2: wassr には英語版があってそっち使ってる人から更新を購読されると自動で更新を購読出来なかったので、それをなおしました。
March 06, 2008
コードサンプルによく出てくる FizzBuzz だが、もう飽きたから、俺はこれから NabeAtzz で行こうと思う。
期待する結果:
実行結果:
dankogai++
use strict;
use warnings;
use Encode;
use Lingua::JA::Numbers;
for my $num ( 1 .. 40 ) {
print((!($num % 3) || $num =~ /3/ ?
encode('utf8', num2ja($num, +{ style => "hiragana" })) : $num), "\n");
}
期待する結果:
実行結果:
% ./NabeAtzz.pl 1 2 さん 4 5 ろく 7 8 きゅう 10 11 じゅうに じゅうさん 14 じゅうご 16 17 じゅうはち 19 20 にじゅういち 22 にじゅうさん にじゅうよん 25 26 にじゅうなな 28 29 さんじゅう さんじゅういち さんじゅうに さんじゅうさん さんじゅうよん さんじゅうご さんじゅうろく さんじゅうなな さんじゅうはち さんじゅうきゅう 40
dankogai++
December 27, 2007
昨日書いたネタが割と好評だったのですが、Twitter で、
と wrongbee さんに言われたので、とりあえずテキトーに作ってみました。
とりあえず、Bookmarklet にしてたので、GM に書き換えただけです。
良かったらどうぞお使いくだしあ。
mmcのURLがあったら表示せずに、IDを@nipotanのにリダイレクトしてアクセスするグリモン欲しい
と wrongbee さんに言われたので、とりあえずテキトーに作ってみました。
とりあえず、Bookmarklet にしてたので、GM に書き換えただけです。
良かったらどうぞお使いくだしあ。
![[24時間365日] サーバ/インフラを支える技術 ~スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ) (WEB+DB PRESSプラスシリーズ)](http://ecx.images-amazon.com/images/I/51uK4ACymiL._SL160_.jpg)