Ruby技術者認定試験(シルバー)練習アプリrcertの更新

実施日、読み込んだファイル、間違えた問題などのレポートを書き出すように修正しました。 動画 ソースコード

Ruby技術者認定試験(シルバー)のような試験を生成するアプリを公開しました

Rubyに関する選択式の試験が作れるCUIアプリrcertをgithubに公開しました。資格試験に興味がなくても、間違いやすいメソッドなどの問題を作っておいて、一日のはじめにやれば、ミスが減って開発が早くなるかもしれません。と言っておきたいと思います。 デモ…

2種ある範囲演算子の暗記方法

範囲演算子は'0..10'と'0...10'があります。どっちかが10を含んで、どちらかが10を含まないんですが、さぁこれをどう暗記しようかなという話です。使用頻度が高い方をおぼえたら、消去法でどちらの意味も分かるのですが、なんとなく範囲演算子ってあまり書い…

静的ページのミドルウェア(Rack)

Rack::FileのラッパーStaticが静的ページを扱うミドルウェアになっています。railsもpublicディレクトリの表示は同様の方法をとっています。なので、静的なページをpublicに置くとそちらが優先されます。 動作デモ

Engine, Applicationはクラスメソッドの呼び出しに失敗した場合は、インスタンスメソッドを実行する

railsアプリのconfig.ruを見ると"run XXX::Application"となっていて、でもRails::Applicationにはcall(env)がなくてってので、どうして動くのか理解できませんでしたが、ソースコードを見ると class Railtie autoload :Configurable, "rails/railtie/config…

ctrl+cでrackサーバーをシャットダウンする

Rack.version == 1.1で、 require 'rack' Rack::Handler::WEBrick.run HelloRack.new, :Port => 9292 とするとctrl+cでサーバーがシャットダウンできないので、次のように書き換えてシャットダウンできるようにしています。 rackアプリは設定ファイル(hello.…

Rails::Initializable::Collectionのtsort_each

tsort(トポロジカルソート)は主に依存関係の解決に利用されるようです。この処理の前には、あの処理をやっておくというように指示すると、tsortはその条件に合うようにソートします。次のコードはRailsの初期化処理とほぼ同じ実装で、:afterまたは:beforeで…

コントローラーとビューの連携

本物は色々なモジュールに分かれてたり、継承してたりするわけですが、究極に単純化するとコントローラーがview_contextというオブジェクトを持っていて、renderを呼ぶタイミングでTemplateクラスを通してerbファイルがコンパイルされて、ソースはview_conte…

Validations#validatesの簡易版を実装

ActiveSupport::(Callbacks, Concern)のいい加減なのができたので、validatesのいい加減なのを作ってみました。

複数のモジュールにあるStaticeMethodsを1つのクラスのクラスメソッドにまとめる

1つ前までのConcernではうまくいかないので修正。これでほぼrailsのConcernと同じです。 解説 まずMとM2はConcernをextendしたときに@dependenciesが定義されます。"include M"で、M.append_feachers(M2)が呼ばれます。M2は@dependenciesをinstance variable…

callbacksの簡易版を実装

いやぁ、Ruby on Rails Guilds:Get Startedをやってみて、validationまわりがどうなっているのか気になったので読んでみました。validatesはActive SupportのCallbacksモジュールのset_callbackでValidatorオブジェクトがvalidateをコールするのをvalid?を実…

1つのモジュールの中で特異メソッドとインスタンスメソッドを定義して、クラスに引き渡す方法

active supportを使うと、次のようになります。 require 'active_support/concern' module M extend ActiveSupport::Concern def method2 puts "method2" end module ClassMethods def method1 puts "method1" end end end class C include M end C.method1 …

Rakeを実装してみました

rubyのライブラリの再実装シリーズ第二弾。第一弾はunit/testでした。なんか、文章書くのも大変なので、githubにmyrakeという名前で公開しました。commitはこまめにしているので、最初のcommitから読んでいけば開発の追体験?ができます。現在のところRakefil…

testモジュールのtest_supportを使えば、重いテストが一目瞭然

unittest.mainをテストランナーに使うと、途中経過では'.'が書き込まれるだけで、どこのテストの実行で詰まっているのか、よくわかりません。test_support.run_unittestはテストクラスの登録は手動にはなりますが、現在実行中のテストメソッドが何なのか知ら…

assertはOオプションでスキップされる

知ってました?多分知らないのは恥ずかしいことだと思いますが、知りませんでした。 # assert.py #!/usr/bin/env python2.7 assert(0) print 'skiped assert(0)' を使って、実験してみます。 $ python assert.py Traceback (most recent call last): File "a…

テストケースのロードを自動化した

テストコードを今まで個別に実行してましたが、ファイルが増えてきた(20くらい)ので、メタクラス(TestMeta)を使って、テストケースを自動で集めて一度にすべてalltests.pyで実行するようにしました。 #!/usr/bin/env python2.7 # alltests.py from test impo…

&&と||は何をやってるか調べてみた

C言語の"&&"と"||"は短絡評価をする演算子と知られています。実際には、どんな感じで評価しているか調べてみました。 // and_or.c #include<stdio.h> int and(int a, int b) { return a && b; } int or(int a, int b) { return a || b; } int main(void) { printf("1&</stdio.h>…

python2.7にしたらunittestにskipが追加されてた

どういうときにテストはスキップすべきでしょうか。多分、pythonのバージョンだとか、OSによって分けるのに使うことは悪いことではないと思います。今回ぼくがskipした理由は、単にすぐに解決できそうにないからというものでした。解決しないからといって、…

有効かどうかわからないキーでmapに値をアクセスする

golangのmapはPythonのdictよりRubyのHashに近くて、無効なキーでアクセスしてもpanicしたりせず、各型の初期値を返すようです。map[string] stringならば、""を返すし、map[string] intなら0です。map[string] *Typeならnil。最後のケースを、次のコードで…

C言語のenum的なことをする

golangでiotaを使うと、0から順に数字を入れてくれます。iotaのカウントはグループ単位なので、')'を抜けたあとは再び0にリセットされます。加えて、"cont ( identifier Type = iota.."とすると、typeが付くようです。それを以下のコードで確認してみました…

wiki2htmlのwindowsバイナリを公開しました

wiki2htmlも作り始めて3週間になります。4月も今日で最後ということもあってきりが良いので、windowsのバイナリだけgithubのgistで公開することにしました。ここからダウンロードできます。

はてなブログ始めます

はてなブログをはじめました。理由ははてなダイアリーにはオープンな技術についてのメモを書くこと専用に使いたいからです。はてなブログは日記的なことを主に書きます。だからwiki2htmlで何ができるようになったとか、hello algorighmがどうなっただとかは…

os.Readlinkはwindowsはまだサポートしてないようです

"link"という名前のショートカットを作って package main import ( "fmt" "os" ) func main() { name, err := os.Readlink("link.lnk") if err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) } fmt.Printf("%q\n",name) } をビルド実行したら、 …

