読者です 読者をやめる 読者になる 読者になる

Markdown, Python (Pythonista) を用いた暗記シートの作成

Python Gadget

iOS で暗記ができるアプリがほしいのだが、どのアプリも一長一短って感じでどうにもうまくない。Pythonista という omz が産んだ世紀の大発明があるのだから、それを利用して暗記アプリを作ってしまえばよいと思いついた。

Markdown で書いたもののうち、em , strong タグを付けた重要点を黒塗りで隠して、そこをクリックしたら見える、みたいな機能さえあればよい。 以前 Vim では作った のだが、モバイルで使いたかったので Pythonista で書いてみた。下の Gist がそれである。

AnkiMarkdownGUI.py を起動すると、Dropbox にアクセスしてファイル選択画面となる。かならず .md ファイルを選択するようにしよう。 ファイルを選択したらダウンロードが始まる。あとは待っていれば要点が黒塗りにされたファイルが作成されるので暗記しよう。

Markdown - Anki viewer for Pythonista. Obtains a M ...

自分のコーディング力に自身がなさすぎて GitHub にはアップロードできずに Gist に大量にコードがたまっていくおじさんと化しているが、GitHub のほうに上げたほうが多機能だから他の人に使ってもらうにはいいよねと思わなくもない(でもめんどい)。

屋内の二酸化炭素濃度を測定する

Gadget

その眠気、酸欠だから 外へ出ろ」という川柳が回ってきたので二酸化炭素濃度を測定したくなった。

室内環境をかんたんに測定する手法として Netatmo Weather Station を利用するというものがある。これは確かに温度・湿度・CO2・騒音などを測定することができる上に、屋外機もあり屋外気温・湿度まで測れる優れものであるが、高価である(2万円強)・Web サービスと統合されているのでサービス終了と同時に使えなくなる可能性がある などの問題もある。加えて私の環境では、すでに自前で温度・湿度・気圧の測定は行っていたため、追加で二酸化炭素濃度のみ測定できれば十分であった。

Arduino などに接続できる二酸化炭素濃度計は存在することはするのだが、高額(6000円超)・キャリブレーションの必要性などがあり面倒である。

そこで、USB 接続の CO2 濃度計 CO2-mini-M を利用することにした。CO2 濃度はデジタル画面に表示されるのみで、USB はただ電源を得るためだけに使われているかのように説明書には書かれているのだが、実際には HID として PC に認識され、濃度データの送信も行われているらしい。そのデータを解読した猛者 がいるので、ここの "the real, actually working Python code" を取得して co2monitor.py として保存し、

$ sudo python co2monitor.py /dev/hidraw0

と実行することで他の値と同時に CO2 の値が取得できる。CO2 の値を取得している部分はコードを読めば明らかなので、そこに自分がさせたい処理を書いて終了。私の場合は ElasticSearch へデータを送信するコードを書き加えた。

このままだと /dev/hidraw0 からの通信が sudo しないと見えないので、他のユーザーも利用可能とするために以下の設定を行った。

$ sudo vi /etc/udev/rules.d/90-hidraw-permissions.rules
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="plugdev"

ちなみに同様の手法に関する日本語での他の紹介ページは こちら

ちょっと使ってみた結論としては、自分でログ取得部分から表示部分までプログラムするのがめんどいし、屋外モジュールを自分で作るのは難しいし(電池で長期間動かすのつらい・無線で飛ばすのもつらい)、Netatmo は IFTTT にもチャンネルを持っているAPI も持っている のだから、ふつうに Netatmo を購入して毎日1回ログを取得するコードを書くのがいいと思いました。つらい。

Vim を暗記帳として使う

Vim

最近、暗記をしなければならないことが増えた。いつも文字を書くときには Vim + Markdown を使っているので、それがそのまま暗記帳となれば楽である。 要は Markdown強調 されているところが、コマンドやカーソルオーバーによって隠れたり現れたりすれば嬉しいわけである。 先人 がいるので、そのアイデアを参考にする。

markdown.vim によって、italic, bold, bolditalic にはそれぞれ htmlItalic, htmlBold, htmlBoldItalic という syntax が適用されているので、それらが使う highlight を別のものにトグルするコードを書いてやればよい。具体的には以下のようにすれば :Anki コマンドで重要語句のハイライトと白塗りとを切り替えることができる。

function! s:setMarkdownColor()
  hi link htmlItalic LineNr
  hi link htmlBold WarningMsg
  hi link htmlBoldItalic ErrorMsg
endfunction
call s:setMarkdownColor()

" Toggle strong/italic <-> hidden text, in order to memorise them.
" Use autocmd to set color after colorscheme is loaded (otherwise highlight can be cleared by other scripts).
autocmd ColorScheme * highlight HiddenText ctermfg=15 ctermbg=15 guifg=White guibg=White
command Anki call s:toggleHide()
function! s:toggleHide()
  if exists('b:synhideText')==0
    " hide
    hi link htmlItalic HiddenText
    hi link htmlBold HiddenText
    hi link htmlBoldItalic HiddenText
    let b:synhideText=1
  else
    " Unhide
    call s:setMarkdownColor()
    unlet b:synhideText
  endif
endfunction

ちなみに、現在の colorscheme を確認するには次の4つの方法がある(参考サイト)。これらの出力を見ながら好きな色を決めていけばよい。

colorscheme  " カラースキーム名のみ
so $VIMRUNTIME/syntax/hitest.vim  " ハイライト例を表示
highlight  " カラーコードつき
verbose highlight  " カラーコード+定義ファイル名つき

ついでに、現在のカーソルの下の syntax を確認するには次のようにする(参考サイト)。

:echo synIDattr(synID(line('.'), col('.'), 0), 'name')

Homebrew がおかしくなったので直す

