変奏現実

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

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

インターネット

node.jsを起動してみる

windows版をインストールすると
環境変数PATHに2つパスが追加されている。
コマンドプロンプトで確認すると
C:\Users\{ユーザ名}>echo %PATH%
C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\Wind
owsPowerShell\v1.0\;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;
C:\Program Files (x86)\QuickTime\QTSystem\;C:\Program Files (x86)\nodejs\;C:\Use
rs\{ユーザ名}\AppData\Roaming\npm
となっているので、
C:\Users\{ユーザ名}>node
>
で、準備OK。
しかし
> node -v
ReferenceError: node is not defined
at repl:1:1
at REPLServer.defaultEval (repl.js:129:27)
at REPLServer.b [as eval] (domain.js:251:18)
at Interface.<anonymous> (repl.js:277:12)
at Interface.EventEmitter.emit (events.js:103:17)
at Interface._onLine (readline.js:194:10)
at Interface._line (readline.js:523:8)
at Interface._ttyWrite (readline.js:798:14)
at ReadStream.onkeypress (readline.js:98:10)
at ReadStream.EventEmitter.emit (events.js:106:17)
>(Ctrl+Dで終わる)
そうそう
C:\Users\{ユーザ名}>node -v
v0.11.7
C:\Users\{ユーザ名}>npm -v
1.3.8
C:\Users\{ユーザ名}>
なのだ。
さてデバッガをインストールしてみよう。

C:\Users\{ユーザ名}>npm -g install node-inspector

