2007-12-18

Drupal で本文の最後に空白を空ける

Drupal で本文の最後に空白を空けるにはどうすればよいだろうか?

/usr/share/drupal 以下を探ってみる.

  • index.php
    • menu_execute_active_handler() を呼んでいる.
  • includes/menu.inc
    • menu_execute_active_handler() から $menu['callbacks'][$path]['callback'] を呼んでいる.これはモジュールで設定されるものだ.モジュール node を見てみる.
  • module/node/node.module
    • node_menu() を見ると,['callback']'node_page_view' が指定されている.
    • node_page_view()node_show()node_view()node_build_content()node_prepare()check_markup()
    • check_markup()module/filter/filter.module で定義されている.よって結論は,フィルターをつくればよいということになる.

2007-12-17

Docomo 携帯料金

自分の Docomo の携帯料金を再検討してみた.

2007/04~2007/11 の平均

  • 音声 1832.5 円/月
  • データ 12822.38パケット/月

ちなみにこの時点で加入しているパケット10では1パケット0.1円である.

パケットパックはパケットパック10の上はパケットパック30で+2000円なのでこのままでいい.

現在加入している音声プランのタイプSSは1000 円で1800円/月である(ファミリー割引といちねん割引の10年超の割引分も含む).その上のタイプSは無料通話分2000円で2300円/月になる. 上のデータからいうと,330円くらい安くなると考えられる.2300 - (1800 + 1832.5 - 1000) = -332.5

また,ゆうゆうコール(通話先を指定して割引)を設定するとよいと思われる.

2007-12-13

svk 実験

svn + svk でファイルの移動とファイルの更新がからみあったときの動作が興味深いので検証してみる.

まず svn リポジトリ http://example.com/svn/hello を用意する.

$ cd test
$ mkdir svn svk
$ cd svn
$ svn co http://example.com/svn/hello
A    hello/hello.c

svk でミラーし,ローカルブランチを作り,ワーキングコピーを作る.

$ cd svk
$ svk mirror //mirror/hello http://example.com/svn/hello
$ svk sync //mirror/hello
$ svk cp //mirror/hello //local/hello
A   hello/hello.c

svn 側でファイル名を変更し,コミットする.

$ cd hello
$ svn mv hello.c hello_world.c
$ svn ci

svk 側でファイルの内容を変更し,コミットする.

$ cd hello
$ vi hello.c
$ svk ci

さて,svk の困ったところは,現在のローカルリポジトリの状態が,リモートリポジトリに対してどのような状態であるかを表示するのが難しいところである.

ワーキングコピーからリモートリポジトリ(実際にはその化身であるローカルミラー)までにローカルブランチという中継点があるため,ワーキン グコピーの情報を表示する svk status などでは役に立たない.ローカルブランチの特定のパスに対して svk status 相当の動作をするコマンドがほしいところである.

まあまずは sync が必要である.

$ svk sync //mirror/hello

smerge で -C オプションを使ってみよう.まずはローカル→リモート方向.

$ svk sm -Cf .
Auto-merging /local/hello to /mirror/hello
Checking locally against mirror source http://example.com/svn/hello
    hello.c - skipped
Empty merge.

これでは状況はよくわからない.では次はリモート→ローカル.

$ svk sm -Ct .
Auto-merging /mirror/hello to /local/hello
A + ./hello_world.c
C   ./hello.c
New merge ticket:
xxxxxxxxxxxxxxxxxxxxxxxxxxx:/hello:NNN
1 conflict found.

わからないでもないが...ここで pull してみよう.

$ svk pull
Syncing http://example.com/hello
Auto-merging /mirror/hello to /local/hello
A + hello_world.c
Conflict found in hello.c:
e)dit, d)iff, m)erge, s)kip, t)heirs, y)ours, h)elp? [e] s
C   hello.c
New merge ticket: ...
Empty merge.
1 conflict found.

となりうまくいかない.では push はというと,

$ svk push
===> Auto-merging /local/hello to /mirror/hello
Empty merge.
===> Auto-merging /local/hello to /mirror/hello
    hello.c - skipped
Empty merge.

となってやはりうまくいかない.

svk help をあさっていて発見した方法を以下に示す.

$ svk sm --track-rename -f .
...
Collecting renames, this might take a while.
U   hello.c - hello_world.c
...
$ svk up -m

(注意) svk up -m のところで svk sm -t . としたら,checksum mismatch occurred なるエラーが出てにっちもさっちも行かなくなった.バグか?

2007-12-04

Subversion で working copy を即座にブランチする

方法

svn cp WC URL 形式を用いる.

$ svn info
Path: .
URL: http://example.com/svn/deopt/project/trunk
(...)
$ svn update
$ svn cp . http://example.com/svn/depot/project/branches/2007-1204-0909
$ svn revert -R .

この方法だと,ブランチしてから変更するのに比べて,ログに残るステップが一つ減るが,特に問題ない.

http://example.com/svn/depot/project/branches が存在している必要がある.コピー後は http://example.com/svn/deopt/project/trunk == http://example.com/svn/depot/project/branches/2007-1204-0909 となる.http://example.com/svn/depot/project/branches/2007-1204-0909 が既に存在していた場合にどうなるかは不明.

2007-12-02

svk 最初の実行ログ

svk depotmap --init
mkdir ~/var/lib/svk
svk depotmap --relocate // ~/var/lib/svk/repos
rm -rf ~/.svk/local

svk mirror //mirror/2007-1202-hello http://www.example.com/svn/aa-hello/branches/2007-1202-1349
svk sync //mirror/2007-1202-hello

svk mkdir //branches -m ''
svk cp //mirror/2007-1202-hello //branches -m ''

svk co //branches/2007-1202-hello
cd 2007-1202-hello/src
vi hello.c
svk ci
vi hello.c
svk ci

svk diff //mirror/2007-1202-hello //branches/2007-1202-hello
svk smerge -C //branches/2007-1202-hello //mirror/2007-1202-hello
svk smerge -l //branches/2007-1202-hello //mirror/2007-1202-hello

svn co file:///home/metalglue/var/lib/svk/repos/branches/2007-1202-hello 2007-1202-hello-svk-svn

注釈

  • smerge -l による各個ログの保持は,ミラー元への複数のコミットになるのではなく,単に一回のコミットに複数のコメントが並ぶだけ.
  • 複数のコメントが並ぶ場合,ローカルのリビジョン番号や日付が自動的に付加される.これを防ぐにはsmerge-verbatim オプションをつける.
  • 漢字は EUC なら問題ない.

2007-11-28

Subversion でディレクトリの名前を変更するときの注意

Subversion でディレクトリの名前を変更するときには注意が必要である.

$ svn mv dir folder
$ svn ci
svn: Commit failed (details follow):
svn: Item '/av-drupal-customize/plcjournal/trunk/plcjournal/zen-fixed' is out of date

となってエラーが発生する.2段階のことを一度にやろうとしているのが原因で,次のように解決する.

$ svn mv dir folder
$ svn update
$ svn ci

2007-11-27

Apache の virtual host

情報源

