wassup?

新ブログ→memo.wass80.xyz

ググり方が難しいシェル(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がスワップします。

履歴検索

debian6しか使えなくてapt-getもできなくてhttpsができない日の対策

悲しいが,SSLを無効化するしかない…

wgetSSL無効化というかこれは証明書の無視ですね。 あとで気づいた。

$ echo "check_certificate = off" >> ~/.wgetrc

git clone https://~がコケるので,git@github.comに書き換える

url."git@github.com:".insteadOf https://github.com/

まあこれでもだめならOpenSSLをビルドするほうが健全ですね

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を実行するアプリケーションを作る。

f:id:wass80:20190508153836p:plain

$ open /usr/local/Cellar/emacs-plus/26.2/Emacs.app $@

そして,作ったアプリケーションをApplicationsに保存する。

参考: macos - Can I make a symlink (to a .app folder) in Applications directory show up in spotlight? - Ask Different

ついでに,IconがAutomatorだとキモいので置き換える。

「情報を見る」のウインドウのアイコンはCommand+C/Vでコピペできる。まじかよ。

f:id:wass80:20190508154007p:plain

参考: Can I change the application icon of an Automator script? - Ask Different

バージョン: macOS 10.13.6(17G5019)

mRubyの動くLED時計をESP32で作る [後編]

f:id:wass80:20190502132250p:plain

wass80.hateblo.jp

の後編です。

mRubyで時計のプログラムを書けるようにする

といっても,もくもくとAPIを実装するだけです。

用意したAPIはこれだけあります。

github.com

こういうプログラムを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を選んでしまった。
    • 入れた日本語フォントがJISコードでの文字対応だったのでこのエンコードを選んだが,めんどくさいエンコードだった。
  • 最初 Led::flushLed::flash になっていた
  • なぜ整数の割り算 3/2が小数1.5に評価されてしまうんだろう…。ここでRubyとの非互換性ができてしまった歴史的経緯が知りたい。

部員が作ってくれたプログラムたち

この他にも様々プログラムを書いてもらえました。

現在のデフォルトの時計は,室内気温や天気の表示を行うものになっています。

室内気温の情報は昔に作ったこのシステムの情報を使っています。

wass80.hateblo.jp

感想

  • ESP32を扱うのはサンプルコードが豊富なので割と簡単。
  • はんだ付けとか実装のほうが難しい。
  • 実際に動くものができるのは楽しいので良いですね。
  • Exploitがめっちゃ簡単にできそうなコードをCだと書いてしまうので,安全なIoT開発手法はもっとほしい…
    • RustでESP32開発とかできたらいいんですが,まだLLVM backendがないんですよね。ほしい。

mRubyの動くLED時計をESP32で作る [前編]

マトリックスLEDでスマート時計を作る - Google スライド

作ったもの

  • LEDmatrixの時計
  • NTP時刻取得
  • HTTP GETで情報を受けられる
  • mRubyのプログラムをGETで入力できる

概要

LED matrix

f:id:wass80:20190430144912p:plain

  • KP-3232D
  • 32x32の3色LED
  • 合計3072個のLED
  • 4860円 つまり大体1LEDにつき1.5円

この16pinで入力する。

f:id:wass80:20190430145027p:plain

  • 横1列の点灯状態+点灯させる列を入力にとり光る。
  • 一度に1列しか光らないので,順次点灯させる。

これの制御にESP32をつないだ.

f:id:wass80:20190430145248p:plain

届いたその日に動いた。

f:id:wass80:20190430145310p:plain

木枠を作った。

f:id:wass80:20190430145540p:plain

きれい。

f:id:wass80:20190430145554p:plain

カラフルに光らせるために,高速で点滅するラインの中で何回光らせるかで制御している。

現在は8階調。人間の目で見える実態は4階調ぐらい?

フルカラーで光らせるためにはFPGAでゴリゴリ実装する必要がありますね…。

時計実装

ESP32のプログラムはこれ:

github.com

C言語をLinterも入れずに書いてしまったので,おそらく脆弱性が多量に含まれている. HTTPサーバーの部分が特に脆弱である可能性が高い.

NTP時刻取得

時計なのでsntpで時刻を取ってくるようにした。 wifiのサンプルコードとsntpのサンプルコードを持ってこれば動く。

ただ時々時刻がずれるので自動修正のコードを入れている。 はずだがまだ時々突然1時間以上ずれる。

HTTP GET

外からメッセージやプログラムを書き込むために使用。

slack botから文字列を入れると時計に表示される。

f:id:wass80:20190430150222p:plain

「八木までの各駅と、田原本新祝園、新田辺、大久保、桃山御陵前丹波橋に止まります。」みたいな文字列も流せて楽しい。

mRuby編

→ 後編: 楽しい時計プログラム編。

wass80.hateblo.jp

京大から京都駅までの移動で地獄の市バス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日廃止)

