paloma blog

NWエンジニアやってます。技術の備忘など。Pythonもちょっと。タイトルは好きなカクテルから。

初めてのgit merge

私はIT業界で働いていますが、今の現場はレガシーなSIerのお客さんで未だにドキュメントはExcel全盛です。
インフラかつNW系ということもありリポジトリや自動化というものは疎遠になっています。

ずっと現場にいる気はないですが、その間にも勉強はしとかないとということで自分でツール作ってgit操作をちょこちょこやっています。

自分用ツールの開発ということで小規模なこともありmasterブランチ一発修正をしていたのですが、アプリ系の知人と会話したところブランチは切るものだと教えたもらったのでこの度初めてmergeを行ってみました。

ちなみにリポジトリは前回の映画投稿ツールのもので、前回の修正をmasterに反映しました。

branch

昨日投稿した時点ではdevelopをいうbranchを切って修正しています。

python製自作ツールに引数処理を追加する - paloma blog

(movies) masashi@PC-ubuntu:~/movietweet$ git branch
* develop
  master

branch変更

調べたところmergeはActiveのbranchから行うようなので変更します。
checkoutコマンドで移動。

(movies) masashi@PC-ubuntu:~/movietweet$ git checkout master
Switched to branch 'master'
(movies) masashi@PC-ubuntu:~/movietweet$ git branch 
  develop
* master

いきなりですがmerge

反映はmergeコマンドで対象のbranchを指定するだけです。

(movies) masashi@PC-ubuntu:~/movietweet$ git merge develop 
Updating b84ea1e..1aa29c1
Fast-forward
 README.md      | 42 +++++++++++++++++++++++++++++++++++++++++-
 getinfo.py     | 21 ++++++++++++++++++---
 twmovieinfo.sh |  2 +-
 3 files changed, 60 insertions(+), 5 deletions(-)

成功した様子。
ログを見てみます。

(movies) masashi@PC-ubuntu:~/movietweet$ git log --oneline
1aa29c1 (HEAD -> master, origin/develop, develop) Updated README.md
9589faa Added the function to specify the released year
a3ce820 Added the script argument
b84ea1e (origin/master) Fixed comma replacement at the end of a line
0a9ad0f Fixed regular expression for replace
f987f1b Removed movies command description
648da90 Changed infomation shaping for homebrew tools
5636f0f Create movie infomation get function
1046e21 Fixed to trancate to 280 characters
9a6ab4a Added pre-post output
922d543 Fixed double acquisition of "Title"
4eb22a0 Add pager
5c804da Fine tune
d699b15 Modify posttw.py to use api file
e383b7a divide api settings
c51a288 First commit

コードは言わずもがなですが、
branchのcommitコメントも反映されてます。
9589faa、a3ce820がdevelopのコメントです。

すんなりと終わってしまいました。

最後にpush

ツールはgithubにあげていますのでpushします。
ここはいつもどおりでコメントはありません。

(movies) masashi@PC-ubuntu:~/movietweet$ git push origin master
Username for 'https://github.com': masashi69
Password for 'https://masashi69@github.com': 
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/masashi69/movietweet.git
   b84ea1e..1aa29c1  master -> master

まとめ

今回は初めてmergeを行いました。
アプリケーション開発の人は慣れている作業でしょうが、Excelを日付管理しているような現場にいますので簡単ながらもちょっとドキドキしました。

mergeといえばコンフリクトの記事をたまに見ますが、私のツールは小規模な改修なので特に問題なく完了しました。

一人でやる分にはgitの恩恵は最大限には感じられないかもしれませんが、少しずつ使えていく実感が楽しいですね。(この感覚は技術系ならgitに限らずですが)

python製自作ツールに引数処理を追加する

昨日Start-upという2019年の韓国映画をみたのですが、記録のために自作の映画ツイートツールを使ったところ違う公開年のタイトルが出てきてしまいました。
まあありがちなタイトルだし仕方ないよね。

昨日はコード内に公開年のリクエストを追加して投稿したのですが、どうせなら公開年の指定も出来るようにしようということで久しぶりにコードを修正しました。
リメイク版のタイトルでも同じように投稿できるようにしたいです。

公開年を引数で指定してAPIのパラメータに一緒に渡すようにします。

自作ツール:
OMDB APIを取得するツールをpythonで自作する - paloma blog

引数処理の練習

pythonにはargparseというモジュールがあるのでこれを使って簡単に作ります。
まずは練習。

--yearで引数名を指定。
渡された引数はargs.yearでアクセスできます。

引数ありなしで出力を分岐させます。

masashi@PC-ubuntu:~$ cat argtest.py 
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--year', type=int)
args = parser.parse_args()

if args.year:
    print('{}年宇宙の旅'.format(args.year))
else:
    print('2001年宇宙の旅')

実行。

masashi@PC-ubuntu:~$ python3 argtest.py 
2001年宇宙の旅
masashi@PC-ubuntu:~$ python3 argtest.py --year 2022
2022年宇宙の旅

出力変わってますね。OK。

修正点

diffだけ見せられてもナンノコッチャですが、自分のおさらいのため載せておきます。

大まかに

  • 公開年を指定するargparseの処理を追加
  • 映画のタイトル入力をsysの引数処理からargparseで拾うように変更
    • タイトルにハイフンが入っていると引数扱いで処理してしまうのでタイトル用の引数を作成
    • 「-」のみの引数も扱えるのでこれが干渉していると思われる
  • year引数の有無でAPIに渡すパラメータを分岐

を変更しました。

(movies) masashi@PC-ubuntu:~/movietweet$ git diff b84ea1 getinfo.py
diff --git a/getinfo.py b/getinfo.py
index a22db63..045d32f 100644
--- a/getinfo.py
+++ b/getinfo.py
@@ -3,15 +3,22 @@ import sys
 import json
 import configure
 import re
+import argparse
 
 KEY = configure.APIKEY
 url = 'http://www.omdbapi.com/'
-gettitle = '+'.join(sys.argv[1:])
+
+parser = argparse.ArgumentParser()
+parser.add_argument('--title', nargs='+', help='Input movie title', required=True)
+parser.add_argument('--year',type=int, help='Specify released year')
+args = parser.parse_args()
+
+gettitle = '+'.join(args.title)
 getinfo = ''.join([url, '?apikey=', KEY, '&t=', gettitle])
 
