radiko.rbで時間表記を"Mon 25:00"と書けるようにした

ドッグフーディングしながらコツコツと改良を加えているradiko.rb

深夜のラジオ番組は大体

  • “Mon 25:00” (本当は火曜日の深夜1:00)
  • “Sat 24:00” (本当は日曜日の深夜0:00)

のような表記をされることが多い。今までは"Mon 25:00" -> “Tue 1:00” のように変換して表記する必要があったのだがこれをどちらでも書けるようにした。

github.com

require "radiko/radiko"
include Radiko

c "ハライチのターン!", "Thu 24:00", %w(TBS RBC)
c "オレたちゴチャ・まぜ", "Sat 25:50", %w(MBS)

番組表そのままで記述できるので便利。

Radikoの番組をRubyPicoから直接開けるようになった

その後radiko/radiko.rbの改造を加えている。

任意の番組リストを作れるように

前回の課題になっていたやつ。自分の好きな番組もann.rbやjunk.rbのように表示できるようにした。

rubypico/radiko - GitHub

こんな風に書くと

# coding: utf-8
require "radiko/radiko"
include Radiko

c "山下達郎のサンデー・ソングブック", "Sun 14:00", %w(FMT RADIONERRY FMO E-RADIO FMAICHI FMGIFU)
c "ライムスター宇多丸のウィークエンドシャッフル", "Sat 22:00", %w(TBS RAB YBC RBC)
c "菊地成孔の粋な夜電波", "Sun 20:00", %w(TBS IBC YBC RFC BSN)

こんな風に表示してくれる。

メソッドRadiko::cは今のところ週間番組を想定しているけど、以下のように書けば月~金だけ放送するような番組でもいける。

# coding: utf-8
require "radiko/radiko"
include Radiko

CHANNELS = %w(TBS RAB CBC)

c "毎日ニュース(月)", "Mon 14:00", CHANNELS
c "毎日ニュース(火)", "Tue 14:00", CHANNELS
c "毎日ニュース(水)", "Wed 14:00", CHANNELS
c "毎日ニュース(木)", "Thu 14:00", CHANNELS
c "毎日ニュース(金)", "Fri 14:00", CHANNELS

Radikoアプリを直接開けるようになった

めちゃ便利になった。

今週のJUNKとANNをRadikoで一瞬で開くRubyスクリプト

Air Podsを買ってからポッドキャストネットラジオを大分聞くようになった(片耳だけ付けるとモノラルになるのが素晴らしい)。

Radikoも使っているのだが最近になって有料のエリアフリーに入った。これでJUNK(TBSラジオの深夜放送)やANN(オールナイトニッポン)をタイムシフトかつ細切れに聞くことができる。

Radikoの放送は1週間いつでも再生できるのだが「(謎仕様で)再生開始から3時間」しか聴くことができない。しかし複数の放送局に配信している番組であれば放送局をまたがることで細切れにタイムシフト再生が可能になる。例えばJUNKのような2時間の番組なら4局をまたがることで30分細切れに再生が可能となる(そのためにもエリアフリーが便利)。

しかしスマホアプリのRadikoはこのような使い方をあまりサポートしてくれない。例えば「バナナ」で検索したら再生可能な「JUNK バナナマンバナナムーンGOLD」を局毎に一覧表示してくれればいいのだが、なぜかTOPに表示されるのは来週放送予定の番組一覧だったりする。JUNKやANNだと少なくとも5局以上配信されているため、実際に再生できる番組は下までスクロールしないと見つからなくて辛い。さらに放送中に突然アプリが落ちたりする。さらにさらに履歴機能が無いため番組を聴いている最中にアプリが突然落ちてしまうと 再度番組名で検索→TOPに表示されるのは放送予定なので下までスクロール→辛い という手順を何度も繰り返す必要がある。

解決するためにプログラムを書くことにした。スマホから使いたいのでRubyPicoで書く。

junk.rb, ann.rb

プログラムはGitHubに置いた。RubyPicoGemsのgithub_download.rbを使っている人はradikoでダウンロードできる。

github.com

junk.rbがTBS JUNK用、ann.rbがオールナイトニッポン用。

実行すると以下のような表が出力される。リンクをタップするとRadikoが立ち上がり番組を 任意の局で再生できる。何時クリックしても一番最近に放送された番組が立ち上がるのが便利なところ。

f:id:tuto0621:20170731212520j:plain

解説

Radikoにはシェア機能というよい機能がありURLで任意の番組を好きな時間から再生することができる。

http://radiko.jp/share/?sid=LFR&t=20170725010000

例えば上のURLはsid=LFR(放送局はニッポン放送)、t=20170725010000(2017/07/25 01:00から再生)となる。番組の最初からではなく途中からでも再生できるのがよい。

今回は途中再生は不要、かつすべて1:00から放送なのでタップした時間から一番最近の月~金の1:00を求めて表を作ればよい。

最近の曜日を求める

RubyPico(mruby)にはDateTimeが無いのでそこはTimeだけで頑張る必要があった。

radiko/radiko.rb at master · rubypico/radiko

