Ruby on Rails チュートリアル 第12章をやったメモ

Ruby on Rails チュートリアル:実例を使って Rails を学ぼうRails 5.1(第4版)

12章はパスワードを忘れたときのためにメールで再設定できるようにする。

モチベーションが結構つらくなってきたのでさくっと終わらせた。 11章に引き続き、まだ本番環境でメールの送信ができてない。


Ruby on Rails チュートリアル 第11章をやったメモ

Ruby on Rails チュートリアル:実例を使って Rails を学ぼうRails 5.1(第4版)

11章はアカウントを有効化するためのメールを送れるようにする。

  • 11.3.2
    • できないと思ったら、authenticated?をミスっていた。
 def authenticated?(attribute, token)
    digest = send("#{attribute}_digest")
    return false if digest.nil?    # remember_digestのままになっていた
    BCrypt::Password.new(digest).is_password?(token)
  end
  • 11.3.3

    • &&演算子の方がandよりも優先順位が高い
      • 括弧つけたほうが良いように見える
  • 11.4

    • クレジットカードを登録したのにアプリケーションにアドオンを追加するのができなかった
      • address is not permitted to install ~~みたいなことを言われた
    • クレカ登録し直してみるかと思って、いったんリムーブしたら次に登録するには2/1まで待たないといけないらしい…

9keyビルドログ

9keyを作りました

9key: qmk_firmware/keyboards/9key at master · qmk/qmk_firmware

デフォルトのキーマップは以下のようになっています。

/* LAYER 0
 * ,-----------------------.
 * |   1   |   2   |   3   |
 * |-------+-------+-------|
 * |   4   | 5/ENT |   6   | Dbl Tap 5 for Enter
 * |-------+-------+-------|
 * |  7/0  |   8   | 9/FN  | 7/0 = Dbl Tap 7 for 0  -  9/FN = Hold 9 for FN
 * `-----------------------'
 */

/* LAYER 1
 * ,-----------------------.
 * |  ESC  |   +   |   -   |
 * |-------+-------+-------|
 * |  BSPC |   *   |   /   |
 * |-------+-------+-------|
 * |  00   |   .   |       |
 * `-----------------------'
 */

5のダブルタップでEnter7のダブルタップで0が入力されます。 また、9キーと同時押しで、演算子やバックスペースも入力できます。

キーボードのダブルタップって今まで使ったことがなかったので新鮮でした。

回路図

f:id:yskoht:20180113172814p:plain
回路図

配線の交差をなくしたかったためROWとpro microの結線を変更しています。

組み立て

ユニバーサル基板に電動ドリルで穴を開けて無理やりキースイッチを取り付けています。

スイッチは千石電商でばら売りされているのを買ってきました。

ファームウェア

QMKのkeyboards/9key/config.hを変更して、ピンの順番とダイオードの方向(スキャンする方向)を修正。

diff --git a/keyboards/9key/config.h b/keyboards/9key/config.h
index eee8407..3e03474 100644
--- a/keyboards/9key/config.h
+++ b/keyboards/9key/config.h
@@ -33,7 +33,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define MATRIX_COLS 3
 
 /* 9Key PCB default pin-out */
-#define MATRIX_ROW_PINS { D1, D0, D4 }
+#define MATRIX_ROW_PINS { D4, D0, D1 }
 #define MATRIX_COL_PINS { F4, F5, F6 }
 #define UNUSED_PINS
 
@@ -45,7 +45,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define ws2812_DDRREG   DDRD
 
 /* COL2ROW or ROW2COL */
-#define DIODE_DIRECTION COL2ROW
+#define DIODE_DIRECTION ROW2COL
 
 #define TAPPING_TERM 200

ビルド・書き込み

f:id:yskoht:20180429174714j:plain

書き込みのためにUSBaspを購入しました。

ビルド

$ make 9key:default

書き込み

$ sudo avrdude -p atmega32u4 -c usbasp -e -U flash:w:9key_default.hex

これで無事に動作しました。よかった。

参考

キーマップの変更

