ブログは難しい

テーマの無い駄文ブログを続けることの、何という難しさよ。

毎日ブログに書くような出来事に遭遇するわけでもなく、四六時中考え事をしているわけでもない。

 

Youtubeでも人気のチャンネルは、あるテーマに特化しているものが多いね。

ブログも同じはずなのだが、なぜか、特に書くテーマもなく急に始めてしまいがち。

動画ならば、配信者が魅力的だったり編集が上手だったりすれば、テーマがなくても映像だけで間を持たせることは可能だろう。そのようなスタンスで素晴らしい動画を上げている人も多い。

 

しかしブログは、特に文字情報に重点を置いている書き物ブログは、映像や音に頼ることができない

文体や構成力で魅せるしかないのに、肝心のテーマがないとどうにもならない。

 

ブログで日記をつけている人もいる。

備忘録にもなるし、公開することで長く日記を続けられるというメリットもあるそうだ。

やってみようかと思ったが、日記は高度にプライベートな書き物で、公開しようと思うと実につまらない内容の文章しか書けないと気づいて諦めた。

向き不向きがあるらしい。

 

趣味についてのブログはどうか。

ブログとしては王道だし、テーマに特化しているという点では日記より書きやすそう。

でも、実は人様に語れるような趣味はないんだよな、私。

ひとつの趣味を突き詰めていくより、広く浅く様々なことに興味を持つタイプなので、いざ記事にしようと思うと困ってしまう。

誰でも知っているようなことしか書けないんだよな。

 

仕事関連のブログはどうか。
これはなかなか有用かもしれない。

仕事上の問題点などを提起することで、同業者と情報交換ができるかもしれないし、自らの知識や技術のまとめとしても機能するかもしれない。

しかしこれも、SNSの方が情報交換には適しているし、自分なりのまとめを公開するとは言っても、守秘義務があるから、結局は教科書や雑誌に載っているような無難な内容になってしまい、あまり役には立たない気がする。

 

あれもだめ、これもだめ。情けない話である。

 

今書きながら思いついたが、毎日ひとつニュースサイトからニュースを選んで、それについて考えたことを書くというブログはどうだろう。

政治経済でもいし、芸能ニュースでもいい。

詳しく知らない内容なら、自分なりに調べたことを書けばいい。

選ぶニュースに偏りがあるといけないので、一定の時間に開いたニュースアプリの一番最初の記事について書くと決めれば、ある程度はジャンルの偏りは避けられるのではないか。

うん、しばらくはこれで書いてみようかな。


さて、では調べてみよう・・・。

「トランプ氏と習近平氏が電話会談・・・TikTok所有権問題で最終合意か(読売新聞)」

・・・今日はいいや。明日からやります。

筋肉の神

筋トレブームなのだろうか。


スマホのニュースアプリの記事に、結構な頻度で筋トレの話題が出てくる。
興味に応じて表示されるのだろうから、別に流行っているわけではないのか?

しかし書店のスポーツの棚には筋トレ本がたくさんあるし、新しいジムが近所にも数軒できていたりするし、ブームとは言えないまでも以前より身近な存在になっているような気はする。

筋トレ、流行ってる?

 

まあ、流行り廃りはいいのだが、私は10年ほど筋トレのためにジムに通っている。

人間ドックの結果を受けて入会したのだが、筋トレ自体の面白さに気づき、マイブームの時期は週に4回とか5回とか、気が狂ったように筋トレをしていたものだ。

しかし最近は週1回も怪しい。

昼休みを利用して通っているのだが、仕事が忙しいとか、役所に行かないといけないとか、昼寝をしたいとか、そういう言い訳が増えてきた。
だから10年経っても、全然マッチョにならない。飽きたわけではないのだが・・・。

 

さて、そのジムには行くと必ず顔をあわせる人がいて、彼がまた、すごい筋肉の持ち主。
素人でもわかるほどの均整の取れた肉体美。ボディビルダーともまた別の凄みのある筋肉。
普段は何をしている人なのかは謎だが、周りを寄せ付けないオーラを放ちつつ、真昼間から黙々とトレーニングをしている。
そしてその日のトレーニングが終わると、無駄な時間を過ごすことなく、サッとジムを出て帰ってしまう。

