メインコンテンツへスキップ

todo.txtで始めるタスク管理

Remeber the Milk、Todoist、Appleのリマインダーなどを経て、ここ1〜2年はMicorosoft To Doを使ってタスク管理をしている。

私がタスク管理アプリに求めるものは、

  • 期限管理できること
  • 繰り返しタスク(毎週、毎月など)が使えること
  • コンテキスト、プロジェクトなどでタスクをカテゴライズできること

であり、有償のタスク管理サービスで提供される豊富な機能は、自分にとってオーバースペックで、機能的にはシンプルなMicrosoft To Doで必要十分だ。

しかし、データがサーバに保管されクローズドであり、かつエクスポートすらできない点がずっと気になっていた。

このため、テキストファイルを使ったタスク管理であるTodo.txtを使い始めることにした。

iOSではSwiftoDoを使うことにした。

標準でDropboxをサポートしており、ファイルアプリでアクセスできるようにしていれば、iCloudやGoodle Driveなどにもファイルを置けるが、私はDropboxへ置くことにした。

DropboxはGoogle DriveやiCloudなどと比較し同期が速く、この手の運用をするのであれば未だに優位性があると思う。

MacとWindowsではオープンソースのsleekを使いはじめた。

todo.txtの標準シンタクスには定義されていない、繰り返しタスクの記法(例 rec:1w)がSwiftoDoと共通なのが嬉しくUIも美しい。

ransome1/sleek: todo.txt manager for Linux, Windows and MacOS, free and open-source (FOSS)

ただ、sleekには登録済みタスクのテキストを修正できない不具合があるっぽい。(2025/02/17現在 Macで再現)

2025/03/05追記

sleekは私の環境(Mac)では動作が不安定なため使用を止めた。

MacではiOS版のSwiftoDoと同じ作者のSwiftoDo Desktopを使い始めた。

また、これらの構成だとリマインダー(リマインド機能という意味で)を使えないが、毎朝のタスク確認はルーティン化しているので、それほど問題にはならないと考えている。

関連記事

Textwell

Textwell - The Modeless Textbox for iPhone, iPad, iPod touch, Mac, and Watch. メモ、メッセージ、ブログ、検索、投稿など、あらゆる文章作成タスクに使用できる多目的テキストエディタ ファイリングやスタイリングのための機能はないが、JavaScriptベースのカスタマイズ可能なアクション、自動履歴、クラウド同期などをサポートしており、シンプルで拡張性が高い Mac版、iOS版、AppleWatch版がある Textwell | URL Schemes 自作のアクションなど # ソートして重複行を削除するTextwellのアクション Obsidianのデイリーノートへ追記するTextwellのアクション Amazonから書誌情報をTextwellへ取り込むブックマークレット

2024年に買ってよかったもの

今年買って良かったものベスト9(中途半端)をまとめておく。 Mac mini 2024 # Mac mini 2024 M1 ProのMacbook Proに変わるメインマシンとして以下のスペックで購入した。 4コアCPU、20コアGPU、16コアNeural Engine搭載Apple M4 Proチップ 64GBユニファイドメモリ 512GB SSDストレージ 電源スイッチが底面にあるという、きっとジョブズが存命なら許されないであろうインタフェースデザインは残念だが、フットプリントが小さくとりまわしが楽だし、パフォーマンス面でも不満はまったく無い。長く使えそうだ。 Anker 675 USB-C ドッキングステーション] # Anker 675 USB-C ドッキングステーション

Appleのヘルスケアデータから体重を抜き出してCSVファイルを作成する

Appleのヘルスケアアプリのデータを使って、他のアプリでグラフを描こうと思ったが、エクスポートされるデータはXMLのため、そのままでは扱いにくい。 このため、XMLファイルから体重データを抜き出してCSVを出力するRubyスクリプトを書いた。 require 'nokogiri' require 'date' reader = Nokogiri::XML::Reader File.read('export.xml') data = [] reader.each do |node| if node.name == 'Record' && node.attributes['type'] == 'HKQuantityTypeIdentifierBodyMass' d = Date.parse(node.attributes['startDate']).strftime("%Y-%m-%d") data << [d, node.attributes['value']] end end data.sort.each {|d| puts d.join(',') } =begin <Record type="HKQuantityTypeIdentifierBodyMass" sourceName="1byone Health" sourceVersion="63" device="&lt;&lt;HKDevice: 0x3013e9b30&gt;, name:iPhone, manufacturer:Apple, model:iPhone, hardware:iPhone, firmware:iPhone, software:17.5.1, localIdentifier:ja_JP, UDIDeviceIdentifier:ja_JP, creation date:2024-06-02 22:17:36 +0000&gt;" unit="kg" creationDate="2024-06-17 07:17:17 +0900" startDate="2024-06-17 07:17:17 +0900" endDate="2024-06-17 07:17:17 +0900" value="71.9"/> =end 以下、ChatGPTにヘルスケアデータの構造を聞いた回答 Appleのヘルスケアアプリでエクスポートされるデータは、XML (Extensible Markup Language) フォーマットで提供されます。このフォーマットは、ヘルスデータを構造化して格納するための標準的な形式です。 データの構造と内容 # XMLヘッダー エクスポートされたファイルは、XMLヘッダーから始まります。 <?xml version="1.0" encoding="UTF-8"?> 全体のルート要素 データ全体は <HealthData> というルート要素でラップされています。 <HealthData locale="en_US"> ... </HealthData> データの各エントリー ヘルスケアのデータは、それぞれの記録を <Record> 要素として格納します。主な属性は以下の通りです: type: データの種類(例: 歩数、心拍数など)。 sourceName: データのソース名(iPhone、Apple Watchなど)。 sourceVersion: ソースのバージョン情報。 unit: データの単位(例: count, bpm, kcal など)。 creationDate: データが作成された日時。 startDate: データの開始日時(測定期間の開始)。 endDate: データの終了日時(測定期間の終了)。 value: データの値(例: 歩数の数値、体重の値など)。 例:

