Macから決まった時間にLINEに通知を送る

1年ぶりくらいにやろうとしたらハマってしまったのでめも。ほぼ at コマンドのせい。

LINE Notify の設定

これについては LINE の中の人がとても分かりやすくかいて下さっているので簡単。以前つくったアクセスキーは再表示できないので忘れてたら新しく作る。

developers.linecorp.com

at コマンドの使い方

上記のリンク先にある curl コマンドを、 at コマンドで決まった時間に実行したい。まず、 at コマンドでジョブを登録しても Mac ではデフォルトではジョブが実行されない *1 ので、有効化する。以下のリンク先を参照。

blog.hello-world.jp.net

リンク先にあるように、有効化するコマンドは以下。

sudo launchctl unload -F /System/Library/LaunchDaemons/com.apple.atrun.plist
sudo launchctl load -F /System/Library/LaunchDaemons/com.apple.atrun.plist

既に過ぎた時間にジョブが登録されていた場合、上記のコマンドを実行した途端に一気にジョブが流れるようで、LINEに通知が鬼のように来た。

もう一つのハマりポイントは at コマンドの難しさ。定期的に行うジョブは cron に登録したり、何分後に実行とかの場合は sleep を使ったりすることも多く、 at はあまり使う機会がないためかいつまで経っても慣れない。とりあえず私の環境では以下のような感じなら動いた。

at -m -f notify_me.sh "0:00 022318"

notify_me.sh に LINE に通知するコマンドが書いてある。 -m オプションは結果をメールするためのもの。時刻の指定が難しく、間違うと「garbled time」とかって怒られる。ネット上の情報だと時刻の文字列はどこに書いても動くようだったが、 Mac だと一番最後に書かないと動かない? つまり、

at "0:00 022318" -m -f notify_me.sh 

ではダメだった。

*1:FreeBSDの仕様?

Windows で Hyper-V が有効だと VirtualBox が動かない

タイトル通りだけど、経緯は以下のような感じ。

症状:Windows 10 Pro 64 bitで Virtual box で Ubuntu 16.04 LTS の VM (64 bit) を作ろうとしたところ、作れなかった。

did2memo.net

ここに書いてあるような感じ。この方のブログはよく参考にさせていただいているので、今回もこの通りにやってみたけど、だめだった。

その後以下を見つけた。

picworld.jp

Docker for Windows を入れたときに、 Hyper-V を有効にしたのを忘れてた。ということは、Docker と VirtualBox は同時に使えないんだな。VirtualBox にはそのくらいはチェックして教えて欲しい。32 bit なら作れそうに見えるのもよろしくない(選択したところで結局は作れない)。

あと、以下に載っている CPU-Z とか、Virtual Checker とか覚えておくと便利そうだなと思った。

ja.stackoverflow.com

社会人1年目の今年買ったもの

という名のアフィ記事。

電子機器編

よく使ってる順?

GARMIN vivosport

前からGPSと心拍付き腕時計がほしかったけど、京都マラソンに当選したタイミングでこれが発売してくれたので即買いした。小さいので腕時計と両方つけて会社に行っている。GARMIN コネクトの Android App が使いにくい以外は特に不満はない。特に必要ないけど、スマホの通知を送るのがやろうとしてもできない。そもそも対応してないのかな? → できました。でも割りと頻繁に調子悪くなる。
もともとは GPS は付いていないものの、会社につけていっても違和感なさそうな NOKIA Steel HR を買おうと思ってたんだけど、Withings から Nokia になって HR (心拍付き) だけなかなか発売されなかったので、これになった。結果的にはこっちを買って良かった。

HUAWEI Mate9

三木谷割で購入。これまで型落ちスマホばかり使っていたので、初めてスマホを手にした2011年以来、6年ぶりにハイエンド級の端末になった。 Nexus 5 からの乗り換えだったので、Pure android が恋しい。EMUI は電池の持ちとかが良いっぽいけど自由度が少ない。せっかく良い端末を買ったのに細かいところでストレスを感じる日々。
2018/02/07追記: 最近 Android 8.0, EMUI 8.0 へのアップデートが来たけど、バックグラウンドタスクを邪魔するおせっかいがさらに進んでいる気がする。

