Hatena::ブログ(Diary)

IT戦記 このページをアンテナに追加 RSSフィード

2009-09-26

Macbook (with Snow Leopard) 買った後にやったことまとめ

f:id:amachang:20090925200225j:image

購入編

会社にて

amachang「秋だけに akky ですね。Macbook が欲しくなってきました」

akky(苦笑)

amachang「新しい Macbook が欲しくなってきました」

akky(苦笑)

amachang「買って来まーす」

akky(苦笑)

Apple Store 銀座にて

amachangMacbook Pro の 13 inch のやつください」

店員「はい。 2 種類ありますが」

amachang「高いほうのやつください」

店員「キーボードは JIS と US どちらにいたすますか」

amachang「US ください」

店員「こちらでよろしいですか?」

amachang「JIS よりキー少ないのですね」

店員「はい。英数キー、かなキーなどがありません」

amachang「えっ」

店員「えっ」

amachang「JIS ください」

店員「かしこまりました」

amachang「あと、プロジェクタに繋ぐケーブルください。あの青い台形のやつ」

店員「かしこまりました。あわせて 172,2000 円になります」

amachang「高いですね」

店員(苦笑)

店員「それでは、こちらにご記入ください」

amachang(かきかき)

店員「172,2000 円頂戴いたします」

amachang「高いですね」

店員(苦笑)

店員「ありがとーございましたー」

というわけで

Macbook を買ってきました。

入っていたもの

f:id:amachang:20090925201548j:image

OS は 2 個入ってるんですな

相変わらず無駄なものがない!

電源を入れると最初に起こること

f:id:amachang:20090925202146j:image

  1. チャーンという音
  2. 言語選択
    • 主に日本語を使用する を選択
    • を押す
  3. かっこいいムービーが流れる(でも、音量おおきいよ><)
    • ムービーに合わせて「とぅっとぅっとぅーるっとぅー」と口ずさむ
    • または、 20 秒くらい待つ
  4. お住まいの国または地域を選択
    • 日本 を選択
    • 続ける を押す
  5. キーボード入力環境を選択
    • ことえり を選択
    • (かな打ち派の人は↑選択後に入力方法を選択できる)
    • 続ける を押す
  6. すでに Mac をお持ちですか?情報を転送しますか?
    • 情報を今すぐ転送しないを選択(いちから設定したいから)
    • (望めば、ネットワーク設定、環境設定、メール、書類、アプリケーションなどが引き継げるらしいよ!)
    • 続ける を押す
  7. ワイヤレスネットワークを選択
  8. Apple ID を入力
    • (めんどくさいので、何も入力しない)
    • 続ける を押す
  9. ユーザ登録の情報
    • めんどくさいので、Command + Q を押す
    • 出てきたウィンドウの スキップ を押す
  10. ローカルアカウントの作成
  11. このアカウントのピクチャを選択
    • カメラが起動するので、はにかむ
    • ピクチャライブラリから選ぶ を選択
    • ネコ の絵を選択
    • 続ける を押す
  12. 時間帯の設定
    • 世界地図 の中の 日本らへん をクリック
    • 最も近い都市 から 東京 - 日本 を選択
    • 続ける を押す
  13. 日付と時刻の設定
    • 合っていたので、そのまま
    • 続ける を押す
  14. 登録を忘れずに...
    • 完了 を押す

わーい!完了したよー!

直後の画面

こんな感じ

f:id:amachang:20090925222025p:image

下にずらりと使わなそうなソフトが並んでいます><とっても切ないでう

あと、右下には「ソフトウェアアップデートしてして!」と青い丸がぴょんぴょんと跳ねてます!

ちょっと、システムの情報を見てみます

リンゴマーク から この Mac について を選択します。

f:id:amachang:20090925222026p:image

f:id:amachang:20090925222027p:image

プリインストールされているのは、 Leopard みたいですね!こんにちはこんにちは!!

詳しい情報 をクリックします。

ソフトウェアの情報とハードウェアの情報を見てみます。

f:id:amachang:20090925222028p:image

f:id:amachang:20090925222030j:image

ちゃんとメモリ 4 GB ですね!!やったぜ!ぽう!

ちょっと脱線:スクリーンショットの取り方

取れるよ!

ちなみに以下はフォトライフにアップロードしているところ

f:id:amachang:20090925222031p:image

まさか新 Macbook での最初のお仕事がはてなフォトライフへのアップロードだったなんて・・・!

複数ファイル選択便利すぎる YO !

はてなちゃんの中の人ありがとう><!

Snow Leopardクリーンインストール

