変奏現実

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

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

【SQL Server】 テーブルの一覧(その1)

sys.sysobjectsを使う場合 適用対象: SQL Server (SQL Server 2008 から現在のバージョンまで)
use データベース名

use データベース名
select name from sys.sysobjects where xtype in( 'U', 'V', 'P') order by name

で大体判る。
※使用ツールにより、use や sys.が不要
※xtypeの一覧

use データベース名
select '[' + xtype + ']' from sysobjects group by xtype

で見ると [U ]や[P ]だが ’U’ ‘やP’でも検索可

  • AF = 集計関数 (CLR)
  • C = CHECK 制約
  • D = Default 制約または DEFAULT 制約
  • F = FOREIGN KEY 制約
  • L = ログ
  • FN = スカラー関数
  • FS = アセンブリ (CLR) スカラー関数
  • FT = アセンブリ (CLR) テーブル値関数
  • IF = インライン テーブル関数
  • IT = 内部テーブル
  • P = ストアド プロシージャ
  • PC = アセンブリ (CLR) ストアド プロシージャ
  • PK = PRIMARY KEY 制約 (type は K)
  • RF = レプリケーション フィルター ストアド プロシージャ
  • S = システム テーブル
  • SN = シノニム
  • SQ = サービス キュー
  • TA = アセンブリ (CLR) DML トリガー
  • TF = テーブル関数
  • TR = SQL DML トリガー
  • TT = テーブルの種類
  • U = ユーザー テーブル
  • UQ = UNIQUE 制約 (typeは K)
  • V = ビュー
  • X = 拡張ストアド プロシージャ

 



[EXCEL]ヘッダーとフッター

フッターに会社名を入れることが多い。
しかもシート数が半端なかったりすることも多いので・・・
EXCELのマクロ記録モードでヘッダー等をイジると

    With ActiveSheet.PageSetup
        .LeftHeader = "ヘッダー左"
        .CenterHeader = "ヘッダー中央"
        .RightHeader = "ヘッダー上"
        .LeftFooter = "フッター左"
        .CenterFooter = "フッター中央"
        .RightFooter = "フッター右"
        .LeftMargin = Application.InchesToPoints(0.7)
        .RightMargin = Application.InchesToPoints(0.7)
        .TopMargin = Application.InchesToPoints(0.75)
        .BottomMargin = Application.InchesToPoints(0.75)
        .HeaderMargin = Application.InchesToPoints(0.3)
        .FooterMargin = Application.InchesToPoints(0.3)
        .Zoom = 100
        .PrintErrors = xlPrintErrorsDisplayed
        .OddAndEvenPagesHeaderFooter = False
        .DifferentFirstPageHeaderFooter = False
        .ScaleWithDocHeaderFooter = True
        .AlignMarginsHeaderFooter = True
        .EvenPage.LeftHeader.Text = ""
        .EvenPage.CenterHeader.Text = ""
        .EvenPage.RightHeader.Text = ""
        .EvenPage.LeftFooter.Text = ""
        .EvenPage.CenterFooter.Text = ""
        .EvenPage.RightFooter.Text = ""
        .FirstPage.LeftHeader.Text = ""
        .FirstPage.CenterHeader.Text = ""
        .FirstPage.RightHeader.Text = ""
        .FirstPage.LeftFooter.Text = ""
        .FirstPage.CenterFooter.Text = ""
        .FirstPage.RightFooter.Text = ""
    End With