簡単に

  • virtual host とは1つの物理的なホストで複数のWebサーバエントリを扱う手法.
  • IPベースと名前ベースがあり,名前ベースは UA が送出する HTTP の Host: ヘッダを利用する手法.
  • 以下,名前ベース virtual host の設定.
  • まず NameVirtualHost ディレクティブで,どの (IP アドレス, ポート番号) を virtual host の対象にするかを設定する.
  • 次に <VirtualHost> ディレクティブに,NameVirtualHost で指定した組と同じものを記述し,<VirtualHost> 中の ServerName ディレクティブで設定の対象としたいホスト名を記述する.
NameVirtualHost *:80

<VirtualHost *:80>
ServerName www.domain.tld
ServerAlias domain.tld *.domain.tld
DocumentRoot /www/domain
</VirtualHost>

<VirtualHost *:80>
ServerName www.otherdomain.tld
DocumentRoot /www/otherdomain
</VirtualHost>
  • Apache の挙動: リクエストが来ると、サーバはまず最初に <NameVirtualHost> にマッチする IP アドレスかどうかをチェック.マッチすれば,マッチした IP アドレスの <VirtualHost> のそれぞれのセクションの中から,ServerName か ServerAlias に要求されたホスト名があるか探す.見つかればそのサーバ用の設定を使う.マッチするバーチャルホストが見つからなければ,マッチした IP アドレスのリストの最初にあるバーチャルホストが使われる.

Drupal の teaser list の装飾

Drupal の frontpage のような teaser list で,ノードの表示に枠などの装飾を付けたい.これがないと,ノードの境目がはっきりしないため.

解決策: 通常の class づけではノード単独ページと teaser list での表示の区別は付けられない.views モジュールを使うしかない.

views モジュールで frontpage をオーバーライドし,ブロックを用意し,以下のような CSS をテーマの CSS に追加する.

.view-frontpage .node {
    border: dotted 2px #CCC;
}

2007-11-26

BitTorrent でコマンドラインからダウンロード

BitTorrent でコマンドラインからダウンロードするには:

$ sudo apt-get install bittornado
$ btdownloadcurses hoge.ika.torrent

2007-11-23

Subversion の blame コマンド

svn blame でファイルの各行毎に誰がどのRevで修正しているかを表示できる.

Drupal の access controlComments

Drupal で node の publishing options をユーザが操作できるようにしたいと思い,access control で該当項目を探したのだが,それらしきものが存在しない.しょうがなく node module の administer nodes を on にするとできたのだが,他のノードに関する様々な操作が可能となってしまうのであまり使えない.

ユーザ文書をドラフト状態(書きかけ状態)として人の目に触れさせないようにする方法はあるか?

2007-11-14

Vim の Project プラグイン

  • 起動方法は :Project
    • コマンドラインから vim +Project
  • ~/.vimprojects ファイルを使う.
  • .vimrc に以下を書く
    let proj_flags = 'cgst'
    
    • c: ファイルを開いたときにプロジェクトウィンドウを閉じる
    • g: F12 でプロジェクトウィンドウの開閉を行う
    • s: プロジェクトウィンドウでシンタックスカラーリングを行う
    • t: スペースキーでプロジェクトウィンドウの最大化と復元を行う
  • プロジェクトウィンドウは普通に編集可能.
  • プロジェクトは以下のように記述する
  • Sample Project=$HOME/proj/sample {
    foo.c
    foo.h
    }
    
  • この区域は vim の通常の fold なので通常の fold 用のコマンドを用いて開閉する.
  • 括弧内の行はファイル名で,設定したパスに対して相対パスで指定する.
  • この行で ENTER を押すとファイルが開く.
  • CD オプションを指定すると,ファイルを開いたときにそのパス(設定パスからの相対パス)に :cd する.
  • Sample Project=$HOME/proj/sample CD=debian {
    foo.c
    foo.h
    }
    
  • in, out オプションを指定すると,ファイルのバッファへの出入りに対して vim スクリプトを実行できる.例えば :set makeprg=scons を実行するようにすると :make によって scons が実行できる.
  • Sample Project=$HOME/proj/sample in=$HOME/in.vim out=$HOME/out.vim {
    foo.c
    foo.h
    }
    
  • filter オプションを指定すると,\r キーの入力でプロジェクトの内容をファイルシステムと同期できる.
  • Sample Project=$HOME/proj/sample filter="src/*.c include/*.h" {
    }
    
  • プロジェクトはネストできる.このとき各種設定は葉から根へたどりながら決定される.
  • Sample Project=$HOME/proj/sample filter="src/*.c include/*.h" {
      Sub Project=subproj {
      foo.c
      bar.c
      }
    }
    
  • キー
    • \r   現在のプロジェクトの内容をファイルシステムと同期する.
    • \R   \r と同様だが,再帰する.
    • SPACE   プロジェクトウィンドウの最大化と復元.
    • \g   プロジェクトのファイルを grep する.
    • \G   \g と同様だが,再帰する.
    • \E   :Explore をプロジェクトディレクトリで実行.
    • <F12>   プロジェクトウィンドウの開閉.
    • \1 — \9   あらかじめ設定したコマンドを実行する.
    • \f1 — \f9   あらかじめ設定したコマンドを実行する.
    • \F1 — \F9   あらかじめ設定したコマンドを実行する.
  • 注意点
    • quickfix でファイルがロードされるときには CD や in オプションが実行されない.\L ですべてのファイルをあらかじめロードしてから quickfix するしかない.
    • \r などによる同期で消えてほしくないエントリは以下のように書く:
    •   important_file #pragma keep
      

Vim で ENTER キーを避ける方法

Vim では外部コマンドを実行したときなどに Press ENTER of type command to continue が出てじゃまなことがある.これは外部コマンドの表示が一番下のコマンド行に入りきらないときとか,部分コマンドを表示する部分(右下)にぶつかってしま うときとかに表示される..vimrc で

set noshowcmd
set cmdheight=2

とするとあまり出なくなる.

情報源

:help hit-enter

2007-11-13

JavaScript におけるオブジェクト

メソッド呼び出し o.f() を考えてみる.JavaScript ではメソッドはオブジェクトのプロパティで型が関数であるものを言う.ただし,メソッドは言語仕様としては存在しない(追記参照).単に外見がそう見えるというだけの話である.

オブジェクト指向を実装した言語を考える場合に,メソッド呼び出しと継承との関係が非常に重要である.この関係が存在しないオブジェクト指向言語はありえない.JavaScript のメソッドはプロパティであるのだから,オブジェクトからプロパティを取得するところに JavaScript のオブジェクト指向サポートの本質が隠れているに違いない.そこで仕様書からプロパティの取得部分を引用する.以下で [[XXX]] は内部(隠し)プロパティであることを示す.

8.6.2.1 [[Get]] (P)

O の [[Get]] メソッドがプロパティ名 P で呼出されると,次のステップがとられる:

  1. O が P という名前のプロパティを持っていなければ,ステップ 4 へ進む.
  2. そのプロパティの値を取得する.
  3. Result(2) を返す.
  4. O の [[Prototype]] が null ならば,undefined を返す.
  5. [[Prototype]] の [[Get]] メソッドを,プロパティ名 P で呼び出す.
  6. Result(5) を返す.

