書き写すことで「やる」という決意をする

だいたいの日は「タスクリスト」というものを作成し、それに従って行動しています。毎朝、その日一日”やること”を書き出し、それをつらつらと並べてリストを作るわけです。

一日分のタスクリストなので、「デイリータスクリスト」ということになります。

この一日分の”やること”っていうのは、”やること”すべてが入ってあるiPhoneから選び出してきます。

まぁ選び出してくると言っても、”やること”たちには実行日を定めて放り込んでいるので、勝手に選び出されて表示してくれる。iPhoneがその選出をしてくれるわけですけども。

それら選び出された今日一日の”やること”に、毎日やってること「ルーチンタスク」を加えて、「デイリータスクリスト」は完成します。

平日は、基本的にそんな感じで過ごしています。

休日がなかなか…

ルーチンタスクはルーチンタスクでiPhoneに教えてもらいます。ということは、わざわざデイリータスクリストを作らなくても一日の”やること”はiPhoneを参照すれば勝手に選び出されているわけです。

平日は仕事もあり、より精緻に一日を計画するためにデイリータスクリストを作っていますが、休日はそこまで細かく”やること”を敷き詰める必要はありません。しかも、一日の”やること”は iPhoneがリストアップしてくれてる。デイリータスクリストを作らずとも、一日不自由なく過ごせる準備は整っています。

一日がかりの大きな予定のない休日であれば、その”やること”をこなす時間もあります。

でも、やらない。できない。

そこがちょっとした悩みのタネでした。

原因は”決意”

うまくやることをやれてる平日と、なかなかおもうようにやることができない休日。

時間が豊富にあり過ぎたり、平日の疲れが溜まっていたりと、原因らしきものを挙げるとたくさんでてきそうですが、ぼくの場合、大きな原因の一つは”決意”にありました。

平日は、iPhoneがリストアップしてくれてる「今日やること」を、わざわざ別のところに書き写して「デイリータスクリスト」を作っているわけです。

一見無駄な行為に思えますが、これがなかなか侮れないほど重要な役割をしてくれておるんです。

一日分の”やること”を、各時間帯に当てはめていく。この作業をすることで、「この時間にこれをするんだ」と、自分の中で”決意”をしているんだということに気づきました。

一方休日は、iPhoneが一日の”やること”をリストアップしてくれてるのはわかっているので、特に計画を立てる必要性も見当たらず、「デイリータスクリスト」を作らず過ごすことになります。

自分の中での”決意”なしに、一日がスタートするんです。

で、なんだかんだグダグダ過ごしちゃって、結局「今日一日なにやってたんやろ?」みたいなことになっちゃう。

それを防ぐためにも、休日にも”やること”を紙に書き写して、決意してやろうと思います。

おわりに

実際、朝”やること”を紙に書き写し、”決意”することをはじめてみると、以前よりも格段に休日にも”やること”をやれるようになってきました。

ただ、まだまだ平日のようにはいきませんが。でもまぁ大きな進歩はあったと言えます。

一日の”やること”を書き写して、自分の中で「やる」と決意する。

これからも続けて行こうと思います。

おわりのおわりに

今は、やることのすべてはMarkdownファイルに書き込み、Obsidianで管理しています。
「今日やること」は勝手に選び出されるのではなく、今日やることのみをマンスリーページからデイリータスクリスト上に移動させ、実行していってます。
つまり、ここのエントリで書かれていような、「やる」という決意をしたもののみをタスクリスト上に乗せている、ということ。「やる」という決断があるほうが良く、その決断を促すために、コピペではありますが「書き写す」という行為をはさんでいます。
過去にこのエントリを書いてから長い月日が経っており、その間あれこれと自動化を試みたことはありましたが、そういう段階を経て、今はあえて多少の手間がかかるようにすることの大事さを知ることができたな、と感じています。

では、お読みいただきありがとうございました。

20130523064412

ぼく個人のタスク管理におけるボトルネックはGoogleカレンダーだった

いろいろな記録を残してきた。1日の行動ログとか、イベントのログとか、いろんな写真とか。
で、そういうログというもの、記録というものは、いろんな場所にバラバラに存在しているとちょっと具合が悪い。見返す機会があったときに、どこを探せばいいか混乱するし、下手したら見つけることができない場合も出てくる。
長いこと同じ場所に記録を残しているのであれば、そこから別のところに記録する場所を移すとなると、かなりの勇気というか、思い切りというか、大きな決断がいる。と、思ってた。けどそれは案外あっさり成し遂げられる場合もあるんだな、と知った。


iPhoneを手にしたときを境に、残す記録の量が大幅に、劇的に変化した。
iPhone以前は、記録は全然残っていない。写真はPCにあったり携帯電話に撮り溜めてたりバラバラやったし、メモを積極的に残すこともしていなかった。
スケジュール管理にはマンスリーの手帳を使っていて、1年ごとに手帳を新しくするため、書き込む場所は変わっていた。
それが、iPhoneを手にして以降は、メモや写真を積極的に撮るようになり、それらはMacと同期し、保存され、記録のほとんどがiPhoneがあれば振り返ることができるようになった。その気になれば、数年前の出来事であっても、ものの数十秒で振り返ることができるように。
iPhoneを使い始めてからずーっと利用しているものがいくつかあるが、そのうちの一つにGoogleカレンダーがある。
いや、その言い方は適切でない。
Googleカレンダーがあった。今は、使っていない。


