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

Emacsで文字クラスの置換ってどうやるのかな

Emacsで全角の数字を半角にしたい、というので、以下のように書いた。 (defun numerics-to-hankaku () (interactive) (tr '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9") '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9"))) (defun tr (before after) (g…

Deviseの認証後のリダイレクト

Railsの便利な認証プラグイン「Devise」は、ログイン後に、user_root、rootの順にリダイレクトを試みるけど、これらのnamed routesを、 # redirect when logged-in. namespace :user do root :to => user_show_path(current_user) end のように、ログイン後…

Hash#assert_valid_keys

Railsの画像添付のためのプラグイン「Paperclip」を使った場合に、モデルで以下のように宣言する。 class User < ActiveRecord::Base has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" } end 何も難しいところはないけ…

ActiveRecordのバリデーションはいつ起こるか

Railsに詳しい人と話していて、ActiveRecordのバリデーションはいつ実行されるかというのを完全に誤解していたというか、基本を理解していなかったことに気づいた。Active Record Validations and Callbacksの説明によれば、create、create!、save、save!、u…

RailsでURLのバリデーション

RailsのActiveRecordでは、バリデーションはデータベースへの書き出し、Model#saveのときに走るので、次のような場合に困る。open-uriを使ってフォームで渡されたURLを開き、このURLにアクセスした情報とフォームから入力された情報を使ってレコードを生成し…

Railsの個別設定情報はどこに書くのか

Amazon S3やBit.lyのAPIを使うのに、ユーザー名やAPIキーをアプリごとに管理する必要がある。こうした情報はどこに書くのが正しいのだろうか。Ryan BatesのawesomenessなRailscastの第85回に、やり方があった。YAMLファイルで用意しておいて、よしなに読み込…

RailsのCSRF対策

Rails3でUnobtrusiveなJavaScriptを使うには、rails.jsをHTMLに含める必要があって、これをレイアウトに書くには、「javascript_include_tag :defaults」を入れておくのが基本。で、これで動いたかなと思ったら、今度は ActionController::InvalidAuthentici…

ObtrusiveだったUnobtrusive JavaScript

DeviseとPaperclipを使ったUserモデルができつつあるのはいいけど、Userをdevise/registrations#destroyしようとしても、どうもアカウントが消せない。標準で、 rails g devise:viewとして吐き出したビューのeditには、 %h3 Cancel my account %p Unhappy? #…

モデル名やメソッド名はサンプル通りが無難

Deviseを使ってみたら「user_signed_in?」とか「current_user」とかの基本的なヘルパーメソッドが全然動いている様子がないので、またあれこれググってしまった。どうもRails3リリースへ向けて動いていたころには、ヘルパーを定義する初期化ファイルの呼び出…

大文字小文字、単数複数にご用心

Rails 2.3で途中まで作ったWebアプリは長期放置モード。ブランチ間違いでごちゃっと壊れた感じがして、それをgitを使いこなして修復するのが面倒だなぁと思っているうちに月日は流れ、そのうち、これはぼくには完成させることはできそうもないという気になっ…

Rubyのmapは面倒な気が

オイラープロジェクト32問目。a*b=cで、a、b、cをつなげた数字が123456789のすべてを1つずつ含む組み合わせを求める。 def pandigital? (n) n.split(//).sort.join.to_i == 123456789 end result = [] (1..10000).each do |i| (1..10000).each do |j| break …

C++結構いいかも

C++

CでTRIEを実装してみようと思って、ハッシュが使えると便利なのにと思った。で、ふとC++を調べてみた。ハッシュもイテレータもあるし、stringとか実はCより扱いやすいし、結構便利だなと思った。さらに、boostを見たら、ものすごい勢いでいろいろ拡張されて…

フィボナッチ文字列

オイラープロジェクト230問目。数値の加算の代わりに、文字列の結合によるフィボナッチ文字列というような感じの問題。 (ns euler (:use clojure.contrib.str-utils)) (def str-a "1415926535") (def str-b "8979323846") ; (def str-a "1415926535897932384…

Clojureのマルチメソッド

Project Euler Problem 36 は、10進数表現でも2進数表現でも回文になっている(585、1001001001)のよう数字を100万以下で求めるというもの。Clojureのマルチメソッドでやってみた。オブジェクト指向のポリフォーフィズムみたいなもので、もうちょっと柔軟なも…

100点以下の残りスコアのときのダーツの上がり手順

オイラープロジェクト109問目は、ダーツの計算問題。むかし夜な夜な投げていたので懐かしい。100以下の残りスコアのとき、ダブル・アウトで上がれる得点の組み合わせはいくつあるか。Clojureで書いてみた。 (def all-shots (conj (for [r (range 1 4) t (ran…

副作用がないからキャッシュできる

素数判定をmemoizeしても、ちっとも速くなっていないような気がして変だなと思っていたけど、どうもClojureは関数の計算結果をデフォルトでキャッシュするような機構があるらしい。 % clj Clojure 1.1.0 (defn prime? [n] (cond (> 2 n) false (== 2 n) true…

プロジェクトオイラー35問目

プロジェクトオイラー35問目。123、231、312みたいにグルグル回した数字がすべて素数であるものを100万以下のものについて求めよ。 (defn prime? [n] (cond (> 2 n) false (== 2 n) true (even? n) false (not-any? zero? (map #(rem n %) (range 3 (inc (Ma…

プロジェクトオイラー27、29問目

Clojureでやってみるプロジェクトオイラーの29問目と27問目。29問目は「How many distinct terms are in the sequence generated by a^b for 2 ≤ a ≤ 100 and 2 ≤ b ≤ 100?」というもの。 (println (count (distinct (for [a (range 2 101) b (range 2 101)]…

プロジェクトオイラー28問目

プロジェクトオイラーの28問目。 21 22 23 24 25 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13という5×5のスパイラルがあったとき、[1]、[3 5 7 9]、[13 17 21 25]という各サイズの正方形の角にある数字の合計は101。では、1001×1001のスパイラルの…

Railsで後からモデルにDeviseを追加

サインアップやログイン認証、忘れたパスワードの再発行なんかをMVCのフルスタックでやってくれるというイケてそうなRailsのプラグイン「Devise」を、すでにだいぶ作ったWebアプリで後からモデルに足そうと思ったら、どこにも既存モデルへの追加方法が書いて…

Hello Clojure

何となくClojureを入れてみた。『プログラミングClojure』(Stuart Halloway著・川合史朗訳) という本を読み始めた。 (defn greeting "Returns a greeting" ([] (greeting "World")) ([username] (str "Hello " username))) (println (greeting "Yarb")) (pri…

bitlyをRubyで使う

あるURLについて、ネット上で人々が何を言っているか、話題になっているかを知るのに、最近は、はてなブックマークよりもTwitterのほうがいい感じ。特にbit.lyがいい。bit.lyのAPIをRubyで叩いてみた。どのぐらいRTされているかを表示する。 #!/usr/bin/env …

Railsは楽しい?

Railsを細々と勉強している。Githubにはすごい世界が広がってるなぁという感想と同時に、なんというか全然楽しくないなぁ、やりたいことがなかなかできないなぁというもどかしさも感じる。ライブラリの使い方というのは、細かな動作や作法を試しながら覚える…

モデリングの本質

「UMLモデリングの本質」(児玉公信、2004)という本を読んだ。図書館の蔵書・貸出管理システムとか、航空券の発券システムごときで図を描いて議論するなんて話が大げさすぎるのんとちがうか、というのが第一印象。なんだろ、これはという。一方で、オブジェク…

Railsあれこれ

Railsであれこれ試している。has_manyとかbelongs_toとかって何が嬉しいんだろうと思ったけど、実際にモデルを作ってみてようやく分かった。どうやってモデルを整理するかって自明じゃないということも何となく分かったような。画像のアップロードとかどうす…

多倍長演算ライブラリ

c

RubyはBignumがあってIntegerクラスと勝手に変換してくれるのが便利だなと思っていたけど、多倍長演算(arbitrary precision arithmetic)のライブラリというのは結構ゴロゴロと存在していて、使うのも難しくないらしいことを発見した。きっとJavaにもいいライ…

パーフェクト・シャッフル

52枚のトランプの山を半分に分け、26枚ずつにする。この2つの山を1枚1枚互い違いに挟み込むようにシャッフルする。つまり、 1,2,3,4,5,6....26 27,28,29,30....52という2つの山を 27,1,28,2,29,3....というふうにシャッフルする。これをパーフェクト・シャッ…

ユークリッド互除法って速いのかしら

Project Euler 108問目。nが与えられたとき、 1/x + 1/y = 1/nを満たす、x、yのユニークな組み合わせ数を調べる。初めて組み合わせ数が1000を超えるnはいくつか?RubyのComparableみたいなものを使ってみたかったこともあって、分数クラスを作ってブルートフ…

関数型っぽくフィボナッチ

ブログの間が空きすぎたときの、オイラープロジェクト。25問目。フィボナッチ数列で初めて1000桁を超えるのはいくつ目か、という問題。普通にクラスを作ってメモ化。 class Fib def initialize @memo = {} end def calc(n) @memo[n] ||= begin (n <= 2) ? 1:…

RailsのMapperあたりを読んでみる

「Head First Rails」に続いて、「RailsによるアジャイルWebアプリケーション開発 第3版」をツラツラと読んでみた。ホビープログラマとしては、テストの話あたりが新鮮で面白かった。まずURLのラウティング(ディスパッチ?)処理をやってるActionController::R…