実にカッコいい。トレーニング姿など、神々しさを感じるほど。
ストイックに何かに打ち込む人間というのは、このような輝きを放つのか、と彼を見るたびに感嘆せざるを得ない。

 

あの筋肉は努力の結果なのだろうが、それとは別に、おそらく彼は筋肉の神に愛されているのだと思う。
体格や遺伝、ひたすら筋トレを続ける精神力、トレーニングに充てられる時間、栄養学の知識など、才能と呼べる要因や、それを開花させる環境要因はいろいろあるだろう。
しかし仮に、私が彼と同じ環境で同じトレーニングをしても、あの肉体は得られないのではないか。
それが、筋肉神に愛されし者とそうでない者の越えられない壁。絶望的な差・・・!!


・・・違うか。
言い訳せずに、きちんと通わないと。
血糖値とかコレステロールとか・・・また人間ドックあるじゃん・・・。

GoogleカレンダーからObsidianのDailyノートへの予定自動取り込み備忘録

<a class="keyword" href="https://d.hatena.ne.jp/keyword/Google%A5%AB%A5%EC%A5%F3%A5%C0%A1%BC">Googleカレンダー</a> → Obsidian(Dailyノート)自動取り込み|実装メモ

今年のお盆休みはどこにも行かず、家でひたすら慣れないツール作りに励んでいた。ChatGPTに相談しつつ、失敗を繰り返しながらの作業。時折見せるChatGPTのポンコツっぷりにイラつくも、私のプロンプトが悪いのは明白。アレコレうるさいオッサンを宥めるのに、相当苦労したんじゃないかな。ごめんな、GPT。

今回作りたかったのは、ChatGPTからGoogleカレンダーに予定を入力するツールと、Googleカレンダーに登録された予定をObsidianのDailyノートに自動で追加するツール。結局前者は失敗し、今もそのプロジェクトは続いている。後者は成功し、安定して動いている。以下、どのような構成で、どのような苦労があったかを備忘録的にまとめておく。


1. 目的と要件

  • 入力(入口)は GoogleカレンダーiPhone/職場Mac/自宅Mac から共通で入れやすい。
  • 記録(出口)は ObsidianのDailyノート:当日の出来事ログを自動追記。
  • 終日と時間ありを区別。時間ありは HH:MM-HH:MM 表記、終日は (終日) を付与。
  • Zapierは「1イベント=1 Markdownファイル」をGoogle Driveに作成(Appendが見つからなかった)。Mac側で取り込み後に archive/ へ移動。

