GMapモジュールで埋め込まれる外部JavaScriptソースへのリンク

DrupalでGoogle Mapを表示する、GMap Moduleを使ってみました(ここではないです)。
とりあえず動いたのですが、ログをみると

ページが見つかりません - /http://dist.codehaus.org/geoserver/gmaps-geoserver_scripts/wms-gs-1_0_1.js

が大量に出ています。

gmapモジュールがdrupal_add_js()を使ってJavaScriptソースへのリンクを埋め込むのですが、drupal_add_js()は外部URLであっても先頭に/を埋め込んでしまうことが原因のようです。
おそらく以下の問題なのでしょうか。

実影響がなんなのか不明なのですが、とりあえず「ページが見つかりません」のメッセージが気になる場合は、wms-gs-1_0_1.jsをダウンロードしてmiscに配置すれば、そちらへのリンクが生成されるようになり回避することができます。

Firefox拡張機能の対応バージョン指定

xpiファイルのinstall.rdfで

<em:minVersion>0.8</em:minVersion>
<em:maxVersion>2.0.*</em:maxVersion>

のように指定されてます。

参考:

Red Hat LinuxをCentOSにアップグレード

Red Hat Linux 7.3と9を使ったサイトをCentOSにアップグレードしました。Fedora Legacy Projectでのサポートが終了したためです。

7.3、9ともにCentOS-2をアップグレードインストールすることができます(CDでブートしたあと、boot:プロンプトでlinux upgradeを入力)。
ちなみにCentOS-2は2009/05/31までメンテナンス・アップデートが提供されます。

ただ、今回はわけあって9からCentOS 3.8にしてます。こちらはインストーラから直接アップグレードインストールできませんので、ちょっと強引なやりかたをしてます。

CentOS 3.8のCDをマウントし以下を実行。くれぐれも真似してはいけません。

# cd /mnt/cdrom/RedHat/RPMS
# rpm -Fvh --force --nodeps *.rpm

-Fでパッケージが導入されていればアップデートします。
--forceでダウングレードも許容します。
--nodepsで依存関係も無視します。

私の場合は運よくいきましたが、途中rpm-libsが入らずにrpmコマンドが使えなくなったり、bind-libsも入らずにbindが使えなくなったりと、かなりひやひやもんでした。rpm-libsがないとrpmコマンドが使えず、bind-libsを個別に入れることもできませんし。かろうじてcygwin機でrpm2cpio(これもrpm-libs依存)して*.soを取り出し、事なきを得ましたが。

仕事だったらこんなやり方はしません。クビになります Sticking out tongue

SnortとBASEをインストール

Debian/mipselのCobalt Qubeにsnortをセットアップしました。

ログはBASEで見たいので、MySQLに格納するようにsnort-mysqlパッケージをインストールします。BASEはsargeにはありませんので、sarge-backportsリポジトリを利用します(BASEの前身であるacidlabsはsargeにもあります)。

# apt-get install snort-mysql
# apt-get install acidbase
# apt-get install oinkmaster

ルール更新に便利なoinkmasterも入れましたが、細かい設定はこれからです。

rotatelogsで分割したアクセスログをwebalizerで処理

