2006年8月31日木曜日

気がつけばもう「共通シール」…スヌーピーボウルの引換は9月7日まで

先ほどちょっと外にでてみたら、おや、涼しい!?
日中はまだ暑いですが、もう、夏も終わりに近づいてるのですね。
夕方、暗くなるのも、だいぶ早くなってきました。



今年の夏は・・・何もなかったけど・・・いや、今年は秋にあるんですよ、あれが!



☆ ☆ ☆ ☆ ☆ 



ふと気がつけば、某コンビニで商品に貼り付けられているシールが、今日から「共通シール」に切り替わっていました。



200608301



8月のスヌーピーボウルの引換は、9月7日(木曜日)までです。共通シールも、同じく9月7日までとのことです。お忘れなく。



なお9月は、マグカップ。これで今回のスヌーピー・フェアはおしまいです。



以前のように、むやみやたらに数をたくさん集めるのは、もう止めにしました。とりあえず、3個になったので、終了。あまったシールは、「抽選で当たるコース」のほうへ、まわすことにしました。



200608302





■ 過去記事





2006年8月30日水曜日

sedを使ったテキスト書き換え処理を覚えよう

ここでいうsedというのは「Stream EDitor」の略で、UNIXでは大昔から使われている、テキストファイルを書き換える処理を自動化できる、プログラムのことです。たぶん、最近では、SEDというと、薄型ディスプレイの表示方式のことを思い浮かべることが多いかもしれません。



現在では、perlのほうがsedよりも、ずっと高度な処理ができるので、テキスト整形処理なんかも、sedよりはperlを使う人が多いんじゃないかと思います。でも、シェルスクリプト(sh, bash)で高度なことをやるときには、sedがよく使われます。プログラムをコンパイルするときにおなじみのconfigureスクリプトでも、sedがたくさん使用されているはずです。



・・・で、このsedですが、「sedを使いこなせる人って、なんかカッコイイ!」と思わせる、魔性の魅力があったり、なかったり・・・ないのかよ?!



sedってのは、どんなものかというと、

「テキストを整形するルール」をsedのコマンドで書いておき、そのコマンドと、入力データとなるテキストファイルをsedに与えると、テキスト整形処理をsedが自動で行ってくれる

ってものです。簡単な例を挙げます。



sample.txtというテキストファイルがあったとして、そのなかに「ABCDEFG」と書いてあったとします。

% sed 's/ABC/abc/' sample.txt > output.txt

というコマンドを実行すると、output.txtというファイルができて、その中身は、「abcdDEFG」となります。



s/ABC/abc/」というのがsedのコマンドです。「s」は文字列置換処理のコマンドであり、この場合、ABCという文字列をabcに置換しなさい、という意味になります。



ファイル名を指定しない場合は、標準入力から読み込んで、標準出力へ書き出します。



こんな感じになります。

% sed 's/ABC/abc/'
ABCDEFG  ← と文字列を入力すると
abcDEFG   ← sedが、このように出力する
(最後に[ctrl]+[d]を押して、終了してください)



以下では、実用的な課題を示して、sedの活用事例を紹介します。



■ 課題:  RSSのリンクにある「?ref=rss」を削除したい!



最近、RSSがあちこちのWebサイトで提供されるようになりました。



さて個人的に、ちょっと困ったことがあります。RSSの中に書かれているリンクが、「http://ほげほげ~/なんとか/かんとか?ref=rss」となっていて、なんだかお尻に「?ref=rss」というのがついてます。



例をあげると、Impress Watchのサイトのひとつ、

PC WatchのRSS
http://pc.watch.impress.co.jp/sublink/pc.rdf

にも、“?ref=rss”がくっついています。



たぶん、Webサイトの運営者側にとっては、RSSリーダからリンクをたどってきた、という情報を知りたいという希望があるかもしれないし、または、RSSからたどってきたときには、表示内容を変化させる、ということもできるんだと思うわけですが、現状、そのようなことをやっているのを見たこともきいたこともありません。



別についててもいいじゃん、と思うかもしれませんが、Webブラウザでは、?ref=rssがついているリンクと、ついていないリンク、この2つを別物として扱っています。そのため、1度、RSSのほうから見たウェブページでも、ウェブページ内にならんでいる記事の見出し一覧のリンク(?ref=rssはついていない)は、「既読状態」にならないので、

すでに見たことのあるページなのに、見たことになっていないので、うっとうしい

と思ってしまうのです。まちがえて、1度見たものを、また見てしまうとか・・・ あ~時間がもったいない。



というわけで、RSSのリンク中の「?ref=rss」を削除する処理を、sedでやってみることにします。



● 方針



  • wgetコマンドでRSSをダウンロードします


  • ダウンロードしたRSSを、sedで書き換えます(?ref=rssを削除)


  • 書き換え後のファイルを、自前の(ローカルな)Webサイトにおいておき、Webブラウザ(RSSリーダ)では、その書き換え後のRSSを参照するようにします


  • cronなどで、1,2の処理を自動実行するようにすると、より実用的になりますね。




今回は、sedの紹介がメインなので、Webサイトに置くとか、cronとかの話は、割愛します。



■ wgetでRSSをダウンロード



本筋からずれるので、簡単に触れるだけにしておきますが、「wget URL」と実行すれば、URLのページをダウンロードして、ファイルに保存できます。



というわけで、こうなります。



% wget http://pc.watch.impress.co.jp/sublink/pc.rdf
--XX:XX:XX--  http://pc.watch.impress.co.jp/sublink/pc.rdf
           => `pc.rdf'
Resolving pc.watch.impress.co.jp... 210.173.173.73
Connecting to pc.watch.impress.co.jp|210.173.173.73|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7,113 (6.9K) [text/plain]



100%[====================================>] 7,113         --.--K/s



XX:XX:XX (200.41 KB/s) - `pc.rdf' saved [7113/7113]



pc.rdfというファイル名で保存されました。



ちなみに、すでにカレントディレクトリに「pc.rdf」というファイルがあるときは、pc.rdf.1のように、別の名前で保存されます。



■ sedで書き換える



最初に例を示したように、sedで文字列を置換するときは、「sコマンド」を使います。



sコマンドの基本的な書式は、こうなります。

s/置換対象の文字列/置換後の文字列/フラグ

フラグ」は、置換処理のときの挙動の詳細を指定するものです。sedは、行単位で処理をしていくのですが、通常は、1行中で、最初にマッチした文字列のみを置換します。フラグとして「g」を指定すると、マッチするものすべてが置換されます。



「/」は、デリミタ(delimiter、区切り文字)というものです。「/」を使いましたが、実は、「:」とか「-」とか、自由に選ぶことができます。



% sed 's-ABC-abc-g'
ABCDEFG ABCDEFG ABCDEFG
abcDEFG abcDEFG abcDEFG



「?ref=rss」を削除するには、置換対象を「?ref=rss」にして、置換後は空っぽの文字列にします。



よって、こうなります。

