2012年06月18日

アマゾンで生ゴミ処理機を買ったら市役所がインターネットは信用できないから助成は受け付けられませんと言う。

 開発とは何の関係もなくて申し訳ないが、生活の話。

 私事であるが引っ越しをした。
 引っ越し先は大層な僻地であって、残念なことに、自治体のゴミ収集が来ない。厳密には、ゴミ収集所が(集落の人数が条例の規定値以下のために設置でき)ない。従って、ゴミは市の処理場まで自力で運ぶしかない。で、毎週毎週ゴミを結構な距離のある処理場まで運ぶのは骨が折れる。ある程度溜まったら運べばいいが、そうすると生ゴミの腐敗が問題である。以上から導かれる論理的帰結により、生ゴミ処理機を購入することにした。

 生ゴミ処理機の購入には、自治体の助成がある。処理機を使った結果排出されるゴミの量が低減され自治体の処理場の運用コストが低減するから、家庭での処理機の導入を援助しようという趣旨である。だいたいどこの自治体もそうであろう。ホームページで調べると、「詳しいことは役所に問い合わせろ」ということが書いてあるため、市役所の担当部局に行き申請書の用紙を貰うと、説明のパンフとかはなく、用紙だけをくれた。担当の係員の説明では、領収書の原本と、保証書のコピーを添えて、申請せよ、と言う。

 助成が出るとは言え、やはり安いところで買うのがいいし近所に手頃な電気屋もない(ゴミ収集もこないような僻地だからね)。念のため担当部局に電話して「購入する店舗に規制はありますか?」と訊いたら、どこで買ってもいいと言うので、アマゾンに注文した。で、自治体の補助を申請するため、Amazonの納品書兼領収書と保証書のコピーを持って市役所にいったら、「インターネットで買った物は受け付けられません」と、市役所の担当者が不可解なことを言うのである。「インターネットで買った物はダメって内規で決まってるんですよ」「以前の人も断ったから今回受け付けるというわけにも……」

 なんとおかしな話か!
 きょうび、アマゾンで家電を買うなんてごく一般的な市民の購買行動だろう。しかも、「どこで買ってもいい」と言ったくらいで、どこで買ってもいいはずなのに、アマゾンはインターネットだからダメだという。
 納得できないので理由を聞くと(責任者が後から電話をかけてきて説明されたのだが)、曰く、「インターネットで買ったものは販売店が信用できないからダメである」「保証書に販売店の記入がないのものは信用できない」「アマゾンさんに言って保証書に記入してもらえれば受け付ける」と言うのである。アマゾンは保証書への記入を納品書兼領収書を以て替えているので、保証書に記入はないが、納品書兼領収書原本があってなお、アマゾンが販売店として信用できない、、、と?

 ひどい話である。インターネット全否定アマゾン全否定である。なんてこった。
 困ったが、ごく普通のことをしていて助成がもらえないのも癪だし、俺以外に以降どこでもいいからと言ってアマゾンで買って助成がもらえない人が発生して欲しくもないので、アマゾンのカスタマーサービスに問い合わせ、市に助成を蹴られたんだけどこれこれこういうことを市が言うから保証書に貼るシールかなんかないの?と聞いた。だいたい、保証書への記入が即ち信用に足るかというと全くそんなことはなくて、無記入の保証書が手元に来てるわけだから、これに自分で勝手に書いてしまうことも可能であって、それを誰が書いたかを確かめる方法はないわけである。だって本当にちゃんと買っているので、店に「売りましたか?」と問い合わせたところで「正しく販売しました」という状態だからである。だから、保証書に記入があるかで販売店の信用を測るなんてのは何の意味もないことだと思うのだが、まあそれはこの際おいておく。
 とにかくアマゾンに問い合わせると、残念だけどシールはない(昔はあったけど今はないみたいだ)、納品書兼領収書がそれに代わる効力を持つからそれで申請して、ということである。だが、それではダメなので、「納品書兼領収書ではダメだっつーんだよ市役所」と言うと、信用できないと言われたっつーことなら店舗印入りの領収書を送るから、ということで、購入者の名前と、店舗印の入った領収書を作って貰った。
 
 んで、改めて、保証書と納品書兼領収書のコピーと、保証書への記入は納品書によって代えるのだというアマゾンの約款と、アマゾンの店舗印の入った領収書を持って市役所に行き、「これで販売店が信用できないと言うことはないでしょ?」といって、申請は受理、つまりアマゾンは販売店として認められたのであった。

 インターネットだから信用できない、なんて、やっぱりどうしても納得できないよな。どうなってんだ、市役所。
 
