変奏現実

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

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

インターネット

【postfix】 mailbox_size_limitなんてあったのか?

message_size_limitを10485760 から 102400000に変えた後暫く経ってみると
メールがまた届かなくなっていた。
勿論そんなに大きいものは、このブログのDBバックアップだけだが、全部留め置かれたらしい。
maillogを見ると、
Apr 15 13:52:55 ssiscirine postfix/local[4803]: fatal: main.cf configuration error: mailbox_size_limit is smaller than message_size_limit
あたりから一気にmaillogのサイズが急増していた。
main.cfにmailbox_size_limitの設定は無かったので、mailbox_size_limit  = 102400000 を追加してservice postfix restart
先のログが出た後の分のメールが届いた。
cron や anacron が

Not using downloaded repomd.xml because it is older than what we have:
とか色々。
早速、yum update
以前は勝手に自動UPDATEしてた様な気がするが
今は、自動DOWNLOADだけやってメールする慎重派に変わったらしい。
と云うのも、
yum --enablerepo=epel update phpMyAdmin(4.4.1.1)は失敗作らしく
あちこちでJavaScriptエラーを吐きだしてくるのだから。
※JavaScriptエラーはFireFoxのキャッシュ不整合が原因だったらしい。Firefox のリフレッシュ機能で治った。
そして、それ以前(~4/15)のものはメッセージも出さず、そのまま闇に消えたようだ。


MS-SpiritなMS-Splitと普通のsplit

javascriptでsplit(“,”)とすると、
“A,B,C,D” も”,,,”も4つの要素を持つ配列になる。
しかし、昔(VB5~)からMSのBASICのSplitが空要素を削除するのが習わしになっているので、”,,,”は要素0個の空配列になってしまう。
なぜそうなったのかは、容易に想像が付く。
A   B          C      D   E
A   BCG      CODE    D   E
A   BASIC   C       D   E
の様にデータの要素のカラム位置を綺麗にそろえると空白が並ぶ、
これを普通のSplit(” “)で処理すると、予想外の空データが挟まってしまう(しかも大量に)ので、
安易(便利なつもり)にMSのSplitが空データを挟まなくなったのは間違いないだろう。
勿論、このような特殊なケースだけは、非常に便利だが・・・
※なぜ特殊なケースだけかと云えば・・・
A   “BCG      CODE”    D   E
とか
A   “”””  C    D   E
が期待されるような結果が出るとはとても思えないからだ。
CSVでは、よく見かける

A, B, C, , , w, , ,Z

