今週のRuby, Railsの勉強
今週はあんまり新しい知識を得た感がない・・けど、なんとか2記事Rails関連をQiitaに投稿。
まとめ記事1
おすすめされて既に知っていたgemである、BetterErrorsだが、知らなかった事2点発見があった。
BetterErrorsの新発見
- エディタ設定をしておくと、ブラウザからファイルパスをクリックすると、該当のソースコードを開いてくれる
- Ajax Request時で、エラー見れないじゃん;;と泣く泣くコンソールログを見ていたが、実は実行後に別の画面に遷移してしまったあとでも、
http://localhost:3000/__better_errors
と打ち込むと、最後のエラー画面を見せてくれる
2個目のAjax Requestでもデバッグ助けてくれる、というのに感動!
RailsPanel
Chromeの拡張で、ブラウザ上からいい感じにトレースが見れる。
たしかどっかでチラッと見かけたような気がするけど、ちゃんと導入してなかった。 コレはかなり便利そう♪
まとめ記事2
RailsでAjax書く時の基本的な流れをまとめた。 多分先月のコピーアプリ作成時にまとめかけて、完成しないまま放置してたっぽい。
その他
全然Rails関係ないけど・・・
このところ、AngularJSをやっている。。 JavaScript恐るべしなコールバック地獄・・・ たかだかファイルシステムからファイル取り込んで、表示するだけで、何回コールバック関数書くのよ;;
格闘の末のCordova File APIを使ってファイルシステムにアクセスして、最後の最後に処理を一回挟むコードに成功。
ちょっとだけ Promise とやらの使い方が分かった気がする。 ・・・が、まだ胸を張って「Promiseあーね!」とは言えない;; まだまだまだまだ。。である。
コードかコンテンツか・・それが問題だ・・
最近RubyとRailsの勉強をしてて、どっちかっていうと読み系の座学が多くて、コード書いてない。。
そして読んだ結果をまとめたりする時間も結構バカにならず、こっちに比重置いてると、コード書けない。。
そもそもプライベートの勉強時間って、普通に生活してると、子供が学校行ってから、自分が出勤するまでの朝1時間、夜子供が寝てから、自分が眠くなって終了になるまでの間2時間くらいの、1日合計3時間くらい。。
その中で、コードかコンテンツか・・とやっぱりどちらかしかできないわけで・・・
理想的には、仕事してる間の7時間くらいが、コードに費やされていれば、残りのプライベート勉強タイムにコンテンツ書けたら、丁度いいバランスなんだけど、 仕事で使ってる技術と、自分がこれから進みたい技術がずれてる場合、プライベートの3時間で両方捻出するしかない;;
自分の場合、先月5〜6月はとにかく書くの心理的敷居を下げるために、コンテンツ重視(この時はあまりコード書けてない)、その後実践!と思ってアプリ作りしてた7月は、コードは書いてたけど全然ブログ書けてなくて・・
うーん・・どうしてもどっちかになっちゃうんだよな;;
というのが最近の悩みだったわけです。。
で、昨日たまたま調べ物してて、そこのページでRTされてた↓のツイートを見る機会があり・・
多くのプログラマが、開発したソフトウェアは公開せず、知見・知識はブログやポッドキャストの形で無償公開するのに対して、私は開発したソフトウェアは自由ライセンスで公開し、知識・知見の方は雑誌記事や講演など基本有料で提供しているのは興味深い違いだと思う。
— Yukihiro Matsumoto (@yukihiro_matz) 2015, 8月 20
ムムム・・確かにそうだな〜
コレ、このまま短絡的に判断すると、コードを無償公開して、知識・知見といったコンテンツは有料の人の方が、大成功しそう・・なんだけど・・・
最初にパッと思いついたこと
自分の場合、なぜ知識を無償公開するのかっていうと、そもそもその知識を得たソースが、誰かの勉強記録だったりとか、無償公開されたものから派生していることが多い。
よく自分の中でイメージしてるのは、仏教的な「お地蔵さん」 (注:とか言って、全然ちゃんとした仏教ととかではないので勝手な思い込みレベルなんだけど)
お地蔵さんって、道を目指している人々を、その道の途中途中で、「こっちでいいんだよ〜がんばれ〜」と励ましてくれているイメージ。
決して道を極めている訳じゃないんだけど、途中の取っ掛かりとしていつもそこに居てくれる、みたいな。
道はまあ、人それぞれなんだけど、途中にお地蔵さんが居ない道って、めっちゃ辿りずらそうな感じ。。 「あーあの先、光ってるけど、全然行き方わからん;;」と、大多数の人は諦めざるを得ない。。(ワシか!)
誰かが立ててくれたお地蔵さんを目印にここまで来た、しかし自分はその間(オリジナルのお地蔵さん立てた人との知識レベルの差とかで)ハマった箇所があったりしたら、新たにお地蔵さん立てる感じ。 それが自分がお地蔵さんを立てる理由・・ですかね。。
次に道を通る人が、もしかしたらそのお地蔵さんを目印にしてくるかもしれないので・・
現に自分は、勝手に立ってたお地蔵さんを勝手に目印にして進んできたので、私の新しい勝手に立てるお地蔵さんが、いつか誰かの役に立つ可能性も捨てきれないわけですしね。。 (そしてその誰かは自分ってことも十分ありうる・・)
ちょっと時間経ってから思い出したこと
そういえば、今週たまたま見かけた記事↓も、なんか結びついた。
結びついた箇所を抜粋すると、
エンジニアにとって、「コードを書くか、もしくは記事やスライドなどのコンテンツを作るか」は永遠の二択問題だ。
この問題の解き方については、Steve Yegge氏の記事が委曲を尽くしている。
「あなたには(会ったことがない)あこがれのエンジニアがいますか? わたしにはいます。しかし面白いことに、彼や彼女らが書いたコードはあまり読んでないのです。有名と呼ばれるようなエンジニアは、主に文章を通じてわたしに影響を与えました」
Steve氏もまた、自身のブログ“Stevey’s Blog Rants”で有名になったエンジニアだ。コンテンツに影響されたから、コンテンツを作る道を彼は選んだのである。
コンテンツに影響されたエンジニアはコンテンツを書き、公開する。
コードに影響されたエンジニアはコードを書き、公開する。
ってことなのかも。
世の中にコンテンツに影響されたエンジニアの方が多い、ってことなんだろうな。
自分の場合は、明らかに(会ったことがない)あこがれのエンジニアのコンテンツに影響受けてる。
これ書いてて思いついたこと
最初の部分の、自分の時間の使い方を書いてて気づいた。
自分的、理想的な時間配分ができてるとすると
- プライベート時間 : コンテツ書き
- 仕事時間 : コード書き
に割り当てていると、必然的に仕事時間で作った成果物を勝手にそのまま公開するわけにはいかない・・
仕事時間にOSSやってる人じゃないと、そのままコード公開できないしな。。
でも、2つ目の「コードとコンテンツ、どちらにより大きな影響を受けたか」でコードを選んでいる人の場合、プライベート時間もコードに割り当ててるから、やっぱし自分自身がどちらに影響を受けたか、が答えな気がするな。。
Rubyのミミックメソッド
ミミックメソッド
- 作者: Paolo Perrotta,角征典
- 出版社/メーカー: KADOKAWA/アスキー・メディアワークス
- 発売日: 2010/08/28
- メディア: 大型本
- 購入: 18人 クリック: 533回
- この商品を含むブログ (125件) を見る
メタプログラミングRubyを読んでて、初めて出会った単語。。「ミミックメソッド」・・何だろ〜コレ??
・・から、今までチラホラ見ていた self
について新しい気付きがあったのでメモメモ!
付録Aのよく使うイディオム、1つ目の項目で出ていた「ミミックメソッド」
Rubyでよく出てくる、属性へのgetter,setterを使う時なんかに、あたかも「メソッド呼び出しっぽくない」メソッド呼び出しのことを指しているらしい。
コード的にはこんな感じ
class Book def title @title end def title=(val) @title = val end end
注:初心者(ワシか!)向け注意点。
普通はこんな風に書かない。
attr_accessor
を使えば、Rubyがやってくれる。
とまあ。。普通にRubyコード書いてる分にはわざわざ書かないんだけど、Ruby的にgetter, setter はこんなふうにメソッドとして定義しているわけです。
こいつらを使う時、普通は
book = Book.new # セッター使ってみる book.title = 'メタプログラミングRuby' # ゲッター使ってみる book.title # => "メタプログラミングRuby"
なんだけど、実際のメソッド呼び出し的に厳密に書くと
book = Book.new book.title=('メタプログラミングRuby') book.title()
になる。 同じことなのでクリーンにかける最初の方式をみんな使ってる。
こんな感じで、他言語(Javaとか)出身者からすると、「あ〜publicなtitle属性定義して、直アクセスしてるわけね〜」と思ってしまうのだが、実際はメソッド経由なわけだ。
「他の何かに擬態している」メソッドなので、ミミックメソッド、と呼ぶらしい。
なるほどなるほど。。 ここまではなんとなく他のRubyの本とかで文法勉強してた時に聞いたことある感。
属性の不具合
ここで注意!
class MyClass attr_accessor :my_attr def initialize_attributes my_attr = 10 end end
こう書いてしまうと予期せぬバグを生み出してしまう・・そうだ・・
最初全くピンとこず・・
実行すると、こんなんなっちゃう。。
obj = MyClass.new obj.initialize_attributes obj.my_attr # => nil
10どこ行ってん!!!(涙)
理由
原因は initialize_attributes
でのコードが曖昧なこと。
Ruby的にはこのコードが
なのか、区別がつかない。
迷ったらRubyは1を採用するそうだ。(確かにそっちのほうが明確。2はより厳密な指定方法があるわけだし)
回避策
class MyClass attr_accessor :my_attr def initialize_attributes self.my_attr = 10 end end
ここでselfが登場!!
こうすると曖昧さがなくなり、ミミックメソッドの呼び出し!ということがRubyに伝わる。
なので、「カレントオブジェクトの属性に代入する時は、明示的に self
を使うこと」が重要なのだ。
雑感
今までなんとなく、 カレントオブジェクトの属性に代入には必ず self
付いてるの、Ruby的なお約束かな〜とかぼんやりと思ってたけど、(まあ確かにお約束といえばお約束だが)裏にある意味をちゃんと理解するって大事!
いや〜なんかスッキリした!
最近のRails自習方法
最近の自習方法について。
- RubyMine(試用中:17/30)
- サンプルにしてるアプリをひたすらコードリーディング
- 書籍
- Web
RubyMineにしてみた
ずっとiTerm + MacVimで頑張ってたんだけど、コード内をうまくジャンプできない&Rails全然知らんのに補完が一切ないが辛いので、良い良いともてはやされているRubyMineを使ってみている。
現在使用期間中の17日目辺り。 途中一週間程夏休みでほとんどMac使う時間が無く、試用期間をちょっと無駄にしてしまった感・・ まだ全然ショートカットキーを覚えられていない・・・
かなり良い感じ♪
なんだけど、最近コード書くより読む方ばっかりなので、Navigation系の機能しか練習ができない。 書く方もやらないとな〜・・
会得した技
- 定義元にジャンプ:Cmd+BまたはCmd+マウスクリック
- 全体検索:Cmd+Shit+F
- 賢い検索:Shift+Shfft
- Rails server の起動 : Ctrl+R
賢い検索は、ファイル名とか、シンボルとか、クラス名とか指定なく全体を検索してくれる。 でもホントはファイル名で探したいとか明確なターゲットがある場合も多いので、そっちのショートカットも覚えたいんだけど・・(脳みそ容量が足りてない)
これから会得したい技
(ショートカットがうろ覚え)
- Rake関連タスクの実行
- Class, File, Symbolのターゲットを絞ってジャンプ
- Model, View, Controllerの行き来
コードリーディング
Railsの機能やよく使われる実装パターンを読み解く。 キーワード自体知らないものがボコボコ出てくるので、調べながらほふく前進な感じ。。
ほふくながら大体全体を見通し終わったので、次のお題を探さしださなきゃな・・と検討中。
書籍
RailsによるアジャイルWebアプリケーション開発 第4版
- 作者: Sam Ruby,Dave Thomas,David Heinemeier Hansson,前田修吾
- 出版社/メーカー: オーム社
- 発売日: 2011/12/01
- メディア: 単行本(ソフトカバー)
- 購入: 12人 クリック: 206回
- この商品を含むブログ (40件) を見る
ちょっと古い本だけど・・・ 第Ⅲ部 Rails詳説 辺りから再度読み始め。。 というか買った頃にやった時は、前半のアプリ作るチュートリアルで終わってたので、再度・・ではない。。 すこしだけ全体像が見えてきたので、以前チラ見した時より大分スイスイ読める。
- 作者: Paolo Perrotta,角征典
- 出版社/メーカー: KADOKAWA/アスキー・メディアワークス
- 発売日: 2010/08/28
- メディア: 大型本
- 購入: 18人 クリック: 533回
- この商品を含むブログ (125件) を見る
こっちも古い本だけど・・ 以前ノリで買った時は全く歯が立たず、そっと棚に戻した本に再チャレンジ w
月曜日:オブジェクトモデル、火曜日:メソッド辺りまでなんとか読めてる。 水曜日:ブロックで急に圧倒的な眠気に気圧され、進みが悪くなっている・・・
Web
Rails Best Practices - Rails Best Practices
まだあんまり読めてない。 今後(の自分)に期待・・
Railsの勉強でまとめ記事(Qiita投稿)
最近ブログ更新が滞ってたんだけど、勉強結果のまとめをQiitaに投稿したのでそのことについてグダグダを書いてみる。
学習結果まとめ1
最近勉強ネタ元になっているアプリをウンウン言いながらソースコードリーディングしてる途中に見つけた、素敵実装について書いてみた。
よくある、お問い合わせフォームみたいのの、確認画面を出すところのきれいな実現方法だったのでエッセンスを書き出してみた。
お問い合わせフォームって、入力する内容と、一旦確認画面に出す内容って、ほぼほぼ一緒(そりゃそうだ・・確認なんだから)で、コントローラーもビューもバラバラに書いてしまうと、いわゆるDRYじゃなくなっちゃうな〜と思うんだけど、それをRailsのvalidation や afterコールバックをうまく使って綺麗に書く方法について。
ココで使われていた validates_acceptance_of
なんて、存在も知らんかったくらいなので、大変勉強になった。
ぐぐっても validates_acceptance_of は地味なのか、ちょっと古めの記事しかヒットせず。
Tips的に、この無名ブログよりQiitaのほうが相応しかろう!と思ってそっちに書いてみたら、1日で自分史上最高のストック数になり、ちょっとビビる。。 今までって、ブログやらQiitaに書いたことって、自分でかってに掘った穴に落ちて、もがいて・・やっと出れた〜ってのを書くことばっかりだったので、たまたま見つけた人様の素敵実装をまとめたら、どんどこストックされると・・なんかじんわりと罪悪感が・・・
でもこのストックスピードって、みんな「これは素敵実装!」って思うってことなんだろうな。 うーんさすが。
学習結果まとめ2
最近のRail勉強のおかげで、なんだかRails routesと仲良くなってきたような気がする。
ビューで routing path を使いたい時に、いつもノートを何ページも戻って見直してた自分的忘備録をQiitaに書いてみた。
やっぱ Rails Best Practices はすごいな〜
Rails で JavaScript 管理をbowerにしてから、method: :delete が効かなくなって devise sign_out できなくなった
前回の記事で無事 bower 管理で上手くいっていると思っていたけど・・
前段階: RailsアプリのJS外部ライブラリをbower管理にして、CircleCIがFailして泣きそうになった件・・ - まりぴよこのブログ
devise で sign_out できない!
No route matches [GET] "/users/sign_out"
コレが発生。 以前は普通にサインアウト出来てた様な・・
いつの間にかサインアウトできない仕様にしてしまっていた;;
devise sign_outできないで検索するとこんな感じ・・
・・・まさしく・・なんだが、GETにする対応で良いのだろうか・・・ 普通に今までDELETE送れてたのに・・なんかこの対応じゃダメな気がする・・
解決の糸口
ちょっと古めの記事ですが、コレが解決の糸口に!
JavaScriptを読み込むようにしたところ、以前のままで正常に動作するようになりました。
まさにコレじゃね!? 身に覚えあり・・・
app/aseets/javascripts/applicaton.js
読み込んでるjsはこんな状態だった。
//= require jquery //= require bootstrap-tagsinput //= require_tree .
最初に合ったやつから、 require jquery-ujs
が消えてる(というか消した記憶あり)
bootstra-taginputをBowerfileに入れたら、自動でjqueryがそっちに入ったので、 application.jsをいじくって、その時一緒に消した気がする・・
戻します!
//= require jquery //= jquery-ujs //= require bootstrap-tagsinput //= require_tree .
そんなファイルないので取り込めません!(そりゃそうだ)
Bowerfileに入れます!
asset 'bootstrap-tagsinput' asset 'jquery-ujs'
インストール!
$ ./bin/rake bower:install
asset pipeline を確認
$ ./bin/rails c > Rails.application.config.assets.paths
その他参考になったサイト
jquery-ujs
のハイフンをアンダースコアにしていて、インストール後にまだjs読み込めん!となったため、下記サイトのお世話に・・
RailsアプリのJS外部ライブラリをbower管理にして、CircleCIがFailして泣きそうになった件・・
久しぶりのブログ更新・・
最近がんばってRailsのアプリ課題を進めているので、ブログの更新が滞っています・・
途中見つけたTipsはQiitaに書いてるんだけど、今回のはまだ生煮えなのでブログの方に書いてみる。。
bower で JS のライブラリ管理
Railsのプロジェクトで、jsライブラリいれよ〜と思った時、zip ダウンロードして vendor/assets
に手動コピー、展開・・って流れがイヤだな〜と思って、以前調べていた手順書を元に、Railsプロジェクト内のJSをbower管理にしてみた。
↓自らの軌跡が役立って嬉しい・・
Bowerfileこんな感じ
asset 'bootstrap-tagsinput'
bootstrap で良い感じにタグをスタイルしてくれるライブラリを入れてみた。
こいつと一緒にjQueryも vendor/assets
の方に入ったので、邪魔になるといかんと思いgemで入ってた方のjqueryを消す。
Gemfileこんな感じ
- gem 'jquery-rails' # こっち消した + gem 'bower-rails' # こっち追加した
これで bundle update
と ./bin/rails g bower_rails:initialize
で初期設定完了。
ローカルでは動いた・・問題はそのあと・・
ここまでは特にハマりポイントもなく、順調に進む。 (10ヶ月くらい前の自分が一度ハマった沼だからね・・)
ローカルでは動作したので、githubにプッシュ!
・・・したらCircleCIがコケた;;
うわぁん。。(そう、前回はgithub + CircleCIまでやってません)
こんなエラー
$ bundle exec rake assets:precompile rake aborted! Sprockets::FileNotFound: couldn't find file 'jquery' with type 'application/javascript' /home/ubuntu/micro-sof/app/assets/javascripts/application.js:3
jQueryないって・・・いわれてる気がする・・・
circle.ymlの設定??
(結局関係なかった)
vendor/assets/bower_components
以下のファイルをリポジトリに突っ込んでなかったので、CircleCIでもnpmやらbowerやらの動作が必要なのでは・・・?と考え、インストールしてくれるであろう設定を付け加えてみた。。
付け足したのはpreのとこ。
circle.yml
dependencies: pre: - npm install & npm install bower -g post: - bundle exec rake assets:precompile
しかし、解決せず;;
(ここまで関係なかったとこ)
解決策
ふと思い立って、 bower がインストールできなくても、 bower_components
の読み込み終わってれば jQuery あるんじゃ・・?と
.gitignoreに付け加えてた、 bower_components 以下無視を削除して、大量のファイル達もコミット!
したら動きました・・・
node_componentsとか、それ系の「ダウンロード&インストールするだけ」のファイルは、git commitしない、ってうろ覚えてた記憶があるんだが・・・・
bower_components はコミットしといた方がいいのかな・・・?
とりあえず、解決!
この辺の疑問点とかもスッキリわかったら、Qiitaにちゃんとした記事書こっと。
追記(2016/04/05)
やっぱりcircle.ymlの指定だけで解決できた・・・
半年後別のプロジェクトで同じ問題にぶち当たる。 ローカル環境では動くけど、CircleCI上で動かすとテストがコケる;;
Failure/Error: #= require bootstrap-sass/assets/javascripts/bootstrap/alert ActionView::Template::Error: couldn't find file 'bootstrap-sass/assets/javascripts/bootstrap/alert' with type 'application/javascript'
このプロジェクトもbowerでjs系のライブラリを入れてて、 bootstrap/sass
がないよってエラー
circle.ymlに
test: pre: - bower install
を追記したら普通にインストールしてくれた・・・
参考: Deploying Grunt and Bower from CircleCI to Heroku with Node.js | Sebastiaan Deckers