FEREC用Bookmarklet
学科にてFERECのルータを使っているが、 最初の接続でWeb認証を行うが、その自動化ができないかと情報収集。 調べてみると、Bookmarklet という方法が紹介されている。 ブックマークにURLを登録する代わりに、JavaScript の処理を登録し、 認証の代わりにそのブックマークを参照する方法。
Web認証のBookmarkletは、NTTコミュニケーションのホットスポットの認証で使われいるので、そのプログラムは、URLエンコードされていたので、戻してみた。
javascript:(function(){ var d=document.forms[0]; d.login_name.value="XXXX"; // XXXXにユーザ名 d.password.value="YYYY"; // YYYYにパスワード d.submit(); })()
ちなみに、FERECの認証画面のformは、下記の通り。
<form method=post onsubmit="document.getElementById('sb').disabled = true; return true;"> ユーザ名 <input type=text name=user id=user size=20 autocomplete=off> パスワード <input type=password name=pass id=pass size=20 autocomplete=off> <input type=submit id=sb value="ログイン"> <input type=hidden name=login value=1> </form>
ということで、JavaScriptの細かい所がわかっていないが、以下のコードでいいのかな…
javascript:(function(){
var d=document.forms[0];
d.action="https://ferec.ei.fukui-nct.ac.jp/login.gsp";
d.user.value="XXXX"; // XXXXにユーザ名
d.pass.value="YYYY"; // YYYYにパスワード
d.login.value=1;// 追記:1/19これを消すと動いた d.submit();
})()
ひとまず、ブックマークを試すために、ちょい書きプログラムの URLエンコード処理などが必要なので、ちょいとPHPでプログラム。
追記:2010/01/14
動かなかったので、action="…"も追加してみたけれど、失敗。 何がまずいのかなぁ…
追記:2010/01/18
無名関数の呼び出し部分が {} と () の書き間違いを見つけた。 たぶんこれで動くはず…
- javascript:(function(){...}){} 誤 + javascript:(function(){...})() 正
TeraStationを学科サーバに接続
学科のサーバも2003年から動かし、7年近く経過。そろそろ120GBの容量も手狭になってきた。 一応、後任のサーバも動いているので、壊れたら移行する予定だけど、容量の問題は そろそろヤバイ。 ということで、学科予算で、Buffalo の TeraStation TS-XL/R5 4TB を購入してもらった。 RAID5構成だし、バックアップとしては手ごろ。個人的な研究費で個人向けのTeraStationを 購入し使っているけど、こちらは法人用でちょっと高かった。
サーバにnfsマウント
学科のサーバのデータ保管&バックアップ用にこのTeraStationを接続させる。 TS-XL/R5 には、NFS 機能が付いているので、設定は簡単と思ったけど、 接続してみると、漢字ファイル名が Windowsファイル共有で見ると、文字化けしてしまう。 マニュアルにも NFS は、機能を持たせてあるけどサポート対象外という記述もある。
また、NFSマウントしても、元々BuffaloのNASのOSは unix 環境とは違うものがベースなので、 パーミッション情報もきちんと扱えない。 ということで、漢字コードの設定も自由度の高いWindows共有に切り替える。
(( /etc/auto.master : オートマウント用ファイル追加 )) /nfs /etc/auto.nfs (( /etc/auto.nfs.credentials : sambaマウント用パスワード記録ファイル )) username=XXXX password=YYYY (( /etc/auto.nfs : オートマウント/nfs用 )) NAS -fstype=cifs,rw,credentials=/etc/auto.nfs.credentials, \ iocharset=euc-jp, \ uid=nobody,gid=ei,file_mode=0664,dir_mode=0775 \ ://XX.XX.XX.XX/share
uid,gid,file_mode,dir_mode の設定で、学科スタッフのグループの人だけが 書き込めるようになる。(それ以外の人はread可)
バックアップ作業
追記:(2010/01/13)
現行サーバと、次世代サーバをこのNASに接続させ、本来のバックアップ作業を行った。 トラブル復旧時に使い慣れた操作とするために、バックアップは tar を使用する。 他の気の利いたツールは、いざと言うときに使いこなせない… んで、root , home , www領域 を別々に全バックアップ&差分バックアップをとるように設定した。 (tar に "–newer"なんてオプションがあったのを発見!) バックアップによって、home以下のファイルは、".tar.gz" で 36GB。 巨大だよなぁ…と思いつつも、4TB-NASだし、2台のバックアップ作業後だけど、 使用率はたったの4%。
メンテナンス用にメモ: /etc/backup/Makefile -- バックアップ処理 /etc/backup/{root,home}-exclude.txt -- root,homeのバックアップ対象からはずすファイル /etc/cron.d/my-backup -- バックアップスケジュール
2010年1月10日(第146回)
- メールテーマ:大人、成人式
- 英語の囃子 第23回 吉田三先生、電子情報4年丸山さん
英語の桃太郎を読んでみよう
eng100110.mp3
サンプリングデータの積分・微分など
専攻科1年の実験の補足説明の時間があったので、 Arduinoの制御実験の結果を受け、制御用のサンプリングデータの数学的話をする。 モータ制御で、速度値を積算すれば速度の積分で距離になる話や、 加速度センサーの値を積分し速度、さらに積分で距離という話。 こういった2重積分でセンサー誤差の蓄積による問題点を解説する。
また、サンプリングデータの平滑化として、単純移動平均や指数移動平均などの話をする。 積分の逆の話として、データの直前値との差が微分といった話と、 幅広く説明した。 さすがに専攻科生だけあって、データのノイズ対策について質問したら、 フーリエ変換してフィルタリング…といった話も出てきたが、 簡単な計算でも何ができるのかという点で、興味を持って聞いてくれたみたい。
バックアップ
参照カウンタ法の雑談として、ジャーナリングについて話す。 システムの急な停止によって、参照カウンタが壊れると、まさにマーク&スイープ法で 参照カウンタの修正が行われるが、巨大なファイル容量であれば極めて時間がかかる。 このため、ファイルシステムへの書き込みの際には、修復用のヒントも同時に書き込まれ、 正常書き込みで修復データを消すが、急なシステムダウンの時は、修復ヒントをつかって ハードディスクを復旧する。こういった対策が「ジャーナリング」
ただし、ジャーナリングされていても、ハードディスクは壊れるので、壊れる際の対策も必要。 んで、一般的にはRAIDが使われる。 RAID1のミラーリングや、RAID5での分散書き込みで1台壊れても復旧!という考え方を説明。 でもでも、間違ったデータが自動的に書き込まれたら終わりなので、 定期的なバックアップも重要と解説する。
参照カウンタ法とガベージコレクタ
前回テスト解説で少し説明をしているけど、参照カウンタ法とガベージコレクタについて解説。
参照カウンタ法
例えばリスト操作で、リストの開放を下記のようなコードで作った場合、 データに共有が発生しているため、「持っているデータを free で全部捨てる」 といったコードを書くと、共有部分は2回捨てられる処理となり、 プログラムが異常動作してしまう。
struct List* union( struct List* l1 , struct List* l2 ) { struct List* ans = l2 ; for( struct List* p = l1 ; p != NULL ; p = p->next ) { // find(A,L) : AがリストLに含まれていればTrue
if ( ! find( p->data , l2 ) )
ans = cons( p->data , ans ) ;
}
return ans ;
}
void free_all_list( struct List* p ) {
if ( p != NULL ) {
free_all_list( p->next ) ;
free( p ) ;
}
}
void main() {
struct List* a = リスト ;
struct List* b = リスト ;
struct List* c = union( a , b ) ;
:
なんらかのしょり ;
:
free_all_list( c ) ; // cの後半はbのはず
free_all_list( b ) ; // free_all_list(c)でbは既に捨てられている
free_all_list( a ) ;
}
こういう共有が発生している場合の対処方法として、参照カウンタ法がある。 共有されるデータには、すべてカウンタを設け、共有が発生する場合には、 カウンタを増やし、freeの際には、カウンタを減らし0の場合だけ 本当に捨てるという処理にすればよい。
struct List { int refc ; // 初期値1、共有されるたびに+1,共有が解除されれば-1 int data ; // refc = 0 で、本当に free() を実行する。 struct List* next ; }
ちなみに、この参照カウンタ法は、unix におけるリンク機能(1つのファイル実体に複数のファイル名をつける場合[ハードリンク])でも使われており、新しくハードリンクを貼れば+1し、 ファイルを消すと-1して、0になれば本当に消す。 ただし、OSの異常停止などで、参照カウンタがおかしくなる場合があるため、unix では、 異常停止からの回復時には fsck で参照カウンタの修正などが行われる。 最近はジャーナリング機能付きファイルシステムが普通なので、fsck 実行は減ったけど….
ガベージコレクタ
上記の参照カウンタは、便利そうに見えるけど、循環リストには対応できない。 こうなってくると、データを本当に捨てるか捨てないかは、プログラマーの判断では極めて難しい。そこで、最近のシステムでは、不要になったデータを捨てる判断は、ガベージコレクタ(ゴミ拾い)に任せるようになってきた。 ガベージコレクタを持った処理系では、free() は存在しない。メモリが不足した場合に、 システムが不要なメモリを回収してくれる。
回収方法としては、古くはマーク&スイープ法が有名。 メモリが不足した時に、全メモリには最初にマークを消しておき、使用中のメモリからたどりながら、実際に使用されているデータには、「使用中マーク」をつけていく。 最後に使用中マークの無いデータを回収する。
しかしながら、この方法はメモリが無くなった時に、処理を全部中断して、時間をかけたメモリ回収(ガベージコレクタ)が起動するため、利用者にしてみるとシステムが突如フリーズしたように 感じる。最近では、このガベージコレクタは、システム処理に並行して実行できるように工夫されている。
最近の新しい言語処理系 Java などはガベージコレクタが搭載されている。 しかし、C,C++ はガベージコレクタが無いので動的メモリを使ったプログラミングでは、 注意深く対応するしかない。
調べてみると、最近のJavaでのGCは、世代別GCという方法が使われているらしい。 若い世代、古い世代、永続的な世代に分け、生存時間順に随時永続側にコピーされていく。 局所変数のデータは、若い世代の場所に置かれ、 関数終了時に不要ならばガンガン消されていく。
校長年頭挨拶
仕事始めの校長年頭挨拶がありました。 今年の目標としては、以下のものが掲げられました。
- 入試倍率の確保
- 様々な意味でのActivityの拡大
- 国際化
昨年より取り組まれていた、高専のイメージ戦略として作られた、 PR用の旗が会議室に飾られていました。校章は相変わらず使われるけど、 用途によってはこちらの旗を見る機会が増えるかも。
年始一発目のupdate
昨日は職場の一斉有給で今日が仕事始め。 といっても、今日はやり残していた自室の大掃除の続きが目的だったり。 ということで、まずは長期休暇明けということで、一発目は管理サーバのアップデート。
サーバに次々とログインし、"aptitude update ; aptitude safe-upgrade"を打ちまくる。 学科のメインサーバだけ、stableとtestingが混在しているので、aptitude が、 "E: このAPTが対応している以上の数の説明が要求されました"なる意味不明な メッセージが表示される。"export LANG=C"にして、日本語localeをはずすと、 正常にアップデートできるんだけど….前回も同じトラブルが発生しているし、ひとまずメモ。
2010年1月3日(第145回)
- メールテーマ:年末年始のすごし方
- コバピーの年末旅行 博多→福井
2009年12月27日(第144回)
- 石川高専から生放送!