いちからすべて(ファイルシステムとか)設定したいので OSクリーンインストールをしちゃいます!

とにかく一度クリーンインストールしたいのです><

  1. 起動した状態で
  2. Mac OS X Snow LeopardDVD を右の溝から挿入する
    • f:id:amachang:20090925225613j:image
  3. ウィンドウが開く
  4. Mac OS X インストール
  5. Mac OS X ユーティリティ
  6. 再起動する
  7. チャーンという音
    • しばらく待つ(1 〜 2分くらい、意外と待つ)
  8. 言語選択
    • 主に日本語を使用する を選択
    • を押す
  9. Mac OS X インストール
    • このウィンドウは一旦無視
    • 画面の上辺のメニューから ユーティリティ メニューを開く
    • f:id:amachang:20090926011030j:image
    • ディスクユーティリティ を選択する
    • (上書きインストールでいい人は、 ディスクユーティリティ は飛ばしちゃってくだしあ><)
  10. ディスクユーティリティ
    • 左のペインから Macintosh HD パーティションを含むハードディスクを選択する(僕の環境では 250.06 GB ST92... というような名前)
    • 右のペインの上のほうの 消去 を押す
    • フォーマット を設定する
      • 僕は Mac OS X 拡張 (大文字/小文字を区別、ジャーナリング) を選択しました(Unix との互換のため)
      • (一部のソフトはこの設定だと動かないらしいので、普通はデフォルトままのほうがいいと思います)
    • 名前 を設定する
    • 下の 消去 を押す
  11. 確認ウィンドウが表示される
    • 消去 を押す
    • ちょっと待つ
  12. 消去が完了する
    • Command + Qディスクユーティリティ を終了させる
  13. Mac OS X インストールの画面に戻って来る
    • 続ける を押す
  14. ソフトウェアの使用許諾
    • 同意する を押す
  15. Mac OS X インストールMac OS Xインストールするディスクを選択)
  16. 設定ウィンドウが開く
    • プリンタサポート は全てチェックを外す(後で必要なドライバだけを入れる)
    • 追加フォント はチェックしたまま(あったほうがいいかな)
    • 言語環境日本語環境 以外のチェックを外す(日本語と英語があれば十分)
    • X11 はチェックしたまま(よく使うので)
    • Rosetta はチェック外したまま(必要ない)
    • QuickTime 7 はチェック外したまま(必要ない)
    • 最後に OK を押す
  17. Mac OS X インストールの画面に戻って来る
  18. インストールに成功しました
  19. 起動する
  20. チャーンという音
  21. かっこいいムービーが流れる(でも、音量おおきいよ><)
    • ムービーに合わせて「とぅっとぅっとぅーるっとぅー」と口ずさむ
    • または、 20 秒くらい待つ
  22. お住まいの国または地域を選択
    • 日本 を選択
    • 続ける を押す
  23. キーボード入力環境を選択
    • ことえり を選択
    • (かな打ち派の人は↑選択後に入力方法を選択できる)
    • 続ける を押す
  24. すでに Mac をお持ちですか?情報を転送しますか?
    • 情報を今すぐ転送しない を選択(いちから設定したいから)
    • (望めば、ネットワーク設定、環境設定、メール、書類、アプリケーションなどが引き継げるらしいよ!)
    • 続ける を押す
  25. ワイヤレスネットワークを選択
  26. Apple ID を入力
    • (めんどくさいので、何も入力しない)
    • 続ける を押す
  27. ユーザ登録の情報
    • めんどくさいので、Command + Q を押す
    • 出てきたウィンドウの スキップ を押す
  28. ローカルアカウントの作成
  29. このアカウントのピクチャを選択
    • カメラが起動するので、はにかむ
    • ピクチャライブラリから選ぶ を選択
    • ネコ の絵を選択
    • 続ける を押す
  30. 時間帯の設定
    • 世界地図 の中の 日本らへん をクリック
    • 最も近い都市 から 東京 - 日本 を選択
    • 続ける を押す
  31. 登録を忘れずに...
    • 完了 を押す

Snow Leopard インストール完了おおお!

Snow Leopard 初起動

f:id:amachang:20090926140632p:image

おおお!

Hello, Snow Leopard!

とりあえず、基本的なセットアップ!

とりあえず、最低限必要なセットアップをしていきます

まずソフトウェアアップデート

まず、何より先にソフトウェアアップデートをする

リンゴマーク から ソフトウェアアップデート を選択

f:id:amachang:20090926140633p:image

ウィンドウが立ち上がったら インストールして再起動 を押す

