モンティ・ホール問題をGoで確かめてみました

少し前に参加した続・わかりやすいパターン認識の読書会でモンティ・ホール問題について知ったので”司会が正解を知っているか否かによる結果の違い”について、ちょうど触ってみたかったGoで確かめてみました。(Go触りたかっただけ) モンティ・ホール問題って…

Pythonで画像の簡単なカテゴリ分け

これはPython Advent Calendar 2014の16日目です。 実践 機械学習システムを読んでいて画像のパターン認識が面白そうだったので実装して遊んでみました。主に10章のコンピュータビジョンと3章のクラスタリングを参考にしました。ほとんど、NumPyやscikit-lea…

FRPを調べててelmに入門した話

これはElm Advent Calendar 2014の11日目です。 よく知らなかったFRP(Functional Reactive Programming,リアクティブプログラミング)について調べてて少しだけElmに入門しました。 ※先週やった実装なのでElmのバージョンは0.13です。いろいろ変わったらしい0…

ScalaでFizzBuzzやってみた

(4年半ほど仕事にやられてましたが何とか元気です。) 先日ひさしぶりにFizzBuzzを書く機会があったので再学習中のScalaでもやってみました。 ■ 無限リストによる実装 まず、1から始まるFizzBuzzの無限リストを100まで評価する方法で実装してみました。 // 1…

アプレンティスシップ・パターン

本書は「徒弟制度」をキーワードとして物事に習熟するための方法が記載されている。確かに「無知の受け入れ」と「適切なフィードバック」の繰り返しは大事だと思う。後は終わりが無いことを楽しむこと。 問題は「適切にフィードバックしてくれる環境と人」を…

Perl6はまだ様子見する。

