宇部市街地 周回サイクリングコース

今日は諸事情があって TOEIC を受験した。
吉田キャンパスで受験して、車で送ってもらって 17:00 くらいに自宅に帰りついたんだけど、神経を使いすぎて疲れたので、夕方であるにも関わらず気晴らしにサイクリングに出かけた。

コースは、
自宅~医学部~小羽山~宇部西高~宇部駅~藤曲~宇部港~フジグラン~宇部空港~常盤公園~工学部~自宅
と、宇部市街地を一周している。

このコースは山と海の両方を通れる上に、アップダウンが少ないのでおすすめ。
路側帯もフラットなタイプが多くて走りやすい。
宇部駅~藤山中のところは厚東川の土手を通ってもいいかも。
190 号線の厚東大橋~藤山交差点は路側帯がなくて危険なので、旧道を通る。
海沿いと言っても、大半が工業地帯なのは仕方ない。

ALPS LAB route で測ったら、約 24km だった。
自宅の場所を知られたくないので、スタート地点は沼交差点に変更している。

ALPSLAB route (宇部市街地周回コース)

そして帰宅してから、「情熱大陸」の 500 回記念放送を見るために 3 か月ぶりに TV のスイッチを入れたら、ソフトイーサの登氏が、ARP キャッシュポイゾニングの実演と思われることをやっていた。

PEAR::Net_Whois で IP アドレスから国名を調べる関数

アクセス元のホストの国籍を Apache のログからアクセス解析して、って頼まれたけど、どうしたらいいのかわからなくてスクリプトを書いてみた。
いろいろ調べたら、PHP の PEAR::Net_Whois を使えば、Whois 情報を取得できることがわかった。

サーバーに PEAR::Net_SocketPEAR::Net_Whois をインストールする。

$ pear install Net_Socket
$ pear install Net_Whois

でも、$whois->query() を行うときに、検索先の Whois サーバを指定しないといけない。
InterNIC のサイトを見る限り、IP アドレスの第 1 オクテット目ごとに、地域インターネット レジストラ (RIR) が決まっているらしい。(IP アドレスの割り当て状況)

それを参考に IP アドレスから、PEAR::Net_Whois を行う関数を作った。以下の通り。

function getWhoisFromIPAddr($ipaddr){
 //Include PEAR::Net_Whois
 require_once("Net/Whois.php");
 $whois = new Net_Whois;
 
 //Split IPaddr into 4 octets.
 preg_match("/^(\d{1,3}).(\d{1,3}).(\d{1,3}).(\d{1,3})(.*)/",$ipaddr,$oct);
 
 //Choose WHOIS server by 1st octet.
 if($oct[1]<=40){ $server="whois.arin.net"; }
 elseif($oct[1]==41){ $server="whois.afrinic.net"; }
 elseif($oct[1]<=57){ $server="whois.arin.net"; }
 elseif($oct[1]<=61){ $server="whois.apnic.net"; }
 elseif($oct[1]==62){ $server="whois.ripe.net"; }
 elseif($oct[1]<=61){ $server="whois.apnic.net"; }
 elseif($oct[1]<=76){ $server="whois.arin.net"; }
 elseif($oct[1]<=95){ $server="whois.ripe.net"; }
 elseif($oct[1]<=113){ $server="whois.arin.net"; }
 elseif($oct[1]<=126){ $server="whois.apnic.net"; }
 elseif($oct[1]<=132){ $server="whois.arin.net"; }
//  elseif($oct[1]==133){ $server="whois.apnic.net"; }
 elseif($oct[1]<=140){ $server="whois.arin.net"; }
 elseif($oct[1]==141){ $server="whois.ripe.net"; }
 elseif($oct[1]<=144){ $server="whois.arin.net"; }
 elseif($oct[1]==145){ $server="whois.ripe.net"; }
 elseif($oct[1]<=149){ $server="whois.arin.net"; }
 elseif($oct[1]==150){ $server="whois.apnic.net"; }
 elseif($oct[1]==151){ $server="whois.ripe.net"; }
 elseif($oct[1]==152){ $server="whois.arin.net"; }
 elseif($oct[1]==153){ $server="whois.apnic.net"; }
 elseif($oct[1]==154){ $server="whois.afrinic.net"; }
 elseif($oct[1]<=162){ $server="whois.arin.net"; }
 elseif($oct[1]==163){ $server="whois.apnic.net"; }
 elseif($oct[1]<=170){ $server="whois.arin.net"; }
 elseif($oct[1]<=171){ $server="whois.apnic.net"; }
 elseif($oct[1]<=185){ $server="whois.arin.net"; }
 elseif($oct[1]<=187){ $server="whois.lacnic.net"; }
 elseif($oct[1]<=188){ $server="whois.ripe.net"; }
 elseif($oct[1]<=191){ $server="whois.lacnic.net"; }
 elseif($oct[1]==192){ $server="whois.arin.net"; }
 elseif($oct[1]<=195){ $server="whois.ripe.net"; }
 elseif($oct[1]==196){ $server="whois.afrinic.net"; }
 elseif($oct[1]<=199){ $server="whois.arin.net"; }
 elseif($oct[1]<=201){ $server="whois.lacnic.net"; }
 elseif($oct[1]<=203){ $server="whois.apnic.net"; }
 elseif($oct[1]<=209){ $server="whois.arin.net"; }
 elseif($oct[1]<=211){ $server="whois.apnic.net"; }
 elseif($oct[1]<=213){ $server="whois.ripe.net"; }
 elseif($oct[1]<=216){ $server="whois.arin.net"; }
 elseif($oct[1]<=217){ $server="whois.ripe.net"; }
 elseif($oct[1]<=222){ $server="whois.apnic.net"; }
 elseif($oct[1]<=255){ $server="whois.arin.net"; }
 else;
 
 //Exec query to chose WHOIS server.
 if($server){ return($reply=$whois->query($ipaddr,$server)); }
 else{ return(0); }
}

