2019年2月28日木曜日

バッチファイルを管理者権限で実行する方法!!

いやー、苦労しました。

Windows7では楽々出来ていた、たとえば自作DLLをレジストリ登録するバッチファイルの自動実行とかって、Windows 10では出来なくなっているんですよね。

セキュリティがしっかりしているというか、とにかく、普通にバッチファイルを実行するとコマンドがアクセス拒否されます。


■バッチファイルを管理者権限で実行!

ではどうするかというと、実際に自作DLLのレジストリ登録をするバッチファイルを「MAIN.BAT」とすると、そのバッチを管理者権限でコールする親のバッチを「START.BAT」として用意します。

バッチファイル2本かよと思われるでしょうが、長々と難しく書くよりもシンプルに2本に分けた方が後々メンテが分かりやすいかなぁと。



powershell Set-ExecutionPolicy -SCOPE CurrentUser RemoteSigned
powershell start-process (フルパスで)MAIN.BAT -verb runas

↑START.BATは上記のように記述しました。

バッチファイルの中から、PowerShellのコマンドを投げるわけです。

一応、まだPowerShellのコマンドファイルが無効なユーザーのため、有効にするコマンドを最初に投げています。

次が本命で、MAIN.BATを「管理者権限で実行する」実行しています。

RunAsというのが管理者権限というわけです。

これで、今までアクセス拒否食らっていたレジストリ登録なども出来るようになりました。

Windowsって、CMDとPowerShellという新旧二つのコマンドシェルがありますが、どちらか一方だけで良いとはいかないですね。

両方をまんべんなく使わないと、結構落とし穴にはまります。

2019年2月27日水曜日

朝起きてみると、i-MiEVのカタログが落ちてた。

今朝起きてみると、なんとi-MiEVのカタログが本棚から落ちていて、ついつい見入ってしまいました。


↑うむむむー、自分が惚れているからって贔屓しまくりかも知れないけど、やっぱりアイはめちゃくちゃカッコ良いですね。

2006年登場ほやほやの当時は、あまりにも未来的過ぎて、いくらなんでも丸すぎやしないか??と思ったけど、オンリーワンの繭型クーペスタイルは結局オンリーワンのままだったし、時が経つにつれて味が出て来てもう大変。


↑おはっ、と声が出てしまうくらいカッコいい。

ミッドシップエンジンにしか出来ない骨格。

等長ドライブシャフト、ブレーキング時に重量配分が限りなく50:50に近づく設計など、見えない所が凄いという理想形。

エンジンて・・・i-MiEVはミッドシップモーターだけど・・・。


↑しかしアイすげぇですね。

元々は2006年に誕生したマシンなんだけど、古さが全くゼロというか、むしろこれから出るクルマが全然追いつけないというか。

量産車なのにここまでプロトタイプマシンの雰囲気を纏ったまま来ているのも珍しい。

i-MiEV、アイミーヴは、市販電気自動車第一号、初号機という誉もあるんですよね。

三菱だからマスコミも冷たいけど、もしもアイ、i-MiEVを、トヨタとか欧州メーカーが出していたら、今でも事あるごとに話題にしてもらえるくらいの大名車だったと思います。

2019年2月26日火曜日

ASUS E203シリーズ、ZenFone、Officeが噛み合って大快適に

もしかして、もしかすると、個人的には今がPCライフ・・・というよりも、全ての情報機器ライフの黄金期かも。

ASUS E203シリーズ(NAとMA)で資料やプログラムを作り、ZenFoneで持ち出して見て、軽い編集も行う。

ZenFoneは極めて優秀なテザリング能力もあるので、ASUS E203シリーズをどこでも快適にネットにつなげる役割も請け負ってくれる。

そして、それらをつなぐ、Office 365 SOLO (Office + プレミアムOneDrive)。

全てが噛み合ってとても素晴らしい環境になっています。

特に、Office 365 SOLOは、サブスクリプション購入してて良かった、どころの話じゃないです。

プレイステーションの有料サービスをやめて、その分をOffice 365 SOLOにぶっこんだわけですが、心から良かった。

Excel 2019(相当)が所有全マシンに自由にインストール出来るのは果てしなくデカいし、プレミアムサービスに昇格したOneDriveは、無料版よりもやはり性能が上がっているような感じで(個人的な感覚)す。

情報を全てネットに置いて、スムーズに読み書きする・・・これが、ただの遊びや絵に描いた餅ではなくて本当にスムーズに出来るようになっており、完全にPCライフ、情報ライフの質を変えてくれています。

2019年2月24日日曜日

PowerShellで、簡単な記述でファイル変換のコード変換をしたい

今回の記事では、PowerShellでもって、ファイルのコード変換を簡単にやってみようというものです。

PowerShellは、シェルスクリプトと言いつつ.NET Frameworkが使えるために完全にプログラミング言語の性質も持っています。

その気になれば、C#言語やJavaScriptの勢いで突き進む事も可能ですが、シェルスクリプトの気軽さも併せもっているのが本当に驚異。

今回は、たとえば、BOMなしUTF-8のファイルを、WindowsおなじみのShift_JISに簡単な記述で変換してみます。




$CONVF1="C:\TEMP\SAMPLE_UTF8N.DAT"
$CONVF2="C:\TEMP\SAMPLE_SJIS.DAT"

$ENC1=NEW-OBJECT System.Text.UTF8Encoding -ArgumentList @($false)
$ENC2=[System.Text.Encoding]::GetEncoding("Shift_JIS")

$DATA1=[System.IO.File]::ReadAllLines($CONVF1,$ENC1)
[System.IO.File]::WriteAllLines($CONVF2,$DATA1,$ENC2)

↑たったこれだけで(も)OKです。

変数名や文字コードオブジェクトの名前は、分かりやすいように末尾1が変換前、末尾2が変換後としました。

バイトストリームクラスを使って1行づつ読んで書く・・・というのも可能ですが、単純な変換であれば、変換元のコードで一気にファイル内容を配列に読んで、変換先のコードで配列をファイルに一気に書き込む・・・でOKです。

ちなみに、BOMなしUTF-8のエンコードをしたい時は、System.Text.EncodeクラスのスタティックメソッドGetEncodingではだめなので注意が必要です(BOM付きになってしまう)。


↑変換前は、BOMなしUTF-8です。


↑変換後は、Shift_JISに変換されました。

文字コードを入れ替えるだけで、他のパターンでもコード変換が簡単に出来るようになります。

2019年2月23日土曜日

PowerShellでファイルの一覧を、BOMなしのUTF-8ファイルに出力する方法

前回の記事で、ファイルの一覧をEXPORT-CSVを使ってファイル出力したのですが、これには大きな制約がありました。

EXPORT-CSVでCSVファイルを簡単に作れるのは素晴らしい事なのですが、いかんせん文字コード「UTF-8」は、必ずバイトオーダーマーク「BOM」が付く形式になってしまうのでした。

そこで、今回は、便利なEXPORT-CSVではなく、自力で「文字コード」をBOMなしUTF-8に指定し、ファイルをテキストファイルに書き込もうという方針です。