-def main():
+def getmovieinfo(infos=getinfo):
 
-       movieinfo = requests.get(getinfo)
+       movieinfo = requests.get(infos)
        dataload = json.loads(movieinfo.text)
 
        datadump = json.dumps(dataload, indent=0)
@@ -21,5 +28,13 @@ def main():
 
        print(shapedata)
 
+def main():
+
+       if args.year:
+               getinfo_y = ''.join([url, '?apikey=', KEY, '&t=', gettitle, '&y={}'.format(args.year)])
+               getmovieinfo(getinfo_y)
+       else:
+               getmovieinfo()
+
 if __name__ == '__main__':
        main()

動かしてみる

修正した情報取得スクリプトを動かしてみます。

引数なし
(movies) masashi@PC-ubuntu:~/movietweet$ python getinfo.py --title start-up | grep -E '(Year|Title|Actor)'
Title: Start-Up
Year: 2020\u2013
Actors: Bae Suzy, Nam Joo-hyuk, Kim Seon-Ho
引数あり
(movies) masashi@PC-ubuntu:~/movietweet$ python getinfo.py --title start-up --year 2019 | grep -E '(Year|Title|Actor)'
Title: Start-Up
Year: 2019
Actors: Ma Dong-seok, Jeong Min Park, Jung Hae-In

OKですね。
同じタイトルですが公開年と役者が違うものが出力されました。

本処理

理由は忘れてしまいましたがメインの処理は成形含めシェルスクリプトで呼び出すようにしているので実行します。

引数なし
(movies) masashi@PC-ubuntu:~/movietweet$ bash twmovieinfo.sh start-up
2022-05-05に「Start-Up」を視聴しました。

Infomation
---
Year: 2020\u2013
Genre: Comedy, Drama, Romance
Director: N/A
Actors: Bae Suzy, Nam Joo-hyuk, Kim Seon-Ho
---

投稿しますか?: [y/n]n
スクリプトを終了します。
引数あり
(movies) masashi@PC-ubuntu:~/movietweet$ bash twmovieinfo.sh start-up --year 2019
2022-05-05に「Start-Up」を視聴しました。

Infomation
---
Year: 2019
Genre: Action, Comedy, Drama
Director: Jeong-Yeol Choi
Actors: Ma Dong-seok, Jeong Min Park, Jung Hae-In
Production: N/A
---

投稿しますか?: [y/n]n
スクリプトを終了します。

OK!
引数ありの内容は昨日の投稿と同じです。

まとめ

pythonの引数処理の追加を行いました。
引数処理は自分で作ると大変ですが、便利なモジュールがあり助かります。

本ツールはbash-snipetsのmoviesコマンドを参考に作成しましたが、公開年指定はオリジナルにも無いのでいい感じに機能追加できたと思います。
(オリジナル版を修正、プルリクしても良かったのですが)
いろいろ動かなくて四苦八苦でしたがうまいこと収まってよかったです。

最近積んであったモンハンワールドばかり遊んでいて、久しぶりにpython書きました。
簡単な修正に見えるかもしれませんが、こんなんでも自作のものが動くと楽しいです。

リポジトリ

github.com

pythonでLinked List実装(参照フィールド)のおさらい

最近アルゴリズムの勉強をしようとGoogle Tech Dev Guideを進めているんですが、Linked Listを実装しようというコーナーがあって全然できなくて苦労しました。

leetcode.com

概要図でやろうとすることは理解できるのですが、全然実装方法が思いつかず、Youtubeや色んなサイトの記事をみながら本日やっとコードのテストに合格できました。(Singly Linked Listでこのざま)
正確には実装はインデックスの取得や挿入、削除といった機能の方が苦労したのですが、そもそもLinked Listはどうデータを入れてるのかと言うのが気になったのでちょっとメモしておきます。

環境

ubuntuのターミナルで実行します。

masashi@PC-ubuntu:~$ python3 --version
Python 3.8.10

Singly Linked Listの基本的な形

Linked Listは各ノードが参照フィールドを持っていて、次のノードの情報が格納されているというのが特徴です。
いろんな動画や記事を見てもLinked Listの実装はほとんど以下の形です。

class Node:
    def __init__(self, data):
      self.data = data
      self.next = None # 参照フィールド

class MyLinkedList:
    def __init__(self):
        self.head = None

これをインスタンス化して各ノードをつなげます。
インスタンスに別のクラスを当てるというアイデアが出てこなかったです。

ll = MyLinkedList()

ll.head = Node('a')
second = Node('b')
third = Node('c')

ll.head.next = second
second.next = third

nextに次ノードの値を入れて、それを繋げていくことでリストになります。

リストとしてを出力するには以下。
Nodeオブジェクトはイテレーションできないのでwhileを使います。

>>> nodes = ll.head
>>> while nodes:
...   print(nodes.data, end=' ')
...   nodes = nodes.next # 次のノードへ
... 
a b c >>> 

ちゃんと順番に出力されました。

どう繋がっているのか

各Nodeクラスのnextに次のオブジェクトが入るのはわかりましたが実際はどうなっているのでしょうか。
中を見てみます。

>> dir(ll.head)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'data', 'next']

headオブジェクトにdataとnextの属性が格納されてます。
Nodeクラスのインスタンスにはそれぞれdataとnextが作成されるということですね。
nextが繋がらなくなったらNoneでLink終了と。

nextが繋がっているのが確認できます。

>>> ll
<__main__.MyLinkedList object at 0x7fc5cf3c1a00>
>>> ll.head # a
<__main__.Node object at 0x7fc5cf360250>
>>> ll.head.next # b
<__main__.Node object at 0x7fc5cf360730>
>>> ll.head.next.next # c
<__main__.Node object at 0x7fc5cf3607f0>
>>> ll.head.next.next.next # 値なし

各ノードオブジェクトが別のメモリアドレスに割り当てられてます。
こうみたらnextがどんどん足されているんですね。
次はdataを呼び出してみます。