この仕様から何が言えるだろうか.

  • オブジェクト指向におけるインスタンスが作成できる.各オブジェクトに個別にメソッドをもたなくても,オブジェクトを 1 つ用意してメソッドを定義して各オブジェクトの [[Prototype]] に指させることで共通のメソッド群を持つ複数のオブジェクト,つまりインスタンスを作成できる.
  • オブジェクト指向における継承を実現できる.ステップ 5 で発生する再帰によって,複数のメソッド群の線形探索が可能になっている.また,線形探索によりメソッドのオーバーライドが実現されている.

ではオブジェクトの [[Prototype]] を設定するにはどうしたらよいのだろうか.o.prototype = { ... } としてしまいそうだが,これではだめである.内部 [[Prototype]] プロパティは .prototype ではない.内部 [[Prototype]] プロパティを設定するには new 式を用いる.

o = new O() としたいが,O は何だろうか.仕様によると,O は内部 [[Construct]] プロパティを持つオブジェクトでなければならない(11.2.2 new 演算子).内部 [[Construct]] プロパティを持つオブジェクトとは JavaScript では関数オブジェクトのみである.いくつかの標準オブジェクト(Object, Array など)も関数オブジェクトである.このような関数オブジェクトはコンストラクタと呼ばれる.

o = new O() とすると,内部 [[Construct]] プロパティ(メソッド)が呼ばれる(11.2.2 new 演算子).内部 [[Construct]] メソッドでオブジェクトが生成され,生成されたオブジェクトの内部 [[Prototype]] プロパティに O.prototype の値が設定される(13.2.2 [[Construct]]).

O.prototype に設定するプロパティは,メソッドのように各オブジェクト(インスタンス)に共有されるものであることに注意する必要がある(数,文字列は結果的に共有さ れない—immutable なので変更しようとすると代入することになり,差し替わる).O.prototype にインスタンス変数を定義してはいけない(クラス変数になってしまう).o = new O() とすると,オブジェクトが生成されたあとに,そのオブジェクトを this として関数 O() が呼び出される.つまり O はコンストラクタとして機能する.このコンストラクタの中で作成したプロパティがインスタンス変数となる.

こうして JavaScript ではオブジェクトシステムが実現されている.

(2012/5/31 追記) 「メソッドは言語仕様としては存在しない」と書いたが、そんなこともない。o.f() により o.f にセットされた関数を呼び出すと、o が隠れた引数として設定され、呼ばれた側から this により参照できる。ちなみにメソッド呼び出しで無い関数呼び出し g() では、this はグローバルオブジェクト(window)を指す。

Drupal における breadcrumb