まだ、開発バージョンのせいだろう。
3回コマンドを繰り返えしたら成功した。
C:\Users\{ユーザ名}>npm -g install node-inspector
npm http GET https://registry.npmjs.org/node-inspector
npm http 304 https://registry.npmjs.org/node-inspector
npm http GET https://registry.npmjs.org/socket.io
npm http GET https://registry.npmjs.org/rc
npm http GET https://registry.npmjs.org/strong-data-uri
npm http GET https://registry.npmjs.org/express
npm http GET https://registry.npmjs.org/async
npm http GET https://registry.npmjs.org/glob
npm http 304 https://registry.npmjs.org/rc
npm http 304 https://registry.npmjs.org/socket.io
npm http 304 https://registry.npmjs.org/glob
npm http 304 https://registry.npmjs.org/async
npm http 304 https://registry.npmjs.org/express
npm http 304 https://registry.npmjs.org/strong-data-uri
npm http GET https://registry.npmjs.org/deep-extend
npm http GET https://registry.npmjs.org/optimist
npm http GET https://registry.npmjs.org/ini
npm http GET https://registry.npmjs.org/truncate
npm http GET https://registry.npmjs.org/inherits
npm http GET https://registry.npmjs.org/minimatch
npm http GET https://registry.npmjs.org/range-parser/0.0.4
npm http GET https://registry.npmjs.org/commander/1.3.2
npm http GET https://registry.npmjs.org/connect/2.11.0
npm http GET https://registry.npmjs.org/send/0.1.4
npm http GET https://registry.npmjs.org/methods/0.1.0
npm http GET https://registry.npmjs.org/fresh/0.2.0
npm http GET https://registry.npmjs.org/buffer-crc32/0.2.1
npm http GET https://registry.npmjs.org/cookie/0.1.0
npm http GET https://registry.npmjs.org/mkdirp/0.3.5
npm http GET https://registry.npmjs.org/cookie-signature/1.0.1
npm http GET https://registry.npmjs.org/debug
npm http GET https://registry.npmjs.org/socket.io-client/0.9.16
npm http GET https://registry.npmjs.org/policyfile/0.0.4
npm http GET https://registry.npmjs.org/base64id/0.1.0
npm http GET https://registry.npmjs.org/redis/0.7.3
npm http 304 https://registry.npmjs.org/deep-extend
npm http 304 https://registry.npmjs.org/optimist
npm http 304 https://registry.npmjs.org/ini
npm http 304 https://registry.npmjs.org/truncate
npm http 304 https://registry.npmjs.org/cookie-signature/1.0.1
npm http 304 https://registry.npmjs.org/send/0.1.4
npm http 304 https://registry.npmjs.org/debug
npm http 304 https://registry.npmjs.org/minimatch
npm http 304 https://registry.npmjs.org/inherits
npm http 304 https://registry.npmjs.org/fresh/0.2.0
npm http 304 https://registry.npmjs.org/mkdirp/0.3.5
npm http 304 https://registry.npmjs.org/base64id/0.1.0
npm http 304 https://registry.npmjs.org/redis/0.7.3
npm http 304 https://registry.npmjs.org/methods/0.1.0
npm http 304 https://registry.npmjs.org/socket.io-client/0.9.16
npm http 304 https://registry.npmjs.org/connect/2.11.0
npm http 304 https://registry.npmjs.org/buffer-crc32/0.2.1
npm http 304 https://registry.npmjs.org/cookie/0.1.0
npm http 304 https://registry.npmjs.org/commander/1.3.2
npm http 304 https://registry.npmjs.org/range-parser/0.0.4
npm http GET https://registry.npmjs.org/lru-cache
npm http GET https://registry.npmjs.org/sigmund
npm http GET https://registry.npmjs.org/mime
npm http GET https://registry.npmjs.org/keypress
npm http GET https://registry.npmjs.org/wordwrap
npm http GET https://registry.npmjs.org/qs/0.6.5
npm http GET https://registry.npmjs.org/uid2/0.0.3
npm http GET https://registry.npmjs.org/bytes/0.2.1
npm http GET https://registry.npmjs.org/pause/0.0.1
npm http GET https://registry.npmjs.org/methods/0.0.1
npm http GET https://registry.npmjs.org/raw-body/0.0.3
npm http GET https://registry.npmjs.org/negotiator/0.3.0
npm http GET https://registry.npmjs.org/multiparty/2.2.0
npm http 304 https://registry.npmjs.org/policyfile/0.0.4
npm http GET https://registry.npmjs.org/uglify-js/1.2.5
npm http GET https://registry.npmjs.org/ws
npm http GET https://registry.npmjs.org/xmlhttprequest/1.4.2
npm http GET https://registry.npmjs.org/active-x-obfuscator/0.0.1
npm http 304 https://registry.npmjs.org/sigmund
npm http 304 https://registry.npmjs.org/lru-cache
npm http 304 https://registry.npmjs.org/wordwrap
npm http 304 https://registry.npmjs.org/mime
npm http 304 https://registry.npmjs.org/keypress
npm http 304 https://registry.npmjs.org/methods/0.0.1
npm http 304 https://registry.npmjs.org/bytes/0.2.1
npm http 304 https://registry.npmjs.org/uid2/0.0.3
npm http 304 https://registry.npmjs.org/negotiator/0.3.0
npm http 304 https://registry.npmjs.org/raw-body/0.0.3
npm http 304 https://registry.npmjs.org/pause/0.0.1
npm http 304 https://registry.npmjs.org/qs/0.6.5
npm http 304 https://registry.npmjs.org/multiparty/2.2.0
npm http GET https://registry.npmjs.org/readable-stream
npm http GET https://registry.npmjs.org/stream-counter
npm http 304 https://registry.npmjs.org/xmlhttprequest/1.4.2
npm http 304 https://registry.npmjs.org/active-x-obfuscator/0.0.1
npm http 304 https://registry.npmjs.org/uglify-js/1.2.5
npm http 304 https://registry.npmjs.org/ws
npm http GET https://registry.npmjs.org/zeparser/0.0.5
npm http GET https://registry.npmjs.org/tinycolor
npm http GET https://registry.npmjs.org/commander
npm http GET https://registry.npmjs.org/options
npm http GET https://registry.npmjs.org/nan
npm http 304 https://registry.npmjs.org/readable-stream
npm http 304 https://registry.npmjs.org/stream-counter
npm http GET https://registry.npmjs.org/core-util-is
npm http GET https://registry.npmjs.org/debuglog/0.0.2
npm http 304 https://registry.npmjs.org/zeparser/0.0.5
npm http 304 https://registry.npmjs.org/nan
npm http 304 https://registry.npmjs.org/tinycolor
npm http 304 https://registry.npmjs.org/commander
npm http 304 https://registry.npmjs.org/options
> ws@0.4.31 install C:\Users\{ユーザ名}\AppData\Roaming\npm\node_modules\node-inspector\
node_modules\socket.io\node_modules\socket.io-client\node_modules\ws
> (node-gyp rebuild 2> builderror.log) || (exit 0)
C:\Users\{ユーザ名}\AppData\Roaming\npm\node_modules\node-inspector\node_modules\socket.
io\node_modules\socket.io-client\node_modules\ws>node “c:\Program Files (x86)\no
dejs\node_modules\npm\bin\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp
.js” rebuild
npm http 304 https://registry.npmjs.org/debuglog/0.0.2
npm http 304 https://registry.npmjs.org/core-util-is
C:\Users\{ユーザ名}\AppData\Roaming\npm\node-inspector -> C:\Users\{ユーザ名}\AppData\Roaming\np
m\node_modules\node-inspector\bin\inspector.js
node-inspector@0.5.0 C:\Users\{ユーザ名}\AppData\Roaming\npm\node_modules\node-inspector
├── async@0.2.9
├── strong-data-uri@0.1.0 (truncate@1.0.2)
├── glob@3.2.6 (inherits@2.0.1, minimatch@0.2.12)
├── rc@0.3.1 (deep-extend@0.2.6, ini@1.1.0, optimist@0.3.7)
├── socket.io@0.9.16 (base64id@0.1.0, policyfile@0.0.4, redis@0.7.3, socket.i
o-client@0.9.16)
└── express@3.4.4 (methods@0.1.0, cookie-signature@1.0.1, fresh@0.2.0, range-
parser@0.0.4, buffer-crc32@0.2.1, cookie@0.1.0, debug@0.7.2, mkdirp@0.3.5, comma
nder@1.3.2, send@0.1.4, connect@2.11.0)
では何か動かしてみよう