タスク管理に関しては、いろいろなツールを渡り歩いてきた。
紙の手帳を使っていた時もあれば、紙のノートを手帳代わりに使っていた時もあったし、iPhoneにタスク管理のアプリを入れたり、TaskChuteのようなものを自作したり、たすくまを使ったり。
どれを使うときにも、必ず併用するツールがあって、それがGoogleカレンダーだった。
紙の手帳を使いつつもGoogleカレンダーも使っていたし、iPhoneのタスク管理アプリには、カレンダーのスケジュールを取り込めるものも多くてよく利用してた。なので、Googleカレンダーには過去10年分ほどのスケジュールが登録されたままになっており、それらは今は記録の役割をしてくれている。
過ぎたスケジュールは、その日の記録として残ってくれる。なので、Googleカレンダーを見返すことで、過去のその日に何をしていたのか振り返ることができる。
つまり、別のところに記録する場所を移す際にかなりの勇気というか思い切りというか大きな決断がいるものの代表格が、Googleカレンダーであった。なので、しばらくはずーっと使い続けると思っていた。一番、使わないようにはならないものだと思っていた。
けど、使ってない今、改めて考えると、「Googleカレンダーを使う」というのがボトルネックになっていた部分があるように思う。

Googleカレンダーにログを残したいが故に、手間に感じているのにわざわざGoogleカレンダーを使う。
ときには他のツールとの接続がうまくいかず、スケジューリングをミスったり。
Googleカレンダーに登録しているスケジュールをタスクリストと同列に並べるために、わざわざ複雑なことを試みたり、使いやすく感じてたツールから乗り換えたり。
で、いつまで経ってもタスク・スケジュール管理が安定せず、また別の方法を試みたり。
そういう諸々のことは、Googleカレンダーを使わない、という選択によって解消された。


スケジュールは必ずGoogleカレンダーに書く。
当たり前のようにそうしていたけど、当たり前のようにそうし続けるものやと思っていたけど、気づけばGoogleカレンダーにスケジュールを書き込まなくなっていた。
もちろん、今の環境が、使っているツールの使い方がGoogleカレンダーを必要としないだけで、また環境が変われば使い出すかもしれないけど、それはあくまでも選択肢の一つ。今までのように、使うことが当たり前に決まっていた状態からは大きく変化した。
Googleカレンダー上に記録は残らなくなり、結果これまでと今とでは「その日どんな予定があったか?」の記録が残っている先が違っていることになる。けど、案外気にならない。
これは、今の環境が快適やからに違いない。
記録うんぬんは、Googleカレンダー以外にも残っているから、それでいいか、と。
それよりも、使わない方が快適なら使う必要ないじゃないか、と。


そんなことを、うちあわせCast 第七十二回:Tak.さんと粒度を揃えたくなる現象についてを聞いて、考えていた。

考える場所が、すぐそこに用意されているということ

デイリーページを毎日作成し、そこにタスクをかき並べて実行していくことでタスクを管理・実行しています。
主にObsidianを使っており、このObsidianには「バックリンク」なる機能が存在します。何かというと、今開いているページに言及しているページを一覧で表示してくれるもの。

これがあれば、プロジェクトに関するログの一覧が、わざわざプロジェクト用のページに書き込まなくても確認できるようになります。
ちなみにここでいう「プロジェクト」とは、完了までに何日かかかるやることのことを指していると思ってください。

ログに関しては、とりあえずそのプロジェクトのリンクを記述し(Obsidianでは「[[]]」で囲んだ部分がリンクとなります)、そこに何をしたか、などのメモを書いておけば後からログを振り返ることができます。
となると、プロジェクトのために作成したページにはログを書かないことになるので、プロジェクトページの中身はすっからかんなまま。
それがなんだかいやで、わざわざログをプロジェクトページに転記したりしていたのですが(もちろんそのように使うのもいいのですが)、こうやって書くスペースが確保されていることが尊いのだと感じます。

プロジェクトを進めていて、ある程度作業を進めているときに、「どうしよう?」と悩むことがありました。どうデータを整理していくべきかわからず、「このままなんとなくで作業を進めると後々一からやり直しになりそう」という時が。
一方で、「どうしよう?」と悩み始めてからとった動きはとてもスムーズで。
そのプロジェクトページを開き、例によって中身はすっからかんなその場所に、データから何を抽出したいのか、そのためにはいくつかのデータをどう整理して組み合わせれば目的に叶うものになりそうかを書き出していきました。
一通り書き、見通しが立った後、あぁ、このためにプロジェクトページは存在するのか、と腑に落ちました。
プロジェクトページがあれば、常に「考える場所」がそこにあるのか、と。
「どうしよう?」と悩んでからページをひらけば考える場所があり、今悩んでいることを整理し始めることができる。この環境が尊いものだ、と感じたんです。

そしてこれは、たすくまではなく、1Writerを使うようになったこととも関係しています。

Taskuma —TaskChute for iPhone
カテゴリ: 仕事効率化, ライフスタイル

1Writer – Markdown Text Editor
カテゴリ: 仕事効率化, ユーティリティ

