変奏現実

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

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

パソコン

【白旗】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回目なので、
画面左上の「↑」を押して「アクションセンター」に移動し、「アーカイブ」のボタンを押して
 

忘れることにした。



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は泥沼のセキュリティホールへと押し戻されるのであった。
戦況は膠着状態となり・・・今に至る。



javascript で DBM?

FireFoxに入っているSQLiteはデータベースをファイルロックで競合管理しているので、何かと使いにくいので、
ブラウザのLocalStorageをDataBase代わりに使えないかなぁ?と
phpMyAdminでINFORMATION_SCHEMAを見ながら
チョコチョコとJavaScriptに焼直してます。
Select A.fld1, B.fld2 From XXX A Left Outer Join YYY B On A.key = B.key Where A.fldX = xxxxx
とか使えたらいいな。
一通り動いたら、LocalStorage用サーバー・パッケージとJScriptやJDKのツールでNode.jsっぽく動くサーバー・パッケージに分離して、どこでもデータベース化できたらいいな。できれば1つのスキーマを別々のパソコンに分散できたらいいな。
 



JavaScriptでクラス定義

JavaScriptにclassというモノは無いけど、
クラスっぽくていいから使いたい時もある。
参考1(Google流)参考2参考3
コンストラクタは 普通に関数の文法で

function aaaa (param) {
this.p = param;
}

と書いてもいいけど、
ドコかで名前aaaが重なると、かなり厄介なことになるので、

var aaa = function (param) {
this.p = param;
}

と、後でパッケージする気が起きやすい書き方にした方が良さそうだ。
クラスの継承に関しては、function を作成すると 自動生成される function の prototype を使って
Object.setPrototypeOf(子クラス.prototype, 親クラス.prototype);
※2015/04/09 現在、リンク先はまだ和訳されていません。
が良さそう。
 
 



UPDATE SELECT は 無かった

