カテゴリー「パソコン・インターネット」の記事

日本国際賞授賞ニュースを見て

デニス・リッチー氏とケン・トンプソン氏が「日本国際賞」を受章したとのニュースを、今日0:00のNHKニュースで知りました。

ソフトウェア業界ではあまりにも有名すぎる、いわゆる「K&R」であり、彼らなくしては、今のIT産業の繁栄もインターネットの繁栄もなかったかもしれないと思うと、ノーベル賞受章にも値するのでは?と思うのですが。

おそらく、「K&R」の2人がいたから、「ソフトウェア開発で飯を食う」ほど、ITが「産業」と言うほど育つのに40年の時間を得ることが出来たのか?・・・もし「K&R」がいなかったら・・・?

少なくとも、2010年のウィキリークスとか2011年のチュニジアの政変はなかったかな。

| | コメント (0) | トラックバック (0)

ドメイン取引

ほんの1時間ほど前に届いたのですが・・・。

本家サイトのドメインであるpelleas.infoを購入したいと言う英文メールが届きました。
少し前にyahoo!ニュースあたりで「ドメインを取引する業者がある」というのを読んだことはあるのですが、まさか自分のところにそういう申し出がくるとは思ってもいませんでした。
何しろ10年以上使ってるハンドルネームでそれなりに(^^;)愛着もあるので、売却する意思は全くないのですが、とりあえず、ドメイン取引なるものの実態をちょっと調べてみようかと思ってみた次第です。

| | コメント (1) | トラックバック (0)

加速器の電力消費

9月21日付で、最強加速器、はや停止 機器トラブル、再開に2カ月というニュースが報じられました。

以下、全文を引用します。

ジュネーブ郊外で運転を開始した世界最強・最大の加速器LHCで、冷却材のヘリウムが地下トンネル内に漏れる事故が起きた。欧州合同原子核研究機関(CERN)が20日、発表した。

 LHCは、10日に陽子ビームを周長27キロのリングで1周させるのに成功したばかり。このトラブルで約2カ月間、運転停止となる見込み。

 発表によると、19日昼ごろ陽子のビームを曲げる働きがある電磁石に電流を流していたところ、結線が溶けて機器が損傷した。こうしたトラブルは通常の加速器でも珍しくなく、修理は数日で済む。

 だが、LHCは絶対零度(零下約273度)近い超伝導状態で運転されているため、機器をいったん常温に戻し、修理後に再び低温に戻さなければならず、運転停止は2カ月間必要という。CERNは、この事故で人体への危険はないと説明している。

 陽子同士を正面衝突させ、宇宙が生まれたばかりの超高温・超高圧状態を再現する実験は、今回の事故の影響で11月以降にずれ込む見通し。

電磁石を超伝導状態にして電流を流すからには相当な電力消費なんだろうな、と思って、加速器の電力消費をネットで調べてみたところ、高エネルギー加速器研究機構という機関がつくばに設置しているKEKBという加速器(と付随する施設)の環境報告ページにヒットしました。

このKEKBは一周3kmとのことで、LHCの一周27kmに比べれば小さく、ということは粒子を加速できる速度の上限はLHCよりは低いことになるのですが、それでも1ヶ月の電力消費が3~4MWh。
3MWhといってもどの程度の電力量かピンときません。
そこで、自宅の電力消費を調べてみました。7月下旬から8月中旬までの1ヶ月、クーラーをかなり長い時間つけていたために、この期間は502kWh消費していました。
一人暮らしで500kWh(=0.5MWh)ですから、たとえば夫婦だけとか夫婦と子供2人の家庭では1ヶ月で1MWhを少し超えるくらい、と仮定しておきます。

ということは、3MWhの電力とは、おおよそ3万世帯分の電力消費に相当することになります。私の住む京都府城陽市は3万世帯、8万人の小さな都市なので、KEKBの加速器1基の電力消費は小さな地方都市と同じくらい電力を消費するということが言えます。
これがLHCとなるとどのくらいなのか・・・。下手するとLHC専用に原発1基あてがってるかも。

これだけの電力(=費用)を使用する設備ですから、それなりの成果を出してもらいたいものですが、9月16日には巨大加速器『LHC』のシステムにハッカーが侵入というニュースも報じられています。
LHCのあるCERN(欧州原子核共同研究機関)は、研究の一環としてHTTPプロトコルとHTMLを開発しており、今のインターネット時代の基礎を築いたといってもいい機関ですが、そこがハッカーに侵入されるということに歴史の皮肉を感じざるを得ません。