メモを書く場合、またそれを確認する場合は、たすくまでメモするよりもテキストエディタに書いていった方が自分の好みにあっているという理由もありますが、何よりもエディタなら「考えながら書く」ことができるってのが何物にも変え難い。
たすくま上では「考えながら書く」ということがなんだかできなくて。
また、たすくまでメモしたものは、書き込んだタスクをタップしてタスクの詳細画面にいかないと目に入りません。ログをエクスポートすればEvernote上で確認できるようになりますが、たすくま上では常にメモしたものは隠れたまま。
一方で、エディタ上に1日のタスクをたすくま並みに詳細に書き連ね、そこにメモも直接書き込んでいく1Writerであれば、1Writerをひらけばメモも一緒に目に入ります。書いたメモが勝手に目に入ってくれる。
着想メモは、放り込むだけより、書き込むときに過去のものが目に入ったほうがいいと考えているので、それにはたすくまではなく1Writerだなぁ、と。
それには、たすくまの便利さをかなりの部分手放す必要があったわけですが、今のところなんとかなっています。


考える場所が、すぐそこに用意されていること。
そういう環境が今実現されているので、今までになくいい感じにプロジェクトについて考え、タスクを進め、メモを書き残せている気がします。

では、お読みいただきありがとうございました。

ファイルからリストを作成して、リピートタスクを呼び出す〜1Writerカスタマイズ④〜

「1Writerカスタマイズ」の①〜③にて書いたアクションを作成した段階で、たすくまを使うのをやめ、1Writer(Obsidian)に完全移行しました。

1Writer – Markdown Text Editor
カテゴリ: 仕事効率化, ユーティリティ

Taskuma —TaskChute for iPhone
カテゴリ: 仕事効率化, ライフスタイル

デイリーのテンプレートと、行ごとの削除と移動があれば、一つ一つの行動を記録しながら過ごすことは、けっこう簡単になります。
あとは、予定になかった、つまり、デイリーページ上に書き込まれていないリピートタスクを呼び出すことができれば、終了予定の算出だけがないタスクシュートと呼べるようになるでしょう。
ということで、「リピートタスクの呼び出しできるようにならないか」と考えました。

1Writerのjavascriptアクションの数々には例が載っています。試しに「ui.list()」の例を実行してみると、項目がリスト表示され、そのリストから好きなものをタップすると、そのリストの内容が文中に挿入されるものでした。
これは、使えそうです。
そのコードを書き換え、

  • リピートタスクの一覧が記述されたファイルを開く
  • それをリスト形式に表示する
  • 選択された項目をクリップボードにコピーする

というものにしました。

リピートタスクの呼び出し

//アクションを実行したあと、元のファイルに戻るため、今編集中ファイルのフォルダとファイル名を取得
var folder = editor.getFolderPath();
var editingfile = editor.getFileName();

//リピートタスクを記述しているファイルのファイル名
var openfilename = 'ここに一覧を取得したいファイル名を記述.md'

//リピートタスクの一覧が記述されているファイルを開く。フォルダは、そのファイルが保存されているものを指定してください。
editor.openFile('Dropbox/'+openfilename,'edit',call);

function call(){
    //開いたファイルに記述されているテキストを取得
    var text = editor.getText();
    //改行ごとに配列に格納
    const listData = text.split('\n');
    ui.hudDismiss();
    //配列をリストに
    ui.list('Repeat', listData, false, selectedValues => {
        if (!selectedValues) {
            return;
        }
        const text = selectedValues.join('\n');
        if (editor.isClosed()) {
            editor.newFile(text);
        }else {
            //選択した項目をクリップボードにコピー
            app.setClipboard('\n' + text);
            //はじめに編集中だったファイルを開く
            editor.openFile(folder + '/' + editingfile);
        }
    });
}

アクションを起動した時の動き

