「JavaScriptパーフェクトガイド」といっても言語自体がインパーフェクト

Module Patternってナンだ? という感じでJavaScript関連をいろいろ調べたりしつつ、「JavaScriptパーフェクトガイド」を読み進めている。すばらしい切れ味の解説で読んでいて面白い。メインの著者の井上さんは、NoSQLの本でも非常にクリアな記述で感動した…

わだばJSerになる

ソフトウェアの世界の半分はCで出来ている。そう悟って少しCの読み書きをしてみようと思ったのと同様に、今後、世界のかなりの部分がJavaScriptで記述されることになるという気がして、急激にJavaScriptに心を奪われている。というか、Web開発のイノベーショ…

Module#module_functionって必要なのかしら

ユーティリティ関数をモジュールに定義しておいて、名前空間を分けてグローバルに利用するというアプローチが良くある。Rubyでは、moduleを使ってメソッドをグローバル名前空間と切り分ける。例えばピュアRubyのWebサーバ「Webrick」には、webrick/httputils…

Mongrel2のコードリーディング……、と関係なく正規文法についてメモ

Mongrel2のコードを眺めていてRagelという有限オートマトンを一般的なプログラミング言語にコンパイルするツールのことが気になった。Ragelのユーザーガイドの冒頭に、rationale的なことが書いてある。それとか、Wikipediaで読み漁ったところを勉強メモとし…

Mongrel2とは関係なく「Ragel」……とも関係なくGarden Path Sentences

Mongrel2のsrc/http11/http11_parser.cを見てたら以下のようなコードがあった。 #line 454 "src/http11/http11_parser.c" switch( (*p) ) { case 33: goto st16; case 58: goto tr25; case 124: goto st16; case 126: goto st16; } if ( (*p) < 45 ) { if ( …

Mongrel2が面白い

クリーンなCで書かれたWebサーバ「Mongrel2」を読んでみた。コードの内外ともにドキュメントはしっかりしているし、関連ブログエントリもあって、非常に勉強になる。何より、毒舌のZed Shawの書く文章は面白くて飽きないのがいい。例えば、src/adt以下にはユ…

RubyのGem::Config.settingというコンベンションの実現方法

スタティックなファイルで構成されるWebサイトを構築する「Stasis」というRubyライブラリを少し読んでみた。lib/stasis/gems.rbの冒頭に、次のようなコードがある。 unless defined?(Stasis::Gems) require 'yaml' class Stasis module Gems class <

8重ループでも十分速い

なんだかイライラしたので、心を落ち着けるためのProject Euler。31問目。イギリスのコインには、2ペンスとか20ペンスという偶数のものがあるらしく、いろいろ組み合わせて、ちょうど2ポインド(200ペンス)になるコインの組み合わせの数は? という問題。最…

ペンスを再帰で数える

Project Eulerの31問目、コインを組み合わせて2ポインドを作るというやつは、再帰を使えばスッキリ書ける。Pythonで書かれたほかの参加者の回答を見てなるほどなぁと思ったので、Rubyでも書いてみた。動的計画法よりも、再帰のほうがスッキリしやすいような…

間違った約分でも正解になる分数

Project Euler 33。49/98という分数で、間違って9を消す「約分」をしてしまっても、「4/8」となり、実は結果は正しい。こういう変な分数を、分子・分母が2ケタのものについて自明なものを除いて全部探せ。というような問題。「65/26→5/2」というのがちょっと…

Rubyで魔方陣

知人に6x6の魔方陣を見せられて、そういえば魔方陣ってやったことないなと思ってRubyで解いてみた。モヤモヤと悩みつつ、良い練習になった。RubyにはEnumerable#permutationという強力なのがある。多重ループを使わなくても、「(0..3).to_a.permutation」と…

シーザー暗号をRubyのメタプロとカリー化で実装してみる

シーザー暗号をRubyで実装する。 "Hello World!".caesar => "Khoor Zruog!" となるような、String#caesarを定義する。RSpecを書くと、 require './caesar.rb' describe String do before(:all) do String.define_ceasar(3) end describe "caesar" do it "ret…

典型的なMacPortsのある朝

RailsプラグインのPaperclipに1行パッチを書きたい ↓ git pull ↓ パッチ受付ガイドラインを読む ↓ Paperclip全体を眺める ↓ bundle && bundle exex rake ↓ テストで落ちまくる ↓ 奇妙なエラーでやる気をなくす…… ↓ 気を取り直してググる ↓ 実はImageMagickが…

On Lispとか読んでRubyとLispの違いをちょっと考えた

