Rubyでぷよぷよ19連鎖

http://okajima.air-nifty.com/b/2011/01/2011-ffac.html にある、連鎖するプログラムを書けというやつ。大きな方針として、最初から以下のようにすべきだった。オブジェクトは各種状態を1つだけ表現するようにして、次々と状態が隣接状態を作るという。やっ…

cronでrakeが動かない問題

「man 5 crontab」とやれば書いてあるけど、Ubuntu(たぶんDebianも)のcronで、rakeが上手く動かないように見えた問題は、環境変数絡みだった。cronはSHELL、LOGNAME、HOME、PATH、NAMEなどの最低限の環境変数を独自に設定して/bin/shを呼ぶ。cronのPATHに…

Cで文字列を反転させる再帰関数

c

Cで文字列を反転させる関数を再帰を使って書け、という問題をふと思い出して書いてみた。久しぶりにCを書くと一発でコンパイルが通らなかったりする。で、プロトタイプ宣言なしだと、小粒の関数から順に並べないとダメだったりして、どうも気持ち悪い。抽象…

クラスが分からない

人気の高いライブラリのコードを読んだりすると、ナルホドそうやってクラスやモジュール、処理を切り分けるのかなんて思うけど、自分で書くとなると、なんだかむちゃくちゃ。読めるけど書けない、聞けるけど話せないというのは外国語の学習では普通のことな…

ぷよぷよ19連鎖にRubyで2時間かかった。

http://okajima.air-nifty.com/b/2011/01/2011-ffac.htmlまたしても2次元配列の初期化を間違えてハマったり、再帰による探索で初歩的なミスをしたり、なにより状態とクラスの扱いをどうするべきかで各関数の出し入れに統一感がなくぐちゃぐちゃになり、とい…

zshでmkdirとcdを一緒にやる

mkdir hoge; cd hogeが面倒なので、.zshrcにコマンドを追加した。なぜ、bashにもzshにも標準でこれが入ってないのだろうか。 function mkcd() { if [[ -d $1 ]]; then echo "It already exsits! Cd to the directory." cd $1 else echo "Created the directo…

Rubyでinvalidなバイト列を含むUTF-8文字列を扱う

Ruby 1.9系ではStringオブジェクトにエンコーディング情報が付加されていて、マルチバイトや複数エンコーディングを扱う日本人としては嬉しい限りだけど、時々エンコーディング関連で例外が発生して落ちすぎるぐらい落ちるように感じるときがある。ちょっと…

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