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 …

Go言語でディレクトリ名からファイル情報一覧を取得する

Go言語でどう書けば良いか調べてみました。ReadDir(dirname string) ([]os.FileInfo, error)でファイル情報の一覧が得られるようです。 package main import ( "io/ioutil" "os" "fmt" "strings" ) func main() { list, err := ioutil.ReadDir(os.Args[0]) i…

wiki2htmlでwiki2htmlで使える記法の説明を書いてみました

基本的にlivedoor Wikiの記法ですが、使える機能は限られています。ここに記法に関する文章を設置しました。もちろんwiki2htmlを使って書きました。ソースはページ最下部にリンクがあります。書いている途中、"||=", "=||", "~~"..などの意味のある文字を文…

wiki2html:エラーハンドリング

方針としては パースエラーしても、解析をできるだけ継続する できればhtmlを生成する できるだけ多くのエラーを報告する 意味の無いエラーは書き出さない htmlが生成されるまでの時間は遅くない です。これができれば、一度に多くの文章を書いて後で一気に…

wiki記法のテキストをhtmlに変換するツールをGo言語で書いてみた

最近、Wikiを書くのですが、webアプリだとブラウザが落ちるかもしれないし、なんか色々と不安定なのでローカルアプリでWikiからhtmlに変換するなり、エラーチェックするなりするツールが欲しいと思いました。たぶん、探したらあるのかもしれませんが(ほらこ…

optparseを使ってみた

ARGVとOptionsParserの仕様を以下のコードで確認してみました。ARGVはOptionParser#parse!するとオプション分はシフトするみたいですね。 $ ruby --version ruby 1.9.2p180 (2011-02-18 revision 30909) [i686-linux] #!/usr/bin/env ruby require "test/uni…

opts-goのforkをgithubに置きました

Go 1でも使えるようにしたopts-goは次のようにしてソースコードを得ることができます。 git clone git@github.com:nnabeyang/opts-go.git github:nnabeyang/opts-go

Go言語でファイルを1行ずつ読む

catの-nオプションだけ書いてみました。行数を表示させるのにreadlineが欲しかったのですが、bufioのReaderがReadLineを持っていました。 package mainimport ( "bufio" "fmt" "io" flag "opts-go" "os" )var flagNumber = flag.Flag("n", "--number", "Numb…

opts-goを使ってみた

前回echoを書いてみたのですが、flagパッケージでは"-en"みたいな指定ができませんでした。それで、opts-goというものを代わりに使ってみました。"POSIX- and GNU-style options for go"って書いてあります。"-en"くらい扱ってくれそうですね。ところが、ダ…

Goでechoを書いてみた

echoってshellのあれです。echoにもオプションがあって、"man echo"で 説明 echo は与えられた string をそれぞれ標準出力に書き出す。それぞれの間にはスペースを挟み、 最後の引数の後には改行を行う 。ただし -n オプションが指定されている場合は改行し…

GNU indentを使ってみた

わざとらしく次のようなファイル(hello.c)を用意します。 #include<stdio.h> int main( void ) { printf("hello, world\n"); return 0 ; } $ indent -st hello.c すると #include<stdio.h> int main (void) { printf ("hello, world\n"); return 0; } が標準出力されます(-stが</stdio.h></stdio.h>…

goのサブコマンドを補完するように設定した

goを久しぶりに更新しました。そしたら8g, 8lとかが無くなって少し焦りました。なんとなくgoとタイプしてみたら、goコマンドに統一されたようだということが分かりました。いつごろからgoになったんでしょうね。サブコマンドの補完機能が標準でついてなかっ…

3月のふりかえり

4月1日は、いろいろとややこしいので今日の更新にしました。そして、3月31日に更新しないのは、 「まだ3月が終わらないのに3月をふりかえるのは、無いんじゃないかな。その月の最後の23時59分59秒..まで何かやっていたほうが良いんじゃないかな」という思い…

MiniTest::Assertionsはモジュールであることについて考えてみた

『初めてのRuby』によると、モジュールは拡張機能(または名前空間など)に使われる習慣があるようです。例としてNumericクラスがRailsではモジュール(ActiveSupport::CoreExtensions::Numeric::Bytes)で拡張されているのが紹介されています。MiniTest::TestCa…

GitのNotesを利用してみた

Git

ソースコードの説明をerbで使える記法にして、Notesに入れて管理することにしました。"git log --reverse -p"すると、こんな感じになります(はてな記法と競合するのでgistに置きました)。プレーンテキストですが、はじめから通して読むことができます。Notes…

電子書籍:Ruby標準ライブラリの再実装(test/unit)を公開

最初から順に読んでいけば"test/unit"が分かることを目標にしたドキュメントを書いています。epub形式のみで最新版はここに公開しています。対象読者はRuby初心者で、分量も短いです。"test/unit"はコンセプトというか、どんな感じのものを書こうとしている…

shellからChrome filepathでコンパイルして生成したhtmlをすばやくチェック

"chrome "でファイルが開き、フォーカスされるのでhtmlを生成した後に書き込んでおくとチェックしやすいです(firefoxとかでもできると思いますが、試してません)。あと、下のRakefileの3行目で依存性が左ほど章が大きいのは偶然ではありません。ch03.html, c…

Gitリポジトリ全体で同じスクリプトを実行する

Gitリポジトリ内のコードが全て動くかどうか気になって、こんなRakefileを書いてみました。なぜコードが動くか調べたかったかというと、"git bisect run"するとき、実行できないコードが混ざっていると混乱するからです(最後にruns, failuresに-1してるのは…

2月を振り返る

とても遅い振り返りですが、なかなか時間がとれませんでした。2月はジェネリック・プログラミングについて勉強してきたのですが、ものにできないままになっています。「プログラミング原論(ステパノフ)」に載っている定理、補題などの証明をすっ飛ばしたのが…

意図しないメソッドの上書きを防ぐテクニック

Rubyには意図しないメソッドの上書きを防止する方法があります。このテクニックは例えば、既にあるクラスに独自拡張を加えるときなどに有効です。既に定義されているクラスをAとし(Aが例えばStringの場合では既に定義されています。Aのままの場合は、既にク…

コンテナlistの実装:プログラミング原論(ステパノフ)の補助資料

今回はlistのテストを書きました。全ソースコードはプログラミング原論(ステパノフ)のこのページにあります。 #include<cassert> #include<cstddef> #include<new> #include<cstdlib> #define pointer(T) T* template<typename I, typename O> void copy_step(I& f_i, O& f_o) { sink(f_o) = source(f_i); f_o = succe</typename></cstdlib></new></cstddef></cassert>…

コンテナslistの実装:プログラミング原論(ステパノフ)の補助資料

プログラミング原論(ステパノフ)のサンプルコードはここにあるのですが、1万行を超えていることもあり、少し読むのに時間もかかります。ということで、単方向リンクリスト(slist)に関係するところだけ引っ張り出して、テストを書いてみました。他のコンテナ(…

再帰からループへの変換

バイナリサーチを例に、再帰からループへの変換をしてみます。バイナリサーチは、(a[0] vより小さければ、firstから今調べたところまでにvは無いことが分かります。なので、次回firstはnext+1にして、調べる領域を縮めることができます。逆の場合も同様です…

トレイト・クラス

C++

トレイト・クラスと呼ばれる、C++のイディオムを使うと、型を返す関数(型関数)が作れます。型関数はテンプレートを利用して実現されていて、コンパイル時に実行されることになります。下の例だと、構造体input_typeがトレイト・クラスにあたり、InputType(型…

1月を振り返る(2012)

1月はHello Algorithmを作っていたこともあって、blogのエントリもほとんどそれに関するものです。もっとオープンな技術に関する記事を書きたいのですが、勉強不足になりました。1月は、いくつか機能を追加することには成功しましたが、2月はUIを改善したい…

変数追跡機能

現在Hello Algorithmに変数追跡機能を追加しようとしています。だいたいどんな感じの機能か伝わるようなデモができたので、デモだけ公表します。 これまでのおおよその機能は数学ガール-乱択アルゴリズム-のp109にあるようなシーンを再現することをイメージ…

unit/test(1ファイルの場合)

Rubyでテスト駆動開発するのはとても簡単です。test/unitをrequireして、TestCaseを継承したclassをファイルに作って実行するだけです(テストメソッドは多分"test_"で始まる必要がある)。test/unit.rbの方でテストの実行が記述してある(test/unit.rbの最後の…

特殊変数$!

るりまサーチによると最後に発生した例外が$!に入るそうです。 #!/usr/local/bin/ruby puts "$! = #{$!}(#{$!.class})"#=>"$! = (NilClass)" begin raise "test" rescue puts "$! = #{$!}(#{$!.class})"#=>"$! = test(RuntimeError)" end puts "$! = #{$!}(#…

ブロック付きメソッド

Rubyを今日から触りはじめてます。test/unitを見ててat_exitというブロック付きメソッドを見つけたので、動作を確認してみました。 #!/usr/local/bin/ruby $wasrun = false def say_hello_once at_exit { puts "hello, world!" }unless $wasrun $wasrun = tr…

YIELD関数利用可能になりました

YIELD関数がHello Algorithmから利用可能になりました。YIELDは、関数を壊さずに変数の変動を追うことができる便利な関数かなと思います。

YIELD関数を作ってみた

現在、前の投稿で考えていたYIELD関数を作っています。機能は少し変わりました。実際に作っているYIELD関数はYIELD(関数名, 引数1, 引数2,..., '変数1 変数2 ...')でジェネレーターオブジェクトを生成します。NEXT(ジェネレーター)で最後の引数で指定した変…

もしpythonにyieldを埋め込む関数があると

以前、コルーチン化することで関数のテストのしやすさが上がるんじゃないかと考えたことがあります。そのときはpythonでyieldを使っていたのですが、テストのためだけにyieldを入れることはまずありえないです。替りにコメント中のyieldを実行する関数YIELD…

3-SATを解く乱択アルゴリズムがHello Algorithmで動いた

以前Pythonで実装したソースコードを数学ガールに登場する擬似コード風に書きなおしてみました。省略しているところを補えばこのコードは、Hello Algorithmで動かすことができます。 failed <- [] procedure RANDOM-WALK-3-SAT(f, f_size, n, R) #p353。ただ…

3-SATを解く乱択アルゴリズムを実装してみた

数学ガール-乱択アルゴリズム-の9章にある3-SATを解く乱択アルゴリズムをPythonで実装してみました。p336の強正美優問題は正しく計算できるところまで確認しました(テストではupdateとbf_three_satを使ってます)。ラウンドあたりの成功率が妥当かどうか調べ…

Hello Algorithmで「アルゴリズムイントロダクション」

「アルゴリズムイントロダクション(改訂二版:第一巻)」にあるプログラムを「Hello Algorithm」上で動作できるようにしようとし始めました。そのためにOR, AND演算子を追加しました。データ構造への対応するかどうかは検討中です。対応状況 p16:挿入ソート

Hello Algorithmが"みんなの「数学ガール」"に載りました

画像・動画・音楽・感想文などで、 数学ガールの世界を盛り上げる読者のページとして"みんなの「数学ガール」"があります。今日、そこにHello Algorithmのリンクが追加されることになりました。(結城さん、ありがとうございます。)このページにリンクされた…

デバッグモードを追加しました

デバッグモードを追加しました。行ごとにプログラムを実行できるのが特徴です。print関数のフォーマット部分が特に未熟です。記念に動画も撮っておきました。 技術的な話 作ったモノを記録するだけだと、ブログとしての意味あいが薄れるので、情報を共有した…

Hello Algorithmで再帰関数が使えるようになりました

Hello Algorithmで再帰関数が使えるようになりました。たとえば、次のようなプログラムも動かせます。 procedure Fib(n) if n = 1 or n = 2 then return 1 else return Fib(n - 1) + Fib(n - 2) end-if end-procedure print('Fib(5) = %d\n', Fib(5))

巨人の肩に立つ(2012年の抱負)

ぼくはいわゆる"今年の抱負"というのを決めたことがないです。細かいことを決めると、色々あって結局しないだろうし、大きな目標にしても、大抵は決まりきっていたので掲げるほどでもありませんでした。ところが、今年くらいからは、さて今年は何をやろうか…

数学ガールに登場する擬似コード風のプログラミング言語が実行できるwebアプリを作り始めました

なんで作り始めたのかとか、色々説明したいと思いますが、とりあえずデモ動画を貼りつけておきます。 アプリ名前は「Hello Algorithm」で、urlはhttp://helloalgorithm-nnabeyang.dotcloud.com/です。 ステータス 僕自身が"Hello Algorithm"を使って実装した…

2011年を振り返る

5月 C/C++のポータブルな実行環境としてのGoogle NaCl はてなブログは5月13日から始めたようです。実はこれが一番ブクマされた 記事です。たしかこの日にグーグルのイベントがあってNaClってのが旬だったという ことが大きいと思います。当時はNaClはflagを…