【日記の最新記事】
posted by usoinfo at 16:55 | Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2012年02月19日

PHPで Google Static Maps API のポリラインエンコード

 Google MapのAPIに、Google Static Maps APIというものがある。データを埋め込みにして、静的な地図を生成するものである(static mapだから当然だが)。このAPIでも、地図上に直線(パス)を引けるのだが、線を引くためのデータはURL中に埋め込む(GETメソッドで引き渡す)ので、含められるパスのポイント数には上限がある。
 で、渡せるポイント数を多くするため?に、Googleがポリラインエンコード(http://code.google.com/intl/ja/apis/maps/documentation/utilities/polylinealgorithm.html)という方法を提供している。ざっくり言うと差分値をエンコードして並べ、クエリ文字数を短縮しようというようなことである。
 
 どんなものかは上記URLの先にあるドキュメントに書いてある。しかも結構丁寧に書いてあるのでわかりやすい。ここまで丁寧にしてくれるなら、いっそサンプルコードかライブラリを提供してくれればいいのにな、とも思わなくもない。

 ということで、ポリラインエンコードをするコードを作っていたので、サンプルを貼っておくと誰かがコピペで使えるのではないか、と。(サンプルソースのファイルはこちら。中身はいっしょ。)
// 配列に入った緯度経度をポリラインエンコードする
// 1つのポイントは array(緯度10進数,経度10進数) の形式
// ポイントを array( ポイント, ポイント, ... ) で列挙
function latlon2GooglePolyline($data)
{
$plat = false; // 1つ前の緯度
$plon = false; // 1つ前の経度

foreach($data as $point){
// 初回以外は差分を取る
$lat = $plat !== false ? $point[0] - $plat : $point[0];
$lon = $plon !== false ? $point[1] - $plon : $point[1];

// 緯度と経度をポリラインエンコードしてクエリに追加
$query .= GooglePolyline_Encode($lat).GooglePolyline_Encode($lon);

$plat = $point[0];
$plon = $point[1];
}

return $query;
}

// 単体の緯度または経度をポリラインエンコードする
// 入力値 $value は10進数の緯度または経度
function GooglePolyline_Encode($value)
{
$value = ($value * pow(10,5)) << 1; // ステップ2,3,4: 10^5を掛け左1ビットシフト
if( $value < 0 ) $value = ~$value; // ステップ5: 元の数値が負の時はビット反転

//ステップ6,7: 下位から5ビットずつ切り出す(逆順になる)
for($i=0;$i<6;$i++){
$arr[$i] = $value & 0x0000001F;
$value = $value >> 5;
}

// 不要なバイトを取り除く(上位で0が続く間そのバイトは除去、但し0の時は1バイト残す)
while( $arr[ count($arr)-1 ] === 0 && count($arr) > 1 ){
array_pop($arr);
}

//ステップ8: 最下位バイト以外に後続ビットを立てる(0x20論理和を加算)
for($i=0;$i<count($arr)-1;$i++){
$arr[$i] |= 0x20;
}

//ステップ9,10,11: 各バイトに63を加算してASCII文字に変換
$ret = '';
for($i=0;$i<count($arr);$i++){
$ret .= chr($arr[$i]+63);
}
return $ret;
}

// テスト用データ・山手線各駅の緯度経度
$data = array(
array(35.619772,139.728439),
array(35.625974,139.723822),
array(35.633923,139.715775),
array(35.646685,139.710070),
array(35.658871,139.701238),
array(35.670646,139.702592),
array(35.683061,139.702042),
array(35.689729,139.700464),
array(35.700875,139.700261),
array(35.712677,139.703715),
array(35.720476,139.706228),
array(35.730256,139.711086),
array(35.731586,139.728885),
array(35.733445,139.739303),
array(35.736825,139.748053),
array(35.737781,139.761229),
array(35.731954,139.766857),
array(35.727908,139.771287),
array(35.721484,139.778015),
array(35.713790,139.777043),
array(35.707282,139.774727),
array(35.698547,139.773091),
array(35.691173,139.770641),
array(35.681391,139.766103),
array(35.675441,139.763806),
array(35.666151,139.758654),
array(35.655391,139.757135),
array(35.645736,139.747575),
array(35.628760,139.738999),
array(35.619772,139.728439)
);

// テスト用データをポリラインエンコードしてURLを出力(実際は改行は入っていない)
echo "http://maps.google.com/maps/api/staticmap?sensor=false&
size=640x640&maptype=roadmap&path=color:0x0000ffFF%7Cweight:
5%7Cenc:".latlon2GooglePolyline($data)."\n";
 実行すると、こんな感じで出力される(実際は改行は入っていない)。
$ php polylineencode.php
http://maps.google.com/maps/api/staticmap?sensor=false&size=640x640&maptype=roadmap&
path=color:0x0000ffFF%7Cweight:5%7Cenc:q~kxEuuysYwe@x[sp@fq@wnArb@ckAdv@qhAmGqlAlBsh
@xHsdAf@whAqTuo@uNa|@i]iGenBqJa`AaTsu@}DiqAjc@cb@fXuZbg@_i@`o@`Erg@lMpu@dI`m@fNb|@h[
bd@hM`y@d_@dbAlHh{@tz@`iBpt@bw@|`A
 このままIMGタグに張り込むと、こうなる(クリックで原寸)。


 というわけで、Usoinfo GPSログトレースマップ緯度経度トレースマップを、Google Mapsに対応。地形図とか航空写真をプロットしてみると、これはこれでなかなか面白い。
posted by usoinfo at 13:44 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2012年02月18日

PHPでデータのバイナリダンプを見る

なんてことはないコード集。PHPで変数の中身をバイナリダンプする。

function binary_dump($in)
{
$bindata = unpack("C*", $in );
$ret = "";
foreach($bindata as $v){
$ret .= sprintf("%02x ",$v);
}
return $ret;
}
pack()でunsigned charで分割して配列に格納し、端から出力しているだけである。
マルチバイト出力例。
$sjis	= "バイナリダンプ";
$utf8 = mb_convert_encoding($sjis,"UTF-8","SJIS");
echo "SJIS:".binary_dump($sjis)."\r\n";
echo "UTF8:".binary_dump($utf8)."\r\n";

$ php dump.php
SJIS:83 6f 83 43 83 69 83 8a 83 5f 83 93 83 76
UTF8:e3 83 90 e3 82 a4 e3 83 8a e3 83 aa e3 83 80 e3 83 b3 e3 83 97

タグ:PHP
posted by usoinfo at 10:54 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2012年02月15日

逆ジオコーダーの住所データ更新

usoinfo逆ジオコーダーの住所データを、2010(平成22)年度のものに更新しました。

Web版 http://usoinfo.if.land.to/osmtool/latlon2addr.php
Windowsアプリケーション版 http://www23.atpages.jp/usoinfo/urgeocoding.html

今後ともよろしくどうぞ。
posted by usoinfo at 06:03 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2012年01月27日

yum-complete-transaction を要求された (openssl-0.9.8e-20.el5_7.1.x86_64のコンフリクト後の顛末)

 2012/01/24に出たopensslのsecurity updateで、CentOSのリポジトリに上がったOpenSSLのアップデートが、一昨日から昨日あたりにかけてうまくいかない状況にあったようである(パッケージ内のいくつかが、既存のものとコンフリクトを起こしてupdateできなかった)。
 日を改めたらちゃんとupdateできたのだが、失敗した時のものが残っているのか、yumでこんなことを言われるようになった。
There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them.
The program yum-complete-transaction is found in the yum-utils package.
 未完了のトランザクションがあるから、yum-complete-transactionというプログラムを走らせて完了させよ、そのプログラムはyum-utilsにある、と。指示の通りに実施する。
# yum install yum-utils
(略)
# yum-complete-transaction
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: www.ftp.ne.jp
* extras: www.ftp.ne.jp
* updates: www.ftp.ne.jp
Checking for new repos for mirrors
There are 1 outstanding transactions to complete. Finishing the most recent one
The remaining transaction had 18 elements left to run
Package kernel-headers-2.6.18-274.17.1.el5.x86_64 already installed and latest version
Package libxml2-python-2.6.26-2.1.12.el5_7.2.x86_64 already installed and latest version
Package libxml2-devel-2.6.26-2.1.12.el5_7.2.x86_64 already installed and latest version
Package libxml2-devel-2.6.26-2.1.12.el5_7.2.i386 already installed and latest version
Package openssl-devel-0.9.8e-20.el5_7.1.x86_64 already installed and latest version
Package openssl-devel-0.9.8e-20.el5_7.1.i386 already installed and latest version
There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them.
--> Running transaction check
---> Package gnome-screensaver.x86_64 0:2.16.1-8.el5_6.3 set to be erased
---> Package kernel-headers.x86_64 0:2.6.18-274.12.1.el5 set to be erased
---> Package libxml2.i386 0:2.6.26-2.1.12.el5_7.1 set to be erased
---> Package libxml2.x86_64 0:2.6.26-2.1.12.el5_7.1 set to be erased
---> Package lvm2.x86_64 0:2.02.84-6.el5_7.1 set to be erased
---> Package openssl.i686 0:0.9.8e-20.el5 set to be erased
---> Package openssl.x86_64 0:0.9.8e-20.el5 set to be erased
--> Finished Dependency Resolution

==========================================================================================
Package Arch Version Repository Size
==========================================================================================
Removing:
gnome-screensaver x86_64 2.16.1-8.el5_6.3 installed 3.3 M
kernel-headers x86_64 2.6.18-274.12.1.el5 installed 2.3 M
libxml2 i386 2.6.26-2.1.12.el5_7.1 installed 1.5 M
libxml2 x86_64 2.6.26-2.1.12.el5_7.1 installed 1.6 M
lvm2 x86_64 2.02.84-6.el5_7.1 installed 8.5 M
openssl i686 0.9.8e-20.el5 installed 3.4 M
openssl x86_64 0.9.8e-20.el5 installed 3.5 M

Transaction Summary
==========================================================================================
Remove 7 Package(s)
Reinstall 0 Package(s)
Downgrade 0 Package(s)

Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Erasing : kernel-headers 1/7
Erasing : openssl 2/7
Erasing : libxml2 3/7
Erasing : gnome-screensaver 4/7
Erasing : openssl 5/7
Erasing : libxml2 6/7
Erasing : lvm2 7/7

Removed:
gnome-screensaver.x86_64 0:2.16.1-8.el5_6.3 kernel-headers.x86_64 0:2.6.18-274.12.1.el5
libxml2.i386 0:2.6.26-2.1.12.el5_7.1 libxml2.x86_64 0:2.6.26-2.1.12.el5_7.1
lvm2.x86_64 0:2.02.84-6.el5_7.1 openssl.i686 0:0.9.8e-20.el5
openssl.x86_64 0:0.9.8e-20.el5

Cleaning up completed transaction file
タグ:Linux CentOS
posted by usoinfo at 09:06 | Comment(0) | Linux | このブログの読者になる | 更新情報をチェックする

2012年01月17日

MySQL レプリケーションスレーブのリレーログの名前と場所を変更する

・スレーブを作るときにリレーログ名にホスト名を入れてしまった(が、後でホスト名を変えた、他のスレーブにコピーを持ってきた)
・リレーログを別の物理ディスクに置いてパフォーマンス向上を期待したい(か、ディスクが一杯で逃がしたい)

等、既にできているレプリケーションスレーブのリレーログの名前と場所を変える方法。MySQL 5.5.10 で実施。


1. スレーブのMySQLを止める。
変更前にMySQLのデータディレクトリを丸ごとバックアップして、危急の場合に備えることをお勧めする。

2. my.cnf の変更
 変更箇所は relay-log relay-log-index の2カ所
relay-log=old-name-relay-bin
relay-log-index=old-name-relay-bin
などという感じになっているのを
relay-log=/var/mysql/relaylog/new-name-relay-bin
relay-log-index=/var/mysql/relaylog/new-name-relay-bin
と変更。フルパス名で、拡張子を取り除いたファイル名を記述する。

3. 既存のリレーログを新しい場所へ移動
 デフォルトではデータディレクトリにリレーログとリレーログインデックスが置かれているので、これを新しい場所へ移動する。場所だけでなく名前も変える場合は、ファイル名も変更しておく。ファイル名の一括変更は rename コマンドが便利。
# cd ~mysql/var
# mv old-name-relay-bin.* /var/mysql/relaylog/
# cd /var/mysql/relaylog
# rename old-name new-name old-name-relay-bin.*
4. リレーログインデックスの内容を変更
 リレーログインデックスには、現在のリレーログの一覧が入っている。これを新しい場所と名前に書き換える。
# vi /var/mysql/relaylog/relay-bin.index
--
./old-name-relay-bin.000229
./old-name-relay-bin.000230
./old-name-relay-bin.000231
:
こんな内容になっているので、vi で置換して保存。
(viで置換):%s;./old-name-;/var/mysql/relaylog/new-name-;g
--
/var/mysql/relaylog/new-name-relay-bin.000229
/var/mysql/relaylog/new-name-relay-bin.000230
/var/mysql/relaylog/new-name-relay-bin.000231
--
:wq
5. relay-log.info の内容を変更
データディレクトリにある relay-log.info には、スレーブがリレーログの情報を書き込んでいる。ここにもリレーログのパス名が書かれているので、書き換える。
# vi ~mysql/var/relay-log.info
--
./old-name-relay-bin.000230
369057398
(略)
--

--
/var/mysql/relaylog/new-name-relay-bin.000230
369057398
(略)
6. MySQL を起動。
SHOW SLAVE STATUS\G でスレーブのステータスを確認してみて、エラーが出ずLogPosが進めばOK。
タグ:MySQL
posted by usoinfo at 07:44 | Comment(0) | Linux | このブログの読者になる | 更新情報をチェックする

2012年01月11日

Linuxで実行中のプロセスの優先度を下げる

いつも忘れてしまうので備忘録的に、unix/linuxで実行中のプロセスの優先度を下げる。
renice (優先度) -p (プロセスID) を使う。
% renice 5 -p 15661
# 優先度値は19がもっとも劣後
優先度を見る。
ps -l で NI に出る。
% ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1001 4292 4291 0 75 0 - 16751 rt_sig pts/2 00:00:00 tcsh
0 S 1001 15661 4292 0 76 0 - 16520 wait pts/2 00:00:00 sh
0 R 1001 15931 15661 22 80 5 - 96368 - pts/2 00:04:00 bgdatachecke
0 R 1001 17710 15661 0 77 0 - 15879 - pts/2 00:00:00 ps
タグ:Linux
posted by usoinfo at 08:02 | Comment(0) | Linux | このブログの読者になる | 更新情報をチェックする

2011年12月02日

PHPでチェックデジットを計算する

なんてことはないコード集。バーコードなどに使われているチェックデジットを計算するルーチン。

JANで使われるモジュラス10ウェイト3-1
function modulus10w31($num)
{
$arr = array_reverse(str_split($num));
for($i=0;$i<count($arr);$i++){
$t += ( ($i+1) % 2) == 0 ? intval($arr[$i]) : intval($arr[$i])*3;
}
$cd = 10 - intval( substr($t,strlen($t)-1,1) );
return $cd > 0 ? 10 - $cd : 0;
}
ついでにモジュラス16
function modulus16($str)
{
$maparr = str_split('0123456789-$:/.+ABCD');
$inarr = str_split($str);
$t = 0;
for($i=0;$i<count($inarr);$i++){
$t += array_search( $inarr[$i], $maparr);
}
return $maparr[ 16-($t % 16) ];
}
おまけでモジュラス43
function modulus43($str)
{
$maparr = str_split('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%');
$inarr = str_split($str);
$t = 0;
for($i=0;$i<count($inarr);$i++){
$t += array_search( $inarr[$i], $maparr);
}
return $maparr[ ($t % 43) ];
}
使うときは入力値のvalidationを加えてください。

※モジュラス10ウェイト3-1の最後の桁が0のとき間違いがあったので修正(2011/12/03)
タグ:PHP
posted by usoinfo at 13:17 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2011年10月22日

OpenVPN+bridge-utilsのVPNでリモートの同一セグメントに乗っかる

 普段持ち歩くPCはWindowsなので、VPNはPPTPが一番楽である。クライアント1台のみのことなのでいちいちルーティングを設定して使うのは面倒で、PPTPはクライアント1台をVPNの向こう側の同一セグメント上に接続しているかのごとく見せるのが簡単にできるので結構なのである(LinuxのPPTPサーバの実装[PopTop]もある)。が、先日ブロバンルータを乗り換えたため、問題が発生した。PPTPはGREを使うのだが、古いバッファローのルータではプロトコルGREのパケットを特定ホストに転送が出来たのに、今度のコレガのルータではプロトコルIPv4のパケット(のTCPかUDPの特定のポート)しか内側に振れないのである。従って、PPTPはまるっきり使えないことになった。
 次善の策として、OpenVPNを使って、同じように、リモートからVPN越しにつないで、あたかもVPN先のセグメントに繋がってるが如くに振る舞うようにする設定したのであった。サーバーはCentOS5.7、クライアントはWindows7である。

サーバー側の設定
設定ファイルは、/etc/openvpnに置くことを仮定している。

1. OpenVPNのインストール
RPMforgeにあるので、yumで一発。また、bridge-utilsを使ってブリッジを作るので、それもインストール。

# yum install --enablerepo=rpmforge openvpn
[略]
# /usr/sbin/openvpn --version
OpenVPN 2.2.0 x86_64-redhat-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] built on Jun 6 2011
[略]
# yum install bridge-utils
# brctl --version
bridge-utils, 1.1
2. 鍵を作る
OpenVPNをブリッジで使うときは static-key が使えないみたいなので、CAを作って鍵を作って署名する。
# cd /etc/openvpn/ ※どこのディレクトリでやってもいいのだが。
# cp -r /usr/share/doc/openvpn-2.2.0/easy-rsa/2.0/ easy-rsa
# cd easy-rsa
# vi vars ※設定値を変えておくと作業が楽になる
export KEY_COUNTRY="JP"
export KEY_PROVINCE="ToKyo"
export KEY_CITY="ChiyoDaku"
export KEY_ORG="usoinfo"
export KEY_EMAIL="usoinfo_at_ahoaho.net"
# source vars
# ./clean-all

# ./build-ca ※CAを作る。プロンプトにはEnterでいいが適宜お好みで。
# ./build-key-server server ※サーバーの鍵。これもお好みで。
# ./build-key ahoaho ※クライアントの鍵。接続するクライアント毎に作る。

# cp keys/ca.crt /etc/openvpn/
※出来たCAの証明書をconfigのあるところへ配置。

# cp keys/server.crt keys/server.key keys/dh1024.pem /etc/openvpn/
※出来たサーバ用の鍵をconfigのあるところへ配置。
※ keys/ca.crt keys/ahoaho.crt keys/ahoaho.key はクライアントの動作に使う
3. ブリッジの用意
# cp /usr/share/doc/openvpn-2.2.0/sample-scripts/bridge-start /etc/openvpn
# cp /usr/share/doc/openvpn-2.2.0/sample-scripts/bridge-stop /etc/openvpn
※ブリッジの開始・停止スクリプトをコピー

# chmod 755 bridge-start bridge-stop ※実行ビットを付与

# vi bridge-start ※ブリッジ開始の設定を編集
br="br0" ※ブリッジインターフェース名。
tap="tap0" ※ブリッジするOpenVPNのTAPインターフェース名。
eth="eth0" ※ブリッジするローカルセグメントのインターフェース名。
eth_ip="192.168.x.y"
eth_netmask="255.255.255.0"
eth_broadcast="192.168.x.255"

# vi bridge-stop ※ブリッジ停止の設定を編集
br="br0" ※bridge-startに合わせる
tap="tap0" ※bridge-startに合わせる
 ブリッジインターフェース名は、他にブリッジがなければbr0でいいだろう。TAPインターフェース名は、OpenVPNの設定と合っていないとダメ。ethの各項目は、ローカルセグメントに繋がっているインターフェースの設定を書く。
 OpenVPNでブリッジするときは、bridge-start → openvpn startの順で開始し、openvpn stop → bridge-stopの順で停止しないといけない。面倒なので、スタートアップスクリプトに開始と終了を埋め込む。
# vi /etc/rc.d/init.d/openvpn
[略]
case "$1" in
start)
echo -n $"Starting openvpn: "
/etc/openvpn/bridge-start ※開始時OpenVPNが始まる前にブリッジ開始
/sbin/modprobe tun >/dev/null 2>&1
[略]
stop)
echo -n $"Shutting down openvpn: "
for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
if [ -s $pidf ]; then
kill `cat $pidf` >/dev/null 2>&1
fi
rm -f $pidf
done

# Run shutdown script, if defined
if [ -f $work/openvpn-shutdown ]; then
$work/openvpn-shutdown
fi
/etc/openvpn/bridge-stop ※OpenVPNが停止した後でブリッジ停止
4. OpenVPNサーバーの設定
 OpenVPNサーバーの設定は、設定ディレクトリ(/etc/openvpn)に、xxxx.confという名前で保存しておくと、スタートアップスクリプトが .conf の設定を読み込んで実行してくれる。/usr/share/doc/openvpn-2.2.0/sample-config-files/server.conf にサンプルの設定ファイルがあるので、これをベースに書き換えてもいい。
OpenVPNサーバー設定のポイントを抜粋:
server-bridge 192.168.1.1 255.255.255.0 192.168.1.222 192.168.1.230
dev tap0
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
client-to-client
push "route 192.168.2.0 255.255.255.0"
push "dhcp-option DNS 192.168.1.1"
server-bridgeが、ブリッジモードを指定する。1,2番目がローカルセグメントの(つまりeth1の)アドレスとネットマスク、3,4番目が、クライアントに割り当たるアドレスの開始アドレスと終了アドレスである。
dev tap0で、OpenVPNのTAPインターフェースを指定する。bridge-start/stopで指定したインターフェース名を、数字も込みでで指定する。"dev tap"ではダメである。
ca cert key dhは、2.で作った証明書と鍵をOpenVPNに読み込ませる設定。
client-to-clientは、OpenVPNクライアント同士が通信するときに必要。クライアントが1台だけならいらない。
push "route 192.168.2.0 255.255.255.0"は、他のネットワーク(ここでは192.168.2.0)への通信がVPNを経由するようにクライアントに経路を設定させる。
push "dhcp-option DNS 192.168.1.1"は、クライアントにDNSサーバーのアドレスを通知する。

TCPサーバーモード、ポート5000で動かす場合の設定ファイルのサンプルはこちら

5. 設定ファイルを配置したら、service openvpn startでデーモン開始。ブリッジを開始するときにしばらく通信できなくなることがある(ブリッジの設定を失敗するとずっと通信できなくなる)ことがあるので、実行はコンソールからやるのがお勧め。
正常動作を確認できたら、chkconfig openvpn onで自動的に開始するようにしておく。

クライアント側の設定
1. OpenVPNのインストール
http://www.openvpn.net/index.php/open-source/downloads.htmlから Windows Installer をダウンロードしてきて、インストールする。

2. クライアントの設定
 サーバーの2.で作ったクライアント用の鍵と証明書のファイル(ca.crt,ahoaho.crt,ahoaho.key)を、クライアントのconfigフォルダに置く。デフォルトでは、C:\Program Files\OpenVPN\config
 configフォルダにクライアント用の設定ファイルをxxxx.opvnという名前で作成する。
OpenVPNクライアント設定のポイントを抜粋:
dev tap
ca ../config/ca.crt
cert ../config/barkhorn.crt
key ../config/barkhorn.key
tls-client
pull
float
dev tapで、OpenVPNのTAPインターフェースを指定する。
ca cert key dhは、2.で作った証明書と鍵をOpenVPNに読み込ませる設定。
tls-clientで、TLSクライアントを指定する。
pullで、サーバーからconfigを読み取る。サーバーがpushで設定した項目が設定される。
tls-clientで、IPアドレスが可変であることを指定する。

TCPクライアントモード、ポート5000で動かす場合の設定ファイルのサンプルはこちら

3. スタートメニューから、OpenVPN GUIを実行し、通知領域アイコンを右クリック、「Connect」を実行する。うまくいけば、"Initalization Sequence Completed" と出て、TAPアダプターにIPアドレスが付与されるはずである。


ブロバンルータで、OpenVPNのポートを内側のホストにアドレスに振っておくのを忘れずに。
タグ:Linux VPN OpenVPN
posted by usoinfo at 11:07 | Comment(0) | Linux | このブログの読者になる | 更新情報をチェックする

2011年09月20日

Windowsの「送る」メニューからドライブを消す

 Windowsで、右クリックすると出てくるコンテキストメニューの中に、「送る」というのがある。C:\Users\(ユーザー名)\AppData\Roaming\Microsoft\Windows\SendTo などにショートカットを置いて使っているが、ここのフォルダに置いていないのに勝手に出るアイコンがある。リムーバブルドライブである。うっかり光学ドライブに間違えて放り込んでしまい、「書き込み可能なディスクを入れてください」などと言われ、鬱陶しい。

 そこで、「送る」のメニューからリムーバブルドライブを消す方法である。
 レジストリエディタで HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer を開き、右ペインを右クリックでDWORD値を新規追加する。名前は "NoDrivesInSendToMenu"、値は "1"。
.reg的に書くとこうである。
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoDrivesInSendToMenu"=dword:00000001
 これで、リブートなりなんなりすれば、めでたく「送る」からリムーバブルドライブが消えてくれる。



 
タグ:Windows
posted by usoinfo at 06:52 | Comment(0) | Windows | このブログの読者になる | 更新情報をチェックする