2012/12/29

High DPI Cursor Changer

High DPI Windows 8 Cursor Setで作成したカーソルファイルの導入と設定を自動化するツールとして、High DPI Cursor Changerを作成しました。Windows 8でDPIを200%以上に上げたときにカーソルの輪郭が汚くなる問題に対応するものです。

DPIを200%にしたときの見た目はこんな感じです。標準のカーソルに似せていますが、全てスクラッチで、個人的に気になった点は変えたりもしているので、微妙に違いがあります。

現状、DPIを200%以上にしている人は少ないかもしれませんが、おいおい需要が増えてくるものと予想して。

プロジェクトサイト: High DPI Cursor Changer 英語 / 日本語 at SourceForge.net
実行ファイル from SourceForge.net

2012/12/21

ReadyNASにSSD

大容量SSDの価格低下もそこそこ進んでいるので、先々はNASにもSSDを入れることを考えて、ReadyNAS Ultra 2にIntel X25-M G1を入れてみるテスト。

1. SMART


HDDと入れ替えると、HDDと同様にRAIDiatorがインストールされて(X-RAID2を指定)普通に起動。FrontViewからSSDの情報も見られる。
Intel X25-M in FrontView

温度は1C/33Fと出ているが、RAIDar Protocolで返ってくるのを見ると-1C/31Fで、食い違っていた。

ここからSMARTも一応表示される。
Intel X25-M SMART in FrontView

が、この中に温度はない。また、寿命に関係するAvailable Reserved SpaceとMedia Wearout Indicatorは項目には出ているが、正しい値は取れてない。

このSMARTはPCに接続してCrystalDiskInfo、SSD Toolbox、Smartmotoolsで見たときには、それぞれこんな感じ。
Intel X25-M SMART by CrystalDiskInfo
Intel X25-M SMART by SSD Toolbox
Intel X25-M SMART by Smartmontools

温度


先に温度について考えると、一見して明らかなように、このSSDはSMARTのデータに温度(IDは16進数でC2、10進数で194)を含んでいない。SSDの中には0Cと返すものもあるようだが、このSSDはそもそも温度のデータを返さない。

したがって、ReadyNASが示す1C/33Fあるいは-1C/31Fはダミーの数字で、それもたぶん-1C/31Fの方が本来の数字で(コードの世界では該当するものが存在しないときに-1を返したりする)、その摂氏のマイナス符号を認識し損ねて1Cと取った上で華氏をそれに合わせて計算したのが1C/33Fではないか、という気がする。

寿命


意外だったのはReadyNASがIntelのSSDに特有のAvailable Reserved Space(E8)とMedia Wearout Indicator(E9)を認識したことで、このIDが示すもののデータを持っていなければこの名前は出てこないはず……。

と、ReadyNASではたぶん字数を減らすために「e」を抜いて「Available Reservd Space」となっているが、上にある「Reallocated Sector Count」は字数が多いにもかかわらずそのままで、少し不自然。一方、この「Available Reservd Space」はSmartmontoolsの表記と同じで、「Intel Internal」も同じ。ということから、ReadyNASは標準的な項目以外はSmartmontoolsと同じデータを利用しているのではないか、という推測を立て得る。

それはともかくとして、値の方は出してくるものを間違えていて、意味を成してないわけだが。この当たり、各ベンダー独自の仕様に合わせてデータを処理するようにしないと意味のある数字は拾い出せない、という当然のことを示している。

2. 評価


NASの動作としてはごく普通で、スピンダウン時でもスピンアップを待つことなくすぐにアクセスできる(SSDの場合にスピンダウンが実際にどう動いているのかは未確認)。

という意味で普通に使う分には問題なさそうだが、SMARTの監視は実質的にできず、各ベンダーの仕様がばらばらである限り、NAS側の対応もなかなか進まないような気がするので(add-onでも出てくれば別だが)、SSDの状態が気になるなら時々外してPCに接続してチェックするしかないと思う。

[追記1]

そういえばSmartmontoolsはたいていのLinuxディストリビューションに含まれている……ことを思い出して、ReadyNASのSSHアクセスを有効にしてログインすると、しっかりRAIDiatorにも入っていた。

これでSMARTを見てみると、PCとの接続時と同じように表示される。
Intel X25-M SMART by Smartmontools on RAIDiator (Linux) through SSH