$F = (GET-CHILDITEM "C:\Windows\SysWow64" | ?{$_.EXTENSION -match ".EXE" -and !($_.PSIsContainer)}) 
$F2= ($F | SORT @{Expression="LastWriteTime";Descending=$true},Name)
$F3="";$F2 | %{ $F3+=($_.Directory.ToString()+","+$_.Name+","+$_.LastWriteTime.ToString("yyyyMMdd,HHmmss")+","+$_.Length.ToString()+"`r`n")} 
$ENC=NEW-OBJECT System.Text.UTF8Encoding -ArgumentList @($false)
[System.IO.File]::WriteAllLines("C:\Temp\FILELIST2.CSV",$F3,$ENC)

↑コマンドの流れは以下のようになります。

  • (1)ファイルの一覧を取得するところまでは前回と同じく、2段階に分けてみました
  • (2)違いは3行目からです
  • (3)配列$F3に、ファイル情報を元にして、自力でカンマ区切り形式文字列を作り出して格納
  • (4)配列を文字コードBOMなしUTF-8でファイルに書き込み
↑実行すると、ちゃんとBOMなしのUTF-8となります。

昔のテキストエディタだと、BOMのありなしはよく分からない事がありましたが、 ちなみに文字コードですが、以下のようにします。

$ENC=NEW-OBJECT System.Text.UTF8Encoding -ArgumentList @($false)

-ArgumentListでパラメータの配列を投げ込むのですが、ここでBOMなしになります。

他の書き方としては、

ENC=[System.Text.Encoding]::GetEncoding("UTF-8")

と書けば短くて良いのでは??と思われるでしょうが、これだとBOMが付いてしまうのです。

ちなみに、トラブルの元として名高いWindowsのメモ帳ですが、有無も言わせずにBOM付きUTF-8で保存する上に、文字コードの表示もしない仕様なので、他の文字コード前提のアプリケーションの挙動を無意識に壊してしまう・・・という所に原因がありそうです。

ただ、PowerShellは、バージョンによって挙動が変化したりするかも知れないので、バージョンによって確認が必要かも知れないですね。

今日現在のWindows 10に実装されているPowerShellバージョンは、コマンド「$PSVERSIONTABLE」で確認できるのですが、 5.1.17763.316(長い)です。

PowerShell 王道の使い方(?) ファイルの一覧を取得してCSVファイルに出力したい

今回は、PowerShellの使い方でも特に王道かなと思われる、「ファイルの一覧を取得してCSVファイルに出力」をやってみたいと思います。


$F = (GET-CHILDITEM "C:\Windows\SysWow64" | ?{$_.EXTENSION -match ".EXE" -and !($_.PSIsContainer)}) 
$F2= ($F | SORT @{Expression="LastWriteTime";Descending=$true},Name)
$F2 |SELECT-OBJECT Directory,Name,LastWriteTime,Length| EXPORT-CSV C:\Temp\FILELIST.CSV -encoding UTF8 -NotypeInformation

↑コマンドは横に長くなるので、結果を2段階に分けて取得して、最後にEXPORT-CSVコマンドレットでCSVファイルにぶっこむ、というやり方をしたいと思います。

  • GET-CHILDITEMで情報を取得し、拡張子EXEだけ、ファイルだけに絞り込み。
  • 最終更新日を降順、名前を昇順でソート。
  • Directory、Name、LastWriteTime、LengthをCSVに出力
というやり方になります。

ソートが割とやっかいで、全部が昇順なら楽なのですが、降順と昇順を混在させようとすると、連想配列(ハッシュ)で書かないといけなくなるのでどうしても記述が長くなってしまいます。

また、EXPORT-CSVですが、文字コードが初期値でASCIIなので日本語が文字化け(?になる)します!!

-encodingオプションに、UTF8だとバイトオーダーマーク(BOM)付きUTF8で、defaultだとShift_JISになります。

EXPORT-CSVのUTF-8は3バイトのバイナリ(BOM)がくっついているので、プログラムコードで入力データとして使用する時は注意が必要だったりします。

このBOMと改行コード(など)は、データをテキスト形式で扱う時に、まれに直撃弾を食ってプチパニックになるので心構えが必要だったりしますね。


↑実行すると、ファイルの一覧が最終更新日付の降順、名前の昇順にソートされ、ディレクトリ(フォルダ)、名前、最終更新日、バイト数項目でCSVに書かれます。


↑ファイルの内容の確認は、GET-CONTENT ファイル名(フルパス)でもOKです。

EXPORT-CSVを使うメリットとしては、区切り文字(デリミター)や、タイトル行の付与に煩わされなくて良いという事と、デメリットとしては、文字コードや出力内容などに融通が利かないため、場合によっては使えなくなるという所でしょうか。

2019年2月22日金曜日

時計の数字が揃った記念

朝、目が覚めたんで、せっかくだから朝の勉強でもしようかなぁと何気なく手に装着しっぱなしのG-SHOCK見たら!

2-22 4:44 44の数字がパッと目に飛び込んで来ました。

そんだけ・・・。

・・・。

そ、そんだけでも何なんで、G-SHOCKの話でも。

個人的には、やっぱり腕時計はG-SHOCKが一番良い・・・というか、もはやG-SHOCK以外はつけない方向ですね。

一番惹かれるのは、装着してても一切の行動に制約がかからない自由度。

時計を気にする必要が全くない。

時計そのものが、外傷を負う事を全く気にしなくても良い堅牢さを持ち、メカニズムも信頼性の塊。

逆パターンで、G-SHOCKはケースが樹脂で覆われているというのも大きく(金属製は別として)、時計が他のものを傷つけたりもしない。

よく「スマホが普及したのだから腕時計いらない」という話を聞きますが・・・!?。

それは一見識としても、G-SHOCKだけは例外。

まさに人体の一部となりえる唯一の存在という事で、スマホでもこれにだけはかなわないであろう!という存在。

2019年2月19日火曜日

ありがとう!プレイステーションヴィータ!!

ついに正式にプレイステーションヴィータの出荷終了がアナウンスされました。

7年もの長い間本当にありがとう。

感謝の気持ちしかありません。

ヴィータを世の中に出して下さった全ての方々にも感謝です。

個人的には、やはりヴィータは史上最高のゲーム機です。

人生のゲーム面において、これほどの幸せをくれたマシンはありません。

このゲーム機を選んだ事に誇りを持っています。

これほどの素晴しいゲーム機と出会わせてくれてありがとう!!

2019年2月17日日曜日

PowerShellで仮想メモリの状況の表示と設定を行いたい

愛用のASUS E203MAですが、ストレージの容量に余裕がありません。

全体で64GB、空き容量は常に20GBを切るギリギリの攻防戦が宿命づけられています。

こんな状況ですから、ストレージを少しでも節約するため、仮想メモリの容量チェックとリセットは欠かせません。

大きな作業を終えた後は必ず行っています。

ただ、この仮想メモリは、そもそも隠しファイルになっているくらいで、頻繁に容量を確認したり、あまつさえ頻繁に設定を変更してリセットするユーザーなどは想定外のようです。

