本を読む

読書やコンピュータなどに関するメモ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

DateTime::Format::Strptimeで"PST"をパース

 作業メモ。

 「2009-06-30 08:37:45 JST」という日時表記を、PerlのDateTime::Format::Strptimeでパースしてみます。

$ cat hoge1.pl
#!/usr/bin/perl
use strict;
use warnings;
use DateTime::Format::Strptime;

my $fmt = DateTime::Format::Strptime->new(pattern => '%Y-%m-%d %T %Z');
my $date = $fmt->parse_datetime($ARGV[0]);
print $date->ymd, "\n";
$ perl hoge1.pl '2009-06-30 08:37:45 JST'
2009-06-30

 これはうまくいきました。が、タイムゾーンが"PST"だとパースできません。

$ perl hoge1.pl '2009-06-30 08:37:45 PST'
Can't call method "ymd" on an undefined value at hoge1.pl line 8.

 on_error => 'croak'をつけて調べてみます。

$ cat hoge2.pl
#!/usr/bin/perl
use strict;
use warnings;
use DateTime::Format::Strptime;

my $fmt = DateTime::Format::Strptime->new(pattern => '%Y-%m-%d %T %Z', on_error => 'croak');
my $date = $fmt->parse_datetime($ARGV[0]);
print $date->ymd, "\n";
$ perl hoge2.pl '2009-06-30 08:37:45 PST'
The timezone 'PST' is ambiguous. at hoge2.pl line 7

 PSTはambiguousだそうです。しょうがないのでPSTのオレ定義を突っこんでみます。

$ cat hoge3.pl
#!/usr/bin/perl
use strict;
use warnings;
use DateTime::Format::Strptime;

$DateTime::Format::Strptime::ZONEMAP{PST} = '-0800';
my $fmt = DateTime::Format::Strptime->new(pattern => '%Y-%m-%d %T %Z', on_error => 'croak');
my $date = $fmt->parse_datetime($ARGV[0]);
print $date->ymd, "\n";
$ perl hoge3.pl '2009-06-30 08:37:45 PST'
2009-06-30

 めでたしめでたし。

スポンサーサイト

「C.M.B.」11巻

 博物学+ミステリーのシリーズ。どちらかというと「Q.E.D.」よりミステリー的には厳密さをゆるめて、そのぶん話を広げた感じだと思う。どっちも好き。この巻は、人間関係の結びつきが軸となった話が並んでいた。

 「ファイストスの円盤」は、エーゲ海で資産家をめぐる愛憎がからんで起こる殺人事件の話。ちょっとアガサ・クリスティっぽいと思った。博物学ネタは題名どおりファイストスの円盤。

「初釜」は、年配の同窓生が正月に集まった場で起こった事件。ちなみに冒頭で塔馬君と水原さんがちょっとだけゲスト出演してる。

 「丸〆猫」は、妻に先立たれて落ち込んでいる老人のまわりに続けて起こる現象とその結末。「これで問題は解決するんだな!?」「ううん!」のくだりが、ミステリーっぽくていい。森羅君のちょっといつもと違う言動からラストにつながる物語もよかった。

「Q.E.D.」33巻

つまりパラドックスは厳密な論理の中だけにあるとは限らない
人の心の中にもあるんですよ

 「パラドックスの部屋」と「推理小説家殺人事件」を収録。いずれも、証言のつじつまから真実に迫る話だった。あいかわらずレベル高いなぁ。

 「パラドックスの部屋」は、一人の男の実像を追いかける話。テイストとして、「C.M.B.」の「1億3千万人の被害者」をちょっと連想した。

 「推理小説家殺人事件」は…なんというかミステリ作家のみなさんお疲れさまです、と。

Ubuntu 9.04でノートPCを閉じたときにサスペンドするしくみ

 とある飲み会の席で、「(CTWMの)DebianでThinkPadを閉じたときにサスペンドしてくれればいいのに」「あれ、この(GNOMEの)Ubuntu 9.04だと簡単にできるよ」という会話になったので、後からしくみを調べてみました。

 結論としては、gnome-power-managerを中心に、halとかdbusとかのGNOMEを構成する機構を使いまくっているようです。

 「Debian/etch で Gnome Power Managerをつかってサスペンドする」を参考にしながら、スクリプトやソースを眺めてみたので、あとから見返すためのメモを残しておきます。といっても、GNOMEではgnome-power-managerからDebiceKit-Powerに移行するとかいう話になっているようですが…

