2006年9月6日水曜日

ユキクラ姉妹 第6回目 (2006年9月4日放送)

松浦有希、倉田雅世のユキクラ姉妹



チケットが届きました





(ユキ)みなさま ごきげんよう 松浦有希です。



(クラ)みなさま ごきげんよう 倉田雅世です。



(二人)ユキクラ姉妹です。



(ユキ)この番組はユキクラこと音楽アーティスト松浦有希と



(クラ)声優 倉田雅世の二人が あなたのスムースライフを応援する空間です。



(クラ)はーい。



(クラ)というわけで、6回目のユキクラ姉妹です
はい、でですね
そして なんと いよいよ10月1日のユキクラライブまで 1ヶ月をきりました



(ユキ)きりましたね



(クラ)きりましたよぉ~



(ユキ)そうなんですよ なので 今日はね ライブの話なんかも ちょこちょこしていきたいな なんて思ってるんですけどね



(クラ)そうですね



(ユキ)アルバム作業 大変でしたね



(クラ)お疲れ様でした



(ユキ)お疲れ様でした



(クラ)いや あの~ ユキちゃんは 自分も 歌う人であり あと 演奏もしなくちゃいけない、 いろんな作業もあって・・・



(ユキ)いやだって クラちゃんも ほら 朗読をしたりとか そういうのあるじゃない。だから 同じですよ



(クラ)あ、また、なんかここで、自画自賛・・・



(笑)



(ユキ)ユキクラらしさがまた炸裂してしまいましたけど・・・



(クラ)いやでもなんか うれしいような ちょっと緊張しちゃうような
だって10月は、1日にライブがあって、そのあとね、4日にはもうね、CD、ね、ユキクラのミニアルバムもね



(ユキ)すごい!だから ユキクラ的には 今年は実りある秋なんですよ



(クラ)はっ! さすが~ (パチパチ)



(ユキ)きれいにまとまっちゃったんですけど・・・



(クラ)ねー
たぶんみんなも どんな内容になっているか すごく気になって・・・



(ユキ)楽しみにしてもらっているといいなーって・・・



(クラ)思うんですけれども・・・じゃぁ



じゃぁ、行っちゃいましょうかね



(ユキ)ではですね、10月4日発売のミニアルバム、「ユキクラ姉妹・Orchard Fruits」から ユキクラにとってとっても大切なこの曲をお贈りしたいと思います。



(クラ)まだできたてほやほやです。初お披露目となります。聴いてください。ユキクラで「青空」。


(曲)


(ユキ)はい、ということで、今お聞きだたいてるのが・・・ちょっと今噛んじゃいましたけど・・・



(笑)



(ユキ)10月4日発売のユキクラのミニアルバム、「ユキクラ姉妹・Orchard Fruits」から「青空」です。



(クラ)は~い~~~ 激しい・・・!



(ユキ)激しい?!
あのね 今回の青空のアレンジは よりライブの雰囲気を出したいなということで いつもライブでもアクティブに演っていただいてる、ドラムの方、ベースの方、ギターの方に弾いていただいて、より、バンド感、ライブ感を出したアレンジにしたいな、というコンセプトで、作ったんですよね~



(クラ)いや、いいですよ。私、立ち合わせていただいたじゃないですか。ベースとドラムを録っている時にね。
いや本当、本当、なんか体が踊ってた! 心も体も・・・(笑)



(ユキ)実はね 松浦有希もですね あんまりね こういう感じの曲を こうなんていうの スタジオで、ちゃんと録るっていうことは 今まであんまりなかったんですよ。こういうロック・テイストの曲をね。だから、ロック・テイストの曲をね、録るときは、「ああ!自分は、スタジオで立たなければいけないんだ!」・・・立って、立って、一緒に演奏しているつもりになって、なんかそのね、あの~、みんなの弾いてもらっている、なんかこう、演奏をチェックしたりとかすると、より気持ちが入るんだな、っていうことがわかりました。
・・・で、それをふまえて、TDも、私、立ってた



(クラ)えぇ~!?!?!



(笑)



(ユキ)トラックダウンという、最後のね、音をミックスする作業のときにも、ちゃんと立って、「うん、これで本当にいいのか?!」ってことを判断しました。
ということが今回すごく勉強になりました。



(クラ)いやぁ~ほんとに~ねぇ、あの、ま、青空以外にもちょっとね、激しい曲があるんですけれども



(ユキ)もう1曲あります。はい。



(クラ)ま、今回のミニアルバムの内容について、ちょこっと、お話したいんですが。
今回ね、ジャケットもね、写真撮りましたね。



(ユキ)撮りましたねぇ~
いろいろ、まぁ、大変だったけど、ちょうどね、真夏の一番暑いときにね、二日間連続で撮ったので、なかなか大変だったり。
でもね、あとはね、今回、デジカメで今撮るのが基本じゃないですか。
で、デジカメで撮ると、もうそのまま、データをね、その日に持って帰って、すぐチェックできるってのはものすごくうれしいんだけど、逆に全部見なきゃいけないっていう、大変さが・・・



(クラ)ねぇ、写真選ぶの、けっこう大変・・・



(ユキ)もう目が痛くなったぁ・・・



(クラ)なったぁ。



(ユキ)なりましたねぇ



(クラ)あの、二人のショットと、個人個人のショットがあって、で、結局、二人のショットだと、二人がOKを出すのを選ぶのとかが



(ユキ)あれ大変よねぇ~



(クラ)ねぇ。けっこう大変



(ユキ)だから、3人組とか5人組とか、みんなどうしてんのかなって思うくらい。



(クラ)じゃあ、そんときは、くじ引きで3人だけで、5人のをとか・・・そんなことはないと思うけど(笑)
まあでも・・・



(ユキ)(笑)どうなんですかね~



(クラ)それはそれで、楽しかったし~



(ユキ)楽しかったですね



(クラ)あとDVDもね、今回つきますからね



(ユキ)DVD~ そうなんですよ~
でもね、ユキクラ、念願がね、ちょっとかなってね、DVDもつけることができて、うれしいな、なんて、思いますけど



(クラ)はい。
DVDは、踊りが、ほら、見れるから・・・みんな覚えてくれるかな?



(ユキ)あ、そうかもね。うん。たしかに。



(クラ)女の子とかに踊ってほしい・・・な。



(ユキ)踊ってもらいたいね~



(クラ)うん、うん



(ユキ)次回出すとき、紙にね、振り付けの紙をつけてたりして・・・



(クラ)(笑)ああ~



(ユキ)なんかどんどん違うユニットに・・・



(クラ)パラパラまんがつきみたいなので、振り付けが・・・



(ユキ)なんか、だんだん、ユキクラのコンセプトが・・・どこに行っちゃうんだよぉ?!みたいな感じですけどね



(ユキ)でも、そのくらい、ユキクラはいろんなことをやりたくて、盛りだくさんでやっている、アルバム?、なんだっていうことがね、今回少しでもみなさんに伝わってもらえればな、なんて思うですけれども



(クラ)はい



(クラ)なんか前回、いろいろ、タイトルどうしよう?とか言ってたけど、ぜんぜん、まぁ、違うのと言えば違うけど、でも、いろんなテイストが入って、Orchard Fruitsにまとまった、という感じですかね



