ゆっくりしたい日曜日

8:00

おはようございます。本日はとりあえずメルマガを配信予約まで持っていきましょう。

publish:シゴタノ!:デジタルノートとしてのWorkflowy/Dynalist | シゴタノ!

メルマガ読み返し:

はじめましょう。

* * *

読み返しが終わりました。続いて配信予約へ。

9:00

メルマガ配信予約:

まずはまぐまぐ。

* * *

終わりました。アラカルト方式だとメールのタイトルが長くなるのが毎回の難点ですね(文字数制限があるのです)。続いてnote。

* * *

noteも終わり。これで作業はお終いです。

ちなみにnoteでは、「ここからは有料です」と無料部分と有料部分を区分けできるのですが、アラカルト方式だと線の入れ方が難しいですね。ちょうど半分にできないことが多いです。

Textbox:

アイデアノートの扱いについて。

まずHottext.mdというファイルを対象にする。アイデアが箇条書きで並んでいるノート。

Image from Gyazo

これをベースに考える。

* * *

まず、このファイルを読み込む。冒頭に* がある行以外は無視する。下位項目になっているものは、どうする。その行だけがランダムで取り出されても意味を見出せないから、それは省いていい。つまり、正規表現では行頭の記号を入れておく必要あり。

ファイルの中身を一行ごとに読み込み、正規表現でマッチ判定して、もしマッチしたら何%かでそれをピックアップする。ピックアップしたものは配列Aにappend、ピックアップしなかったものは配列Bにappend。でもって、モーニングサマリーには配列Aを提示する。

で、配列Bの後ろに配列Aをくっつけて、そこからどうする?

そのままファイルを上書きするのはうまくない。ピックアップ判定以外の行が消え去ってしまう。ということは、ピックアップ判定の前に行の取り出しをすればいい。

まず、一行取り出す。マッチしないならそのまま配列Bに、マッチしたもので一定確率をクリアしたものは配列Aに、そうでなかったものはやっぱり配列Bに。

これですべての行の情報が残る。

ただし、「下位項目」がうまくいかない。行を移動させるなら、下位項目ごとにしないと意味がない。つまり、下位項目は作らないようにすればいい。改行を入れなければどれだけ長くなっても構わないのだから、一文に詰めてしまう。本当に階層が必要なものは、ここではなくアウトライナーかScrapboxに移動させること。

で、「このアイデアはもういいや」というものは下位に移動させておく。こうすれば、そのアイデアがピックアップされることはない。その場合どうなる?

サマリーにはそれらはでない。しかし、それらはアイデアノート上で移動しないので、ファイルを開いたときに「もういいや」というものが上位に表示されるのではないか?

だったら、それを別ファイルに移動させればいい。それはHotなideaではないのだから。

つまり、Hottext上でそれをインデントしておくと、このピックアップ作業で別ファイルに移動させる処理を入れる?

まあ、手作業でコピペしてもいい。その方がいいかもしれない。なんにせよ消さないで消すを実施すること。

あとで読む:未来のために、ライターという職業を再定義しよう。 | 取材・執筆・推敲──書く人の教科書 | ダイヤモンド・オンライン

まずは、Pythonのファイルを作るところから。

* * *

指定のファイルを開き、合致した箇所をprintする、という部分をまず書く。

* * *

続いてピックアップ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import re
import random

def mix():
    filepath = "/Users/Tadanori/Dropbox/textbox/list/HotText.md"
    with open(filepath) as f:
        l = f.readlines()
    count = 0
    tempbody = []
    mainbody = []
    for item in l:
        m = re.search(r"^(\* .*)",item)
        if(m and random.random() < 0.3 and count < 10):
            tempbody.append(m.group(1))
            count += 1
        else:
            mainbody.append(item)
    print(mainbody)
    print(tempbody)

もうちょっと書き方はありそうだが、だいたいできた。30%で項目をピックして、10個集まったら終わり。

* * *

できました。