% sed 's/?ref=rss//g' pc.rdf > pc-new.rdf

これで、pc-new.rdfというファイルができます。



■ うまく処理できているかdiffで確認



2つのテキストファイルを比較する「diff」コマンドを使って、書き換えがうまくいっているか、確認してみます。



なおRSSファイルは、UTF-8という文字コードで書かれているので、操作環境によっては正常に表示されません。「nkf」コマンドで文字コードを変換するとよいでしょう。「nkf -e」ならEUC日本語、「nkf -s」なら日本語シフトJISに変換されます。



% diff -u pc.rdf pc-new.rdf | nkf -e



(一部を抜粋)



-<item rdf:about="http://pc.watch.impress.co.jp/docs/2006/0829/nec3.htm?ref=rss">
+<item rdf:about="http://pc.watch.impress.co.jp/docs/2006/0829/nec3.htm">
<title>NEC、ワンセグ搭載のエンタメノート「LaVie A」</title>
- <link>http://pc.watch.impress.co.jp/docs/2006/0829/nec3.htm?ref=rss</link>
+ <link>http://pc.watch.impress.co.jp/docs/2006/0829/nec3.htm</link>
<dc:date>2006-08-29T11:15:00+09:00</dc:date>
</item>



行頭に「-」マークがついているほうが、pc.rdfの行(置換前)、そして、「+」マークがついているほうが、pc-new.rdfの行(置換後)です。「+」も「-」もどちらもついていない行は、2つのファイル間で同一な行です。通常、diffでは、違いのある範囲の、前後数行だけが表示されます。同一の行は、省略され、表示されません。



diffの結果を見てみると、どうやらうまく処理できたようです。?ref=rssが削除されてますね。





■ ちょっと高度なsedの使い方



sコマンドの使い方、なんとなく、理解できてきましたか?さらに、sedの正規表現とか覚えると、もっともっとsedを活用できるようになります。



さてさて、ここでは、より高度なsedの使い方を紹介します。perlを使わなくても、sedで、これくらいできちゃう、っていう、少しだけ技巧的な使用例です。ちょっとパズルみたいで、難しいかもしれないんですが・・・



● 課題2 このRSSの書き換えはどうすればいいのか?



同じImpress Watchのサイトなんですが、「INTERNET Watch」の場合、なぜか、RSSの作り方が違います。どうやら、RSSで広告配信を行う会社経由で、RSS配信されるようになっています。



INTERNET WatchのRSS
http://internet.watch.impress.co.jp/cda/rss/internet.rdf


このRSSの中身は、こんな風になっています。



<item rdf:about="http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html">
<title>サイボウズ製品に脆弱性、修正プログラムが公開</title>
<link>http://www.pheedo.jp/click.phdo?i=4fba32a5b7d9db0e6a5be8003a294eeb</link>
<pheedo:origLink>http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html</pheedo:origLink>
<dc:date>2006-08-28T14:21:47+09:00</dc:date>
<description>&lt;br style=&quot;clear: both;&quot;/&gt;  &lt;img alt=&quot;&quot; style=&quot;border: 0;&quot; border=&quot;0&quot;src=&quot;http://www.pheedo.jp/img.phdo?i=4fba32a5b7d9db0e6a5be8003a294eeb&quot;/&gt;
</description>
</item>



実際にRSSリーダでみると、リンクのURLは、「http://www.pheedo.jp/click.phdo?i=4fba32a5b7d9db0e6a5be8003a294eeb」というものになっていて、こちらの場合は、「?ref=rss」を削除すればいい、っていう単純なものではないようです。



さて~、このURLでアクセスすると、Webサーバからは、



Location: http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html



というように、Locationヘッダによって、別のURLへリダイレクトが行われます。



おや?よく見ると、これって、さっきの、<item rdf:about="http://~~~ の部分に書かれているURLですよね?



ということは、<link>の部分にあるURLを、<item rdf:about=~~~>の部分にあるURLで置き換えてやればいいじゃないか!、ということになります。



これを、sedでやってみましょう、ということです。


■ パターンスペースと、ホールドスペース



さきほどsedは、行単位で処理をする、と少しだけ触れたのですが、そのsedが読み込んだ行は、一度、「パターンスペース」というところに保存されます。実は、置換を行う「s」コマンドは、パターンスペースに対して、置換処理を行うコマンドです。



パターンスペースとは別に、ホールドスペースという、データ置き場もあります。この2つのデータ置き場の間で、データを入れ替るコマンドがあり、2つの置き場をうまく利用することで、今回の課題を解決できるようになります。



■ sedのコマンドファイル



sedは、いくつものコマンドを列挙して指定することができます。たくさんコマンドを指定するときは、そのコマンドを記述したファイルを用意しておくと便利です。



たとえば、abc.sedというファイルを作成しておき、内容は

s/ABC/abc/g
s/XYZ/xyz/g

とでもしておきましょう。



sedコマンドを記述したファイルは、sedには「-f ファイル」オプションで指定します。



こんな感じになります。

% sed -f abc.sed
ABCDEF XXXYZZZ ABCD XXYYZZ  (入力した文字列)
abcDEF XXxyzZZ abcD XXYYZZ  (sedの処理結果)


■ sedのアドレス指定



これまで示したsコマンドの例は、入力されたすべての行に対して、sedは処理を行います。



「アドレス指定」というのを追加すると、特定の行だけ、処理するようにできます。



例: 1行目から、3行目までだけを、処理する

% sed '1,3s/ABC/abc/'
ABCDEF  (入力の1行目)
abcDEF
ABCDEF  (入力の2行目)
abcDEF
ABCDEF  (入力の3行目)
abcDEF
ABCDEF  (入力の4行目)
ABCDEF
ABCDEF  (入力の5行目)
ABCDEF

「1,3」というのが、「1行目から3行目まで」というアドレス指定です。4行目、5行目は、確かに置換されていません。



行番号ではなく、パターンマッチする文字列で指定することもできます。



例:行頭がXの行だけ、処理する

% sed '/^X/s/ABC/abc/'
XXX ABCDEF  (入力)
XXX abcDEF
XYZ ABCDEF  (入力)
XYZ abcDEF
YYY ABCDEF  (入力)
YYY ABCDEF

「^X」というのは、「行頭がXである」という意味の正規表現です。「/^X/」が、アドレス指定になります。たしかに「YYY ABCDEF」の行頭はXではないので、置換処理が行われていません。



■ 課題2の解答例



もういきなり答を出してしまいますが、こうなります。



sedのコマンドファイルは、こうなりました。



「internet.sed.txt」をダウンロード



% cat internet.sed
/<item rdf:about="http:\/\/internet.watch.impress.co.jp/ {
        h
        s/<item rdf:about="/<link>/
        s/">/<\/link>/
        s/?ref=rss//
        x
}
/<link>http:\/\/www.pheedo.jp\// {
        g
}



実行例



