シェルスクリプト Forced Todo

Forced Todoはなかなか進まない進捗に対して、一定の時間でTODOを読み上げ、進捗を迫るものである。 あまりに進捗しないので作ってみた。

Gist

Systray

Notifyを開始するとSystrayに常駐し、Systrayから終了できるようにした。

Systrayへの常駐はMailDeliver2同様、yadを使うようにした。

notifypid=$!

yad --notification --image=player-time --text="TODO NOW!" --command="yad --text-info --timeout=15 --title=TODO --width 300 --height 300 --filename=$HOME/.yek/forcedtodo/todotext" --menu='Edit!'"$task_editor $HOME/.yek/forcedtodo/todotext"'|Quit!quit' --tooptip="Immidiately Task" 
kill $!

Yadのオプションについて分析してみよう。

オプション 意味
--notification Systrayに常駐する
--image=player-time Systrayのアイコンを選択
--text="TODO NOW!" Notificationの名前(ポップアップに影響)
--command 左クリック時の実行コマンド
--menu 右クリックメニュー。項目名とコマンドを!で分けている。quitで終了

ネストされているYadは次の通り

オプション 意味
--text-info テキストダイアログ
--timeout=15 15秒でダイアログが閉じる
--title=TODO ウィンドウタイトル
--width 300 ウィンドウの幅
--height 300 ウィンドウの高さ
--filename=... テキストの内容となるファイル

Zenityとは結構な違いがあることに注意。

Yadは通常ブロックするため、Yadが終了しなければ戻らない。 そのため、Notifyするためのプログラムをサブシェルでバックグラウンドプロセスとして実行し、そのプロセスID($!)を取得し、Yadが戻ったらKillすれば良い、ということになる。

Notify (Open JTalk)

Notifyは単一のプロセスIDを振るためにサブシェルで実行し、バックグラウンドプロセスとすることでループさせる。

(
  while sleep $notify_interval
  do
  perl -pe 's/\n/。/g' ~/.yek/forcedtodo/todotext | open_jtalk "$jtalk_tuning[@]" -m $hts_voicefile -x $mecab_dictdir -ow $jtalk_tmpfile
  play $jtalk_tmpfile >| /dev/null &|
  notify-send -t $notify_time "TODO" "$(<$HOME/.yek/forcedtodo/todotext)"
  done
) &

単純なsleepによるループである。

基本的な手順としては

  1. Open JTalkで音声ファイルを作成
  2. 合成した音声ファイルをバックグラウンドプロセスとして再生
  3. Notify Sendを使って通知に表示

となる。

ここで大きな情報はOpen JTalkだろう。

Open JTalkはスピーチシンセサイザーだが、eSpeak, SVOX Pico, Festivalといったソフトウェアと比べて非常に自然で、日本語に対応している。 ただし、かなり複雑なソフトウェアだ。

Manjaro(Arch)では、AURにあるopen-jtalkパッケージをインストールする。

NAIST JdicファイルはAURにも存在していないが、辞書ディレクトリとして/usr/share/open-jtalk/dic/を使用することができる。精度は異なるかもしれない。

NAIST JDicをインストールするためには、mecabをインストールし、さらにNaist JDicで/usr/libexecが指定されている部分を/usr/libに変更しなくてはいけない。

女声を使用するためにはopen-jtalk-voice-meiをインストールする。

Open JTalkは非常に自然で、Twitterの読み上げにも使えそうだが(twとの組み合わせがいいだろう)、複数行を扱うことができないため、Perlで変換している。 また、Open JTalkは標準出力に吐くことはできないようだ。

Android Oneで連絡先が本体に保存できない

Y!Mobileから案内がきてPHSを終了し、ケータイへと移行するように求められた。 ちょうどPHSのキャンペーンが切れて費用が上昇したこともあって検討、結果残っていた2回線(元々の3G回線は転出済み)を両方ともケータイへと移行した。

この際、AQUOSケータイ2とAndroid One S2へと移行したのだが、Android One S2において連絡先の保存先に選択肢がなく、本体に保存、あるいはSIMカードに保存することができず、強制的にGoogleアカウントへの保存となってしまう。

これついて調べたが結論を得ることができず、Y!Mobile店舗で問い合わせたところ、Android OneあるいはNexusにおける仕様であるとのことだった。

恐らくこのほかにもGoogleと不可分になっている点は多いだろう。 出ていない情報だが、現状Y!MobileにはAndroid Oneしかないため、Y!Mobileを選択するかどうかの問題になってもくるだろう(Softbank中古端末や、SIMフリー端末を使用するという選択肢もあるが)。 気をつけてほしい。

