まりぴよこのブログ

日々の日記。技術ネタでまとまりきってないものの記録、伝わる文章の書き方を練習とか。

Railsの勉強でまとめ記事(Qiita投稿)

最近ブログ更新が滞ってたんだけど、勉強結果のまとめをQiitaに投稿したのでそのことについてグダグダを書いてみる。

学習結果まとめ1

qiita.com

最近勉強ネタ元になっているアプリをウンウン言いながらソースコードリーディングしてる途中に見つけた、素敵実装について書いてみた。

よくある、お問い合わせフォームみたいのの、確認画面を出すところのきれいな実現方法だったのでエッセンスを書き出してみた。

お問い合わせフォームって、入力する内容と、一旦確認画面に出す内容って、ほぼほぼ一緒(そりゃそうだ・・確認なんだから)で、コントローラーもビューもバラバラに書いてしまうと、いわゆるDRYじゃなくなっちゃうな〜と思うんだけど、それをRailsのvalidation や afterコールバックをうまく使って綺麗に書く方法について。

ココで使われていた validates_acceptance_of なんて、存在も知らんかったくらいなので、大変勉強になった。

ぐぐっても validates_acceptance_of は地味なのか、ちょっと古めの記事しかヒットせず。

Tips的に、この無名ブログよりQiitaのほうが相応しかろう!と思ってそっちに書いてみたら、1日で自分史上最高のストック数になり、ちょっとビビる。。 今までって、ブログやらQiitaに書いたことって、自分でかってに掘った穴に落ちて、もがいて・・やっと出れた〜ってのを書くことばっかりだったので、たまたま見つけた人様の素敵実装をまとめたら、どんどこストックされると・・なんかじんわりと罪悪感が・・・

でもこのストックスピードって、みんな「これは素敵実装!」って思うってことなんだろうな。 うーんさすが。

学習結果まとめ2

qiita.com

最近のRail勉強のおかげで、なんだかRails routesと仲良くなってきたような気がする。

ビューで routing path を使いたい時に、いつもノートを何ページも戻って見直してた自分的忘備録をQiitaに書いてみた。

やっぱ Rails Best Practices はすごいな〜

Rails Best Practices - Generate polymorphic url

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できないで検索するとこんな感じ・・

qiita.com

・・・まさしく・・なんだが、GETにする対応で良いのだろうか・・・ 普通に今までDELETE送れてたのに・・なんかこの対応じゃダメな気がする・・

解決の糸口

ちょっと古めの記事ですが、コレが解決の糸口に!

kaorumori.hatenadiary.com

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

その他参考になったサイト

stackoverflow.com

jquery-ujs のハイフンをアンダースコアにしていて、インストール後にまだjs読み込めん!となったため、下記サイトのお世話に・・

qiita.com

RailsアプリのJS外部ライブラリをbower管理にして、CircleCIがFailして泣きそうになった件・・

久しぶりのブログ更新・・

最近がんばってRailsのアプリ課題を進めているので、ブログの更新が滞っています・・

途中見つけたTipsはQiitaに書いてるんだけど、今回のはまだ生煮えなのでブログの方に書いてみる。。

bower で JS のライブラリ管理

Railsのプロジェクトで、jsライブラリいれよ〜と思った時、zip ダウンロードして vendor/assets に手動コピー、展開・・って流れがイヤだな〜と思って、以前調べていた手順書を元に、Railsプロジェクト内のJSをbower管理にしてみた。

↓自らの軌跡が役立って嬉しい・・

qiita.com

Bowerfileこんな感じ

asset 'bootstrap-tagsinput'

bootstrap で良い感じにタグをスタイルしてくれるライブラリを入れてみた。 こいつと一緒にjQueryvendor/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

Railsでネストしたモデルの link_to method: :delete と form_for する方法

ネストしたモデル

  • blog has_meny entries
  • entry belongs_to blog

の状態で、entryを削除したい。

link_to :delete

(hamlです)

before

= link_to 'Destroy', entry, method: :delete, data: { confirm: 'Are you sure?' }

after

= link_to 'Destroy', [ @blog, entry ], method: :delete, data: { confirm: 'Are you sure?' }

参考

stackoverflow.com

form_for

before

= form_for(@entry) do |f|

after

= form_for [@blog, @entry] do |f|

参考

stackoverflow.com

どっちも配列で渡せばいい。

つながるWeb services

すごい・・世界はつながっている・・・!!!

何にどのくらい時間がかかっているのか、調べてみてる

毎度毎度見積もりと実測が激しくズレるので、最近真面目に時間を気にしてみている。。

そして使い出したのがToggle

作業項目を記入して、スタートボタンをクリックするだけ! (なぜか家のMaxで作業項目を入力すると、自動でタイマースタートする。会社のWinだとスタートボタンクリックまで待っている)

同じChromeなんだけど、微妙に動作が違う・・ 家のに慣れてしまうと、うっかりスタートボタン押し忘れるミスが頻発して悲しいことになる;;

ここ最近のワークフロー

会社のタスク管理はTrelloなんですが、ここんとこの自分のワークフローが

  • Trelloでカード、チェックリスト作る
  • 作業開始と共にToggleでタイマー開始
  • 作業終了でToggleのタイマー終了
  • Trelloのタスクをチェックする

だったんですが・・・

ちょいちょいToggleし忘れる・・

あと、Toggleったまま席を立ったり、帰っちゃったりする・・ (帰っちゃうと、Toggleが何時間もタイマーつけっぱ~だよ。とメールで教えてくれる。めっちゃ親切♪)

繋がった・・・!

Toggleの隅っこにちょいちょいお知らせが出てるんですね。。