% wget http://internet.watch.impress.co.jp/cda/rss/internet.rdf
(index.htmlというファイル名で保存されました)



% sed -f internet.sed index.html >index-new.html



diffで比較してみます。
% diff -u index.html index-new.html



(一部抜粋)



<item rdf:about="http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html">
<title>サイボウズ製品に脆弱性、修正プログラムが公開</title>
-<link>http://www.pheedo.jp/click.phdo?i=4fba32a5b7d9db0e6a5be8003a294eeb</link>
+<link>http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html</link>

<pheedo:origLink>http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html</pheedo:origLink>
<dc:date>2006-08-28T14:21:47+09:00</dc:date>



うまく置換されたようです。


● 解説



sedのコマンドファイルを見ていきましょう。



/<item rdf:about="http:\/\/internet.watch.impress.co.jp/ {
        h
        s/<item rdf:about="/<link>/
        s/">/<\/link>/
        s/?ref=rss//
        x
}
/<link>http:\/\/www.pheedo.jp\// {
        g
}



まずは1行目。



/<item rdf:about="http:\/\/internet.watch.impress.co.jp/ {



これは、先ほどあった、sedのアドレス指定を、文字列のパターンマッチで行っている記述です。
RSSファイル中に、似たような文字列が別の箇所にも登場していたため、やや長めのパターンを指定しています。



「http:\/\/」のところが、ちょっと奇妙に見えるかもしれません。これは、もともと「http://」だったのですが、アドレス指定の「/~~~/」の中に、/を書くと、アドレス指定を閉じる「/」記号になってしまうため、「\」マークをつけて、エスケープ処理を行っています。つまり「/」をここに書きたいので、これは閉じるの「/」じゃないですよ、と指示しているのです。



「{」ですが、sedでは、{ ~ }で囲まれた部分が、一塊のものとして、連続して実行されていきます。



2行目の「h」は、hコマンド。ホールドスペースの内容を、パターンスペースの内容で置き換えるコマンドです。コピー&ペーストみたいな処理だと思ってください。あとで詳しく解説します。



3行目は、「s」なので、おなじみの置換コマンドですね。「<item rdf:about="」という文字列を、「<link>」へ置換します。



4行目も置換。「">」という文字列を「</link>」へ置換しています。ただ、ここでも置換後の文字列に「/」という文字が含まれてしまっているので、代わりに「\/」と書いて、エスケープ処理を行っています。



5行目も置換。「?ref=rss」という文字列を削除しています。



6行目の「x」は、xコマンド。パターンスペースの内容と、ホールドスペースの内容を、交換します。最初にhコマンドで、置換前の文字列をホールドスペースにコピーしてあったので、結局、パターンスペースには最初の文字列が入り、ホールドスペースに、置換後の文字列が入ることになります。



7行目の「}」は、ここで一連の処理がおしまい、の意味。



8行目。/<link>http:\/\/www.pheedo.jp\// {
これは、1行目と同様で、アドレス指定です。
もしも「<link>http://www.pheedo.jp/」という文字列があったら・・・の意味です。



8行目のgコマンドは、パターンスペースの内容を、ホールドスペースの内容で置き換えます。「h」コマンドの逆の働きですね。


以上の処理の流れを、わかりやすく見ていきましょう。



(備考: なぜかブラウザによっては、右端のほうが切れてしまい、表示されないことがあるようです。申し訳ありませんが、その点、ご容赦ください)



今、次のような行が、入力されてきました。



<item rdf:about="http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html">



2行目のアドレス指定の条件にマッチしますので、{~}内の処理が開始されます。
hコマンドにより、ホールドスペースへテキストがコピーされ、以下のようになります。



パターンスペースの内容
<item rdf:about="http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html">



ホールドスペースの内容
<item rdf:about="http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html">



sコマンドで、パターンスペースの内容が置換されます。



パターンスペースの内容
<link>http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html">



ホールドスペースの内容
<item rdf:about="http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html">



次のsコマンドで置換され、こうなります。



パターンスペースの内容
<link>http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html</link>



ホールドスペースの内容
<item rdf:about="http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html">



次のsコマンド、「s/?ref=rss//」ですが、ここでは、「?ref=rss」がないので、何も変化しません。ちなみに、



Enterprise WatchのRSS
http://enterprise.watch.impress.co.jp/cda/rss/enterprise.rdf



には、「?ref=rss」がついていました。こちらをsedで処理する場合には、「?ref=rss」が、この段階で削除されます。



さて、sedコマンドの動きの解説のつづきに戻りましょう。



xコマンドがあるので、2つの内容が交換されます。



パターンスペースの内容
<item rdf:about="http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html">



ホールドスペースの内容
<link>http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html</link>



これまで説明していませんでしたが、sedでは、デフォルトの挙動として、一連のsedコマンドの処理が完了すると、パターンスペースの内容が、標準出力へ書き出されます。



よって、標準出力へは



<item rdf:about="http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html">



が出力されます。注意!ホールドスペースの内容は、まだそのまま残っていますよ!



入力ファイルがどんどんすすんでいき、



<link>http://www.pheedo.jp/click.phdo?i=4fba32a5b7d9db0e6a5be8003a294eeb</link>



という行を、sedが読み込みました。こうなります。



パターンスペースの内容
<link>http://www.pheedo.jp/click.phdo?i=4fba32a5b7d9db0e6a5be8003a294eeb</link>



ホールドスペースの内容
<link>http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html</link>



パターンスペースの内容が、/<link>http:\/\/www.pheedo.jp\// というアドレス指定にマッチします。よって、gコマンドが実行されます。



パターンスペースの内容
<link>http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html</link>



ホールドスペースの内容
<link>http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html</link>



そして、最終的に、標準出力へは、パターンスペースの内容である、



<link>http://internet.watch.impress.co.jp/cda/news/2006/08/28/13096.html</link>



が出力されます。



どうです?理解できましたか?


なお、sedに「-n」というコマンドラインオプションを指定すると(たとえば、sed -n 's/ABC/abc/'のように)、“最後にパターンスペースの内容を出力する”というデフォルトの処理が行われなくなります。これに関連するsedコマンドとして、sedコマンドには「p」というコマンドがあります。これは、パターンスペースの内容を、標準出力へ書き出すコマンドです。



また、sコマンドのフラグにも「p」があります。sed -n 's/ABC/abc/p' とすれば、置換した行だけが出力されるようになります。



「-n」オプションと「p」コマンドを覚えておけば、grepのように特定の行だけ抽出して加工する、といった処理が、sedだけで行えますね。

【ちょっとしたネタ】



「grep」ってコマンド、英語にはそんな単語はないのですけれども、どういう意味か知ってます?昔はそういったコネタが雑誌記事で紹介されていたりしたものですが、最近はどうなんでしょうか。



grepは、global regular expression printの略だと、私は昔教わりました。



