ホーム ブログ ページ 37

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

Googleアナリティクス「ユーザー分布」「インタレストカテゴリ」とDoRubyデータの紹

0

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

こんにちは。 今回はGoogleアナリティクスレポート「ユーザー分布」「インタレストカテゴリ」の取得方法・レポート紹介と、本サイト「DoRuby」の実データをご紹介します。

ユーザー分布とインタレストカテゴリ

まずは各レポートの紹介から。

ユーザー分布とは
ユーザーの年齢や性別を確認することができます。

インタレストカテゴリとは
オンラインでの活動や購買行動から判断されるユーザーの興味や関心についての情報を確認することができます。

レポート「ユーザー分布」「インタレストカテゴリ」を有効にする方法

この2つを設定すると有効化されます。

1.プロパティの広告レポート機能を有効にする
enter image description here

2.ユーザーの分布とインタレスト カテゴリに関するレポートをビューで有効にする
enter image description here

ユーザー属性データの収集元

たまに「何のデータを元にこれらの情報を出しているの?」と聞かれるのですが、
Googleアナリティクス公式のヘルプページに具体的な収集元・条件が記載されています。

1.サードパーティの DoubleClick Cookie

  • 対象: ウェブブラウザのアクティビティのみ
  • 条件: Cookie が存在すること
  • 結果: アナリティクスは Cookie に含まれるユーザー属性とインタレスト カテゴリに関する情報をすべて収集します。

2.Android の広告 ID

  • 対象: アプリのアクティビティのみ
  • 条件: Android アプリ内のアナリティクス トラッキング コードを、広告 ID を収集するように更新すること
  • 結果: アナリティクスは ID に基づく識別子を生成します。この識別子には、ユーザーのアプリのアクティビティに紐付けられた、ユーザー属性およびインタレスト カテゴリ関連情報が含まれています。

3.iOS の広告主向け識別子(IDFA)

  • 対象:アプリのアクティビティのみ
  • 条件:iOS アプリ内のアナリティクス トラッキング コードを、IDFA を収集するように更新すること
  • 結果:アナリティクスは IDFA に基づく識別子を生成します。この識別子には、ユーザーのアプリのアクティビティに紐付けられた、ユーザー属性およびインタレスト カテゴリ関連情報が含まれています。

https://support.google.com/analytics/answer/2799357?hl=ja#where

上記いずれかの情報が無い場合は、情報が収集されずレポートにも反映されません。
収集データが不足する場合は、表示されている情報がデータ全体の何パーセントに対応するものかがレポート上に記載されるようになります。(「年齢 – 合計セッションの 41.39%」など)

多くの方が行っているウェブページの解析の場合、DoubleClickのCookieで収集されることになります。
では、DoubleClickのCookieがどのタイミングで付与されるのかというと、検索時やウェブサイト閲覧時に広告が表示、もしくはクリックされた場合に、発生元のブラウザにCookie情報が送信されます。ブラウザがCookieを受け入れた場合、Cookieはブラウザに保存されているのです。

このこの保存されたCookie情報を元に、アナリティクスは「ユーザー分布」「インタレストカテゴリ」に関する情報を収集・レポート化するという仕組みです。

知らない間に色々収集されている・・・ということですね・・・!

DoRubyのユーザー分布

それでは早速、本サイト「DoRuby」のデータを見てみましょう。
直近のデータです。
enter image description here

圧倒的に男性、しかも若者が多いですね。
IT業界ならではのユーザー属性ではないでしょうか。

逆を言えば、女性のアクセスが少ない!

私も含めこの業界で働く女性も増えていると思うので、
仮に今後アクセスを増やす場合、そういった女性エンジニアならではの記事や
例えば女性が多いデザイナー関連記事を用意することで
より多くの方に見てもらえるサイトになるかもしれません。

DoRubyのインタレストカテゴリ

インタレストカテゴリは以下の3つの軸でユーザーのカテゴリを確認することができます。

アフィニティカテゴリ:
 訪問者のライフスタイルや広範囲な嗜好
購買意志の強いセグメント:
 積極的にオンラインでリサーチし、購入意向を示しているユーザーセグメント
 (リピート間隔やアクセス頻度などで判定しているらしい)
その他カテゴリ:
 特定コンテンツの消費性向

直近の「DoRuby」のデータはこんな感じです。
enter image description here

■アフィニティカテゴリ(上位3件)

  1. ハイテク好き(5.38%)
  2. ビジネスの専門家(4.19%)
  3. 写真愛好家(3.96%)

■購買意志の強いセグメント(上位3件)

  1. ソフトウェア/ビジネス生産性ソフトウェア(6.06%)
  2. ビジネスサービス/ビジネステクノロジー/ Webサービス/ Webデザイン&開発(4.84%)
  3. ビジネスサービス/ビジネステクノロジー/エンタープライズソフトウェア(4.47%)

