サイコロで行く京都市バス桃鉄風すごろく大会
こんにちは。
京都市バスの地図を見た時,考えることがあると思います。
サイコロを振ってすごろくをすると楽しいのではないかと。
というわけで,京都市バスの1日乗車券を用いて,リアルすごろくを行いました。(去年の夏)
ルール
- 目的地バス停を決定する。
- 参加者はバス停に向かう。遠くのバス停に歩いても良い。
- 6面ダイスを2こ振る。ダイスを降る前に時刻表を確認してはならない。
- 一番最初に来たバスに乗って出た目の数だけ停留所を進む。
- 目的地バス停に降り立つとポイントを獲得。通過する場合でも途中で降りることができる。
- 17:00になるまで,新しい目的地を決定しこれを繰り返す。
参加者の一人のnonylene氏の詳細な記事はこれです。 めっちゃ丁寧なまとめなので雰囲気はこっちを読むと面白いです。
すごろくスタート 10:00
僕, nonylene氏, tron氏, utgw氏の4人が百万遍に集まった。
作ったアプリケーションでランダムにバス停を決定する。
最初のバス停は「木辻南町」になった。
全員が同じバス停に向かい,サイコロを降った。
このためだけに便利なアプリを作った。
上から順番に
- 現在地点のバス停を入力する。 (GPSから自動入力可能)
- どの乗り場から乗るかを入力する。
- サイコロを降るボタンを押す。
- 最初にやってきたバスに乗る。
- 乗ってきたバスを入力する。
- 出目の数だけ進む。
- 降りた場所を入力する。(GPSから自動入力可能)
これによって全員の行動が逐次slackに送られてきます。
僕は最初のサイコロで3を出し,最初にやってきた102系統で「烏丸今出川」まで乗った。
続いて11を出し,203系統で「円町」まで直行。 「木辻南町」へのバスの乗り場が異なる最高のバス停に到着した。
「木辻南町」へは丸太町通の93系統に乗ることでも向かうことができるが, どのバスに乗るかを決めることができないこのルールにおいて,バスの乗り場は決められても乗りたいバスに乗ることは困難となる。 93系統は3本/時であり,4系統以上あるバス停から93系統に乗れる可能性は低い。
今回は「円町」に到着したので,どのバスに乗っても「木辻南町」に向かう西行き乗り場に向かった。 バス停に着いて,必要となる3以上の9の目が出たのでバスに乗って1番乗りでゴールした。
やってきたはいいが,木辻南町には何の目的もないので,次の目的地を設定する。
次の目的地は「新間ノ町二条」だ
地獄の四条大宮東行乗り場
サイコロを振ってたどり着いたは「四条大宮」だ。 ここは大きいターミナルであり,多くのバスが発着する。 つまりこのルールの上では,かなりの難敵となり襲いかかってくる。
東行1番乗り場は8つの異なる行き先を持つバスが発着する。 直ちに京都駅へ向かうバス,5駅先の四条河原町から南北に,7駅先の祇園から南北にとバスが分かれる。 もし7より大きい数をダイスで降ってしまうと,行き先は全く選べないだろう。
東行1番乗り場で出した目は11.やってきたバスは207系統。目的地と反対方向である。
バスから降りて即ダッシュ
参加者の人々は同じバスからそれぞれ別の停留所で降りて目的地にダッシュしたらしい。
同じバスから異なるバス停で順々に降りて直ちにダッシュした人々が同じバス停へ向かう。
ダッシュはutgw氏の勝利だったらしい。この時まだ僕は207系統に乗っていた。
ランチタイム
御室仁和寺に行くバスがあったが,これはJRバスなので1日乗車券で乗れない。 眼の前でJRバスが通り過ぎていく。
とりあえずサイコロを振って辿り着く先が「今出川大宮」だった。
ここで予め設定していたイベントが発火した。
ここでnonylene氏と奇遇したので, 是空というラーメン屋で一緒に食べた。
ラーメンを食べた後,何回かバスに乗ってあがいていたが,tron氏に圧倒的に負けた。
tron氏のバス停写真。
仁和寺に来たが,特に用事はないので次の目的地へ向かう。
休憩フェイズ
気持ちがわかってきて,こういう系統がたくさんあるバス停を見ると絶望するようになる。
2回ぐらい目的地が更新されて休憩になった。
近くの神社仏閣に行くことになった。 梅津大社や,西院春日神社に人々は向かったらしい。
僕は特に観光スポットでもない寺社を眺めることになった。
終了
17:00になったので,最後の目的地を百万遍として終了になった。
僕は百万遍からかなり離れていたので,最後の目的地へのサイコロ移動はギブアップした。疲れたので。
- 17:29にutgw氏が最初にゴール。合計2回の目的地到達。
- 17:39にtron氏がゴール。合計2回の目的地到達。
- 17:48にnonylene氏がゴール。合計2回の目的地到達。
- 僕は3回目的地到達したので一応優勝らしい。
これで一日乗車券を酷使する会は終了となった。
感想
- 行動タイムラインがすごいことになる。これはnonylene氏のタイムライン。
- 行ったことがない場所に乗ったことがないバスで飛ばされるので良い。
- 日頃運動しないので,見ない町を歩くのが楽しいし健康。
- 600円ですごい旅行した気持ちになる。
- 機会があったらまたやっても良い。ドメイン特化のアプリケーションの使いやすさは最高なので。
経路
10:12 「百万遍」 10:16 ー102系統ー>「烏丸今出川《地下鉄今出川駅》」 10:35 ー201系統ー>「西ノ京円町《JR円町駅》」 10:44 ー93系統ー>「木辻南町」 10:56 ー京都バス63系統ー>「丸太町七本松」 11:10 ー52系統ー>「四条大宮」 11:42 ー207系統ー>「五条坂」 12:09 ー207系統ー>「四条大宮」 12:36 ー201系統ー>「今出川大宮」 13:30 ー203系統ー>「北野中学前」 13:51 ー26系統ー>「四条御前通」 14:19 ー80系統ー>「中ノ橋五条」 14:53 ー特27系統ー>「西大路三条」 16:14 ー3系統ー>「四条大宮」 16:21 ー18系統ー>「二条駅西口」 17:16 ー75系統ー>「常磐野小学校前」
16回乗ったので3680を600円で乗ったことになり,およそ6倍の得。すごい。
ググり方が難しいシェル(bash/zsh)周りの小ネタ集
固まったsshから強制に抜ける
Enterしてから
~.
~?
でヘルプが出る
描画の壊れたターミナルを治す
stty sane
コマンドで治る
書きかけのコマンドを保持する
Ctrl-Qでバッファをスタックする。
新しいプロンプトを出すと復帰する。
前回のコマンドの一部を書き換える
^hoge^huga
で前回のコマンドの一部を置換して実行できる。前回のコマンド全ては
!!
- 最後の引数は
!$
- 前回の引数すべてを持ってくるのは
!!1*
現在のカレントディレクトリから一部を書き換えてcd
cd hoge fuga
をすると,例えば~/hoge-dir/dir
から~/fuga-dir/dir
に移動する。
標準エラーもパイプする
|&
でパイプすれば良い。2>&1 |
の省略形。2>&1
は「2の指す先(stderr)を1の指す先(stdout)にする」と読む。3>&2 2>&1 1>&3
だとstderrとstdoutがスワップします。
履歴検索
- Ctrl-Rでコマンド履歴をインクリメンタルサーチする。
- もしくは
!v
のようにコマンドの始め部分を入力する。
SpotlightはApplicationsにおいたSymbolic Linkのアプリを出さないので,AutomatorでShell Scriptを実行するアプリを作成すると良い
Spacemacsをmacにインストールすると,Applicationsにシンボリックリンクを作れ,という指示が出る。
$ ln -s /usr/local/Cellar/emacs-plus/26.2/Emacs.app ~/Applications/Emacs.app
これはSpotlightに読み込まれない。手軽に起動できない。
回避するには,AutomatorでShell Scriptを実行するアプリケーションを作る。
$ open /usr/local/Cellar/emacs-plus/26.2/Emacs.app $@
そして,作ったアプリケーションをApplicationsに保存する。
ついでに,IconがAutomatorだとキモいので置き換える。
「情報を見る」のウインドウのアイコンはCommand+C/Vでコピペできる。まじかよ。
参考: Can I change the application icon of an Automator script? - Ask Different
バージョン: macOS 10.13.6(17G5019)
mRubyの動くLED時計をESP32で作る [後編]
の後編です。
mRubyで時計のプログラムを書けるようにする
といっても,もくもくとAPIを実装するだけです。
用意したAPIはこれだけあります。
こういうプログラムをHTTPで書き込んで時計で実行できるようになりました。
i = 0 # ラインアート lines = [] aline = [20, 10, 3, 8, 2, 3, 2, -1] # 次の時間の線を生成する def succ_line l x0, y0, x1, y1, dx0, dy0, dx1, dy1 = l[0], l[1], l[2], l[3], l[4], l[5], l[6], l[7] x0 += dx0; y0 += dy0; x1 += dx1; y1 += dy1 (dx0 *= -1; x0 = 0) if x0 < 0 (dy0 *= -1; y0 = 0) if y0 < 0 (dx1 *= -1; x1 = 0) if x1 < 0 (dy1 *= -1; y1 = 0) if y1 < 0 (dx0 *= -1; x0 = 31) if x0 > 31 (dy0 *= -1; y0 = 31) if y0 > 31 (dx1 *= -1; x1 = 31) if x1 > 31 (dy1 *= -1; y1 = 31) if y1 > 31 [x0, y0, x1, y1, dx0, dy0, dx1, dy1] end 8.times {|t| lines << aline aline = succ_line(aline) } time_format = "%H:%M" message = "Welcome to KMC! Please Enjoy Yourself!" # Loopの開始 Task::loop do # 描画削除 Led::clear 0 # 色指定 R, G, B (0 ~ 7) Led::color 0, 1, 0 lines.each {|l| # 線描画 x1, y1, x2, y2 # 座標は(0 ~ 31, 0 ~ 31) Led::line l[0], l[1], l[2], l[3] } lines.shift() lines << succ_line(lines[-1]) # フォント指定(番号) Led::font 2 Led::color 7, 3, 3 # 時刻更新 Time::update # 文字出力 x, y, 文字列 # Time::str(strftime文字列) Led::text 1, 12, Time::str(time_format) Led::font 0 Led::color 5, 0, 5 # 流れる表示 時間, 遅さ, y, 文字列 Led::show i.div(2), 23, message Led::font 5 # cmdで入力された文字列 w = Task::cmd() Led::color 0, 5, 5 Led::show i.div(2), 1, w # [注意] Led::flushを実行しないと画面が更新されません。 Led::flush i += 1 end
これは,[前編]の動画のプログラムです。 ラインアートを背景で動かしています。
mRuby拡張により配列や文字列を使えるので,普通のrubyプログラムのように書くことができます。
APIの実装
例えば Led::line
の場合,
Cで実装されている部分はこのように,ブレゼンハムのアルゴリズムを持ってきます。
void b_line(int x0, int y0, int x1, int y1, int r, int g, int b) { mrb_int dx = abs(x1-x0), dy = abs(y1-y0), sx = (x0 < x1) ? 1 : -1, sy = (y0 < y1) ? 1 : -1, err = dx-dy; while (true){ b_set(x0, y0, r, g, b); if (x0 == x1 && y0 == y1) break; mrb_int e2 = 2 * err; if (e2 > -dy) { err = err - dy; x0 = x0 + sx; } if (e2 < dx) { err = err + dx; y0 = y0 + sy; } } }
mRubyの言葉に持ち上げます。
static mrb_value ledline(mrb_state* mrb, mrb_value self) { mrb_int x0, y0, x1, y1; mrb_get_args(mrb, "iiii", &x0, &y0, &x1, &y1); b_line(x0, y0, x1, y1, p_r, p_g, p_b); return self; }
そして Led::line
で呼べるように,環境に登録します
struct RClass *Led = mrb_define_module(mrb, "Led"); mrb_define_class_method(mrb, Led, "line", ledline, MRB_ARGS_REQ(4));
簡単ですね。
辛い点
- ESP32のメモリが足りないので,重いプログラムが動かない
- slackから対局できるオセロ時計が作られたが,メモリ不足で最後まで対局できなかった。
- 日本語のエンコードにISO-2022-JPを選んでしまった。
- 最初
Led::flush
がLed::flash
になっていた - なぜ整数の割り算
3/2
が小数1.5
に評価されてしまうんだろう…。ここでRubyとの非互換性ができてしまった歴史的経緯が知りたい。
部員が作ってくれたプログラムたち
KMC部室にある時計の様子です。 pic.twitter.com/OVTERHy4Lg
— 月鈴那知 (@ten986) 2018年7月11日
この他にも様々プログラムを書いてもらえました。
現在のデフォルトの時計は,室内気温や天気の表示を行うものになっています。
室内気温の情報は昔に作ったこのシステムの情報を使っています。
感想
- ESP32を扱うのはサンプルコードが豊富なので割と簡単。
- はんだ付けとか実装のほうが難しい。
- 実際に動くものができるのは楽しいので良いですね。
- Exploitがめっちゃ簡単にできそうなコードをCだと書いてしまうので,安全なIoT開発手法はもっとほしい…
- RustでESP32開発とかできたらいいんですが,まだLLVM backendがないんですよね。ほしい。
mRubyの動くLED時計をESP32で作る [前編]
マトリックスLEDでスマート時計を作る - Google スライド
作ったもの
- LEDmatrixの時計
- NTP時刻取得
- HTTP GETで情報を受けられる
- mRubyのプログラムをGETで入力できる
概要
- ESP32 ー 安いマイコン
- LED matrix 32×32 RGB LEDマトリックス/KP-3232D/4900474023047/共立プロダクツ事業所
LED matrix
- KP-3232D
- 32x32の3色LED
- 合計3072個のLED
- 4860円 つまり大体1LEDにつき1.5円
この16pinで入力する。
- 横1列の点灯状態+点灯させる列を入力にとり光る。
- 一度に1列しか光らないので,順次点灯させる。
これの制御にESP32をつないだ.
届いたその日に動いた。
木枠を作った。
きれい。
カラフルに光らせるために,高速で点滅するラインの中で何回光らせるかで制御している。
現在は8階調。人間の目で見える実態は4階調ぐらい?
フルカラーで光らせるためにはFPGAでゴリゴリ実装する必要がありますね…。
時計実装
ESP32のプログラムはこれ:
C言語をLinterも入れずに書いてしまったので,おそらく脆弱性が多量に含まれている. HTTPサーバーの部分が特に脆弱である可能性が高い.
NTP時刻取得
時計なのでsntpで時刻を取ってくるようにした。 wifiのサンプルコードとsntpのサンプルコードを持ってこれば動く。
ただ時々時刻がずれるので自動修正のコードを入れている。 はずだがまだ時々突然1時間以上ずれる。
HTTP GET
外からメッセージやプログラムを書き込むために使用。
slack botから文字列を入れると時計に表示される。
「八木までの各駅と、田原本、新祝園、新田辺、大久保、桃山御陵前、丹波橋に止まります。」みたいな文字列も流せて楽しい。
mRuby編
→ 後編: 楽しい時計プログラム編。
京大から京都駅までの移動で地獄の市バス206系統を避ける方法
206系統が辛い
祇園ー京都駅を結ぶ京都市バス206系統は過剰な混雑を起こします.
H28_市バス_営業係数 | 京都市オープンデータポータルサイト によると1日あたり28,287人が206系統利用します. 206系統は平日,123本のバスが予定されています. 1台で229人もの乗客をさばけるわけもなく,臨時バスがほぼ同じ数走っています.
そんな臨時バスが多少走ったところで206は全く快適なバスではありません. なるべく206に乗りたくない場合,様々な回避方法があります.
まとめ
京大から乗る場合は17系統か4系統を使うことを考えると良いです. 偶然にも,京大快速やHoopが使えるなら乗りましょう.
京都駅前から乗る場合は
- 4系統と17系統(と205系統)の乗り場(A2)から来たバスに乗り込む.→急ぎならこれが最速&健全
- 206系統の乗り場(D2)から臨時バスに期待して1本見逃す.→座れるが混雑は避けられない
- 京阪の七条駅まで歩く.→確実だが疲れる.
のどれかの戦略を取るのがおすすめです.
以下はおすすめ順に紹介していきます.
17系統 (百万遍ー京都駅) 230円 25分
錦林車庫前ー…ー京大農学部前ー百万遍ー出町柳駅前ー…ー京都駅前
6,513人/日でそれなりの快適さがあります.
4系統 (出町柳駅前ー京都駅) 230円 25分
こちらも7,297人/日でそれなりの快適さがあります
京大快速(百万遍ー京都駅) 230円 25分 (2020年3月19日廃止)
追記: 廃止されます. 京都市交通局:【令和2年3月スタート!】市バス新ダイヤ
出町柳駅前ー百万遍ー京大正門前ー京大病院前ー京都市役所前駅ー烏丸御池ー四条烏丸ー京都駅前
平日しか走っておらず,また意外と混み合っている路線です.
Hoop 25分 (京都大学前ー京都駅八条口)230円
京大病院前ー京都大学前ー河原町御池ー四条烏丸ー京都駅八条口 (帰りは四条河原町経由)
- 平日 約30分間隔 夜なし
- 土曜祝日 約30分間隔 朝夜なし
休日も午後から走っています. 東大路通を北へ走るため,停留所の場所が難しいです.
また,京都駅も八条口側につくので注意が必要です.
1日乗車券が使えません.
京阪 (出町柳ー七条 & 徒歩1km) 270円 7分+1km
1km歩くことが苦でないならばおすすめです.
地下鉄 (徒歩2km & 今出川ー京都) 260円 9分+2km
意外にも京阪に比べてこちらのほうが10円安いです.
今出川通バス & 地下鉄 (百万遍ー今出川乗り換えー京都)490円(370円) 20分
今出川通の徒歩2kmをバスに乗る戦略です. おそらく最速。ただし、コストが高い. 乗継割引の働くトラフィカやICの場合は370円になります.
京阪&奈良線 (出町柳ー東福寺乗り換えー京都駅) 270円+α
京都市内のJR切符を持っている場合は有効な手段です. ただし,奈良線が10分から12分間隔のため,意外と乗り換えに時間がかかることが多いです.
205系統 (河原町今出川ー京都駅) 230円 30分
これは市バスで最も乗客の多いバス.34,888人/日. 206と同様におすすめできないです.
ちなみに市バスは昼間割引共通回数券をバラ売りしている自販機の存在を使えうことで、ちょっと安くなります。 トラフィカも10%還元なのでお得です。
タクシー 2000円 20分
4人で乗ると1人500円なので, 悪い選択肢ではないですね。