def last_wday(wday, hour, min)
  t = Time.now
  t = Time.local(t.year, t.month, t.day, hour, min)
  if t.wday >= wday
    d = t.wday - wday
  else
    d = t.wday + 7 - wday
  end
  t - d * (24 * 60 * 60)
end

まとめ

スクリプトのおかげでJUNKとANNの再生がとても捗るようになった。また細切れに聞くのも簡単になったので通勤時間を利用して2~3回に分けて1つの番組を聴くのが基本スタイルになった(本当はどこまで聴いたかを記録できるようになるといいのだが)。

困ったこととしてはRubyPicoからの起動に慣れすぎて他の番組をなんなく聴かなくなってしまったことだ。URLを叩くためのライブラリ層は大体構築できたので次は自分のお気に入り番組を素早く再生するスクリプトを作りたいと思う。

Siv3DRubyというのを作っている その2

Siv3Dの下回りのクラスをmrubyにバインドしていく。なんか動きはじめた。Win+Gでアプリケーションの動画を簡単に取れるのが大変便利。そしてそのままTwitterに貼り付けられるのも素晴らしい。

mrubyでC++のクラスを組み込むときのコーディング規約

ofrubyとRubyPicoのいいとこどりみたいな書き方で書いている。コーディング規約、最初はシンプルにmrubyの標準ライブラリ的な書き方で書こうとしていたのだけどC++のクラスをmrubyに組み込むと各C++クラス間でもmrubyとC++への相互変換が頻発するようになりそのたびにmrb_siv3d_point_to_cpp(mrb, obj)みたいに長い関数を毎回呼ぶのが辛くなってきた。

siv3d自体がC++11/14の先進的なC++の書き方を積極的に使っている印象なので、組み込み用のコードもガンガンC++で書くことに舵を切りなおす。

↑今はこんな感じで書いている、ToMrb(), ToCpp() とか無名名前空間を使って関数名を短くしたりできたので結構気に入っているがどうだろうか。

C++のライブラリをmrubyに組み込んでいる人はどうやって書いているのだろうか。

久しぶりに開発環境がWindowsになった

Siv3DRubyのレポジトリを作った。コツコツやっていく。

Siv3DRuby/Siv3DRuby at master · ongaeshi/Siv3DRuby

Siv3DRubyのために開発環境を数年ぶりにWindowsに変えた。RubyPicoもあるしiPod touchiTunesと相性がいいのもあってMacを捨てるつもりは今のところない。が、新鮮な環境を今は楽しんでいる。

Bash on Ubuntu on WindowsのおかげでMacを使うことのメリットの40%位はWindowsでもよくなったのではないかと感じる。Visual Studioがありフリーなユーティリティが充実してゲームができるのがWindows側のメリットだろうか。後は設定変えれば大体なんとかなるところ。実際にディスプレイ、キーボード、マウスは(Windows側で)色々工夫してMacで使っているものと共有できた。

EmacsUbuntu版でやろうと試みたがSpacemacsが画面がちかちかしてうまく動かなかったので今回は断念(Bash on Ubuntu on Windowsはまだまだ進化しそうなのでそのうち動くことを期待)。日本語化パッチの当たっていないNTEmacsを使ってみたが結構普通に動いて感動。

最低限必要なものは大体動くようになったのだが細々とした設定がまだまだ足りないので微妙に馴染んでいない感覚(Windows10にな慣れていない+Spacemacsの操作も覚え中なのも大きい)。とりあえずMacのキーボードで動いてはいるがせっかくなのでHHKBやREALFORCEとかに変えようとキーボードを物色中(親指シフトも使いたい)。

Siv3DRubyというのを作っている

Windowsでマルチメディアアプリケーションがとても簡単に作れるSiv3Dというライブラリがあるのだが、これにmrubyを組み込んで.exeとRubyスクリプトだけで簡単にマルチメディアアプリが作れるものを考えている。

mrubyはVisualStudioでも簡単にビルドできるようになっているので、作ったlibmruby.libをSiv3Dにリンクして動いたらいいなと思いえいとやってみたが、残念ながら大量のリンクエラー。コンソールアプリやWin32アプリは普通に作れたのでSiv3Dのための特殊なコンパイルオプションが必要なのだろうか。ひとまずおいておく。

作戦2として直接mrubyのソースをSiv3Dのプロジェクトに組み込んで動かしてみる今度は上手くいった!が、Rubyスクリプトが例外を起こしたときにアクセスバイオレーションする。問題その2、ひとまずおいておく。

試しにprintlnとwait_keyを組み込んだらあっさり画面に文字が出た、おおーこれは楽しい。

次はメインループと円を書く関数。Siv3Dはdrawとupdateのように複数のメソッドを要求せずに上から素直に書けるのでRubyと大変相性がよい、、。

ビルドした.exeとmain.rbをまとめて配布すると、なんとメモ帳さえあればVS不要でマルチメディアアプリケーションが作れるようになる。まずはいくつかのサンプルコードがRubyスクリプトで書けるように主要なクラスやメソッドだけを組み込んで評価版Siv3DRubyを作ってみよう。

RubyPicoが第9回フクオカRuby大賞で優秀賞をいただきました

