2016年9月28日水曜日

C/C++中規模プロジェクト用のMakefileを自動生成する

C/C++中規模プロジェクトのための超シンプルなMakefile」という記事が話題になっていた。

僕はC/C++のプロジェクトを作る場合、いつも Autotools (Autoconf, Automake, etc. の総称) を使ってる。


2015年7月26日日曜日

Gitを使う上で便利なzshの設定

僕がzshrcに設定している Git 用の設定を紹介する。
  • プロンプトにブランチ名を表示
  • run-help をカスタマイズ
あんまりヘビーなカスタマイズはしてなくて,必要最低限,って感じだ。

まずは「プロンプトにブランチ名を表示」から。

2015年6月17日水曜日

SICP3章後半に書いてあるストリーム(遅延リスト)について

SICP3章ってそんなに「オブジェクトはオワコン! 関数プログラミング的なストリームこそ最強!」な内容だったかなぁ、と思って3章の最後を読みなおしてみたが、こんな内容だった:

2015年3月29日日曜日

Gitの最初の姿

この4月で、Gitが誕生してからちょうど10年になるようだ。
10年前、つまり一番最初のGitはどのようなプログラムだったんだろう?

当然だけど Git プロジェクトのリポジトリには10年前の最初の姿が e83c516 というコミットとして記録されている。
% git log --max-parents=0
commit e83c5163316f89bfbde7d9ab23ca2e25604af290
Author: Linus Torvalds <torvalds ppc970.osdl.org>
Date:   Thu Apr 7 15:13:13 2005 -0700

    Initial revision of "git", the information manager from hell
# --max-parents=0 は親のないコミット、つまりルートコミットを探す方法だ。
# もちろんこれが Linus が書いた本当に最初のツリーとは限らない。 Gitリポジトリから辿れる最初、という意味だ。
今回はこの当時の姿について少し見てみようと思う。

2015年2月15日日曜日

rebase して FF マージすることによる一直線の履歴は本当にわかりやすいのか

Git でトピックブランチを統合ブランチにマージする直前、最新の統合ブランチの先端にrebaseしたうえで FF (Fast-forward)マージすることで、見かけ上の履歴は一直線になる。 このような一直線の履歴が「わかりやすい」と解説されていることが多いんだけど、これは本当だろうか?

実は、このような見かけだけ「一直線」の履歴はむしろトピックの範囲が不明確になるのでわかりにくいんだ。

2015年2月7日土曜日

3imp 読書メモ(2)

今回はチャプター4の最初の第1節について書く。
3imp 未読の人には何が何やらわからない内容だと思う。 読んだことがある人は間違い探しでもしながら読んでもらえればと思う。

チャプター4 はスタックベースモデルの章だ。

2015年1月30日金曜日

Gitでpush -fせずにmasterの間違いを修正する方法

そんなものはない (タイトルは釣りだ。ゴメン)。

でもよく聞く「ミスに気づいて、思わず master に push -f しちゃった」という話は、実はある運用方法で簡単に防ぐことができるんだ。 その運用方法とは・・・

2015年1月22日木曜日

『アンダースタンディング・コンピュテーション』とベネディクト・カンバーバッチ

昨年の話なんだけど、会社の読書会で『アンダースタンディング・コンピュテーション』を読んだ。

普通の技術書(とくに他のオライリー本)と比べると、この本を読むことによってどういうスキルが身につくのか、若干イメージしにくいと思うんだけど、それはこの本がプログラミングの基礎的な内容を扱ってるからだと思う。

個人的に得られた知見とかは以下の通り

2015年1月20日火曜日

3imp 読書メモ(1)

「Three Implementation Models for Scheme」(R. Kent Dybvig, 1987)という、Schemeの実装モデル3パターンについて論じた論文がある。

Scheme 方面では有名らしく、 ファイル名由来だと思うんだけど、通称 3imp と呼ばれて親しまれているみたい。(@nfunato さん、情報ありがとうございます)

これはその読書メモだ。3章まで読んでいる。続きはまた後日。

2015年1月16日金曜日

仕事で英語を使わないITエンジニアが効率よく英語を習得するには

タイトルは釣りです。ごめんなさい。

普段英語をまったく必要としない職場にいるのですが、そのメンバー
の中では比較的TOEIC点数が高めのため、

「プライベートで英語使うことあんの?」(ないです)とか
「海外経験あんの?」(ないです)とか

聞かれることが増えてきたので、これまで勉強してきた中で「コレ
は効いたな」あるいは「気軽にできて続けやすい」という、まぁ自分
の中での勉強法のランキングを主観ですが整理してみたので調子に
乗って紹介します。

その前にまず私のスペックです。

2015年1月15日木曜日

Yコンビネータを導出してみる

以前 Yコンビネータが call-with-myself だという記事を書いたけど、
そこでは Y コンビネータがどこから来たのか、ということについては書かなかった。
今回はYコンビネータがどこから来たのかについて書くつもりだ。

2014年12月23日火曜日

オレオレLisp処理系を実装してみた(感想)

SICP4章が「Lisp実装しようぜ」なのですが、本ではSchemeでLispを実装するというメタサーキュラーなevalを作ってて、実装言語と被実装言語の境目をちゃんと理解できるか不安だったのでC++で実装してみる、ということをやってみました。
やってみたら意外と簡単で、足りないところは多々ありますが3日でLispとしてとりあえず動くようになりました。
(実装メモ1日目2日目3日目)

以下は今回の実装を体験してわかったこととか感想とかです。


オレオレLisp処理系を実装してみた(3日目=最終日)


Lisp処理系の実装メモ3日目です。(1日目, 2日目)

実装メモとしてはこれが最終日になりますが、感想などのまとめを次の記事としてのせるつもりです。

