久々にブログ書きます。
というか、勉強会も行ってきたの久しぶりかもしれない。。。
という訳なので、勉強会で取ったメモメモ
(資料はどこかに上がってる)
push通知とかホームスクリーンで出せるようになる
確認用のアプリがあるので、エミュレータで専用のアプリを必要
4.4以上
SliceManager #<= 作れるけどあんまりないと思う
SliceProvider #<= 実装は大体こっち
manifestにproviderタグ
sliceviewで画面
adb shellで動作検証する
初回だけパーミッション確認ある
manifestに書くのはcontentprovider
authoritiesは後々に重要になる
contentprovider(sliceprovider)
sliceactionで起動したいintentとか
動的に更新もできる
Rubykaigi2017に参加してきましたので、メモを共有しておきます
1 2 |
|
Matzによるkeynote
前日のmrknさんが発表されていたPycallについてのworkshop
リポジトリはこちら
docker runをすることで、workshopの内容が出てきます
mtsmfmさんの発表
Aaronさんの発表
tagomorisさんの発表
0xColbyさんの発表
nateberkopecさんの発表
p_ck_さんの発表
スピーカー、スタッフの皆様ありがとうございました
久しぶりな方々ともお会いできて、新たな刺激がありました
印象深いのが型、parser周りの話が多かった印象です
来年は仙台なので、広島よりは都内から近いですね
だいたいのwebサービスにはユーザー登録をしてはじめて使用することが多いと思います
ご多分にもれずに、これから実装しようとしたものでメンバースキルを鑑みるとRailsという形ですすむことになりました。
では、Railsでアプリを書くときに認証系のgemって、今は何が使えるものだろうかということを軽く見てみました。
# ちょっと実装してよと軽く言われるものの困ったものですorz
自分の個人内の観測範囲でよく聞くもの
# provider提供も関係無く書いてますが、話と毛色が違う感あるのでこの後は出てきません
この2つの模様
Currently Sorcery project is not actively maintained.
という文章がREADMEにあった)PR眺める限り、Authlogicは対応させようと頑張っている模様 Sorceryは、ちょっと厳しそうかな(とはいえ、一応動く&issueとPRをあげたら対応自体はしてくれる模様)
changelog見ると、
4.0.0rc1からRails5に対応していました
流石ですね。
# が、多機能で便利でいいのですが癖が強いのとdeviseのレールから外れた瞬間悲惨な目に遭うので避けたいところ
個人的に良さそうかなと思ったのは、monbanですかね。
(ちょっとgithubのスター数が少ないのは気になりますが・・・)
Rails使ってるなぁと思ってみたら、殆どconcern(helper)と初期ロード&設定(railtie&configure)だけだった模様
案外Railsのアップデート影響も少なそうな印象でした。
実装や設定内容を読む限り、拡張の幅も広いので好印象でした
実際、Rails5でカスタム実装してみましたが問題なく認証させることができました
肌感&経験上ですが、認証機能自身はサービスによって独自の仕様、または既存機能との併用となることが多いので
拡張しやすいgemの方が対応のさせやすさ、メンテナンスさせやすいほうがやりやすいかなと思ってます
そういう意味では、(余計な機能が無いという意味で)軽量かつ、拡張可能、機能の置き換え可能なmonbanはいいなと思いました
# ぶっちゃけ、monbanカワイイよってことだけが言いたかったw
]]>たまになんだっけ?ってなるものがあるのでメモしておく
基本的に削除系
普通に作る
1
|
|
別のやり方
1
|
|
マージ済みのものを削除
1
|
|
マージされていないものを強制削除
1
|
|
pushの逆をするだけ
1
|
|
こんな感じで難しくない
1
|
|
オプションを変更するだけで、未マージも見つかる
1
|
|
誰かがリモートブランチが削除したとしても、その前にfetchしていたら自分のローカルブランチには残っているので同期をする
これは、放置しておくとよく忘れるやつ
1
|
|
# ぶっちゃけ、よく忘れる一番最後のだけ書きたかった
]]>界隈の情報を収集しておきたかったので行ってきました
結論的なところを言ってしまうと、
もうプロダクトに放り込んでも良さそうという印象でした
(kobaltやKotolin for JSのようなエコシステムはまだまだですが・・・)
とはいえ、多少は混ぜるな危険(nullとか)もあるようなので
ビジネスロジックやデータクラス(所謂JavaBeanとか)からやり進めたほうがいいかなという感覚です
(swiftでobj-C混ぜて大変なことになったのは、大体一年前の話w)
AndroidだとActivityとかコアなところをやるのではなくロジック周りからかな
# 新規に作る場合、その限りではない
JetBrainsさん、ロードマップ出すぐらいに本気!!
(大したことでは無いが唯一の懸念としてあるとすれば、Androidに限ればGoogle本家のサポートでは無いというところぐらいかな)
期待
機能
まとめ
?:
はエルビス演算子(scalaのgetOrElse)って言うんだよ!リクエストヘッダーの中身を見ようとしたときの備忘録
ヘッダーを利用してゴニョゴニョしてた時とかに使ってましたw
requestで来たhederの一覧を調べる場合、以下のコードをbefore_action
に仕込んでおく
1
|
|
HTTP_ACCEPT
を見たい場合は、以下のコードをbefore_action
に仕込んでおく
(多分このコードはよく使うかも)
1
|
|
Railsで定義されているMIME Typeを観る場合は以下のコードを利用する
以下はjsonに対応したMIME Typeを確認するコード
1 2 |
|
表題のようにsshでX11 Forwardingでコマンドを実行したところ
下記のようなエラーになった
1 2 3 4 5 6 7 |
|
どうやら認可が正しくできていない模様
(GTKのSCREEN系のエラーっぽく見えるところが、ややこしさに拍車かけてると思う・・・)
sudoコマンドを実行する際、Xauthorityを読み込むようにして実行する
(下記では、念の為xauthをインストールしている)
1 2 3 |
|
強引に認可させているので、セキュリティ的に果たしてこれでいいのかという疑問は残りますね
何れにせよ、ローカルネットワーク内で実行するだけなのでこれでいいかなと。
自分の楽曲管理なのですが、以下で行っていました
ここ最近、残念なことにXperiaZ3Compactのイヤホンジャックが故障してしまいました
海外版SIMFree版のため、国内で修理することもできません。
部品を調達してきて、別途修理するか悩みましたがリスクが高い
(ネットで調べる限りだいたい、何かしらミスしたという話が多かったです)
仕方ないのでWALKMANを調達するとして、以下の条件で機種が無いかをしらべました
条件に合致するものであれば・・・
というわけで、機能面でも最新であることたお値段も含めて一番条件に合致するWALKMAN(NW-A25)を新たに新調することとしました
(Fシリーズは別途問題があったようなので却下にしました)
iSyncrで作成したプレイリストは、Android向けに最適化されたもののようなので、そのままではNW-A25では活用することができませんでした
(店頭に通って挙動を確認しました)
症状としては以下のような形です
何故こういう状態が起こるかというと、WALKMANはOSがAndroidではない為、ファイルパスの扱いが異なるようです
なので、改善として以下のようにしてあげれば、プレイリストから楽曲再生ができるようになりました
(こちらも店頭で確認)
変更前
1 2 3 |
|
変更後
1 2 3 |
|
つまり、うまく認識させるためには相互変換できるようなものがあればよいということになります
以下の打算があったので、Groovyでやってみました
が、結局Android上での外部ストレージ周りのファイル操作の挙動が変わってる(DocumentFileを通したファイル作成、変更がスクリプトと相性悪い為)ので
後述のスクリプト処理が活用しづらいのでアプリ内での変換処理は諦めました
なのでコマンドラインツールとして実装&運用する方向としました
(運用できなくなるのが困るので、多少の労力(SDの抜き差し回数が増える)ぐらいなら労力を割いてもいい方向にしました)
少し手間ですが、以下のような形をとりました
/
で始まっている場合、空文字に置換これらを実装したものが以下になります
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
こちらは以下を実装するだけでよいので簡単です
上記を実装したものが以下になります
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
こちらはGroovyのBuilderを実装しているCliBuilder
を活用しました
これは、コマンドラインから実行する際、どちらの変換を実行するかを選択させるようにしたかった為です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
コードみれば非常に簡単なのですが・・・
オプションにw
を付けて実行すると、前述のiSyncrのプレイリストからWALKMAN向けのプレイリストに変換する処理を実施
オプションにi
を付けて実行すると、前述のWALKMAN向けのプレイリストからiSyncrのプレイリストに変換する処理を実施
何もつけなければ、実行方法を表示するようになっています
前提
/Volume/WALKMAN
になるように設定playlist_converter.groovy
とする運用手順
$ groovy playlist_converter.groovy -w
$ groovy playlist_converter.groovy -i
少し煩雑な感じもしますが、手作業でプレイリストを修正するよりも多少マシかなぁと思ってます
(実際に自分は運用できてます)
現在常用のスマホとしてAndroid端末を使っています。
(つい半年前まではiPhoneを使っていました)
端末機としては海外版、XperiaZ3 Compactです。
(昨今の大型化している流れの中軽量かつ音楽プレイヤーとしても優れている機種として選定しました。)
元々iPhoneユーザーかつ環境が全てApple製品で統一されているので、音楽管理もiTunesで行っています。
そういう状況下であったので、iSyncrというアプリでiTunesのプレイリストと端末を同期させて利用していました
どうもXperiaZ3 Compact側のイヤホンジャック(ヘッドホンジャック)が壊れたようで、
音楽プレイヤーとしてはまともには利用できなくなりました
とはいえ、Youtubeを見て修理するのはリスクが高いのと、パーツが個人輸入になるので調達までのハードルが高いので修理方向は諦めました
が、どうも最近のwalkmanでは、microSDを使えプレイリストを少し調整すれば認識できるようなことを聞きつけました
(店頭モックでも、プレイリストを認識し再生可能であることを確認しました)
なので、microSDとの同期はiSyncrに任せ、同期したプレイリストの変更を独自のアプリでやればいいのではないかと思い今回やってみました
まずはiSyncrで作ったプレイリストがウォークマンから認識できるかどうかを確認しました。
結論的に言うとそのままでは不可能で、一旦編集が必要のようです。
どうやらiSyncrを使ってiTunesの曲を転送したときは、iSyncrの作ったm3uプレイリストを正しく認識出来ないようです
これは、ウォークマン側のプレイリスト内のパスの解釈の問題のようです。
対処方法としては、パスの先頭の「/」を削除することで認識させることできます
(ウォークマン内部では、パスが補完されているのかもしれませんがその辺りは不明です)
こんな感じになるようにします
1 2 |
|
ということで実装としてやりたいことは至ってシンプルです
Javaで書くと、以下の内容が面倒だったりするわけなのです
なので、今回その辺もサクッと実装できるGroovyで書いてみました
他にあるとすれば・・・
やりたいことを実施するファイルの置換用コードは以下のようになります
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
本当であれば上書き保存という形にしたいところですが、
元のファイルが無くなってしまうと今度は同期が取れなくなる可能性があるので別ファイルとしました
まずはGroovyのインストールをします。
以下のような形でsdkmanを使いましょう
1 2 3 4 |
|
次にAndroidStudioでAndoridプロジェクトを用意します
Androidプロジェクトに対して、groovy-android-gradle-pluginを導入します
プロジェクトROOTにあるbuild.gradleを以下のようにします
(プラグインを導入するのみです)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
次にアプリ側のbuild.gradleを変更します
(プラグインの適用と、コンパイルライブラリの追加、プラグインの設定追加)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
ソースの配置を「src/main/java/MainActivity.java」
から「src/main/groovy/MainActivity.groovy」
変更します
最後にソースを以下のようにしてGroovyライクに実装します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
一応いっておきますが、@CompileStaticアノテーションで静的コンパイルしなくても動作はします
が、動的コードはパフォーマンス的にきびしいので@CompileStatic推奨されているようです
Android Studioでビルドを実行したとき、エラーがあった場合以下のような形でEventLogに出力されてビルドが停止します。
メッセージを見ても、何が悪いか分かりません。正直、自分は困惑しました
1 2 3 4 5 6 7 |
|
そのときはGradle Consoleを確認しましょう
以下のような形でエラーメッセージが表示されています
(この場合、Syntaxエラーですね)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
因みに上記のような形になった場合、何故かそのままではビルドの再開が出来ませんでした。
対応としては一度「Clean Project」を実行する必要があります
ここまで読めば、分かる方はわかりますが実現はサクッとは出来ませんでした。
何故かと言うとAndroid4.4あたりから導入されたStorage Access Frameworkのことをスッカリ忘れていたのでやりたいことは出来ませんでしたorz
当初の運用自体は、iSyncrの同期先をSDカードにしてSDカードに対して同期
その後同期されたSDカードをPC側にマウントして、上記コードを通してやればよいので無理にAndroid経由させなくていいかなぁと思った次第です
とはいえGroovyでAndroidアプリを書いてみることはまぁできたのでよしとします。
GroovyでGroovy GDKの便利なAPIやクロージャの恩恵を最大限に受けてて、簡潔に書くことが出来て素晴らしいなと思いました
OMRというランタイム
調査はこれを使っていた模様 https://www.ibm.com/developerworks/jp/java/library/j-ibmtools5/
allocationを早くした
可変長のバッファを作る OMRのランタイム上で動作するGCがMRIに比べてよかった
GCのmark速度は早い(MRI)
OMR GCを確認するのはこれ https://github.com/rubyomr-preview/rubyomr-preview
method aliasとかモンキーパッチだと元の動きの振る舞いが全体に影響するからよくない
assertとかの振る舞いもかわってしまう
refinementsなら影響範囲を制御できる
スコープは働くので継承とかcalss_evalでも有効
文字列で与えたもので使えるeval ‘using SomeClass; hoge.fuga’みたいな感じなの
Thread#status スレッドの状態が取れないような状況が起きた →mission crtalなシステムでも使えるThreadの使い方
Ruby2.2.3でも早くなったけど、CPU負荷も上がった 実行回数は変わらなかった
raiseのインスタンスは重い メモリ消費は少ない selectで対応することができる
早くなったけど、リソース消費も多いのでスレッドとかはメモリ消費量を意識したほうがよい
デザインパターン
プラグインのバージョンコントロール(依存ライブラリのコンフリクト解消)
fluentdは動的にpluguin emblukは組み合わせ
アクター
破綻の予兆
RubyKaigi2日目に参加してきました。
気になるセッションもチラホラあり期待していました
ただ、盛大に寝坊しましたorz
という訳で、メモ
ミドルウェア * データ処理をする上でスループットが重要 * 一度書いたものはそのまま運用されるので、固めにつくることが多い
集めてくるところとか、加工整形した結果などは固くつくる必要はない (書捨ても多いから)
要素
キューとワーカーの話
perfedtsched(スケジューラー) →SPOFのないcrontabと思えばよい →1回も実行されないよりも2回実行されたほうがよい(別途担保が必要だが・・・)
リトライ可能かは、状況やエラー内容による 実行時間 jobの実行内容が重いものやら軽いものまで
perfectqueue(キュー)
パフォーマンスコントロールとかでジョブ実行を制御している 安全側に倒している(顧客情報のisolationとか)
何故Rubyを使っているか
スケジューラーとキュー気になる
京大マイコンクラブで事例
Windowsの環境が殆どなので以下を実行するようにした
インストールして終わりぐらいの単純なものがよい
プログラム未経験の参加者の8割が大体できる →やる気に繋がる →自信によって自分が勉強する
考察してみる
plmruby zombodb
postgresql fdl
holycorn
Rhebok
使いドコロ
使えないところ
性能
Rack
パフォーマンス上げる
timeoutの実現
parser
tcp
テストを実行してみる テストが落ちた報告をするといい
Makefleにテストがなく、common.mkにある btest-ruby => bootstraptest sample/test.rbが通った後に実行(runner.rb経由で実行) make test-allなどは、標準ライブラリのテスト
make test-all TESTS=”-j4”すると並列で動く
test/ruby : 組み込み test/logger : 添付ライブラリ test/-ext- : C拡張
envutil.rb <- ヤバイ leakchecker.rb
rubyspecは現行の振る舞いだけしか書いてないので、 言語仕様ではない(by Matz)
]]>DBアクセスがあるような検証用のプログラムを書いたりするときってActiveRecord便利ですよね
このとき、timezoneの設定がうまくいって無くてすごく嵌ったので備忘録代わりにメモしておきます
単純にこれだけです
1 2 3 |
|
もしくはこちらでもよいかと
1 2 3 4 5 |
|
簡単でしたね
]]>ここ最近はRubyを書くことが少なくなってきたのですが、
RubyKaigiの一日目に行ってきた
ミドルウェアとかインフラとか、設計とかコードから離れた生活を繰り広げております
RubyKaigiの一日目は、これまた時間と仕事の都合上午前中のみしか参加できずorz
なので、一日目は、keynoteだけ聞いてきました
Crystalにも興味はあったので、ちょっと気になるのですがここは涙を飲んで・・・
ところでマネーフォワードさん、すごいですね。
Rubyコミッターのフルタイム採用とか松田さんの技術顧問就任とか。
という訳でメモを残しておく
プログラマーの美徳
全て、怒りに通じている
(Rubyにケチ付けられていることも・・・)
怒りは伝染るので、親切も伝染る
なので、内心腹たってても親切に対応するといいことがある
親切な対応が多いので、Rubyコミュニティは素晴らしい
よくなる提案を受け入れてもっと良い物をという、Rubyコミュニティの成果
ビルドプロセスとか、諸々の改善
Streem
未来の状況はわからない
スクリプト言語にオブジェクト指向要らない
→21世紀になってくると何らかの形でオブジェクト指向を持つものが多くなった
→人に合わせてつくることが無かった
新しい当たり前になれた
Ruby成功の秘訣
webappの分野ではトップ近くまでなれた
とはいえ、言語して完成しているわけではない
互換性の問題や、移行の問題(5年かかった)
# Python3よりはマシ
全部を捨てることはせず、段階的に変化させていく方法を取った
1つずつ、テストを書いて確認して実施
移行パスの提示
ドラスティックな変更はしないし、ひとつずつの進歩
バージョニング問題(1.8 vs 1.9のときは除くの轍は踏まなかった)は他の言語のようなことは起きなかった
変化のうえで学んだこと
Ruby3では以下をやりたい
こんな感じ(約束はしていない)
とある要件があり、使用するFramework最近ブログネタに賑わっているRailsでということになった
せっかくなので、開発開始&リリースはいつになるのかという噂のRails5を使ってみることにした
開発変更時期にRails5もリリースされているだろうという多少の先を見越す形でもありますがw
どうやら、後方互換とはなんだったのかの勢いで最新っぽいので、以下を準備します。
なにはともあれ、現時点の最新版だとスッキリした気分ですねw
1
|
|
昔はrailties/bin/rails
だったのですが、railties/exe/rails
変更になったようです
ちょっと焦りましたw
1 2 3 4 5 6 7 8 |
|
どうやら、activesupport/activesupport.gemspec
を見ると、
concurrent-ruby
が足りなかったようなので追加します(正式版では無く、alpha版が必要です)
1
|
|
気を取り直してもう一度実行すると動作します
1 2 |
|
せっかくなのでRails-APIオプションを使います
(api以外のオプションはお好みで設定してください)
1
|
|
が、そのまま実行してもエラーになりますのでGemfileを修正します
rails
は、cloneしたソースコードになるようにするrack
,arel
はgit or cloneしたソースコードになるようにする最終的にGemfileを以下のようにする(コメントのみ削除)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
ここは普段どおりにrackで起動します rails
1 2 3 4 5 6 7 8 9 |
|
特に挙げることもないですが、 rails配下にあるgemspecファイルに目を通しておけば、インストールや起動に必須なgemがわかるので問題解決が早くなるということぐらいでしょうか
]]>AWSのLamdaを使ったのですが、どうも日本語が文字化けする形の模様
これをライトに解決したい
数が多いと使えないですが、少量の文字であれば直接Unicode Escapeする形にする
Pythonの対話側インターフェースでライトに行う
1 2 3 4 5 6 7 8 9 10 11 |
|
こんな感じ、別にAWS絡みではなくてもライトに使える
逆にデコードする場合、s.decode('unicode-escape')
でできる
簡単ですね。
]]>緯度と経度はわかるものの、住所がわからなくて困りまったことがありました。
特にGoogleMapのI/Fからは住所が導き出せなったので、ほとほと困り果てました。
ふと、その時ドキュメントを覗いたときに逆Geocodingができる記述があったのでやってみました。
以下の表のように設定する
パラメータ | 説明 | 指定方法 | 必須 |
---|---|---|---|
address | 取得対象の住所 | テキスト | latlngかどちらかを指定 |
latlng | 取得対象の緯度軽度 | テキスト | addressかどちらかを指定 |
sensor | 位置センサーからのリクエストか | boolean | 必ず指定する |
bounds | ビューポートの境界ボックス(境界ボックスの南西と北東の角の緯度・経度で指定) | テキスト | |
region | 地域コード(ccTLDの2文字) | テキスト | |
language | 結果取得時の言語 | 言語コード |
boundsは以下のような形で指定する(緯度、経度がそれぞれどっちに向いてるのかを指定すると思えばよい)
1
|
|
以下のようにすることでjsonが返却される
1
|
|
とあるログファイルを解析する必要があったわけなのですが
以下の状況のようなファイルでした
なので、正確に発生日時を調べる必要が出てきました
Linuxの場合であれば、以下を実行するだけなのでそんなに難しくない
1 2 |
|
Macの場合であれば、Homebrewでcoreutils
をインストールしてあれば以下を実行するだけ
(以下のような形でフォーマットの設定が必要ですが・・・)
1 2 |
|
ログ解析用のバッチにこのコマンドを仕掛ければ簡単に使えそうですね
]]>以下の2つを実現したい
以下のコマンドでマイグレーション用ファイルを作成する
1
|
|
以下のように実装し、migrationを実行する
1 2 3 4 5 |
|
こちらは普通にunique制約とvalidates_uniqueness_of
を付与するのみ
とりあえずunique制約のみ
1
|
|
以下のような形でunique制約をつける
1 2 3 4 5 |
|
こんな感じにしておく
1 2 3 |
|
emailカラムにはバリデーションが設定されているので、
これをオーバライドすることでバリデーション周りの挙動を変更できる
判定箇所を追いかけると、デフォルトで有効になっているのでここをfalseに変更する
こんな感じにしておく
1 2 3 4 5 |
|
勿論、状況によってemail_required?
が必要なこともあるのでここは要仕様検討というところでしょうか。
当たり前ですが、デカイライブラリなので、ちょっとしたことをやるだけでも結構ややこし目の実装だったりソースを読むことが必須になりますね。
]]>ここ数日、自分用のアプリを作っているわけなのですが
その時に起きたエラーを記載しておきます
(STIの予約語のこと忘れてたというオチw)
ActiveRecordで「type」というカラムをもつテーブルに接続し、取得系のメソッドを呼ぶと以下の様なエラーが出た
1 2 3 |
|
エラーメッセージから分かるように「type」というカラムをrenameしろと出ています
こんなの場合によっては出来無いわけで・・・
STI(単一テーブル継承)と呼ばれる機能のことを指しています
つまり、1つのテーブルを複数のModelで利用する仕組みのことを言います。
で、その仕掛けように予約語として、”type”という名前をActiveRecordが利用しているようです。
クラスで言うとこんなところでしょうか。
Humanクラスを継承した、Manクラス、Womanクラスがあったとした場合、以下のような形になります
1 2 3 4 5 6 7 8 9 10 11 |
|
で、例えばManオブジェクトをsaveすると、Humanテーブルにtype:Manとして保存されます。
Womanならtype:Womanになるようです
それぞれのモデルからデータへの操作を行った場合、適合するTypeのデータのみを操作対象となります
ManもWomanも関係なく取得したい(両方をまとめて扱いたい)場合は、Humanモデルから操作すればOKです
当然ひとつのテーブルを使っていますので、片方にしか無い項目(カラム)もテーブルに含まなければならないです。
例えばManとHumanの持つ項目があまりにも違う場合、カラム数が爆発的に増えます。
(ここは注意するところですね)
もうざっくりというと、以下の2つの対応ができます
というわけなので、自分は1の対応を行いました。
では、2の場合はどうするかというと・・・ エラーメッセージにありますが、以下ように設定すればよいようです
1 2 3 |
|
ざっと思いつくのはこんなところかな
Railsでmigrationするときにいつもアレなんだっけなぁとなることが多いので、
備忘録程度にまとめておく
こんなものドキュメント見れば理解できるので、ざっくりレベルのサマリー程度にしておく
マイグレーションファイル作成コマンド
1
|
|
モデル作成
1
|
|
フィールド指定で作成する場合、以下の形で行う
(大体はフィールド指定を行わずに、実行することが多いかも)
1
|
|
細かい調整をしようと思えばできるけど、一旦これだけ覚えておけば良い
Ruby側の型 | DB側の型 |
---|---|
string | 文字列 |
text | 長い文字列 |
integer | 整数 |
float | 浮動小数 |
decimal | 精度の高い小数 |
datetime | 日時 |
timestamp | タイムスタンプ |
time | 時間 |
date | 日付 |
binary | バイナリデータ |
boolean | Boolean |
MySQLで使用できる文字列型は以下が存在している
DB側の型 | 内容 |
---|---|
CHAR | 255Bまでの固定長文字列 |
VARCHAR | 64KBまでの可変長文字列 |
TINYTEXT | 255Bまでの可変長文字列 |
TEXT | 64KBまでの可変長文字列 |
MEDIUMTEXT | 約1.6MBまでの可変長文字列 |
LONGTEXT | 約4.3GBまでの可変長文字列 |
上記をそれぞれmigrationで利用する場合
以下のようにlimitをつけることで、使用する文字列型を変更することができる
1 2 3 4 5 6 7 8 9 |
|
実行すると以下のようになる
1 2 3 4 5 6 7 8 9 10 |
|
limitの値は、以下のように対応している
設定値 | DB側の型 |
---|---|
1 ~ 255 | TINYTEXT |
256 ~ 65535 | TEXT |
65536 ~ 16777215 | MEDIUMTEXT |
16777216 ~ 4294967295 | LONGTEXT |
DB作成
1
|
|
マイグレーションの実行
1
|
|
マイグレーション結果確認
1
|
|
ロールバック
1
|
|
DBの削除
1
|
|
シードの投入(マスターデータなどシードで投入することが多い)
1
|
|
カラムを変更したい場合、以下のコマンドでマイグレーションファイルを生成する
1
|
|
変更は以下のような形で行う(upとdownを定義することでrollbackにも対応できる)
1 2 3 4 5 6 7 8 9 10 11 12 |
|
気をつけることとして、change_columnは以下のような順で記載すること
1
|
|
カラムの追加/削除をしたい場合、以下のコマンドでマイグレーションファイルを生成する
追加の場合は、フィールド指定可能
1
|
|
以下のような形で記載する
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
カラムの追加/削除と基本は変わらない
1
|
|
以下のようにしてindexを設定する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
ここに書いてる内容は、Railsドキュメント見れば一発で理解できるけどな
]]>