>>> ll.head.data
'a'
>>> ll.head.next.data
'b'
>>> ll.head.next.next.data
'c'
>>> ll.head.next.next.next.data
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'data'

格納したデータどおりの順に出力されました。
cの次は何も入ってないので値がとれませんね。

本当に繋がっているのかメモリアドレスも出してみます。
現在ノードのアドレス、データ、次ノードのアドレスを出力してみます。

>>> while nodes:
...   print(nodes, nodes.data, nodes.next)
...   nodes = nodes.next
... 
<__main__.Node object at 0x7f81b16d76a0> a <__main__.Node object at 0x7f81b16d7730>
<__main__.Node object at 0x7f81b16d7730> b <__main__.Node object at 0x7f81b16d77f0>
<__main__.Node object at 0x7f81b16d77f0> c None

a -> b -> cの順にアドレスが繋がってますね。
こうやってLinked Listは繋がるのか。

挿入、削除等の機能は各ノードの位置を把握してアレコレするだけなので割愛します。
(こっちの方が時間かかってますが)

まとめ

普段pythonをゴリゴリ書いている人はこんなのわざわざやらなくても理解できると思いますが、
私はクラスはほとんど使わなくて関数で間に合うレベルのコードしか書いていないのでやっと理解できました。

昔自作ゲーム用にクラスを作りましたが今回のような使い方は初めてで勉強になります。
インスタンスに別のクラスを当てたり、Noneをわざわざ用意してそれに当てはめるという技はなかなか思いつけませんね。
ライブラリ使うときは自然とやっているんだろうけど自分で作るとなると全然出てきません。

しかし時間かかりましたがリスト型を使わずにリストを実装できました。
(本記事ではなくLeetcodeで)久しぶりに長いコード書いたのでテスト通った時の嬉しさがひとしおです。

wsl2が名前解決できなくなったので対処

前回wsl2上のdockerにプロキシサーバーを立てたのですが、昨日Windows Updateをしたらプロキシが動かなくなってしまいました。

調査

ホスト

念のためホストの状況を確認してみます。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ curl -X GET -I -x localhost:8118 https://www.google.co.jp
HTTP/1.1 404 No such domain
Content-Length: 6589
Content-Type: text/html
Cache-Control: no-cache
Date: Fri, 14 Jan 2022 07:00:44 GMT
Last-Modified: Wed, 08 Jun 1955 12:00:00 GMT
Expires: Sat, 17 Jun 2000 12:00:00 GMT
Pragma: no-cache
Connection: close

404になってますね。

コンテナのログ

抜粋版です。

2022-01-14 06:58:46.630 7fdb3902c180 Info: Privoxy version 3.0.28,
2022-01-14 06:58:46.630 7fdb3902c180 Info: Program name: /usr/sbin/privoxy,
2022-01-14 06:58:46.631 7fdb3902c180 Info: Loading filter file: /etc/privoxy/default.filter,
2022-01-14 06:58:46.632 7fdb3902c180 Info: Loading filter file: /etc/privoxy/user.filter,
2022-01-14 06:58:46.632 7fdb3902c180 Info: Loading actions file: /etc/privoxy/match-all.action,
2022-01-14 06:58:46.632 7fdb3902c180 Info: Loading actions file: /etc/privoxy/default.action,
2022-01-14 06:58:46.634 7fdb3902c180 Info: Loading actions file: /etc/privoxy/easylistgermany.script.action,
2022-01-14 06:58:46.637 7fdb3902c180 Error: Missing content filter 'easylistgermany',
2022-01-14 06:58:46.637 7fdb3902c180 Error: Invalid action section in file '/etc/privoxy/easylistgermany.script.action', starting at line 1300: { +filter{easylistgermany} },
2022-01-14 06:58:46.637 7fdb3902c180 Info: Loading actions file: /etc/privoxy/user.action,
2022-01-14 06:58:46.637 7fdb3902c180 Info: Listening on port 8118 on IP address 0.0.0.0,
2022-01-14 06:58:54.000 7fdb3902a700 Request: www.google.co.jp:443/,
2022-01-14 06:59:00.266 7fdb3902a700 Info: Can not resolve www.google.co.jp: Temporary failure in name resolution,
2022-01-14 06:59:00.267 7fdb3902a700 Crunch: DNS failure: www.google.co.jp:443,
172.17.0.1 - - [14/Jan/2022:06:59:00 +0000] "CONNECT www.google.co.jp:443 HTTP/1.1" 404 6589,
2022-01-14 06:59:14.543 7fdb3902a700 Request: www.google.co.jp:443/,
2022-01-14 06:59:20.746 7fdb3902a700 Info: Can not resolve www.google.co.jp: Temporary failure in name resolution,
2022-01-14 06:59:20.747 7fdb3902a700 Crunch: DNS failure: www.google.co.jp:443,
172.17.0.1 - - [14/Jan/2022:06:59:20 +0000] "CONNECT www.google.co.jp:443 HTTP/1.1" 404 6589,
2022-01-14 07:00:37.824 7fdb3902a700 Request: www.google.co.jp:443/,
2022-01-14 07:00:44.026 7fdb3902a700 Info: Can not resolve www.google.co.jp: Temporary failure in name resolution,
2022-01-14 07:00:44.027 7fdb3902a700 Crunch: DNS failure: www.google.co.jp:443,
172.17.0.1 - - [14/Jan/2022:07:00:44 +0000] "CONNECT www.google.co.jp:443 HTTP/1.1" 404 6589

curlのヘッダでもわかりますが、privoxyのログを見るとDNSが失敗しているようです。

名前引き

でもdig引けるし、何なんだ…

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ dig www.google.co.jp

; <<>> DiG 9.16.1-Ubuntu <<>> www.google.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42409
;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;www.google.co.jp.              IN      A

;; ANSWER SECTION:
www.google.co.jp.       0       IN      A       172.217.161.67

;; Query time: 20 msec
;; SERVER: 172.17.192.1#53(172.17.192.1)
;; WHEN: Fri Jan 14 16:09:15 JST 2022
;; MSG SIZE  rcvd: 66

Windows Updateが問題か?と調べてみるとwslのresolverが悪さする事例があるようです。

