11月20日の木曜日夜、操作ミスによりシステムを壊してしまいました。

/etc以下は戻りませんでしたが、幸い、/homeや/varは復旧できましたので、文字通り「元に戻す」ことができました。

作業中、以前作成したドキュメントをメンテナンスしましたので、暇をみて公開していこうと思います。

もっとも、未だにアクセスの大半を占める「Inspiron1525(iwl4965)+Debianで無線LAN」のような内容ではなく、まさに私的な備忘録な内容になります。(iwl4965ネタも結局は備忘録なんですけどね)

下記の投稿について、一部内容を修正しました。

『Intel Wireless WiFi Link 4965AGN』

  • カーネルの設定ファイル複製後、「make oldconfig」の記述が抜けていたので追記。
  • 作業ディレクトリが一部不適切だったので修正。
  • ファームウェアのコピー方法を修正。

『Marvell Yukon 88E8040 PCI-E Fast Ethernet Controller』

  • カーネルの設定ファイル複製後、「make oldconfig」の記述が抜けていたので追記。
  • 作業ディレクトリが一部不適切だったので修正。

本ブログを参考にされた方で、上記ミスの影響を受けた方、ごめんなさい。

2008年03月09日(日) 23:13 [Debian

Inspiron1525にDebian etchをインストールしたときのメモ。

「/etc/modprobe.conf」を削除したところ、システムクロックが9時間進んで表示されてしまう問題が発生した。手動で時間を合わせても再起動すると元に戻ってしまう。頭を悩ませていると、ブート時に下記のエラーが表示されていることに気づく。

select() to /dev/rtc to wait for clock tick timed out

調べてみると、「/dev/rtc」からhwclockコマンドでハードウェアクロックを取得しているらしい。試してみる。

$ sudo hwclock --show
select() to /dev/rtc to wait for clock tick timed out

『Manpage of HWCLOCK』を参考に、「--directisa」オプションを追加してみたところ、正常に取得することができた。

$ sudo hwclock --show --directisa
2008年03月09日 22時49分04秒 -0.015540 seconds

起動時に「/etc/init.d/hwclock.sh」でhwclockを使用しているので、「--directisa」オプションを使用するように修正した。

HWCLOCKPARS=

HWCLOCKPARS=--directisa

一度時間を合わせて再起動したところ、無事正しい時間が表示されるようになった。

時間と言えばNTPの設定をしていなかったので、後でやっておこう。

2008年03月07日(金) 20:12 [Debian

Inspiron1525にDebian etchをインストールしたときのメモ。

せっかくのノートパソコンなのでやはり無線で接続したい。カーネル2.6.18で4965AGNを使用するにはいろいろと手間が必要だが、がんばってみた。
ちなみに、2.6.22ではmac80211が統合されているらしいので、ドライバを入れるだけで動くそうだ。さらに、2.6.24ではiwl4965がカーネルに統合されているため、特別手間がかからないらしい。この辺、stable版を使っていると苦労するところなのだろう。

カーネルのソースコードを用意する

現在利用しているカーネルのバージョンを調べ、適したバージョンのソースコードをインストールする。

# uname -r
2.6.18-6-686
# aptitude install linux-source-2.6.18

「/usr/src」以下にソースコードのアーカイブがインストールされるので解凍し、「/usr/src/linux」にシンボリックリンクを作成する。

# cd /usr/src
# tar vxfj linux-source-2.6.18.tar.bz2
# ln -s /usr/src/linux-source-2.6.18 /usr/src/linux

現在のカーネルと同じ設定でコンパイルされるように、「/boot」ディレクトリにある設定ファイルをコピーし、「make oldconfig」で過去の設定を引き継がせる。

# cp /boot/config-2.6.18-6-686 /usr/src/linux/.config
# cd /usr/src/linux
# make oldconfig

ドライバ、ファームウェア、mac80211サブシステムをダウンロード

インストールに必要となるドライバ、ファームウェア、mac80211サブシステムは下記サイトからダウンロードできる。

Intel Wireless WiFi Link drivers for Linux

私の場合は下記のバージョンをダウンロードすることにした。

mac80211 mac80211-10.0.4
ドライバ iwlwifi-1.1.0.tgz
ファームウェア iwlwifi-4965-ucode-4.44.1.20.tgz

mac80211サブシステムとファームウェアは作業時点での最新版、ドライバはやや古いバージョンとなっている。これは、カーネルが2.6.18では最新版のドライバをコンパイルできなかったためだ。(私の勘違いではない....と思う)

mac80211サブシステムを適用させるためにはカーネルの再構築が必要になるのだが、再構築後は有線LANのドライバを再インストールする必要がある。よって、必要なファイルはあらかじめダウンロードしておくことにする。

# wget http://intellinuxwireless.org/mac80211/downloads/mac80211-10.0.4.tgz
# wget http://intellinuxwireless.org/iwlwifi/downloads/iwlwifi-1.1.0.tgz
# wget http://intellinuxwireless.org/iwlwifi/downloads/iwlwifi-4965-ucode-4.44.1.20.tgz

カーネルソースにmac80211を適用する

無線サブシステムの「mac80211」をカーネルソースにパッチする。

まず、rsyncをインストールしておく。

# aptitude install rsync

「/lib/modules/(カーネルのバージョン)/source」というカーネルソースのシンボリックリンクを作成する。

# ln -s /usr/src/linux-source-2.6.18 /lib/modules/2.6.18-6-686/source

これを作成しておかないと、パッチ適用時に下記のエラーが表示されてしまう。

Kernel Makefile not found at '/lib/modules/2.6.18-6-686/source/'
If patch or script failed, check pre/ and post/ for current stage.
make: *** [compatible/modified] エラー 1

続いて、カーネルの設定ファイル「.config」を下記のように変更する

# vim /usr/src/linux/.config
CONFIG_NET_WIRELESS_RTNETLINK=y

CONFIG_NET_WIRELESS_RTNETLINK=n

上記の設定を無効にしておかないと、パッチ適用時に下記のエラーが表示されてしまう。

Checking kernel compatibility in:
        /lib/modules/2.6.18-6-686/source//
! CONFIG_NET_WIRELESS_NETLINK can not be set in .config!
make: *** [compatible/modified] エラー 1

準備は整ったので、ダウンロードしておいたmac80211サブシステムのアーカイブを展開し作成されたディレクトリに移動する。「make; make patch_kernel」とすることで、カーネルソースにmac80211サブシステムを組み込むことが出来る。

# tar zxvf mac80211-10.0.4.tgz
# cd mac80211-10.0.4
# make; make patch_kernel

カーネルの再構築を行う

mac80211サブシステムを適用し終えたら、カーネルの再構築を行う。

カーネル再構築用のパッケージをインストールする。

# aptitude install kernel-package

カーネルソースのディレクトリに移動し、カーネルの再構築を行う。以前にカーネルの再構築を行っていた場合、「make-kpkg clean」でクリアを行っておく。

# cd /usr/src/linux
# make-kpkg clean
# make-kpkg --append_to_version -6-686-mac80211 --initrd --revision=relm1.0 linux-image

2行目の引数は下記の意味になる。

--append_to_version
カーネルのバージョンに追記される。インストール時、既存のカーネルと区別したい場合に指定する。
--revision
カーネルバージョンのリビジョンを指定する。お好みで問題ない。
--initrd
RAMディスクを作成する。--append_to_versionを変更した場合などに指定しないとRAMディスクが作成されず、ブート時にカーネルパニックになる。
linux-image
debパッケージの先頭に付ける名前。

また、再構築の開始時にいくつか質問されたので、下記のように答えた。

無線LANを有効にする
Improved wireless configuration API (CFG80211) [N/m/y] (NEW) y
一般的なIEEE802.11のネットワーク・スタックを有効にする
Generic IEEE 802.11 Networking Stack (mac80211) (MAC80211) [N/m/y/?] (NEW) y
パケット送受信時にLEDの点灯を有効にする
Enable LED triggers (MAC80211_LEDS) [N/y/?] (NEW) y
IEEE802.11のネットワーク情報をデバッグ用に出力する
Export mac80211 internals in DebugFS (MAC80211_DEBUGFS) [N/y/?] (NEW) n
デバッグ情報をフル出力する
Enable debugging output (MAC80211_DEBUG) [N/y/?] (NEW) n

その他の質問が表示された場合などは下記のサイトが参考になる。私も参考にさせてもらった。

ITPro:『Linuxカーネルの設定パラメータ−ネットワークの設定』
ITPro:『Linuxカーネルの設定パラメータ』

再構築が完了すると、「/usr/src」ディレクトリに「linux-image-2.6.18-6-686-mac80211_relm1.0_i386.deb」という名前のdebパッケージが作成されるので、「dpkg」コマンドでインストールを行う。

dpkg -i linux-image-2.6.18-6-686-mac80211_relm1.0_i386.deb

インストールが完了したら、一度マシンを再起動して無事起動できることを確認しておく。GRUBなどブートローダの設定も行ってくれるので、ブートローダの画面で今回インストールしたカーネルを選択すればOKだ。

ちなみに、再構築には非常に長い時間がかかる。私はCore2Duoのマシンで40分近くかかった。お風呂でも入ってくるとちょうど良い。

ファームウェアのインストール

あらかじめダウンロードしておいたファームウェアのアーカイブを展開し、「/usr/lib/hotplug/firmware」ディレクトリにコピーする。

# tar zxvf iwlwifi-4965-ucode-4.44.1.20.tgz
# cd iwlwifi-4965-ucode-4.44.1.20
# cp iwlwifi-4965-1.ucode /usr/lib/hotplug/firmware/
2008年03年16日追記
初回のインストール時は下記のように作業をした。
# cp iwlwifi-4965-1.ucode /usr/lib/hotplug/firmware/iwlwifi-4965.ucode
しかし、再インストール時になぜかファームウェアがロードされなくなってしまったので、上記のようにファイル名を変更しないように修正した。(もしかして、使用するドライバのバージョンなどを勘違いしていたのか??)

ドライバのインストール

あらかじめダウンロードしておいたドライバのアーカイブを展開し、コンパイルする。

# tar zxvf iwlwifi-1.1.0.tgz
# cd iwlwifi-1.1.0
# make
# make install

ドライバを読み込ませてみる。再起動してみても良い。

# ./load

NICが正常に認識されているか確認してみる。

# iwconfig
wmaster0 no wireless extensions.

Warning: Driver for device wlan0 has been compiled with version 22 of Wireless Extension, while this program supports up to version 20.
Some things may be broken...

wlan0    IEEE 802.11g ESSID:"" Nickname:""
         Mode:Managed Frequency:2.412 GHz Access Point: Not-Associated
         Tx-Power=27 dBm
         Retry min limit:7 RTS thr:off Fragment thr=2346 B
         Encryption key:off
         Power Management:off
         Link Quality:0 Signal level:0 Noise level:0
         Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
         Tx excessive retries:0 Invalid misc:0 Missed beacon:0

これで、ハードウェアの設定は完了だ。

NICの設定

続いて、「/etc/network/interfaces」にNICの設定を記述する。
詳しい原因は分からないのだが、eth1より先にブートさせないとうまく動いてくれなかったので、loとeth1の間に記述した。

allow-hotplug wlan0
iface wlan0 inet static
address 192.168.30.9
netmask 255.255.255.0
gateway 192.168.30.250
wireless_mode Managed
wireless_essid *****************
wireless_channel 7
wireless_key s:*************
auto wlan0

設定の意味は下記の通り

wireless_mode 無線APへ接続するなら「Managed」。PC間で接続するなら「Ad-Hoc」。
wireless_essid 接続先のESSIDを指定する。省略すると「any」扱い??
wireless_channel 利用チャンネルを指定する。省略すると自動で設定される(はず)。
ちなみに、802.11gは7チャンネル辺りが電波干渉しづらいらしい。
wireless_key WEPキーを指定する。文字列で指定する場合は「s:*****」とし、16進数での指定ではそのまま記述する。

WEPではなく、WPAを使う場合などは別の手順が必要となる。私はニンテンドーDSの関係でWEPにせざるを得ないので上記設定となった。

ITPro:『【 iwconfig 】 無線LANインタフェースの参照・設定』

eth1は使用しなくなるので、起動しないように設定しておく。

auto eth1

#auto eth1

eth1を停止しない場合、複数NICでの運用になるため、デフォルトゲートウェイの設定(gateway ***)はいずれかのNICのみにしておいた方がいい。何らかの理由で両方のNICにデフォルトゲートウェイを設定する場合、デフォルトゲートウェイを複数指定することはトラブルを招くこともあると念頭に置いておくほうがいいだろう。

ネットワークの設定を反映させる。ただし、前述した通りeth1が動作しているとうまく動いてくれなかったのであらかじめ停止しておく。

# ifconfig eth1 down
# /etc/init.d/networking restart

無線が正常に接続された場合、iwconfigコマンドの結果が下記のようになる。下記の例では802.11gで接続されている。

# iwconfig

wlan0    IEEE 802.11g ESSID:"***********************" Nickname:""
         Mode:Managed Frequency:2.442 GHz Access Point: 00:00:00:00:00:00
         Bit Rate=54 Mb/s Tx-Power=27 dBm
         Retry min limit:7 RTS thr:off Fragment thr=2346 B
         Encryption key:0000-0000-0000-0000-0000-0000-00
         Power Management:off
         Link Quality=100/100 Signal level=-35 dBm Noise level=-94 dBm
         Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
         Tx excessive retries:0 Invalid misc:0 Missed beacon:0

「/etc/resolv.conf」の設定を行っていない場合は設定を忘れずに。

まとめ

あれこれ手間がかかったものの、これで問題無く無線でLANに接続できるようになった。
802.11nの機材が無いため、802.11gでの利用となるが、先立つものが手元にやってきたらぜひ試してみたい。

補足

正常に接続できるようになっても、筐体前面のLEDは点灯しない。また、GNOME側のネットワークツールでも動作していないように表示される。
使う分には問題ないので、暇なときにでも調べてみようと思う。

Inspiron1525にDebian etchをインストールした時のメモ。

内蔵NICに「Marvell Yukon 88E8040」というものを使用しているらしいのだが、100Mbpsということに驚き。1000BASEだと思い込んでいた。最終的には無線LANにしてしまうので良いのだけど、なんだか損をした気分だ。これもDELLクオリティということなのか。

ドライバのダウンロード

Marvellのサイトから最新のドライバをダウンロードする。

Marvell:『Linux Driver Install Package for Yukon Devices』

必要なパッケージのインストール

ドライバのインストールを行う際、必要なパッケージがインストールされていない場合にエラーメッセージが表示されるので、その都度インストールすればいい。私の場合、開発環境を用意していなかったので、gccをインストールした。

# aptitude install gcc

他、カーネルのソースコードが必要のようなので、次項でインストールする。

カーネルのソースコードを用意

現在利用しているカーネルのバージョンを調べ、適したバージョンのソースコードをインストールする。

# uname -r
2.6.18-6-686
# aptitude install linux-source-2.6.18

「/usr/src」以下にソースコードのアーカイブがインストールされるので解凍し、「/usr/src/linux」にシンボリックリンクを作成する。

# cd /usr/src
# tar vxfj linux-source-2.6.18.tar.bz2
# ln -s /usr/src/linux-source-2.6.18 /usr/src/linux

カーネルのコンパイル

カーネルのコンパイルを行っておかないとドライバのインストール時に下記のエラーが表示される。

The kernel's modpost utility is not available. As the source code for the utility is available in your current installed linux kernel source tree, you can compile the utility for your own.

To do so, please follow the description below:
(Please read the next lines before you execute them!)
[1] Change to /usr/src/linux
[2] Call make (this begins to create a new linux kernel)
[3] Take a look at the output: After a few seconds the modpost utility will be compiled
[4] Now interrupt the make process by pressing ctrl-c

The modpost utility now is created. You can check this by taking a look at /usr/src/linux/scripts/mod. Here you should find a file modpost now.

If you are finished recall install.sh again. That's it.

一度コンパイルを行い、modpostモジュールを作成しておく必要があるらしい。

現在のカーネルと同じ設定でコンパイルされるように、「/boot」ディレクトリにある設定ファイルをコピーし、「make oldconfig」で過去の設定を引き継がせる。

# cp /boot/config-2.6.18-6-686 /usr/src/linux/.config
# cd /usr/src/linux
# make oldconfig

コンパイルを行う。

# make

画面の出力内容を見てmodpostがコンパイルされた後は「ctrl + c」で中断して良い。ちなみに、modpostはコンパイル開始後すぐにコンパイルされる。

ドライバのインストール

手順の最初でダウンロードしたドライバの圧縮ファイルを解凍して、生成された「DriverInstall」ディレクトリに移動する。

# tar vxfj install_v10.50.1.3.tar.bz2
# cd DriverInstall

インストールスクリプトを実行する。

# ./install.sh

表示されるメッセージには下記のように解答した。

1) installation
2) generate patch
3) exit
Choose your favorite installation method: 1
Do you want proceed? (y/N) y [PRESS ANY KEY FOR FURTHER INSTRUCTIONS] Enter 1) Do nothing
2) Deactivate diver
3) Remove driver
Action: 3