例によってコードは一番下に載せてます。

2014年12月22日月曜日

オレオレLisp処理系を実装してみた(2日目)

Lisp処理系の実装メモ2日目です。(1日目3日目)

例によって最後にその日の最後の時点くらいのコードを載せますが、
結構がっつり書き換えたりしてるんで、あんまりメモ内の記述と整合性がないかもしれません。あくまで参考ということで。


2014年12月21日日曜日

オレオレLisp処理系を実装してみた(1日目)

この週末でLisp処理系をスクラッチから作ってみたので、そのときのメモをアップしていきいます。
この記事はその初日のメモです。(2日目3日目)

あんまり推敲もしてないので読みにくいかもしれません。
その日のコードは最後に Gist を貼っておきます。


2014年11月26日水曜日

Schemer のための「すぐ理解できるYコンビネータ」

ラムダ計算の説明などによく登場するYコンビネータ(不動点コンビネータ)ですが、
「ラムダだけで再帰関数を定義できる」というのはわかってもYコンビネータを使った関数の定義は複雑ですし、
そもそもYコンビネータ自体の定義からしてどうなってるのかよくわからないので、少し難解です。

しかし、Schemer (Schemeプログラマ) 向けには簡単に理解できる説明があります。
Scheme でよく使う call-with というイディオムがありますが、これを使うことで
「Yコンビネータとは call-with-myself である」と言えるのです。

具体例で説明します。

2014年11月18日火曜日

自分が書いているプログラムが正しく動くと信じてプログラムを書く感覚

次のような記事が話題になっていたんだけど、少し感じるところがあったのでメモっとく。ただの自分の感覚なので、結論とかは特にない。

難しいプログラムでは自分がいままで書いたコードが正しく動くと信じて残りのコードを書く必要がある -- Medium

多分この元記事の方は複雑なプログラムのことについて言っていて、俺の考えてるような単純な例ではなかろうと思うんだけど、自分の場合は結構単純なプログラムであっても再帰が関わってくるとそう感じる場合がある。単純にループにできそうにないやつ(本質的に再帰的なやつ)とか。

例えば Scheme でリストの長さを返す関数 length は次のように定義できる。

(define (length lst)
 (if (null? lst)
     0
     (+ 1 (length (cdr lst)))))


これも実際には再帰呼出しのlengthを書くところではlengthが正しく動くことを信じて書いてるわけではあるけど、再帰呼出しのlengthが最後に出てくるので(末尾再帰という意味ではなくて記述上の順番として)、これまで書いた部分が正しいという確信を得やすいのもあって、あんまり「 length が正しく動くかどうかわかんないけど正しく動くと信じて書く」って感覚はない。(単純すぎるってのもあるかもしれんが)

次に、「同じくリストの長さを返す関数、ただしリストの最後から連続した偶数要素の部分がある場合その長さはカウントしない」という関数 length2 を考えてみる。

例えば

(length2 '(1 2 3 4 5)) => 5
(length2 '(1 2 3 4 5 6)) => 5
(length2 '(1 2 3 4 5 6 6 6)) => 5
(length2 '(1 2 3 4 5 6 6 6 7)) => 9

のような感じだ。

length2 を再帰で書くとこうなる:

(define (length2 lst)
 (if (null? lst)
     0
     (let ((rest (length2 (cdr lst))))
       (if (and (zero? rest)
                (even? (car lst)))
           0
           (+ 1 rest)))))


# リストの要素が数字じゃない場合とかの処理は本質じゃないので割愛

こういう場合に (let ((rest (length2 (cdr lst)))) の部分を書くときは、「length2はまだ完成してないんだけど、これから書く部分も含めて全部正しく動くはずだぜ」という感覚を強く感じながら書いてる。

まぁlength2も蓄積変数を1個余分に導入するだけで簡単にループにできそうですけどね。


2014年11月3日月曜日

『プログラミングGauche』を読んだ

フムフムヌクヌクアプアア本としても知られる『プログラミングGauche』を最近読みました(今3周目を読んでます)。

読後の感想ですが、ひとことで言えば『Scheme すごい、Gauche 楽しい』って感じです。
プログラミング自体の初心者には向きませんが、ほかの言語を知っていれば難易度の勾配もゆるやかで、無理なく読み進められる良い本だと思います。

とくに面白かったのは7章(手続き)、18章(マクロ)、 19章(継続)あたりです。
関数プログラミングに触れたことがない人は、7章まで読むとその面白さを体験できると思います。Common Lispを触ったことがある自分でも、Lisp-1での関数プログラミングの気持ちよさは特筆すべきものがありました。あとLispのパワーを顕著に体感できるのが18,19章です。こういうのを知ってしまうと Scheme ならアレができるのに、とか思ってしまいそうです。

以下、Scheme/Gauche/本書に関して面白かったところとかをつらつら書いてみます:

2014年6月28日土曜日

gitworkflows(7)を図解したスライドをアップしました

前回に引き続き、こちらも会社の読書会でGit関連本の番外編として実施したgitworkflows(7)の解説資料(の加筆修正版)です。

マニュアルからすると講義用にかなりつまみ食い的な内容になってます。
副読本的な位置づけでマニュアルを読むのも良いかなと思います。

Gitの布教などにお使いください。

2014年6月24日火曜日

コンセプトから理解するGitコマンド

Gitのコマンドってわかりにくい、というかとっつきにくいものや、役割が複数あって覚えにくいものとか多い気がします。

でもGitが内部でデータ(コミットやツリー、ブロブ等いわゆるGitオブジェクト)をどのように扱っているかを理解すると、コマンドの役割や挙動の理解も進むのでは、と思ってスライドを作りました。