| | コメント (0) | トラックバック (0)

掲示板のSPAM対策

先週末から今度の日曜まで9連休の夏休みになったものの、最初の5日は、「寝る、食う、呑む」の3拍子揃った、だらけた生活。体重計に乗るのが怖いくらいです。

というのはさておき、本家サイトの掲示板には5月頃からSPAMな書き込みが頻発していて頭を悩ませていました。

DNSの逆引きではIPアドレスからドメイン名が取得できなかったので、Web上のwhoisサービスサイト(たとえばこことかこことか)を使って、どうやらイギリス領ヴァージン諸島(に登記簿がある?)のドメインらしいことは判明。とりあえず、当該サイトの特定のIPアドレスからの書き込みは排除するようにしていたが、かなりの頻度で(1時間に1回くらい)アクセスしているのが明らかになると、いい加減ブチ切れて(笑)、掲示板自体を停止したのが6月末。

そんな中、7月に東京でDさんと会ったときに、彼も相当SPAM対策で苦労したということを訊き、教えていただいたSPAM対策(その節は多謝>Dさん)を導入したのが一昨日(苦笑)。導入作業自体は(Perlならびにプログラミング全般の知識があれば)非常に簡単ではあったのだが、単に不精だっただけ(爆)

「じゃあついでに(^^;)」、というノリで、前から導入しようかと漠然と考えていた、「画像で認証キーを表示しておき、認証キーを入力しないと書き込みできなくする」という仕掛けも、一から書き起こして2日間でとりあえず出来上がり、導入完了。
あるタイミングで掲示板の出力のスナップショットを取って、そこからSPAM投稿スクリプトを作ったとしても、投稿を受け付けない仕掛けにはしてある(つもり)ので、そう簡単にSPAM投稿は出来ないだろうと思っているが、万が一突破されたときは、まだ更なる奥の手を考案済み。

「奥の手」はまだ実装していないが、これを実装したら、突破できるのはおそらく暗号解読のエキスパートくらいではないかと推測(爆)

| | コメント (0) | トラックバック (0)

ブログ通信簿

ゆきさんDさんのブログで取り上げられていたブログ通信簿、面白そうだったんでやってみました。

Tushinbo_img

で、なんでネイルアーティストやねん?

| | コメント (0) | トラックバック (0)

UML CASEツール

前の派遣先を5月末で契約解除し、6月から新しい派遣先での勤務が始まりました。
今回の派遣先での業務は、化学系の分析装置を制御するソフトの作成です。

一応、大学は化学系だったので、分析化学の授業で今回扱う分析方法の概要を習った記憶だけはあったのですが、学生実験でその分析装置を操作することもなく、「思いっきり物理」(^^)の研究室に進んでしまい、修論の研究テーマは新しい分析手法の開発(ハード、ソフト込み。ただしソフトの比重が非常に高かった^^;;)で、新卒から7年ほど勤めた会社では音響計測のアプリケーション開発の仕事が多かったので、よくよく計測系の仕事に縁があるらしいです。

今回は、詳細設計からコーディング、テストまで関わるのですが、設計から関わるのは、実は数年ぶり。今まで派遣要員として関わった仕事は、コーディングとテストしか担当しない場合が多かったのです。
設計するにあたってUML CASEツールを使うことを考えているのですが、昔使っていたツールは、Visual Studio 6.0(のEnterprise Edition)に付属していたVisual Modelerという、Rational Roseのサブセット版でした。

自宅のPCにインストールしてあるので数年ぶりにVisual Modelerを使ってみたのですが・・・。クラス図しか描けない。せめてシーケンス図も描けないと使用に耐えないです。まあ10年も前にリリースされたツール、しかも開発環境におまけでついてきたサブセット版なので仕方ないといえば仕方ないですが。

ここ1年ほど個人的に使用していたJUDE Communityというツールは純国産ですが、今回はC++とVBでの開発なので、Javaのコード生成しかできないJUDEは却下。

そこで海外製のフリーのUML CASEツールを探して、いくつか試用してみて気に入ったのが、SDE for Visual Studio .Netというツール。Visual Studio 2003/2005に組み込まれて動作し、UML2.1に準拠し、当然C++やVB.NETのコードを生成することができ、逆にソースコードからクラス図を生成する、リバースエンジニアリングにも対応していて、ドキュメントもWordのdocファイルで出力できるという優れもの。これでフリーというのが信じられない出来です。
ただ・・・Core2 Quad 2.4GHz、メモリ4Gのマシンでも動作が重く感じることがあるのが悩ましいところではあります。またインストーラが130Mバイトもあり、FTTH環境でないとダウンロードもままならないです。