そろそろかなとrakudo(#29)を触ってみた感想。もう少し待とう・・・。とりあえず触った事を記録。試したのは加算器関数。まず、イメージで実装してみる。 sub make_adder($n) { {$n += $^i} } my $adder30 = make_adder(30); $adder30.(1).say; # 31になる $…

PerlでDSL

『Rubyによるデザイン・パターン』を読み終えて内部DSLが分かった気になった。調子に乗ってPackRat*1をPerlに移植してみた。少しPerl風にアレンジ。まず、内部DSLから。 # 内部DSL(backup.pr) backup { from => '/home/hoge/old1', to => '/tmp/backup', fil…

Rubyでチャーチ数

Rubyに慣れるとっかかりとしてチャーチ数を定義してみた。 lambdaで包まずに関数リファレンスを関数に渡す方法がわからない。。 # 数値(xに対するs関数の適用回数で数値を表す) def zero (s, x) x end def one (s, x) s[x] end def two (s, x) s[s[x]] end d…

PHPとファーストコンタクト

PHP

食わず嫌いだったPHP。触ってみると手に馴染みそうで良い。 早速、フィボナッチ数列に挑む。

Perlで対話型コマンドの実行

前回はTeraTermマクロで対話型コマンドの実行をがんばった。けど扱いづらい。Perl使いたい。というわけで、telnetコマンドをfork/execしてpipeで標準入出力を操作してみた。*1 *2まず、ファイルハンドルから値を読み込む関数と書き出す関数。読み出しでは応…

TeraTermマクロで対話型コマンドのテスト

定期的に行われる対話型コマンドの回帰テスト。バッチ化できないからって毎度手動でやるのはアホらしいよね。というわけで、TeraTermマクロでがんばってみる。まずは簡単なテスト対象。 #include <stdio.h> int main() { int n = 0; do { printf("in => "); scanf("%d</stdio.h>…

そしてCOBOLerへ…

仕事でCOBOLを扱うことになった。少し勉強中。とりあえずオブジェクト指向してみる。まず、speakメソッドを有するAnimalインタフェースを定義する。 *>「Animal」インタフェース identification division. interface-id. Animal. procedure division. identi…

非決定性 with 例外

『On Lisp』の非決定性が面白い。 (define (two-numbers) (list (choose '(0 1 2 3 4 5)) (choose '(0 1 2 3 4 5)))) (define (parlor-trick sum) (let ((nums (two-numbers))) (if (= (apply + nums) sum) `(the sum of ,@nums) (fail)))) > (parlor-trick …

Perlで継続

現在、『On Lisp』が3巡目の終盤に差し掛かっている。でも、いまいち継続を理解できていない。分かり易い解説を見つけたのでPerlに翻訳してみた。(本を読む FizzBuzzとGaucheで学ぶ継続の基礎) use strict; use warnings; sub fizzbuzz { my ($next, ($n)) …

副作用関数のユニットテスト

ユニットテストの自動化で困るのが副作用を起こすコード。例えば、ファイルのI/Oを含む関数は自動テスト化に少し悩む。 # hoge.pl use strict; use warnings; package HOGE; use IO::File; main(@ARGV) if ($0 eq __FILE__); # テストしたい関数 sub main { …

Perlで遅延評価

遅延評価とは、HaskellやD言語なんかにある「アレ」のことだ。 遅延評価(ちえんひょうか、lazy evaluation、delayed evaluation)とは、計算機科学におけるプログラムの評価手法の一つ。主に関数型言語で使用される。対義語は先行評価(eager evaluation、s…

Perlでbind

関数に引数を束縛するbind関数のperl版。 sub sub_bind { my ($sub, @args) = @_; sub { $sub->(@args, @_); }; } 上位は呼び出すだけにしたい場合などに重宝する。

Lispお勉強中

心に余裕が出てきたこともあってLispを再学習中。今は『実践Common Lisp』を読んでいる。やっと第12章が終わった。 思い返すと腰を落ち着けてプログラミング言語の勉強をやってない。何とか使いこなしているのはC言語とPerlくらい。どちらも仕事で使ってい…

Binary Hacks

『Binary Hacks ―ハッカー秘伝のテクニック100選』を読み終えた。 本書はその名のとおりGNU/Linux依存のハックが満載だ。ダンプを読み読みしたり、プロセスの中からプロセス情報を読み読み・書き書きしたり、etc。 抽象化には限界がある。移植性を完全に無視…

C言語でクロージャ

クロージャって何だろう? クロージャは関数と環境を一緒にしたものである。クロージャは、関数がレキシカル環境から何かを参照するときには暗黙に必ず作られている。 『ANSI Common Lisp』- 6.5 クロージャ より どんな風に使うのだろう? アキュムレータを…

map and grep, foreach on C

Perlでリスト処理といえばmapとgrepにforeachだと思う。 たとえば、こんな感じで使える。実行すると"6 12 18 24 30"が標準出力に出力される。 #! /usr/bin/perl use strict; use warnings; # 要素に1から10を持つリストを生成する。 my @list1 = (1..10); # …

プロダクティブ・プログラマ -プログラマのための生産性向上術

『プロダクティブ・プログラマ -プログラマのための生産性向上術』を読了。本書のテーマはプログラマの生産性向上だ。どうすれば向上するのだろう?道具の習熟度を上げて適切に使いこなせば良い。これが本書の結論だ。それを個別の、例えばショートカットの…

クロージャによるクラスの代替

個人的にクロージャが使えればクラスの構文は要らないと思っている。例としてスタックを表すクラスをクロージャを使って定義してみる。まず、D言語で。

C言語で似非Java風味の例外フロー

Javaにはtry〜catch〜finallyの例外フローが存在するけどC言語には無い。でも実現することはできる。こんな感じで使える。 #include <stdio.h> #include <stdlib.h> #include "exception.h" /* 例外フローの定義 */ /* 例外を投げる関数 */ void sub1(EXCEPTION *e) { printf("</stdlib.h></stdio.h>…

プログラミングClojure

やっと『プログラミングClojure』を読了した。本書は薄いし分かり易い。入門や概要を掴むにはもってこい。訳も読みやすいし。ちなみにClojureとは、Java仮想マシン(JVM)上で動作するLisp方言のことである。Lispなので当然S式、つまりカッコだらけ。見た目は…

最初のプログラムはハローワールド?

プログラム言語で最初のプログラムと言えばハローワールド。 もはや定番ですが分かりやすいとは言えない。例えば『プログラミング言語C』では最初に書くべきプログラムとして次の「ハローワールドを印字する」コードを掲載している。 #include <stdio.h> main() { pri</stdio.h>…

Perlのサブルーチン定義を簡素化

Perlはサブルーチンの引数を明示的に取り出さなくてはならない。 たとえば、数nを+1するサブルーチンの定義は次のようになる。 # 定義 sub inc { my ($n) = @_; $n + 1; } # 呼び出し print inc(255) , "\n"; # 256と表示 めんどくさい。Rubyっぽくしたい。 …

開会の挨拶

問題 誰も序文なんか読まない。 解答 序文を第1章と読んだらいい。 解答によって作られた新問題 第1章はたいくつだ。 解答 第1章なんかやめて、第2章を第1章と読んだらいい。 『ライト、ついてますか—問題発見の人間学』より ドナルド・C・ゴース (著),…