パスからファイル、ディレクトリ、リンクで処理を分ける

与えられたパスがファイルなのか、ディレクトリなのか、リンクなのかを調べるには、os.Stat(path string)でまずFileInfoを得ます。それから、FileInfo.Modeにos.Symlinkのフラグが立っていればリンク、ディレクトリの場合はIsDirで調べられます。リンクから…

wiki2htmlをwindows xpで使ってみました。

よくアイコンにマウスオーバーして、プログラムにファイルやディレクトリを引数として渡しますが、実は特別な設定をする必要はありません。windows xpの方で引数を渡してくれるようです。しばらく自分で使ってみて、使える感じだと判断したら、まずはフリー…

はじめてのCoq

coq

Coqは証明支援系というらしいですが、普通の意味でのプログラミングできないことにはあまり役にたたないと思います。証明にこだわらないで、せめてソート関数なり、、、いやもっと実用的なものをプログラミングしてみたら良いんじゃないかと思います。ですが…

テストデータに期待される値を埋め込む

エラー処理のテストを書いているのですが、期待されるエラーメッセージをテストデータの中に埋め込むとテストコードを変更することなしにどんどんテストケースを追加することができます。 たとえば、 [[ページ1が開きます。 `` ERROR "1:2: expecting \"]]\"…

素数の篩への道

golang.jpにある並行処理の例、素数の篩(ふるい)をボトムアップに作ってみます。まず、 package main import "fmt" func main() { ch := make(chan int) go func() { for i := 0; ; i++ { ch <- i } }() result := "" for i := 0; i < 10; i++ { result += f…

Hello Concurrency

0から順番に整数を生成する無名関数それを受け取ってresultに追加する処理が並行して処理されてるってことだと思います。go (処理)で処理がバックグラウンドで行われ、その処理結果がch(チャンネル)を通して得られるっと。 package main import "fmt" func m…

メソッドチェーンは使えないことに気付いた(誤)

*コメントにあるように、メソッドチェーンは使えますが、以下のような現象が起こるのは事実ですしばらく書いてようやく気づきました。仕様はどうか知りませんが、実装としてGo言語はメソッドチェーンは使えないようです。 package main import "fmt" type A …