ホーム ブログ ページ 36

Dockerを試してみる(4)

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Dockerを試してみる(3)の続きです。今回はDockerfileを試してみます。 前回はdocker-composeについて試したので、順番逆なんじゃね?って感じがしますが置きになさらず

Image と Container

Dockerfileを使う前にあらためて ImageとContainerについておさらいします。

DockerはOS上で軽量の仮想環境(コンテナ(Container)と呼ばれる)を実行するためのエンジンとエンジンを操作するツールを提供したものです。たとえば docker run コマンドでは、次のコマンドでDBコンテナを起動させることができます。

$ docker run -d -e "MYSQL_ROOT_PASSWORD=password" --name mysql mysql:5.6

起動したコンテナは次のコマンドで確認できます。

$ docker ps 
  CONTAINER ID IMAGE     COMMAND                 CREATED         STATUS         PORTS    NAMES
  f78a4be66ee8 mysql:5.6 "docker-entrypoint.sh"  15 seconds ago Up 14 seconds   3306/tcp  mysql

この出力にIMAGEという列があります。これはコンテナの大本となる、ファイルや起動コマンドを定義したイメージと呼ばれるものです。上の出力だと mysql:5.6というイメージを使用しています。docker runコマンドの引数でも指定していますね。

このイメージは、Docker Hubというレポジトリにあるものを利用しています。mysqlやmemcachedなどのDocker Hubにあるイメージを使う(pullする)だけで十分かと思います。

しかししばらくすると自分のアプリケーションもコンテナにしたい、ということがあると思います。
その場合、Dockerfileを使ってオリジナルのイメージを作成することができます。

Dockerfile

Dockerのイメージを作成する際に必要なルールを定義したファイルです。
ソースファイルをコンパイルするときに使うMakefileに似たようなものです。

例と実行方法

Dockerfileの例は以下のとおり。

FROM ruby23

RUN yum -y  install mysql-community-devel

COPY docker-entrypoint.sh /
RUN chmod 755 /docker-entrypoint.sh

ENV RAILS_ENV production
ENV PATH /usr/local/ruby-2.3.3/bin:/usr/local/bin:/bin:/usr/bin
ENV RAILS_SERVE_STATIC_FILES false

VOLUME /usr/src/app
WORKDIR /usr/src/app

ENTRYPOINT ["/docker-entrypoint.sh"]

EXPOSE 8080
CMD ["bundle", "exec", "unicorn", "-E", "production"]

このファイルをdocker buildコマンドを使ってビルドします。

$ cd /some/directory
$ vi Dockerfile
$ docker build -t myapp .

文法

Goというプログラミング言語をベースにしています。
コマンド名 引数 が1コマンドで行の先頭から実行されます。

コマンド

コマンド名内容
FROM基本となるイメージを作成する
RUNイメージ内でシェルコマンドを実行する。yumなどでアプリケーションをインストールする場合などに使う。
COPYローカルのファイルを、イメージ内にコピーする
ADDローカルのファイルやディレクトリを、イメージ内に追加する
ENV環境変数を定義する
EXPOSE公開するポートを明示する
VOLUMEマウントポイントを指定する
ENTRYPOINTコンテナ起動時に実行するコマンド(CMDの前に実行される)
CMD引数なしでコンテナを起動したときに実行されるコマンド

【Rails】liquid-railsを使ってみました。【Liquid】

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。


テンプレートの編集機能をに安全に作れるLiquid。 Rails用に使いやすくなったliquid-railsを使ってみたので紹介します。

そもそもLiquidとは何かという事はここでは紹介しませんのでお気をつけください。

使い方

1.Gemfileに追記してbundle install

Gemfile

gem 'liquid'
gem 'liquid-rails'

一応これだけで拡張子が「.liquid」のテンプレートをLiquidとして読んでくれます。

2.Liquid内で使用するモデルのメソッドを設定する

この設定をしないとLiquid内でモデルのメソッドが呼び出せません。
app/models/product.rb

has_many :categories
liquid_methods :name, :price, :categories

3. Liquid内で使いたい変数を設定する

「liquid_assigns」を使用します。下記の設定でコントローラに記述した「@product」等がLiquid内では「product」として呼び出せます。
app/helpers/application_helper.rb

def liquid_assigns
    view_context.assigns.merge(
      params: params,
      hoge: hoge,
      .
      .
      .

    ).stringify_keys
end

4. 「.liquid」の中身の例

構文の詳細は公式を参照してください。

{% for product in products %}
    {% if true %}
      <p>{{ product.name }}</p>
    {% endif %}
{% endfor %}

<p>商品名1</p>
<p>商品名2</p>
<p>商品名3</p>

Filterの使用

Liquid内で変数の加工やタグを作りたい場合があると思います。その場合はフィルターを記述し、読み込みます。liquid-railsでは最初から「javascript_include_tag」等が記述されています。

app/controllers/concerns/liquid_filter_desuyo.rb

module LiquidFilterDesuyo
  def controller
    @context.registers[:controller]
  end

  def view
    @context.registers[:view]
  end

  def page_title(*args)
   I18n.t(controller.controller_name, *args)
  rescue
    nil
  end

  def html_escape(string)
    ERB::Util.html_escape(string)
  end
end

application_controller.rb

before_action :set_liquid_filter
def set_liquid_filter
  Liquid::Template.register_filter LiquidFilterDesuyo
end

Filterの使い方

構文
※引数が無いフィルターは呼び出せません。(たぶん)

{{ 第一引数 | フィルター名:第二引数, 第三引数,....}}

例:

<p>{{ product.name | html_escape }}</p>
<p>{{ product.name | html_escape | simple_format }}</p>

メソッドを繋げることもできます。詳しくは公式へ

実際にエンドユーザにテンプレートを作成してもらう場合にどうするのか?

1.画面からLiquidテキストを入力してもらいviewと同じディレクトリ構造に保存。

RAILS_ROOT/liquid_templates/products/show.liquid

{% for product in products %}
    {% if true %}
      <p>{{ product.name }}</p>
    {% endif %}
{% endfor %}

2.prepend_view_pathを使用し作ったファイルをテンプレートとして呼び出す。

application_controller.rb

before_action :set_view_path
before_action :set_liquid_filter

def set_view_path
  prepend_view_path Rails.root + 'liquid_templates'
end

def set_liquid_filter
  Liquid::Template.register_filter LiquidFilterDesuyo
end

closure-compilerを使用して javascript ファイルを圧縮したときのメモ

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

javascript ファイルを納品する場合に パフォーマンスの改善やセキュリティーの向上の為に圧縮を行う必要があった。今回は closure-compiler を使用させて頂いた。 配布する環境によってスクリプト内で利用するASPサーバやアカウントを分けたかったので環境ごとに圧縮ファイルを出力するようにしてみた。

参考:javascriptを圧縮するwebサービス
http://logic.moo.jp/data/archives/513.html

参考:closure-compiler について
https://developers.google.com/closure/compiler/

インストール(bash)

gem install closure-compiler

コア部分の使い方(ruby)

js_src_string = File.read(original_js_file_path_string)
minified_js_string = Closure::Compiler.new.compile(js_src_string)
File.write minified_js_file_path_string, minified_js_string
# js_src に javascript コードを入れると minified_js に圧縮されたコードが代入される。

こういうのをしました。

require 'rubygems'
require 'closure-compiler'

def gen_minified_js(src, config, out_file)
  # jsソースに xxxx_..._token という文字列を記載しておいて置換する。
  config.each do |k, v|
    key = "xxxx_#{k}_token"
    src.gsub!(key, v)
  end
  File.write out_file, src