WSL2 DNS stops working · Issue #4285 · microsoft/WSL · GitHubgithub.com

確かにtcpの方だと失敗していますね。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ dig www.google.co.jp +tcp
;; Connection to 172.17.192.1#53(172.17.192.1) for www.google.co.jp failed: timed out.
;; Connection to 172.17.192.1#53(172.17.192.1) for www.google.co.jp failed: timed out.

; <<>> DiG 9.16.1-Ubuntu <<>> www.google.co.jp +tcp
;; global options: +cmd
;; connection timed out; no servers could be reached

;; Connection to 172.17.192.1#53(172.17.192.1) for www.google.co.jp failed: timed out.

ほかのDNSサーバだとOKです。
原因はwslのresolverで確定ですね。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ dig www.google.co.jp +tcp @1.1.1.1

; <<>> DiG 9.16.1-Ubuntu <<>> www.google.co.jp +tcp @1.1.1.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11504
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;www.google.co.jp.              IN      A

;; ANSWER SECTION:
www.google.co.jp.       234     IN      A       142.250.207.35

;; Query time: 20 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Fri Jan 14 16:21:09 JST 2022
;; MSG SIZE  rcvd: 61

修正

wslのresolv.confを書き換えれば解決するようですが、これはシステムで自動で作られるファイルの様です。
なのでissueの手順に沿って書き換えます。

wsl.confを作成

これでresolv.confがシステムから上書きされなくなります。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ cat /etc/wsl.conf
[network]
generateResolvConf = false

ホスト停止、再起動

いったん再起動しないといけない様です。

PS C:\Users\masashi> wsl --list --running
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu (既定)
PS C:\Users\masashi> wsl --shutdown

手順は割愛しますが再起動完了。

resolv.conf修正

wslではresolv.confはシンボリックリンクが張られているので外して上書きします。
私はプロバイダのDNSサーバを書いてます。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ sudo ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 29 Oct  2 13:39 /etc/resolv.conf -> ../run/resolvconf/resolv.conf
masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$
masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ sudo unlink /etc/resolv.conf
masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ sudo ls -l /etc/resolv.conf
ls: cannot access '/etc/resolv.conf': No such file or directory
masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$
masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ sudo vim /etc/resolv.conf

名前引き(tcp)

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ dig -q www.google.co.jp +tcp

; <<>> DiG 9.16.1-Ubuntu <<>> -q www.google.co.jp +tcp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20808
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.google.co.jp.              IN      A

;; ANSWER SECTION:
www.google.co.jp.       22      IN      A       142.250.196.131

;; Query time: 10 msec
;; SERVER: (略)
;; WHEN: Fri Jan 14 16:30:52 JST 2022
;; MSG SIZE  rcvd: 61

OK。
引けるようになりましたので多分大丈夫でしょう。

コンテナ起動

コンテナ起動します。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ sudo docker run -d -p 8118:8118 privoxy
dccc24b68092c11a48e268cbc7cf16af690afc7122355435ad151f7d1d724c20

再度プロキシの疎通。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ curl -X GET -I -x localhost:8118 https://www.google.co.jp
HTTP/1.1 200 Connection established

HTTP/2 200
()

OKですね。
これで直りました。

ブラウザからもOKになりました。

まとめ

作った矢先に疎通できなくなったのでwslやコンテナの起動方法、Windows Updateなど被疑箇所がたくさんありましたが、ログから調査したら割と早く解決できました。

issueはudpも通らないケースもありましたが、私はtcpのみNGだったのでresolv.confに辿り着くまで少しかかりました。

最近は便利な機能がたくさんありますが、レイヤが増える分切り分け方法を確立しておかないといけませんね。
見つけてくれる先人たちに感謝です。(自分もそうなりたい)

参考サイト

WSL2 で dns の名前解決ができなくなって ネット接続できなくなった場合の対処方法 - Qiita

WSL2 で名前解決出来ない問題 | 変なヤバいもんログ

2021年下半期見た映画メモ

年も変わってしまいましたが、昨年の下半期の視聴映画です。

取得ツール

映画視聴ロガーを使って今年見た映画を振り返る - paloma blog

だいぶ前に作ったのですが、まだ全量取る作りなのでそろそろ日付で引っかける機能をつけないといけないですね。

リスト

(movies) masashi@PC-ubuntu:~/movietweet$ python gettw.py | grep 2021 | nl
     1  2021-12-30 00:23:25 The Wolf of Wall Street
     2  2021-12-26 22:41:32 The Tourist
     3  2021-12-26 00:44:12 Saturday Night Fever
     4  2021-12-19 22:28:11 Showtime
     5  2021-12-12 21:48:05 Running with the Devil
     6  2021-12-12 09:41:46 The Informer
     7  2021-12-04 22:26:00 Office Christmas Party
     8  2021-11-27 21:56:23 Believer
     9  2021-11-23 23:00:05 Central Intelligence
    10  2021-11-21 22:03:05 R.I.P.D.
    11  2021-11-20 23:18:42 Results
    12  2021-11-14 22:44:15 Zoolander
    13  2021-11-13 23:03:52 RED
    14  2021-11-07 22:46:25 The Art of Self-Defense
    15  2021-11-06 23:21:32 The Natural
    16  2021-11-03 22:00:42 Welcome to Acapulco
    17  2021-10-31 21:19:42 The Clapper
    18  2021-10-30 23:22:59 Heat
    19  2021-10-24 22:01:42 The Nice Guys
    20  2021-10-23 23:03:13 Once Upon a Time... in Hollywood
    21  2021-10-17 20:56:40 The Spy Next Door
    22  2021-10-16 22:25:25 Snowden
    23  2021-10-10 22:23:39 Reborn
    24  2021-10-09 22:20:59 Get Rich or Die Tryin'
    25  2021-10-03 21:58:15 Drunk Parents
    26  2021-10-02 21:48:23 Ghost in the Shell
    27  2021-09-26 22:43:41 Teenage Mutant Ninja Turtles: Out of the Shadows
    28  2021-09-26 10:54:55 Body of Lies
    29  2021-09-23 22:09:10 Cemetery Junction
    30  2021-09-12 22:56:52 Anchorman: The Legend of Ron Burgundy
    31  2021-09-11 22:53:08 Gringo
    32  2021-09-05 23:27:37 Rush Hour 3
    33  2021-09-04 22:30:17 The Fugitive
    34  2021-08-29 21:40:27 Rush Hour 2
    35  2021-08-28 23:11:36 Geukhanjikeob
    36  2021-08-22 23:18:42 Rush Hour
    37  2021-08-21 23:16:01 Motherless Brooklyn
    38  2021-08-15 11:38:10 BlacKkKlansman
    39  2021-08-08 22:01:21 Tammy
    40  2021-08-07 22:58:04 Major League
    41  2021-08-01 22:24:46 Jack Ryan: Shadow Recruit
    42  2021-07-31 23:18:35 The Mummy
    43  2021-07-25 10:03:39 Bad Boys II
    44  2021-07-24 11:51:45 Bad Boys