全400ページのうち3/4がマクロの説明に当てられている、Paul Grahamの「On Lisp」を8割ほど読んだ。冒頭のCommon Lisp入門で紹介されている標準関数やユーティリティ関数のネーミングのひどさ(やたらと数字でサフィックス付けるとか、rplacaとかってどうよ…

自明なコード

青木峰郎さんの「正しいRubyコードの書き方講座」の本を、いまさらのように買って読んでいる。勉強になるのだけど、以下に引用した添削のbefore / afterにびっくりした。Wikiの*を個数に応じてh1、h2などのタグに開くコードだけど、最終的に4行にしてしまっ…

class_evalでDRYにしてみたかったけど

Railsアプリで書いたビューのためのヘルパークラスをしつこくリファクタリング。以下の2つのクラスがDRYじゃない。今後、LinkedInも足すかもしれないし。 class TwitterPhotoUrl < PhotoUrl def path case @options[:size] when :small add_suffix_to_path(@…

オイラープロジェクトをRSpecを使ったテスト駆動っぽく

オイラープロジェクト17問目。1〜1000までの数字について、「345 -> three hundred and forty-five」のように文字に開いたとき、使われているアルファベットの文字数の合計を求めよという問題。RSpecでやってみた。イテレーションが短いのが好きなので、最初…

stringオブジェクトがクラス名となるクラスを生成する

FacebookやTwitterで異なる写真のURLを一元的に取り扱うために、PhotoUrlクラスを定義して、それをFacebookPhotoUrlやTwitterPhotoUrlに継承するようにしたのはいいけど、結局、ケースごとにインスタンス化するクラスを分けるコードが残って、なんか違うだろ…

sqliteの読み方

c

ソースコードを読め。読むなら例えば……、というときに必ず例に挙がるのがsqlite3。で、GNU Globalでタグを付けて読み始めた。btree.hがまずキモかなと思いつつ眺める。にしても、迷子感が強いので、思わず「sqlite 読み方」とググッてしまった。出てくるわ出…

デカい条件分岐のリファクタリング

FacebookやTwitterのCDN上にあるアイコン、Paperclipでローカルに置いたユーザーアイコンのimgタグをビューから呼び出して生成するために、Railsのヘルパーメソッドで以下のように書いた。 require 'uri' module ApplicationHelper ICON_SIZE = {small:"24x2…

ハッシュを使ってString#gsubする

Rubyで書かれたTwitterクライアント「Earthquake」から。ext.rbを見ると、いろいろ標準クラスやライブラリを拡張してるのだけど、Stringのところで、へぇと思った。 class String def c(*codes) codes = codes.flatten.map { |code| case code when String, …

numeric.cを書き換えてFizzBuzzを1行で

Rubyってオープンクラスだから実行時にコアクラスを書き換えていいんですね!というネタとして、以下のように書いてみた。 require 'fileutils' File.open("./numeric.c", "r") do |klass| File.open("./numeric.tmp", "w") do |tmpfile| while line = klass…

毒を食らわばSSLまでも

Facebookが9月1日から外部アプリでもSSL通信によるトークン取得を必須とするというので、Rails3+Devise+Omniauthで作りかけのWebアプリでのFacebook対応は見送ろうと思ったけど、やってみるのも経験かなーと、RapidSSLでも買ってみるか考え中。RapidSSLは…

CoffeeScriptを使ってFizzBuzz

for num in [1..100] do (num) -> console.log( switch when (num % 15 == 0) then "fizzbuzz" when (num % 3 == 0) then "fizz" when (num % 5 == 0) then "buzz" else num )これは、以下のJavaScriptにコンパイルされる。 (function() { var num, _fn; _fn…

Nginxのバグで201 CreatedのレスポンスでAjaxがホールドする問題

手元のRails3+jQuery-ujsで動いているAjaxリクエストが、サーバにデプロイするとPOST後に延々と時間がかかってレスポンスが返ってこない。POST直後にちゃんとコントローラでrenderされてるのに。良く良く観察してみると、ちょうど1分ほどかかって正常終了す…

旅の恥とirbは使い捨て

.screenrcに以下のように追記した。 escape ^Jj : : bind -c app t screen top bind -c app i screen irb : : bind ^j command -c app「escape ^Jj」という指定で、標準だとCtrl-aのscreenのキーバインドをCtrl-jにしている。主に指の健康のため。で、2打目…

Rubyのensureはどのぐらい強いか

catch(:goto) do begin puts "hey" raise rescue puts "rescued" throw :goto exit 1 ensure puts "ensure" end end puts "caught" % ruby rescue.rb hey rescued ensure caughtなるほどなぁ。exitよりもensure。ensureの利用目的を考えると、そうなのかも。…

RubyのFileとFileUtilsの違い

何となくモヤッとしたまま必要なときにメソッドを調べて使っていたけど、FileとFileUtilsの違いは、Fileが文字通りファイルを抽象化するクラスで、その属性やタイプを調べたり、読み書きしたりするためのもの。ファイルをオブジェクトとして扱うだけではなく…

RubyのTime#strftimeを覚える(これっきりにしたい)

RubyのTime#strftimeのディレクティブは対称性があるように見えて、そうでもない例外があって覚えづらい。 %a - The abbreviated weekday name (``Sun'') %A - The full weekday name (``Sunday'') %b - The abbreviated month name (``Jan'') %B - The full…

ハフマンツリーをRubyで書く

ハフマン符号化に使うハフマンツリーをRubyで作ってみた。2本のキューを用意して、2つのノードをくっつけたり出し入れするのが簡単というのでそういう方針で。本当は1本はプライオリティ・キューでないとエンキュー時にソートするために効率が悪い。 # Huffm…