<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.3.2" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>As You Like It</title>
	<link>http://spring.sakurasaita.net</link>
	<description>Debianによる自宅サーバ運用と日々の徒然</description>
	<pubDate>Sun, 30 Nov 2008 11:38:33 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3.2</generator>
	<language>en</language>
			<item>
		<title>サーバダウンから復旧しました。</title>
		<link>http://spring.sakurasaita.net/diary/52.html</link>
		<comments>http://spring.sakurasaita.net/diary/52.html#comments</comments>
		<pubDate>Sun, 30 Nov 2008 11:38:33 +0000</pubDate>
		<dc:creator>Masa</dc:creator>
		
		<category><![CDATA[日記・その他]]></category>

		<guid isPermaLink="false">http://spring.sakurasaita.net/diary/52.html</guid>
		<description><![CDATA[11月20日の木曜日夜、操作ミスによりシステムを壊してしまいました。
/etc以下は戻りませんでしたが、幸い、/homeや/varは復旧できましたので、文字通り「元に戻す」ことができました。
作業中、以前作成したドキュメントをメンテナンスしましたので、暇をみて公開していこうと思います。
もっとも、未だにアクセスの大半を占める「Inspiron1525（iwl4965）+Debianで無線LAN」のような内容ではなく、まさに私的な備忘録な内容になります。（iwl4965ネタも結局は備忘録なんですけどね）
]]></description>
			<content:encoded><![CDATA[<p>11月20日の木曜日夜、操作ミスによりシステムを壊してしまいました。</p>
<p>/etc以下は戻りませんでしたが、幸い、/homeや/varは復旧できましたので、文字通り「元に戻す」ことができました。</p>
<p>作業中、以前作成したドキュメントをメンテナンスしましたので、暇をみて公開していこうと思います。</p>
<p>もっとも、未だにアクセスの大半を占める「Inspiron1525（iwl4965）+Debianで無線LAN」のような内容ではなく、まさに私的な備忘録な内容になります。（iwl4965ネタも結局は備忘録なんですけどね）</p>
]]></content:encoded>
			<wfw:commentRss>http://spring.sakurasaita.net/diary/52.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>投稿内容を修正しました。</title>
		<link>http://spring.sakurasaita.net/diary/49.html</link>
		<comments>http://spring.sakurasaita.net/diary/49.html#comments</comments>
		<pubDate>Sat, 15 Mar 2008 15:59:19 +0000</pubDate>
		<dc:creator>Masa</dc:creator>
		
		<category><![CDATA[Debian]]></category>

		<category><![CDATA[日記・その他]]></category>

		<guid isPermaLink="false">http://spring.sakurasaita.net/diary/49.html</guid>
		<description><![CDATA[下記の投稿について、一部内容を修正しました。
『Intel Wireless WiFi Link 4965AGN』

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

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

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

本ブログを参考にされた方で、上記ミスの影響を受けた方、ごめんなさい。
]]></description>
			<content:encoded><![CDATA[<p>下記の投稿について、一部内容を修正しました。</p>
<p><a href="http://spring.sakurasaita.net/debian/47.html">『Intel Wireless WiFi Link 4965AGN』</a></p>
<ul>
<li>カーネルの設定ファイル複製後、「make oldconfig」の記述が抜けていたので追記。
<li>作業ディレクトリが一部不適切だったので修正。
<li>ファームウェアのコピー方法を修正。
</ul>
<p><a href="http://spring.sakurasaita.net/debian/46.html">『Marvell Yukon 88E8040 PCI-E Fast Ethernet Controller』</a></p>
<ul>
<li>カーネルの設定ファイル複製後、「make oldconfig」の記述が抜けていたので追記。
<li>作業ディレクトリが一部不適切だったので修正。
</ul>
<p>本ブログを参考にされた方で、上記ミスの影響を受けた方、ごめんなさい。</p>
]]></content:encoded>
			<wfw:commentRss>http://spring.sakurasaita.net/diary/49.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>時間が9時間ずれる（/dev/rtcとhwclock）</title>
		<link>http://spring.sakurasaita.net/debian/48.html</link>
		<comments>http://spring.sakurasaita.net/debian/48.html#comments</comments>
		<pubDate>Sun, 09 Mar 2008 14:13:05 +0000</pubDate>
		<dc:creator>Masa</dc:creator>
		
		<category><![CDATA[Debian]]></category>

		<guid isPermaLink="false">http://spring.sakurasaita.net/debian/48.html</guid>
		<description><![CDATA[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の設定をしていなかったので、後でやっておこう。
]]></description>
			<content:encoded><![CDATA[<p>Inspiron1525にDebian etchをインストールしたときのメモ。</p>
<p>「/etc/modprobe.conf」を削除したところ、システムクロックが9時間進んで表示されてしまう問題が発生した。手動で時間を合わせても再起動すると元に戻ってしまう。頭を悩ませていると、ブート時に下記のエラーが表示されていることに気づく。</p>
<code>select() to /dev/rtc to wait for clock tick timed out</code>
<p>調べてみると、「/dev/rtc」からhwclockコマンドでハードウェアクロックを取得しているらしい。試してみる。</p>
<code>$ sudo hwclock --show<br />
select() to /dev/rtc to wait for clock tick timed out</code>
<p><a href="http://www.linux.or.jp/JM/html/util-linux/man8/hwclock.8.html" target="_blank">『Manpage of HWCLOCK』</a>を参考に、「--directisa」オプションを追加してみたところ、正常に取得することができた。</p>
<code>$ sudo hwclock --show --directisa<br />
2008年03月09日 22時49分04秒  -0.015540 seconds</code>
<p>起動時に「/etc/init.d/hwclock.sh」でhwclockを使用しているので、「--directisa」オプションを使用するように修正した。</p>
<code>HWCLOCKPARS=<br />
<span class="comment">↓</span><br />
HWCLOCKPARS=<span class="point">--directisa</span><br />
</code>
<p>一度時間を合わせて再起動したところ、無事正しい時間が表示されるようになった。</p>
<p>時間と言えばNTPの設定をしていなかったので、後でやっておこう。</p>
]]></content:encoded>
			<wfw:commentRss>http://spring.sakurasaita.net/debian/48.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Intel Wireless WiFi Link 4965AGN</title>
		<link>http://spring.sakurasaita.net/debian/47.html</link>
		<comments>http://spring.sakurasaita.net/debian/47.html#comments</comments>
		<pubDate>Fri, 07 Mar 2008 11:12:37 +0000</pubDate>
		<dc:creator>Masa</dc:creator>
		
		<category><![CDATA[Debian]]></category>

		<guid isPermaLink="false">http://spring.sakurasaita.net/debian/47.html</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Inspiron1525にDebian etchをインストールしたときのメモ。</p>