…

44本ですね。
外出もちょこちょこしてたのでちょっと少なめですね。

下半期ベスト3

どれも面白いですが、印象に残っているのはこの辺ですね。

  1. The Nice Guys (2016)
    ロサンゼルスの少女の殺害事件を2人の探偵が追っていくという話です。
    事件の犯人や証拠に迫りきや、追い詰め寸前で犯人や証拠が始末されてしまうのでなかなか決着がつかず面白かったです。
    キースデイヴィッドが出ていたのでこの順位にしました。(セインツロウ好きなのでw)
  2. Geukhanjikeob (2019)
    邦題「エクストリーム・ジョブ」です。
    刑事チームが犯罪組織の張り込みのためにアジトの近くのチキン屋を借りて潜伏しますが、
    ダミーで始めたチキンの商売が繁盛しすぎてそっちに熱中してしまうというコメディ映画です。
    チキンも美味しそうだったし、最後はみんな目を覚まして捜査に戻るのが良かったです。
  3. Snowden (2016)
    主人公スノーデンの告発映画です。
    サイバー犯罪対策の仕事に就きますが、過度な情報収集に嫌気がさして告発するという内容です。
    自分は愛国者だと自覚してるが故の葛藤が良かったです。
    告発シーンとストーリーが混ざりながら進んでいきます。
    主人公のスキルがすごく採用試験で全員置いてきぼりで断トツで課題をこなしたのがカッコよかったです。
    職業柄ITエンジニアの映画は面白いです。

まとめ

視聴するのはアクション系が多いのですが、どうしても話の流れが似たものになりがちなのでいざ振り返ると混乱するものがあります。
SFとかコメディは作品の特徴がモロに出るので結構覚えてますね。

あと多くの作品を見たいのでそれぞれ1回しか視聴していないのでその影響もあると思います。
自分でDVD買ってた時は2~3回は見てました。

ビジネスが成功する作品は頑張らなきゃという気になるので結構好きです。今回の「Geukhanjikeob」もそんな感じです。
そういう意味ではウルフオブウォールストリートは大成功してますが、顧客がかわいそうなことになるので外しました。(作品としては面白いです)

今年もたくさん見たいですね。
Netflixで視聴していますが、OMDB APINetflixオリジナル作品も登録されていることが分かりましたので、そちらも見ていこうと思います。

privoxyをdockerで作り直す 自分でbuild編

自宅のメイン機windowsのwsl上でprivoxyを建てていたのですが、PCが壊れてリプレースした際に環境が無くなってしまいました。

元々広告ブロック用途で使っていて、今どきのブラウザにも広告ブロックのプラグインはたくさんあるので特段困りませんが、低いレイヤのうちに防げるのであればそうすべきですよね。

リプレースの際にwsl2をインストールしたのでコンテナ環境も使えます。
lxdはサブ機で運用中なのでここはdockerで作り直してみようと思います。
そのまま作り直しは面白くないですしね。

dockerの管理ツールはたくさんありすが、私は詳しくなく基本からということで今回はシンプルなdockerコマンドを使います。

環境

wsl2にubuntuを入れています。

PS C:\Users\masashi> wsl --list --verbose
  NAME      STATE           VERSION
* Ubuntu    Running         2
masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ uname -a ; lsb_release -a
Linux DESKTOP-HBP3520 5.10.16.3-microsoft-standard-WSL2 #1 SMP Fri Apr 2 22:23:49 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04 LTS
Release:        20.04
Codename:       focal

インストール

ドキュメントに沿ってインストール。
ここは割愛します。

Install Docker Engine on Ubuntu | Docker Documentation

起動確認

サンプルのコンテナを起動してみます。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ sudo docker run hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.
masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ sudo systemctl
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

あら、systemdが入っていない?

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ /etc/init.d/docker status
 * Docker is not running
masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ sudo /etc/init.d/docker start
 * Starting Docker: docker

initdで起動できたのでとりあえずこのままいきます。

dockerfile作成

docker hubにprivoxyのイメージはたくさんありますがpullして終わりでは面白くありません。
イメージも自分でbuildしてみます。

設定ファイルはデフォルトのイメージから修正するのもいいですが、
以前使用していたものが残っているので流用しましょう。

イメージは使い慣れているubuntuのLTSを使います。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/tools/docker/privoxy$ cat dockerfile
FROM ubuntu:20.04

RUN apt-get update
RUN apt-get -y install privoxy

ADD config /etc/privoxy/config
ADD easylistgermany.script.action /etc/privoxy/easylistgermany.script.action
ADD easylistgermany.script.filter /etc/privoxy/easylistgermany.script.filter

EXPOSE 8118

CMD ["/usr/sbin/privoxy", "--no-daemon", "/etc/privoxy/config"]

デーモンで動かすと起動時に終了してしまう様なのでno-daemonオプションをつけてます。
(自分でも作成中に体験し、ドキュメントに仕様の旨書いてありました)

また、以前の記事で書いた際の広告ブロックファイルスクリプトですが、実は作れていませんでした。

WSLのPrivoxyの機能をいろいろ有効にする - paloma blog

スクリプトが正常完了すると以下のファイルが作成され、configファイルにも転記されます。

  • easylistgermany.script.action
  • easylistgermany.script.filter