Drupal で breadcrumb はどういう位置づけになっているのだろうか?Menu and breadcrumb customising | drupal.org などのような不要論すら存在する.

  • まず /usr/share/drupal/modules にて grep breadcrumb */*.module としてみると,blog, book, forum, menu, taxonomy でヒットする.
    • book の outline にノードを参加させると breadcrumb が表示される.
    • taxonomy の term を割り当ててもノードの表示の際には表示されない.term のページには表示される.
    • 自分でメニューを作成し,それにノードを設定すると breadcrumb が表示される.
  • /usr/share/drupal/includes の common.inc, menu.inc あたりを調べてみる.
  • function drupal_get_breadcrumb() {
      $breadcrumb = drupal_set_breadcrumb();
    
      if (is_null($breadcrumb)) {
        $breadcrumb = menu_get_active_breadcrumb();
      }
    
      return $breadcrumb;
    }
    
  • というようになっていて,他に何もセットされていないときにはメニューが検索されて breadcrumb が設定されるようだ.
  • ただ,book と menu に同時に指定すると menu が優先された.どのタイミングで drupal_set_breadcrumb() がモジュールから呼ばれるかは不明である.
  • そもそもサイトを階層化して構成するにはどうすればよいか調べていて,taxonomy_breadcrumb やら,taxonomy_menu やら taxonomy_context やらのモジュールを使うようだと主張する人が多かったのだが,完全に静的な階層構造なら単にメニューを作って一個ずつ指定していけば何もモジュールなど使 わなくても可能である.

2007-11-09

Drupal で最大 upload ファイルサイズを設定

  • /etc/drupal/5/htaccess に以下を追加する.
  • php_value memory_limit                     256M
    php_value post_max_size                    256M
    php_value upload_max_filesize              256M
    
  • memory_limit >= post_max_size >= upload_max_filesize でなくてはならない.
  • Administer >> File uploads で見ると,なぜか 128M が最大となっている.
  • 上の設定のうち実際に有効に設定されているのはどれだろうか?

2007-11-07

Drupal の imagecache モジュール

一番単純な手順 (imagefield を使わない手順)

  • Administer >> Image cache で preset を作成する.
    • namespace を FOO にする.
    • new action から Scale を選び,[Update preset] をクリックする.
    • width に 300 を入力し,[Update preset] をクリックする.
  • Story ノードを作成する.
    • [File Attachments] で幅が300ピクセルより大きい画像をアップロードする.URL が http://www.exapmle.com/drupal/sandbox01/files/sandbox01/image.jpg だとする.
    • [Input format] で Full HTML を選択し,本文に以下を入力する
    • <a href="/drupal/sandbox01/files/sandbox01/image.jpg">
      <img src="/drupal/sandbox01/files/sandbox01/imagecache/FOO/files/sandbox01/image.jpg">
      </a>
      

    これにより,ページには幅300ピクセルに縮小された image.jpg が表示され,クリックするとアップロードしたオリジナルの画像が表示される.

ファイル名の名前付け

フラットな名前空間,例えば単一ディレクトリの中のファイル群とか,wiki のページ名だとかに名前付けをするときに YYYY-MM-DD-title という形式を用いることが多い.これの利点.

  • title 部分が同じでも名前が衝突することが無い.
    • wiki のメモなどでは title 部分が同じになることが多い.それを区別できる.
  • 名前順の整列と時系列での整列が一致する.
    • 例えば普通の ls コマンドで時系列に整列する.

つまり,要素の整列のデフォルトが名前順で,同じものをたくさん入れるような名前空間に要素を作成するときに役に立つ.

Drupal の Recent Comments ブロック

Drupal の Recent Comments ブロックが 2 つ Administer >> Block に登場してしまう.これは,Views モジュールがデフォルトで提供するコメント用のブロックが,Drupal にもともと用意されているブロックと全く同名のため発生する.

2007-11-06

Drupal の taxonomy とは

情報源

Drupal の taxonomy について.

  • term は分類を表すラベルである.ノードに1つまたは複数の term を選択できる.
    • term はシステムでユニークな数値 ID を持つ(vocabulary 内でユニークなのではない).
  • term ただひとつの vocabulary に属する.
  • node には vocabulary 単位で texonomy 入力フィールドを設定できる.
    • vocabulary に属する term のうちどれを選択できるかを設定できる: 高々1つ,高々n個,必ず1つ,1つ以上
  • term はそれが属する vocabulary に属する別 term を親にもつことができる.
  • 親の持ち方を vocabulary ごとに制限できる.
    • 親を持てない,親をただ1つ持てる,親を複数持てる,のうちから選択できる.
  • term によって全 node を検索することができる.
    • http://www.example.com/drupal/taxonomy/term/1 で term ID 1 の term が選択されたノードをリストできる.
    • http://www.example.com/drupal/taxonomy/term/1+2 で term ID 1 または term ID 2 の term が選択されたノードをリストできる.
    • http://www.example.com/drupal/taxonomy/term/1,2 で term ID 1 と term ID 2 の両方の term が選択されたノードをリストできる.
    • 上記 AND と OR のミックスはできない.
    • term ID 3 が term ID 1 と term ID 2 の親であるとき,http://www.example.com/drupal/taxonomy/term/3/all で term ID 1 または term ID 2 の term が選択されたノードをリストできる.
    • 上記 all のところには深さの制限を表す数値を入れることができるが,実用的な意味は無いだろう.

2007-11-02

Drupal で画像を入れる方法 (Lightbox V2)

Drupal で画像入りのページを作成する方法のひとつを試してみよう.目標は,サムネール化された小さめの画像を文中に表示し,それをクリックすると大きいオリジナルが表示されるようにすることである.

今回はクリックすると大きくなるのを実現するために Lightbox V2 を使うことにする.

原始的な方法

  • オリジナルの画像(image01.jpg とする)を縮小したサムネール画像をローカルマシンで作成する(image01thumb.jpg とする).
  • ページの作成を開始する.
  • image01.jpg と image01thumb.jpg を File attachments セクションを使ってアップロードする.
  • input format で Full HTML を選択し,本文に以下のように記述する:
blah blah blah

<a href="/drupal/sandbox01/files/sandbox02/image01.jpg"
   rel="lightbox" title="Caption 01">
<img src="/drupal/sandbox01/files/sandbox02/image01thumb.jpg">
</a>

blah blah blah

imagecache + imagefilter を使う方法

  • Administer >> Site configuration >> Image cache に行く.
    • intext と入力し,Create preset をクリック.
    • Scale を選択し,Update preset をクリック.
    • Width に 300 を入れる.
  • Administer >> Content management >> Content types に行く.
    • Page を edit する.
    • 上のタブから Add field を選ぶ.
    • Name を intext image とし,Field type を Image にして Create field する.
    • 上のタブから Display fields を選ぶ.
    • intext image の Label, Teaser を <Hidden> にし,Full を Lightbox2: intext にする.
  • type が Page のノードの作成を開始する.
    • intext image セクションで image01.jpg をアップロードする.
    • body に本文を記述する.
  • (画像を複数入れたいときの方法は別の場所で.)

Perl の CPAN モジュールのビルド(Build.PL)

Build.PL でビルドするときにインストールディレクトリを指定するには次のようにする.

$ perl Build.PL --install_base ~/lhs

情報源

  • 続・初めての Perl, p. 20.

2007-11-01

Drupal の imagefield モジュール

  • Administer >> Modules で CCK >> Image を on にする.
  • Administer >> Content Type で edit し,Add field し Field type として Image を選ぶ.
    • Image path にその種類のノード用の画像の収納ディレクトリを必要に応じて入力し,Save these setting する.
    • Display fields において Label を <Hidden> にし,Teaser, Full を Default にする.
  • (スタイルの調整)

Drupal の Image モジュール

  • 情報源: Overview of Image Handling in Drupal | Drupal Groups
  • Image モジュールのサブモジュールである Image_attach は,有効にした後,Administer :: Content types で Image Attach settings の Attach Images を on にしなければ動作しない.
  • Image_attach はノードに1つだけイメージノードを指定することができる.そのノードのページにはサムネールサイズのイメージが表示される.
  • 実際には,imagefield, imagecache, (CCK) があれば Image モジュールは必要ない?(ただし,ImageMagickOption はあったほうがいいか...).

2007-10-24

Drupal で設定すべき項目

最初に設定すべきもの

  • Administer >> Site configuration >> File system >> File system path
  • Administer >> Site configuration >> Date and time
  • Administer >> Site configuration >> Clean URLs

(↑ id:metalglue:20071014:1192378712 よりコピー)

  • Administer >> Site Building >> Modules
    • 必須: Book, Path, Upload
    • オプション: Blog, Forum, Search, Statistics
    • まれに: Blog API
    • 不明: Aggregator
    • 不要: Tracker (Views でオーバーライドされる)
  • Administer >> Site configuration >> File uploads
  • 野良モジュール
    • CCK: 全部 on
    • GeSHi: GeSHi Filter を on
      • (debian) Path to GeSHi library に /usr/share/php-geshi を設定する.
    • Taxonomy Menu: Taxonomy Menu を on
      • ある term に属するノードは,その term のメニューをクリックしたときに表示されるページに全部表示される.その表示方法が指定できないのでメニュー構成用には向かないと思う.不要.
    • Views: Views, Views UI を on
    • Image: 全部 off
      • imagemagick を on (sudo cp image.imagemagick.inc /usr/share/drupal5/include)
    • imagefield:
    • imagecache:
  • テーマ
    • カスタマイズしたいテーマをコピーし,template.php のプレフィックスを変更する.

その他

  • Administer » Site configuration » Input formats で各フィルタの permission を設定しないと,ノードを作成するときにフィルタが選択できない.

モジュール候補

  • Pathauto
    • タイトルが日本語の場合,エイリアスが作成されない.それどころか,タイトルの日本語中に半角アルファベットが混じっていると,そのアルファベットだけでエイリアスが作成されてしまう.
    • デフォルトの設定では,自分で設定したエイリアスが上書きされてしまうので,日本語だけのタイトルの場合にエイリアスが設定できない.
    • 不必要かとも思ったが,YYYY-MM-DD- とかを付けられるので考えてみよう.
    • その際,設定で Default path pattern を空にしておけば自動エイリアスを無効にできる.
  • Lightbox V2: イメージ拡大(元画像の表示).
  • Paging
  • Views Bookmarks
    • 思っていたのと違った.自身の Drupal サイトのノードを保管するブックマーク.
  • Views Bulk Operations: ノードのリストをチェックボックスとともに表示して,複数ノードに対して操作を可能にする.
    • 開発中か何かで動作しない.
  • Custom Filter: 正規表現を利用してフィルタを作成する.
    • よさそう.グローバルに置換したい名称とかを変数にできそう.例: ${ploom}
  • Audit Files : アップロードしたファイルとデータベースエントリの整合性を検証する.
  • Date
    • 必要.jstools を入れるとポップアップカレンダーが利用できる.
  • Javascript Tools
    • 必要.
  • Node Relativity : ノード間に親子関係を定義する.
  • API: Drupal の API ページに用いられているモジュール.
    • Drupal のコード専用.
  • Avatar Selection
  • Web File Manager
    • upload.module で用いられる files ディレクトリの下に webfm 専用のディレクトリを用意し,そこの中を Web インタフェースで操作できるようにする.ファイルをアップロードしたり,ダウンロードしたりできる.
  • Site notes: サイト構築の過程などをメモする?とか自動生成する?とか
    • 単に一般ユーザからアクセスできないノード型を用意するだけ.特にサイト構築がどうとかという話ではない.
  • IMG File filter
    • [img:N] と入力すると,そのノードに添付した N 番目の画像を表示するための <img> を生成してくれる.サムネール表示にも対応しているが,単に <img width=XXX> とするだけなのが難.Lightbox に対応した <a> も生成してくれる.
  • Fivestar
  • Node Queue
    • Administer でキューを作成すると,ノードの下のほうに "Add to queue" のようなリンクが現れる.キューの管理が admin インタフェースしかない.ユーザごとに操作できるようになっていたほうがいい?
  • Term Display : taxonomy の term の表示方法をカスタマイズする.
  • Comment Info : 匿名でコメントしたときの情報をクライアント側に保持させるようにして,再入力を不要にする.
  • Usercontent: 自分が書いたコンテンツ(コメントを含む)をプロファイルページに表示する.
    • なかなかいい.
  • ASIN Field
  • Amazon associate tools
    • 必要
  • Amazon Filter
    • 必要
  • NTLM & LDAP Authentication
  • Authorship Module : ノードの著者表示部分の見かけを変更できる.
  • Content Templates (Contemplate): ノードの「変数」を用いてページに変換する方法を記述できる.CCK に有用.
    • インストールすると Administer >> Content template が設定できるようになる.ここで各ノードタイプごとにテンプレートを記述する.テンプレートは PHP で記述する.利用できる変数とその値の例が表示される.jquery_update.module のせいかどうかはわからないが,フィールドの enable/disable が怪しい.
  • freelinking: CamelCase または [[]] によってリンクを記述できる.
    • [[ページタイトル]] で Title が「ページタイトル」のノードへのリンクを表す.[[表示テキスト|ページタイトル]] や [[表示テキスト|URL]] なども可能.
  • DHTML Menu: Administer のように葉でない節をクリックするとページ遷移が起きるようなメニューに便利.
    • ブロックに DHTML:Navigation などが新たに用意される.
  • Visibility API : コンテキスト(ロール,パス)に応じてブロックの可視/不可視を切り替える.
  • Thickbox : jQuery の thickbox を利用可能にする.Image または imagefields をサポート.
  • jQuery Lightbox
  • Inline
  • Mathematics Filter
    • mimetex を用いた数式画像生成モジュール.バグがあって Filtered HTML では動作しない(修正可能).
    • apt-get install mimetex; ln -s /usr/bin/mimetex /usr/lib/cgi-bin/mimetex.cgi
  • Unwrap Filter: 改行フィルタを無効にする.
    • 2つ以上連続する <br> を <p> で置き換えた後 <br> を取り去る.使えなさそう.
  • Table Alternate Rows
  • Annotate for Authors and Critics alike!: ノードについての個人的メモを書けるようにする.
    • バグあり.annotate.install で {annotate} とする.まあいらないかな.
  • Filter Default: ノードタイプごとにデフォルトのフィルタを選択できるようにする.
    • ノードタイプごとではなく,Role ごと.Administer >> Input formats に Defaults タブが追加される.
  • DruTeX
    • これはなかなか凄い.ただ,正確にどのようなフォーマットを受け入れるのかが不明.それがわからないと他のフィルタとの干渉がどうなるかはかれない.
  • Node breadcrumb
    • 指定したノードタイプ, タクソノミーにあてはまるノードに特定のメニューアイテムを結びつける.これによってページ先頭に表示される「パン屑」をカスタマイズできる.つまり結びつけたメニューの階層が表示される.
    • メニューのしくみを理解していないので,有用かどうか判断しかねる.ノードを樹状にオーガナイズする方法 texonomy menu? があれば必要ないのか?
  • Recent Blocks: 「最近編集したブロック」を表示.
    • そうじゃなくて,最近編集したほげほげを表示するブロックを用意するモジュール.Views があれば不要.
  • Table of Contents : ノード中のコンテンツの目次を生成.
  • Node Browser
  • Compact Forms
    • インプットフィールドのラベルを本体にオーバーレイ表示することでフォームをコンパクトに表示できる.フォームの id を指定することで適用されるフォームを選択できる.login フォーム以外に何があるのか?
  • External Links: 内部リンクと外部リンクを区別できる.
    • 外部リンクにアイコンがつく.外部リンクをたどるときに新しいウィンドウを開くように設定できる.イイ!
  • Block Assign: 山ほどブロックがあるときのよりよいUIを提供する.
    • データベース関連のエラーが表示されて使えない.

  • Panels
    • 特定のレイアウトで特定の内容を表示するページを作成できる.一つの設定から複数のページを生成するような類のものではない.
    • レイアウトを選べる.3カラムとか,3カラム+ヘッダ+フッタとか.
    • 各セクションに表示する内容を選べる.view または block など.
    • そのレイアウトをどのURLで表示するかを設定できる.
    • 結構使い道ありそう.FrontPage とかで.
  • Link
    • CCK のフィールドとしてリンクを扱える.ブックマークページ用として使える?
  • Giant Scale Image Viewer
  • E-Journal
  • Related Block
  • Mailsave : メールで送信したコンテンツをノードにする.
  • MySite : MyYahoo!様のノードを作成.
  • Sections
  • SWFUpload: アップロードフォームを Flash に置き換える.
    • ...まあまあ?...
  • EasyLink: リストから選択してソースアンカーを生成できるようにする.
    • TinyMCE に依存.うまく設定できない(動作しない).
  • Views Fusion
  • Node Family
  • Iconizer
  • Texy!
  • Textile
  • Attachment
  • Mobile Media Blog : blog を携帯やメールからポストできるようにする.
  • Tabbed Block : 複数のブロックをタブ付のブロックにまとめることができる.
  • TinyMCE WYSIWYG Editor
    • geshifilter と相性が悪い.「改行を取り去る」オプションをoffにすればよいが.
  • typogrify : -- を — にしたりする.
  • Username check
  • News page : Allows creation of pages which show syndicated 'news' items from an aggregator category.
  • Front Page : フロントページだけ別のテーマとかで表示できたりする.
  • CCK Taxonomy Fields
    • Taxonomy で作成した vocabulary を CCK field として設定できる.ただしこれで設定した term は taxonomy データベースには保存されない.使えないと思う.
  • Content Taxonomy
    • Taxonomy で作成した vocabulary を CCK field として設定できる.これで設定した term の保存先を選択できる.また,入力に用いるUIコンポーネントも選択できる.
    • この CCK field を設定した content type では,通常の taxonomy 入力ができなくなる.すなわち,複数の vocabulary を選択できる content type では,全ての vocabulary について Content Taxonomy モジュールによる CCK field を設定する必要がある.
    • よいと思う.このモジュールが提供するサブモジュール Content Taxonomy Views による機能がどこに行けば見られるのかが不明.
  • editablefields
    • CCK field を on the fly で変更する view を作成できる.
    • view の設定の Page > View Type で Editablefields -xxx を選択する.
    • view の設定の fields に CCK field を追加し,Option から Editable を選択する.
    • 使えそう.
  • Taxonomy Fields
    • ノードにある term を設定すると,その term に結び付けられた CCK field がそのノードの編集画面に現れるようにできる.
    • 複雑すぎだし,あまり必要なさそう.
  • Text Field Tags
    • テキストタイプの CCK field の表示を変更できる.しかし H1~4, b, i, u, blockquote のみなのであまり使い道はなさそう.
  • BUEditor
    • wysiwyg でない plain な textarea への入力をサポートを提供する.
  • IMCE
    • 画像,ファイルのアップローダ

27ページから続く...


  • Fileview: attachment を見る
    • attachment は通常ページ下にリスト形式で表示され,クリックするとオリジナルファイルが開く.このモジュールはクリックして開くページをカスタマイズできる.
  • Links Package: URL リンクの管理?
    • うまく動作しない.不要.
  • Upload previews: attachment を見る
    • ずばりそのとおり.必要.
  • Attachments
    • いらん.

  • Override Node Publishing Options: admin node permission なしでもノードの publish オプションを操作できる.
    • 必須.
  • Quote: コメントに引用機能.
    • いらない.
  • Node Hierarchy : 要確認.
  • Aggregation
    • インストールすると Feed という content type が追加される.Feed Item というのも追加されるが,これは Feed から生成されるものでユーザが作成することは普通はないので無視.
    • Feed を作成する.Aggregation Feed Types: から適切なものを選択(自動決定がないのがつらい).Feed URL: に外部フィードの URL を入力.Options で enable, Publish item にチェック.
    • cron が走ると,Feed Item タイプのノードが自動的に作成される.これを views で見ればいい?
      • そのとおり.views で Aggragation:Original Author というフィルタが使えるようになっているが,これでは役に立たない.Feed を作成するときに taxonomy が指定できるので,それを使うようだ.このためには,あらかじめ Feed Item に適用可能な vocab を作成しておく必要がある.
    • Feed タイプのノードを消すと,それによって生成された Feed Item ノードも消去される.
    • 結論: 不要の気がする.いちいち Feed Item のノードを作成するのが...しかしそれ以外ないか...
  • Aggregator Summary
    • 読み込む CSS がレイアウトを破壊する.だめ.
  • News Page
    • aggregator モジュールで購読しているフィードから,文字列で grep して絞り込んでリストするページを作成できる.

2007-10-18

Subversion のログを変更可能にする

# cd /path/to/repos
# cd hooks
# install -m 754 pre-revprop-change.tmpl pre-revprop-change

pre-revprop-change の中身を確かめて,

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi

のようになっていることを確認すること.

ログをクライアントから変更するには,以下のとおりにする.

$ svn pe --revprop -r REV svn:log

2007-10-16

Drupal 実験中

モジュール

  • Views
    • Haiku Operating System のように,promote されたリストを自在に使いたいときに使える?
  • Last Node
    • 軽い Views として使える?
  • Node Browser
    • 評価先送り
  • Image
    • 画像ノードを作成する.
  • Image Assist
    • 画像をインラインでノード内に表示.Image モジュールで作成したリストから選べる.
    • 画像のタイトルが日本語だと画が出ない.

2007-10-15

Vim で現在のハイライト設定を見本で表示する

以下を実行すると,現在有効になっている :colorscheme におけるハイライトのカラーサンプルと,ハイライトグループのリンクの様子が表示される.これによって,色の具合が変な場合にどのハイライトグループを調整すればよいかが分かる.

:runtime syntax/hitest.vim

2007-10-14

Debian で Drupal の複数インスタンスをホストする

$ sudo apt-get install drupal5

インストールされるもの

/usr/share/drupal5/ 本体
/etc/drupal/5/ 設定
/etc/cron.d/drupal5  
/var/lib/drupal5/ 作業域
/usr/share/dbconfig-common/data/drupal5/  
/usr/share/lintian/overrides/drupal5  
/etc/apache2/conf.d/drupal.conf  

アクセス経路解析

  • /etc/apache2/conf.d/drupal.conf で Alias /drupal5 /usr/share/drupal5
  • /usr/share/drupal5/includes/bootstrap.inc の conf_path() で /etc/drupal/5/sites/XXX/settings.php の XXX が決定される.基本的には URL のホスト部分とパスからディレクトリ名の候補を作り,settings.php が見つかるまで探す.
  • settings.php で $db_url が設定される.これは同じディレクトリにある dbconfig.php で設定された $dbname などから決定される.
    • $db_url が設定されている箇所の近くの $db_prefix というのを設定すれば一つのデータベースで複数のインスタンスをサポートできそうだ.

手順

# cd /etc/drupal/5/sites
# vi default/settings.php
  $db_prefix = $dbprefix;
# vi default/dbconfig.php
  $dbprefix = '';
# mkdir /srv/drupal5
# chown www-data.www-data /srv/drupal5
# chmod g+s /srv/drupal5
# sudo -u www-data mkdir -p /srv/drupal5/sites/all/modules /srv/drupal5/sites/all/themes
# ln -s /srv/drupal5/sites/all .
# cp -a default www.example.com.drupal.one
# vi www.example.com.drupal.one/dbconfig.php
  $dbprefix = 'one_';
# sudo -u www-data mkdir /srv/drupal5/dirs
# sudo -u www-data ln -s /usr/share/drupal5 /srv/drupal5/dirs/one
# sudo -u www-data mkdir -p /srv/drupal5/files/one
# chmod 750 /srv/drupal5/files/one
# sudo -u www-data ln -s /srv/drupal5/files/one /var/lib/drupal5/files
# sudo -u www-data mkdir -p /srv/drupal5/sites/one/modules /srv/drupal5/sites/one/themes
# ln -s /srv/drupal5/sites/one/* www.example.com.drupal.one
# cd ..
# vi htaccess
  # RewriteEngine on
  # RewriteCond %{REQUEST_FILENAME} !-f
  # RewriteCond %{REQUEST_FILENAME} !-d
  # RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
  php_value mbstring.language               "neutral"
  php_value mbstring.func_overload          "0"
  php_value mbstring.internal_encoding      "UTF-8"
# vi apache.conf
  Alias /drupal/one /srv/drupal5/dirs/one
  <Directory /srv/drupal5/dirs/one>
  <IfModule mod_rewrite.c>
      RewriteEngine on
      RewriteBase /drupal/one
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
  </IfModule>
# vi /usr/share/drupal5/scripts/cron.sh
  grep '^Alias' /etc/drupal/5/apache.conf | while read a; do
      b=($a)
      curl --silent --compressed "http://${HOSTNAME}${b[1]}/cron.php"
  done
# /etc/init.d/apache2 reload
(access to http://www.example.com/drupal/one/install.php)

追加手順

# cd /etc/drupal/5/sites
# cp -a default www.example.com.drupal.two
# vi www.example.com.drupal.two/dbconfig.php
  $dbprefix = 'two_';
# sudo -u www-data ln -s /usr/share/drupal5 /srv/drupal5/dirs/two
# sudo -u www-data mkdir /srv/drupal5/files/two
# chmod 750 /srv/drupal5/files/two
# sudo -u www-data ln -s /srv/drupal5/files/two /var/lib/drupal5/files
# sudo -u www-data mkdir -p /srv/drupal5/sites/two/modules /srv/drupal5/sites/two/themes
# ln -s /srv/drupal5/sites/two/* www.example.com.drupal.one
# cd ..
# vi apache.conf
  Alias /drupal/two /srv/drupal5/dirs/two
  <Directory /srv/drupal5/dirs/two>
      Options +FollowSymLinks
      AllowOverride All
      order allow,deny
      allow from all
  <IfModule mod_rewrite.c>
      RewriteEngine on
      RewriteBase /drupal/two
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
  </IfModule>
  </Directory>
# /etc/init.d/apache2 reload
(access to http://www.example.com/drupal/two/install.php)

最初に設定すべきもの

  • Administer → Site configuration → File system → File system path
  • Administer → Site configuration → Date and time
  • Administer → Site configuration → Clean URLs

2007-10-08

crontab 中の %

crontab (5) 中のコマンド部分の % 記号は特殊な意味を持つ.最初の % までのコマンドが実行され,2 個目以降の % は改行に変換されてから実行されたコマンドの標準入力に渡される.

例:

0 7 * * *    mail -s "Good Morning" mary%Mary,%%Good morning and I love you.%

コマンド中に % を含めるには \ でエスケープする必要がある.

0 0 * * *    command > log-`date +\%Y\%m\%d`.txt

Drupal を Debian で始める

インストール

# apt-get install drupal5
(Configure database for drupal5 with dbconfig-common? -> YES)
(Database type to be used by drupal5: -> mysql)
(Password of your database's administrative user: -> mysql の root のパスワード)
(MySQL application password for drupal5: -> 適当に作る)
(Web server(s) that should be configured automatically: -> apache2)

準備

  • データベースの初期化
    • http://www.example.com/drupal5/install.php にアクセス.
  • 初期(管理)ユーザの作成
    • Username: admin, Mail: you@your.site.tld
    • Timezone を +0900 に設定.
  • アクセス権の設定
    • Administer -> Access control で,authenticated user に対して node module 系の許可を与える.
  • ユーザの作成
    • Username: kimura, Mail: metalglue@gmail.com
    • Timezone を +0900 に設定.

Clean URL

  • mod_rewrite を有効にする
  • # a2enmod rewrite
    # /etc/init.d/apache2 restart
    
  • そのままでは設定がうまくいかないので修正
  • # vi /etc/drupal/5/htaccess
      RewriteBase /drupal5
    
  • Administer -> Clean URLs に行き,「Run the clean URL test」をクリックする.
  • Clean URLs: enable を選択し,「Save configuration」をクリックする.

日本語対応

  • php の mbstring に対応する.
  • # vi /etc/drupal/5/htaccess
      php_value mbstring.language               "neutral"
      php_value mbstring.func_overload          "0"
      php_value mbstring.internal_encoding      "UTF-8"
    
    • この設定が有効であることをどのようにして試せばよいのか?

GeShi filter

  • 色つき構文強調を行うモジュール.
  • <code> または <blockcode> で囲むと強調してくれる.
  • Pre-requisites とインストール.
  • # mkdir -p /usr/share/drupal5/sites/all/modules
    # cd !$
    # tar xf geshifilter.tar.gz
    # cd geshifilter
    # tar xf geshi.tar.gz
    
  • Administer -> Input formats -> Filtered HTML -> GeSHi filter をオン.
  • Administer -> Input formats -> Filtered HTML input format -> Allowd HTML Tags に <blockcode> を加える.
  • Administer -> Input formats -> Filtered HTML input format -> Rearrange

2007-09-27

Vim tips

  • :Exploreでカレントバッファのファイル相対の file explorer が開く.
    • :Sexplore で split する.
  • :Explore は netrw のヘルプで説明されている(:help netrw-contenst
  • netrw でリモートファイルが編集できる.
  • $ vi rsync://example.com/.bashrc
    

2007-09-25

vim-addons コマンド

Debian では vim-addons コマンドで vim-scripts パッケージで用意されたプラグインを ~/.vim ディレクトリ以下にコピーしたり,~/.vim ディレクトリ以下から削除したりできる.

$ vim-addons status
$ vim-addons install bufexplorer
$ vim-addons remove bufexplorer

Vim の Project プラグイン

  • :Project で呼び出す.
  • .vimprojects がデフォルトでは使用される.
  • .vimprojects:

    Test=~/test CD=. in=enter.vim out=leave.vim filter="*" flags=  {
        main.hs
        sub.hs
    }
    
  • キー
  • \r | ディレクトリのファイルをプロジェクトファイルに挿入
    \C | エントリ作成ウィザード

2007-09-23

Haskell で状態更新ループ

parsec で式のリストを作り,それを先頭から順に読んで状態を更新していくループを実装してみる.

仕様: 空白を含む数字の列を1桁の数列とみなし,それを順に足しあげていく.加算の結果を状態とする.

まず1桁の数字を読んで文字として返すパーザ:

digit_ws = do d <- digit
              skipMany space
              return d

数値の列を返すパーザ:

digits = do cs <- many1 digit_ws
            return $ map (read . (: [])) cs

read . (: []) は数字文字1個を数値に変換する関数(ちょっと不自然...).

このパーザでパーズする関数:

p cs = case parse digits "" cs of
       Left err  -> []
       Right val -> val

まず単純に使ってみる.

main = do cs <- getContents
          print $ p cs

これを実行すると

$ echo "12345" | runghc digits.hs
[1,2,3,4,5]

となる.

足しあげてみよう.

seqsum ior []  =    return ()
seqsum ior lst = do modifyIORef ior (+ (head lst))
                    readIORef ior >>= print
                    seqsum ior (tail lst)

main は次のようになる.

main = do cs <- getContents
          ior <- newIORef 0
          seqsum ior (p cs)
          readIORef ior >>= print

$ echo "12345" | runghc digits.hs
1
3
6
10
15
15

2007-09-22

Haskell の Data.IORef

IO モナド中で更新できる値を扱う。

main = do ior <- newIORef 0
          writeIORef ior 5
          v <- readIORef ior
          print v               -- => 5
          modifyIORef ior (+ 1)
          v <- readIORef ior
          print v               -- => 6

2007-09-03

Trac のソース表示での TAB

  • Trac のソース表示での TAB はデフォルトでは 8 spaces になっている.
  • これを変更するには conf/trac.ini の [mimeviewer] セクションの tab_width を変更すればよい.

2007-08-31

Vim のシンタックスカラー調整

  • まず TERMxterm-256color にする.
  • putty の Cursor Color を 128 128 128 (or 255 135 0) にする.
  • Vim で :colorscheme desert256 とする(desert256.vim は vim.org からとってくる).

見やすい色設定

  • ctermfg=117 [desert256 の Comment; うすい水色]
  • ctermfg=217 [desert256 の Constant; あかるいピンク]
  • ctermfg=224 [murphy の Comment; ピンク]
  • ctermfg=39 [inkpot の Statement; 青]
  • ctermfg=215 [inkpot の Constant; 明るいオレンジ]
  • ctermfg=203 [inkpot の Number; 濃いオレンジ]
  • ctermfg=35 [inkpot の PreProc; 目立たない緑]
  • ctermfg=207 [inkpot の Type; どぎついマゼンタ]

terminal における 256 色

2007-08-27

sshfs

FUSEを利用したssh経由でのリモートディレクトリのマウント.

% sshfs host.example.com: dir
% fusermount -u dir

2007-08-24

Perl の YAML.pm と Unicode

  • YAML::DumpFile で utf8 フラグが立った文字列をダンプすると 'Wide character ...' と警告が出る(どうやって防ぐ?)
  • use utf8;
    use YAML;
    $a = '漢字';
    YAML::DumpFile('a.yaml', $a);
    
  • 上のコードで a.yaml は utf-8 で出力される.次に読み込んでみる.
  • use utf8;
    use YAML;
    $a = YAML::LoadFile('a.yaml');
    print $a;
    
  • 一見うまくいっているように見える.しかし次のようにすると失敗する.
  • use utf8;
    use YAML;
    binmode STDOUT, ':utf8';
    $a = YAML::LoadFile('a.yaml');
    print $a;
    
  • これは,$a がバイト列(中身はたしかに「漢字」の utf-8 表現)として扱われているから(utf8::is_utf8($a) が false).この場合には以下のようにしなければならない.
  • use utf8;
    use YAML;
    binmode STDOUT, ':utf8';
    $a = YAML::LoadFile('a.yaml');
    utf8::decode($a);
    print $a;
    
  • これでは巨大なデータを読んだとき面倒なので,以下のようなハックがある.
  • use utf8;
    use YAML;
    binmode STDOUT, ':utf8';
    $a = YAML::LoadFile('a.yaml');
    $yaml = YAML::Dump($a);
    utf8::decode($yaml);
    $a = YAML::Load($yaml);
    print $a;
    
  • 参考

2007-08-02

Python でのスクリプトファイルのインクルード

f = open('../../../pylib/common.py')
if (f):
    exec(f)
    f.close()

う~む...

あった.

execfile('../../../pylib/common.py')

2007-07-31

SCons Tips

builder method で,ソースファイルの共通のディレクトリを指定できる.

env.Program('hello', ['foo.c', 'bar.c'], srcdir = 'src')

このことはドキュメントには書かれていない.man scons を参照せよ.

SCons での裸の builder method

SConstruct で Environment オブジェクトのメソッドでない builder method を記述できる.

Program('hello', ['hello.c'])

このとき scons を起動するマシンに最適化されたデフォルトの Environment オブジェクトに対して builder method が呼び出される.

このことはドキュメントには書かれていない.man scons を参照せよ.

2007-07-26

SCons における Options

  • scons コマンドのコマンドラインで指定する VAR=val 形式のビルドオプションは ARGUMENTS という辞書に入れられるので利用できる.
  • if (int(ARGUMENTS.get('debug', 0))):
        env.Append(CCFLAGS = '-g')
    
  • これでは面倒なので Options というクラスが用意してある.Options に指定した変数は,Environtment を作成するときに指定することで Construction Variable としてインクルードされる.
  • opts = Options(CC = 'special-gcc')
    env = Environtment(options = opts)
    
  • Options に指定された変数をコマンドラインでオーバーライドできる.また,Opitons の変数=値ペアをファイルから読み込むこともできる.
  • ビルドオプションの指定形式として,BoolOption, EnumOption, ListOption, PathOption, PackageOption が用意されている.

SCons と環境変数

  • SCons がツールを呼び出すときの環境は scons コマンドを呼び出したときの環境とは関係が無く,$ENV という Construction Variable に格納されている辞書から構成される新しい環境である.
  • 特に,PATH 環境変数もユーザが .bashrc などで設定したものでなく,デフォルトの /usr/local/bin:/bin:/usr/bin (Unixの場合) が使われる.

SCons における Construction Variable

  • Construction Variable はビルドツールの呼び出し方法を制御する.
  • Construction Variable の集合が Environment である.
  • Environment とは Construction Variable=Value pair の集合 + Builder Methods
  • 作成:
  • env = Environtment(VAR1 = 'val1', VAR2 = 'val2')
    
  • 値の取り出し
  • print env['VAR1']
    
  • 値の取り出し(再帰的に変数展開)
  • print env.subst('$VAR1')
    
  • 値の数え上げ
  • dict = env.Dictionary()
    keys = dict.keys()
    keys.sort()
    for key in keys:
    	print "[%s] => [%s]" % (key, dict[key])
    
  • 値の代入
  • env.Replace(VAR1 = 'val1a')
    
  • 値の追加
  • env.Append(VAR1 = ' val1b')
    

2007-07-13

SCons でのコンパイルオプション

ops = Option('config.py')
ops.Add('CONFIG_SUPPORT_HTML', '(help string)', 0)
env = Environtment(options = ops, CPPDEFINES = { 'CONFIG_SUPPORT_HTML' : '${CONFIG_SUPPORT_HTML}' })
env.Program('hello.c')

config.py が無い場合 -D CONFIG_SUPPORT_HTML=0

config.py が,

CONFIG_SUPPORT_HTML = '1'

のとき,-D CONFIG_SUPPORT_HTML=1

$ scons CONFIG_SUPPORT_HTML=2

と呼び出すと,config.py があっても無くても -D CONFIG_SUPPORT_HTML=2

2007-07-02

Perl における例外の基礎

croak と eval を使用.

use Carp;

sub f {
    ...
    if (something is bad) {
        croak "fail";
    }
    ...
    return something_good;
}

...
my $r = eval { f(); };
if ($@) {
    croak "f() fails.";
}
...

参照

2007-07-01

Perl の LWP でのタイムアウト

  •  $ua->request() でタイムアウトすると,'500 read timeout' のエラーを持つ response が返される.
  • $ua->request() で接続できないときには,'500 Can\'t connect to' のエラーを持つ response が返される.

Perl で euc-jp の端末に出力

Perl で euc-jp の端末に出力する.

binmode STDOUT, ':encoding(euc-jp)';

2007-06-23

SCons 疑問

  • 次がうまく動作しない.
  • $ ls
    SConstruct src/
    $ ls src
    SConscript hello.c
    $ cat SConstruct
    SConscript('src/SConscript', build_dir = '../build')
    $ cat src/SConscript
    Program('hello', ['hello.c'])
    $ scons -Q
    scons: `.' is up to date.
    
  • 以下のようにすると動作する.
  • $ scons -Q ../build
    
  • どうやら,デフォルトターゲット . の子ターゲットとしてサブディレクトリは自動的に走査されるが,サブディレクトリでないものは走査されないようだ...[どこに記述があるんだろう?]
  • これは以下のようにして発見した.
  • $ scons -Q --taskmastertrace=-
    Taskmaster: '.': children:
        ['SConstruct', 'src']
        waiting on unstarted children:
        ['src']
    Taskmaster: 'src': children:
        ['src/SConscript']
        evaluating src
    Taskmaster: '.': children:
        ['SConstruct', 'src']
        evaluating .
    scons: `.' is up to date.
    Taskmaster: '.': already handled (up_to_date)
    
  • SconsProcessOverview - SCons Wiki に以下の記述がある.
  • command line arguments are "expanded" into a list of Nodes that we want built
          # if the argument is a directory, then everything within that directory is built
    
  • あるいは,UserGuide- SCons Wiki にあるように,src/SConscript で,
  • Default(Program('hello', ['hello.c'])
    

    とするほうがよい.