パスワードが聞かれたり、規約に同意を求められたりする。

で、最後に確認ウィンドウが表示されたら 再起動 をクリックして再起動する

これで Mac が最新に更新された!やった!

システム環境設定

リンゴマーク から システム環境設定 を選択

f:id:amachang:20090926162917p:image

ターミナルの設定

まずは、ターミナルを起動する

  1. Finder移動 メニューから アプリケーション を選択
    • f:id:amachang:20090926193225p:image
  2. ユーティリティ ディレクトリから ターミナル を起動
  3. ターミナル メニューの 環境設定... を選択
    • f:id:amachang:20090926193227p:image
  4. 起動 タブにて
    • 起動時に開く 新しいウィンドウを Basic から Pro に設定
    • 開くシェルコマンド/bin/bash から /bin/zsh に設定
  5. 設定 タブにて
    • テキストをアンチエイリアス処理 をチェック
    • フォント変更 を押して Menlo Regular 11 pt. にする
  6. ウィンドウ タブにて
    • 背景不透明 を 100% にする(透明にするメリットを感じられないので)
    • ウィンドウサイズ : 179 、 : 53 に設定する(自分の環境の全画面)
    • スクロールバッファ行数を制限 をチェックして 1000 くらいにする(1 日中触っているとメモリを食うので)
  7. シェル タブにて
    • シェルの終了時 の挙動を ウィンドウを閉じる に設定
  8. 詳細 タブにて
    • オーディオベル のチェックを外す(うるさいので)

最後にメインメニューの シェル メニューから 設定をデフォルトとして使用 を選択する(新規ウィンドウや新規タブのときに開くウィンドウの設定に反映される)

f:id:amachang:20090926201442p:image

環境変数と alias の設定

~/.zshrc の内容は以下(追記していきます)

alias ls='ls -G'

# Macports 用
export PATH=/opt/local/bin:/opt/local/sbin/:$PATH

入力関係の設定

円記号とバックスラッシュの入れ替え

JIS キーボードの「\」で入力されるコードを指定します。

デフォルトでは「円記号」が入力されてしまい、プログラムを書くときに不便なので「バックスラッシュ」に変えます。

まずは、右上の A (状況によっては、 かも)を押して、 環境設定を表示 を選択する。

f:id:amachang:20090926145633p:image

ことえり環境設定 ウィンドウの 入力文字 タブで、 JIS キーボードの \ キーで入力する文字 から バックスラッシュ を選択する

f:id:amachang:20090926145635p:image

ことえり環境設定 ウィンドウを閉じる

ことえりDvorak を使うための設定

これは、一般的な設定ではないのでコラム的な感じにしておこうっと。

最近、僕は Qwerty をやめて Dvorak に移行した(腱鞘炎対策のため)のでその設定をします。

ことえり環境設定 ウィンドウの 入力操作 タブで、 英字入力時のキーボード配列 から Dvorak を選択する

f:id:amachang:20090926145634p:image

(あと、 Snow Leopard から片手用の DvorakDvorak LeftDvorak Right)も追加されてる!いつか使ってみたい)

ことえり環境設定 ウィンドウを閉じる

QuickSilverインストール

便利なランチャー

  1. QuickSilver - Blacktree から for Mac OS X 10.6+ のほうからダウンロードする
  2. ダウンロードしたファイルを解凍する
  3. 解凍して出来た QuickSilverアプリケーション に置く
    • f:id:amachang:20090926233958p:image
  4. 移動先で QuickSilverダブルクリック
  5. Quicksilver”は、アプリケーションで、インターネットからダウンロードされました。開いてもよろしいですか?
    • はい を押す
  6. Welcome
    • Continue を押す
  7. License
    • I have read and accept the terms of this lisence をチェックする
    • Continue を押す
  8. Plug-ins
    • Continue を押す
  9. Options
    • Continue を押す
  10. Getting Started
    • Continue を押す
  11. Support
    • Finich を押す

この状態で、 Ctrl+SPACE でランチャーが起動する(デフォルトだと Spotlightショートカットになっているので、それを変えるか、 QuickSilverショートカットの変えるかしなければダメ)

以下のように、

f:id:amachang:20090927001206p:image

  1. Dock 内の QuickSilver の副メニューから
  2. オプション を選択し、
  3. ログイン時に開く を選択して、

Mac 起動時に自動で QuickSilver を起動するようにする

ブラウザ関係

Safari の開発メニューを有効にする

以下のように Safari メニューの 環境設定... を選択する

f:id:amachang:20090927003657p:image