アクションを起動するとリストが表示され、そのうち一つを選択すると選択した項目のがクリップボードにコピーされ、元のファイルに戻ってくるので、好きな場所に貼り付けることができます。
リストは、複数選択を可能にもできるので、その場合は
ui.list('Repeat', listData, false, selectedValues
のfalseの部分をtrueに書き換えてください。

まずは、リスト表示したいファイルを作成して、そのファイル名をコード内の「ここに一覧を取得したいファイル名を記述」の部分に書くことでアクションが使えるようになします。
改行を目じるしに、1行1項目でリストに表示するので、リスト表示したいファイルは、そのことを念頭に置いた上で作成していただければと思います。


これまで4回にわたり1Writerの自作アクションについて書いてきました。これにて、「やったことの記録がすこぶる取りやすいリストアプリ」のように、テキストを扱えるようになり、日々、デイリーリストを作成し、1WriterとObsidianで同一のファイルを扱いながら、やったことの記録をとりつつ過ごしています。
まずまず気に入っているので、しばらくはこのまま使い続けようかな、と思います。

では、お読みいただきありがとうございました。

別ファイルに記述されたデイリーテンプレートを呼び出す〜1Writerカスタマイズ③〜

テキストを1行ごとに削除したり移動したりできるようにすることで、「1行ごとのリスト」として扱えるようにしたのが前回までの話。

1Writer – Markdown Text Editor
カテゴリ: 仕事効率化, ユーティリティ

これでかなり便利になり、1行単位での操作ができるようになったので、箇条書きやチェックリストがすごく扱いやすくなりました。
こうなると本格的に「テキストエディタでタスク管理」がしたくなってきます。
しかもぼくは普段から「たすくま」を利用しているので、テキストエディタである1Writerでも、たすくまのように「すべての行動を記録してはいけないものか」、と考えました。

Taskuma —TaskChute for iPhone
カテゴリ: 仕事効率化, ライフスタイル

となると不可欠になってくるのが、リピートタスクを呼び出すこと。
毎日やっていることに関しては、リピートタスクとして登録しておき、日々それを呼び出してタスクリストを作ることで、たすくまのような「やったことの記録がすこぶる取りやすい」テキストエディタが実現します。

1Writerには、「指定したファイルを開く」アクションがあり、それを使うことでテンプレートを呼び出すアクションを作ることができます。
アクションを起動すると、

  • あらかじめ作成したテンプレートファイルを開く
  • 内容をコピーする
  • 元のファイルに戻ってくる

ところまでやってくれるので、あとは任意の場所にペーストするだけ。
準備は、テンプレート用のファイルを作成しておくことと、以下のコードの「ここにテンプレートファイル名を記述」の場所を自分で書き換えること。

テンプレートファイルを開き、コピーし、戻るアクション

d=new Date();
today=d.getFullYear()+zero(d.getMonth()+1)+zero(d.getDate());
yesterday = d.getFullYear()+zero(d.getMonth()+1)+zero(d.getDate()-1);
tomorrow = d.getFullYear()+zero(d.getMonth()+1)+zero(d.getDate()+1);
oneyearsago = (d.getFullYear()-1)+zero(d.getMonth()+1)+zero(d.getDate());
twoyearsago = (d.getFullYear()-2)+zero(d.getMonth()+1)+zero(d.getDate());
threeyearsago = (d.getFullYear()-3)+zero(d.getMonth()+1)+zero(d.getDate());
var dayOfWeek = d.getDay(); // 曜日(数値)
var weekday = [ "(Sun)", "(Mon)", "(Tue)", "(Wed)", "(Thu)", "(Fri)", "(Sat)" ][dayOfWeek]; // 曜日(日本語表記)

var folder = editor.getFolderPath();
var editingfile = editor.getFileName();

var openfilename = "ここにテンプレートファイル名を記述.md";

editor.openFile('Dropbox/Days/'+openfilename,'edit',call); //ファイル名の前には、フォルダを指定。ここでは、「Dropbox」フォルダ内の、「Days」フォルダを指定している。

function call(){
    var text = editor.getText();
    var text = text.replace(/{{today}}/g,today).replace(/{{tomorrow}}/g,tomorrow).replace(/{{yesterday}}/g,yesterday).replace(/{{oneyearsago}}/g,oneyearsago).replace(/{{twoyearsago}}/g,twoyearsago).replace(/{{threeyearsago}}/g,threeyearsago).replace(/{{weekday}}/g,weekday);
    app.setClipboard(text);
    editor.openFile(folder + '/' + editingfile);
}

function zero(s){return ("0"+s).substr(-2)}

コード内に、{{today}}や{{yesterday}}という記述があることにお気づきでしょうか。
これは、テンプレートのテキスト内の{{today}}と書かれている部分を、今日の日付に変換するための記述です。

このように書かれている場合、アクションを起動してテンプレートの内容を取得し、ペーストすると

こうなります(スクショは4月15日に撮影)。

{{oneyearsago}}や{{twoyearsago}}は、1年前、2年前の同じ月日。Obsidianにて連用手帳を実践していて、その際1年前や2年前のページを見返したいので、テンプレートに組み込んでいます。

テンプレートは1つのmdファイルなので、編集が簡単。
ただ、たすくまのような複雑なリピート設定はできないので、そこは今後工夫する必要がありそうです。


これで、日々のリピートは簡単に呼び出し可能になり、かなり詳細な記録を取ることができるようになりました。
こうなってくると、1日の計画を立てるときには書いていなかったタスクも、リピートに登録されているのであれば、リピート一覧から選択し、挿入できるようにしたくなってきます。
1Writerには、配列のデータから「リスト」を作成するアクションもありまして。次はそのあたりについて書いていきます。

カット・ペーストを可能にして、ダイナミックな移動を可能に〜1Writerカスタマイズ②〜

Obsidianが日々の相棒となってくれており、iPhoneでは「1Writer」というアプリを使ってObsidianで扱っているファイルと同じファイルを編集できるようにしています。

1Writer – Markdown Text Editor
カテゴリ: 仕事効率化, ユーティリティ

そして、リストアプリのようにテキストを扱えるようにするにはなにが必要かを考え、

  • 行ごとの削除
  • 行ごとの移動

の2つが欠かせないということで、

にて、削除と上下の移動は可能にすることができました。が、もっとダイナミックに移動させたいという願望が出てきました。


リストアプリでは、長押しや「編集」ボタンを押すことで、項目のドラッグ&ドロップが可能になるものが多いと思います。で、これが結構大事でして。
タスクを、実行しようと思っている順に並べているのですが、実際はそれ通りにいくことはあんまりありません。時にはリストの項目を大きく移動させたい時が出てきます。そんな時に重宝するのがドラッグ&ドロップの機能なわけです。
でもこれをテキストエディタに求めるのは、つまり1行ごとにドラッグ&ドロップによる移動ができるようにするのは、なかなかに難しい。
でもやっぱり、大きく移動させる機能は欲しい。

ということで、「カット」と「ペースト」を気軽にできるようにすることで、ドラッグ&ドロップのような動きを可能にしよう、と考えました。

  • カーソル(選択)行をカット
  • クリップボードの内容をペースト

という2つの機能があれば、リストの項目を大きく動かしたい時は、動かしたい項目をカットして動かしてきたかった場所でペーストすることができるので、ドラッグ&ドロップ機能の代わりができるだろう、と。
実際に動きを見てみましょう。

移動させたい行にカーソルを持っていく。あるいは、複数行に渡る場合は範囲選択をしておき、カット。するとその行がカットされる。移動したい先にカーソルを持っていって、ペーストボタンを押せばそこに移動完了です。
この機能で、さらにテキストエディタの内容を1行ごとに操作することが、以前よりやりやすくなりました。

カーソル(選択)行をカット

var text = editor.getText();
var linetexts = text.split('\n');
const range = editor.getSelectedRange();
var s = range[0];
var e = range[1];
var selects;
var selecte;
var linecount = 0;
var selectrange;
for (let i = 0; i < linetexts.length; i++){
    if ( s <
        linecount + linetexts[i].length +1){
        selects = i;
        selectrange = linecount - 1;
        break;
    }else{
        linecount += linetexts[i].length + 1;
    }
}
linecount = 0;
for (let i = 0; i < linetexts.length; i++){
if ( e <
    linecount + linetexts[i].length +1){
        selecte = i;
        break;
    }else{
        linecount += linetexts[i].length + 1;
    }
}

var before = -1;
for(let i=0; i < selects;i++){
    before = before + linetexts[i].length + 1;
}
var after = before;
if(before < 0){
    before = 0;
}
for(let i=selects; i < selecte+1;i++){
    after = after + linetexts[i].length + 1;
}
editor.replaceTextInRange(before, after, "")
var cutlines = [];
for(let i = 0; i < selecte-selects+1; i++){
    cutlines.push(linetexts[selects + i])
}
var cuttext = cutlines.join('\n');
app.setClipboard('\n' + cuttext);

クリップボードの内容をペースト

“`
var text = editor.getText();
var linetexts = text.split('\n');
const range = editor.getSelectedRange();
var s = range[0];
var e = range[1];

var cuttext = app.getClipboard();

editor.replaceTextInRange(s,e,cuttext);
“`

テキストエディタ上のテキストを1行ごとに扱うことができるようになることが、iPhone上ではこんなに快適になるものなんだな、と驚いています。
ついでに、カーソル行をコピーするアクションも作りました。

カーソル(選択)行をコピー

var text = editor.getText();
var linetexts = text.split('\n');
const range = editor.getSelectedRange();
var s = range[0];
var e = range[1];
var selects;
var selecte;
var linecount = 0;
var selectrange;
for (let i = 0; i < linetexts.length; i++){
if ( s <
linecount + linetexts[i].length +1){
selects = i;
selectrange = linecount - 1;
break;
}else{
linecount += linetexts[i].length + 1;
}
}
linecount = 0;
for (let i = 0; i < linetexts.length; i++){
if ( e <
linecount + linetexts[i].length +1){
selecte = i;
break;
}else{
linecount += linetexts[i].length + 1;
}
}
var cutlines = [];
for(let i = 0; i < selecte-selects+1; i++){
cutlines.push(linetexts[selects + i])
}
var cuttext = cutlines.join('\n');
app.setClipboard('\n' + cuttext);

  • カーソル(選択)行を削除
  • カーソル(選択)行を上へ移動
  • カーソル(選択)行を下へ移動
  • カーソル(選択)行をカット
  • カーソル(選択)行をコピー
  • クリップボードの内容をペースト

以上のアクションをカスタムキーボードに設定し、毎日使っています。

とても快適になったわけですが、1Writerで、たすくまのように「全ての行動を記録する」となると、行ごとの操作に加え、リピートタスクを設定し、それを簡単に呼び出せる仕組みが必要になってきます。全ての行動を記録する際、毎日やっていることに関しては、。毎日入力するよりもテンプレートで引っ張って来る方が明らかに手間が省けます。ましてや、たすくまのタスク数は大体40程度。それらを毎日入力するのは現実的ではありません。

そこで、1Writerにも、テンプレートを引っ張ってきてエディタ部分に入力し、たくさんのタスク名をいちいち入力しなくて住むようになりました。が、これはまた別の機会に。

テキストを「1行ごとのリスト」ととらえ、削除と移動を可能に〜1Writerカスタマイズ①〜

タスク管理アプリの多くは、長年使っている「たすくま」もそうですが「リスト」の形式をとっています。

1タスク1リスト(1タスク1行)の表示で、タスクがダァーッと並んでいる形式。
確かにこの形式は、タスク管理をする上で扱いやすいなぁと感じます。
リスト形式であれば、

  • 行の削除ができる
  • 行の順番の入れ替えができる

という機能を備えており、それがタスクを扱いやすくしてくれている要因ではないか、ということで、「やったことの記録がすこぶる取りやすいリストアプリ」のように、テキストを扱えるようにしたいな、という思いがわいたわけでした。
「アウトライナー」をタスク管理に利用している方も多くいられると思うのですが、それは、アウトライナーは行の削除と順番の入れ替えが容易であるというのも大いに関係していると感じます。

ぼくは、タスク管理に今はObsidianを使っているのですが、iPhoneでは、「1Writer」というアプリを使っています。

1Writer – Markdown Text Editor
カテゴリ: 仕事効率化, ユーティリティ

1Writerはjavascriptを扱えますので、テキストを加工することができます。そこで、1Writerのjavascript機能を使って、

  • 行の削除ができる
  • 行の順番の入れ替えができる

という機能を実装しようと考えました。
そうして作成したのが、以下の3つのアクション。

  • カーソル(選択)行を削除
  • カーソル(選択)行を上へ移動
  • カーソル(選択)行を下へ移動

カーソル(選択)行を削除

var text = editor.getText();
var linetexts = text.split('\n');
const range = editor.getSelectedRange();
var s = range[0];
var e = range[1];
var selects;
var selecte;
var linecount = 0;
var selectrange;
for (let i = 0; i < linetexts.length; i++){
    if ( s <
        linecount + linetexts[i].length +1){
        selects = i;
        selectrange = linecount - 1;
        break;
    }else{
        linecount += linetexts[i].length + 1;
    }
}
linecount = 0;
for (let i = 0; i < linetexts.length; i++){
    if ( e <
        linecount + linetexts[i].length +1){
        selecte = i;
        break;
    }else{
        linecount += linetexts[i].length + 1;
    }
}

var before = -1;
for(let i=0; i < selects;i++){
    before = before + linetexts[i].length + 1;
}
var after = before;
if(before < 0){
    before = 0;
}
for(let i=selects; i < selecte+1;i++){
    after = after + linetexts[i].length + 1;
}
editor.replaceTextInRange(before, after, "")

カーソル(選択)行を上へ移動

var text = editor.getText();
var linetexts = text.split('\n');
const range = editor.getSelectedRange();
var s = range[0];
var e = range[1];
var selects;
var selecte;
var linecount = 0;
var selectrange;
for (let i = 0; i < linetexts.length; i++){
    if ( s <
        linecount + linetexts[i].length +1){
        selects = i;
        selectrange = linecount - 1;
    break;
    }else{
        linecount += linetexts[i].length + 1;
    }
}
linecount = 0;
for (let i = 0; i < linetexts.length; i++){
    if ( e <
        linecount + linetexts[i].length +1){
        selecte = i;
        break;
    }else{
        linecount += linetexts[i].length + 1;
    }
}

var before = 0;
for(let i=0; i < selects;i++){
    before = before + linetexts[i].length + 1;
}
var after = before;
if(before < 0){
    before = 0;
}
for(let i=selects; i < selecte+1;i++){
    after = after + linetexts[i].length + 1;
}
editor.replaceTextInRange(before, after, "")
var cutlines = [];
for(let i = 0; i < selecte-selects+1; i++){
    cutlines.push(linetexts[selects + i])
}
var cuttext = cutlines.join('\n');

if ( selects == 0 ){
    editor.replaceTextInRange(0, 0, cuttext + '\n');
    editor.setSelectedRange(cuttext.length,cuttext.length);
}else if( selects == 1 ){
    editor.replaceTextInRange(0, 0, cuttext + '\n');
    editor.setSelectedRange(s - linetexts[0].length-1,e-linetexts[0].length-1);
}else{
    var before = 0;
    for(let i=0; i < selects-1;i++){
        before = before + linetexts[i].length + 1;
    }
    editor.replaceTextInRange(before-1, before-1, '\n'+cuttext)
    editor.setSelectedRange(s - linetexts[selects-1].length-1,e-linetexts[selects-1].length-1);
}

カーソル(選択)行を下へ移動

var text = editor.getText();
var linetexts = text.split('\n');
const range = editor.getSelectedRange();
var s = range[0];
var e = range[1];
var selects;
var selecte;
var linecount = 0;
var selectrange;
for (let i = 0; i < linetexts.length; i++){
    if ( s <
        linecount + linetexts[i].length +1){
        selects = i;
        selectrange = linecount - 1;
        break;
    }else{
        linecount += linetexts[i].length + 1;
    }
}
linecount = 0;
for (let i = 0; i < linetexts.length; i++){
    if ( e <
        linecount + linetexts[i].length +1){
        selecte = i;
        break;
    }else{
        linecount += linetexts[i].length + 1;
    }
}

var before = 0;
for(let i=0; i < selects;i++){
    before = before + linetexts[i].length + 1;
}

if ( selecte == linetexts.length-1 ){

}else{

    var after = before;
    if(before < 0){
        before = 0;
    }
    for(let i=selects; i < selecte+1;i++){
        after = after + linetexts[i].length + 1;
    }
    editor.replaceTextInRange(before, after, "")
    var cutlines = [];
    for(let i = 0; i < selecte-selects+1; i++){
        cutlines.push(linetexts[selects + i])
    }
    var cuttext = cutlines.join('\n');
    var before = 0;
    for(let i=0; i < selecte+1;i++){
        before = before + linetexts[i].length + 1;
    }
    editor.replaceTextInRange(before-1+linetexts[selecte+1].length-cuttext.length, before-1+linetexts[selecte+1].length-cuttext.length, '\n'+cuttext);
    editor.setSelectedRange(s + linetexts[selecte+1].length+1,e+linetexts[selecte+1].length+1);
}

おそらくあんまりキレイなコードではないと思うのですが、、、便利なのでよかったら使ってみてください。

で、これらによって、テキストを行ごとに削除したり移動したりが簡単になったわけです。でも、だいぶと便利になったのに、さらに欲が出てきまして。
もっとダイナミックに移動させたいようになってきました。

つづく

「やったことの記録がすこぶる取りやすいリストアプリ」のように、テキストを扱えるように

かれこれ10年近く、タスクシュートを実践しています。

  • 「これからやる仕事のリスト」と「ここまでやった仕事のリスト」を一元管理する
  • 「1分以上かかること」はすべて管理する
  • すべての仕事の「見積もり時間」を出しておく
  • 「本日1日分の仕事」がすべて終わったら何時になるのかの予測を自動算出することで、常に仕事の終わる時間(または就寝時間)をリアルタイムに把握する

『なぜ、仕事が予定どおりに終わらないのか?~「時間ない病」の特効薬!タスクシュート時間術』(佐々木 正悟(著)大橋 悦夫(監修))

最近はそこまでこだわることなく、日々のルーチンはたすくま(タスクシュートをiPhoneで実践できるアプリ)に全て登録しておき、朝の仕事場に出発するまでの時間と、帰ってきてから寝るまでの時間をたすくまに帆走してもらいながら過ごしています。
やったことを記録しつつ、起きてから寝るまで過ごす。見積もり時間や終了予定時刻もあいまいな感じで算出していますし、たすくま上に並んでいるタスクをまるっと消してしまうこともあったりします。
やったことは記録してはいますが、記録を見返すことはほとんどなくなりました。
ほぼ、日々のルーチンを確認し、やったことを記録するためだけにたすくまを使っている感じです。

そこで感じるようになったのは、「これは『たすくま』を使う必要はあるのか?」という疑問。
タスクシュートを実践するために作られたものなので、確かにタスクシュートは実践しやすい。たすくまは、タスクシュートを実践する上では間違いなく便利なんです。
ただ、仕事中はObsidianに書き出したタスクリストをもとに何をするか定めていっているので、たすくまを使っていませんし、Obsidianにて作成したデータはiPhoneでも確認・編集できるところが魅力的でして。
じゃあ、たすくまをずっと使い続けている理由、どこが便利なのか?を考えてみると、

  • やったことの記録がすこぶる取りやすいから
  • リストアプリだから

という結論に行きつきました。

  • やったことの記録がすこぶる取りやすいから
    • やったことの記録を取るためにはやったことを入力しなければいけないが、あらかじめ「やること」が記入されているので、やるときにいちいち入力しなくて済む
      • 記入されている「やること」の中から、今から取り掛かるものを選択するだけでいい
    • 完了のチェックができ、開始・終了を自動的に、もしくは素早く入力できる
  • リストアプリだから
    • 行の削除ができる
    • 行の順番の入れ替えができる

以上が使い続ける理由なわけで、これらが満たされていれば他のアプリを利用しても、それこそObsidianや1Writer上でも現状たすくまでやっているようなことが実現できるのではないか、と考えました。

仕事中はたすくまではなく、Obsidianのデイリーページ上にタスクを書き出し、順番を入れ替えたりしながら実行していってます。
それぞれのタスクに見積もりを設定してはいませんし、なので終了予定時刻も算出されません。
一つ、守っていることは、やったことは全て書き残していくことと、終了時刻を入れること。
それでも、仕事に支障をきたすことはなくなってきたので、見積もりや終了予定時刻にはこだわらず、とにかくやったことと時間を記録していくことに集中してみよう、と。

そこでまず着手したのが、1テキストをリストのように扱えるように、Writerをカスタマイズすること。
行の削除、行の移動、行のコピー・ペーストの実装です。
1Writerはjavascriptが使えるので、テキストを色々といじるアクションを作成することができ、なおかつそのアクションをカスタムキーボードに設定することができます。
なのでせっせとjavascriptを組み、上記機能を実装することができました。

残りの課題は、どうやってやったことの記録をすこぶる取りやすくするか。
テンプレートを使う前提になっていきそうですが、極力手間なく記録を取っていけるような環境を作ることができればな、と考えています。

長い付き合いのたすくまは一度休憩して、他のツールで模索してみようかな、という試みをはじめてみたいと思います。

では、お読みいただきありがとうございました。

ボトルネックは「別のページを開く」

ぼくは、手帳が好きだ。
毎年手帳の季節になると、店頭に並ぶ手帳を見てまわる。今は手帳として世に売られているものに関しては使っていないので、買うつもりはあまりないのに、どんな手帳があるのかな、と見てまわる。
以前は色々と手帳を試したりしていた。でも使ううちに、自分独自の手帳が欲しくなり、分厚いノートを購入して手帳として使うことが多くなった。で、今はほぼデジタルで管理している。Obsidianにて連用手帳を実践して。


手帳がすごい好きな割に、ちゃんと使えてない感がいっつもあった。
ノートを使うにしろ手帳を買うにしろ、基本はデイリーのものを利用していた。1日1ページ手帳。
1日1ページのようなデイリーの手帳であれ、必ずマンスリーページは存在する。ノートを手帳がわりに使う時も、必ずマンスリーページを作成していた。
でも、それをろくに使えない。
デイリーページはそれなりに書くことがあり、日々使う。けど、マンスリーがうまく使えない。

Obsidianに手帳の役割を持たせるようになり、なぜマンスリーページをうまく使えていなかったのかに、ようやく気づいた。

自由に好きなページを画面に並べることができるのは、Obsidianの大きな利点で、画面構成を自分の望むようなものにできる。
そこでぼくは、基本的に中央には今日の日付のデイリーページを表示し、サイドにマンスリーページを配置することにした。
それからというもの、タスクもスケジュールもいい感じにこなすことができている。デイリーページに加え、マンスリーページもうまく使うことができている。

マンスリーをうまく使えてなかった時と何が一番違うかというと、「常に表示されているか否か」という点。
紙の手帳では、基本的にデイリーページを使っているのであれば、マンスリーページはわざわざ自分から開きにいかなければならない。
別に難しいことでもなんでもない、マンスリーページを開くという動作。それがぼくにとっては大きなボトルネックとなっていた模様。
自分から見にいかないといけない、となると、見にいかない。なぜか見にいかない。どうしても見にいかない。
常に表示されていて、勝手に目に入るような、見にいく動作すら必要としない状態であると、マンスリーページを活用することができる。
何か書き込むのも気軽にできるし、今後の予定も視線を移すだけでさっと確認できる。見にいかなくても確認できる。わざわざ開かなくても書き込める。
このことが、自分にとってはかなり大きいことであるというのが、ようやくわかった。

デイリーとマンスリーを使っていると、転記が必要になる。
基本的にはデイリーを開いているので、何かあればデイリーページに書き込む。それがスケジュールであれば、マンスリーページの該当の日付の欄に転記する。
デイリーには書かず、直接マンスリーに書けばいい、と思うけれども、それもなかなかできなかった。
マンスリーを開いて、書き込むという動作が。
なので、自分でも不思議に思うくらい、マンスリーページをちゃんと使えた試しがない。
マンスリーページがデイリーページの横に表示されていると、スケジュールや日付の決まっているタスクは、直接マンスリーに書くことができる。
今までなかなかできていなかった、マンスリーに書き込むという動作が、いとも簡単にできる。
直接書き込めるので、転記も必要ない。

総じて、デイリーページとマンスリーページが常に開かれている、目に入る、書き込める状態は、ぼくにとって驚くほど快適で、自由に画面を並べることができるObsidianは、ぼくにとても合っているツールだと感じる。

では、お読みいただきありがとうございました。

仕事を進める上でなくてはならない道具7選

ぼくは、高校で教員をしています。
教師の仕事は、ただ教科を教えればいいってものではなく、他にも色々とやることが結構わんさかあります。
それらをこなしていこうと思うと、道具の力を借りなくては、にっちもさっちもいかなくなります。ぼくの場合。
仕事に就くちょっと前に「ライフハック」という言葉を知り、そこで色々と自分なりに調べては試し、タスク管理をし始めることができたことは、今思えば、自分にとってはかなりの財産になってくれているな、と感じます。

仕事に就いてはや10年。これまで仕事をなんとかこなしてこれたかな、と思っているのですが、その時々でタスク管理を試行錯誤し、それなりに自分にあった手法を見出してきました。
おそらくこれからもやり方や使う道具は変わっていくとは思いますが、今現在使っている、仕事を進める上でなくてはならない道具を紹介していこうと思います。

  • Mac
    • Obsidian
  • iPhone
    • 1writer
  • iPad
    • iPad+Apple Pencil
    • Noteshelf
    • Keynote
  • Hand Writing
    • JETSTREAM
    • pocket size memocho

Obsidian

まずは、Obsidianにて連用手帳をしているので、Obsidianは欠かせません。今はかなりお世話になっています。
仕事中は基本的にはデイリーページを開きっぱなしにし、そこに書き出されているタスクを一つ一つ消化しながら、何かあればメモをする、という日々を過ごしています。

1Writer

ObsidianはiPhoneでは使えないので、代わりに1Writerを使っています。
iPhoneではショートカットと 1Writerを用いて、Obsidianのデイリーページへ一発アクセスできるようにしてあり、デイリーページに何かしら書き込みたければ1Writerを使う、という使い方です。

iPad+Apple Pencil

iPad+Apple Pencilは、仕事では欠かせない存在となりました。

板書計画をたて、それをそのまま授業に使うことができる。
配置も自由に決めることができ、書き直しが容易であること。書いてから配置を変えることができるのは、考える際にとてもありがたい。

NoteShelf

今は書き心地と機能を考えて、NoteShelfを使っています。

書き心地がなかなかよく、機能も充実している。また、書いたものをコピーし、他のアプリに受け渡すことが簡単で、そういった細かい部分も気に入って使っています。

Keynote

iPadアプリでもう一つ欠かせないのが、Keynote。
授業をする際に、よく電子黒板を利用してあらかじめ用意してあった板書内容を生徒に提示するのですが、その際はKeynoteを使っています。
また、数学の問題の解説動画を作ったりするときには、Keynoteの手書きによる注釈と画面録画を利用しています。
なので、なかなかにお世話になっているアプリです。

JETSTREAM

文房具が好きで、特に紙質とペンの書き心地にはこだわるほうだと自分では思っています。
なので、ボールペンであればJETSTREAMの書き心地は欠かせない。
ストレスなく、ぬるぬると紙の上を線が滑っていってくれるあの感覚は、とても心地いいものです。

pocket size memocho

最後は、ポケットサイズのメモ帳。
基本的にはiPhoneを取り出してメモをするのですが、それがはばかられる時やiPhoneを持ち歩いていない時はメモ帳にメモし、後でObsidianに転記したりそのまま使い終われば破棄したり。
メモ帳とJETSTREAMのタッグは、今回の道具の中では一番の古参で、長いことお世話になっています。


思い返せば、メモ帳を常に持ち歩く、というのも、仕事に就くちょっと前からやり始めたことでした。
ライフハックというものを知り、学び、試してみたこと。
メモ帳を常に持ち歩き、メモをするという行為を自分のものにできたこと。
そして、同じ時期にiPhoneを使い始めたこと。
これらは間違いなく、ぼくに大きな転換をもたらしてくれました。
どれもが、10年経ってもいまだに活躍してくれているので、これからも大切にしていきたいと思います。

では、お読みいただきありがとうございました。