読者です 読者をやめる 読者になる 読者になる

精霊の箱1章の面倒な計算について

はじめに 『精霊の箱 上: チューリングマシンをめぐる冒険』の1章でガレットが夕方からやった計算についてまとめておきます。2文字、像に書かれた塔文字の修正された後があり、そこには2通りの文字があるので、2 ** 2の4通りの可能性がありますが、1つは既に…

『精霊の箱』に登場する「塔文字」の言語処理系split_boxについて

nnabeyng/split_boxに『精霊の箱』に登場する「塔文字」の言語処理系を置きました。いくつかサンプルもresourcesディレクトリに置いております。 実行方法 git cloneするかダウンロードして、rubyをインストールしていれば、main.rbを以下のようにして実行す…

NFAを使って足し算の関数を作りました

『精霊の箱 上: チューリングマシンをめぐる冒険』の足し算する関数を書きました。requireで呼び出しているファイルはここに置いてます。本に登場する塔文字のようなものをコンパイルして使います。「文字列比較」と「富者の像と貧者の像」も同様にして、作…

NFAで数を補って1の数を偶数に調整する関数を作りました

『精霊の箱 上: チューリングマシンをめぐる冒険』の最初の貧者の像と富者の像が元ネタです。nfa.rbはここに載せているのと同じです。像の裏に書いてある命令から設計図を作って、個々の命令を要素と見なした正規表現に変換して、それをポストフィックス記法…

NFAで文字列比較する関数を書きました

