半角文字を全角文字に変換

以下のコードをそのままC#またはVBには移植不可
F#のための軽そう?なコードを自作してみました。


■実行結果

> "゙ア゙イヴエオ゙".StrCnv();;
> リアル: 00:00:00.000、CPU: 00:00:00.000、GC gen0: 0, gen1: 0, gen2: 0
val it : System.String = "゛ア゛イヴエオ゛"


■コード

module StringCommon =
    let private map =
        Seq.cache <|
            seq {
                yield ('!','!')
                yield ('"','”')
                yield ('#','#')
                yield ('$','$')
                yield ('%','%')
                yield ('&','&')
                yield ('\'','’')
                yield ('(','(')
                yield (')',')')
                yield ('*','*')
                yield ('+','+')
                yield (',',',')
                yield ('-','−')
                yield ('.','.')
                yield ('/','/')
                yield (':',':')
                yield (';',';')
                yield ('<','<')
                yield ('=','=')
                yield ('>','>')
                yield ('?','?')
                yield ('@','@')
                yield ('A','A')
                yield ('B','B')
                yield ('C','C')
                yield ('D','D')
                yield ('E','E')
                yield ('F','F')
                yield ('G','G')
                yield ('H','H')
                yield ('I','I')
                yield ('J','J')
                yield ('K','K')
                yield ('L','L')
                yield ('M','M')
                yield ('N','N')
                yield ('O','O')
                yield ('P','P')
                yield ('Q','Q')
                yield ('R','R')
                yield ('S','S')
                yield ('T','T')
                yield ('U','U')
                yield ('V','V')
                yield ('W','W')
                yield ('X','X')
                yield ('Y','Y')
                yield ('Z','Z')
                yield ('[','[')
                yield ('\\','¥')
                yield (']',']')
                yield ('^','^')
                yield ('_','_')
                yield ('`','‘')
                yield ('a','a')
                yield ('b','b')
                yield ('c','c')
                yield ('d','d')
                yield ('e','e')
                yield ('f','f')
                yield ('g','g')
                yield ('h','h')
                yield ('i','i')
                yield ('j','j')
                yield ('k','k')
                yield ('l','l')
                yield ('m','m')
                yield ('n','n')
                yield ('o','o')
                yield ('p','p')
                yield ('q','q')
                yield ('r','r')
                yield ('s','s')
                yield ('t','t')
                yield ('u','u')
                yield ('v','v')
                yield ('w','w')
                yield ('x','x')
                yield ('y','y')
                yield ('z','z')
                yield ('{','{')
                yield ('|','|')
                yield ('}','}')
                yield ('~',' ̄')
                yield ('`','`')
                yield ('〜','〜')
                yield ('。','。')
                yield ('「','「')
                yield ('」','」')
                yield ('、','、')
                yield ('・','・')
                yield ('ヲ','ヲ')
                yield ('ァ','ァ')
                yield ('ィ','ィ')
                yield ('ゥ','ゥ')
                yield ('ェ','ェ')
                yield ('ォ','ォ')
                yield ('ャ','ャ')
                yield ('ュ','ュ')
                yield ('ョ','ョ')
                yield ('ッ','ッ')
                yield ('ー','ー')
                yield ('ア','ア')
                yield ('イ','イ')
                yield ('ウ','ウ')
                yield ('エ','エ')
                yield ('オ','オ')
                yield ('カ','カ')
                yield ('キ','キ')
                yield ('ク','ク')
                yield ('ケ','ケ')
                yield ('コ','コ')
                yield ('サ','サ')
                yield ('シ','シ')
                yield ('ス','ス')
                yield ('セ','セ')
                yield ('ソ','ソ')
                yield ('タ','タ')
                yield ('チ','チ')
                yield ('ツ','ツ')
                yield ('テ','テ')
                yield ('ト','ト')
                yield ('ナ','ナ')
                yield ('ニ','ニ')
                yield ('ヌ','ヌ')
                yield ('ネ','ネ')
                yield ('ノ','ノ')
                yield ('ハ','ハ')
                yield ('ヒ','ヒ')
                yield ('フ','フ')
                yield ('ヘ','ヘ')
                yield ('ホ','ホ')
                yield ('マ','マ')
                yield ('ミ','ミ')
                yield ('ム','ム')
                yield ('メ','メ')
                yield ('モ','モ')
                yield ('ヤ','ヤ')
                yield ('ユ','ユ')
                yield ('ヨ','ヨ')
                yield ('ラ','ラ')
                yield ('リ','リ')
                yield ('ル','ル')
                yield ('レ','レ')
                yield ('ロ','ロ')
                yield ('ワ','ワ')
                yield ('ン','ン')
                yield ('゙','゛')
                yield ('゚','゜')
            }
    let private dmap =
        Seq.cache <|
            seq {
                yield (('カ','゙'),'ガ')
                yield (('キ','゙'),'ギ')
                yield (('ク','゙'),'グ')
                yield (('ケ','゙'),'ゲ')
                yield (('コ','゙'),'ゴ')
                yield (('サ','゙'),'ザ')
                yield (('シ','゙'),'ジ')
                yield (('ス','゙'),'ズ')
                yield (('セ','゙'),'ゼ')
                yield (('ソ','゙'),'ゾ')
                yield (('タ','゙'),'ダ')
                yield (('チ','゙'),'ヂ')
                yield (('ツ','゙'),'ヅ')
                yield (('テ','゙'),'デ')
                yield (('ト','゙'),'ド')
                yield (('ハ','゙'),'バ')
                yield (('ハ','゚'),'パ')
                yield (('ヒ','゙'),'ビ')
                yield (('ヒ','゚'),'ピ')
                yield (('フ','゙'),'ブ')
                yield (('フ','゚'),'プ')
                yield (('ヘ','゙'),'ベ')
                yield (('ヘ','゚'),'ペ')
                yield (('ホ','゙'),'ボ')
                yield (('ホ','゚'),'ポ')
                yield (('ウ','゙'),'ヴ')
            }
    /// charの初期値として使用
    let private cn = '\000'
    /// 全角へ変換
    let private fwtransfer c =
        map |> Seq.tryFind(fst >> (=)c)
        |> (fun o -> if o.IsSome then snd o.Value else c)
    /// 濁点半濁点が続く半角2文字を全角文字に変換
    let private dfwtransfer t =
        dmap |> Seq.tryFind(fst >> (=)t)
        |> (fun o -> if o.IsSome then Some <| snd o.Value else None)
    /// 配列を文字列に変換
    let private toString (arr:char[]) = System.String(arr)
    type System.String with
        member x.StrCnv() =
