スカパー録画用のLS-V2.0TLからメールが届いた(その後)
録画してあるタイトルの90%ほどを別のLS-VLへムーブ
HDD故障の予兆が出たLS-V2.0TLですが、やっと録画してあったタイトルの9割ほどを別のLS-VLに移し終わりました。とにかく1タイトルづつしかムーブできないという最悪のUIのため、何と一ヵ月もかかってしまいました。
1タイトルづつの手作業には付き合いきれないので、何とか自動化させるためにSikuli Scriptを使うことにしました。Sikuli Scriputは画面上で行うマウスやキーボードの操作を自動で行うためのツールで、特徴的なのは画像のスナップショットを撮り、その画像とのマッチングによって動作するスクリプトを作ることで自動化すると言う点です。と言ってもピンと来ないかもしれませんので、スクリプトの例を見た方が良いかな?
以下はLS-VLから番組をムーブする際に使ったスクリプトと、Sikuli ScriptのIDE画面です。
スクリプト言語はPythonをベースにしたJythonと呼ばれるものです。スクリプトの中に画像が埋め込まれているのが分かるでしょうか?画像は左上にあるカメラアイコン「スクリーンショットを撮る」を使い、Webブラウザで番組ムーブを行いながら撮ったものです。例えば5行めのwait( [ムーブ(移動)する番組を選択], 60) という文は、Webブラウザの画面に「ムーブ(移動)する番組を選択」が表示されるまで60秒まで待つと言う意味です。また9行めのclick( [世界ふれあい街歩き] ) は、画面に「世界ふれあい街歩き」という画像が表示されたら、それをクリックするという意味になります。
このスクリプトは「世界ふれあい街歩き」というタイトルのシリーズ番組を全て他のLS-VLへムーブするまで繰り返す動作をします。(実際には、もう少し色々な場合分けが必要になりましたが、コア部分はこんなモンです。)
Sikuliスクリプトが動作する様は、勝手にマウスカーソルが移動して画像をクリックして画面が遷移していくので、見ていて結構面白いものです。このようにしてGUIで操作できる事は、ほぼSikuliで行うことができます。ただ幾つか問題もあります。
- Sikuli ScriptはJavaで記述されているので様々なプラットフォームで動作するが、Javaのため速度はそこそこ。
- 画像とのマッチングを画面全体で行うので動作が重い。マッチングの範囲(リージョンと言う)を指定することもできるが、何処に表示されるか一定しない場合には範囲指定できない。
- 画像のスナップショットを撮りながら一通り実行させなければ、スクリプトが完成しない。手順を記録してスクリプト化する機能はない。
- 画面を構成する画像に類似のものがあると、意図したものでない画像とマッチングしてしまうことがある。
- 画面遷移が複雑で手番が多いと、スクリプトも複雑化し、かつ実行速度も遅くなる。
等々。。。
ともあれ、何とかHDDが完全に逝ってしまう前に番組タイトルを移し終りました。まぁ、さすがに全部は無理でしたが。問題のLS-VLはバラしてHDDを交換したのですが、3年も経つと筐体のプラスチックが経年劣化しており、ハメ込みの爪部分はことごとく割れてしまいました。ファンのスリット部分も、軽く力を加えただけでパキパキ折れていきました。筐体を元どおりにハメる事が不可能になってしまったので、輪ゴムで縛っているという状態です。
仕方ないので、これは予備機として今稼働中のLS-VLが満杯になるか再びHDDが故障でもした時のためにとっておく事にしました。
LS-VLから抜いた逝きかけているHDDですが、朝から全セクタへの0書き込みを行わせ、6時間ほどかかってやっと終わりました。S.M.A.R.T.情報を採ってみたら、
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x000f 126 099 006 Pre-fail Always - 1179965088
3 Spin_Up_Time 0x0003 092 092 000 Pre-fail Always - 0
4 Start_Stop_Count 0x0032 100 100 020 Old_age Always - 64
5 Reallocated_Sector_Ct 0x0033 100 100 036 Pre-fail Always - 504
7 Seek_Error_Rate 0x000f 060 060 030 Pre-fail Always - 85924410342
9 Power_On_Hours 0x0032 069 069 000 Old_age Always - 27735
10 Spin_Retry_Count 0x0013 100 100 097 Pre-fail Always - 0
12 Power_Cycle_Count 0x0032 100 100 020 Old_age Always - 64
183 Runtime_Bad_Block 0x0032 100 100 000 Old_age Always - 0
184 End-to-End_Error 0x0032 100 100 099 Old_age Always - 0
187 Reported_Uncorrect 0x0032 100 100 000 Old_age Always - 0
188 Command_Timeout 0x0032 100 100 000 Old_age Always - 0
189 High_Fly_Writes 0x003a 100 100 000 Old_age Always - 0
190 Airflow_Temperature_Cel 0x0022 066 042 045 Old_age Always In_the_past 34 (0 180 36 19)
191 G-Sense_Error_Rate 0x0032 100 100 000 Old_age Always - 0
192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 62
193 Load_Cycle_Count 0x0032 100 100 000 Old_age Always - 64
194 Temperature_Celsius 0x0022 034 058 000 Old_age Always - 34 (0 19 0 0)
195 Hardware_ECC_Recovered 0x001a 032 005 000 Old_age Always - 1179965088
197 Current_Pending_Sector 0x0012 100 100 000 Old_age Always - 0
198 Offline_Uncorrectable 0x0010 100 100 000 Old_age Offline - 0
199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age Always - 0
240 Head_Flying_Hours 0x0000 100 253 000 Old_age Offline - 156517198228569
241 Total_LBAs_Written 0x0000 100 253 000 Old_age Offline - 4256885407
242 Total_LBAs_Read 0x0000 100 253 000 Old_age Offline - 3592578343
|
となっていました。197 Current_Pending_Sector は 8だったのが 0になりましたが、代替した不良セクタ5 Reallocated_Sector_Ct は最初の頃の480から 504に増えました。やはりこのまま使い続けるには不安がありますねぇ。
|