上記ファイルとconfigの中身は長くなるので割愛します。

build

buildします。
イメージ名だけ指定しておきます。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/tools/docker/privoxy$ sudo docker build -t privoxy .
Sending build context to Docker daemon  326.1kB
Step 1/8 : FROM ubuntu:20.04
20.04: Pulling from library/ubuntu
ea362f368469: Pull complete
Digest: sha256:b5a61709a9a44284d88fb12e5c48db0409cfad5b69d4ff8224077c57302df9cf
Status: Downloaded newer image for ubuntu:20.04
 ---> d13c942271d6
Step 2/8 : RUN apt-get update
 ---> Running in 864589a5dcf5
()
Removing intermediate container 814c0ba9f29d
 ---> bf1ec1f0d64d
Step 4/8 : ADD config /etc/privoxy/config
 ---> e607594a8c2c
Step 5/8 : ADD easylistgermany.script.action /etc/privoxy/easylistgermany.script.action
 ---> c9e67ca752f3
Step 6/8 : ADD easylistgermany.script.filter /etc/privoxy/easylistgermany.script.filter
 ---> f1a2fbe29033
Step 7/8 : EXPOSE 8118
 ---> Running in a7f7a6c0f99d
Removing intermediate container a7f7a6c0f99d
 ---> 8c586e8febd8
Step 8/8 : CMD ["/usr/sbin/privoxy", "--no-daemon", "/etc/privoxy/config"]
 ---> Running in ab94d59f07d0
Removing intermediate container ab94d59f07d0
 ---> 640c3f36b965
Successfully built 640c3f36b965
Successfully tagged privoxy:latest

イメージ確認。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/tools/docker/privoxy$ sudo docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
privoxy       latest    640c3f36b965   30 seconds ago   154MB
ubuntu        20.04     d13c942271d6   23 hours ago     72.8MB
hello-world   latest    feb5d9fea6a5   3 months ago     13.3kB

OK。

run

動かしてみます。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/tools/docker/privoxy$ sudo docker run -d privoxy
5a6cf1fea892963235cb6fef689a28392be4008180dc11a86a65e4a2d2722b4c
masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/tools/docker/privoxy$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS      NAMES
5a6cf1fea892   privoxy   "/usr/sbin/privoxy -…"   7 seconds ago   Up 5 seconds   8118/tcp   angry_blackburn
masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/tools/docker/privoxy$ sudo docker logs 5a6cf1fea892
(略)
2022-01-08 01:28:35.201 7f8195cd8180 Info: Listening on port 8118 on IP address 127.0.0.1

Listen IPをミスりました。anyで開けないと外から繋げないので再buildします。

再build

configファイルを修正して再build。
2回目なのでイメージのインストールはありません。
修正してもコマンド一発なので楽ですね。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/tools/docker/privoxy$ sudo docker build -t privoxy .
Sending build context to Docker daemon  326.1kB
Step 1/8 : FROM ubuntu:20.04
 ---> d13c942271d6
Step 2/8 : RUN apt-get update
 ---> Using cache
 ---> cf23bd572ee9
Step 3/8 : RUN apt-get -y install privoxy
 ---> Using cache
 ---> bf1ec1f0d64d
Step 4/8 : ADD config /etc/privoxy/config
 ---> 7af0693b72e4
Step 5/8 : ADD easylistgermany.script.action /etc/privoxy/easylistgermany.script.action
 ---> 88a12542d9b2
Step 6/8 : ADD easylistgermany.script.filter /etc/privoxy/easylistgermany.script.filter
 ---> 98a5188a6f71
Step 7/8 : EXPOSE 8118
 ---> Running in da034c635718
Removing intermediate container da034c635718
 ---> b8bf9110b82b
Step 8/8 : CMD ["/usr/sbin/privoxy", "--no-daemon", "/etc/privoxy/config"]
 ---> Running in f1f2b4f953c7
Removing intermediate container f1f2b4f953c7
 ---> 8bfb6a713d7d
Successfully built 8bfb6a713d7d
Successfully tagged privoxy:latest
masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/tools/docker/privoxy$ sudo docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
privoxy       latest    8bfb6a713d7d   8 seconds ago   154MB
<none>        <none>    640c3f36b965   5 minutes ago   154MB
ubuntu        20.04     d13c942271d6   23 hours ago    72.8MB
hello-world   latest    feb5d9fea6a5   3 months ago    13.3kB

同じ名前でbuildすると、前のイメージのものはnoneになってしまうようですね。

再度run

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/tools/docker/privoxy$ sudo docker logs 0bb8b25f6539
2022-01-08 01:33:54.762 7f3c0bf78180 Info: Listening on port 8118 on IP address 0.0.0.0

接続確認。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/tools/docker/privoxy$ curl -X GET -I -x localhost:8118 https://www.google.c
o.jp
curl: (7) Failed to connect to localhost port 8118: Connection refused

あら、ポートが上がっていない?
ポートフォワードのオプションを忘れていました。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/tools/docker/privoxy$ sudo docker run -d -p 8118:8118 privoxy
78af2722008edc8b06a653909606823ac4e37ea30e9a9ba8307a15305aec5b4f
masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/tools/docker/privoxy$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS
     NAMES
78af2722008e   privoxy   "/usr/sbin/privoxy -…"   6 seconds ago   Up 3 seconds   0.0.0.0:8118->8118/tcp, :::8118->8118/tcp   compassionate_shamir

もう一回接続確認。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/tools/docker/privoxy$ curl -X GET -I -x localhost:8118 https://www.google.c
o.jp
HTTP/1.1 200 Connection established

HTTP/2 200
()

OKですね。

ログ