と 書き出してくれるので
シートを替えながら、このマクロを実行すればいい。
しかしブックの数も半端ないなら・・・
またBATの出番だ。
CScriptで実行するブートストラップは省略

  var EXCEL = WScript.CreateObject("EXCEL.Application");
  var SHELL = WScript.CreateObject("WScript.Shell");
  var FS    = WScript.CreateObject("Scripting.FileSystemObject");
  //カレントフォルダのファイルを列挙する
  echo(SHELL.CurrentDirectory);
  var folder = FS.GetFolder( SHELL.CurrentDirectory );
  var em = new Enumerator( folder.Files );
  //順にループ
  for( em.moveFirst(); !em.atEnd(); em.moveNext() ) {
    //EXCELっぽいファイルだけ処理
    if(em.item().Name.indexOf(".xls")>0) {
      //ファイルをEXCELで開く
      var book = EXCEL.Workbooks.Open(em.item().Name);
      try {
        echo(book.name +": "+book.Worksheets.Count+" sheets");
        EXCEL.DisplayAlerts = false;
        //
        var saveFlag=false;
        //1シートづつループ
        for(var i = 1; i<=book.Worksheets.Count; i++) { var sheet = book.Worksheets(i) //白紙は何もしない様にする if(sheet.UsedRange.Count>0) {
            echo(" "+sheet.name +":"+sheet.UsedRange.Count+" セル");
            var hdrText = em.item().Name + ":" + sheet.name;
            //ヘッダーを調整済みならヘッダーを調整しない
            if(sheet.PageSetup.LeftHeader.indexOf(hdrText)<0) {
              sheet.PageSetup.LeftHeader  = hdrText + " "+ "\n" + sheet.PageSetup.LeftHeader;
              // 改行を入れてあるので1行分ぐらい高くする
              sheet.PageSetup.TopMargin += 12;
            }
            //フッターに会社名を入れる
            sheet.PageSetup.RightFooter = "株式会社 *****";
            saveFlag=true;
          }
        }
        // ヘッダーやフッターを調整した時だけ保存
        if(saveFlag) {
          book.Save();
          echo(book.name +" Saved");
        }
      } catch(e){
        var i, ary = [];
        ary.push("number:"+e.number.toString(16));
        for (i in e) { ary.push(i + ":" + e[i]); }
        echo("例外処理:" + ary.join(", "));
      } finally {
        // ブックを確実に閉じる
        if (book != null){
          book.Close(false);
        }
      }
    }
  }
  EXCEL = null;
  SHELL = null;
  FS    = null;

微妙なのは、ヘッダーの高さ、改行を入れているので、少し嵩上げしている

sheet.PageSetup.TopMargin += 12;

こんなコードをEXCELブックのフォルダにぺーストしてダブルクリックするだけで
EXCELの資料の全シートにプロジェクト名とか会社名を入れるとか・・・実にくだらない仕事がサクっと進む。
注意点はネットドライブを割り当てておかないと、BAT系は全滅。



[EXCEL] UsedRange

UsedRangeで大雑把なデータの範囲が得られる。

//エクセルファイルを開く
var book = EXCEL.Workbooks.Open("abc.xls");
//最初のシートを選ぶ
var sheet = book.Worksheets(1)
try {
  echo(sheet.name);
  //使用した行範囲を得る
  var rows = sheet.UsedRange.Rows;
  echo("rows:"+rows.count);
  //使用した最小行を得る
  var rowmin = rows(1).row;
  echo("rows(min):"+rowmin);
  //使用した最大行を得る
  var rowmax = rows(rows.count).row;
  echo("rows(max):"+rows(rows.count).row);
  //使用した列範囲を得る
  var cols = sheet.UsedRange.columns;
  echo("cols:"+cols.count);
  //使用した最小列を得る
  var colmin = cols(1).column;
  echo("cols(min):"+colmin);
  //使用した最大列を得る
  var colmax = cols(rows.count).column;
  echo("cols(max):"+cols(cols.count).column);

実行してみると、チャンとデータのある範囲を表示する。

rows:7
rows(min):2
rows(max):8
cols:3
cols(min):2
cols(max):4

ではJScriptでEXCELにシートのデータをクリップボードで送らせてみよう。

  sheet.Range(sheet.Cells(rowmin,colmin), sheet.Cells(rowmax, colmax)).Copy();
} catch(e){
  var i, ary = [];
  for (i in e) { ary.push(i + ":" + e[i]); }
  echo("例外処理:" + ary.join(", "));
} finally {
  if (book != null){
    book.Close(false);
  }
}

なぜかWindows 8.x 64bit版+MS Office 365 Solo では、クリップボードにコピーしてくれないから・・・

  //sheet.Range(sheet.Cells(rowmin,colmin), sheet.Cells(rowmax, colmax)).Copy();
  var text="";
  for(var row=rowmin; row<=rowmax;row++) {
    var colText=[];
    for(var col=colmin; col<=colmax;col++) {
      colText.push(sheet.Cells(row,col).Text);
    }
    text += colText.join("\t") + "\r\n";
  }
} catch(e){
  var i, ary = [];
  for (i in e) { ary.push(i + ":" + e[i]); }
  echo("例外処理:" + ary.join(", "));
} finally {
  if (book != null){
    book.Close(false);
  }
}

自力でクリップボードもどきのデータを作らないといけないらしい。
ちなみに、例外処理を入れてあるのは、

book.Close(false);

しないとEXCELプロセスが起動する度に残ってしまうから・・・
例外処理が起きた場合は・・・

