Google Chrome/Chromium/Braveの履歴のタイムスタンプ形式を調べて1日分の履歴を手に入れる

たまに以前ウェブで見た情報が欲しくなることがあります.履歴に残っていればいいけど消えてしまっているかも.ウェブブラウザのアクセス履歴のタイトルとURLだけでもテキストファイルに残しておくと便利かもしれません.

履歴はHistoryファイルをsqlite3で叩くと取れるのですが,タイムスタンプがよくあるUNIX timeでもなくとても大きな値です.

$ sqlite3 ~/.config/chromium/Default/History "SELECT \"[\" || group_concat(json_object('timestamp', last_visit_time, title, url)) || \"]\" FROM urls;" | jq . | grep timestamp | sort
 -n | tail -1
    "timestamp": 13256542361632384,
UNIX timeの例
$ date +%s
1612703645

検索するとこのようなページを見つけました.

This timestamp format is used in web browsers such as Apple Safari (WebKit), Google Chrome and Opera (Chromium/Blink). It’s a 64-bit value for microseconds since Jan 1, 1601 00:00 UTC. One microsecond is one-millionth of a second.

このTimestampはUTC 1601-01-01からのマイクロセカンド秒らしいです.試してみます.

まずはUNIX timeの1601-01-01からの秒数に10^6を掛けてUNIX timeとの差を求めます.(GNU coreutilsのdateって1970-01-01より前の時間も計算できるんだ!)

UTC 1601-01-01のUNIX time?に10^6
$ echo "$( date --utc --date 1601-01-01 +%s ) * 10^6" | bc
-11644473600000000

Chrome時間とUNIX timeの差を引いてUNIX timeに変換します.

$ echo "( 13256542361632384 -11644473600000000 ) / 1000000" | bc
1612068761

UNIX timeを人間が読めるように変換

$ date --date="@1612068761"
Sun 31 Jan 2021 01:52:41 PM JST

1行にまとめる

$ date --date="@`echo "(13256542361632384/10^6-11644473600)"|bc`"
Sun 31 Jan 2021 01:52:41 PM JST

逆に今の時間をChromeのtimestampに変換

$ echo "(`date +%s`+11644473600)*10^6" | bc
13257218080000000

1日前のChrome時間

$ echo "(`date -d '1day ago' +%s`+11644473600)*10^6" | bc
13257336413000000

chrometime

ということで1日分Chrome/ChromiumのHistoryはこんな感じで取得できそうです.

$ sqlite3 /tmp/History "SELECT \"[\" || group_concat(json_object('timestamp', last_visit_time, title, url)) || \"]\" FROM urls WHERE last_visit_time >= $(((`date -d '1 day ago' +%s` +11644473600)*1000000));"
Note
該当プロファイルを利用中の場合このようなエラーになります.
Error: database is locked
ブラウザを終了するか,Historyファイルを適当な場所にコピーしてそちらを使います.
$ cp /home/matoken/.config/google-chrome/Default/History /tmp/

History ファイルは既定値ではこの辺にあります.

Chromium
~/.config/chromium/Default/History
Google Chrome
~/.config/google-chrome/Default/History
Brave Brouser
/.config/BraveSoftware/Brave-Browser/Default/History

既定値以外の場合はこんな感じで検索? ~/.config 以外にもできるけどその場合はパスがわかっていると思います.

$ find ~/.config/chromium/ ~/.config/google-chrome/ ~/.config/BraveSoftware/Brave-Browser -name History -print

Operaは買収されてから使っていないのですが,古いプロファイルを見るとこの辺のようです.現在は変わっている可能性があります.

Opera
~/.config/opera/History

Safariは環境がないので未確認ですがArchiveBoxのscriptを見ると既定値は恐らくこのあたりです.

Safari
~/Library/Safari/History.db
環境
$ dpkg-query -W bc google-chrome-stable chromium brave-browser coreutils sqlite3
bc      1.07.1-2+b2
brave-browser   1.19.92
chromium        88.0.4324.146-1
coreutils       8.32-4+b1
google-chrome-stable    88.0.4324.150-1
sqlite3 3.34.1-1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

The Great SuspenderでサスペンドしていたURLをjsonで出力する

ということで削除されちゃったんですね.
自分は先月怪しいという話を聞いて削除していました.その時タブが消えてしまい悲しかったのですがこんな感じで復旧させました.
タイムスタンプとタイトル,URLをjsonで出力します.

