nslookupメモ
使い方
nslookup www.google.com Server: 192.168.135.1 # 問い合わせたDNSサーバのIP(LAN内のDNSサーバ) Address: 192.168.135.1#53 # 上記 + ポート番号 Non-authoritative answer: # キャッシュDNSサーバがレスしたの意味 Name: www.google.com Address: 216.58.197.196 # ドメインに紐づくIPアドレス # ---------- nslookup www.google.com 8.8.8.8 # 問い合わせるDNSサーバを指定することも可能
オプション
-type タイプ 表示内容をmx(MXレコード、mail exchange)、ns(name server)、soa(start of authority)で指定する -port 番号 使用するポート番号を指定する(デフォルトは53) -timeout 秒数 タイムアウトの値を設定する -debug 問い合わせの内容を表示する
Dockerの基本的な使い方メモ
Dockerを触ることになったので、基本的な使い方をメモしておく。
用語
イメージ: コンテナのベースとなるファイル群
コンテナ: イメージから作成されたインスタンス
pullできるdockerのイメージはここから確認できる
https://hub.docker.com/explore/
基本的なコマンド
# イメージの取得 docker pull keymetrics/pm2 # イメージの確認 docker images # イメージからコンテナを作成 # 末尾のコマンドを指定すると起動時に実行される。 # 指定しないとDockerfileで指定したCMDが実行される。 docker run --name [コンテナ名] -d [イメージID] /sbin/init # コンテナにログイン(exitでログアウト) docker exec -it [コンテナ名] /bin/sh # コンテナの一覧 docker ps -a # コンテナを起動する docker start [コンテナ名] # コンテナを止める docker stop [コンテナ名] # コンテナを削除する(事前にstopしておく必要がある) docker rm [コンテナ名] # イメージの削除 docker rmi [イメージID] docker rmi -f [イメージID] # 強制削除
こちらで勉強させていただきました。
https://qiita.com/butada/items/3e6cd338cb703eef64b4
Dockerfile作る
↓みたいな感じでDockerfileを作る
FROM keymetrics/pm2:8-alpine # 使用するイメージ ARG app_dir=/usr/src/app # 変数の定義 WORKDIR ${app_dir} # 以下のコマンドをこのディレクトリで実行する ENV DEBIAN_FRONTEND noninteractive # 環境変数の設定 入力待ちでブロックしなくなる ENV TZ JST-9 # 環境の設定 タイムゾーンをJSTにする RUN apk add --update perl # perlのインストール(Alpine Linuxのコマンド) # COPYでローカルのファイルをコンテナへコピー # RUNでシェルを実行 COPY ./package.json . COPY ./yarn.lock . COPY ./tools ./tools COPY ./.npmrc . COPY ./public ./public COPY ./ecosystem.config.js ./ecosystem.config.js RUN touch ./public/healthCheck.html RUN yarn install --production --no-progress COPY build/public/assets/ public/assets COPY build/server.js . COPY build/assets.json . # 以降の実行をnodeユーザで行う # CMDはコンテナ実行時のコマンド。Dockerfileの中では1度だけ指定できる。ここではpm2を起動している。 USER node CMD [ "pm2-runtime", "start", "ecosystem.config.js", "--env", "production", "-i", "max"]
Dockerfileのあるディレクトリで実行することで、記載された内容に基づいてイメージを作る。
docker build .
他メモ
## --rmオプションつきで起動して終了するとコンテナ破棄する docker run --rm -t -i ubuntu /bin/bash # ポートフォワード # -pオプションで、外部からアクセスされるポート番号:コンテナ側のポート番号を指定 # -dオプションはバックグラウンドで実行 $ docker run --name some-nginx -d -p 8080:80 nginx
PostgreSQLのEXPLAINについて
PostgreSQLで重たいクエリの調査したときのメモ。
EXPLAINについて
EXPLAINは問い合わせプランを表示するコマンド。
PosgreSQLではSQL実行前に、プランナで問い合わせの実行コストを見積もり、
最小コストの問い合わせプランを算出する(問い合わせの最適化)。
問い合わせプランとは、
・どの方式でテーブルを検索するか
・複数のテーブルがある場合はどの順序や結合方式で検索するか
などを記述したもの。
実行してみる
EXPLAINと先頭につけることでコストが表示される。
cost=初期コスト..トータルコスト の意味。トータルコストの値が重要。
シーケンシャルI/Oで1ページ読み込みコストを1.0とした場合の相対値として表示。
EXPLAIN SELECT * FROM articles ORDER BY articles.id DESC NULLS LAST; QUERY PLAN ------------------------------------------------------------------------------------------------------ Gather Merge (cost=12167.24..13390.38 rows=10636 width=1588) Workers Planned: 1 -> Sort (cost=11167.23..11193.82 rows=10636 width=1588) Sort Key: id DESC NULLS LAST -> Parallel Seq Scan on articles (cost=0.00..3109.36 rows=10636 width=1588)
ANALYZE で 実際の実行時間を表示できる 。
(actual time=158.749..188.486 rows=18081 loops=1)
loopsは処理の繰り返し回数。timeは繰り返し全体の時間を表す。
EXPLAIN ANALYZE SELECT * FROM articles ORDER BY articles.id DESC NULLS LAST; QUERY PLAN ---------------------------------------------------------------------------------------------------------------------------------------------------- Gather Merge (cost=12167.24..13390.38 rows=10636 width=1588) (actual time=158.749..188.486 rows=18081 loops=1) Workers Planned: 1 Workers Launched: 1 -> Sort (cost=11167.23..11193.82 rows=10636 width=1588) (actual time=144.924..153.350 rows=9040 loops=2) Sort Key: id DESC NULLS LAST Sort Method: external merge Disk: 12256kB -> Parallel Seq Scan on articles (cost=0.00..3109.36 rows=10636 width=1588) (actual time=0.049..40.413 rows=9040 loops=2)
EXPLAIN演算子について
テーブルスキャン
Seq scan
インデックスを使わず。全件検索。
Index scan
インデックスを使用してスキャン。
Bitmap scan
ビットマップを使用してスキャン。
ORのときにに有効。インデックスを使って検索した結果をビットマップとして保持し、ビットマップ同士でOR演算する方式。
結合
Nested Loop
ネステッドループ結合を行う。
外部テーブルを1レコードずつ取り出し、その都度内部テーブルの全レコードとマッチングして結合していく方式。
データが小さい場合に向いている。
Merge join
ソート・マージ結合を行う。
事前に両方のテーブルを結合キーでソートし、両方のテーブルを先頭からマッチングしていく方式。→ テーブルを1回調べればよいので、テーブルの操作回数が減る。
データ量が多い場合に向いている。
Hash Join
ハッシュ結合を行う。
事前に内側テーブルのハッシュ表をメモリに読み込み、外側テーブルとハッシュ表を突き合わせて結合。→ メモリ内のハッシュ表の検索は高速。
ソートメモリが十分にある場合に向いている。
制御
・set enable_hashjoin to off を実行すると、プランナはマージ結合を選択する。
・さらに set enable_mergejoin to off を実行すると、プランナはネスト化ループ結合を選択する。
こちらのスライドで勉強させていただきました。
https://www.slideshare.net/MikiShimogai/postgre-sql-explain
sidekiq-unique-jobsのunique値ごとの挙動
ちょっと古いけど、sidekiq-unique-jobs v4.0.8のunique値ごとの挙動を確認したのでメモしておく。
GitHub - mhenrixon/sidekiq-unique-jobs at v4.0.8
while_executing
同じargsは実行中にならない。
同じargsを実行しようとしたらworkerは待ちになる。後続を処理せずに待つ。
同じargsのキューはされる
until_and_while_executing
同じargsは実行中にならない。
同じargsを実行しようとしたらworkerは待ちになる。後続を処理せずに待つ。
同じargsが待機状態になっているときはキューされない。
until_executed
同じargsは実行中にならない。
同じargsを実行しようとしたらworkerは待ちになる。後続を処理せずに待つ。
同じargsが待機状態、または実行中のときはキューされない。
RailsConsoleでSidekiqジョブの状況を見る
運用していると状況確認したいときがあるのでメモ。
## 実行中ジョブ Sidekiq::Workers.new.each do |process_id, thread_id, job| puts "#{process_id}, #{thread_id}, #{job}" end ## 待ち状態のジョブ Sidekiq::Queue.new("#{QUEUE_NAME}").each do |job| puts "#{job}" end ## 削除 Sidekiq::Queue.new("#{QUEUE_NAME}").clear ## リトライ待ちのジョブ Sidekiq::RetrySet.new.each do |job| puts "#{job}" end ## 削除 Sidekiq::RetrySet.new.clear
↑を踏まえてのワンライナーとか
## 実行中キュー確認 Sidekiq::Workers.new.each do |process_id, thread_id, job| puts "#{job['queue']}" end; 0
※参考にさせていただきました。
Sidekiqで実行中・待機状態・再試行のジョブを操作する - Qiita
ActiveRecordで固定の日時最小値チェックのバリデーションを入れる
# # app/models/concerns/my_app/extend_validation.rb # 複数のフィールドに対して一括でバリデーション設定できるようにするために # バリデーションメソッドを追加するモジュール # module MyApp module ExtendValidation extend ActiveSupport::Concern module ClassMethods def validates_min_datetime_gteq(*args) options = args.extract_options! args.each do |key| validates key, min_datetime: (options.present? ? options : true) end end end end end # # app/validators/min_datetime_validator.rb # class MinDatetimeValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) if value.present? && value < Time.zone.parse(Settings.validation.min_datetime) record.errors[attribute] << ( options[:message] || I18n.t('errors.messages.on_or_after', {restriction: Settings.validation.min_datetime}) ) end end end
参考にさせていただきました。
www.techscore.com
cancancanでActiveRecord::RecordNotFoundを出したくないときのパッチ
module MyApp module CanCan module ControllerResourcePatch def find_resource # もともと定義してあるfind_resourceを呼び出す super rescue ActiveRecord::RecordNotFound => e # エラーさせたくないので握りつぶす end end end end CanCan::ControllerResource.prepend MyApp::CanCan::ControllerResourcePatch
書き換え元のメソッドはこちら。
https://github.com/CanCanCommunity/cancancan/blob/1.5.0/lib/cancan/controller_resource.rb#L98
たぶんバージョン違うときは、違うclassのメソッド書き換えが必要。