技術メモ

書いておぼえるブログ

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

状況 モデルにスコープをつける。ある程度ややこしい処理をまかせるスコープだ。名前はながったらしくしないで完結にしたい。 処理内容 たとえば、ブログ記事のモデル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ファイルが入る。 取得したファイルを実行したり、または何か処理を加え…

'yyyy-mm-dd'形式の日付を比較するーPerlの文字列比較演算子

日付の前後を比較したいとき、Time::Pieceとかでepoch秒とかを計算してやるしかないのかーとおもっていたら、実は文字列比較演算子を使えばできると先輩がおしえてくれた。 文字列でありながら、量の比較ができるのだ。これには4種類がある。 小なり (less t…

Processing.js できれいな模様を描きたい

Prodessing.jsできれいな画面を作ってみたくなったので、 http://2g.atsukitaira.com/htmlcss/html5/850/ブラウザでお絵描きプログラミング! Processing.js 登場! - IT戦記 やってみた。 全画面表示させたかったけど、はてなブログだとできない? canvasを…

Bash kakasiで漢字のよみがなを出力する

ヨミガナを登録するために、漢字交じりのテキストをカタカナに変換する必要があった。Excelでヨミガナを振れるかためしてみたが、ダメだった。情報が登録されていないと、できないのだ。 それなら、ということでkakasiを使ってみたらうまくいったので、コマ…

Bashでシェルスクリプトをつくって実行する

pdftkでPDFを細かく分割するケースを例に取る。 シェルスクリプト。 #!/bin/bash pdftk hoge.pdf cat 159-617 output hoge_part1.pdf pdftk hoge.pdf cat 631-897 output hoge_part2.pdf pdftk hoge.pdf cat 912-923 output hoge_part3.pdf pdftk hoge.pdf c…