スポンサーサイト
投稿日時 : -------- --:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
-------- --:-- | スポンサー広告
別ドメインの外部スクリプトを実行するブックマークレット
投稿日時 : 2008-02-25 09:46
更新日時 : 2011-08-29 10:28
更新:2011-08-29 10:28
デモスクリプトがリンク切れになっていたのを修正
 

■概要

 これはブックマークレット作成者のためのブックマークレットです。ブックマークレットには文字数制限(IEで508文字)がありますが、ブックマークレットから外部スクリプトファイルをロードして実行することでこの制限を回避できます。事実上ブックマークレットの文字数制限は無くなります。さらに別ドメイン(別サーバ)のスクリプトファイルのロード、実行も可能。他のメリットとしては、スクリプト本体を完全に外部ファイル化しておけば、後で動作を変更したくなってもユーザ側に再登録をお願いしたりする必要がないということでしょうか。
 

■デモ

外部ドメインのスクリプトファイル
http://t-service.no-ip.com/blog/72_ExternalScriptDemo/demo_outerscript_utf8.js
をロードして実行するデモ。
別ドメインの外部スクリプトファイルを実行するブックマークレットのデモ
 

■ブックマークレットメーカー

 1行コードの中のURLを書き換えたりする作業は若干イライラするので自動で生成できるようにしました。外部ファイルのURLとEncodingを指定して「Generate」ボタンを押すとソースが生成されます。Nameが空白でないなら、Nameに入力された文字列でHTMLリンク用のソースと、テスト用のリンクオブジェクトを生成します。
 大体のブラウザで動くんじゃないかと。デフォルトで入力されているデモのデータは「Clear」ボタンで削除できます。値チェックは面倒なのでしてません。Encodingについては後述しています。
ブックマークレットメーカー
URL:
Encoding:
Name:


Source

 
Link Test
 

■整形ソース

 ブックマークレットメーカーで生成されるコードを整形し、コメントをつけて貼っておきます。
javascript:(function(){
//外部ファイルURL
var url='http://t-service.no-ip.com/blog/72_ExternalScriptDemo/demo_outerscript_utf8.js';

//キャッシュ使用を回避
if(!url.match(/\?/))url+='?'+(new Date()).getTime();

//scriptエレメント作成
var d=document;
var e=d.createElement('script');

//外部ファイルのエンコーディング指定
e.charset='utf-8';

//srcを外部ファイルURLに設定
e.src=url;

//エレメント追加
d.getElementsByTagName('head')[0].appendChild(e);

})();
今回のデモで使っている外部スクリプトファイルの内容は以下のような感じ。
alert('外部ドメインから実行されました。\nEncoding is "utf-8".');
 

■外部ファイルのエンコーディングについて

 ブックマークレットを実行するページのエンコーディングと外部ファイルのエンコーディングがずれていると日本語などの2Byte文字が文字化けを起こします。これを回避するためにソース中の、
//外部ファイルのエンコーディング指定
e.charset='utf-8';
の部分で外部ファイルのエンコーディングを指定する必要があります。スクリプト中でASCII文字しか使用しない場合は省略しても問題なし。
 以下は指定したエンコーディングと外部ファイルのエンコーディングがずれている場合と、一致している場合のデモです。ブラウザによって結果が異なります(後述)。
 
 以下はエンコーディング指定しなかった場合のデモです。このブログのページのエンコーディングはeuc-jpです。  

■各ブラウザのエンコーディング指定と文字化けについて

 この記事を書いているときに気づいたんですが、Opera(9.26)はどんな条件でも正しく日本語が表示できるようです。
 IE(6、7)、Firefox(2.0.0.12)は指定エンコーディングと外部スクリプトのエンコーディングが不一致の場合や指定なしだと基本的に文字化けしますが、指定なしでもページの エンコーディングと外部スクリプトのエンコーディングが一致している場合は化けません。
 Safari(3.0.4 for win)はIEやFirefoxとほぼ同じですが、加えて、指定なしだがページエンコーディングと外部スクリプトエンコーディングが一致している場合でも化けるようです。
 まあつまり基本的にエンコーディング指定は省かない方が得策。
 

■キャッシュからのロード回避について

 通常のブラウザは通信量を減らすためやレスポンス速度を上げるために、一度ロードしたファイルをローカルのハードディスクにキャッシュとして保存しておき、再度同じファイルへリクエストがあった場合はキャッシュからロードします。しかしこのキャッシュのせいで外部スクリプトファイルの内容を変更しても、キャッシュからロードされてしまい変更が反映されことがあります。それを回避するためにURL末尾に、「?」に続けて実行たびにURLが変化するように現在時刻をミリ秒で取得したものを付加しています。
//キャッシュ使用を回避
if(!url.match(/\?/))url+='?'+(new Date()).getTime();
外部ファイルの内容を一切変更しないのであればこの記述は必要ありません。
 

■外部ファイル化されたブックマークレットの危険性

 スクリプト本体を外部ファイル化したブックマークレットは、文字数制限を回避できるおかげで通常のものよりも高度な処理ができ非常に便利ですが、セキュリティ的には危険を孕んでいます。たとえばブックマークレットの作成者に悪意があれば、あるサイト用のブックマークレットを公開後、ユーザが増えてきたところで動作をこっそり変更してユーザのcookieを盗む、ということも可能。ブックマークレット実行時のスクリプトの権限はそのサイト管理者と全く同じなのでcookieにもアクセスできます。怪しいサイトのブックマークレットは危険かもしれないという話。
 
スポンサーサイト
2008-02-25 09:46 | Bookmarklet | Comment(0) | Trackback(0)
選択アイテムの名前を入れ替えるMDIEスクリプト
投稿日時 : 2008-02-20 01:49
選択した2つのアイテムの名前を入れ替えるMDIEスクリプトです。手動で入れ替えるのは意外に面倒なので。
 
