誤って消した Google Chrome のブックマークの復活方法


ブックマークを消してしまった経緯

Chromeに会社で共有しているアカウントでログインをしてしまい、そちらを切断しようとしてユーザーデータまで消してしまいました。

 

Chrome にログインしたアカウントの切断

Chromeにログインしたアカウントを切断するには、【設定】>【ログイン】>【Googleアカウントを切断】だけでできます。

しかし、さらに【設定】>【ユーザー】>【このユーザーを削除】まで行ってしまったところ、ブックマークや保存されていたパスワードなど全て消えてしまいました。。。

 

ブックマークの復元

復旧方法を検索してみたところ、下記のサイトに詳しく書かれていました。
誤って削除したGoogle Chromeのブックマークを復元する方法 | OXY NOTES

大抵の人は上記のサイトに書かれている方法で解決できると思いますが、解決できなかった場合は、私の行った操作が参考になるかもしれません。

私が使っていたのは、Windows7 64bit だったので
C > Users > ユーザー名 > AppData > Local > Google > Chrome > User Data > Default
の中に、「Bookmarks」と「Bookmarks.bak」がありました。

テキストエディタで中身を確認してみたところ、幸いにも以前のブックマークのデータが残っていました。


1.そこで、まずはデスクトップに「Bookmarks.bak」をコピー

2.デスクトップにコピーした「Bookmarks.bak」を「Bookmarks」にリネーム

3.「Bookmarks」のコピーを、元の「Default」フォルダにアップ

4.Chromeの再起動

としましたが、ブックマークを復元できませんでした。

「User Data」フォルダを確認してみたところ、「Default」フォルダが削除されていました。

そこで「User Data」フォルダからエクスプローラーの検索機能で「Bookmarks」を検索してみたところ、「Profile 1」というフォルダに「Bookmarks」が新たに作られていることがわかりました。

詳しく調べたわけではないので推測になりますが、Chromeの設定で「ユーザーの削除」を行ってしまったので、再起動のタイミングで「Default」フォルダが削除され、新たに「Profile 1」というフォルダが作られたようです。

もし、「Default」が見つからずブックマークを復元できない場合は、「User Data」フォルダ内に別の名前でフォルダが作られている可能性がありますので、そちらを探してみると「Bookmarks」を見つけることができるかもしれません。

ただし、Chromeのユーザーを複数持っている場合は、別のユーザーのブックマークを上書きしないように注意してください。

上書き前に、そのフォルダの「Bookmarks」をテキストエディタで確認したり、「Bookmarks」のバックアップをとってから上書きすることをオススメします。

 


【jQuery】select(セレクトボックス)の入力値に合わせて、入力項目の表示・非表示を切り替える


JavaScriptを使用して、セレクトボックスの内容に合わせて、入力項目の表示・非表示の制御を行う方法。
やり方は色々ありますが、今回はアニメーションなどを利用せず、極力簡単に実装出来る方法を選択しました。

実装には jQuery の change イベントを使用し、セレクトボックスの内容に変更があった場合に、スタイルシート(css)でHTMLタグの表示・非表示の切り替えの処理を行っています。

サンプルはこちら

下記のコードでは、
・タイプが「映画」の場合は、「著者」の入力ボックスを非表示
・タイプが「」の場合は、「著者」の入力ボックスを表示
という処理を行っています。

<script type="text/javascript">
$(function(){
  $('#tr_type select[name="type"]').change(function() {
    if ($('select[name="type"] option:selected').val() == 'book') $('#tr_writer').css('display','table-row');
    else $('#tr_writer').css('display','none');
  });
});
</script>
<table>
  <tr id="tr_type">
    <th>タイプ</th>
    <td>
      <select name="type">
        <option value="movie">映画
        <option value="book">本
      </select>
    </td>
  </tr>
  <tr id="tr_title">
    <th>タイトル</th>
    <td>
      <input type="text" name="title" value="" size="20" maxlength="20">
    </td>
  </tr>
  <tr id="tr_writer" style="display: none;">
    <th>著者</th>
    <td>
      <input type="text" name="writer" value="" size="20" maxlength="20">
    </td>
  </tr>