Discordを使ってみた

Discordというアプリを知っているだろうか。 まぁ、だいたいの人は知らないだろう。

簡単に言えばSkypeのようなメッセンジャー+通話アプリであり、Discordは大声で「Skypeを投げ捨てろ!!」と言っている。 だが、単純にSkypeのようなアプリというわけではない。 ものすごく乱暴に言えばSkypeのような機能と、Slackに通話機能をつけたものを一体化させたものである。

通話とメッセージングのソフトウェア(例えばSkypeやLINE)と比べると結構複雑だ。 これは「2つの側面がある」と考えてもらうと良いだろう。

Slack的な部分

だが、まずSlackを知らない人が圧倒的に多いだろうからそこから説明しよう。

Slackは簡単にいえば共同作業用のチャットツールである。 「Slackのアカウント」というのは基本的に存在せず、「チーム」というのがその単位となる。 「チーム」はメンバーを招待することができ、招待された人はそのリンクを使ってメールアドレスを登録するとそのチームのメンバーとなることができる。 チームでの活動は、チームのアドレス、またはチーム名とメールアドレスを使って行う。

メンバーにはプロフィールがあるが、プロフィールもチームごとに設定する必要がある。 逆にいえば、チームの性質によって異なるプロフィールを使うことができる。 メンバーにはロール(役割)を与えることができ、メンバーを追放する、チャンネルを作成するなどの権限を分けることができる。

チームにはチャンネルがある。 全体の発言は#generalというチャンネルで行うが、チャンネルを作成すれば、話題を分けたり、閲覧できるメンバーや発言できるメンバーを制限することができる。 基本的には議題ごと、あるいはチーム内のメンバー区分ごとにチャンネルでやりとりをすることになる。 メンション機能もあるが、これは特定の人だけにメッセージが届くわけではなく、特定の人に通知を飛ばすだけである。 ユーザーグループというのもあるが、これはメンションを飛ばす時に複数人をまとめて書いたり、チャンネルに加えるときにまとめて書くための機能。

Slackは主にIT企業の業務で使われていて、ビジネスツールというニュアンスが強い。 社内でのやりとりとしてはメールなんかよりよっぽどいいのは確かだと思う。

ただ、逆に言えばそれ以外では全然使われていない。もともとゲーム用のツールだったなんてことは、ほぼ忘れ去られている(私も知らなかった)。

しかし、実のところ、マメ派のカップルにはかなり良いと思うのだ。 デートの予定やイベントの計画、今日の買い物といった話題をLINEでやりとりしていると、どんな話をしていたか確認するのが大変になってくる。 LINEはログをさかのぼりにくいし、ノートに立てていればいいのだが、LINE for Chromeはノート機能がなかったりするし、明確に議題を定めてから話がはじまるとは限らない。 そもそもノートも増えてくると議論には向いていないことになる。 なので、Slackで#date, #event, #todoなどチャンネルを作っておけばスムーズにやりとりや確認ができてとても便利だ。

ところが、LINEを投げ捨ててSlackにいけない理由がある。 まず、割とSlackの通知はまちまちで、あまりリアルタイムではこない。マメ派カップルにとっては割と致命的だ。 しかも通話機能もない。ラブラブなカップルにとってはますますもって致命的だ。

ここでDiscordである。

DiscordはこのあたりはだいたいSlackと同じだ。 大きな違いとして、Slackで「チーム」と呼んでいるものは「サーバー」という名前に変わっている。 そして、通話機能がある。

通話機能がちょっと独特で、1名でも通話をはじめられる。 チャットのように(特にIRCのように)、「通話チャンネルに入っている人が自動的に通話する」という方式だ。 途中参加もできるし、途中離脱もできる。というか、最後ひとりになっても勝手には切れない。 通話チャンネルも複数作ることができる。

また、雑音を積極的に検出し、しゃべっていない時はマイクを切るようになっている。 プッシュトゥトークにすることもできるので、大勢参加していてもノイズまみれにならないようになっている。 これは便利だ。

また、SkypeやHangoutsのグループトークにない機能として、ユーザーごとに音量設定できる。 声の小さい人を大きく、声の大きい人を小さく。好きな人を大きく、嫌いな人を小さくすることが可能だ。

そして重要な違いとして、Slackと違ってちゃんとすぐに通知がくる。

Skype的な部分

だが、Discordの場合はユーザーアカウントがある。

そのため、複数のデバイスでDiscordを使用した場合、自分が参加しているサーバーはすべて一覧されるし、招待するときはユーザー名とDiscord番号の組み合わせで行う。 フレンド登録もできる。プロフィールや名前もサーバーごとというわけではない。