FC2ブログのファイル名制限とファイルタイプ制限、管理上の都合などで「e00071_mdiescript_swapname_100.js」というファイル名になっています。保存したら「名前を入れ替える.js」というファイル名にでもしてMDIEに登録してください。
 
使用にあたっては自己責任でお願いします。
このスクリプトによって発生したいかなる損害も作者は責任を負いません。
 

■ダウンロード

名前を入れ替える.js
 

■ソース全文

MDIEスクリプト - 名前を入れ替える.js
/////////////////////////////////////////////////
// MDIE Ver 0.2.5.3
// http://cres.s28.xrea.com/
// Copyright (C) 2002-2008 佐野
/////////////////////////////////////////////////
// 名前を入れ替える ver 1.00
// 選択アイテムのファイル名を入れ替える
// Copyright (C) 2008 itmst
// http://itmst.blog71.fc2.com/
// itmst71@gmail.com
// 使用にあたっては自己責任でお願いします。
// このスクリプトによって発生したいかなる損害も
// 作者は責任を負いません。
/////////////////////////////////////////////////

(function(){
  var list = [];
  for(var i=0; i<FolderView.Count; i++){
    if(FolderView.Items(i).Selected){
      list.push(FolderView.Items(i).Path);
    }
  }
  if(list.length != 2){
    MDIE.echo(list.length + '個のアイテムが選択されています。\n'
      +'名前を入れ替える2つのアイテムを選択して下さい。');
    return;
  }

  var FSO = new ActiveXObject("Scripting.FileSystemObject");
  var ItemExists = function(path){
    if(FSO.FileExists(path)){
      return 1;
    }else if(FSO.FolderExists(path)){
      return 2;
    }else{
      return 0;
    }
  }
  
  var items = [];
  for(var i=0; i<2; i++){
    var path = list[i];
    switch(ItemExists(path)){
      case 0: MDIE.echo("選択したアイテムが存在していません。"); return;
      case 1: items[i] = FSO.GetFile(path); break;
      case 2: items[i] = FSO.GetFolder(path); break;
    }
  }
  var name0 = items[0].Name;
  var name1 = items[1].Name;
  var tmpName = (new ActiveXObject("Scriptlet.Typelib")).GUID.substring(1,37);
  items[0].Name = tmpName;
  items[1].Name = name0;
  items[0].Name = name1;
})();

 
他にもいくつかMDIEスクリプトを公開しています。
カテゴリ:MDIE Script
 
 
2008-02-20 01:49 | MDIE Script | Comment(0) | Trackback(0)
ブックオフオンラインでAmazon検索するブックマークレット
投稿日時 : 2008-02-19 12:42
 ブックオフオンラインで本を探している際にAmazonで買うのとどっちが得か知りたいとき、タイトルをもとにamazon検索リンクを生成して簡単に比較できるようにするブックマークレットを作ってみました。大した手間じゃないのでSleipnirプラグインのSeaHorseスクリプト、FirefoxアドオンのGreasemonkeyスクリプト、IEアドオンのTrixieスクリプトも作りました。
 
実行結果
 

■概要

 ブックオフオンラインの検索結果ページでのみ動作します。実行すると検索結果の各タイトルの下にそのタイトルをもとにしたamazon.co.jpの検索リンクを生成します。
 

■問題点とか

 9割はちゃんと検索できるんですが、ブックオフの検索結果のタイトルがおかしなときは無理。たとえば副タイトルが本タイトルの間に入ってしまっている場合とか、途中で途切れてたり、余計な文字がくっついている場合とか。ブックオフ側がもうちょっと正確にデータを入力してくれればなんとかなりそうなものですが。
 タイトルに含まれる()括弧の中には、英語タイトルの日本語読みだとか月刊だとかムックだとか、検索に邪魔な情報が書いてあることが多いので削除することにしました。
 

■動作確認

動作が確認できたブラウザは以下。Safariでは動作不可。URL欄に直接コードを貼り付ければ動くんですが、ブックマークに登録するとダメ。
IE6/IE7/Opera9.25/Firefox2.0.0.12/Mozilla1.8b/Netscape9.0.0.5
 

■ブックマークレット

Opera以外のブラウザ用  
Opera用。コピーして手動で追加してください。*コード自体は全く同じ。

 

■SeaHorseスクリプト

 SleipnirプラグインのSeaHorseスクリプトです。ブックオフオンラインの検索ページを開くと自動的にamazon検索リンクを生成します。ダウンロードしたら所定の位置に移動させてオプションから有効にして下さい。
 

■Greasemonkey/Trixieスクリプト

 FirefoxアドオンのGreasemonkeyとIEアドオンのTrixieの共用スクリプトです。ブックオフオンラインの検索ページを開くと自動的にamazon検索リンクを生成します。Firefoxの場合Greasemonkeyが有効になっているならクリックするとインストールダイアログが表示されるハズ。IEの場合はダウンロードしたら所定の位置に移動させてオプションから有効にして下さい。
 
[参考]
Sleipnir | プラグイン | SeaHorse
タブブラウザ Sleipnir オンラインデータベース(SeaHorseスクリプト)
Greasemonkey :: Firefox Add-ons
Trixie
 
2008-02-19 12:42 | Bookmarklet | Comment(0) | Trackback(1)
nkfとiconvによる文字コード・改行コード変換
投稿日時 : 2008-02-18 11:34
UTF-8に対応しているnkfとiconvで文字コードや改行コードを変換するメモ。実行はUbuntu7.10で、ロケールは以下のようにja_JP.UTF-8。
$ echo $LANG
ja_JP.UTF-8
 