Mac

$ brew update ができないとかを筆頭におかしい。ので直す。どこがおかしいのかも Homebrew に調べてもらう。

$ brew doctor

上から読んで、ふむふむって言ってから適用していく。

$ sudo chown -R $(whoami) /usr/local
$ brew update

$ brew doctor ってコマンドがあるよ、ってメモりたかっただけ。

複数の Google Calendar をまとめた Calendar を Google Apps Script を利用して作成する

LifeHack

複数の Google Calendar を使って予定管理しているのだが、たとえば仕事相手に空いている時間を教えたいときなどに、複数のカレンダーのアドレスを教えなければならずに面倒であった。できれば1つのカレンダーを共有するだけで予定を相手に通知できるようにし、かついままでのカレンダーの使用方法は変えたくない。

複数のGoogleカレンダーをまとめる を参考に このスクリプト を使おうと思ったが、一度に多くの操作をしすぎだと怒られたので、自分で書き換えた。JavaScript のオブジェクト、Python と同じだと思っていると痛い目にあうことがわかった(できれば Python で書きたかった)。

定期的に実行する方法は先のサイトを見ればいいが、メモとしてここにも書いておくと、

  • まとめる先のカレンダーを新しく作成しておく。
    • 公開範囲も適切に設定しておく。
  • Google Drive で新しい Google Sheets を作成
  • Tools > Script Editor を開く。
  • 下のコードをコピペ・カレンダー ID を書き込む。
    • ID は example@group.calendar.google.com みたいな形をしている。
  • テストラン。上部で関数名 (main) を選択してから Run.
  • 結果を見て、満足なら Resources > Current project's triggers から実行時刻を入力。ぼくは始業前の 7:00-8:00 と業務後の 18:00-19:00 に1回ずつ走るように設定した。

難点としては、本来ならカレンダー(予定の種類)ごとに細かく閲覧設定ができるところを縮退させてしまっている点か。しかしまぁ、そのへんはスクリプトを軽く書き換えて、プライベートな予定は Private という名前にしてパブリックな予定はそのままの名前とする、みたいな感じにすれば丸いのでは。

参考にしたサイトは以下である。

gist583d364fa99b9fafdcaf5e9287047ca7

送信時刻を指定して Gmail を送信する

LifeHack

手紙は夜に書くな、とはよく言うけれど、しかしメールなんて夜ぐらいにしか書く気にならないというのもまた事実であり、深夜に書き上がったメールをさて送ろうと思ったときに、相手が携帯のアドレスだと睡眠を妨害しやしないかと少々躊躇してしまう。またたとえ携帯でなかったとしても、深夜にメールを送ったら「このひと、返信を書くのに悩みに悩みぬいたのだわ」と思われてしまいそうだ。もっとスマートに、朝起きて朝飯前にさらさらっと書いたふうを装いたい。

決まった時間に送信する、なんて機能は Gmail に標準搭載されていてしかるべきだと思わなくもないが、おそらくコストに見合わないのだろう。外部サービスとして Boomerang とか Right Inbox とかのサービスがあるけど、セキュリティ的にどうなのって思うし、金は払いたくない。また、以前に似たような記事を書いた が、あのコードは下書きの本文をコピーして新しいメールとして送信する(リプライチェーンが切れる!)というものだったのに加え、Google Sheets での操作が必要だったため実用的ではなかった。

Gmail の API に Drafts を直接操作できる API があるので、これを Google Apps Script と併用して、自前のサーバーなしに朝夕の自動メール送信を実現しよう。

使い方は以下である。

  • Google Apps Script で新しい Script を作成し(もしくは Google Drive から新しい Google Sheets を作成して、そこの Tools > Script Editor から新しい Script を作成)、下のコードを貼りつける。
  • Resources > Advanced Google Services から Gmail API を有効にして(スイッチを on にして)、下に表示される Google Developers Console へのリンクから Gmail API を有効にする。
  • sendMorningDrafts などの関数を Resources > Current project's triggers から適当な時間に登録。
  • あとは Gmailschedule/send-next-0700-0800 などの名前のラベルを作成し、それを Drafts にある下書きにつければ時間がくれば送信してくれる。
    • 最初の実行時には authentication があるのでテストもかねて手動で実行してみるのが吉。

利点としては、下書きにラベルをつけるという操作さえできれば Web からでも iOS App からでも送信予約ができる点が挙げられる。逆に悪い点としては、このメールはいついつに自動送信したい、みたいな細かい指定はできない点が挙げられる。

参考にした資料は以下である。

Automatically sends Gmail drafts with specific lab ...

(2016-07-21 追記:コードを Gist へ移行した。ついでに、API を直接叩いていたのを、Advanced Google Services のインターフェースを使うように変更。)

サーバーの容量を監視して通知

Server

この記事 を参考に。 せっかく Pushover を使っているので、これに投げてもらう。curl で楽をする。

$ vi check_df.sh
#!/bin/bash

LIMIT=90
SUBJECT="[WARN] The capacity of the disk has decreased! - `hostname`"

while read LINE
do
    PERCENT=`echo $LINE | sed 's/^.* \([0-9]*\)%.*$/\1/'`
    if [ $PERCENT -gt $LIMIT ]; then
        curl -s --form-string "token=tkn123" --form-string "user=usr123" --form-string "message=$SUBJECT $PERCENT%" https://api.pushover.net/1/messages.json
        break
    fi
done < <(df | grep '[0-9]\{1,\}%')
$ chmod 755 check_df.sh

LIMIT を低く設定して、動作テスト。

$ ./check_df.sh

通知が送られてくれば OK。

とりあえず毎日18時にチェックして通知。

$ crontab -e
0 18 * * * /home/username/check_df.sh >/dev/null 2>&1