//            x |> Seq.map fwtransfer |> Seq.toArray |> toString        // 半角1文字を全角にする
            x |> Seq.fold (fun (l,(a,b)) c ->
                match (a,b) with
                | ('\000',_)
                | (_,'\000') -> l,(b,c)
                | t ->
                    match (dfwtransfer t) with
                    | Some d -> l@[d],(cn,c)
                    | None -> l@[fwtransfer a],(b,c)
            ) ([],(cn,cn))
            // ↓がなんとかならないのか・・・ださい!
            |> (fun (l,(a,b)) ->
                match (a,b) with
                | ('\000',b) -> l,[b]
                | (a,'\000') -> l,[a]
                | (a,b) -> l,[a;b;]
                |> (fun (l,l2) ->
                    l2 |> List.map fwtransfer
                    |> List.append l
                    |> List.toArray)
                |> toString
            )


//

Windows Server 容量監視スクリプト

必要になったっぽいので、容量監視用のJScriptを作ってみました。
VBは見たくもないので基本WSHJScriptで作ります)
以下のサイトがとても参考になりました。

[Windows] Windows Scriptファイル(wsf)を使ってイベントログを保存したりメールを送信したりするサンプル(JScript使用版)
http://d.hatena.ne.jp/seraphy/20081010


【CheckDiscSize.wsf】

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<package>
    <job id="CheckDiscSize">
        <?job error="true" debug="true" ?>

        <!-- 設定情報はJScriptで定義する(型も宣言できるため一番楽で正確)-->
        <script language="JScript">
        <![CDATA[
            var config =
            {
                "BoundaryValue": 0.9
                , "SMTP":
                {
                    "Host": "SMTPサーバアドレス"
                    , "Port": 25
                    , "From": "送信元メールアドレス"
                    , "To": "宛先メールアドレス"
                    , "CC": ""
                    , "Subject": "[Warning] ディスク容量監視アラート(90%超過) - サーバ名"
                    , "Body": ""
                }
            };
        ]]>
        </script>

        <script language="JScript" src="CheckDiskSize.js"></script>
    </job>