つまり、設定へのアクセスや変更は面倒です。

というわけで、PowerShellで容量の確認と、設定の変更をする必要に迫られてしまいました。

いつものように関数にして、プロファイルに組み込みました。


■仮想メモリの状況を確認する「VMEM」コマンド(関数)


#仮想メモリを表示
function global:VMEM() {
    WRITE-HOST "---仮想メモリ状況---"
    WRITE-HOST "〇ストレージ使用容量"
    $VMEM_STORAGE = GET-CHILDITEM "C:\" -FORCE | ?{$_.Name -match "pagefile.sys|hiberfil.sys|swapfile.sys"} 
    $VMEM_STORAGE | %{$_.Name + "(MB) " + ($_.Length/[Math]::Pow(1024,2)).ToString(".000")}
    
    WRITE-HOST "〇設定情報"
    $VMEM_INFO=Get-WmiObject -Class Win32_PageFileSetting | ?{$_.Name -eq 'C:\pagefile.sys'}
    $VMEM_INFO | %{"初期(MB)="+($_.InitialSize).ToString() + " 最大(MB)="+($_.MaximumSize).ToString()}
}

↑仮想メモリファイルは、隠しファイルであるため、素直にGET-CHILDITEMをしても無効ですので、-FORCEオプションを付けます。

仮想メモリファイルは、pagefile.sysなのですが、モダンアプリ用のものも表示してみます。


ちょっと勉強の都合上、このコードはASUS E203MAではなく、マザーシップPCの「Aspire 5750G」で作成し、実行してみました。



WINDOWS>VMEM
---仮想メモリ状況---
〇ストレージ使用容量
hiberfil.sys(MB) 6494.340
pagefile.sys(MB) 16.000
swapfile.sys(MB) 16.000
〇設定情報
初期(MB)=16 最大(MB)=16

↑実行すると、ストレージを圧迫する容量と、仮想メモリの設定がどうなっているのか、両方を表示するようになっています。

単位ですが、悩んだのですが、設定時にはメガバイトで指定するようになっているため、メガバイト(MB)単位にしました。


■仮想メモリの設定をする

見るのは良いとして、では設定を変更するためのコマンドです。

初期値と最大値を前の値から変更します。

コマンドはVMEM_RESET 初期値 最大値とパラメータ付きで実行するように作りました。

環境によって必要な値は違うし、そもそも、ストレージに余裕があればこの設定はしない方が良いです。

私には必要でも、設定変更系はリスキーなのでおすすめするものではないです。




function global:VMEM_RESET($INIT, $MAX) {
    $VMEM_INFO=Get-WmiObject -Class Win32_PageFileSetting | ?{$_.Name -eq 'C:\pagefile.sys'}
    $VMEM_INFO.InitialSize =$INIT
    $VMEM_INFO.MaximumSize =$MAX
    $VMEM_INFO.put()

    #仮想メモリ内容
    VMEM
    WRITE-HOST "---【注意】再起動が必要です!!---"
}



WINDOWS>VMEM_RESET 16 1024


Path          : ¥¥localhost¥root¥cimv2:Win32_PageFileSetting.Name="c:¥¥pagefile.sys"
RelativePath  : Win32_PageFileSetting.Name="c:¥¥pagefile.sys"
Server        : localhost
NamespacePath : root¥cimv2
ClassName     : Win32_PageFileSetting
IsClass       : False
IsInstance    : True
IsSingleton   : False

---仮想メモリ状況---
〇ストレージ使用容量
hiberfil.sys(MB) 6494.340
pagefile.sys(MB) 16.000
swapfile.sys(MB) 16.000
〇設定情報
初期(MB)=16 最大(MB)=1024
---【注意】再起動が必要です!!---


↑仮想メモリの設定を変更した後は、再起動しないと反映されません。

コマンドで勝手に再起動というのはマキシマム・リスクなので、勝手に再起動はしません。

一応の警告メッセージのみ表示にとどめております。

ちなみにあくまでも参考までにですが、RESTART-COMPUTERで再起動します・・・がホントに一気にいきなり再起動に行くので実行には最大限の注意が必要です。

PowerShellで、メインRAMとストレージとCPU利用率を一回で表示する

当ブログでは、これまで、PowerShellにて、PCのメインRAM、ストレージ、CPU利用率を求めてきました。

まとめて「ALL_STATUS」で一回で表示するようにしてみました。

ちなみにプロファイルに組み込むのが手っ取り早いです。

プロファイルの場所を開くのは(あれば)「II (SPLIT-PATH $PROFILE)」コマンドです。



#メインRAMのモニター
function global:MEM() {
    $all=(Get-WmiObject Win32_OperatingSystem | %{($_.TotalVisibleMemorySize)});
    $free=(Get-WmiObject Win32_OperatingSystem | %{($_.FreePhysicalMemory)});
    $use=$all-$free;

    $all=[Math]::Round(($all/[Math]::Pow(1024,2)),3,[MidpointRounding]::AwayFromZero);
    $free=[Math]::Round(($free/[Math]::Pow(1024,2)),3,[MidpointRounding]::AwayFromZero);
    $use=[Math]::Round(($use/[Math]::Pow(1024,2)),3,[MidpointRounding]::AwayFromZero);
    
    $OutputEncoding = [console]::OutputEncoding;
    Write-Host "---メインRAM ---";
    Write-Host "ALL (GB)= " ($all).ToString();
    Write-Host "FREE(GB)= " ($free).ToString();
    Write-Host "USED(GB)= " ($use).ToString();
}

#CPU情報の表示
function global:CPU() {
    $CPU = GET-WMIOBJECT Win32_PerfFormattedData_PerfOS_Processor
    Write-Host "---CPU利用率---"
    $CPU | %{$__N="[CPUコア]"; $__P = " 利用率: " + $_.PercentProcessorTime.ToString("000") + "%";if($_.Name -eq "_Total"){ ($__N+"*総力"+$__P)}else{($__N + $_.Name + "号機"+$__P)}}

}

#Byte=>GB変換(小数点以下3桁まで)
function global:ConvertGB([double]$value) {
    $compute = [Math]::Round($value/[Math]::Pow(1024,3),3);
    
    return $compute;
}
#ストレージ状況
function global:STORAGE() {
    $LINE="-" * 80;
    $STORAGE_SOURCES = GET-PSDRIVE | ?{$_.Provider -match "FileSystem"}
    WRITE-HOST "---ストレージ使用状況---"
    WRITE-HOST $LINE;
    foreach($STORAGE_SOURCE in $STORAGE_SOURCES) {
        $MES = (
            $STORAGE_SOURCE.Name + "ドライブ"+
            " ☆空き(GB)=" +(ConvertGB ($STORAGE_SOURCE.Free)).ToString(".000")+
            " 使用中(GB)=" +(ConvertGB ($STORAGE_SOURCE.Used)).ToString(".000")+
            " 全容量(GB)=" +(ConvertGB ($STORAGE_SOURCE.Used + $STORAGE_SOURCE.Free)).ToString(".000")
        );
        WRITE-HOST $MES;
        if((ConvertGB $STORAGE_SOURCE.Free) -lt 18.0) {
            WRITE-OUTPUT ((" "*10)+"【容量注意】"); #WRITE-HOSTではないので注意
        }
        WRITE-HOST $LINE;
    }
}

