2011-01-01から1年間の記事一覧

Enumerable#injectって分かりやすいのかな

CSVって、RFC4180とかに仕様がまとまってるんだとマイルドに驚きつつ、RubyのCSVクラスをのぞいてみた。FasterCSVと呼ばれていたものが正式にRubyに入り、1.9系のRubyではインターフェースが変わっているという話。CSVライブラリのソースコードには、冗長と…

Ruby 1.9.2でrequire 'sqlite3'は遅かった

単語帳を作るために英辞郎CD-ROMを買った。sqlite3に突っ込んで、Rubyで引けるようにして、Emacsでメジャーモードを作った。require 'sqlite3'が異様に遅い。Ruby 1.9.2から1.9.3にアップデートしたら遅いのが解決した。何だったんだろうか。うーん、「異様…

周囲の世界が歪む錯視をCanvasで

Canvasでアニメーションによる錯視を作ってみた。20〜30秒ほど中心を見つめ、視野全体で螺旋が渦巻く感じを得た後に周囲の部屋を見渡すと、数秒間ほど柱なんかがグニャグニャと歪んで見える。人によって見える程度がかなり違う模様。 http://dl.dropbox.com/…

Canvasでタートルオブジェクトを作ってドラゴンカーブを描く

JavaScriptの習作として、Cavansを使ってドラゴンカーブを描いてみた。若干なにかが違うような気がしつつ……。ドラゴンカーブは、長い帯を半分に折って、さらに半分に折って、さらに……という操作を続けて、最後に折り目がそれぞれ直角になるように開いた図形…

素振り重要

いろいろとJavaScriptを勉強している。面白いような、「うげぇ、まじか、これはひどいんじゃないか」とウンザリするような感覚がなかなかいい。素振りを始めた。以下のようなHTMLを、上から一気に手打ちする。 <html> <head> <title>grid demo</title> <script type="application/javascript"> function draw_grid () { var ct</head></html>…

「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分ほどかかって正常終了す…