変奏現実 (仮

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

【NAS】Virtualization か それともDocker か?

No Comments »

1月 18th, 2017 Posted 18:49

NASに普通のOSを積めたら楽なんだけどなぁと思ってたら

NASのメーカーのQNAPがVirtualization Station、SynologyがDockerを載せてきた。

Virtualization StationはLinuxのQEMUを使ったものらしい、Dockerも for Windowsを入れっぱなしにしているので馴染みがある。

一概にどっちがいいとは云えない技術だ。QEMUは仮想化を実現する設定をアレコレ設定が必要だが、出来上がってしまえばコピーしておけばいいし、スナップショットを取っていつでも巻き戻しできるようにしておけば開発環境としてはベター。一方Dockerはそんな面倒な設定をシェアしあうものでありお手軽ではあるが、一方でライセンスが必要なOSやパッケージを使うのには適していない、なぜなら必要なライセンスのみ購入してもそれにピッタリあった面倒な設定をシェアしてくれる人がいなければ『自腹でライセンスを購入したパッケージの面倒な設定を世界初でやる』ハメになるので全くお手軽では無くなるからだ。

つまり、自分の好き勝手な環境を作りたい人には玄人志向なQEMUが向いており、シェアされた沢山の設定を遊び倒す人にはコピペフリーなDockerが向いている。

Virtualization StationにしてもDockerにしても、どのNASでも使える訳ではないので、対応しているかどうか要チェックだ。

いづれにしても社内のみで使う様な業務専用のWEBサイトのサーバーをNASダケで構築できる様になったのはとても助かる。一般的なデータセンターにサーバーを配置しようものなら世界中のクラッカーの目の前に餌をぶら下げる様なもので1日24時間年中無休のメンテナンス体制が必定なのだから。

 

 

 

Posted in パソコン

Mini-STX ベアボーンキット

No Comments »

1月 18th, 2017 Posted 16:37

Mini-STX規格のマザボとACアダプターとケースのセット。

1.ASRock DeskMini 110

実は3種類あるらしい

  • DeskMini 110
    • 基本セット
  • DeskMini 110W
    • 基本セット+WiFiアンテナ
  • DeskMini 110/COM
    • 基本セットからマザボがASRock H110M-STX/COMに変わりCOM ポートケーブルが付属する

マザボはASRock H110M-STX はUSBは3.0が2個で2.0が1個、COMポートソケット付きのASRock H110M-STX/COMもある。

またベアボーンキットには使われていないがチップセットをQ170に変えUSBが全て3.0でLANもvPro、TPM2.0対応のものになっているQ170-STXというモデルもあるようだ。

2.GIGABYTE GA-H110MSTX-HD3-ZK

マザボはGA-H110MSTX-HD3

Wifiは付いてないけどミニPCIスロットに搭載できるらしいし、USB-TypeCも付いている。

 

Mini-STXの良さは、Mini-ITxより小さく、モニターのVESAマウンタに付けてもよさそうなサイズなので、NUCの様にケースが小さすぎてCPUの熱が内部に籠りCPUファンが回りっぱなしということが少なさそうなところだ。実際にモニターのVESAマウントに取りつけるならPCケースに取り付けるケース専用のVESAマウンターが付いているもの選ぶ必要があるし、またそのPCケースの厚みが気になるので、スリムなサーマルファンと専用のPCケースの付いたベアボーンキットがあったらそっちの方がいいと思うので、必要なものが揃っているかアクセサリー等を一通りチェックが必要だ。

Posted in パソコン

【MSI】 GeForce GTX-1060 ARMOR 6G OCV1

No Comments »

1月 14th, 2017 Posted 00:10

やっと購入。

店頭には

GeForce GTX-1060 ARMOR 6G OCV1

GeForce GTX-1060 ARMOR 6G OC

があった。

見た感じ同じに見えたけど、裏面スロットの一番上のコネクタがOCV1ではHDMI、OCではDisplayPortなんだそうだ。

価格はOCの方が少し高かったのでOCV1の方をチョイスした。

FF14のベンチや普通にゲームを起動すると、グラボのファンが登坂路線を登り始めるトラックのような音を立てていたRADEON HD7950-DC2T-3GD5-V2からの換装は特に支障なく、電源やCPUのファンの音に隠れグラボのファンの尾とはほとんど聞こえなくなった。

ただ、うっかりDVIとHDMIの両方に繋いで起動したら、両方の画面が真っ暗になってしまった。ちゃんと正式ドライバーのインストを終えるまでは今でもモニターは1つダケ繋いだ方がいいらしい。そこで安全のためにUEFIの設定を初期値に戻したら、SATAがIDEモードになり、水色のinvalid boot drive(自動的に再起動します) 画面になり余計悪くなってしまったがAHCIモードに戻してOK。

記録を見ると、スコアはHD7950の2倍くらいかな?

 

ベンチだけならメモリ3GBのバージョンでもスコアがほとんど変わらないそうで、コスパ優先なら3GBの方がいいだろう。

しかし、よくプレイするFF-XIVは2~3か月に1度のアップデートに何某かの新装備(有料のオプションアイテムを含む)が入ってくるMMORPG風の着せ替えゲーである。

※画像の中のキャラの装備は特殊なものではない。一般的には今では普段着未満である。

パーティーを組むと面子が全員・・・半透明の回転パーツやキラキラなど描画処理の重いエフェクト満載の装備てんこ盛りな場合が多々あるので、グラボのメモリは1GBでも多い方がいいのだ。というか普通に自分のキャラで何かアクションを繰り出すと何らかのエフェクトが付いているので、自分の目の前で・・・画面いっぱいにエフェクトが広がる訳で、とても描画処理が重いのだ。それなのにパーティを組んでダンジョンに入れば、ひたすらアクションを繰り出す×面子の人数+でかいボスのアレなので、もっと処理が重い。

そのせいか、FF-XIVのSNSサイトLoadstoneに載っている日記には「さっきXXでパーティをご一緒した皆さんへ・・・ゴメンナサイ。パソが壊れたんですorz」の書き込みをよく見かける。

※本当にパソが壊れたのかは不明だが、何某かの支障をきたしたのは間違いないだろう。

久々にGeForceにしたせいだろうか?ベンチマークは最高品質の画面のハズなんだけど「普通の品質」に見えた。

FF-XIVクライアントのfps制限を解除すると、fpsの表示数値は100前後になり、ちょっと嬉しかったが・・・モニターが古いせい?慣れていない?せいなのかカメラを左右に回すとブレているような感じがするので戻した。GeForceの画風に慣れていないせいなのだろうけど、RADEONの標準品質=GeForceの最高品質な気がする。ザックリした言い方をすればマテリアの質感はRADEONの方がいいような気がする。それでもGeForceの最高品質の画面にすると家の床にうっすらと反射が見えるようになったのはやはりうれしい。性能は1060:1080=1:4っぽいので、1080なら質感も向上するのかもしれない。

白魔導士のホーリーのSEがRADEONではドガーンとヽ(`Д´)ノウルサイゾ!が、GeForceではボワーンとすこしまろやかな感じになってた。

ついでに、エアージェイ製の「スマーとフォン対応5000mAhポータブルバッテリー」機種:MB-S5000を購入。

SONYのSO-04Eとほぼ同じサイズで厚さ9mmの薄型。この類で「急速充電2A対応」と書いてあったのはコレだけだった。バッテリーとケーブルが分離しているので少し厚めだが、手元のcheero Power Plus 3 と比べると断然薄い。バッテリーとケーブルが一体化のものよりは長持ちしそうだし、iPadTouchにも使える。※別売りのLightningケーブルが必要。但し、使用方法はちょっと面倒。

電源ボタンを長押し⇒LED点灯⇒ケーブルをつなぐ⇒スマホにも繋ぐ。という手順になっていて、うっかり電源ボタンを押した場合を考慮し、電源ONからそのまま45秒放置すると電源OFFモードになるので、LEDが点灯したらUSBケーブルを手早くそして確実に繋がないといけない。

このバッテリーがヘタった頃にはAndroidも8が出ているだろうから・・・新しいスマホを買った方がいいんだろうなぁ。

GeForce GTX-1060の発売から半年後にやっと買った訳だけど、※待ってても・・・さっぱり値下がりしないからね(大笑

今度はAMDから次期グラボの新しいアーキテクチャのVegaが今年中にでるのかもしれない。どうやらビデオメモリをキャッシュとして扱うアーキテクシャーになるようで、データの保管場所はSSDでもNASでも構わないらしいからトンデモない規模のマップのMMORPGなんかも作れるのかもしれないし特に新装備が増殖し続けるFF-XIVとの相性は良さそうである。そうなるとCPUの出番はゲームクライアントのインストや起動、クライアントのオンライン・アップデートぐらいなのでCPUはAtom級で十分になってしまうのかな?

CPUやグラボを買い換えてもモニター(Acer製 24インチモニター:AL2423W)はそのまま だが、バックライトが冷陰極管なので消費電力88Wと大きく触ると暖かい液晶モニターは今時分存在しないだろう。2006年発売だから10年になるのかな?

Posted in パソコン

【Visual Studio Community 2015】ClickOnce: signtool.exe not found

No Comments »

1月 7th, 2017 Posted 00:23

VisualStudio 2015 では、作ったアプリの配布方法には3通りの方法があるらしい。

1.XCOPY

Windowsのバージョンやサービスパックの入り具合でプレインストされるMFCや.Netのランタイムがバラバラなので、EXEだけコピーしただけではまず動けないのでEXEを起動するとマズ・・・ランタイムのダウンロードが始まるハズ。成功したらやっとEXEの画面が見える。

2.Windows Installer

VS2015の製品版のみ「その他のプロジェクトの種類」に「セットアップ/配置プロジェクト」 があり「Visual Studio インストーラー」が使用可能、VS2015 Comunityには勿論入っていない。

3.Click Once

VS-CommunityのVBプロジェクトは1個のEXEしか配置できないようなので、発行先をファイルサーバーにしてアプリの更新機能を使いたい場合ぐらい。そのせいか、普通にDLしてインストしたVS2015 Comunityでは署名ツールがインストされていない。うかつにClick Onceするとビルドの度に「署名ツールが見つからないエラー」に遭遇するハメに遭う。別途Windows SDKを入手しインストールするのも手だが環境変数のPATHに追加しておく必要があるので、コントロールパネルからVS2015 Comunityをクリックしてインストーラーを起動し、ClickOncePublishing Toolsにチェックを入れ追加すれば、何事も無かったかのようにビルドできるし、【今すぐ発行(N)】ボタンも成功する。

できあがり・・・

そのままSetup.exeを実行するとインストできたらしい。

起動してみると

難点を云えば、Click Once の設定をチョット変えるだけで、2度目以降のインストールに成功しない可能性が高い。例えば、バージョンの発行のチェックボックスを外してもう1度【今すぐ発行】ボタンを押すと、アンインストール後も「インストール済みと判定」されもう二度とインストできない。その場合は、バージョンをカウントアップしたりテスト用の証明書を作り直したり成功するまで試行錯誤を繰り返すことになるので、ClickOnceはうかつに触らないほうがいい。

 

ま、そんな感じなので、EXE+設定ファイル+CSVとかMDBと諸々のファイルがいくつも必要なアプリの場合は、小さな解凍EXEを作りこれにZIPファイルをくっ付けて、解凍EXEを起動したらくっ付けたZIPファイルを剥がしてファイルに分離し読み込ませて解凍させてもいいのかもしれないが、今どきは何かのウイルス監視ソフトが誤作動しかねないのでそんなことはせず、フリーのセットアップ・アプリやZIPツールの自己解凍EXEなどの方が安心でき使い勝手もよさそうだ。

 

もっとも、今では

見知らぬ人が作った見知らぬアプリをインストールするのはとても危険なこと

なので、インストーラ自体不要なのだろう。

Posted in パソコン

あなたへのおすすめ

No Comments »

12月 27th, 2016 Posted 22:22

ネットの記事サイトのスポンサーリンクに多いタイトル

「あなたへのおすすめ」

その先頭に

があった。
※URLはリンク先のページです。
だが、
予約して既に
一ヵ月も経っている。
最初の発売日の予定は夏だったような気がする。
そのリンクを押すと、
「お使いのPS4にダウンロード」ボタンがあったので押してみるとPS4が起動しHDDも反応。
そのページの表示が【ダウンロード待機中】に更新される。
もちろん、発売日の自動ダウンロード設定がされただけだ。
発売日(2017/1/19)まで残り1カ月ぐらい。

Tags: ,
Posted in ゲーム

大雪

No Comments »

12月 23rd, 2016 Posted 22:24

スマホを見るとyahooから傘のマークの大雨警報が出てました。

でも町中より少し高めの場所に住んでるせいか、家の近くは昨日からずーっと雪が降り続いてます。

今週は暖かかったので先週降った雪は大方除雪したのですが、今日1日で家の裏手は屋根から落ちた雪で1階まですっぽりと埋まってしまい一階の軒下まで雪が積み上がってしまいました。

バス路線の道路も道路にはみ出した雪の山で所々片側通行。

クリスマスのシーズン中なので夜の雪が降る景色や屋根の雪がササーと音を立てて落ちるのは雰囲気があっていいとは思うけど、

日中は、ただの吹雪にしか見えません。

なぜか日中は屋根の雪がドドーと音を立てて落ちますね。

オマケに、コンビニまで外に出向きだけで全身真っ白。

どう考えても降り過ぎです。

※翌日のニュースを見てたら、降雪1mオーバーだったらしい。

来月にAUの回線工事するハズだけど

晴れるといいなぁ・・・orz

Posted in 未分類

構文解析と云えば、BNF か ABNF か EBNFかな?作れたのは字句解析まで・・・orz

No Comments »

12月 21st, 2016 Posted 02:17

JavaScriptでRegExpだけで ソースコードの構文を構文解析しようとすれば、すぐに無理が来る。

昔から構文の説明する時にはBNF(バッカス・ナウア記法)が使われてきた。

ABC ::= A B C

な感じの書き方なので、本当に難しそうな文法の教科書向き。

しかし、繰り返し表現が無く

数字 ::= 0|1|2|3 ... |9

数値 ::= 数字, 数値 | 数字

の様に再起表現に頼らざるを得ないので、どうしても説明が長くなるが、右寄せあるいは左寄せのいづれか一方のみの再起表現を使用すると制限を加えればパーサーは作りやすい仕様になっている。

EBNFは、

ABC = "A" , "B",  "C" ;

な感じに書き方で、{ …} な繰り返し表現もあり、簡単な表現でパーサが書けそう。

本のBNFの記述でも {...} は0回以上の繰り返し可能なブロック、[...]は省略可能なブロック な表現を見かけたが、そう云うよく見かける拡張機能を組み込んだのがEBNFなのだろう。

XMLの文法を表現するために作られたという話もあるし、

誰もが心の中でBNFを勝手に拡張しているのは間違いない。

ただ、拡張の仕方は皆バラバラで方向性もマチマチなので、BNFを規約という形で拡張する様なことはC++の規約化と同様に「厳密にイミフな表現が可能」になり、愚の骨頂と云える様な結末に至るだろう。

※UTF-8で多国語のテキストを1つのHTMLにまとめることが出来るようになった、だからと云って万人がそれを読みこなせるハズも無く、多国語テキストの方向性に使い倒せるの人は極わずか人ダケということだ。

ABNFは、

ABC = %65  %66  %67 ;  コメント

な感じに書き方で、主に通信プロトコルの説明に向いているそうだ。

確かにアナライザーのログとにらめっこをするなら A や 漢 の文字表現より、 コード表現の方が便利そうだ。

・・・

まじめにパーサを作るならいづれかを選択するのが筋だろう。

でも、JavaScriptのRegExpのexecを字句解析に使う場合には

一般的なパーサの文法に縛られる必要な無いので、

"%%"

事前に定義したいJavaScriptのソースのコード

"%%"

トークン名=    (?: ("/" RegExpの字句解析のパターン "/")  | ( トークン名) ){1,99}   ";"  "%%" returnでパーサーに答えを返す処理 "%%"

※RegExpの字句解析のパターンを複数書く場合はスペースで区切る。

※トークンの構文に対応するJavaScriptのソース;では字句解析のパターン中の(...)に対応する変数$1...$99 や $_や$@なども使える。

※少し工夫すれば、xxx: ([A-Z0-9_]+) ;  シンボル { return $1; } と書いても何とかなるハズ。

※処理を"%%"で括るのは、RegExpの/mでやっつけで処理したいから・・・(笑

・・・で、十分な気がする。

鋭意作成中・・・

謎の現象が発生。

1.{ 処理・・・処理 }

正規表現 (\{)((?:\\\{|\\\}|[^{}])+)(\}) が

1個目の{ ~最後の} までを処理してしまい、

"{"、その他、"}"、?EOT? と、解釈してしまった。

処理の結果は不可解だけど、

このパターンなら、途中の}に目もくれずできる限り遠くの}まで探索してくれることを覚えておいて損は無いだろう。

とりあえず、 (\{)([^{]+)(\}) で済ませたが、(\\{)((?:\\\\}|[^\\}])*)(\\}) が正解のようだ。

$1...$nに割り当てない文字のグループ表現(?: ... )を使い、

}のエスケープシーケンス または }以外の文字を (?:\\\\}|[^\\}]) と表現すれば * で繰り返せばOK

2./RegExpのパターン/

(\/((?:\\\/|[^\/])+)\/) が1と同様に、

1個目の{ ~最後の} までを処理してしまい、

"/"、その他、"/"、?EOT? と、解釈してしまった。

とりあえず、 (\/([^\/]+)\/) で済ませるがが、やはり、(\\/)((?:\\\\/|[^\\/])*)(\\/) が正解のようだ。

3.字句解析の2周目の結果が・・・

NULL・・・NULL、""となって、無限ループ。

とりあえず、

最初にNULL以外で見つかった字句が空文字列の場合は

無視してlastIndexを1文字進める。

・・・

※正規表現の\\が多いのはnew RegExpのパラメータの文字列として組み込むため、\単体ではjavascriptのテキストのエスケープシーケンス扱いになるので\\と書いて\の文字扱いしてもらうため。

4.改行が空白として処理される

改行より手前に空白のトークンを宣言すると、空白扱いになっていたので、順を入れ替える。

正規表現を1つにまとめexecの結果で最初に文字列が入っている位置でトークンを分類する場合、トークンの順番を入れ替えるとexecの結果も入れ替わるので、各トークンの正規表現のテストパターンをトークン登録前のチェックでexecの結果の長さから、推定できるようにメモを取っておく。

やっと変な挙動の症状は落ち着いてきた。

最初は、{ 処理リスト } としていたが、処理リストの中のの{や}を¥{、¥}で書くのはやはり面倒。

{{処理リスト}}に変えてみると、”{”演算子が反応してしまったので・・・

%%処理リスト%%に変えてたのが・・・

想定外の文字列が混入していてもRegExp.exec( ) は、ガン無視するので

トークン:「その他」を追加。

RegExpの説明を読んでいると、

/<.*?>/ は "<foo> <bar>" の "<foo>" にマッチしますが、/<.*>/ は "<foo> <bar>" にマッチします。

というのを発見。.*の使用は要注意らしい。

もっとも、パターンの末尾以外に .* を使うと最後まで突っ走りそう、しかも今回はregExpのマルチラインモード(m)なので実質的に .* の使い道がないと思ってたので[^ストッパー文字]*[ストッパー文字]な感じに書いているので .*?[.*を止めるストッパー文字] で済むならストッパー文字を2度書きせずに済む。

但し、"*****************" は、'(".*?")' と書けそうだが "********\"*********" で破綻してしまうので、'(\\"(?:\\\\"|[^\\"])*\\")'になっている。

各トークンの情報は格納できるようになった。

しかし、各トークンにパーサーの処理を組み込もうとするとやはり難しい。

トークンの名前が = の左側か右側かで、やるべきことが違うからだ。

なので、

1.RegExp.execでトークンに分解。

2.各トークンの処理はセルフチェックに抑える。

3.下記のEBNFの文法を・・・

%%処理リスト%%

トークン名宣言= (引用符文字列 | 正規表現 | トークン名参照) { 演算子   (引用符文字列 | 正規表現 | トークン名参照) }  ";" %%処理リスト%%

・・・

トークン名宣言= (引用符文字列 | 正規表現 | トークン名参照) { 演算子   (引用符文字列 | 正規表現 | トークン名参照) }  ";" %%処理リスト%%

サブルーチンの呼び出しで、なぞっていくことにする。

そうすることでトークン名を宣言版と参照版に事前に区別して呼び出すことができるからだ。

と大きく路線変更を決めた様な気がしたけど

トークン情報のリストに【メタな表現】のトークンが増えるだけなんだなぁ~(笑

4. 連想配列を多用していると、急にJavascriptが無効化される

とりあえず、jQUeryの初期化処理に $('#result').val("- - -"); を入れてJavascriptが無効化されたら何も出ないので判るようにした。

よーくみると、

{

'name':   null,

'pattern':     /RegExp/g

}

のハズが

{

'name':   null;

'pattern':     /RegExp/g;

}

と区切り方を間違えていた。

ブラウザのコンソールにエラーが出ないので、原因を掴むのが結構面倒。

根本的な原因はJavaScriptのどこかにtry...catch...を書くと、開発ツールのコンソール・タグに文法エラーすら出てこなくなる様だ。

なので、出来るだけtry...catch...をあてにしない様にしないと、括弧の付け忘れすら見つけるのが大変だ。(大笑

もっとも、それが原因で文法チェックしかできなくていいから自作のパーサーが欲しいなぁと思ってしまったんだけどね。

こうなると、行数がどんどん増えてくると、ケアレスミスすら捕まえるのが難しい。

トークンのパターンの括弧の扱いをどうしようか・・・のあたりで諦めた。

try...catch 無しで考え直すしかなさそう。

だが、他にも

コピペしたコードの消し忘れで

var msg = 'message' : "...";

と 妙なところに : を書いてしまったり、

EBnf.prototype.parseEbnf = function(grammer) {

の最後の { を付け忘れても、ダンマリ(JavaScriptが動かない)ケースがあった。

また、とりあえず一時的にtry...catch を無効にしたい場合は

//    try {

・・・

/*   }  catch (ex) {

・・・

      }  */

が手っ取り早いが、

/*%%    try {   %%*/

・・・

/*%%   }  catch (ex) {

・・・

      }  %%*/

と*を*%%などあまり使わない表現を混ぜるとテキストエディタの正規表現検索で探しやすく、戻し忘れも防ぎやすいでお勧め。

そんな感じなので、ケアレスミスのチェックに手間取り、パーサーの進捗ははかどっていない。

まだまだ完成には程遠いが、ソース中の正規表現だけはすぐに使い回しが利きそうな気がしているので、EBNF書式のテキストを色付けするだけのサンプルを残す。

字句解析しかないけど・・・

字句解析しかないから、

しっかりとRegExpのパターンを作り、適切な登録順で組み合わせれば、

JavaScript用も作れるハズ。(大笑

selfCheckの呼び出しもRegExpのパターン情報をコピーしたtknを呼び出し、

rc = tkn.selfCheck( this, tkns[offset], tkns[offset+1], tkns[offset+2] );

と変えたので、特定の用語だけ色を変えることも可能なハズ。

想定外のパターンに出会えば【その他】が反応し、背景色:赤、文字色:黄で派手にしてあるのでデバッグも容易。(大笑

/* ... */ なコメントも追加。予想通り /RegExpパターン/が先に反応したので それより先に配置。コメント解析がいくつもあるのも嫌なので、( //...  |  /*...*/  |  (*...*)  )を1つにまとめてみると

(/{2}.*$|\\/\\*(?:\\*(?!\\))|[^\\*])+\\*\\/|\\(\\*(?:\\*(?!\\))|[^\\*])+\\*\\))

コメントを判定するダケの正規表現なのに・・・明らかにイミフだ。(大笑

ソース・コードのコメントに色付けしたいダケ

なら、

ソースコード.replace(

/(/{2}.*$|\\/\\*(?:\\*(?!\\))|[^\\*])+\\*\\/|\\(\\*(?:\\*(?!\\))|[^\\*])+\\*\\))/mg ,

function ($0,$1) {

  return "<span style=\"color=#00ff00\">" + $1 + "</span>";

});

とでも書けばいいのかな?

コメントの種類ごとに色訳けしたいなら

ソースコード.replace(/(/{2}.*$)/mg ,function ($0,$1) {

  return "<span style=\"color=#00ff00\">" + $1 + "</span>";

}) . replace(/(\\/\\*(?:\\*(?!\\))|[^\\*])+\\*\\/)/mg ,function ($0,$1) {

  return "<span style=\"color=#0000ff\">" + $1 + "</span>";

}) . replace(/(\\(\\*(?:\\*(?!\\))|[^\\*])+\\*\\))/mg ,function ($0,$1) {

  return "<span style=\"color=#ff0000\">" + $1 + "</span>";

});

とreplaceを結合すればいいのだろう。

※コメントはよく行をまたぐので、最後のは必須。

これでもいいのかもしれないが

こんな風にRegExpで頑張るよりも

パーサー・コンビネーターで、

ノソノソと解析させた方が可読性は格段に高いハズ。

字句解析を連想配列化しているが、構文解析はついついハードコードしてしまい1000行オーバーな雰囲気から抜け出ないので連想配列化した方がいいのかな

{

name:  式,

pattern:    "項 [ 演算子 式 ] | '(' 式 ') '",

testpattern: "1+2",

proc: function(p1,p2) {

return  p1+p2;

}

}

な雰囲気で並べて動かせばゴソっと行数は減るような気もするが、構文パターンの中の演算子" | "やグループやオプション表現はやはりハードコードになるのかな。勿論、このpattern用の字句解析の連想配列も作っておこう。

【IO DATA】 無線ルーター WN-AX1167GR

No Comments »

12月 20th, 2016 Posted 23:20

今は家のネットのプロバイダはIIJだがゴールデンタイムは2~3Mbpsと非常に重いのでソネットに変更する予定。

その重い原因がネットの回線のせいかもしれないので回線もFLETSからAUに変更する予定。

※2017/1/5: ダウンロードが30Mbpsと10倍。我慢の末、同じ方向に舵を切った人が多いのかな?そう考えると、切り替えすると悪化する可能性がある。

スマホはバッテリーが異常なほど減るので、1月にはZenFone 3 Max(ZC520TL)か FreeTelのRAIDEN に変える予定。

しかし、AUのルーターの無線は非力らしいので無線ルーターは自前で揃えることにした。

ドレも似たり寄ったりなので、パッケージの【ルーター選びに迷ったらコレ(^^b】が決め手になり・・・

今回はIO-DATAのWN-AX1167GRにした。

詳しいことはオンラインのマニュアルを見る様だ。

壁掛け方法

詳しいことは、オンラインマニュアルを読んでやるらしい。ネジは見当たらなかったが、ココを見ると「ネジは添付していません」と書いてあった。

本体と分離してる脚を壁にネジ止めし本体を脚に差し込んで固定する方法なので、「LANケーブルなどをひっぱったりして本製品に力がかかると、スタンドが外れる恐れがありますのでご注意ください。」と注意書きもあるし、地震の揺れで無線ルーター自体が落下しても別段不思議ではないので、今回は壁掛けを見送った。

ルーターモードとAPモードの切り替え

FLETSのルーターに繋ぐとソコからDHCPのIPアドレスを貰い自動的にAPモードになるようだ。

コッチに無線接続したスマホもFLETSのルーターからIPアドレスを割り当てるようになった。

以前のエレコムの無線ルーターは注意深く真に正しい手順を探し出さないと、ルーターモードとAPモードの切替えと再起動を繰り返すハメになったので、コレは便利だ。

BUFFALOにもAPモード状態の無線ルーター用の設定アプリがあるがルーターモードとAPモードの切替えは手動だった。新しいモノならこっちのメーカーも自動で切り替わるんだろう。

古い無線ルーターをタダで貰ってAPモードの設定で苦労するより新しいものを買った方がトラブルが少なさそう。

取説にはIODATAのAPモードのルーターを探すアプリMagicalFinderのリンクはAppleStoreとGoogleStoreのみだ、ググればPC版も見つかるが、インストしてみるとデスクトップの「mfinder314」フォルダにインストールしてしまうから、デスクトップのフォルダアイコンが行方不明になると厄介なので中のINSTALLフォルダのSETIP.EXEを起動しよくあるようにC:\Program Files (x86)\I-O DATA\MFINDERにインストした方が安心。但しそこまでやっても、ルーターにメーカーの異なる無線のAPが2つブラ下がっている状態なせいか、無線ルーターを発見することはできなかった。無線機器のメーカーの混在は今も面倒がかかるものなのかもしれない。

スマホの接続

Google Playから2つのアプリをインストする。

  1. QRコネクト
    1. インストしたらアプリを起動して付属のQRコードのシートを読ませるダケ。
  2. Magical Finder (同名のアプリがいっぱいあるので、注意深くIO-DATA製のアプリを選択する)
    1. ルータの管理用のアプリなので自分用だけでいい。
    2. なかなか認識しないので、検索されるまで気長に待つコト。
    3. 認識されたら、【無線ルーターの設定画面】へ進むと、ブラウザに無線ルーターの設定画面が表示するので、気ままに設定可能。

ポート開放も可。

そんな感じでカンタン操作で済むが、LTE接続のスマホかタブレットが無いと、無線ルーターが不調になった時にマニュアルすら見れなくなるので、故障した途端に途方に暮れそうだ。

※IODATAのDDNSサービスのiobb.netの設定はあるが、ルータータイプのモデムに接続する場合は使えないっぽい。

 

 

【javascript】 RegExp 正規表現

No Comments »

12月 16th, 2016 Posted 00:32

よく "20161216010203".replace(/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/g,"$1/$2/$3 $4:$5:$6");

などどダラダラな使い方をしてしまうと

もう正規表現とはいいがたい。

var reg = new RegExp("\(\[0-9\]\{4\}\)\(\[0-9\]\{2\}\)\(\[0-9\]\{2\}\)\(\[0-9\]\{2\}\)\(\[0-9\]\{2\}\)\(\[0-9\]\{2\}\)", "g");

var mat = reg.exec("20161216010203");

しかもパターンをjavascriptのリテラルとして指定するとエスケープシーケンスで更に長くなって訳が分からなくなる。

字句解析した部分:mat[0]、年:mat[1]、月:mat[2]、時:mat[3]、分:mat[4]、秒:mat[5]

など・・・となるはずなんだけどなぁ・・・

その度にスクラッチするのも面倒なのでデバッガを作ってみた。

 

ちまちましたパターンのデバッグに丁度いい。

 

複数のパターンを書けば、 | で繋いで、字句解析する様になっているものの・・・

パターンの長いものを先に書かないと、短いパターンが優先してマッチングしてしまい不調。

各パターンが括弧で括る(・・・)なパターンを想定しているので、上の様な場合は、複数のパターンを書くと、うまくいかないので、

デバッグ・ログ出力のチェックボックスを追加した。

これで、$0,$1,$2・・・$n の出力の雰囲気も判るハズ。

 

で、VisualStudioのC#のForm1.Designer.csを読取り

1つづつトークンと正規表現を増やしていく・・・

COMMENT:    (/{2}.*$|/\*.*\*/)
REGION_B:   (\s*#region\s+[a-zA-Z0-9]+.*$)
REGION_E:   (\s*#endregion$)
SPACE:      ([\s]+)
L-BRACE:    (\{)
R-BRACE:    (\})
L-PAREN:    (\()
R-PAREN:    (\))
COMMMA:     (\,)
DOT:        (\.)
BINOP:      (\|\||&&|!=|==|\+|<=|>=|-|\*|\/|%|=)
DELIMITER:  (;)
NULL:       (null)
VALUE_TYPE: (void|integer|bool|string)
SCOPE:      (public|private|friend|static)
THIS:       (this)
NEW:        (new)
BOOL:       (true|false)
SYMBOLE:    ([a-zA-Z0-9]+)
NUMBER:     ([1-9]\.?[0-9]+)

この辺から急に重くなりだす。

暫くすると

メモリーガーとか言い出す。

LITERAL:    ('[^']*')
WQLITERAL:  ("[^"]*")

まで来ると、

字句解析させてみるとタイムアウト。

matchならあっという間などど思ってたら、

実は,解析結果の出力方法が・・・

for ( var idx in tokens ) {
log( idx + " type:" + tokens[idx].type + ", token:" + tokens[idx].token );
}

だったせい。

このlog(msg)は間に合わせに作ったログの書き出し処理で

中身は・・・

function log(msg) {
$('#result').text($('#result').text() + msg + "\n");
}

Form1.Designer.csを字句解析すると7000個以上のトークンに分解できるが

そこまではexecもmatchに瞬時。

しかし、DOM要素を7000回も読み書きしていたので

とても時間がかかっていたのた。 orz

ついでだから50%増速モードに変更。

var msg="";
for (var idx = 0; idx < tokens.length; idx++) {
msg += idx + " type:" + tokens[idx].type + ", token:" + tokens[idx].token +"\n";
}

log(msg);

これで、劇的に早くなりデバッグも容易になった。(大笑

ま、トークンが22種類になり$1~$22となってしまうと、$9までの制限があるreplace( ) はそのままでは使えなくなるけどね。

とても、がっがりしたけど、

Form1.Designer.csの字句解析まではサクっと終わるから、

後はちゃんと文法にまとめ、HTMLのフォームに変換すれば、VisualStudioのC#のWindowsFormフォームをブラウザに写し取れるハズ。

勿論、その逆も可能なハズ。

※実はここが重要だったりする。

と云うのも、VisualStudioのフォーム・エディタで編集するとプロパティをちょっと追加しただけでテキストの順序が結構移動するので、svnの差分エディタを見るとウンザリする差分ができあがるのだ。

ここだけちょっと何とかしたい。

華麗でなくていい、綺麗にそれなりに自力でソートできるだけでも十分実用的じゃない?

でも、出来上がった正規表現パターンは訳が判らないなぁ~(爆笑

to be continue...

 

[jQuery]ファイルをドロップすると

No Comments »

12月 14th, 2016 Posted 22:57

ブラウザにファイルをドロップすると、ファイル・ビュワーがファイルの中身を表示してくれる。

あえて、自前でやるサンプルを見つけた。

文字とか背景の色を変えてみたけど

文字と背景の色の組み合わせが超難しいw

JavaScriptの正規化表現の部分が化けやすいw

コメント部分の予約語がヒットしてしまうw

色だけに、色々ある(笑

Posted in jQuery