(ユキ)そうですね。
あの、オーチャード・フルーツってね、ハーブティーでね、あるんですけれども、あの、いろんなね、あの~、柑橘系がメインかな、入ってるんですが、要するにユキクラのね、ちょうどこの10月の実りある時期に、ユキクラの中で、いろんな、歌だったりね、朗読だったり、ドラマだったり、いろんな果実が実って、それをミックスして、なんかこう素敵なね、ハーブティーのようなアルバムで、みんながね、なごんでいただけたらいいな、って感じですかね。



(クラ)素晴らしい! (ぱちぱち)
はい、そうですね。



(クラ)ということで、そろそろ次のコーナーに行ってみましょう。



(クラ)毎日をハッピーにする いろいろなお気に入りは



(ユキ)まるで不思議な魔法のカードみたい



(二人)水玉トランプ



(クラ)このコーナーでは、今お気に入りのもの、気になっているものなどを、紹介するんですが~



(ユキ)はーい。
今回はね、ユキクラのお勧めってことにしたいと思うですけれども



(クラ)はい、今回はもちろんですね、え~、歌と朗読のライブ、パローレ☆ムジカーレ vol.7 ~ ユキクラセブン を紹介したいと思います。



(ユキ)はい。もう1ヶ月きりましたかねぇ。



(クラ)きりました~ ほんと、どうしよう~?どうしようって言っても・・・



(ユキ)いつもね、どうしよう、どうしよう、って言うのよね、ライブの前に。



(クラ)みんな、だんだん、「お腹痛い」って言って、一人ずつ、みんな、お腹痛い、ってみんな言い出して・・・



(ユキ)そうそう



(笑)



(ユキ)いつもだいたい思い出されるのが、楽屋で、「今あたし何してんの?」「何をするんだっけ?次」っていうのをお互いにすごい言い合って・・・
よく、でも、でも、こうやって、終わってみると、ちゃんと今まで、6回ね、無事に終えてるっていうことは、何か見えない力が働いているんですかねぇ?



(クラ)きっとね、すごいですね~



(クラ)そのライブも、7回目ということで・・・



(ユキ)そうなんですよ・・・



(クラ)今回、ユキクラセブンというサブタイトルがついているんです、まぁ、7回目だからユキクラセブンというのも、もちろんあるんですけれども
みなさん、実は、ユキクラはですね、ある意味・・・ある意味???・・・正義の味方なんです・・・ (笑)
また大きなこと言っちゃった!



(ユキ)みんなさ、みんなさ、聴いてる人、わけわかんないよ?



(クラ)また大きなこと言っちゃった!



(ユキ)いつもセレブなんです、とか言いながら、今度は正義の味方かよっ!?みたいな



(クラ)で、あの、今回、朗読のね、パローレ・パートでは、実は、ユキクラセブンという正義の味方のお話をしようと思ってるんですよ。
出演者も多いですし



(ユキ)はい。増えてますよね。今回ね、3人、素敵なゲストの方が増えて



(クラ)ん~ なので、それをぜひみなさんにも楽しみにしていただきたいな、なんて思っています!
なんかいっぱいいっぱいしゃべろうと思ったのに、あっという間に時間がね、無くなってきちゃったから、とりあえず!来ないと! 見に来ないと!



(ユキ)そう、見に来ないとダメかなって感じ



(クラ)は~い、みなさん~、見たくなったんじゃないでしょうか



(ユキ)ねぇ、ということで、ぜひね、みなさんも前売り券とか、あとは、当日券もありますよね。



(クラ)そうですね。



(ユキ)ぜひお越しください。


(ユキ)っていうことで、以上、水玉トランプでした~


(ユキ)はい、ということで、今お聴きいただいているのは、ユキクラの新しいアルバムの中からの曲、「Summer's end」なんですけれども。
先ほどからお話していますように、いよいよ、7回目のユキクラ・ライブの開催まで、あと1ヶ月を切りました。



(クラ)そうなんです。10月1日 日曜日、歌と朗読のライブ パローレ☆ムジカーレ vol.7 ~ ユキクラセブン なんですが、出演は、



(ユキ)松浦有希



(クラ)と、倉田雅世と、あと、え~、水島大宙くんと、真田アサミちゃん、高城元気くん、そして



(ユキ)春行さん、ギターですね。それから、ベースの藤谷一郎さん。で、ドラムのBANちゃん。



(クラ)はーい。場所はいつものとおり、南青山MANDALAなんですが、チケットはですね、南青山MANDALAさんの店頭だと、まだ前売りが若干残っているかも知れません。



(ユキ)そうですね。



(クラ)あとは、もう当日券になってしまうので、えーと、ま、詳しいこと知りたいななんていう方はですね、ユキクラのホームページなんか見ていただくといいかもしれませんね。



(ユキ)そうですね。



(クラ)はーい。ありがとうございます。ねー。
今回もね、たくさんの方が来て下さるみたいで、すごく楽しみなんです



(ユキ)ねー、今度はどんな伝説を巻き起こすんでしょう、ユキクラは・・・ねぇ?



(クラ)そうですね、さっきは正義の味方とか言っちゃったし・・・ま、ミニアルバムも出るので、まあそれに向けて、レコ発という形でもありますけれども



(ユキ)うん、そうです、そういう意味合いもありますね



(クラ)ん~ん~ ほんとに、あの、また、また、さらに、ワンステップ、1歩先、10歩先くらいを行くユキクラを、ね、楽しんでいただけたら、うれしいななんて・・・



(ユキ)これもね、ほんとね、見に来てくださったり、CDをね、聴いてくださったりするみなさんのおかげで、ユキクラ、成り立ってるっていうところがありますので、ユキクラがまた次のステップにね、行けるように、みなさんもぜひ見守って、いただけたらなぁ、なんて思ってます。



(クラ)そしてですね、ここで1つ、お知らせです。
えーと、ユキクラ姉妹が入っています、本体、「こえたま!らじお!!ファンタジスタ!」さんの方なんですけれども、なんと秋から~、えぇ、関東圏の方にもっと聴きやすくなります、ってことで、ラジオ日本にお引越しいたします~



(ぱちぱち)



(ユキ)すごいですね。パワーアップです。



(クラ)パワーアップです。あの~、そのほか詳しいことは、ファンタジスタさんのホームページなどで確認していただけたらなんて



(ユキ)また、それ以外の地方の方は、そのまま引き続き聴いていただけますよ、っていうことです。
はい。



(クラ)もうほんとに、いろんなものが、秋にバージョンアップ、みたいな感じですね



(ユキ)そうなんですよ。もういろんなものが実っちゃって



(クラ)実っちゃって実っちゃって



(笑) すごーい



(ユキ)ねぇ、今でもね、本当にこの曲のようにね、Summer's end、夏の終わりという感じなんですけれども、ユキクラにとって今年は充実した夏でしたね。



(クラ)そうですね~ あの~ いつも夏にライブをすることが多いんですけど、今回は逆に、夏にたくさんいろんなものを準備して・・・



(ユキ)仕込んでね



(クラ)実りの秋に向けてっていう感じです。



(ユキ)ほんとです。ねぇ。みなさんと一緒に素敵な秋を迎えられるように、ユキクラもさらにラストスパート、がんばりますので、ぜひ応援してください。