■インストール

nkfのインストール
$ sudo apt-get install nkf
パッケージリストを読み込んでいます...
依存関係ツリーを作成しています...
Reading state information...
以下のパッケージが新たにインストールされます:
nkf
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 8 個。
116kB のアーカイブを取得する必要があります。
展開後に追加で 295kB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com gutsy/universe nkf 2.07-1 [116kB]
116kB を 0s で取得しました (770kB/s)
未選択パッケージ nkf を選択しています。
(データベースを読み込んでいます ... 現在 96566 個のファイルとディレクトリがインストールされています。)
(.../archives/nkf_2.07-1_i386.deb から) nkf を展開しています...
nkf (2.07-1) を設定しています ...

iconvの方はCの標準ライブラリlibc6などをインストールすると使えるようになる。
iconvのインストール元パッケージの確認
$ dpkg -S /usr/bin/iconv
libc6: /usr/bin/iconv

■nkfで文字コード判定

「nkf -g」で文字コードの判定ができます。ただ、-gオプションのロングオプション名が「--guess」(推測する)の通り、確実な判定はできないようです。iconvには文字コード判定機能はありません。他に文字コード判定できるコマンドに「kcc -c filename」や「pkf -c filename」がありますが、Unicodeには非対応。
以下はシステム標準の文字コードであるUTF-8で保存したテキストファイルの文字コードを判定。
$ cat > test.utf8
あいうえお
かきくけこ
abcde
fghij
$ nkf -g test.utf8
UTF-8

kccやpkfだとUTF-8のファイルが以下のように正しく判定できない。
kccやpkfでは正しく判定できない
$ kcc -c test.utf8 
test.utf8:      data
$ pkf -c test.utf8 
sjis
kccの方はバイナリファイルなどを判定した時と同じようにdataとなってしまう。pkfはsjisと誤判定している。
 

■nkfで文字コード変換

nkfで文字コードを変換するには以下のオプションを付けて実行。
-jJISコードに変換
-e日本語EUCコードに変換
-sシフトJISコードに変換
-wUnicode(UTF-8)コードに変換

 
$ cat > test.utf8
あいうえお
かきくけこ
abcde
fghij
$ nkf -g test.utf8
UTF-8
$ nkf -j test.utf8 > test.jis
$ nkf -g test.jis
ISO-2022-JP
$ nkf -e test.utf8 > test.euc
$ nkf -g test.euc
EUC-JP
$ nkf -s test.utf8 > test.sjis
$ nkf -g test.sjis
Shift_JIS
$ nkf -w test.euc > test.utf8
$ nkf -g test.utf8
UTF-8
 

■iconvで文字コード変換

iconvでは文字コードの自動判別機能がついていないので、変換元と変換後の文字コードを-f(--from-code)オプションと-t(--to-code)オプションで指定する必要がある。
$ iconv -f UTF-8 -t EUC-JP test.utf8 > test.utf8.euc
利用可能な文字コード名一覧は-lオプションで確認できる。同じ文字コードを指している場合でもOSによって表記が違うので注意が必要らしい。
UNIXの部屋 検索:iconv (*BSD/Linux/Solaris)
iconv で指定する文字コードは OS によってかなり異なる。例えば HP-UX では EUC-JP や euc-jp ではダメで、eucjp としなくてはいけない。

■nkfで改行コード変換

nkfは以下のオプションで改行コードを変換できる。iconvには改行コード変換機能はないのでtrなどで処理するしかない。
-Lu改行コードをUNIX標準のLFにする
-Lw改行コードをWindows標準のCRLFにする
-Lm改行コードをMac標準のCRにする