例外処理:name:TypeError, message:'aaa' は宣言されていません。, number:-2146823279, description:'aaa' は宣言されていません。

の様な感じで出る。
try catch で括ってしまうと、拡張機能のlinenumberが無いから、
文法エラーの場所が判らなくなってしまうので本末転倒な作りになっている。
非常に面倒。
aaa ならまだマシ、
インテリセンスなエディタは 変数Stと変数rtを宣言したソースの Start を ’St’ + space + ‘a’ + space + ‘rt’ に変化(へんげ)させてしまうことがママあるが・・・
そんな時は・・・
   ‘a’ は宣言されていません。
と表示するハズ。
インテリセンスなエディタの半角スペースは幅が狭く(1ドットぐらい) 目視で見つけることはまず無理。
やはりMSは人の邪魔しかしない。



[JavaScript] LocaleStrageのサンプル

長らくブラウザのクライアントで記録するものと云えばクッキー(cookie)しかなかった。
記憶容量も4KBぐらいまでだった。
今ではLocalStrageという変数がdocumentのurlのドメインごとに記憶してくれる。
でも5MBぐらいまでらしい。
なので、サンプル(あて名書き)を作ってみた。 あて名を書くだけのメモ。
※htmlファイルをパソコンの同じフォルダにダウンロードしても使用可能。ただウチでは「iden_bs.js」というファイルが混入してくる。
先のJSFIDDLEも、一見サーバーに保持している様に思えるが、実はLocalStrageでセルの値や式を保存している。
パソコンの方で情報を記憶しているので、ネットが繋がらなくても、暫くの間は記憶してくれる。
でも、いつ何時消えてしまうか判らないので、この手のモノは皆CSVの出力と読込みは必須な気がするのでCSVの出力と読み込みも付けてみた。
CSVを読込むとLocalStrageを全部設定しなおすので列名は好きに替えられるので使い道は案外あるのかもしれない。
とは云え、LocalStrageのセキュリティ上の安全性はよく解りません。
大切な情報のメモには使えませんね。(大笑
また、CSVをSJISで出力するにはコード変換テーブルを組み込まないと無理というのが定説らしいけど、コード変換テーブルさえ作れれば何とかなる。それが あて名書き2 だ。
トンでもなく量のコード表をjsファイルに埋込むのが嫌で、JavaScriptでUint8ArrayとUint16ArrayでSJISのコード表を作ってみた。
これをBlob形式にして JavaScriptのFileReader .readAsText(b,”SJIS”) で読取らせれば 何気にUTF16テキストに変換してくれるので、元のSJISコード順さえ覚えているなら、Key:UTF16コード、Value:SJISコードなマップを作れる。
うん、readAsTextで指定できる文字エンコーディングには

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

のcharsetで指定できるものなら使えるらしいので、EUC や JIS も使えそう。
先のマップを使ってUTF16のテキストをUint16Arrayに変換すれば、バイナリーデータをダウンロードするコードでSJISコードページのテキストファイルに保存できる。但し、文字サイズが16ビット固定になってしまうハズなので・・・MS Office 365のEXCELで読めるけど古いバージョンでも読めるのかは不明。
またCSVのデリミタはタブ(\t)からカンマ(、)に変えてある。
しかし、数万回ループするので、ローコストなパソコンやスマフォでは、あて名書き2 は開かない方がいいかもしれない。
一応、SJISコード表をダウンロードするコードも残して置いたのでPopupWindowに挿しこんで自動的に読むようにしてみたり、コード表をLocalStrage に保存しておけば、2度目に開いた時は遅くないかもしれない。
SJISは、使用不可な文字領域が多いので、8ビット版 と 2区画(8140~9ffc  、e040~effc、下位バイトが7fの場合を除く )の 16ビット版 で作成したけど、足りないのかもしれない!(大笑
追加
あて名書き3

  • IFRAMEにテーブルを収めてみた。※関連ソースは思いっきりFireFox系なのでIEやChromeでは動かなさそう。
  • ダウンロード用のコード変換部分をsjis.jsに分離。

document.createElementでIFRAMEにタグを書いても
IFRAMEの中は
<html><head></head><body></body></html>
という文字列にしかならなかったので、

iframe.contentDocument.open();
iframe.contentDocument.write(' ');
iframe.contentDocument.close();

でHTMLの基本的なタグを作ってもらう。
でも、dummy.htmlの<link rel=”stylesheet” href=”atenagaki.css” type=”text/css” /> が無駄になり、JavaScriptでまんま追記する。

var link = document.createElement('link');
link.rel='stylesheet';
link.href='atenagaki.css';
link.type='text/css';
iframe.contentDocument.querySelector('head').appendChild(link);

無駄すぎる。

  • 半角文字が空白+半角のままだったので、無駄な空白を取った。
  • CSV読み込み時、CSVのデリミタ(カンマかタブ)、改行(CrLf,Lf,Cr)を判定。

後はUTF8やSJIS、EUCを自動判定できればいいかな。



Java と JScript と JavaScript と Node.js

この中ではJavaが一番嫌いだ。
と云うのも、ドコかの誰かが ラムダ表記が・・・ とか言い出したので、実装しました! コレが旬!
とか・・・まるで、FF14のアップデートで売れ筋が一変するが如き事態が起き、Javaのソースに毎年年輪が入ってしまうからだ。
無論、色々な表記方法ができるとありがたい。
SQLを

try {
StringBuilder strBuld = new StringBulder();
strBuld.append("SELECT field1,field2 ");
strBuld.append("FROM table1 T1 ");
strBuld.append("LEFT JOIN table2 T2");
strBuld.append("ON join T1.pkey1 = T2.pkey1 ");
strBuld.append("WHERE T2.pkey1 = ? ");
ResultSet rs = database.select(strBuld.toString())
} catch(e) {
log("",e.message);
}

と書いてた時期がある。
Javaの主流である自己満足(マイルール)の典型的な黒歴史的実在である。
それは、色んなブラウザのJavaScriptの実装をハックして出来上がったJQueryにしても「イベントハンドラ事前登録のてんこ盛り」でしかなく、旬のものに差し替える(アップデート)ことが必要で古いものをいつまでも使うのは困りもの。
前に取り上げたとにかく短いコードで実装されたJSFIDDLEにしても、HTMLファイルにTABLEタグをもう1個置くと使えないコードでしかない。※TABLEを作った後にIFRAMEに吐き出すのも手ではあるけれどLocalStrageの扱いは要注意。
JScriptとそのブートストラップを埋め込んだBATファイルも「デスクトップシェルにブートストラップを組み込んでしまう」のが本筋のハズだし、PUSHD \\ServerName\Folder と1行突っ込んで、サーバーに配置しても動作する様にすると、勝手にUNCパスをネットドライブに差し替えるが、POPDで最後に作ったネットドライブを消してくれるけど、途中で停止させたら・・・起動する度にネットドライブがウジャウジャと増えてしまう ので 後始末が大変だ。
Node.jsもCentOSで使う分には便利なのにWindowsではNPMがMyDocumentをリポジトリィ代りに利用しているので、何かのサンプルコードをダウンロードすると途端に危ない状況に陥ってしまう。というかNode.jsの環境が壊れてしまう。勿論、Node.js専用アカウントを作っておくべきなのは理解できるけど、どこかでAppDataをシェア(共通)パスの代用にしていたら、外部に露出させてしまい、何かのライセンス情報を抜き取られるかもしれないから「動けばいいのさ」な感じの作りこみは危なっかしい。
なのでで、どれもチョット試す分には支障ないけど、
どれも入れっぱなしにしておくと、かなり危険な香りがする。
もちろん、セキュアでクラスライブラリィの様に使いやすいものは、そうそう作れないし、年月が全てをダメにすることもある。



JSFIDDLE と SyntaxHighlighter

JSFIDDLE を26列以上でもちゃんと列番号を表示させようと思った

var letter = String.fromCharCode("A".charCodeAt(0)+j-1);

<pre style="padding-left: 30px;">var letter = makeColName(j);</pre>

に変えた後が結構面倒だった。

function makeColName(col) {
    if(col-- <=0)    return "";
    var digit = "Z".charCodeAt(0) - "A".charCodeAt(0) + 1;
    return makeColName(Math.floor(col/(digit))) + String.fromCharCode("A".charCodeAt(0)+(col % digit));
}

ストレートに表記文字を ”ABCDEFGHIJKLMNOPQRSTUVWXYZ” と並べて

function makeColName(col) {
  if(col-- <=0)    return "";
  if(typeof this.COLCHARS === 'undefined') {
    this.COLCHARS ="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // いろんな文字で遊べる
    this.DIGIT = this.COLCHARS.length;
  }
  return makeColName(Math.floor(col/(this.DIGIT))) + this.COLCHARS.charAt(col % this.DIGIT);
}

すれば「あいうえお」でも「壱弐参零」もあり?
A1のAの部分は【基数が1の26進数表記】なので、
単純に剰余を求めると、0が出てきてしまうから、
まず列番号の基数を0に変え、各桁ごとにAの部分を作成して、次の桁の処理に移る。
だから

function makeColName(col) {
    var rc="";
    while(true) {
    if(col-- ==0) return rc;
    var digit = "Z".charCodeAt(0) - "A".charCodeAt(0) + 1;
    rc = String.fromCharCode("A".charCodeAt(0)+(col % digit)) + rc;
    col = Math.floor(col/(digit));
    }
}

でもいいはず。
見づらいのでSyntaxHighlighter Evolvedを入れようと思ったら、結構量もあるし、ヘッダーのPHPソースも盛らないといけないので、プラグインを入れてみた。
行の色が交互に変わらないので
wp-content / plugins / syntaxhighlighter3 / ${設定で選択したテーマ名}.css を

.syntaxhighlighter .line.alt1 {
    background-color: #33FFFF !important;
}

と変えてみた。
参考
makeColName(1) -> “A”
makeColName(2)-> “B”
makeColName(26) -> “Z”
makeColName(27) -> “AA”
今更、EXCELのワークシートのサイズが1,048,576行×16,384列まで増えていた(Excel2007以降のxlsxファイル)のに気が付いた。



USB Type-C ≒ USB 3.1

USBコネクタの向きは機種ごとにバラバラだ。
手持ちのガシェットでも・・
SONYのSO-04Eは幅が広い方が裏面。
NEXUS-7は幅が広い方が表面。
とあるmicroUSB接続のmicroSDリーダーを取りつけたら、どちらかがLEDのアクセスランプが裏側になってしまうだろう。
こんな悩みを解決するのが裏も表も無いUSB Type-C のコネクタ。
しかも、USB3.1で10Gbpsになるのかと思いきや、USB3.1とは別の規格になるそうだ。
USB3.1なら最大100Wまで電力供給ができるから、大抵(外付けHDDやプリンタを含む)のガシェットは本体電源に頼れるのにね。
もう買ってしまったガシェットも短いUSB Type-B – TypeC 変換アダプタで大体は使いまわせるような気がするけど、
いっぱい変換アダプタが必要になりそうなので
本体のガシェットもmicroSDリーダーもType-Cが出そろうまで待った方がいいのかな。
そろそろプリンタがエラーを吐きながら印刷するようなので買い替えしなければいけないけど、もうすこし待つか?(笑
ついでにパソコンも買い替えも(大笑
全部 Type-Cになるまで どれくらい期間がかかるんだろう・・・
 
 



VR, AR, HMD

VR: 仮想現実。コンピュータが作り出した世界をユーザに観せるもの とか 現実の世界を記録し、オンラインでユーザに提示するもの とか 現実の模写 とか色々ありすぎ、今では用語として破城している。
AR: 拡張現実。VRの変種、現実の映像の一部をVRの表現を差し替えるチョットダケVR。テレビ番組のスーパーインポーズのVR版。2次元バーコードが視界に入ると特定の情報やアバターなどを画面に表示するものも含まれる。キワモノだけに使い道次第ではとても便利。
HMD:ヘッドマウントディスプレイ。両目の手前に小さなディスプレイを設置するための装置。椅子に座って見かけ上の大画面で映画を鑑賞するために作られた。装着すると目の前のディスプレイで周囲のものは視界から遮られるので装着したまま動き回るのは大変危険。
ゲーミングHMD: 3D眼鏡を使用してゲームの没入感を高める研究の延長上にこのHMDにコンピューターグラフィックスを使い頭部の動きに連動してディスプレイに映る画像を変化させることでゲームの没入感を高める試みを行われているが、ディプレイの残像効果や素早い動きに追従させること自体が難しいなど、まだまだ改良点は沢山残っている。勿論、装着したまま動き回わってゲームするのは至極難しい。



ロジテック LHR-DS05WU3BK

スタッカブル(積み重ね可)でスタイリッシュなデザインのハードディスク・リーダー/ライター。
なんてことはない内臓用HDDの外付けケースで、USB3接続のものが多いが、Wifi(11 b/g/n)でも接続できるのでスマフォでも使える。
※USB3.0とWi-Fi接続は背面スイッチで簡単に切替
※eSATA無し。
HDD容量は6TBまで
スマフォの容量が足りない人向け商品だけど、
工場や室内の色々な機器のデータを有線LANを使わずにWifiで収集する用途にも使えそう。
 
 
 




top