追記2009-06-15: 補足しておくと、これはUbuntu固有の話ではなくて、「Ubuntu 9.04時点でのGNOME」の話です。

GNOMEでの設定

  • 「システム」 - 「設定」 - 「電源の管理」 - 「AC電源使用時」「バッテリー使用時」 - 「ノートPCを閉じたとき」で、「サスペンド状態にする」を選択
  • gconfでいうと、以下の2つの値を"suspend"に
    • /apps/gnome-power-manager/buttons/lid_ac
    • /apps/gnome-power-manager/buttons/lid_battery

ノートPCを閉じたときのイベント

  • acpidのLidボタンの設定を見たけど、これでサスペンドしてるわけではなさそう
$ cat /etc/acpi/events/lidbtn
# /etc/acpi/events/lidbtn
# Called when the user closes or opens the lid

event=button[ /]lid
action=/etc/acpi/lid.sh
  • Lidボタンは/dev/input/event1からイベントを取れるらしい
$ grep Lid /var/log/kern.log
Jun 14 07:41:45 ubuntu01 kernel: [    1.600622] input: Lid Switch as /devices/LNXSYSTM:00/device:00/PNP0C0D:00/input/input1
Jun 14 07:41:45 ubuntu01 kernel: [    1.600977] ACPI: Lid Switch [LID]
$ sudo evtest /dev/input/event1
Input driver version is 1.0.0
Input device ID: bus 0x19 vendor 0x0 product 0x5 version 0x0
Input device name: "Lid Switch"
Supported events:
  Event type 0 (Sync)
  Event type 5 (?)
    Event code 0 (?)
Testing ... (interrupt to exit)
^C
  • それをhald-addon-inputが監視して、HAL経由でイベントを送っているみたい
$ ps ax | grep '[h]ald-addon-input'
 3114 ?        S      0:01 hald-addon-input: Listening on /dev/input/event2 /dev/input/event0 /dev/input/event4 /dev/input/event6 /dev/input/event1 /dev/input/event7