インストールが完了すると下記のメッセージが表示された。

All done. Driver installed and loaded.
To load the module manually, proceed as follows:
     Enter "modprobe sk98lin"

今まではケーブルを差しても無反応だったNICのLEDが点灯した。「ifconfig」コマンドでNICが認識されていることを確認する。

# ifconfig
eth1 Link encap:Ethernet HWaddr 00:00:00:00:00:00
         inet addr:192.168.30.8 Bcast:192.168.30.255 Mask:255.255.255.0
         UP BROADCAST MULTICAST MTU:1500 Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
         Interrupt:169 Memory:00000000-0

ちなみに、ドライバのインストール作業はカーネルを再構築する度に行わないといけないらしい。(本当にそうなのかな。うまいやり方はないのかな。)

NICの設定

「/etc/network/interfaces」ファイルを編集し、NICの設定を記述する。

固定IPアドレスの場合。

iface eth1 inet static
address 192.168.30.8
netmask 255.255.255.0
gateway 192.168.30.250
auto eth1

DHCPを使用する場合。

iface eth1 inet dhcp
auto eth1

記述後、ネットワークの再設定を行う。

# /etc/init.d/networking restart

DNSサーバの設定

「/etc/resolv.conf」ファイルを編集し、DNSサーバの設定を行う。「do not edit!」などと書かれているが気にしない。

