woshidan's loose leaf

ぼんやり勉強しています

Ruby on Rails + rails-ujsを利用している場合のXSS対策について

この記事は情報セキュリティアドベントカレンダーの12日目の記事です。 開発組織でセキュリティをある程度のレベルに担保するための有効な施策として既にセキュリティ対策が施されているフレームワークを利用するようにする、というものがあります。 自分の…

オブジェクト指向設計実践ガイド ~Rubyでわかる進化し続ける柔軟アプリケーションの育て方の7~9章を読んで

オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方作者:Sandi Metz技術評論社Amazon 上記の本の7~9章を読んで印象に残った部分をまとめました。 7章 継承の手法を使い「ロール(役割)」を共有する解決法につい…

オブジェクト指向設計実践ガイド ~Rubyでわかる進化し続ける柔軟アプリケーションの育て方の4~6章を読んで

オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方作者:Sandi Metz技術評論社Amazon 上記の本の4~6章を読んで印象に残った部分をまとめました。 4章 オブジェクト指向アプリケーションは「クラスから成り立つ」…

オブジェクト指向設計実践ガイド ~Rubyでわかる進化し続ける柔軟アプリケーションの育て方の2~3章を読んで

オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方作者:Sandi Metz技術評論社Amazon 上記の本の2~3章を読んで印象に残った部分をまとめました。 2章 変更が簡単であることの定義 変更は副作用をもたらさない 要…

ユーザーストーリーマッピング 13章から18章を読んで

ユーザーストーリーマッピング作者:Jeff PattonオライリージャパンAmazon 上記の本を読んでいて、13章から18章まで各章ごとに印象に残ったことをメモりました。 13章 オポチュニティから始める 浮かんだばかりの大きなアイデアはエピックと呼んだりオポチュ…

ユーザーストーリーマッピング 7章から12章を読んで

ユーザーストーリーマッピング作者:Jeff PattonオライリージャパンAmazon 上記の本を読んでいて、7章から12章まで各章ごとに印象に残ったことをメモりました。 7章 より良いストーリーテリングのために 以下のようなシンプルなテンプレートを使って会話を始…

ユーザーストーリーマッピング 0章から6章を読んで

ユーザーストーリーマッピング作者:Jeff PattonオライリージャパンAmazon 上記の本を読んでいて、0章から6章まで各章ごとに印象に残ったことをメモりました。 0章 まず最初に読んでください 言葉で表現された文章が正確な製品の実態を示すものではない スト…

Ransackで関連モデルの検索を行う

Ransackでは特定のモデルのカラムだけでなく、そのモデルと関連する他のモデルのカラムでも検索を行うことができる。 例えば、Userモデルに1対多で紐づくCommentモデルのcontents属性で検索したい場合 <%= search_form_for(@q, url: user_search_path) do |f…

メールの仕組みとDNSのMXレコードについて

ちょっと仕事で調べることがあったのでメモ。 メールサーバには2種類があって、MTA(メール転送サーバ)とMUA(メールユーザエージェント)があって、メール転送サーバはDNSが持っているMXレコードのアドレスのサーバにメールを転送する。 このメールを転送して…

RansackでRailsの検索を楽に作る

Railsで開発していると検索フォームを作成することがよくあると思います。 今日は、そのときよく使われるRansackについてまとめておこうと思います。 基本的な使い方 def index @q = User.ransack(params[:q]) @users = @q.result end のように特定のパラメ…

Rails6.1になってコントローラのテンプレート指定に拡張子をつけることが推奨されなくなった

Rails 6.1以上になってCSVなどをダウンロードさせるコントローラのアクションに def download render( csv: 'users_list', template: 'users/download.csv.ruby' ) end のように書いているとRSpecの実行時に DEPRECATION WARNING: Rendering actions with '.…

Enumerizeでenum値を扱う

Railsのモデルでenum値を扱うとき、enumerizeというgemを使うと便利です。 # Gemfile gem 'enumerize' class Task extend Enumerize enumerize :status, in: { pending: 0, todo: 1, done: 2 } end と書くと、 Task = Task.new(status: 'pending') #=> valid…

定数値を環境ごとに分岐したいだけならRails.env.xxx? やconfig/environments以下のファイルに値を書くより環境変数にくくり出した方がよさそう

Railsで開発していると if Rails.env.production? # production環境用の処理 elsif Rails.env.staging? # staging環境用の処理 else # それ以外の環境用の処理 end という風に環境ごとの処理を書いたり、config/environments以下のproduction.rbやstaging.rb…

画面の横幅が大きい(小さい)ときのみ要素を表示する

画面を作成していると単純に要素を横に伸ばしたりでスマホとPCの表示が作れず、要素の順番や配置が変わってしまうことがあります。 その度合いがまるきり別物ならPC版とスマホ版で別のテンプレートを使えばよさそうですが、順番が数カ所違う程度ならスマホ版…

少しだけ動作が速くなるコードの書き方3つ