$ sqlite3 ~/.config/google-chrome/Default/History "SELECT \"[\" || group_concat(json_object('timestamp', last_visit_time, title, url)) || \"]\" FROM urls WHERE url LIKE '%bkeccnjlkjkiokjodocebajanakg%';" | jq . | sed -e 's/chrome-extension:\/\/klbibkeccnjlkjkiokjodocebajanakg\/suspended.html.*&uri=//'

何をやっているかというと, ~/.config/google-chrome/Default/History がGoogle Chromeのsqlite3形式の履歴ファイルなので,この中からThe Great Suspenderのurlの含まれているurlを引っ張り出して整形しています.

Chromiumの場合は ~/.config/chromium/Default/History
Braveは ~/.config/BraveSoftware/Brave-Browser/Default/History でした.

Default以外のprofileは名前いろいろなのでfindとかで探すといいでしょう.

$ find ~/.config/chromium/ ~/.config/google-chrome/ ~/.config/BraveSoftware/Brave-Browser -name History

ここで紹介したのはLinuxでの場合ですが,パスを変えると他のOSでもいけるはずです.

環境1
$ dpkg-query -W jq sqlite3 chromium google-chrome-stable
chromium
google-chrome-stable    69.0.3497.100-1
jq      1.6-2.1ubuntu1
sqlite3 3.34.0-1
$ lsb_release -dr
Description:    Ubuntu Hirsute Hippo (development branch)
Release:        21.04
$ uname -m
x86_64
環境2
$ dpkg-query -W jq sqlite3 chrome brave-browser google-chrome-stable
brave-browser   1.19.90
google-chrome-stable    88.0.4324.146-1
jq      1.6-2.1
sqlite3 3.34.1-1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64

drivetempでハードディスクの温度を確認する

先日Debian sid amd64環境でapt upgradeしたときにhddtempのNEWSがあることに気づきました.

$ zcat /usr/share/doc/hddtemp/NEWS.Debian.gz
hddtemp (0.3-beta15-54) unstable; urgency=medium

  hddtemp has been dead upstream for many years and is therefore in a minimal
  maintenance mode. It will be shipped in the Debian Bullseye release, but
  will not be present in the Debian Bookworm release.

  Nowadays the 'drivetemp' kernel module is a better alternative. It uses the
  Linux Hardware Monitoring kernel API (hwmon), so the temperature is returned
  the same way and using the same tools as other sensors.

  Loading this module is as easy as creating a file in the /etc/modules-load.d
  directory:

    echo drivetemp > /etc/modules-load.d/drivetemp.conf

 -- Aurelien Jarno <aurel32@debian.org>  Tue, 02 Feb 2021 20:27:44 +0100

hddtempは対応しているストレージの温度を取得できます.

$ sudo hddtemp /dev/sda
/dev/sda: Seagate BarraCuda SSD ZA0100MC0100 2    : 41°C

しかしこのNEWSによると hddtemp はもう上流でメンテナンスされていないのでDebianの次期バージョンの Bullseye には入るけどその次の Bookworm からは除かれる予定のようです.

そして drivetemp というカーネルモジュールが代替になるとのこと.

てことで少し試してみました.

drivetempについてはkernelのドキュメントを確認します.

例 1. zcat /usr/share/doc/linux-doc-5.10/Documentation/hwmon/drivetemp.rst.gz | rst2html | w3m -T text/html

Kernel driver drivetemp

References

ANS T13/1699-D Information technology – AT Attachment 8 – ATA/ATAPI Command Set
(ATA8-ACS)

ANS Project T10/BSR INCITS 513 Information technology – SCSI Primary Commands –
4 (SPC-4)

ANS Project INCITS 557 Information technology – SCSI / ATA Translation – 5
(SAT-5)

Description

This driver supports reporting the temperature of disk and solid state drives
with temperature sensors.

If supported, it uses the ATA SCT Command Transport feature to read the current
drive temperature and, if available, temperature limits as well as historic
minimum and maximum temperatures. If SCT Command Transport is not supported,
the driver uses SMART attributes to read the drive temperature.

Usage Note

Reading the drive temperature may reset the spin down timer on some drives.
This has been observed with WD120EFAX drives, but may be seen with other drives
as well. The same behavior is observed if the ‘hdtemp’ or ‘smartd’ tools are
used to access the drive. With the WD120EFAX drive, reading the drive
temperature using the drivetemp driver is still possible after it
transitioned to standby mode, and reading the drive temperature in this mode
will not cause the drive to change its mode (meaning the drive will not spin
up). It is unknown if other drives experience similar behavior.