ログを見てみます。
さっきのcurlが取れてますね。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/tools/docker/privoxy$ sudo docker logs 78af2722008e
2022-01-08 01:38:06.050 7fea7a619180 Info: Privoxy version 3.0.28
2022-01-08 01:38:06.050 7fea7a619180 Info: Program name: /usr/sbin/privoxy
2022-01-08 01:38:06.051 7fea7a619180 Info: Loading filter file: /etc/privoxy/default.filter
2022-01-08 01:38:06.052 7fea7a619180 Info: Loading filter file: /etc/privoxy/user.filter
2022-01-08 01:38:06.052 7fea7a619180 Info: Loading actions file: /etc/privoxy/match-all.action
2022-01-08 01:38:06.052 7fea7a619180 Info: Loading actions file: /etc/privoxy/default.action
2022-01-08 01:38:06.054 7fea7a619180 Info: Loading actions file: /etc/privoxy/easylistgermany.script.action
2022-01-08 01:38:06.057 7fea7a619180 Error: Missing content filter 'easylistgermany'
2022-01-08 01:38:06.057 7fea7a619180 Error: Invalid action section in file '/etc/privoxy/easylistgermany.script.action', starting at line 1300: { +filter{easylistgermany} }
2022-01-08 01:38:06.057 7fea7a619180 Info: Loading actions file: /etc/privoxy/user.action
2022-01-08 01:38:06.058 7fea7a619180 Info: Listening on port 8118 on IP address 0.0.0.0
2022-01-08 01:38:49.458 7fea7a617700 Request: www.google.co.jp:443/
172.17.0.1 - - [08/Jan/2022:01:38:49 +0000] "CONNECT www.google.co.jp:443 HTTP/1.1" 200 15551

ブラウザのProxy有効化

Firefoxをメインで使っています。
オプションからプロキシを有効化して再度ログを見てみます。

docker logsだとパイプが聞かなかったので抜粋です。

()
2022-01-08 01:42:33.450 7fea2cff9700 Request: safebrowsing.googleapis.com:443/
172.17.0.1 - - [08/Jan/2022:01:42:33 +0000] "CONNECT safebrowsing.googleapis.com:443 HTTP/1.1" 200 1794
2022-01-08 01:42:34.997 7fea2cff9700 Request: token.services.mozilla.com:443/
2022-01-08 01:42:35.333 7fea07fff700 Request: youtube.com:443/
2022-01-08 01:42:35.517 7fea6b7fe700 Request: ocsp.digicert.com/
172.17.0.1 - - [08/Jan/2022:01:42:35 +0000] "POST http://ocsp.digicert.com/ HTTP/1.1" 200 471
2022-01-08 01:42:35.752 7fea45ffb700 Request: sync-1-us-west1-g.sync.services.mozilla.com:443/
2022-01-08 01:42:35.832 7fea2effd700 Request: ocsp.digicert.com/
172.17.0.1 - - [08/Jan/2022:01:42:35 +0000] "POST http://ocsp.digicert.com/ HTTP/1.1" 200 471
172.17.0.1 - - [08/Jan/2022:01:42:45 +0000] "CONNECT token.services.mozilla.com:443 HTTP/1.1" 200 4807
2022-01-08 01:43:20.759 7fea2cff9700 Request: detectportal.firefox.com/canonical.html
172.17.0.1 - - [08/Jan/2022:01:43:20 +0000] "GET http://detectportal.firefox.com/canonical.html HTTP/1.1" 200 90
2022-01-08 01:43:20.851 7fea2effd700 Request: detectportal.firefox.com/success.txt?ipv4
2022-01-08 01:43:20.856 7fea6b7fe700 Request: detectportal.firefox.com/success.txt?ipv6
172.17.0.1 - - [08/Jan/2022:01:43:20 +0000] "GET http://detectportal.firefox.com/success.txt?ipv4 HTTP/1.1" 200 8
172.17.0.1 - - [08/Jan/2022:01:43:20 +0000] "GET http://detectportal.firefox.com/success.txt?ipv6 HTTP/1.1" 200 8
172.17.0.1 - - [08/Jan/2022:01:43:25 +0000] "CONNECT profile.accounts.firefox.com:443 HTTP/1.1" 200 4325
172.17.0.1 - - [08/Jan/2022:01:43:25 +0000] "CONNECT api.accounts.firefox.com:443 HTTP/1.1" 200 10190
172.17.0.1 - - [08/Jan/2022:01:44:17 +0000] "CONNECT firefox.settings.services.mozilla.com:443 HTTP/1.1" 200 5588

ちゃんとログ出てますね。
相変わらず裏でいろいろなところにアクセスしてます。
これで広告ブロック付きプロキシが復活しました。

残課題

アクセスログはdocker logsで確認できますが、フォアグラウンドで動かすとログファイルが作成されないようです。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/tools/docker/privoxy$ sudo docker exec -it 78af2722008e /bin/bash
root@78af2722008e:/# ls -l /var/log/privoxy/
total 0

前回はデーモンで動かしていましたが、フォアグラウンドだとコンソールに慣れ流しということでしょうか。
フォアグラウンド起動はdockerの仕様なので仕方ないですが、ログは残したいですね。
課題として残しておいてとりあえずは運用してみます。

感想

いつもはLXDのコンテナで遊んでいますがDocker環境も欲しいということで作ってみました。
LXDも面白いですが、コンテナ構築のお手軽さはやはりdockerですね。
サービスとして運用するにはいろいろ考えないといけませんが…とはいっても大企業はとっくに採用していると思いますが。

今回は自宅環境用のコンテナ作成ですが、ちゃんとしたdockerfileを作るまで何度もコンテナを作っては捨て、とできるのがいいですね。
wsl環境で一発ではなく、別の仮想環境でdockerfile作成からrunまでを繰り返して動作するprivoxyコンテナを作りました。

仮想環境と若干カーネルバージョンが違ったのでイメージの引っ越しではなくwslでもbuildしましたが、
最終版ファイルの管理と手順が甘く本番へのデプロイも少しミスしてしまいました。

自宅の環境なので問題ないですが、この辺もAnsibleとかで自動化したいですね。
まあ今回はお遊びで、もちろん仕事では手順書完備でやってますのでご心配なく。

ubuntuデスクトップのcronでシェルスクリプトがうまく動かない

自宅での家計簿アプリの運用を始めてから2年弱経ちますが、手動で行っていたDBのバックアップをそろそろ自動がしたいということでcronに登録しました。

環境

Ubuntuデスクトップです。