開いたウィンドウの 詳細 タブで メニューバーに"開発"メニューを表示 をチェックする

そうすれば以下のような 開発 メニューが使えるようになる

f:id:amachang:20090927004311p:image

WebKit Nightly Build のインストール

インストールは簡単だと思うので詳細は省略

WebKit Build Archives | WebKit

Firefoxインストール

インストールは簡単だと思うので詳細は省略

より優れた、高速でプライベートな最新ブラウザー | Firefox

Firebugインストールもしておこう

Firebug :: Firefox 向けアドオン

エディタの設定

僕は vim 派なので ~/.vimrc は以下のように設定しました。

syntax on

set expandtab
set tabstop=4
set shiftwidth=4
set softtabstop=0
set number
set smartindent
set incsearch

autocmd FileType make setlocal noexpandtab

Spotlightインデックス生成を止める

Spotlightインデックス生成が重いので止めます

Spotlight を止めるには、ターミナルで mdutil を使います。

まずは、今の状態を調べる

amacbook% mdutil -a -s
/:
	Indexing enabled. 

ボリューム / でインデックスが有効になっている

無効にする

amacbook% sudo mdutil -a -i off
/:
	Indexing disabled.

今の状態をもう一度みてみる

amacbook% mdutil -a -s         
/:
	Indexing disabled.

無効になっていることが確認できる

有効に戻すときは

amacbook% sudo mdutil -a -i on
/:
	Indexing enabled.

IPA モナーフォントを入れる

  1. IPAモナーフォント から opfc-ModuleHP-*_withIPAMonaFonts-*.tar.gz というファイルをダウンロードする
  2. 解凍する
  3. fonts ディレクトリに入っている .ttf という拡張子のファイルに対し以下の作業をする

Xcodegcc とかが入る)を入れる

  1. Mac OS Snow LeopardDVD を入れる
  2. 立ち上がったウィンドウから オプションインストール ディレクトリを開く
  3. Xcode.mpkg ファイルをダブルクリックで実行
  4. ウィンドウが開く
  5. ようこそ Xcode インストーラーへ
    • 続ける を押す
  6. 使用許諾契約
    • 続ける を押す
    • 確認ウィンドウで 同意する を押す
  7. インストール先の選択
    • 続ける を押す
  8. "Macintosh HD" にカスタムインストール
    • 続ける を押す
  9. "Macintosh HD" に標準インストール
  10. しばらく待つ
  11. 完了
    • 閉じる を押す

MacPorts の導入

  1. The MacPorts Project -- Download & Installation から Snow Leopard 用の最新の dmgダウンロード
  2. dmg の中に入っている MacPorts-1.8.0.pkg を実行する
  3. このパッケージは、ソフトウェアインストールできるかどうかを判断するプログラムを実行します。
    • 続ける を押す
  4. ようこそ MacPorts-1.8.0 インストーラ
    • 続ける を押す
  5. 大切な情報
    • 続ける を押す
  6. 使用許諾契約
    • Continue を押す
    • 確認ウィンドウで Agree を押す
  7. "Macintosh HD" に標準インストール
  8. しばらく待つ
  9. 完了
    • 閉じる を押す
  10. ~/.bashrc とか ~/.zshrc とか ~/.profile とかに export PATH=/opt/local/bin:/opt/local/sbin/:$PATH を追加する
  11. ここからはターミナル
amacbook% sudo port -v selfupdate
(snip)
amacbook% sudo port -v sync      
(snip)
MacPorts でいろいろなツールを入れる

ターミナル

amacbook% sudo port install wget
amacbook% sudo port install tree
amacbook% sudo port install proctools
amacbook% sudo port install git-core

cpan の設定

ターミナルで sodo cpan とやって最初の質問で yes と答えるとあとは自動でやってくれる

amacbook% sudo cpan             
Password:
(snip)
Would you like me to configure as much as possible automatically? [yes] yes
(snip)
cpan[1]> q
cpan でいろいろなツールの入れる

ターミナル

amacbook% sudo cpan
cpan[1]> Bundle::CPAN
cpan[3]> App::Ack

Microsoft Remote Desktop Connection Client for Mac 2.0.1

以下からダウンロード

Error 404 - Not Found

インストールウィザードの質問に全部 続ける で OK

2008-10-26

Terminal.app を軽くする方法

プログラマの人は

ずっとターミナル開きっぱなしって人多いですよね?

f:id:amachang:20081026165135p:image

Mac の場合

Terminal.app というターミナルデフォルトで ついていて、それを開きっぱなしって人が多いんじゃないでしょうか。