#パソコンのメインRAM、ストレージ、CPU全てを一斉表示
function global:ALL_STATUS() {
    MEM
    STORAGE
    CPU
}


↑今までのコマンドをまとめただけですが、タスクマネージャーを起動してパフォーマンス見るよりは速いし、ASUS E203MAへの負担も少ないかなぁと。

PowerShellを起動するのは、Windowsキー+Xキーを押してから、Aキーです。



C:\>ALL_STATUS
---メインRAM ---
ALL (GB)=  3.827
FREE(GB)=  1.413
USED(GB)=  2.414
---ストレージ使用状況---
--------------------------------------------------------------------------------
Cドライブ ☆空き(GB)=20.082 使用中(GB)=37.107 全容量(GB)=57.189
--------------------------------------------------------------------------------
Dドライブ ☆空き(GB)=30.517 使用中(GB)=28.497 全容量(GB)=59.015
--------------------------------------------------------------------------------
---CPU利用率---
[CPUコア]0号機 利用率: 031%
[CPUコア]1号機 利用率: 025%
[CPUコア]*総力 利用率: 028%



↑ASUS E203MAだと、タスクマネージャーを開くと、このタスクマネージャーの起動そのものがCPUパワーを結構消費したり、なかなかの重さ。

コマンドで出来る事はコマンドでやりたいところです。

PowerShellでストレージの容量を表示しつつ、色々考えてみる

PowerShellでストレージの容量を表示してみたい!

という時は、ぶっちゃけ「GET-DRIVE」だけなのですが、それをベースに色々なPowerShellの書き方を盛り込んでみたいと思います。

  • 処理は関数化
  • バイト数をGBに変換する関数を作成
  • 残量18GB切ったら警告表示
というわけで、以下の関数を作って、プロファイルに組み込んでみました。

プロファイルがあれば「II (SPLIT-PATH $PROFILE)」コマンドで場所が開きます。



#Byte=>GB変換(小数点以下3桁まで)
function global:ConvertGB([double]$value) {
    $compute = [Math]::Round($value/[Math]::Pow(1024,3),3);
    
    return $compute;
}
#ストレージ状況
function global:STORAGE() {
    $LINE="-" * 80;
    $STORAGE_SOURCES = GET-PSDRIVE | ?{$_.Provider -match "FileSystem"}
    WRITE-HOST "---ストレージ使用状況---"
    WRITE-HOST $LINE;
    foreach($STORAGE_SOURCE in $STORAGE_SOURCES) {
        $MES = (
            $STORAGE_SOURCE.Name + "ドライブ"+
            " ☆空き(GB)=" +(ConvertGB ($STORAGE_SOURCE.Free)).ToString(".000")+
            " 使用中(GB)=" +(ConvertGB ($STORAGE_SOURCE.Used)).ToString(".000")+
            " 全容量(GB)=" +(ConvertGB ($STORAGE_SOURCE.Used + $STORAGE_SOURCE.Free)).ToString(".000")
        );
        WRITE-HOST $MES;
        if((ConvertGB $STORAGE_SOURCE.Free) -lt 18.0) {
            WRITE-HOST ((" "*10)+"【容量注意】"); 
        }
        WRITE-HOST $LINE;
    }
}


↑GET-PSDRIVEで情報を取得し、ファイルシステム分だけの情報に絞り込み、空き、使用中、全容量をドライブ毎に一行にして表示。

最初はオブジェクトを繰り返し処理する%{}で書いてみましたが、かなり横長なので、foreach()によるコード記述にしました。

18.0GBを切ると警告メッセージ。

愛用のASUS E203MAは、eMMC-64GBなので残量にはナーバスです。

大型のWindows Updateさえ来なければなぁと思うのですが、しゃあない。

画面にテキストを表示する時には、WRITE-HOST使っていますが、PowerShellで文字列を連続で表示したい時は"文字列"*回数と書くだけで手軽にできるので凄い。



C:\>STORAGE
---ストレージ使用状況---
--------------------------------------------------------------------------------
Cドライブ ☆空き(GB)=17.499 使用中(GB)=39.691 全容量(GB)=57.189
          【容量注意】
--------------------------------------------------------------------------------
Dドライブ ☆空き(GB)=30.517 使用中(GB)=28.497 全容量(GB)=59.015
--------------------------------------------------------------------------------

↑実行するとこのような感じです。

あらららいきなり容量注意だーー。


↑というわけで、仮想メモリ見たら3GBほど膨らんでいたため、クリーンアップして再起動。

ギリギリでストレージの空きが20GB台を回復しました。

ASUS E203MAを本気でガンガン使うと、どうしてもExcel 2019、VS Code、SQL-Server、OneNote、ブラウザあたりは同時に起動しておくため、メインRAM 4GBだと仮想メモリが膨張してしまいますね。

eMMC-64GBだと、本当に1GBの価値が高いというか重たいので、将来的にSSD-256GBなどという驚異の超贅沢はぶっこかないので、eMMC-128GBのASUS E203シリーズ出て欲しい!!

2019年2月16日土曜日

業務知識の勉強に良さそうな本を買ってきました

コンピューターの勉強は一生やりつづけても到底追いつかないくらい日々膨張しつづけていて、まるで宇宙やんけ!!とおののく量なのですが、だからって、ひたすらそれだけを追い続けていても厳しい世の中。

というわけで、ここは業務知識の本も買わなくては!!と・・・「ITエンジニアのための業務知識がわかる本」というのを買って来てみました。


↑なんや、一冊だけか!?と思われるでしょうが、本は良いやつを一冊とかで良い気がしますね。

どの道、細部や応用知識は、ネットに求めるようになっている時代でもありますし。

それに、本書は、実戦で使える知識を中心にして編纂されているようで、第5版まで改訂が続くくらいの良書であろう。


↑本書は、業務の存在理由のところから解説してくれています。

本書独自のレベル分けも、理解の手助けとなってくれる所です。

レベル1=法律による規制がある部分、レベル2=準拠するのが望ましい部分、レベル3=何かのメリットがあるからやってる部分、レベル4=企業ごとの創意工夫の部分・・・なるほどそういうのもあるのか・・・。

せっかく買ったので頑張って頭に叩き込んで行こうと思います。


↑とりあえず、本に書いてあった事のうち、業務の位置づけフローを忘れないうちにExcel 2019で復習がてら作ってみました。

Excel 2019は、図形とかのインターフェースがかなり洗練されていて、ASUS E203MAでも快適に作業出来るのでホント導入しといて良かった・・・

探偵が早すぎるに続いて、お気に入りドラマ誕生

探偵が早すぎるが終了して気落ちしていたのですが、お気に入りドラマがまた誕生しました。

その名も「柴公園」です。

柴犬のあたる、じっちゃん、さちこ、ポチが永久保存版グレートプリティ。

登場人物は全て柴犬のパパもしくはママと表現され、本名は出てこないのが特徴的。