なおカバーについてはこれが安かったのに高級感があるし良かった。

確認しないで買ってしまったけど、ちゃんと後ろ側の指紋センサーの部分も穴が空いてる。これで定期を家に忘れることが少なくなった。(先日携帯ごと忘れたけど)

HHKB Professional 2 無刻印 US配列

入社してすぐ買って会社で毎日使ってる。Apple Magic Keyboard 2を持っていこうと思ってたけどセキュリティ的に有線のほうが好ましいっぽかったので見栄で無刻印買ってみた (Magic Keyboard 2 は有線接続もできるけど)。3万円の価値があるのか今でも分からないが、たしかに他のキーボードよりは気持ちいいし、長持ちしてくれるならそんなに高い買い物でもないのかも。プログラマは道具にこだわる人が多いのかと思ったけど、うちの会社にはほとんどそういう人はいなかった。むしろそういう人は研究者のほうが多い感じ。

Nintendo Switch

発表されたときは特に興味なかったんだけど、発売されてゼルダの評判が良いので欲しくなってしまった。 10月11月はかなりの時間をハイラルで過ごした。最近DLC第二弾が配信されたけどあんまりやってない。

HUAWEI MateBook

買ったのは一応今年だけど社会人になる前の1月ごろ。夏に液晶が壊れてファーウェイに送ったらすぐに新品が送られてきた。それ以降は大丈夫そう。ペンで入力するデバイスが欲しくて、Windows なら iOSAndroid よりも便利かなとか会社でも Windows だしとか思って買ったけど、Windows なので結局使いにくかった。たまに Mac 使うと使いやすさに感動する。 基本的にハードよりもOSについての不満しかないけど、ハードに関して言えばキーボードカバーが日本だと JIS しか売ってないっぽいのが辛い。

Macbook Air バッテリー

2012年に買った Macbook Air、バッテリーが死んでいたので据え置きにしてたけど、モバイル用に使ってた Macbook (12インチの初代) を手放したのでバッテリーを換装して復帰してもらった。カバーのネジを外すのが難しくて一本なめてしまって苦労した(けっきょくヤスリで溝を掘った)。バッテリー交換にも最初失敗したみたいで、返品しようかと思ったけど、ケーブルの配線をちゃんとしたらようやくできた。バッテリー持ちが良くなったは良いものの、もう持ち歩くことはないかと思ってステッカーめちゃくちゃ貼ってるので、持ち出すのが少しはずかしい。 あと、これ買った当時はJISキーボード派だったのでMBAの配列もJISだけど設定はUSになってる。結果、印字と入力が一致せず気持ち悪いので、以下のシールを買ってみたけど貼らずに半年くらい放置してる。

ブラックアウトステッカー for Mac 15mm(MBA/MBP~2015 JIS用)

ブラックアウトステッカー for Mac 15mm(MBA/MBP~2015 JIS用)

Google Home mini

「ご存知 AmazonGoogle の喧嘩によりアフィリンクなし」

前の記事に書いたようにサイバーマンデーで買ったけども、正直あまり使ってない。毎朝天気を尋ねるのもすぐ飽きる。IFTTT をまだ設定してないのでやらねば。mini は音質が微妙というネットの記事を読んだけど、耳が肥えていないので気にならなかった。

家電編

思いついた順。電子機器は海外メーカーのばかり買ってるけど、家電については意外と日本企業のを買ってた。

Kyocera 電池式コーヒーミル

家の近所の会社が作ってる電動ミル。電池式のコーヒーミルは軽く探した感じこれしか売ってない。一回に一人分しか挽けないし、挽くのに5分くらいかかるけど、手で挽くよりは圧倒的に楽。電動ミルはコンセント式面倒なのでこれにしたけど、コンパクトだし、普通の電動ミルより静か。

SHARP ヘルシオ オーブンレンジ

