変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

火星への片道切符?

『新天地』その言葉には胸躍るものがありますね。
しかし、『新天地』が火星だったら・・・
それでも、マーズワンの火星移住計画に20万人も応募があったらしい。(9月頃
地球は異常?な温暖化中なので、太陽より遠い火星は『新天地』に思えるかもしれない。
地球では敵視されている大気中の二酸化炭素濃度が95%以上だったり、こっちも大変過酷です。
とは云え、火星の大気の気圧は6ヘクトパスカル、地球の平均気圧が1013ヘクトパスカルだから、かなり薄い、だから気温差も激しい。
しかも上が摂氏マイナス20℃あたりだったりと、大変厳しい環境です。
早い話がエアボンベと気密服無しでは野外に出るのは大変危険です。
それでも、月より大きいのでテラフォーミングしたら別世界になるかもしれません。
勿論、火星を緑の星にするのは無茶ですが、太陽系で一番深い渓谷もあるので天井を貼れば、そこだけ居住可能な空間が広がるかもしれません。
しかし、何よりも一番の心配なのは、地球人の飽きっぽさです。とりあえず地球でサバイバルと云えば周囲の食い物をあさることから始まるくらい地球は生きていくだけなら太陽系で一番恵まれた惑星ですからね。
火星で恒久的に居住可能な空間や色々な設備が揃う前にプランがとん挫したら、どうしたらよいでしょうか?大ピンチですよね?地球で寄付を募っても火星まで必要な物資を運んでくれる組織なんて極わずかしかないですし、火星まで片道2年半ぐらいかかるそうなので、非常に心細いですね。
そんなことも考慮済みなのか、最初に火星に行く人は人気投票で決まる様です。
オリンピック並に盛り上げてイベントを張って勢いを付ける必要はやはりあるのでしょう。
 
火星で自力で生活できるようになるまで、いったいどれだけの年月と費用がかかるんでしょうね?
 
そう考えると・・・
 
無理っぽいなぁ~



microSDカードをSSDに見せるボード

2~4枚のSDカードをS-ATA接続するボードはあったと思うけど、基盤だけでも結構高かった。
基盤が2.5インチSSDサイズで、最大10枚もmicroSDメモリが挿せるものがあるらしい。
販売ページはこっち。
性能はイクインで5.9なのでそう悪くもない。
 
ただ、刺したmicroSDメモリのうちで1枚でもコケたら・・・
痛いことになるんだろうなぁ?
 
4枚版もあるようです。
 
 



scriptを読む2つのパーサー

1つは字句(トークン)解析(パーサー)。
単調なパターン、主に正規化表現で読める範囲でテクストを切り取るのが主な役目。
読むようによっては何通りもの値(Value)が出てくるので、文字列なら0123、数値なら123、でも8進数なら83、16進数なら291のハズなどと余計なことはしない方がいい。
for ( var  i ; i < 1/3 ;  i+= 0.000100000 ) {
のような場合は解析した値の精度が不十分だと、困った結果になるし、コード単位でデバッガをステップ動作させるには、テクストから切り取った文字の長さも重要だからだ。
「リテラル」「何かの名前」「数値」「演算子」「空白」「改行」程度の字句(トークン)に分類できればOK。
2つめは文法解析(パーサー)。
var i = j * 2;
をトークンの組み合わせを短い文法のパターンを優先順位順にパターンのマッチングを行い、正解があれば、パターンと対になる処理を実行する。
トークン(字句)ベースの正規化表現を処理する感じ。
字句解析との違いは、内包表現が可能で、
処理 ::= 処理 | 文
のように、処理に文と追加したものは処理としてまとめる、な感じの拡張ができる。
当然、
処理 ::= 文
処理ブロック ::=処理 +
のように内包しない書き方も可能。
 
自己拡張型トークン定義を用い、トークンパーサーとパーサーを1つで実装し、中間コード生成(コード・オーガナイザー)、中間コード実行(インタープリタ)の3つにまとめて考えるとすると・・・
つまり、
リテラル文字 ::= \[rntsd”]   \\   \u[0-9a-fA-F]{4}  [\u0000-\uffff]
リテラル文字A ::= [^”] & リテラル文字
リテラル文字B ::= [^”] & リテラル文字
リテラル ::= \”  リテラル文字A  \” | ’   リテラル文字B  ‘
数字 ::= [0-9]+  “.” *  [0-9]*
のように最下層から定義することになる。
厄介なのは\エスケープ表現で、こんな感じで自己拡張可能なようにしないと内部コードに\エスケープ表現や\uxxxxの文字表現を埋め込まないといけなくなる。
また自己拡張型の欠点としてすぐ思いつくのが「処理が遅い」がある。
さらに、リテラル文字とリテラルの表現を観れば、なんとなく リテラル文字の中に”が含まれているので、永久にリテラルの左の”や’を判別する気がないように感じる。
そこは、リテラル文字A,Bの最初の [^”] [^’]で回避する。
つまり、この自己拡張型トークン処理ではサブルーチンにお任せではなく、1本の文字列ストリームを各階層でチェックしながら分析することになる。
それではやはり処理が重い、毎回正規化表現テクストの解析の後に、対象テクストを読み込むことになるので、正規化表現テクストの分析結果をキャッシュし、2度目は再利用することにする。
つまり、文法を解析し、文法解析する中間コードを生成し、インタープリタで実行させ、対象テクストを文法解析し、その中間コードを作り、最後にそれを実行することになる。
勿論、ターゲットとなるCPUやOSが限定する環境では各中間コードを完成直後に、バイナリーコードに置き換えて実行しても構わない。
さて細かい実装を考えると、
parser -g grammer-text  -i  analize-text
のように引数で与えるのは好ましくない。
なぜならファイルシステムが存在しなければ、grammer-text  も  analize-text も読みようがないからだ。これはサンドバックの多くがファイルシステムへのアクセスを好ましく思わない現状を考えると、現実味のあることで、外部インタフェースを頼った方がいいので、DLLやシェアライブラリィのエントリィつまり一般に許可されているAPIを直接使うことにする。
parser -imports imports-defines -g grammer-text  -i  analize-text
な感じになる。
imports-definesには各OSごとに異なるAPIアクセス方法を記述した何か、ファイルシステムが無くても読みこむ様にする方法は、パーサーに組み込んだソースに依存する。
もちろん、パーサーでimports-definesの文法解析を行い、結果の中間コードをキャッシュしたままつかってもよく、対になる処理は、パーサーの初期設定にエントリィを組み込んでおけばよいので、imports-definesはWIN64とかLH6と宣言のみで中身はパーサーのソースの中でいいような気がするけどね。
 
な感じかな?
正規化表現をどこで解釈するのか記述しないと困るのかな?
やっぱり重そうだな(笑



MarkII

改良型を意味する。
≒Revision.2
マイナーチェンジもMarkⅡとかMarkⅢ・・・になるハズだ。
PCのマザーボードでは、単にrevisionをあげることがほとんどで見分けが付きにくいが、不良チップを使った製品と区別するために箱にそのチップの新コードを明記する場合もある。
グラフィックボードの場合は、シリーズ型番の隙間を利用することが多いが、たまに以前使った改良版のコード(Tiなど)を再利用することもある。
ガンダムではTypeⅡ、TypeⅢと表現されるが、量産型のザクはⅡやⅢとあっさりな表現になっている。
 
 



何たらScript考

MMORPGのマクロが

コマンド1 パラメータ1、パラメータ2、パラメータ3・・・

コマンド2 パラメータ1、パラメータ2、パラメータ3・・・

ばかりでは済むのは、
分岐処理やループ処理を

手作業(人力)

で代行しているからだ。
画面の【ボタン】を押して、ジャンプするだけなら同じでいいけど、

画面の雰囲気を読み取って、

画面解像度が1680x1080だからフルセットでメニューを並べるけど、

画面解像度が1000x500だからメニューは最初の1つだけ並べる。

ジャンプするにはif文ぐらいは必要だ。
設定ファイルから似たようなパターンのデータを読み取って、メニューを作るなら
似たようなパターンなマクロを繰り返すのでループ処理も欲しい。
長くなった処理を分離したくなったらreturn 文も必要だ。
 
だが、それ以上にscript に必要なのは、
普通のインタープリタやコンピュータ言語では一目見ただけで嫌われる自己増強型インプリメンタル機能だ。
A.addMethod (function format(formatDate,startTime,endTime, nextStep) {
Alert( String.Format(formatDate,endTime – startTime) );
post(nextStep);
});
なんてヘンテコでしかない。
しかし、ブラウザの非同期通信の返信に渡すと、何気に経過時間が返ったりOKボタンを押すと先に進むのであれば(?)何気に便利な気もする。(するだけ
 
だが、便利さに足元を巣食われて、サーバーとブラウザで全く違う書き方のスクリイプトが動くのも、不自由なので、
できるだけJavaScriptっぽくした方が楽だろう。
厳密に云えば、Scriptは サラっと書けて、サクっと使えて、使いまわしができるのが一番だ。
そう考えれば、サーバー・スクリプトをサラっとJavaScriptに変換するトランスレーターを詰め込んでおくのも悪くないだろう。



nucなCentOSのブログ鯖を無線LANで繋ぐ方法

一言で云えば無茶。
/etc/sysconfig/network-scripts/ifcfg-eth0 のようにBOOTPROTO=”dhcp” を書けば、勝手にIPアドレスが貰える訳では無い。
無線LAN接続で、ログインして暫くたった後にブラウザやメーラを起動するハズ!そう云う考えで作られていることを痛感した。
大事なことなので復習しよう。
まず、wpa_supplicantパッケージをインストして、
# wpa_passphrase {SSID}  {パスワード}  >> /etc/wpa_supplicant/wpa_supplicant.conf
でひな形を作った後に、
無線LANの環境に合わせて、

proto=WPA2
key_mgmt=WPA-PSK
proto=WPA WPA2
pairwise=CCMP TKIP
group=CCMP TKIP WEP104 WEP40

などを追加し、
# service   wpa_supplicant   start
# ifup wlan0
# chkconfig   wpa_supplicant   on
これで起動したときに無線LANが使えるような気がするが
実際には無線LANのSSIDの認証をした後に毎回
# ifup  wlan0
が必要らしい。
しかし、モニターすら繋いでいないのに素で、起動の度にキーボードを繋ぐのも面倒なので、
/etc/init.d/wpa_supplicant に
ifup wlan0を追記するのが現実的。
 
 
何度かコールドスタートを行い、 安定したことを確認したら、
# ifdown eth0
で有線LANをOFF、ルータからIPアドレスの割当てをMACアドレス指定の手動設定に変更し、外部から80ポートでアクセスがあれば飛ばすようにする。
※このブログを見るにはIPアドレスのURLで十分だが、FF14のブログの方はマルチドメイン寄生型なので、無理。
/etc/hosts に
自身のマシン名.ドメイン名     192.168.***.***
名前でIPアドレスを引ける様にしておかないと、WordPressの自動バックアップのメールが届かないっぽい。
また、メール送信にはトリガーとなる真夜中のアクセスが必要らしい。
 
しかし、LANケーブル一本減らすには面倒すぎるなぁ~



結局EJBは無駄飯食いでしかなかった

EJBを使ったJavaのなんたらシステムが起動した後に、中のEJBが安定するまでの時間は運用してみないと誰にも判らない。
と云うのも、ヤベーと誰かが気が付いて、実装クラスのインスタンスをインタフェースの変数にインジェクションするからだ。
云ってしまえば、インタープリターのごとき仕業であるので、遅いの一言に尽きる。
EJBを使えばjUnitでmockが便利なんて詭弁でしかない。
大体、mockのソースの賞味期限は数か月にも満たないのが普通で、
そんくらいなら、Eclipseで、src/main/javaとsrc/test/javaのクラスパスの順番を変えるくらいで十分だし、その為だけにjUnitのテストソースからプロセス起動するようなことをしてもよいだろう。
※当時の言い分: EJBが出来た頃はEclipseなぞ無く、エディタ+Shell+吐き出されるログが全てだったので、環境変数のクラスパスを手で変更するのは大変危険だった。
とあるよく使うDaoなりActionなりをEJBで作り、jUnitでテスト環境を作ったとしよう。
それをベースに10~20個のコピペのようなものは、非常に簡単にできる。
しかし、
本当の地獄はその後に始まる。
Daoに何か変更が入ると、上記のコピペに一斉に修正が必要になる。
10個ならマシだが・・・100個だったら、結構大変だ。
そして、
当然の帰結として誰も誰も使わなくなり、
更に数か月が過ぎると、全く使い物にならないjUnitソースの残骸が残るだけなのだ。
無論、プロジェクトの立ち上げ時には非常に役に立つ。
但し、その後は捨てるものだ。
最後に残るのはEJBで作ったDaoやAction
どうやってテストするんだろうね?
え、実際に画面を実行?
です。(キッパリ
だって、その方がちゃんとしたテストデータもテストケースもあって、役に立つんですからね。
ここに到達してしまうと、
jUnitなんてもう使う訳もない。
※当初の仕様から全く変わっていないものを除く。
別に、直接Daoオブジェクトを作っても何も支障が無いことに気が付くわけである。
Actionだって、httpセッション経由で起動をかけることだって、別に難しい訳でもない。
それでも、今なおEJBは生き残っている。
理由はいたって簡単、
大半の機能を使うこともないlog4jを何となく使ってしまうのと同じなのだ。
多分、Java系の定番jarファイルを使うのを止めたら・・・
別世界なんだろうな。(大笑
 
 
 



Java と Web の デスマッチ

なぜだろう?
JavaとWebが付いたもので、まともな仕様というものは見たことが全く無い。
どこかの会社と云うことは無く、Webにいっぱいあるワークフレームの仕様のこと。
Javaに仕様と云うものは相応しくないのかもしれない。
何故ならサブクラス(または派生クラス)を作ると全く頓珍漢になってしまうことも珍しくないからだ。
なぜ、元クラス(またはアブストラクトなクラス)がこんな風になっているのか、動き、そして得られる結果(ソースの量が少ない、処理が速い、スケーラビリティがある)を衆知せずにサブクラス(または派生クラス)を作らせれば、行き当たりばったりの実装になり、あれれ?の繰り返しになってしまうのだ。
そうならないためには、インスタンスの生成や終了の図なんかは非常に重要なのだが、最近は見たことが無い。
よく聞く、MVCも、MVCの画面と画面をどう繋ぐのか?は別問題と云う厄介な問題があります。
例えばStrutsのMVCのViewであるJSPは、Modelが作りだすActionFormを差し込んでHTMLファイルを作りますが・・・
例えば画面の【検索】ボタンを押し、
いざ検索結果の画面のActionに沢山のパラメータをどうやって渡すのか?
相手のActionForm?
正解です。
でも誰が検索結果や実行結果の画面を表示するのでしょうか?
正論は、Validatorでパラメータチェックを行うことを前提に、HTML上の<form action=”検索結果画面.do”>するのが一番です。
しかし、実際に存在するデータのコートがどうかデータベースを検索しないといけない場合なんかは無理があるので、actionでパラメータをチェックした後に
検索処理を行って、ActionFormにデータを積み込んで、
forword(“検索結果画面”);
と書けばいいんでしょうか?
ま、それでもいいんですけど(笑
出来上がったら、検索結果や実行結果の画面のURLが前のURLのままなんです。(大笑
ここでF5を押すとブラウザのURLの通りに再表示しようとするので期待外れな動きになってしまいます。
バックスペースを押すともっと最悪です。
だったら、redirectすればいい訳ですが、StrutsでのsendRedirectで検索結果をパラメータで渡そうとするとURLに書き込むしかない(そもそもHTTPのredirectはurlしか渡さない仕様)ので容量的に無理があることが多いので、セッションbeanに検索結果を詰め込んで、sendRedirect(“xxxxx.do”);とすればいいのです。
勿論、セッションbeanの分量は相当なものになることは覚悟しなくてはいけませんね。(笑
だったら、
HTML上の<form action=”検索結果画面.do”>して
検索結果画面のActionの中でパラメータをチェックした後に
検索処理を行って、ActionFormにデータを積み込んで、

forword(“検索結果画面”);

と書けばよかったと思いきや、
今度は、パラメータのエラーをActionErrorに詰め込んでしまうと・・・

saveErrors(request, errors);

の様にrequestに吐き出してしまう方式なので、
redirectは使えませんから、

forward(“検索画面”);

にしてみると、
今度は、パラメータのエラーになったのにurlが検索結果画面.doのままになってしまいます。
 
面倒ですが、どんなパラメータでも渡せる便利なredirectなjspを1つ作っておくと便利です。
適当だけど、

<html:form action=”<bean:write property=”actionName” >” >

<logic:itelater id=”xxx” collection=”parameters”>

<input  type=”hidden” id=”<bean:write name=”xxx” property=”key” >”  value=”<bean:write name=”xxx” property=”value” >” />

</logic:itelater>

</html:form>

やっぱり、こっちかな?

<html:form action=”<bean:write property=”actionName” >” >

<カスタム・タグ property=”actionForm”/> ⇒ 中身を<input type=”hidden” id=”name” value=”value”>に展開してくれるようなもの。ListとかMapがあったらStrutsにあったidを振ってくれるとなおうれしい(笑

</html:form>

つまり、ブラウザとかHTTPの仕様とか知っていないと、
いや知っていても、ワークフレーム次第ではボロボロなものが出来上がります。
 
JSPを作る前にHTMLとJavaScriptでサンプルを作っていたりすると、
Actionは無いのですから、HTMLから<form action=”****.html”>とかやっているので、
こういう状況は事前に把握できません!(もう大穴ですね。
 
どうでしょう?
枯れたワークフレームといっても・・・
 
もう、罠ばっかじゃないか?って気分になりませんか?
 
という訳で
いくらりっぱな仕様書を作っても、ダメな理由になったかな?(笑
 
でも、Struts2が出てきたり、jQueryの非同期通信でパラメータチェックや検索結果をごっそり貰ってしまう手もあるし、やりようはいくらでもあります。
でも罠が無いと云えば・・・あります。
Structs2のお手軽redirectはhttps://だったら強制的にhttp://に変わります。中のソースを見るまではそんなの知らなかったぁ~。
jQueryの非同期通信は同じドメイン限定だったりPOST通信はブラウザやサーバーをえり好みします。
やはり制限はあるのです。(笑



西日の方がソーラーパネルの発電量が大きい訳

あまりにも単純。
日当たりが悪い物件は、南側の日当たりが悪い場合が多い。
もっとはっきり云えば、西日しか入らない物件は安いだろう。(笑
そう考えると、ソーラーパネルを日が当たる時間が長い西側に向けた方がいいに決まっている。
というのは半分冗談だけど(笑
だいたいソーラーパネルのほとんどは完全に固定されているので、
一番発電量が稼げる設定が望ましい。
朝方は濃霧の日が多い地方なら西の方へ、東は海岸で日の出が早く、西は高い山脈に遮られ日の入りが早い場所なら、東の方へ調整した方がいい。つまり、設置する場所に非常に依存するものだ。同じ市内(盆地だったり等)でもかなり違いが出てくるケースもある。
そのせいか、地方ごとの1日の日照時間は公表されているが、毎時の日照時間は見当たらない。
また緯度の影響も受ける。
一般常識として太陽は12時に真南方向にあると信仰されているが、
例えば日本標準時間は明石市なので、東西の地方でブレがある。
どれくらいブレがあのか?日の出の時間から推定すると、1月1日の根室は 6:50、那覇は7:17である。概ね30分のブレがあるから、
±15分ぐらいだろう。
磁石でぴったり真南方向に設置しても15分ぐらいのブレは許容しなくてはいけない。
そんな訳でネット投票みたいに人間の都合で決めても何もメリットは無いものだ。
多分、設置する際にはとりあえず、屋根の上から周囲を見渡し、緯度、経度、日の出、日の入りの時間、地方の長期の天気から推定するのがいいのだろう。
そして、発電量の計測は当然だけど、東向きや西向きの小さな発電ユニットも設置して、1年間ぐらい記録し、もう少し東?西?の方がよいのか調べるのもいいだろう。
ということは、ソーラーパネルは若干の傾斜角度や東西角度が調整できる方がいいような気がする。
但し、豪雪地帯や強風が多い地方では、妙なデコボコを作ると長期間の間にパネルの傷みが進みやすい恐れがある。
 



自己流javascript.server

node.jsは難しそうな雰囲気が漂ってきたので、自作してみよう。
※失敗したらフリダシに戻ればよいだけだ。
【必要なもの】
1.JavaScriptエンジン
ドコかのブラウザのJavaScriptエンジンを使いたいが、頻繁なバージョンアップとセキュリティホールの巣窟であることを考えると・・・。作った方がいいのかもしれない。
2.リポジトリィ
さっとインストしようと思ったら必須。但しファイルをダウンロードするだけでは何かと不都合なのでrpmみたいなパッケージ設定スクリプトが必要だろうが、そこはjavascriptを使えばいいのかな?多分リポジトリィもjavascriptベースでいいだろう。
3.IDE
ブラウザ上でレイアウトを作り、実際に実行するのはサーバー側でいい。ただ、サーバー側のリソースを全て使えるようにすると、当初はいくつかバージョンを用意してテストしなくてはいけないから、何かと面倒になるので、ワークスペース内のリソースに限定。その外にあるリソースはドメイン(xxxx.local とか)指定でサーバーの中も外も区別がつかないような指定にしておく。プロトコルはローカルルール(resource://xxxx.local/log.txtとか)でいいだろう。
4.デバッガ
コマンドラインの簡単なものがあればいい。
5.ヘルプ
IDE上でビューとしてみたりバルーンでポップアップな感じでも見たい。JavaDocっぽいものでいいだろうが、逆引き辞書は欲しいので、ヘルプDBファイルとエンジンが必要になるかな。
 
な感じだろうか。
まず、

  1. JavaScriptエンジンを作る。
  2. 1.にコマンドライン・デバッガを組み込む。
  3. 2.をベースにリポジトリィ・サーバーを作る。
  4. 3.を足掛かりにIDEを作る。
  5. ソースにドキュメントのコメントを付ける。
  6. ヘルプDBエンジンでDBファイルを作り、IDEにフックを取り付ける。
  7. 1~6が一通りできたら、リポジトリィにパッケージを作る。
  8. 使ってみて、不都合な部分を見直す。

の方向で進めてみよう。
とりあえず、ブラウザ上で動くのはIDEのみで、protocol.jsやjQuery.jsのお世話になるのはココだけだ。
後は自前でガンガン組み込むのが正攻法。
 
 




top