133 で始まる IP アドレスといえば専ら、日本政府の機関、日本の国立大学法人 (うちの大学もそう)、日本の IT 企業のアドレスだから、APNIC なはずだけど、エラーがでるので、ARIN に問い合わせしている。
本来なら、エラーメッセージをもとに 2 次検索すべきなんだろうけど面倒なので省略する。

Whois 情報が返ってくるので、それを引数にしてに以下の関数を実行する。

function getCountryByWhois($result){
 preg_match("/country:( )*([a-zA-Z]{1,3})/i",$result,$country);
 if($country[2]){ return($country[2]); }
 else{ return(0); }
}

2 つの関数は、以下のようにして使える。

echo("Who is 133.62.198.174 ?<br />\n");
$result=getWhoisFromIPAddr("133.62.198.174");
echo("Country: ".getCountryByWhois($result));

実行すると、「Country: JP」とカントリーコードが出力される。

蛇足だけど、IP アドレスから会社名や法人名を調べるには、JPNIC のサーバ (whois.nic.ad.jp) に対して、$whois->query() を行えばよい。海外の企業も各国の下位レジストラの Whois サーバに置き換えれば検索できる。

Microsoft DreamSpark を早速試してみた

Visual Studio Professional 版などをタダで使えるらしいので国際学生証を申請した | BlueSky Lab.

国際学生証が届いたので、さっそく Microsoft DreamSpark を試してみた。
国際学生証は、樹脂製のカードに名前や生年月日がプリントされ、写真は提出したものをそのまま貼り付け、専用のシールで封印されたものだった。
写真は、デジカメで撮影したものを加工してインクジェットプリンタで光沢紙に印刷したものだったので、光や水に弱そう。

DreamSpark のサイトは全て英語。
Windows Live のアカウントでログインしたあと、ISIC 番号を書かされるので、国際学生証の右下の S で始まる番号をスペース抜きで書く。最後の文字は書かなくてよいらしい。

選択した EULA (License Agreement) の言語によってダウンロードされるソフトウェアの言語が変わるみたい。
Visual Studio は DVD 版の ISO イメージとシリアル番号 1 つを与えられる。
Expression Studio は ZIP で与えられるので、解凍して CD-R に焼けばよい。
Windows Server は CD-ROM 版の ISO イメージ 2 枚分とシリアル番号 1 つを与えられる。

シリアルナンバーは決まったものを 1 つしか与えられないので、1 台分しかインストールできないようだ。
ところで、Visual Studio のイメージをマウントしたり、DVD に焼いたものを挿入すると、explorer.exe が「応答なし」になってフリーズする。何度やっても同じ。ISO イメージは 2 度ダウンロードしてみたけど同じ。他の PC でも試してみる。

追記 (2008.05.25)
フリーズの原因は DVD のライティングソフト (Record Now) だった。一時的にプロセスを終了させるか、アンインストールすれば OK。

写真用グラデーションペーパーの PDF

写真用グラデーションシート (プリントバックペーパー) が必要になったので、Illustrator で自作した。
A3 のプリンタがないので、セブンイレブンのネットプリントを使った。白黒なら 20 円。カラーなら 100 円。
もちろん、インクジェットプリンタやレーザープリンタでも印刷できる。

PDF ファイルを置いておくので、自由に使用してください。
グレー
ブルー

使い方は、下の写真のとおり。継ぎ目が目立つようなら Photoshop の修復ツールで隠せばよい。
Using Gradationed sheet

Visual Studio Professional 版などをタダで使えるらしいので国際学生証を申請した

ソフトウェア開発製品やアプリケーションデザインツールを学生に無償提供、 「Microsoft(R) DreamSpark(TM) (ドリームスパーク)」を5月13日(火)より開始
国際学生証ISICカード>Microsoft Dreamspark

