変奏現実

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

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

インターネット

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通信はブラウザやサーバーをえり好みします。
やはり制限はあるのです。(笑



自己流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のお世話になるのはココだけだ。
後は自前でガンガン組み込むのが正攻法。
 
 



ルーター不調

またココに繋がらなくなった。
ルーターをリブートしたら繋がった。
5台程度でつながらなくなるのかな?
それとも無線の調子が悪いのか?
ファームウェアを戻した方がいいかな?
ルータ(WHR-G301N)のDHCPリース画面を見ると
(*) WEB設定を行っているパソコンのIPアドレス(192.168.***.***)
のもう一つの*が無かったので、
これが原因らしい。
MACアドレスと空のIPアドレスを指定して追加してみた。

192.168.***.***(*) **:**:**:**:**:** –:–:– 手動割当

が追加された。
多分、これでいいのだろう。
【本当の原因?】
ルータを再起動したときに
もう、上のIPアドレスを使っている奴(PC)がいたから(大笑
で、多分今のファームウェアは、
同じセグメント上の存在しない他のDHCPサーバーに遠慮して、
PCを立ち上げた時にDHCPリクエストを無視していたのだろう。
と云うことで、
ルーターを立ち上げるときはルーターの有線LANのケーブルは抜いておいた方がいいらしい。



中華PAD

サムスンのタブレットのバッテリーがへたってしまい、充電しながら使用するしかなくなったので、yahooで特価6000円の中華PADを買ってみた。
専用のACアダプターでは1時間ほどで充電できるが、USBでは電源OFF状態にしないと充電できないっぽい。
電源ボタンをOFFしても、使用1分=バッテリー1%のペースで減っていくので、全く使わないときは長押ししてシャットダウンするのが筋なのだろう。
画面はたったの800×480、ブラウザでみた感じではレンダリングの負荷が大きいようでスクロールするとボヤーっと表示、暫くするとぼやけが消える。解像度が低すぎるのだろうか?
インスト状態のYoutubeではエラーばかりで動画は見れず、PlayStoreからインストしなおし、開発者パッケージのインストも必要だったが、ちゃんと見れるようになった。
3DMarkのベンチは、ダウンロードの時点でかなり時間がかかり、
起動すると、エラー!(大笑
BDレコーダの再生は無理そう。SONYのページでは、RECOPLAとTwonky Beamを入れればBDの録画が見れるハズだが、PlayStoreでRECOPLAを検索すると説明ページまでジャンプせず事実上インスト不可。
色々リンクをたどり、ダウンロードページまで行ってみたら・・・未対応機器のメッセージが出た。
Twonky BeamもBDレコーダの中を検索できるものの再生でエラー。
と結果から観れば惨敗としか云いようがない。
だが、そこが中華PADなのだ。
中華PADでは出来ないことを
スペックはそうかわらない様に見えるのに高値なAndroid製品が実現している。
と云うことはAndroid製品は製品として使えるまでに色々とチューニングが必要だと云うことだ。
タブレットで色々やりたいことができるまでは色々と敷居が高いのだ。
と云うことが判る。
それなのに、
バージョンアップばかりやってるので
最近は高いものばかりになってしまった(大笑
なんとも情けないOSなんだなぁ~
と理解できる。
そして、それを有償でやっているのがMSのWindowsである。
が、最近はアップグレードは無償?路線に傾いているようだが・・・(大笑
今時の使い物になるものと、使い物にならないものを簡単に見比べる方法がある。
電源をOFFだけではなくOSをシャットダウンしてから起動させるだけ
この起動時間が長いほど使い物にならない。
長いのはCPUやGPUが古かったりメモリが足りなかったり、色々理由があるのだ。
でも、アマゾンやyoutubeやブログをちょっと見る分には十分なハードウェアだ。
でも無線の速度が低く、ダウンロード中は操作不能になることもある。
なお、モデル番号はSoftwinerEvb、Androidバージョンは4.1.1。
3DMARKは、空メモリ1GB推奨とかメッセージが出るも進めると途中でハングアップ。
しかしZeepad7.0と認識したようで大雑把なスペックが判った。
Zeepad7.0のスペックは、
Chipset:Allwinner A13
CPU:Cortex-A8
GPU:Mali-400
メモリ:512MB
OS:4.1.1
メモリ容量以外は多分同じなのだろう。
次に買う時はOSのバージョンだけではなくTEGRA3とか4とかGPUもチェックが必要なようだ。
だが全く使えないシロモノではない、電池の減りがはやく、3DMarkやBD録画の再生ができないという欠点は大きいけどね。(大笑
ps
設定の「モバイルネットワークを使用する」にチェックが入っていたのでOFFにした。
何度かのVeriosnUp後に3DMarkが起動できるようになったが「1GB必要です。」というあれれ?なメッセージの後、LOADINGバーが6割ほどで止まる。どうやら空メモリが1GB必要らしい。



node.js インストール linux

Linux版をnode-v0.10.21-linux-x64.tar.gzをダウンロードできたけど、
困ったことにページにはインストールは説明がない。
仕方が無いので解凍してみる
# tar xzf  node-v0.10.21-linux-x64.tar.gz
# cd node-v0.10.21-linux-x64
中にREADME.mdが入っているので、
その通りにやってみるようとしたが
開発者自身のリストアのメモであるらしいことが判ったので・・・
おとなしくnpmからインストールすることにする。
※一度インストールできたら利用できそうな気もする。
※だが、大幅な変更があったら、やっぱりダメだろうなぁ~って気もする。
# yum   -y   install   openssl-devel
# git   clone     git://github.com/creationix/nvm.git ~/.nvm
# .   .nvm/nvm.sh
# nvm   install   0.10.21
/usr/bin/which: no shasum in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/tripwire/sbin:/root/bin)
######################################################################## 100.0%
Now using node v0.10.21
# node -v
v0.10.21
#

で終わり。
次にソース・デバッガ

# npm install node-inspector
・・・
長いので中略
・・・
node-inspector@0.5.0 node_modules/node-inspector
tqq async@0.2.9
tqq strong-data-uri@0.1.0 (truncate@1.0.2)
tqq glob@3.2.6 (inherits@2.0.1, minimatch@0.2.12)
tqq rc@0.3.1 (deep-extend@0.2.6, ini@1.1.0, optimist@0.3.7)
tqq express@3.4.4 (methods@0.1.0, range-parser@0.0.4, cookie-signature@1.0.1, fresh@0.2.0, debug@0.7.3, buffer-crc32@0.2.1, cookie@0.1.0, mkdirp@0.3.5, commander@1.3.2, send@0.1.4, connect@2.11.0)
mqq socket.io@0
インストールはうまくいったのか?
状況はサッパリ判らない。
nodeコマンドのパスを通したら動くようになったが、
やっぱりソースは見えなかった。
そんな訳で
# rm -rf node-*
ps.2018/10/16
node.js用のユーザを作り、
https://nodejs.org/dist/v8.12.0/node-v8.12.0-linux-x64.tar.xz
を再ダウンロード。解凍。
vi ~/.bash_profile
でPATHにnode-v8.12.0-linux-x64.tar.xzを解凍した先のbinディレクトリィを追加し保存&リロード。
. ~/.bash_profile
node
> process.env
いっぱい出てくる。
> .exit で退席
とりあえず、PATHだけでも動くらしい。
https://nodejs.org/en/docs/guides/getting-started-guide/
のapp.jsを動かしてみるが、127.0.0.1では他のPCから見れないので、
app.jsをルータが割り振ったLANのIPアドレスに変え、
firewall-cmd --get-active-zones
でpublicだったら・・・※違った場合はpublicの部分を差し替えてコマンドを実行
firewall-cmd --add-port=3000/tcp --zone=public --permanent
firewall-cmd --reload
でポートを解放してやっと見えるようになる。
ThorntailやAngularやWebStormを動かすにはまだ遠い。


GeForce GTX 780 Ti

とりあえず
糊代を全部使い果たしてみました!
という感じがした。
勿論、歩留まりを上げるために削ってあった部分(SMX)を有効化しているのだから、

歩留まりは悪そうだ。

チップの選別を通過できる数はそれなりで、
落選したチップが『前のウルトラハイエンドっぽい名前』でゾロゾロ出回りそうな気がする。
その意味では

憧れのTITANがさらに身近になりそうだ。

既に購入済みの人も、
2枚目や3枚目の購入を考えれば
悪い話ではない。
 
しかし、ゆっくりしてると更なる円安がやってくるかもしれず、
また消費税もあるあがりそうなので、
時期は・・・
むずかしいなぁ~
 
もうウルトラハイエンドは諦める方がいいかも。



VBAのメモ(未検証)~VBでJavaでも読めるUTF-8のファイルを作るには~

どうしてもVBAでUTF8のテキストを作る場合は、ADODB.Streamオブジェクトを利用すると良いらしい。
EXCELシートになってる仕様書からデータを抜いて、Linux系のサーバーにCSVファイルをアップしなければならない場合には便利かもしれない。
なお、こんな面倒なことをするよりは、EXCEL君にはWindows用にシフトJISでCSVファイルを作ってもらい、LinuxサーバーにPHPでテキストをアップするutf-8のコードページのHTMLからアップすればブラウザがコードページを都合良く変換してくれるので汎用で便利なことは云うまでもないし、FFFTPが使えるなら、コードページと改行コードをちゃんと変換してくれそうだが、最近はFTPで接続できないケースが普通なので、FFFTPっぽいPHPのページを作るのが一番だろう。

あると便利な定数

LineSeparator用のLineSeparatorsEnum

定数 説明
adCR 13 改行復帰を示します。
adCRLF -1 既定値です。改行復帰行送りを示します。
adLF 10 行送りを示します。

Typeプロパティ用のStreamTypeEnum

定数 説明
adTypeBinary 1 バイナリ データを表します。
adTypeText 2 既定値です。Charset で指定された文字セットにあるテキスト データを表します。

Openメソッド用のStreamOpenOptionsEnum

定数 説明
adOpenStreamAsync 1 非同期モードで Stream オブジェクトを開きます。
adOpenStreamFromRecord 4 Source パラメータの内容を、既に開かれている Record オブジェクトとして識別します。既定動作では、Source は、ツリー構造のノードを直接指定する URL として処理します。このノードに関連付けられた既定ストリームが開かれます。
adOpenStreamUnspecified -1 既定値です。既定オプションで Stream オブジェクトを開くことを指定します。

textWrite用のStreamWriteEnum 値

定数 説明
adWriteChar 0 既定値です。Stream オブジェクトに対して、Data パラメータで指定したテキスト文字列を書き込みます。
adWriteLine 1 Stream オブジェクトに、テキスト文字列と行区切り文字を書き込みます。LineSeparator プロパティが定義されていない場合は、実行時エラーを返します。

SaveToFile用のSaveOptionsEnum

定数 説明
adSaveCreateNotExist 1 既定値です。FileName パラメータで指定したファイルがない場合は新しいファイルが作成されます。
adSaveCreateOverWrite 2 FileName パラメータで指定したファイルがある場合は、現在開かれている Stream オブジェクトのデータでファイルが上書きされます。

使い方

Dim outStream As Object

Set  outStream = CreateObject(“ADODB.Stream”)

outStream.Type = adTypeText

outStream.charset = “utf-8″  ’規定値は”Unicode” すなわちJavaやJavaScriptと同じUnicode(16ビット)である。

outStream.LineSeparator = adLF ‘LinuxではLFのみがデフォ。

outStream.textWrite   <UTF-8で書き込みたいテキスト>, adWriteLine

outStream.SaveToFile  <ファイル名>, adSaveCreateOverWrite

outStream.Close

※注意

このままではファイルの先頭にUnicodeのテキストを意味する3バイトのBOMコードが付いてしまうので、Javaで読むと痛い目に逢う。

もしサクラエディタを使っているなら作ったファイルを開くと画面右下に「UTF-8 BOM付」と表記されているハズ。

「名前を変えて保存」することでBOMコードは勝手に消えるが、毎回それをやるのも面倒なので・・・
同じことをやればいい。(ハズ 未検証!

outStream.Open       ’SaveToFile で設定した内容を再利用可?

‘バイナリーモードに変え、

outStream.Type = adTypeBinary

‘ファイルの先頭から3バイトのBOMコ-ドを読み飛ばし、

outStream.position(3)

‘中身(UTF-8になっているテキストをバイナリ形式で)を吸い上げる。

Dim binaryData As Variant

binaryData = outStream.read

そして

outStream.Close

もう一度開き直す。

outStream.Open

outStream.Type = adTypeBinary

outStream.Write(binaryData)

outStream.SaveToFile, adSaveCreateOverWrite ’※これが余計な3バイトを消す。ハズ?

outStream.Close

とする。
一抹の不安は、本当にbinaryDataが文字化けしないのか?だが、これはやってみないと判らない(笑
なお、Openメソッドの説明文を読むとCloseしてもプロパティ設定を変更してもう一度開くことができます。と書いてあるのでOpenはオプションなしでOK。
adSaveCreateOverWrite がトランケートしてくれるのか心配なら、Closeした後に一旦ファイルを消すといい。
なお、元ネタはこっちのページ JavaScriptだけど実証済のようだ。



やっぱり

やっとJavaも脆弱性を突かれる様な存在になった。
詳しいことは知らないけど、JREのJavaScriptにはセキュリティホールがいっぱいあるらしく、
本当にセキュリティを考えるなら、JREをインストしたなら、ブラウザのJavaScriptはOFFにしなくてはいけないそうだ。
と云うことは、WindowsやMacのパソコンにJREやJDKをインストすることはセキュリティ上好ましくないと云うことになる。
と云うことはEclipseの利用はセキュリティ上好ましくないと云うことになる。
 
本当にセキュリティを考えるなら、Javaは使うべきではない。
だって、JITコンパイラはclassファイルをバイナリーな実行コードを変換して実行する(かのように動作する)ものなので、実装上も危うく、ダイレクトにJITコンパイラを改ざんされたら、どうにでもされてしまう。
やっと、当たり前のことが云える雰囲気になったのかな?
 
それにしても、詐欺メールが多すぎる
そろそろ、HTMLに
<a href=”http://hogehoge.c0.jg”>http://hogehoge.co.jp</a>
※左は数字の0、右は英小文字のo。
なんて書いてあったら、クリックするとThunderbirdみたいに
「表記とは異なるドメインへ移動しようとしています。詐欺リンクかもしれません?移動しますか?
(はい)(いいえ)」
とか出てもよさそうなものだが、どのブラウザもなぜかやらない?
多分、そんなことされたら、営業妨害だ!と騒いでいるトコロがあるのかもしれないけどね。



なぜセキュリティを理由に新しいものに手を出させたくないのか?

理由は単純。
簡単なこともめんどくさくすることが仕事なので、
その辺のスマホとクラウドの組み合わせで簡単に仕事をこなされては困るからだ。
営業上の都合と考えれば理解もできるだろう。
しかし、
そんなところに長居をすると
普段便利なものを使わない習慣が付いているので
単なるi-phoneファンな中高年になってしまうしかない。

あのクラウドには大規模なRDBがあって一生懸命照会業務がうごめいているとか、そんな想像に偏ってしまう。

あの中にはRDBどころかDBの欠片もない。

中はセッションのIDをお互い持ち合っているだけで動いている。

あるのは巨大なハッシュ・リストだけ。

だから、技術者としての転職も困難と云える。
だからこそ、
技術者として人材の流れは一方向だけ。
だから。セキュリティが保たれる可能性もあるだろう。
ま、
それでも職があればマシと思えば、それも悪くないかもしれない。
 
 
 




top