</table>

簡単に解説を

3行目
change イベントの実行

4行目
「本」が選択されていたら、「著者」の tr のスタイルシートを「display: none;」(非表示)から「display: table-row」(表示)に変更

5行目
「本」以外が選択されていたら、「著者」の tr のスタイルシートを「display: none;」(非表示)に変更

25行目
tr にスタイルシート「style=”display: none;”」を指定することで、ページ読み込み時は非表示にする

jQuery を使うとタグの制御が本当に簡単にできますね。
こんなに短いコードで実装できるとは思いませんでした。

参考サイト
・change イベントについて > change(fn) – jQuery 日本語リファレンス
・スタイルシートの display > とほほのスタイルシート入門


MySQLのWarning(Code 1592)Unsafe statement written to the binary log…BINLOG_FORMAT = STATEMENTの回避方法


MySQLにて、カテゴリなどの階層構造のデータの持ち方を、書籍「SQL アンチパターン」を参考に「経路列挙型」で保持してみたところ、UPDATE にて下記の Warning が発生。

Note (Code 1592): Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements writing to a table with an auto-increment column after selecting from another table are unsafe because the order in which rows are retrieved determines what (if any) rows will be written. This order cannot be predicted and may differ on master and the slave.

ブログ用にちょっと書き換えましたが、UPDATE 文の内容はだいたい下記のような内容。

UPDATE category SET 
  category_c_path = (
    SELECT temp_cd.category_c_path FROM (
      SELECT category_c_path FROM category WHERE category_i_id = 1
    ) as temp_cd
  ) || LAST_INSERT_ID() || "/"
WHERE category_i_id = LAST_INSERT_ID();

自分自身のテーブルからデータを取得して UPDATE をかけてるので、マスタとスレーブでデータが異なってしまう場合があるよ、ということらしい。

調べてみたところ、BINLOG_FORMAT を MIXED にすれば、危険な関数を使用した場合には ROW(実際に変更された行データを記録)モードになり、それ以外は STATEMENT(実際に実行されたSQLを記録)モードになるとのこと。

危険な関数は使用してないけど、今回のケースでも適用できるのかな?と疑問に思いつつ試してみる。

ということでまずは、SET SESSION で現在の接続だけを MIXED に変更してテスト。

SET SESSION binlog_format = 'MIXED';

# 設定が MIXED に変わっていることを確認
SHOW SESSION VARIABLES LIKE 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED |
+---------------+-------+

# 一応、グローバルは STATEMENT のままなのを確認
SHOW GLOBAL VARIABLES LIKE 'binlog_format';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+

問題の SQL を実行してみて Warning が発生しないことを確認。
問題がなければ、グローバルの設定も変更。

SET GLOBAL binlog_format = 'MIXED';

あとは、再起動後も設定が保持されるように、my.cnf を編集。

vim /etc/my.cnf

[mysqld]
・・・
# レプリケーションフォーマット
binlog_format = MIXED

これにて設定完了。
my.cnf への記述が間違ってないか心配なら、再起動して確認をしておいた方が無難かな。

service mysqld restart
SHOW GLOBAL VARIABLES LIKE 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED |
+---------------+-------+

「SQLアンチパターン」はテーブル設計の仕方など、かなり参考になる良書なのですが、今回のような環境によって Warning が発生するケースがある場合は、注釈あたりで MIXED にするといいよって書いてあると、より親切だな~と思いました。

参考サイト
MySQL :: MySQL 5.1 リファレンスマニュアル :: 5.1.2.1 レプリケーション フォーマットのセッティング

MySQL – BINLOG_FORMAT 関連のエラーログ! – mk-mode BLOG