アイデアノートをかき混ぜるPythonスクリプト - 倉下忠憲の発想工房

あとは、この返り値をモーニングサマリーに組み込めばOKです。あと、組み込まなくても単にこれだけで面白いですね。

* * *

モーニングページへの組み込みも完了しました。これで毎朝過去のアイデアノートと10個再会できます。

14:00

Textbox:

検討課題:モーニングページ上の見た目、あとはHotText.mdへの追加。タイムスタンプなど。

まず、モーニングページ上の見た目について。現状は箇条書きリストになっているが、これで良いか。たとえば、liのstyleをいじることで、ボタン風ないしはカード風の見た目にすることもできる。

* * *

いろいろ試してみたが、あまりうまくいかず。書き込まれているアイデアメモのボリュームにかなりばらつきがあるので、カード型のスタイルは結構難しい。

一旦、見た目問題は保留。しばらく使っていて、違和感を感じるかどうかを探ることにする。問題なさそうならこのまま箇条書きで、問題がありそうなら打開策を考える。

* * *

HotText.mdへの追加について。とりあえずここに入れておけば、自分宛に「通知」することができる。現状アイデアメモだけだが、より拡張した使い方も考えられる。が、とりあえず今はアイデアメモだけ。

で、このファイルに自動的に追加できたら嬉しいだろうか。たとえば、作業記録のpushから。あるいは、Textbox上のジョッターから保存される、という風に。

現状、pushはMindGarden用に書き出しをしているので、そこに処理を加えれば実装はそう難しくないと思う。問題は、その追加の仕方。

mixerでは上のほうから順番に表示される。しかし、ファイルへの追記は基本的に下になる。これをどうするか。

第一に「下でよい」とする。どうせ何日か立てば、それが上に上がってくることは確定的。むしろ、ちょっと時間を置くことでちょうどよい感じになっているかもしれない。

第二に、上に追加する。ただし、ファイルの上部にはアイデア以外の記述があり、それをどう避けるのかが課題となる。「4行目から書き込む」みたいなことはできなくもないが、そうすると以降HotText.mdの上部が書き換え不能になる。新しくStyleを書き足したくなったときは、その度ごとに行数の変更を設定しなければならない。現実的ではない。

「ここからがアイデアの始まりですよ」というマーカーを設定しておき、その下に追記する、あたりが現実的だろうか。

この問題は、「書き留めたアイデアは、どのような頻度で目に入るのが良いか」という別の問題とかかわっている。

* * *

『思考の整理学』で、外山滋比古は、書き留めたアイデアはすぐに見返さないほうがよい、ちょっと寝かせておくぐらいがちょうどよいのだ、と言っていた。それに準じてみよう。

というわけで、一番下に追記で良し、とする。自分で手入力で書き込む場合も、同じように考えるのが良いだろう。どちらにせよ、最上位項目はどんどん入れ替わっていくのだから。

* * *

というわけで、後はどう追加するのか、という話。pushの扱い問題。

まあ、MindGardenはそのまま残してよいだろう。これは新しい方にどんどん追加される形で、しかも移動や時系列の変化がない。そういう二つの軸を持っておく、ということにする。

で、Textboxから、何かのファイル(もう忘れた)に追記する機能をTweet機能と同時に書いていたはずだから、それを書き換えれば、Textbox上からも書き込みができるはず。まずはそちらから行こう。

あとで読む:道具のメーカー「PREDUCTS」 はじめます|Go Ando / THE GUILD|note

あとで読む:なぜなら自分との「ずれ」は、相手の「歴史」だからです。

* * *

あっという間に書けました。対象のファイルと保存の形式を変えるだけなので簡単です。ついでに、これまでは「ツイート&保存」がデフォルトだったのに対し、今後は「保存だけ」をデフォルトに変えました。これくらいでちょうどよいでしょう。

続いて、pushの処理。これは作業記録の処理ですね。

* * *

dailycheckout.pyがおそらく、一日の作業記録の「後始末」をやっている。