今までクソ安いダイアル式の電子レンジを10年近く使ってきたけど、引っ越しを機に捨てた。無料って言いながら最後に1000円請求してきた廃品回収業者のことは忘れない(退去日近くて面倒なので払ってしまった)。 初めてのオーブンレンジ。ヘルシオ自慢の唐揚げとかもつくれるけど面倒なので一回しかやってない。パンとかピザとかもたまに焼くけどやはり面倒。 ちゃんとしたレンジを買うと掃除が楽だし、開いたときにドアに物置けるしすごいなと思った。

DAIKIN 空気清浄機

こういう場所とる系のものはなるべく部屋にマッチするデザインじゃないときついけど、これが一番マシなデザインだったので。一人暮らしだしもっと小さいのを買おうかと最初は思ったけど、ネットの記事で小さいのも大きいのもそんなに存在感変わらないというのを見て、普通サイズにした。とりあえずつけっぱなしにしているけど効果があるのかは良くわからない。なんか定量的な議論をしたい。

Panasonic セラミックファンヒーター

本当は人感センサーとかも要らないくらいだけど、そこそこシンプルでデザインも良く、コンパクトで使いやすい。一人暮らしの部屋ならこれで十分。リビングから脱衣場に持っていったりするけど軽いので楽ちん。

あと買ったのは卓上掃除機やらモニターアームやらモニター台やら。

ところで以下のような記事を読んだ。

gizmodo.com

Sphero R2-D2 (と BB-8)も買って実家で眠っているので、Swtich と合わせて2つも買っていた。

Sphero スター・ウォーズ R2-D2 APP-ENABLED DROID 【日本正規代理店品】 R201JPN

Sphero スター・ウォーズ R2-D2 APP-ENABLED DROID 【日本正規代理店品】 R201JPN

あとこんな記事も読んだ。

www.engadget.com

音彦って初めて聞いた。日本ではラーメンを音を立ててすすることがラーメン屋への敬意を表すらしい。

Google Home mini を買った

サイバーマンデーGoogle Home が半額になっていたので、 mini の方を買った。サイバーマンデーといいつつビックカメラでは実店舗でも半額になっていた。スマホGoogle Assistant と機能的にはあまり変わらないけど、常に待ち受けてくれるので料理中とか皿洗い中とかには便利。朝起きて「今日はどんな日?」と聴くとと起きやすいかも(そうでもない)。IFTTT が使えるので試してみたい。どんな機能を使っているかそのうち書こうと思う。でもその前に以下の記事のことを思い出した。

この記事は「今さら IFTTT が便利だと分かった」というタイトルでドラフトに入っていて、タイムスタンプは 2/20/2017, 5:42:52 PM となっていた (JST)。なぜ公開してなかったのかよくわからないけど、9ヶ月遅れで公開する。今はもう使っていないのもあるし、情報が古い可能性もある。

使ってるレシピ

Twitter to Evernote

自分のツイートを Evernote に保存 ifttt.com

ファボったツイートを保存 ifttt.com

あと、特定のエリアに入ったときと出たときにツイートするようにしている。「出社なう」とか「退社なう」みたいな感じ。

Todoist to Evernote

完了したタスクを Evernote に記録。やったことを可視化できてやる気になりそう。

ifttt.com

ついでに Google Spreadsheet にも送ってる。

ifttt.com

Evernote to Todoist

特定のタグをつけたノートへのリンクを Todoist に送る。以下の二つを試してみたけど、どちらもマルチバイト文字が文字化けしてしまう。

ifttt.com

ifttt.com

解決するには、ノートのタイトルを英語にするか、Todoist 上でタスク名を変えるか、かな。あるいはこちらの方のようにする。

rankonikki.giren.net

その他

明日が雨だと通知

ifttt.com

宇宙飛行士が宇宙に行くと通知 ifttt.com

もっと自由度が欲しい

IFTTT は組み合わせ次第で色々できて楽しいんだけど、限界もある。例えば1時間ごとに位置情報を取得して Evernote に送るみたいなことをしたかったんだけど、それをするには「時間」+「位置」+「Evernote」の3つが必要で、IFTTT では2つをつなぐことしか出来ないので無理。つまり If This and This Then That とかはできない。 「位置」についても、座標とかは取ってこれなくて、あるエリアにいるかどうかしか分からない。位置情報を使うアプレットはこれ。