昨日から、マイクロソフトが Visual Studio 2008 Professional 版や、Windows Server 2003、Expression Studio などを学生なら無償で使えるという、太っ腹な企画、「Microsoft DreamSpark」を始めた。(詳しいことは上記サイトを参照)
「Expression Blend 欲しいな~」って思ってた矢先に、なんと Expression Studio も対象だったのでビックリ。

申込に国際学生証が必要なので、大学生協で申請しておいた。
必要な書類は、
・申請書 (大学生協のサイトからダウンロード可能)
・証明写真 (3.3×2.8cm、裏に記名)
・学生証のコピー
・手数料 ¥1,430
吉田キャンパスなら即日発行なんだけど、工学部常盤キャンパスは 2 日かかるそうだ。とはいっても早いと思う。


最近、アップルのパクリなのか知らないけど、学生にやさしい企画が多い気がする。しかし、この MS の場合は大学生だけでなく、高校生や中学生にも無償で提供するべき。むしろ、高校生や中学生、できれば小学生に無償提供するべき。

という理由は、私が小学校 6 年くらいの頃でプログラミングに興味を持ち始めた頃、どうしても Microsoft Visual Basic 6.0 が高額すぎて自力では購入できないし周りに買ってくれる人もいなかったので、Windows アプリケーションのプログラミングをなくなく諦めた思い出がある。

その時、たまたま HTML でホームページを作ってたこともあって Perl に出会った。必要なものがサーバとエディタと FTP ソフトだけで全て無料で揃うので、それ以来ずっと Web 一筋で勉強してきた。
Perl の書籍とか持ってなかったけど、ネットサーフレスキューや KENT WEB のスクリプトがサイトから自由にダウンロードできたので、そのコードを見よう見まねで書いてた。

もしあの頃、DreamSpark のような企画や Express Edition のような無償版があったならば、間違いなく今も Windows アプリケーションばかり生産していただろう。
以上の理由で、Visual Studio を愛用する学生や技術者を増やしたいならば、大学生よりもっと若い世代に提供するべき。


全角と半角の間に入れるスペースの入力規則

このブログではどうしてもマニュアルのような文章を書くことが多いので、少し前から読みやすいように全角と半角の間にスペースを空けるよう心がけている。

でも、全ての全角と半角の間に入れていいのか、疑問に思うときがあって迷ってしまうんだけど、偶然マイクロソフト社のサイト (Microsoft Language - Download Page) で、「日本語スタイルガイド 公開版 (第 1 版)」という素晴らしいファイルを見つけたので、それを参考に紹介する。


1. 原則として全角文字と半角文字 (記号を含む) の間には半角スペースを入れる。
半角で書ける文字は基本的に全て半角を使用する。
"。、「」『』・~" の記号は全角を使用する。それ以外の記号は半角を使用する。

2. 例外としてスペースが不要な場合
・句読点 (、。) と隣接する半角文字の間
・数値と角度の単位記号 (°) の間
・かっこの内側
・スラッシュ (/) と隣接する文字の間
・疑問符 (?) や感嘆符 (!) と、その前の全角文字との間
・アクセス キーを表す文字を囲むかっことその直前の文字の間 [例: 開く(O)]

3. 全角どうしの間でもスペースが必要な場合
・欧文地名以外の複合語をカタカナ表記するとき
・参照先として他の章を本文中で示すとき

以上、大きく 3 点。これだけで技術系の文章はより読みやすくなるだろう。
このマニュアルには、記号の使い方やキーの表記、文体の使い分けなども掲載されていて参考になる。Microsoft GJ!!

DELL PowerEdge SC440 タワーサーバをゲットした

某氏より日頃のごほうびとして DELL PowerEdge SC440 タワーサーバ を頂いた。
普通に買ったら ¥120,000 くらいするけど、安いときを狙ったので ¥50,000 くらい。

スペックはこんな感じ。OS は CentOS 5.1 をインストールする。

CPU: Core2Duo E4500 (2.2GHz DualCore)
メモリ: 1GB×2枚 ECC
HDD: 80GB×2台 SATA RAID1
その他: RAID ボード(SAS5iR)

DELL PowerEdge SC440
手前のが DELL SC440。奥のはデスクトップ。使い古したハードディスクはペーパーウェイトとして再利用。

DELL SC440 inside
ケースを開けてみたところ。レバーを引くだけで簡単に開く。
とてもスマートにおさまっているけど、こんなに長い SATA ケーブル見たことない。
HDD が本来あるはずのところにフロントファンがついてて、底に HDD が 2 台取り付けられている。
ちなみに、HDD は Western Digital 製、メモリは Kingston 製だった。

「日曜日にセットアップするよー」と事前に知らせておいたら、学科の後輩の 2 年生、3 年生が自宅兼実験室に見物に来た。だけど、「サーバってなに?」、「サブネットマスク ?」、「管理者権限 ?」って感じだったので、話しながらゆっくりやってたら 5 時間くらい経ってしまった。
教えるのは苦にならないけど、残りのセットアップは一人でやる。