<p>せっかくのノートパソコンなのでやはり無線で接続したい。カーネル2.6.18で4965AGNを使用するにはいろいろと手間が必要だが、がんばってみた。<br />
ちなみに、2.6.22ではmac80211が統合されているらしいので、ドライバを入れるだけで動くそうだ。さらに、2.6.24ではiwl4965がカーネルに統合されているため、特別手間がかからないらしい。この辺、stable版を使っていると苦労するところなのだろう。</p>
<h3>カーネルのソースコードを用意する</h3>
<p>現在利用しているカーネルのバージョンを調べ、適したバージョンのソースコードをインストールする。</p>
<code># uname -r<br />
2.6.18-6-686<br />
# aptitude install linux-source-2.6.18</code>
<p>「/usr/src」以下にソースコードのアーカイブがインストールされるので解凍し、「/usr/src/linux」にシンボリックリンクを作成する。</p>
<code># cd /usr/src<br />
# tar vxfj linux-source-2.6.18.tar.bz2<br />
# ln -s /usr/src/linux-source-2.6.18 /usr/src/linux</code>
<p>現在のカーネルと同じ設定でコンパイルされるように、「/boot」ディレクトリにある設定ファイルをコピーし、「make oldconfig」で過去の設定を引き継がせる。</p>
<code># cp /boot/config-2.6.18-6-686 /usr/src/linux/.config<br />
# cd /usr/src/linux<br />
# make oldconfig</code>
<h3>ドライバ、ファームウェア、mac80211サブシステムをダウンロード</h3>
<p>インストールに必要となるドライバ、ファームウェア、mac80211サブシステムは下記サイトからダウンロードできる。</p>
<p><a href="http://www.intellinuxwireless.org/" target="_blank">Intel Wireless WiFi Link drivers for Linux</a></p>
<p>私の場合は下記のバージョンをダウンロードすることにした。</p>
<table>
<tr>
<th>mac80211</th>
<td>mac80211-10.0.4</td>
</tr>
<tr>
<th>ドライバ</th>
<td>iwlwifi-1.1.0.tgz</td>
</tr>
<tr>
<th>ファームウェア</th>
<td>iwlwifi-4965-ucode-4.44.1.20.tgz</td>
</tr>
</table>
<p>mac80211サブシステムとファームウェアは作業時点での最新版、ドライバはやや古いバージョンとなっている。これは、カーネルが2.6.18では最新版のドライバをコンパイルできなかったためだ。（私の勘違いではない....と思う）</p>
<p>mac80211サブシステムを適用させるためにはカーネルの再構築が必要になるのだが、再構築後は有線LANのドライバを再インストールする必要がある。よって、必要なファイルはあらかじめダウンロードしておくことにする。</p>
<code># wget http://intellinuxwireless.org/mac80211/downloads/mac80211-10.0.4.tgz<br />
# wget http://intellinuxwireless.org/iwlwifi/downloads/iwlwifi-1.1.0.tgz<br />
# wget http://intellinuxwireless.org/iwlwifi/downloads/iwlwifi-4965-ucode-4.44.1.20.tgz</code>
<h3>カーネルソースにmac80211を適用する</h3>
<p>無線サブシステムの「mac80211」をカーネルソースにパッチする。</p>
<p>まず、rsyncをインストールしておく。</p>
<code># aptitude install rsync</code>
<p>「/lib/modules/（カーネルのバージョン）/source」というカーネルソースのシンボリックリンクを作成する。</p>
<code># ln -s /usr/src/linux-source-2.6.18 /lib/modules/2.6.18-6-686/source</code>
<p>これを作成しておかないと、パッチ適用時に下記のエラーが表示されてしまう。</p>
<code>Kernel Makefile not found at '/lib/modules/2.6.18-6-686/source/'<br />
If patch or script failed, check pre/ and post/ for current stage.<br />
make: *** [compatible/modified] エラー 1</code>
<p>続いて、カーネルの設定ファイル「.config」を下記のように変更する</p>
<code># vim /usr/src/linux/.config<br />
CONFIG_NET_WIRELESS_RTNETLINK=y<br />
<span class="comment">↓</span><br />
CONFIG_NET_WIRELESS_RTNETLINK=<span class="point">n</span></code>
<p>上記の設定を無効にしておかないと、パッチ適用時に下記のエラーが表示されてしまう。</p>
<code>Checking kernel compatibility in:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/lib/modules/2.6.18-6-686/source//<br />
  ! CONFIG_NET_WIRELESS_NETLINK can not be set in .config!<br />
