Helixの親指拡張を作った
Thumbhelix Rev1
PCBとケースデータを置いていますが、いくつか不具合があります。Rev1を実際に作るのはおすすめしません。参考程度でお願いします。
先行例
既にHelixにトラックポイントを実装されている方がいます。使用感が気になります。
デモ動画
左側の隅に左ボタン、右側の隅に右ボタン、拡張キーにスクロールボタンを割り当てています。
このトラックポイントを使って細かい作業は難しいです。
不具合
凡ミスのまとめです。
PCBの裏表が逆になった
上記写真の左が表で、右が裏になるように設計していたんですが、アクリルプレートとPCBの隙間が無くてマイコンと抵抗がつけられませんでした。
それじゃあ裏表逆にして使おう。ジョイスティックとスイッチはリバーシブルで使えるパターンにしたし、と思ったのですが、スイッチは表面で使う用の配線しかしていませんでした。
さらに、キーのパターンがHelixと逆になってました。使用上は問題ないですが気持ち悪い。
スイッチが入りずらい、行が揃ってない、バックライトLEDがない
KailhロープロファイルスイッチのPCBマウントの足が入らないです(無理に押し込めば入る)。どうやらもう少し穴を大きくすべきだったらしい。
Helixのキーと行を揃えるつもりで設計したのですが、ちょっとだけ下にずれてしまいました。 バックライトLEDはもともとつける予定がなかったのですが、実物を見てみるとそこだけLEDが無いのはやっぱりかっこ悪いですね。
トラックポイントの操作感が悪い
ThinkPadのトラックポイントに比べて動かすときに力が要ります。 これはジョイスティックのデバイス自身の問題なのでどうしようもないですが、 カーソルの速度制御などはソフトで改善できる気がするので頑張りたいです。
実装について
ハードウェア構成
HelixのProMicroがI2Cマスタ、Attiny85がI2Cスレーブです。
スレーブはJoystickの状態をanalogRead()
、スイッチの状態をdigitalRead()
で読み取り、マスタからリクエストがあったら、それぞれの状態をI2Cで返します。
Attiny85にはICSPでプログラムをアップロードします。
パーツリスト
部品 | メーカー名 | 定数・型番 | 個数 | 備考 |
---|---|---|---|---|
抵抗 | - | 4.7k | 2 | リード付き・1/6W。I2Cプルアップ用 |
抵抗 | - | 10k | 1 | 3216チップサイズ抵抗。SWプルアップ用 |
マイコン | Atmel | ATtiny85-20SUR | 1 | Atmel ATtiny25, ATtiny45, ATtiny85 Datasheet |
ジョイスティック | Top-Up Industry Corporation | JT8P-3.2T-B10K-1-16Y | 1 | TOP-UP INDUSTRY CORP. -- JT8P-3.2T 秋月電子:JT8P-3.2T- -1-16Y Model (1) |
ジョイスティック用キャップ | - | - | 1 | 今回はWholesale Product Snapshot Product name is for 3D analog joystick cap for PSP 2000 PSP 3000 thumbsticks thumb sticks capを加工して使用 |
スイッチ | Kailh | PG1350-* | 1 | CherryMX互換スイッチも可 |
PCB | - | - | 1 | thumbhelix_device/rev1/pcb at master · yskoht/thumbhelix_device |
アクリルプレート | - | - | ボトム・トップ各1 | thumbhelix_device/rev1/case at master · yskoht/thumbhelix_device Kailh Low Profileの場合、厚さは1.5mm~2.0mmが適 |
ネジ・ナット・ワッシャー | - | M2 | - | Kailh Low Profileの場合は10mmネジが適 |
ゴム足 | - | - | - | - |
マイコン、ジョイスティックは秋月電子通商で購入しました。 ジョイスティック用のキャップはAliExpress.comで"PSP joystick cap"等で検索すると見つかります。ただし、少し削らないとはまりません。
PCBの作成
以下のページと書籍を参考にKicadで作ってALLPCB.comに発注しました。
- KiCadの回路記号&フットプリントを作る方法|一日体験!プロの基板作り|記事サポート | トランジスタ技術
- KiCADーライブラリへの部品の追加
- 【KiCAD】回路図における新規部品の作り方 - KiCADで基板設計
- ATtiny85を利用したLEDランプ基板の作製(6)〜回路図作成4(フットプリントの割り当て)〜 : KiCadで基板を作る
- KiCadでのフットプリントライブラリ新規作成方法 : KiCadで基板を作る
- KiCad Pcbnew 各レイヤの役割 - uchan note
Order Timeが2018/4/8 23:42:50でFlow Progressが以下でした。
おおー pic.twitter.com/plo1SFFbpr
— yskoht (@_yskoht) 2018年4月16日
アクリルケースの作成
大量ならオンラインで発注、少量・短TATならコワーキングスペーススペースに材料を持ち込み、と使い分けられるようにいろいろ経験したかったので、今回はPonokoとcoromozaの2か所にお願いすることにしました。
加工のためのデータはPonokoとcoromozaで異なるので2種類のデータを作る必要があります。
Ponoko用.svgの作成
GUIでポチポチやるのは面倒だと思ったので、Pythonのsvgwriteライブラリで作りました。
- svgwrite.Drawing Python Example
- Setting default units in svg (Python svgwrite) - Stack Overflow
- svgwrite Documentation
スクリプトはこんな感じになりました。生成されたSVGをInkscapeのテンプレートに張り付けてアップロードしました。
stroke
, stroke_width
, stroke_opacity
, fill
あたりは当然として、stroke_miterlimit
, stroke_dasharray
も適切に設定しないとPonokoにアップロードできないっぽいです。
coromoza用.aiの作成
coromozaのデータ形式はIllustraor形式なので.svg
を.ai
に変換します。
Illustratorは持っていなかったので、Illustratorが使えるPCをkinko'sでレンタルすることにしました。
店頭のPCでゼロからデータを作るのは大変だと思いますが、.svg
を.ai
に変換して線の色を変える程度であれば20分で十分でした。
どちらの加工も思った通りにできてよかったです。
スレーブ側ソフトウェア
ATtiny85のソフト作成にはATTinyCoreを使用しました。Arduino IDEと既存のライブラリを利用できるので簡単でした。
送信データはアライン詰めれば3Byteで十分ですが、シンプルにしたかったので5Byte送っています。
マスター側ソフトウェア
I2Cマスタ
マスター側は LUFAのTWIライブラリを使っています。
スレーブにリクエストを送り、データを読みだすところはこんな感じになっています。サンプルのまんまですね。
void th_read(Thumbhelix *th) { if(TWI_StartTransmission((THUMBHELIX_ADDR << 1) | TWI_ADDRESS_READ, 20) == TWI_ERROR_NoError) { uint8_t byte1, byte2, byte3, byte4, byte5; TWI_ReceiveByte(&byte1, false); TWI_ReceiveByte(&byte2, false); TWI_ReceiveByte(&byte3, false); TWI_ReceiveByte(&byte4, false); TWI_ReceiveByte(&byte5, true); TWI_StopTransmission(); ...
Pointing Device
読みだした値からQMK FirmwareのPointing Deviceを使ってカーソル移動、スクロール、クリックを行っています。
‘mouseReport.buttons‘は3bitから5bitを使うと書いてありますが、MSBが0bitです。
当初、マウスボタンのエミュレートにはQmkFirmwareのMouse Keysを使おうと思ったのですが、
Pointing DeviceとMouse Keysを両方有効にするとそれぞれでhost_mouse_send()
が呼ばれてしまい、
Mouse Keysでのドラッグが出来ませんでした1。
結局はプログラムをシンプルにしたかったのと、バイナリサイズがきつかったので結局Pointing Deviceのみを使うようにしています。
Makefileについて
qmk_firmware/users
以下にThumbhelixのファームを置くようにしました。使い方あってるのか謎です。
rules.mk
のinclude
をコメントアウトすれば無効にできます。
写真
感想
Helix ビルドログ
Helix を作りました
- Helix キーボードキット | 遊舎工房 SHOP(通販ページ)
- Helix: qmk_firmware/keyboards/helix at master · qmk/qmk_firmware(ファームウェア)
- MakotoKurauchi/helix: A compact split ortholinear keyboard.(ビルドガイド、ツール、PCBデータ等)
運よく、2018/3/6にあったHelixの一般販売でステンレス5行版キットを購入することが出来ました。
公式のビルドガイド(helix/buildguide_jp.md)を見ながら順に作成しました。
それから、以下の動画内でHelixの作成風景が紹介されています(16:10頃から)。これがとても参考になりました。
作成風景
いくつかの作業だけ写真を載せておきます。
ダイオードの実装
SMDダイオードのはんだ付けは初めてでした。こて先は白光 こて先 1C型 T18-C1を使いました。
バックライトLEDの実装
— yskoht (@_yskoht) 2018年3月18日
ビルドガイドには220℃と書かれていますが、はんだが全然溶けなかったので270℃弱くらいで短時間を意識してはんだ付けしました。
TwitterでLED実装に関してアドバイスをいただきました(ありがとうございます)。この治具は、おそらく基板の裏から添えることで、はんだ付けする際にLEDが穴の下に落ちてしまうのを防ぐためのものだと思います。基板の個体差に依ると思うのですが、自分の基板はわりとLEDの大きさぴったりだったので、ポリミイドテープで止めておくだけで十分でしたが、LEDがポロポロ落ちて困るといったときはあると便利かもしれません。
治具作ってから始めることをお勧めします。https://t.co/vPXtfDjWTn
— m.tei / ishii (@mtei) 2018年3月18日
Pro Microのはんだ付けまで終わった時点でLEDのテストをしました。 以下のKeymapを使うことで簡単にテストすることができました。
— yskoht (@_yskoht) 2018年3月18日
キースイッチの実装
「ロープロファイルスイッチも使いたいし、CherryMX互換スイッチも使いたいなー」みたい優柔不断なことを考えていたところ、Twitterで以下の記事を教えていただき、Mill-Maxソケットというものを知りました。
ただ、このソケットはロープロファイル用の穴には入らないんですね。(これは完全に自分が確認しなかったのが悪いです。@nillpoさん、こちらこそお騒がせしてすみません。)
ロープロ用の穴ちょっとだけ小さいのか!(Mill-Maxのソケット入らない pic.twitter.com/0OFc6vOPwn
— yskoht (@_yskoht) 2018年3月18日
ということで、今回はKailhロープロファイルスイッチの茶軸をPCB直に実装することにしました。
ファームウェアビルド
以下の記事にファームウエアの設定ファイルについて書かれていますが、自分も設定ファイルを間違えてRGBLIGHT_ENABLE = yes
してるのにLEDつかないなーと少し悩みました。この記事に出会えてよかったです。
オーディオケーブル
いくつかオーディオケーブルを試しましたが、相性が結構あるらしく、キーが反応しないケーブルやバックライトLEDがつかないケーブルがありました。おかしいなと思ったら、いくつか試してみるのがいいのかもしれません。
完成
開始から10時間かかりました。
キーマップ
感想
- PCBの緻密さがかっこいい、シルクのデザインがかっこいい
- バックライトLEDかっこいい、OLEDかっこいい
- ステンレスプレートの重厚感、しっかり感がめちゃめちゃいい
- ロープロファイルスイッチかっこいい。ただ自分は平面のキーキャップよりはアールがかかったキーキャップのほうが好きかも
- 下段7キーあるの便利
- はんだ付けは少し大変
- 1回の通販でほとんどのパーツが全部集まるのすごい
ErgoDox EZを買った
ずいぶん時間が経ってしまったのですが、ErgoDox EZについて書いておこうと思います。
注文
2018/1/1にergodox-ez.comで注文しました。構成は以下です。
- 1x Tilt/Tent Kit - White for $25.00 each
- 1x The Wing: Custom ErgoDox EZ Wrist Rest - White for $30.00 each
- 1x ErgoDox EZ Original Standalone - Blank / White / Cherry MX Silent Red for $240.00 - Shipping : $30.00 USD
総額は$325.00 USDでした。
受け取り
2018/1/20に到着しました。
yeah! pic.twitter.com/2WjJiKO0ju
— yskoht (@_yskoht) 2018年1月20日
カスタマイズ
キーキャップの交換
真っ白は味気なかったのでKBDfansでキーキャップを買い、既に持っていたキャップと混ぜて使いました。
キー刻印も欲しくなったのでBAROCCO MD600のキーキャップを外して付けました。
キースイッチの交換
キースイッチはCherry赤軸のサイレントで注文しました。使ってみると軽いタッチ感でとても静かにタイピングできるのはとても良かったのですが、クリック感のないリニア軸なのでどこで入力されたのかが分かりずらく、キーの底まで力を入れて叩いてしまい指が痛くなってしまうので交換することにしました。
公式サイトを見てみると、2018年の1月からCIY featureがデフォルトで組み込まれたそうなので、付属のKeycap pullerを使って簡単に取り外せました。
代わりに使うスイッチはTALP KEYBOARDでGateronの茶軸を購入しました。
さすがにGateron茶軸は赤軸サイレントに比べればタイピング音が大きいので、職場で使うのは断念しましたが、好みの打鍵感になりました。
キーマップのカスタマイズ
こんな感じで落ち着いています。下段と親指周りのキーがうまく活用できていない感があります。
感想
- BAROCCO MD600やLet's splitでは右手側
B
キーを割り当てる余裕がなかったのですが、Ergodoxはキーが多くて良いです。ただ少し大きすぎる感があり、机の上を圧迫します - 親指付近のキーはホームポジションから遠いのでほとんど使えてないです
- キーキャップのカスタマイズは楽しいですが、必要なのが1u, 1.5u. 2uで集めるのが少し大変かもしれません
QMK Firmwareのkeymap.cからアスキーアートを出力するスクリプトを作った
Keymapviz
Keymapviz: https://github.com/yskoht/keymapviz
導入
Python3で動きます。
$ pip3 install keymapviz
使い方
レイヤーごとにアスキーアートを出力します。ファイルパスにキーボードの文字列があればそこからキーボードを特定します。
現状はergodox(ergodox_ez)
とlets_split
にしか対応していませんが…
以下のキーボードレイアウトに対応しました。(2018/08/01)
- crkbd
- ergo42
- ergodash
- ergodox_ez(ergodox)
- fortitude60
- helix
- lets_split
$ keymapviz.py qmk_firmware/keyboards/ergodox_ez/keymaps/default/keymap.c /* * * .---------------------------------------------. .---------------------------------------------. * | EQL | 1 | 2 | 3 | 4 | 5 | LEFT | ! RGHT | 6 | 7 | 8 | 9 | 0 | MINS | * !-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------! * | DELT | Q | W | E | R | T |TG(SYMB| !TG(SYMB| Y | U | I | O | P | BSLS | * !-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------! * | BSPC | A | S | D | F | G |-------! !-------! H | J | K | L |LT(MD|GUI_T(K| * !-------+-----+-----+-----x-----x-----!ALL_T(K! !MEH_T(K!-----x-----x-----+-----+-----+-------! * | LSFT |CTL_T| X | C | V | B | | ! | N | M |COMM | DOT |CTL_T| RSFT | * '-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------' * |LT(SYM|QUOT |LALT(|LEFT |RGHT | ! UP |DOWN |LBRC |RBRC | FN1 | * '------------------------------' '------------------------------' * .---------------. .---------------. * |ALT_T(K| LGUI | ! LALT |CTL_T(K| * .-------+-------+-------! !-------+-------+-------. * ! SPC ! BSPC | HOME | ! PGUP | TAB ! ENT ! * ! ! !-------! !-------! ! ! * | | | END | ! PGDN | | | * '-----------------------' '-----------------------' */ (以下略)
Keyboard Layout Editorで使えるjsonファイルも出力できます。
-o
で指定されたファイル名に含まれる{}
が添え字に置換されてレイヤーごとにファイルになります。
$ keymapviz.py qmk_firmware/keyboards/lets_split/keymaps/default/keymap.c -t json -o 'lets_split{}.json' $ ls lets_split*.json lets_split0.json lets_split1.json lets_split2.json lets_split3.json lets_split4.json lets_split5.json
このjsonをKeyboard Layout Editorにアップロードします。
すると以下のような感じで画像にしてくれます。
QMK FirmwareのKeycodesと凡例の関係はlegends.py
で変更できます。
この辞書に書いていないものは接頭辞のKC_
を取り除いたものになります。
legends = { 'XXXXXXX': '', '_______': '', 'KC_TRNS': '', 'KC_NO': '', 'LCTL(KC_Z)': 'UNDO', 'LCTL(KC_Y)': 'REDO', 'LCTL(KC_C)': 'COPY', 'LCTL(KC_V)': 'PASTE', 'LCTL(KC_X)': 'CUT', 'KC_PSCREEN': 'PSc', # (以下略) }
感想
keymap.c
を絵にするんじゃなくてKeyboard Layout Editorからkeymap.c
を作れるようにすべきだったのかもしれない- ergodoxだとそういうツールあったりするけど
- 結局アスキーアートだすのもjson出すのもテンプレートを作っておかないといけないのがめんどくさい
MATRIX_ROWS
,MATRIX_COLS
があるんだから自動でいい感じのレイアウトを作れるのかもしれない
keymapviz.py
自体がpngやらjpegやらを作るわけでもないのにvizと名付けたのは大仰だったかもしれない
Ruby on Rails チュートリアル 第14章をやったメモ
Ruby on Rails チュートリアル:実例を使って Rails を学ぼうのRails 5.1(第4版)
14章はユーザーのフォロー。
- 気合で終わらさせた。特に詰まったところはなかった。
- 11章でできなかったherokuでのメール送信のためにSendGridのインストールを試したけどできなかったので、サポートにチケット出した
- スパム認定されてブロックされていたらしい。アンブロックしてもらって、すんなりインストールできた
感想
rails test
でfailureした時の絶望がすごい- たいていはタイポか、編集するファイルが間違っていたかだったけど
- 最初は全部コピペでよいかもしれない。ホントに必要になったらもう一回やればいいわけですし
- Rails, AWS, Heroku一通り触れてよかった
- 演習の解答をまとめてくれてるサイトがありがたかった。理解が深まった
- やり遂げるためのモチベーションが辛い
- このブログにメモを書いていたから最後までできたと思う。メモの内容が他の人の役に立つかどうかはさておき
- Ruby on Rails チュートリアル 第1章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第2章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第3章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第4章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第5章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第6章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第7章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第8章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第9章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第10章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第11章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第12章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第13章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第14章をやったメモ - yskohtの日記
Let's split ビルドログ
Let's split を作りました
Let's split: qmk_firmware/keyboards/lets_split at master · qmk/qmk_firmware
今回はRGB Underglowなし、リセットスイッチなしで作りました。
ケースはサンドイッチプレート1です。サンドイッチプレートでも強度の面で 特に不安は感じませんが、どうせならv2-case2で作れば良かったかなとも思います。
参考にしたビルドログ
作成にあたって以下の記事を参考にさせていただきました。
- nicinabox/lets-split-guide: This guide covers building a Let's Split v2
- 格子配列で左右分離型の超コンパクトなキーボード "Let's Split" を組み立てたよ - Voxel Highway
- やぎ小屋 | Let's Split(レツプリ)を組み立てた
- Let's Split を組み立てた話 | 遊舎工房
いくつかの些細なこと
上記のビルドログを参考に組み立てればなんの問題もないのですが、 いくつかの些細なことを確認しておくとトラブルを回避できるかもしれません。
pro micro の動作確認
pro micro は初期不良があったりするらしいので、組み立て前に書き込みできるか確認しておきました。
書き込み確認中 pic.twitter.com/N2L3fVEwmB
— yskoht (@_yskoht) 2018年2月3日
pro micro のモゲ対策1
USBケーブルの抜き差しによりpro micro側の端子が取れてしまうことがあるようなので、取り付け前にグルーガンで端子の両側を補強しておきました。
スペーサが入らない…
今回使ったパーツだけの問題だったのかもしれませんが、pro microの隣にスペーサを取り付ける際にアクリル側の穴とPCBの穴の中心がずれていたので、自分が用意した厚みのあるスペーサは取り付けられませんでした。なのでここだけ家にあった別のスペーサを使ってナットで固定しています。事前に注意しておくと焦らずに済むかもしれません。
pro micro のモゲ対策2
モゲ対策にマグネットで取り外しできるケーブルを買いました。このケーブルのマグネット部分は上下を逆にしても取り付けできるようになっているのですが、どちらか一方はデータ通信はできないようです(充電は上下どちらでもできる)。それから、Let's splitのdefaultのキーマップでは左手側にケーブルを刺さないとキーマップが左右反転したようになってしまうみたいです。公式ビルドログのトラブルシューティングに似たようなことが書かれていました。
ダイオードのつけ忘れ
レツプリのキーが1つ反応しないなと思っていたら、ダイオード1つ付け忘れていた pic.twitter.com/hSJE8q5fdT
— yskoht (@_yskoht) 2018年2月10日
作り終えた後にキーマップをいじっていると、反応しないキーが1つありました。 最初はファームを疑っていたのですが、defaultのキーマップでも反応しないので、 どうもHWが問題っぽく、基板をよく見てみるとダイオードを1つ付け忘れていました。 Let's split では48のダイオードを使うので、事前に数えてからつけ始めれば防げるミスでした。 付け忘れたダイオードは他のダイオードとは別の面に実装することになってしまい、少しかっこ悪いのですが無事に動作しました。
キーマップ
ほどんどdefaultのままです。配列沼は深そうなのでこれから変わるかもしれませんが、現状は以下のような感じです。
ESC
をTAB
に変更。TAB
を2回押すとESC
になる(Tap Dance)TAB
はQ
の隣にあってほしいけど、ESC
も左上に欲しい。ESC
を押すときは大体2回ぐらい叩いている気がするので問題ないけど、TAB
を連打できないのは辛いかもしれない
A
の隣はCtrl
- Emacsのため
- 左手下段は
Adjust
を削除。Space
をShift
に置き換え。どうやら自分は右手親指でしかSpace
を押さないらしい- 左手親指の
Shift
はかな/英字切り替えをShift
+Space
に割り当てているため
- 左手親指の
Enter
キーはタップでEnter
、ホールドでShift
Enter
の押しっぱなしができなくなるけど連打でカバー
- Lowerレイヤー, Raiseレイヤーはdefaultのまま
あと、なぜかKC_LALT
でGUIキーと認識されていて、KC_GUI
が’Altキーと認識されているっぽい?これは自分の環境のせいだと思うけど…
写真
Ruby on Rails チュートリアル 第13章をやったメモ
Ruby on Rails チュートリアル:実例を使って Rails を学ぼうのRails 5.1(第4版)
13章はマイクロポストの実装。
- 13.1.3:
user.microposts
でUserのマイクロポストの集合を返す- この機構すごい強力だなと思った
- 13.2.2
- 13.4.1
PictureUploader
がNameError
になる。以下で解決した
- 13.4.4 の本番環境での画像アップロードはスキップ
- Ruby on Rails チュートリアル 第1章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第2章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第3章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第4章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第5章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第6章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第7章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第8章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第9章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第10章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第11章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第12章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第13章をやったメモ - yskohtの日記
- Ruby on Rails チュートリアル 第14章をやったメモ - yskohtの日記