できればVC++6.0とVB6.0で開発したい事情があるのですが、2005に移行したほうがいいのか、悩ましいところではありますが・・・。

---- 7月18日追記 ----

色々探した結果、C++とVB(.NET以前のバージョン)のソースコード出力/リバースエンジニアリングもできるツールとして、Enterprise Architectというものを見つけました。
とりあえず30日トライアル版で試用してみて、「これは使えそう」という感触を持ったので購入して頂きました。たしか1ライセンスあたり3万しなかったというのが大きな理由だったような。

ここに例示した、どのUMLツールも、VisualStudio6についてきたVisualModelerとは比べ物にならない使い勝手のよさ。UML自体が普及したことにより、こういったCASEツールが普及したのかなぁ、などと思い、今思えば非常に力不足なVisualModelerを使って設計していた昔と比べて、10年の時間を感じました。

| | コメント (0) | トラックバック (0)

新しいPC

今まで4年ほど使っていたノートPCの動作があまりに遅く、忍耐の限界に達していたので、1週間ほど前に通販サイトでPCを買い、昨日の昼過ぎに届きました。

おそらく12年ぶりのデスクトップ。Windows XP Pro(SP2)、Core2 Quad 2.4GHz、メモリ4G、ディスク500G、DVDスーパーマルチという、まあまあ高いスペックにも関わらず、11万円弱。安い!
これに17インチ液晶モニタを足しても13万円。

昨日の昼過ぎに届いて、今朝までかかって、今まで使っていたソフト、ドライバのインストールをほぼ完了。
少し前に自作したディスコグラフィ登録ツールをVC++2005でリビルドしてみたが、かかった時間は前のノートPCの半分以下かと思われます。

何よりも体感的に違うのはIE6でのWebページの表示。たとえばYahoo!のトップページを表示させるにしても、前のノートPCではHTMLファイルをダウンロードし終わってからのレンダリングに時間がかかっていて、URLを入力してから表示が完了するまでに5秒以上かかっていたのが、新しいPCでは一瞬。
翻訳ソフトでフランス語→英語の翻訳も処理速度は2倍か3倍。
前のノートでは重すぎて使い物にならなかったカスペルスキーインターネットセキュリティも、サクサクと動いています。

いや~、快適快適(^^)

| | コメント (2) | トラックバック (0)

ディスコグラフィ作成:いよいよ検索用CGIスクリプトの作成

ディスコグラフィ作成も、PC上でのデータ入力や辞書作成のツールは完成の域に達し、CDデータの入力も辞書作成も一段落し、いよいよ検索用CGIスクリプトの作成に取り掛かることになった。

が、Perlを使うのは数年ぶり、PerlでUnicodeを使えるのかも良く知らない・・・。ということで、まずはPerlでUnicodeを使えるか、使えるならば何に気をつけるべきか、といったことをWebで検索してみて、どうやらそれほど難しくはなさそうであることだけは「なんとなく」分かった。

それではと、ごちょごちょコードを書いていくうちに、どうにか検索CGIができてしまった。予想通り、Perlの細々としたテクニックはかなり忘れてしまっていたが、昔書いた掲示板のCGIスクリプトを読み返して思い出したりした。

PerlでUnicode(厳密にはUTF8エンコード文字列)を扱う方法として、とりあえず分かったこと。

  1. (当然といえば当然だが)スクリプトをUTF8で記述しておく。
  2. スクリプトの先頭にuse utf8; と use Encode; を記述しておく。
    →どうやら、これでスクリプトでUTF8文字列を使うよう設定され、文字コード変換のサブルーチンが使用できる、らしい・・・。
  3. binmode STDIN, ':bytes'; で、標準入力からのデータに文字コードを仮定させない。また、標準入力から読み込んだCGIパラメータは、入力がUTF8文字列の場合、
    $data = decode('utf8', $data);
    のようにして、Perlに認識させる。
  4. open File, '<:encoding(utf8)', 'sample.txt';
    とすると、読み込み元のファイルの文字コードを指定できる。
  5. binmode STDOUT, ":encoding(shiftjis)";
    または
    binmode STDOUT, ":encoding(utf-8)";
    のようにすると、標準出力への出力データは自動的に文字コード変換される。