今現在、MiSTEL BAROCCO MD600を使っていてDELキーと矢印キーがないのが辛いので、キーマップを以下のように変更しました。

 ,-----------------------.
 |  HOME |  BSCP |  DEL  |
 |-------+-------+-------|
 |  END  |   ↑   |  ENT  |
 |-------+-------+-------|
 |   ←   |   ↓   |   →   |
 `-----------------------'

参考

ROW_PINS, COL_PINSについてのメモ

以下、QMKのピンの指定方法について自分用のメモです。

ピンはconfig.hで指定される。

#define MATRIX_ROW_PINS { D4, D0, D1 }
#define MATRIX_COL_PINS { F4, F5, F6 }

このD?F?はコントローラのピンを表していて、pro microの回路図を見ると基板のどのピンに繋がっているのかがわかる。

f:id:yskoht:20180113192530p:plain
https://cdn.sparkfun.com/datasheets/Dev/Arduino/Boards/Pro_Micro_v13b.pdfより引用

D?F?quantum/config_common.hで定義されていて、 例えばD40x94

quantum/matrix.cを見てみると、 MATRIX_ROW_PINS, MATRIX_COL_PINSは それぞれrow_pins, col_pinsに入れられて、 init_rowsの中でピンの初期化をしている。

static void init_rows(void)
{
    for(uint8_t x = 0; x < MATRIX_ROWS; x++) {
        uint8_t pin = row_pins[x];
        _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN
        _SFR_IO8((pin >> 4) + 2) |=  _BV(pin & 0xF); // HI
    }
}

ここで出てくる_SFR_IO8については以下に詳しく書かれている。

pinがD4のとき、以下の動作をしていることになる。

uint8_t pin = 0x94;  // #define D4 0x94
_SFR_IO8(9 + 1) &= ~_BV(4); // IN
_SFR_IO8(9 + 2) |=  _BV(4); // HI

一方、AVRのIOピンは<avr/io.h>で定義されていて、<avr/iom32u4.h>を見てみると以下のように記述されている。

#define DDRD _SFR_IO8(0x0A)
#define PORTD _SFR_IO8(0x0B)

つまり、DDRD &= ~_BV(4);でD4を入力にして、 PORTD |= _BV(4);でプルアップしている。 これなら入門書でよく見る記述なので分かりやすい。

参考

エクスプローラのナビゲーションウィンドウを整理した

環境

やったこと

Ruby on Rails チュートリアル 第10章をやったメモ

Ruby on Rails チュートリアル:実例を使って Rails を学ぼうRails 5.1(第4版)

10章はUsersのedit、update、index、destroyを作る。

  • 10.1.1
  • 10.1.4
    • 10.14のテストが通らない。手動ではうまくいくのに
      • 10.11に@user.reloadが入ってなかった
  • 10.2
    • セキュリティモデル
  • 10.2.1
    • beforeフィルター
  • 10.2.3
  • 10.3.1
    • 演習がつらくなってきた…
      • user_path(@user)edit_user_path(@user)が使える
  • 10.3.2
    • rails db:seedが1回目はうまくいかなかった。何回か試したら出来てた。原因は不明
  • 10.3.3
    • ページネーション
  • 10.3.5
    • <%= render user %>
      • userという名前は関係ない。クラスが重要
    • ぱっと見で何やってんだか分からなくなりそうで怖い

Ruby on Rails チュートリアル 第9章をやったメモ

Ruby on Rails チュートリアル:実例を使って Rails を学ぼうRails 5.1(第4版)

9章は発展的なログイン機構の作成。Cookieを扱う。

app/assets/stylesheets/.sass-cache/
app/assets/stylesheets/custom.css
  • 9.32
    • エラー出てテストが通らないとはまっていたらクラス名を間違っていた
ec2-user:~/environment/sample_app (advanced-login) $ rails test
Running via Spring preloader in process 9228
Started with run options --seed 18715

ERROR["test_current_user_returns_nil_when_remember_digest_is_wrong", SessionHelperTest, 0.593626256000789]
 test_current_user_returns_nil_when_remember_digest_is_wrong#SessionHelperTest (0.59s)
NoMethodError:         NoMethodError: undefined method `remember' for #<SessionHelperTest:0x0000000650a770>
            test/helpers/sessions_helper_test.rb:6:in `setup'         # ^^^^^^^ SessionsじゃなくてSessionになってる

ERROR["test_current_user_returns_right_user_when_session_is_nil", SessionHelperTest, 0.6088529440003185]
 test_current_user_returns_right_user_when_session_is_nil#SessionHelperTest (0.61s)
NoMethodError:         NoMethodError: undefined method `remember' for #<SessionHelperTest:0x0000000648e878>
            test/helpers/sessions_helper_test.rb:6:in `setup'

  28/28: [===============================================================================================================================================================================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.64160s
28 tests, 68 assertions, 0 failures, 2 errors, 0 skips

リーダブルコード第4部を読んだメモ

O'Reilly Japan - リーダブルコード をざっと読んで気になったところのメモ。

第4部は選抜テーマ

14章 テストと読みやすさ

最近のC++では、以下のように配列リテラルをそのまま引数として渡せるようになっている。

CheckScoreBeforeAfter({-5, 1, 4, -99998.7, 3}, {4, 3, 1});

知らなかったので手元でやってみた。

#include <iostream>
#include <vector>
using namespace std;

void f(vector<int> v)
{
  for(size_t i = 0; i < v.size(); i++) {
    cout << v[i] << endl;
  }
}

int main()
{
  f({1, 2, 3});
}
$ g++ -v
組み込み spec を使用しています。
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-pc-cygwin/5.4.0/lto-wrapper.exe
ターゲット: i686-pc-cygwin
configure 設定: (略)
スレッドモデル: posix
gcc バージョン 5.4.0 (GCC)

$ g++ a.cpp -std=c++11 && ./a
1
2
3

おおー。

15章 「分/時間カウンタ」を設計・実装する

最近まともにコードを読んでなかったし、まともなコードも読んでなかったので楽しかった。