かつて、まだコンピュータの性能がずっと低かったころ、「ed」という名前のテキストエディタが使われていました。MS-DOSのedlinみたいなもの・・・って知ってる人少ないか・・・ラインエディタと呼ばれる種類の、原始時代のような太古のテキスト編集ツールです。有名なviというエディタ~viも原始時代ほどではないですが室町時代程度に古い~このviにもedモードというのが残っています。そのedで、文字列検索を行う機能だけを抜き出して、1個のコマンドとしたのが、grepだそうです。



その意味は、global=テキストファイル全体に対して、regular expression=正規表現で、検索処理を行い、その結果をprint=表示しなさい、ということだそうです。



ついでなので、もう1つオマケのネタ。sedは、stream editorの略だと最初に言いましたが、editorとは、すなわちその太古のエディタ「ed」のことです。



edは、ファイルを読み込んで、いろいろな編集コマンドを実行して、テキストを書き換えて、ファイルに保存するツールです(・・・っていっても、実は使ったことないのですが)。



一方、sedは、標準入力からテキストファイルを1行ずつ読み込んで、指定された編集コマンドを実行したのち、標準出力へ出力します。sedは、edでのテキスト編集処理を、フィルタとして実行きるようにしたものです。ところでフィルタとは・・・?標準入力から読み込んで標準出力へ書き出す動作を行うプログラムを、フィルタと呼びます。Unixにはたくさんのフィルタがあり、これらを組み合わせることで、自動でテキスト処理を行うシェルスクリプトを書いたりできます。なにしろ、もともと、Unixは、テキスト処理システムとして開発されたのですから・・・とあるゲームを実行するためのOSとして開発されたという説もありますが・・・)。sedのsであるstreamとは、「流れ」という意味で、フィルタをデータが絶えず流れている様子をさしているのでしょう。



というわけで、実は、sedで置換を行うsといったハナモゲラなコマンドは、edで使われていたコマンドだったりするわけです。sedのpコマンドのpや、sコマンドのフラグのpは、grepのpと同じ由来だったんですねぇ。



■ おまけ: シェルスクリプトにしてみよう



「internet.sh.txt」をダウンロード



#! /bin/sh



DIR="/tmp"



/usr/local/bin/wget -q -O - \
    http://internet.watch.impress.co.jp/cda/rss/internet.rdf \
    | /usr/bin/sed '
/<item rdf:about="http:\/\/internet.watch.impress.co.jp/ {
    h
    s/<item rdf:about="/<link>/
    s/">/<\/link>/
    s/?ref=rss//
    x
}
/<link>http:\/\/www.pheedo.jp\/click.phdo?i=/g' \
    > ${DIR}/internet.rdf


このシェルスクリプトを実行すると、RSSをダウンロードして、書き換え処理を行って、「/tmp/internet.rdf」に保存するまでが、全部行われます。



sedコマンドは、別ファイルにせずに、そのまま書き込んでしまいました。ファイルが分かれていると、見晴らしが悪い気がしたからです。



'~'で囲んで書くのが、ちょっとしたポイントですね。'がはじまったら、次に'がくるまで、囲まれた範囲すべての文字列が、そのまま受理されます。ということは・・・そう、'と'で囲まれた範囲内には、'を書くことができません。今回は、それでもかまいませんね。



行末の「\」は、まだコマンドがつづいていますよ、の意味の、シェルスクリプトでのお約束の書き方です。'と'で囲んだ部分では、改行があっても\をつける必要はありません(つけてはいけません。\がそのまま受け取られてしまいますので)。







■ 参考文献



今回、この記事を書くのに、「man wget」でwgetの使い方を調べたり、「man sed」でsedの使い方を調べました。



sedだけの話ではないですが、何かで上達する一番の方法は



  1. まずは、いいお手本を見つけてきて、理解し、暗記する


  2. そのお手本を、自分なりに少し書き換えて、実行できるようになる


  3. マニュアル(manやinfo)を自分で調べて、自分で新しい使い方を発見する


ということじゃないかなと思います。最後の「自分で調べて、自分で解決できるようになる力」・・・これを身につけると、もうあとは、どんなものでも、すぐに上達できるようになりますよね。



■ sedへの招待 全3話 +1



 



2006年8月29日火曜日

バブルロケット 宇宙味

前回のバブルマン ソーダプラネットはPETボトルでしたが





今回の「バブルロケット」は、アルミ缶でした。



200608281



どこらへんがおもしろいのかわからないというか、今ひとつ、感性が理解できないというか、共感するものがないんですけど・・・(笑)



「HAJIKETENAI!!」とか言われてもね・・・バブルがはじけるとかで、シャレになっているってこと?



200608282



「AONDE KUREYO !!」っていわれてもねぇ・・・



200608283





☆ ☆ ☆ ☆ ☆ ☆ 



ひさびさに、脳をアカデミックモードに切り替えてフル回転させてたので、ちょっと疲れてます。

googleがなかったら、○○なんて、こんな短時間ではできませんでした!

ありがたや ありがたや





2006年8月28日月曜日

マンゴーオムレット

やっぱり、夏はマンゴー?!



マンゴーオムレット (ヤマザキ)
20060827



先週、食べました。けっして賞味期限切れのものを今日買って食べたのではありません。



バナナロールとか、「まるごとバナナ」っていう商品名かな・・・あれの、バナナがマンゴーで置き換わったようなものでした。



どうもマンゴーというと、♪君たちキウィ~・・・しか連想できない、貧弱な知識しかない私であります。



2006年8月27日日曜日

NHKのミュージックボックス (80年代 邦楽)(BlogPet)

pochiはここでアスキーと装置した。
つまりきょうは、認識するはずだったの。


*このエントリは、BlogPet(ブログペット)の「pochi」が書きました。


2006年8月26日土曜日

ご縁がありますように ~ 昔の5円玉

おつりの中に、昔の5円玉が混じっていました。ひさびさに見かけました。



「日本」じゃなくて「日本」だったり・・・



5yen1



書体が、ゴシックではなく明朝だったりするところが、今の5円玉と違います。



5yen2



昭和24年、1949年、今から57年前。



そんな長い時間を経て、どんな経路でここへやってきたのか。



昭和30年代ころに駄菓子屋さんで子供たちが買い食いしていたのかな、とか、貯金箱の中で何年も眠っていたこともあるのかな、とか。



のちに藤子不二雄となる、まだ十代の二人の少年が、手塚治虫からファンレターの返事をもらったのが、昭和24年5月のこと。歴史に残るトキワ荘に入るのは昭和29年11月のこと。それよりも、まだ5年も前のことでした。



2006年8月25日金曜日

モーニングは冷やしてお楽しみください

今週の週刊モーニングは、表紙が妙にピカピカしてます。



200608251



「モーニング表紙史上初!今週の表紙は冷やすと何かが起こる!」



200608252



ナニ!?



200608253



200608254



というわけで、買った人は、試してみるといいんじゃないでしょうか。



けっこうしっかりと冷やさないと効果が現れないし、指で触ったくらいでも、すぐに元にもどってしまうので、かなり反応は敏感です。