</package>


【CheckDiskSize.js】

/**
* Disk Size Name
* 数値を PB TB GB MB KB B に変換する。
*/
var dsn = function (num) {
    var sizename = [];
    sizename[0] = "B";
    sizename[1] = "KB";
    sizename[2] = "MB";
    sizename[3] = "GB";
    sizename[4] = "TB";
    sizename[5] = "PB";

    for (var cnt = 0; 0 < Math.floor(num / 1024); cnt++) {
        num /= 1024;
    }
    num = Math.round(num * 100) / 100;
    return (new String(num) + '' + sizename[cnt]);
}

/**
 * DISK一覧を取得
 */
var GetDisks = function(bv) {
    var check = 0;
    var arr = [];
    var locator = new ActiveXObject("WbemScripting.SWbemLocator");
    var service = locator.ConnectServer();
    var drives = service.ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType = 3");
    var e = new Enumerator(drives);

    arr.push("ドライブ名\t容量\t空き容量\t使用容量率%")

    for (; !e.atEnd(); e.moveNext()) {
        var drive = e.item();
        var space = 1 - (drive.FreeSpace / drive.Size);
        if (!check) check = bv <= space;
        var space = Math.round(space * 100)
        arr.push(drive.DeviceID + "\t" + dsn(drive.Size) + "\t" + dsn(drive.FreeSpace) + "\t" + space + "%");
    }
    return { "Check":check, "Text": arr.join("\r\n") }
}

/**
 * メールの送信
 */
var SendMail = function (config) {
    if (!config.From) {
        WScript.echo("[ERROR] メールの送信元が設定されていません。");
        WScript.Quit(1);
    }
    if (!config.To) {
        WScript.echo("[ERROR] メールの送信先が設定されていません。");
        WScript.Quit(1);
    }
    if (!config.Body) {
        WScript.echo("[ERROR] メールの本文が設定されていません。");
        WScript.Quit(1);
    }

    var msgobj = new ActiveXObject("CDO.Message");

    // 送信内容設定
    msgobj.From = config.From;
    msgobj.To = config.To;
    msgobj.Cc = config.CC;
    msgobj.Subject = config.Subject;
    msgobj.TextBody = config.Body;

    // サーバ設定
    msgobj.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2;
    msgobj.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = config.Host;
    msgobj.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = config.Port;
    msgobj.Configuration.Fields.Update();

    // 送信
    msgobj.send();
};

// 実行
var diskinfo = GetDisks(config.BoundaryValue);
if (diskinfo.Check) {
    config.SMTP.Body = diskinfo.Text;
    SendMail(config.SMTP);
}

実験用 Android タブレット

実験用にふさわしいAndroidタブレットを発見!

CUBE U30GT
http://shop.apadjp.com/products/detail.php?product_id=251

メーカー CUBE 酷比魔方
OS Android Ice Cream Sandwich OS (Android 4.0)
CPU Rockchip RK3066(Cortex-A9 Dual-core)1.5GHz
GPU Quad-core Mali-400(Support OpenGLES2.0/1.1, OpenVG1.1)
メモリ DDR3 1GB
内蔵ストレージ 16GB
液晶パネル 10.1インチ(1280x800)IPS 静電式マルチタッチスクリーン
通信機能 WiFi 802.11 b/g/n、Bluetooth
Gセンサー あり
インターフェイス MicroSDカード
MicroUSB
MiniHDMI
3.5mmステレオヘッドフォン出力
内蔵マイク
カメラ フロント 200万画素
リア   200万画素
バッテリー / 電源 7200mAh / 12V
本体寸法 260.6x170.6x9.6mm
本体質量 674g


