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化する

2014年8月14日木曜日

ピーマンといかのナムル

 NHKの今日の料理ビギナーズを見て、簡単で美味しそうだったので、メモ。

材料(2人分)
・ピーマン(千切り) 3個
・いか(刺身用/細切り) 60g
・ごま油 大さじ1/2
・塩 小さじ1/5
・コショウ 少々

<作り方>
  1. たっぷりの熱湯(1.6~1.8リットル)に、塩(小さじ1/2)を入れ、ピーマンを加えて混ぜる。再び煮立ったら約10秒間ゆで、冷水にとって冷まし、水気を絞る。
  2. ボウルに、ピーマン、いかを入れ、ごま油(大さじ1/2)をふってからめる。塩(小さじ1/5)、コショウ(少々)を加えて味をととのえたら完成。


 画像は作ったら追加しよう。

2014年8月13日水曜日

Nokogiriでhtmlから必要な情報を切り出す

 Nokogiriっつーhtml/xmlをサイトから切り出してくる便利な超定番gemがあるそうです。

 他人(他のサイト)のふんどし(情報)で相撲をとる(一儲けする)ようなことって大変多くあると思うのですが、これは結構役に立ちそうです。

 まだちょっと試しただけなので、とりあえず参考リンクのメモを。

参考:
Nokogiri を使った Rubyスクレイピング [初心者向けチュートリアル]
Nokogiriで文字化けを防ぐ

2014年8月7日木曜日

githubへ初めてpushする

 githubでリポジトリを作成すると、何をすべきかちゃんと表示してくれるので安心。
git remote add origin https://github.com/XXXXX/XXXXX.git
git push -u origin master

 一度-uを付けてpushすればpush先が記憶されるため次回以降は基本的にgit  pushのみでいける。

2014年8月6日水曜日

spec_helperでrequire

 RSpecとやらを試していますが、deviseとか絡んできてよくわからない。
Factory_Girlが流行ってるぜ〜といろいろなサイトやテキストに書いてあるのでその通りインストールしてみたが、ちょいちょい書かれている設定が全く反映されない。結果としては使うgemをrequireすれば動くようになったんだけど、どこにもそんな説明は書かれていない。
 常識すぎて書いてない?それとも環境がおかしいのか。
require 'factory_girl_rails'
require 'devise'
require 'controller_macros'
include ControllerMacros
RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
  config.include Devise::TestHelpers, :type => :controller
  config.extend ControllerMacros, :type => :controller
<以下略>

 gemはpathが通っているんだけど、moduleはspec_helperと同階層でないと読めない。ディレクトリが違う場合、相対パスで指定してもダメ。同じディレクトリでも、./と指定するとダメ。なんなんだよ。

 1時間ハマった。疲れた。

いろいろ動かない

 設定変えたときとか、gemを追加したときとか、新しく追加したものが機能しないと焦ります。これがしょっちゅうあります。

 結構その多くは、サーバープロセス再起動、ターミナル再起動あたりで改善しているのですが、いつも焦って忘れてしまう。
 今もあるgemをインストールしたあと機能しないので焦りまくっていて、ターミナルの再起動で使えるようになった。

 なんだよちくしょー。

RSpecのテストが辛そう

 以前Railsチュートリアルの始めの方に出てくるテストを少し試して、面倒だなーーーーーーーーという印象が頭にあって、今日パーフェクトRailsを見たらすぐにshoulda-matcherというgemを使え!という展開。あと、factory_girlを使え!と。
 ちょっとハードルが高いとすぐにやる気をなくすので、こういうのがあると大変助かります。ちょっとやってみよう。


コミットしていないファイルを一時的に隠したい

 githubで複数人で作業していると、ローカルでコミットされていないファイルをとりあえず棚上げしてpullしたい時がある。
 その棚上げがstashでできるそうな。
git stash

 そうするとcommitしていないmodifiedファイルが一時的に消える。
 で、pushなりした後にpopを付けて再度実行すると戻ってくる。
git stash pop

 とりあえず今はこの二つのコマンドだけでなんとかなりそう。

参考:
変更を一時的に退避!キメろgit stash
6.3 Git のさまざまなツール - 作業を隠す

2014年8月5日火曜日

production環境での作業

 デプロイ後やローカルでの本番環境のチェックをどうやったらいいかわからなかった。

 アセットファイルのプリコンパイルは以下の通り。
bundle exec rake assets:precompile RAILS_ENV=production

 productionモードでのサーバー起動は以下の通り。
rails s -e production
テキストが終わってないし復習もできていないまま作業することになっちゃって、不安極まりない。
 ここ数日はデプロイ先の環境でアセットパイプライン周辺の問題でうまく表示できず、 あーでもないこーでもないと1人で悶々と思いつく限りのことを試していた。8割は修正できたけど、まだ完璧じゃない。

2014年8月1日金曜日

本番環境で動作確認

 ようやく本番環境(production)が〜なんて話が出てきました。
 デプロイしたらアセットファイルが読み込まれないという問題があって、とりあえずはローカルで本番環境を試しましょうという話に。

 で、どうやんの?
$ rails s -e production
$ rake db:create RAILS_ENV=production
$ rake db:migrate RAILS_ENV=production

参考:
Rails、Rakeコマンドで本番環境(Production)を指定する方法

 さて、今日はこのへんの対応から。