最近のフィッシングメール
昨今のマスク不足に乗じたフィッシングメールについて、相談を受けたので書いておきます。
フィッシングメールの詳細
件名
楽天市場【ご注文を受け取りましたので、ご注文を処理するためにご本人確認ください。】
見かけ上の送信元アドレス(ヘッダ)
order-verification@rakuten.co.jp
実際の送信元アドレス(エンベロープ)
ijwef92u83ifow3-jnck18r40@grp03-hfuwes.com
ヘッダの送信元アドレスは楽天を装っていますが、上記が本来の送信元アドレスです。
本文
(一部マスク)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
| 楽天市場 | をご利用いただきありがとうございます「新光ネット販売店」 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━セキュリティ上の懸念から、この注文を継続することはできません。 商品の発送時にキャンセルを行うことはできませんのでご確認ください。
【概要】
》 JAN:-
》 型番:マスク在庫あり 500枚入 使い捨て
》 価格:11,790円
》 売り手:新光ネット販売店【出荷明細】
》 名前:竹垣 和花 様
》 アドレス:〒665-0816 平井x-xx-x-xxx 兵庫県 宝塚市
》 電話番号 : 080-1183-xxxx【警告】 私たちはあなたのアカウントにセキュリティ上の懸念を検出しました。
この注文をキャンセルしたい場合は、アカウントを確認する必要があります。
したがって、この注文をキャンセルできます。
アカウントを確認します。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
※このEメールは、登録のメールアドレス宛に自動的に送信されています。
※本Eメールは送信専用です。本メールに返信された場合でも回答はできません。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
□ 楽天市場
日本語が怪しいほか、そもそも本人確認の必要性が謎ですね。
このようなメールが届いたらどうすればいいか
無視。削除してかまいません。
リンク先の詳細
フィッシングサイトのドメイン
accid.grp-securit09.ex-wwan20.com (/rms/nid/loginfwdi)※アクセスしないでください
whoisで引いても有力な情報は得られませんが、 registrant名はContact Privacy Inc. Customer 1247153671、住所はトロントのようです。
フィッシングサイトのスクリーンキャプチャ
レスポンシブ対応しておらず、PCからアクセスしてもモバイル向けっぽい表示になります。
また、リンク部分はすべてjavascript:void(0)になっており、手抜き感が漂っています。
Rails 5.x: Specified 'sqlite3' for database adapter, but the gem is not loaded. Add `gem 'sqlite3'` to your Gemfile
エラー内容
Model作成時に、sqlite3がloadされていない旨のメッセージが出力される。
$ rails g scaffold Hoge title:string image:string link:string /home/hoge/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activerecord-5.1.6.1/lib/active_record/connection_adapters/connection_specification.rb:188:in `rescue in spec': Specified 'sqlite3' for database adapter, but the gem is not loaded. Add `gem 'sqlite3'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord). (Gem::LoadError)
原因
sqlite1.4がreleaseされたが, rails的には1.3.xにしか対応していない。
rails newで作成されるデフォルトのGemfileにはsqliteのバージョン指定がないため、1.4がbundle installされ上記エラーとなる。
Rails6では修正され, 5.2.3にもバックポートされるらしい。
対処
Gemfileを以下の通り1.3をバージョン指定するよう修正
- before
'sqlite3'
'sqlite3', '~> 1.3', ' < 1.4.0'
- 以下を実行して指定バージョンをインストール
bundle up sqlite3
Specified 'sqlite3' for database adapter, but the gem is not loaded. : rails
公衆無線LAN(フリーWi-Fi)に接続できない。認証ページが表示されない件。(Windows10版)
こちらの記事のWindows10版。 midnight-engineering.hatenadiary.jp 概要は上記の記事をご覧ください。本記事では対処手順のみ記載しています。
Windows10のDNS設定変更手順
デスクトップ右下のコンピュータのアイコンを右クリックする
「ネットワークとインターネットの設定を開く」をクリックする
クリックするとネットワークの「設定」ウィンドウが開かれます。
「アダプターのオプションを変更する」をクリックする
クリックすると「ネットワーク接続」ウィンドウが開かれます。
「Wi-Fi」の項目を右クリックし、「プロパティ(R)」をクリックする
クリックすると「Wi-Fiのプロパティ」ウィンドウが開かれます。
「インターネットプロトコルバージョン4(TCP/IPv4)」をクリックし、「プロパティ(R)」をクリックする
クリックすると、「インターネットプロトコルバージョン4(TCP/IPv4)のプロパティ」が開かれます。
「次のDNSサーバーのアドレスを使う(E)」にチェックが入っている場合、「DNSサーバーのアドレスを自動的に取得する(B)」にチェックを入れるよう変更する
もし、最初から「DNSサーバーのアドレスを自動的に取得する(B)」にチェックが入っていた場合は、DNSの設定が原因ではありません。
bundle install(rails new)すると”HEADS UP! i18n 1.1 changed fallbacks to exclude default locale."と言われる
はじめに
2019年、新年を迎えて早々だけど、時間のあるこの正月休みの間に何か創作しようと思い立った。
またしても数ヶ月ぶりにRailsを触ってみようと思った。
とりあえずrails newした。
そしたらi18n絡みで”that may break your application"とかいうメッセージが出力された。こわい。
環境
Rails 5.1.6.1
やったことと出力されたメッセージ
rails newをするとbundle installでi18nというgemがインストールされる。
今回はv1.4がインストールされているが、この際に以下のようなメッセージが出力された。
$ rails new hoge (中略) run bundle install (中略) Fetching i18n 1.4.0 Installing i18n 1.4.0 (中略) Post-install message from i18n: HEADS UP! i18n 1.1 changed fallbacks to exclude default locale. But that may break your application. Please check your Rails app for 'config.i18n.fallbacks = true'. If you're using I18n (>= 1.1.0) and Rails (< 5.2.2), this should be 'config.i18n.fallbacks = [I18n.default_locale]'. If not, fallbacks will be broken in your app by I18n 1.1.x. For more info see: https://github.com/svenfuchs/i18n/releases/tag/v1.1.0
これはなんなのか
出力メッセージによると、i18nのv1.1から、config.i18n.fallbacksという設定項目に関して破壊的な変更がなされたようだ。
- config.i18n.fallbacksとはなんなのか
訳語が存在しないときのフォールバック動作を規定する設定。要するに、locale設定に応じた訳語を表示したいんだけど、対応する訳語が定義されていない場合に、(代わりに)どの言語で表示するかという設定。
Railsガイドによると、以下のように使うようだ。
# デフォルトのロケールをフォールバック先として使う場合 config.i18n.fallbacks = true # ロケールの配列をフォールバック先に使う場合は次のようにします。 config.i18n.fallbacks = [:tr, :en]
ところが、上記設定例の前者の書き方がv1.1.0からは正しくなくて、以下のように書かなければならなくなった。
config.i18n.fallbacks = [I18n.default_locale]
何をすべきか
メッセージに書かれているまんまですが、設定ファイルを以下のように変更。
- 変更対象ファイル [your_app_root]/config/environments/production.rb
- 変更前
config.i18n.fallbacks = true
- 変更後
config.i18n.fallbacks = [I18n.default_locale]
rails newの度に毎回これをやらないといけないのか
と書かれていることから5.2.2では治っているのでしょう。きっと。
「google mapで開く」リンクの貼り方(iOS/Android他、全プラットフォーム対応)
Developer Guide | Maps URLs | Google Developers
Universal cross-platform syntaxというものがある。
Universal cross-platform syntax
プラットフォーム(端末)の差異を意識する必要のないapiが用意されているのでそれを使えば良い。
プラットフォームごとの挙動は以下の通り。
- Android:
- Google Mapsアプリがインストールされており、かつアクティブ状態の場合、アプリでマップが立ち上がる。
- Google Mapsアプリがインストールされていない、または無効化されている場合、ブラウザでマップが立ち上がる。
- iOS:
- Google Mapsアプリがインストールされている場合、マップがアプリで立ち上がる。
- Google Mapsアプリがインストールされていない場合、ブラウザでマップが立ち上がる。
- その他のデバイス
- ブラウザでマップが立ち上がる。
アクション
- Search
特定の場所をピン留めして表示する- 構文:
https://www.google.com/maps/search/?api=1¶meters
- 例:
https://www.google.com/maps/search/?api=1&query=pizza+seattle+wa
- 構文:
- Directions
特定の2点間の経路を表示する- 構文:
https://www.google.com/maps/dir/?api=1¶meters
- 例:
https://www.google.com/maps/dir/?api=1&origin=Space+Needle+Seattle+WA&destination=Pike+Place+Market+Seattle+WA&travelmode=bicycling
- 構文:
- Display a map
マーカーなしで地図を表示する- 構文:
https://www.google.com/maps/@?api=1&map_action=map¶meters
- 例:
https://www.google.com/maps/@?api=1&map_action=map
- 構文:
- Display a Street View panorama
特定の場所のストリートビューを表示する- 構文:
https://www.google.com/maps/@?api=1&map_action=pano¶meters
- 例:
https://www.google.com/maps/@?api=1&map_action=pano&viewpoint=48.857832,2.295226&heading=-45&pitch=38&fov=80
- 構文:
parameter部分の詳細は冒頭のデベロッパー向けドキュメントを参照されたい。
Rails5 Active Storageを使って画像アップロード機能を実装する
ファイルアップロード機能の実装方式
Rails5.1以前においては以下のgemを使用するのが有力な選択肢だった。
- CarrierWave
GitHub - carrierwaveuploader/carrierwave: Classier solution for file uploads for Rails, Sinatra and other Ruby web frameworks - shrine
GitHub - shrinerb/shrine: File Attachment toolkit for Ruby applications - Paperclip
GitHub - thoughtbot/paperclip: Easy file attachment management for ActiveRecord - Refile
GitHub - refile/refile: Ruby file uploads, take 3
Rails 5.2になって、Rails本体の機能としてActive Storageが追加されたことで、これが上記の選択肢に加わった。
Active Storage
rails/activestorage at master · rails/rails · GitHub
概要はこちらのRails Guideを参照されたい。
Active Storage Overview — Ruby on Rails Guides
で、どれを使えばいいのか?
Active Storageはビルトインならではの簡便さが魅力であるものの、CarrierWaveやShrineと比較すると、まだ機能的に未成熟のようだ。(自分で触ったわけではないが)
なので要件に照らして、Active Storageで事足りる、あるいは機能不足を許容できるのであれば、お手軽に使えるActive Storageを使えばよいし、そうでなければCarrierWaveやShrineを選ぶことになるだろう。
今後の変化の激しさも考えると、現時点でActive Storageを採用するのは悪手な気もするのだが、 今回はお試しということでActive Storageを使ってみることにした。
環境
- Rail 5.2.1
- Active Storage 5.2.1
ファイルアップロード機能実装に必要 - MiniMagick 4.9.2
画像の加工に必要 - ImageMagick 6.7.8.9-15
MiniMagickが使用。OSにインストールする。
Active Storageを利用するにはRails 5.2.0以上にアップデートしなければならない。
5.1.5からのアップデート方法であれば、こちらの記事に非常にわかりやすくまとまっている。
qiita.com
画像アップロード機能の要件
実装
以下、rails newで新規プロジェクトを作成した直後の状態を想定する。
MiniMagickのgemを追加
Gemfileに以下を追記
# Gemfile gem 'mini_magick', '~> 4.8'
$ bundle install
Active Storageが使用するtableを作成
Active Storageはファイル添付機能の実装にあたり、添付先のモデルにカラムの追加を必要としない。代わりにBlobとAttachmentの2つのモデルを用いる。
- Blob(Binary Large Object):
ファイルのメタ情報を管理。ファイルの実態はローカルファイルシステムまたはS3などのクラウドサービスに格納される。Blobが管理する情報は以下。- id
- key
- filename
- content_type
- metadata
- byte_size
- checksum
- created_at
- Attachment:
添付先のモデルとBlobを紐づける中間テーブルとしての役割を担う。Attachementが管理する情報は以下。- id
- name
- record_type
- record_id
- blob_id
- created_at
上記2つのモデルを以下の2コマンドで作成できる。
# migrationファイルの作成
$ rails active_storage:install
# テーブルの作成
$ rails db:migrate
scaffoldでmodel, view, controller等を作成
$ rails g scaffold post title body:test
routeの追加
# config/routes.rb root to: 'posts#index'
modelの編集
# app/model/post.rb has_many_attached :images validate :image_type def thumbnail input return self.images[input].variant(resize: '300x300!').processed end private def image_type if images.each do |image| if !image.content_type.in?(%('image/jpec image/png')) errors.add(:images, 'needs to be a JPEG or PNG') end end end
- validate :image_type , def image_type ファイルタイプでバリデーションを行う。今回はjpegとpngファイルのみアップデートを許可し、それ以外はerrorを返す。
- thumbnailメソッド:
アップロードされた画像をオリジナルサイズで扱うのではなく、リサイズしてサムネイルとして表示するためのメソッド。processedを使用することで、毎回リサイズの処理を走らせずに済む。- input(引数):
複数画像を添付可能とするため、何枚目の画像かをinputという引数で指定できるようにしておく。(さらにいえば、リサイズ処理におけるサイズ指定を変数化して、第二引数、第三引数で指定できるようにしておくとよい。本例では省略。) - resize: '300x300!':
リサイズのサイズ指定。"!"を付けるとオリジナル画像のアスペクト比を無視して、指定されたサイズによるリサイズを強制する。
- input(引数):
controllerの編集
# app/controller/posts_controller.rb # privateメソッドのpost_paramsを修正 def post_params params.require(:post).permit(:title, :body, images: []) end
viewの編集
_formページ
viewのフォームに画像アップロード用のフィールドを追加する。
複数アップロードを可能にしたいので、multiple: trueが必要。
# app/view/posts/_form.html.erb <%= form.label :images %> <%= form.file_field :images, multiple: true %>
showページ
# app/vie/posts/show.html.erb <% (0...@post.images.count).each do |image| %> <%= image_tag(@post.thumbnail(image) %> <% end %>
参考
Rails5でjavascript(jQuery/coffeescript)が動かない
軽く調べただけでも新旧いろんな症例(?)がある。 この記事で紹介するのはturbolinksを有効にしている場合に注意すべきケース。
環境
事象
- javascriptが動かない
具体的には、selectボックスの変更イベントを検知してajaxが動くようなcoffeescriptのコードを書いたが、動かない - ページ自体をリロードすると動く
⇒別のページから遷移したときは動かないけど、リロードすると動く場合、Turbolinksが悪さをしている可能性が濃厚。
Turbolinksを無効化した上で確かめればすぐに切り分けられる。
原因と対処
Turbolinksを有効化している場合、$(document).readyは動作しない。
まずは対処方法から。
before(ダメな書き方)
# app/assets/javascripts/xxxxx.coffee $(document).ready -> $('#hoge_menu').change -> #(以下略) # 以下の書き方も同じ $ -> $('#hoge_menu').change -> #(以下略)
after(OKな書き方)
# app/assets/javascripts/xxxxx.coffee $(document).on 'turbolinks:load', -> $('#hoge_menu').change -> #(以下略)
Turbolinksが有効だとなぜ$(document).readyが動かないか
公式ドキュメントに説明がある。
Working with JavaScript in Rails — Ruby on Rails Guides
Turbolinks overrides the normal page loading process, the event that this relies upon will not be fired.
その他の注意点
jquery-turbolinksは使わない
Rails4向けの古いブログ記事などでは、解決策としてjquery-turbolinksというgemを入れるやり方が紹介されていたりする。
しかし、githubのREADMEを見ると冒頭にデカデカと「Deprecated 」と書いてあり、続いて以下の記述があるので使うのはやめましょう。
This gem does not work with Turbolinks 5+, and is not compatible with many jQuery plugins. We do not recommend using it.
そもそも余分なgemを入れなくても解決できるのだから、入れる必要もないのだが。