ざっと、こんなところだろうか。PerlでUTF8を使う方法の詳細については、以下のサイトを参考にしていただきたい。
Perl 5.8.x Unicode関連
perl 5.8における日本語コード変換のメモ
perl5.8のUnicodeサポート

1ヶ月ちょっと続いたディスコグラフィ作成は、これで一通り終わり、後はCDデータの追記と、定期的に同義語辞書の拡充を行い、CGIスクリプトの出力の体裁を整えるだけとなった。

| | コメント (0) | トラックバック (0)

ディスコグラフィ作成:同義語辞書の作成

ディスコグラフィ作成に取り組み始めて1ヶ月を経過。もはやちょっとしたプロジェクトと化してきた感があるが、ようやく同義語辞書の作成にかかることができるようになった。

辞書のファイル構造は、

ルードヴィヒ・ヴァン・ベートーヴェン  Ludwig van Beethoven
弦楽四重奏曲  String Quartet Streichquartett Quatuor à cordes
Martha Argerich マルタ・アルゲリッチ
....

といった具合に、1行に同じ意味の単語を羅列している。C++で記述するオブジェクト構造も基本的には、

CSynonymEntryクラス  ファイルの1行を表現し、単語の羅列を保持する。
CSynonymDicクラス  辞書全体を表現し、複数個のCSynonymEntryオブジェクトを保持する。

という構造であるが、CSynonymEntryクラスは、単語の保持以外にいくつか機能を追加したいので、
class CSynonymEntry : std::vector<CString>{...};
と実装した。

また、CSynonymDicクラスは、ある単語が辞書に登録されているか調べる必要があることと、ファイルに記述したイメージ通りデータを保持しておく必要があることから、

typedef boost::shared_ptr<CSynonymEntry> CSynonymEntryPtr;

class CSynonymDic
{
private:
    class CDictionaryOrder{
    public:
        bool operator()( const CString& lhs, const CString& rhs ){...}
    };
   typedef std::map<CString,CSynonymEntryPtr,CDictionaryOrder> CSynonymMap;

    CSynonymMap                            mxDictionary;
    std::vector<CSynonymEntryPtr>    mxEntries;
public:
    CSynonymDic();
    ~CSynonymDic();
    //その他メンバ関数
};

と記述した。つまり、単語が辞書に登録されているか調べる目的に、map<CString,CSynonymEntry*>を用意し、ファイルに記述したイメージ通りデータを保持しておく目的から、vector<CSynonymEntry*>を用意した。

が、実際にはCSynonymEntry*の替わりにboost::shared_ptr<CSynonymEntry>を使っている。これはBoostというクラスライブラリで提供されている、参照カウントつきポインタを定義するshared_ptrクラステンプレートを用いているためである。
また、mapのテンプレート引数の3番目にCDictionaryOrderを指定しているが、これは独自のソート順序を定義するためである。

このようにして辞書のデータ構造を実装し、GUIを作ってひたすらデータ入力。結果、登録単語数として1600、辞書ファイルの行数として500余りになった。Perlで検索処理を行うことを考えると、単語の平均文字数の大きい行ほど前に来るようにソートしておいたほうが何かと都合が良いと考えられるので、ファイルを保存する時にソートすることにした。

あとは、Perlで検索CGIを書くだけだが、Perlを個人的用途で触るのは4、5年ぶり、業務でも3年前に30行程度のCGIスクリプトを書いたことがあるだけなので、Perl独特のクセはかなり忘れてそう・・・。

| | コメント (0) | トラックバック (0)

ディスコグラフィ作成:CDジャケット画像の縮小とWebサーバへのデータ転送

700枚余りのCDのデータ入力とジャケット写真をスキャナでJPEG画像として取り込む作業は終わり、その後買い足したCDについても、買った当日にデータ入力とジャケット取り込みをするように習慣付けるようになったので、データ入力に関しては問題はクリアできた。

しかし、CDデータを収めたUTF8形式のタブ区切りテキストファイル3つと、CD枚数と同じだけのJPEGファイル700個をFTPクライアントソフトを使ってWebサーバへ転送するのがかなり面倒・・・。
FTPクライアントソフトを使って、転送したいファイルをいちいち選択して転送するという作業自体が面倒だし、転送漏れも起こりうる。これは、データ入力ツールにFTP転送の機能も追加したほうがよさそう。これは、MFCのインターネットクラスなどを使うことで1日でサクッと作れてしまうのだった。