(クラ)ほんとです。あの、もしね、まだ来たことないよって方、いらっしゃいましたら、ぜひね、このラジオ聴いて、「ユキクラ姉妹ってどんなの?」「生で見てみたい」



(ユキ)「見てみたいわ」



(クラ)っていう方、ぜひぜひ、あの、チケット、当日券、若干でると思うので、



(ユキ)そうですね



(クラ)来ていただければうれしいです。



(ユキ)ぜひぜひ。たくさんの方にお会いできるのを楽しみにしております。



(クラ)それでは本日のユキクラ姉妹は、これにておいとまいたします。



(ユキ)お相手は、松浦有希と



(クラ)倉田雅世がお送りいたしました。



(二人)ごきげんよう


☆ ☆ ☆ ☆ ☆ ☆ 



さて、なんと、このあと、今月は、もうひとつ、ユキクラな、スペシャルなコーナーがありました。



☆ ☆ ☆ ☆ ☆ ☆ 



ファンタジスタ スパークリング パワープレイ



ファンタジスタが独自に注目する曲やアーティストを強力にプッシュ。



ファンタジスタ スパークリング パワープレイ



毎月、ジャンルにとらわれず、ファンタジスタらしい選曲でお送りしておりますこのコーナー。この9月にお勧めの曲、お届けしましょう。



高山夏姫がお届けしております、ファンタジスタ スパーリング パワープレイ。9月の曲です。声優、音楽アーティストのユニット、ユキクラがついにメジャーデビュー!
「ユキクラ姉妹・Orchard Fruits」より「青空」



(曲)



ファンタジスタ内の「Show!劇!的!」でもおなじみ、音楽アーティストの松浦有希さんと、声優の倉田雅世さんのユニット、ユキクラがついにメジャーデビュー。
アルバム「ユキクラ姉妹・Orchard Fruits」。このOrchard Fruitsの意味は、ミックスフルーツが入ったハーブティーのこと。その名の通り、今回のアルバムには、歌、朗読、ライブなど、ユキクラのたくさんの素敵な魅力が一杯詰まっていて、とても素敵にまざりあった、テイストのおいしいアルバムに仕上がりました。・・・と彼女たち。
DVDも、さらにボーナストラックまでもが特典としてついてくるとか。
ただいまお届けしている「青空」は、ユキクラのライブで、3年間歌いつづけてきた、思い入れのある、とっても大切な曲だそうです。毎回ライブの最後には、この曲で、客席のみなさんと一心同体に。みなさんと気持ちがひとつになれる、アップテンポで、大きく盛り上がれる曲調です。作詞を倉田雅世さんが担当し、作曲を松浦有希さんが担当されました。まさに、演技の世界と、音楽の世界の融合。彼女たちは新しい世界をどんどん広げて行くのでしょう。
この記念すべきデビューアルバムの発売は、10月4日に決定。これからも、ユキクラのお二人の活躍に大注目です。



ファンタジスタ スパークリング パワープレイ
高山夏姫がお届けしております。9月の曲です。
「ユキクラ姉妹・Orchard Fruits」より「青空」



これからもこのコーナーでは、ファンタジスタが独自に注目する曲やアーティストを、強力にプッシュしていきます。お楽しみに。



以上、ファンタジスタ スパークリング パワープレイでした。


☆ ☆ ☆ ☆ ☆ ☆ 



そうか、今年の秋に、バージョンアップですか。
・・・ということはです。今風にいえば、ユキクラ2.0ですね(元ネタは、Web2.0。念のため)。

「なんかよくわかんないけど、最近のユキクラって、これまでのユキクラよりどこか発展したところがあるよね。」



「じゃあ、ユキクラ2.0とでも呼びますか」

とかね。



■ 過去の放送





2006年9月4日月曜日

揚げパン

ながい揚げパン
20060904



学校の給食の話題になると、必ず出てくるのが、「揚げパン」。
みんな、揚げパンが大好き~とか言ってるんですが・・・

私は、給食で揚げパンを食べた記憶がありません

う~ん、たぶん、給食で揚げパンなんてものが出たことなかったと思うんだけど・・・断言するには、ちょっと自信がないです。



ソフト麺とミートソースとか、カレーライスとか(月桂樹が入ってると当たり)、そういうのは定期的に出てたけど、揚げパンは、無かったと思う・・・



給食で出たパンといえば、3時間くらいでカチンカチンに固まってしまう食パンとか(あれを憶えているので、売っている食パンが、干からびないようにするために、何を入れているのか、ずっと疑問に思っています)、直方体のコッペパンのようなもの(のどが渇いて仕方なかった)、あとは、丸いパン(半分に開いて、ハンバーグとかはさんだ)などです。



揚げパン、無かったと思うんだけどなぁ・・・



(2006/9/6) 細長いコッペパンもあったような気がする。干しブドウパンとかも。



干しブドウって、いまだに、なんとなく苦手。食べられないわけじゃないけど、あえて買ってまで食べようとは思わない、くらいの存在。
大人になると好きな食べ物が変化するもので、酢の物とか、あと、茄子とか大好きになったりしたけど、干しブドウは、なんか、ね、こう、パクパク食べたくなっちゃう、みたいな感じにはなってないです。



2006年9月3日日曜日

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

きょうpochiは検索しなかったよ。


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


パソコンが不調期に突入

先日、





にでてきた、壊れたメモリは、保障期間内だったので交換してもらえました。



・・・ですが、交換してもらえる前でも、なんか、パソコンの調子が悪かったのです。



パソコンに向かっていると、なんだか、画面が細かくさざなみ立ち、その数秒後、カチョン!という音がして(たぶん、ハードディスクドライブでヘッドが退避したときの音?)、同時に、画面は真っ暗に。



リセットボタンを押すと、一応復活する。でも、ディスクの検査で、毎回、それなりに
ファイルシステムの論理的なエラーがでてしまう。



そんなことが、1日に1回くらいの割合で発生。



これは、テレビ録画用パソコンなので、こんなに不安定だと困ってしまうので、問題の個所を特定することにしました。



なんとなく電源が不安定なのかな、という気もするのですが。



まず、ビデオカードを抜いて、オンボードのビデオを使うようにしました。・・・で、やっぱり、不調です。むしろ、かえって不具合の発生確率が上がったような気までします。ということは、チップセットの不調?・・・マザーボード交換か?そうなるとメンドクサイな。



ただ、1度だけ、画面がまっくらにならずに、Windowsで、Unknown Hardware Errorというメッセージが出たことがあった。そのとき、マウスやキーボードは機能していたものの、どうやら、ハードディスクへのアクセスはぜんぜんできていないらしい。



ディスクの不調か?たまたまFreeBSDが(中途半端に)インストールされていたので、FreeBSDでブートさせてみた。smartmontoolsで、ディスクのSMARTのエラーログを確認してみると、何のエラーも記録されていない。エラーは発生していないのか、それとも、エラーが発生したことを記録できないほどのエラーが発生しているのか(そんなことあるのか???)。



ともあれ、しばらくの間FreeBSDで、いろんなportsをコンパイルするなど負荷をかけつづけたものの、安定して動作している。



ほかに原因となると、ビデオキャプチャカードの問題か?カードを抜いて、Windowsを起動。ビデオエンコードをするなど、負荷をかけつづけているけど、安定動作している。