iOSで動くRuby開発環境のRubyPicoが第9回フクオカRuby大賞で優秀賞をいただきました。

「第9回フクオカRuby大賞」審査結果 - 福岡県Ruby・コンテンツビジネス振興会議

今回で4回目の挑戦となりますが前回のhonyomiではじめて賞をいただき、プレゼンの雰囲気や流れも分かってきたので今度こそ大賞を!とがんばってみましたが残念ながらHaconiwaという素晴らしいソフトウェアが大賞となりました。しかしなんと優秀賞をもらうことができたので大変うれしいです。

RubyPicoについて

mrubyが出始めの頃に「これでiOSAndroidが動くRubyアプリがたくさん作られるんだろうなぁ」とか思っていたらmrubyの主戦場はnginxやH2OといったPCアプリケーションとなり、だれも作らないのなら自分が作ってみようという気分になったのがきっかけです。

最初はopenFrameworksを組み込んだofrubyというアプリを作っていたのですが、途中でiOSのアプリが64bit必須になり、当時のopenFramworks for iOSが64bitビルドに対応していなくて泣く泣くバージョンアップをあきらめました。

次にiOSネイティブのAPIをコツコツと組み込むしかないかと思い直し、写真が加工できたら普段プログラム書かない人も興味持つだろうと安易に考えて、写真加工をRubyスクリプトで行えるPictRubyというアプリを作りはじめました。

そして結局写真を撮るよりもプログラムを書くほうが好きだったと思い直し、よりCRubyに近づけたrequireや無限ループも書けるRubyPicoへと進化していきました。iOSアプリはマルチプロセスできないので、GUIを駆動させるメインスレッドとmrubyを実行するサブスレッドに分けて動かしてloop {...}させてもアプリが止まらなくなったときは大変楽しかったです。

趣味としての挑戦

普段の仕事ではC++などを使うことが多くRubyPicoに使われているObjective-CRubyはあまり使いません(Rubyは隙を見て無理やり使うけど)。私の場合インターネットに公開しているツールはいつもとちょっと違うジャンルで自分の作りたいものを作る、いわば趣味としての開発です。

フクオカRubyの参加者の方を見ていると仕事として参加されている方が多い印象でした(あくまで私の印象でちゃんと調べている訳でもないですが)。最近はオープンソース自体への参加者も仕事として参加されている人が増えているように感じます。そのこと自体はとてもいいことなのですが普段できないことを試したりまったくビジネスにはならないけど面白いことを試すための場としてのフィールドが狭くなっているのだとすると少しさみしい気持ちもあります。

ビジネスとして取り組んでいるオープンソースは実際役立つことが多くソフトウェアの質も高いものが多いです。しかし趣味のソフトウェアにも独特のよさがあるのではないかと考えています。お金にはならないけど楽しいこと優先で作れたり、飽きない限りいくらでも時間をかけることもできます。何よりも自由です。誰に頼まれた訳ではなくただ欲しいから、作りたかったから作ったソフトウェアはRubyのように時折不思議な魅力を持って多くの人々に使われます。私もいつかそういうものが作れたらいいなぁと分不相応なことを思っています。

仕事の延長で、趣味として、腕試しに、試しに作ったら割とよい出来になった、などたくさんのバックグラウンドを持つ人たちがもっとフクオカRubyに参加してくれたらよいなぁと思います。応募資料やプレゼンテーションの準備をするとその過程でより自分の制作物を客観的に眺めることができますし、審査員の方々の質問は示唆に富んで今後の開発に役立つので応募にかける時間は決して無駄にならないので是非。

今後の展望

Rubyを書いて動かすための基本的な土台はできてきたので、次のステップとしてもっとたくさんの人に使ってもらえるようになればよいと考えています。

審査員の方からいただいた質問の中で、コードのバックアップをとれないのかという話と、入力がPCと同じテキストエディタだけど例えばモバイルに特化した入力システムを作らないのか?という指摘がありました。

コードのバックアップはDropboxiCloudと連携ができれば色々便利になりそうです。が、実行可能なコードのダウンロードをAppleが禁止していて実際他のアプリでも昔入ってたけど途中で外したりしているので基本的には大変そうです。今はgithub_downaload.rbというGitHub APIを叩く拡張ライブラリを書いて、PCでコード書く→git push→github_downloadでスマホにダウンロードとかやっています(しかし2手くらい多い)。自分の書いたコードをバックアップ用途としてクラウドに同期するところだけでも許してもらえたら大変うれしいのですが。

モバイルに特化したコード入力システム、フリック入力のようにサクサクプログラムをスマホから入力できるようになったらそれだけで大きな価値がありそうです。Smalrubyのようにブロック入力だけど実際にはRubyスクリプトが書かれている、みたいになっているといいなぁと妄想しています。何かお手本になるようなアプリがないか探してみようかな。

他にもSpriteKitを組み込んでRubyだけでモバイルゲームを作れるようにしたらゲーム作りたい人たちに使ってもらえるのではないか、などと考えています。

まとめ

福岡のカレーが大変美味しかったです。次はとりかわが食べたい。

発表のときに使ったスライドはこちらです。