半角文字を全角文字に変換
以下のコードをそのまま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は見たくもないので基本WSHはJScriptで作ります)
以下のサイトがとても参考になりました。
[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 タブレット
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点が見つかった。
他にも中国製がありましたが没とします。
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 スプレッドシートでスクリプトを組んでみたところ、非常に賢いと感じました。
- デバッグは遅いけれどステップ実行が可能
- インテリセンスが優秀
- エディタ機能が結構利いてる(自動インデントとか)
- 何よりも
糞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