あたるパパ、じっちゃんパパ、さちこパパ、ポチママが、散歩中に出会ったり出会わなかったり、何やら語り合ったり激突したり、小さな日常がゆったり過ぎてゆくだけの、どことなく哀愁漂う雰囲気たっぷりの大人の(?)ドラマ。


正直、大した事件が起きるわけでも、波乱のドラマも無いのですが、毎週楽しみです。

探偵が早すぎると共に、1話もナスネから消さないで保存していております。

PowerShellで配列を手入力で使いたい

PowerShellを電卓として使う話の発展ですが、計算したい値が沢山あるとして、一つ一つを計算していると間違いやすくなってしまう、あるいは時間がかかってしまう・・・というような時の話です。

いやいやそんな時は、必殺のExcelを電卓にしろよ・・・と言われるでしょうが、Excel無い時とかどうしようもない。

PowerShellなら誰もが確実に持っている環境なので安心です。


たとえば、レンズの焦点距離を配列に格納し、それぞれ、フルサイズカメラに装着した時に、ASP-Cカメラの視点では焦点距離がどう変化するのか?というのを連続で計算したいと思います。



$A=@(15,20,24,28,35,40,50,85,100,150,200)

↑まずここが味噌ですが、配列にレンズの焦点距離を好きなだけ格納します。

PowerShellで手入力にて配列を使う時は、@()を使います。


function APSC($value){return [Math]::Round($value/1.6,0,[MidpointRounding]::AwayFromZero)}

↑ 計算式のメインですが、関数にして記憶しておきます。

元の焦点距離を÷1.6しているのですが、小数点以下が沢山出てくるので、四捨五入して整数に丸めます。

この時は[Math]クラスのスタティックメソッドRoundを使います。

PowerShellで四捨五入する時は[MidpointRounding]::AwayFromZeroオプションをを絶対に設定しないといけません。しないと0.5が1じゃなくて0になってしまいます



$A | %{APSC($_)}


↑いよいよ配列の内容をさっき作ったAPSC()関数を使って連続計算します。

単純な配列の繰り返し計算だけならもうこれだけでOK!!



$A | %{$_.ToString().PadLeft(3)+"mm => "+ (APSC($_)).ToString().PadLeft(3)+"mm相当"}


↑少し画面表示用にテキストを追加してみます。

この処理のポイントはたった一つだけ、%{}が配列の内容を繰り返し処理する構文という事です。



 15mm =>   9mm相当
 20mm =>  13mm相当
 24mm =>  15mm相当
 28mm =>  18mm相当
 35mm =>  22mm相当
 40mm =>  25mm相当
 50mm =>  31mm相当
 85mm =>  53mm相当
100mm =>  63mm相当
150mm =>  94mm相当
200mm => 125mm相当

↑画面表示が整形されて表示されました。

ちなみに、PadLeft(3)は、文字の左に空白を自動的に詰めて、指定桁数(今回は3桁)に揃えるメソッドです。

PowerShellでCPU利用率を取得してみる

CPUの利用率をすぐに見たい時の話ですが、王道はもちろんタスクマネージャーを開いてCPUの利用率グラフを見る事ではあります。

ただ、タスクマネージャーそのものがかなり起動コストが高く、愛用のASUS E203MAをもってしても、ちょっと一瞬だけCPU利用率を見たい時に使うのは重過ぎる存在。

そこで、PowerShellでコマンド実行時のCPU利用率を表示するようにしてみました。



function global:CPU() {
    $CPU = GET-WMIOBJECT Win32_PerfFormattedData_PerfOS_Processor
    Write-Host "---CPU利用率---"
    $CPU | %{$__N="[CPUコア]"; $__P = " 利用率: " + $_.PercentProcessorTime.ToString("000") + "%";if($_.Name -eq "_Total"){ ($__N+"*総力"+$__P)}else{($__N + $_.Name + "号機"+$__P)}}

}

↑ただこのコマンド、正直、コンソールから入力するには非常に長すぎるコマンドで厳しい。

そこで、いきなりコンソールを叩くのをやめて、さっさとCPUという関数を作ってしまいます。

これをプロファイル($PROFILEコマンドでファイルの場所と名前が表示されます)に組み込んでおくと、PowerShell起動の度に登録されていつでも使えるようになります。

上記のようにすれば、コンソールからCPUと入力するだけで、CPU利用率を取得する事が出来ます。

取得時間は数秒を要する事もあり、無反応だから言ってあわてて切らないようにお願いいたします。



Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

C:\>CPU
---CPU利用率---
[CPUコア]0号機 利用率: 020%
[CPUコア]1号機 利用率: 020%
[CPUコア]*総力 利用率: 020%
C:\>CPU
---CPU利用率---
[CPUコア]0号機 利用率: 037%
[CPUコア]1号機 利用率: 037%
[CPUコア]*総力 利用率: 037%
C:\>CPU
---CPU利用率---
[CPUコア]0号機 利用率: 029%
[CPUコア]1号機 利用率: 041%
[CPUコア]*総力 利用率: 035%

↑実行するとこのような結果が出てきます。

ASUS E203MAで実行しているのでコアは2つだけ。

ただx86プロセッサは1コアあたりの能力が高いので、2コアあれば十分に心強いです。

コマンドは当たり前ですが、何回も実行可能で、その時の利用率を持ってきます。


↑ちなみに、PowerShellやるなら、VS Code(Visual Studio Code)を使うと良いと思います。

ターミナルという、ファイルの拡張子に基づいて各種用意されるプログラム実行環境があるので、普通にエディタの全力でPowerShellのコマンドを書けて、実行する時は、実行したいテキストだけを選択した後でメニューから「選択したテキストを実行」ってするだけ。

ISEという、PowerShell向けのIDEがWindows 10には標準搭載されて来るのですが、これはこれで良いものの、個人的には今やLinuxやMac OSでも用意されているVS Codeで統一して行きたいです。

PowerShellで、そもそもオブジェクトがどんなプロパティを持っているのか知りたい

PowerShellを使っていると、日常的に「オブジェクトをWHERE-OBJECT(?と省略可能)で絞り込む」とか、「SELECT-OBJECT(SELECTと省略可能)で表示したい項目だけを列挙する」という事が起きてきます。

そもそも絞り込んだり、表示したりするための項目(プロパティ)が分からへん!!となってしまうと行き詰まってしまいます。

これ、さすがマイクロソフト、PowerShellを設計する時にそうなる事を重々承知していて、道しるべになるコマンドレット「GET-MEMBER」が用意されているんですねぇ。

安心です。


たとえば、よく使う「GET-CHILDITEM」コマンドレットですが、どんなプロパティを持っているのか知りたい!という時です。



GET-CHILDITEM | GET-MEMBER | ?{$_.MemberType -match "property"}

↑なんや、いきなりMemberTypeって!!と怒られるかも知れませんが、GET-MEMBERの初回だけなので、これだけはしゃあないところ。

GET-MEMBERでざっと全部のメソッドやプロパティが表示されるのですが、これをプロパティだけに絞り込む時は、パイプラインでWHERE-OBJECT(?と省略)にチェーンさせて、プロパティだけに絞り込みます。