問題点

Terminal.app をデフォルトの設定のまま使ってると問題点がある。

何か別の作業をした後に、久しぶりに Terminal.app をアクティブにすると、固まるのだ。

実はこれ、毎回相当ダメージを受ける。

で、解決策が分かった

スクロールバッファを小さくすればいい。

なんとデフォルトの設定では無制限にスクロールバッファを保存する設定になっているのだ。

たまたま cat したファイルがものすごい容量だったなんてことよくあることなのに><

それが、全部スワップに入ってしまう。

スクロールバッファを小さくする方法

右上のメニューから「ターミナル」→「環境設定」→「設定」→「ウィンドウ」と選択し

f:id:amachang:20081026163856p:image

スクロールバッファのサイズを指定すれば良い。

f:id:amachang:20081026163857p:image

スクロールバッファなんて、 1000 行もあれば十分ですよね。

2008-06-24

Mac で MP4Box をビルドする

MP4Box については

no title

大まかな手順

  1. GPAC | Multimedia Open Source Project ←ここから、ソースをダウンロード
  2. 解凍
  3. configure
  4. make apps
  5. 仕上げ

詳細

ソースをダウンロード

そのときの最新版をダウンロードしてください

$ wget http://downloads.sourceforge.net/gpac/gpac-0.4.4-rc2.zip
解凍

unzip します。tar.gz をダウンロードした場合は tar xvfz で

$ unzip gpac-0.4.4-rc2.zip
configure

configure は chmod しないとダメだった

$ cd gpac
$ chmod 755 configure
$ ./configure
make apps

src/utils/os_net.c の u_long という型を unsigned long int に変更しないと make とおりません

$ vim src/utils/os_net.c
$ make apps
仕上げ

bin/gcc/MP4Box に出来ています。

libgpac.dylib を移動させます。

MP4Box をパスの通ったところに移動させます。

$ otool -L bin/gcc/MP4Box 
bin/gcc/MP4Box:
	/usr/local/lib/libgpac.dylib (compatibility version 0.0.0, current version 0.0.0)
	/opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3)
	/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)
$ sudo mv bin/gcc/libgpac.dylib /usr/local/lib/
$ sudo mv bin/gcc/MP4Box /usr/bin/
完成

はい完成!

$ MP4Box 
MP4Box [option] input [option]
 -h general:          general options help
 -h hint:             hinting options help
 -h import:           import options help
 -h encode:           encode options help
 -h meta:             meta handling options help
 -h extract:          extraction options help
 -h dump:             dump options help
 -h swf:              Flash (SWF) options help
 -h crypt:            ISMA E&A options help
 -h format:           supported formats help

 -nodes:              lists supported MPEG4 nodes
 -node NodeName:      gets MPEG4 node syntax and QP info
 -xnodes:             lists supported X3D nodes
 -xnode NodeName:     gets X3D node syntax
 -snodes:             lists supported SVG nodes
 -snode NodeName:     gets SVG node syntax
 -languages:              lists supported ISO 639 languages

-quiet:               quiet mode
 -v:                  verbose mode
 -version:            gets build version

2008-06-18

MacPorts でダウンロード先のミラーが重くて先に進まない場合の対処方法

(追記)ここで書かれた方法よりも順等な方法があるようです

詳細は以下の記事を見てください。

MacPorts でダウンロード先のミラーが重くて先に進まない場合のまっとうな対処方法 - otsune's SnakeOil - subtech

一般的な MacPorts でのインストール方法

以下のようにしますよね。たとえば mysql5 のインストール

$ sudo port install mysql5
--->  Fetching mysql5
--->  Attempting to fetch mysql-5.0.51a.tar.gz from http://mysql.mirrors.pair.com/Downloads/MySQL-5.0/

Attempting to fetch ... という部分はミラーからダウンロードしてきてるんですが、ここが中々終わらないことってよくありません?

そんなときは

v オプションを付けてダウンロードの経過を見ます。

$ sudo port -v install mysql5
--->  Fetching mysql5
--->  mysql-5.0.51a.tar.gz doesn't seem to exist in /opt/local/var/macports/distfiles/mysql5
--->  Attempting to fetch mysql-5.0.51a.tar.gz from http://mysql.mirrors.pair.com/Downloads/MySQL-5.0/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:53 --:--:--     0

1 分待ってもダウンロードが始まりません。

これだったら、別のミラーから直接落としてきたいですよね。

というわけで、他のミラーからダウンロードしちゃいましょう。