Toggle画面の右端下に時々お知らせが出てる(あとプロ版使ってみない?とか)

f:id:mpiyok:20150617114955p:plain

なんか見慣れた文字が・・Trelloと連携すんの??

ポチると、Chrome extensionページに飛ばされる。。

chrome.google.com

言われるがままにインストールしてみたが、Chrome拡張の位置に赤いボタンが増えただけ・・あれ??と思ってたんですが。。

f:id:mpiyok:20150617120151p:plain

コレこのままボタン押すと、普通にタイマーが起動するだけ・・ (作業項目は「Chrome」ってなってる。。)

Trello連携なんだから、Trello見なさい!

Trello画面の方を更新してみたら・・ボタン増えてた!!(驚愕)

f:id:mpiyok:20150617115409p:plain

ボタン押すと、赤くなってタイマー開始! すげ~~ すげ~~~~

もちろんクリックしたタスクがタイマーの項目になります(当たり前 ww)

最近の大好き3サービスが繋がった

新しいワークフローは

  • 作業開始:TrelloでToggleボタンクリック
  • 作業終了:Trelloでチェックリストをチェック(complete)
  • Slack連携で勝手にプロジェクトのルームにお知らせが通知される

おおお。。

なんか・・自分なんにもやってないのに、ハンパない達成感・・ ww

いつかやってみたい・・

Chrome extensionページで、色んな連携プロジェクトのアイコンが表示されてて、すげ~すげ~と思った。。 よくよく見るとちゃっかりesaもいるやん!すごいな!

なぜこんな不思議なことが・・と思ったんだけど・・

github.com

連携したいサービスの人たちがプルリク送って拡張してってるんだ・・

すごい・・すごいな・・世界は広いな・・

HomebrewでMySQLのセットアップ

自分の作業履歴・・

インストール

brew install mysql

非力なairでmakeが恐ろしく時間かかる;;

自動起動設定

macのcronみたいの。

ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

参考: tweeeety.hateblo.jp

ざっくりと。。

  • ユーザー用のlaunchd設定ファイル置き場に、brewがダウンロードしてきてくれた launchd設定ファイルを置く。(*.plist)
  • launchctlコマンドでmysql用の設定ファイルをロードする

MySQL初期設定

ROOTパスワードの設定など。 mysql_secure_installation を使う。

$ mysql_secure_installation
Set root password? => N
Remove anonymous users? => Y
Disallow root login remotely? => Y
Remove test database and access to it? => Y
Reload privilege tables now? => Y
  • ルートパスワードを設定するか? => 今回はNo (ローカル環境のテスト用なので)
  • アノニマスユーザーを削除するか? => 削除する
  • rootユーザーのリモートログインの禁止するか? => 禁止する
  • テストデーターベースの削除するか? => 削除する
  • 権限の変更を再読み込みするか? => 再読み込みする

接続出来るか確認

$ mysql -u root
mysql > show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
mysql > exit

よさげ。

Ruby エラトステネスのふるいで学ぶArrayの便利メソッド

素数を求めるアルゴリズム

エラトステネスの篩 - Wikipedia

手順

  • 探索リストに2からxまでの整数を昇順で入れる
  • 探索リストの先頭の数を素数リストに移動し、その倍数を探索リストから篩い落とす
  • 上記の篩い落とし操作を探索リストの先頭値がxの平方根に達するまで行う
  • 探索リストに残った数を素数リストに移動して処理終了

Wikipediaのふるってるanim gifがかわいい ww

最初の回答

手順をそのまま書いてみた。 STEP2の倍数をふるい落とすところ、ごちゃごちゃしたので関数に切り出している。 削除する数値を一端リストとして作成している deleting_numbers

class Eratos
  def self.eratos(max)
    list = (2..max).to_a
    prime_check_max = Math.sqrt(max)
    prime_list = []
    begin
      target = list.shift
      list = sweep(target, list)
      prime_list << target
    end while target < prime_check_max
    list.count > 0 ? prime_list.concat(list) : prime_list
  end

  def self.sweep(target, numbers)
    max = numbers.last / target
    deleting_numbers = (1..max).map { |n| n * target }
    numbers.reject { |n| deleting_numbers.include?(n) }
  end
end

なんか無駄にごちゃごちゃしておる・・

Array.select

ブロックが真を返す要素からなる配列を作成。

例:2で割り切れる数のみ抽出

arr = [ 1, 2, 3, 4, 5 ]
arr.select { |n| n % 2 == 0 }
# => [ 2, 4 ]

Array.reject

selectの逆

ブロックが偽を返す要素からなる配列を作成。

例:2で割り切れない数のみ抽出

arr = [ 1, 2, 3, 4, 5 ]
arr.reject { |n| n % 2 == 0 }
# => [ 1, 3, 5 ]

Array.delete_if

ブロックの戻り値が真になった要素を削除

元の配列を操作する

arr = [ 1, 2, 3, 4, 5 ]
arr.delete_if { |n| n % 2 == 0 }
puts arr
# => [ 1, 3, 5 ]

select の逆版 reject を発見してなんか嬉しい♪

もっとすっきり

STEP2の倍数をふるい落とすところ、一端削除する数値のリストを生成してるけど、要するに割り切れる場合はふるい落としてよいことに気づく。

def self.eratos(max)
  list = (2..max).to_a
  prime_check_max = Math.sqrt(max)
  prime_list = []
  begin
    target = list.shift
    prime_list << target
    list.delete_if { |n| (n % target).zero? }
  end while target < prime_check_max
  list.count > 0 ? prime_list.concat(list) : prime_list
end

delete_ifで破壊的に配列を操作。 結局 sweep 部分は1行になったので、関数に分割するのやめた。