# generated by NetworkManager, do not edit!
nameserver 192.168.30.201

まとめ

一通りの作業が完了したら、ネットワークに接続できるか確認する。
無事ネットワークを使用できるようになっていたら、apt-lineを修正し、パッケージを最新版に更新しておく。

2008年02月26日(火) 23:28 [Debian

Inspiron1525にDebianを入れて数日経つがいまだに設定途上。
ひとまず経過報告をしてみる。

サウンド
×。音が出ない。これから設定する予定。
有線LAN(Marvell Yukon 88E8040 PCI-E Fast Ehternet)
OK。インストール時に認識されなかったが、問題無く動作した。
無線LAN(Intel Wireless WiFi Link 4965AGN)
△。苦労した末、無事認識された。設定はしていないので実運用は行っていない。そういう意味で△。
Firefoxのプロファイル移行
OK。Windowsで使っているプロファイルを移行した。一部、設定を書き換えたが、基本的にそのままで動いた。
Thunderbirdのプロファイル移行
まだ行っていない。
メッセンジャー
OK。pidginをインストールして、MSNメッセが使用できるようになった。

その他の点では特に問題無く使用できている。
いろいろ手間取ってはいるが、それはそれで楽しいので引き続き快適なデスクトップ環境が整えられるようにいろいろ試していきたい。現在無線LANの設定途中なので、それが落ち着いたら少しずつ設定中の話も投稿していく予定。

ちなみに、インストール時にLogicoolのマウス「VX nano」を繋いでいたのだが、GUIのインストーラが起動しなかった。

それにしても、こうやってLinuxでデスクトップ環境を整えていると、一般に普及しないのは当然だなぁ、と思う。

2008年02月22日(金) 23:27 [Debian

Inspiron1525にDebianを入れてみた。

Debianデスクトップ

久しぶりにLinuxのデスクトップ画面を見たけれど、かなり綺麗になっている。
少なくとも、見栄えだけなら十分メイン環境として使っていけそうだ。

今回、ネットワークインストールCDでは内蔵NICを認識してくれなかったため、DVDイメージからインストールを行った。その後、NICドライバのインストールなどに結構手間取ってしまった。その過程やインストール時の話はまた改めて投稿しようと思う。

ちなみに、まだ無線LANは使用できるようになっていない。せっかくのノートなので、早く有線環境から脱したいところだ。

2008年02月16日(土) 23:35 [日記・その他

DELL Inspiron1525が無事到着した。
オーダーステータスで進行状況が見られるため長く感じたが、振込から9日で到着したことになる。
Inspiron1525
外観は青。マットな質感で満足出来るレベルだ。正直、カッコイイ。

が、フタを開けると驚愕の光景。
Inspiron1525キーボード
凄まじく安っぽい作りになっていた。
パームレスト部分が安っぽいのは覚悟していたが、タッチパッドまでが同じ素材で作られているとは思わなかった。タッチパッドが筐体のへこみにしか見えない。
キートップは若干違う作りになっていたが、同じと言っていいだろう。

とは言え、不満どころか「これぞDELL!」と思えてむしろ満足。新品にも関わらず液晶に指紋がついている辺り、押さえるポイントを分かっているとしか思えない。早速、付属の液晶クリーナーが活躍する運びとなった。

今回、付属OSとしてWindows Vista Home Premiumを購入したので、Aeroを楽しみながらVistaに慣れ親しんでみようと思う。

先日、数独のソースコードをダウンロードできるようにしたが、せっかくなのでダウンロード数をカウントできるプラグインを導入してみた。実現可能なプラグインはいくつかあるようだったが、その中で便利そうに思えた下記のプラグインを採用させてもらった。

bovendeur.org:『Download Counter for Wordpress』

導入・設定

上記URLを辿ったページに「Downloading」という項があり、文中の「here」からダウンロードできる。最初、「here」にリンクが張られていることに気づかなくて、しばらく探してしまった。

ダウンロードしたファイルを解凍すると、「wp-downloadcounter」というフォルダが作られるので、フォルダごと「wp-content/plugins」ディレクトリにアップロードし、管理画面から有効にすればひとまず導入は完了となる。

導入完了後、管理画面から「管理」→「Downloads」と辿ると、下記のような画面が表示されるので、初期設定を行う。
DownloadCounter
「Use pretty links」のチェックを外し、「Save changes」ボタンで保存する。
「Use pretty links」の詳細については後述する「きれいなURLを使う」の項を参照してもらいたい。チェックするとURLの生成方法が変わるのだが、若干手間が必要になる。まずは、プラグインの動作を簡単に確認しておきたいのでチェックを外しておく。

最後に、ファイルをアップロードするディレクトリを用意する。既にそういった用途のディレクトリがある場合はそのまま使用していいし、新たにお好みのディレクトリを作成してもいい。私は「files」というディレクトリにいろいろなファイルをアップロードしているので、そこを使用することにした。

ダウンロード数をカウントさせてみる

ダウンロードさせるファイルを上記で作成した(作成されていた)ディレクトリにアップロードする。
アップロード完了後、管理画面から「管理」→「Downloads」を辿り、「Add Download」ボタンを押してファイルの登録画面に移動する。
DownloadCounterのファイル登録
「Name」には任意の名前を、「URL」にはアップロードしたファイルのURLを入力し、「Save」ボタンで保存する。

画面下に登録したファイルの情報が表示され、ダウンロード数などが参照できるようになっている。
「With counter」に張られたリンクからダウンロードするとダウンロード数がカウントされ、「Without counter」に張られたリンクではプラグインを通さないためカウントされない。よって、前者のURLを使用すれば良い。

きれいなURLを使う(Use pretty links)

通常、「http://(サイトのURL)/?download=sudoku」といったURLが生成されるが、見るからにCGI経由なので見栄えが良くない(と考える人がいるかもしれない)。そこで、「Use pretty links」と「Download slug」を使用する。

管理画面の英文を訳すと大体下記のようになる。

Use pretty links

ここをチェックすると、ダウンロードスラッグ(以下のDownload slugのこと)を使用したURLが生成されます。チェックしなかった場合、「/?download=<名称>」のようなURLが生成されます。

Download slug

この値を変更した場合、新しいダウンロードスラッグを反映させるために管理画面の「パーマリンク設定」からパーマリンク構造を更新する必要があります。あなたがパーマリンク構造を更新するまで、訪問者は「404 NOT FOUND」ページを受け取ることになります。

「Use pretty links」をチェックし、「Download slug」に任意のスラッグを入力する。ダウンロードスラッグは既存カテゴリーのスラッグと被らない方が無難だろう。ここでは「download」とする。

設定を保存すると、登録したファイルの「With counter」のURLが変更される。

http://spring.sakurasaita.net/?download=sudoku

http://spring.sakurasaita.net/download/sudoku

プラグインで生成されるURLがダウンロードスラッグを使用したものに置き換わるだけということに注意しなければいけない。そのままでは、このURLにアクセスしても404 NOT FOUNDとなり、使用できない。解説に従えばパーマリンク構造を変更するらしいのだが、単にパーマリンク構造を変更しただけでダウンロードできるとも思えない。そこで、「.htaccess」ファイルを編集することにした。(もし、本来はその他の手順で行うべきなのだとしたら、ぜひお教えいただきたい)

「.htaccess」ファイルを作成し、下記のように編集する。

<IfModule mod_rewrite.c>
    # 置換を有効にする
    RewriteEngine On
    # URL先頭から置換を開始する
    RewriteBase /
    # 先頭が「/download/」で始まる場合のみ置換する
    RewriteCond %{REQUEST_URI} ^/download/
    # 「download/文字列」を「?download=文字列」に置換する
    RewriteRule ^download/(.+) ?download=$1 [L]
</IfModule>

これでdownload以下へのアクセスは「?download=<名称>」にリダイレクトされるため、正常にアクセス出来るようになる。
もし、パーマリンク構造を変更していて、既に「.htaccess」ファイルが存在する場合は下記のように赤字を追記すれば良い。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_URI} ^/download/
    RewriteRule ^download/(.+) ?download=$1 [L]
    # DownloadCounterで使用するURLは置換対象から除く
    RewriteCond %{REQUEST_URI} !^/download/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>

これで、エントリーへのリクエストとダウンロードへのリクエストの両方を扱えるようになる。

動作確認時の注意点

「Use pretty links」の確認を行う場合、一度ブラウザのキャッシュをクリアした方がいい。
いろいろなパターンの設定を試していた時、正常にダウンロードできるはずなのにダウンロードできない、ダウンロードできないはずなのに正常にダウンロードできるといったことがあったからだ。念のため、ブラウザのリクエストヘッダを確認してみたところ、期待しない動作の場合はそもそもリクエストヘッダが送信されていなかった。そこでキャッシュをクリアしたところ、期待通りの動作を行うようになった。

まとめ

以上でDownloadCounterの設定は完了となる。
個人的には、「Use pretty links」は使用しないで「?download=<名称>」とする方がダウンロードされるんだなということがはっきりするので好みかもしれない。

ファイルがダウンロードされたということは、少なくともエントリーに興味をもってくれた人がいたということになるので、単にアクセス数が伸びるよりもうれしい。今後もDonwloadCounterを活用させてもらおうと思う。

.htaccessの説明

上記で作成した「.htaccess」ファイルだが、Apacheにあまり馴染みの無い方は内容を把握しきれないかもしれない。把握していない設定を使用するのも気持ち悪いと思うので、簡単に説明しようと思う。本項はDownloadCounterの設定には直接関係ないので読み飛ばしても何ら問題無い。

<IfModule mod_rewrite.c>
    ~
</IfModule>

これは「mod_rewrite」モジュールがロードされている場合のみ、タグに囲われたディレクティブを読み込ませるために記述する。実際の置換には関わらない部分であり、保険のために記述する。

RewriteEngine On

置換エンジンを有効にする。もし、置換をやめたい場合、「On」→「Off」とすれば、せっかく書いた置換ルールを削除しないで置換をやめることができる。

RewriteBase /

URLのどの部分から置換を開始するのかを指定する。
RewriteBaseディレクティブを省略すると、ローカルのファイルパスが使用されてしまう。「/index.php」がローカルのパスでは「/var/www/html/index.php」となっている場合、後者が使用されることになる。これは大抵期待外れなので、常にきっちりと指定した方が良い。

RewriteCond %{REQUEST_URI} ^/download/

RewriteCondディレクティブは置換対象の条件を指定する。
%{REQUEST_URI}は、リクエストヘッダのリソース部分を扱える。リクエストヘッダが「GET /perl/28.html HTTP/1.1」だとすると、「/perl/28.html」となる。
上記例ではリソースの先頭が「/download/」で始まるURLを置換対象としてくれ、という意味になる。

RewriteRule ^download/(.+) ?download=$1 [L]

RewriteRuleディレクティブは、RewriteCondディレクティブの条件に合致したURLを実際に置換する。
URLの先頭「download/(何かの文字列)」を「?donwload=(何かの文字列)」に置換している。「$1」とは、置換元文字列の括弧で囲まれた部分を使用するよという意味になる。括弧が複数個ある場合は、「$1」「$2」「$3」と数字を増やしていけばいい。
末尾に記載されている「[L]」はLastのことで、このRewriteRuleディレクティブで置換されたURLは置換を終了するという意味だ。これ以降にもRewriteRuleディレクティブが指定されている場合に期待しない置換が行われることを防いでくれる。

RewriteCond %{REQUEST_URI} !^/download/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

1行目は、リソースの先頭が「/download/」で始まらないURLを置換対象としてくれ、という意味になる。記述しなくても、問題ないので単なる保険だ。

2~3行目で使用されている%{REQUEST_FILENAME}はファイルのローカルパスを扱える。「/index.php」がローカルのパスでは「var/www/html/index.php」となっている場合、後者が使用される。「-f」「-d」という記述は、「ファイルだったら置換対象」「ディレクトリだったら置換対象」の意味だ。しかし、先頭に「!」が付いているため真偽が逆になり、「ファイルでなかったら」「ディレクトリでなかったら」となる。
つまり、2~3行目はローカルのパスでチェックして、ファイルでもディレクトリでもない(要は存在しない)ファイルへのリクエストだったら置換対象としてくれ、という意味になる。

4行目は、リソースをindex.phpに置換している。パーマリンク構造の細かな解析はindex.php内で行われているのだろう。末尾の「[L]」は、先の説明と同様となる。

もっと細かく知りたい場合は下記のリンクを参照して欲しい。
Apache module mod_rewrite

2008年02月12日(火) 0:30 [Perl

バレーボール関係で埋まりかけた連休の合間を見て、数独を解くPerlスクリプトを書いたので、ネタにしようと思う。(自宅サーバネタはまた間に合わなかった)

Wikipedia:数独

上記URLに画像が紹介されている一番ポピュラーな縦9マス横9マスの問題の場合、各列には1~9の数字が1つだけ入り、各行にも1~9の数字が1つだけ入る。更に3×3の正方形内にも1~9の数字が独立して入る。この3つのルールに違反しない数字を書くマスに埋めていくのが数独だ。間違った数字を入れてしまうとどこかで矛盾が生じてしまい、全マスに数字を収められなくなってしまう。逆を取れば、全マスに数字を収められればそれが正解となる。

今回作成したスクリプトは、まず最初のマスに適当に数字を入れ、次のマスへ移動する。そこでも適当に数字を入れる。入れられる数字が無かった場合、1つ前のマスに戻り別の数字を入れ、また次のマスへ移動し、入れられる数字があれば入れていく。これを全マスに数字を収められるまで繰り返していく。いわゆるバックトラックという手法になる。(芸が無いと言えばそれまでだが)

スクリプトは以下のように使用する。

perl sudoku.pl question.txt

「question.txt」(ファイル名は任意)には、空きマスは「0」として空白区切りで下記のように問題を記述する。

0 0 3 5 1 2 0 0 0
0 1 0 0 4 0 3 2 0
6 0 0 0 8 0 0 4 0
3 0 0 0 0 4 0 0 6
1 4 9 0 0 0 7 8 5
5 0 0 9 0 0 0 0 4
0 3 0 0 9 0 0 0 2
0 5 8 0 3 0 0 1 0
0 0 0 1 2 5 8 0 0

これを実行し問題を解くことが出来た場合、空きマスの「0」が数字に書き換えられた「question-answer.txt」が生成される。

4 7 3 5 1 2 9 6 8
8 1 5 6 4 9 3 2 7
6 9 2 3 8 7 5 4 1
3 2 7 8 5 4 1 9 6
1 4 9 2 6 3 7 8 5
5 8 6 9 7 1 2 3 4
7 3 1 4 9 8 6 5 2
2 5 8 7 3 6 4 1 9
9 6 4 1 2 5 8 7 3

例では9×9の問題を使用しているが、もっと大きな問題でも解くことができる(はず)。問題に無理がある場合はもちろん失敗してしまう。問題があっているのに失敗することは無いが、あったらごめんなさい。

ここをクリックでコードの表示・非表示を切り替える。

需要は無いだろうけど、ダウンロードは下記からどうぞ。

ダウンロード

バグがあった場合は、ぜひご連絡を。

今度はイラストロジックを解くスクリプトにでも挑戦してみようかなと思う。

Next Page »
Copyright 2008 As You Like It All rights reserved.
Powered by Wordpress, Base template by WEB MAGIC, Photo by Encyclorecorder