■その他カテゴリ(上位3件)

  1. インターネット&通信/ Webサービス/ Webデザイン&開発(7.14%)
  2. コンピュータ、電化製品/ソフトウェア/オペレーティングシステム/ Linux&Unix(6.72%)
  3. コンピュータ、電化製品/エンタープライズテクノロジ/データ管理(5.46%)

ITに関する技術情報を取り扱っているので、それに関連するカテゴリの訪問者が多いようです。

アフィニティカテゴリに「写真愛好家」がランクインしていますね。
レンズやカメラ、撮影の記事はないので、ちょっと謎でしたが
じつは弊社には写真好きの社員が何人もいます。

これは私の感覚ですが、IT系はメカニックなカメラも好き、ということかもしれません。

本サイト「DoRuby」にはカメラ撮影関係記事は無いので、
もしかしたら、これらの記事を投稿すると意外とページビューを集められるかもしれませんね。

以上、ユーザー分布・インタレストカテゴリと本サイトDoRubyデータの紹介でした。

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

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

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

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

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

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

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

スマホアプリのHTTPS通信をBurp Suiteで確認

0

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

今回は、スマートフォンアプリ等のHTTP、HTTPS通信をWi-Fi接続から、プロキシツールBurp Suiteを経由させることによって通信内容を確認します。脆弱性診断の為の方法ではありますが、サーバサイドやアプリの開発にも利用できるかと思います。

はじめに

Burp Suiteは、ウェブアプリケーションの脆弱性検査を行うことができるツールです。利用の仕方により不正アクセス行為と判断される可能性があります。またサービス停止やデータの破損が起こる場合もありますので事前にバックアップを行うなどしてください。そして必要に応じて管理者の許可を得て利用してください。

概要

ノートパソコンの無線LANをAPモードにして、通信を経由させる方法などもありますが、環境によって設定が複雑な場合や、うまく動作しないことがあります。今回はプライバシーセパレータなどの設定されていないWi-Fiルータにスマートフォン接続。スマートフォンの通信を、Wi-Fiルータ経由で接続できるPCにプロキシツールを用意し内容を確認します。

前回は、プロキシツールOWASP ZAPを利用する投稿をしましたが、今回はBurp Suiteを利用してみます。英語のメニューがわかりにくい場合は、Burp Suiteを日本語化する方法も試してください。

また以前に投稿した、Kali Linuxには、Burp Suiteの他にも、OWASP ZAPやwiresharkがインストールされています。
wiresharkなどで別のプロトコルの通信など詳細に確認を行うことも可能です。

Burp Suiteについて

Burp Suiteは、PortSwigger社が開発を行っているプロキシツールで、JAVAで作成されているためWindowsやMac、Linuxなどの環境で動作します。Burpは、日本語の処理など難がある部分もありますが、手動で脆弱性診断を行う場合に有用なツールです。Free EditionとProfessional Editionがあり、今回の内容はFree Editionでも行うことができます。

確認機種

参考までに今回は下記のような環境で確認しています。

  • macOS Sierra
  • Burp Suite 1.7
  • iphone 7 ios10
  • Android 4.2.2

Burp Suiteの設定

まず通信を経由させるPCでプロキシツールBurp Suite起動します。Burp Suiteのデフォルトの設定では、自身を起動しているローカルPCからの接続のみを許可しているので、他の端末からも接続を受け付けるよう設定を変更します。
設定箇所は、ProxyタブのOptionsタブ内Proxy Listenersで、デフォルトのものを選択しEditからBind to addressをAll interfacesに変更するなどします。
デフォルトのものを変更せずに、Addでポートを変えたものや、受け付けるインターフェースを変えたものを用意し切り替えるという方法にすることも可能です。(もちろん同じポートに複数設定はできません)
また、このPCのIPアドレスを確認しておきます。
Burp Suite ポート設定

ios端末の設定

Burp Suiteを起動しているPC経由で通信を行うように、ios端末を設定します。設定、Wi-FiでプロキシPC側と通信が行えるAPと接続を行います。HTTPプロキシを手動に設定し、プロキシPCのIPアドレスとBurp Suiteで設定を行ったポート番号を指定します。
ios端末 プロキシ設定

Burp Suiteのinterceptがoffになっていることを確認し、端末のsafariなどのブラウザで通信が行えるか確認します。
次にSSL通信の内容を確認できる状態にするための設定を行います。端末のブラウザで http://burp/ を表示します。
表示がされない場合は、プロキシPCのIPアドレスやポートを指定して接続してみてください。
右上のCA certificateをタップし、端末に証明書を導入します。
ios端末 Burp ios端末 証明書