ifttt.com

あと Twitter とかのアカウントを複数登録できるようにくらいはして欲しいな。

cv:findContours の輪郭の階層構造を扱う

"I am your father." --- Anakin Skywalker

OpenCV の findContours はオプションを指定することで輪郭の階層構造を返してくれる。 外輪郭と内輪郭で色を変えて塗りたいときとか、これを使ってどうやるかを考えてみた。 以下のリンク先とほぼ一緒なのだけど、リンク先は C++ ではなく C の API を使っているので、C++ で書いてみた。

ここから書いたやつ。

void ProcessRecursive(int contour_id, const std::vector<std::vector<cv::Point>>& contours, const std::vector<cv::Vec4i>& hierarchy, int &counter, int level){
    int next_id = hierarchy[contour_id][0];
    int previous_id = hierarchy[contour_id][1];
    int child_id = hierarchy[contour_id][2];
    int parent_id = hierarchy[contour_id][3];
    ++counter;

    std::cout << "I am contour #" << contour_id
        << " in level " << level
        << ", child of #" << parent_id
        << ". Previous ID = " << previous_id
        << ", Next ID = " << next_id
        << ", child_id = " << child_id
        << ", counter = " << counter
        << std::endl;

    if (child_id != -1) {
        ProcessRecursive(child_id, contours, hierarchy, counter, level+1);
    }
    if (parent_id != -1 && next_id != -1) {
        ProcessRecursive(next_id, contours, hierarchy, counter, level);
    }
}

counter は輪郭の数え漏れがないか確認するために入れた*1

drawContour() を Fill するオプションで外側の輪郭から順番に使っていけばきれいに塗れる。そのうち画像の例を用意するかも。

*1:会社に contour を「カウンター」と読む人がいるので、このコードを見せて混乱させてあげたい。

光コンセントの半挿しにご注意な話

ここ数年、大量に通信するときは研究室で行い、家では WiMAX という状況だったけど、引っ越して久しぶりに固定回線を引いた。たぶん、6年ぶりとかで、前回はADSLだったので今回初めての光回線。なのだけど、契約開始してから10日以上使えない状態で困っていた。プロバイダのIIJや、NTTと連絡しても解決しなかったので今日NTTに点検に来てもらった。ようやく使えるようになって一件落着だけど、精神的に疲れたので愚痴を書く。

これまでの経緯としては、契約開始翌日になってもつながらないのでIIJのWebフォームから状況を詳しく書いて送った。IPアドレスの取得はできるときもあるけど、インターネッツはほぼ無理、ping を打ってもパケットロスが多いなどなど。メールで返ってきた回答は、以下のURLの説明を見てPPPoEの設定をしてください、だけ。IPアドレス取得できたって言ってんだろうが。あきれた回答だったので直接NTTに電話してみると、プロバイダに連絡してくださいと言われる。仕方なくIIJに電話してみると、6分以上待ってもつながらないナビダイヤル、やってられるか。そこで今度は電話ができる時間帯を指定してフォームに送った。ようやく電話が来ても有益な情報は得られなかった。だからそれ全部フォームに2回も書きましたよね? この電話のときが一番イライラした。結局NTTに診てもらいましょうということでNTTからの連絡を待つ。最初からNTTと相談できればいいのに。NTTとの電話でも有益な情報が得られず、来てもらうことに。というわけで今日に至った。

NTTの人が来ると、1分もせずに直った。 は・・・? 原因を聞くと、光ファイバーの接触不良だった。インターネッツに詳しくないので初めて見たけど、うちには光コンセントというのがある。光回線はこの光コンセントとモデムを光ファイバーでつないで通信する。光すごい。この光コンセントに光ファイバーを差し込むコネクタが、「いわゆる半挿し」になっていたそうだ。えー、なんでそういうのがあるって電話で教えてくれなかったの・・・ ちなみに修理費は1080円。コネクタ差し込むだけで。まあそれは良いんだけど、そんな簡単に直る可能性があるなら電話で伝えろ。これまでの苦労は何だったの。ちなみにNTTの人も、来る前の電話で今から30分くらいで行きますと言っていたので、作業が一分で終わったとしても移動時間に1時間くらいかかっていると思われる。それで1000円なので、お互い損してる。というわけで、光ファイバーでモデムの「認証」ランプはついてるけど、ネットにつながらない場合、半挿しになってないかチェックしてみましょう

