FizzBuzzを30byteで作る方法

某Y!社の新卒には入社までに、FizzBuzzを61byte,エンジニアは30byteでつくってこいという課題があるようだ。いくらなんでも難しすぎるよね。検索して見つけろということなのかなあ?

http://twitter.com/#!/yamaji/status/28840058526105600

こんなポストがTLに流れてきました。自分はエンジニアなので30byteで作らないといけないようです。
で、参考までにanarchy golfを見てみます。
http://www.shinh.org/p.rb?FizzBuzz
下の方にあるLanguage Rankingが全ての言語での現在の結果です。2011-1-24現在ではFlogScriptの36byteが一番短いコードのようです。code golfの先人達が叩き出した記録をそう易々と、しかも6byteも縮めて越えられるとは思えないですね。
では、「30byteでFizzBuzzを作るのは無理」というのが正答でしょうか?
いやいや、まさか大手Y!社がそんな出来もしない課題を出すはずがありません。おそらく今ある言語で作れないのなら、30byteでFizzBuzzが作れる言語を作れということでしょう。間違いない!

ということでプログラミング言語FizzBuzzを作りました。以下からダウンロードしてください。なお、Python3で書いてあるのでPython3系が必須です。
https://bitbucket.org/naoina/fizzbuzz/raw/1ba32b27db77/fizzbuzz
ダウンロード出来たら実行権限を付けて、Python3が入っている環境で適当なファイル名で以下のコードを書きます。ここではfizzbuzz.fzとします。

fizzbuzz(100)

保存したら、ファイルを処理系に食わせて実行します。

% fizzbuzz fizzbuzz.fz

するとFizzBuzzの答えが出力されます。ソースコードは「fizzbuzz(100)」だけなので13byteです。なんと指定された30byteより17byteも縮まってしまいました!プログラミング言語FizzBuzz凄い!
もちろん普通にプログラミング言語として使えます。というか、Pythonのコードであれば全て実行できます。例えば

s = "test"
print(s)

上記のソースコードを実行すると

test

と出力します。
詳しく知りたい方はソースを見て下さい。おそらく想像通りです。

何はともあれ、これでY!社の新卒エンジニアとして内定をもらっても安心ですね!

ニコニコ動画で自分のマイリストを全検索するブックマークレット(原宿) ver.俺

http://d.hatena.ne.jp/Molokheiya/20101207/p1

↑のが出る前に待ちかねて作ったオレオレバージョン。
ただ、こちらは検索したものでもマイリストコメントの編集ができる。
使い方は上記の記事を参照。

javascript:(function(){var%20d=(new%20Date)/1;var%20s=document.createElement('script');s.charset='UTF-8';s.src='http://vocanew.naniyueni.org/js/nico_mylist_search.js?'+d;(document.getElementsByTagName('head')[0]||document.body).appendChild(s);})();

Vimで開発するならこれだけはやっとけ

開発効率を上げるためのプラグインや機能のご紹介。

neocomplcache

http://github.com/Shougo/neocomplcache
自動で補完候補をポップアップしてくれるプラグインで、Vimで効率的な開発をしようと思うのであれば必須のプラグインです。vimrcに以下の1行を加えればプラグインが有効になります。

let g:neocomplcache_enable_at_startup = 1

有効にした上で適当にファイルを編集すれば自動で補完候補が出てきます。候補を選ぶ時はCtrl+Nで次の候補、Ctrl+Pで前の候補が選択できます。
設定項目もたくさんあります。:help neocomplcache@ja とすれば日本語ヘルプが見れるので、参照しながら設定してください。
もしこのプラグインを使ったことがないのであれば、人生の半分は損をしています。

■テキストオブジェクト

Vim標準の機能です。カッコで囲まれたテキストをひとまとまりとして扱えます。例えば

if (hog*e == 2)