2. 全体構成

  • ZapierGoogle CalendarGoogle Drive(1イベント→1つの.md
  • macOS LaunchAgentGoogle Drive の受け皿フォルダを監視し、変化で Python 起動
  • PythonMarkdownから「タイトル」「開始・終了(または終日)」を抽出し、Obsidianの Daily/YYYY/MM/YYYY-MM-DD.md に追記 → 処理済みの.mdファイルは archive/ 移動
※ 本文のパスやアカウント名は匿名化しています。例:ossan@example.com/Users/ossan/...

3. Zapier(GoogleカレンダーGoogle Drive

3.1 トリガ

  • Google CalendarNew or Updated Eventでテスト。
  • 取得フィールド例:Summary(件名)、Start Date TimeEnd Date TimeAll-day

3.2 変換(任意)

  • Formatter(Date/Time):Zapier側の選択肢で、ISOのままでも後段Pythonで整形可能。

3.3 出力

  • Google DriveUpload/Create File(1イベント=1ファイル)。
  • ファイル名例:2025-08-17_頭を剃る.md
  • 本文例(Zapierのテンプレ内):
     - [ ] 頭を剃る 2025-08-17T17:00:00+09:00から2025-08-17T18:00:00+09:00
    

4. フォルダ監視(launchd, LaunchAgent)

ユーザセッションで動かすため ~/Library/LaunchAgents/plist を配置。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key><string>com.ossan.pullgcal.watch</string>

    <key>ProgramArguments</key>
    <array>
      <string>/Library/Frameworks/Python.framework/Versions/3.13/bin/python3</string>
      <string>/Users/ossan/bin/pull_gcal_feed.py</string>
    </array>

    <key>WorkingDirectory</key>
    <string>/Users/ossan/bin</string>

    <key>StandardOutPath</key><string>/tmp/pull_gcal.out</string>
    <key>StandardErrorPath</key><string>/tmp/pull_gcal.err</string>

    <key>WatchPaths</key>
    <array>
      <string>/Users/ossan/Library/CloudStorage/GoogleDrive-foo@example.com/マイドライブ/ZapierCalendarFeed</string>
    </array>

    <key>RunAtLoad</key><true/>
    <key>ThrottleInterval</key><integer>10</integer>
  </dict>
</plist>

有効化:launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.ossan.pullgcal.watch.plist 更新時:launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.ossan.pullgcal.watch.plistbootstrap 状態確認:launchctl print gui/$(id -u)/com.ossan.pullgcal.watch


5. Python(抽出・整形・追記・アーカイブ

5.1 入口・出口のパス

from pathlib import Path
import re, shutil
from datetime import datetime
from zoneinfo import ZoneInfo

TZ = ZoneInfo("Asia/Tokyo")

INBOX  = Path("/Users/ossan/Library/CloudStorage/GoogleDrive-foo@example.com/マイドライブ/ZapierCalendarFeed")
ARCH   = INBOX / "archive"
DAILY  = Path("/Volumes/knowledge/Obsidian/2nd brain/daily")

5.2 イベント行の抽出(時間あり/終日)

ISO_RANGE_RE = re.compile(
    r"^- \[\s?\]\s*(?P<title>.*?)\s+"
    r"(?P<s>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:[+\-]\d{2}:\d{2})?)から"
    r"(?P<e>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:[+\-]\d{2}:\d{2})?)$"
)
ALLDAY_RE = re.compile(
    r"^- \[\s?\]\s*(?P<title>.*?)\s+(?P<d>\d{4}-\d{2}-\d{2})$"
)

def parse_dt(s: str) -> datetime:
    # 例: 2025-08-17T17:00:00+09:00
    return datetime.fromisoformat(s)

5.3 ノーマライズ(表示文言の生成)

def normalize_line(raw: str):
    m = ISO_RANGE_RE.search(raw)
    if m:
        title = m.group("title").strip()
        s = parse_dt(m.group("s")).astimezone(TZ)
        e = parse_dt(m.group("e")).astimezone(TZ)
        day = s.strftime("%Y-%m-%d")
        text = f"- [ ] {title} {s:%H:%M}-{e:%H:%M}"
        return day, text

    m2 = ALLDAY_RE.search(raw)
    if m2:
        title = m2.group("title").strip()
        day = m2.group("d")
        text = f"- [ ] {title} (終日)"
        return day, text

    return None, None

5.4 Dailyノートに追記(自動で年月フォルダを作成)

def append_to_daily(day: str, line: str):
    yyyy = day[:4]
    mm   = day[5:7]
    dest_dir = DAILY / yyyy / mm
    dest_dir.mkdir(parents=True, exist_ok=True)
    dest = dest_dir / f"{day}.md"
    with dest.open("a", encoding="utf-8") as f:
        f.write(line + "\n")
    return dest

5.5 受け皿の .md を取り込み → archive へ移動

def process_inbox():
    ARCH.mkdir(exist_ok=True)
    processed = 0
    for p in sorted(INBOX.glob("*.md")):
        try:
            raw = p.read_text(encoding="utf-8").strip()
            day, line = normalize_line(raw)
            if day and line:
                dest = append_to_daily(day, line)
                print(f"[OK] {p.name} → {dest}")
                shutil.move(str(p), str(ARCH / p.name))
                processed += 1
            else:
                print(f"[SKIP] {p.name}(フォーマット不一致)")
        except Exception as e:
            print(f"[ERR] {p.name}: {e}")
    print(f"[DONE] processed={processed}")

LaunchAgent からは pull_gcal_feed.pyif __name__ == "__main__": process_inbox() を叩くだけ。


6. 運用とログ

  • 受け皿にファイルが生成されると、数秒〜十数秒で取り込み → Daily追記 → archive/ 移動。
  • ログ:/tmp/pull_gcal.out(正常系・進捗)、/tmp/pull_gcal.err(例外など)。
  • 重複はZapier側で同一イベントの多重発火が無ければ概ね起きない。起きた場合は受け皿に来るファイルが複製されていないか確認。

7. 失敗談:Timebox直書き同期の壁

Obsidianの timebox.md#timeboxstart/due を記入 → PythonGoogle Calendar API へ同期するアプローチも試した。重複回避に extendedProperties.private.fingerprint を持たせてハッシュ管理したが、次の点で運用が重くなった。

  • 複数端末・iPhoneからの入力は結局「googleカレンダー」のほうが速い(笑)
  • Obsidian→Google の「片側主従」は破綻しやすい(現場で予定を変える起点がGoogle側にある)。

結論として、「入口=Googleカレンダー、記録=Obsidian」に役割分担したほうがシンプルで安定した。


8. 技術的な課題と対処

  • ZapierのAppend不在:1イベント=1ファイルを生成し、Mac側で吸収・追記・アーカイブする方式で解決。
  • Google Driveの同期遅延:ストリーミング(ファイルオンデマンド)でも数秒の遅延は起こり得る。LaunchAgentの ThrottleInterval を短くしすぎると無駄起動が増えるため注意する。
  • macOS権限:フルディスクアクセス・ログイン時起動の権限漏れで失敗しやすい。LaunchAgentのログをまず確認。

9. 未達成:ChatGPT → Googleカレンダー直接登録

「自然文(例:『来週水曜の午後に30分、仕事の計画』)→ 予定作成」を目指しているが、API連携の方式・権限・審査など現時点の自分の環境では未整備。ChatGPT側の問題もあるのではないかと考察しているが、詳細は不明。そのうちに正式に対応してくれるのを待つのもいいかも。


10. まとめ

  • 入力はGoogleカレンダー、記録はObsidianに集約する設計が現実的。
  • Zapierで「1イベント=1ファイル」→ LaunchAgent監視 → Pythonで整形・追記・アーカイブ、の三段構えで安定。
  • 相当疲れた。Zapierは相当便利だが、慣れるまでちょっと戸惑った。
  • ChatGPTは素晴らしいが、プロンプトを打つオッサンがヘボいと、余計な回り道を強いられる。プロンプトの研究が必要。

布団の威力

腰が痛い。
前屈みになると痛い。
オッサンだから仕方のないこと、どこかしら痛いんだから、と諦めムードだったが、このままのペースで年齢を重ねると、そのうちに動けなくなるのではないかという恐怖を感じ始めた。
人間いつかは動けなくなるだろうが、まだちょっと早いような気もする・・・まだ活動したい。

 

ChatGPTに相談するも、まあ、質問の仕方が下手なのだろう。
運動やストレッチなどが良いとのわかりきった回答。
隙あらば「プログラムを作成できますよ? やりますか?」
と前のめりなChatGPTはそっと閉じ、他に改善できるところはないか考えた。

 

まず姿勢。自慢ではないが、私は姿勢が悪いと思う。
特にPCで作業したりゲームをしたりする時の姿勢。バキバキに肩がこる。
それから仕事中の姿勢。ほとんど立ち上がらず、ずっと座っている状態が体にいいわけがない。
全体のシルエットも、猫背ではないのだが、スッと見惚れるような立ち姿、歩き姿とは程遠いなぁ。

 

食事ももしかしたら関係しているかもしれない。

いや、私の体を形作っているのは取り入れた食物なのだから絶対に関係しているはず。
妻はキノコが好きで猛烈にキノコを食べている(ように私には見える)が、私はあまりキノコが好きではない。
彼女は別にどこも痛くないとのことなので、私と妻の食事内容の違いはおそらくキノコだ。
キノコになんらかの効果があるに違いない。もう少しキノコを食べてみることにしようか・・・。

 

あとは睡眠か。
もうYOFUKASHIとかよふ活とか言っている場合ではない。
早寝早起き。
しばらくYOFUKASHIを中止し、夜は速やかに寝ることにした。

しかし・・・朝起きた時の体のバキバキ感、どこかが痛いという状況に変化はなかった。
おかしい。睡眠は関係ないのか?

そこでハッと気がついた。
もしかして、この布団がいけないのではないか?
睡眠するために必要不可欠な布団。
照明や温度なども良い睡眠には重要であることは違いないが、睡眠活動の要となるのは、やはり布団だろう。
実は以前から良い布団を使おうという気持ちはあって、NishikawaのAiRというシリーズを使用していた。
この高価なマットレスで寝さえすれば問題なかろうと安心しきっていたが、本当にそうか?
今の自分に、このマットレスは合っていないのではなかろうか・・・。
そう思うといてもたってもいられず、すぐに近所のショッピングモールにある寝具コーナーに足を運んだ。

 

いろいろな布団、マットレスが展示してあって、それぞれ横たわって試すことができる。
休日だったのでキッズもたくさんいて、奴らはアトラクション感覚で楽しんでいたようだが、私は違う
各布団のパンフレットを一読し、基礎知識を仕入れた上で、念入りに横たわる。
仰向けの状態で腰、肩にかかる負担はどうか。寝返りをうった時の肩への負担はどうか。固すぎたり柔らかすぎたりしないか、材質はどうか、変な臭いはしないか、保証は・・・などチェックすべき項目は多い。

楽しそうに布団で遊ぶキッズと、難しい顔をしたオッサンが、隣同士で横たわる。
その布団試したいけど、まだキッズがいるな・・・と思っていると、空気を読んだ親御さんが子供を移動させてくれたりして、ちょっと気まずい雰囲気の中その布団に横たわらざるを得ない状況もあったりして、あのご家族にはご迷惑をおかけした。

どうもすいません。ありがとうございました。

 

数時間の吟味ののち、最終的にチョイスしたのは、寝心地も機能性も見た目も素晴らしかったエアウィーブのFUTONシリーズ。敷布団ならぬ四季布団という洒落たネーミングの、ちょっとお高い布団だ。
枕と合わせてかなりの出費になったが、他ならぬ自分の大切な体のため。
今後しばらく、いろいろなことを我慢することになりそうだが、受け入れるしかあるまい。

 

早速数日、YOFUKASHIせずにFUTONで寝てみたのだが、ちょっとびっくりした。
朝のバキバキ感がない!
日中、少し腰が痛いかな、肩が痛いかな、ということはあったが、少なくとも朝、布団から起き上がる時の「よっこいしょ・・・」という動きが明らかに軽くなり、滑らかな「よっこいしょ〜」に変化しているのだ。
これは布団を変えて正解だった。

もちろんAiRが合う人もいるし、FUTONで腰が痛くなる人もいるだろう。その他の布団が合う人もいるだろう。今の私にはFUTONが合っていたというだけの話。

ただこれだけは言える。布団で睡眠の質は確実に変わる

ずっと同じ布団で寝ていて、どうも睡眠の質が悪いなと思ったら、布団を変えてみるのも手だ。

今後、長期的に腰痛改善につながるかを観察していこうと思う。

現在のObsidianの様子

以前の記事になるが、

blog.yktdental.com

で、第二の脳を手に入れたかもしれないとワクワクしていたオッサンだが、その後どうなっただろうか。

  

続いていますよ。

こういったメモアプリというのは、長く続けることによって真価を発揮するものだが、どうにも使い勝手が悪かったりして、すぐに乗り換えたりしがち。

しかし、このObsidianは特に不満もなく使えている。不満どころか、「こんなこともできるのか」「こう使ってみたらどうだろうか」など、かなり知的好奇心を満たしてくれる存在で、毎日Obsidianを触るのが楽しみなくらいだ。

 

1. フォルダ構成

はじめはフォルダをある程度作り、そこにメモを格納していくというスタイルで使っていた。
Daily、Note、Blog、備忘録、仕事関連、読書記録、趣味、添付ファイルなど、MacのFinder感覚でフォルダを次々に作る。
しかしこのスタイルはObsidianらしい使い方ではないと、すぐに気がついた。

サイドバーに整然とフォルダが並ぶ姿は見ていて安心感があるし、ファイルを探すときもフォルダを辿ればいつか見つかる。
だが、こうしたメモ帳界隈で必ず問題になる、「どのフォルダに入れれば良いかわからない」状況というのは必ず発生する。両方に同じファイルを保存したり、強引にどちらかのフォルダに保存したりするのだが、無駄だし、どちらのフォルダに保存したのか忘れてしまうこともしばしば。

せっかくObsidianを使っているのだから、リンクでノート同士を繋げていけば、フォルダに頼らずとも目的のファイルには辿り着けるし、その過程で過去のノートとの予期せぬ出会いもある。

検索性を高めるためにタグを使ったり、メタデータを全てのノートにつけたりしておけば、フォルダなんていらないのではないか、と思ったわけだ。

だから今のオッサンのVaultは、ジャンルごとのフォルダ構成ではなく、

- Daily(時系列メモ)
    
- Note(アクティブなノート)
    
- Resource(一段落ついたノート)
    
- assets(画像やPDF)
    
- template(各種テンプレート)
    
といった属性ベースの最低限の構成に落ち着いている。

 

2. 使っているプラグイン

- Calendar:月単位のカレンダー表示でDailyノートを素早く呼び出せる。日記的な記録や、その日の出来事を振り返るのに便利。
    
- Dataview:ノートのメタデータやタグをもとに、一覧・集計・絞り込み表示ができる。タスクや読書記録の管理に活用中。
    
- Date Inserter:ショートカットで日付や時刻を挿入できる。ログ作成がスムーズになる。
    
- Editing Toolbar:モバイル環境での編集を助けるツールバーを追加。iPhoneiPadでの執筆が快適に。
    
- Kindle Highlights:Kindleで付けたハイライトをノートに自動取り込み。読書メモの整理が格段に楽になる。
    
- Natural Language Dates:自然文で日付入力ができる(例:「明日」「来週月曜」)。リマインドや計画メモで重宝。
    
- Tasks:複数ノートに分散したTODOを一括表示・管理。タスクの完了状況も集計できる。
    
- Templater:テンプレートに変数やスクリプトを組み込み、自動で定型ノートを生成。Dailyノートやブログ下書きの作成を効率化。
    


3. Cursorとの連携

最近、CursorとObsidianを連携させるのが流行っていると聞き、早速試してみた。

CursorはAI補助付きのエディタで、コード補完や文章生成が強力だ。Obsidianと組み合わせることで、ノートの下書きを自動生成したり、選択範囲を要約・翻訳する、といった操作がシームレスにできる。

しかし、現時点ではPythonの学習段階がまだ入門書レベルなので、「AIと相談しながら本格的なコードを書く」という使い方までは至っていない。文章処理に関しても、ChatGPTアプリで結果を得て、それを自分で整形してノートに反映する方がしっくりくる。

便利ではあるが、Cursor側から直接ノートを書き換えられると、Obsidianのノートが自分の手を離れてしまうような感覚がある。今後も使い方を探りつつ、課金継続の判断せねばなるまい。
流行っているからといって、無理やり使う必要はないからね。

 

4. 今後について

今後もObsidianを使い込み、第二の脳の作成・・・オッサン脳補完計画を進めていく。
特にDataviewの活用を深め、読書記録やブログ下書き、タスク進捗などを自動的に一覧化する仕組みを作っていけたらいいなあ。

そして、フォルダやタグだけに頼らず、リンクとクエリでノート同士をつなぎ、日々の記録やアイデアを自然に蓄積・整理できる、Obsidianらしい環境を目指してみよう。