と云う様によく見かける『簡単なデータを簡単に処理できない』のがMSのAPIの特徴である。
中にはStrConvの実装が当初、「ア⇒ア」はバッファが1バイトしか用意していないため””(空文字列)を出力するので、「アア⇒ア」としないいけない欠陥が長く続いたが、MS内部でも不都合杉だったようで、こっそり手直しされた例もある。
※Windows7にVisual -Studio 2008+SP1+SQL Server Express 2007だけをインストすると発生するが、例えば、古いAcrobat Readerの様に、扱いやすく手直し(Bugfix)されたランタイムをWindowsに上書きしてくれる便利なものをインストすると、StrConvが便利になり、アンスコしても元には戻らないところがとてもいい。
※もっとも今では巨大企業のORACLEのODBCドライバーもWindows95全盛期は、SELECT * FROM A WHERE ID<100 程度を想定していたらしく、EXCELからINSERTの様な長いSQL文を送信するためには語彙(WORD)が256バイトの境界を股がない様に調整しなければならなかった。後に1パケット(4KB)境界と緩和された代わりにMAX64KBのスタックの大半を使い切る悪魔で、32ビット版WindowsまでTCP/IP版はその道のプロでも使いたくないシロモノだったりとか、LANカードごとにTCP-IPドライバーが別もので、同じ会社でも別商品なら2枚差し不可とか、そのドライバーの中にC:\{メーカー名}と直書きされていてPC98シリーズ品なのに使うにはドライバーをMS-DOSのデバッガでA:\と書き換えなければいけないとか、16ビットWindowsの頃はどの会社もトンデモ品ばかりで、そんな苦労に明け暮れる日々だった。(合掌
※更に付け加えるなら、.Net、SilverRight、XAML、WPF、Windows8.xなど中途半端な実装に踊らされている現在も同様に進行中ということだ。後何年かするとバカバカしい苦労でしかなくなるのだ。(メデタシメデタシ
しかし当時のMS-BASICには普通のSplitと同じ仕様のREAD文があり、特に支障は無かったのだが・・・・・・・・・・・・・・・・・・・・・・・・・・
現在はDATA文などと一緒に抹消されている。(便利なものは真っ先に抹消される法則
これらはVB6から.Net-BASICへのソースの移植が困難を極めた要因の1つであり、一字(ちょっとした仕様変更)が万字(沢山のソースコード)を駆逐(ゴミ)にするMS悪仕様の原点と云えよう。
言い換えれば、継ぎはぎだらけのAPIで成り立っていたVB6を.Netにコンバートなんて、まっとうなモノができる訳がなかったのだ。
実際、VB6から.Net-BASICへのソースのコンバートはMS自身が真っ先に投げ出しており、MSコンバータをアテにしてコンバートを請け負った会社がどれだけ酷い目にあったかは想像もしたくない。
現在でも、JScriptのSplitは、そのよう(MS流)になっている。(大笑
最近の類例では、Windowsのスタートボタンを取った!などがある。(便利なものは真っ先に抹消される法則



インテル Compute Stick

Windowsなら32Bit版でもいいなら、Atom Z3735Fでもいいのかもしれない。
※一部の重~い開発環境を除く。
INTELもnucより小さいスティックタイプのパソコンを出してきた。
今時のAtomはUSB3が使えず、いくらSSDよりトロいとは云えHDDもUSB2で接続するのは辛い。
だから、NASかオンラインストレージ(OneDriveやDropBox)を使って他のパソコンやタブレットなどと連携した方がいいだろう。
本体のmicroSDはスマフォにデータを渡すため、USB2はUSBメモリかLogcoolのUnifyingレシーバー専用と思っていい。
それに、HDMI出力付きのWindowsタブレットを持っていれば、特に必要はないけれど、壊れた時の予備として確保しておくのは悪くないかもしれない。
そして、家の誰もが好きに使える様にしておくと、youtobeのURLをこのスティックパソコンで見れるメアドに送っておけば、気が向いた時に大きな画面で動画が観れるのは楽しいかもしれない。
難点を云えば、テレビが、1画面に2つの画像入力を同時に表示する機能がないと、テレビの番組やCMの情報を見ながらメモを取って、このスティックパソコンで検索したりその情報をメールしたりするのはメンドクサイから、結局は、スマフォやタブレットも必要になってしまうかもしれない。
一方、仕事場のパソコンの大半がこのスティックタイプのパソコンに変わってしまうかもしれない。古いパソコンは、電力の大食いだし、発熱も音も酷く、いつも不機嫌で、HDDがイライラ音を立てるので、コレに交換してしまった方が電気代も場所も食わないし。高価なnucと違ってVESAマウンタ付のディスプレイも必要なく、本体も安価なので大助かりかもしれない。実際、LANで共有するNASがあれば1つ1つのパソコンに何TバイトのHDDを必要とはしなくなくなっているし、持ち運びに便利で場所を取らないハズのノート型パソコンが机を独占している状況が変わるかもしれない。
問題は内臓の32GBのeMMCにWindowsと一緒にMS-Officeが入るかどうかかな?
何だかんだで、ボクの小容量(256GB SSD)Cドライブの使用量は90GBにもなっている。
ユーザ領域が12GBもあった。半分はAppDataフォルダ(通常は隠しフォルダ)なので、意外とキツイのかもしれない。(笑
いづれにしても、
1TBぐらいのHDDがあって当たり前に思っているMSが、
Windows10をリリースした後に
いつもの調子で、延々と大量のアップデートをWindowsUpdate経由で垂れ流し
たった32GBのeMMCをアップデートのインストーラで埋めつくしてしまのに何か月?(何日?)かかるのか?
と云うあたりが試金石になるだろう。
ps.
2015/04/22 USB2×2口のスティック型パソコンをドスパラが発売。不意のリセットが起きるかもしれないけど、1口よりは・・・(ニヤ



【白旗】chipset 用ドライバのダウンロードおよびインストール あるいは Service Unavailable

Windows 8.1(64bit)のデスクトップのトレイアイコンに白旗が掲げられている。
ここをクリックすると、
ずーーーーーーーーーーーーーーーーーーーーーーーーーーーと
応答なし
やっと、何か出たと思ったら

chipset 用ドライバのダウンロードおよびインストール

chipset のドライバが適用されていません。
ご使用の chipset のモデル名は Intel Smart Connect Technology です。

タップまたはクリックして Intel Corporation の Web サイトから新しいドライバーをダウンロードタップまたはクリックして Intel Corporation の Web サイトから新しいドライバーをダウンロード

そしてリンク(https://downloadcenter.intel.com/download/20866)をクリックすると

Page Not Found

なので
その様になったと
カキコして
「メッセージの詳細」画面の【送信】ボタンを押すと
 

Service Unavailable


HTTP Error 503. The service is unavailable.
と出る。
 
もう3回目なので、
画面左上の「↑」を押して「アクションセンター」に移動し、「アーカイブ」のボタンを押して
 

忘れることにした。



[Jetpack モニター] サイト ssiscirine.perma.jp がダウンしていたようです。

ウザイ奴がPOST /xmlrpc.phpを雨の様に連打してくる度に、Celeron 847のCPUファンがフォンフォンと唸りをあげる。
cpu-day
IPアドレスを調べてみると、国籍も管理者も不明なIPアドレスだった。
現在、管理国単位でDROPしているのは CN、CA、IR、NL、TW、IQ、UA、RU、DE、BO。
そのPOST /xmlroc.phpが、誰かさんの気に障ったらしく、しつこく/var/www/cgi-bin/の下を手当たり次第に叩いてくる。
※このnucはインスト直後から/var/www/cgi-bin/ディレクトリィは空っぽです。
どうやら、他人どうしの喧嘩に巻き込まれたらしく、両側から叩かれる可哀想なCeleron 847。
httpdのconfで嫌なipアドレスをドンドン追加して、はじいているウチにApacheがInternal error(設定大杉!)を引き起こす始末、元に戻すと、翌日の再起動には、また奴がやって来る。
そんな訳で、jetpackモニターに時折応答できない日々が続く。
ps.
あまりにもウザイ /xmlroc.phpなので、
/xmlroc.php は httpdのconfでローカルLAN仕様に、
そしてIPアドレスは  iptables  の deny_ip の初登録となりました。
ps.2
ポート80は、DROPの設定が大杉なので、
echo “-A INPUT -p tcp –dport 80 -j ACCEPT_COUNTRY” >> $IPTABLES_CONFIG
でいいよね?(変更済



prototype と static

javascriptでクラスっぽいものにしたい場合
メンバーをprototypeにメンバー関数を追加する。

sjis.prototype.xxx = function() {
alert("OK");
};

ところがこの宣言したメンバーをメンバーから参照すると

sjis.prototype.yyy = function() {
xxx();
alert("OK");
};

とundefinedとなってしまうことがある。
通常のfunction 定義は、jsファイルを読み切ってから実行するので参照先は後に書いても問題ないけど、
無名関数の場合は、その場で組み込んでしまうようで、参照するメンバーは先に記述しないとダメらしい。
 
クラス宣言っぽいことはできるけど
private、protected、staticなメンバーは作れないのも痛い。
それっぽいやり方はいくつか見つけたけど
基本は、prototype に入れる方法なのでチョット扱いが大変。
それくらいなら、
var   クラス名_STATIC_メンバー名=null;
と書いた方が楽。



デスクトップに貼ったJSからSJISのCSVをダウンロードさせてみる 改訂2018/10/2

サーバーサイドでSJISにエンコードすること自体どうにでもなる。
しかし、デスクトップにHTMLとJavaScriptだけ貼ってローカルにあるテキストをCSVファイルとしてダウンロードさせようとすると、
JavaScriptのテキストはUnicode(16Bit)なので、そのまま出力するとEXCELで読むと文字化けする。
JavaScriptでは、SJISをUnicode(16Bit)に変換する機能はあるが、Unicode(16Bit)をSJISにする機能は無い。
JScriptならWindowsのドコかにStrSonvがあれば拾って来ればいいのかもしれない。
今風なら既に【外部のJSファイル(延々と長いコード表が載っている)】があるのだから、これを借りるのが普通。
しかし、今のブラウザは大抵のコードページならUnicode(16Bit)に変換できる能力を持っているのでコレを使って逆変換テーブルを作ってもいい。
SJISの文字の入ったバイナリーなイメージを作り、Readerに読ませ、Unicode(16Bit)に変換させた結果を、Unicode(16Bit)のコードをキーワードにSJISのコードを得られるArrayに詰め込めばいいハズだ。難しいのはUnicode(16Bit)しか使えないJavaScriptの上でどうやってSJISのイメージを作るのかというあたりと、SJISのコード表で有効な範囲だけイメージを作ること。
0x80など未定義になっている部分のイメージが混ざると・・・続くバイトを全角の2バイトと思って変換され文字化けてしまうし、また変換できなかった文字が空白に変換された場合、最後に変換できなかった文字がコード表の「空白」を上書きしてしまい派手な文字化けの原因になる。
それでも、MakeConvert16bitTable や file_reader.readAsText(b,”SJIS”); をゴニョればeuc-jpもできるはずだ。
16ビット領域の文字コード表を作るとループしまくるのでとても遅くなりそうな気がしたけど、今のパソコンならどうということはないらしい。
これでデータベース用のコード変換表もできるハズ。

//Unicode16 - SJIS文字コード表
var utf16Ar=null;
//画面表示直後(onload)に文字コード表を作るMakeSJISConvertの呼び出しが消えないオマジナイ
if( window.addEventListener ) {
  window.addEventListener( 'load', MakeSJISConvert, false );
} else if( window.attachEvent ) {
  window.attachEvent( 'onload', MakeSJISConvert );
} else {
  window.onload = MakeSJISConvert;
}
// Unicode を SJISに変換する
function UTF16toSJIS(utf16) {
  try{
    //コード表作成時に未定義文字をしていした時のオマジナイ
    utf16Ar[" "] = " ";
    //コード表作成時に未定義文字をしていした時のオマジナイ
    utf16Ar[undefined] = " ";
    var a = utf16.split('');
    var buf = new Uint8Array(a.length * 2);
    var j=0;
    for(var i=0; i< a.length; i++) {
      var ch = utf16Ar[a[i]];
      if(ch === undefined) {
        buf[j++] = (0x20);
      } else {
        var chH = ((ch>>8) & 0x0ff);
        var chL = ( ch     & 0x0ff);
        buf[j++] = chL;
        if( chH != 0) {
          buf[j++] = chH;
        }
      }
    }
    var rc = new Uint8Array(j);
    for(var i=0; i<j; i++) {
      rc[i] = buf[i];
    }
    return rc;
  } catch(e) {
    alert(e);
  }
}
//Unicode16 - SJIS文字コード表(utf16Ar)の作成
function MakeSJISConvert() {
  MakeConvert8bitTable();
  MakeConvert16bitTable();
}
//Unicode16 - SJIS文字コード表(utf16Ar)の16bit文字コード分の作成
function MakeConvert16bitTable() {
  //SJISで文字コードに指定している領域のみ作成すること
  MakeConvert16bitSubTable(0x0081,0x009f,0x0040,0x007e);
  MakeConvert16bitSubTable(0x00e0,0x00ef,0x0040,0x007e);
  MakeConvert16bitSubTable(0x0081,0x009f,0x0080,0x00fc);
  MakeConvert16bitSubTable(0x00e0,0x00ef,0x0080,0x00fc);
}
//変換処理の呼び出し回数
var callCount=0;
var transferCharCodeCount=0;
var undefined8BitCount=0;
var undefined16BitCount=0;
var throw16BitCount=0;
//Unicode16 - SJIS文字コード表(utf16Ar)の8bit文字コード分の作成
function MakeConvert8bitTable() {
  try {
    // 8bit area
    var buffer1 = new Uint8Array(256);
    for(var i=0; i<256; i++) {
      if(0x00<=i && i <= 0x1f) {
        switch(i) {
        case  9 : case 10 : case 13 ://制御コードはCSVで使用するTAB,CR,LFだけ登録
          buffer1[i] = i;
          break;
        default://制御コードはCSVで使用するTAB,CR,LF以外は空白として登録
          buffer1[i]=" ";
          break;
        }
      } else if(0x80<=i && i <=0xa0) {//CSVで使わないコードは空白にする
        buffer1[i]=" ";
      } else if(0xe0<=i && i <=0xff) {//CSVで使わないコードは空白にする
        buffer1[i]=" ";
      } else {
        buffer1[i] = i;
      }
    }
    var b = new Blob( [buffer1], {type: "application/octet-stream"});
    var file_reader = new FileReader();
    file_reader.onload = function(e) {
      var sjisAr = e.target.result;
      utf16Ar = new Array();
      for(var i=0;i<256;i++) {
        var utf16 = sjisAr.substr(i,1);
        if(utf16!==undefined){
          if( utf16Ar[utf16] != buffer1[i] ) transferCharCodeCount++;
          utf16Ar[utf16] = buffer1[i];
        } else {
          undefined8BitCount++;
        }
      }
    }
    file_reader.readAsText(b,"SJIS");
  } catch(e) {
    alert(e);
  }
}
//Unicode16 - SJIS文字コード表(utf16Ar)の8bit文字コード分の作成
function MakeConvert16bitSubTable(hiBegin,hiEnd,lowBegin,lowEnd) {
  try {
    // 16bit area
    callCount++;
    var sizeHi  = ( hiEnd  - hiBegin  + 1 );
    if(isNaN(sizeHi)) { alert("Nan sizeHi"); }
    var sizeLow = ( lowEnd - lowBegin + 1 );
    if(isNaN(sizeLow)) { alert("Nan sizeLow"); }
    var sizeAr  = sizeHi * sizeLow;
    if(isNaN(sizeAr)) { alert("Nan sizeHi,sizeHi("+sizeHi+") * sizeLow("+sizeLow+")"); }
    var buffer1 = new Uint16Array(sizeAr);
    var n1=0;
    var tx = "";
    for(var hi=hiBegin; hi<=hiEnd; hi++) {
      for(var low=lowBegin; low<=lowEnd; low++) {
        buffer1[n1++] = (hi & 0x0ff) + ((low <<8) & 0x0ff00);
      }
    }
    var b = new Blob( [buffer1], {type: "application/octet-stream"});
    var file_reader = new FileReader();
    file_reader.onload = function(e) {
      var sjisAr = e.target.result;
      var i=0;
      for(var hi=hiBegin; hi<=hiEnd; hi++) {
        for(var low=lowBegin; low<=lowEnd; low++) {
          var sjis = (hi & 0x0ff) + ((low <<8) & 0x0ff00);
          var utf16 = sjisAr.substr(i++,1);
          if(utf16!==undefined){
          try {//Unicode16で扱えない文字かどうかチェック
            if(utf16.charCodeAt(0).toString(16)!="3000") {
              var test = "【" + utf16 + "】" + utf16.charCodeAt(0).toString(16);
            }
            if( utf16Ar[utf16] != sjis ) transferCharCodeCount++;//登録した文字数を数えてる
            utf16Ar[utf16] = sjis;
          } catch(e) {//Unicode16で扱えない文字は無視
            alert(e+"sjis="+sjis);
            throw16BitCount++;
          }
          } else {
            undefined16BitCount++;
          }
        }
      }
    }
    file_reader.readAsText(b,"SJIS");
  } catch(e) {
    alert("MakeConvert16bitTable():"+e);
  }
}

CSVをダウンロードするコードは、

//JavaScriptはUnicode(16bit)なので、
//htmlに<input type='button' onclick='exportData("漢字\tあいうえお\tカキクケコ\r\n")'>と書いて呼び出す。
//\tがデリミタとして判定されない場合は , に変える。
function exportData(unicode16CSV) {
  var sjis = UTF16toSJIS(unicode16CSV);
  var blob = new Blob([sjis], {type: "application/octet-stream"});
  var url = URL.createObjectURL(blob);
//ここはHTMLにダウンロード用のaタグを貼っておいて再利用した方がいい。
  var a = document.querySelector("#results");
  a.href = url;
  a.download = "シフトJISコードで作ったCSVファイル.csv";
  a.text="re-download";
  a.click();
}

日本語のファイル名でダウンロードするとファイル名が文字化けするブラウザもあるだろう
画面でCSVデータを編集してCSVにするサンプル
↑2018/10/2修正済(あるいは改悪済)
〇 FireFox(62.0.2 (64ビット)),Chrome(バージョン: 69.0.3497.100(Official Build) (64 ビット)),IE Ege(バージョン不明)で治ってるように見えた。
× IEではダウンロード不可だった。
ps.2018/1/4
今では文字化けしている。サロゲートペアを考慮していないせいだと思うけど・・・
※サロゲートペア:16ビット固定の文字表現であったUnicodeので未使用でだった0xD800~0xDBFFを上位サロゲート、0xDC00~0xDFFFを下位サロゲートとし、上位サロゲート+下位サロゲートの4バイトで文字を表現する文字を拡張したものがUTF-16らしい。
※2018/10/2 FireFoxで8ビットコードが化けまくっていたので以下修正。
おかしくなっていた原因は、
(1)16ビット文字のマップを作るつもりが、英字が半角文字に変換されていた。⇒マップに登録済みの文字は無視する。
⇒まだ、上位ビットがFF(1111)の文字だけ、うまく変換できない。
「a」(0xff41)は、なぜか成功するけど
「U」(0x0ff35)は「ガ」に、
「1」(0x0ff11)が「・」に
なってしまう」。
(2)nullコードは’\u0000’で判定しないとダメだった。
(3)ダウンロード用に作成したSJIS(バイナリー)データにnullが混じっていた⇒null部分はカット。

var utf16Ar;
function UTF16toSJIS(utf16) {
  try{
    var i = 0;
    var a = utf16.split('');
    //alert(a.length);
    var rc = new Uint8Array(a.length*2);
    var countSP=0;
    var ch16=null;
    var j=0;
    for(var i=0; i< a.length; i++) {
      var ch = a[i];
      if(utf16Ar[ch.charCodeAt(0)] === undefined)
        rc[j++] = (0x20);
      else
        ch16 = (utf16Ar[ch.charCodeAt(0)]);
      if((ch16 >> 8)==0) {
        rc[j++] = ch16;
        countSP++;
      } else {
        rc[j++] = ch16 & 0x0ff;
        rc[j++] = ch16 >> 8;
      }
    }
    var rc8 = new Uint8Array(j);
    for(var i=0; i< j; i++) {
      rc8[i] = rc[i];
    }
    return rc8;
  } catch(e) {
    alert(e);
  }
}
function MakeConvert8bitTable() {
  try {
    // 8bit area
    var buffer1 = new Uint8Array(256);
    for(var i=0; i<256; i++) {
      if(0x00<=i && i <= 0x1f) {
        switch(i) {
        case  9 : case 10 : case 13 :
          buffer1[i] = i;
          break;
        default:
        buffer1[i]=0;
          break;
        }
      } else if(0x80<=i && i <=0xa0) {
        buffer1[i]=0;
      } else if(0xe0<=i && i <=0xff) {
        buffer1[i]=0;
      } else {
        buffer1[i] = i;
      }
    }
    // download sjis code list file
    if(downloadSjisCodeList) {
      var b = new Blob( [buffer1], {type: "application/octet-stream"});
      var url = URL.createObjectURL(b);
      var a = document.querySelector("#results");
      a.href = url;
      a.download = "sjis8.txt";
      a.text="re-download";
      a.click();
    }
    var b = new Blob( [buffer1], {type: "application/octet-stream"});
    var file_reader = new FileReader();
    file_reader.onload = function(e) {
      var sjisAr = e.target.result;
      utf16Ar = new Array();
      for(var i=0;i<256;i++) {
        var utf16 = sjisAr.substr(i,1);
        if( utf16 != '\u0000' && utf16Ar[utf16.charCodeAt(0)] === undefined ){
          utf16Ar[utf16.charCodeAt(0)] = buffer1[i];
        }
      }
    }
    file_reader.readAsText(b,"SJIS");
  } catch(e) {
    alert(e);
  }
}
var callCount=0;
function MakeConvert16bitSubTable(hiBegin,hiEnd,lowBegin,lowEnd) {
  try {
    // 16bit area
    callCount++;
    var sizeHi  = ( hiEnd  - hiBegin  + 1 );
    if(isNaN(sizeHi)) { alert("Nan sizeHi"); }
    var sizeLow = ( lowEnd - lowBegin + 1 );
    if(isNaN(sizeLow)) { alert("Nan sizeLow"); }
    var sizeAr  = sizeHi * sizeLow;
    if(isNaN(sizeAr)) { alert("Nan sizeHi,sizeHi("+sizeHi+") * sizeLow("+sizeLow+")"); }
    var buffer1 = new Uint16Array(sizeAr);
    var n1=0;
    var tx = "";
    for(var hi=hiBegin; hi<=hiEnd; hi++) {
      for(var low=lowBegin; low<=lowEnd; low++) {
        buffer1[n1++] = (hi & 0x0ff) + ((low <<8) & 0x0ff00);
      }
    }
    // download sjis code list file
    if(downloadSjisCodeList) {
      var b = new Blob( [buffer1], {type: "application/octet-stream"});
      var url = URL.createObjectURL(b);
      var a = document.querySelector("#results");
      a.href = url;
      a.download = "sjis16(" + callCount + ").txt";
      a.text="re-download";
      a.click();
    }
    var b = new Blob( [buffer1], {type: "application/octet-stream"});
    var file_reader = new FileReader();
    file_reader.onload = function(e) {
      var sjisAr = e.target.result;
      var i=0;
      var count=0;
      for(var hi=hiBegin; hi<=hiEnd; hi++) {
        for(var low=lowBegin; low<=lowEnd; low++) {
          var sjis = (hi & 0x0ff) + ((low <<8) & 0x0ff00);
          var utf16 = sjisAr.substr(i++,1);
          try {
            if( utf16 != '\u0000' && utf16Ar[utf16.charCodeAt(0) ] === undefined ){
              utf16Ar[utf16.charCodeAt(0) ] = sjis;
            }
          } catch(e) {
            // invalidated char
          }
        }
      }
    }
    file_reader.readAsText(b,"SJIS");
  } catch(e) {
    alert(e);
  }
}

※2023/3/7 クラシック版エディタの記事だったので差替え



DirectX12≒Mantle>>X11 AND 8-Core >> 4-Core

やっとFFXIVが6月にDirectX11のクライアントをリリースする予定なのだが・・・
3D-Mark(Version 1.5.884)のベンチマーク結果だけみると
DirectX12はDirectX11と比較してCPUのマルチコアが有効に働くので、Core-i7の8コアパワーが圧倒的なパフォーマンスを引き出すらしい。
しかし、綺麗な画面で高FPSでサクサク動くのか?と云えばそう云う訳ではなく
あくまでも3D-Markがサクサク動くだけな様だ。
ちょっと勿体ない。
 



JavaScriptで壁を感じる時

Hyper Script が JavaScriptになって既に四半世紀が過ぎようとしていた。
大量の document.www.xxx.yyy.zzz の  getter と setter にマミれてたJavaScriptも
良好な document.getElementById(id-name) の発見により暫しの安寿を得た。
が、これを好機と捉えたMSがブラウザーのIE独自仕様変更紛争を仕掛け、これにより世界中のサイトが不意のWindowsUpdateにより、画面が崩壊する事態が発生する。
幾度のW3C勧告も虚しく仕様変更紛争は激化し無料のIE6がマーケットで伸びるなか、ActiveXやOLEによるクリティカルなセキュリティホールが多数出現する事態が続きMSの戦況は大きく傾き、ついには最終防衛ラインVB-Scriptの陥落により、MS独自路線は崩壊することとなる。
それにより、ブラウザごとに実装がバラバラで誰にも全く見向きもされなかったためロクなハッキングがなされなかったJavaScriptが脚光を浴びることになるが、仕様の齟齬ゆえに入力チェック程度の実装ですら行き詰まりとなり、多くのコードはサーバーサイドへと流れていった。
そして時が過ぎ、無名の多数の不屈の精神によって生み出されたprototype.jsやjquery.jsの様な汎仕様的なコードの出現により、JavaScriptのクライアントサイドへのコードの復帰を促す流れが生み出されたものの、それはJavaScriptをWEBのダークサイドに手招く悪魔の仕業であり、再びWEBは泥沼のセキュリティホールへと押し戻されるのであった。
戦況は膠着状態となり・・・今に至る。




top