アスタリスク(*)を現在のカーソル位置として、di( と打つと

if ()

となります。カッコの中であればカーソルはどこにあっても構いません。また、da( だと

if

となって、カッコも含めてひとまとまりとしてくれます。d の部分はオペレーターなので、c に変えると削除+挿入モードになりますし、v に変えればビジュアル選択できます。また、カッコの中に改行があっても大丈夫です。

func (x) { <-このカッコの中で di{ とすると
    print "hoge";
    print "foo";
}
func (x) {
}

こうなります。対応しているカッコは[]、()、{}、<>、あとは""、''、``などのクオートにも対応しています。他にHTMLタグなどにも使えるのですが、詳しくは:help text-objectsを参照してください。

■surround

http://www.vim.org/scripts/script.php?script_id=1697
前述のテキストオブジェクトと対になるようなプラグインです。
テキストオブジェクトではカッコで囲まれたテキストを扱いますが、surroundは外側のカッコを扱います。テキストオブジェクトと同じ例だと

if (hog*e == 2)

アスタリスクの位置にカーソルを置いて ds( と打つと

if hoge == 2

となります。カッコの置き換えも可能で、オペレーターの d を c に変えて cs(] とすると置き換えられます。

if [hoge == 2]

オペレーターを y にすることで、カッコで囲むこともできます。

if *hoge == 2 | <- *の位置で ys$) でカーソル位置から$(行末)までを囲む -> | if (hoge == 2)
if *hoge == 2 | <- *の位置で vllls) で選択範囲を囲む -> | if (hoge) == 2
if hoge == 2  | <- yss) で行を囲む -> | (if hoge == 2)

対応するカッコやクオートはテキストオブジェクトと同じです。もっと詳しく知りたい方は:help surroundを参照してください。

NERD commenter

http://github.com/scrooloose/nerdcommenter
コードのコメントアウトを楽にするためのプラグイン。他にも色々試したけど、ヘビーに使うわけではなかったのでこれに落ち着いた。
とりあえず範囲を指定した上で、c で1行コメントの切り替え、cu でコメントアウト解除だけ覚えておけば困らない。はデフォルトではバックスラッシュもしくは円マークになっている。
いろんな言語に対応しており、言語にあった構文でコメントアウトしてくれる。

c

print("hoge") -> #print("hoge")

コメントアウトされた状態でもう1回コマンドを入力すると解除してくれる。

print("hoge")


cu

#print("hoge") -> print("hoge")

コメントアウトされてない状態でもう1回入力しても変わらない。

print("hoge")

他にもプラグインならばAlignやsnipMate、開発補助としてはctagsとの連携機能があります。Vimでさらに効率よく開発したい人は調べて見てください。
とりあえず色々調べたいときは:help最強です。ヘルプの日本語訳もあります*1ので、そちらのサイトを参照してもいいと思います。

ニコニコ動画の外部プレイヤーの仕様が終わってる件について

満を持して一般にも解放されたニコニコ動画の外部プレイヤーですが、非常にダサい。
どうダサいかというと、ニコニコ動画にログインした状態だと外部プレイヤーで動画が再生されないという現象がおきます。コメントは飛んでくるんですが肝心の動画が黒い画面のまんまになります。
「アカウント持ってる人はニコニコ動画で直接見てね」という事かもしれませんが、留意事項として書いている訳でもないので非常に不親切だと思います。

SQLiteのDBテーブル更新の落とし穴

SQLiteのDBテーブルを更新(INSERTやUPDATE)するときは、DBファイルに書き込み権限がある事、かつDBファイルのあるディレクトリに書き込み権限がある事。
まさかディレクトリにまで書き込み権限がいるとはorz
なんでも、SQLiteはデータを書き込む時はDBファイルのあるディレクトリ直下に "[dbfilename]-journal" という一時ファイルを作るらしい。なのでディレクトリに書き込み権限がいると。
普通にコマンドラインから叩く分にはほとんどハマらないけど、プログラム経由だったりApache経由だった場合にハマるかも。実際ハマった:-p

Linuxからのストリーミング配信(静止画像編)

動画編との違いだけを書きます。

ffmpeg -loop_input -i [image_file] -f yuv4mpegpipe \
    -s "$SIZE" -pix_fmt yuv420p -loop_output 0 - | \
    mjpegtools_yuv_to_v4l "$OUTDEV"

[image_file]の部分を実際の画像ファイルに書き換えればおk