PowerShellの正規表現オプション(-match)は標準で大文字小文字を区別しない仕様になっているので、検索に悩まなくて済みます。

もしも、大文字小文字を区別したい時は、-matchオプションではなくて、頭にCを付けた-cmatchオプションにします。

この場合は正確に-cmatch "Property"と書かないとマッチしなくなるので注意が必要です。


↑これでオブジェクトがどんなプロパティを持っているのか分かったので、WHERE-OBJECT(?と省略可能)で絞り込んだり、SELECT-OBJECTで表示したい項目(プロパティ)だけを選択したり、自由自在に出来るようになります。

項目が分からなくなったら、オブジェクト | GET-MEMBERで解決です。

PowerShellで、ファイルの一覧を取得する方法

PowerShellでファイルやフォルダの全部の一覧を取得する時は、単純に以下のように書くだけです。

GET-CHILDITEM 

↑ただし、これだけだと本当にざっと一覧が出るだけですので、たとえば、ファイルだけの一覧が欲しい時はオブジェクトをパイプライン(|記号)でチェーンさせてWHERE-OBJECT(省略で?と記述可能です)でもって絞り込みます。



GET-CHILDITEM | ?{!$_.PSIsContainer}

↑$_.PSIsContainerプロパティは、フォルダ(ディレクトリ)の時にTrueを返すもので、これを!で否定するとファイルだけを抽出するという意味になります。

表示させる内容を選びたい時は、パイプライン(|記号)でさらにSELECT-OBJECTにチェーンさせ、表示したい項目(Property)を選択します。



GET-CHILDITEM | ?{!$_.PSIsContainer} | SELECT-OBJECT Name,LastWriteTime,{$_.Length/1024} 

↑名前(Name)、最終更新時間(LastWriteTime)、サイズ(Length)を選択して表示します。

ただし、Lengthはそのままだとバイトになるので、/1024してKBに直しています。

SELECT-OBJECTは、プロパティの列挙だけでなく、スクリプトブロックによって値を直接加工する事が出来るのもポイントです。



GET-CHILDITEM -RECURSE | ?{!$_.PSIsContainer} | SELECT-OBJECT Name,LastWriteTime,{$_.Length/1024} 

↑サブフォルダも含めて全ての階層を検索する時は、GET-CHILDITEMに-RECURSEオプションを付けます。

PowerShellは、Windowsの伝統に合わせているのか、大文字小文字を区別しない仕様になっているので楽です。


PC買ったらPowerShellをまったり楽しもう! 便利な電卓としてスタート出来るよ!

今更ですがPCって何でも出来てホント良いですねー。

特に、個人的にべた惚れしているのが、ガチの3万円台で買える格安・節電モバイルPCの「ASUS E203シリーズ」。

色々と用途はありましょうが、Windowsに100%必ず搭載されていて、誰でもすぐに使える「PowerShell」をまったりと楽しむのも良いですよ。

これ、平たく言うと、PCをコマンドで操作するためのシェルスクリプトなんですが、対話式のプログラミング実行環境(REPL = Read Eval Print Loop)としての性格もあり、プログラミング教育の一環としても超手軽で良いんじゃないでしょうか。

味噌は、何もしなくとも買ったらすぐに誰でも絶対に使える状態にある事。

何かをインストールしたり、どっかのサイトにつないだり、そんなの全く必要なし。

まんぷくラーメンくらいまんぷくです(?)。

Windowsキー+Xキーを押して、その後でAキーを押すと、管理者権限モードでPowerShellが起動します。


↑何かを実行中に切る時はCtrl + Cキー。

終了はEXITコマンドかウインドウを閉じるだけ。

↑何をすればええんや!!と思ったら、手っ取り早いのが電卓の代わりに使えるのです。


29800+3218+4960+3248+(5246/324)

↑こんな感じで素直に計算式を入力して結果が出せるので楽々。



$A = "29800+3218+4960+3248+(5246/324)"
IEX $A

↑PowerShellの便利さは、ごく普通に変数が使える事です。

計算結果を変数に格納しておいて、後から何回でも使いまわせるのはもちろん、文字列で数式そのものを変数に格納しておいて、IEXコマンドレット(INVOKE-EXPRESSIONでもOK)で文字列に格納した数式を実行する事も可能です。


↑さらに、特定の計算パターンを何回も使う時は、function(param) {...}という形で関数を作ってしまえます。

たとえば、カメラのレンズの焦点距離ですが、フルサイズのレンズが言っている焦点距離をAPS-C基準に換算したい!という時は・・・

function APSC($value) { return $value / 1.6}

だけでOK。

あとは、APSC 100と入力すると、焦点距離100mmのレンズはAPS-C換算で62.5mm相当にワイド化する・・・というのが求められます。

この関数、もちろん、数式の一部に組み込む事も可能です。

こんな感じで、PowerShellってぇのはもう手軽さでは絶対に右に出るものはないし、お金もかからないし、実用性は塊みたいなもんだし、まったりPCライフにもおすすめです。

2019年2月13日水曜日

VSCodeがどんどんバージョンアップしていく

テキストエディタのVS Code(Visual Studio Code)ですが、どんどんバージョンアップしていて勢いが大変なものがあります。

もともと愛用していたテキストエディタ「unEditor」が、バージョンアップが長らく停止したままで、Windows 10の規定のアプリに指定も出来ない気落ち状態とは全く対照的。

まるで昇り竜の如き勢い・・・という感じです。


↑バージョンアップがある時は、画面の右下に小さくポップアップ通知されて来るので、「バージョンアップするよ」って選ぶだけでスタートします。


↑VS Codeは、どんどん使い勝手が向上しています。

少し前までは、たとえば拡張機能をインストールするとエディタ再起動が必須でありました。

そのためのボタンも用意されていたものですが、今はもう再起動が不要になっています。

結構な構造の変化だと思うんですが、そういうドラスティックなバージョンアップもガンガン入っているのが頼もしい。

今はもう、個人的には、unEditorとYokka Grepは例外としても、それ以外はもう他のテキストエディタは使う気にならないくらいVS Codeメインになってます。

2019年2月12日火曜日

OneNoteを使いこなしたい

このところ、勉強や日常生活におけるメモですが、急ピッチでオンラインメモの「OneNote」に移行しつつあります。

最初にパッとメモするのは紙とペンのメモだったりする事は多いのですが、その時は、頃合いを見てOneNoteに移し替えはするようにしています。

今、複数のPCとスマートデバイスを運用するようになっているので、どのマシンでもメモが共有できて、決して紛失する心配も無いというのはボルテージ高いです。

実は、このOneNoteですが、かなり前から触れてはいたのです。

ただ、自分の環境だけかも知れないのですが、どうにもオンラインと言いつつ他のマシンで共有できるようになるまでの更新時間が安定せず、だったら別にいいや・・・となっていました。

大きく変わったのは、やはり、Office 365 SOLOサブスクリプション購入によって、キーパーソンのOneDriveがプレミアムサービスに昇格した事です。

