ttt

getttyent

眠れなくて困ったときにやるゲーム

2006-08-31 23:07:19 | アニメ・コミック・ゲーム

人生で一番の楽しいことは睡眠ですが(そうなのか?)、眠れなくて困ったとき、どうしてますか?

最近発見したのですが、WindowsXPに付属のカードゲーム、「スパイダ ソリティア」を2~3回やってるうちに、気がつけばウトウト、っとしてきます。時間は、ほんの5分から10分くらいです。

20060831spider

眠れないときは、このゲームをやる。最近の定番になりました。

実は、このスパイダというゲーム、つい最近はじめてプレイしました。なんか、これまでこんなのが入ってるの、気がつかなかったみたいで。

ルールは単純なので、すぐに理解できます。

よく知りませんが、こういう単純なゲームは、脳がリラックスできて、眠りにはいりやすくなるのでしょうか。そういえば、Nintendo DSの脳をきたえるゲームに入ってた、「細菌撲滅」、あれも脳をリラックスさせるためのものだそうですが、プレイしはじめてしばらくすると、眠ってしまうことがありました。

☆ ☆ ☆ ☆ ☆ 

もう1つ、同じく、Windowsにはけっこう昔からインストールされていた「フリーセル」・・・これも、私にとって、眠くなりやすいゲームの1つです。

20060831freecell

似たようなカードゲームに、「ソリティア」があって、たぶんこっちの方がメジャーかな?って思いますが、個人的には、フリーセルのほうが好きでした。

うん、そうですね、フリーセルは、かなり、好きでした。はじめてフリーセルに出会ったのは・・・そう、あれは、Windows 3.1の時代でした。Windows 3.1ってのは、1995年に発売されたWindows 95の1つ前のバージョンですから、もう10年以上前のOSです。PCで、MS-DOSの時代が終わり、はじめてGUIのOSが広まりだしたのが、Windows 3.1でした。

Windows 3.1のアプリケーションって、基本的にはみな16bitコードで動いていました。しかし、アプリの肥大化とかメモリ不足とかいろいろあって、16ビットじゃもうだめだ・・・ってことになって、Windows 3.1でなんとかして32ビットコードのアプリを実行する環境が提供されることになりました。それがWin32sというもので、たぶんWindows 32 bit subsystemとかそんな意味じゃないでしょうか。もうすぐWindows 95・・・ってころのことだと思います。1994年くらい?

インターネットは、Windows 95とともに広く普及しだしましたが、Windows 3.1の時代にも、一応、インターネットはありました。そして、Windows 3.1のときに登場した画期的なブラウザが、Netscapeでした。バージョンは、0.9xとか、せいぜい1.xとかくらい。そのNetscapeも、Win32sを使って実行するアプリでしたね。

話が脱線しました。Win32sに付属していたオマケゲームが、実は、フリーセルでした。

ちょっとグーグルで検索してみると、こんなページが見つかりました。

http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B106715
HOWTO: インストールに関する Win32s 問題のトラブルシューティング方法

これによれば・・・

Win32 SDK に付属する Win32s のインストール ガイドは、インストールが成功したことを確認するために、 Freecell を実行するよう勧めます。

はあ、そうですか。動作確認用のツールとして提供されていたのですね(笑)。

フリーセルって、べつに32ビット化しなければ実行できないような、それほど大層なプログラムじゃないのですけどね。単純だけど、なんかはまってしまうタイプのゲームでした。フリーセルは、どんなパターンでもかならず解けることになってるらしいので、解けないとくやしいので、むきになってやりつづけてました。眠いんだけど、解けるまで止めないぞ!みたいに・・・

「スパイダ」のほうは、たぶん解けないパターンもたくさんあると思います。だから、こっちはそれほどむきにならずに、ゆる~い気分でやっているうちに、そのうち眠くなる・・・と。


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

2006-08-30 23:48:43 | 日記・エッセイ・コラム

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

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

☆ ☆ ☆ ☆ ☆ 

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

200608301

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

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

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

200608302

■ 過去記事


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

2006-08-29 23:55:41 | デジタル・インターネット

ここでいう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-08-28 23:58:50 | 食・レシピ

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

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

200608281

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

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

200608282

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

200608283

☆ ☆ ☆ ☆ ☆ ☆ 

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

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

ありがたや ありがたや


マンゴーオムレット

2006-08-27 21:56:53 | 食・レシピ

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

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

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

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

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


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

2006-08-26 10:20:48 | 日記・エッセイ・コラム

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

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

5yen1

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

5yen2

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

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

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

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


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

2006-08-25 07:45:44 | アニメ・コミック・ゲーム

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

200608251

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

200608252

ナニ!?

200608253

200608254

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

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

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


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

2006-08-24 02:20:18 | デジタル・インターネット

どうやら、けっこうミュージックボックスのファンって、多いようですね。
番組表で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-08-23 00:28:43 | 日記・エッセイ・コラム

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

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

はぁ あ~あ・・・

☆ ☆ ☆ ☆ ☆ ☆ 

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

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

200608141
朝日の中の朝露

200608142
サトイモの葉の上の露

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

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