あ、そうだ、途中で、フロッピーディスクドライブも、コネクタを抜いたっけ。



それにしても、電源ユニットも怪しいなぁ。



電源を買って来ようかなぁ・・・このパソコン、前にも1度、電源がとんだし。



☆ ☆ ☆ ☆ ☆ ☆ 



(2006/9/4) 電源ユニットに、ファンを1個追加して、排気力をアップさせてみた。なんとなく今のところ快調。電源を買って来よう・・・



(2006/9/5) ファンを追加して以来、落ちてない。いや実は、ガムテープで貼り付けただけなので、1回だけ、テープがはがれたとき、PCも落ちた。・・・ところで、落ちたとき、Mozilla Firefoxのプロファイルの一部がぶっ壊れた模様。ブックマークの内容と、Sageの設定がすべて消えて無くなった。Firefoxって・・・





(2006/9/14) 電源とケースを交換して以来、安定してる。



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

今回は、sedを用いたshプログラミング、シェルスクリプトの書き方について少しだけ紹介します。



シェルスクリプトは、Unixのコマンドラインインターフェイスであるシェルが実行できるプログラムのことです。シェルといってもいろんな種類がありますが、/bin/shを対象にすることが多いです。cshでスクリプトを書くのは、ごく一部の人たちから、非常に反感を買うようです(笑)。私も、スクリプトを書くときはshにしろと刷り込まれてしまったので、cshは使っていません(ログインシェルは、10年以上前からずっとtcshです)。



sedは、シンプルなものを巧妙に組み合わせて目的の処理を実現するわけで、どことなくパズル的な楽しみ(?)があったりしますが、shのスクリプトもそんなところがあります。





■ forによる繰り返し処理



shスクリプトでのループ処理では、forやwhileなどがありますが、ここではforを紹介します。



基本は、こんなかんじになります。

#!/bin/sh



for i in ABC DEF GHI
do
        echo $i
done



#!/bin/sh」は、これは/bin/shで実行するスクリプトです、というお約束のコメントだと思っている人もいるかもしれませんが、「#!」の2文字がファイルのマジックナンバー(ファイルの先頭にかかれている、ファイルの種別を表す記号のようなもの)です。
ちなみにFreeBSDだと、/usr/share/misc/magicというファイルに、ファイルのマジックナンバーの一覧がのっています。



forループ本体のほうを見てみましょう。forループには必ず、for、in、do、doneのキーワードがあります。



「for i in ABC DEF GHI」が、for文でループ処理を行うときのキーワードです。「i」は変数名で、「in」のあとに列挙した項目が、ループを回るたびに、変数に代入されます。



「do」から「done」までに書いたコマンドが、ループの処理内容です。この例では、echoコマンドで、変数iの内容を表示します。



実行例



% cat loop.sh    (シェルスクリプトの内容を表示)
#!/bin/sh



for i in ABC DEF GHI
do
        echo $i
done
% chmod +x loop.sh  (実行可能フラグを立てる)
% ./loop.sh     (実行する)
ABC
DEF
GHI



inのあとに、ABCといった文字列を指定する変わりに、「*.txt」のようなファイル名にマッチするパターンを指定することもできます。この場合、マッチしたファイル名が、変数へ毎回代入されることになります。



% ls *.txt
file1.txt  file2.txt
% cat loop.sh
#!/bin/sh



for i in *.txt
do
        echo $i
done
% ./loop.sh
file1.txt
file2.txt



複数のファイルを対象に、各ファイルごとに、何かの処理を行いたい場合は、こっちの書き方を使います。



■(オマケ) #!の使い方



#!のあとに続く文字列をコマンド名として、そのコマンドを実行する仕組みになっています。ファイルに「#! COMMAND OPT」と書いてあると、「COMMAND OPT ファイル名」というコマンドが実行されることになっています。そのため、



~~~~~~~~~~~
#! /usr/bin/sed -f



s/ABC/abc/g
~~~~~~~~~~~



という書き方も可能で、このスクリプトを実行するとsedが実行されます。「-f」はsedのオプションで、sedコマンドを書いたファイル名を指定するときに使います。
以上の3行を書いたファイルを、たとえばtest.sedというファイル名にしておき、chmodで実行可能にしておきます。すると、こんな風に実行することも可能です。



% cat test.sed
#! /usr/bin/sed -f



s/ABC/abc/g
% chmod +x test.sed
% ./test.sed
ABCDEFG ABCD AB  (キーボードから入力した文字)
abcDEFG abcD AB  (sedの出力)



このスクリプトを実行すると、実際には、

/usr/bin/sed -f ./test.sed

というコマンドが起動されているのです。






■ 例:ITmediaのRSSをスマートに一括で書き換えるシェルスクリプト

昨日の





ではRSSをダウンロードしてsedで書き換える処理を、

% wget -q -O - http://rss.itmedia.co.jp/rss/1.0/pcuser.xml | sed 's|http://cgi.itmedia.co.jp/rss/pcuser_1.0/plusd|http://plusd.itmedia.co.jp|' > ! pcuser.xml

のようにできると紹介しました。このRSSのほかに、ぜんぶで6個のRSSがありましたので、6個すべての処理を、シェルスクリプトで書いてみました。





#! /bin/sh

DIR="/tmp"

for i in \
    http://rss.itmedia.co.jp/rss/1.0/topstory.xml \
    http://rss.itmedia.co.jp/rss/1.0/plusd.xml \
    http://rss.itmedia.co.jp/rss/1.0/news_bursts.xml \
    http://rss.itmedia.co.jp/rss/1.0/lifestyle.xml \
    http://rss.itmedia.co.jp/rss/1.0/pcuser.xml \
    http://rss.itmedia.co.jp/rss/1.0/games.xml
do
    echo $i
    OUTFILE=`echo $i | sed 's:.*/::'`
    #OUTFILE=`basename $i`

    /usr/local/bin/wget -q -O - $i \
    | /usr/bin/sed '
s|http://cgi.itmedia.co.jp/rss/[^/]*/atit/|http://www.atmarkit.co.jp/|g
s|http://cgi.itmedia.co.jp/rss/[^/]*/\([^/]*\)/|http://\1.itmedia.co.jp/|g
' \
    > ${DIR}/${OUTFILE}
done