end

# 環境ごとの置換文字列
envs = {
  staging: {
    protocol: 'https:',
    host: 'staging.example.com',
    service_key: 'staging'
  },
  localdev: {
    protocol: 'http:',
    host: 'my_development_host', # ローカル開発環境用 hostsファイルに開発サーバのIPで登録してください。
    service_key: 'my_development_key' # xxxテーブルのservice_key を変更してください。
  },
  local: {
    protocol: 'http:',
    host: '192.168.xxxx.xxx',
    service_key: 'our_localtest_key' # 開発メンバー共有テスト環境
  },
  appirits: {
    protocol: 'https:',
    host: 'product.example.com',
    service_key: 'product_development_key' # 本番環境 自社アカウント
  }
}

production_env = {
  protocol: 'https:',
  host: 'product.example.com',
  service_key: 'product_product_key' # 本番環境 納品アカウント
}

# 圧縮対象のjsファイル
src = './workspace/deliverables.src.js'
js_src = Closure::Compiler.new.compile(File.open(src, 'r'))

# 本番用でないファイルはまとめて作る 
js_name_base = './workspace/dir_name_token/js/deliverables.test.min.js'


envs.each do |dir, config|
  gen_minified_js(js_src.dup, config, js_name_base.gsub('dir_name_token', dir.to_s))
end

# 本番用はファイル名が違うようにしたので別途実行
gen_minified_js(js_src.dup, production_env, './workspace/products/js/deliverables.min.js')

※ 上記をファイルに保存し ruby に召し上がって頂く。

Rubyのオブジェクトコピーで気をつけること

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Rubyでオブジェクトを複製する際、知らないとハマってしまいそうなポイントをメモ。

その1:=で代入されるのはオブジェクトの参照

=で代入後、破壊的メソッドを使う場合は注意が必要です。

list1 = ['a', 'b', 'c']``
list2 = list1

list1[0] = 'aa'

list1
=> ["aa", "b", "c"]
list2
=> ["aa", "b", "c"]

list1の変更がlist2にも反映されてしまいました。
初学時に混乱しがちなパターンですが、

list2 = list1

は、list2にlist1の参照を代入する、の意なので、
どちらも同じオブジェクトを参照することになります。

object_idを確認すると、同じオブジェクトを参照していることが分かります。

list1.object_id
=> 70343473882920
list2.object_id
=> 70343473882920

破壊的にオブジェクトの内容が変更された場合、
そのオブジェクト見ている他の変数にも変更内容が反映されます。
 
 

その2:dup、cloneは浅いコピー

これを回避するためにはdup、cloneを使います。
が、いくつか注意点があります。

まずはdup、cloneとも別のオブジェクトとして複製されることを確認。

list3 = [{key:'xx'},{key:'yy'},{key:'zz'}]
list4 = list3.dup
list5 = list3.clone

list3.object_id
=> 70343473688700
list4.object_id
=> 70343473670940
list5.object_id
=> 70343473655820

参照しているオブジェクトが違うので、
list3の変更はlist4, list5に影響しません。

list3.reverse!
=> [{:key=>"zz"}, {:key=>"yy"}, {:key=>"xx"}]
list4
=> [{:key=>"xx"}, {:key=>"yy"}, {:key=>"zz"}]
list5
=> [{:key=>"xx"}, {:key=>"yy"}, {:key=>"zz"}]

しかしこうするとどうでしょう。

list3[0][:key]='ZZ'

list3
=> [{:key=>"ZZ"}, {:key=>"yy"}, {:key=>"xx"}]
list4
=> [{:key=>"xx"}, {:key=>"yy"}, {:key=>"ZZ"}]
list5
=> [{:key=>"xx"}, {:key=>"yy"}, {:key=>"ZZ"}]

それぞれ別オブジェクトなのにlist3の変更がlist4, list5にも反映されてしまいました。
 

dup, cloneは、複製するオブジェクト自体は別物になりますが、
それに含まれる参照先はそのままコピーされるため、
その1と同じ事象が発生してしまいます。(参照先のobject_idが同じ)

list3[0].object_id
=> 70343473688720
list4[2].object_id
=> 70343473688720
list5[2].object_id
=> 70343473688720

これは「浅いコピー」といいます。

dupとcloneはほぼ同じですが、以下の点が異なります。

複製するもの


dup
:汚染状態、信頼状態


clone
:汚染状態、信頼状態、凍結状態、特異メソッド


複製できないオブジェクト


true、false、nil、シンボル、数値

■リファレンス
https://docs.ruby-lang.org/ja/latest/class/Object.html#I_CLONE
 
 

その3:Marshalで深いコピー

Marshalを使うとこの問題が解決します。
Marshalはオブジェクトをシリアライズ/デシリアライズするモジュールで、
いったん文字列(ファイル)として保存したものを読み戻すため、
まったく別のオブジェクトとして複製することができます。

Marshal.load(Marshal.dump(obj))


list6 = Marshal.load(Marshal.dump(list3))
list3[1][:key]='YY'

list3
=> [{:key=>"ZZ"}, {:key=>"YY"}, {:key=>"xx"}]
list6
=> [{:key=>"ZZ"}, {:key=>"yy"}, {:key=>"xx"}]

■リファレンス
https://docs.ruby-lang.org/ja/latest/class/Marshal.html

破壊的メソッドを使う際には、
うっかり複製元/先に変更が影響してしまわないよう
注意が必要です。

【Ruby】変数やクラス定義などのスコープ

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

制御構文ではスコープを作らない(if, while、forなど)

Rubyではifやwhile、forなどの制御構文ではスコープを作りません。

if true
  hoge = 'abcd'
end
p hoge #=> abcd

for i in 0..5 do
  i += 1
end
p i #=> 6

# if, for内で定義された変数は抜けた後も有効

ブロックはスコープを作る(each, map, timesなど)

each, map, timesなどブロックを引数にとるメソッドでは
ブロック内でスコープが作られます。

[0,1,2].each do |i|
  total ||= 0
  total += i
end
p total
NameError: undefined local variable or method `total' for main:Object
        from (irb):2
        from /home/hoge/.rbenv/versions/2.1.8/bin/irb:11:in `<main>'

ブロック内で定義された変数totalには
外部からアクセスできません。

ブロック外で定義した変数はブロック内でも有効です。

total=10
[0,1,2].each do |i|
  total ||= 0
  total += i
end
p total  #=> 13

 
制御構文もdo~endがあってブロックのように見えますが、
ブロックではないそうです(要調査)
 

module, class, defもスコープを作る

module, class, defもスコープを作りますが、少し違います。
この場合は外部<=>内部のアクセスはどちらもできません。

num=10
def fuga
  num ||= 99
end
p num   #=> 10
p fuga  #=> 99

フラットスコープ

同じクラス/メソッド定義でも、class,defを使うとスコープが作られて、
Class.newやdefine_methodを使うと作られない、などもあります。

▼classで定義した場合は外側で定義したxにアクセスできない

x = 'XX'
class Hoge
  def method_x
    x
  end