以下、記憶がかなりあいまい。
SQL SERVER のUPDATE文で設定する値にSELECT文が使えるけど、SETに計算式は使えないらしい。
しかしMSDNを見ると・・・
expressionはあちこちに書いてあるけど、SELECTなんて書いてなかった。 orz
ま、ゴチャゴチャに補正値が入っているテーブルから系統ごとに補正値をまとめて加算するんだけど
データが多すぎるから、SQLでパパッとやってみたかった!だけなんだけどね。(笑
UPDATE   更新テーブル
SET    系統計1フィールド1 += WHEN CASE 集計キー = 1 THEN 計算式1 ELSE 0 END
,系統計2フィールド1 += WHEN CASE 集計キー = 2 THEN 計算式2 ELSE 0 END
FROM    更新テーブル INNER JOIN
(SELECT 補正値テーブル名.キー,集計式 FROM 補正値テーブル名
GROUP BY 補正値テーブル名.集計キー・・・)   補正値 ON  更新テーブル.キー=補正値.キー
WHERE 更新テーブル.対象時刻=XXXXX
のように書けば、計算式1で
SUM(補正値.フィールド1名)  –  SUM(補正値.フィールド2名)
も使えるのかもしれない。
でも、素直にカーソル使ってループした方がマシかな?(笑
※まだ調査中。
 



VisualStudio 2008の時期にSQLマニアが多かった理由

VisualStudio 2008の起動自体も遅いが、デバッガはもっと遅い。
基本的に、VisualStudio 2008を終了する時には、
・Start画面を閉じる。
・ブレークポイントを全部削除する。
の2つは必ず守らないといけない。
そうしないと、起動やデバッグ開始の度に、10分くらい、デスクトップを人質に取られるからだ。
要は、ネットワークのコネクションやレスポンスの遅さ(タイムアウトまたはレスポンス1秒 × 1000カ所≒16分)を甘く見るからこうなるので、某社の開発支援ツールでも同様な目にあっている。
要は、使い込まない奴が作った開発環境やツール類は、全て同様の問題を内包している。
とは云え、それで開発しなければいけないなら、

別の場所で頑張る方法もある。

それがSQL Serverのストアードプロシージャだ!

マネージャの画面では、ずばり「プログラム」に分類されている。
と云うのも、その場でパラメータを打ち込んで実行することも可能。
この辺はIISでWEBサービスをデバッグするのと雰囲気が似ている。面々と続く、N88-BASICっぽい仕組みである。
この辺は単に実行するにも単にデバッグにも単にテストするにも、延々と事前作業が必要なEclipse系Java開発環境とは全くの別系統だ。
こんなに手軽に実行できるなら、VisualStudio2008から逃げ出して、延々とストアードプロシージャのデバッグに勤しむのも、理解できると云うものだ。
勿論、他人のN88-BASICコードは、難解です。

@A  int
AS
DECLARE  @AP1 INT(3) , @AP2 INT(3) , @AP3 INT(3)
SET @AP1(1)=1, @AP2(1)=2, @AP3(1)=3, @AP1(2)=10, @AP2(2)=20, @AP3(2)=30, @AP1(3)=100, @AP2(3)=200, @AP3(3)=300
EXEC PROCEDURE_1 @AP1(@A), @AP2(@A), @AP3(@A)

と、分岐が大っ嫌いなコンパイラーが出力しそうな結果をイメージしたソースコードが書かれていたら、どうします?
(@@/  と・・・すがすがしく感じていただけるだろうか?(大笑
もしかしたら

@A  int
AS
DECLARE @P1  int, @P2 int,  @P3 int
IF @A = 1 THEN    SET @P1=1, @P2=2, @P3=3
IF @A = 2 THEN    SET @P1=10, @P2=20, @P3=30
IF @A = 3 THEN    SET @P1=100, @P2=200, @P3=300
EXEC PROCEDURE_1   @P1, @P2, @P3

と、あるべきなのでしょうか?
 
ぼくは

@A  int
AS
IF @A = 1 THEN    EXEC PROCEDURE_1   1, 2, 3
IF @A = 2 THEN    EXEC PROCEDURE_1   10, 20, 30
IF @A = 3 THEN    EXEC PROCEDURE_1   100, 200, 300

で十分じゃないかと思います。
今思えばOS/2のVisual-Ageがリリースされた後に、インタープリターみたいなモノを作る仕事が多かったのは、やはり『開発環境が重かったせい』だったのかな?
※上記のコードは雰囲気を表現したもので、文法的に正しいかどうかはチェックしていません。



3D-NANDをミウラ折りで作りたい

薄厚のダイを重ね積層する技術の要めはダイ同士の配線をどうやって結合するかだ。ドンドン重ね続けると配線作業がしんどい。
そこで平らなダイを折り立たせた様な構造でダイを製造し、面積あたりの記憶セル数を稼ぎ、積層する手間を減らすのが3D-NAND技術らしい。
しかし、それなら、もっと薄いダイを作り、ミウラ折りっぽい折り目を付け、バンド状の熱収縮素材を貼って加熱し折り目に沿って収縮させ、最後は専用クリップで挟むか端子を露出させる穴のあるケージに入れるといいような気がする。
端子は畳んだ後に外側に出る位置に配置しておくと、熱収縮素材がいい感じでダイをカバーし、小さいけど固体コンデンサーっぽいコロっとしたNANDメモリ・コアが出来き、端子にハンダを乗せ、超音波で基盤に貼り付け出来上がり・・・ダイ同士を配線するより楽な気がするし、力任せに大量に載せて大容量のSSDも作れそうだし、搭載するコアの数が多いなら逆の発想で少しづつ容量を増やすことも出来そうだ。
eMMCの代替品としてSoCに搭載というのも良いかもしれない。
難点を云えば、そんなメモリを積んだタブレットの開封の儀をやったら、メモリらしきものが見当たらないコトだろうか。
もっとも、印刷で電子回路を作る技術で、普段は極薄の回路を作り折りたたんだ状態で使用し、壊れたら折り目を伸ばして修理できて便利そうだね。(大笑
 
 
 




top