気のせいかも知れないですが、Office 365 SOLO導入後は、OneDriveの性能がかなりパワーアップしたように思えます。

OneNoteはもちろん、OneNote以外も全ての共有スピードが速く安定しています。

書いて作ってそれだけでなく、ほぼ即時で他のマシンに継承して閲覧や編集が出来るスピード感、これは大きい。


■こんな使い方も

↑OneNoteは、PCはもちろんですが、スマートデバイス=ZenFone max plus M1の存在がやはりでかい。

このZenFoneの「ZenUI」は、ホーム画面を右にフリックするとニュースが表示されるようになっているのですが、テクノロジーやカメラ関連の情報が数多くリストアップされてくれるので助かります。

朝起きたり、家事とかで一段落いた時、新聞よりも手軽にぱぱっとこういったニュースをチェック出来ます。


↑ただ見るだけではなく、これは重要な記事だぞ!と思えば、OneNoteの出番です。

必要なURLというページを作っているので、そこに追加してブックマークのように使っています。

これだけでも本当に助かります。

このOneNoteは、単純にオンラインにメモがとれる・・・というだけでなく、入力を自動的に表形式に変換したりするなど、探って行けば行くほどに感心させられるくらい高機能が備わっています。


↑OneNoteはスピード勝負のところがあるので、最初に開くページがどこか、というのは大事です。

特に書く内容に応じて分類していると、そのページに一発でアクセスしたいころ。

ページを直接アイコン化してホーム画面に置けるので安心です。


■OneDriveに何でも可能

↑ZenFone・・・というか、android 7.0以降は、何をするのでも直感的に分かりやすく本当に優秀なOSだなぁと感心しまくりです。

何でもかんでもOneDriveに突っ込んでおけば、スマートデバイスとPCとの連携も十分に生きて来て笑顔です。

このOneDriveへの格納する操作も、これ以上ないくらい分かりやすくてホント素晴らしい。

Office 365 SOLOサブスクリプション購入以前は、性能だけでなく(性能は本当にOffice 365 SOLOで上がったのかどうか確証はないですが、体感ではかなり性能アップしているように思えるのです)、容量が1TBに爆増した事で心配もなくなり、何でもかんでも格納したくなる原動力になっています。


今までオンラインメモはどうもいまいち活用してなかったのですが、今後は使いこなして行きたいです。

2019年2月11日月曜日

とりあえず、node.jsでサーバーサイド処理を作り、SQL-Serverデータをブラウザ表示する

今回の記事では、今までコンソール動作ばかりさせてみたnode.jsですが、個人的に三連休の間にやりたいリストに入れていた事をギリギリで達成してみたいと思います。

それは、node.jsでサーバーサイド処理を作り、SQL-Serverから取得したデータをブラウザに表示するまでとりあえずでもいいからやってみる、という事です。

あまり動きをよく掴めていないので、試行錯誤しながらでしたが何とか出来ました。


■仕様

  • パラメータや入力は無し。表示だけ。
  • 表示データはSQL-Serverから取得します。
  • コンソールではなく、ブラウザに描画します。
  • 画面とコードは別ファイルに分けます。
■実行してみる

↑実行はコンソールからです。

実行に成功すると、メッセージをコンソールに表示するようにしてあり、あとはずっとlocalhost:1234でWebサーバーとしてクライアントからのアクセスを待ち受けするようになっています。


↑localhost:1234にアクセスすると、今回の処理が走ります。

SQL-Server経由で、Excel 2019に自分で勉強した時に作り続けているナレッジベースに接続し、その内容を取得。

コンソール画面ではなく、HTMLを使ってブラウザに表示します。


↑単に表示するだけですが、見たい列だけを取捨選択出来るようにだけはしてあります。

ただ、画面を動的に作るのってどうするのか?? フレームワークを使わない生のnode.jsはなかなか難しい感じで、くるくると私の悪い頭を振り絞って自己流で原始的な方法でやってみました。


■プログラムコード(TEST2.js)



/**
 * @fileoverview ナレッジベースをとりあえずブラウザ表示するテスト
 */

/**
 * 確認用変数
 */
let aSqlData = new Array();
let sHTML = "";

/**
 * 接続オブジェクト定義
 */
let SqlConObject = require('tedious').Connection;
let config = {
    server  :'E203MA',
    authentication:{
        type     : 'default',
        options  : {
            userName : 'ログインID',
            password : 'パスワード'
        }
    },
    options :{
        instanceName:'EXPRESS2017',
        encrypt :false,
        database:'MAINDB'
    } 
};
let SqlCon = new SqlConObject(config);
let i = 0;
let j = 0;
let SqlReqObject = require('tedious').Request;

/**
 * Event
 * サーバー接続
 */
SqlCon.on('connect', function(err) {
    if ( err ) {
        console.log('接続エラー(' + err + ')');
        process.exit();//終了
    }
    procSqlExecute();
});

/**
 * Function
 * サーバー接続時処理
 */
function procSqlExecute() {
    let SqlStr = "SELECT T.* ";
        SqlStr+= "FROM OPENROWSET(";
        SqlStr+= "    'Microsoft.ACE.OLEDB.16.0'";
        SqlStr+= "   ,'Excel 12.0;DataBase=D:¥¥OneDrive¥¥HOME¥¥MAIN_DATA¥¥知識¥¥ナレッジベース.xlsx'";
        SqlStr+= "   ,'SELECT TOP 5 * FROM [学習$]') AS T ";
        SqlStr+= "WHERE [ジャンル] IS NOT NULL "
        
    let SqlReq = new SqlReqObject(SqlStr, function(err, rows) {
        if ( err ) {
            console.log('リクエストエラー(' + err + '');
            process.exit();
        }
        SqlCon.close();
    });

    /**
     * Event
     * クエリーリクエスト時
     */
    SqlReq.on('row', function(SqlRows) {
        aSqlData[i] = new Array();
        j=0;
        //@@@@@@@@@@[LOOP-START]@@@@@@@@@@
        SqlRows.forEach(function(SqlColumn){
            aSqlData[i][j]=SqlColumn.value;
            j++;
        })
        //@@@@@@@@@@[LOOP-START]@@@@@@@@@@
        i++;
    });

    /**
     * Event
     * クエリーリクエスト終了処理
     */
    SqlReq.on('requestCompleted',function(){
        //console.log(aSqlData);
        //console.log("( " + i + " )件ありました!");
        sHTML = CreateHTML(aSqlData);
        BeginServerConsole();
    });
    /**
     * クエリーの実行
     */
    SqlCon.execSql(SqlReq);
}

/**
 * Webサーバー処理部分
 */
/**
 * Webサーバー処理
 */
function BeginServerConsole() {
    let http = require("http");
    let server = http.createServer();
    server.on('request', serverProc);

    let fs   = require("fs");
    
    /**
     * Function
     * サーバー処理関数
     * @param {object} req 
     * @param {object} res 
     */
    function serverProc(req, res) {
        fs.readFile(__dirname + '¥¥TEST2.html','utf-8'
            ,function(err, data) {
                res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});
                data = data.replace(/¥{0¥}/,sHTML);
                res.write(data);
                res.write(aSqlData[0][0] + "<br/>");
                res.end();
            }
        );
    }
    
    /**
     * Event
     * サーバー待ち受け
     */
    server.listen(1234,'127.0.0.1'
        ,function() {
            console.log('物理パスは' + __dirname + 'です...');
            console.log('Webサーバー開始しました...');
        }
    );

}

