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 はあったほうがいいか...).