$ wget http://mirror.mysql-partners-jp.biz/Downloads/MySQL-5.0/mysql-5.0.51a.tar.gz
--2008-06-18 18:00:43--  http://mirror.mysql-partners-jp.biz/Downloads/MySQL-5.0/mysql-5.0.51a.tar.gz
mirror.mysql-partners-jp.biz をDNSに問いあわせています... 59.190.130.254
mirror.mysql-partners-jp.biz|59.190.130.254|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 27588558 (26M) [application/x-gzip]
`mysql-5.0.51a.tar.gz' に保存中

100%[=================================================================================================================>] 27,588,558  2.31M/s 時間 11s     

2008-06-18 18:00:54 (2.39 MB/s) - `mysql-5.0.51a.tar.gz' へ保存完了 [27588558/27588558]

$ 

完了したら /opt/local/var/macports/distfiles/<name>/ にコピーします。

<name> は install の時に指定したやつです。

$ sudo mv mysql-5.0.51a.tar.gz /opt/local/var/macports/distfiles/mysql5/
そして、もう一回 port install します。
$ sudo port install mysql5
--->  Fetching mysql5
--->  Verifying checksum(s) for mysql5
--->  Extracting mysql5
--->  Configuring mysql5
--->  Building mysql5 with target all
--->  Staging mysql5 into destroot
--->  Installing mysql5 5.0.51a_0
--->  Activating mysql5 5.0.51a_0
--->  Cleaning mysql5
$

おおお。

ミラーからダウンロードする箇所が無くなりました。

2008-06-17

DTrace の D 言語の文法と使い方のメモ

なんか、中途半端になってしまった。。。読まないほうがいいです。


個人的なメモ

だらだら書く

動機

pthread の確認するときに dtrace が凄く便利だったので

でも、全然使いこなせてない。(特に D 言語の文法が分からない)

dtrace のトレースの方法を書く言語を D 言語というが、一般的な D 言語とは違うもの。

dtrace の文法も含めて細かくかかれてる資料

これにつきる

http://docs.sun.com/app/docs/doc/817-6223?l=ja

さすが sun 。

この資料には日本語のはない。(6/17 現在)

文法定義ファイルも見つけた

http://www.opensource.apple.com/darwinsource/Current/dtrace-48/libdtrace/dt_grammar.y

Hello, world!

以下を hello.d で保存

BEGIN {
    trace("Hello, world!");
    exit(0);
}

実行

$ sudo dtrace -s hello.d 
dtrace: script 'hello.d' matched 1 probe
CPU     ID                    FUNCTION:NAME
  1      1                           :BEGIN   Hello, world!                    

文法

これ を見ながら

プログラム全体
d_program: d_expression DT_TOK_EOF { return (dt_node_root($1)); }
	|	d_program DT_TOK_EOF { return (dt_node_root($1)); }
	|	d_type DT_TOK_EOF { return (dt_node_root($1)); }
	;

d_program:	DT_CTX_DPROG { $$ = dt_node_program(NULL); }
	|	DT_CTX_DPROG translation_unit { $$ = dt_node_program($2); }
	;

D 言語をファイルに書いた場合、最初のトークンは DT_CTX_DPROG になる(実際に書いてある訳じゃないが、 Lexer がそういうトークンを返してくる)のでプログラム全体の文法は translation_unit を見ればいい。

translation_unit:
		external_declaration
	|	translation_unit external_declaration { $$ = LINK($1, $2); }
	;

external_declaration:
		inline_definition
	|	translator_definition
	|	provider_definition
	|	probe_definition
	|	declaration
	;

translation_unit (つまり、プログラム全体)は以下のいずれかの繰り返しということになる。

  • inline_definition
  • translator_definition
  • provider_definition
  • probe_definition
  • declaration

inline_definition, translator_definition, provider_definition については使ったことがないので、無視する。

あ、でも translator_definition は便利そうなので後で解説するかも(余力があれば)

probe_definition
probe_definition:
		probe_specifiers {
			/*
			 * If the input stream is a file, do not permit a probe
			 * specification without / <pred> / or { <act> } after
			 * it.  This can only occur if the next token is EOF or
			 * an ambiguous predicate was slurped up as a comment.
			 * We cannot perform this check if input() is a string
			 * because dtrace(1M) [-fmnP] also use the compiler and
			 * things like dtrace -n BEGIN have to be accepted.
			 */
			if (yypcb->pcb_fileptr != NULL) {
				dnerror($1, D_SYNTAX, "expected predicate and/"
				    "or actions following probe description\n");
			}
			$$ = dt_node_clause($1, NULL, NULL);
		}
	|	probe_specifiers '{' statement_list '}' {
			$$ = dt_node_clause($1, NULL, $3);
		}
	|	probe_specifiers DT_TOK_DIV expression DT_TOK_EPRED {
			dnerror($3, D_SYNTAX, "expected actions { } following "
			    "probe description and predicate\n");
		}
	|	probe_specifiers DT_TOK_DIV expression DT_TOK_EPRED
		    '{' statement_list '}' {
			$$ = dt_node_clause($1, $3, $6);
		}
	;

