class_evalを使って、classに自由な名前でメソッドを追加
concernに書くとこんな感じか。
# # include ::Logica::DateRangeSearchable # date_range_name_is :validity, :valid # # klass.valid # -> validity_start_at, validity_end_atが期間内のみ取り出す # instance.valid? # -> validity_start_at, validity_end_atが期間内か # module Logica module DateRangeSearchable extend ActiveSupport::Concern class_methods do def date_range_name_is(name, method_name = nil) method_name = name if method_name.blank? validation_name = "#{name}_start_lt_end_validation".to_sym validate validation_name class_eval <<-EOS def #{method_name}?(now = Time.zone.now) (self.#{name}_start_at.nil? || self.#{name}_start_at <= now) && (self.#{name}_end_at.nil? || self.#{name}_end_at >= now ) end def #{validation_name} if self.#{name}_start_at.nil? || self.#{name}_end_at.nil? return true end if self.#{name}_end_at <= self.#{name}_start_at message = I18n.t('errors.messages.less_than', count: self.#{name}_end_at) self.errors.add("#{name}_start_at".to_sym, message) end end def self.#{method_name}_conds(now = Time.zone.now) a = arel_table[:#{name}_start_at].lteq(now).or(arel_table[:#{name}_start_at].eq(nil)) b = arel_table[:#{name}_end_at].gteq(now).or(arel_table[:#{name}_end_at].eq(nil)) a.and(b) end EOS class_eval do scope method_name.to_sym, -> (now = Time.zone.now) { where(self.try("#{method_name}_conds", now)) } end end end end end
macOSのcurlで海外アクセスのチェックをやるときのproxy設定メモ
macOSのcurlで海外アクセスのチェックをやるときのproxy設定メモ
HTTPのproxy
フリーのproxy情報はこの辺から
http://www.freeproxylists.net/ja/
# 設定 PROXY_HOST=xxx.xxx.xxx.xxx PROXY_PORT=xxxx export http_proxy="http://${PROXY_HOST}:${PROXY_PORT}" # 確認 curl http://ipconfig.io # 解除 export http_proxy=""
HTTPSのproxy
フリーのproxy情報はこの辺から
https://www.sslproxies.org/
# 設定 SSL_PROXY_HOST=xxx.xxx.xxx.xxx SSL_PROXY_PORT=xxxx export https_proxy="https://${SSL_PROXY_HOST}:${SSL_PROXY_PORT}" # 確認 curl https://ipconfig.io # 解除 export https_proxy=""
PostgreSQLでシーケンスの位置を変える
--「テーブル名_カラム名_seq」が名称となる。 -- 確認 SELECT * FROM app_users_id_seq; sequence_name | last_value | start_value | increment_by | max_value | min_value | cache_value | log_cnt | is_cycled | is_called ---------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+----------- users_id_seq | 15711 | 1 | 1 | 9223372036854775807 | 1 | 1 | 30 | f | t -- インクリメント SELECT nextval('app_users_id_seq'); -- 値を直接変える SELECT setval('app_users_id_seq', 20001);
Javascript覚書
// ゼロパディング // 文字列として0をN個連結して、後ろからN個分取る。 ('0000000000' + userId).slice(-10)
Rubyでたまにしか使わないけど便利なメソッドメモ
備忘のため。随時追加していく。
Ruby
# フィールドをもつモックオブジェクトを作る Struct.new(:name, :tel).new('hogeo', '090xxxxxxxx') # => #<struct name="hogeo", tel="090xxxxxxxx"> # irbでeach回して処理した後、そのリストを出力させたくない list.each do |row| # 何かしらの処理 end; 0 # ここで ; 0 入れる。 # getter/setterがないインスタンス変数にアクセス obj.instance_variable_defined?('@hoge') obj.instance_variable_get('@hoge') obj.instance_variable_set('@hoge', 'hogehoge') # 余計な改行コードを chomp で消す fr = File.open('ids.txt', 'r') line = fr.gets # => "0000a432-67cb-4b07-8bba-58780616f6c7\n" line = fr.gets.chomp # => "0000a5bd-cf86-4eda-be5e-0b81dafa5cd0" fr.close
Rails
# 引数の文字列で指定した名前で定数を探す '::MyApp::User'.constantize # => MyApp::User(id: integer, first_name: string, last_name: # ハッシュにシンボルでも文字列でもアクセスできるように hash = { hoge: 'fuga' }.with_indifferent_access hash[:hoge] #=> "fuga" hash['hoge'] #=> "fuga" # モデルやフィールドの日本語名を取得 def t_ar(model, attr = false) if attr return model.human_attribute_name(attr) else return model.model_name.human end end # ハッシュの一部をフィルターする filter = ActionDispatch::Http::ParameterFilter.new(['email', 'password']) filterd_params = filter.filter(params) # 生SELECT文を書く con = ActiveRecord::Base.connection result = con.select_all('SELECT name FROM users') result.to_a
ワンライナー
# yaml文法チェック cat foo.yml | ruby -r yaml -e 'YAML.load STDIN'
# クエリ文字列をURLエンコード require 'cgi' query.split('&').map{|kv| kv.split("=").map{|_kv| CGI.escape(_kv) }.join("=") }.join('&')
DeveloperConsoleに貼って、さっとCORSのチェックをやりたいとき用JS
xhrReq = function(url) { let xhr = new XMLHttpRequest(); xhr.open('GET', url, true); // プリフライト(OPIONSメソッドによる事前確認)をする場合は、 // カスタムヘッダをセットする xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.onreadystatechange = function(){ if (xhr.readyState === 4 && xhr.status === 200){ console.log(xhr.responseText); } }; xhr.send(null); };
シェルでbase64のエンコード・デコード
$ echo -n '{"hoge": "fuga"}' | base64 eyJob2dlIjogImZ1Z2EifQ== $ echo -n 'eyJob2dlIjogImZ1Z2EifQ==' | base64 -D {"hoge": "fuga"}