(2006/9/5 変更) OUTFILE=`~`のところで、シングルクォート(')が1個、抜けてました。なぜか動いちゃうんですが・・・?!



(2006/9/7 変更) atmarkitという別サイトへのリンクが入ることがあるので、書き換えルールをもう1つ追加しました。



(2007/6/2 追記) ダメだこりゃ・・・あきらめた>>ITmedia


 


基本的にやっていることは、さきほど紹介したforでのループ処理があって、ループ内での処理は、すでに紹介済みのwgetとsedをパイプでつないだもの、ってことです。

行末にある「\」は、本当は1行で書くべきところを、(長すぎるので)途中で改行したときに、改行の意味を打ち消すために入れるものです。

#」はコメントを表す記号です。「#」以降に書いたものが、コメントとして無視されます。

$i」は、実行時に変数iの値で置き換わります。中には、「${DIR}」というように、{ }で囲んでいる部分があるのですが、今回の場合$DIRと書いても同じです。たとえば、変数DIRの値に、"def"という文字列をつなげたい場合、「$DIRdef」と書いてしまうと、変数DIRdefの値、という意味になってしまうので、それを避けるために「${DIR}def」と書きます。



sedとかwgetとかコマンドを実行するときに、/usr/bin/sedや/usr/local/bin/wgetのようにフルパスで指定していますが、これは環境変数PATHの影響を受けないようにするためです。



● ` ` とは

この例のポイントは、出力先のファイル名を、うまく自動的に取り出しているところでしょうか。

出力先のファイル名は、変数OUTFILEで指定していますが、これは、

OUTFILE=`echo $i | sed 's:.*/::'`

というふうにして、代入しています。

変数代入の右辺に、「`」(バッククォート)で囲まれた部分がありますが、「` `」の中をコマンドとして、実行した結果で置き換わります。

$iにはURLが入っているので、sedでURLを書き換えた結果が、変数OUTFILEに代入されることになります。sedへ入力するデータが変数に入っているので、変数の内容を、echoコマンドでいったん標準出力へ出してから、パイプ経由でsedにそそぎこんでいるのです。



● (おまけ) basename
ファイル名部分を切り出す処理は、たぶん、basenameというコマンドを使っても、うまくいくと思います。すべてのプラットフォームのbasenameコマンドが、URLに対しても意図どおり処理してくれるのか、保証はできませんが・・・



OUTFILE=`basename $i`

(実行例)



% basename http://www.asahi.com/index.html
index.html



/usr/local/etc/hoge.confのようなフルパスから、ディレクトリ部分、ファイル名部分を切り出すのに、dirnameコマンド、basenameコマンドがあります。
basenameコマンドは、拡張子を取り除く機能もあります。



% basename index.html .html
index



● 「*」でマッチする範囲

sedでは s:.*/:: という置換処理をやっていますが、これは、URLの一番最後のファイル名部分を切り出してくる処理をやっています(というか不要な部分を削除しています。ちなみにデリミタを「:」にしています)。

http://rss.itmedia.co.jp/rss/1.0/topstory.xml

のときは、topstory.xmlの部分が切り出されてきます。

置換の検索文字列が「.*/」となっていますが、これにマッチするのは

http:/
http://
http://rss.itmedia.co.jp/
http://rss.itmedia.co.jp/rss/
http://rss.itmedia.co.jp/rss/1.0/

というように、何通りもあります。しかし、「*」によるパターンマッチのときは、もっとも長い文字列にマッチすることになっているので、http://rss.itmedia.co.jp/rss/1.0/ にマッチすることになります。


■ まとめ

シェルスクリプト・プログラミングの雰囲気を感じ取れてもらえたでしょうか。

sedとかshとか使いこなせるようになると、めんどくさい単純作業の多くは、自動で処理できるようになりますよ。


■ sedへの招待 全3話+1







2006年9月2日土曜日

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

先日、

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

というのを思いつきで書いてみたら、なんだか自分でもノリノリな気分になってしまったので、今日は、その落ち穂拾いみたいな内容で行ってみることにします。



(注意) ブラウザによっては、長い行が、右端にはみ出して、見えなくなってしまっているようです。すみませんが、その点、ご注意ください。はみ出した部分を含むように、全体をコピーして、エディタなどへペーストすれば、とりあえず見えるようになります。





■ 今日の例題はITmediaのRSS



前回は、Impress WatchのWebサイトのRSSの書き換えを例としてあげました。じゃあ今日は・・・ということで、ITmediaを選びました。



ITmediaって、しばらく前にリニューアルして・・・なんか個人的に、どこを見ていいのか、バラバラなかんじで、とまどってしまうのですが、たとえば、ITmediaのRSSって、いったいどこから採れるのか、わかりにくいきがしませんか?
最近になって、ようやく理解したのですが、「ITmedia」というサイトと、「+D」というサイトの入り口が、ごちゃごちゃに交じり合っていて、なんだか、設計を失敗した二世帯住宅?みたいな・・・



あ、ずいぶんと話が脱線しました。



まずは、ITmediaのRSSを取得してみましょう。



わたしはRSSリーダーとして、もっぱら、Mozilla Firefoxと、Sageという拡張機能(extension)を使用しています。

参考までに・・・
Firefox ― Webブラウザ

まず、 http://www.itmedia.co.jp/ をFirefoxで開いて、Sageの虫眼鏡のアイコン「フィードを発見する」をクリックすると、いくつか、RSSを見つけてくれます。



200609011



たくさんあるなぁ、と思うのですが、実際にこの中身を眺めてみると、なんか情報が少ないかなぁ~と思ったりするのです。



次に、 http://plusd.itmedia.co.jp/ をFirefoxで開いて、Sageでフィードを探してみますと・・・



200609012



なーんだ、PCとかゲームとかの話題は、こっちの方に入ってたんですね。さきほど、設計ミスの2世帯住宅と言ったのは、こういうふうに2つに分かれてたんだねぇ・・・という意味の皮肉でした(笑)。



■ たくさんRSSが見つかったねぇ~



というわけで、以下の6つのRSSを選んでみました。

ITmedia Top Story 最新記事一覧
http://www.itmedia.co.jp/news/fortop/
RSSは… http://rss.itmedia.co.jp/rss/1.0/topstory.xml



ITmedia +D 最新記事一覧
http://plusd.itmedia.co.jp/
RSSは… http://rss.itmedia.co.jp/rss/1.0/plusd.xml



ITmedia News 速報 最新記事一覧
http://www.itmedia.co.jp/news/bursts/
RSSは… http://rss.itmedia.co.jp/rss/1.0/news_bursts.xml



+D LifeStyle 最新記事一覧
http://plusd.itmedia.co.jp/lifestyle/
RSSは… http://rss.itmedia.co.jp/rss/1.0/lifestyle.xml




+D PC USER 最新記事一覧

http://plusd.itmedia.co.jp/pcuser/
RSSは… http://rss.itmedia.co.jp/rss/1.0/pcuser.xml




+D Games 最新記事一覧

http://plusd.itmedia.co.jp/games/
RSSは… http://rss.itmedia.co.jp/rss/1.0/games.xml


■ 今回の課題も、sedによるRSSの書き換え



さてさて、前回のImpress Watchのサイトの例では、URLから「?ref=rss」というのを削除したいなぁ~、という課題を出して、sedで書き換える方法を紹介しました。



今回のITmediaのサイトのRSSでは、「?ref=rss」はついていませんでした。じゃあ問題ないかというとそうとも言えませんでして、たとえば、「+D PC USER 最新記事一覧」のRSSから見えている

USBメモリに“思い出”をずっと残しておけますか?

という記事のURLは



http://cgi.itmedia.co.jp/rss/pcuser_1.0/plusd/pcuser/articles/0609/01/news112.html



となっているのですが、実際にこのアドレスをWebサーバにリクエストしてみると、



Location: http://plusd.itmedia.co.jp/pcuser/articles/0609/01/news112.html



というヘッダが帰ってきて、リダイレクトされてしまいます。ちなみに、こういうWebサーバとのやり取りは、wgetコマンドを使って、「wget -d http://cgi.~」と-dオプションつきで実行すると、詳しく眺めることができます。



結局、Webブラウザで表示されるのは、



http://plusd.itmedia.co.jp/pcuser/articles/0609/01/news112.html



というアドレスのページです。



「http://cgi.~」というリンクをブラウザでクリックしたはずなのに、実際にブラウザで表示されるのは「http://www.~」のページになります。またしても、RSSで見えているURLと、実際の記事のURLが異なる、という状況が発生しています。



この場合に困ったことというのは、「ブラウザでリンクをクリックして既読となっているはずの記事が、Sageで見えているRSSの一覧のほうでは既読にならない」、ということが起きることです。みんな、こういう既読状態にならないことって、気にしていないのかなぁ?



今回の課題は、実は前回の2個目の課題よりはずっと簡単なのですが、以上のようなURLの書き換え処理を、sedでやってみましょう、ってことにします。


■ 書き換えの規則性を見つける!



sedは、一定の規則にしたがって、テキストを書き換えるツールです。だから、sedを用いてテキスト書き換え処理をしたい場合は、「いかにして、書き換えの規則性を見つけるか」が、最初の問題となります。



まずは、2つのURLを見比べてみましょう。



http://cgi.itmedia.co.jp/rss/pcuser_1.0/plusd/pcuser/articles/0609/01/news112.html



http://plusd.itmedia.co.jp/pcuser/articles/0609/01/news112.html



上がRSSに入っているリンクアドレス、下が実際にブラウザで表示されるときのリンクアドレスです。



規則性は見つかりましたか?

/pcuser/articles/0609/01/news112.html

という部分が、両者で共通してますよね。たった1つの例だけから、「これが規則だ!」と決め付けるのは無理があるので、ほかのリンクについても、この規則が成り立つか、一応、確認してみる必要があります。・・・で、どうやら大丈夫そうです。



というわけで、書き換えの規則としては、



「http://cgi.itmedia.co.jp/rss/pcuser_1.0/plusd」を、「http://plusd.itmedia.co.jp」に置換する



で、うまくいきそうです。これは単純なテキスト置換処理なので、sedではsコマンドだけでできます。sedのコマンドで表現すると、こうなります。



sed 's|http://cgi.itmedia.co.jp/rss/pcuser_1.0/plusd|http://plusd.itmedia.co.jp|'



前回も少し触れましたが、sコマンドは、2文字目にデリミタ(区切り文字)を指定します。通常、デリミタとして「/」(スラッシュ)を使うことが多くて、「s/ABC/abc/」のように書くのが一般的です。しかし、sコマンドのデリミタは、「/」でなければいけないということは無くて、「:」(コロン)を使って「s:ABC:abc:」としてもいいし、「|」(パイプ記号)を使って「s|ABC|abc|」としてもかまいません。



今回、置換処理対象がURLだったので、「/」や「:」が置換対象の文字列に使われています。もしもデリミタで「/」を使う場合は、URL中の「/」がデリミタだと思われないようにする、エスケープ処理が必要になります。「/」をエスケープさせるには「\」記号をつけて、「\/」とします。そのため、先ほどのsedコマンドで、デリミタを「/」とした場合は、



sed 's/http:\/\/cgi.itmedia.co.jp\/rss\/pcuser_1.0\/plusd/http:\/\/plusd.itmedia.co.jp/'



・・・なんだかえらく見にくくなってしまいます。そのため、デリミタとして「|」を使ったのでした。sed遣いに大切なこと・・・いやいや、sed使いをめざすならば、こういった臨機応変さとか、自分以外の人がみてもわかりやすいように、と真心をこめてsedコマンドを記述するような、心配りも必要ですね。なんてな。


■ シェルのパイプ | とかリダイレクト > とかも憶えとこう



Unix遣いに大切なことは・・・スマートに仕事をこなすこと・・・です。



今回の、sedを用いたRSS書き換え処理の場合、



  1. wgetでRSSをダウンロードして、ファイルに保存


  2. 保存したファイルをsedで読み込みながら、置換処理を行って、ファイルに保存


という2段階の処理になるかと思います。これ、ちょっとスマートじゃないです・・・途中で、ファイルに保存している部分が、スマートじゃないんですね。



Unixの場合、こういうタイプの処理は、パイプをつかって、ファイルを作らずに、並列実行するのが、粋というものなのです。



パイプとは、「|」という記号で表して、

コマンド1 | コマンド2

のようにコマンドを実行します。こうすると、コマンド1とコマンド2が並列実行されて、しかも、コマンド1の標準出力が、コマンド2の標準入力へ接続されます。



C言語のプログラミングをやったことのある方なら、標準出力とか標準入力はよく知っているかと思いますが、ものすごく乱暴に説明してしまうと、こんなかんじです。



標準入力とは、入力ファイルを指定しなかったときに使われる、データの入力元のことです。普通は、キーボードから入力した文字列が、標準入力として使われます。「sed 's/ABC/abc/'」というコマンドを実行すると、キーボードから入力した文字列が置換されていきますが、これは、sedが標準入力からデータを読み取っているのです。

標準出力
とは、データの出力先ファイルをとくに指定しなかったに使われる、データの出力先のことです。普通は、画面に文字列が出力されていきます。「sed 's/ABC/abc/'」というコマンドを実行すると、置換後の文字列が画面に表示されていきますが、これは、sedが標準出力へデータを書き出しているのです。



たとえば、

sed 's/ABC/abc/' | nkf -e

とすれば、sedとnkfが並列実行されつつ、sedの出力がそのままnkfの入力として使われます。ちなみに、nkfは、文字コードを変換するコマンドです。



パイプのほかに、リダイレクトも憶えておきましょう。リダイレクトには、入力のリダイレクトと、出力のリダイレクトがあります。



入力のリダイレクトは、< 記号を用いて、以下のようにコマンドを実行します。

sed 's/ABC/abc/' < file1.txt

< がリダイレクトの記号。file1.txtはファイル名です。この場合、sedコマンドの標準入力として、ファイルのfile1.txtが使われることになります。つまり、file1.txtの内容がsedに読み込まれて、置換処理が行われ、結果は標準出力(この場合、画面)へ出てくることになります。




(実行例)



% cat file1.txt (ファイルfile1.txtの内容を表示する)
ABCDEFG     (ファイルの内容)
abc def     (ファイルの内容・つづき)
% sed 's/ABC/abc/' < file1.txt
abcDEFG     (sedの出力)
abc def     (sedの出力・つづき)



出力のリダイレクトは、> 記号を用いて、以下のようにコマンドを実行します。

sed 's/ABC/abc/' > file2.txt

> がリダイレクトの記号。file2.txtはファイル名です。この場合、sedコマンドの標準出力として、ファイルのfile2.txtが使われることになります。つまり、sedは、標準入力(この場合、キーボードからの入力)から読み出され、置換処理が行われ、結果はfile2.txtへ出力されることになります。



(実行例)



% sed 's/ABC/abc/' > file2.txt
ABCDEFG  (キーボードから入力)
abc    (キーボードから入力)
def    (キーボードから入力)
% cat file2.txt  (ファイルfile2.txtの内容を表示する)
abcDEFG   (置換されている)
abc
def


というわけで、パイプを使って


% sed 's/ABC/abc/' | nkf -e


と並列実行するのと、リダイレクトを使って


% sed 's/ABC/abc/' > file3.txt
% nkf -e < file3.txt


とするのは、意味としては同じなのですが、リダイレクトを使うと、いったん、ファイルが保存されるので(こういうファイルのことを中間ファイルと呼びます)、その分処理に時間がかかるようになります。一方、パイプなら、ファイルは作られず、すべて、メモリ上でのデータのコピーだけで処理がすすむので、処理効率が向上するのです。



RSSをダウンロードして、sedで書き換えて、ファイルに保存するまでの処理を、パイプとリダイレクトを使って、1度に実行すると、以下のようになります。



% wget -q -O - http://rss.itmedia.co.jp/rss/1.0/pcuser.xml | sed 's|http://cgi.itmedia.co.jp/rss/pcuser_1.0/plusd|http://plusd.itmedia.co.jp|' > ! pcuser.xml



wgetで指定している、「-q」オプションは、処理の進行状況などを画面に表示しないようにする指定です。別になくてもかまいません。見栄えだけのことです。そのあとの「-O -」は、ダウンロードしたデータを、ファイルに保存するのではなく、標準出力へ出力しなさい、という指示です。「-O ファイル名」と指定するのが一般的ですが、特例として、ファイル名を「-」としたとき、標準出力へ出力されるようになっています(そうなるように、wgetがそうプログラミングされている)。



そのあと、パイプ | があるので、ダウンロードしたデータは、そのままsedへ入力されることになります。



sedで置換処理が実行され、結果は、> で出力がリダイレクトされているので、ファイルpcuser.xmlに保存されることになります。


■ 正規表現を用いた置換処理



その他のRSSの書き換え処理もやってみましょう。



先ほど示した、

+D PC USER 最新記事一覧
http://plusd.itmedia.co.jp/pcuser/
RSSは… http://rss.itmedia.co.jp/rss/1.0/pcuser.xml

のRSSの書き換え処理は、sedコマンドがこうなりました。



s|http://cgi.itmedia.co.jp/rss/pcuser_1.0/plusd|http://plusd.itmedia.co.jp|

+D LifeStyle 最新記事一覧
http://plusd.itmedia.co.jp/lifestyle/
RSSは… http://rss.itmedia.co.jp/rss/1.0/lifestyle.xml

の場合は、たとえば、



http://cgi.itmedia.co.jp/rss/lifestyle_1.0/plusd/lifestyle/articles/0609/01/news091.html





http://plusd.itmedia.co.jp/lifestyle/articles/0609/01/news091.html



のように書き換えたいので、さっきと同様に、



s|http://cgi.itmedia.co.jp/rss/lifestyle_1.0/plusd|http://plusd.itmedia.co.jp|



とすればよさそうです。

+D Games 最新記事一覧
http://plusd.itmedia.co.jp/games/
RSSは… http://rss.itmedia.co.jp/rss/1.0/games.xml

の場合も同様で、たとえば



http://cgi.itmedia.co.jp/rss/games_1.0/plusd/games/articles/0609/01/news083.html





http://plusd.itmedia.co.jp/games/articles/0609/01/news083.html



へ書き換えることになるので、



s|http://cgi.itmedia.co.jp/rss/games_1.0/plusd|http://plusd.itmedia.co.jp|



です。

ITmedia News 速報 最新記事一覧
http://www.itmedia.co.jp/news/bursts/
RSSは… http://rss.itmedia.co.jp/rss/1.0/news_bursts.xml

も同様です。



http://cgi.itmedia.co.jp/rss/news_bursts_1.0/www/news/articles/0609/01/news108.html





http://www.itmedia.co.jp/news/articles/0609/01/news108.html



のようになればよいので、



s|http://cgi.itmedia.co.jp/rss/news_burst_1.0/www/|http://www.itmedia.co.jp/|'



でよさそうです。



それでは、

ITmedia Top Story 最新記事一覧
http://www.itmedia.co.jp/news/fortop/
RSSは… http://rss.itmedia.co.jp/rss/1.0/topstory.xml

の場合はどうでしょうか・・・ちょっとこれまでとは違っていて、書き換え対象のURLが、いろいろなタイプに分かれています。



書き換え元のURLの例
http://cgi.itmedia.co.jp/rss/topstory_1.0/www/bizid/articles/0609/01/news057.html
http://cgi.itmedia.co.jp/rss/topstory_1.0/www/news/articles/0609/01/news054.html
http://cgi.itmedia.co.jp/rss/topstory_1.0/www/enterprise/articles/0609/01/news051.html
http://cgi.itmedia.co.jp/rss/topstory_1.0/plusd/pcuser/articles/0609/01/news029.html



書き換え後のURLの例
http://www.itmedia.co.jp/bizid/articles/0609/01/news057.html
http://www.itmedia.co.jp/news/articles/0609/01/news054.html
http://www.itmedia.co.jp/enterprise/articles/0609/01/news051.html
http://plusd.itmedia.co.jp/pcuser/articles/0609/01/news029.html



次も見てみましょう。

ITmedia +D 最新記事一覧
http://plusd.itmedia.co.jp/
RSSは… http://rss.itmedia.co.jp/rss/1.0/plusd.xml

これも、何タイプかあります。



書き換え元のURLの例
http://cgi.itmedia.co.jp/rss/plusd_1.0/plusd/mobile/articles/0609/01/news005.html
http://cgi.itmedia.co.jp/rss/plusd_1.0/plusd/lifestyle/articles/0609/01/news111.html

書き換え後のURLの例

http://plusd.itmedia.co.jp/mobile/articles/0609/01/news005.html
http://plusd.itmedia.co.jp/lifestyle/articles/0609/01/news111.html



こうやって見ると、書き換えのパターンが、同様だといってもRSSごとに微妙に違っていたり、1つのRSS内でも複数通りの書き換えパターンがあったりしますし、何通りもあって、sedのコマンドを書く数が増えていき、だんだん、めんどくさい気がしてきました。



もうちょっと、簡単に書き換えの規則を指定できないか? ・・・ できます。正規表現を使うと、とっても簡単に指定できるようになります。



正規表現というのは、ファイル名検索とか文字列検索機能で使えるワイルドカード「*」(アスタリスク)を、何倍も強力にしたようなものです。正規表現を使うと、文字列検索で指定できる、特別な検索パターンを指定することができます。



実は、以上のすべての書き換え規則は、以下のたった1つの規則だけで、まかなうことができます。



sed 's|http://cgi.itmedia.co.jp/rss/[^/]*/\([^/]*\)/|http://\1.itmedia.co.jp/|'

(2006/9/2 訂正) *が1個抜けていました。

(2006/9/7 追記) 以下のような感じの書き換えパターンが見つかり、上記のルールだけでは不十分でした。

(書き換え前)
http://cgi.itmedia.co.jp/rss/topstory_1.0/atit/flinux/rensai/linuxtips/932newfc5dvd.html

(書き換え後)
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/932newfc5dvd.html

仕方ないので、2つの置換コマンドで対応することにしてみました。

/usr/bin/sed '
s|http://cgi.itmedia.co.jp/rss/[^/]*/atit/|http://www.atmarkit.co.jp/|g
s|http://cgi.itmedia.co.jp/rss/[^/]*/\([^/]*\)/|http://\1.itmedia.co.jp/|g
'







(2007/1/23 追記) さらに、以下のような感じの書き換えパターンが見つかり、上記のルールだけでは不十分でした。

(書き換え前)
http://cgi.itmedia.co.jp/rss/topstory_1.0/tt/tt/news/0701/19/news01.html



(書き換え後)
http://techtarget.itmedia.co.jp/tt/news/0701/19/news01.html

仕方なく、置換コマンドを1つ追加し、合計3つの置換コマンドで対応することにしてみました。

/usr/bin/sed '
s|http://cgi.itmedia.co.jp/rss/[^/]*/tt/|http://techtarget.itmedia.co.jp/|g
s|http://cgi.itmedia.co.jp/rss/[^/]*/atit/|http://www.atmarkit.co.jp/|g
s|http://cgi.itmedia.co.jp/rss/[^/]*/\([^/]*\)/|http://\1.itmedia.co.jp/|g
'

~~~追記はここまで~~~



ここで使用している正規表現について、詳しく説明していきます。




● [ ] の使い方



[~]は、[]内に列挙した文字のどれか1文字にマッチします。たとえば[ABC]は、AかBかCのどれか1文字にマッチします。マッチするのは、1文字だけです。



列挙するときに「-」(マイナス、ハイフン)も使えて、[A-N]なら、AからNまでの文字列、ようするに、[ABCDEFGHIJKLMN]と同じ意味になります。



[ ]の中に「^」を入れると、「^」のあとに列挙されている文字以外にマッチします。たとえば[^ABC]は、AでもBでもCでもない文字にマッチします。



そのため、[^/]は、/以外の1文字とマッチします。



実行例



% sed 's/[ABC]/x/'
ABCDEFG
xBCDEFG
% sed 's/[ABC]/x/g'
ABCDEFG
xxxDEFG
% sed 's/[^ABC]/x/'
ABCDEFG
ABCxEFG
% sed 's/[^ABC]/x/g'
ABCDEFG
ABCxxxx



sコマンドのフラグgの、あるなし、にも注目してください。gがない場合、1行中の一番最初にマッチした1回しか置換が行われないのに対して、gがあると、マッチするところすべてに対して置換が行われます。



● * の使い方



「*」(アスタリスク)は、その直前の文字の、0回以上の繰り返しにマッチします(言葉で説明すると、わかりにくいですね)。たとえば「A*」だと、Aの0回以上の繰り返しにマッチするので、A、AA、AAA、AAAAAAAなどにマッチします。ここが重要なのですが、長さ0の文字列にもマッチするため、何にもない「空文字」にマッチしてしまいます(ここが、正規表現と、そのほかのワイルドカード処理、ファイル名glob処理などとの違うところです)。そのため'A*B'で検索すると、「ABC」や「AABC」が検索されるのは当然として、「BC」なども検索されます。ややこしいですが「*」の性質に慣れてください。以下に、sedでの実行例を示します。



実行例



% sed 's/A*B/xxx/'
ABC     (入力)
xxxC     (ABがxxxで置換された)
AABC     (入力)
xxxC     (AABがxxxで置換された)
AAABC    (入力)
xxxC     (AAABがxxxで置換された)
BCDE     (入力)
xxxCDE    (Bがxxxで置換された)



オマケ

(1) 検索文字列「yozuca*」は、次のすべてにマッチします。
yozuc
yozuca
yozucaa
yozucaaa
yozucaaaa
yozucA
yozucぁ
検索文字列として指定するなら「yozuca*」でなくて「yozuc」で十分ってことですね。



(2) MS-DOS、Windowsのコマンドプロンプト、Unixのシェル(sh,csh,bash,...)などで、「*」をファイル名を指定するときに使えますが(ああいう処理をglobとかglobbingといいます)、あれは「*.txt」みたいな書式もあるので、ワイルドカードというものでして、このsedの正規表現の「*」とは微妙に違います。



(3) なんか忘れてるな~という気がしていて、やっぱり1つ、基本的なのを忘れていました。正規表現の「*」(アスタリスク)を紹介したのに、「.」(ピリオド、ドット)を忘れていました。「.」は*よりも単純で、『任意の1文字』にマッチする記号です。



実行例: 「A.C」にマッチする文字列を「ABC」へ置換する



% sed 's/A.C/ABC/'
AAC  ・・・入力した文字
ABC  ・・・置換結果
ACC  ・・・入力した文字
ABC  ・・・置換結果



(2006-10-22)

● \( \) と \数字 の使い方



\( \) は検索対象文字列の中に指定するもので、検索の結果、マッチした文字列が記憶されます。置換文字列に\1のように書いておくと、記憶された文字列が、\1の部分に代入されます。\( \) は何個でも指定できるので、先頭から順番に、\1、\2、\3と指定できます。



実行例



% sed 's/AB\([CDE]*\)FG\([HIJ]*\)KL/\2=\1/'
ABCDEFGHIJKL     \1にCDE、\2にHIJがマッチしているので、
HIJ=CDE        そのように置換された。
ABC          検索条件にマッチしないので、
ABC          置換されずにそのまま出力された。
ABCCCCCFGHHHHHHHKL  \1にCCCCCが、\2にHHHHHHHがマッチしている
HHHHHHH=CCCCC




● 例を解読してみよう



以上がわかれば、この例も理解できるようになるはずです。

sed 's|http://cgi.itmedia.co.jp/rss/[^/]*/\([^/]\)/|http://\1.itmedia.co.jp/|'



[^/] は、/以外の文字なので、



[^/]* は、/以外の文字が(0文字以上)連続したもの、ということになります。



ということは・・・



/[^/]*/ は、/と/で囲まれた文字列にマッチします。



実際のRSS中のURLで、この位置(~/rss/のあと)で、この検索条件にマッチするのは、pcuser_1.0、lifestyle_1.0、games_1.0、news_bursts_1.0、topstory_1.0、plusd_1.0などの文字列です。

/\([^/]*\)/
は、/と/で囲まれた部分の文字列にマッチし、また、マッチした部分が、あとで \1 として利用できるようになります。



実際のRSS中のURLで、この位置(~/rss/の次の/の次)で、この検索条件にマッチするのは、wwwもしくはplusdです。



置換後の文字列に、\1 が使われているので、この位置にマッチした文字列(この例の場合では、wwwもしくはplusd)が入ることになります。



もう一度、代表的な、置換例をあげておきます。

書き換え前



http://cgi.itmedia.co.jp/rss/topstory_1.0/www/enterprise/articles/0609/01/news051.html
http://cgi.itmedia.co.jp/rss/topstory_1.0/plusd/pcuser/articles/0609/01/news029.html



書き換え後



http://www.itmedia.co.jp/enterprise/articles/0609/01/news051.html
http://plusd.itmedia.co.jp/pcuser/articles/0609/01/news029.html



これらの書き換えが、すべて、



s|http://cgi.itmedia.co.jp/rss/[^/]*/\([^/]*\)/|http://\1.itmedia.co.jp/|



という、単一のsedコマンドで、できます。スマートだと思いませんか?



(2006/9/7 追記) 上のほうで書いたように、厳密には、もう1個、置換コマンドが必要になりました。
(2007/1/23 追記) 同様にして、上のほうで追記しましたが、新たな書き換えパターンが発見されたため、さらにもう1個、置換コマンドが必要になりました。



またしても、だいぶ長くなってしまったので、つづきはまた後日・・・


■ sedへの招待 全3話+1









2006年9月1日金曜日

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

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



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



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