probe_specifiers:
		probe_specifier_list { yybegin(YYS_EXPR); $$ = $1; }
	;

probe_specifier_list:
		probe_specifier
	|	probe_specifier_list DT_TOK_COMMA probe_specifier {
			$$ = LINK($1, $3);
		}
	;

probe_specifier:
		DT_TOK_PSPEC { $$ = dt_node_pdesc_by_name($1); }
	|	DT_TOK_INT   { $$ = dt_node_pdesc_by_id($1); }
	;

ちょっと長いが probe_definition は以下のようなものだということが分かる

<(DT_TOK_PSPEC または DT_TOK_INT) がコンマ区切りで続いたもの> [ DT_TOK_DIV <式(expression)> DT_TOK_EPRED ] {
    <複数の文(statement_list)>
}

Lexer を見ると DT_TOK_PSPEC は hoge:hoge:hoge:hoge や hoge や hoge*::hoge のような文字、 DT_TOK_INT は 1234 のような数字 DT_TOK_DIV および DT_TOK_EPRED はスラッシュだと分かる

つまり、最初の Hello world の例は DT_TOK_DIV から DT_TOK_EPRED を省略したこの形だ

BEGIN {
  trace("Hello, world!");
}
式(expression)

expression は

expression:	assignment_expression
	|	expression DT_TOK_COMMA assignment_expression {
			$$ = OP2(DT_TOK_COMMA, $1, $3);
		}
	;
:
hogehoge_expression がずーっと続く。演算子の優先順位は C 言語と全く同じ
:

なるほど、あるコンテキストでは d 言語は式だけの場合があるということか。

ちょっと気になったところは

配列アクセスの添字も関数呼出しの引数のように、複数指定できる。

/* 配列アクセスの添字 */
array_parameters:
		/* empty */ 		{ $$ = NULL; }
	|	constant_expression	{ $$ = $1; }
	|	parameter_type_list	{ $$ = $1; } /* ←注目! */
	;

/* 関数呼出しの引数 */
function_parameters:
		/* empty */ 		{ $$ = NULL; }
	|	parameter_type_list	{ $$ = $1; } /* ←注目! */
	;

つまり、 dtrace では多次元配列

array[index_1, index_2]

というようにアクセスするってことか。

複数の文(statement_list)
statement_list:	statement { $$ = $1; }
	|	statement_list ';' statement { $$ = LINK($1, $3); }
	;

statement:	/* empty */ { $$ = NULL; }
	|	expression { $$ = dt_node_statement($1); }
	;

うお。めっちゃシンプル!

え? D 言語って式文しかないの?? if 文 for 文 while 文は??

マジでないみたいだ

まあ、考えることは少なくなった、文は式文でしかない。

セミコロンとカンマの違いはほとんどない(値を持つかどうかぐらい)。

あ。変数宣言という文もない

変数宣言は probe_definition の外に書く。

プログラム全体のところで述べた declaration が変数宣言を含む。

宣言(declaration)
declaration:	declaration_specifiers ';' {
			$$ = dt_node_decl();
			dt_decl_free(dt_decl_pop());
			yybegin(YYS_CLAUSE);
		}
	|	declaration_specifiers init_declarator_list ';' {
			$$ = $2;
			dt_decl_free(dt_decl_pop());
			yybegin(YYS_CLAUSE);
		}
	;

declaration_specifiers:
		d_storage_class_specifier
	|	d_storage_class_specifier declaration_specifiers
	|	type_specifier
	|	type_specifier declaration_specifiers
	|	type_qualifier
	|	type_qualifier declaration_specifiers
	;

d_storage_class_specifier:
		storage_class_specifier
	|	DT_KEY_SELF { dt_decl_class(DT_DC_SELF); }
	|	DT_KEY_THIS { dt_decl_class(DT_DC_THIS); }
	;