/**
 * Function
 * HTMLエスケープ処理
 * @param  {string} value
 */
function EscapeHTML(value) {
    //↓ここの&は半角にしてね!ブログに載せる都合で全角にしてます
    return new String(value).replace(/</g,"&lt;")
                            .replace(/>/g,"&gt;")
                            .replace(/&/g,"&amp;")
                            .replace(/"/g,"&quot;")
                            .replace(/`/g,"&#x60;")
                            .replace(/'/g,"&#x27;");
}
/**
 * FUNCTION
 * SQL-Serverのデータを画面描画用に作成
 * @param  {object} aSqlData
 * @param  {object} res
 */
function CreateHTML(aSqlData) {
    let i = 0;
    let j = 0;
    let sRes = "";

    if(aSqlData.length > 0) {
        /**
         * ヘッダの描画
         */
        sRes +="<thead>";
        //@@@@@@@@@@[LOOP-START]@@@@@@@@@@
        for(i=0;i<aSqlData[0].length;i++){
            sRes+="<th class='ui-width-25p' data-priority='" + (i+1) + "'>";
            sRes+="ヘッダ" + (i+1);
            sRes+="</th>";
        }
        //@@@@@@@@@@[LOOP-END  ]@@@@@@@@@@
        sRes+="</thead>";
        /**
         * 明細の描画
         */
        sRes+="<tbody>";
        //@@@@@@@@@@[LOOP-START]@@@@@@@@@@
        for(i=0;i<aSqlData.length;i++){
            sRes+="<tr>";
            //@@@@@@@@@@[LOOP-START]@@@@@@@@@@
            for(j=0;j<aSqlData[i].length;j++){
                sRes+="<td>";
                sRes+=EscapeHTML(aSqlData[i][j]);
                sRes+="</td>";
            }
            //@@@@@@@@@@[LOOP-END  ]@@@@@@@@@@
            sRes+="</tr>";
        }
        //@@@@@@@@@@[LOOP-END  ]@@@@@@@@@@
        sRes+="</tbody>";
    }
    return sRes;
}



■画面(TEST2.html)


<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>ハローワールドASUS E203MA</title>
        <style>
            tr {
                border-bottom:1px solid Silver;
            }
            tr:nth-child(even) {
                background-color:silver;
            }
            th {
                background-color:gray;
            }
            .ui-width-25p {
                width:25%;
            }
        </style>
        <link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.0/jquery.mobile-1.4.0.min.css" />
        <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
        <script src="http://code.jquery.com/mobile/1.4.0/jquery.mobile-1.4.0.min.js"></script>
    </head>
    <body>
        <div data-role="page" id="page1">
            <div data-role="header">
                <h1>ASUS E203MA</h1>
            </div>
            <div data-role="content" class="ui-content" style="text-align:center;">
                <table data-role="table" 
                       data-mode="columntoggle" 
                       class="ui-responsive ui-shadow" 
                       data-column-btn-text="列選択"
                       id="myTable" >
                    <!--↓サーバーサイドコードブロック-->
                    {0}
                    <!--↑サーバーサイドコードブロック-->
                </table>

            </div>
            <div data-role="footer">
                <h3>Node.jsで表示したよ!</h3>
            </div>
        </div>

    </body>
</html>


↑動的に画面を書き換えると言っても、本当に原始的で単純なやり方です。

HTML側に、書き換えたいコードブロック部分をマーカーとして設けておいて、そこをリプレースしてブラウザにぶっこむだけ。

ただ、自分なりに、だんだんとnode.jsのサーバーサイド処理の仕組みが実感出来るようになって来ました。

なかなか、他にも勉強したい事がたくさんありすぎて、node.jsだけやれないのですが、これ本当に楽しいですね。

まったりとPCをいじるのは小さな幸せーです。

真冬の仙台の街をPowerShot G9X Mark2で撮りました

この連休中は、ほとんど家事、クルマの世話、勉強くらいで、どこにも出かけなかったのですが・・・。

ちょっと本を買いたくて(Amazonは今回は気が乗らなくて)真冬の仙台の街に出てみました。

本を買う目的があったため、荷物が増える見込みでカメラはEOS KISS Mすらも大き過ぎる!と感じPowerShot G9X Mark2の出番です。


↑久々に文化横丁の所に来てみました。

こういう昭和っぽいレトロな雰囲気や場所は本当に好き。

私はお酒を全く飲まないのですが、場は好きなのです。

雰囲気を出すために、あえてハイライトを飛び気味で撮影しました。


↑町歩きの雰囲気を出すため、こちらも歩きながらふわっと撮影してみました。

こういう時、PowerShot G9X Mark2の大きさは、何ものにも代えがたいくらい貴重品です。




↑仙台の街ですが、ビルという人工物の最たる場所ではあるのに、冬の香りのようなものは山や海と変わらず存在し、むしろ季節感が豊潤な気がします。


↑仙台で気になるのが、目立つ一等地に廃ビル・・・さくら野跡地がある事です。

家やビルって、人がいなくなると不思議なまでにガクッと老朽化が進むので心配なところです。


↑アエルを見上げたところ。

ここはビルが美しいので惹かれる場所です。


↑本屋さんをめぐったら、空腹に打ち負かされ、せっかくだからめちゃくちゃ好きなケーキ屋さんに無予約で突入しました。

なんか今のシーズンは苺をテーマにしてるみたいで、苺づくし。

なんと、苺カレーがありました。

ケーキも美味しいし、サフランライス+苺カレーもバッチリでした。


↑仙台地下鉄を撮影してみました。

シャッター速度1/400秒、絞り=F/5.6、ISO感度=6400、AFはAIサーボ。

真っ暗い中、ライトの直射が来きて、さらに高速動体というかなり厳しい中でもG9X2はしっかり撮れますね。

今までの実績を考えても、PowerShot G9X Mark2は、動体撮影にもなかなか強いオールマイティなカメラだったりします。


■別の日に撮った写真

↑翌日は雪が予想されたとても寒い日、畑で「野焼き」をやってみました。

霜対策かな?

なかなか見られない光景だったのであわててG9X2で撮りました。

G9X2は、写真撮る予定のありなしに関係なく持ち歩けるカメラなのでやっぱ大したやつです。


■ちなみに買った本

↑欲しい本が沢山あったんですが、何冊も買っても私の悪い頭ではキャパオーバーなので、1冊だけに絞り込みました。

秀和システムのSpring Boot 2 プログラミング入門です。

テクニカルな部分や実戦ノウハウはネットとは言え、とっかかりの部分はやはり本で学びたいところ。

Amazonで買う事も増えましたが、今回思ったのが、本屋さんの香りというか雰囲気は絶対にネットではマネが出来ないなぁというところ。