東京電力の電力状況をscreen のステータスに表示

IMGP0370.JPG
最近の作業中は大抵裏でTurntable のAnimeOnlyCoding Soundtrack 辺りを流しながらTerminal で作業しています.そこではByobu 経由でscreen が起動しています.
ということで,何時も作業しているここに東京電力の電力状況を表示できると便利かもしれないと思って表示してみました.

@ssciさんが東京電力電力供給状況API を提供してくれているので,これを利用させてもらいます.
おかげでscript は数行でかけました.

#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple;
use JSON qw/encode_json decode_json/;

my $data = decode_json(get('http://tepco-usage-api.appspot.com/latest.json'));

printf "%02dH %.1f", $data->{hour}, ( $data->{usage} / $data->{capacity} * 100 + 0.05 );
print '%';

これを,screen から呼び出します.
以下,~/.screenrc に追記した部分です.

backtick 0 900 1 /home/mk/.byobu/bin/denryoku.pl
caption always "%12`%?%-Lw%50L>%?%{=r}%n*%f %t%?(%u)%?%{-}%12`%?%+Lw%?%11` %=%12`%0` %110`%109`%122`%111`%10`%<"

#backtick のscript のpath に~/ を使ったら見てくれなくて少し嵌った.
backtick でID=0 で15分おきにscript を呼び出して,caption always で表示しています.caption always はbyobu のものをコピーして表示したい部分に %0` を書いています.0 部分はbacktick で指定したID です.

これで以下の様に表示されます.


分かりづらいですが,上の行のmk@x201s の左の22H 77.5% というのがそれです.
22H取得のデータで使用率77.5%のつもりですが一寸分かりづらいですね.良い表示方法はないかな….

- 東京電力電力供給状況API
http://tepco-usage-api.appspot.com/

クラウドのデータも暗号化してみる

IMGP5524

- The Dropbox Blog » Blog Archive » Yesterday’s Authentication Bug
http://blog.dropbox.com/?p=821
- Dropboxに障害、正しいパスワードでなくてもアクセス可能な状態が約4時間続く -INTERNET Watch
http://internet.watch.impress.co.jp/docs/news/20110621_454760.html
- Dropboxでセキュリティ障害--一時的にパスワード不要のアクセス可能に - CNET Japan
http://japan.cnet.com/news/service/35004312/
- Dropbox、バグで他人の情報を閲覧し放題に ― 4時間弱 - モバイル・トゥデイ(Mobile Today)
http://mt.business.nifty.com/articles/4371.html

てことで,クラウドにデータを置くのが不安だという人も居ると思います.
で,以下のエントリを見かけました.

- TrueCryptでDropboxのデータを暗号化して利用する | Lifehacking.jp
http://lifehacking.jp/2011/06/truecrypt/

これはDropbox の中にTrueCrypt のボリュームを作るという方法のようです.しかし,この方法だと1バイトでも変更があるとTrueCrypt のボリューム全てを同期する必要があり色々ともったいないです.
#2つ目に紹介されているDMG を使う方法も同じ問題がある + 基本Mac でしか使えない.

EncFS という暗号ファイルシステムがあります.この暗号化ファイルシステムはファイル,ディレクトリ単位で暗号化を行います.そのため,Dropbox に使っても変更したファイルしか同期されないはずです.
残念ながらWindows は非対応ですが,Linux/MaxOS X/BSD/FreeBSD に対応しています.
#TrueCrypt はWidnows/MacOS X/Linux に対応.


以下に簡単にLinux(DebianSqueeze or Ubuntu11.04) での利用方法を説明します.

  • 導入.

パッケージから導入を行います.

$ sudo apt-get install encfs
  • fuse グループへ利用ユーザの登録

vigr コマンド等でfuse グループに利用ユーザを登録します.以下はmk アカウントを登録した例です.

$ sudo vigr
$ grep ^fuse: /etc/group
fuse:x:104:mk

Dropbox ディレクトリ内に暗号化データを格納するディレクトリを作成します.

$ mkdir ~/Dropbox/crypt

これは作らなくてもマウント時に自動作成可能です.

$ mkdir ~/enc-mount
  • 暗号化環境作成(初回マウント)

初回マウント時に暗号化の質問を色々聞かれます.とりあえずp で規定値の設定になるります.#規定値でaes256/bs1024/ファイル名も暗号化.
x で暗号形式やブロックサイズ,ファイルディレクトリ名の暗号化などを設定可能です.

$ encfs ~/crypt ~/enc-mount
新しい暗号化ボリュームを作成します。
Please choose from one of the following options:
enter "x" for expert configuration mode,
enter "p" for pre-configured paranoia mode,
anything else, or an empty line will select standard mode.
?> p

Paranoia configuration selected.

設定が完了しました。以下のプロパティのファイルシステムが
作成されます:
ファイルシステム暗号アルゴリズム: "ssl/aes", バージョン 3:0:2
Filename encoding: "nameio/block", version 3:0:1
鍵サイズ: 256 ビット
ブロックサイズ : 1024 バイト (8 バイト MAC ヘッダ含む)
Each file contains 8 byte header with unique IV data.
Filenames encoded using IV chaining mode.
File data IV is chained to filename IV.
File holes passed through to ciphertext.

-------------------------- 警告 --------------------------
The external initialization-vector chaining option has been
enabled.  This option disables the use of hard links on the
filesystem. Without hard links, some programs may not work.
The programs 'mutt' and 'procmail' are known to fail.  For
more information, please see the encfs mailing list.
If you would like to choose another configuration setting,
please press CTRL-C now to abort and start over.

Now you will need to enter a password for your filesystem.
You will need to remember this password, as there is absolutely
no recovery mechanism.  However, the password can be changed
later using encfsctl.

新しい Encfs パスワード: 
Encfs パスワードの確認: 
  • アンマウント
$ fusermount -u ~/enc-mount
  • 確認

暗号化ディレクトリを確認すると以下のような設定ファイルが作成されています.
~/crypt/.encfs6.xml
暗号形式やパスワードなどが記録されています.

    • ファイルを作成してみる

マウント状態でファイルを作成してみます

$ echo "hoge" > ~/enc-mount/hoge
$ ls -A ~/crypt/
.encfs6.xml  BcG,iErj4ppq,iXaTnrvNrEn

hoge に対してBcG,iErj4ppq,iXaTnrvNrEn? というファイルが作られています.
中を確認してみます.

$ od -xc ~/crypt/BcG\,iErj4ppq\,iXaTnrvNrEn 
0000000    84c1    5505    9b67    a495    f096    cbb9    6143    dddf
        301 204 005   U   g 233 225 244 226 360 271 313   C   a 337 335
0000020    33e4    e945    00d4
        344   3   E 351 324
0000025

謎のデータになっていました.
ファイルメーもデータも暗号化されているようです.


ということで,暗号領域が設定できました.

気になるところとしては,

  • 設定情報も同期される.
  • ファイル名も暗号化すると,暗号化時にファイル名帳が元より長くなるので利用できるファイル名長が規定値より短くなる.
  • Windows で読む手段が今のところ無い.

といったところでしょうか.
この方法を使うと,ファイル同期サービスは大抵暗号化可能だと思います.
Evernote なんかはこの方法は使えません.
Evernote は標準機能で一部分だけ暗号化は可能です.
##暗号化したい文字列を選択して右クリック->「選択肢た文字列を暗号化」一時的に同期を止めるなどして同期前に暗号化しておくといいでしょう.

- encfs - www
http://www.arg0.net/encfs
- EncFS | freshmeat.net
http://freshmeat.net/projects/encfs
- Linux/暗号化fs/EncFS - matoken's wiki.
http://hpv.cc/~maty/pukiwiki1/index.php?Linux%2F%B0%C5%B9%E6%B2%BDfs%2FEncFS

nilfs2 を試してみる

前から興味はあったけど実際運用したことのないnilfs2 をバックアップのバックアップだけど設定してみました.

環境はDebianSqueeze です.
導入

$ sudo apt-get install nilfs2-tools

ディスク初期化

$ sudo mkfs.nilfs2 /dev/vdb1
mkfs.nilfs2 ver 2.0
Start writing file system initial data to the device
       Blocksize:4096  Device:/dev/vdb1  Device Size:10736328704
File system initialization succeeded !! 

マウント

$ sudo mount -t nilfs2 /dev/vdb1 /export/
mount.nilfs2: WARNING! - The NILFS on-disk format may change at any time.
mount.nilfs2: WARNING! - Do not place critical data on a NILFS filesystem.

怖いメッセージが出ますね


恒久的なマウントの為にUUID 確認

$ sudo blkid /dev/vdb
$ ls -l /dev/disk/by-uuid/
合計 0
lrwxrwxrwx 1 root root 10 2011-06-16 03:26 a4ad2750-5207-4d1a-abdd-9680b5469780 -> ../../vda1

UUID が見当たらない….

Nilfs users (Log-Structured Snapshotting Filesystem)

未だサポートが行き届いていない状態のよう.普通に/dev/hoge なデバイス名で設定する.

/etc/fstab に以下を追記.

/dev/vdb1        /export         nilfs2  noauto  0       0

念のため再起動して動作確認.

$ mount|grep /dev/vdb1
/dev/vdb1 on /export type nilfs2 (rw,gcpid=654)

チェックポイントの確認

 $ lscp
                 CNO        DATE     TIME  MODE  FLG   NBLKINC       ICNT
                   1  2011-06-10 01:52:47   cp    -         11          3
                   2  2011-06-10 01:54:41   cp    -         11          4
                   3  2011-06-10 02:00:11   cp    -       1324        143
                   4  2011-06-10 02:00:17   cp    -       4674        184

自動的にcp が作られている.


スナップショットを作成する

$ sudo mkcp -s

した後にlscp してみると,実行時のss が出来ている.

$ lscp|grep ss
                   42  2011-06-10 02:02:59   ss    -       2878        816

cp はGC が自動的に削除します.削除タイミングは/etc/nilfs_cleanerd.conf のprotection_period の秒数の間は保護されます.
ss はGC では削除されません.

さて,スナップショットからの復元も試してみます.
まずはテストファイルを作成してスナップショットの作成.

$ mkdir test
$ echo test > test/testdata
$ cat test/testdata
test
$ sudo mkcp -s
$ lscp | tail -2
                9519  2011-06-17 00:59:57   ss    -         25     585668
                9520  2011-06-17 01:00:23   cp    i         20     585668

削除してスナップショットをマウントして復元してみます.

$ rm test/testdata
$ sudo mkdir /media/nilfs-ss
$ sudo mount -t nilfs2 -o ro,cp=9519 /dev/sdc1 /media/nilfs-ss
$ ls -l /media/nilfs-ss/test/testdata 
-rw-r--r-- 1 mk mk 5 2011-06-17 00:59 /media/nilfs-ss/test/testdata
$ cat /media/nilfs-ss/test/testdata 
test
$ cp -p /media/nilfs-ss/test/testdata test/
$ cat test/testdata 
test
$ sudo umount /media/nilfs-ss

うまく行きました!


スナップショットは自動的に消えないので,ある程度のところで削除しないとディスクがいっぱいになってしまうので,古いものを削除してみます.
スナップショットの確認,

$ lscp|grep ss
                  42  2011-06-10 02:02:59   ss    -       2878        816
                9519  2011-06-17 00:59:57   ss    -         25     585668
$ sudo rmcp 42
rmcp: 42: cannot remove snapshot

To delete snapshot(s), change them into checkpoints with
chcp command before removal.

スナップショットのままでは削除できないようです.一旦cp に変更して削除してみます.

$ sudo chcp cp 42
$ lscp |grep ss
                9519  2011-06-17 00:59:57   ss    -         25     585668
$ lscp |grep '42  2011-06-10 02:02:59'
                  42  2011-06-10 02:02:59   cp    -       2878        816

cp になりました.頬っておいてもGC されると思いますが明示的に削除してみます.

$ sudo rmcp 42
$ lscp |grep '42  2011-06-10 02:02:59'

消えたようです.
最古のss をcp にするのは以下のような感じで行けそうな気がします.

# lscp | grep ss | head -1 | awk '{print $1}' | xargs chcp cp

先ずは,1日一回crontab でmkcp -s してみようと思います.
消すのは1月後くらいでいいかな…


追記)
そうそう,リサイズも来た様なのでこれも試してみたいとこです.

[PATCH 0/4] nilfs2 resize support -- Linux NILFS Development
http://www.spinics.net/lists/linux-nilfs/msg00869.html

NILFS|技
http://www.waza.jp/nilfs/
NILFS - Continuous Snapshotting Filesystem for Linux
http://www.nilfs.org/ja/index.html
[NILFS] What is NILFS?
http://www.nilfs.org/ja/about_nilfs.html
第 70 回 東京エリア Debian 勉強会 2010 年 11 月 -特集 : 俺のファイルシステムは熱いぜ!-
http://tokyodebian.alioth.debian.org/pdf/debianmeetingresume201011.pdf

Gyazo server を手元に立ててみる

@masuiさんが作成されて,恐ろしく便利なスクリーンショット共有ウェブサービスGyazo ですが,誰でも見える場所に置かれるので仕事等では使いづらかったりします.

仕事であれば仕事場でしか見えないサーバにアップ出来れば良さそうってことでGyazo クローンを探してみると幾つか見つかりました.

GyazoサーバをMojolicious::Liteで書いた - アリ
http://d.hatena.ne.jp/akiym/20101124/p1

GoogleAppEngineで動くGyazoクローンgaezooのソースをアップしました。 - a2c.get.diary
http://d.hatena.ne.jp/a2c/20091223/1261505344

Webサーバ不要、40行程度のスクリプトひとつで動かせる Gyazoサーバー(クローン)を書いた - 今日もスミマセン。
http://d.hatena.ne.jp/snaka72/20090529/1243608579

harajune/Gyazo - GitHub
https://github.com/harajune/Gyazo

gyazo/Gyazo - GitHub
https://github.com/gyazo/Gyazo

Perl/Ruby/Python 色々あります.
未だ多少は判るPerl でってことで,GyazoサーバをMojolicious::Liteで書いた - アリ を試してみます.

環境はDebianSqueeze です.
先ずはsource を持ってきてファイルにします.
これを叩くと,port 3000 でデーモンが起動し,public ディレクトリが作成されます.この中にファイルが作られるようになります.

Gyazo クライアントを書き換えるか以下のようなコマンドラインを実行してアップロードを試してみます.

import png:- |curl --socks5 localhost:1080 -F imagedata=@- -F id=hoge -H "Expect:" http://192.168.122.198:3000/upload.cgi;echo $n

#このコマンドは@yuisekiさんのこちらのpost を参考にしました.

するとちゃんとサーバ上にファイルが作成されて閲覧も出来ました.
#ちなみに,公式Gyazo Client の最後の辺りでURL 記録するようにしておくと便利なことも.


とりあえず動くようになりましたが,再起動したら起動して来ないので自動起動するようにします.

/etc/init.d/gyazo として以下のようなファイルを用意します.凄い手抜きですね>

Baffalo LinkStation のディスクからデータを復旧

暫く前に,Baffalo のNAS Linkstation が起動しなくなったのでデータを復旧して欲しいと言われたときのメモが出てきました.
思いの外お手軽に復旧できたのでメモしておきます.

Linkstation は3.5吋HDD が2本入っていて,RAID0,1 が選べるタイプ.RAID1 にしていたそうなので,RAID がSoftRAID で片方でも読めれば復旧できるかなとUbuntu なマシンに繋いでみました.
繋ぐと認識しています.mdadm でポチポチやればいけるだろうけどうろ覚えでめんどいなーと思っていたのですが,そういえば「ディスク・ユーティリティ」というのがあったなと思って起動してみたらこれが当たりでGUI でポチポチやるだけでmount 迄出来ました.
ディスク・ユーティリティ-menu

ハードの関係でミラーの片側だけ接続の状態ですが,「状態:停止中です。デグレード状態でなら始めることが出来ます。」と言う表示.ここで「RAID アレイを開始(A)」を押します.
Screenshot-RAID-1 アレイ (RAID-1 アレイ) — ディスク・ユーティリティ1

すると以下のような確認メーッセージが,「開始(S)」を押します.
RAID_デグレード開始

デグレード状態(縮退状態のことですねきっと)となっていますがデバイスが出てきました.「ボリュームをマウント(M)」を押してマウントします.
Screenshot-492 GB RAID-1 アレイ (492 GB RAID-1 アレイ) [-dev-md2] — ディスク・ユーティリティ2

マウントされました.
Screenshot-492 GB RAID-1 アレイ (492 GB RAID-1 アレイ) [-dev-md2] — ディスク・ユーティリティ3

後はバックアップするだけです.念のためmount -o remount,ro でリードオンリーにしてバックアップしました.
1本目は途中読み込みエラーとなったので2本目で同様に試すとこちらのディスクは生きていたらしく全てベリファイ含め全てのデータの取り出しができました.
#実際はマウントする前にdd で吸いだして吸いだしたイメージに対してloopback + ro mount して作業したほうがいいです.時間の問題で今回はro だけ.


ところで,このBuffalo のLinkStation の対応がひどくて修理に出すとディスク内容は消えるそうです.
FAQ になっています.

ハードディスクやフラッシュメモリーに保存してあるデータは修理で復旧できますか?
修理センターではデータ復旧やデータ吸出しの作業は行っておりません。
弊社では、ハードディスク・メモリカード等の記憶媒体は、検査・修理の過程において、
テストデータの書込みを行います。
そのため、お預かりしております製品内のデータは、消去されます。
(データに関しては保証の対象外となっております。詳しくはこちらをご覧下さい。
必要なデータは必ず事前にバックアップをお取りになった後に修理依頼をお願いいたします。
データ復旧をご希望のお客様は、リンク先の「データ復旧サービスのご案内」をご覧ください。
http://buffalo.jp/shuri/shuri_menu7.html#q2-3

「データ復旧サービスのご案内」とあるので有料とかで別途対応なのかなと思いきや

バッファローよりデータ復旧サービスの情報を紹介するページです。
バッファローからの紹介(本ページからお申込頂くこと)により、データ復旧ソフトご購入及び
データ復旧サービスが優待価格でご利用頂けます。
http://buffalo.jp/shuri/shuri_menu3-4.html

社外の会社紹介かorz

まあ,バックアップはちゃんと取りましょうってことですね….
件の場所では,NAS にUSB HDD 取り付けて自動バックアップを設定しておきました.両方壊れることはそうない筈筈….

ml のアーカイブscript

.forward とかalias で以下のscript を

"| exec /home/mk/koedo/arc.pl"
ml: "| exec /home/mk/koedo/arc.pl"

の様に指定して,STDIN からファイルに落とす.
X-Mail-Count をファイル名に.
X-Mail-Count がない場合はtime-$$ でファイルを別のディレクトリに作成.

#!/usr/bin/perl

$ML_PATH="/home/mk/koedo/ml";
$ETC_PATH="/home/mk/koedo/etc";

while($line=<STDIN>){
        if($line=~/^X-Mail-Count:/){
                $mlno=(split(' ',$line))[1];
        }
        @list=(@list, $line);
}
if($mlno){
        $file = "$ML_PATH/$mlno";
}else{
        $mlno=time();
        $file = "$ETC_PATH/$mlno-$$";
}
print"file : $file\n";
open my $fh, '>', $file
  or die qq/Can't open file "$file" : $!/;

foreach(@list){
        print $fh $_;
}
close $fh;

chmod 0444, $file;

後で,IRC にSubject と参照URL 投げるようにする多分.

scp で中断したファイル転送をrsync --partial option でレジューム

scp で大きなファイルを転送中にWifi が切れて途中で失敗してしまいました.
wget -c みたいにファイル転送を途中からやり直せないかなと思って少し調べたらrsync に--partial というoption がるのに気づきました.
早速使ってみるとこんな感じでうまく行ったようです.

% rsync -vvve ssh --partial localfile remoteserver:/path/file
--snip--
generate_files finished
Transferred: sent 27356560, received 327608 bytes, in 212.8 seconds
Bytes per second: sent 128579.3, received 1539.8

sent 27263249 bytes  received 314261 bytes  129168.67 bytes/sec
total size is 4294967296  speedup is 155.74
[sender] _exit_cleanup(code=0, file=main.c, line=1060): about to call exit(0)

これは便利かも.


追記)
`--partial' は,rsync 中断時に転送中のファイルを保持するオプションでした.(つけないと転送途中のファイルは消される.)
`--append' が,転送途中のファイルを再会させることのできるオプションのようです.

なので両方のオプションをつけるとOK です.

% rsync -vvve ssh --partial --append localfile remoteserver:/path/file