さらにフレンド登録すると、ダイレクトメッセージとダイレクトコールが可能になる。 これはSkypeやLINEのように、人単位でメッセージを飛ばしたり、通話したりすることができるのだ。

ただし、Skypeにあるビデオ通話や画面の共有は、実装予定の機能となっており現在はない。 これを書いている今日テストがスタートしたようだが。

また通話手順がちょっと複雑だ。Discordがフロントにある場合は普通に通話がかかってくる。 ただし、通話をかけた側は通話画面にはならず、右下にあるVoiceの矢印で開かなければチャット画面での通話になる。 これは通話を受けた場合も同様。

また、通話を切っても残った側の通話は自動的には切れない。これはサーバーの場合と同じである。

なんらかの理由で最初からチャット画面に変遷した場合(通知から飛んだ場合などだ)、まずDM画面にいき、JOINをタップしたあと、Connect to Voiceを選択しないと通話に参加できない。 これはなかなかややこしい。

グループDM機能があり、これは招待もなにもなく、グループDMを作成すると招待された全員が自動的に参加する。 グループDMはフレンドリストに登録される。グループから退出したり、グループに追加で招待することは可能。 退出してもすぐ招待されるようなことが起きるとちょっと面倒。最後のひとりになってもグループ自体は消えない。

スタンプ機能はない。写真埋め込みは可能。

Slackに対するメリットとして、日本語に対応している。 Slackが便利でもインターフェイスは英語に限られていたSlackは敷居が高いという人が多かった。

また、ちゃんとしたクロスプラットフォームアプリがあるということも大きい。Slackの場合はアプリケーションもいまひとつだ。

また、Slackのように有料プランがあって、機能が制限されているというわけでもない。

もっと便利な部分

Discordはゲストログインが可能で、サーバーを作ってアドレスを伝えれば、相手がDiscordのアカウントを作らないまま通話することができる。 しかもDiscordにはWeb版があるので、共通の通話可能なアプリがない、あるいはアカウントを教えたくない場合でも通話することが可能だ。 かなり特殊な要求だとは思うが。

残念な部分

通知のオンオフはできるのだが、通知音は変更できない。

ゲーマー向け

Discordがゲーマー向けということで、ゲーマー以外で使っている人をみかけることがない。

オンラインゲームでは多人数協力プレイができたりするので、通話しながら意思疎通ができたほうがスムーズにプレイできるのだ。 従来はSkypeを使っていたようだが、最近SkypeがどんどんダメになっているのでDiscordに移っている人が多いらしい。

だが、微妙にバグはあるが、SkypeもLINEもXMPPも投げ捨ててDiscordで生きていけるくらいには便利である。 実用上の話であって、かわいいスタンプが好きな人は辛いかもしれないが。

ゲーム中は特に言うことがなければ黙っているだろうし、発言者のみ聞こえるようになっているのはこのためだろう。 割とキーノイズもするわけだし。

バグ

3つのバグを発見した。

通話通知がおかしい

P02E(Android 4.1.2)だと、通知音が通話でもメッセージのものになってしまい、一度鳴るだけで終わってしまう。

アプリを殺すと通知されない

CM Securityでクリーンアップしてしまうと通知は届かない。 これはNotifications wake up device.をオンにしていてもダメだ。

なかなか恐ろしい通話ループ

  1. AがBに書ける
  2. Bが出る前にAが切る
  3. Bが通知エリアから通話に出る
  4. BにAからかかってきたと表示される。「出ない」ことができない
  5. Bが通話に参加するとAに呼び出しがかかる。こちらも「出ない」ことができない
  6. BがAが出る前に切ったら立場を入れ替えて3にループする

みんなDiscordしようぜ

良い点

  • SlackとSkypeの合体とか超魅力
  • 日本サーバーのないWebRTCとは思えないほど音が良い
  • Windows, Mac, Linux, Android, iOSに対応
  • ちゃんと通知される
  • 画像も貼れる
  • グループDMやグループ通話もできる
  • Skypeよりはるかに軽い
  • 話題を分けて整理することができる
  • グループの中で特定の人に呼びかけることができる
  • 運営が透明で技術的にも透明
  • 登録も簡単でゲスト利用も可能、個人情報も要求されない

悪い点

  • 若干複雑
  • ちょっとバグがある
  • 通知音の設定ができない
  • 個人情報もいらないので尻尾切りのような残虐行為が気軽にできてしまう
  • キモいスタンプが使えない