f:id:wass80:20190402182432p:plain

追記: 廃止されます. 京都市交通局:【令和2年3月スタート!】市バス新ダイヤ

出町柳駅前ー百万遍ー京大正門前ー京大病院前ー京都市役所前駅烏丸御池四条烏丸ー京都駅前

平日しか走っておらず,また意外と混み合っている路線です.

Hoop 25分 (京都大学前ー京都駅八条口)230円

f:id:wass80:20190402182920p:plain

京大病院前ー京都大学前ー河原町御池ー四条烏丸ー京都駅八条口 (帰りは四条河原町経由)

休日も午後から走っています. 東大路通を北へ走るため,停留所の場所が難しいです.

f:id:wass80:20190402183543p:plain

また,京都駅も八条口側につくので注意が必要です.

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円なので, 悪い選択肢ではないですね。

短時間、シンプルなルールで遊べるボドゲ5選

ボドゲに触れたことない人向けに、いくつかおすすめします。

マジックメイズ

  • 2-8人 15分 リアルタイム協力ゲーム

f:id:wass80:20190318210547p:plain

仲間と協力して制限時間内に装備品を手に入れて脱出しろ!

  • 協力ゲーム: 全員勝利を目指すゲーム
  • リアルタイム: 手番の概念がない

協力する楽しさがすごい。1プレイごとに貯まる経験値を感じやすく良いバランス。 チームビルディングのネタにおすすめ。

(関連) エスケープ: サイコロをいっぱい振って脱出

(関連)パンデミック: 手番がある協力リソース管理ゲーム

ぶくぶく

  • 3-5人 30分 同時 バッティング

f:id:wass80:20190318210558p:plain

この島は天候によって浮かんだり沈んだり

  • 同時: じゃんけん
  • バッティング: 人と同じ行動をすると悪いことが起こる

1戦目は運が強いかもしれない。 しかし、2戦目は1戦目の隣のプレーヤーの手札で戦う。

(関連)トリックテイク全般: 手番がある

それは俺の魚だ

f:id:wass80:20190318210704p:plain

ライバルを狭い氷上に孤立させ、自分だけしか得られない氷上を作り魚を大量に獲得しよう!

運要素が一切ないので賢い人におすすめ

藪の中

  • 3-4人 20分 推理 ブラフ

f:id:wass80:20190318210715p:plain

殺人事件、三人の容疑者、真相は藪の中、にはならないアブストラクトな推理ゲーム

  • 推理: 人の振る舞いなどから真相を推理しよう
  • ブラフ: 嘘をつく

騙し騙されがわかりやすいゲーム。 取れる行動が2択なのが良い。

(関連)ファブフィブ: ブラフゲーム

ツインイット

f:id:wass80:20190318210727p:plain

同じ絵柄のカードを見つけて誰よりも先に指させ!

同じ絵柄を素早くとるだけという単純なルールだけで人を困惑させる訳のわからない絵柄が魅力的。

(関連)おばけキャッチ: 指定されたものをすばやく掴む