『精霊の箱 上: チューリングマシンをめぐる冒険』が元ネタです。parser書いて、次みたいな感じで動くようにしたいですが、まだできてません。 src = <<-END 100->1 111->1 1 0<-3 200->2 211->1 2 1<-3 END m = Machine.compile(src) puts m.exec("10010101…

罫線用文字の重なり部分の処理を簡単にするgemを書きました

文字列で数独を表示するときに、罫線用の文字をたくさん使うのでそれを扱う専用クラスを書きました。gemを書いたことが無かったので、せっかくなのでgemにして(/nnabeyang/box_drawing_char)に公開しています。罫線の重なり、例えば└と┘が隣接するとき、┴で…

「精霊の箱」の貧者の像と富者の像のようなものを書きました

『精霊の箱 上: チューリングマシンをめぐる冒険』の1章で登場する貧者の像と富者の像のような動作をする関数rich_and_poorを書きました。のようなと言っているのは、最後の状態の処理で@posが逆に移動するのですが、そこは無視しているからです。そのまま2…

数独板をAsciiコードで表示するの作りました。

数独ソルバー作っていくときに、数列で1行でわっと表示したり、9文字ずつ改行するのとかでも、ちょっと見えにくいので、ぱっと見てわかる表示に変更しました。もっと複雑な画面の場合、Jupyter Notebook使うしかなさそうです。今回もJupyter Notebookにした…

ブロッケンで決まる一番自明な場合

上のような場合、灰色で塗りつぶしている部分(以下カーソルのある場所と言います)がブロッケンで決まるとすぐ分かるパターンです。このカーソルの位置のブロックの上下左右のブロック全てに2が含まれています。なので、これらの2でカーソルの位置のブロック…

SudokuLogの使い方(ゲスト向け)

現在、herokuで公開中のSudokuLogの使い方についてです。主にゲスト向けに操作方法のみ解説します。ログインユーザーとしては、いつどんな問題をどのように解いたのかを記録として残す機能がメインになりますが、ゲストとしては、数独解くのに使う紙と鉛筆の…

天才になりたかったら「限界的練習」を身に付けようってことでWebアプリ作りました

『超一流になるのは才能か努力か? (文春e-book)』によると、世の中の天才と呼ばれる人たちは「限界的練習」やそれに類するものを実践して、並の人では考えられないような能力を身につけているそうです。才能というものは、どうやら存在しないそうです。あっ…

ActivityにonTouchEventを書く時の注意

Viewに書いていたonTouchEventをActivityに書くように変更すると、y軸の値がおかしくなる場合があります。調査すると、ViewのonTouchEventの中のevent.getRawY()はViewの座標を基準に計算しますが、Activityはscreenサイズで計算するようです。そのため、下…

Ruby on Railsでコンポジットパターン

FileEntryはbodyを持ち、DirectoryEntryはentriesを持つ。sizeはFileEntryの場合は、body#sizeを返し、DirectoryEntryはentriesのsizeの和を返す。

誤り訂正法のパーセプトロン

『わかりやすいパターン認識』の2章で説明されているパーセプトロンをPythonで実装しました。説明はここでは省きます。 #!/usr/bin/env python2.7 from matplotlib import pyplot from matplotlib.path import Path import matplotlib.patches as patches fi…

無相関検定のシミュレーション

2種類のデータの間に相関が無いとき、標本相関係数rを使って定義した \[ t = \sqrt(n-2)\frac{r}{\sqrt{1-r^{2}}}\] は自由度n-2のt分布に従うことが、理論的にわかります。各データが母集団から無作為抽出されたとき、正規分布に従って標本が抽出されるとす…

母分散が未知のときの平均値の検定のシミュレーション

母分散が未知のときの平均値の検定に使う検定量はサンプルの大きさをnとすると、自由度n-1のt分布に従うことが計算から分かります。これをR言語で、以下のコードで確かめることができます。このコードではn=20の場合にあたります。 # test_t.R size <- 10000…

不偏分散のバラつきのシミュレーション

標本の大きさnの不偏分散のバラつきは、(n-1)(不偏分散)/(母分散)が理論的に自由度(n-1)のカイ二乗分布に従うことから分かります。ここではR言語で、そのことをシミュレーションで確かめる方法を紹介します。 まずtest_chi2.Rというスクリプトを書きます。こ…

ソートアルゴリズムを暗記するためのゲームを作ってみた

最近、courseraでアルゴリズムを勉強していました。そのときやった練習問題の1つのタイプに「xxxソートで4回スワップした結果を書きなさい」というものがあって、これがなかなか勉強になりました。イメージができれば、コーディングはだいたいできるので、こ…

matplotlibを使って計算時間をプロットしてみた

matplotlibを使って、JavaのHashSetとArrayListのcontainsの実行速度を測った結果を図にしました。loglogグラフなので、ArrayListはO(N)でHashSetはO(1)でしょうか。測定方法とテストの詳細は「実装パターン」の付録Aに載っています。 使ったデータ N 1 10 1…

Javaオブジェクトの使用メモリの計算するプログラムを書きました

Javaの定義されたクラスから生成されたオブジェクトのメモリ使用量(64bitマシン)の計算をするプログラムを書きました。プリミティブなフィールドのみに対応しています。(オーバーヘッドの部分と参照のところが32bitとずれます。詳しくは、例えばここを参照し…

Javaで"Hello World"

Javaは(windowsで昔)Eclipseを使って書いたことはあったのですが、コマンドラインから実行したことはなかったので、調べました。環境はUbuntu 12.04で、ここに書いてある通りにしてjavaを導入しました。次に"Hello World"を書いて、実行方法を確認しました。…

ハサミを使うタイミング:CodeIQ 答えの最小性について

*この文章はCodeIQの「ハサミを使うタイミング」に答えた人にしか伝わらないと思います。まだ挑戦されていない方はgihyo.co.jpのこのページを読んで挑戦してみてください。ハサミを使うタイミング(CodeIQ)について、フィードバックを受けてから考えたことに…

rails 3.2: フォームで送信した中身の調査

モデルオブジェクトとは独立にコントローラー、ビューを作ってurlルーティングを設定してあげて、最後はフォームを通して渡っているparamsの中身を表示するまでをやりました。railsのチュートリアルは大抵モデルが絡んで、ヘルパー関数などの挙動を調べるの…

xhr2で文字列を埋め込んだバイナリを送信する

文字列を取り出すために、getUint8で取った文字コードをString.fromCharCodeで文字列に変換してやればokです。サーバー側の処理は https://gist.github.com/4394635 を参照してください。

xhr2で長さの分からないバイナリデータを送る

xhr2でバイナリデータを送信するの続編。今回はBlobで送ります。ArrayBufferはおそらくサイズを途中で伸ばしたり、縮めたりできないので、インプットの大きさが分からない場合はBlobを使って送ります。サーバー側は https://gist.github.com/4394635 を参照…

xhr2でバイナリデータを送信するテスト

xhr2でバイナリデータを送信するテストです。ボタンをクリックするとクライアントから3バイトの情報がArrayBufferで送られます。それを(wsgi)サーバーがバイナリとして受け取り、それをそのままクライアントに送り返します。クライアント側で受け取った3バイ…

C言語(GCC)の&&のもう一つの使い方

"&&"と言えば論理演算子ですが、gccの拡張文法では以下のようにして、gotoのラベルを配列に入れることができます。 include<stdio.h> int main(int argc, char* argv[]) { static void* LABELS[] = {&&LABEL0, &&LABEL1, &&LABEL2}; goto *LABELS[(int)(argv[1][0] - </stdio.h>…

作図ツールcal.js

久々にプログラミングをしてみました。cal.jsはコンパスとものさしで描ける図をJSコードで書いて作図をするJavaScriptライブラリです。下の動画はそのGUI版の試作です。 ここで遊ぶことができます。ソースコードは一応まだ"公開"してません。 描いた図

Rubyの間違いやすいけど、重要な問題募集中

Ruby言語の選択式問題を生成するCUIアプリrcertを作っています。プログラムの方は、だいたいできてきたのですが、問題の方があまりないので、募集中です。

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で公開することにしました。ここからダウンロードできます。