make: *** [compatible/modified] エラー 1</code>
<p>準備は整ったので、ダウンロードしておいたmac80211サブシステムのアーカイブを展開し作成されたディレクトリに移動する。「make; make patch_kernel」とすることで、カーネルソースにmac80211サブシステムを組み込むことが出来る。</p>
<code># tar zxvf mac80211-10.0.4.tgz<br />
# cd mac80211-10.0.4<br />
# make; make patch_kernel</code>
<h3>カーネルの再構築を行う</h3>
<p>mac80211サブシステムを適用し終えたら、カーネルの再構築を行う。</p>
<p>カーネル再構築用のパッケージをインストールする。</p>
<code># aptitude install kernel-package</code>
<p>カーネルソースのディレクトリに移動し、カーネルの再構築を行う。以前にカーネルの再構築を行っていた場合、「make-kpkg clean」でクリアを行っておく。</p>
<code>
# cd /usr/src/linux<br />
# make-kpkg clean<br />
# make-kpkg --append_to_version -6-686-mac80211 --initrd --revision=relm1.0 linux-image</code>
<p>2行目の引数は下記の意味になる。</p>
<dl>
<dt>--append_to_version</dt>
<dd>カーネルのバージョンに追記される。インストール時、既存のカーネルと区別したい場合に指定する。</dd>
<dt>--revision</dt>
<dd>カーネルバージョンのリビジョンを指定する。お好みで問題ない。</dd>
<dt>--initrd</dt>
<dd>RAMディスクを作成する。--append_to_versionを変更した場合などに指定しないとRAMディスクが作成されず、ブート時にカーネルパニックになる。</dd>
<dt>linux-image</dt>
<dd>debパッケージの先頭に付ける名前。</dd>
</dl>
<p>また、再構築の開始時にいくつか質問されたので、下記のように答えた。</p>
<code><span class="comment">無線LANを有効にする</span><br />
Improved wireless configuration API (CFG80211) [N/m/y] (NEW) <span class="point">y</span><br />
<span class="comment">一般的なIEEE802.11のネットワーク・スタックを有効にする</span><br />
Generic IEEE 802.11 Networking Stack (mac80211) (MAC80211) [N/m/y/?] (NEW) <span class="point">y</span><br />
<span class="comment">パケット送受信時にLEDの点灯を有効にする</span><br />
Enable LED triggers (MAC80211_LEDS) [N/y/?] (NEW) <span class="point">y</span><br />
<span class="comment">IEEE802.11のネットワーク情報をデバッグ用に出力する</span><br />
Export mac80211 internals in DebugFS (MAC80211_DEBUGFS) [N/y/?] (NEW) <span class="point">n</span><br />
<span class="comment">デバッグ情報をフル出力する</span><br />
Enable debugging output (MAC80211_DEBUG) [N/y/?] (NEW) <span class="point">n</span></code>
<p>その他の質問が表示された場合などは下記のサイトが参考になる。私も参考にさせてもらった。</p>
<p>ITPro：<a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20080107/290508/" target="_blank">『Linuxカーネルの設定パラメータ−ネットワークの設定』</a><br />
ITPro：<a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20071025/285507/?ST=lin-os" target="_blank">『Linuxカーネルの設定パラメータ』</a></p>
<p>再構築が完了すると、「/usr/src」ディレクトリに「linux-image-2.6.18-6-686-mac80211_relm1.0_i386.deb」という名前のdebパッケージが作成されるので、「dpkg」コマンドでインストールを行う。</p>
<code>dpkg -i linux-image-2.6.18-6-686-mac80211_relm1.0_i386.deb</code>
<p>インストールが完了したら、一度マシンを再起動して無事起動できることを確認しておく。GRUBなどブートローダの設定も行ってくれるので、ブートローダの画面で今回インストールしたカーネルを選択すればOKだ。</p>
<p>ちなみに、再構築には非常に長い時間がかかる。私はCore2Duoのマシンで40分近くかかった。お風呂でも入ってくるとちょうど良い。</p>
<h3>ファームウェアのインストール</h3>
<p>あらかじめダウンロードしておいたファームウェアのアーカイブを展開し、「/usr/lib/hotplug/firmware」ディレクトリにコピーする。</p>
<code># tar zxvf iwlwifi-4965-ucode-4.44.1.20.tgz<br />
# cd iwlwifi-4965-ucode-4.44.1.20<br />
# cp iwlwifi-4965-1.ucode /usr/lib/hotplug/firmware/<br />
<span class="comment">2008年03年16日追記<br />
初回のインストール時は下記のように作業をした。<br />
# cp iwlwifi-4965-1.ucode /usr/lib/hotplug/firmware/iwlwifi-4965.ucode<br />
しかし、再インストール時になぜかファームウェアがロードされなくなってしまったので、上記のようにファイル名を変更しないように修正した。（もしかして、使用するドライバのバージョンなどを勘違いしていたのか??）</span><br />
</code>
<h3>ドライバのインストール</h3>
<p>あらかじめダウンロードしておいたドライバのアーカイブを展開し、コンパイルする。</p>
<code># tar zxvf iwlwifi-1.1.0.tgz<br />
# cd iwlwifi-1.1.0<br />
# make<br />
# make install</code>
<p>ドライバを読み込ませてみる。再起動してみても良い。</p>
<code># ./load</code>
<p>NICが正常に認識されているか確認してみる。</p>
<code># iwconfig<br />
wmaster0  no wireless extensions.<br /><br />
Warning: Driver for device wlan0 has been compiled with version 22 of Wireless Extension, while this program supports up to version 20.<br />
Some things may be broken...<br /><br />
wlan0&nbsp;&nbsp;&nbsp;&nbsp;IEEE 802.11g  ESSID:""  Nickname:""<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Mode:Managed  Frequency:2.412 GHz  Access Point: Not-Associated<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Tx-Power=27 dBm<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Retry min limit:7   RTS thr:off   Fragment thr=2346 B<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Encryption key:off<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Power Management:off<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Link Quality:0  Signal level:0  Noise level:0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Tx excessive retries:0  Invalid misc:0   Missed beacon:0</code>
<p>これで、ハードウェアの設定は完了だ。</p>
<h3>NICの設定</h3>
<p>続いて、「/etc/network/interfaces」にNICの設定を記述する。<br />
詳しい原因は分からないのだが、eth1より先にブートさせないとうまく動いてくれなかったので、loとeth1の間に記述した。</p>
<code>allow-hotplug wlan0<br />
iface wlan0 inet static<br />
address 192.168.30.9<br />
netmask 255.255.255.0<br />
gateway 192.168.30.250<br />
wireless_mode Managed<br />
wireless_essid *****************<br />
wireless_channel 7<br />
wireless_key s:*************<br />
auto wlan0</code>
<p>設定の意味は下記の通り</p>
<table>
<tr>
<th>wireless_mode</th>
<td>無線APへ接続するなら「Managed」。PC間で接続するなら「Ad-Hoc」。</td>
</tr>
<tr>
<th>wireless_essid</th>
<td>接続先のESSIDを指定する。省略すると「any」扱い??</td>
</tr>
<tr>
<th>wireless_channel</th>
<td>利用チャンネルを指定する。省略すると自動で設定される（はず）。<br />
ちなみに、802.11gは7チャンネル辺りが電波干渉しづらいらしい。</td>
</tr>
<tr>
<th>wireless_key</th>
<td>WEPキーを指定する。文字列で指定する場合は「s:*****」とし、16進数での指定ではそのまま記述する。</td>
</tr>
</table>
<p>WEPではなく、WPAを使う場合などは別の手順が必要となる。私はニンテンドーDSの関係でWEPにせざるを得ないので上記設定となった。</p>
<p>ITPro：<a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230803/" target="_blank">『【 iwconfig 】 無線LANインタフェースの参照・設定』</a></p>
<p>eth1は使用しなくなるので、起動しないように設定しておく。</p>
<code>auto eth1<br />
<span class="comment">↓</span><br />
<span class="point">#</span>auto eth1</code>
<p>eth1を停止しない場合、複数NICでの運用になるため、デフォルトゲートウェイの設定（gateway ***）はいずれかのNICのみにしておいた方がいい。何らかの理由で両方のNICにデフォルトゲートウェイを設定する場合、デフォルトゲートウェイを複数指定することはトラブルを招くこともあると念頭に置いておくほうがいいだろう。</p>
<p>ネットワークの設定を反映させる。ただし、前述した通りeth1が動作しているとうまく動いてくれなかったのであらかじめ停止しておく。</p>
<code># ifconfig eth1 down<br />
# /etc/init.d/networking restart</code>
<p>無線が正常に接続された場合、iwconfigコマンドの結果が下記のようになる。下記の例では802.11gで接続されている。</p>
<code># iwconfig<br />
<span class="comment">〜</span><br />
wlan0&nbsp;&nbsp;&nbsp;&nbsp;IEEE 802.11g  ESSID:"***********************"  Nickname:""<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Mode:Managed  Frequency:2.442 GHz  Access Point: 00:00:00:00:00:00<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Bit Rate=54 Mb/s   Tx-Power=27 dBm<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Retry min limit:7   RTS thr:off   Fragment thr=2346 B<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Encryption key:0000-0000-0000-0000-0000-0000-00<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Power Management:off<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Link Quality=100/100  Signal level=-35 dBm  Noise level=-94 dBm<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Tx excessive retries:0  Invalid misc:0   Missed beacon:0</code>
<p>「/etc/resolv.conf」の設定を行っていない場合は設定を忘れずに。</p>
<h3>まとめ</h3>
<p>あれこれ手間がかかったものの、これで問題無く無線でLANに接続できるようになった。<br />
802.11nの機材が無いため、802.11gでの利用となるが、先立つものが手元にやってきたらぜひ試してみたい。</p>
<h3>補足</h3>
<p>正常に接続できるようになっても、筐体前面のLEDは点灯しない。また、GNOME側のネットワークツールでも動作していないように表示される。<br />
使う分には問題ないので、暇なときにでも調べてみようと思う。</p>
]]></content:encoded>
			<wfw:commentRss>http://spring.sakurasaita.net/debian/47.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Marvell Yukon 88E8040 PCI-E Fast Ethernet Controller</title>
		<link>http://spring.sakurasaita.net/debian/46.html</link>
		<comments>http://spring.sakurasaita.net/debian/46.html#comments</comments>
		<pubDate>Mon, 03 Mar 2008 13:39:01 +0000</pubDate>
		<dc:creator>Masa</dc:creator>
		
		<category><![CDATA[Debian]]></category>

		<guid isPermaLink="false">http://spring.sakurasaita.net/debian/46.html</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Inspiron1525にDebian etchをインストールした時のメモ。</p>