masashi@PC-ubuntu:~$ uname -a ; lsb_release -a ; bash --version
Linux PC-ubuntu 5.4.0-90-generic #101-Ubuntu SMP Fri Oct 15 20:00:55 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:   focal
GNU bash, バージョン 5.0.17(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://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.

crontab

sqldumpをたたくだけなので、DBのバックアップスクリプトは割愛します。

マニュアルに沿ってcrontabに登録します。
まずはお試しなので一分おきに実行。

masashi@PC-ubuntu:~$ crontab -l | grep -v \#
*/1 * * * * $HOME/bin/fireflybkup.sh

あれ、0バイトで取れていませんね。

masashi@PC-ubuntu:~$ ls -l backup/firefly/
合計 2136
-rw-rw-r-- 1 masashi masashi      0 125 15:00 fireflyiii-db.sql
-rw-rw-r-- 1 masashi masashi      0 125 15:00 fireflyiii-db.sql.bak

環境変数

知人にcronがうまく取れないと連絡すると、環境変数を書く必要があるとのことなのでenvを見てみます。

masashi@PC-ubuntu:~$ crontab -l | grep -v \#
*/1 * * * * env > cronenv.txt

envはこんな感じ。 PATHも通ってないし、shで起動しているからうまく取れていなのかな?

masashi@PC-ubuntu:~$ cat cronenv.txt 
LANGUAGE=ja:en
LC_TIME=ja_JP.UTF-8
HOME=/home/masashi
LC_MONETARY=ja_JP.UTF-8
LOGNAME=masashi
PATH=/usr/bin:/bin
LC_ADDRESS=ja_JP.UTF-8
LANG=ja_JP.UTF-8
LC_TELEPHONE=ja_JP.UTF-8
LC_NAME=ja_JP.UTF-8
SHELL=/bin/sh
LC_MEASUREMENT=ja_JP.UTF-8
LC_IDENTIFICATION=ja_JP.UTF-8
PWD=/home/masashi
LC_NUMERIC=ja_JP.UTF-8
LC_PAPER=ja_JP.UTF-8

crontab書き直し

↓に書き換えて実行したのですが、0バイトのままでした。

HOME=/home/masashi
PATH=/usr/bin:/bin:/home/masashi/bin
SHELL=/bin/bash
*/1 * * * * $HOME/bin/fireflybkup.sh

とりあえず動けばいいやでbash -lcを追加して書き直し。

masashi@PC-ubuntu:~$ crontab -l | grep -v \#
HOME=/home/masashi
PATH=/usr/bin:/bin:/home/masashi/bin
SHELL=/bin/bash
*/1 * * * * bash -lc $HOME/bin/fireflybkup.sh

うまく取れました。

masashi@PC-ubuntu:~$ ls -l backup/firefly/
合計 2136
-rw-r--r-- 1 masashi masashi 100851 1120  2020 fireflydb
-rw-rw-r-- 1 masashi masashi 517020 125 15:30 fireflyiii-db.sql
-rw-rw-r-- 1 masashi masashi 517020 125 15:27 fireflyiii-db.sql.1129
-rw-rw-r-- 1 masashi masashi 517020 125 15:30 fireflyiii-db.sql.bak
-rw-rw-r-- 1 masashi masashi 514683 125 15:20 fireflyiii-db.sql.bak.1129

OK。
ちゃんと取れました。

  • fireflyiii-db.sql.1129
  • fireflyiii-db.sql.bak.1129

は念の為取っておいたコピーファイルなので無視でOKです。

日次で取るよう起動時刻を修正して最終的にはこんな感じです。

masashi@PC-ubuntu:~$ crontab -l | grep -v \#
HOME=/home/masashi
PATH=/usr/bin:/bin:/home/masashi/bin
SHELL=/bin/bash
@daily bash -lc $HOME/bin/fireflybkup.sh

おまけ

実は何度か書き直しましたが、上手くいったやつもログ出ていたのでOKですね。

masashi@PC-ubuntu:~$ grep CRON /var/log/syslog
()
Dec  5 15:00:01 PC-ubuntu CRON[1241938]: (root) CMD (timeshift --check --scripted)
Dec  5 15:17:02 PC-ubuntu CRON[1243276]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Dec  5 15:20:02 PC-ubuntu CRON[1243619]: (masashi) CMD (env > cronenv.txt)
Dec  5 15:20:02 PC-ubuntu CRON[1243618]: (masashi) CMD ($HOME/bin/fireflybkup.sh)
Dec  5 15:20:02 PC-ubuntu CRON[1243617]: (CRON) info (No MTA installed, discarding output)
Dec  5 15:21:01 PC-ubuntu CRON[1243665]: (masashi) CMD (env > cronenv.txt)
Dec  5 15:21:01 PC-ubuntu CRON[1243664]: (masashi) CMD ($HOME/bin/fireflybkup.sh)
Dec  5 15:21:01 PC-ubuntu CRON[1243663]: (CRON) info (No MTA installed, discarding output)
Dec  5 15:25:01 PC-ubuntu CRON[1244255]: (masashi) CMD ($HOME/bin/fireflybkup.sh)
Dec  5 15:25:01 PC-ubuntu CRON[1244254]: (CRON) info (No MTA installed, discarding output)
Dec  5 15:26:01 PC-ubuntu CRON[1244735]: (masashi) CMD ($HOME/bin/fireflybkup.sh)
Dec  5 15:26:01 PC-ubuntu CRON[1244734]: (CRON) info (No MTA installed, discarding output)
Dec  5 15:27:01 PC-ubuntu CRON[1244812]: (masashi) CMD ($HOME/bin/fireflybkup.sh)
Dec  5 15:27:01 PC-ubuntu CRON[1244811]: (CRON) info (No MTA installed, discarding output)
Dec  5 15:30:01 PC-ubuntu CRON[1245221]: (root) CMD ([ -x /etc/init.d/anacron ] && if [ ! -d /run/systemd/system ]; then /usr/sbin/invoke-rc.d anacron start >/dev/null; fi)
Dec  5 15:30:01 PC-ubuntu CRON[1245222]: (masashi) CMD (bash -lc $HOME/bin/fireflybkup.sh)

参考サイト

Ubuntu Manpage: crontab - cron を駆動するための一覧表

cron上でのコマンド実行を再現する - Qiita