改行コードの確認はodやhexdumpコマンドに-cオプションをつけて実行する。
$ nkf -Lw test.utf8 > test.utf8.crlf
$ od -c test.utf8.crlf 
0000000 033   $   B   $   "   $   $   $   &   $   (   $   * 033   (   B
0000020  \r  \n 033   $   B   $   +   $   -   $   /   $   1   $   3 033
0000040   (   B  \r  \n   a   b   c   d   e  \r  \n   f   g   h   i   j
0000060  \r  \n
0000062
$ nkf -Lm test.utf8 > test.utf8.cr
$ hexdump -c test.utf8.cr
0000000 033   $   B   $   "   $   $   $   &   $   (   $   * 033   (   B
0000010  \r 033   $   B   $   +   $   -   $   /   $   1   $   3 033   (
0000020   B  \r   a   b   c   d   e  \r   f   g   h   i   j  \r        
000002e
$ nkf -Lu test.utf8 > test.utf8.lf
$ hexdump -c test.utf8.lf
0000000 033   $   B   $   "   $   $   $   &   $   (   $   * 033   (   B
0000010  \n 033   $   B   $   +   $   -   $   /   $   1   $   3 033   (
0000020   B  \n   a   b   c   d   e  \n   f   g   h   i   j  \n        
000002e
\nはCR(キャリッジリターン)、\rはLF(ラインフィード)。主なOSの改行コードは以下。
UNIX系LF
WindowsCR + LF
MacCR


 
[参考]
UTF-8 対応 nkf (nkf_utf8)
UNIXの部屋 検索:nkf (*BSD/Linux/Solaris)
UNIXの部屋 検索:iconv (*BSD/Linux/Solaris)
 
2008-02-18 11:34 | Linux | Comment(1) | Trackback(0)
kernelアップデートでmenu.lstが勝手に書き換えられて起動不能に
投稿日時 : 2008-02-06 06:01

■kernelアップデート後に再起動すると起動できなくなった

 Ubuntu7.10のsynapticで2.6.22.14へのkernelアップデートを実行して再起動したら、GRUBメニューから選択後、
root (hd0,7)
Filesystem type is ext2fs, partition type 0x83
kernel /boot/vmlinuz-2.6.22.14-generic root=UUID=xxx-xxxx....
ro quiet splash locale=ja_JP

Error 15: File not found

Press any key to continue. . .
という表示が出て起動できなくなった。違うパーティションのFedora8からmenu.lstを見てみたが、おかしいところが見当たらない。menu.lstのkernelのパスと実際のパスがずれてるわけでもないし、UUIDが間違ってるわけでもない。3時間ほど悩んだあとに初歩的なミスに気づいた。Ubuntuのルートデバイスが/dev/sda7なのにmenu.lstにはroot (hd0,7)と書いてあった。

■誰がmenu.lstを書き換えたのか

 root (hd0,6)に書き換えて再起動するとあっさり起動。3時間気づかなかった自分にがっかりして苦笑したが数秒後におかしなことに気づいた。もとからroot (hd0,7)だったとしたら今まで起動できていたことが説明できない。そういえばkernelが入れ替わるということはmenu.lstに記述されているkernelのパスも書き換えないとならない。kernelアップデート時に何らかの原因でroot (hd0,6)とすべきところをroot (hd0,7)とされてしまったようだ。検索すると似たような現象が見つかった。
 
Ubuntu日本語フォーラム
カーネルのアップデート時は、古いカーネルがmenu.lstの中に残らないように自動で編集する機能があります。もし、menu.lstが変な状態になっていた場合はこの機能でmenu.lstが元に戻る可能性はあります

 思い返してみると確かに邪魔なコメント行を削除した覚えがある。それにUbuntuのインストール後にパーティション構成を変更し、rootをdev/sda7から/dev/sda6にし、menu.lstのrootもroot (hd0,7)からroot (hd0,6)に書き換えたことを思い出した。おそらくコメント行削除か、rootの書き換えのどちらか、もしくは両方が「変な状態」とみなされた原因だということがわかってきた。
 

■menu.lstの編集はupdate-grubに認めてもらえるか

 それにしてもこの「変な状態」の定義がよくわからない。menu.lstをリセットするのはupdate-grubというプログラムらしいが、こいつがどういった条件でリセットを実行するのか謎なので調べてみた。以下が現在のmenu.lst。
/boot/grub/menu.lst
## ## End Default Options ##
 
title    Ubuntu 7.10, kernel 2.6.22-14-generic
root    (hd0,6)
kernel    /boot/vmlinuz-2.6.22-14-generic root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ro quiet splash locale=ja_JP
initrd    /boot/initrd.img-2.6.22-14-generic
quiet
 
title    Ubuntu 7.10, kernel 2.6.22-14-generic (recovery mode)
root    (hd0,6)
kernel    /boot/vmlinuz-2.6.22-14-generic root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ro single
initrd    /boot/initrd.img-2.6.22-14-generic
 
title    Ubuntu 7.10, memtest86+
root    (hd0,6)
kernel    /boot/memtest86+.bin
quiet
 
### END DEBIAN AUTOMAGIC KERNELS LIST
 
# This entry automatically added by the Debian installer for a non-linux OS
# on /dev/hda1
title    Windows NTLDR(hd0,0) chainloader
root    (hd0,0)
savedefault
makeactive
chainloader +1

この状態でupdate-grubを実行する。もちろんroot権限が必要。
$ sudo update-grub
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /boot/vmlinuz-2.6.22-14-generic
Found kernel: /boot/memtest86+.bin
Updating /boot/grub/menu.lst ... done
menu.lstを確認すると見事に修正したばかりの(hd0,6)が(hd0,7)に戻されていた。その他kernelオプションやtitleの変更、改行の追加まであらゆる変更が元に戻される。結局分かったことは
### END DEBIAN AUTOMAGIC KERNELS LIST
の部分までは一切の変更を認めなてくれないということ。このコメントを削除することもタブー。このコメント行を削除すると、これより下に書いてあったものがごっそり削除されてしまうので注意。しかしこのコメント行より下は何を書いてあろうが、半角だろうが全角だろうがそんなの関係ないらしい。実際、文法完全無視で適当に入力した文字列も修正されなかった。
### END DEBIAN AUTOMAGIC KERNELS LIST
hffd;:jghsgsgtgtgg gjirgperg hjoshgrhtrhththt rhtうわ、何をすくぁwせdrftgyふじこlp;@
これも通ってしまった。
 

■デフォルト設定を変更する

 grub-updateの挙動は大体分かったが、このままだとkernelアップデートのたびに(hd0,6)が(hd0,7)に戻されてしまう。man grub-updateしてみると、menu.lst自体のコメント行にデフォルト設定が書いてあるっぽい。デフォルトのルートデバイスの設定もあるということなので実際見てみると、72行目付近に
/boot/grub/menu.lst 72行目付近
## default grub root device
## e.g. groot=(hd0,0)
# groot=(hd0,7)
という記述があった。このデフォルト設定には癖があって、このコメント行を表す「#」は削除せず、そのまま編集しなくてはならないらしい。
/boot/grub/menu.lst 56行目付近
## DO NOT UNCOMMENT THEM, Just edit them to your needs
なので、
## default grub root device
## e.g. groot=(hd0,0)
# groot=(hd0,6)
なんか気持ち悪いがこれで設定完了ということになる。この状態でupdate-grubを再度実行してみると、今度はちゃんと(hd0,7)を(hd0,6)にしてくれた。他にもデフォルトのkernelオプションなども同じように設定できるようになっている。
/boot/grub/menu.lst 59-66行目付近
## default kernel options
## default kernel options for automagic boot options
## If you want special options for specific kernels use kopt_x_y_z
## where x.y.z is kernel version. Minor versions can be omitted.
## e.g. kopt=root=/dev/hda1 ro
##      kopt_2_6_8=root=/dev/hdc1 ro
##      kopt_2_6_8_2_686=root=/dev/hdc2 ro
# kopt=root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ro

■update-grubの動作

$ man update-grub
It works by looking in /boot for all files which start with "vmlinuz-". They will be treated as kernels, and grub menu entries will be created for each. (中略) It will also add initrd lines for ramdisk images found with the same version as kernels found.
/bootディレクトリにある"vmlinuz-"で始まるファイルをkernelとして扱い、それぞれについてGRUBメニューを生成する。(中略)見つかったkernelと同じバージョンのramdiskイメージもinitrd行としてメニューに追加される。
ということでファイル名を元に自動的にkernelやramdiskを認識してメニューに追加するということらしいです。
 
GRUBを新規導入する際は以下参照
GNU GRUB ハードディスクから起動する為の設定
 

■まとめると

 synapticによるkernelアップデート時はupdate-grubが必ず自動実行されて、menu.lstがmenu.lst自体に記述されているデフォルト設定を元に書き換えられる。このとき「### END DEBIAN AUTOMAGIC KERNELS LIST」のコメント行が防衛線になってくれ、それ以下に書かれた内容は無条件に保持される。この行がなかった場合、それ以下に書かれた内容がすべて削除されることになるので注意が必要。
 
 起動できなくなったのは、Ubuntuインストール後にパーティションをいじってルートデバイスを変更したからだった。そういう変なことをしなければmenu.lstが初期化されても起動には問題なかったと言える。しかしもしルートデバイスを変更した場合でもmenu.lstのデフォルト設定をその時に変更しておけば、synapticによるkernelアップデートの際にも起動不能に陥ることはない。
 
2008-02-06 06:01 | Linux | Comment(0) | Trackback(0)
370Km先の目標にマッハ5で着弾させるレールガン
投稿日時 : 2008-02-05 14:41
 GIGAZINEでレールガンについての記事を見たときにはすごいらしいけど何がすごいのかよくわからなかった。映像も迫力があるにはあるけど、10.64メガジュール以上の出力で弾丸を撃ち出してます、と言われてもピンとこなかった。後日WIRED VISIONでもレールガンの記事を発見。解説を見てどうやらかなりすごいらしいことがわかった。
 
米海軍が実験成功した『レールガン』とは | WIRED VISION
 
そもそもレールガンって何?って感じなのでWikipediaで調べてみると、
レールガン - Wikipedia
この装置は、電位差のある二本の伝導体製のレールの間に、電流を通す伝導体を弾体としてはさみ、この弾体上の電流とレールの電流に発生する磁場の相互作用によって、弾体を加速して発射する物である。

従来の通常の火器は火薬が爆発した際の膨張力を利用して弾丸を撃ちだすのに対して、レールガンは電気の力を使うということらしい。でそれがどうすごいのかというと火薬を使った火器の場合は以下のような制限がある。
レールガン - Wikipedia
火薬を使用する火器では、燃焼による化学エネルギーの多くが熱の形で失われ、弾体の投射エネルギーに使われるのは少しである。また弾体の発射速度は発生・過熱膨張されるガスの膨張速度を越えられず、最新の爆薬を使っても、せいぜい2~3km/s程度である

これに対してレールガンの場合は
レールガン - Wikipedia
ローレンツ力だけを考えれば、レールガンが打ち出す弾体の最大速度は、相対論的制約で光速度が上限となる。発射速度は入力した電流の量に正比例するため、任意の発射速度を得るために、任意の電流を入力してやればよいだけである。
光速度が理論上の上限らしいですw。もちろん射出装置の物理的耐性や技術的な問題でそんな速度は出ないみたいですが。特に、投入エネルギーの多くがジュール熱として奪われる原因になっている「速度表皮効果」をコントロールしなければならないようです。しかしこれさえなんとかすればかなりのさらなる高速化が期待できるみたい。
 
 このレールガン技術は宇宙の輸送装置などへの応用も考えられているらしいですが、やはり兵器として使われるのが先になりそうです。計画では駆逐艦に搭載して
WIRED VISION
揚陸作戦支援に重量15kgの砲弾を初速2.5km/sで発射、高度152kmまで打ち上げて370km以上先の攻撃目標に終速1.7km/s(マッハ5)で着弾させる
ということらしいです。しかも着弾までを衛星から制御するらしい。
レールガンのすごさがわかったところでそろそろ映像を。
 
今回の実験のハイスピードカメラの映像。
YouTube - Navy's Record-Breaking Railgun Shot

 
実験の様子を収めたムービー。
YouTube - Navy Railgun Test at Dahlgren

 
 しかし科学を発展させるのはいつだって戦争だというのは悲しいことですが、もし兵器として評価すべき点があるとするなら
WIRED VISION
爆薬を詰めた砲弾ではなく不活性弾を発射するため、理論上は、攻撃の巻き添えによる被害が少なくなる
ということでしょう。でも巻き添えは減っても誤爆はなくならないんだろうな。誤爆は技術的な問題ではなく、情報の不正確さに起因しているのが大半な気がするので。
まあ開発が進んでいる非殺傷兵器もそうだけど(問題もありますが)、こういう方向の技術はもっと発展してくれた方がいいと思う。どうせ使わなきゃならないなら、ですが。
 
[参考]
米海軍が実験成功した『レールガン』とは | WIRED VISION
アメリカ海軍が行った電磁レールガンのテストムービー - GIGAZINE
レールガン - Wikipedia
 
2008-02-05 14:41 | Thecnology | Comment(0) | Trackback(0)
ライブドアのアクセスポイントがFON対応に!
投稿日時 : 2008-02-04 16:07
東京都23区の屋外エリアを中心に約2,200箇所のアクセスポイントを所有、JR山手線圏内の約80%を網羅しているlivedoorのアクセスポイントが「FON_livedoor」というシグナル名で、FONのユーザーIDとパスワードでFONスポットとして接続可能になったようです。
 
以下おしらせメールから引用。
FON logo THE WORLD'S LARGEST
WIFI COMMUNITY
www.fon.com
 
フォネロの皆さん、エイリアンの皆さん、こんにちは。
FONより皆様へ嬉しいお知らせがございます。
 
山手線内約2200ヶ所のライブドアアクセスポイントが無料で利用できます!
 
本日、2月4日、FONは株式会社ライブドアとの提携を発表いたしました。
この提携によりフォネロの皆さんはライブドアの全てのアクセスポイントが利用可能となります。
 
「FON_livedoor」へアクセス!
 
具体的には、ライブドアのアクセスポイントに「FON_livedoor」というシグナルが追加され、フォネロの皆さんは、お使いのユーザーIDとパスワードでFONスポットとして接続が可能となります。
 
2008年8月4日まで「FON_livedoor」の利用は一切無料です。
その後は利用状況やサービス状況などに応じて検討していく予定です。
ぜひこの機会にお試しください!
 
「FON MAPS」では、ライブドアアクセスポイントの確認ができます!

 
ライブドアは、東京都23区の屋外エリアを中心に約2,200箇所のアクセスポイントを所有、 JR山手線圏内の約80%を網羅しています。
そしてこれらのアクセスポイントの位置は、通常のFON MAPSより確認できますので、 外出先でのご利用にぜひお役立てください。
 
エイリアン向けフリーアクセスキャンペーンを実施

 
さて、エイリアンの皆さん、朗報です!
本提携を記念いたしまして、本日より2ヶ月間「フリー・アクセス・キャンペーン」を実施いたします。
当キャンペーンは、FONと「FON_livedoor」の全てのアクセスポイントを、 FONの会員になるだけで(ご自宅にルーターを設置されていなくても)無料にてご利用頂けるというものです。
という訳で、当キャンペーン期間中、エイリアンの皆さんも無料で全てのFONスポットをご利用頂けます!
ぜひFONの便利さ快適さを体験してみてください。
そして、ぜひお友達にもご紹介ください!
 
フォン・ジャパンは今後とも皆さんの利便性向上を目指して頑張りますので
引き続きご支援よろしくお願いいたします!
 
フォン・ジャパン
スタッフ一同
2008年2月4日

 
これはなかなかうれしいニュース。使ったことないけどlivedoorのAPなら電波強度も高そうだ。追加されたlivedoorのAPに何か目印があるのかと思って見てみたけど何も分からなかったw
 
▼JR新宿駅周辺
livedoor_fon
 
2008-02-04 16:07 | News | Comment(0) | Trackback(0)
awkのことが大体分かるようになる1行コマンド
投稿日時 : 2008-02-04 14:54
勉強のためにawkでできることを無理矢理いろいろ詰め込んだコマンド。一通りの機能を使ってみたのでこれが分かればawkがだいたい分かるかも。
以下のコマンドで/etc/passwdから「itmst」を含む行を抽出し、整形して表示することができる。
$ awk 'BEGIN{FS=":"; n=0;} function myfunc(a,b){if(a == 1000){print "!!!!uid 1000!!!!";} return a+b} $0 ~ /itmst/ {line[n]=$1"@"$3; n++; printf("NAME:%s, HEX-UID:%04x, uid+gid=%d\n",$1,$3,myfunc($3,$4));} END{for(i=0;i<int(n);i++){print line[i]}}' /etc/passwd
!!!!uid 1000!!!!
NAME:itmst, HEX-UID:03e8, uid+gid=2000
NAME:itmst2, HEX-UID:03e9, uid+gid=2002
itmst@1000
itmst2@1001

外部ファイル化して
$ awk -f test.awk /etc/passwd
とする場合は以下をtest.awkとして保存しておく。
test.awk
BEGIN{
    FS=":";
    n=0;
}

function myfunc(a,b){
    if(a == 1000){
        print "!!!!UID:1000!!!!";
    }
    return a+b;
}

$0 ~ /itmst/ {
    line[n]=$1"@"$3;
    n++;
    printf("NAME:%s, HEX-UID:%04x, uid+gid=%d\n",$1,$3,myfunc($3,$4));
}

END{
    for(i=0;i<int(n);i++){
        print line[i];
    }
}
以下解説。
 

■awkの特徴

awkは入力ファイルのテキストを行(レコード)単位で処理するスクリプト言語。処理する行は指定したパターンにマッチする行のみ。処理結果は標準出力に出力され、入力ファイルを変更することはない。C言語ライクな記述ができ、複雑な処理も可能。
 

■書式

$ awk [オプション] '{処理内容}' 入力ファイルパス
awkに続いてオプション、その後にスクリプト本体を ' (シングルクォテーション)と { } (ブレース)で囲む。その後入力ファイルのパスが続く。awkスクリプトを外部ファイル化した場合は-fオプションでファイルを指定する。
$ awk -f スクリプトファイルパス 入力ファイルパス

■BEGIN部

BEGIN{
    FS=":";
    n=0;
}
のBEGIN{ }で囲まれた部分は本処理が行われる前に処理される。
FS=":"
でフィールドの区切り文字を指定している。FSは組込み変数。これは
awk -F : '処理' 入力ファイルパス
のように-Fオプションで区切り文字を指定するのと同じこと。
n=0
の部分で変数nを初期化。これは本処理で配列のインデックスに使う。
awkの変数は基本的にグローバル変数。関数内の変数はローカル変数になる。
 
組込み変数の詳細
The GNU Awk User's Guide - 組み込み変数
 
実行順序の詳細
Awkプログラミング入門-第1回
Awkプログラミング入門-第10回
 
グローバル変数、ローカル変数の詳細
Awkプログラミング入門-第18回
 

■関数定義

function myfunc(a,b){
    if(a == 1000){
        print "!!!!UID:1000!!!!";
    }
    return a+b;
}
の部分でmyfuncという名前の関数を定義している。これはBEGIN、本処理、ENDの中以外ならどこで定義してもよい。複数の引数をカンマ区切りで受け取り、return で処理した値を戻せる。関数名は英文字か_(アンダーバー)で始まらなければならない。関数名と()の間に空白を入れてはいけない。
ここでは引数aが1000だった場合は!!!!uid 1000!!!!を出力し、その後単純にaとbを加算したものを戻り値として返す。
 
この部分の処理結果は以下の出力に該当(本処理で呼び出された時に出力)。
!!!!uid 1000!!!!
 
if文の詳細
Awkプログラミング入門-第11回
 
算術演算の詳細
Awkプログラミング入門-第6回
 
ユーザ定義関数の詳細
Awkプログラミング入門-第18回
 

■パターン

$0 ~ /itmst/
の部分はitmstが含まれる行のみ本処理するという意味。awkでは行(レコード)単位で処理が行われる。$0は入力行全体を表す。$1、$2・・・などはそれぞれ行中の1番目のフィールド、2番目フィールド・・・を表す。本処理は「パターン{アクション}」という形式で記述する。~ (チルダ)で左辺($0)に右辺のパターン(itmst)が含まれるかをチェックする。正規表現は/ /(スラッシュ)で囲んで記述する。~ の前に ! を付けて !~ とするとマッチする行以外が処理対象になる。~ の代わりに == を使うと左辺と右辺が等しい場合に処理対象になる。ここでは、「itmstという正規表現文字列にマッチする文字列が含まれた行のみを処理対象にする」ということになる。
 
フィールドとレコードの詳細
Awkプログラミング入門-第2回
 
正規表現とパターンマッチング、メタキャラクタの詳細
Awkプログラミング入門-第7回
 
正規表現の詳細
講座『正規表現』
 

■本処理

{
    line[n]=$1"@"$3;
    n++;
    printf("名前:%s, 16進数uid:%04x, uid+gid=%d\n",$1,$3,myfunc($3,$4));
}
前述の本処理のパターンにマッチした行のみがこの本処理に送られる。ここでは配列lineのn番目にフィールド1とフィールド2を文字@をはさんで代入し、インデックス用変数nをインクリメントしている。
printf関数はCと同じように書ける。$1(id)は「NAME:%s」の%sの部分に文字列として、$3(uid)は16進数に変換後4桁に整形して「HEX-UID:%04x」の%04xの部分に挿入される。$3と$4のそれぞれuidとgidは、あらかじめ定義しておいたmyfuncという関数で処理され、その戻り値が「uid+gid=%d」の%dの部分に挿入される。その後それらの結果が画面に出力される。最後の\nの改行コードはprintfの場合はprintとは違って自動的に改行されないので必要なら手動で挿入する必要がある。
 
この部分の処理結果は以下の出力に該当。
NAME:itmst, HEX-UID:03e8, uid+gid=2000
NAME:itmst2, HEX-UID:03e9, uid+gid=2002

配列の詳細
Awkプログラミング入門-第16回
 
printfの詳細
Awkプログラミング入門-第5回
 

■END部

END{
    for(i=0;i<int(n);i++){
        print line[i];
    }
}
END{ }で本処理が終了した後の処理を記述できる。ここではforで、処理回数分インクリメントしておいたn回の繰り返し処理を行っている。配列lineからi番目の値を取り出してprintで標準出力に出力している。awkの組込み関数のint(n)で変数nを整数として取り出している。
 
この部分の処理結果は以下の出力に該当。
itmst@1000
itmst2@1001

for文の詳細
Awkプログラミング入門-第14回
 
組込み関数の詳細
The GNU Awk User's Guide - 組み込み関数
 
 
[参考]
テキストの遊園地
講座『正規表現』
The GNU Awk User's Guide - Table of Contents

 
2008-02-04 14:54 | Linux | Comment(0) | Trackback(0)
WinXP + Apache2でmod_dosevasiveによるDoS攻撃対策
投稿日時 : 2008-02-03 19:46
更新日時 : 2009-08-09 10:33
 数年前から細々と運営していたWebサーバがDoS攻撃された際にとった対策のメモ。
友人にホームページスペースを提供していたんですが、その友人がニコニコ動画でヒットを飛ばしたらしく、予想を上回るアクセスがあった。人が集まると悪意のある人も必ず紛れ込むようで、その中の一人が田代砲でも撃ってるかのような挙動をし始めた。そのときはOutpostでIP指定で遮断したが、根本的な対策をとる必要を感じたので調べてみた。
 

■環境

  Windows XP Professional SP2
  Apache 2.2.8
 

■mod_evasive

 以下のサイトからmod_evasiveというApacheモジュールを入れれば対策できそうなことが分かった。
Apacheに対するサービス拒否攻撃を回避する方法:ITpro
 
mod_evasiveは以下のような動作原理。
ITpro
mod_evasiveはまずURLリクエストをApacheサーバーに送信するIPアドレスの記録を取る。その後,あらかじめ設定した許容範囲を超えるリクエストがいずれかのIPアドレスから送信されていないか測定する。許容範囲を超えるリクエストがあった場合,そのIPアドレスからのリクエストは一時的にブロックされる。

■mod_dosevasiveのダウンロード

 Windows用のコンパイル済みモジュールmod_dosevasiveを以下からダウンロード。
Mod_dosevasive for Apache2 on Windows / Best of Security
 
追記(2009-08-09 10:33):上記サイトではリンク切れになっているとのコメントをいただきました。探してみたところ以下の中国語サイトで発見しました。
 
ZIP内ファイルのmod_dosevasive22.dllのSHA-1ハッシュ(SHA1:275c2f1877e616287214971fbf2df73ffa3bf43e)が、この記事を投稿した2008/02/03の時点で公式サイトから落としたものと同一であることが確認できたので、ほぼ、間違いなく本物です。
 
 
解凍すると以下の2ファイルが入ってる。
  mod_dosevasive22.c
  mod_dosevasive22.dll
.c はソース。.dll の方がコンパイル済みモジュール。自分でコンパイルする場合はapxsというツールを使う必要がある。面倒なのでコンパイル済みを使う。
 

■Apacheのバージョン

 ここで嫌な予感がしたのがファイル名の「22」。これApacheの2.2系用という意味なんじゃないかと思って調べるとやはりそういうことらしい。が、現在運用中のApacheバージョンは2.0.55。大変な作業になることが予想されてうちひしがれる。一応2.0系用のモジュールも探してみたがないっぽい。仕方ないのでサーバマシンのクローン環境で2.0.55から2.2.8(2008年02月03日現在最新)への入れ替え作業実験。httpd.confの2.0系からの変更点を把握するのと、既存のページ・サービスが正常に動作することを確認するので半日かかった。
 

■mod_dosevasiveのインストールと設定

 で、いよいよmod_dosevasiveを組み込む。以下の作業中のパスは環境に応じて読み替えてください。
 
まずmod_dosevasive22.dllをApacheのモジュールフォルダに
D:\_WWW\Apache2\modules\mod_dosevasive22.dll
としてコピー。
 
次にhttpd.confを編集する。128行目あたりのLoadModuleディレクティブが並んでる最後に以下を追記する。
httpd.conf
LoadModule dosevasive22_module D:/_WWW/Apache2/modules/mod_dosevasive22.dll
<IfModule dosevasive22_module>
DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 100
DOSPageInterval 2
DOSSiteInterval 1
DOSBlockingPeriod 60
DOSWhitelist 127.0.0.1 192.168.0.*
</IfModule>
正直はじめLoadModuleに渡すモジュール名を何にすればいいのかわからなかった。
Mod_dosevasive for Apache2 on Windows / Best of Security
LoadModule dosevasive_module c:\apache2\modules\mod_dosevasive.dll
というふうに書けとあるが、ApacheのTestConfigurationを通すとモジュールのAPIが見つからないみたいなことを言われる。
 
どうしようかと思ってソースファイルのmod_dosevasive22.cを眺めていると最後に
mod_dosevasive22.c
module AP_MODULE_DECLARE_DATA dosevasive22_module =
{
    STANDARD20_MODULE_STUFF,
    NULL,
    NULL,
    create_hit_list,
    NULL,
    access_cmds,
    register_hooks
};
というのがあって、APって書いてあるし、かなりぽいのでdosevasive22_moduleを入力してみたら通った。
 

■mod_dosevasiveの設定項目の意味

DOSHashTableSize 3097ハッシュテーブルのサイズ。増加させるとパフォーマンスが上がるがメモリをたくさん食う。アクセスが多い場合は増加させるべき。
DOSPageCount 5DOSPageIntervalで指定した秒数以内にページをリロードできる回数の上限。ここでは5回に設定。
DOSSiteCount 100DOSSiteIntervalで指定した秒数内にサイト全体で可能なリクエスト数の上限。ここでは100リクエストに設定。
DOSPageInterval 2ここで指定した秒数の間にDOSPageCountで指定した回数ページをリロードするとDoS攻撃と見なす。ここでは2秒に設定。
DOSSiteInterval 1ここで指定した秒数の間にDOSSiteCountで指定した回数のリクエストがあるとDoS攻撃と見なす。ここでは1秒に設定。
DOSBlockingPeriod 60遮断する秒数を指定。ここでは60秒に設定。
DOSWhitelist 127.0.0.1 192.168.0.*ここで登録されたホストの活動はDoS攻撃とみなさない。ここでは127.0.0.1の自分自身と192.168.0.*の192.168.0.0/24のLAN内からのアクセスはDoS攻撃として扱わないという設定。ワイルドカードが使用できる。

■動作確認

 設定が終わったのでLAN内ホストからサーバをDoS攻撃してみる。DOSWhitelistをコメントアウトしてApacheを再起動して設定を反映させる。テストにはメガ粒子田代砲を使うw。
 
tashirohou
 
ちゃんと攻撃を検知して遮断してくれた。
 

■環境に合わせて調整する

 ページの構成や提供しているサービスによってはどんなアクセスをDoSアタックと見なすかは多少変わってくると思うので環境に合わせて設定値を調整する。安定して動作することが確認できるまではDoSWhitelistはコメントアウトしておいた方がいいかも。自分はアクセスできても外部からの通常アクセスが知らずに遮断されているということが起こるかもしれないので。
 
[参考]
Apacheに対するサービス拒否攻撃を回避する方法:ITpro
Apacheに対するDOS攻撃を回避する「mod_evasive」 (ひるねこ日記)
Mod_dosevasive for Apache2 on Windows / Best of Security
Nuclear Elephant: mod_evasive
 
2008-02-03 19:46 | Server | Comment(12) | Trackback(1)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。