したがって、ReadyNASに入れたままでも、これで定期的にチェックするようにすればSMARTの値を監視できることになる。

以上、後はしいて言えばTrimがどうなるかという点を除けば、ReadyNASでSSDを使う上での障害は実質的になさそうということが分かった。

[追記2]

WindowsのクライアントPCからSMARTの値をチェックするためのスクリプトを書いてみた。PuTTYを使ってSSHアクセスし、smartctlを実行して、結果からSMARTの目的の項目を拾い出してCSV形式で保存する。

手順としては、
  1. ReadyNASに「Enable Root SSH Access」Add-onをインストールしてSSHアクセスを可能にする。
  2. PuTTYをダウンロードして適当なフォルダーに置く。使うのはコマンドライン用のPLINK.EXE。
  3. 以下の内容のバッチファイルを作成して、ファイル名はここでは「smartctl.bat」として同じフォルダーに保存する。
    plink nas-XX-XX-XX -l root -pw netgear1 ^
     "smartctl -A -f brief /dev/sda" > result.txt
    
    • nas-XX-XX-XXはReadyNASのホスト名かIPアドレス
    • -pwの後ろは管理者パスワード
    • /dev/sdaは1番目のディスクの意味

  4. 以下の内容のVBScriptを作成して、ファイル名はここでは「checksmart.vbs」として同じフォルダーに保存する。ATTRIBUTESで目的の項目を指定。
    Option Explicit
    
    Dim FILE_BAT 'Batch file to execute smartctl through SSH
    Dim FILE_RLT 'File to store result of smartctl temporarily
    Dim FILE_RCD 'File to record (append) result of smartctl
    FILE_BAT = "smartctl.bat"
    FILE_RLT = "result.txt" 'Must be the same file in batch file
    FILE_RCD = "record.csv"
    
    Dim ATTRIBUTES 'SMART attributes (separated by space)
    ATTRIBUTES = "Available_Reservd_Space Media_Wearout_Indicator"
    
    'Execute smartctl through SSH
    Dim objShell
    Set objShell = WScript.CreateObject("WScript.Shell")
    Dim result 'Return value to avoid error in using Run method
    result = objShell.Run(FILE_BAT, 0, True)
    Set objShell = Nothing
    
    'Process result of smartctl
    Dim strBuf
    
    Dim objFSO
    Dim objFile
    Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile(FILE_RLT)
    strBuf = objFile.ReadAll
    Set objFile = Nothing
    Set objFSO = Nothing
    
    Dim strLines
    strLines = Split(strBuf, vbLf)
    
    Dim strSer 'Array to hold names of attributes
    strSer = Split(ATTRIBUTES)
    
    Dim strVal 'Array to hold values of attributes
    ReDim strVal(UBound(strSer))
    
    Dim objRegExp
    Set objRegExp = New RegExp
    objRegExp.Pattern = " \d{3} " 'Pattern of value of attributes
    objRegExp.IgnoreCase = True
    objRegExp.Global = True
    Dim i
    Dim j
    For i = 0 To UBound(strLines)
        For j = 0 To UBound(strSer)
            If 0 < InStr(1, strLines(i), strSer(j), 1) Then
                Dim objMatches
                Set objMatches = objRegExp.Execute(strLines(i))
                If 0 < objMatches.Count Then
                    strVal(j) = objMatches(0).Value
                End If
                Set objMatches = Nothing
            End If
        Next
    Next
    Set objRegExp = Nothing
    
    'Record result of smartctl
    Dim strRec
    strRec = Now() & ","
    For j = 0 To UBound(strVal)
        strRec = strRec & Trim(strVal(j)) & ","
    Next
    
    Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
    If Not objFSO.FileExists(FILE_RCD) Then
        'If first record, add header line
        strRec = "Date," & Join(strSer, ",") & "," & vbCrLf & strRec
    End If
    Set objFile = objFSO.OpenTextFile(FILE_RCD, 8, True)
    objFile.Write(strRec & vbCrLf)
    Set objFile = Nothing
    Set objFSO = Nothing
    
    (smartctl.batの内容をFILE_BATの部分に直接書いても良さそうなものだが、そうするとなぜかrecord.txtがホスト側に作成されてしまうので、分けた。)
これで、このchecksmart.vbsを定期的に実行するように設定すれば、結果がCSVファイルに記録されていく。