OmniAICreator/Qiita-1.07M huggingface dataset:
rspecで"`"（バッククォート）によるコマンドの実行をスタブする


## 例えばこんなコードがあったとして

```rb
class Directory

  def initialize(path)
    @path = path
  end

  def list
    `ls -1 #{@path}`.chomp.split("\n")
  end
end
```

`list`メソッドをテストしたいですが、実際にコマンドが実行できるように
ディレクトリやファイルを作るのは、ちょっと。。。なので
コマンド実行部分をスタブしたいです。

## こうします

```rb
describe Directory do
  subject { dir.list }

  let(:dir) { described_class.new('/path/to/dir') }

  before do
    stdout = %w(file1 file2 file3).join("\n")
    allow(dir).to receive(:`) { stdout }
  end

  it { is_expected.to eq(%w(file1 file2 file3)) }
end
```

テスト対象の`Directory`のインスタンスに対して`` ` ``（バッククォート）メソッドが呼ばれたら
`stdout`を返すようにします。

### なぜ自分自身（テスト対象のインスタンス）にスタブするのか

`` ` ``メソッドは、[`Kernel`モジュールのメソッド](http://rurema.clear-code.com/2.3.0/method/Kernel/m/=60.html)で、
`Directory`クラスのスーパークラス`Object`は`Kernel`モジュールをincludeしているからです。

## バリエーション

- 複数の`Directory`クラスのインスタンスをテストで使う場合

```rb
allow_any_instance_of(described_class).to receive(:`) { stdout }
```

- 全てのコマンド実行をスタブしたい場合

```rb
allow_any_instance_of(Kernel).to receive(:`) { stdout }
```

## まとめ

最初`` ` ``をクラスメソッドと勘違いして、``allow(Kernel).to receive(:`)``としていたので
テストを実行すると普通にコマンドが実行されるという、残念なことになっていました。

こういうテストを書かないといけないケースは稀かも知れませんが
知ってると役に立つかもしれません。
[kodevelopers]ruby on railsマスター

#ruby文法


|No  |タイトル(link)  |担当  |
|---|---|---|
|1  |rubyバージョン管理 |@yunzeroin  |
|1-1  | [rbenvとは](http://qiita.com/yunzeroin/items/33a51c805e60ed5eca0e) |@yunzeroin  |
|1-2  |[rvmとは](http://qiita.com/yunzeroin/items/f685c66a5455d354f6b6) |@yunzeroin  |
|2  |Gem ||
|2-1  |ファイル構成 ||
|2-2  |オープンソースのエチケット ||
|2-3  |Bundler＆依存関係の管理||
|3  |変数 ||
|3-x  |[インスタンス変数](http://qiita.com/negabaro/items/e32bb5a4ffe80f7cac76) |@negabaro|
|3-x  |[アクセスメッソド](http://qiita.com/negabaro/items/a2dc40ccafff094e8b2f) |@negabaro|
|3  |オブジェクト指向プログラミング |  ||
|3-1  |クラス＆モジュール |  ||
|3-2  |属性＆メソッド |  ||
|3-3  |継承＆ミックスイン|  ||
|4  |関数型プログラミング|  ||
|4-1  |ブロック|  ||
|4-2  |Proc＆ラムダ|  ||
|5  |フロー制御|  ||
|5-1  |条件分岐|  ||
|5-2  |繰り返し|  ||
|6  |REPL(対話型評価環境)＆デバッグ|  ||
|7  |メタプログラミング|  ||



#ruby on rails

|No  |タイトル(link)  |担当  |参考|
|---|---|---|---|
|1  |rails何がうれしいの？ |  ||
|2  |MVC |  ||
|2  |REST |  ||
|3  |ORM（オブジェクト・リレーショナル・マッピング）|  ||
|4  |ユーザー管理|  ||
|5  |規約＆ベストプラクティス|  ||
|6  |CLI（キャラクタユーザインタフェース）|  ||
|7  |ActionMailer|  ||



---------------------------

####参考

http://qiita.com/jnchito/items/063e332cbe3023f52f93?utm_campaign=popular_items&utm_medium=referral&utm_source=popular_items
BaseX のインストールと Scala から BaseX を操作 (Ubuntu)

 
BaseXのインストールと起動
--

### 環境
```sh
cat /etc/lsb-release
# DISTRIB_ID=Ubuntu
# DISTRIB_RELEASE=14.04
# DISTRIB_CODENAME=trusty
# DISTRIB_DESCRIPTION="Ubuntu 14.04.4 LTS"
arch
# x86_64
```

### BaseX のインストールと BaseXServer の起動

```sh
# install
sudo apt-get install basex
# start as service
basexserver -S
```

typesafe-activator のインストール
--
なくてもいいけど便利だから使います[(インストール方法)](http://qiita.com/takezo/items/d48007d653a963572cdf)

BaseXClient の利用
--

### プロジェクト作成

project名は **basex-scala** で進めていきます．

```sh
activator new basex-scala minimal-scala
```


### クライアントライブラリの取得

Java によるデフォルトの実装が最もサポートされそうなので，それを Scala で利用[(クライアント一覧)](http://docs.basex.org/wiki/Clients)

```sh
cd basex-scala
mkdir -p libs src/main/java/org/basex/examples/api

basex_dir=`pwd`/libs/basex
lib_file=basex-examples/src/main/java/org/basex/examples/api/BaseXClient.java

git clone https://github.com/BaseXdb/basex.git $basex_dir
git --git-dir=$basex_dir/.git config core.sparsecheckout true
echo $lib_file > $basex_dir/.git/info/sparse-checkout
git --git-dir=$basex_dir/.git -C $basex_dir read-tree -m -u HEAD

ln -sf $basex_dir/$lib_file src/main/java/org/basex/examples/api/BaseXClient.java
```

BaseXClient.java を継承して利用したい場合

```sh
sed -i -e "s@final class BaseXClient@class BaseXClient@" $basex_dir/$lib_file
git --git-dir=$basex_dir/.git -C $basex_dir add .
git --git-dir=$basex_dir/.git commit -m "Make it extendable"
```

### サンプルコードの実行

XMLの出力やnodeの挿入，nodeの値変更のサンプル
コードは[Gist](https://gist.github.com/9dcbac93aac6b557e762a6665eec8c03.git)にあるので内容はそちらで (サンプルコードは BaseXClient.java を継承するようになってます)


```sh
rm src/main/scala/com/example/Hello.scala
git clone https://gist.github.com/9dcbac93aac6b557e762a6665eec8c03.git src/main/scala/com/example/

activator run
# =>
# <!-- this document is in test.xml -->
# <?xml version="1.0" encoding="UTF-8"?>
# <root>
#   <person id="1">
#     <name>A</name>
#     <height>175</height>
#     <weight>85</weight>
#   </person>
#   <person id="2">
#     <name>B</name>
#     <height>180</height>
#     <weight>91</weight>
#   </person>
# </root>
# 
# <!-- this document is in test.xml -->
# <?xml version="1.0" encoding="UTF-8"?>
# <root>
#   <person id="1">
#     <name>A</name>
#     <height>175</height>
#     <weight>85</weight>
#   </person>
#   <person id="2">
#     <name>Z</name>
#     <height>180</height>
#     <weight>91</weight>
#   </person>
# </root>
```
[kodevelopers]linux基礎


|No  |タイトル(link)  |担当  |参考|
|---|---|---|---|
|1  |環境変数の読み込み順番  |@yunzeroin  | [これ](http://oxynotes.com/?p=5418)|
|1-1  |ubuntuのsecure_pathについて |@negabaro| |
|2  |ubuntuのネットワーク設定変更|| |
|2  |自分のIPアドレス確認方法|| [自分のIPアドレス確認](http://qiita.com/sharow/items/66d89136180884a2f7b7#comment-2c77351f925481e49c1b)|
|3  |SSL鍵作成方法|| |
|3-1  |SSL/TLS仕組みとは|| |
|4  |Linux操作コマンド調査|| |
|4-99  |make install|| |



#Shell Script

|No  |タイトル(link)  |担当  |参考|
|---|---|---|---|
|1  |hello world|| |
|2  |シェルの記号||[シェル記号類まとめ ](http://x68000.q-e-d.net/~68user/unix/pickup?%A5%B7%A5%A7%A5%EB%B5%AD%B9%E6%CE%E0%A4%DE%A4%C8%A4%E1) |
JSON-LDでMicrodataのitemrefみたいなことをする方法

Microdataの場合、idとitemrefによって重複した情報を使いまわす仕組みがある。

```html
<div id="meta-author" itemtype="http://schema.org/Person" itemprop="author" itemscope>
  <h2 itemprop="name">Life is good</h2>
</div>

<!-- 省略 -->

<article itemtype="http://schema.org/Article" itemscope itemref="meta-author">
  <h2 itemprop="headline">Hoge hoge</h2>
</article>

<article itemtype="http://schema.org/Article" itemscope itemref="meta-author">
  <h2 itemprop="headline">Fuga fuga</h2>
</article>
```

同じようなことをJSON-LDで実現するには、`@id`を使う。

```html

<!-- Person -->
<script type="application/ld+json">
{
  "@context": "http://schema.org",
  "@type": "Person",
  "@id": "http://liginc.co.jp/#author",
  "name": "Life is good",
  //省略
}
</script>

<!-- Artice -->
<script type="application/ld+json">
{
  "@context": "http://schema.org",
  "@type": "Article",
  "headline": "Hoge hoge",
  "author": {"@id": "http://liginc.co.jp/#author"},
  // 省略
}
</script>

<!-- Artice -->
<script type="application/ld+json">
{
  "@context": "http://schema.org",
  "@type": "Article",
  "headline": "Fuga fuga",
  "author": {"@id": "http://liginc.co.jp/#author"},
  //省略
}
</script>
```

# 参考

[構造化データにおいて、値の流用（引用？継承？冗長性の抑制？変数化？エイリアス化？）を行いたい - Google プロダクト フォーラム](https://productforums.google.com/forum/?utm_content=buffer974a0&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer#!topic/webmaster-ja/GCt6LAEZLc8)
MSYS2のRubyではファイル名をUTF-8で指定しないとならない模様

Windows上でRubyを使うときの話です。

先日、[メインマシンで使うコマンドラインツールを極力MSYS2でインストールするようにした](http://blog.livedoor.jp/maraigue/archives/1799559.html "Maraigue風。:[短信] コマンドラインツールはなるべくMSYS2でインストールするようにした")のだが、その結果、日本語を含むファイル名を扱う一部のRubyスクリプトが動かなくなった。

結論から言うと、**MSYS2のRubyでファイル名を指定する場合は、スクリプトのエンコーディングに関わらずUTF-8のものを指定しないと、ファイル名を正常に認識できない**模様。

----

例を以下に挙げる。

```filename.rb
#!/usr/bin/env ruby
# -*- coding: Windows-31J -*-
puts File.readlines('てすと.txt').size
```

「てすと.txt」というファイルの行数を出力するだけのスクリプトである。ここでスクリプト2行目にある通り、スクリプトの文字コードはShift_JISで保存しているものとする（なぜWindows-31Jと書くのかについては、例えば[この記事](http://qiita.com/yugo-yamamoto/items/0c12488447cb8c2fc018 "Windows-31Jに変換する時の例外を防止するためのString拡張 - Qiita")を参照）。

このスクリプトを動かすと、まずRubyの2.3.0p0 x64-mingw32版（[RubyInstaller for Windows](http://rubyinstaller.org/ "RubyInstaller for Windows")で公開されているもの）では

```
>cat てすと.txt
foo
bar
buz

>ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x64-mingw32]

>ruby filename.rb
3
```

と意図した通り動いてくれるのだが、Rubyの2.3.0p0 x86_64-msys版（MSYS2のpacmanでインストールできるもの）では

```
>ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-msys]

>ruby filename.rb
filename.rb:3:in `readlines': No such file or directory @ rb_sysopen - ▒Ă▒▒▒.txt (Errno::ENOENT)
```

と、シフトJISで書かれたファイル名を正しく認識してくれないのである。

なお、スクリプトを以下のように修正したらx64-mingw32版、x86_64-msys版ともに問題なく動いた。なのでおそらく、MSYS2のファイル処理APIの仕様の違いなのだろうなあ。

```filename.rb
#!/usr/bin/env ruby
# -*- coding: Windows-31J -*-
puts File.readlines('てすと.txt'.encode('utf-8')).size
# ファイル名についてはUTF-8にしたものを使う
```
gitをyumでインストール

# Linux Serverに入って色々設定するのをたまにしかやらないので覚書
AWSのEC2サーバにて、いちいちコンパイルとかやりたくないのでYumにてinstallしたい。

## 基本の流れ
1.wgetのインストール
2.リポジトリを追加
3.yumにてgitのインストール

### 1.wgetのインストール

```shell-session
sudo yum install wget
```

### 2.repository
yumのリポジトリ設定のディレクトリに移動し情報を取得する  

```shell-session
$ cd /etc/yum.repos.d/
$ sudo wget http://wing-repo.net/wing/6/EL6.wing.repo
```

### 3.gitのインストール

```shell-session
sudo yum install git
```

簡単だけどメモ代わりに。
iTerm2ショートカット備忘録

iterm2のよく使うショートカットを備忘録としてまとめました。
随時更新していく予定です。
他にこんなのあるよとかありましたら、教えて下さい！(他力本願!万歳!)


### ウィンドウ

| ショートカット       |説明 |
|:-----------------|:------------------|
| cmd + n          |新しいウィンドウを表示|
| cmd + w          |ウィンドウを削除|
| cmd + d          |ウィンドウを縦に分割|
| cmd + shift + d  |ウィンドウを横に分割|
| cmd+[            |次のウィンドウへ移動|
| cmd+]            |前のウィンドウへ移動|

### タブ

| ショートカット       |説明 |
|:-----------------|:------------------|
| cmd + ;          |タブを作成|
| ctrl + tab       |タブの移動|





### 検索、履歴

| ショートカット       |説明 |
|:-----------------|:------------------|
| cmd + +          |オートコンプリート(過去に入力した文字を表示)|
| cmd + shift + h  |ペースト履歴|
| cmd + f          |検索|
| cmd + g  |前の候補に移動|
| cmd + shift + g  |次の候補に移動|
| ctrl + r  |過去のコマンドを検索|


### スクリーン

| ショートカット       |説明 |
|:-----------------|:------------------|
| cmd + +          |文字の拡大|
| cmd + -          |文字の縮小|
| cmd + 0         |元に戻す|
| cmd + Enter      |フルスクリーン表示|
| cmd + u          |透過度のONとOFF|
| ctrl + l         |画面をスクロールアップ|
| opt + cmd        |カーソル形状が十字に変わり矩形選択モードに変化|


### 移動

| ショートカット       |説明 |
|:-----------------|:------------------|
| ctrl + b         |1文字を戻る|
| ctrl + f         |1文字を進む|
| ctrl + -         |入力を戻す|
| ctrl + a         |行頭へ移動|
| ctrl + e         |行末へ移動|
| cmd + k         |画面をクリア|


### カット

| ショートカット       |説明 |
|:-----------------|:------------------|
| ctrl + k         |カーソル位置から行末まで一気にカット|
| ctrl + d         |カーソル位置から行末までカット|
| ctrl + w         |単語ごとにカット|
| ctrl + u         |カーソルの行をカット|
Androidの開発中にコードを消してしまい開発機にインストールしたAPKにのみコードが残っている場合の対処方法


# 概要
* 開発中に手が滑って`git checkout .`してしまい未コミットのコードが消えた
* 実機で開発中だったため端末内にAPKが残っている
* APKからコードをサルベージする

# APKのパスの確認

adbを使い端末にインストールされているAPKのパッケージパスを確認する。

```
$ adb shell pm list packages -f | grep horie1024
package:/data/app/horie1024.jp.sample-1/base.apk=horie1024.jp.sample
```

この場合、パスは`/data/app/horie1024.jp.sample-1/base.apk`になる。

# 端末からAPKを取得

以下のコマンドを実行し端末からAPKを取り出す。

```bash
$ adb pull /data/app/horie1024.jp.sample-1/base.apk
[100%] /data/app/horie1024.jp.sample-1/base.apk
```

これで`base.apk`を取り出せる。

# 逆アセンブル

## apktoolのインストール 

apktoolをHomebrewでインストールする。

```bash
$ brew install apktool
```

## 逆アセンブルの実行

```
$ apktool decode base.apk
```

実行後に`base`ディレクトリが生成されるので、それ以下にファイルが出力されている。

# サルベージ
AndroidManifestやlayoutなどのxmlはほぼそのままサルベージできる(match_parentがfill_parentになっていたりする)。Javaのコードについては、smali形式となっているので慣れないと読み取りにくい。

# 参考
* http://ibotpeaches.github.io/Apktool/
* http://techbooster.jpn.org/andriod/environment/7754/
* https://kanatoko.wordpress.com/2011/01/21/android%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0/
GoogleAppsScript スプレッドシート扱った時詰まった所　その１

GoogleAppsScriptを使っていて詰まったことをメモし同じ過ちで時間を費やさないようにメモ

今回の詰まりどころは、SpreadsheetApp.getActiveSheet()

ハマったのはWebアプリケーションUrlを叩いて（doget）スプレッドシートからXml→Jsonを生成するメソッドを読んだ時だった。

Urlを叩いて落としてくるためにdoGet内に生成するメソッドを移したところ

```gas

function createXml { 

var sheet = SpreadsheetApp.getActiveSheet();

var prefixValues = sheet.getRange(1,1, lastRow, 1).getValues()

var lastRow = sheet.getLastRow();
```

getRangeやgetLastRowでスプレッドシートが参照ができないエラーが起こった。

２、３時間以上悩んだ結果たどり着いたのがSpreadsheetApp.openById(シートID）でスプレッドシートのIDをとってきて
そこからgetSheetByName（シート名）でシート名をとってくることによって解決した。

```gas

function doGet(){
  inputsheet = SpreadsheetApp.openById('シートID');
  inputSheetname = inputsheet.getSheetByName("strings");
  return createXml(inputSheetname);
}
```

多分、SpreadsheetApp.getActiveSheet()はスプレッドシートのカスタムボタンから叩いていたのでスプレッドシートが認識できていたが、外部からだとIDとシート名を教えてあげないと認識ができないのだと思う。
CodeIQ「『アフター・ドット』問題」に参加しました

[CodeIQ「『アフター・ドット』問題」](https://codeiq.jp/q/2831)の掲載期限が終了したということで、提出コードを公開したいと思います。なお詳しい内容については、広大なネットの海を探してください(´・ω・`)

```rb

class Solver
    def initialize(n)
        @n = n
    end

    # bをただひとつに決めたとき、(a / b)が有限小数となるaの数を求める
    def g(b)
        b /= 2 while b % 2 == 0
        b /= 5 while b % 5 == 0
        @n / b
    end

    # 問題中のF(n)。
    def f
        (1..@n).reduce(0){|sum, b| sum + self.g(b)}
    end
end

n = gets.to_i
solver = Solver.new(n)

p solver.f
```

$1 \leq a \leq n$および$1 \leq b \leq n$を満たす整数$a$と$b$について、$\frac{a}{b}$が有限小数になる条件は__「$\frac{a}{b}$を既約分数にしたとき、その分母が$2$と$5$以外の素因数を持たないこと」__です。ここで$b$を素因数分解したとき、$2$と$5$以外の素因数を掛け合わせたものを$x$とします。いいかえれば$b$を$2$と$5$で割れるだけ割った、その残りが$x$となります。

$a$が約数として$x$を持つとき、いいかえれば$a$が$x$で割り切れるとき、aとbは次のように表すことができます。

```math
\begin{align}
a &= n \times x \\
b &= 2^i \times 5^j \times x 
\end{align}
\\
(nは1以上の整数,iとjは0以上の整数)
```

よって$\frac{a}{b} = \frac{n}{2^i \times 5^j}$であり、その分母は$2$と$5$以外の素因数を持ちませんから、有限小数です。要するに$\frac{a}{b}$が有限小数となる条件は__「$a$が$x$の倍数であること」__となります。

以上の性質を利用して、本問を解くわけですが、その手順は以下のようになります。

1. $b$をただひとつに固定する
2. $2$と$5$で$b$を割りつくすことにより$x$を求める
3. $1$以上$n$以下の整数に含まれる$x$の倍数の総数をもとめる。
    4. これを$G(b)$とする
4. $b$を$1$から$n$の範囲で動かしながら、$G(b)$の合計値を求める

***

今回の問題については、コードゴルフ勢と高速化勢が(いい意味で)暴れまわっていたので、公開されたコードを読むのがちょっと楽しみです。そういう「特殊部隊」と比べると、わたしの解答コードは普通……。すみません(´・ω・`)
iPhoneの画面回転(Upside Down)

iPhoneの画面を逆さにも対応させたい時にDevice Orientationを変えるだけではできなかったので、のやり方をまとめます。

# 普通にやると
通常はプロジェクト作成するとDevice Orientationのうち以下3つがデフォルトでチェックされています。
・Portrait(縦)
・Landscape Left(横向き 左回転)
・Landscape Right(横向き 右回転)
逆向きも対応したい場合は
・Upside Down(縦　逆向き)
にもチェックを入れればOKかと思いきやそうもいきません。
<img width="755" alt="スクリーンショット 2016-07-07 22.52.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/1c2173d0-d354-5191-59f4-032a5ee1dbae.png">
この状態で実行すると逆向きになってくれません。↓
![beforeImg.gif](https://qiita-image-store.s3.amazonaws.com/0/110485/61db9613-8c2f-7e91-d05d-f921a9483013.gif)

# こうやるとできる
ViewControllerでメソッドを1つオーバーライドすると逆向きにも対応できます。

````swift:ViewController.swift
    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        // 許可する画面を追加
        let orientation: UIInterfaceOrientationMask = [UIInterfaceOrientationMask.Portrait,
                                                       UIInterfaceOrientationMask.PortraitUpsideDown,
                                                       UIInterfaceOrientationMask.LandscapeLeft,
                                                       UIInterfaceOrientationMask.LandscapeRight]
        return orientation
    }
```
これで実行するとうまくいきます↓
![afterImg.gif](https://qiita-image-store.s3.amazonaws.com/0/110485/3f6fe063-bbf4-b7d3-d58c-e63e16dc6c69.gif)
ネットワークルーティングのメモ

# はじめに
インフラ構築やアプリケーションのネットワーク構成を設計する際、ルーティングの動きさえ分かっていれば、ルーティングテーブルに何を設定したら良いのか、どのように結線したら良いのかなどが分かると思います。そこでルーティングの基本の基本をメモとして記載します。IPアドレスやセグメント(=サブネット)についても説明しようと思いましたが、長くなるのでこれらについては知っているものとします。

# ルーティングとは
ルーティングとは、**特定の宛先IPアドレス(またはセグメント)に向けて送信された通信パケットを、どのネットワークインタフェースから送出したら良いかの対応付け**のことです。この対応付けの一覧のことをルーティングテーブルと言います。

![Qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/108822/affa6a85-f7bb-68a3-dd94-232c70012d93.jpeg)

言葉だけだと分かりづらいので絵で説明します。上の絵の色のついた小さい四角はネットワークインタフェースを表しています。色はセグメントを表していて、同じ色は同じセグメントのIPアドレスを持っているとします。この構成において、サーバーAからセグメントの違うサーバーBに通信したい場合を考えます。サーバーAのアプリからサーバーBのIPアドレスを宛先としてパケットを送信しますが、ルーティング設定が無い場合、サーバーAのどちらのインタフェースからパケットを送出したら良いか分かりません(図の点線矢印)。ルーターにおいても同じです。**この点線矢印のどちらを選んだら良いかを教えてあげるのがルーティング**です。

# ルーティング設定コマンド
ルーティングはWindows, Linuxともに**route**コマンドで、参照・設定ができます(オプションはもちろん異なりますが)。ルーターの設定コマンドについてはスイッチのマニュアルに従ってください。

例えばLinuxの場合、ターミナルで`route`と叩くと、以下のようなカラムが表示されます。`Destination`が宛先IPアドレス、`Gateway`はデフォルトゲートウェイ、`Genmask`はセグメント、`Iface`はeth1などの送出インタフェース名です。他にもありますが、この4項目さえ分かっていれば設定できます。

`Destination  Gateway  Genmask  Flags  Metric  Ref  Use  Iface`

# デフォルトゲートウェイ
上にも出てきましたが、ルーティングの設定には**デフォルトゲートウェイ**という設定があります。通信パケットの宛先がルーティングテーブルに無い場合にデフォルトで送出するネットワークインタフェースを定めたものです。このデフォルトゲートウェイは本来システムに1つだけ設定されるものです(デフォルトの設定が2つ以上あるって変ですよね)。でもWindowsやLinuxでは、ネットワークインタフェース毎に設定できてしまいます。**実際、ネットワークインタフェース毎に設定しても有効になるのは1つだけです。**混乱するので、ネットワークインタフェース毎のデフォルトゲートウェイではなく、上記のrouteコマンドでデフォルトゲートウェイを設定することをお勧めします。

# その他の注意事項
上の絵のようにサーバーが複数のネットワークインタフェースを持つ場合、**冗長化したいなどの理由が無い限り**、個々のネットワークインタフェースのセグメントは分けることをお勧めします。同じセグメントにしても、ルーティングを適切に設定すれば問題無いのですが、混乱の元になるかと思います。

# さいごに
ルーティング設定は、サーバーやルーターの**内部**において、通信パケットをその**宛先に応じてどのインタフェースから送出するか**を決定するためのものです。これさえ覚えておけば、ルーティング設定やネットワーク結線で迷うことは無くなると思います。
Linux版Unityエディター：試験的ビルドのインストール

LinuxにUnityエディタのインストールをします。
[Linux版Unityエディター：試験的ビルドをリリースしました](http://blogs.unity3d.com/jp/2015/08/26/unity-comes-to-linux-experimental-build-now-available/)

##インストーラダウンロード
http://blogs.unity3d.com/jp/2015/08/26/unity-comes-to-linux-experimental-build-now-available/
上記URLからインストーラをダウンロードします。
今回は環境非依存の方を~/Downloadsディレクトリにダウンロードしました。
執筆時点でのファイル名は```unity-editor-installer-5.1.0f3+2015082501.sh```でした。

##インストール実行
```
$ sudo sh ./unity-editor-installer-5.1.0f3+2015082501.sh
Installer for Unity 5.1.0f3

Press Enter to begin extracting to ./unity-editor-5.1.0f3

Unpacking Unity 5.1.0f3 ...
Extraction complete. Run ./unity-editor-5.1.0f3/Editor/Unity to begin

```

もし、サインイン画面で、
Service not available, please try again later
と表示された場合は、私の環境では以下のコマンドで実行できました。


```
$ LD_PRELOAD=/lib/x86_64-linux-gnu/libresolv.so.2 ~/Downloads/unity/Editor/Unity
```

調べてみると、wineのバージョンをあげたら解決した人もいたようです。

以上で無事完了です。お疲れ様でした。
d3.jsでnode.depthとnode.heightを使って要素をfilteringして表示

#version
d3.jsのversionは**4.1.0**です。

# シンプルなTree図を用意
[d3.js version4でシンプルなTree図を作成 - Qiita](http://qiita.com/naoyashiga/items/f1c53a739e40e3ef4fc0)

#Code
[dataViz-playground/sketch/tutorial/hierarchies/tree/src/js/components at 216a82ad1ce8f386ca73ef2c98cfefab6b9dcb02 · naoyashiga/dataViz-playground](https://github.com/naoyashiga/dataViz-playground/tree/216a82ad1ce8f386ca73ef2c98cfefab6b9dcb02/sketch/tutorial/hierarchies/tree/src/js/components)

# depthとheight
depthはrootからの深さを、heightは葉(末端)からの距離を表します。depthとheightを使っていろいろ試してみます。

```
node.depth - zero for the root node, and increasing by one for each descendant generation
node.height - zero for leaf nodes, and the greatest distance from any descendant leaf for internal nodes
```

[d3/d3-hierarchy: 2D layout algorithms for visualizing hierarchical data.](https://github.com/d3/d3-hierarchy#hierarchy)
## depthを指定

```js:Link.js
this.element = parentSvg.selectAll(".link")
.data(root.descendants().slice(1).filter(function(d) {
  return d.depth > 1;
}))
```
descendantsを使い、最も上の階層であるrootの子要素をすべて配列で取得します。それをfilterを使って、depthが1より大きいと指定します。
![スクリーンショット 2016-07-07 21.44.47.png](https://qiita-image-store.s3.amazonaws.com/0/26043/1fafb627-dfc5-14e8-278a-2dfc3e48f715.png "スクリーンショット 2016-07-07 21.44.47.png")


すると、深さが1より大きい部分だけpathが引かれました。

## heightを指定

```js:MyNode.js
this.element = parentSvg.selectAll(".node")
// .data(root.descendants())
.data(root.descendants().filter(function(d) {
  return d.height >= 1;
}))
```
filterを使ってheightを1以上に指定します。
![スクリーンショット 2016-07-07 21.53.45.png](https://qiita-image-store.s3.amazonaws.com/0/26043/926c4a47-b1fd-5ef8-e757-f97aa6d18146.png "スクリーンショット 2016-07-07 21.53.45.png")
葉はheight=0なので葉が消えます。
Recruit Technologies Open Lab #03 参加メモ

[Recruit Technologies Open Lab #03 テーマ：Infrastructure as Code](https://atnd.org/events/78581) に行ってきたのでメモ。ハッシュタグは [#rtechlab](http://twitter.com/search?q=%23rtechlab) だって。

[会場の動画 2h18m](https://www.youtube.com/watch?v=RFTdM8SUmf4) が公開されてます。

## ["Infrastructure as Code" から数年、結果どうなったか](https://speakerdeck.com/naoya/infrastructure-as-code) by 伊藤 直也 (一休.com CTO)

- 要約:「IaC によってアプリのプラクティスがインフラに適用できるようになった ▽ それだけ?　いや、DDDでも「モデリングすることで戦略的に活かせる」っていってるよね。インフラストラクチャをモデリングすることが大事になってくるよ、きっと。」
- 感想: なるほど同意。Coinfigを机上検証できるようになるといいな。楽しみ。▽ 今のプロジェクトのインフラさんたちの「品質を上げるには目玉の数を増やす」という発想をどうにかしないと。どうにかしたい。

## [Infrastructure as Code と企業文化](http://slide.meguro.ryuzee.com/slides/75) by 吉羽 龍太郎 (ryuzee.com)

- 要約: 「コンウェイの法則『組織構造がアーキを決める』。(1)集約したインフラチーム (2)クロスファンクションなインフラチーム (3) 各チーム内のインフラ屋。(3)に加えて特化チームをつくるのがよい。▽ しかし一朝一夕に組織は変わらない。偉い人と渡り合う覚悟を持って小さく始めて意地でも成功事例を作るんだよ」
- 感想: 勇気をもらった。ユーザ企業に支援参画している立場だけど、がんばる。問題認識を共有するところから始めて、うまくいけばコンサルしてもらって背中を押してもらいたい。

## [Infrastructure as Code のこれまでとこれから](https://speakerdeck.com/mizzy/infrastructure-as-code) by 宮下 剛輔 (Recruit Technologies ATL)

- 要約: 「これからは、ChefとかAnsibleとかの重要度が下がってきて、テストとモニタリングが重要になってくるよ、きっと。▽ あと、インフラ層が自律的な制御を手に入れたり、形式手法を適用できるようになってくるよ、きっと。」
- 感想: テストとモニタリング重要。わかったやってみる。▽ アロイって [AWS Summit Tokyo 夜の JAWS-UG 懇親会](https://jaws-days.doorkeeper.jp/events/44387) LT で出てきたやつかな? これだこれだ → [JAWS-UG Nightレポート](http://ascii.jp/elem/000/001/176/1176254/) ▽ [Terraform](https://www.terraform.io/) また出てきた。知らない単語。調べてみよう。 → 調べた。[RightScale](http://www.rightscale.com/)みたいな、[HashiCorpによるオーケストレーションツール](http://dev.classmethod.jp/cloud/terraform-first-impression/)だって。

## [運用・監視もコード化する。開発者が監視まで考える方法論](http://songmu.github.io/slides/recruit-technologies-open-lab-3/#0) by 松木 雅幸(id:Songmu) (株式会社はてな)

- 要約: 「運用監視は難しくない。実はインタフェースはデファクトがある:　OK/NG系のメトリクスはコマンドの終了コードで 0/0以外を返す。数値系のメトリクスは標準出力で "メトリクス名△値△timestamp"を返す。アプリエンジニアなら作れるだろう? あとは [mackerel](https://mackerel.io/ja/) でよしなにやるぜ ▽ 通知は WebHook が楽しい、夢がある」
- 感想: インタフェースのデファクト、参考になった。絶賛検討中の [Graphite](http://graphiteapp.org/) が登場してて実感わいた。いま部分最適に陥ってることがわかった。悶々。▽ そういえばSNMPは? ▽ あと、[Hinemos](www.hinemos.info/) がデファクトに沿ってるか確認しとかないとだ。

## [プロビジョニングツールはMakeで決まりだろ](https://speakerdeck.com/katzchang/purobiziyoninguturuhamakedejue-maridaro) by 大谷 和紀 (VOYAGE GROUP)

- 要約: 「それMakeでできるよ。冪等性?　そんなの夢だったじゃん。インフラだってスクラップアンドビルドする時代だよ。」
- 感想: そうだ。冪等性は夢だ。ところで、アプリとインフラはスクラップアンドビルドできて幸せな時代が来たけど、データはどうすればいいんだろうか??

----

あとね、

- 発表者のみなさん、主催者のみなさん、ありがとう。面白かった!
- 開始時刻の時点で補欠順位14位でも潜り込んだよ! 座席7割くらい埋まってたかな。パブリックビューイング会場が用意されててほっとした。うれしかった。
- ビルきれいだった。エレベータが速すぎてちょっとこわかった。
- 懇親会に申し込めばよかった。講演者に挨拶しないなんて勉強会に行った意味ないじゃん……
- TODO: 手書きのメモを添付すること。
- 稲尾さん、なんか記事書きたいです。
- linoさん、ご挨拶もそこそこですみません。
git pushとブランチの追跡

git pushした時の挙動でちょっと躓いたのでメモ

#リモートブランチの追跡有無によるpush時の挙動の違い

カレントブランチがリモートブランチを追跡している場合、
`git push`で追跡しているブランチにpushできる。

```
$ git push
```

カレントブランチがリモートブランチを追跡していない場合、
`git push`だけだと怒られる。

```
$ git push
fatal: The current branch <branch_name> has no upstream branch.
To push the current branch and set the remote as upstream, use
```

カレントブランチがリモートブランチを追跡していない場合でもこのコマンドならpushできる。

```
$ git push origin <branch>
```

-uオプションをつけることで、
カレントブランチの変更をリモートにpushしつつ、そのブランチを追跡できるようになる。

```
$ git push -u origin <branch>
```

-uオプションをつけたあとは`git push`のみでpush可能になる。



#ブランチの作成と同時に追跡させる

ローカルのブランチからブランチを作成すると、
リモートブランチとローカルブランチの関連付けが無いため追跡していない。

```
$ git checkout -b branch-a
Switched to a new branch 'branch-a'
```

リモートブランチからクローンしてローカルにブランチを作成すると、
自動的に追跡できる。

```
$ git checkout -b branch-b origin/develop
Branch branch-b set up to track remote branch develop from origin.
Switched to a new branch 'branch-b'
```

#追跡しているリモートブランチを確認するコマンド

```
$ git branch -vv
```

#参考
- [Git 再入門: 引数がない git pull のデフォルトの挙動 (アップストリーム, トラッキングブランチについて)](http://www.yunabe.jp/docs/relearning_git_pull_default.html)
- [3.5 Git のブランチ機能 - リモートブランチ](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81)
SSH のアクセス制限された GCP に Circle CI からデプロイする

表題の通り，GCP(Google Cloud Platform) でいうところの `default-allow-ssh` などに特定のIPアドレスが指定されているケースで，Circle CI（など）から自動デプロイさせたいと思ったらちょっと困ったという話です．

## 方針

公開しているサーバに対して，社内など一部の場所からのみ ssh アクセスできるようにすることが多いと思います．
GCP だと例えばこんな感じになると思います．
![image](https://qiita-image-store.s3.amazonaws.com/0/8597/8d349311-cb47-a603-cfaf-02d6aed65a97.png)

その場合，外部のCIサービスから自動デプロイさせたい場合，CIサービスのIPアドレスに対して ssh 接続を許可しないといけないですが，Circle CI の場合，IPアドレスが固定されていません．

そこで，デプロイの都度，自身の IP アドレスを取得して，デプロイ先の許可アドレスに追加することにします．
また，その IP アドレスは次回は使用されない可能性が高いので，デプロイが完了したら許可アドレスから削除することにします．

## gcloud コマンドを利用する

Circle CI では `gcloud` コマンドが使用できるので，それを使用します．
=> cite: https://circleci.com/docs/google-auth/
※ 上記の内容には `init` は書かれていないのですが，使用できなかったため，最初に `gcloud init` をしています

```sh
setup_gcloud() {
    echo $GCP_CLIENT_SECRET | base64 --decode > ${HOME}/client-secret.json

    yes no | gcloud init
    gcloud --quiet components update
    gcloud auth activate-service-account --key-file ${HOME}/client-secret.json
    gcloud config set project $GCP_PROJECT
}
```


ここで， `$GCP_CLIENT_SECRET`, `$GCP_PROJECT` の環境変数はあらかじめウェブ上から Circle CI に登録しておきます．
![image](https://qiita-image-store.s3.amazonaws.com/0/8597/3794f6ae-af0c-1bcc-369b-85ba23f850e9.png)

`setup_gcloud` を実行すると，gcloud への認証が済むので，続いて GCP の firewall-rules の変更ができるようにします．

### GCP のファイアウォールルールを動的に変更する

まずは，実行時の circle ci サーバの GLOBAL_IP を `dig` コマンドで取得しておきます．

```sh
GLOBAL_IP=`dig +short myip.opendns.com @resolver1.opendns.com`
```

IPアドレスの変更ができるようにしますが，この時，デプロイ前の設定値を取得しておくと，元に戻すのが楽です．
（↓ 変数が雑に書かれてますが，関数呼び出し前に定義してある想定です）

```sh
fetch_default_source_ranges() {
    gcloud compute firewall-rules describe default-allow-ssh --format json | jq -r '.sourceRanges | join(",")'
}

update_gcp_firewall() {
    gcloud compute firewall-rules update default-allow-ssh --source-ranges "${DEFAULT_SOURCE_RANGES},${GLOBAL_IP}"
    
}

rollback_gcp_firewall() {
    gcloud compute firewall-rules update default-allow-ssh --source-ranges $DEFAULT_SOURCE_RANGES
}
```

※ `default-allow-ssh` は各自の設定名に読み替えてください．

デプロイ前に `update_gcp_firewall` で許可IPを追加し，終了時（エラー時）に `rollback_gcp_firewall` で，設定を戻します．
この時，あらかじめデプロイ前の許可IPを `fetch_default_source_ranges` によって取得しておきます．

Circle CI では `jq` が使えたので使ってます．
使えるコマンドがいろいろと用意されている良いですね．

## まとめ

まとめると，以下のようになります（関数定義は除く）．

```sh
setup_gcloud

GLOBAL_IP=`dig +short myip.opendns.com @resolver1.opendns.com`
DEFAULT_SOURCE_RANGES=fetch_default_source_ranges

update_gcp_firewall

// デプロイ: bundle exec cap dev deploy など

if [ $? -eq 0 ]
then
    rollback_gcp_firewall
    // slack 通知など
    true
else
    rollback_gcp_firewall
    // slack 通知など
    false
fi
```

実行すると，デプロイ直前と完了後に，このようなちょっとわかりづらいログが出ているのが分かります．

![image](https://qiita-image-store.s3.amazonaws.com/0/8597/e4773398-0013-0ff5-b29a-9e5352f39213.png)

以上です
画像処理をするときに、iTermの画像表示機能が便利

iTermの新しいバージョンには、[ターミナル内に画像を表示できる機能](https://www.iterm2.com/documentation-images.html)がついている。

![image](https://qiita-image-store.s3.amazonaws.com/0/275/6b1ec702-6caf-13b4-68b6-9839283b176d.png)
([公式ページ](https://www.iterm2.com/documentation-images.html)の画像を転載)

画像処理などのプログラムを書くとき、ちょっとした変更を加えて実行するのを繰り返して何度も試行錯誤することが多い。そういうときに、iTermの画像表示コマンドを使うと高速にトライアンドエラーできて捗る。

たとえば、画像から顔認識するプログラムを書くとする。このとき、**標準出力に画像バイナリを出力するようにしておく。**

```python
import cv2
import sys

path = sys.argv[1]

cascade_file = "/usr/local/Cellar/opencv/2.4.12_2/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml"

image = cv2.imread(path)
cascade = cv2.CascadeClassifier(cascade_file)
faces = cascade.detectMultiScale(image)

(x, y, w, h) = faces[0]

flag, buf = cv2.imencode('.png', image[y:y+h, x:x+w])
print(buf.tobytes())
```

pipeして画像表示コマンドに流すとiTerm内に画像を表示できる。画像を名前をつけて保存したり、GUIで表示したりする処理をプログラムに書かずにすむ。

```
python face_detect.py ~/Downloads/trump.jpg | term-img
```
![image](https://qiita-image-store.s3.amazonaws.com/0/275/5d020b20-dc90-a96c-ce72-eaf9925afa8c.png)

[term-img](https://github.com/sindresorhus/term-img-cli) というnpmで入るコマンドを使っている。公式のimgcatコマンドでも同じだと思う。

画像を保存したい場合は、標準出力を保存すればいい。
```
python face_detect.py ~/Downloads/trump.jpg > president.jpg
```

## ほかのコマンドと組み合わせる
顔がでかすぎるから小さくしたいときもあると思う。そういうときは、たとえば imagemagickにpipeから流すことでリサイズできる。

`python face_detect.py ~/Downloads/trump.jpg | convert -resize 200x200 - jpg:- | term-img`

![image](https://qiita-image-store.s3.amazonaws.com/0/275/15a36872-6d5e-c986-fcbd-47937cc8c923.png)

## グリッチしたくなったとき
急にアートな気分になったときは、そのあとにsedに流して画像を壊せばいい。

`python face_detect.py ~/Downloads/trump.jpg | convert -resize 64x64 - jpg:- | sed 's/0/1/g' | term-img`
![image](https://qiita-image-store.s3.amazonaws.com/0/275/7b1a9bab-7c5b-2c33-70c2-59034359d05d.png)

## たくさんグリッチしたくなったとき
さらに破壊衝動を抑えられなくなったときには、for文で回すとそのまま画像が表示されて高速に破壊された画像を確認できる。

`for i in $(seq 1 9); do python face_detect.py ~/Downloads/trump.jpg | convert -resize 64x64 - jpg:- | sed "s/0/$i/g" | term-img; done`
![image](https://qiita-image-store.s3.amazonaws.com/0/275/8a35e68d-d07d-1aa6-8cab-12e7424ab3b3.png)
Final IKで遊んでみる ~ペットを手なずけてみた~

<a href="https://www.assetstore.unity3d.com/jp/#!/content/14290" target="_blank">![3057.png](https://qiita-image-store.s3.amazonaws.com/0/46444/7021f520-281e-8202-3f63-f15d0dc1543a.png)</a>

セールのときに購入したままままほったらかしていたので使ってみます

ドキュメントによると

- Aim IK
- Biped IK 
- CCD IK
- FABRIK
- FABRIK Root
- Full Body Biped IK 
- Limb IK
- Look At IK 
- Trigonometric IK 
- Interaction System 
- Grounder
- Rotation Limits 

とカテゴリわけされていたのでわかりやすそうなのから試していってみようかと思います
今回はBipedIKあたりです

こんな感じに餌につられる可愛いペットができます。
<img src="http://ayumegu.daa.jp/img/Qiita/pet2.gif">

##Biped IK下準備
まずはAnimation TypeがGenericかHumanoidのmodelを画面上に配置
AnimatorのControllerをセットし、BipedのScriptをアタッチ
<img width="514" alt="スクリーンショット 2016-06-20 15.32.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/114dd528-5d79-bc18-5601-1a4bba46175b.png">

自動でセットされますが、
自動で綺麗にセットされなかった場合は手動でアタッチする必要があります。
<img width="503" alt="スクリーンショット 2016-06-20 15.32.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/a519a15c-6536-b36d-7805-9edba17f44ce.png">

##首振り
首振り自体はシンプルで、
BipedIKvsAnimatorIK.csのスクリプトを参考に
bipedIKが先ほどセットしたbipedIKをセット。lookAtは見るオブジェクト
からのGameObjectなどをつくってアタッチすればOK

その下はオブジェクトが動いたときに体などがどれくらい動くか。
1だと動いて0だと全く動かなくなります。
ターゲットを動かしたときに体全体が動いちゃう場合などは
lookAtBodyWeightを0とかにしてあげればOK

```csharp
public class NeckMove: MonoBehaviour {

	//public Animator animator;
	public BipedIK bipedIK;

	// Look At
	public Transform lookAtTargetBiped;

	public float lookAtWeight = 1f;
	public float lookAtBodyWeight = 1f;
	public float lookAtHeadWeight = 1f;
	public float lookAtEyesWeight = 1f;
	public float lookAtClampWeight = 0.5f;
	public float lookAtClampWeightHead = 0.5f;
	public float lookAtClampWeightEyes = 0.5f;


	//void OnAnimatorIK(int layer) {
	void Update() {

		bipedIK.SetLookAtPosition(lookAtTargetBiped.position);
		bipedIK.SetLookAtWeight(lookAtWeight, lookAtBodyWeight, lookAtHeadWeight, lookAtEyesWeight, lookAtClampWeight, lookAtClampWeightHead, lookAtClampWeightEyes);
	}
}

```

手とかを追従させるにはこんな感じでいけます。

```csharp

	// Hand
	public Transform handLeftTargetBiped;
	public float handPositionWeight = 0f;
	public float handRotationWeight = 0f;

	void Update() {
		bipedIK.SetIKPosition(AvatarIKGoal.LeftHand, handLeftTargetBiped.position);
		bipedIK.SetIKRotation(AvatarIKGoal.LeftHand, handLeftTargetBiped.rotation);
		bipedIK.SetIKPositionWeight(AvatarIKGoal.LeftHand, handPositionWeight);
		bipedIK.SetIKRotationWeight(AvatarIKGoal.LeftHand, handRotationWeight);
	}
```

<img src="http://ayumegu.daa.jp/img/Qiita/pet3.gif">
これは固定するやつだから、お手とかさせるのだったらまた違うやつだね・・・。

一旦ここまで
【Python】matplotlibでヒストグラムを描画する際のエラーの対処方法

matplotlibでヒストグラムを描画する際に出たエラーの対処方法。

```py3
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(np.random.randn(4, 4))
df.ix[0, 0] = np.nan
df
```

```py3:出力結果
          0         1         2         3
0       NaN -1.778988 -0.154485  0.991733
1  0.813296 -0.493322 -0.667192  0.555212
2 -0.207708 -1.197387 -1.101739 -0.796314
3 -0.037038 -1.903817  0.342002 -0.648974
```

欠損値がある列のヒストグラムを描画しようとするとエラーが出る。

```py3
plt.hist(df[0], alpha=0.5, bins=10)
```

```py3:出力結果
ValueError: max must be larger than min in range parameter.
```

この場合，欠損値を除けばエラーが出なくなる。

```py3
plt.hist(df[0].dropna(), alpha=0.5, bins=10)
```

```py3:出力結果
(array([ 1.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.]),
 array([-0.2077081 , -0.10560772, -0.00350734,  0.09859304,  0.20069342,
         0.3027938 ,  0.40489418,  0.50699456,  0.60909493,  0.71119531,
         0.81329569]),
 <a list of 10 Patch objects>)
```
Deep Security User Night #3 レポート

こんにちは、ひろかずです。

今日は、Deep Security User Night #3 をレポートします。
今回の会場は、[HAPON 新宿](http://hapon.asia/shinjuku/)さんです。
こんな素敵な空間に、DS好きが集まるなんて胸熱ですね！

乾杯して、和やかな感じでスタートしました！

例によって、リアルタイムで執筆しているので、誤字脱字、抜け、漏れ、表記ゆれについてはご容赦くださいmm

#おしながき
セッション1
Justin Fosterさん
トレンドマイクロ株式会社 
Head of Cloud Workload Security	DevSecOps for Microsoft Azure

セッション2
廣瀬 一海さん（デプロイ王子）	
日本マイクロソフト株式会社
Deep Security and Microsoft Azure Security Center

LT1
浅尾 元さん
株式会社スカイアーチネットワークス	
DSaaSをAzure環境に導入してみた

LT2
作原 英輔さん	
株式会社FIXER
Deep Security × Azure の最新導入事例ご紹介（仮）

LT3
工藤 淳さん
アイレット株式会社
Manage of Deep Security in Microsoft Azure. Log Analytics/Visualization

#セッション1 : Head of Cloud Workload Security	DevSecOps for Microsoft Azure
Justin Fosterさん
トレンドマイクロ株式会社 

クラウドセキュリティチャレンジ

- 可視化
- アジリティ
- パッチ
- コンプライアンス

セキュリティの考え方

- Azure環境ではOS,アプリ,データがユーザ責任範囲

従来はGateway型で段階的にセキュリティ製品を配置していたが、Azureでネットワークレイヤのセキュリティが抽象化する上に、DSでホスト（Web、APP Tier）をフォローできる。

shell shockの脆弱性に対する対応のタイムラインを例にすると、タイムリーな対応が大変。

一般的なWeb/AP三層構造だと、以下が必要だが、DSはエンドポイントでパケットを検査する。

- アクセスコントロールの見直し、
- ファイアウォール設定のの見直し

DSは、仮想パッチを使ってパケット内の攻撃を検知する。
管理画面で統合管理ができる。

ブルーグリーンデプロイメント

- 脆弱性対応するには、インスタンスを設定変更して、テストしてと多数の工程を経るが、クラウド環境では、一気に切り替えるようなやり方が容易

キーワード

- 脅威の可視化
- セキュリティ
- 時間（シームレス）

AzureのIaaSを使うと、DSのAgentが入った状態でインスタンスを起動できる。

海外のマーケットプレイスではマシンイメージが用意されている（BYOL、DSM、DSaaS）
インスタンスサイズとデータベースサイズを指定することですぐに起動できる（国内未対応）

Azure Security Center ＋ Deep Security

- Azure Security CenterでDSのAgent管理できる
- IPS/IDSイベントやうウィルス検知ログを管理できる

DSは、PCIDSS対応やハイブリッドクラウド、プライベートクラウドに対応できる

- trendmicro.com/Azure

#セッション2 : Deep Security and Microsoft Azure Security Center
廣瀬 一海さん（デプロイ王子）	
日本マイクロソフト株式会社

ナチュラルにハイなセッションでした！
内容は参加した人に聞いてみてくださいね！


#LT1 : DSaaSをAzure環境に導入してみた
浅尾 元さん
株式会社スカイアーチネットワークス	

赤い鯖缶を携えての登場です！

DSをAzureのIaaSに1台入れた体験記
DSaaSを利用
DSaaSは、Manager不要！
クラウドアカウントでAzureを選択！
クラウドアカウントを使えば、DSが入っているサーバと、入っていないサーバが一目瞭然！

#LT2 : Deep Security × Azure の最新導入事例ご紹介（仮）
作原 英輔さん	
株式会社FIXER

Azure x DSのフルマネージドサービスやってます。
いろいろ事例があるようです！
日経クラウドファーストに掲載されているので、興味のある人は読んでみてください！

#LT3 : Manage of Deep Security in Microsoft Azure. Log Analytics/Visualization
工藤 淳さん
アイレット株式会社

Azureならではのログの可視化と解析
OMS（オペレーションズ マネージド スイート）を使う
システムセンター的なことができる。
DSのSIEM出力でログを出して、FulentdでOMSに飛ばす。
PowerShellでもSyslogで受信することもできる。
OMSではカスタムログで引っ張る。
OMSで集めたログは、PowerBIで分析したり、PagerDutyでアラートをSlackに飛ばす事ができる(OMSのWebHookを使用)
可視化はElasticSearchやKibanaを利用することもできる。

みんながんばって使おう！

#LT飛び込み : バルス！
フューチャーアーキテクト
長澤さん

Vulsはエージェントレスで脆弱性を検出できる。
deepsecurity/amazon-inspectorと連携
Vulsは脆弱性の深刻度もでるので、DSと連携するともっといいことあるかも！

#終わりに
Azureもグイグイ来てますね！
刺激的な会でした。
第四回にも期待しましょう！

今日はここまでです。
お疲れ様でした。
【Python】list, pandas.Seriesの重複を削除する

listやpandas.Seriesで重複を削除する際に意外とハマったので。

```py3
# pandas.Seriesでも同様
ls = [1, 2, 3, 1, 2, 3, 4]

set(ls) # listから集合にする
```

```py3:出力結果
{1, 2, 3, 4}
```

集合だとインデクシングできないので，必要ならlist()で再度リストに戻す。

```py3
list(set(ls))
```

```py3:出力結果
[1, 2, 3, 4]
```
ItamaeでBitbucketのprivate repositoryからcloneする方法

普通にgitリソースでやると，色々な事情で出来ませんでした．詳しくは私の2016年7月7日のTwitterのログを見て下さい．

http://twilog.org/ka_/date-160707

用意するレシピはおおよそ以下のようになります．

`git clone`するシェルスクリプトファイルを用意してやってそれを`execute`で実行します．

`id_rsa` (秘密鍵) は予めローカルのどこか (`/some/where`) に用意しておきます．

```rb
username = 'ka'

directory "/home/#{username}/.ssh" do
  owner username
  mode '755'
end

remote_file "/home/#{username}/.ssh/id_rsa" do
  source '/some/where/id_rsa'
  owner username
  mode '400'
end

execute 'SSH config' do
  command <<-EOH
cat <<EOS >> /home/#{username}/.ssh/config
host bitbucket.org
  StrictHostKeyChecking no
EOS
EOH
  not_if "grep -q bitbucket.org /home/#{username}/.ssh/config"
end

file "/home/#{username}/git-clone.sh" do
  content "git clone git@bitbucket.org:username/reposname.git /tmp/repos"
  user username
  mode '644'
end

execute 'git clone' do
  command "bash /home/#{username}/git-clone.sh"
  user username
  not_if 'test -d /tmp/repos'
end
```

本当は，こんなことしなくてもいいのであれば嬉しいです．
非フロントエンドエンジニアのためのCSS設計入門（OOCSS） 

CSSを書いていて、設計方針がわからない、破綻して!importantをつけざるを得なくなってしまうことがあったため、CSS設計の1つの考え方であるOOCSSについてまとめてみました。

この記事では

- オブジェクト指向
- CSSの詳細度

については説明しません。

## OOCSSとは
オブジェクト指向CSSのことです。

- 同じコードを2度書かない
- どこに書いても同じ振る舞いをする

辺りを目的とした、CSSの設計概念です。2つの原則を用いて、変更に強い設計を目指します。


## OOCSSの2つの原則
### 構造とスキンの分離
同じコードを2度書かないようにするためです。
赤い箱を「赤い」と「箱」に分けます。
そうすることで、青い箱が必要になったときに、「箱」の部分を共通化することができます。

#### Before

```html
<div class="box-red">
</div>
<div class="box-blue">
</div>
```

```css
.box-red {
  width: 700px;
  height: 700px;
  margin: 0 auto;
  background-color: #FF0000;
}
.box-blue {
  width: 700px;
  height: 700px;
  margin: 0 auto;
  background-color: #0000FF;
}
```

#### After

```html
<div class="box box-red">
</div>
<div class="box box-blue">
</div>
```

```css
.box {
  width: 700px;
  height: 700px;
  margin: 0 auto;
}
.box-red {
  background-color: #FF0000;
}
.box-blue {
  background-color: #0000FF;
}
```

念のためですが、ここでは説明のため色をクラス名にしてしまっていますが、このようなネーミングは**おすすめしません**。クラス名を値名にしてしまうと、値に変更があった場合、ネーミングに不整合が生じるためです。

```css
.box-red {
  background-color: #00FF00; // 背景色の値は緑なのにクラス名はred
}
```
### コンテナとコンテンツの分離
極力、子孫セレクタ、要素型セレクタは使わずに、同じクラスでCSSを当てるようにします。
どこに書いても同じ振る舞いをするためです。


#### Before

```html
<div class="side">
  <h2>...</h2>
</div>
<div class="main">
  <h2>...</h2>
</div>
```

```css
.side h2 {
  width: 700px;
  font-size: 14px;
}
.main h2 {
  width: 700px;
  font-size: 16px;
}
```

#### After

```html
<div class="side">
  <h2 class="heading heading-side">...</h2>
</div>
<div class="main">
  <h2 class="heading heading-main">...</h2>
</div>
```

```css
.heading {
  width: 700px;
}
.heading-side {
  font-size: 14px;
}
.heading-main {
  font-size: 16px;
}
```

Beforeの書き方で書いてしまうと、

「同じ装飾を他のエリアのタグにも当てたい」場合に、同じコードを書かくか、セレクタを追加しないといけません。
また、「同じエリアだけど違う装飾を当てたい」場合には、CSSの**詳細度を意識したポイント制の戦い**を始めなくてはなりません。

以上、間違いがあれば教えてください。
git statusで新規ディレクトリ内のファイルが表示されなくて焦った＜status.showUntrackedFiles＞

自分用メモ

git status は、`-u`オプションを何もつけない

```
git status
```

だと、


```
git status -unormal
```

と同じ。
なので、新規（＝追跡されていない）ディレクトリに含まれているファイルは表示されない！

表示させるには

```
git status -uall
```

とする必要がある。


逆に、追跡されていないファイルをすべて表示しない場合は

```
git status -uno
```

でOK。


-----

いちいちオプション付けるのも面倒なので、デフォルト設定するとよさげ。


表示させる場合

```
git config status.showUntrackedFiles all
```


表示させない場合

```
git config status.showUntrackedFiles no
```


-----

参考
https://git-scm.com/docs/git-status

...読めばすぐわかる話なのですが、知らなくて焦った。
Unityでオブジェクトをrayが当たった方向に向ける

この記事では、Rayがあたった方向にキャラクターなどを向かせる方法を紹介します。

#手順
１.Rayの発生源となるオブジェクトとRayをあてるオブジェクトを用意する
２.新しくスクリプトを作って発生源となるオブジェクトにつける
３.Rayを生成するスクリプトを書く
４.Rayの方向に向かせるスクリプトを書く


#１　Rayの発生源となるオブジェクトとRayをあてるオブジェクトを用意する

![bandicam 2016-07-07 18-48-02-491.jpg](https://qiita-image-store.s3.amazonaws.com/0/132628/376c602b-0369-2722-60f7-99c1d1a0aec2.jpeg)
今回はこのようなステージを作りました。
判別のため、CubeとCapsuleには「Enemy」というタグをつけています。


#２　新しくスクリプトを作って発生源となるオブジェクトにつける

ProjectウィンドウのCreateからC#スクリプトを新しく作成します。
それを、HierarchyにあるRayの発生源となるオブジェクト(今回はUnityちゃん)にドラッグ&ドロップでくっつけます。

#３　Rayを生成するスクリプトを書く

２で作ったスクリプトに、以下のようなコードを書きます。

```csharp

void Update()
{
    raytest();

}
//Rayを生成する関数
void raytest()
{

      RaycastHit hit;
      Ray ray;
      int distance = 3;
      ray = new Ray(transform.position + new Vector3(0, 0.3f, 0), transform.forward); 

      if (Physics.SphereCast(ray, 2, out hit, distance))
      {
          Debug.DrawLine(ray.origin, hit.point, Color.red);
      }
}

```
わかりやすいように赤い線が出るようにしているほか、Rayがあたる面積を広げるためSphereCastを使用しています。
また、SDUnityちゃんはデフォルトだとRayの発生源が足元になってしまうので、Vector3の値を足して発生源に位置を上げています。


#４　Rayの方向に向かせるスクリプトを書く
Enemyというタグが付いているオブジェクトにRayが当たっている時、クリックすると今Rayが当たっている方向を向くコードを、以下のように書きます。

```csharp
if (Physics.SphereCast(ray, 2, out hit, distance))
{
     //デバッグ用の赤い線を引く
      Debug.DrawLine(ray.origin, hit.point, Color.red);　

　　　//クリックされた場合
      if (Input.GetMouseButtonDown(0))
      {
　　　　 //当たったオブジェクトのタグがEnemyだった場合
          if (hit.collider.tag == "Enemy")
          {
             //Unityちゃんから見たRayが当たった場所の角度分y軸を中心に回転する
              var newRotation = Quaternion.LookRotation(hit.point - transform.position).eulerAngles;
              newRotation.x = 0;
              newRotation.z = 0;
              transform.rotation = Quaternion.Euler(newRotation);
           }

       }
}
```



これを実行すると
    
![k.gif](https://qiita-image-store.s3.amazonaws.com/0/132628/6fc014c9-f90d-65dd-eda4-142fd0b4f433.gif)



Unityちゃんがぴょこんとオブジェクトのほうを向いたのがわかると思います。


#参考サイト
[ゲームは初心者にやさしく　AI開発＆クォータニオン入門～3.敵キャラをプレイヤーに向かせる ](http://gamesonytablet.blogspot.jp/2013/03/ai3.html)





![imageLicenseLogo.png](https://qiita-image-store.s3.amazonaws.com/0/132628/90a70bbc-f27f-ad28-e90d-f3c160f5069f.png)
このコンテンツはユニティちゃんライセンス条項の元に提供されています
Turbolinks利用時のActionCableのpub/sub管理

DHH氏の[Rails 5: Action Cable demo](https://www.youtube.com/watch?v=n0WUjGkDFS0)を見つつチャットルーム機能を付けようと思ったけどTurbolinksとのからみでさまよったのでメモ。

* Turbolinksはページ遷移するときにAjaxでページを取得してDOMの差分を書き換える
* **ページを遷移しても**DOMが書きかわるだけなので**ActionCableのWebSocketの接続は生きたまま**
* なので、チャットルームのように部屋ごとにActionCableのsubscriptionsを管理したい場合は、TurboLinksの独自イベントをハンドリングして下記の処理が必要
    * ページを書き換える前に購読を解除
    * ページを書き換えた後に購読を開始
* （もちろん、他のやり方（pub/subを分けるのでなく、1つにしてユーザ管理+ユニキャストっぽいやり方とかで）も良いと思います。）

```app/assets/javascripts/channels/room.coffee
App.room = null

current_user_id = ->
  $('#user').data('id')

current_room_id = ->
  $('#room').data('id')

current_room_ch = ->
  id = current_room_id()
  if id?
    return {channel: 'RoomChannel', room_id: id}
  else
    return null

# リンクのクリックによりAjaxリクエストが呼ばれたら購読を解除
document.addEventListener 'turbolinks:request-start', ->
  if current_room_ch()?
    App.room.unsubscribe()

# ページのロードが終わったら購読開始
document.addEventListener 'turbolinks:load', ->
  if current_room_ch()?
    App.room = App.cable.subscriptions.create current_room_ch() ,
      received: (data) ->
        $('#messages').append data['message']
      speak: (user_id, room_id, content) ->
        @perform 'speak', {
          user_id: user_id
          room_id: room_id
          content: content
        }

$(document).on 'keypress', '#text', (event) ->
  if event.keyCode is 13
    value = event.target.value
    if value.length != 0
      App.room.speak(current_user_id(), current_room_id(), value)
      event.target.value = ''
      event.preventDefault()

$(document).on 'click', '#button', (event) ->
  value = $('#text').val()
  if value.length != 0
    $('#text').val('')
    App.room.speak(current_user_id(), current_room_id(), value)
```

* チャットのルームIDごとにpub/subの名前を変える。
* クライアントのJavaScriptでApp.room.speakが呼ばれたらサーバのRoomChannel#speakをRPCされる。
* RPCされるとMessageを新規保存する。

```app/channels/room_channel.rb
class RoomChannel < ApplicationCable::Channel

  def subscribed
    stream_from "room_channel_#{params[:room_id]}"
  end

  def unsubscribed
  end

  def speak(data)
    message = {
      user_id: data['user_id'],
      room_id: data['room_id'],
      content: data['content']
    }
    Message.create! message
  end

end
```

* モデルはDHHの例と同じ。roomとuserがくっついてるくらい。
* 保存できたらブロードキャストジョブに投げる。

```app/models/message.rb
class Message < ApplicationRecord
  belongs_to :room
  belongs_to :user
  after_create_commit { MessageBroadcastJob.perform_later self }
end
```

* メッセージと関連づいているチャットルームIDからさっきのpub/subの名前を指定してブロードキャスト。
* これでチャットルームにいるクライアントだけにメッセージがプッシュされる。

```app/jobs/message_broadcast_job.rb
class MessageBroadcastJob < ApplicationJob

  queue_as :default

  def perform(message)
    ActionCable.server.broadcast "room_channel_#{message.room_id}", message: render_message(message)
  end

  private
    def render_message(message)
      ApplicationController.renderer.render(partial: 'messages/message', locals: { message: message })
    end

end

```
1Password 6 の同期方法を専用クラウドサービス「 Family & Team account」に変更する方法

#目的
- DropBox, iCloud, Wi-Fi syncを利用したLocal環境にパスワードデータを保存・同期する方法から、専用クラウド環境の「1Password Family & Team account」に移行する。

#メリット
年払い$48USDか、月払い＄5USDすると、Win10 (Win7&8はこれから対応) /Mac/iPhone/Androidで利用可能になり、全環境のアップグレードに対応する。また、専用クラウド上にパスワードデータを保存・同期できる。（考え方によるが……）シングル・ライセンスの各環境毎の課金＆アップグレード毎の課金よりはお得。

#環境
- Mac OS 10.11.5
- 1Password6 Version 6.3.1 (631006)

#前提条件
- 1Password の利用ユーザーである。
- すでにパスワードデータをDropBox, iCloud, Wi-Fiで同期している。
- 移行にあたり[1Password Family & Team account](https://start.1password.com/signup/team?type=F) にアカウントを作ってある。 　
 

#移行方法

## はじめに
この動画を最初に見ておくと作業イメージがつかめる:wink:
 https://youtu.be/AId6ODT4CK8

1Password用語では、

 - パスワードの保存場所を「ヴォールト」（Vaults：保管庫）と呼んでいる。
 - ヴォールトは、local環境＆専用クラウド環境がある。
 - local環境の初期設定のヴォールトは「プライマリ」(primary)になる。
 - 専用クラウド環境の初期設定のヴォールトは「個人」(private)と「共有」(share)になる。

## なにはなくともパスワードデータのバックアップ
　1. 1Password6のメニューで[ファイル]→[Backup]を選ぶ。
　2. [設定]画面の[今すぐバックアップ]ボタンを選んで実行する。

## [プライマリ]のパスワードデータを専用クラウドの[個人]に移行する
　1. 1Password6のメニューで[1Password6]→[ヴォールトの切り替え]→[プライマリ] を選ぶ。
　2. 1Password6メイン画面のセンターペインにある、移行したいパスワードデータを選択（複数選択可）する。
　3. 選択状態で右クリックして[共有]→[個人]→[移動]か[コピー]を選ぶ。パスワードデータをロストすると痛いのでコピーが無難。
　4. これで[個人]に、パスワードデータが保存される。
　5. 念のため https://******.1password.com/ のサインインアドレスからログインしてWeb画面上のPrivate（個人）にパスワードデータが移行・保存されたか確認しておくとよい。

## これまで利用していた[プライマリ]の同期を解除する
　1. 1Password6のメニューで[1Password6]→[環境設定...]→[削除]を選ぶ。
　2. [設定]画面の[同期]タブを選ぶ。
　3. [プライマリ]を選択して、[なし]を選ぶ。
　4. これで同期は解除される。

## これまで利用していた[プライマリ]　をヴォールトごと全削除する
　1. 1Password6のメニューで[1Password6]→[ヴォールトの切り替え]→[プライマリ]を選ぶ。
　2. 1Password6のメニューで[1Password6]→[ヴォールトの削除...]を選ぶ。
　3. [マスターパスワード]を入力して、削除を実行する。
　4. これでヴォールトごと全削除される。
　
以上
JAX-RSでコンテキストの取得

JAX-RSのリソースクラスのメソッドの中で実行環境に関する情報(コンテキスト)を取得できる。何が取得できるかとはJSR-339のSection-9.2に記述してあるもの(Application・UriInfo・HttpHeaders・Requestなど)とサーブレットの場合は10.1に上げられているもの(ServletConfig・ServletContextなど)が取得できる。ただしJAX-RSを使っているときにサーブレットコンテキストに頼るような構成はあまりやらないほうが良いらしい。

具体的な情報は`@Context`アノテーションを使って取得する。以下サンプルとテスト。

```ContextResource.java
package example.jaxrs;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.UriInfo;

@Path("/")
public class ContextResource {

    @GET
    @Path("uriinfo")
    public String uriinfo(@Context UriInfo uriInfo) {
        return uriInfo.getPath() + ";" + uriInfo.getQueryParameters().getFirst("foo");
    }

    @GET
    @Path("headers")
    public String headers(@Context HttpHeaders headers) {
        return headers.getHeaderString("X-Qiita-Demo");
    }
}
```

この例ではUriInfoを通してURIのパスとGETのパラメータを取得する例とHttpHeadersを通してHTTPのヘッダを取得する例を作成した。以下はテストコード。


```ContextResourceTest.groovy
package example.jaxrs

import org.glassfish.jersey.server.ResourceConfig
import org.glassfish.jersey.test.JerseyTest
import spock.lang.Shared
import spock.lang.Specification

import javax.ws.rs.core.Application

class ContextResourceTest extends Specification {
    @Shared
    def jerseyTest = new JerseyTest() {
        @Override
        protected Application configure() {
            return new ResourceConfig(ContextResource.class)
        }
    }

    def setupSpec() {
        jerseyTest.setUp()
    }

    def cleanupSpec() {
        jerseyTest.tearDown()
    }


    def "test uriinfo"() {
        when:
        def response = jerseyTest.target("/uriinfo").queryParam("foo", "bar").request().get()

        then:
        response.readEntity(String.class) == "uriinfo;bar"
    }

    def "test headers"() {
        when:
        def response = jerseyTest.target("/headers").request().header("X-Qiita-Demo", "Foo Bar").get()

        then:
        response.readEntity(String.class) == "Foo Bar"
    }
}
```

# 参考
* http://download.oracle.com/otndocs/jcp/jaxrs-2_0_rev_A-mrel-eval-spec/index.html - JSR-339(JRX-RS 2.0)
Firebase crashとParseCrashReportingでduplicate symbolエラーが発生する


表題の通りです。 **とある**プロジェクトにてFirebase crashを追加した際にduplicate symbolエラーが発生してしまいました。

```
duplicate symbol _BreakpadUploadReportWithParametersAndConfiguration in:
    /Users/yamacraft/xxx/Pods/FirebaseCrash/Frameworks/FirebaseCrash.framework/FirebaseCrash(Breakpad_05db9f18bf48e68163defbe5ffd8dec3.o)
    /Users/yamacraft/xxx/external/Parse/ParseCrashReporting.framework/ParseCrashReporting(Breakpad.o)
duplicate symbol _BreakpadGetNextReportConfiguration in:
    /Users/yamacraft/xxx/Pods/FirebaseCrash/Frameworks/FirebaseCrash.framework/FirebaseCrash(Breakpad_05db9f18bf48e68163defbe5ffd8dec3.o)
    /Users/yamacraft/xxx/external/Parse/ParseCrashReporting.framework/ParseCrashReporting(Breakpad.o)
duplicate symbol _BreakpadHandleNetworkResponse in:
    /Users/yamacraft/xxx/Pods/FirebaseCrash/Frameworks/FirebaseCrash.framework/FirebaseCrash(Breakpad_05db9f18bf48e68163defbe5ffd8dec3.o)
    /Users/yamacraft/xxx/external/Parse/ParseCrashReporting.framework/ParseCrashReporting(Breakpad.o)
ld: 3 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

ここは憶測の部分なのですが、恐らく両方とも[breakpad](https://github.com/google/breakpad/tree/master/src/client/ios)と呼ばれるクラッシュレポートの送受信システムを利用しているため、duplicate symbolエラーが発生しているのではないかと思われます。

~~なのでさっさと通知はParseからFirebase notificationに変えましょう。~~もしこの憶測があっている場合、breakpadを利用して作られたクラッシュレポートシステムを導入済みの場合、同様の問題が起こる可能性があります。気をつけましょう。