P学習帳

書いておぼえるブログ

【Ruby】MiniTestでテストを書いてみる

目的 MiniTestをとりあえず使ってみること。 Effective Ruby 第6章「テスティング」の内容そのままを試してみた結果をまとめる。 テストの対象 たとえばバージョンを管理するクラスversion.rbがある。このクラスのメソッドをテストしたい。 version.rb clas…

ハッシュレファレンスをsprintfでフォーマットしてprintする

課題 こういうハッシュレフを my $my_info = { name => 'Masato', tall => 169, mass => 55, food => 'Sushi', }; こうやってプリントしたい。 Name Tall Mass Age Food Masato 169 55 33 Sushi やり方 sprintf関数とハッシュスライスを使う。 sprintf関数の…

javascriptで変数が定義済みかどうかをチェックする

ポイントは、JSでは0が偽になる点です。0は偽ではありますが、未定義ではありません。 if (height) { ... } の条件では0が未定義と判定されてしまいます。0の場合にTrueのブロックに入るようheight == 0を追加しましょう。 var height = 0; if (heigth || he…

【Rails】空配列がTrue判定になってはまった件

状況 ActiveRecordでクエリを出して戻り値を変数にいれる。その変数が空かどうかで条件分岐させたい。 解法 books = Book.where(title: 'Great novel') if books.present? # booksの中身がある場合に実行する end まちがい books = Book.where(title: 'Great…

【SQL】selectで * を使うとおそい

状況 Active Recordのselectで*でテーブルのすべてのカラムを選択するようにしたらどことなく遅くなった。 改善 *で全部のカラムを返すのではなくて、実際に使う値のカラムを指定するようにした。 前: Book.select('books.*') あと: Book.select('books.ti…

【Active Record】手動でmigrateを部分的にやり直す

状況 development環境でまちがえてテーブルを消してしまった。元に戻したい、など。 解決 消したテーブルをcreate、カラム追加、データ型変更などしたすべてのmigrationファイルのバージョンを、schema_migrationsテーブルから削除する。 そのあとでbundle e…

【Active Record】findとwhereで返り値が異なる

状況 whereで取得したレコードセットにメソッドをはやしたらエラーになる。 解決 配列の添字を指定してメソッドを実行する。 コード Book.where("author LIKE '%#{name}%'").update(author: new_name) 考察 findでIDを指定した場合に返ってくるのはただの変…

【バグの振り返り】ビューで参照する変数の名前を間違えた

状況 クエリオブジェクトに複数あるメソッドのひとつで、ビューで返り値がもっているはずのカラムを参照しようとしたら、"no defined method"エラーになった。クエリ自体、正しい結果を返していた。だのに、なぜビューで「それ」がないと言われるのかわから…

【will_paginate-bootstrap】パジネーションの文字を改造する

状況 パジネーションの「1,2,3,4....」とかの文字を変更したい。例えば、ランキングページを想定して、1ページに10エントリー表示する場合、「1~10位、11~20位、21~30位」と表示したい。 前提 Ruby on Rails 4.2.10 解決 BootstrapPaginationクラスのpage…

メソッドをどのように命名するか

状況 モデルにスコープをつける。ある程度ややこしい処理をまかせるスコープだ。名前はながったらしくしないで完結にしたい。 処理内容 たとえば、ブログ記事のモデルArticlesについて考えるとして 先週1週間分のアクセス数をブログごとに集計し、降順に並…

【Active Record】カウントを集計してランクづけしたい

状況 任意の期間における合計カウントにもとづいてレコードをランク付けしたい。カウントは、アクセス数、販売数などを想定している。これを先週、先月、去年などの単位で集計する。 前提 Ruby on Rails 4 MySQL テーブル カウントがあるテーブル create tab…

【Active Records】find_by_sqlで動的に組み立てたクエリを発行したい

状況 CASE式をつかったSQLをActive Recordsで実行したい。(たぶん)Active RecordsでCASEに対応するメソッドはないので、生クエリを実行するしかない。 また、WHERE句は複数の値をとる。だからクエリは動的に組み立てる必要がある。 解決 クエリはヒアドキ…

【MySQL】日付を操作したい

状況 指定範囲の期間でレコードを絞り込みたい。たとえば、きのう、先週、先月。 解決 日付操作用の関数を組み合わせる。 DATE_SUB、YEARWEEK、DATE_FORMATなどなど。 コード CREATE TABLE articles ( id int, title varchar, created_at date ) 本日から8〜…

【Ruby on Rails】安全に検索語を指定してレコードを取得したい

状況 Active RecordsのWhereに動的に文字列を渡してレコードを取得したい。クエリエラーになる文字列が含まれるかもしれないので、エスケープしてから渡さなければならない。 解決 inspectする。 エスケープが必要な文字をそれしてくれる。 コード lines.eac…

【Ruby】文字列からURLを抽出する

状況 平文に含まれるURLを抽出したい。関係ない文字は省きたい。 解決 URI.extractを使う。 コード require 'open-uri' urls = [] Articles.all.each do |article| urls << URI.extract(article, ["http", "https"]) End 雑感 これはとても便利なメソッドで…

【Ruby on Rails】DBからユニークなデータを配列で取りたい

状況 テーブルの任意のカラムから重複を省いた要素を配列で取り出したい。 解決 pluck()してcompact.uniqする。 コード ids = Music.where(is_favorite: true).pluck(:id).compact.uniq 雑感 あえてidを配列で取得してからActive Recordsに渡して絞りまなけ…

【Ruby】配列または文字列どちらも受け取れる関数を作りたい

状況 成り行きで関数に文字列と配列の両方が入ってくるコードができあがった。配列が来たらeachで回して要素を処理すればOK、と思っていたら引数が文字列の場合にエラーが出た。両方対応できるようにしたい。 解決 instance_of?(Array)を使って配列を判定す…

【Ruby】配列をずっと循環させる

状況 バッチ処理などで指定時間のあいだずっと配列をぐるぐるループしつづけていたい。 コード cycleをつかう。 ['apple', 'banana', 'orange', 'peach', 'grape', 'pineapple'].cycle do |fruit| p "I like #{fruit}" end cycle(3)のように回転数を指定する…

【デバッグあるある】渡しているはずの引数が存在しないことになっている

状況 関数とかに確実に渡しているはずの引数の値が空(undefined または nil とか)だと怒られる。 呼び出し元では変数に値が入っている。原因がわからず途方にくれる。 原因 変数に値が入っていると確認した呼び出し元のコードの後続の行のどっかで同じ変数名…

Mac OSをアップデートするとMySQLがクラッシュすることがあるらしい?

状況 Mac OSのアップデートを実行、再起動後、MySQLが起動しなくなった。 現象 pidが消えた。エラーがたくさん出る。ググりまくって試行錯誤するものの解決できず。結局、MySQLのバージョンをあげたら再インストールできた。しかしバージョンをあげたことに…

入力フォームの値が以前のデータと同じだったら送信をキャンセルさせたい

状況 何らかのデータを更新するためのフォームがあるとして、入力された値が以前と同じ状態で送信されたらリクエストをキャンセルさせたい。 コード $('input[type="test"]').on('submit', function(e) { var prev_val = $('.prev_val'); var new_val = $('.…

【Ruby on Rails】capistranoによる自動デプロイ環境でタスクを定期実行させたい

状況 何らかのバッチ処理を本番サーバーで定期実行させたい。capistranoによる自動デプロイのついでにバッチ処理の設定もしてしまいたい。 前提 Ruby on Rails capistrano whenever 方法 capistrano capistranoの設定ファイルにwheneverの設定を追記する。 d…

【RoR】モデルの属性を更新するフォームをつくりたい

状況 ユーザーのフォーム入力に従ってモデルの値を更新したい。 やり方 ビューでform_forを使う。 コントローラーでstrong parameterを使ってパラメーターをフィルターする。 モデルの更新 前提 更新対象のモデル:article title属性をもつ。これを更新した…

エンターキーが押された時のページ遷移を防ぎたい

js

状況 任意のテキストボックスに何か文字列を入力していて、入力を確定するつもりでエンターを押したら、意図せず変なところにジャンプしてしまうのを防ぎたい。 コード $('input[type="text"]').on('keypress', function(e) { if( e.which == 13 ) { e.preve…

thisを関数に渡したい

js

状況 jsでthisを関数の引数として渡したい。 しかしそのまま引数の名前をthisとするとエラーになる。予約語だから引数の名前にはできないのだ。 かわりに_thisとすればよい。 コード $('input[type="text"]').on('click', '#mandatory', function() { do_som…

【ActiveRecord】3つ以上のテーブルをJOINしたい

状況 3つ以上のテーブルをJOINしたい。 想定するモデル 記事、段落、文といったモデルを考えてみる。記事は複数の段落を含む。段落は複数の文を含む。以下のモデルがあるものとする。 # articles has_many :paragraphs # paragraphs belongs_to :article has…

任意のディレクトリをパスに通す

useしたモジュールが見つからないとき次のエラーが出ます。 Can't locate App/Module.pm in @INC (... エラーを解消するには、モジュールをパスに通してやればOKです。 パスに通す方法は複数あるようですが、今回はuse libを使いました。 ディレクトリ構成 .…

Test::Simpleを使ってみる

Test::Simpleを使ってテストを書きました。 自作モジュールがちゃんと動くかを確認します。 テスト対象は、映画のレビュー情報を管理するMovieモジュールです。 package Movie; sub new { my ($class, %args) = @_; bless ({%args} => $class); } sub title …

Perl - 2次元配列の生成とアクセス

プログラミングPerl Vol.1の同名セクションにあるサンプルコードを写経する。 #配列リファレンスのリストを配列に代入する @AoA = ( [ "fred", "barney" ], [ "george", "jane", "elroy" ], [ "homer", "marge", "bart" ], ); print $AoA[2][1]; # marge #配…

ファイル名グロブ演算子

カレントディレクトリにあるファイルを条件を指定して取得できるファイル名グロブ演算子の使い方メモ。 my @scripts = glob('*.pl'); for ( @scripts ) { print "$_\n"; } @scriptに.plファイルが入る。 取得したファイルを実行したり、または何か処理を加え…