レコードがあることを条件にしたいとき、findの代わりにexists?を使う if User.find_by(email: "...") # something.todo end のとき、findやfind_byではActiveRecordのインスタンスが生成されてしまう分遅いので、存在確認をしたいだけなら下記のようにexist…

Railsのuniquenessバリデーションについて

uniquenessバリデーションを使うと、その項目の中で一意であるようにバリデーションがかけられます。 class User validates :email, uniqueness: true end とすると、emailはUserの中で一意となるようにRails側でバリデーションをかける。 これを、Userが会…

RSpecでテストデータ用にファイルを読み込む

RSpecでテスト用のファイルを読み込む RSpecでテスト用のファイルを読み込む際はデフォルトでは spec/fixtures/files にファイルを置いて file_fixture("example.txt").read とすると、ファイルの中身がspec中で呼び出せる。 ファイル中にHTMLやJSONのレスポ…

配列の要素全てが該当する条件を記述するallマッチャ

scopeみたいにフィルタリングした要素について、フィルタリング対象の要素について let(:included) { Item.new(price: 250) } let(:not_included) { Item.new(price: 300) } let(:array) { [included, not_included] } subject(array.filtering) it '250円以…

Railsのルーティングの細かいところについて

最近細かく引っかかっていたので。 URLヘルパのnew, editの修飾子は前に付く xxxx_new_pathかnew_xxxx_pathかよく迷っていたけど、 new_xxxx_path, edit_xxxx_path のほうが正解。namespaceで # routes.rb namespace 'admin' do resources xxxxs end となっ…

テスト中のオブジェクトに実際の動作をさせないで返り値を指定する

特定のオブジェクトにあるメソッドの中身を実行せず結果だけ返して欲しい場合 allowとreceiveを使ってスタブの指定をします。 allow(some_object).to receive(:method_name).and_return(return_value) 特定のクラスのインスタンス全てにあるメソッドの中身を…

ActiveRecordで関連しているモデルに対してメソッドを定義する

Userと1対多関連の関係にあるCommentというモデルがあるとする。 あるUserに関連したコメントに対して user.commentes.some_method のようにスコープやメソッドを定義したいという場合があって、その場合以下のように書ける。 class User < ApplicationRecor…

attributes_forでテスト用のハッシュを取得するときはFactoryに定義された属性しか取り出されない

下準備としてモデルのSchemeとFactoryの定義 # schema.rb ActiveRecord::Schema.define(version: 2020_11_23_064724) do create_table "users", force: :cascade do |t| t.string "name" t.integer "age" t.string "mail" t.datetime "created_at", precisio…

今週のGo

Go

週5以上活動していればよい感じで。 以下のようなコードを動かしながら、関数値gの中でその値が定義された関数f内の変数Aを利用すると、関数値gは変数Aの参照を持っているのだなぁ、という確認をしていた var once sync.Once onceFunc := func() { once.Do(f…

今週のGo

defer FILO/panicになっても実行される recoverはpanicが起こる関数と同じgoroutineの中に置く deferと対になる処理について errorに判定を生やす標準ライブラリの実装例 ログにもありますが、試したGoのバージョンは1.7.3です deferはFILOでpanicになっても…

dispatch_queue_tの_tとはなんなのか

type の略。 stackoverflow.com 現場からは以上です。

Intentのフラグを使ってスタックの下の方のActivityをクリアする

下記のフラグをつけてstartActivityする。 Intent intent = new Intent(ThirdActivity.this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); サンプルコード https://gis…

iOS9.0のシミュレータでローカルホストへ接続した時、NSPOSIXErrorDomainになる

開発用にダミーサーバへ接続したらやたらエラーになるので調べたところ、iOS9.0でシミュレータでlocalhostへ接続した場合だけに下記のエラーが出るみたいでした。 Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory" UserInfo={NSErrorFai…

bashで引数の配列の一つ後の要素を取り出す

即席で作ったシェルスクリプトのオプションの自前解析がしたくて。。 #!/bin/bash i=0 for OPT in "$@" do echo "index: $i OPT: $OPT OPTの一個後ろの要素 ${@:$(expr $i + 2):1}" # $i + 1 でないのは@の先頭は全要素を出力するため i=$(expr $i + 1) done…

Athenaのテーブル定義にファイル中に存在しない列を定義した場合の振る舞いについて

後からAthenaのテーブル定義に列を追加したい、みたいな場合に気になったので、メモ。 テーブル定義に存在する列で検索対象データ内で型が違うものは怒られますが、テーブル定義に存在して検索対象のデータに存在しない列についてはNULL扱いみたいでした。 …

先週の反省会

いまの日時 [NSDate date] 日付を扱うには NSCalendaer, 決まったフォーマットで文章にしたい場合は NSDateFormatter NSDateFormatter にセットする DateFormat の文字列には時間に関係しない文字列( yyyy, MM, dd みたいなもの以外 )が含まれている場合、 […