今回得たものは半挿しというものがあるということ、失ったものはIIJへの信頼。半挿しという言葉を知ってしまえば色々とググって引っかかるけど、知らない状態ではそういう情報は見つからなかった。

TeXShop の外部エディタとして CotEditor を使う

TeXShop のエディタを使っているとよくカーソルが行方不明になるので、カーソルのいる行の色を変えるとかしたかったのだけど、できなさそうなんでいっそ CotEditor を外部エディタとして使うことにした。TeXShop のエディタには検索が使いにくいなど、他にも不満な点があるし。

ちなみに CotEditor でカーソルのある行の色を変える方法は以下。チェックを入れて、上の赤で囲ったところにチェックを入れて、下で色を設定。

f:id:pn11:20170304051109p:plain

CotEditor は2010年くらいから使っているけど最近は以前よりもかなり安定していて素晴らしいエディタだと思います。とか言いつつ、今日までスクリプトを使えることを知らなかった。

ここから本編

まず TeX Wiki からリンクの貼られていた以下の記事を参考にさせていただいて、

TeXShop と外部エディタの連携skalldan.wordpress.com

以下のような AppleScript を書いた。

tell application "CotEditor"
    try
        set texfileOnCot to the file of the front document
        set path2texfile to texfileOnCot as text
        set posixpath to POSIX path of path2texfile

        tell application "TeXShop"
            activate
            try
--             opendoc(posixpath) -- should use this but I couldn't
                open(posixpath)
                set texfileOnTS to front document
                tell texfileOnTS to latexinteractive
                tell texfileOnTS to close
            end try
        end tell
    on error
        display dialog "Error!"
        beep 1
    end try
end tell

AppleScript はたまにしか書かないのでよくわからない。エラー処理とかも適当。コメントアウトしてる opendoc() っていう関数は TeXShopHelp > Notes on AppleScript in TeXShop と辿ると見れる PDF にこっちを使えって書いてあったんだけど、よく分からなかった。

このスクリプトを、~/Library/Application Scripts/com.coteditor.CotEditor に置く。このときに設定したファイル名が、CotEditor 上でのショートカットになる。Cmd+T に設定したかったけど後述のようにできないので、Cmd+Opt+T にするべく、cot2texshop.@~t.scpt いうファイル名にした。そうするとメニューにはこんな風に表示される。

f:id:pn11:20170304052506p:plain

これで CotEditor で TeX ファイルを編集しているときに、Cmd+Opt+T を押すと TeXShopコンパイルしてくれる。この辺りのことについては、以下の記事を参考にさせていただきました。

satomacoto.blogspot.jp

なお7年前の記事なので今とスクリプトを置く場所が異なるようです。また、この記事では Cmd+T は Show Fonts に割り当てられているとなっているけど、僕の環境ではそうなっていない。僕の使っている CotEditor のバージョンは 3.1.3 なので、macOS Sierra だと Cmd+T でタブが開くっぽい (El Capitan を使っているのでメニューからは見えないが)。たぶんこのせいで Cmd+T は使えなくなっているのだろう。

なお CotEditor のスクリプトについて詳しくは、Help > CotEditor Scripting Manual > About Scripting と進んでいけばファイル名の規則などが書いてあるヘルプドキュメントにたどり着けるはず。

あと、Cmd+Opt+T を押す前に、Cmd+S を押して保存しておかないと編集が反映されない。AppleScript 内に保存する動作を入れても良いかも。

あとあと、AppleScript を使わずとも CotEditor には強力なスクリプト機能があることをあとから知った。これを使えば、TeXShop を呼び出す必要もないのでそっちのほうが良いかも。TeXShop を呼び出す利点は、Ctrl+Cmd+A で aux ファイルを消せたり、Shift+Cmd+B で BibTeX を実行するといったショートカットが使えることかな。

その他参考リンク

AppleScript を書くときは毎回お世話になっております。