A known workaround for WD120EFAX drives is to read the drive temperature at
intervals larger than twice the spin-down time. Otherwise affected drives will
never spin down.

Sysfs entries

Only the temp1_input attribute is always available. Other attributes are
available only if reported by the drive. All temperatures are reported in
milli-degrees Celsius.

┌─────────────┬───────────────────────────────────────────────────────────────┐
│temp1_input │Current drive temperature │
├─────────────┼───────────────────────────────────────────────────────────────┤
│temp1_lcrit │Minimum temperature limit. Operating the device below this │
│ │temperature may cause physical damage to the device. │
├─────────────┼───────────────────────────────────────────────────────────────┤
│temp1_min │Minimum recommended continuous operating limit │
├─────────────┼───────────────────────────────────────────────────────────────┤
│temp1_max │Maximum recommended continuous operating temperature │
├─────────────┼───────────────────────────────────────────────────────────────┤
│temp1_crit │Maximum temperature limit. Operating the device above this │
│ │temperature may cause physical damage to the device. │
├─────────────┼───────────────────────────────────────────────────────────────┤
│temp1_lowest │Minimum temperature seen this power cycle │
├─────────────┼───────────────────────────────────────────────────────────────┤
│temp1_highest│Maximum temperature seen this power cycle │
└─────────────┴───────────────────────────────────────────────────────────────┘

drivetempを読み込むとSysfs で temp1_input として出てくるようです.

現在のセンサーの一覧を取得します.
$ find /sys/ -name "temp1_input" > /tmp/before.list 2>/dev/null
$ cat /tmp/before.list
/sys/devices/platform/thinkpad_hwmon/hwmon/hwmon3/temp1_input
/sys/devices/platform/coretemp.0/hwmon/hwmon4/temp1_input
/sys/devices/virtual/thermal/thermal_zone0/hwmon0/temp1_input
drivetemp モジュールの読み込み
$ sudo modprobe -v drivetemp
insmod /lib/modules/5.10.0-3-amd64/kernel/drivers/hwmon/drivetemp.ko
Note
永続化したい場合は
$ echo drivetemp | sudo tee /etc/modules-load.d/drivetemp.conf
増えたセンサを確認
$ find /sys/ -name "temp1_input" 2>/dev/null | diff -u /tmp/before.list -
--- /tmp/before.list    2021-02-05 01:45:58.691517588 +0900
+++ -   2021-02-05 01:46:00.178371154 +0900
@@ -1,3 +1,4 @@
 /sys/devices/platform/thinkpad_hwmon/hwmon/hwmon3/temp1_input
 /sys/devices/platform/coretemp.0/hwmon/hwmon4/temp1_input
+/sys/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/hwmon/hwmon6/temp1_input
 /sys/devices/virtual/thermal/thermal_zone0/hwmon0/temp1_input
温度を確認
$ cat /sys/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/hwmon/hwmon6/temp1_input
44000
$ sudo hddtemp /dev/sda
/dev/sda: Seagate BarraCuda SSD ZA0100MC0100 2    : 44°C

hddtemp と同じ結果が取得できました.同じなので drivetemp の値は摂氏のようですね :)

とりあえず温度は取得できましたがデバイスから温度を取得したりデーモンなどは使えないのでそのへんは少し考えないといけなさそうです.

GNU coreutilsのcatで改行コードなどを確認する

最近知りました.

LC_MESSAGES=ja_JP.UTF-8のcat(1)
$ LC_MESSAGES=ja_JP.UTF-8 man cat | grep '\-A' -A25
       -A, --show-all           -vET と同じ

       -b, --number-nonblank
              空行以外に行番号を付ける。-n より優先される

       -e                       -vE と同じ

       -E, --show-ends
              行の最後に $ を付ける

       -n, --number
              全ての行に行番号を付ける

       -s, --squeeze-blank
              連続した空行の出力を行わない

       -t                       -vT と同じ

       -T, --show-tabs
              TAB 文字を ^I で表示

       -u     (無視)

       -v, --show-nonprinting
              ^ や M- 表記を使用する (LFD と TAB は除く)