end
Hoge.new.method_x
NameError: undefined local variable or method `x' for #<Hoge:0x007fe556dbc200>
        from (irb):4:in `method_x'
        from (irb):7
        from /home/hoge/.rbenv/versions/2.1.8/bin/irb:11:in `<main>'

▼Class.newやdefine_methodを使うと外側の変数にアクセスできる

x = 'XX'
y = 'YY'
Hoge = Class.new() do
  p y  #=> 'YY'
  define_method(:method_x) do
    x
  end
end
Hoge.new.method_x  #=> 'XX'

これをフラットスコープといいます。

 
 
 
「メタプログラミングRuby」に詳しく記載があるので
とてもおすすめです。
スコープについての記載がとても興味深かったので、
もう少し読み解いて理解を深めたいと思います。

【SVN】コミットをミスった、とすぐに気づいた時の戻し方と正しいコミットをするまでです【CUI】

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

svnではコミットをなかったことにすることはできません。 コミットする前のリポジトリをローカル持ってきて再度コミットします。 そうすれば履歴は残りますが、リポジトリの最新の状態はミスる前に戻ります。

svnではコミットをなかったことにすることはできません。
なのでコミットする前のリポジトリをローカルに持ってきて再度コミットします。
そうすれば履歴は残りますがリポジトリはミスる前に戻ります。

ローカルのソースはミスった時のリビジョン番号から持ってきます。
それをまたコミットすればいいですね(ミスり方にもよりますが)。

では手順です。

1. リポジトリを最新にします。

svn up

のちにローカルをマージするときのために最新にします。

2. リビジョン番号を確認します。
リポジトリが正しかった時のリビジョン番号を調べます。

svn log

ここではリビジョン番号が100だったとします。

3. 正しかったときのリビジョンにローカルを戻します。

svn merge -r HEAD:100 .

ローカルのファイルが変更されます。
-r HEAD:100でリビジョンを指定しています。HEADはリポジトリで最新のリビジョンを表します。
.はマージ元です。
ローカルのソースが過去のリビジョンに戻りました。

4. 再度コミットします。

svn commit -m “コミットをミスったので過去の状態を再度コミットします。”

これでリポジトリは元に戻りました。
最新のリビジョンが正常だとちょっとほっとしますね。

5. 最後にミスったときのリビジョンからローカルのソースを戻します。

svn merge -r HEAD:ミスったときのリビジョン番号 .

これで、リポジトリとローカルが元に戻りました。

CentOSでのデフォルトゲートウェイの設定方法

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

CentOSでのデフォルトゲートウェイの設定方法について手順をまとめます.

0. 環境について

バージョン: CentOS 6.5

1. ルーティングテーブルの確認

routeコマンドを実行して,
Destination項目がdefaultの, Gateway項目で現状のデフォルトゲートウェイを確認する.

[VM:~] $ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.2.0        *               255.255.255.0   U     0      0        0 eth0
192.168.56.0    *               255.255.255.0   U     0      0        0 eth1
default         10.0.2.2        0.0.0.0         UG    0      0        0 eth0

2. 設定の変更

設定ファイルを編集する

[VM:~] $ sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0
※ ifcfg-eth0 の部分は対象のNICのものを指定

以下のGATEWAY項目を追加もしくは修正
----
GATEWAY=XXX.XXX.XXX.XXX
----

3. 設定の適用

以下のコマンドで, ネットワークを再起動して設定を適用させる.
このとき, 特に注意することとして, 一時的にネットワークが切断されるため,
フェイルオーバのための監視等を行っている場合,
異常と検知されて, フェイルオーバが発生してしまう可能性がある.
そのため, 事前にフェイルオーバが起こらないようにしておくこと.

[VM:~] $ sudo /etc/rc.d/init.d/network restart

変更後に適用されていることを確認(defaultのGatewayの値が, 設定ファイル内で設定した項目になっていること)

[VM:~] $ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.2.0        *               255.255.255.0   U     0      0        0 eth0
192.168.56.0    *               255.255.255.0   U     0      0        0 eth1
default         XXX.XXX.XXX.XXX 0.0.0.0         UG    0      0        0 eth0

4. デフォルトゲートウェイを経由して、外部に接続する際のグローバルIPの確認方法

以下のコマンドにより, 接続するグローバルIPを返却してくれるサービスを利用する.

[VM:~] $ curl http://httpbin.org/ip
{
  "origin": "xxx.xxx.xxx.xxx"
}

Thinreportsを使った感触

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Railsのwebアプリケーション上で、PDFを自動作成させたい、ということがあり、 その際に「ThinReports」というツールを使う機会があったので、 このツールの良い所や、使い辛いと思った所をまとめてみました。

利点

1. 専用のエディタが使える

googlechromeにて、専用のエディタアプリが用意されており、
これを使うことでかなり視覚的にPDFのレイアウトを組むことが出来ます。
アプリは、Chromeのwebストアから無料でダウンロードが可能です。

エディタの画面上で矩形や画像、表を配置することが出来るので、
全てソースから作成するより、PDFの出来上がりが想像しやすいです。
また、要素の座標位置も1px単位で確認できるので、微調整も容易です。

enter image description here

矩形は四角と丸、直線のみですが、細かく調整が可能なため、
組み合わせれば、PDF上に簡単なイラストを描くことも可能です。
この辺りはペイントやパワーポイントで使用できる矩形を想像してもらえれば、
操作性が想像しやすいかと思います。


2. 要素の流し込みが簡単

エディタには矩形とは別に、要素の流し込み先となる枠(テキスト・画像)を作成できる機能が組み込まれています。
流し込み先をレイアウトファイル内に作ってしまえば、あとはrails側で要素を投げるだけでPDFに内容を埋め込めます。

enter image description here

また、Thinreports用のgemがあるので、rails側のセットアップも比較的簡単です。
Gemfile内にgem thinreportsを記述してbundle installすれば、事前準備は完了です。
あとは、コントローラなどからレイアウトファイルに値を渡してあげましょう。
enter image description here

上のコードは、先程のレイアウトファイルに要素を渡し、PDFを出力している所です。
Userモデルの情報をpdf化しています。
値の受け渡しは、基本的にvalueで渡せますが、画像の場合はsrcを使って、画像のパスを渡せばOKです。

欠点

1. 流し込む要素が大きいと対応しにくい

一つの流し込み領域に対して、長いテキストなどを入れる場合、
領域からはみ出すぶんに関して、
「その分領域を拡張する」「文字サイズを縮小する」のどちらかを選択しておくことが出来ます。
ただし、拡張されるのはその領域だけなので、すぐ下に別のテキスト等があると、表示がかぶってしまいます。
文字を縮小すればかぶりませんが、縮小した所だけ不自然に文字が小さくなってしまうので、要素の規定文字数が定まっていない場合、あまり向かないかもしれません。


2. フォントが少ない

enter image description here

細かい所ではありますが、エディタで使用できるフォントが少ないです。
日本語のフォントは「明朝体」「ゴシック体」の二つのみです。
このフォントは流し込みをした要素にも適用されるので、
多様にフォントを使用して、デザインの凝ったPDFを作成したい、という場合は別の方法を取った方がいいでしょう。
一応、開発元のロードマップには、カスタムフォント対応が予定されていますが、
更新の頻度が低いようなので、あまり期待せず待つしか無いようです・・・



以上、Thinreportsを使ってみた感触でした。
目的によって向き・不向きがありますが、視覚的にレイアウトが作れて、
結構きれいなPDFが出力できるので、気になった方は一度触ってみるのも良いかもしれません。

MySQLの出力結果をファイルに出力

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

業務上、UT、IT等でデータベース値とテストシナリオ期待値を見比べる機会があり、
MySQLクライアントで値を見るのに手間を感じ、MySQLの結果をファイル出力出来ないか調べました。

MySQLの出力結果をファイルにはきだしたいとき

mysql> SELECT * FROM [table] INTO OUTFILE "[file]" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '[クォート文字]';

ただし、この方法で指定するCSVファイルの出力パスは、
DBサーバー側のファイルパスを指しています。
そのため、サーバーとクライアントのホストが異なる場合は、
クライアントホストのファイルパスを探しても、CSVファイルは出力されていません。

CSVファイルに出力するコマンド

MySQLクライアント使わない方法もありました。

mysql -u [ユーザー名] -p -h [DBサーバーホスト名] [DB名] -e "`[実行SQL]`" | sed -e 's/\t/,/g' > [出力CSVファイルパス]

このコマンドで、リモートDBの結果をローカルCSVファイルに出力できます。

Burp Suiteを日本語化する方法

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

今まで困難だった、Burp SuiteのメニューとUIの日本語化と、一般的な日本語利用設定をWindows、Mac、Linuxで行います。Burp Suiteは、PortSwigger社が開発を行っているプロキシツールで、脆弱性診断などに使われます。

はじめに

今回Burp SuiteのメニューとUIの日本語化は、Belle(Burp Suite 非公式日本語化ツール)を利用して行います。ツール開発元サイトとその注意事項の確認をお願いします。
Windows、macOS、Kali linuxに導入した、Burp Suiteに対して行っています。Kali Linuxの日本語化については、別投稿を確認してください。

レスポンス内容の文字化け解消

レスポンス内容の文字化けに対応させます。
初期状態ですと、Burp SuiteのProxy機能で表示される、日本語を含むレスポンスの内容が文字化けを起こしています。
「User options Display HTTP Message Display」の「Change font」から日本語表示を可能なフォントに変更してください。
また、Look and feelで、UIの見栄えを変更する事も可能です。

Burp Suite japanese fonts

Burp Suiteの日本語化(Windows)

例は、Windows10へインストーラー版のFree Editionを導入したものです。
インストールされているフォルダ、特に変更していない場合は、
「C:\Program Files\BurpSuiteFree」へ、手順に沿って下記の3ファイルを配置します。

  • javassist.jar
  • belle.jar
  • ja.txt

管理者権限でメモ帳などを起動してインストール先にある、「BurpSuiteFree.vmoptions」を編集します。

Burp Suite windows folder
# Enter one VM parameter per line
# For example, to adjust the maximum memory usage to 512 MB, uncomment the following line:
# -Xmx512m
# To include another file, uncomment the following line:
# -include-options [path to other .vmoption file]
-Xmx12257m
# 以下の行を追記
-javaagent:belle.jar

Burp Suiteの日本語化がされてます。

Burp Suite windows

Burp Suiteの日本語化(macOS)

例は、macOS Sierraへインストーラー版のProfessional Editionを導入したものです。
Finderのメニューから移動アプリケーションを選択してください。
Burp Suiteのappファイルを選択し、control + クリックで「パッケージの内容を表示」を選択してください。
必要な3ファイルをBurp Suiteのjarがあるパス「java/app」に設置します。

Burp Suite Mac app

続いて「vmoptions.txt」を編集します。

Burp Suite Mac app edit

MacでもBurp Suiteの日本語化がされてます。

Burp Suite Mac

Burp Suiteの日本語化(Linux)

例は、Kali Linux(2016.2)のxfceを利用、デフォルトで導入されているBurp Suiteの日本語化を行います。
必要な3ファイルを適当な場所に設置します。(例: /root/.burp/)

メニューから起動する場合のファイルを編集します。

vi /usr/share/applications/kali-burpsuite.desktop

場合によって、編集するファイルは、こちらかも知れません。
「/usr/share/kali-menu/applications/」

Execの行を下記のように変更します。

[Desktop Entry]
Name=burpsuite
Encoding=UTF-8
Exec=sh -c "java -javaagent:/root/.burp/belle.jar -jar /usr/bin/burpsuite"
Icon=kali-burpsuite.png
StartupNotify=false
Terminal=false
Type=Application
Categories=03-webapp-analysis;03-06-web-application-proxies;
X-Kali-Package=burpsuite

Kali LinuxでもBurp Suiteの日本語化がされてます。

Burp Suite Linux

まとめ

各OSで、Burp Suiteの日本語化がある程度可能になりました。
日本語になったことで親しみやすくなると同時に、各項目の意味が直感的に理解できるようになります。
日本語化ツールBelleを作成公開してくださったことに感謝します。

関連記事など

脆弱性診断サービスなど

弊社、アピリッツではセキュリティ診断サービスを行っております。

下記リンクから内容の確認と、問い合わせが可能です。

http://security.appirits.com/

LinuxCentOSキープアライブの設定

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

RickNo42です。今更ですが続き
なキープアライブの設定を紹介します。
環境
・CentOS7の環境2台
 Aサーバ:172.18.0.2
 Bサーバ:172.18.0.3
 割のり当たるてるたんい仮想IP:172.18.0.4
・keepalivedの
目的
AサーバかBサーバ何方かに仮想IPを保持してもらい、
通常時はウェブアクセスをAサーバが受けるが、
Aサーバが死亡したらBサーバでのWebアクセスを受けるように変更する
インストールメソッド
http://www.keepalived.org
よのり最新をダウンロード

wget http://www.keepalived.org/software/keepalived-1.2.22.tar.gz
tar xzvfkeepalived-1.2.22.tar.gz
cdキープアライブ-12.22 /
./configure –prefix = “/”
make && make install
設定方法
[Aサーバー]

#爆の

nmcli d

兄弟タイプ
hogeイーサネットコネクタ数連結1

loループバック管理用-

cd / etc / keepalived /
cp keepalived.conf keepalived.conf.org

vim keepalived.conf

global_defs {
notify_email {
hoge@hoge.com
}
notify_email_from hoge@hoge.com
smtp_server localhost
smtp_connect_timeout 30
router_id LVS_DEVEL
}

vrrp_instance VI_1 {
状態マスター
インターフェイスhoge
smtp_alert
virtual_router_id 1
優先度150
advert_int 1
認証{
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.18.0.4
}

}

[Bサーバー]

#爆の

nmcli d

兄弟タイプ
hogeイーサネットコネクタ数連結1

loループバック管理用-

cd / etc / keepalived /
cp keepalived.conf keepalived.conf.org

vim keepalived.conf

global_defs {
notify_email {
hoge@hoge.com
}
notify_email_from hoge@hoge.com
smtp_server localhost
smtp_connect_timeout 30
router_id LVS_DEVEL
}

vrrp_instance VI_1 {
状態バックアップ
インターフェイスhoge
smtp_alert
virtual_router_id 1
優先度100
advert_int 1
認証{
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.18.0.4
}

}

押し
[A、Bサーバー]

/etc/init.d/keepalived start

[A
サーバー] 172.18.0.4を抜くことをする

/ sbin / ip addr show
[B
サーバー] 172.18.0.4を抜ていないことをする

/ sbin / ip addr show
サーバー
[A1]

/etc/init.d/keepalived stop
//172.18.0.4を抜ていないことをする
/ sbin / ip addr show
[B
サーバー] 172.18.0.4

/ sbin / ip addr show
卓は、172.18.0.4にIPをダウンロードされた先のダウンロードがありにちありません設定の完了です。

少し説明

  • global_defs
    マスターが切り替わった時にメールを飛ばす設定です。
  • vrrp_instance VI_1
    IP毎に設定を記載します。
    メールが来る時にこの名前で飛んで来るので、わかり易い名前にしましょう
    -状態MASTERの
    MASTERかBACKUP設定します。
    MASTERにしたい方の優先度を高くしておきましょう
    (わざと優先順位を同じにする場合もあります)
    -インタフェースホーヘ
    設定するNIC名
  • smtp_alert
    メール通知を行う
  • virtual_router_id 1
    同一NW内でユニークな数値を設定
    詳しく覚ええてるいないが、数値に上限があったはずなので、
    自分で管理して1から付けたほうが良い
    -プライオリティ150
    MASTER:150のサーバが死んでBACKUP:100に移動した場合
    MASTERを -advert_int 1 生死同じ目2秒であり、IPがMASTERで行ってます。priority
    がBACKUPするとだと移動しません。

Firefoxのe10sを有効化してみた

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

e10sとはElectrolysisの略で、Firefoxのマルチプロセス機能のことです。 安定性の向上、マルチコアプロセッサを活用したパフォーマンスアップやセキュリティの強化等のメリットがあります。 e10sの歴史と有効化方法、その効果についてご紹介します。

e10sの歴史

e10sは影響範囲の大きさから、有効になる条件を厳し目に設け、段階的に対象ユーザを広げていく計画となっています。

Firefox 48 (2016/8/1)

  • アドオンをインストールしている場合は対象外
  • 近々サポート対象外となるOS(Windows XPなど)は対象外

Firefox 49 (2016/9/19)

  • e10sと互換性が確認された少数のアドオンのみを利用している環境が対象

Firefox 50 (2016/11/7)

  • WebExtensionsベースの拡張機能またはホワイトリスト掲載の従来型アドオンがインストールされている環境が対象

Firefox 51 (2017/1/24)(←2017/1/27現在はここ)

  • ホワイトリストの拡大

Firefox 52 (2017/3/7)

  • ホワイトリストの拡大

Firefox 53 (2017/4/18)

  • 完全実施。初期設定においてe10sが有効化される

Firefox 51でかなり条件が緩和され、e10sを有効化できる状況になってきました。

e10s有効化方法

e10sは設定で強制的に有効化することもできますが、動作が不安定になるためあまりオススメできません。
2017/1/27現在、最新バージョンのFirefox 51では大分ホワイトリストのアドオンが増えているため、非対応のアドオンを無効化することで、e10sを有効にする方法をご紹介します。
※以下は、Mac OS X 10.11での方法ですが、Windows等もほぼ同じかと思います。

まず、現在e10sが有効化されているかどうかを確認します。URLバーに以下を入力してください。

about:support

表示されたトラブルシューティング情報の「マルチプロセスウィンドウ」の値を確認し、

  • 「1/1(デフォルトで有効)」となってる場合は有効化されています。
  • 「〜無効」となっている場合は有効化されていません。

無効になっている原因は、インストールしているアドオンがホワイトリストに入っていない可能性が高いです。

その場合「Add-on Compatibility Reporter」を使い、各アドオンの対応状況を確認します。

Add-on Compatibility Reporter – mozzilla

Add-on Compatibility Reporterインストール後、Firefoxのアドオン一覧の各アドオンに以下のメッセージが表示されるようになります。

enter image description here
  • Compatible with mutiprocess.:マルチプロセス対応
  • Not compatible with multiprocess.:マルチプロセス非対応

「マルチプロセス非対応」のアドオンをすべて無効にして再起動すれば、e10sが有効化されます。
※マルチプロセス非対応でもe10sの有効化に影響がないアドオンもあるようです。

e10sの効果

さてe10sが有効化されてみての効果(違い)ですが、

  • about:supportのマルチプロセスウィンドウの値が「有効」になった
  • アクティブモニタのFirefoxのプロセスが2つ(FirefoxとFirefox Web Content)に分かれた
  • トータルでのメモリ使用量は少し増えたが(1.3倍くらい)、レスポンスは明らかに改善している(e10s無効の頃は大体1.2GB超えた辺りから重くなって、再起動で対処してた)
  • 大量のタブを表示しても切り替えが早い
  • マルチプロセス対応になっているアドオンでも正しく動作しないものがある(私の場合、Secure Loginが動かなくなった)

今後、Firefox 53で完全にe10sが有効化されたあとは、contentプロセスの複数化、サンドボックス化を予定しているそうです。
さらなるパフォーマンスアップに期待です。

参考サイト

railsでflotを使って日々の胸のサイズをグラフにしてみた

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

巨乳になりたい。 巨乳になりたいので、まずは胸のサイズを毎日計測してグラフ化しようと思いました。(レコーディングダイエット的な。レコーディング巨乳)
グラフ描画用のライブラリは数ありますが、中でも機能的で様々なグラフを描画できるflotを使い、railsでグラフ描画をしてみました。

まずはflotをインストールします。

で、

controllerに

def kyonyu_size
  @kyonyu_size = Size.all
end

(DBには胸のトップサイズ・アンダーサイズが入っています)

viewに

td 
   div (id = "placeholder"
     data-kyonyu-top = "#{@kyonyu_size.top.to_json}"
     data-kyonyu-under = "#{@kyonyu_size.under.to_json}"

app/assets/javascript/admin/kyonyu_sizes.coffee に

class AdminKyonyuSize
  data_object = [
  {
    label: [],
    color: "blue",
    data: [],
    points: { show: true },
    lines: { show: true },
    hoverable: true
  }

  {
    label:[],
    color: "orange",
    data: [],
    points: { show: true },
    lines: { show: true },
    hoverable: true
  }
]

day_label_formatter = (val, axis) -> val + "日"

kyonyu_size: ->
  placeholder = $("#placeholder")
    data_object[0].label = "トップ"
    data_object[1].label = "アンダー"
    data_object[0].data = placeholder.data("kyonyu-size")
    data_object[1].data = placeholder.data("kyonyu-size")

(日毎のトップとアンダーのサイズをグラフにしていきます)

app/assets/stylesheets/admin/kyonyu_size.scss に

.admin_kyonyu_size {
  /* グラフ領域の高さ */
  [id^="placeholder"] {
    height: 300px;
  }
  .center-bold {
    text-align: center;
    color: #000000;
    font-weight: bold;
  }

}

app/assets/javascript/admin/kyonyu_sizes.coffee にオプション追加

options = {
  xaxis: {
    tickSize:1
  }
  yaxis: {
    min: 0,
    minTickSize: 1,
    tickFormatter: (val, axis) -> val + "cm"
  },
  grid: {
    show: true
    backgroundColor: "white",
    hoverable: true,
    autoHighlight: false
  }
}

(グラフにマウスオーバーすると何センチか教えてくれる)

色々と抜け漏れがありそうですがこんな感じです。下はイメージ図。

イメージ図

見事なスイカップになりましたね。どうもありがとうございました。

ブルーライトの影響って?

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

ブルーライトの有害性など、実際どこまでがホントなのか調べてみました。

スマートフォンやパソコンから出る青い光「ブルーライト」。
この光が人体にどんな影響を与えるか、いまいち知っているようで知らないので調べてみました。

調べる前のイメージは「なんとなく目が疲れそう」位の認識しか持っていませんでしが、
ブルーライトの浴び過ぎは目の疲れだけではなく、睡眠に影響を与えたり網膜への傷害などが懸念されていることが分かりました。

そもそもブルーライトとは?

ブルーライトとは、波長が380~500nmの領域にある青色光のことです。
ヒトの目で見ることのできる光=可視光線の中でも、もっとも波長が短く、強いエネルギーを持っています。
太陽光や白熱灯にもブルーライトは含まれますが、パソコンやスマートフォンなどのLEDディスプレイやLED照明には、特に多く含まれています。

ブルーライトが人体に与える影響とは?

青い光は散乱しやすいため、ピントを合わせようと目を酷使する為、目に掛かる負荷が大きい。
一生懸命ピントを合わせようとする分、目に余計な負荷がかかり、疲れ目になりやすいと言われています。

夜、寝る前に、パソコンやスマホなどに熱中して、
ブルーライトを目に浴びすぎると、
その事が“不眠症などの睡眠障害”を引き起こす可能性があります。

寝る前にパソコンやスマホなどを使うと、
デジタル機器の液晶画面から出ているブルーライトによって、
「眠くなるホルモン(メラトニン)」の生産量が低下し、
その結果、目がさえてしまう、といった事になる可能性があるためです。

パソコンやスマホなどを使用する事によって、
夜、ブルーライトを目に浴びすぎると、
体内時計(サーカディアンリズム)や自律神経が乱れてしまい、
なかなか寝つけなくなったり、 翌朝、起きるのが辛くなったりしてくる可能性があります。

ブルーライトは悪いことだけなの?

しかし、ブルーライトは人体に悪い影響だけを与えるものではありません。朝にからだが目覚め、夜になると眠くなる周期を「サーカディアンリズム」といいます。
朝にブルーライトを含んだ太陽光を浴びることはそのリズムを整える効果があります。

メラトニンには、睡眠だけでなく抗酸化作用もあり
細胞の新陳代謝や病気の予防にも効果をもつといわれています。

光刺激にはメラトニンだけでなく、様々なホルモン分泌とも関係しており
自律神経系や脳への影響、また長寿遺伝子の生体リズムとの関係も注目されているそうです。

ブルーライトをカットするために

すぐにできる方法では

  • パソコンやスマホなどの液晶画面の色の設定を変える。
  • パソコンやスマホなどの画面から出るブルーライトを専用メガネやフィルムでカットする。
  • 日中はしっかりと太陽光を浴びる。

まとめ

ブルーライトには「有害」と「有益」の両面があるため、
ブルーライトとの付き合い方は

日中、外を歩く時などは 「ブルーライトをカットする眼鏡」を使用しない。
パソコン・スマホなどを長時間、使用する場合には、
「ブルーライトをカットする眼鏡」等を使用して目の疲労を軽減させる。

睡眠の妨げにならない様に夜、寝る直前には、なるべくパソコン・スマホなどを使用しないようする。

以上がブルーライトとの上手い付き合い方だと思われます。

[macOS Sierra] ssh接続時のkeychain/agentへのパスフレーズ保存の挙動が変わった

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

macOS Sierraでの ssh接続時のkeychain/agentへのパスフレーズ保存の設定方法とkeychainに保存したパスフレーズの削除方法について

背景

今回開発環境のmacOSのバージョンUPを行ったのですが、
ssh接続の際公開鍵認証のパスフレーズ入力を求めるポップアップダイアログが表示されなくなり
コンソール上に直接パスフレーズを入力する挙動に変わりました。
接続のたびにパスフレーズを入力することになり使い勝手が悪くなるため、解決策を調べてみました。

解決策

これはmacOS Sierraからの仕様変更とのことですが、
$HOME/.ssh/configにて
keychainへの追加とagentへの追加のコントロールができるようです。

私が設定したのは以下

Host *
  UseKeyChain no #keychainには保存しない
  AddKeysToAgent yes #agentには登録する

これで再起動するまでは一度入力したパスフレーズが記憶されます。
セキュリティを考慮しkeychainにはパスフレーズは保存していません。

keychainに保存したパスフレーズの削除

keychainに保存したパスフレーズは以下で削除できるようです。

cd ~/Library/Keychains/<UUID>
sqlite3 keychain-2.db 'delete from genp where agrp="com.apple.ssh.passphrases"'

今回確認した環境

OS: macOS 10.12.2

当然ながら公式情報ではありませんので実施については自己責任でお願いします。

ruby で rsa暗号化した文字列を jsで復号する

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

データを暗号化することがいろいろな理由で必要となり試したのでメモします。 暗号方式は rsa を使います。公開鍵で暗号化して秘密鍵で復号します。 ※ 私の試したところだと秘密鍵で暗号化すると復号できませんでした。

環境

ruby は openssl と base64 を使います。
※ require すれば使えるはず。

javascript は jsencrypt.js を使います。
※ https://github.com/travist/jsencrypt

ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
CentOS Linux release 7.1.1503 (Core)

bashでしておくこと

秘密鍵を作ります。
ssh-keygen を使うとデフォルトで
~/.ssh/ ディレクトリに
id_rsa と id_rsa.pub が作成されます。秘密鍵と公開鍵です。
秘密鍵の中身はそのまま使えますが、公開鍵はそのままだと今回の用途では使えないので pem フォーマットにします。
ssh-keygen -f ~/.ssh/id_rsa.pub -e -m pem > ~/.ssh/pem
pem の中身を公開鍵として使います。

rubyでの暗号化

# ライブラリの読み込み

require ‘openssl’
require ‘base64’

class Encryptor
attr_accessor :pub, :public_key
def initialize
# pemフォーマットの公開鍵ファイルの内容を取得
self.pub = File.read(ENV[‘HOME’] + ‘/.ssh/pem’)
# 鍵をOpenSSLのオブジェクトにする
self.public_key = OpenSSL::PKey::RSA.new(pub)
end

# 引数 str を暗号化した結果を返す
def enc(str)
# str に与えた文字列を暗号化します。
Base64.encode64(public_key.public_encrypt(str)).delete(“\n”)
end
end

javascriptでの復号

// jquery と jsencrypt.js を読み込んでおく。

crypted = ‘暗号化された文字列’;
pricate_key = ‘id_rsaファイルの中身のテキスト’;
crypt = new JSEncrypt();
crypt.setPrivateKey(private_key);

// decrypted に復号された文字列が代入される
decrypted = crypt.decrypt(crypted);

参考

jsで暗号化しrubyで復号する
http://qiita.com/shigekid/items/60d3387de6a804bc38b9

CryptoJS
https://jsfiddle.net/hibara/qzono8jb/

perlで暗号化し js で復号する。
http://hatyuki.hatenablog.jp/entry/2013/09/04/151142

MySQL : PostgreSQL コマンド対応

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

MySQL と PostgreSQL のコマンド比較

データベース中にあるテーブルを表示

### MySQL ###
SHOW TABLES;

### PostgreSQL ###
\d

テーブル内容表示

### MySQL ###
DESC table_name;

### PostgreSQL ###
\d table_name

※MySQLのDESCはDESCRIBEの省略

データベース表示

### MySQL ###
SHOW DATABASES;

### PostgreSQL ###
\l

データベース切替

### MySQL ###
USE db_name;

### PostgreSQL ###
\c db_name

拡張表示

### MySQL ###
SELECT col_name FROM table_name \G

### PostgreSQL ###
\x
SELECT col_name FROM table_name;

※PostgreSQLの「\x」は1度実行する毎に拡張表示のON/OFFを切り替える

終了

### MySQL ###
exit

### PostgreSQL ###
\q

NAT 経由でインターネットアクセスする構成でのACL設定について

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

VPC で環境を構築しsubnetをpublic/privateと分離した構成とする場合、privateなsubnetからのインターネット側へのアクセスは基本的にNAT経由となる。 そのような構成のネットワークを組んだ際に外部のNTPサーバと同期させる設定でハマったので設定方法について考え方を整理してみた。

環境

OS及びNTPサーバ/クライアントは以下のとおり。

$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.2 (Maipo)

$ chronyd --version
chronyd (chrony) version 2.1.1 

ネットワーク構成

以下のような構成を想定。

https://gyazo.com/e0e1d6fb247de73861603b404e52d8ee

Privat Subnet 内に EC2 インスタンスを配置。
このインスタンスに NTPクライアント/サーバ(Chrony)を立ち上げてインターネットで公開されているNTPサーバと同期を取る設定を行う。

chrony の設定

ネットワークACLで設定し易くするため NTPクライアントとして使用するポートを固定する(以下の設定を行わない場合は1024以上のエフェメラルポートが使用される)

エディタで /etc/chrony.conf を開き以下の行を追加する。

# client port (udp)
acquisitionport 1123

設定の変更後は chronyd の再起動が必要だが、ACLの設定の後にも再起動が必要なので後述。

参考: chrony – Manual for version 2.3

ネットワークACL

NTPに必要なネットワークACLの設定は以下のとおり。

Public Subnet 側

インバウンドルール

プロトコルポート送信元許可拒否備考
UDP12310.0.0.0/16許可VPC内からのNTPを許可
UDP1024-655350.0.0.0/0許可NATに対するNTPのレスポンスを許可

アウトバウンドルール

プロトコルポート送信先許可拒否備考
UDP1230.0.0.0/0許可NATからVPC外のNTPサーバへのリクエストを許可
UDP112310.0.0.0/16許可private subnet のNTPクライアントへのレスポンスを許可

Private Subnet 側

インバウンドルール

プロトコルポート送信元許可拒否備考
UDP11230.0.0.0/0許可インターネット側から(NAT経由)のNTPのレスポンスを許可する

アウトバウンドルール

プロトコルポート送信先許可拒否備考
UDP1230.0.0.0/0許可インターネットのNTPサーバへのリクエストを許可

動作状況の確認

ACLの設定を変更した場合 chronyd を再起動する。(もしかしたら不要かもしれないが再起動しないとすぐに同期が行われなかった)

$ sudo systemctl restart chronyd

再起動したら以下のコマンドでNTPサーバとの同期の状況を確認する。

$ chronyc sources
210 Number of sources = 4
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^- y.ns.gin.ntt.net              2   6     7     1  -2034us[-2839us] +/-  135ms
^- hachi.paina.jp                2   6     7     1  -4583us[-5388us] +/-   23ms
^* routerida1.soprano-asm.ne     3   6    17     0  -5855ns[-1517us] +/-   13ms
^- jp.f2tec.de                   3   6     7     1  +4904us[+4099us] +/-   64ms

先頭から2文字目が * になっているサーバが同期中のサーバを表している。このようになっていればNTPサーバとの同期が行われている。

設定の解説

設定内容を解説するにあたって、この構成で NTP が使用するポートを整理すると以下の図のようになる。

https://gyazo.com/5b470e494bdaf65a3f73cfa1802c1ede

Public Subnet 側のネットワークACL

Internet <–> VPC(Public) では NTPサーバ側(インターネット側)のポートが 123、NAT Gateway 側(VPC側)のポートが エフェメラルポート(1024〜65535の範囲のいずれかの番号)となる。
よって、Public Subnet 側のインバウンド/アウトバウンドのルールは以下のようになる。

インバウンド(a)

プロトコルポート送信元許可拒否備考
UDP1024-655350.0.0.0/0許可NATに対するNTPのレスポンスを許可

アウトバウンド(b)

プロトコルポート送信先許可拒否備考
UDP1230.0.0.0/0許可NATからVPC外のNTPサーバへのリクエストを許可

次に VPC(Public) <–> VPC(Private) の設定について見てみる。
この場合、NAT Gateway 側(Public)のポートは123、Private側のポートは1123(前述の/etc/chrony.confで設定したポート番号)となる。
よって、 Public Subnet 側のインバウンド/アウトバウンドに必要なルールは以下のようになる。

インバウンド(c)

プロトコルポート送信元許可拒否備考
UDP12310.0.0.0/16許可VPC内からのNTPを許可

アウトバウンド(d)

プロトコルポート送信先許可拒否備考
UDP112310.0.0.0/16許可private subnet のNTPクライアントへのレスポンスを許可

Public Subnet で必要な設定は上記のとおりとなる。

Private Subnet 側のネットワークACL

次に Private Subnet 側の設定を見ていくが、ここの設定については先に「VPC(Public) <–> VPC(Private) 」の設定と送信先/送信元を逆の視点で見た場合の設定を行えば良い。

よって以下のようになる。

インバウンド(e) ← (d)に対する逆

プロトコルポート送信元許可拒否備考
UDP11230.0.0.0/0許可インターネット側から(NAT経由)のNTPのレスポンスを許可する

アウトバウンド(f) ← (c)に対する逆

プロトコルポート送信先許可拒否備考
UDP1230.0.0.0/0許可インターネットのNTPサーバへのリクエストを許可

以上で設定完了。

まとめ

最後にポイントをまとめると…

  • VPC内及びNATがインターネットとの通信で使用する UDP のポート123を許可する。
  • NAT がインターネット側との通信で使用するエフェメラルポートを許可する。
  • VPC内でNTPクライアントとの通信で使用するポート(/etc/chrony.confのacquisitionportに割り当てたポート)を許可する(※)

※acquisitionportを割り当てていない場合はエフェメラルポートとなるはずなのでそれを許可する設定とする必要がある。

自分がハマった点は、2番めの「NATがインターネット側との通信で使用するエフェメラルポート」の存在を見落としていて、ntpdで同期が行われないという現象でした。
また、RHEL7系ではこれまでの ntpd に代わって chrony がデフォルトになっている点も知らず、ntpdがうまく動かない(自動起動に設定していてもchronyが起動すると停止してしまう)という点でした。

RHEL(CentOS)6系から7系でいろいろ変わってるので、ほかの違いも見直しておく必要ありますね。。。

参考

FastjsonのNULLの挙動設定

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

JavaのJSONライブラリにFastjsonというものがあります。 今回はこのFastjsonでレスポンスにnullが含まれる場合の挙動を設定する方法をご紹介します。

Fastjsonとは

まず、Fastjsonについて簡単にご説明します。
Fastjsonは、JavaのオブジェクトをJSON形式に変換したり、逆にJSONをJavaオブジェクトに変換できる、JSONライブラリです。

Fastjson – GitHub

Fastjsonはオープンソースのライブラリで、公開しているのは中国のB2Bマーケット運営で有名なアリババ。

以下の記事によると、他のJavaのJSONライブラリと比較しても高速に動作するようです。

Gson vs Genson vs Fastjson

使い方

では簡単にJavaオブジェクトをJSON形式に変換する方法をご説明します。
上記のGitHubのリンクからダウンロードするか、Mavenの場合はpom.xmlに以下のように記述してインストールします。

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.21</version>
</dependency>

そして、Javaのオブジェクトを渡してあげると、

JSON.toJSONString(hogeForm);

JSON形式で出力してくれます。簡単です。

{
   name: "hoge"
}

nullの挙動設定

では本題のnullの挙動設定です。
デフォルトでは name が null の場合、nameの要素自体が出力されません。

{
}

しかし、nullでも要素は表示しないといけない場合もあります。
そんな時、以下の引数を渡してあげます。

JSON.toJSONString(hogeForm, SerializerFeature.WriteMapNullValue);

すると、

{
   name: null
}

name要素がnullで表示されました。

最後に

上記のGitHubのWikiやIssueを見ると、他にも色々オプションがありそうです。
また機会があれば調べてみたいと思います。

Dockerを試してみる(3)

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Dockerを試してみる(2)の続きです。 今回は複数のコンテナを楽ちんに管理したい〜というツールを試してみました。

■docker-compose

コンテナを複数起動すると管理が煩雑になったり、コンテナの起動順番を気にしながらとか面倒なことが多くなります。また、runでコンテナを実行する際もコマンド引数を覚えたりするのが大変で結局シェルスクリプトを書いたりとか。

そんな面倒を解決してくれるのが、docker-compose というコマンドです。

docker-composeは、Windows/macOS版の docker-toolbox では利用可能になっています。
標準でインストールされていない場合は、docker公式のドキュメント に従いインストールします。

docker-composeの流れ

  1. docker-compose.yml を編集
  2. docker-compose up を実行
  3. docker-compose downでコンテナ終了&削除

前提

railsのサンプルアプリを作って、その直下に Dockerfile を配置します。
今回はクイックスタートを参考に、ruby自体もコンテナを使います。

$ mkdir myapp && cd myapp
$ vi Dockerfile
$ vi Gemfile
$ touch Gemfile.lock
$ vi docker-compose.yml
$ docker-compose run web rails new . -B --force
$ ls -l
$ sudo chown -R myuser:mygroup
$ vi Gemfile
rubyracerのコメントを外す
$ docker-compose build

Dockerfile,Gemfileはこちらを参考

docker-compose.yml

設定ファイルです。railsでおなじみのYAML形式です。

version: '2'
services:
  web:
    build: .
    command: bundle exec rails s -b 3000 -b '0.0.0.0'
    ports:
      - "3000:3000"
    volumes:
      - .:/myapp
    links: 
      - db
  db:
    image: mysql
    environment:
     - MYSQL_ALLOW_EMPTY_PASSWORD=1

アプリ起動

database.yml のホストを db に設定します。その後に次のコマンドを実行します。

$ docker-compose up   # -d オプションを付けるとバックグラウンド実行
$ docker-compose exec web rake db:create

ブラウザで、開くといつもの画面が表示されます。
http://(docker-machine ipのアドレス):3000/

enter image description here

メール認証が発生する登録を目標に設定する場合の注意点|Googleアナリティクス|ユニバーサルアナリティクス

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。今回はメール認証が発生する登録を、Googleアナリティクスの目標に設定する場合における注意点をご紹介します。

多くのサイトで見られるメール認証

最近、会員登録時にメール認証(アクティベーション)を取り入れているWEBサイトを多く見かけるようになりました。

メールアカウントは「所有物認証」と言い、本人にしか所有していないものを利用した認証方法のひとつです。

セキュリティ強度も比較的高いため、数多くの大手WEBサイトで取り入れられています。

また、メール認証だけを先に済ませてもらい、大きな手戻りが生じないことを保証した上で情報入力に移ってもらうという心理的なメリットもあります。

enter image description here

メール認証がある登録までのプロセスと目標の場所

では、メール認証がある登録を行うユーザーの一連のプロセスを見てみましょう。

enter image description here

このようなプロセスの場合、最後の「⑧登録完了」を目標設定に指定するかと思います。

もちろん「⑧登録完了」を設定するのは間違いではありません。
しかし、もう一か所設定すべき場所があります。
それは「④メール認証完了」です。

なぜ「④メール認証完了」を設定するのか

「⑧登録完了」を目標に設定したとします。

この目標を達成したセッションの参照元はどこか、と考えるとユーザーの動きを見る限りでは「①Google検索」です。
しかし、Googleアナリティクスのレポートでは「⑤Yahooメール」が目標に貢献した参照元として記録されます。

なぜ、参照元が「Yahooメール」になってしまったか。
それは、Web上のメーラーから流入した場合、参照元情報に「mail.yahoo.co.jp」という値を付与されてしまうからです。

ここでセッションの定義を思い出してください。

「3.特定のデータ情報が変わるとき」
utm_source、utm_mediumは流入元情報を指すデータです。
要は、流入元が変わるタイミングでもセッションは再定義されます。
参照「Googleアナリティクスのセッション定義 」

Web上のメーラー「Yahooメール」をプロセスの間に挟んでしまった場合、参照元情報が「mail.yahoo.co.jp」に上書きされ、一回の行動内(1セッション内)おいて本来の参照元「Google検索」と目標との紐づけができなくなります。

このように「⑧登録完了」を目標に指定すると、一部の参照元情報が想定とは異なる値で取得されてしまうという事象が発生します。

これを回避するために、「④メール認証完了」の時点での参照元は「Google検索」になるので、「④メール認証完了」合わせて目標にしておくことをお勧めします。

本来の参照元を計測する場合もある

■ダウンロード型のメールソフト

「⑤ Yahooメールにアクセスし認証用メールを確認」

上記のプロセスが、仮に【ダウンロード型のメールソフトで認証用メールを確認】したとします。(Thunderbirdやoutlookなど)

ダウンロード型のメールソフトは参照元情報を持っていません。
参照元情報が空の状態ですので直前の参照元情報を引き継ぎます。
(「⑧登録完了」の参照元が「Google検索」経由として計測されます)

例外

■httpsからhttpへ

httpsページからhttpページのリンクは参照元情報を渡しません。
(ブラウザ側の仕様としてリファラーを送信しないようになっている)

YahooメールやGmailは基本的にhttpsなので、メールのリンク先のURLがhttpの場合はdirect経由として計測されます。

ただしメール認証を目的とするURLであればhttpsであるはずなので、このような状況は稀かと思います。

「マルチチャネルレポート」の存在

「④メール認証完了」を予め目標設定しておくと集客レポート等のコンバージョン指標を表示する際に便利ですが、マルチチャネルレポートを使えば正しく参照元を評価することが可能です。

enter image description here

マルチチャネル レポートはコンバージョン経路に基づいて生成されます。コンバージョン経路とは、コンバージョンや販売に至るまでの 90 日間 にあった一連の接点(チャネルからの参照やクリック)です。
参照「マルチチャネルデータについて」

上記の通り、最大90日間(期間指定可能)の中でのコンバージョン経路を追うため、例え途中で参照元が上書きされても、間接的に最も効果の高い参照元の抽出が可能なレポートになっています。

じゃぁ「④メール認証完了」を目標にする必要ないのでは?と思うかもしれませんが、マルチチャネルレポートはカスタマイズがあまりできません。

単純に参照元分析する上ではマルチチャネルレポートで十分ですが、色々な指標を組み合わせるカスタムレポートや、集客レポート上に表示するには「④メール認証完了」を目標に設定しておくと後々に便利だと思います。

まとめ

メール認証がプロセス内にある場合は、参照元にノイズが発生している可能性があります。

マルチチャネルレポートであれば、正しい参照元の評価は可能ですが、マルチチャネルレポート自体のカスタマイズが難しいため色々な指標を組み合わせて分析する場合には不便です。

メール認証が発生する登録では、完了数だけをカウントするための「⑧登録完了」と、参照元を評価するための「④メール認証完了」の2か所を設定しておくことをお勧めします。

enter image description here

[PR]アピリッツのGoogleアナリティクスサポートサービス

■Google アナリティクス セミナー・トレーニング

アピリッツでは、 Googleアナリティクスセミナー(無料・有料含む)を過去200回以上の開催をしております。ツールのことは勿論、事業内容であるシステム開発、デザイン制作、各ASPツールのサービス展開より得られた「売上向上・受注獲得のための現場のノウハウ」を重視し、皆様のビジネス上での成功をお手伝いできるようセミナーを展開しております。

■Google アナリティクス コンサルティング

Googleアナリティクスの導入・解析・運用・ナレッジ化をサポートします。

■リスティング広告出稿代行

[Google Partner] 当社は AdWords 認定資格に合格しています。
enter image description here

最近人気な記事