お盆進行でクタクタになってたので、予算配分を間違えて、予算があまったとか・・・でしょうか?



2006年8月24日木曜日

NHKのミュージックボックス (80年代 邦楽)

どうやら、けっこうミュージックボックスのファンって、多いようですね。
番組表で8月20日の深夜(21日の未明)に放送するのを発見し、きっと出てくるだろうと期待していたところ、出てきました。



前回の





のつづきみたいな話ではありますが、80年代の懐かしのパソコンたち・・・
今回登場したのは、NECのPC-8001、PC-8801ばかりでした。



☆ ☆ ☆ ☆ ☆ ☆ 



どこかの展示会でしょうか。
Musicbox2006082101



PC-8801のようです。曲は、♪人生いろいろ(’87)・・・あれれ?1987年にPC-8801って・・・5年くらい時代がずれている気がしますけど。
Musicbox2006082102




いまではごくあたりまえですが、昔は、パソコン本体と、キーボードが分かれている機種は、ほとんどなくて、分離しているほうが、おしゃれ~なかんじがしていました。
Musicbox2006082103




音声認識・・・今でも一般にはあまり使われていない技術ですが。
理由としては、いろいろあるでしょうが、個人的に一番有力だと思う説は、「職場とかで、みんながパソコンに向かって一人でしゃべりかけている風景は、なんか不気味だし、やかましい」ってことではないかと。
Musicbox2006082104




モウ1ド!! モウ1ド!! なかなか認識できないみたいですね・・・ところでよ~くみると、「CANSEL」というみっともないスペリングミスがあります。cancelですね。
Musicbox2006082105




QSOコンテスト整理簿?アマチュア無線(=ハム)関係のようです。今ではすっかり廃れてしまった?アマチュア無線ですが、マイコン/パソコン創世記には、アマチュア無線方面の人たちがたくさん活躍されていたそうで、アマチュア無線とコンピュータはけっこう深く結びついていました。
Musicbox2006082106




☆ ☆ ☆ ☆ ☆ ☆ 



シーンが変わり、今度は、講習会のようです。
Musicbox2006082107




髪型が・・・
Musicbox2006082108




どうやら利子の複利計算を行うBASICのプログラムのようです。セミコロン(;)の使い方が懐かしいです(これってわかる人にしかわかんないなぁ・・・笑)
Musicbox2006082109




みなさん、がんばっているようです。若手というよりは、わりと中堅以上の方が多い?「これからはOA(オフィス・オートメーション)の時代だ、パソコンを覚えて来い!」と社命をうけてやってきたのでしょうかね。



Musicbox2006082110



Musicbox2006082111



Musicbox2006082112




機種は、名機と呼ばれたPC-8001。ディスプレイは、グリーンディスプレイ。モノクロディスプレイなんですが、緑色は目にやさしいとかいう謎の迷信により(?)、緑だけ1色で表示されます。ディスプレイの向こうには、カセットテープレコーダがあります。カセットが外部補助記憶装置、つまり、今でいう、フロッピーディスクやCD/DVD-Rのように、データを保存するためのメディアだったんですねぇ。ぴーひょろろ~~
Musicbox2006082113




☆ ☆ ☆ ☆ ☆ ☆ 



別の講習会会場のようです。こちらはあまりビジネスマンっぽい人はいません。Musicbox2006082114




右端にあるビデオデッキくらいある大きな箱は、5インチフロッピーディスクドライブ。昔はデカかった。値段も高かった。
Musicbox2006082115




Syntax errorが微笑ましいです。キーボードの練習でしょうか。
Musicbox2006082116




一本指打法。そういえば、このころは、ファンクションキーは5個でした。PC-9801で10個に増えて、PC/AT互換機の時代になって12個になったのかな?
Musicbox2006082117




両手で、一本指打法
Musicbox2006082120




マリオみたいな講師。黒板を使うってところが時代を感じさせますね・・・ま、いいけど。
Musicbox2006082119




☆ ☆ ☆ ☆ ☆ ☆ 



そのほか・・・



バックナンバーも含めて、大量に平積みになった月刊ASCII。表紙の絵を手がかりに調べてみると、1981年10月号~12月号あたりのようです。
Musicbox2006082118



その月刊アスキーも、先月、事実上の廃刊となってしまいました。




PC-8001。これはキーボードだけじゃなくて、パソコンとしての本体もこの筐体に詰まっています(ハードディスクなんてのは入ってません。念のため)。このあとに発売されたPC-8001mkIIは、もうちょっとスマートになっています。NEW ON 1 っと・・・
Musicbox2006082123






2006年8月23日水曜日

歯医者

10日くらい前から、奥歯がやばいな~、と思ってたのですが、いつもはしばらくすればおさまったのに、今回、ま ぢ で や ば い で す か!? という気がして歯医者に行きました。2年ぶりかな・・・



状態を説明してもらいましたが・・・あー、気分が・・・鬱になります。もっと前に治療しておけばよかった・・・



はぁ あ~あ・・・



☆ ☆ ☆ ☆ ☆ ☆ 



最近、なんかいや~な気分になったときは、こういうのをボケ~と眺めています。なんとなくすがすがしくなります。



(8月14日午前6時すぎの「朝の景色」の写真を再掲載)



200608141
朝日の中の朝露



200608142
サトイモの葉の上の露



200608144
ツユクサってなんか好きだなぁ。子供ころはそんなふうには思わなかったけど。



あのときは、なんか急に、朝露の写真が欲しい!と思って、カメラを持って、犬の散歩にでかけたのでした。朝露って、なんか、新鮮というか、純粋というか、何かのチカラを感じる気がします。







2006年8月22日火曜日

WindowsXPにてDHCPでアドレス取得できない問題

とあるパソコンで発生した、これまで見たことのないトラブル・・・



OSはWindows XPで、IPアドレスを手動で設定している場合は、とくに問題ないのに、DHCPでIPアドレスを自動的に取得するようにすると、いつまでたってもIPアドレスが取得できない、というトラブルです。



もちろん、DHCPサーバはちゃんと動いていて、他のパソコンでは大丈夫、ちゃんとDHCPでアドレスが取得できてる。



DHCPサーバのログを見ていると、問題のパソコンからは、1度も、DHCPリクエストが送られてきていない。



そのパソコンには、たまたまVMwareがインストールされていた。なぜか、VMware(ブリッジ接続)は、ちゃんとDHCPでアドレスを取得できた。ブリッジなので、ある意味、当然かもしれないけど。謎が深まった? いや、とにかく、一応通信できることが確認できたので、ネットワークカードや、ネットワークケーブル、ハブなどに問題はないと判断できた。



「ローカルエリア接続の状態」の「全般」タブにある「動作状況」にて、パケット数が、送信、受信ともに、0のまま。まったく送信していないっぽい。