LC_MESSAGES=Cのcat(1)
$ LC_MESSAGES=C man cat | grep '\-A' -A26
       -A, --show-all
              equivalent to -vET

       -b, --number-nonblank
              number nonempty output lines, overrides -n

       -e     equivalent to -vE

       -E, --show-ends
              display $ at end of each line

       -n, --number
              number all output lines

       -s, --squeeze-blank
              suppress repeated empty output lines

       -t     equivalent to -vT

       -T, --show-tabs
              display TAB characters as ^I

       -u     (ignored)

       -v, --show-nonprinting
              use ^ and M- notation, except for LFD and TAB
テストファイル作成
$ echo 'hoge
>       fuga
> ' | unix2dos > /tmp/test
odで中身確認
$ od -xc /tmp/test
0000000    6f68    6567    0a0d    6609    6775    0d61    0d0a    000a
          h   o   g   e  \r  \n  \t   f   u   g   a  \r  \n  \r  \n
0000017
普通にcat
$ cat /tmp/test
hoge
	fuga
-T でTABを ^I として表示
$ cat -T /tmp/test
hoge
^Ifuga
-v で\nやTABを除く制御コードを表示ここでは\rが^Mとして表示されている
$ cat -v /tmp/test
hoge^M
	fuga^M
^M
-t-vT と同じ
$ cat -t /tmp/test
hoge^M
^Ifuga^M
^M
-E で行末に$を表示.\rがあると頭に付いてしまうよう
$ cat -E /tmp/test
$oge
$	fuga
$
Note
追記 2020-02-10)
Debianでreportbugしたらpatchが :)
Debian 11 BullseyeやUbuntu 21.04に入るかな?
https://bugs.debian.org/cgi-bin/bugreport.cgi?att=1;bug=982208;filename=cat—​show-ends.diff;msg=10
-A-vET と同じ
$ cat -A /tmp/test
hoge^M$
^Ifuga^M$
^M$
-n で行番号を表示
$ cat -n /tmp/test
     1	hoge
     2		fuga
     3
-An で行番号と記号
$ cat -An /tmp/test
     1	hoge^M$
     2	^Ifuga^M$
     3	^M$

vimでは :set list, :set number でだいたい同じ感じでしょうか.

vim
  1 hoge$
  2 ^Ifuga$
  3 $

vim

環境
$ cat --version
cat (GNU coreutils) 8.32
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Torbjorn Granlund and Richard M. Stallman.
$ dpkg-query -W coreutils
coreutils	8.32-4+b1
$ lsb_release -dr
Description:	Debian GNU/Linux bullseye/sid
Release:	unstable
$ uname -m
x86_64

素早く絵文字や顔文字を選択するSplatmoji

最近絵文字や顔文字を探すのにはMozcやemojを利用しています.

似たものとしてSplatmojiというものを見つけたので試してみました.

導入はsourceか,パッケージが利用できます.パッケージ利用の場合はReleasesページからrpm, debが利用可能です.

sourceから
$ sudo apt install rofi xdotool xsel jq (1)
$ git clone https://github.com/cspeterson/splatmoji (2)
$ cd splatmoji
$ ./splatmoji copy
  1. 必要なパッケージを導入
  2. Splatmojiをclone
debパッケージから
$ wget https://github.com/cspeterson/splatmoji/releases/download/v1.2.0/splatmoji_1.2.0_all.deb (1)
$ sudo apt install ./splatmoji_1.2.0_all.deb (2)
$ splatmoji copy
  1. .debファイルをダウンロード
  2. .debファイルをaptコマンドでインストール

splatmoji copy として実行するとコピーモードでSplatmojiが起動して,絵文字や顔文字を選択するとクリップボードに貼り付けられます.
emojと違い,GUIのポップアップメニューとして起動するのでSplatmojiをショートカットキーに設定しておくと便利そうです.SplatmojiのREADMEにいくつかの環境のショートカットキーの登録方法も載っています :)

awesome wmではこんな感じで設定ファイルに登録してみました.

~/.config/awesome/rc.lua
    -- Emoji(Splatmoji)
    awful.key({ modkey,  "Control" }, "e", function () awful.util.spawn("splatmoji copy") end),
追記)
i3 wmでも設定しました.
~/.config/i3/config
# Emoji(Splatmoji)
bindsym $mod+Ctrl+e exec "splatmoji copy"
動いている様子

環境
$ dpkg-query -W rofi xdotool xsel jq splatmoji
jq      1.6-2.1
rofi    1.5.4-1+b1
splatmoji       1.2.0
xdotool 1:3.20160805.1-4
xsel    1.2.0+git9bfc13d.20180109-3
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64