Rails5 FactoryGirlでコールバックをスキップする方法
Rails4では使えたFoo.skip_callback(:create, :after, :bar)
がRails5では使えない。
ArgumentError: After create callback :do_something has not been defined
対策として、次のようにFGにおいてメソッドを上書きする:
class User < ActiveRecord::Base after_create :run_something end
FactoryGirl.define do factory :user do after(:build) do |user| class << user def run_something true end end end factory :user_with_run_something do after(:build) do |user| class << user def run_something super end end end end end end
コールバックメソッドの発火タイミングによって、after(:build)
も変更する必要がある
参考:
first_nameカラム、last_nameカラムからフルネーム検索するメソッド
Controller:
class ProfilesController < ApplicationController def search @profiles = Profile.search_by_full_name(search_params[:name]) end private def search_params params.require(:search_profile).permit(:name) end end
Model:
class Profile < ApplicationRecord def self.search_by_full_name(query) query.delete!(' ') where("CONCAT_WS('', first_name, last_name) LIKE ?", "%#{query}%") end end
いろいろ応用できそう
Webpack v1からv2へのマイグレーションメモ
自分が使っていたところだけを簡単に。詳しくはhttps://webpack.js.org/guides/migrating
以下、webpack.config.js
の変更点:
resolve.extenstions
空の文字列は必要なくなったので削除する。ちなみにデフォルトでは.js
、.json
がresolveされている。
// v1 resolve: { extensions: ["", ".js", ".json"], }, // v2 resolve: { extensions: [".js", ".json"], },
拡張子を指定することで./foo
がjs
ファイルならばrequire("./foo")
が可能になる。
module.loaders
とmodule.rules
module.loader
のシンタックスはまだサポートされているが、module.rules
にかえるほうが望ましい。
// v1 module: { loaders: [ { test: /\.css$/, loader: [ "style-loader", "css-loader?modules=true" ] } ] } // v2 module: { rules: [ { test: /\.css$/, use: [ { "style-loader" }, { "css-loader", options: { module: true } } ] } ] }
loader
のチェイン
複数のloaderを!
でつなげるのはmodule.loaders
オプションでしか使えない。
// v1 module: { loaders: [ { test: /\.css$/, loader: "style-loader!css-loader" } ] } // v2 module: { rules: [ { test: /\.css$/, use: [ "style-loader", "css-loader" ] } ] }
-loader
の省略はできなくなった
loader
指定時に、-loader
を省略することはできなくなった。
// × module: { rules: [ { use: [ "style", "css", "less" ] } ] } // ○ module: { rules: [ { use: [ "style-loader", "css-loader", "less-loader" ] } ] }
json-loader
を指定する必要はなくなった
json-loader
がなくとも、自動的にJSONファイルを読み込む。
// × module: { rules: [ { test: /\.json/, loader: "json-loader" } ] } // ○ module: { rules: [ ] }
module.preLoaders
とmodule.postLoaders
は削除された
// v1 module: { preLoaders: [ { test: /\.js$/, loader: "eslint-loader" } ] } // v2 module: { rules: [ { test: /\.js$/, enforce: "pre", loader: "eslint-loader" } ] }
UglifyJsPlugin
sourceMap
UglifyJsPlugin
のsourceMap
オプションはデフォルトでfalse
になった。sourceMap
が欲しい場合にはtrue
設定する必要がある。
devtool: "source-map", plugins: [ new UglifyJsPlugin({ sourceMap: true }) ]
UglifyJsPlugin
warnings
UglifyJsPlugin
のcompress.warnings
オプションはデフォルトでfalse
になった。warnings
が欲しい場合にはtrue
設定する必要がある。
devtool: "source-map", plugins: [ new UglifyJsPlugin({ compress: { warnings: true } }) ]
UglifyJsPlugin
minimize loaders
UglifyJsPlugin
はloadersをminimizeモードに切り替えなくなった。
loadersのminimize
モードは webpack 3 以降に削除される。
古いloadersとの互換性を保つために、pluginを用いてminimizeモードに切り替えることができる。
plugins: [ new webpack.LoaderOptionsPlugin({ minimize: true }) ]
DedupePlugin
は削除された
webpack.optimize.DedupePlugin
はもう必要ないのでwebpack
の設定から削除する。
OccurrenceOrderPlugin
はデフォルトで設定される
もうわざわざ指定する必要はない。
debug
webpack 1 では、debug
オプションはloadersをdebugモードに切り替える。
loadersのdebug
モードは webpack 3 以降に削除される。
古いloadersとの互換性を保つために、pluginを用いてdebugモードに切り替える。
plugins: [ new webpack.LoaderOptionsPlugin({ debug: true }) ]
bitcoin保管方法まとめ
自分用にまとめ。随時更新
免責事項: 筆者は、あなたに対して何も保証しません。筆者は、あなたに対して一切責任を負いません。すべての作業は自己責任で行って下さい。
所感
セキュリティ
ペーパーウォレット>物理デバイス>>>デスクトップウォレット>>モバイルウォレット>>>>>>>ウェブウォレット
取引のしやすさ
Webウォレット>>>モバイルウォレット=デスクトップウォレット=物理デバイス>>>>>>>>>>>>>>>>ペーパーウォレット
特徵
ペーパーウォレット
アドレスと秘密鍵を印刷して保管する方法。長期間の保存を目的とする。送金時には、デスクトップ・モバイル・ウェブウォレットなどにインポートする。ソースコードをダウンロードして、オフラインで作成。
メリット
- オフラインで作成した場合、最も安全
デメリット
- 盗難・火災による紛失の可能性(コピーがない場合は復元できない)
- 使いにくい
物理デバイス
専用のデバイスに保管する方法。長期保管を目的としている
メリット
- オフラインで保管するためクラッキングの可能性は低く、物によってはパスワード・取引の承諾などによって厳重にプロテクトをかけることができるため、ペーパーよりセキュリティが高い
- PCに接続するだけなので取引の利便性が良い
デメリット
- 紛失盗難の可能性
デスクトップウォレット
デスクトップアプリをインストールしてローカル環境で管理する方法
メリット
- 利便性が良い
- オフラインで管理する場合はセキュリティ面でも優れている
デメリット
- PCの故障により取り出せなくなる可能性があるので、PCのバックアップに気を使う必要がある
- ハッキングやウイルス感染により盗まれる可能性があるので、PCのセキュリティには注意する必要がある
モバイルウォレット
スマートフォン上で管理する方法
breadwallet - bitcoin wallet - iOS
MYCELIUM - Android
メリット
- QRコードを利用できる
- 実店舗の利用に便利
デメリット
- スマートフォンの紛失盗難の可能性
- ハッキングによって盗まれる可能性
ウェブウォレット
ウェブ上のウォレットサービスを利用する方法
メリット
- 使いやすい
- どのコンピューターからもアクセスできる
- セキュリティをサービス提供者に一任できる
デメリット
- 多くのビットコインが集まるためハッキングの可能性が最も高い
Amazon Dash Buttonをハックする
ウィルキンソン Dash Buttonをハックしたときの備忘録。
Amazon Dash Buttonのセットアップ
まずはAmazon iOS/Androidアプリを使って、Amazon Dash Buttonのセットアップ。商品選択でキャンセルしておくことに注意。
MACアドレスの取得
使用するのはdash-buttonというライブラリ。これをインストールする。
npm i -S dash-button
package.json
のscripts
に手を加える:
{ "scripts": { "scan": "dash-button scan" } }
スキャン実行中に、Amazon Dash Buttonを押すとMACアドレスが取得できる:
sudo npm run scan > amazon-dash-button@1.0.0 scan /Users/uraway/github/amazon-dash-button > dash-button scan Scanning for DHCP requests and ARP probes on en0... Detected a DHCP request or ARP probe from xx:xx:xx:xx:xx:xx
うまくいかない場合は、インターフェースオプション(--interface
/-i
)をつけて、他のインターフェースを試してみるといいかもしれない。
Amazon Dash Buttonを入退室ボタンにしてみる
SlackのAPIを使って、Slackに入退室のメッセージを送信するボタンにハックしてみる。
const DashButton = require('dash-button'); const Slack = require('node-slack'); const DASH_BUTTON_MAC_ADDRESS = 'xx:xx:xx:xx:xx:xx'; const HOOK_URL = 'https://hooks.slack.com/services/*****'; let button = new DashButton(DASH_BUTTON_MAC_ADDRESS); let slack = new Slack(HOOK_URL); let i = 0; button.addListener(() => { i++; console.log(`${i} times working!`); if (i % 2 === 0) { slack.send({ text: '入室しました', username: 'WILLKINSON' }); } else { slack.send({ text: '退室しました', username: 'WILLKINSON' }); } });
スクリプト実行中にAmazon Dash Buttonを押すと…
- 出版社/メーカー: Amazon
- 発売日: 2016/12/05
- メディア: エレクトロニクス
- この商品を含むブログを見る
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
nokogiri
がインストールできない
Gem::Ext::BuildError: ERROR: Failed to build gem native extension. An error occurred while installing nokogiri (1.6.8.1), and Bundler cannot continue. Make sure that `gem install nokogiri -v '1.6.8.1'` succeeds before bundling.
xcodeのコマンドラインツールをインストールすれば解決した:
gem uninstall nokogiri xcode-select --install gem install nokogiri
依然xcode関係を整理したからかな?
npmに代わるNodeパッケージマネージャーyarn
yarn
FacebookとExponent, Google, Tildeとの共同チームによって生まれた新しいパッケージマネージャー
Yarn pulls packages from registry.yarnpkg.com, which allows them to run experiments with the Yarn client. This is a proxy that pulls packages from the official npm registry, much like npmjs.cf.
新しいレジストリも作るのかと一瞬思ったけど、どうやらそうではなく、npmレジストリを利用するための新しいクライアントのようだ。よかった。
npmjsのブログを見る限りはyarnのリリースにかなり好意的。でもnpm Inc.がyarn開発からハブられたのはなぜなのか。
特徴
https://bower.io/blog/2016/using-bower-with-yarn/
bowerのブログを参考にまとめる。ただ、yarnとbowerは今は共存してない様子。
Lockfile
ユーザーやデバイス間にまたがるプロジェクトのライブラリのバージョン違いをなくす。npmでいうshrinkwrap
機能。チーム開発していると頻発するので嬉しい。
Security
パッケージをインストールする前にパッケージをチェックしてセキュリティを高める。キャッシュを使うのもセキュリティ面で効果があるんだろう。
Offline
洗練されたキャッシュシステムで、パッケージのインストールにかかる時間を大幅に減らし、またオフラインでも使用可能になる。速い。
インストール
npm install --global yarn
pip
をeasy_install
したのを思い出した。
使い方
npmとのコマンド対応表
https://yarnpkg.com/en/docs/migrating-from-npm#toc-cli-commands-comparison
npm | Yarn |
---|---|
npm install | yarn install |
(N/A) | yarn install --flat |
(N/A) | yarn install --har |
(N/A) | yarn install --no-lockfile |
(N/A) | yarn install --pure-lockfile |
npm install [package] | (N/A) |
npm install --save [package] | yarn add [package] |
npm install --save-dev [package] | yarn add [package] --dev |
(N/A) | yarn add [package] --peer |
npm install --save-optional [package] | yarn add [package] --optional |
npm install --save-exact [package] | yarn add [package] --exact |
(N/A) | yarn add [package] --tilde |
npm install --global [package] | yarn global add [package] |
npm uninstall [package] | (N/A) |
npm uninstall --save [package] | yarn remove [package] |
npm uninstall --save-dev [package] | yarn remove [package] |
npm uninstall --save-optional [package] | yarn remove [package] |
(N/A) | yarn upgrade [package] |