android端末の設定

android端末でもios端末と同様のことを行いますが、OSや機種によって設定方法が異なる場合や、そもそも設定変更できる部分がないものも存在するので注意が必要です。
Wi-Fiで長タップ?ネットワークの変更を選択します。プロキシホスト名、プロキシポートにBurp Suiteが起動しているプロキシPCの情報を入れます。

android端末 wifi設定
android端末 プロキシ設定

端末のブラウザで http://burp/ を表示します。右上のCA certificateをタップし、端末に証明書を一旦内部ストレージにダウンロードします。
設定、セキュリティで、内部ストレージからインストールをタップし、先ほどダウンロードした証明書を導入します。
android端末 Burp android端末 証明書インストール

Burp Suiteで通信の確認

上記の設定をしたうえで、アプリを使い通信を行うと、通信内容がBurp Suiteで確認が行える状態になっています。
ProxyタブのHTTP historyでHTTPS通信が行われているか、内容が取得できているか確認してみてください。
Burp Suite

おわりに

iosアプリは、ATS(App Transfer Security)の有効化が今後必須になるようです、対応のためHTTPS通信の確認が今以上に必要になってくるかもしれません。今回紹介した方法をテストや確認に活用していただければと思います。
以上、スマホアプリの通信をBurp Suiteで確認する方法についての紹介でした。

関連記事など

脆弱性診断サービスなど

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

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

http://security.appirits.com/

エンジニア見習いが最初に覚えるべき4つの習慣

0

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

「インターン生と新卒はこの4つだけでも覚えて帰ってね!٩( ᐛ )و」という習慣について。

1.十分に理解していないコマンド(コード)を使わない

初心者はしばしば「どお”じでぞんなごどす”るの”!」と言いたくなるコマンドを実行します。本番環境や共有サーバーで理解してないコマンドを打つのは油田で花火大会するぐらい危険です。ローカル環境でさえオプションも含めてちゃんとコマンドの意味を理解してから実行する習慣が必要です。

unixのコマンドは非対話が基本なので「え? 本当にやってええの? 取り返しつかんで?」とは確認してくれません。crontab -l と crontab -r は全然違います。あぁ! 試しに打とうとしないで!

とにかく「なんでこのコマンド打ったの?」「このオプションはなに?」という質問が来る前提で作業します。同じように目的を達成出来る他のコマンドを使わずに、そのコマンドを選んだ理由まで答えられると尚良いです。業務では「よくわからないおまじない」と言う概念はありません。

2.変更する前に復旧出来るようにしておく

設定を弄ったら開発環境が壊れちゃった……。
一日がかりで直す羽目になったみんなー! 元気ぃー!? (ゝω・)v

変更する前に切り戻し出来るように準備しておくと余計な時間が取られません。設定ファイルの変更前にcpでバックアップを取る、git管理する、仮想環境のスナップショットを作成するなど。

特に環境を作った直後や初心者期間は必ず失敗したり上手く行かなかったりします。死んだ顔でOSを入れ直すのを避けるために復旧手段を定期的に確保しましょう。初心者以外も「今この本番環境のDBを間違えてドロップしたらどうなるんだろう…」といった無害で危険な妄想を日頃からしておくと良いことがあるかも知れません。備えよう。

3.何か変更や作業をしたら意図通りになったか確認する

「もしかして道に迷ってる?」
「今いる位置がわからないから迷ってるかどうかもわからない」

変更したら確認するまでが作業、家に帰るまでが遠足。何か設定の変更をしたり作業を終えたら、次の作業へ移る前に出来るだけ反映されたかどうかを確認します。

これをサボると上手く行かなくなった時に原因の切り分けが難航しがちです。どこまでは上手く行っていて、どこからが上手く行かないのか認識するために確認を適宜挟みましょう。

4.事前に見通しを立ててみる

今から取りかかろうとしている作業を細分化して「どんな作業が必要で」「どれくらい時間がかかりそうか」を考えてみます。最初に見通しを立てる習慣があると思わぬ作業上の障害が予見できたり効率よく進めることが出来ます。

というより、何が必要か大雑把にでも見通しを立てずに作業を始めると手戻りや計画変更、他人の作業待ちが延々と発生します。必要な作業を綿密に洗い出して影響範囲やリスクを調べることが出来れば既に仕事は8割くらい終わっています。実際にコマンドを打ったりコードを書く時間は作業全体で見ると短いものです。

まとめ

4つに共通して言えるのが「業務なら絶対におさえておくべきポイントだけど、業務以外では教わる機会がない」という点ですね。意外にこの辺が言語化されてなかったので今回はこんな記事を書きました。覚えて帰ってね!٩( ᐛ )و

最近人気な記事