ある程度高機能なスイッチングハブには備わっている機能ですが、スイッチングハブのアドレステーブルを探索しても、問題のパソコンのMACアドレスは見つからない。→ どうやら、本当にパケットは送信されていないらしいと判断。



Googleで「WindowsXP DHCP アドレス取得 できない」というキーワードで検索してみたところ、以下のような、マイクロソフトからのサポート情報が見つかった。

http://support.microsoft.com/kb/817571/ja
ネットワークに接続すると、エラー メッセージ "ソケット以外のものに対して操作を実行しようとしました" が表示される



そんなメッセージは表示されていないものの、

「TCP/IP を再インストールする」

というのが、なんとなく効果ありそうな気がするのでやってみた(Windowsでの障害は、再インストールすると直る、ということが多いので)。



その結果、うまくいった。





原因は、ようするに、レジストリがぶっ壊れていたということで、いいですか?





2006年8月21日月曜日

memtest86でメモリのテスト

先日、





にあるように、どうやら、メモリがぶっ壊れた?っぽいかんじです。



よくあるメモリ関係のトラブルには、「相性問題」というのがあって、このマザーボードにこのメモリを挿すと動かないけど、別のマザーボードだと大丈夫なんてことがありますが、これまでずっと動いていたのが突然動かなくなったので、たぶんそれはなさそう・・・



とりあえず、これは故障なんだと、サッパリとあきらめるためにも(笑)、一応、チェックしてみましょうか、ということで、メモリのテストするツールとして定番のmemtest86を試してみました。



memtest86のホームページ




■ ダウンロード



ダウンロードできるmemtest86は、ソースコードのほかに、実行可能なバイナリ形式として、2種類、用意されていて、



  • フロッピーディスクのイメージファイル + 書き込みツール


  • CD用のISOイメージファイル


がありました。



今回は、フロッピーディスク用のほうを使いました。



フロッピー用ダウンロード
http://www.memtest86.com/memt32.zip



今時のパソコンには、フロッピーディスクドライブなんてついてませんから、CD用のイメージファイルをダウンロードして、適当なCD書き込みソフトでCDを焼いちゃってください。



ISOイメージファイルのダウンロード
http://www.memtest86.com/memtest86-3.2.iso.zip

~ でも、フロッピーディスクドライブは、あれば、1~2年に1度くらい重宝することがあります。アキバのジャンク屋さんでは、USB接続のフロッピーディスクドライブの中古(でもかなりきれい)が、1500円前後で売られているので、1つ持っているといいかもしれません ~


■ memtest86起動用フロッピーディスクの作成



あらかじめ、データが消去されてもかまわない、フォーマット済みのフロッピーディスクを1枚、用意しておきます。



memtest86起動用フロッピーディスクの作成は、Windows上でもできます。わかる人なら、FreeBSDやLinuxでもできるでしょう。たとえば、

cat memtest.bin > /dev/fd0

みたいな感じでできるはずです。。。



以下は、Windows上での手順です。



  1. ダウンロードしたzipファイルを展開します。
    Memtest861




  2. 中にある、install.batというのを実行します。


  3. 「Enter target diskette drive:」と表示されるので、フロッピーディスクのドライブ名(普通はA)を入力します。


  4. 「Please insert a formatted diskette into drive A: and press -ENTER-」と表示されるので、フォーマット済みのフロッピーディスクをドライブにセットし、Enterキーを押します。


  5. Memtest862





  6. あっという間に、書き込みが終了します(イメージファイルのサイズは93KBしかないので)。









■ memtest86を実行する



作成したフロッピーディスクで、パソコンを起動します。



こんな感じの、シンプルな画面です。



Memtest863











エラーがあると赤く表示されるんですね。実は、はじめて見ました。
これを見ると、思いっきり、stuck-at-0 faultです。ありとあらゆるアドレスでエラーが出ているので、メモリセルの故障ではなく、メモリチップの出入り口に近いところでの故障でしょう。こんなわかりやすい壊れ方、ほんと、はじめて見ました。



ちなみに、エラーがない場合はこんな感じです。エラーがあってもなくても、延々とテストを繰り返していくみたいです。



Memtest864




ガリガリ君 マンゴー

暑い~~~~~~~~~~~
あまりにも暑いので、Core 2 Duoが欲しくなってきたです。



ガリガリ君 マンゴー



20060820



これ、うまい!です。



「ガリガリ部員5万人のみんなが作った」って書いてあります。



ところで、携帯電話を持っていない私は、ガリガリ部には、入部できないようです。



別に入りたくないですけど。



☆ ☆ ☆ ☆ ☆ ☆ 



どこかから、花火の音が聞こえてきます。



昨日の晩は、多摩川を渡る橋の上で、花火が見えました。



2006年8月19日土曜日

黒糖あんぱん

沖縄産「黒糖」使用
黒糖あんぱん
黒糖あん + クルミ粒のトッピング!
(木村屋總本店)



20060819



これも、「沖縄バーガー」といっしょに売ってました。
実は、両方とも40%引きで・・・なんてことはどうでもいっか。



☆ ☆ ☆ ☆ ☆ ☆ 



ぜんぜん関係ないのですが、冷蔵庫の中が、とんでもないことになっていました。えぇ。



溶けるんですよね・・・あぁ・・・



冷蔵庫だからって、安心はできませんね。



昨日、なんとなくおかしいなと、匂いで感じてはいたのですが、先ほどはもう、手遅れでした。





ラフティー風 沖縄バーガー

ラフティー風
沖縄バーガー
バーガーパテ + ラフティー風フィリング
(木村屋總本店)



20060818



実は沖縄料理って食べたことは無いのですが、最近のクッキングパパを読んでたせいで、なんか知ったかぶりになってるようなかんじにも。



ラフティーは、豚の角煮だそうで、フィリングってのは何?と思えば、別に沖縄の言葉じゃなくて、詰め物のことだそうです。パンの中に入っている具、ってことですかね。



でも、このパンに入ってたのは、ハンバーグみたいなすり身でしたけどね・・・



だから、ラフティーなのか。なるほど。





2006年8月18日金曜日

暑い ~ バブルマン ソーダプラネット

お盆休み、おしまい。今朝、戻ってきました。で、仕事再開。



それにしても、こっちは暑い!! さらに湿度がすごい。まるで湿度120%で過飽和状態みたい。手をたたいたりショックを与えると、空気中から水が飛び出そうなくらいの、湿気・・・



暑い夏。夏は暑いのがあたりまえ。はい、我慢します。



ところで、この前、夜に、地面を、「セミの抜け殻の中身入り」(フツーに、セミの幼虫と呼べばよいらしい)が、もそもそと、ヤドカリのように歩いているのを見てしまいました。



200608171



こんな暑いときには、冷たい飲み物でも・・・ってビールじゃないんですが、コレ。



BUBBLE MAN II
バブルマン ソーダプラネット



200608172




バブルマンという炭酸飲料があるのは前から知ってました。この名前からは、一昔前の

「ボロもうけする不動産屋」