<p>内蔵NICに「Marvell Yukon 88E8040」というものを使用しているらしいのだが、100Mbpsということに驚き。1000BASEだと思い込んでいた。最終的には無線LANにしてしまうので良いのだけど、なんだか損をした気分だ。これもDELLクオリティということなのか。</p>
<h3>ドライバのダウンロード</h3>
<p>Marvellのサイトから最新のドライバをダウンロードする。</p>
<p>Marvell：<a href="http://www.marvell.com/drivers/driverDisplay.do?dId=153&#038;pId=36" target="_blank">『Linux Driver Install Package for Yukon Devices』</a></p>
<h3>必要なパッケージのインストール</h3>
<p>ドライバのインストールを行う際、必要なパッケージがインストールされていない場合にエラーメッセージが表示されるので、その都度インストールすればいい。私の場合、開発環境を用意していなかったので、gccをインストールした。</p>
<code># aptitude install gcc</code>
<p>他、カーネルのソースコードが必要のようなので、次項でインストールする。</p>
<h3>カーネルのソースコードを用意</h3>
<p>現在利用しているカーネルのバージョンを調べ、適したバージョンのソースコードをインストールする。</p>
<code># uname -r<br />
2.6.18-6-686<br />
# aptitude install linux-source-2.6.18</code>
<p>「/usr/src」以下にソースコードのアーカイブがインストールされるので解凍し、「/usr/src/linux」にシンボリックリンクを作成する。</p>
<code># cd /usr/src<br />
# tar vxfj linux-source-2.6.18.tar.bz2<br />
# ln -s /usr/src/linux-source-2.6.18 /usr/src/linux</code>
<h3>カーネルのコンパイル</h3>
<p>カーネルのコンパイルを行っておかないとドライバのインストール時に下記のエラーが表示される。</p>
<code>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.<br /><br />
To do so, please follow the description below:<br />
(Please read the next lines before you execute them!)<br />
[1] Change to /usr/src/linux<br />
[2] Call make (this begins to create a new linux kernel)<br />
[3] Take a look at the output: After a few seconds the modpost utility will be compiled<br />
[4] Now interrupt the make process by pressing ctrl-c<br /><br />
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.<br /><br />
If you are finished recall install.sh again. That's it.</code>
<p>一度コンパイルを行い、modpostモジュールを作成しておく必要があるらしい。</p>
<p>現在のカーネルと同じ設定でコンパイルされるように、「/boot」ディレクトリにある設定ファイルをコピーし、「make oldconfig」で過去の設定を引き継がせる。</p>
<code># cp /boot/config-2.6.18-6-686 /usr/src/linux/.config<br />
# cd /usr/src/linux<br />
# make oldconfig</code>
<p>コンパイルを行う。</p>
<code># make</code>
<p>画面の出力内容を見てmodpostがコンパイルされた後は「ctrl + c」で中断して良い。ちなみに、modpostはコンパイル開始後すぐにコンパイルされる。</p>
<h3>ドライバのインストール</h3>
<p>手順の最初でダウンロードしたドライバの圧縮ファイルを解凍して、生成された「DriverInstall」ディレクトリに移動する。</p>
<code># tar vxfj install_v10.50.1.3.tar.bz2<br />
# cd DriverInstall</code>
<p>インストールスクリプトを実行する。</p>
<code># ./install.sh</code>
<p>表示されるメッセージには下記のように解答した。</p>
<code>1) installation<br />
2) generate patch<br />
3) exit<br />
Choose your favorite installation method: <span class="">1</code>
<code>Do you want proceed? (y/N) y</code>
<code>[PRESS ANY KEY FOR FURTHER INSTRUCTIONS] Enter</code>
<code>1) Do nothing<br />
2) Deactivate diver<br />
3) Remove driver<br />
Action: 3</code>
<p>インストールが完了すると下記のメッセージが表示された。</p>
<code>All done. Driver installed and loaded.<br />
To load the module manually, proceed as follows:<br />
&nbsp;&nbsp;&nbsp;&nbsp;  Enter "modprobe sk98lin"</code>
<p>今まではケーブルを差しても無反応だったNICのLEDが点灯した。「ifconfig」コマンドでNICが認識されていることを確認する。</p>
<code># ifconfig<br />
eth1   Link encap:Ethernet  HWaddr 00:00:00:00:00:00<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  inet addr:192.168.30.8  Bcast:192.168.30.255  Mask:255.255.255.0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  UP BROADCAST MULTICAST  MTU:1500  Metric:1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  RX packets:0 errors:0 dropped:0 overruns:0 frame:0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TX packets:0 errors:0 dropped:0 overruns:0 carrier:0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  collisions:0 txqueuelen:1000<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Interrupt:169 Memory:00000000-0</code>
<p>ちなみに、ドライバのインストール作業はカーネルを再構築する度に行わないといけないらしい。（本当にそうなのかな。うまいやり方はないのかな。）</p>
<h3>NICの設定</h3>
<p>「/etc/network/interfaces」ファイルを編集し、NICの設定を記述する。</p>
<p>固定IPアドレスの場合。</p>
<code>iface eth1 inet static<br />
address 192.168.30.8<br />
netmask 255.255.255.0<br />
gateway 192.168.30.250<br />
auto eth1</code>
<p>DHCPを使用する場合。</p>
<code>iface eth1 inet dhcp<br />
auto eth1</code>
<p>記述後、ネットワークの再設定を行う。</p>
<code># /etc/init.d/networking restart</code>
<h3>DNSサーバの設定</h3>
<p>「/etc/resolv.conf」ファイルを編集し、DNSサーバの設定を行う。「do not edit!」などと書かれているが気にしない。</p>
<code># generated by NetworkManager, do not edit!<br />
nameserver 192.168.30.201</code>
<h3>まとめ</h3>
<p>一通りの作業が完了したら、ネットワークに接続できるか確認する。<br />
無事ネットワークを使用できるようになっていたら、apt-lineを修正し、パッケージを最新版に更新しておく。</p>
]]></content:encoded>
			<wfw:commentRss>http://spring.sakurasaita.net/debian/46.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Debianインストールの経過報告</title>
		<link>http://spring.sakurasaita.net/debian/45.html</link>
		<comments>http://spring.sakurasaita.net/debian/45.html#comments</comments>
		<pubDate>Tue, 26 Feb 2008 14:28:50 +0000</pubDate>
		<dc:creator>Masa</dc:creator>
		
		<category><![CDATA[Debian]]></category>

		<guid isPermaLink="false">http://spring.sakurasaita.net/debian/45.html</guid>
		<description><![CDATA[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でデスクトップ環境を整えていると、一般に普及しないのは当然だなぁ、と思う。
]]></description>
			<content:encoded><![CDATA[<p>Inspiron1525にDebianを入れて数日経つがいまだに設定途上。<br />
ひとまず経過報告をしてみる。</p>
<dl>
<dt>サウンド</dt>
<dd>×。音が出ない。これから設定する予定。</dd>
<dt>有線LAN（Marvell Yukon 88E8040 PCI-E Fast Ehternet）</dt>
<dd>OK。インストール時に認識されなかったが、問題無く動作した。</dd>
<dt>無線LAN（Intel Wireless WiFi Link 4965AGN）</dt>
<dd>△。苦労した末、無事認識された。設定はしていないので実運用は行っていない。そういう意味で△。</dd>
<dt>Firefoxのプロファイル移行</dt>
<dd>OK。Windowsで使っているプロファイルを移行した。一部、設定を書き換えたが、基本的にそのままで動いた。</dd>
<dt>Thunderbirdのプロファイル移行</dt>
<dd>まだ行っていない。</dd>
<dt>メッセンジャー</dt>
<dd>OK。pidginをインストールして、MSNメッセが使用できるようになった。</dd>
</dl>
<p>その他の点では特に問題無く使用できている。<br />
いろいろ手間取ってはいるが、それはそれで楽しいので引き続き快適なデスクトップ環境が整えられるようにいろいろ試していきたい。現在無線LANの設定途中なので、それが落ち着いたら少しずつ設定中の話も投稿していく予定。</p>
<p>ちなみに、インストール時にLogicoolのマウス「VX nano」を繋いでいたのだが、GUIのインストーラが起動しなかった。</p>
<p>それにしても、こうやってLinuxでデスクトップ環境を整えていると、一般に普及しないのは当然だなぁ、と思う。</p>
]]></content:encoded>
			<wfw:commentRss>http://spring.sakurasaita.net/debian/45.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Inspiron1525にDebianを入れてみた</title>
		<link>http://spring.sakurasaita.net/debian/44.html</link>
		<comments>http://spring.sakurasaita.net/debian/44.html#comments</comments>
		<pubDate>Fri, 22 Feb 2008 14:27:17 +0000</pubDate>
		<dc:creator>Masa</dc:creator>
		
		<category><![CDATA[Debian]]></category>

		<guid isPermaLink="false">http://spring.sakurasaita.net/debian/44.html</guid>
		<description><![CDATA[Inspiron1525にDebianを入れてみた。

久しぶりにLinuxのデスクトップ画面を見たけれど、かなり綺麗になっている。
少なくとも、見栄えだけなら十分メイン環境として使っていけそうだ。
今回、ネットワークインストールCDでは内蔵NICを認識してくれなかったため、DVDイメージからインストールを行った。その後、NICドライバのインストールなどに結構手間取ってしまった。その過程やインストール時の話はまた改めて投稿しようと思う。
ちなみに、まだ無線LANは使用できるようになっていない。せっかくのノートなので、早く有線環境から脱したいところだ。
]]></description>
			<content:encoded><![CDATA[<p>Inspiron1525にDebianを入れてみた。</p>
<p><a href='http://spring.sakurasaita.net/files/2008/02/screenshot.png' title='Debianデスクトップ' target='_blank'><img src='http://spring.sakurasaita.net/files/2008/02/screenshot_s.png' alt='Debianデスクトップ' /></a></p>
<p>久しぶりにLinuxのデスクトップ画面を見たけれど、かなり綺麗になっている。<br />
少なくとも、見栄えだけなら十分メイン環境として使っていけそうだ。</p>
<p>今回、ネットワークインストールCDでは内蔵NICを認識してくれなかったため、DVDイメージからインストールを行った。その後、NICドライバのインストールなどに結構手間取ってしまった。その過程やインストール時の話はまた改めて投稿しようと思う。</p>
<p>ちなみに、まだ無線LANは使用できるようになっていない。せっかくのノートなので、早く有線環境から脱したいところだ。</p>
]]></content:encoded>
			<wfw:commentRss>http://spring.sakurasaita.net/debian/44.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Inspiron1525が届いた</title>
		<link>http://spring.sakurasaita.net/diary/37.html</link>
		<comments>http://spring.sakurasaita.net/diary/37.html#comments</comments>
		<pubDate>Sat, 16 Feb 2008 14:35:23 +0000</pubDate>
		<dc:creator>Masa</dc:creator>
		
		<category><![CDATA[日記・その他]]></category>

		<guid isPermaLink="false">http://spring.sakurasaita.net/diary/37.html</guid>
		<description><![CDATA[DELL Inspiron1525が無事到着した。
オーダーステータスで進行状況が見られるため長く感じたが、振込から9日で到着したことになる。

外観は青。マットな質感で満足出来るレベルだ。正直、カッコイイ。
が、フタを開けると驚愕の光景。

凄まじく安っぽい作りになっていた。
パームレスト部分が安っぽいのは覚悟していたが、タッチパッドまでが同じ素材で作られているとは思わなかった。タッチパッドが筐体のへこみにしか見えない。
キートップは若干違う作りになっていたが、同じと言っていいだろう。
とは言え、不満どころか「これぞDELL！」と思えてむしろ満足。新品にも関わらず液晶に指紋がついている辺り、押さえるポイントを分かっているとしか思えない。早速、付属の液晶クリーナーが活躍する運びとなった。
今回、付属OSとしてWindows Vista Home Premiumを購入したので、Aeroを楽しみながらVistaに慣れ親しんでみようと思う。
]]></description>
			<content:encoded><![CDATA[<p>DELL Inspiron1525が無事到着した。<br />
オーダーステータスで進行状況が見られるため長く感じたが、振込から9日で到着したことになる。<br />
<a href='http://spring.sakurasaita.net/files/2008/02/inspiron1525.jpg' title='Inspiron1525' target='_blank'><img src='http://spring.sakurasaita.net/files/2008/02/inspiron1525_s.jpg' alt='Inspiron1525' /></a><br />
外観は青。マットな質感で満足出来るレベルだ。正直、カッコイイ。</p>
<p>が、フタを開けると驚愕の光景。<br />
<a href='http://spring.sakurasaita.net/files/2008/02/inspiron1525inside.jpg' title='Inspiron1525キーボード' target='_blank'><img src='http://spring.sakurasaita.net/files/2008/02/inspiron1525inside_s.jpg' alt='Inspiron1525キーボード' /></a><br />
凄まじく安っぽい作りになっていた。<br />
パームレスト部分が安っぽいのは覚悟していたが、タッチパッドまでが同じ素材で作られているとは思わなかった。タッチパッドが筐体のへこみにしか見えない。<br />
キートップは若干違う作りになっていたが、同じと言っていいだろう。</p>
<p>とは言え、不満どころか「これぞDELL！」と思えてむしろ満足。新品にも関わらず液晶に指紋がついている辺り、押さえるポイントを分かっているとしか思えない。早速、付属の液晶クリーナーが活躍する運びとなった。</p>
<p>今回、付属OSとしてWindows Vista Home Premiumを購入したので、Aeroを楽しみながらVistaに慣れ親しんでみようと思う。</p>
]]></content:encoded>
			<wfw:commentRss>http://spring.sakurasaita.net/diary/37.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>WordpressにDownloadCounterを導入してみた</title>
		<link>http://spring.sakurasaita.net/wordpress/29.html</link>
		<comments>http://spring.sakurasaita.net/wordpress/29.html#comments</comments>
		<pubDate>Fri, 15 Feb 2008 23:21:51 +0000</pubDate>
		<dc:creator>Masa</dc:creator>
		
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://spring.sakurasaita.net/wordpress/29.html</guid>
		<description><![CDATA[先日、数独のソースコードをダウンロードできるようにしたが、せっかくなのでダウンロード数をカウントできるプラグインを導入してみた。実現可能なプラグインはいくつかあるようだったが、その中で便利そうに思えた下記のプラグインを採用させてもらった。
bovendeur.org：『Download Counter for Wordpress』
導入・設定
上記URLを辿ったページに「Downloading」という項があり、文中の「here」からダウンロードできる。最初、「here」にリンクが張られていることに気づかなくて、しばらく探してしまった。
ダウンロードしたファイルを解凍すると、「wp-downloadcounter」というフォルダが作られるので、フォルダごと「wp-content/plugins」ディレクトリにアップロードし、管理画面から有効にすればひとまず導入は完了となる。
導入完了後、管理画面から「管理」→「Downloads」と辿ると、下記のような画面が表示されるので、初期設定を行う。

「Use pretty links」のチェックを外し、「Save changes」ボタンで保存する。
「Use pretty links」の詳細については後述する「きれいなURLを使う」の項を参照してもらいたい。チェックするとURLの生成方法が変わるのだが、若干手間が必要になる。まずは、プラグインの動作を簡単に確認しておきたいのでチェックを外しておく。
最後に、ファイルをアップロードするディレクトリを用意する。既にそういった用途のディレクトリがある場合はそのまま使用していいし、新たにお好みのディレクトリを作成してもいい。私は「files」というディレクトリにいろいろなファイルをアップロードしているので、そこを使用することにした。
ダウンロード数をカウントさせてみる
ダウンロードさせるファイルを上記で作成した（作成されていた）ディレクトリにアップロードする。
アップロード完了後、管理画面から「管理」→「Downloads」を辿り、「Add Download」ボタンを押してファイルの登録画面に移動する。

「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」ファイルを作成し、下記のように編集する。
&#60;IfModule mod_rewrite.c&#62;
&#160;&#160;&#160;&#160;# 置換を有効にする
&#160;&#160;&#160;&#160;RewriteEngine On
&#160;&#160;&#160;&#160;# URL先頭から置換を開始する
&#160;&#160;&#160;&#160;RewriteBase /
&#160;&#160;&#160;&#160;# 先頭が「/download/」で始まる場合のみ置換する
&#160;&#160;&#160;&#160;RewriteCond %{REQUEST_URI} ^/download/
&#160;&#160;&#160;&#160;# 「download/文字列」を「?download=文字列」に置換する
&#160;&#160;&#160;&#160;RewriteRule ^download/(.+) ?download=$1 [L]
&#60;/IfModule&#62;
これでdownload以下へのアクセスは「?download=」にリダイレクトされるため、正常にアクセス出来るようになる。
もし、パーマリンク構造を変更していて、既に「.htaccess」ファイルが存在する場合は下記のように赤字を追記すれば良い。
&#60;IfModule mod_rewrite.c&#62;
&#160;&#160;&#160;&#160;RewriteEngine On
&#160;&#160;&#160;&#160;RewriteBase /
&#160;&#160;&#160;&#160;RewriteCond %{REQUEST_URI} ^/download/
&#160;&#160;&#160;&#160;RewriteRule ^download/(.+) ?download=$1 [L]
&#160;&#160;&#160;&#160;# DownloadCounterで使用するURLは置換対象から除く
&#160;&#160;&#160;&#160;RewriteCond %{REQUEST_URI} !^/download/
&#160;&#160;&#160;&#160;RewriteCond %{REQUEST_FILENAME} !-f
&#160;&#160;&#160;&#160;RewriteCond %{REQUEST_FILENAME} [...]]]></description>
			<content:encoded><![CDATA[<p>先日、数独のソースコードをダウンロードできるようにしたが、せっかくなのでダウンロード数をカウントできるプラグインを導入してみた。実現可能なプラグインはいくつかあるようだったが、その中で便利そうに思えた下記のプラグインを採用させてもらった。</p>
<p>bovendeur.org：<a href="http://projects.bovendeur.org/2007/07/06/download-counter/" target="_blank">『Download Counter for Wordpress』</a></p>
<h3>導入・設定</h3>
<p>上記URLを辿ったページに「Downloading」という項があり、文中の「here」からダウンロードできる。最初、「here」にリンクが張られていることに気づかなくて、しばらく探してしまった。</p>
<p>ダウンロードしたファイルを解凍すると、「wp-downloadcounter」というフォルダが作られるので、フォルダごと「wp-content/plugins」ディレクトリにアップロードし、管理画面から有効にすればひとまず導入は完了となる。</p>
<p>導入完了後、管理画面から「管理」→「Downloads」と辿ると、下記のような画面が表示されるので、初期設定を行う。<br />
<a href='http://spring.sakurasaita.net/files/2008/02/downloadcounter.jpg' title='DownloadCounter' target='_blank'><img src='http://spring.sakurasaita.net/files/2008/02/downloadcounter_s.jpg' alt='DownloadCounter' /></a><br />
「Use pretty links」のチェックを外し、「Save changes」ボタンで保存する。<br />
「Use pretty links」の詳細については後述する「きれいなURLを使う」の項を参照してもらいたい。チェックするとURLの生成方法が変わるのだが、若干手間が必要になる。まずは、プラグインの動作を簡単に確認しておきたいのでチェックを外しておく。</p>
<p>最後に、ファイルをアップロードするディレクトリを用意する。既にそういった用途のディレクトリがある場合はそのまま使用していいし、新たにお好みのディレクトリを作成してもいい。私は「files」というディレクトリにいろいろなファイルをアップロードしているので、そこを使用することにした。</p>
<h3>ダウンロード数をカウントさせてみる</h3>
<p>ダウンロードさせるファイルを上記で作成した（作成されていた）ディレクトリにアップロードする。<br />
アップロード完了後、管理画面から「管理」→「Downloads」を辿り、「Add Download」ボタンを押してファイルの登録画面に移動する。<br />
<a href='http://spring.sakurasaita.net/files/2008/02/downloadcounter2.jpg' title='DownloadCounterのファイル登録' target='_blank'><img src='http://spring.sakurasaita.net/files/2008/02/downloadcounter2_s.jpg' alt='DownloadCounterのファイル登録' /></a><br />
「Name」には任意の名前を、「URL」にはアップロードしたファイルのURLを入力し、「Save」ボタンで保存する。</p>
<p>画面下に登録したファイルの情報が表示され、ダウンロード数などが参照できるようになっている。<br />
「With counter」に張られたリンクからダウンロードするとダウンロード数がカウントされ、「Without counter」に張られたリンクではプラグインを通さないためカウントされない。よって、前者のURLを使用すれば良い。</p>
<h3>きれいなURLを使う（Use pretty links）</h3>
<p>通常、「http://（サイトのURL）/?download=sudoku」といったURLが生成されるが、見るからにCGI経由なので見栄えが良くない（と考える人がいるかもしれない）。そこで、「Use pretty links」と「Download slug」を使用する。</p>
<p>管理画面の英文を訳すと大体下記のようになる。</p>
<div class="frame">
<h4>Use pretty links</h4>
<p>ここをチェックすると、ダウンロードスラッグ（以下のDownload slugのこと）を使用したURLが生成されます。チェックしなかった場合、「/?download=<名称>」のようなURLが生成されます。</p>
<h4>Download slug</h4>
<p>この値を変更した場合、新しいダウンロードスラッグを反映させるために管理画面の「パーマリンク設定」からパーマリンク構造を更新する必要があります。あなたがパーマリンク構造を更新するまで、訪問者は「404 NOT FOUND」ページを受け取ることになります。</p></div>
<p>「Use pretty links」をチェックし、「Download slug」に任意のスラッグを入力する。ダウンロードスラッグは既存カテゴリーのスラッグと被らない方が無難だろう。ここでは「download」とする。</p>
<p>設定を保存すると、登録したファイルの「With counter」のURLが変更される。</p>
<div class="frame">http://spring.sakurasaita.net/?download=sudoku<br />
↓<br />
http://spring.sakurasaita.net/download/sudoku</div>
<p>プラグインで生成されるURLがダウンロードスラッグを使用したものに置き換わるだけということに注意しなければいけない。そのままでは、このURLにアクセスしても404 NOT FOUNDとなり、使用できない。解説に従えばパーマリンク構造を変更するらしいのだが、単にパーマリンク構造を変更しただけでダウンロードできるとも思えない。そこで、「.htaccess」ファイルを編集することにした。（もし、本来はその他の手順で行うべきなのだとしたら、ぜひお教えいただきたい）</p>
<p>「.htaccess」ファイルを作成し、下記のように編集する。</p>
<code>&lt;IfModule mod_rewrite.c&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># 置換を有効にする</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;RewriteEngine On<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># URL先頭から置換を開始する</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;RewriteBase /<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># 先頭が「/download/」で始まる場合のみ置換する</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;RewriteCond %{REQUEST_URI} ^/download/<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># 「download/文字列」を「?download=文字列」に置換する</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;RewriteRule ^download/(.+) ?download=$1 [L]<br />
&lt;/IfModule&gt;</code>
<p>これでdownload以下へのアクセスは「?download=<名称>」にリダイレクトされるため、正常にアクセス出来るようになる。<br />
もし、パーマリンク構造を変更していて、既に「.htaccess」ファイルが存在する場合は下記のように赤字を追記すれば良い。</p>
<code>&lt;IfModule mod_rewrite.c&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;RewriteEngine On<br />
&nbsp;&nbsp;&nbsp;&nbsp;RewriteBase /<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="point">RewriteCond %{REQUEST_URI} ^/download/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="point">RewriteRule ^download/(.+) ?download=$1 [L]</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># DownloadCounterで使用するURLは置換対象から除く</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="point">RewriteCond %{REQUEST_URI} !^/download/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;RewriteCond %{REQUEST_FILENAME} !-f<br />
&nbsp;&nbsp;&nbsp;&nbsp;RewriteCond %{REQUEST_FILENAME} !-d<br />
&nbsp;&nbsp;&nbsp;&nbsp;RewriteRule . /index.php [L]<br />
&lt;/IfModule&gt;</code>
<p>これで、エントリーへのリクエストとダウンロードへのリクエストの両方を扱えるようになる。</p>
<h3>動作確認時の注意点</h3>
<p>「Use pretty links」の確認を行う場合、一度ブラウザのキャッシュをクリアした方がいい。<br />
いろいろなパターンの設定を試していた時、正常にダウンロードできるはずなのにダウンロードできない、ダウンロードできないはずなのに正常にダウンロードできるといったことがあったからだ。念のため、ブラウザのリクエストヘッダを確認してみたところ、期待しない動作の場合はそもそもリクエストヘッダが送信されていなかった。そこでキャッシュをクリアしたところ、期待通りの動作を行うようになった。</p>
<h3>まとめ</h3>
<p>以上でDownloadCounterの設定は完了となる。<br />
個人的には、「Use pretty links」は使用しないで「?download=<名称>」とする方がダウンロードされるんだなということがはっきりするので好みかもしれない。</p>
<p>ファイルがダウンロードされたということは、少なくともエントリーに興味をもってくれた人がいたということになるので、単にアクセス数が伸びるよりもうれしい。今後もDonwloadCounterを活用させてもらおうと思う。</p>
<h3>.htaccessの説明</h3>
<p>上記で作成した「.htaccess」ファイルだが、Apacheにあまり馴染みの無い方は内容を把握しきれないかもしれない。把握していない設定を使用するのも気持ち悪いと思うので、簡単に説明しようと思う。本項はDownloadCounterの設定には直接関係ないので読み飛ばしても何ら問題無い。</p>
<code>&lt;IfModule mod_rewrite.c&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;～<br />
&lt;/IfModule&gt;</code>
<p>これは「mod_rewrite」モジュールがロードされている場合のみ、タグに囲われたディレクティブを読み込ませるために記述する。実際の置換には関わらない部分であり、保険のために記述する。</p>
<code>RewriteEngine On</code>
<p>置換エンジンを有効にする。もし、置換をやめたい場合、「On」→「Off」とすれば、せっかく書いた置換ルールを削除しないで置換をやめることができる。</p>
<code>RewriteBase /</code>
<p>URLのどの部分から置換を開始するのかを指定する。<br />
RewriteBaseディレクティブを省略すると、ローカルのファイルパスが使用されてしまう。「/index.php」がローカルのパスでは「/var/www/html/index.php」となっている場合、後者が使用されることになる。これは大抵期待外れなので、常にきっちりと指定した方が良い。</p>
<code>RewriteCond %{REQUEST_URI} ^/download/</code>
<p>RewriteCondディレクティブは置換対象の条件を指定する。<br />
%{REQUEST_URI}は、リクエストヘッダのリソース部分を扱える。リクエストヘッダが「GET /perl/28.html HTTP/1.1」だとすると、「/perl/28.html」となる。<br />
上記例ではリソースの先頭が「/download/」で始まるURLを置換対象としてくれ、という意味になる。</p>
<code>RewriteRule ^download/(.+) ?download=$1 [L]</code>
<p>RewriteRuleディレクティブは、RewriteCondディレクティブの条件に合致したURLを実際に置換する。<br />
URLの先頭「download/（何かの文字列）」を「?donwload=（何かの文字列）」に置換している。「$1」とは、置換元文字列の括弧で囲まれた部分を使用するよという意味になる。括弧が複数個ある場合は、「$1」「$2」「$3」と数字を増やしていけばいい。<br />
末尾に記載されている「[L]」はLastのことで、このRewriteRuleディレクティブで置換されたURLは置換を終了するという意味だ。これ以降にもRewriteRuleディレクティブが指定されている場合に期待しない置換が行われることを防いでくれる。</p>
<code>RewriteCond %{REQUEST_URI} !^/download/<br />
RewriteCond %{REQUEST_FILENAME} !-f<br />
RewriteCond %{REQUEST_FILENAME} !-d<br />
RewriteRule . /index.php [L]</code>
<p>1行目は、リソースの先頭が「/download/」で始まらないURLを置換対象としてくれ、という意味になる。記述しなくても、問題ないので単なる保険だ。</p>
<p>2~3行目で使用されている%{REQUEST_FILENAME}はファイルのローカルパスを扱える。「/index.php」がローカルのパスでは「var/www/html/index.php」となっている場合、後者が使用される。「-f」「-d」という記述は、「ファイルだったら置換対象」「ディレクトリだったら置換対象」の意味だ。しかし、先頭に「!」が付いているため真偽が逆になり、「ファイルでなかったら」「ディレクトリでなかったら」となる。<br />
つまり、2~3行目はローカルのパスでチェックして、ファイルでもディレクトリでもない（要は存在しない）ファイルへのリクエストだったら置換対象としてくれ、という意味になる。</p>
<p>4行目は、リソースをindex.phpに置換している。パーマリンク構造の細かな解析はindex.php内で行われているのだろう。末尾の「[L]」は、先の説明と同様となる。</p>
<p>もっと細かく知りたい場合は下記のリンクを参照して欲しい。<br />
<a href="http://www.net-newbie.com/trans/mod_rewrite.html" target="_blank">Apache module mod_rewrite</a></p>
]]></content:encoded>
			<wfw:commentRss>http://spring.sakurasaita.net/wordpress/29.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Perlで数独（ナンプレ）を解く</title>
		<link>http://spring.sakurasaita.net/perl/28.html</link>
		<comments>http://spring.sakurasaita.net/perl/28.html#comments</comments>
		<pubDate>Mon, 11 Feb 2008 15:30:14 +0000</pubDate>
		<dc:creator>Masa</dc:creator>
		
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://spring.sakurasaita.net/perl/28.html</guid>
		<description><![CDATA[バレーボール関係で埋まりかけた連休の合間を見て、数独を解く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 [...]]]></description>
			<content:encoded><![CDATA[<p>バレーボール関係で埋まりかけた連休の合間を見て、数独を解くPerlスクリプトを書いたので、ネタにしようと思う。（自宅サーバネタはまた間に合わなかった）</p>
<p><a href="http://ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC" target="_blank">Wikipedia：数独</a></p>
<p>上記URLに画像が紹介されている一番ポピュラーな縦9マス横9マスの問題の場合、各列には1～9の数字が1つだけ入り、各行にも1～9の数字が1つだけ入る。更に3×3の正方形内にも1～9の数字が独立して入る。この3つのルールに違反しない数字を書くマスに埋めていくのが数独だ。間違った数字を入れてしまうとどこかで矛盾が生じてしまい、全マスに数字を収められなくなってしまう。逆を取れば、全マスに数字を収められればそれが正解となる。</p>
<p>今回作成したスクリプトは、まず最初のマスに適当に数字を入れ、次のマスへ移動する。そこでも適当に数字を入れる。入れられる数字が無かった場合、1つ前のマスに戻り別の数字を入れ、また次のマスへ移動し、入れられる数字があれば入れていく。これを全マスに数字を収められるまで繰り返していく。いわゆるバックトラックという手法になる。（芸が無いと言えばそれまでだが）</p>
<p>スクリプトは以下のように使用する。</p>
<code>perl sudoku.pl question.txt</code>
<p>「question.txt」（ファイル名は任意）には、空きマスは「0」として空白区切りで下記のように問題を記述する。</p>
<code>0 0 3 5 1 2 0 0 0<br />
0 1 0 0 4 0 3 2 0<br />
6 0 0 0 8 0 0 4 0<br />
3 0 0 0 0 4 0 0 6<br />
1 4 9 0 0 0 7 8 5<br />
5 0 0 9 0 0 0 0 4<br />
0 3 0 0 9 0 0 0 2<br />
0 5 8 0 3 0 0 1 0<br />
0 0 0 1 2 5 8 0 0</code>
<p>これを実行し問題を解くことが出来た場合、空きマスの「0」が数字に書き換えられた「question-answer.txt」が生成される。</p>
<code>4 7 3 5 1 2 9 6 8<br />
8 1 5 6 4 9 3 2 7<br />
6 9 2 3 8 7 5 4 1<br />
3 2 7 8 5 4 1 9 6<br />
1 4 9 2 6 3 7 8 5<br />
5 8 6 9 7 1 2 3 4<br />
7 3 1 4 9 8 6 5 2<br />
2 5 8 7 3 6 4 1 9<br />
9 6 4 1 2 5 8 7 3 </code>
<p>例では9×9の問題を使用しているが、もっと大きな問題でも解くことができる（はず）。問題に無理がある場合はもちろん失敗してしまう。問題があっているのに失敗することは無いが、あったらごめんなさい。</p>
<p><a href="javascript:;" class="switchopen" id="20080211mana" onclick="SwitchDisplayBlockElementById('20080211mana','20080211');">ここをクリックでコードの表示・非表示を切り替える。</a></p>
<code id="20080211" style="display: none;">use strict;<br />
use FileHandle;<br /><br />
our @cells = (''); <span class="comment"># ゲーム面 ※添え字は1から計算したいので先頭に空欄を入れる</span><br />
our $maxnum;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># 使用する最大数値</span><br />
our $blockbasenum; <span class="comment"># 各ブロックの1辺のマス数</span><br />
our @chkblock;&nbsp;&nbsp;&nbsp;&nbsp;   <span class="comment"># 各ブロックの使用済み数値</span><br />
our @chkrow;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># 各行の使用済み数値</span><br />
our @chkcol;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># 各列の使用済み数値</span><br /><br />
my $fh = new FileHandle;<br />
my $fquestion = $ARGV[0];<br /><br />
<span class="comment">### 問題読込 ###</span><br />
if(!(-f $fquestion)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;print "$fquestionは存在しないか、ファイルじゃないよ。\n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;exit 0;<br />
}<br /><br />
open($fh, $fquestion) || die;<br />
while(&lt;$fh&gt;){<br />
&nbsp;&nbsp;&nbsp;&nbsp;chomp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;push @cells, ['',split(/ /, $_)]; <span class="comment"># 添え字は1から計算したいので先頭に空欄を入れる</span><br />
}<br />
close($fh);<br /><br />
<span class="comment">### ゲーム面の情報取得 ###</span><br />
$maxnum = @{$cells[1]} - 1;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># 最大値</span><br />
$blockbasenum = sqrt($maxnum);   <span class="comment"># 各ブロックの1辺のマス数</span><br /><br />
<span class="comment">### セット済みの数字を取得 ###</span><br />
<span class="comment"># 初期化</span><br />
foreach my $num (1..$maxnum){<br />
&nbsp;&nbsp;&nbsp;&nbsp;$chkrow[$num] = [];<br />
&nbsp;&nbsp;&nbsp;&nbsp;$chkcol[$num] = [];<br />
&nbsp;&nbsp;&nbsp;&nbsp;$chkblock[$num] = [];<br />
}<br />
<span class="comment"># セット</span><br />
for(my $row = 1; $row &lt;= $maxnum; $row++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;$chkrow[$row] = [grep($_ != 0, @{$cells[$row]})];<br /><br />
&nbsp;&nbsp;&nbsp;&nbsp;for(my $col = 1; $col &lt;= $maxnum; $col++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($cells[$row]-&gt;[$col] != 0){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push @{$chkcol[$col]}, $cells[$row]-&gt;[$col];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push @{$chkblock[&#038;GetBlockNo($col, $row)]}, $cells[$row]-&gt;[$col];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br /><br />
<span class="comment">### 解読開始 ###</span><br />
if(&#038;SetNumberInCell(1, 1) == 0){<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># 解読成功 → 結果出力</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;$fquestion .= '-answer.txt'&nbsp;&nbsp;&nbsp;&nbsp;if($fquestion !~ s|^(.+)(\.[^.]+)|$1-answer$2|);<br /><br />
&nbsp;&nbsp;&nbsp;&nbsp;open($fh, "&gt;$fquestion") || die;<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(my $row = 1; $row &lt;= $maxnum; $row++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(my $col = 1; $col &lt;= $maxnum; $col++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $num = $cells[$row]-&gt;[$col];<br /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print $fh ' ' x (length($maxnum) - length($num)), $num, " ";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print $fh "\n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;close($fh);<br /><br />
&nbsp;&nbsp;&nbsp;&nbsp;print "完了しました。\n";<br />
}else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># 解読失敗</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;print "失敗しました。\n";<br />
}<br /><br />
exit 0;<br /><br />
<span class="comment">##########################################<br />
# セルに数字をセット<br />
#<br />
##########################################</span><br />
sub SetNumberInCell{<br />
&nbsp;&nbsp;&nbsp;&nbsp;my ($col, $row) = @_;<br />
&nbsp;&nbsp;&nbsp;&nbsp;my ($ncol, $nrow);<br /><br />
&nbsp;&nbsp;&nbsp;&nbsp;if($cells[$row]-&gt;[$col] != 0){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># 数字がセット済みの場合</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;($ncol, $nrow) = &#038;GetNextCell($col, $row);<br /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ($ncol == -1 &#038;& $nrow == -1) ? 0 : &#038;SetNumberInCell($ncol, $nrow) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># 数字が未セットの場合</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach my $num (&#038;GetNumberList($col, $row)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># 数字セット</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cells[$row]-&gt;[$col] = $num;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># 使用済み情報セット</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push @{$chkrow[$row]}, $num;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push @{$chkcol[$col]}, $num;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push @{$chkblock[&#038;GetBlockNo($col, $row)]}, $num;<br /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># 次セルの座標取得</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;($ncol, $nrow) = &#038;GetNextCell($col, $row);<br /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last&nbsp;&nbsp;&nbsp;&nbsp;if($ncol == -1 &#038;& $nrow == -1);&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># 次セル無し</span><br /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># 次セルを処理</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&#038;SetNumberInCell($ncol, $nrow) == 0){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># 次セル以降、セット完了</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># 次セルのセット失敗 → 別の番号セットのため、現在セルのセット情報クリア</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cells[$row]-&gt;[$col] = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop @{$chkrow[$row]};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop @{$chkcol[$col]};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop @{$chkblock[&#038;GetBlockNo($col, $row)]};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ($cells[$row]-&gt;[$col] != 0) ? 0 : 1;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment"># {0}:セット成功／{1}:セット失敗</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br /><br />
<span class="comment">##########################################<br />
# 指定セルにセット出来る数字一覧を取得<br />
#<br />
##########################################</span><br />
sub GetNumberList{<br />
&nbsp;&nbsp;&nbsp;&nbsp;my ($col, $row) = @_;<br />
&nbsp;&nbsp;&nbsp;&nbsp;my %num;<br /><br />
&nbsp;&nbsp;&nbsp;&nbsp;@num{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@{$chkrow[$row]},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@{$chkcol[$col]},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@{$chkblock[&#038;GetBlockNo($col, $row)]}<br />
&nbsp;&nbsp;&nbsp;&nbsp;} = ();<br /><br />
&nbsp;&nbsp;&nbsp;&nbsp;return grep(!(exists $num{$_}), 1..$maxnum);<br />
}<br /><br />
<span class="comment">##########################################<br />
# ブロック番号を取得<br />
#<br />
##########################################</span><br />
sub GetBlockNo{<br />
&nbsp;&nbsp;&nbsp;&nbsp;my ($col, $row) = @_;<br /><br />
&nbsp;&nbsp;&nbsp;&nbsp;return (int(($col - 1) / $blockbasenum) * $blockbasenum) + int(($row - 1) / $blockbasenum) + 1<br />
}<br /><br />
<span class="comment">##########################################<br />
# 次セルの座標を取得<br />
#<br />
##########################################</span><br />
sub GetNextCell{<br />
&nbsp;&nbsp;&nbsp;&nbsp;my ($col, $row) = @_;<br /><br />
&nbsp;&nbsp;&nbsp;&nbsp;if($col == $maxnum &#038;& $row == $maxnum){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 次セル無し<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$col = -1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$row = -1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}elsif($row == $maxnum){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 次列<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$col++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$row = 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 次行<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$row++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />
&nbsp;&nbsp;&nbsp;&nbsp;return ($col, $row);<br />
}</code>
<p>需要は無いだろうけど、ダウンロードは下記からどうぞ。</p>
<p><a href="http://spring.sakurasaita.net/?download=sudoku">ダウンロード</a></p>
<p>バグがあった場合は、ぜひご連絡を。</p>
<p>今度はイラストロジックを解くスクリプトにでも挑戦してみようかなと思う。</p>
]]></content:encoded>
			<wfw:commentRss>http://spring.sakurasaita.net/perl/28.html/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