スペックは申し分なく、rootも奪えるらしいです。(調べてません)
bootloaderも取れればもう完璧です。
好きなように弄れる23kのAndroid端末となりえる期待の星です。

eBook Reader 電子書籍について

電子書籍の最新情報は「The eBook Reader Blog」を見ると便利かも


10インチのリーダーを探したところ以下の3点が見つかった。
他にも中国製がありましたが没とします。

  1. ICARUS eXceL (E1050BK)
  2. PocketBook 912


eXceLはE-InkのPearlを採用しており、PocketBookはVizplexみたいです。
Pearlは300dpi
Vizplexは150dpi
という大きな違いがあり、CPUも結構差があります。
またPocketBookは902ならAmazonで販売しているけれども912は販売してなさそう。


同じ価格なのでKindleDXに以上の性能なので、日本のKindle発表後でもeXceLを買うかもしれません。
Kindleが圧倒的に良ければ悩みたいと思います。

尚、E-Inkディスプレイ以外は興味ありません。



[追記]
eXcelについて追記します。
この製品は手書きメモが出来るというすばらしい機能があるみたいです!
ちなみにExcelファイルも開けます。
ますます良い製品に見えてきた!!

日本語フォントをインストール可能かどうかを問い合わせ中なので、その返答次第で買うかどうかを決めます。
英語onlyでもいいかもしれない・・・

Google Document がめちゃくちゃ賢い!

Google スプレッドシートスクリプトを組んでみたところ、非常に賢いと感じました。

  1. デバッグは遅いけれどステップ実行が可能
  2. インテリセンスが優秀
  3. エディタ機能が結構利いてる(自動インデントとか)
  4. 何よりもVBAではなくjavascriptベースで書ける

今回作ってみた関数は以下の物
データは1列で表現したいけれど、スプレッドシートの見せ方は列を分けたいという考えで作成した関数。
Google Scriptの呼び出し元情報で列番号が取れれば引数1つ取ることは可能。

/**
 * テキスト階層表示
 */
function sfac(text,pos) {
  if (typeof text != "string") { return ""; }
  var faccount = function (i) { if(text.charAt(i) == "+") { return faccount(++i) } else { return i; } }
  var pcount = faccount(0);
  if(pcount == (pos - 1)) {
    return text.substring(pcount);
  }
  return "";
}


Project Eulerをやっていたおかげで、上記のネスト関数 faccount みたいなコードをぱっと思いつきました。
ただjavascriptなどの言語には向いていない関数だと思われます。
(スタックオーバーフローになりやすい)

[追加]
とんだ勘違い。列番号取得しても基点が分からないので意味がないという!
列番号は以下のコードで取得できました。

SpreadsheetApp.getActiveRange().getColumn()


最終的なコードの全体

function sfac(text,pos) {
  if (typeof text != "string") { return ""; }
  var faccount = function (i) { if(text[i] == "+") { return faccount(++i) } else { return i; } }
  var pcount = faccount(0);
  if(pcount == pos - 1) return text.substring(pcount);
  return "";
}


[追記2]
最終的には、関数の呼び出し元の列の2行目の値から1文字目を数字と断定して取得し、その数字と+の数を判定する関数にした。

/**
 * テキスト階層表示
 */
function sfac(text) {
  if (typeof text != "string") { return ""; }
  var sheet = SpreadsheetApp.getActiveSheet();
  var row = 2;
  var col = sheet.getActiveCell().getColumn();
  var pos = parseInt(String(sheet.getRange(row, col).getValue())[0]);
  var faccount = function (i) { if(text[i] == "+") { return faccount(++i) } else { return i; } }
  var pcount = faccount(0);
  if(pcount == pos - 1) return text.substring(pcount);
  return "";
}