CentOS 3にはwebalizerが標準で含まれていて、インストールすると毎日自動でログ解析がおこなわれるようになってます(http://localhost/usage/でアクセス可能)。
しかしアクセスログをrotatelogsを使った日付つきファイル名に出力するようにしてしまうと、これが実行されなくなってしまいます。

単にwebalizerのcron処理が/var/log/httpd/access_logをファイル名固定で処理対象としているだけなので(/etc/webalizer.confで設定)、毎回前日分のaccess_logを入力するようにすれば解決できます。

CustomLog出力は、access_log.%Y-%m-%d形式で出力するよう、/etc/httpd/conf/httpd.confを変更したとします。

CustomLog "/usr/sbin/rotatelogs /var/log/httpd/access_log.%Y-%m-%d 86400" combined

/etc/cron.daily/00webalizerはログファイル名を引数で与えるように変更します。dateコマンドの--date yesterdayオプションを使って、昨日の日付を計算させています。

# cp -p /etc/cron.daily/00webalizer /etc/cron.daily/00webalizer.rpmorig
# vi /etc/cron.daily/00webalizer
# cat /etc/cron.daily/00webalizer
#!/bin/bash
# update access statistics for the web site

accesslog=/var/log/httpd/access_log.`date --date yesterday '+%Y-%m-%d'`

if [ -s ${accesslog} ] ; then
    /usr/bin/webalizer ${accesslog}
fi

exit 0

/etc/cron.*/配下のファイルは特定サフィックスだと実行対象から除外されますので(/usr/sbin/run-partsスクリプト参照)、.rpmorigというサフィックスでバックアップしてます。

■2006-12-20追記
これだけではwebalizer処理が実行される4:00から9:00頃までのログが抜け落ちることがわかりました。
前述のrotatelogs指定ではUTC(つまり日本時刻の9:00)にログが切り替わってしまうためです。
回避するためには日本時刻の0:00に切り替わるようにUTCオフセットを指定するなどの対応が必要になります。

CustomLog "/usr/sbin/rotatelogs /var/log/httpd/access_log.%Y-%m-%d 86400 540" combined

ログファイルをマスク指定で全件入力させちゃう方法もありますが…

cat /var/log/httpd/access_log.????-??-?? | /usr/bin/webalizer

ログファイル数次第では、とてつもない処理量になる可能性がありますので注意しましょう。

FirefoxのHost CookieとDomain Cookie

ブラウザからのCookie送出を眺めていて、Domain未設定のCookieの取り扱いがブラウザによってちょっと異なることに気がつきました。
Domain未設定の場合、デフォルトではCookieを生成したサーバのドメイン名とすることになっています。
参考:[Studying HTTP] Cookies
それ以降は、Domain(とpath)が一致するURLの場合は、そのCookieを送出することになるのですが、Firefoxは厳密に一致しないとCookieを送出しません。
例えば、

Set-Cookie: mycookie=xxxxxxxx; expires=Sat, 07-Oct-2006 23:53:14 GMT; path=/

といったDomain未設定のCookieを受信するとHost Cookieとして扱い、完全一致しないと送出しない、という動きになるようです。
どちらの扱いとなっているかはTools->Options->PrivacyのCookiesタブから確認できます。

コンテンツ移行のお知らせ

WordPressからDrupalへコンテンツを移行しました。
サーチエンジンや他所のリンクからいらした方など、ご面倒ですが右上のSearchフォームで再度検索をお試しください。
質問等ございましたらfeedbackフォームもしくは、コメントにてご連絡ください。
ご迷惑おかけしますが、よろしくお願いします。

Debian Backportsの利用

かねてよりXREAへのFTP転送はlftpを使っておこなっていたのですが、Debian sargeのlftpパッケージはデータ転送路のSSLをサポートしていません。

$ lftp example.net
ftp:ssl-force: no such variable. Use `set -a' to look at all variables.
ftp:ssl-protect-data: no such variable. Use `set -a' to look at all variables.
cd ok, cwd=/

testingから拝借しようと思ったらlibc6やgccもtestingにアップする必要があり、lftp目的だけではちょっと利用を躊躇してしまいます。

そこでDebian Backportsを利用してみることにします(最近雑誌で知りました)。
Debian Backportsはtesting等のリポジトリのパッケージをstableでも利用可能なようにBackportしたものになります。
こちらの説明にしたがって/etc/apt/sources.listと/etc/apt/preferencesを設定します。Pin-Priorityは以下のように設定。

$ cat /etc/apt/preferences
Package: *
Pin: release a=stable
Pin-Priority: 700

Package: *
Pin: release a=sarge-backports
Pin-Priority: 650

Package: *
Pin: release a=testing
Pin-Priority: 600

この状態でapt-get update後, apt-get installを実行してみます。

# apt-get -t sarge-backports install lftp
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
  libreadline5
The following NEW packages will be installed:
  lftp libreadline5
0 upgraded, 2 newly installed, 0 to remove and 57 not upgraded.
Need to get 750kB of archives.
After unpacking 2449kB of additional disk space will be used.
Do you want to continue? [Y/n]
Get:1 http://backports.mithril-linux.org sarge-backports/main lftp 3.5.0-0bpo1 [594kB]
Get:2 http://ring.asahi-net.or.jp stable/main libreadline5 5.0-10 [157kB]
Fetched 750kB in 0s (1068kB/s)
Selecting previously deselected package libreadline5.
(Reading database ... 29483 files and directories currently installed.)
Unpacking libreadline5 (from .../libreadline5_5.0-10_mipsel.deb) ...
Selecting previously deselected package lftp.
Unpacking lftp (from .../lftp_3.5.0-0bpo1_mipsel.deb) ...
Setting up libreadline5 (5.0-10) ...

Setting up lftp (3.5.0-0bpo1) ...
Installing new version of config file /etc/lftp.conf ...

#

無事lftpの3.5がインストールされ、データコネクションもssl接続するようになりました Laughing out loud

WordPress->Drupal移行時に記事のシーケンス番号をあわせる方法

Wordpress to Drupal migration utilityを使ってWordPress記事をDrupalに移行する際、シーケンス番号も元記事と同じにする方法を探ってみました。
元記事の番号がきれいに揃っていればこんなことを考えなくてもよいのですが、削除などで途中が歯抜けになっていると、移行後は順番に詰められた状態になってしまうので、アーカイブ番号でリンクを貼りまくっていたりすると不便です。

移行ユーティリティのmigration.phpを眺めてみると、記事の保存はnode_saveというDrupal functionを使っておこなっています。
ものは試しと、この直前に

$node->nid = $post['ID'];
$node->vid = $post['ID'];
node_save($node);

と入れてみたのですが、動きはまったく変わりません。
Drupalのnidやvidは、{sequences}テーブルに保存されているシーケンス番号を元に算出されるようになっています。
node_saveをおこなうと、シーケンス番号+1で記事が作成されるので、WordPressの記事番号-1をnode_save直前に設定するようにしてみました。

$ diff -u modules/wp2drupal/migrate.php.default modules/wp2drupal/migrate.php
--- modules/wp2drupal/migrate.php.default       2006-06-19 12:55:20.000000000 +0900
+++ modules/wp2drupal/migrate.php       2006-09-01 15:43:25.000000000 +0900
@@ -146,7 +146,7 @@
        mysql_free_result($result);

        // posts
-  $query = _wp2d_prepare_wp_query("SELECT * FROM {posts} ORDER BY post_date;");
+  $query = _wp2d_prepare_wp_query("SELECT * FROM {posts} ORDER BY ID;");
   $result = mysql_query($query, $wp_connection);
   while ($post = mysql_fetch_assoc($result)) {
        $wp['posts'][] = $post;
@@ -402,6 +402,10 @@
     global $user;
     $previous_uid = $user->uid;
     $user->uid = $node->uid;
+
+    db_query("UPDATE {sequences} SET id=%d WHERE name='node_nid'",           $post['ID'] - 1);
+    db_query("UPDATE {sequences} SET id=%d WHERE name='node_revisions_vid'", $post['ID'] - 1);
+
     node_save($node);
     $user->uid = $previous_uid;

おぉ。とりあえず記事だけは意図通りの番号になりました Smiling こんなんで大丈夫なのかな?

Drupal熱、再び

以前も使っていたDrupal熱が再燃してきました。
きっかけはDrupalサイトをいろいろ見かけるようになったことと、WordPress 2系列からDrupal 4.7への移行moduleを見つけちゃったためです。

ざっくりとした移行手順は

  1. Drupalをインストール
    pathautoモジュールの利用が推奨されているのでインストールしておきます。
  2. wp2drupalモジュールをアップロードし有効化
    モジュール配置ディレクトリは書き込み可能にしておく必要があります。
    modulesディレクトリを書き込み可にするのははばかれましたので、wp2drupalディレクトリを作ってchmod +wしました。
  3. Administerメニューの「Import from Wordpress」を実行

となります。

それからPHPのiconv()が使える環境でないと実行できないのですが(XREAには入ってません)、WordPressをUTF-8で利用している場合はそもそも不要なので、以下の修正を加えています。

$ diff -u modules/wp2drupal/wp2drupal.module.default modules/wp2drupal/wp2drupal.module
--- modules/wp2drupal/wp2drupal.module.default  2006-06-23 01:51:02.000000000 +0900
+++ modules/wp2drupal/wp2drupal.module  2006-08-30 14:46:02.000000000 +0900
@@ -555,10 +555,12 @@
   }

   // Condition 2: iconv function must be available
+  /*
   if (!function_exists('iconv')) {
     $message .= t('<li>Please enable <strong>iconv</strong> extension on your PHP installation. This extension is mandatory for correct wp2drupal functionality.');
     $result = false;
   }
+  */

   // Condition 3: module directory must be writable
   $test_file = drupal_get_path('module', 'wp2drupal') . '/.writable.test.file';

実際にiconv()を使っているのはmigration.phpですが、WordPressのsite_encodingがUTF-8なときは実行されないコーディングになっているので、上記のように無視しちゃっても問題ありません(UTF-8以外で使っているところではiconv必須です)。

で、とりあえず移行してみたものはhttp://gmt-24.net/でご覧いただけます Smiling

今のところ気になるところは以下の2点。

  • 記事番号(WordPressのpostid、Drupalではnid)が同じにならない
  • 記事の時刻がGMT時刻で表示されてしまう(-9時間)

うーん。2点目はまだ許せるのですが、記事番号が変わらないようにする方法、何かないでしょうか…
WordPressでは/archives/%postid%で永続リンクを設定していたので、ちょっと不便です。