それともう一つ。携帯からも検索できるようにしようと考えているのでジャケットの画像ファイルのサイズを小さくしたものも用意しておきたい、という要求も出てきた。データ入力の際、スキャナからは100dpiで取り込んでいるため、大体480×480ピクセル、80~100kバイト程度のJPEGファイルが700個ある。携帯の画面サイズは(少なくとも私の持っている東芝のau向け機種では)240×320ピクセルなので最大でも200×200ピクセル程度まで画像を縮小する必要があるし、ファイルサイズも小さくないとパケット通信料も馬鹿にならない。とにかくJPEG画像を縮小したい。

最初は、オリジナルの480×480ピクセル、100kバイトのファイルをCGIで動的に縮小することを考えていたので、PerlでJPEGファイルのリサイズできるものはないかと検索してみたが、なかなか見つからない。まあ、JPEGファイルの仕様自体が、離散コサイン変換とか圧縮と言った数学的内容を含んでいて難解なので、簡単にPerlベースのソースコードを見つけようというのも無理があるわけだが・・・。

そんなわけで、CGIで動的に画像を縮小することはあきらめ、PC上で画像を縮小するためのツールやライブラリをVectorで検索してみたが、どうも見つからない。
で、いろいろ検索するうちに、ImageMagickというオープンソースのライブラリがあるらしい、ということを知り、ImageMagickの公式サイトからWindows用のインストールパッケージ(WindowsInstaller形式ファイル)をダウンロードして、インストールし、公式サイトのチュートリアルページを参考に、
「JPEGファイルを読み込み、元の1/4に縮小し、JPEGファイルとして書き出す」
というコードを書いてみたが、ファイルを読み込むところで落ちてしまう。インストールされていたサンプルコードと見比べても何が違うのか良く分からない。

仕方ないのでライブラリの全ソースを圧縮したzipファイルを公式サイトからダウンロードして展開し、ライブラリをビルド・・・してみたが、コンパイルエラーが出まくってどうしようもない。結局、インクルードファイルの中のマクロ定義を2つコメントアウトしたらビルド成功。コメントアウトしたマクロ定義は、XWindowを使うかどうかを決定するマクロと、GNOMEのxmlライブラリを使うかどうかを決定するマクロだった。ソースをダウンロードしてからビルドに成功するまで丸1日・・・。今使っているノートPCはいろんなソフトをインストールしまくっているせいかビルドがやたら遅いので、セーフモードで起動した状態でビルドする、という有様(笑)。それでもデバッグモードでのビルドに要した時間は1時間弱。今のPC、今度の3月で4年になるし、そろそろ新しいPCに乗り換える時期にきたかも。
ライブラリをデバッグモードでビルドするのに1日かかったあと、ようやくデバッグ再開。ライブラリの奥底までステップインしてようやく分かったのは、環境変数MAGICK_CODER_FILTER_PATHとMAGICK_CODER_MODULE_PATHを定義しておかなければいけない、ということだけだった。

まあ、そんなドタバタはあったものの、ImageMagickライブラリ(より厳密には、ImageMagickにアクセスするためのC++インタフェースクラスライブラリ)を使うと、非常に簡単にJPEGファイルの縮小ができた。以下にサンプルコードを示す。

#include <Magick++.h>      //このファイル1つをインクルードすればライブラリの全機能が使用可能
using namespace Magick;

int main( int argc, char **argv )
{
   InitializeMagick(*argv);   //exeファイル名を引数としてライブラリを初期化

   try{
    Image xImage;   //画像データを保持するオブジェクト

    //jpeg画像を読み込む
    xImage.read( "sample.jpg" );

    //元画像の25%に縮小
    unsigned int uWidth = xImage.columns(), uHeight = xImage.rows();  //画像の幅と高さを取得
    Geometry xGeometry( uWidth/4, uHeight/4 );  //サイズを定義するクラス
    xImage.resize( xGeometry );

    //jpeg画像を保存する
    xImage.write( "sample_small.jpg" );
   }
   catch ( Error& rxError ) {
    std::cout << rxError.what() <<std::endl; //エラーの内容を表示
   }
}

このImageMagickライブラリ、画像ファイルの読み書きとサイズ変更だけではなく、さまざまな機能を持っているらしいので、画像を扱うアプリを書く機会があれば勉強してみたいと思う。そんなことはさておき、同義語辞書を作成するためのGUIをまだ全然考えていない。うーん・・・。

| | コメント (2) | トラックバック (0)