2008年02月07日(木) 21:17 [日記・その他

先月16日に発売された「Inspiron1525」をDELL通販で購入してみた。安価なうえに、標準搭載の入出力端子がおいしい。

  1. IEEE1394a
  2. 8-in-1 メモリカードリーダ
  3. VGAビデオ出力/S-Video
  4. HDMIポート

今使用しているノートも(値段を除けば)この辺りが決め手となったので、ポイントが高い。
正直、「hp dv6700 雫」も良かったかなぁと思うのだが、hpは英語キーボードを別途入手するのが面倒なので今回は見送りとなった。

そんなわけで、商品自体は満足出来そうである。不満なのはDELLの通販そのものだ。

支払い方法で「ジャパンネット銀行から振り込み」を選択したのだが、発注後のメールでは「現金前振込」となっており、三菱東京UFJ銀行の口座が記載されていた。選び間違えたかと思い、DELLのサイトから注文内容を確認しようとしたのだが、それらしきページがどこにも見当たらない(見落としか?)。オーダーステータスという注文状況を確認する機能を使おうとしたら、入金後か発注数日後にならないと使えないとのこと。

送られてくるメールも日本語変だし、正直不親切すぎやしないか。

結局、待ちきれずに振り込んでしまったのだが、無事受注確認のメールが届いた。
さすがにここまで来れば後は待つだけなので一安心ではある。

2008年02月05日(火) 23:00 [Perl

PerlのNet::DNSモジュールを使用して、DNSに問い合わせを行ってみる。

Net::DNSモジュールのインストール

標準ではNet::DNSがインストールされていないため、cpanにてインストールを行う。

$ su -
Password: **********
# perl -MCPAN -e shell
cpan>install Net::DNS

これでインストールは完了。
cpanを最初に利用する場合は設定などを聞かれるが、私の場合、ほぼ全てを初期値のままで設定した。「Asia」、「Japan」とダウンロード先のサーバを指定した程度だ。

Windowsの場合はPPMなどを利用すると良いだろう。その辺りのことについては別の機会に投稿しようと思う。

正引き(ホスト名→IPアドレス)

ホスト名からIPアドレスを取得する。

use strict;
use Net::DNS;

my $host = 'spring.sakurasaita.net';
my $res = Net::DNS::Resolver->new;

#ホスト名のIPアドレスを取得(正引き)
if(my $query = $res->search($host, 'A')){
    # Aレコードのみを取得し、IPアドレスの一覧を印字
    print map {$_->address."\n"} grep($_->type eq 'A', $query->answer);
}else{
    print $res->errorstring, "\n";
}

answerの結果でtypeがAレコードの場合のみaddressを取得している。これには訳があり、取得しようとするホスト名がCNAMEレコードだった場合、addressが使用できず、「$_->address」でエラーが発生してしまうためだ。

レコードの種類については、「@IT:主なDNSレコードの種類」が参考になる。

上記のスクリプトを実行すると以下のような結果になる。

# $hostが「spring.sakurasaita.net」の場合
$ perl dns.pl
210.250.97.3
# $hostが「www.google.com」の場合
$ perl dns.pl
66.249.89.104
66.249.89.147
66.249.89.99

逆引き(IPアドレス→ホスト名)

IPアドレスからホスト名を取得する。IPアドレスは任意のものに変更した方が確実に動作するかもしれない。

use strict;
use Net::DNS;

my $ip = '66.249.89.99';
my $res = Net::DNS::Resolver->new;

# IPアドレスのホスト名を取得(逆引き)
if(my $query = $res->search($ip, 'PTR')){
    # PTRレコードのみを取得し、ホスト名の一覧を印字
    print map {$_->ptrdname."\n"} grep($_->type eq 'PTR', $query->answer);
}else{
    print $res->errorstring;
}

answerの結果でtypeがPTRレコードの場合のみホスト名を取得している。これを実行すると以下のような結果になる。

$ perl dns.pl
jp-in-f99.google.com

任意のDNSサーバに問い合わせる  正引き(ホスト名→IPアドレス)

DNSサーバのIPアドレスを更新した場合、周囲のDNSサーバに変更が反映されるまでには多少の時間が必要になる。例えば、ダイナミックDNSサービスを使用していて、IPアドレスの更新を行い、更新が正常に行われているか確認するとする(VALUE-DOMAINなどたまに更新されていないことがある)。その際、プロバイダのDNSサーバに問い合わせたのではタイムラグの問題で変更が反映されていない可能性がある。よって、ドメインを管理している大元のDNSサーバに問い合わせるのが最も確実な方法となる。

下記のスクリプトは、ドメインを管理しているDNSサーバを取得し、取得したDNSサーバに問い合わせを行っている。

use strict;
use Net::DNS;

my $domain = 'sakurasaita.net';
my $host = 'spring.sakurasaita.net';
my $res = Net::DNS::Resolver->new;
my @ns;

# ドメインを管理しているDNSサーバの一覧を取得
if(my $query = $res->query($domain, 'NS')){
    # NSレコードのみを取得し、DNSサーバの一覧を取得
    @ns = map {$_->nsdname} grep($_->type eq 'NS', $query->answer);
    # 取得したDNSサーバの一覧を印字
    print "DNSサーバ:\n";
    print map {"$_\n"} @ns;
}else{
    print $res->errorstring, "\n";
    exit;
}

# 問い合わせるDNSサーバを設定する
$res->nameservers(@ns) if(@ns > 0);

# ホスト名のIPアドレスを取得(正引き)
if(my $query = $res->search($host, 'A')){
    # Aレコードのみを取得し、IPアドレスの一覧を印字
    print "IPアドレス:\n";
    print map {$_->address."\n"} grep($_->type eq 'A', $query->answer);
}else{
    print $res->errorstring, "\n";
}

上記のスクリプトを実行すると以下のような結果になる。

$ perl dns.pl
DNSサーバ:
ns3.value-domain.com
ns1.value-domain.com
ns2.value-domain.com
IPアドレス:
210.250.97.3

「spring.sakurasaita.net」のIPアドレスを問い合わせているのに、DNSサーバの一覧を取得する部分では「sakurasaita.net」を指定している。これは、「spring.sakurasaita.net」にNSレコード(ドメインを管理するDNSサーバを定義するレコード)を指定していないからであって、必ずしも上位レベルのドメインを指定しなければいけないというわけではない。

私の場合、一部のサブドメインにNSレコードを設定しているが、そのサブドメインはDNSサーバの一覧取得にも使用できる。

# 上記スクリプトの下記変数の値のみ変更
my $domain = 'flower.sakurasaita.net';
my $host = 'flower.sakurasaita.net';

上記の変更を行った後に実行すると以下のような結果になる。

$ perl dns.pl
DNSサーバ:
ns1.dns.ne.jp
ns2.dns.ne.jp
IPアドレス:
219.94.128.32

ダイナミックDNSのIPアドレスを更新した後、問い合わせるDNSサーバを指定した場合としなかった場合とで結果を比べてみれば違いが分かると思う。

まとめ

CGIを作成するのであればあまり必要の無い知識だが、スクリプトで手軽にDNS問い合わせを行えるのはおもしろい。このモジュールを利用してダイナミックDNSサービスのIPアドレスを更新するスクリプトを作成してみようと思う(というより、既に作成してあるのでまとめて投稿しようと思う)。

『外国人が「日本に長く居すぎた…」と実感するとき』という記事が秀逸。

4. 外国人が電車に乗っているのを見て、「わおっ、ガイジンがいるっ」と思うとき

爆笑w

他は以下から。

痛いニュース:『外国人が「日本に長く居すぎた…」と実感するとき』

2008年02月02日(土) 2:51 [WordPress

WordPress標準のエディタが非常に使いづらい。デフォルトではビジュアルエディタが有効になっており、投稿の編集時はまずビジュアルエディタに投稿が読み込まれるのだが、私はもっぱらコードエディタで編集を行っている。そのためすぐにコードエディタへ切り替えるのだが、一度ビジュアルエディタで読み込んでしまうとソースが意図しない形に変換されてしまう。これでは編集を行うたびに細かい修正が必要になってしまい、非常に不便だ。

また、投稿を表示する際に改行コードをbrタグに変換するなどの処理が行われているのだが、意図しない部分にpタグが挿入されてしまうことが多い。基本的には重宝する機能なわけだが、codeタグ内にpタグを埋め込まれてしまうとcodeタグのCSSが効かなくなってしまい困ってしまう(何かうまいCSSの書き方があるのかもしれないが、見つけることが出来なかった)。
それだけではなく、「<p></code></p>」のように不可思議なネストが生成されてしまう場合もある。

機械的に文章を解析しタグを挿入しているわけだから、不都合が生じるのは仕方のないことだが、如何せん不便と思うパターンが多すぎる。そこで、WordPressの癖を覚えつつ、やむを得ない部分はソースの改造を行い、エディタと上手な関係を築けるように工夫していこうと思う。

ビジュアルエディタを無効にする

冒頭に書いた通り、ビジュアルエディタはソースを変換してしまうので無効に設定する。

管理画面の「ユーザー」タブからビジュアルエディタを無効にしたいユーザーを選び、編集画面の「ビジュアルエディタを使用する」のチェックを外し、「ユーザーを更新」を押してやれば無効になる。これで、編集画面からはビジュアルエディタのタブが無くなり、最初からコードエディタでソースが読み込まれるようになる。

codeタグ内のpタグを除去する

投稿表示の際に挿入されるpタグをどこまで制御するか迷ったが、回避策を見つけることが出来なかった「codeタグに挿入されるpタグ」に対してのみ対策を取ることにした。これには、WordPressのソースを一部変更する必要がある。

wp-includesのformatting.phpを編集する。「function wpautop」で検索するとpタグやbrタグの挿入処理を行っている関数が見つかるので、関数末尾の「return $pee」の前に下記の2行を挿入する。

$pee = preg_replace('| {4}|', str_repeat('&nbsp;',4), $pee);
$pee = str_replace('\\', '\\\\', $pee);
$pee = preg_replace(
        '|<code.*?>.*?</code>|se'
        , "str_replace(array('<p>', '</p>'), array('', '<br /><br />'), '$0')"
        , $pee);
$pee = StripSlashes($pee);

1行目では、半角スペースが4つ続いた場合に「&nbsp;」に変換し、ブラウザ上でも半角スペースを複数個表示できるようにしている。CSSで「white-space: pre;」とすれば、スペースのままでも期待通りに表示されるのだが、枠から溢れて表示されてしまうのに抵抗があったため、使用していない。

2行目では、投稿内の「\」を「\\」にエスケープしている。理由は4行目に関わってくる。

3行目では、pタグを削除し、段落を設けるためにクロージング側のタグをbrタグ2つに変換している。今回のコードではここが主の部分となる。

4行目では、StripSlashesにより投稿内のエスケープを除去している。理由はpreg_replaceをeオプションで実行した場合に、文字列内のクォートがエスケープされてしまうからだ。例えば、<span class="comment">などとしている場合に、「"」が「\"」となってしまい、HTMLタグが正常に認識されなくなってしまう。その対策としてStripSlashesを使用するのだが、この関数は全てのエスケープ文字を除去してしまうため、「\n」などの「\」までが削除されてしまう。そこで2行目の処理が必要になってくるわけだ。

PHP未経験者とはいえ、後手に回る対応が多く、とてもスマートとは言えない手順となってしまったが、実利は得られるので良しとする。

ちなみに、pタグ・brタグの挿入を完全に停止してしまうには、wp-includesのdefault-filters.phpを下記のように変更すればいい。

add_filter('the_content', 'wpautop');
add_filter('the_excerpt', 'wpautop');
    ↓
// pタグ・brタグの挿入を停止するためコメントアウト
// add_filter('the_content', 'wpautop');
// add_filter('the_excerpt', 'wpautop');

これでそもそも変換処理が行われなくなる。

codeタグ前後のpタグを調整する

上述の手順でcodeタグ内のpタグは除去されるようになったが、codeタグ外のpタグが期待しない形で挿入されてしまう。具体的には、下記のようになる。

<p>下記がコードです。<br />
<code>ここがコードです</code><br />
上記がコードです。</p>

本来は下記のように挿入して欲しい。

<p>下記がコードです。</p>
<code>ここがコードです</code>
<p>上記がコードです。</p>

前者の例になるのは、codeタグがインライン要素だからだ。「display:block」として無理やりブロック要素としているために、期待と相容れなくなってしまっている。そこで、codeタグがブロック要素として扱われるように変更する。

wp-includesのformatting.phpを編集する。pタグの除去と同様に「function wpautop」で検索した関数を変更する。

$allblocks = '(?:table|thead|tfoot|caption|colgroup|tbody~省略~)';
    ↓
// 先頭にcodeを追記する
$allblocks = '(?:code|table|thead|tfoot|caption|colgroup|tbody~省略~)';

これで、codeタグがブロック要素として扱われるようになるので、期待した通りにpタグが挿入されるようになる。当然ながら、pタグ除去の手順でpタグ・brタグの挿入を完全に停止してしまっていた場合はこの対応を行う意味が無い。

クォートの変換を無効にする

WordPressでは「'」や「"」のようなクォートなどが「&#****;」といったコードに変換されてしまうようだ。これではコードを記述する際に意図しない形になってしまい困ってしまう。コピー&ペーストも出来ない。

また、私の場合は下記のような問題が発生していた。二度登場する「'A'」に注目して欲しい。

if(my $query = $res->search($host, 'A')){
    # <span class="comment">を利用したあとのクォートが変換される。
    print map {$_->address."\n"} grep($_->type eq ‘A’, $query->answer);
}

この中途半端な状態について原因の特定は行っていないのだが、実はcodeタグ内のクォートは変換されないように作られているのではないかと予想している。しかし、<span>といった別のタグが呼び出されることで、それ以降がcodeタグ内ではないと判断され変換されてしまっているのではないか。もちろん想像に過ぎないのだが。

原因は何にせよ、クォートも入力した通りに表示して欲しいので変換機能を停止させてしまう。これにはプラグインを使用する。

Multimeter:『Kill WPTexturize』

このプラグインをwp-content\pluginsにアップロードし、管理画面から有効にするだけで全投稿のクォートが元のままで表示されるようになる。

また、この問題の解決には以下のサイトを参考にさせてもらった。

BirDesign:『クォーテーションを変換しないようにする』

まとめ

以上の作業を行うことで、WordPressでの編集作業がずいぶんと気楽に行えるようになった。

後は挿入されるpタグ・brタグのため、改行の位置にほんの少し気を遣っていくだけだ。

誰もが子供の頃に作った輪ゴム鉄砲の凄い版。

この「Disintegrator」銃は、普通の輪ゴムや紙飛行機を飛ばしているだけでは我慢できなくなった、ちょっと一線を越しちゃっている(!?)若者が作ったように見えますが、そうではありません。なんと、いじめっこを撃退すべくために作成したものだそうです。

GIZMO Japan:288連発!驚異のゴム輪銃「Disintegrator」(動画)

対人兵器らしい。

ところで、この記事を「マシンガン」として紹介しているサイトがあったが、これは「ガトリングガン」じゃないのかな。と思ったら、マシンガンでも正しいようだ。

リボルバー
回転式弾倉の拳銃。
ピストル
薬室が一つの拳銃。一般的にはオートマチックの拳銃のこと。
マシンガン(機関銃)
フルオートで高速連射可能な銃。フルオート機能必須。
ガトリングガン
マシンガンの一種。多銃身で薬室を回転させて発射する銃。
バルカン
ガトリングガンの動力を電動とし、航空機用とした商品の名前。
アサルトライフル
セミオートで連射可能な銃。フルオートや3点バーストを備えることがある。

厳密には~とか詳しくは~などと言われると弱るが、基本的にはこんな解釈でいいのではないかと思う。

バルカンが固有名詞だったのは知らなかった(そもそも上記の区別なんてほとんど知らなかった)。ステープラをホッチキス社が販売したからホチキスが一般名称と思われているのと一緒ということらしい。他にはパソコンのことを一太郎と呼んだり、コピー機のことをゼロックスと呼んだり。

マシンガン=アサルトライフルと思っていたけれど、それは違ったらしく、フルオート主点・セミオート主点で異なるらしい。ちなみに、フルオートは引き金を引いている間連射する機能で、セミオートは引き金一回に付き一発、3点バーストは引き金一回に付き三発らしい。全てに共通するオートとは排莢や次弾装填を自動化する機能のこと。

やはり銃器は歴史も機能も奥が深い。そして、そこに輪ゴムガトリングガンが追加されたことで歴史も銃器も一層深まったに違いない。

2008年01月30日(水) 0:16 [WordPress

いざブログを初めてみると、コンテンツの作成はだいぶ時間がかかってしまうし、小ネタもなかなか出てこない。このまま投稿無しに過ぎていくのも時間がもったいないので、WordPressの導入話を少し書いてみようと思う。(そもそも、そういうのが小ネタなのか?)

公開前から現在に至るまで、テーマをいじってみたり、未経験のPHPをちょっとだけ(本当にちょっとだけ)触ってみたりを繰り返しているのだけど、今日はプラグインというものを導入してみた。プラグインとは、名前の通りWordPressの機能をあれこれ拡張できちゃったりする便利な代物で、豊富なプラグインの存在がWordPressの魅力の一つとなっている(らしい)。しかし、英語サイトを見て回るのはやや疲れるので、下記のエントリを参考にさせてもらった。

Standing Tall:『WordPressプラグイン一覧』

大量のプラグインがジャンル別に(しかも簡潔に分かりやすく!)紹介されており、非常に参考になった。おかげ様で下記のプラグインを見つけ出し、導入することが出来た。

Fuzzy Recent Posts
最近の投稿を表示できる。対象を「投稿のみ」、「ページのみ」、「両方」で指定可能。
Fuzzy Recent Updates
最近の更新を表示できる。対象を「投稿のみ」、「ページのみ」、「両方」で指定可能。
Post Updated
投稿・ページの更新日を表示することができる。
Subscribe me
サイドバーにフィードを表示することができる。

WordPressのプラグイン導入手順も非常に簡単で、プラグインの「*****.php」ファイルを「wp-content/plugins」にアップロードし、管理画面の「プラグイン」タブから有効にするだけ。以前、MovableTypeにプラグインを導入したときは、(知識不足が大いに手助けし)非常に手間取った経験があるため、たったこれだけで幸せになれるものかと感心した。

現在、サイドバーに表示されている「最近の投稿」、「最近の更新」、「フィード」や、コンテンツに表示されている更新日などは上記プラグインのおかげとなる。

Recent Posts/Recent Updatesの改造

「Fuzzy Recent Posts」「Fuzzy Recent Updates」をサイドバーに追加するとレイアウトが崩れてしまう問題が起きた。各プラグインが出力する<DIV>タグでネストがおかしくなってしまうことが原因のようだったので、この部分を修正することにした。PHPは分からないけれど、この程度の変更ならばどうにでもなる。

$o .= $params['before_widget']
   . '<div class="tile sem_recent">';

$o .= $params['before_widget'];
$o .= '<div class="tile_body">';

*削除*
$o .= '</div>'
   . '</div>'
   . $params['after_widget'];

$o .= $params['after_widget'];

本来ならばよりスマートな解決方法があるのだろうけど、問題も解決したことだし、良しとしておく。それにしても、本当にプラグインは便利なものなので、お遊び系も含めまたいろいろと探してみようと思う。

2008年01月27日(日) 23:00 [日記・その他

とうとうブログを再開。
技術系の内容も含めていこうと思っているところで、最初の投稿がこれというのもどうかと思うけど、良しとしよう。

ミルクシーフードヌードルをもう一度食べたいと思い探し回ったのにどこにも売ってない。本当にどこにも売っていないので作ってみた。前向きな自分に乾杯。材料はシーフードヌードルと牛乳500ml。

そして、その成果。
ミルクシーフード
なんだかおいしそう。

お味のほどは非常にクリーミー。クラムチャウダーのようだ。
最初に食べた人はきっと罰ゲームに見舞われたのだろうけど、予想外においしく、罰ゲームにならないと騒ぐ周りの連中に醤油を入れられたりしたんだろうなぁと思う。

しかしながら、やはり牛乳500mlというのは強烈で、スープまで飲もうとするとかなり飽きがくる。コショウを入れてみたけど、ダメ。牛乳にはかなわなかった。牛乳は強い。

良い経験になるので一度くらい試してみると良いかと思う。

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