Problem

Mac起動時に自動的にBluetoothテザリング接続するようにしてみた

Bluetoothテザリングに接続するのがめどい

私はほとんどの作業を出先かつMacBook Air上で行っており、インターネット環境をiPhoneからのテザリングで賄っています。

そのため、AppleScriptで簡単に接続できるようにしました。

しかし、しょせん手動なので、それすらめどくなってきました。そこで、ログイン時とスリープ解除時に自動的に接続できるようにしてみました。

以下Yosemite前提。

一発でBluetoothテザリングに接続するAppleScriptを用意する

改めて全体を掲載。以下記事から大半を流用しています。

(2015-01-02修正)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
on split(sourceText, separator)
if sourceText = "" then return {}
set oldDelimiters to AppleScript's text item delimiters
set AppleScript's text item delimiters to {separator}
set theList to text items of sourceText
set AppleScript's text item delimiters to oldDelimiters
return theList
end split
on number_from(str)
try
str as number
on error
str
end try
end number_from
--click_menu_extra("AppleScript/Script Editor Scripts/About these scripts...")
--click_menu_extra({"AppleScript", "Script Editor Scripts", "About these scripts..."})
on click_menu_extra(menu_path)
if menu_path is "" then
error "menu_path が入力されていません。"
end if
set mp to split(menu_path, "/")
tell application "System Events"
tell process "SystemUIServer"
set frontmost to true
click (menu bar 1's first menu bar item whose attribute "AXDescription"'s value is (mp's item 1))
repeat with i from 2 to mp's length
click (result's menu 1's menu item (my number_from(mp's item i)))
end repeat
delay 0.1 --連続してメニューを操作する時、ひと呼吸必要
end tell
end tell
end click_menu_extra
tell application "System Events" -- Wi-Fiがオフであるか?
tell process "SystemUIServer"
exists (menu bar 1's first menu bar item whose attribute "AXDescription"'s value is "Wi-Fi、Wi-Fi が有効になっていません。")
end tell
end tell
if result is true then -- Wi-Fiがオフの場合のみ
click_menu_extra("bluetooth/mmiPhone/ネットワークへ接続")
end if

本当は以下も含めるべきですが、めどいのでとりあえず省略しました。どうせiPhoneのBluetooth&インターネット共有は常時オンだし。

  • Wi-Fi/PPPoE接続の有無確認
    • →Wi-Fiオンオフ確認を追加(2015-01-02)
  • iPhoneのインターネット共有をオンにする

ログイン時に自動実行

スクリプトエディタを使ってアプリケーション形式(.app)で書き出し(osacompileでもいいけど)、ログイン項目に登録します。

なお、メニューバーにBluetoothアイコンが表示される前に実行されて失敗するパターンがある(のか?)ので、先頭にdelay 20とか入れておくといいかもしれません。

「システム環境設定>ユーザとグループ>(ユーザを選択)>ログイン項目」で「+」をクリックして上記アプリケーションを選択。

さらに、補助装置へのアクセスを許可する必要があります。「システム環境設定>セキュリティとプライバシー>プライバシー」でカギをクリックしてログインパスワードを入力、「+」をクリックして上記アプリケーションを選択。チェック。

(2014-12-31訂正)

作成したアプリケーションを編集すると、補助装置へのアクセス許可がリセットされるようです。編集した場合、再度上記の方法でチェックする必要があります。

スリープ解除時にも自動実行

SleepWatcherを利用します。

私はHomebrewでインストールしました。

1
$ brew install sleepwatcher

基本的な設定方法は上記記事を参照していただくとして。

plistの内容はこうしました。スリープ前の処理が不要なので削除してあります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>de.bernhard-baehr.sleepwatcher</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/sbin/sleepwatcher</string>
<string>-V</string>
<string>-w /Users/catfist/scripts/AfterWake</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>

AfterWakeスクリプトは、さっきのAppleScriptをまんま実行します。

1
2
3
4
#!/bin/bash
osascript << _EOB_
(以下略)
_EOB_

さっきのAppleScriptを実行するだけですね。別にこんなんでもいいのですが、

1
2
#!/bin/bash
osascript ~/Library/Scripts/BluetoothConnect.scpt

うっかりスクリプトファイルを削除しても動くように、全部書いちゃいました。

ちなみに、こんなんはなんかうまくいきませんでした。

1
2
#!/usr/bin/osascript
(以下略)

これで、ログイン時&スリープ解除時に自動的にBluetoothテザリングに接続します。

小説のネタをどうやって管理するか悩んでいる

これな。

積年の問題を改めて考察する。

Evernoteでいいじゃん?

Evernoteのメリットは、とりあえず入れておけば検索できるということにあります。必要なものはEvernoteの中に必ず入っているという状態を作ることが肝要です。(そしてテキストデータであればそれは難しくない。転送量的な意味で)

ただし、Evernoteを利用する場合、二つの大きな問題があります。

ひとつは大量に引っかかりすぎるという問題です。ウェブクリップとかを検索するなら「Googleよりは狭い」ということでいいのですが、アイデアメモなどが大量になってくるとこの問題が顕在化してきます。

もうひとつは動作重すぎ問題。これはEvernoteを使う限りは決して逃れられない問題です。

アイデアの「見える化」と「見えない化」

タスク管理の話題でたまに出てくるフレーズとして、「見える化」と「見えない化」があります。

「やるべきこと」を「見える化」するのは当然ですが、実行段階でのストレスを減らすためには、それを適切に「見えない化」することが必要だという考えです。

下記の記事で、Evernoteを利用した「見えない化」の例について解説されています。

しかし、創作におけるアイデアメモは、これほど明確にステータス管理することが難しいですし、なにより普段は見えなくていいものが大半です

Scrivenerの手前まで

私の場合、本格的な構想〜執筆の段階ではScrivenerを利用しているので、最終的には、ある作品に関する情報の全てをScrivenerに集約することになります。

問題は、それ以前の段階にあります。すなわち、ひとつの作品としての形を取る前の、流動的なアイデアの扱いです。

小説のアイデアの分類

私の場合、作品の構想過程においては、本来別々の作品として構想されていたアイデアをミックスしてひとつの作品としてまとめていくことが多いです。

つまり、作品を構成する個々の要素は、それ自体が複数の要素の集合によって成る構造だといえます。

ここでEvernoteを見てみると、個々のノートは概ね以下のように分類できます。

パターン 主な要素 概要
原形 主要キャラクター、基本設定、物語の始まり/終わり、種書き 独立した作品として構想されているもの
断片 セリフ、ト書き、種書き よさげなシーンの断片
着想 設定、テーマ、世界観、コンセプト 作品の構成要素、思いつき
資料 ウェブクリップ、スキャン画像、写真、チャットやSNSのログ アイデアの元になるかもしれないもの
考察 流行、メソッド、既存作品、過去作品の反省 直接作品の構想に結びつかないもの

このうち、量的に最も多いのは「原形」です。私は作品を構造的に捉える意識が強いらしく、その他のアイデアも少し拡げていくと、わりとすぐ独立した作品っぽいものになっていきます。

そして、本格的な構想の「出発点」は、「原形」に他の要素が結び付いた場合に多く発生します。特に、よそから持ってきたキャラクターを入れることで飛躍することが多いです。

小説のアイデアの特性

振り返ってみると、先ほど分類したEvernote内のアイデアは、さらに以下の三つにまとめることができそうです。

  • 作品の原形
  • 作品の材料
  • 作者の思考

運動としては、「作者の思考」を元に、(複数の)「作品の原形」に対して、「作品の材料」を掛け合わせていくことで、スタートアップが行われることが多いようです。

ここで、三つのアイデア要素の特性を考えると、以下のようになります。

アイデア要素 特性 特徴
作品の原形 スタック(積層) 個々の要素が相似性と拡がりを持つ
作品の材料 クラスタ(群体) 細かい要素の集合。相互に接近する
作者の思考 ネットワーク 相互関連性を持つ構造

「作品の原形」は、「主要キャラクター、基本設定、物語の始まり/終わり、種書き」などの複数の共通するフィールドを持ち、構想においてはしばしば重ね合わせられます。

「作品の材料」は、基本的には単一のフィールドを持つ要素の集合であり、緩い関連性を持ちます。

「作者の思考」は、相互に強い関連性を持ちうる構造であり、データ的には別々のドキュメントであるものが、実際にはごく近い内容を含むことがしばしばあります。

タスク的ステータス

さらに、実作業上のアクセスを考えれば、タスク管理的なステータスが個々のアイデアにあることに気付きます。

例えば、「編集中」と「アーカイブ」。「タスク」と「メモ」。「気になる」と「忘れていい」。一緒くたにすれば概ね「ホット」と「コールド」ですが、「編集中」が常に「タスク」や「気になる」とは限りません。

実際には、ある「覚書の完成」がTodo.txtに書かれることもありますし、のどに刺さった小骨のような(しかし特に進展はない)「アーカイブ」もあります。

ここに、アイデア管理における「見える化」「見えない化」における線引きの難しさがあります。

割りきりか、あえてのムダか

タスク管理的な考え方を援用すれば、割り切ってひとつのシステム/レイヤーで管理すべきではあります。

しかし、創作活動においては、別の角度から考えることが前進をもたらすことも少なからずあり、労力を減らすことが必ずしも善とは言えません。

しかし、制作ペースが遅すぎるのも気になるし……ううん……

完全に結論が出なくなった

とりあえず論点を吐き出しておこう。

最近、紙のノート使ってないなあ。久々に書こうかなあ。

Listacularで通知できる形式でTodo.txtに追記するAlfred Workflow

Listacularで通知するタスクを楽に追加したい


ver. 1.50 - 無料( 仕事効率化 )
Andrew McKinney

Listacularは、私が確認した限り、テキストファイルの記述ベースで通知を受け取ることのできる唯一のアプリです。

具体的には、各タスクに@due(2014-10-09 20:00)といった記述をすることで期限切れを管理し、@remind(2014-10-09 20:00)といった記述をすることで期限に通知を受け取ることができます。

そこで、簡単に通知を受け取ることができるよう、Alfred Workflowを作ってみました。doing.txtを少し参考にしました。

概要

Githubで公開しました。

スクリーンショット

使い方

利用可能なフォーマットは以下の通りです。(本日が2014-01-01の場合)

Alfredテキスト 出力
txt some task,+1,2100 - some task @remind(2014-01-02 21:00)
txt some task,,2100 - some task @remind(2014-01-01 21:00)
txt some task,+1 - some task @due(2014-01-02 23:59)
txt some task - some task
txt some task @due(2014-01-01 21:00) - some task @due(2014-01-01 21:00)
txt some notice @n some notice

-で始まる行は、Listacularではチェックリストになります。つまり、@nを加えた場合は、完了管理をしない注意書きになります。

「日付だけを入力するなら通知はいらない」「時刻を入力するなら通知が必要」と考えて、タグを割り振っています。

出力結果は、通知センターに表示されます。

課題

  • 時刻のh,hh入力への対応
  • 時刻の「〜後」入力への対応
  • 第2引数の「日付のみ」「時刻のみ」両対応
  • TaskPaperフォーマットへの対応?

静的サイトジェネレータの自動タグ補完的なシステムを作りたかった

Hexoでタグ入力支援が欲しい

Hexoで書いた記事もだいぶ増えてきて、どんなタグを作ったか自分でも把握しきれなくなってきました。

うっかりTypoした場合はもちろんのこと、HexoのタグはCase sensitiveなので、大文字小文字の違いで別タグ扱いになってしまいます。

しかも、一度誤ったタグ名でGenerateしてしまうと、タグ一覧に登録されたタグ自体を削除するためには、hexo cleanを行う必要があるため、そこそこ面倒です。

そこで、タグの入力補完というか、候補から選択できるようにしたいと思い、考えてみました。

とりあえずターミナルだけでやってみる

  • _postsフォルダからforループで対象ファイルを取得
    • フロントマター部分(---行まで)を切り出し
      • grep | sedで行数取得
        • 最初の1個だけ
        • 行番号を付ける
        • sedで先頭の行番号だけを残す
      • headで取得した行数以上を切り出し
      • ファイルに追記
  • ソート&重複行を削除してファイルに保存
1
2
3
4
5
6
for file in source/_posts/*.md #記事ファイルをリスト
do
fme=`grep -n -m 1 '^---' $file | sed -e 's/\(^[0-9]*\).*/\1-1/' | bc` #フロントマターの終了行番号を検出
cat $file | head -$fme | grep '^-' | sed -e 's/^- //g' >> tags.txt #フロントマター内のリスト項目(タグ)を一時ファイルに追記
done
sort tags.txt -uo tags.txt #一時ファイルの重複行を削除してファイルに保存

だいたいできたのですが、一部の重複行が残ってしまいました。

空白文字でも混じっているのか、はたまたTypoかと思いましたが、Sublime Textで「Permute Lines > Unique」すると削除できてしまいます。

色々あがいてみましたが、どうしても解決できず。ひとまず諦めてSublime Textで処理して、grep で既存タグを抽出してみます。

1
2
grep hoge tags.txt #既存タグを表示
grep hoge tags.txt | pbcopy #クリップボードにコピー

本来ならこのあたりをAlfred Workflowで自動化したいのですが、重複問題が解決できないので、とりあえず放置することにしました。というか、インクリメンタルサーチの仕方がわかんない。

AutoHotKeyだったらタグ一覧ファイルから簡単にインクリメンタルサーチできるのですが、TextExpanderとかのスニペットにしようとするとけっこう大変。

んあー。

暫定対応

Hexoプロジェクトフォルダにシェルスクリプトを保存。

chmod u+x taglist.shで実行権限を付与。./taglist.shでtags.txtを生成。

あとは適当にgrepするなりして参考にする。

その後

解決しました。