を想像してしまいますが、どうやらまるで関係なし。この「ソーダプラネット」は、宇宙をイメージしているようです(だから何なんだって感じもしますが)。



ラベルの裏にも、何かが描かれていますが、見づらいし、書いてある文句も、

いとこも



息子も



同じ顔。



は??? 「だから何なんだ!?」ってかんじ・・・

200608173




宇宙といえば、今週、NHK総合で夜に放映しているドキュメンタリー風のドラマ



宇宙へ ~ 冷戦と二人の天才 ~



ってのが、けっこう面白いです。ソビエトとアメリカの宇宙開発競争を、フォン・ブラウンと、あともう一人・・・誰だ?・・・を主役にして描いたようなドラマなんですが、これ、途中から見たのですが、ちゃんと最初からじっくりと見たくなりました。再放送なんだそうですが、またやらないかな。ソビエトのロケット、カッコイイ!!!




200608174



 



2006年8月17日木曜日

UTF-8 TeraTerm Pro with TTSSH2でFreeBSDにログイン

ずいぶん長いこと、TeraTermという端末エミュレータにはお世話になっています。TELNETでリモートログインするのはもちろんのこと、シリアル端末エミュレータとしても使えるので、RS232Cで接続して、キーボードもビデオボードも載っていないSunのワークステーションのコンソールとして使ったり、スイッチングハブの設定を行ったり、RAID装置の設定を行ったり・・・いろいろ重宝しています。

さらに、TTSSHという追加のソフトを使うと、sshプロトコルでログインできるようになって、セキュリティ面でも万全

・・・だったんですが、SSHプロトコルのバージョン1は、もはや、セキュリティ面では安全ではないということになり、今では、デフォルトでは、SSHバージョン2プロトコルのみ有効になっていることが多いです(FreeBSDも)。SSHバージョン1も許可するように設定を変更すれば、一応、TTSSHでもログインできるんですけど・・・なんとなくね。



ちなみに、TTSSHについては、以前、ここで軽く触れていました。







さてさて、TeraTermで残念だったのが、TTSSHが、SSHバージョン1プロトコルにしか対応していなかったこと



・・・だったんですが(またか)、しばらく前に、

UTF-8 TeraTerm Pro with TTSSH2

というのを教えてもらいました。要するに、SSH2プロトコルに最初から対応した、改良版のTeraTermということだようです。文字コードのUTF-8にも対応しているということで、個人的にはまだあまりUTF-8の必要性を強く感じてはいないのですが、何かのときに重宝することがあるかもしれません。







今回は、とりあえず、この「UTF-8 TeraTerm Pro with TTSSH2」(長いなぁ・・・省略形はないのでしょうか?)を使って、FreeBSDにログインするまでのお話です。



● SSHの鍵を作成する



UTF-8 TeraTerm Pro with TTSSH2でも、メニューの[設定]-[SSH Keyの作成]にて、SSHの鍵を作成できるようですが、ここでは、ssh-keygenコマンドを使った、どこでもつかえる(と思う)、ごく一般的な方法を紹介します。



ssh-keygenは、ssh(openssh)に含まれているコマンドです。まずは、FreeBSDにログインします。



おもむろに、「ssh-keygen -t rsa」というコマンドを実行します。
途中で、2回、パスフレーズ(パスワードみたいなものだけど、8文字までとかけち臭い制限がないので、覚えやすい文章にするとよい)を入力するようにいわれます。



% ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/nhh/.ssh/id_rsa):
Created directory '/home/nhh/.ssh'.
Enter passphrase (empty for no passphrase): パスフレーズを入力
Enter same passphrase again: もう1度入力
Your identification has been saved in /home/nhh/.ssh/id_rsa.
Your public key has been saved in /home/nhh/.ssh/id_rsa.pub.
The key fingerprint is:
0a:c7:f1:14:98:fa:39:85:1b:2a:64:92:c6:c5:db:1f nhh@freebsd5-vm.local



とくに鍵ファイルの名前を指定しなかったので、ホームディレクトリの、「.ssh」というサブディレクトリの中に、「id_rsa」と「id_rsa.pub」という2つのファイルが作られます。



ちなみに「ssh-keygen -t dsa」というコマンドで、DSA方式の鍵を作ることができます。この鍵も、SSHバージョン2プロトコルで使用できます。OpenSSHのデフォルトでは、DSA鍵のほうが優先して使用されるようです。





公開鍵ファイルの内容



Utf8teraterm4



秘密鍵ファイルの内容



Utf8teraterm5







SSHは、公開鍵暗号という仕組みを使っていて、公開鍵暗号では、「秘密鍵」と「公開鍵」という2つの鍵があります。



  • id_rsaが秘密鍵です


  • id_rsa.pubが公開鍵です


  • 秘密鍵は、さらにパスフレーズ(鍵作成時に指定したもの)によって暗号化されています


  • 秘密鍵は、自分だけの「秘密」としておき、他人に渡してはいけません。今回、この秘密鍵は、Windows側のTeraTermが使用します。


  • 公開鍵は、事前に、認証してほしい相手に渡しておきます。今回、この公開鍵は、FreeBSD側においておきます。




ちょっとややこしい話ですが、Windows上でUTF-8 TeraTerm Pro with TTSSH2を使って、FreeBSD(リモートホスト)へログインする場合



  • FreeBSD側(sshで認証する側)にて、あらかじめ公開鍵を登録しておく。


  • Windows上で、UTF-8 TeraTerm Pro with TTSSH2を実行するユーザーが秘密鍵を持っていて、


  • sshでのログイン認証のときに、公開鍵暗号により、正しい秘密鍵を持ってユーザーであると証明できたときに、ログインが許可される。


てなかんじになります。





■ sshでFreeBSDにログインできるようにする準備



● $HOME/.ssh/authorized_keysというファイル



$HOME/.ssh/authorized_keys というファイルに、ログインを許可したい人(=Windows上にいる自分)の公開鍵を追加します。



authorized_keysというファイルがなければ、先ほど作成した公開鍵ファイルid_rsa.pubをコピーします。

% cd ~/.ssh/
% cp id_rsa.pub authorized_keys

すでにauthorized_keysというファイルがある場合は、catでアペンドします。

% cat id_rsa.pub >> authorized_keys

$HOME/.sshディレクトリは、こんな感じです。秘密鍵は重要なファイルなので、ファイルのパーミッションには気をつけてください。



% ls -la $HOME/.ssh/
total 12
drwx------  2 nhh  nhh  512 Aug 15 14:52 .
drwxr-xr-x  3 nhh  nhh  512 Aug 15 14:48 ..
-rw-r--r--  1 nhh  nhh  231 Aug 15 14:37 authorized_keys
-rw-------  1 nhh  nhh  951 Aug 15 14:34 id_rsa
-rw-r--r--  1 nhh  nhh  231 Aug 15 14:34 id_rsa.pub
-rw-r--r--  1 nhh  nhh  599 Aug 15 14:52 known_hosts



