2014年8月31日日曜日

スマート カードのデバイス ID を取得できませんでした。

  Windows8.1のイベントビューアーにSCPNP、イベントID:1000というエラーがスリープ復帰後等に発生していて、システムの動作に影響なさそうなのでとりあえずエラーを止めた。
- System
  - Provider
   [ Name]  Microsoft-Windows-SCPNP
   [ Guid]  {9F650C63-9409-453C-A652-83D7185A2E83}

   EventID 1000

   Version 0

   Level 2

   Task 0

   Opcode 0

   Keywords 0x8000000000000000

  - TimeCreated
   [ SystemTime]  2014-08-29T04:12:42.949118500Z

   EventRecordID 9958

   Correlation

  - Execution
   [ ProcessID]  956
   [ ThreadID]  1312

   Channel System

   Computer 1F-TV

  - Security
   [ UserID]  S-1-5-18

- EventData
  ReaderName Gemplus USB Smart Card Reader 0
  ErrorCode 2148532255 

この適当な対処方法を他人に見せるのもどうかと思うけど、自分用のメモ。下記レジストリキーの値を0から1に変える。
(キーの場所は上記のエラーのGuidをregedit内で検索する。)
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\WMI\Autologger\EventLog-System\{9f650c63-9409-453c-a652-83d7185a2e83}
"EnableLevel"=dword:00000001

 以上。

2014年8月22日金曜日

pluckメソッド

 あるカラムのデータを配列として扱うにはpluckが便利だから使え、と言われた。
 複数カラムから2次元的な配列としても取り出せる。flattenすれば1元配列として扱えて、今回はこれを使うかも。

[57] pry(main)> Prize.pluck(:grade, :sales_quantity).first(10)
   (10.2ms)  SELECT "prizes"."grade", "prizes"."sales_quantity" FROM "prizes"
=> [[1, 1], [2, 9], [3, 118], [4, 5961], [5, 99657], [6, 179019], [1, 6], [2, 66], [3, 1719], [4, 48235]]
[58] pry(main)> Prize.pluck(:grade, :sales_quantity).first(10).flatten
   (10.3ms)  SELECT "prizes"."grade", "prizes"."sales_quantity" FROM "prizes"
=> [1, 1, 2, 9, 3, 118, 4, 5961, 5, 99657, 6, 179019, 1, 6, 2, 66, 3, 1719, 4, 48235]
[59] pry(main)> a = Prize.pluck(:grade, :sales_quantity).first(10)
   (10.5ms)  SELECT "prizes"."grade", "prizes"."sales_quantity" FROM "prizes"
=> [[1, 1], [2, 9], [3, 118], [4, 5961], [5, 99657], [6, 179019], [1, 6], [2, 66], [3, 1719], [4, 48235]]
[60] pry(main)> a[1]
=> [2, 9]
[61] pry(main)> a[1][1]
=> 9

zipメソッド

 とりあえずメモだけ。配列を2次元化できる?
 統計とかとるときに使えるかな?
[1] pry(main)> a=[1,2,3]
=> [1, 2, 3]
[2] pry(main)> b=[3,4,5]
=> [3, 4, 5]
[3] pry(main)> c=[5,6,7]
=> [5, 6, 7]
[4] pry(main)> a.zip(b)
=> [[1, 3], [2, 4], [3, 5]]
[5] pry(main)> a.zip(b.zip(c))
=> [[1, [3, 5]], [2, [4, 6]], [3, [5, 7]]]
[6] pry(main)> a.zip(b.zip, c.zip)
=> [[1, [3], [5]], [2, [4], [6]], [3, [5], [7]]]
[7] pry(main)> a.zip(b.zip, c.zip).flatten
=> [1, 3, 5, 2, 4, 6, 3, 5, 7]
[8] pry(main)> a.zip(b.zip, c.zip)
=> [[1, [3], [5]], [2, [4], [6]], [3, [5], [7]]]
[9] pry(main)> a.zip(b.zip.flatten, c.zip)
=> [[1, 3, [5]], [2, 4, [6]], [3, 5, [7]]]
[10] pry(main)> a.zip(b.zip.flatten, c.zip.flatten)
=> [[1, 3, 5], [2, 4, 6], [3, 5, 7]]
[11] pry(main)> d=a.zip(b.zip.flatten, c.zip.flatten)
=> [[1, 3, 5], [2, 4, 6], [3, 5, 7]]
[12] pry(main)> d[1]
=> [2, 4, 6]
[13] pry(main)> d[1][1]
=> 4
[14] pry(main)> d[0][0]
=> 1
[15] pry(main)> d[0][2]
=> 5
[16] pry(main)> d[0][1]
=> 3

弱ったストレージからデータを救出する

 HDDの調子が悪くなった時、まずは丸々どこかへコピーします。調子の悪いHDD上であれやこれややってしまうと余計に壊れて本当にアクセスできなくなるかもしれませんからね。

 いつもこの最初のデータ退避作業にddrescueを使っていて、使うために必要なツール二つをメモしておく。

 こちらはデータ救出用のLinuxディストリビューション。いろいろなツールが用意されていて、私がいつも使うddrescueもインストール済み。
 一般のディストリビューションでは普通入っていないと思う。元になっているddだけ。

 こちらはLinuxのインストールイメージをUSBメモリにブータブルな状態で展開してくれるツール。Windows用。

 後はSystemRescueCdを起動して、ターミナル上でddrescueを使うだけっす。ヤバそうなディスクは下記の順でコピーしています。
ddrescue [オプション] [コピー元 /dev/sdbとか] [コピー先 /dev/sdcとか] [ログファイル]
例)sdb→sdcにコピー
ddrescue -fvn /dev/sdb /dev/sdc copy.log
ddrescue -fvr 1 /dev/sdb /dev/sdc copy.log
ddrescue -fndr -1 /dev/sdb /dev/sdc copy.log

 ディスク全体だったりパーティションをコピーする場合は強制オプションの-f をつけろと怒られるのでつけます。
 -nは不良ブロックをスルーさせる。ディスクが動くうちに多くのデータを救出したいので、先に不良ブロックの読み取りをリトライし続けてディスクの寿命を短くするのは愚か者らしいです。-nをつけない場合は、不良ブロックを分割して部分的に読み取る。読めないブロックはさらに分割して部分的に読む。
 -rはリトライ数。-1にすると無限。あきらめたときにctrl+cで終了。
 残りが読み込みの難しい不良セクタだらけになった状態になったら、-dオプションを付けるとなぜか読み取れる確率が上がる気がする。
 -vは詳細表示。
 ログが無くても実行はできますが、あるとコピー中断してもレジュームできたり、再度試行した時に読めなかった不良セクタ分だけを読んでくれます。上の例のように何度か違うコマンドを使いながらコピーを進める場合は必須。

軽症だと、コピー後にチェックディスクとかして完全な状態に戻ったりしますが、そういう時はNTFSなりファイルシステムって凄いなと思う。


参考:
Ddrescue

----------------------------
ddrescueは、UNetbootin, Universal Netboot InstallerでオンラインインストールできるParted Magicにも入っていました。
こちらの方が圧倒的に簡単です。

2021/1/4追記

2014年8月18日月曜日

cronを実行する

 WEBサービスでバックグラウンドで定期処理をするってのは必ずと言っていいほどあると思いますが、どうやってやんのかなーと。

 Railsにはwheneverという便利なgemがあるようなので、使ってみる。

参考:
Railsアプリのバックグラウンド処理をWheneverを使ってCron化する