以下のような記述を見つけた。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
    with open(yesterdayFilePath) as f:
        l = f.readlines()
        bookBlockFlag = False
        for s in l:
            m = re.match(r'>> push (.*)?:(.*)$', s)
            if m:
                tenpdic = d = {'num': sirial , 'title': m.group(1),'body':m.group(2)}
                sirial = sirial  + 1
                bigdic.insert(0,tenpdic)
            n = re.match(r'book:buy:(.*?)', s)
            if n:#ブックブロックの開始
                bookBlockFlag = True
                continue
            if bookBlockFlag == True:#ブックブロック内の処理
                continue
            nh = re.match(r'^###* ', s)
            if nh:
                bookBlockFlag = False

なんとかして、ブロック要素を処理してやろう、という意気込みが見える。が、今はもう必要なくなった(と思う)ので一旦その部分はリファクタリングする。

ここに先ほど書いたのとほぼ同じ処理を書くだけだが、pushはMindGarden用にtitleとbodyを設定しているのであった。これをどうするか。両方とも一行に書けばいいわけだが、タイトルがない場合がある。

イマイチフォーマットが揃わない。そもそもタイトルが不要か。実際MindGardenでもタイトルがついているカードはほとんどない。一旦MindGarden側のフォーマットを再検討しよう。

* * *

いや、やはりタイトルをつける、かもしれないという状況は大切。Textboxへの追記をタイトル欄の有無で切り分けることにする。

* * *

とりあえず書けた。これは一度走らせると、デイリーページが「処理」されてしまうので、実験結果は明日確かめることにする。

push :テスト用の書き込み

push タイトル付き:テスト用の書き込み。

これでよし。

* * *

でもって、ついでに他の処理も検討しておこう。処理したいのは以下。

「あとでよむ」「publish」「出金記録」

これらは単行なので、先ほどの処理内に含ませることができる。マッチさせる正規表現を変えればいいだけ。

* * *

書けました。まだ実際に動かしていないのでなんとも言えませんが、無事動くならば作業記録の書き込みを断片化して取り出し、それをTextboxのログリストに書き込めるようになっているはずです。

* * *

さらに改造。book:endの技術があったら、booklog.mdの該当行を読了扱いに変更。

これで、だいたい作業記録でやりたいと思っていたことができました。

18:00

book:read:start:『21世紀の道徳 学問、功利主義、ジェンダー、幸福を考える (犀の教室)』:

読みはじめます。

19:00

book:buy:kindle:

duolingo:

20:00

Textbox:

先ほど書いたスクリプト、実際に使うまでは動作テストができないと書いたけども、それってだいぶコードがヤバイ気がしてきた。密結合すぎるのだろう。

処理に関数をあまり使わず、すべてをmainに並べている書き方もまずい。

テストがしづらいと、機能修正もやりにくくなるわけで、全体的によくない。今回のこの処理も、長らく取りかかろうと思っていたのに後回しになっていたのは、そういうテストのできなさに原因があるのではないか。

実際の業務日誌ではないファイル名を与えて、処理できるようにすればとりあえずはOKだろう。

* * *

リファクタリングして、個別に機能のテストができるようになりました。

でもって、実際に試してみて、きちんと動きました。よしよし。

とある原稿の下読み:

お手伝いです。

21:00

本日の振り返り:

本日は早めにメルマガを仕上げて、あとはずっとTextboxと作業記録まわりの作業をやっていました。かなり時間を使いましたが、以前から考えていた機能はだいたい実装できたと思います。

あとは、モーニングサマリーに表示できる情報を増やすために、たとえば「最近着手したプロジェクト」とか「最近読んでいる本」みたいな情報も作業記録から取得できたら面白いかなと考えています。今回基礎の仕組みが整ったので、追加するのは簡単です。

しばらくは、この状態で使ってみて、アイデアがあれば追加していきましょう。

というわけで、本日はそろそろ閉店がらがらです。

仕事終わりの妻を迎えに行ってきます。