ソフトウェアエンジニアのブログ

暇つぶしに書いてます。他に技術的なことは[http://qiita.com/nsas454]に書いてますのでそちらも見てください。

LISP関連の本

Lispに関する関連書籍。少し興味があるので読んでみたいと思い購入しました。

On Lisp

On Lisp

Let Over Lambda

Let Over Lambda

Standard MLのお勉強

関数型言語のStandardMLについて書かれた本を探していたのですが、この本に落ち着きました。ML関連の書籍は、少ないのが難点です。この本はざっと見た感じですが、いい本だと思います。

手続き型言語ばかりでなく、関数型言語もいいところあるので、人生において一度は勉強しておいても損はないと思います。

MLのModern Compiler Implementationは日本語書籍もあるので合わせて読むとさらに理解が深まっていいと思います。

ML for the Working Programmer

ML for the Working Programmer

Modern Compiler Implementation in ML

Modern Compiler Implementation in ML

コンパイラ、インタプリタなどの処理系に関係する本を購入

気になった本を3冊購入しました。全部処理系に関連した有名な洋書です。読み終わったら書評でも書いていきたいと思います。


Optimizing Compilers for Modern Architectures: A Dependence-based Approach

Optimizing Compilers for Modern Architectures: A Dependence-based Approach

Advanced Compiler Design and Implementation

Advanced Compiler Design and Implementation

Modern Compiler Implementation in C

Modern Compiler Implementation in C

コンピュータ・ハードウェアの演算に関するCPUとレジスタ周りについて

コンピュータサイエンスの基礎となるCPUとレジスタ周りについて調べました。結構忘れやすいので備忘録がわりに残しておくことにしました。ほとんど本を読んでまとめただけな個人的なメモです。

CPUとレジスタ

汎用レジスタ(general-purpose)
  • 加減算などの演算命令のオペランドとして使用できる32ビット長のレジスタ。汎用レジスタにはスタックを操作するために使われるベースポインタepsとスタックポインタespが含まれる。その他には、eax,ebx,ecx,edxなどの汎用レジスタがある。
条件フラグ(condition flag)
  • 比較命令の結果を確認する1ビット長のレジスタで、ゼロフラグ、zf,sfなどがある。
命令ポインタ(instruction pointer)
  • CPUが次に実行すべき命令の格納場所を指す32ビット長のレジスタeipで、プログラムカウンタ(program counter)とも呼ばれる。CPUは、eipの指す位置から命令を一つ取り出すと同時に、その直後の命令の位置を指すようにeipを更新しておく。その後取り出した命令を実行する。

コード生成関連

コード生成にあたって基本となる事項ををまとめる。処理系について勉強したい人は理解していたほうがいいです。

メモリについて

メモリはメモリ領域(memory area)という連続した領域に分けて利用される。以下の図のように、OS領域、コード領域、大域領域、ヒープ、スタックに分類される。

OS領域 コード領域 大域領域 ヒープ スタック
OS領域:

OS専用の領域。ここのコンピュータごとにその大きさが一定。

コード領域:

プログラムのコードを格納するための領域。プログラムごとにきまっており、プログラム実行中は変化しない。

データ領域:

実行に必要なデータを格納するためのデータ領域。この領域は大域データ領域、ヒープ、スタックにわけられる。

  • 大域データ領域

大域データを割り当てるための大域データ領域、グローバル変数で利用する領域

  • ヒープ

 実行時に動的に生成されるデータを割り当てるためのヒープ、ローカル変数などはここに割り当てられるイメージ。C言語mallocで割り当てられる領域はここ

  • スタック

 局所変数を割り当てたり、関数への実引数を受け渡したりするためのスタック、プログラムを実行するときは一番活躍するところ

レジスタ

呼び出した関数がどのレジスタを使用中であるかは、呼び出された関数にはわからない。そのためコンパイラ設計時には、汎用レジスタを2種類に分けておく方法がとられる。

呼び出し後保存レジスタ(callee-saved register)

呼び出す側が使用中かもしれないレジスタ。呼び出される関数がこれらのレジスタを使用したい場合は、本体の実行前に値を保存しておき、実行後にもとに戻さなければならない

呼び出し前保存レジスタ(caller-saved register)

呼び出される関数は、これらのレジスタの値を保存することなく、自由に使用して良い。ただし、呼び出された関数がこれらのレジスタを使用中にさらに別の関数を呼び出すときは、あらかじめ値を保存しておかなければならない。

関数本体の実行時に、どの呼び出し後保存レジスタを使用するかは、本体のコードを生成してみないとわからない。そこで本体のコード生成時には呼び出し後保存レジスタの値を退避するための場所を、割り当てると良い。汎用レジスタの個数は限られているし、使用できる数も数個から数十個ときわめて少ない。pentiumプロセッサの場合は、esp,ebpを除くと6個しかない。そのため、汎用レジスタすべてについて「使用中」、「空き」を記憶するテーブルを用意し、レジスタを割り当てるときに、そのテーブルを検索して空きレジスタをさがすの方法が単純で効果的となる。汎用レジスタの個数はきわめて少ないので、これらを有効的に利用することはコード生成の基本となる。レジスタを有効に利用して、できるだけ一時変数への退避をさけるようなコードを生成することが、算術式のコード生成で最も重要な課題である。

MACからwindowsにリモートデスクトップで接続

windows環境でどうしても作業がしなければならないときどうされてますか?そんな時は素直にwindowsを使えば良いのですが、mac使いの方はwindowsが手元にない場合もおおいのではないでしょうか?そんな時に重宝するのがこのソフトです。

Remote Desktop Connection for Mac


macのキーボードも普通に使えるので助かります。めったに使うことはないのですが、緊急時には非常に役に立ってます。とりあえずインストールしてて困らないソフトです。office for macを買うと付いてくるみたいですね。

sphinxでドキュメントを管理する

日本だけの風習かもしれませんが、開発の現場では仕様書をエクセルで作るのが慣わしのようになっています。セルをグリッドのように器用に使って作成している現場がおおいです。ただ、文書を書くということについてですと、非常に書くにくく、印刷したら端っこが切れて読めないとか、画面に見えているレイアウトと印刷したレイアウトがずれることは日常茶飯事です。私は基本的にmacな環境で仕事をしているので、このエクセルのドキュメントを見るのが苦痛にです。また開発中にわざわざエクセルを開いて無駄にメモリと時間を消費するのが馬鹿らしくなります。エクセルを立ち上げるのも面倒ですが、複数のファイルに分かれて書かれたものなんて中身の検索もままならず、どこに記述してあるのかすらわからない状態です。検索できないドキュメントほど使いにくいものはありません。また、納品のドキュメントもPDFで納品するとなると、わざわざ使いにくいエクセルでドキュメントを作成する必要もないと思います。開発の現場ではwikiのようなHTMLで確認でき、さらに好きなときに追記ができる、そして最後にはPDFで出力できるものが一番使いやすく有効なドキュメントです。

設計書のドキュメントについて

「社内監査」がなどドキュメントの体裁をうるさく言うところもあるようですが、本当に開発で必要なドキュメントはその時現場でできたドキュメントです。それはメモであったり、ホワイトボードに書いた内容であったり。この活きた情報をそのまま残すことが大切に感じています。設計書に書き直すと結論だけが簡潔に書かれるため、メモがきみたいな落書きが消されてしまいます。なにかあったときは、その結論いたるまでの課程が重要なので、あとで読み返すとなぜこの処理をしているのか理解出来ないことが多いです。
日本では内部監査がどうとか、ISOがどうのとよく耳にする話ですが、これらを取得したからしっかりした体制が出来ていると勘違いしている会社が多い。まわりからみているとこれらの認証を取得した結果、逆に今まで以上に無駄が増え、さらに品質まで落ちている会社が多いように思います。もう一度見直すべきでは??日本を代表するトヨタ自動車がISOを取得していません。
話は変わりますが、microsoftが昔ほど元気がありません。windows中心で今までやってきた企業は、万が一、windowsがこの世から消えてしまうと大変な事になってしまいますよ。今の状況からすると可能性がないとも言い切れないと思います。


そのようなきっかけから、sphinxというドキュメント作成ツールを使ってみたいと思うようになりました。見た目も綺麗だし、機能もさり気無く豊富なので、このツールを使ってドキュメント作成を進めていきたいと思います。

sphinxをインストール

$ sudo apt-get install python-sphinx
$sudo port install py26-sphinx

プロジェクトの作成

sphinx-quickstart

必要なのはプロジェクト名、バージョン番号、著者の名前

sphin使い方

画像の挿入
image:: tornado.png
インラインマークアップ
**太字**, *イタリック*, ``等幅`` 
結果例:太字, イタリック, 等幅
***リスト 

mongoDBのインストール

ファイルを取ってきて解凍したらすぐ使えるのでインストールは楽勝です。
新しくmongoDBのフォルダを作って作業しました。

ソースファイルの取得
mkdir mongoDB
macbook% cd mongoDB
macbook% curl -O http://fastdl.mongodb.org/osx/mongodb-osx-x86_64-1.6.5.tgz
tar -zxvf mongodb-osx-x86_64-1.6.5.tgz
データフォルダの設定
mv mongodb-osx-x86_64-1.6.5 ~/Library/mongodb
mkdir ~/Library/mongodb/data

これでインストール作業は終わりです。
実際に動いているか以下のコマンドで確認できます。

cd ~/Library/mongodb/bin
./mongod --dbpath=/Users/XXXXXX/Library/mongodb/data &