ボタンのイベントを受ける処理(src/gpm-manager.c)

  • ここからgnome-power-managerの中身
  • 上記のgconfのエントリは、src/gpm-conf.hでGPM_CONF_BUTTON_LID_ACとGPM_CONF_BUTTON_LID_BATTとして#defineされている
  • それを参照しているのが、src/gpm-manager.cのlid_button_pressed()
    • lid_button_pressed()はボタンイベントのコールバック関数button_pressed_cb()から呼ばれている
      • button_pressed_cb()は、gpm_manager_init()の中でセットされる
	g_signal_connect (manager->priv->button, "button-pressed",
			  G_CALLBACK (button_pressed_cb), manager);
  • これで、ボタンのイベントからbutton_pressed_db()→lid_button_pressed()が呼ばれる?
  • lid_button_pressed()は、manager_policy_do()でGPM_CONF_BUTTON_LID_ACやGPM_CONF_BUTTON_LID_BATTの値を取ってくる
  • 取ってきた値がACTION_SUSPENDであれば、gpm_manager_action_suspend()を呼ぶ
    • ACTION_SUSPENDは、gpm-prefs.hで#defineされている。実体は"suspend"という文字列
	} else if (strcmp (action, ACTION_SUSPEND) == 0) {
		gpm_manager_action_suspend (manager, reason);

権限をチェック(src/gpm-manager.c)

  • gpm_manager_action_suspend()の中身
  • GPM_CONF_CAN_SUSPENDで権限をチェックする
    • GPM_CONF_CAN_SUSPENDは、gpm-conf.hで#deineされている。実体はGPM_CONF_DIR "/general/can_suspend"
  • hal_gpower_can_suspend()で権限をチェックする
    • libhal/libhal-gpower.cのhal_gdevice_get_bool()で、HALの"power_management.can_suspend"をチェックしている
$ hal-device | grep -F power_management.can_suspend
  power_management.can_suspend = true  (bool)
  power_management.can_suspend_hybrid = false  (bool)
$ cat /etc/dbus-1/system.d/hal.conf
(略)
    <allow send_destination="org.freedesktop.Hal"
           send_interface="org.freedesktop.Hal.Device.SystemPowerManagement"/>
(略)
  • gpm_manager_is_inhibit_valid()でチェック
  • 一連のチェックを通ったら、gpm_control_suspend()を呼び出す

HALへ(src/gpm-control.c)

  • gpm_control_suspend()の中身
  • gpm_control_allowed_suspend()で権限をチェック
    • gpm_control_allowed_suspend()では、gpm_control_is_user_privileged()で"org.freedesktop.hal.power-management.suspend"をチェックしている
$ polkit-auth | grep -F org.freedesktop.hal.power-management.suspend
org.freedesktop.hal.power-management.suspend
  • gnome_keyring_lock_all_sync()を呼ぶ
  • gpm_screensaver_lock()を呼ぶ
  • gpm_networkmanager_sleep()を呼ぶ
  • 最後にhal_gpower_suspend()を呼ぶ

HALにサスペンドのメッセージ(libhal/libhal-gpower.c)

  • hal_gpower_suspend()の中身
  • dbus_g_proxy_call()でHALに"Suspend"を送る
$ cat /usr/share/hal/fdi/policy/10osvendor/10-power-mgmt-policy.fdi
(略)
      <append key="org.freedesktop.Hal.Device.SystemPowerManagement.method_names" type="strlist">Suspend</append>
      <append key="org.freedesktop.Hal.Device.SystemPowerManagement.method_signatures" type="strlist">i</append>
      <append key="org.freedesktop.Hal.Device.SystemPowerManagement.method_argnames" type="strlist">num_seconds_to_sleep</append>
      <append key="org.freedesktop.Hal.Device.SystemPowerManagement.method_execpaths" type="strlist">hal-system-power-suspend</append>
(略)
  • これにより、hal-system-power-suspendが実行されるっぽい

hal-system-power-suspend(/usr/lib/hal/scripts/linux/hal-system-power-suspend*)

  • halパッケージに含まれるシェルスクリプト
  • /usr/lib/hal/scripts/linux/hal-system-power-suspendから/usr/lib/hal/scripts/linux/hal-system-power-suspend-linuxをexecする
  • /usr/lib/hal/scripts/linux/hal-system-power-suspend-linuxは/usr/sbin/pm-suspendを実行

pm-suspend(/usr/sbin/pm-suspend)

  • pm-utilsパッケージに含まれる
  • /usr/lib/pm-utils/bin/pm-actionへのシンボリックリンク
  • pm-acitonは$0を見て動作が変わるシェルスクリプト
  • pm-suspendとして呼ばれると、do_suspendを実行
  • do_suspendは、sourceしている/usr/lib/pm-utils/pm-functionsで定義されている
                do_suspend() { echo -n "mem" >/sys/power/state; }

「のぼうの城」マンガ版

 滅法おもしろかった小説「のぼうの城」をマンガ化した作品。

 ストーリーは原作に忠実。ただ、そのために話が駆け足になっていて、原作を読んでないとわかりづらいかも。

「ブラッディ・マンデイ」11巻

BLOODY MONDAY 11
BLOODY MONDAY 11
posted with amazlet at 09.06.15
恵 広史 龍門 諒
講談社

 第1部完。第2部は完結してから読めばいいかな。

Debian・UbuntuにはjQueryのパッケージが用意されている

 出オチなタイトルですが、いちおう調べた過程をメモ。

 jQueryは定番のJavaScriptライブラリ(言語内DSL?)です。最近では、FirefoxのUbiquityや、MicrosoftのASP.NET AJAX/Visual Studioなどにまで採用されているようです。

 さて、Debianマシンをメンテしていて、libjs-jqueryというパッケージがインストールされていることに気づきました。これがjQueryのパッケージです。

 以下、Debianのstable版(lenny)で調べてみます。

jQueryは/usr/share/javascriptに置かれる

 インストールします。

$ sudo apt-get install libjs-jquery

 依存関係で、javascript-commonとwwwconfig-commonもインストールされます(インストールされていなければ)。

 libjs-jqueryに含まれるファイルを調べます。

$ dpkg -L libjs-jquery
/.
/usr
/usr/share
/usr/share/javascript
/usr/share/javascript/jquery
/usr/share/javascript/jquery/jquery.js
/usr/share/javascript/jquery/jquery.lite.js
/usr/share/doc
/usr/share/doc/libjs-jquery
/usr/share/doc/libjs-jquery/README.Debian
/usr/share/doc/libjs-jquery/changelog.Debian.gz
/usr/share/doc/libjs-jquery/copyright
/usr/share/javascript/jquery/jquery.min.js
/usr/share/javascript/jquery/jquery.pack.js

 jQuery自体は、/usr/share/javascript以下に置かれるようです。

tracからはシンボリックリンクで参照する

 /usr/share/javascript/jqueryをアプリからどう参照しているか、例として、tracの場合を見てみます。

 まずソースをダウンロードします。

$ sudo apt-get source trac

 ディレクトリに入ります。

$ ls
trac-0.11.1              trac_0.11.1-2.1.dsc
trac_0.11.1-2.1.diff.gz  trac_0.11.1.orig.tar.gz
$ cd trac-0.11.1

 最近のLinuxディストリビューションのパッケージシステムでは、ソフトに独自の変更を加える場合に、ソース自体を変更するのではなく、パッチを用意しておいてビルド時に適用します。Debianではdpatchという仕組みを使っています。

 dpatch用のパッチを見てみます。

$ ls debian/patches
00list                                   16_install_contrib_dir.dpatch
10_remove_trac_suffix_from_title.dpatch  17_SA32652.dpatch
15_remove_jquery_file.dpatch

 15_remove_jquery_file.dpatchの中を見ると、tracに含まれるjQueryを削除していました。

 削除したかわりに、libjs-jqueryのほうを使うように、シンボリックリンクを張ります。これは、ビルド時にdh_linkがやります。debian/trac.linksファイルを見てみます。

$ cat debian/trac.links
/usr/share/javascript/jquery/jquery.js /usr/share/pyshared/trac/htdocs/js/jquery.js

 tracに入っているjQueryがlibjs-jqueryで置き換えられることがわかりました。

まとめ

  • DebianやUbuntuではjQueryがlibjs-jqueryパッケージで提供されている
  • 使う側はシンボリックリンクして参照する

WWWのインライン画像の起源

Electronic Journal: モザイクはなぜブレイクしたのか(EJ第2071号)
これに怒ったのは、ティム・バーナーズリーです。彼はアンドリーセンに電話を入れ、「WWWに画像を入れるとは何事か」と抗議したというのです。

 ちなみに、Wikipediaにあるスクリーンショットによると、元祖Webブラウザ「WorldWideWeb」は画像をサポートしていたようです。

追記2009-06-06:

 Tim Berners-Lee自身の説明によると、インライン画像は1990年から1993年の間に実装されたとのことです。

シェルスクリプトで自殺関数

 シェルスクリプトで。dash、bash(POSIXモード、標準モード)で確認。Rubyの解に通じる直球さ。

pointless() {
  echo turning off myself
  unset -f pointless
}

pointless
pointless

 bash限定(標準モード、POSIXモード)なら、関数名を抽象化できます。

pointless() {
  echo turning off myself
  unset -f $FUNCNAME            # same as "unset -f ${FUNCNAME[0]}"
}

pointless
pointless

「ボーアウト 社内ニート症候群」

ボーアウト 社内ニート症候群
ヴェルダー・ペーター・R フィリップ・ロートリン
講談社
売り上げランキング: 229891

 かのパーキンソンの法則によると、仕事の量は与えられた時間を満たすまで膨張するという。ひらたくいうと、本来の仕事をしているつもりが自分で雑用をどんどん作っているという、試験勉強中の部屋掃除状態。

 本書が名付ける「ボーアウト」は、そんなこんなで仕事に関心を失い、仕事をしているふりをする人を指す用語。だべったり私用メール、ネットサーフィン、ネット動画などで時間をつぶし、一方で滅私奉公パフォーマンスなどで貢献をアピール、さらには会議を「面白い」世間話で引き延ばしたりする。…いや、私を含めて多くの人が身に覚えがあると思うけど。

 そうした状況を本書では、やりがいのなさの悪循環としているのが特色。つまり、退屈→適当にやる→がんばってもしょうがない→退屈、というサイクルでどんどん悪化していくという論だ。

 30分ぐらいで読める、新書相当の軽い本だけど、まあなんだ、管理職の人って大変ですね。

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。