9/26 (火)
Google でヒットした PDF ファイル
Permlink
Google でヒットした PDF への URL に
#search="検索キーワード"
というサフィックスが着くようになったのに気づいた。
これって前からだったけ?
PDF を開くたびにブラウザ内の Acrobat がキーワードにマッチする箇所まで移動するので、 拾い読みする場合には○。 でもマッチした PDF を最初から読みたいと思っていると、 いちいち文書の中腹まで移動されるのは面倒だなぁ。
ど忘れ
Acrobat Reader を Web ブラウザにプラグインしている場合、
Web 上で公開された PDF ファイルの URL の後に #hogehoge
とかつけると、
しおりの位置や指定したページを開く機能があったはず。
でもどうやればよかったのか思い出せない。
Help me!!
[Tips] PDF ファイルの開き方 (PDF Open Parameters; PDF形式)
Permlink
Web ブラウザで PDF を見る場合のパラメータは、 Acrobat が出している PDF Open Parameters というドキュメントに載っていた。 使えそうなものをいくつか抜粋してみる。
パラメータ名 | 内容 |
---|---|
nameddest=name | PDF 中の named destination を指定する |
page=pagenum | ページ番号を指定する。最初のページは 1 になる。#page=14 のように指定する。 |
pagemode=bookmarks pagemode=thumbs pagemode=none |
ページが開かれた時に「しおり」や「ページ」のサイドバーを開いた状態にできる。デフォルトは none。 |
search=wordList | PDF を開いた時に文字列の検索を行う。#search="word1 word2" のように使用する。 |
scrollbar=1|0 | scrollbar |
toolbar=1|0 | toolbar |
statusbar=1|0 | status bar |
messages=1|0 | message bar |
navpanes=1|0 | navigation panes |
パラメータが複数ある場合は &
で区切ればよい。
例えば PDF ファイルの 5ページ目に移動した後、
その中から nameddest をサーチした状態で PDF を開きたい場合には、
URL に #page=5&search="nameddest"
をつければよいようだ。
「HTML文書からPDF文書の指定ページにリンクするには」
(http://www.keiyu.com/doc/pdflink.htm#02)
>> Acrobat 4.0以降では、HTML文書で次のように設定すると、指定ページにリンクできます。
>> http://www.keiyu.com/test.pdf#page=3">3ページ目を表示
9/24 (日)
元住吉駅が高架化されたよ
Permlink
アパートからの最寄駅である 東急東横線の元住吉駅が高架化されたよ。
プラットフォームが2階に改札階が3階にあり、 一度3階まで昇った後に2階に降りるという構造になっている。 周囲で一番高い建物なので見晴らしは大変よい。
[Food] ビッグアップル@元住吉
Permlink
久しぶりにビッグアップルでお昼を食べる。
すっきりしましたね。
9/23 (土)
[Linux] Linux で tick 未満の精度のタイマーをどうやって扱うか?
Permlink
9/19の日記の続き。
今のところ HPET (いわゆるマルチメディアタイマー) は i386、x86_64、ia64 に存在するが、
活用されているとは言い難い。
まず HPET は /dev/hpet
というデバイスとして見えるので、
これを直接操作することでタイマーをセットすることが可能だ。
特定時間後に SIGIO シグナルを飛ばすような使用方法ができる。
ただユーザプロセスから /dev/hpet
を開いて操作するのは不便だ。
i386 や x86_64 では、 HPET は RTC (Real Time Clock) の代わりとして使用されている。 この場合は高精度の時計として使われているに過ぎない。
ユーザプロセスからシームレスに高精度タイマーを使うためには、
(理論上は) POSIX タイマー (timer_create) を拡張する方法がある。
POSIX タイマーの生成関数 timer_create(2)
は which_clock によってタイマーの種類が指定できる。
実時間であれば CLOCK_REALTIME、プロセス時間であれば CLOCK_PROCESS_CPUTIME_ID を設定する。
int timer_create (clockid_t which_clock, struct sigevent *timer_event_spec, timer_t *created_timer_id);
#define CLOCK_REALTIME 0 #define CLOCK_MONOTONIC 1 #define CLOCK_PROCESS_CPUTIME_ID 2 #define CLOCK_THREAD_CPUTIME_ID 3 #define CLOCK_REALTIME_HR 4 #define CLOCK_MONOTONIC_HR 5
このタイマー種類は
Linux 2.6.17 系カーネルの中では k_clock
構造体の配列 posix_clocks
として区別されている。
posix_clocks
配列の最大要素数は 16 であり、
半分ぐらいは使われいない。
static struct k_clock posix_clocks[MAX_CLOCKS];
struct k_clock { int res;/* in nanoseconds */ int (*clock_getres) (const clockid_t which_clock, struct timespec *tp); int (*clock_set) (const clockid_t which_clock, struct timespec * tp); int (*clock_get) (const clockid_t which_clock, struct timespec * tp); int (*timer_create) (struct k_itimer *timer); int (*nsleep) (const clockid_t which_clock, int flags, struct timespec *, struct timespec __user *); int (*timer_set) (struct k_itimer * timr, int flags, struct itimerspec * new_setting, struct itimerspec * old_setting); int (*timer_del) (struct k_itimer * timr); #define TIMER_RETRY 1 void (*timer_get) (struct k_itimer * timr, struct itimerspec * cur_setting); };
SGI Altix は HPET を使って POSIX タイマーの種類を増やしている(CLOCK_SGI_CYCLE(10)
)。
mmtimer ドライバーを導入すると
posix_clocks[10]
が専用のタイマーになるようだ。
static struct k_clock sgi_clock = { .res = 0, .clock_set = sgi_clock_set, .clock_get = sgi_clock_get, .timer_create = sgi_timer_create, .nsleep = do_posix_clock_nonanosleep, .timer_set = sgi_timer_set, /* ここで HPET を操作 */ .timer_del = sgi_timer_del, /* ここで HPET を操作 */ .timer_get = sgi_timer_get /* ここで HPET を操作 */ }; register_posix_clock(CLOCK_SGI_CYCLE, &sgi_clock); /* posix_clocks[] への登録 */
mmtimer がインストールされた後は、
timer_create(2)
の which_clock に CLOCK_SGI_CYCLE が指定できるようになり、
timer_settime(2)
でインターバルタイマーを仕掛けると
tick の途中であっても SIGALRM シグナルが送信されるようになる。
もっとも SIGALRM が正確に送信されても、
受け取り側のプロセスがそれを遅滞なく受信できるとは限らない
(スケジューラの都合次第)。
tick 未満のタイマーを作るにはまずハード的なタイマー機構が必要だが、 その後は POSIX タイマーの仕組みに乗っけてしまうのが使う側からは楽そうだ。
会社から送った私物の本が届く
Permlink
異動前の職場に置いていた私物の本類を自宅に宅急便で送り返す。 荷物が段ボール二箱分ほど増えて、 またアパートが狭くなった…
9/22 (金)
早大の山名研からのアクセスが止んだ
Permlink
9月10日 12:14:57 (+0900) を皮切りに
"e-SocietyRobot(http://www.yama.info.waseda.ac.jp/~yamana/es/)"
という User-Agent を持つロボットが大量にやってきていたのだが、
9月22日 04:10:21 (+0900) にピタりと止まる。
ログを見ると綺麗に10秒づつ間を空けてのアクセスが続き、 数時間置きに休止タイムがきている。
e-Societyの 「基盤ソフトウェアの総合開発」プロジェクト「インターネット上の知識集約を可能にするプラットフォーム構築技術」というプロジェクトの実施に伴うWebクローラによるWebページ収集の一環だったらしい。 利用者の検索目的に応じて必要となる情報を抽出することを可能とするソフトウェアを開発する。 もって、企業情報ポータル(EIP:Enterprise Information Portal)向けの有用な情報ソースを取り出す手段の実現を目的とする。とあるが、EIP って何だろう? 2ch の監視みたいなことができればいいのかしら?
風邪引いたかも
Permlink
職場で夏風邪が流行っているのだが、自分も妙に熱っぽい。 風邪を引いたかもしれん。
9/21 (木)
Power Distribution Unit
Permlink
外部周辺機器の電源管理をソフト的に制御できる機械を探してみる。 国内だと APC の Power Distribution Unit (PDU)製品が入手し易い。 UPS が載らないタイプだと高くても50万円ぐらいに納まる。 PDU との通信・制御はシリアル or ネットワーク(SNMP)になるようだ。
設置形態としてはラックマウント式の PDU が主流だが、 それは PDU と同じラック内の機器を制御することが前提のように見える。 ラックに PDU に入れてラック外の周辺機器まで電源ケーブルを伸ばすためには、 ラックの形状が問題になりそう。
9/19 (火)
[Linux] IA-64/Linux でも HPET が使える
Permlink
前々から悩んでいた Linux のタイマー精度の不足の問題 (5/22の日記、7/4の日記)だが、 IA-64 でも HPET(High Precision Event Timers) が 使えることが分かった!!
HPET は実際の IC チップではなく、 イベントタイマーのインターフェイスなので、 チップ自体は各社がそれぞれ作ればよいようだ。 規定によりクロック精度は最小(?) 10MHz (=100ナノ秒)単位で、 最小 3 個~最大 32 個のタイマーが使用可能らしい。
Linux では /dev/hpet
という char デバイスとして見える。
2.6.17 系のカーネルを見ると
SGI の SN2000 マシンで IA-64/Linux を動かした場合、
timer_create(2)
のタイマーが HPET 経由となり
1/1024 秒の呪縛から解放されるようだ。
HPET 搭載実チップ (Data sheet)
Intel だと Intel I/O Controller Hub 6 (ICH6) の中に存在してと聞く。
インターバルタイマーがシステム全体で3本だけ使えるようだ。
クロック精度は 68.841279 ナノ秒単位らしい。
微妙なクロックだ。
[時事] タイでクーデーター
Permlink
現地時間の午後10時(日本時間20日午前0時)にタイでクーデータが発生。 軍がバンコク市内を制圧。
9/18 (月)
[Work] はじめての HP-UX 11i v2 for IA-64
Permlink
おひごとで必要なので Itanium2 サーバに HP-UX 11i をインストールする(9月14日の日記)。 rx26000 に購入以来初めて Linux 以外の OS がインストールされる。
rx2600 は VAG がオプション扱いの製品だけあって(2004年3月9日の日記)、シリアルコンソール経由のインストールになる。 DVD からのコールドインストールで1時間ぐらいかかる。
とりあえずインストール時に気づいた HP-UX の特徴は、
- デスクトップは CDE。
- HP-UX は VERITAS File System/Volume Manager がデフォルトで使える。 デフォルトのファイルシステムが VxFS。
- デフォルトに任せると
- パーティションは {/home,/opt,/tmp,/usr,/var,/stand,/} の 7 つに切られる。
- /etc/shadow には対応しているがデフォルトオフ
- C コンパイラはバンドルされている。
(Bundled) cc: HP aC++/ANSI C B3910B A.05.50 [May 15 2003]
これは最適化が一切効かないバンドル版のようだ。
とりあえずインストールは完了したが、 現状では bash も emacs も less も使えない環境なので、 gcc をコンパイルするところからはじめないとダメみたい。
P.S.
HP-UX は Itanium アーキの OS の中で唯一 (Solaris/SPARC の V8 ABI、MIPS/IRIX の N32 ABI みたいな) 32-bit モードを持っているだよね。 暇になったら Java VM も 32-bit/64-bit の両方のバイナリが存在するので、 性能差を較べてみよう。
参考
- hp テクニカルドキュメント
9/17 (日)
9/14 (木)
こんにちは HP-UX
Permlink
IRIX とは永訣の分かれを告げたが、こんどはアレゲな理由で HP-UX が必要に。
こんなこともあろうかと、hp の Itanium2 マシンを買う時に HP-UX 11i も買っておいたので問題ない。
ところで HP-UX 11i のメディアってどこにやったけ…
9/13 (水)
[Work] NETGEAR GSM7324 がまた不調に
Permlink
職場の L3 GbE Switch がまた不調になり、暴走を繰り返すようになった(前回は2004年9月27日、2004年11月30日)。 ラックの配置が変わって廃熱が悪くなったためだろうか?
9/11 (月)
SGI が MIPS & IRIX を打ち切りへ (CNET Japan)
Permlink
随分前から (SGI の) MIPS プロセッサの開発は滞っていので 覚悟はしていたのだが、 ついに IRIX & MIPS マシンの開発・販売が終了するとこのこと。
大学院時代に筑波大学の RCCP の Origin2000 (4-way R10000 180MHz) を使わせてもらったが、 それが自分が触る初めての 64 ビット計算機だった。 研究の内容が内容なので グラフィック系のアプリに触ることはまったくなかった(←オイオイ)が、 アセンブラや ABI と戯れる日々はあの頃にはじまったんだなぁ。
過去の資産継承という意味では、 SGI は Transitive 社と組んで Itanium/Linux 上で動く MIPS/IRIX バイナリのエミュレータを開発 しているので、 そちらに以降させるつもりだろう。 SGI の最大の資産 MIPS Pro Compiler もソースが公開されて Open Research Compiler などに引き継がれているし、 IRIX がなくなっても IRIX がなくなっても問題ないか…
9/9 (土)
Binary Hacks の校正フェスト
Permlink
オライリー・ジャパンから今度出版される Binary Hacks に 自分も少し書かせてもらったのだが、 本日は執筆者が集まって原稿の校正する会に参加する (Shudo's Note の 2006/9/9 分参照のこと)。
開催場所のオライリー・ジャパンのオフィスは 都営新宿線の曙橋駅を出て徒歩5分。 事前に十分調べてきたつもりなのだが… 駅を出て行きなり迷う。 逆方向に行ったり行き過ぎたりで到着が 30 分ぐらい遅れる。 新宿に来ると毎回迷子になっているような気がする。新宿魔境。
Binary Hacks の著者の方々とお会いするが、
凄い人たちばかりで圧倒される。
いろいろとお話を聞くが、
本人も然ることながら
周囲にいる人たちも凄いエンジニアばかりで、
自分の職場とは天地の差があることを痛感する。
# というかそういうところに移っていくわけだ
宇明家 (公式)
打ち上げは四谷にあるオリジナル餃子の店「宇明家」で。
9/7 (金)
[MyWeb] 決意表明
Permlink
先月は研修があったりしてバタバタしていたけど、 もうそろそろ気持ちのスイッチを戦闘モードに切り替えて仕事をしよう。
周りのペースに合わせてノロノロと仕事をしていたのでは、 いつまでたってもトンネルの出口から出られないよ。
9/6 (木)
[CPU] Itanium2 がメモリに書き込みを行うとは?
Permlink
6/26の日記で気にしていた mf 命令がストア・バッファを吐き出さないという問題だが、 少しだけ好転。
問題になるなぁと考えていたのは以下のパターン。 1: ~ 6: は時間的な経過を表している。
- プロセッサ1が 1: で [A] = 1 で 2: で [B] = 1 と書き込みをし、 mf 命令を行う。 ここでメモリに書き込まれたとプログラマーは普通信じるが、 実は [A] はメモリに書き込まれたが、 [B] はストアバッファの中でペンディングしたまま。
- 4: でプロセッサ2 が [B] = 2 を、5: で [A] = 2 を書き込む。 これはメモリに直ちに書き込まれたとする。
- 6: でプロセッサ1 が [A] を読み込む。 これはプロセッサ2が書いた 4: で書いた 2 という値が読み込まれる。
- 7: でプロセッサ1が [B] から値を読み込む。 ストアバッファの中に [B] が存在するので、 ストア・フォワーディングされて値は 1?
[A]、[B] の初期値は 0。 Processor1 Processor2 --------------- ---------- 1: store.rel [A] = 1 2: store [B] = 1 3: mf 4: store.rel [B] = 2 (forcibly) 5: store.rel [A] = 2 (forcibly) 6: load.acq [A] 7: load.acq [B]
結局、mf 命令がストアバッファをフラッシュしない場合、 プロセッサ1 は [A] = 2, [B] = 1 と見えるかもしれない。
だが見落としていたことは mf 命令はストア・フォワーディングを切ると言う動作をする。 7: の load.acq 命令は 2: が書き込んだストアバッファから値を拾うことはできず、 いったんメモリから読み込まなくてはならない。
- 2: と 6: の間には順序関係がある。 そして 6: のロード命令は 5: で書き込まれた値を取り込んでいる。 よって 2: のストア命令の効果は 6: よりも後には遅延できない (1: ~ 5: のどこかでストアバッファからメモリに書き出される)。
- ストアフォワーディングが切れている以上、 7: のロード命令は 6: のロード命令を追い越すことはできない。
よって確実に 7: のロード命令では 4: で書き込まれた [B] = 2 が読める。 これは mf の効果で、 2: 行目が store.rel であれば [B] = 1 と読めてしまうかもしれない。
9/4 (月)
JIT コードと unwind 情報
Permlink
デバッガがスタックトレースを表示するためには、 スタックフレームを動的に解析する必要がある。 通常はレジスタの使い方とスタックフレームの構造が(ある程度)決まっていて、 スタックポインタの位置から検査していけばスタックフレームのある程度の構造は見えてくる。
スタックフレームと自動変数がどのように関連付けられているかを調べたり、
C++ 言語の例外機構を実現するためには、
さらに DWARF2 のようなデバッグ情報が必要になる。
この手のデバッグ情報は
.text
セクションにあるコード本体とは分離していて、
.debug_info
セクションなどに格納されている。
問題は JIT コンパイラを含むシステムなど、
動的にコード生成が行われるアプリケーションの unwind だ。
.debug_info
などのは静的に構成されることを前提にしたセクションだから、
動的コードの unwind を含めることはできない。
libunwind が
動的 unwind 情報の登録・削除機構を提供していて、
デバッガが libunwind に対応していればスタックトレースが可能になる、、、
けどとても登録してはいられない。
プラットフォームによっては Unwind 情報はなくてもどうにかなるのだが、 問題になるのは例によって例のごとく IA-64 である。 Intel 様が IA-64 の ABI を定義するにあたり (Itanium プロセッサ: ソフトウェア規則およびランタイム・アーキテクチャ・ガイド) の ようになされた。 フレームを戻すには前のフレームの sp と bsp と cfm が必要なのだが、 それが現在のフレームのどこに格納されるのか決まっとらん。 Linux も Intel 様の仕様に倣われた。
というわけで IA-64/Linux では unwind 情報がないとバックとレースが取れず、 gdb で見ると unwind 情報の欠けたフレーム以降が大規模に破壊されてしまう。 どうすればいいんだ orz
9/2 (土)
[Food] 上海のお土産
Permlink
2004年~2005年にスイスから来ていたインターンシップ生が、 中国人と国際結婚をするということで 先月末に上海で挙式を挙げたそうだ。 その結婚式に吉川さんが参加して来たので、 お土産を貰った。
中に詰め物の入ったチョコレート。 キーボードと比較していただけると大きさが お分かりかしら?
しゅさんにお会いする
Permlink
警察から運転免許証の更新通知が来ていたのを思い出して、 午後にノソノソと更新に出掛ける。
途中元住吉の本屋に寄ると、 バッタリとしゅさんにお会いする。 今年の3月に元住吉にお引越しされたと聞いていたが、 以降お会いするのは初めて。
[Food] リトル・スプーン (公式)
Permlink
渋谷まで出て服を買ったついでに 「味の時計台」の隣にできたカレー屋に寄ってみる。
カレーの辛さは「ロケッツ(辛口)」を選択。 チーズの掛かったカレーだが結構辛い。
9/1 (金)
[Java] Java で Closure (Closures for Java)
Permlink
旧聞に属するが JDK7 から Java 言語の文法に Closure が追加されることになった。 Java 言語だけでなく Java 仮想マシンのバイトコード命令にも追加が行われる予定。 文法としては function type、local function、anonymous function (closure) が追加される。 以下にその備忘メモ。
- Function Type
-
参照型の一つとして function type が導入された。
- return-type(argumen-type-list)
- return-type(argumen-type-list) throws throwable-type
- return-type(argumen-type-list) throws throwable-type | throwable-type
|
で区切るそうだ。int(int,int) func;
のように変数を定義する。 Function type 型の変数には local function か anonymous function か null が代入できる。 メソッドなどの引数型として使用することも可能。 - Local functions
- ローカル関数というのが作れるようになった。
public static void main(String[] args) { int plus2(int x) { return x + 2; } // plus2 という名前の local function を定義 int(int) plus2b = plus2; // plus2b という名前の function type 型の変数に plus2 を代入 System.out.println(plus2b(2)); // 変数 plus2b を通して plus2 を使用。 }
これまでの Java の anonymous class は、 自分を定義している階層のスコープにある final 修飾されたローカル変数を 内側に取り込んで参照できたが、 local function や closure では final 修飾されていないものでも参照可能のように束縛が緩められた (Anonymous class のルールも緩められたようだ)。 どのように実装しているのかは記述されていない。 その他、以下の特徴がある。- Local function は引数リストとして可変引数を取れない。
- 再帰呼び出しは可能。
- Anonymous Functions (Closures)
-
Local function を無名化し、
直接 function type の変数に結びつけることができる。
前述の Function type の plus2b は plus2 を用いずに、
以下のようにかけるそうだ。
int(int) plus2b = (int x) { return x + 2; } int(int) plus2b = (int x) : x + 2; // 糖衣構文
Non-local Transfer
これ以外に closure の中で使えるのみ使える 特殊な return と break と continue が定義されたようだ。
- return
-
return は現在の local function や closure から一段階の脱出を行うだけでなく、
closure を囲んでいる local function や method から
大域中域脱出する機能がついたようだ。 例題がないので良く分からないが、 以下のようなコードが掛けるようになるのではないかと予想する。// closure void(int,int) compartor = (int x, int y) { if (x == y) { return search: x; } } // local function int search(int(int,int) comparator) { for (int x : arrayX ) { for (int y : arrayY ) { comparator(x,y); } } throw new NoFoundExceptoin(); }
- break と continue
- いまいち動作が不明だが break、continue を実行すると、
現在のスレッドを中断する形で UnmatchedNonlocalTransfer が送出されるみたい。
継続(Continuation)を行うための機構なのだと思うが、 どのようにして使うかは不明。
これを実現するための Java VM に必要な修正が気になるのだが、 そこんとこどうなっているのかは不明。
リンク
- 教育は参考資料 | Java バイトコードに invokedynamic 命令を追加?
- 教育は参考資料 | Java クラスの Full Hot Swapping
- 教育は参考資料 | Java で継続(Continuation)
- /.J | Javaにもとうとうクロージャ