PowerShell でリモートWMI接続エラー 0x80070005 の解決法? (HDD容量ログ出力)

参考にしたサイトをなくしてしまいました!

Format-Table を使っていたけれど、Add-Contentで使えないので削除し、文字列フォーマットを適当に使って Add-Contentを使う様にしました。

Format-Table ○○ | Add-Content

で何故できないのだろうか・・・

ちなみに

Format-Table ○○ | Out-File

なら出力されるけど、文字化けがひどく

-Encoding

指定でエラーになるため、面倒なので書き換えをやめました。


1.ログイン認証情報の保存する。

$root = Split-Path $MyInvocation.MyCommand.Path
$file = "○○ネットワークサーバ.pass"
$path = Join-Path $root $file

$servers = @()
$servers += "192.168.0.1"
$servers += "192.168.0.2"
$servers += "192.168.0.3"

$credential = Get-Credential
$credential.Password | ConvertFrom-SecureString | Set-Content $path


2.ログイン情報を元にWMI接続を行う。

$root = Split-Path $MyInvocation.MyCommand.Path
$file = "○○ネットワークサーバ.pass"
$logfile = "○○ネットワークサーバ_hdd_size.txt"
$logpath = (Join-Path $root $logfile)

$password = Get-Content (Join-Path $root $file) | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PSCredential "userid@domain",$password

$targets = @()
$servers += "192.168.0.1"
$servers += "192.168.0.2"
$servers += "192.168.0.3"

filter GetDiskSize {
    $server_name = $_
    echo "■サーバ ${server_name}に接続します。" | Add-Content $logpath
    
    try
    {
        Get-WmiObject -Class win32_logicaldisk -ComputerName $_ -Credential $credential |
            select -Property DeviceID, Size, FreeSpace, `
                @{Name = "ServerName"; Expression = { $server_name }}
    }
    catch [UnauthorizedAccessException]
    {
        echo "`t>> アクセス権限エラー" | Add-Content $logpath
    }
}
filter OutLogFile {
    [string]$olf_servename = $_.ServerName
    [string]$olf_drivename = $_.DeviceID
    [string]$olf_size = ("{0:0.00}GB" -F ($_.Size / 1GB))
    [string]$olf_usage = ("{0:0.00}GB" -F (($_.Size - $_.FreeSpace) / 1GB))
    [string]$olf_filespace = ("{0:0.00}GB" -F ($_.FreeSpace / 1GB))
    [string]$olf_rate = "-"
    try {
        $olf_rate = ("{0:0.00}%" -F ($_.FreeSpace / $_.Size * 100))
    }
    catch [Exception] {}
    

    "{0}`t{1}`t{2}`t{3}`t{4}" -f $olf_drivename,$olf_size,$olf_usage,$olf_filespace,$olf_rate | Add-Content $logpath
}

#文字列配列でサーバ名を列挙し、列挙したサーバ名全部の容量を出力する
echo "【HDD容量】" | Set-Content $logpath
echo ("{0}`t{1}`t{2}`t{3}`t{4}" -f "レター","容量","使用量","空き容量(GB)","空き容量(%)") | Add-Content $logpath
$targets |
    GetDiskSize |
    OutLogFile

$logpath

Windows 8 Pro が日本でも $39.99 (約4,000円)なら

マイクロソフト、XP以降に39.99ドルでWindows 8 Pro アップグレードを提供


Windows 8 Pro のアップグレード権が 4,000円 なら手持ちのライセンス全部 8 にアップグレードします!
あ、Windows 7 Ultimate 意外のライセンスに限りますが!!


Windows 8 Pro からのダウングレードで7にしても良いならWin7Ultの分も買うかもしれません。
VHDブート が出来て内臓MPEG2コーデックが使えるので、十分使い物になると考えます。

後、XPModeのWindowsXPのライセンス分もアップデートできるかどうかだけ知りたい。