URLスキームに対応していないアプリを限定的に対応させる

Kofax Power PDF for MacというURLスキームに対応していないアプリを対応させるためのメモ。このアプリ限定の手順ではないので他のアプリへも応用可能だと思います。 プロトコルハンドラ用のアプリケーション作成 # AppleScriptを使ってKofax Power PDF for MacでPDFファイルを開くスクリプトを作成する。スクリプトエディタで以下のスクリプトを入力。 on open location theURL set pdfPath to do shell script "echo " & quoted form of theURL & " | sed 's/kofaxpdf:\\/\\/open\\?file=//g'" if (do shell script "test -f " & quoted form of pdfPath & " && echo true || echo false") is "true" then do shell script "open -a 'Kofax Power PDF for Mac'.app " & quoted form of pdfPath else display dialog "ファイルが見つかりません: " & pdfPath buttons {"OK"} default button "OK" end if end open location このスクリプトはkofaxpdf://open?file=/path/to/file.pdfで呼び出さると、ファイルパスを抽出しそのファイルを指定してKofax Power PDF for Macを起動するもの。スクリプトを保存し、ファイルメニューの書き出すでアプリケーションとして書き出す。 このアプリケーションがカスタムプロトコルを処理することになる。 Info.plistの編集 # Finderで上記で作成したアプリケーションを右クリックしパッケージの内容を表示を選択する Content/Info.plistを開き以下の内容を追加する <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string>MyApp Protocol</string> <key>CFBundleURLSchemes</key> <array> <string>kofaxpdf</string> </array> </dict> </array> これによりkofaxpdf://というカスタムプロトコルがこのアプリケーションに関連付けられる。ここでいちどこのアプリケーションを起動しておく。

Obsidianの検索機能

Obsidianの標準の検索機能に関するメモ。検索 - Obsidian 日本語ヘルプ - Obsidian Publishより良く使うものを抜粋した。 ショートカットキー # Ctrl+Shift+Fまたは⌘+⇧+F 検索結果表示のオプション # 検索窓の右にあるボタンを押すと検索結果表示のオプションを設定できる。検索結果が多い場合などは、折りたたんでノート名であたりをつけたりするのに便利。 検索結果の埋め込み # ```query embed OR search ``` などとするとノート内に検索結果を埋め込むことができる。この機能はObsidian PublishでもQuartzでもサポートされていない。 検索クエリ # 検索条件 書きかた 説明 AND検索 foo bar fooとbarが含まれる OR検索 foo OR bar fooまたはbarが含まれる NOT検索 foo -bar fooを含むがbarを含まない foo スペースを含む文字列の検索 “foo bar” foo barという文字列を探す 特殊記号のエスケープ \" \\に続けて書くと通常の文字して検索 グループ化 ((a OR b) (c OR d)) 検索条件のグループ化 正規表現 /f../ //の中に正規表現を書く ファイル名検索 file:".jpg" ファイル名に.jpgを含むファイルを検索 ファイルパス検索 path:“journal/” ファイルパスにjournalを含むファイルを検索 タグ検索 tag:#mac タグに#macを含むノートを検索 大文字小文字を無視 ignore-case:(ABC) 大文字小文字を区別せずにABCを検索 大文字小文字を区別 match-case:(ABC) 大文字小文字を区別してABCを検索 ユースケース # 特定のディレクトリ配下を除外して検索 # 検索結果にノイズが含まれてしまうため、作業ログを置いているjournalというディレクトリは除外して検索したい。

Macのボイスメモで録音したファイルをmp3に変換する

事前にfmpegをインストールしておく。 ボイスメモのすべての録音で変換したいファイルを選択する 右クリックしサービス - Finderに表示 を選択 ターミナルを開きffmpeg -i を入力し2.をDrag&Dropする 続けて-acodec libmp3lame hogehoge.mp3と入力して実行する この例ではhogehoge.mp3というファイル名でMP3ファイルが作成される 入力するコマンドの全体はこうなる。 ffmpeg -i foo.m4a -acodec -acodec libmp3lame hogehoge.mp3 以下のようにすれば192kbpsのビットレートでMP3を作成できる。(デフォルトは128kbps) ffmpeg -i foo.m4a -acodec -acodec libmp3lame -b:a 192k hogehoge.mp3