chromebookを使っておもいでばこのデータをサルベージをした話

[さくらインターネット Advent Calendar 2023]("https://qiita.com/advent-calendar/2023/sakura") 07日目の記事です。
5度目まして。さくらインターネットで情シスをしている小泉行生(dumixnet)と申します。
今年は仕事の話ではなく。プライベートで起こったことの複合体を書きます。

# ちゃんと起動しなくなった「おもいでばこ」
10月に2016年くらいに買った「おもいでばこ」が突然起動しなくなりました…

https://twitter.com/dumixnet/status/1708833630037139735

誤家庭と思われる我が家では何台かあるモバイルモニタの1個を使って頑張って復旧しようと思いましたが…

https://x.com/dumixnet/status/1708853033990520862?s=20

結果としてはファームウェアは復旧不可でした(T_T)

↓の記事を見つけたので、HDDを取り出せればデータだけはワンチャン取り出せる！と思い

https://qiita.com/abeshi01/items/6505583bf454f2581b9c

とりあえず、分解しました。

https://x.com/dumixnet/status/1711192327686078755?s=20

ここでお気づきの方。
「UbuntuMateを入れたGPDPocketでやればいいじゃん」って思ってませんか？
44歳の初老の目には7インチモニタでは流石に文字列を見続けるのはつらいです…

# Chromebookでやってみるか！
そこで登場したのは… @log0417 さんから譲っていただいた11インチのChromebookです。

変態的な端末(GPDPocket,ASUS ROG ALLYなどなど)はいくらでも持ってたりするのですが、普通のノートパソコンってのは持ってなくてですね… 

「せっかくだから俺はChromebookでこの問題を片付けるぜ！」と謎の意欲を出してみました。
さて…　今回譲っていただいた機種はこちら

https://acerjapan.com/discontinued-notebook/chromebook/spin11/R751T-N14N

GIGAスクール構想で小中学生が使ってる端末よりちょっとCPUが弱い(N3350)くらいでしょうかね…
ちょっとした調べ物やyoutubeを見る分には全く問題ないです。

今回のサルベージで必要となるツールは
- SQLiteの中身を見るツール
- Pythonで書こうと思ってたのでコードエディタ
です。

Playストアではそのツールは手に入らないので、Linuxをインストールします。

https://support.google.com/chromebook/answer/9145439?hl=ja

「SQLite の中身を見るツール」は「DB Blowser for SQLite」を使いました。
Linuxを開いて以下のコマンドを叩けば「Linuxアプリ」から起動できるようになります。

```
sudo apt-get update

sudo apt-get install sqlitebrowser
```

「コードエディタ」はナウなヤングに人気のVSCodeにしました。

https://zenn.dev/gatabutsu/articles/82008b901c4f04

日本語化やPythonの拡張機能を追加もしました。

https://qiita.com/yoshiry7/items/239cc59a26b7ff8aef54

DB BlowserとVSCodeは起動させるだけで「2-3分づつ」時間がかかるので、
使えるようになるまでの辛抱と使い始めて安定するまでにも「2-3分」かかります。
開発用モンスターマシンではないし「壮大なプログラムを作るわけじゃない」ので、
「スイカゲーム」でもしながら待ちましょう。

# それではサルベージさせてみましょう。
Pythonのコードを書く前に、何をどうしたら、保存された画像や動画がサルベージできるのか？をまとめてみます。

-  画像や動画のデータは「originalfile」 フォルダの下に3桁のフォルダがずらっと並んでてそこに「ハッシュ値.拡張子」という形で保存されている。
-  EXIFの情報などは改変されてない
-  SQLiteのデータベースに「ハッシュ値」と「元のファイル名(相対パスつき)」が登録されている。
-  データベースのハッシュ値とファイル名のハッシュ値は同一

ということは？
- 3桁のフォルダ名をキーにデータベースから対象を検索し、
- ハッシュ値と同じファイル探し出して
- 元のファイル名にリネームしてやる

という解答が正しいように見えました。
それをそのままPythonで書いたものがこちら

```omoidebako.py
import sqlite3
import os
import logging
import time

logging.basicConfig(level=logging.INFO, filename='copyerror.log')
org_dir = './originalfile/'
dbname = './databases/omoject_main.db'
conn = sqlite3.connect(dbname)
cur = conn.cursor()

dirlist = []
files = os.listdir(org_dir)
for filename in files:
    if os.path.isdir(os.path.join(org_dir, filename)):
        cur.execute('SELECT photo_file_path, photo_file_name FROM T_PHOTO WHERE photo_file_path like "' + filename + '/%" ORDER BY _photo_id')
        for row in cur:
            file_dir = org_dir + row[0]
            file_name = org_dir + row[0][0:4] + row[1]
            #print(file_name)
            if os.path.exists(file_dir):
                os.rename(file_dir,file_name)
        else:
            logging.error('%s - CopyError:' + filename)
    time.sleep(2)
    print('End DIR-' + filename)
cur.close()
conn.close()
```

1個1個説明するのはちょっとアレなのですが、
導いた解答どおりにコードは書けました。
そして実行させ「4時間ほど」でサルベージに成功しました。

# ちょっとしたおまじない？
ループの最後にtime.sleep(2)が入ってます。
この理由ですが、最初にsleepなしで実行したときに
最初から最後まで何も考えずにひたすらDB検索＞リネームを繰り返していると途中でディスクの遅延が生じたようで、「やったふり」をされてリネームされてなかったのです…
対策としてフォルダのリネームを全部終わらせたら「2秒」止める(コードの処理を休ませる)という処理を追加してます。

# シメのお言葉
サルベージのコードを書いたりテストしたりする合間に「新しいおもいでばこ」を購入しており、
サルベージ後に取り込みを行い無事に復旧完了です！

さて…　ここまでの大作になってしまったのでそろそろシメに入りましょう。

- データはバックアップを取る事が大事
    - バックアップさえしていればあたらしい機器にバックアップをコピーするだけで終わった
- Chromebookは思ったより万能戦士
    - Linuxのデスクトップアプリがここまで綺麗に動くとは思ってなかった…
- プログラムを書けることは素晴らしい
    - 20代で少しプログラムを仕事にしててよかったです。

毎年仕事関係の話ばっかりでしたので、今年はプライベートな事を書いてみました。
また機会があれば何か書いてみようと思います。

良いお年を！