C:\Users\{ユーザ名}にこんなhellow.jsを作ってみる。
var http = require('http');
var server = http.createServer(function(req, res){
   res.writeHead(200, {'Content-Type': 'text/plain'});
   res.write('Hello World\n');
   res.end();
});
server.listen(3000);
C:\Users\{ユーザ名}>node --debug hellow.js
debugger listening on port 5858
と出るので、ブラウザ(FireFox)から http://127.0.0.1:5858/ を見ると、
Type: connect
V8-Version: 3.20.17
Protocol-Version: 1
Embedding-Host: node v0.11.7
Content-Length: 0
しか出ない。
コマンドプロンプトには
GET / HTTP/1.1: (no value)
Host: 127.0.0.1:5858
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:24.0) Gecko/20100101 Firefo
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cache-Control: max-age=0
とログが出た。
では、デバッガを起動し、

C:\Users\{ユーザ名}>node-inspector
Node Inspector v0.5.0
info  – socket.io started
Visit http://127.0.0.1:8080/debug?port=5858 to start debugging.

ブラウザ(FireFox)から http://127.0.0.1:8080/debug?port=5858 を見ると、

node.jsのデバッガ画面
node.jsのデバッガ画面



とソレっぽい画面は出てくるものの何も出ない。(大笑
とりあえず、IDEっぽいものは既にあるようだ。
説明ページもあったが、
Windowsではまだまだのようだ。
デバッガが
lob error { [Error: EPERM, readdir ‘C:\Users\{ユーザ名}\AppData\Local\Microsoft\Windows
INetCache\Content.IE5’]
errno: -4049,
code: ‘EPERM’,
と延々とパスをサーチしてしまう。
次はCentOS6でやってみよう。
 
 



デスクトップの仮想化

早い話がテレビ会議風に向こう側のPCを操作するようなものだ。
遠く離れたPCをデスクトップを見ながらリモートで操作するのは便利と云えば便利。
しかし常時リモートで接続すると結構不便。
1.リモードデバイスの接続は超低速。
ちょっと手元のUSBメモリを接続して小さなファイルをコピーするには便利だが、デバイスと相手先のデータ転送のプロトコル自体が非常に低速で何百MBサイズにも不向き。容量が大きいなら共有フォルダを使うべきだろう。これはVirtual-PCやHyper-Vも同じ。
2.マウスの操作に追いつけない。
マウスを持ってグルグル回す分には支障ないようだが、いっぱいファイルをドラッグしたりすると、ドコに落としてしまうか判らない。
3.広帯域のネットワークが必要。
情報満載のパワポの派手なアニメーションはOFFかワイプに変えるべき。同じLANで10台くらい一斉に同じことをすると、パケ落ち必至。
 
なので、コレを使って手元のPCをサーバー室に放り込むなんてことをすると、LANは当然高速化しなければいけないし、ハブだって大容量が扱えラグの少ないものにしないと話にならない。
 
そんな訳でLANコストはとんでもないことになる。
その辺にバラバラとPCを置いた方が低コストだ。
 
さらに云えば、たとえデスクトップを仮想化しても共有EXCELファイルは共有EXCELファイルのまま扱うしかないので、本当のところ仕事でビジネスでデスクトップを仮想化するのはコストがかかるだけだ。
ビジネスで本当にやらなければいけないのはリソースの仮想化だろう。
平たく言えば、共有EXCELファイルとか共有なんて考えずに使えるものが必要だ。
もっとはっきり云えば、EXCELなんて中途半端なもので仕様書を書くことを即刻辞めることだ。
中途半端が一番悪い。
 
 



node.jsその後

node.js
まずインストール(v0.11.7 (開発版))してみると
Windowsなら
デフォのままならC:\Program Files (x86)\nodejsにインストールされる。
ちゃんとインストーラを使っているのでアンスコも簡単。
しかしパッケージリストが無い。
とりあえず node.exeを実行してスクリプトを流せばよいらしい。
使えそうなパーツなどはnode_modulesフォルダの中にあり
npmツールで管理している。
そつのない。簡素な感じ、多分、何か書き出せば
http.createServerのオンパレードになるのなら、なぜこうなっているのだろう?
 
やはり、ずーっとサーバーを相手にしているとIDEなんて

メンドクサイ

と云うことになるのだろう。
 
ま、欲しいなら作ればいいのか(笑
Eclipse風でいいなら、ビューがあればいい、そしてビューをセットアップしたパースペクティブを作っておけばよいのだろう。
後はソースレベルデバッガだが・・・ブラウザをコンソールにしないとIDEの意味が無い。
node.exeに簡単なブートストラップのコードを入れて、ブラウザから送られたjsコードを実行したりデバッグできればいい。
そうなると、svnとかGitとかリポジトリィで作ったものを勝手にバックアップさせるような仕組みが無いと危ない。
なぜなら、ブラウザは【X】ボタンを押せばすぐ閉じてしまう性質があるし、クッキーサイズにいつでもプロジェクトのコードを一式まとめておくことがいつもできる訳ではないからだ。
多分、リポジトリィは thunk   run/debug  package に分けると良いのだろう。
あと、HTMLやPDFを吐き出すレポートライターがあればいいな。
データベースと繋ぐ時はどうしよう?
JDBC?そんなものは無い。
と云う訳で、グラフィカルな開発環境はかなり遠い未来にあるようだ。



HASWELL版NUC

Celeron 847(第2世代 Sandy -Bridgeモノ)のNUCで間に合っているので、ほとんど関心が無い。
※古いAtomやAMD A-Seriesでは記事を書くにも重かったりしたがCeleron847では支障はなく、放置してても、過熱せず、時々ファンが回る程度で古いAtomより熱を持たない。
だが、今買うならSandy -BridgeやIvy-BrigeよりHaswell(Core i5-4250U)の方が待機時の消費電力が小さくなっているハズなので、Celeron以外なら多少高くてもHaswell版の方が長持ちするだろう。
マザボにはINTELのケースでは使いようが無いSATAコネクタが付いている。これは他社ケースでHDDなどをつなげるようにするためのものだろう。
CentOSのブログ鯖なら64GBもあればOKだが、ゲームでスクリーンショットをバシバシ取ったりプレイ動画を貯めるなら、HDDが欲しくなるので、それなりの需要はあるだろう。ただし、USB3接続の外付けHDDで十分な気もする。
さてFFXIVをするつもりになってこのHaswell版NUCを考えると全く歯が立たない。
通常クロックが1.3GHzと低く、ゲームをするつもりならBIOSでターボブーストをONにして2.6GHzにしておかないとダメだろう。そうしないと、2コアしかないので、4スレッドとは云え、低クロックでは重いセキュリティアプリが足手まといになるのも痛い。更にL3キャッシュがデスクトップ用CPUの半分の3MBなところも気になるところだ。でも、HD graphics 5000だから、HD graphics 4000の2倍近くまで性能が上がっているので、古いMS Surface Proより新しいMS Surface ProやHaswell版NUCの方がマシなのは間違いない。古いMS Surface Proでは標準設定でベンチは2000番台だったから4000近くまで伸びるのなら悪くないだろう。だがそれはターボブーストON時の話。
総評すると、性能は良くなり、待機消費電力が下がるメリットもあり買い替えても良い仕上がりになっている。でも、しっかり価格を上げてきているのので、ベアボーンにパーツ一式を購入した場合を考えると、ノートパソコンやタブレットの方が安くなるので、

NUCとしての存在意義を見失っていると云える。

例えるならハイパースペックで高価なAtomみたいなものになっている。
ストレートにi7-4770Kのパソを一式買った方が困らない。
Iris入りでも出して来たら、気も変わるだろうけど。そんなことはあり得ない。と思う。
まず第一に発熱対策が充分に取れるだろうか?第2世代のAtomの安価セットはほとんどが熱暴走する始末で短命だった。あの二の前はごめんだ。MMOのような何時間もダラダラ遊ぶゲームには向かない。
きつい評価かもしれないが、価格相応の性能ではあるけれど、使い道は一択しかない!

「艦コレ」好きでとりあえずデカい液晶テレビで遊びたい人。

他はパスしてよい。
使い道がはっきりしないなら、このHASWELLのNUCよりMSの新しいSurfaceProを買った方がいいだろうし、もう少し予算があれば巨大なゲーム用パソコンも買える。そんな価格だ。
どうしてもモニターの裏に取り付けたいとかでっかいテレビの横のわずかなスペースにパソコンを置きたい。後は無線のキーボードとマウスでなんとかなる。
そんなシチュエーション以外に使い道は無い。
もちろん小さな子持ちの家族ならそういうシチュエーションもありうるだろう。
だが、小さな子持ちの家族は何かとお金がかかるので、予算は少ない。

結論

お勧めは、お安いCeleron847(1.1GHz)のNUC。
そして、メモリも2個よりは最大容量の8GB1個、SSDも少な目の128GBぐらいが丁度良い。
所詮は小さいNUCなので全体のスペックを上げようとi5やi7でTurboBoostをONにしてもすぐ過熱しクールダウンしてしまい人(PC)がワンさかと出てくるMMOとかRvRではゲーム画面がガクガクになるのは避けられない。BF3など枯れたFPS向け。その辺はミニノートPCと同じ。



レポートライター

所定のデータを差し込んでPDFやHTMLファイルを作成するツール。
ワードやEXCELの文書ファイルを作れるものもあるし、テキストファイルに出すものもある。
テキストファイルに出せるならCSVファイルにも当然出すことができるが、レイアウト画面を延々とカンマで埋める作業になるだろう。
ここまで来るとテキストファイル変換ツールといっていいだろう。
こんなフォーマットテキストと
“{name},{zip},{address1},{address2},{address3},{tel1},{tel2}\r\n”;
List<xxxBean>のデータを添えてやるとListの要素分、行を出力させるのは、そう難しくない。
xxxBeanから任意の名前のgettorを手早く呼び出す方法を思い出す方がメンドクサイくらいだ。
ちょっとフォーマットを変えて
“<xml><name>{name}</name>\
<zip>{zip}</zip><address1>{address1}</address1>\
<address2>{address2}</address2><address3>{address3}</address3>\
<tel1>{tel1}</tel1><tel1>{tel2}</tel2>\
</xml>”;
にするとXMLファイル出力の出来上がり。
できれば、{zip}を{zip format:000-0000}などどフォーマット指定ができるとうれしい。
yyyy-MM-dd HH:mm:ss.SSS なんかもできるといいだろう。
そうなると”で括った方が安心とか、
現在日時を楽に出したいとかあって、
{@systemDate, format:”yyyy-MM-dd HH:mm:ss.SSS”}
とかに、なるんだろうな。
 
ひとつ作っておくと便利そうだ。
そう、自分で作っておけば勝手に拡張できるからね。(笑
jndi指定でデータベースからデータを引っ張りだすとか、
EXCELシートから
とか後付けできるかもしれないからね。
 
 
これで年賀状の宛名書きは万全・・・のハズ。



スクリプト

早い話が呪文(spell)のことである。

alert(“ひゃっほーい!”);

と書くと

「ひゃっほーい!」(OK)

とメッセージが飛び出る。
何やら難しそうだが、実装は単純。

1.まず、ダブルクォートでサクっと文字を分割。偶数番目の文字の前後はダブルクォートでくくる。

  • alert(
  • “ひゃほーい!”
  • );

2.これを記号で更に分割

  • alert
  • (
  • “ひゃほーい!”
  • )
  • ;

3.適当な語句分析ルーチンに流して、分割した文字列に意味を持たせる。

  • 名前:alert、左括弧(、リテラル:ひゃほーい!、右括弧)、セミコロン;

4.適当な文法解析ルーチンに流して、意味付けをする。

  • 関数名:alert、引数1:”ひゃほーい!”、以上;

5.ここまで来れば、後は

  • alert関数に”ひゃほーい!”を渡して、何かするのを期待するだけ。

と至って簡単である。
最初にダブルクォートで括るのはこれはプログラミングの定説とか信仰とは無関係である。なぜなら「ひゃほーい!」の部分にはダブルクォート以外なら大抵の文字が入ってよいので、文法上は「悪質なスクリプト」を書いても文法上は合法である。そんなもんを書かれるとプログラムはウッカリどころか真面目に解析してしまい厄介なことに明白で最初にそのようなケースをバッサリと除外しない奴は頭がイカれている。
一般には処理を分岐するif文とかloop文やwhile文もあるが、要は「適当な文法解析ルーチン」を作って、「xxx関数にyyyを渡して何かするのを期待する」だけなので何も難しくない。
ただ、String[100]  text;と書くような文法は、JNIなどの外部インタフェースには欲しいが、バッファーオーバーランに出会うとひどい目に遭うのは間違いないので、そのようなバッファは他とは区別し共有メモリ(DNZエリア)に配置するのがよい。外部インタフェースの仕組みは言語やOSさらに32ビット版かか64ビット版かによって、ずいぶんと異なる仕来りでデータを配置しなければいけないので、OSのコンパイラーの構造体の仕様書やEXPORTSインタフェースの仕様を熟読する必要が、仕組みさえ理解すればメモリに仕様通りにデータを並べていくだけ。パラメータが複雑な構造体でも応用できるようにちゃんと組んでしまえば、面倒なバイナリーなダンプ・データを作成の便利なツールにもなる。
色々あるが、これらを都合のいいように、組み合わせれば、大抵のスクリプトのモックアップは完成する。
後は、呪文を組み合わせると、やはり可笑しなことが起こる。
一般通念としては、こうなるハズ!とか、常識的に考えればこうだろう!とかは大抵外れる様にできている。
例えば、AKB48(”xxxxx”);と呪文を唱えたら、どうなるか?
そう、AKB48関数をコードしないと、「知らない関数(AKB48)です」と表示することもせず、ただcoreファイルを吐き出すだけだろう。
スクリプトの難しいところは、

  1. いかにミスをしないように記述できるか
  2. 多少のミスなら無視して処理できるか
  3. ミスを犯した場合に適切なガイドメッセージを表示できるか

など、不注意に対してドレだけ寛容であるかが、使い心地に大きな影響を及ぼす。
だから、1文字間でも違えたらHDDがクラッシュするのは仕様ですなんて論外である。
 
以上。
 



i-Google

実は一番よく使っていた i-Google。
スマフォやタブレットの小さい画面では扱いにくく、広告を載せる要素が一切ないのが難点だったようで、もうすぐ終了。
まぁ~、無くなってもRSSリーダーのプラグインのあるブラウザを使えば済むので、特に困らない。
そう、オンラインゲームのように、無くなっても困らない。
ただ、i-Googleだったから、
美人時計は丁度よかった気がする。
デスクトップ・ガシェットとしてずーっと表示させるのも
イマイチだよね。
MOE人時計が使えるのも後10日。



Windows8.1

Windows8からは無償なので海外では盛り上がらないのに、日本だけイベントをやったようだ。
現在の日本は安部総理の円安気運でPCパーツは軒並み値上がりしているから、Windows8の売り上げが絡まなくてもメーカーや店舗のイベントを盛り上げないといけない事情がありそうだ。
さて、今まではオンラインでのアップデートは全てWindows Updateからサービスパックとして行われていたが、今回からApp Storeに変わったようだ。
特に問題はなさそうだったが、ウィルスセキュリティを入れている場合は、最後の最後に意味不明なエラーコードを吐いて、Windows8に巻き戻る。
もう最新の更新モジュールがあがっているので、この更新の後に再起動を行うと、ちゃんと8.1にアップデートできる。
8と8.1の違いは、ディスクトップの下のメニューに「Windows」マークが増えた程度しかない様に見える。
ただ、SkyDriveなど8.1用にアプリが強化されているものもあるようだ。
また、アップデートが成功した後にユーザ・アカウントの設定も行うことになる。
手元のアカウントはSkyDriveで同期を取っていたせいか、マイドキュメントやデゥクトップから消えたファイルは特になかったようだが、
ディスクを一度でも暗号化した場合などは、ユーザのプロファイル(C:\ユーザ\{ユーザ名}\AppData\Roming下)などがうまく移行できない場合もあるかもしれないので、
マイドキュメントやメーラのデータのバックアップをした後にアップデートするべきだろう。
 
8.1になってもDSP版もあるし32ビット版もあるので、特に困ることはなさそうだ。
ただ8.1になったら使えなくなるデバイスはあるかもしれない。
あとは、
Windows8では手元のBluetoothヘッドフォン SONY DR-BT32Gは「デバイスとプリンター」の画面で警告マークが付いていた。音切れが起きてたのもそのせいだろう。なんとなく8.1へのアップデート前にDR-BT32Gのドライバーを削除しておいた。
Windows8.1になってからは、Bluetoothのレシーバーは指し直さないと認識しなかった。DR-BT32Gのマッチングを行ったら、警告マークは表示されなかった。雑音が収まったので音質がよくなった気がする。
※音量ミキサーからヘッドフォンのアイコンをクリックすると「ヘッドフォンのプロパティ」が出るので「音の明瞭化」でラウドネス イコライゼーションにチェックを入れ「設定」でリリース時間を+1すると丁度いい感じ。
この画面から「ヘッドセット」のチェックも入れると「警告マーク」が出てしまうのは仕方がないのかもしれない。
Wireless Gamepad F710も箱アイコンに戻ってしまった。ロジクールのツールでもパッドを認識できないので、デバイスマネージャからドライバーを「Xbox360周辺機器」の「Xbox 360 wireless Controller via Play & Change Kit」を入れるしかない。これはWindows8でもそうだった。
ここまで設定が済んだあと、何か操作した時に時々音切れする時があった。これは仕様かどうか判らないけど、電波の競合が起きているかもしれない。
LogicoolのUnifyingレシーバー、パッド用のレシーバー、GreenhouseのBluetoothレシーバー、iBUFFALOのマウスのレシーバーと4つも並んでいるのだから。
本当のところは、無線LAN+Bluetoothで済ませてしまいたいが、周辺機器が高いものになってしまうので、無印無線機器は手放せない。
と書いてる間も音切れが気になってきたので、昔から重いので有名であった赤印のATI時代を思い出しAMDのグラフィックスドライバーを外し再起動してみたら、音キレは無くなった。(笑
しかし、そう書いた途端にバチバチ音切れ。どうやら、RADEONを使う限り、Bluetoothの音切れは仕方がないらしい。(笑えない
AMDのグラフィックスドライバーを入れ直すと今度は調子が良い。微妙な塩梅のようだ。音切れの頻度は減ったけどするときはする。



ハードコーディング

元々ハードコーディングとは「要件を聴いてその場でコードを書き起こす」ことだったが、
※そんなことは数十年前ならよくあったことだ。Windowsのアプリでもね。
今ではなんのこととはない、プログラムに住所とか名前なんかのデータをそのまま載せているプログラムをハードコーディングと云うらしい。
なぜハードなのかというと、
private static final String NAME=”*名前*”;
と書かないで、何度も”*名前*”と書き散らすと後で”名前”に変わったら修正が面倒だ(=ハードな仕事)というのだ。
どんだけ仕様が変貌するんだろう。すでにコード化した後なのに。ま、そこは流用の場合と注釈が入る。
ところが、流用できるJavaコードなんて一度も見たことが無い。(※サンプルを含む)
というのもJavaのソースの書き方がさくさくと流儀が変わるので、3年前のソースは見るに堪えないなんてこともよくあるから、
土台、流用と云っても、隣の奴が先にコードしたものをコピペしたい!というのが本音。他力本願の権化といっていい考え方である。
 
さて、古いあいまいな記憶を手繰り寄せると、もともとプロパティはBeanの原型で処理はなく固定のデータを記述したものだった。そうクラスを作って、個別にGetterを書くのも面倒なので名前=値を列挙したものだ。でもjarファイルの外に配置したい場合もあるので、プロパティファイルをロードする仕組みが必要になり、データを取るたびに毎回getProperty(“NAME”)と毎回書くようになったのだが、全くの蛇足にしか見えない。

そこまでやっても”NAME”はハードコーディングのままなのが何とも情けない。

そこで、private static final String KEYWORD_NAME=”NAME”; を集めたConstのみのクラスを作り、=xxx.getProperty(xxxConst.KEYWORD_NAME) と書く方がマシだったりする。
そうすると、Constクラス+プロパティファイルのペアになり、これだったら、C言語の様なヘッダーファイルの方が数段マシだったりする。(大笑
しかし、意地でも昔には戻るつもりはないらしい。過去は否定するものでしかなく、温故知新なんてありえないと思っているようだ。
確かにその考えは正しい。なぜなら、いつまでもJavaはVer2.xになれないまま、1.7まで変貌を遂げているのだから。
但し、それはJavaの世界でしか通用しない。
更に云えば、
private static final String LINE1=”——————————-切り取り線——————————-”
private static final String LINE2=”名前:【${NAME}】 ”
private static final String LINE3=”住所:【${ADDRESS}】”
private static final String LINE4=”——————————-切り取り線——————————-”
などは、ソースやプロパティより、Javaベースでいいから既存のテキスト出力のレポートライターを使った方がいいハズだ。
このような使い方は下手だし、なんでもJavaコードで書こうとするところが、頭でっかちな気がしてしょうがない。
というより、開発環境=Eclipse+WEBサーバーしか知らないのではないのか?と思ってしまう。
Eclipseにもビジネス用のレポートライターのプラグインが入っているし、WEBサーバーで利用できように配慮もなされている。
 
長くなってしまったが、ハードコーディングかどうかは、
流用するには、

・同じ修正を何度も繰り返さないといけない扱いにくいソースだった。

・全部見直さないとどうなっているのか皆目見当が付かないソースだった。

の2点で判断すべきで、

複雑さやリテラルや数値が散乱具合で

大雑把に評価することは何も意味はないのだ。

もっと、云ってしまえば、

流用できなくて良いものまで流用できるようなコードにするのは全くの無駄で、これは言い逃れ様がない。

どの程度の流用を想定しているのか、ということをはっきりさせておかないと、上記のどれか一つの方法に強引に決めてしまうような間違いをしてしまう。
また、複雑度を下げるため、yaccパーサーが吐き出した様な条件式と足し算、引き算で何か意味深な結果を生み出すコードは何をしたいのか目的をまとめて仕様書を書き起こすべきものだが、その辺は皆無である。その辺はなんで仕様書が必要なのか理解していないのではないかと思われる。
 
実例を挙げると、消費税を「5%」とハードコーディングしておけば、美味しい商売か?、否か?で判断すべきなのだ。
結果はどうなるかはその時次第なので、

ハードコーディングしたせいで、8%、10%と変わっていくときに、とんでもない費用がかかるのか?

ハードコーディングしたせいで、8%、10%と変わっていくことで、パッケージがいっぱい売れるのか?

どっちに転がるのかは予想してもあんまり意味が無い。
 
つまり、
ハードコーディングとは
「そんなこと!常識じゃん!」とか「仕様書に書くべきことではない」と云ってる輩が真の原因で、
その予想が外れ散々な結果になったソースのことなのである。
 
そして、大半は散々な結果になることは明白だ。
 
なぜなら、競馬のたった2-3個の数字のまともに当らないのが普通で、それが人間だからだ。
何年も先にどう流用されるのか予想すること。その時の人間がどんな思いで使うのかを予想することは、競馬の難易度を遥かに超えるのは当然だと思うんだけどね?




top