known_hostsというファイルは、リモートホストのホスト鍵が保存されているファイルで、最初はありません。FreeBSD上でsshを実行すると、自動的に作成されます。





● 秘密鍵をWindowsにもっていく



なんとなく、いや~んですが、FTPで持っていくとか・・・



● FreeBSDでFTPを使えるようにする方法



/etc/inetd.confを編集して、以下のftpの行の先頭の「#」を削除して、有効にする。



ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l



inetdを有効にする。/etc/rc.confに、もし入っていなければ、以下の1行を追加する。

inetd_enable="YES"

もともとinetdを実行していなかった場合は、以下のコマンドでinetdを実行する。

# /etc/rc.d/inetd start
Starting inetd.
# ps axww|grep inetd
  517  ??  Ss     0:00.05 /usr/sbin/inetd -wW -C 60
  519  p0  S+     0:00.03 grep inetd

もともとinetdを実行していた場合は、HUPシグナルを送って、inetd.confを再読み込みさせる。

# kill -HUP `cat /var/run/inetd.pid `

● WindowsからFTPで秘密鍵を取りに行く



Windowsのftpコマンドでは、こんなかんじ。



C:\>ftp 192.168.1.3
Connected to 192.168.1.3.
220 freebsd5-vm.local FTP server (Version 6.00LS) ready.
User (192.168.1.3:(none)): nhh
331 Password required for nhh.
Password: FreeBSDへログイン時のパスワード
230 User nhh logged in.
ftp> cd .ssh
250 CWD command successful.
ftp> get id_rsa
200 PORT command successful.
150 Opening ASCII mode data connection for 'id_rsa' (951 bytes).
226 Transfer complete.
ftp: 969 bytes received in 0.00Seconds 969000.00Kbytes/sec.
ftp>



Windows上でのカレントディレクトリにid_rsaファイルができます。



id_rsaというファイルは、一応、パスフレーズで暗号化はされていますが、誰にもアクセスできない場所に置いといてください(とはいっても、Windows XP Home Editionとかだとねぇ・・・)。





■ UTF-8 TeraTerm Pro with TTSSH2でFreeBSDにログイン



[ファイル]-[新しい接続]にて、



  • 「TCP/IP」を選び、


  • 「ホスト」にはリモートホストのホスト名やIPアドレスを指定


  • 「サービス」に、「SSH」を選択


  • そのほかは、デフォルトのままで大丈夫だと思うけど、適当に指定


  • [OK]ボタンを押す


Utf8teraterm1



はじめて接続するホストの場合、known hostsに登録するか?というメッセージが表示されます。接続先が、偽のホストかもしれないので、ホスト鍵のフィンガープリント(指紋)が正しいかどうか、確認してくれ、ってことです。



Utf8teraterm2



よければ、[続ける]をクリックします。



ちなみに、このホスト鍵のフィンガープリントってのは、どうやってわかるかというと・・・今さっき調べました・・・
「ssh-keygen -l -f ホストの公開鍵ファイル」で表示されます。ホスト(この場合これからログインしようとしているFreeBSDマシン)上にて、以下のようなコマンドを実行することでわかります。



% ssh-keygen -l -f /etc/ssh/ssh_host_dsa_key.pub
1024 77:4e:d4:97:67:d5:db:2e:d4:c6:20:18:4c:b0:39:e8 /etc/ssh/ssh_host_dsa_key.pub



% ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub
1024 86:e4:d2:ee:88:db:40:bb:76:de:cf:82:50:12:bc:b1 /etc/ssh/ssh_host_rsa_key.pub



% ssh-keygen -l -f /etc/ssh/ssh_host_key.pub
1024 1e:ff:40:0a:5e:18:d7:54:f2:22:c8:4e:03:24:4d:f9 /etc/ssh/ssh_host_key.pub



FreeBSDに標準で入っているsshdは、/etc/sshディレクトリにあるホスト鍵を使用します。鍵が3個もあるので、いったいどれが使われているんだ?!って気がしますが、/etc/ssh/sshd_configという設定ファイルを眺めていると、どうやらsshバージョン2プロトコルの場合は、ssh_host_dsa_keyが使われているようです。
たしかに、TeraTermで表示されたフィンガープリントと一致しています。







さてさて、次にSSH認証の画面になるので、ユーザー名と、パスフレーズを入力し、Private key fileボタンをクリックして、先ほどの秘密鍵ファイルを指定します。



Utf8teraterm3



これでログインできるはずです。







■ UTF-8 TeraTerm Pro with TTSSH2でFreeBSDに、パスワード認証でログイン



えぇと・・・通信プロトコルと認証手段というのは、別々なものでして、こんがらがる話かもしれませんが・・・



上記の公開鍵暗号を用いるssh認証ではなく、普通のloginのときのパスワード認証でも、ログインできます。それでも、通信内容は、SSHプロトコルによって暗号化されているので、ネットワーク上の盗聴には、一応安全です。



SSHの鍵を作らなくていい分だけ、楽なんですが、最近のFreeBSDのsshdでは、パスワード認証が無効化されているので、有効にしてやる必要があります。



/etc/ssh/sshd_configの、PasswordAuthenticationというところを、以下のように書き換えてやる。

#PasswordAuthentication no
PasswordAuthentication yes

sshdを再起動します。



# /etc/rc.d/sshd restart
Stopping sshd.
Starting sshd.



TeraTermでは、ログインするときに、「プレーンテキストを使用」を選んで、パスフレーズに、login時のパスワードを入力します。



Utf8teraterm6





■ UTF-8 TeraTerm Pro with TTSSH2でおかしいなと思ったところ



すでに再現できなくなってしまったのですが、当初、0のキーを押すと4~とでてくる、tのキーを押すと6~とでてくる、とおかしな挙動・・・なんだと思えば、

^[[24~ とか ^[[26~

というキーコードが発生していました。



メニューの[設定]-[キーマップの読み込み]でIBMKEYB.CNFを指定したら、直りました。



あとは、これとか・・・



Utf8teraterm7





ポートフォファーディングってねぇ。



とはいえ、今のところ、Puttyよりはお気に入りになっています。





■ 補足



注意深い人は気が付いていると思いますが、上記の手順にしたがってsshを使えるように設定すると、

WindowsとFreeBSDとで、同じ秘密鍵を使う

ようになります。



つまり、このFreeBSD上でsshを実行したとき(たとえばこのFreeBSDマシンから、別のFreeBSDマシンとかLinuxとかSolarisとかへsshでログインするとき)にも、秘密鍵として$HOME/.ssh/id_rsaが、つまりWindows上のTeraTerm ssh2と同じ秘密鍵が、使われるようになります。なんとなくそれイヤ~ン、というときは、FreeBSD上でid_rsa、id_rsa.pubを削除して、ssh-keygenで別の鍵を作ってください。



それでも、authorized_keysに公開鍵がすでに登録されているので、WindowsからはTeraTerm ssh2でログインできます。