storage_class_specifier:
		DT_KEY_AUTO { dt_decl_class(DT_DC_AUTO); }
	|	DT_KEY_REGISTER { dt_decl_class(DT_DC_REGISTER); }
	|	DT_KEY_STATIC { dt_decl_class(DT_DC_STATIC); }
	|	DT_KEY_EXTERN { dt_decl_class(DT_DC_EXTERN); }
	|	DT_KEY_TYPEDEF { dt_decl_class(DT_DC_TYPEDEF); }
	;

type_specifier:	DT_KEY_VOID { $$ = dt_decl_spec(CTF_K_INTEGER, DUP("void")); }
	|	DT_KEY_CHAR { $$ = dt_decl_spec(CTF_K_INTEGER, DUP("char")); }
	|	DT_KEY_SHORT { $$ = dt_decl_attr(DT_DA_SHORT); }
	|	DT_KEY_INT { $$ = dt_decl_spec(CTF_K_INTEGER, DUP("int")); }
	|	DT_KEY_LONG { $$ = dt_decl_attr(DT_DA_LONG); }
	|	DT_KEY_FLOAT { $$ = dt_decl_spec(CTF_K_FLOAT, DUP("float")); }
	|	DT_KEY_DOUBLE { $$ = dt_decl_spec(CTF_K_FLOAT, DUP("double")); }
	|	DT_KEY_SIGNED { $$ = dt_decl_attr(DT_DA_SIGNED); }
	|	DT_KEY_UNSIGNED { $$ = dt_decl_attr(DT_DA_UNSIGNED); }
	|	DT_KEY_STRING {
			$$ = dt_decl_spec(CTF_K_TYPEDEF, DUP("string"));
		}
	|	DT_TOK_TNAME { $$ = dt_decl_spec(CTF_K_TYPEDEF, $1); }
	|	struct_or_union_specifier
	|	enum_specifier
	;

type_qualifier:	DT_KEY_CONST { $$ = dt_decl_attr(DT_DA_CONST); }
	|	DT_KEY_RESTRICT { $$ = dt_decl_attr(DT_DA_RESTRICT); }
	|	DT_KEY_VOLATILE { $$ = dt_decl_attr(DT_DA_VOLATILE); }
	;

struct_or_union_specifier:
		struct_or_union_definition struct_declaration_list '}' {
			$$ = dt_scope_pop();
		}
	|	struct_or_union DT_TOK_IDENT { $$ = dt_decl_spec($1, $2); }
	|	struct_or_union DT_TOK_TNAME { $$ = dt_decl_spec($1, $2); }
	;

struct_or_union_definition:
		struct_or_union '{' { dt_decl_sou($1, NULL); }
	|	struct_or_union DT_TOK_IDENT '{' { dt_decl_sou($1, $2); }
	|	struct_or_union DT_TOK_TNAME '{' { dt_decl_sou($1, $2); }
	;

init_declarator_list:
		init_declarator
	|	init_declarator_list DT_TOK_COMMA init_declarator {
			$$ = LINK($1, $3);
		}
	;

init_declarator:
		declarator {
			$$ = dt_node_decl();
			dt_decl_reset();
		}
	;

declarator:	direct_declarator
	|	pointer direct_declarator
	;

direct_declarator:
		DT_TOK_IDENT { $$ = dt_decl_ident($1); }
	|	lparen declarator DT_TOK_RPAR { $$ = $2; }
	|	direct_declarator array { dt_decl_array($2); }
	|	direct_declarator function { dt_decl_func($1, $2); }
	;

lparen:		DT_TOK_LPAR { dt_decl_top()->dd_attr |= DT_DA_PAREN; }
	;

つまり

( 記憶クラス or 型 or const volatile など) の繰り返し

( 記憶クラス or 型 or const volatile など) の繰り返し 識別子;
( 記憶クラス or 型 or const volatile など) の繰り返し *識別子;
( 記憶クラス or 型 or const volatile など) の繰り返し 識別子(パラメータリスト);
( 記憶クラス or 型 or const volatile など) の繰り返し 識別子[パラメータリスト];
:
などなど
:

みたいな変数宣言と型宣言の組み合わせなのか。

型宣言は分かるけど変数宣言もグローバル領域にしかできないのか。

文法以外のいろいろ

  • C 言語のポインタは数値としてしか扱えない。
  • copyin でメモリの内容をコピーする
    • copyin(arg0, 3) ← C 言語のポインタ arg0 から 3 バイトコピーした領域の(D 言語の)ポインタを返す。
    • 解放とか考えなくてもいい
  • 0 終端な文字列は copyinstr(p) で
  • struct hoge { int fuga; } など同じ型を宣言して copyin と sizeof でコピーすればいい