OmniAICreator/Qiita-1.07M huggingface dataset:
ExcelJSでエクセルファイルを作成

ExcelJSで数式を入れたり塗りつぶしたり
自分用備忘録

    var Excel = require('exceljs');
    var workbook = new Excel.Workbook();
    var sheet1 = workbook.addWorksheet("test");
    var worksheet = workbook.getWorksheet("test");
    var path = require('path');
    path = path.join(__dirname)

    var targetExcelPath = path + '/test.xlsx';
    console.log(targetExcelPath)

    //文字を入れる（行・列指定）
    worksheet.getCell(1, 1).value = "商品";
    worksheet.getCell(2, 1).value = "りんご";
    worksheet.getCell(3,1 ).value = "みかん";
    worksheet.getCell(4, 1).value = "ぶどう";

    //文字を入れる２（セル指定）
    worksheet.getCell('B1').value = "Item";
    worksheet.getCell('C1').value = "Plice";

    //配列から文字を入力
    var Item = [["apple", 150], ["orange", 200], ["grape", 280]];

    for (var　row = 0; row < Item.length; row++) {
        worksheet.getCell(row+2, 2).value = Item[row][0];
        worksheet.getCell(row+2, 3).value = Item[row][1];
    }

    //セルをマージ
    worksheet.mergeCells('A5:C5');

    //関数を入れる
    worksheet.getCell('A5').value =  { formula: "SUM(C2:C4)" };

    //日付を入れる
    worksheet.getCell('D1').value = 42736;

    //セルの書式を短い日付に変える
    worksheet.getCell('D1').numFmt = 'm/d';

    //塗りつぶし(solid　透明度ｾﾞﾛ)
    var fillStyles = {
        type: 'pattern',
        pattern: 'solid',
        fgColor: { argb: 'FFfabf8f' }
    };

    worksheet.getCell('A1').fill = fillStyles;
    worksheet.getCell('B1').fill = fillStyles;
    worksheet.getCell('C1').fill = fillStyles;
    worksheet.getCell('D1').fill = fillStyles;

    //罫線
    var borderStyles = {
        top: { style: "thin" },
        left: { style: "thin" },
        bottom: { style: "thin" },
        right: { style: "thin" }
    };

    worksheet.getCell('A1').border = borderStyles;
    worksheet.getCell('B1').border = borderStyles;
    worksheet.getCell('C1').border = borderStyles;
    worksheet.getCell('D1').border = borderStyles;

    //幅
    worksheet.getColumn(1).width = 30;

    //折り返し
    worksheet.getCell('D2').value ="あいうえおかきくけこさしすせそたちつてと";
    worksheet.getCell('D2').alignment = { wrapText: true };

    //テキスト位置
    worksheet.getCell(1, 1).alignment = { vertical: 'middle', horizontal: 'center' };

    //出力
    workbook.xlsx.writeFile(targetExcelPath).then(function () {
        var a = document.createElement('a');
        a.href = targetExcelPath;
        a.setAttribute('download', name || 'test.xlsx');
        a.dispatchEvent(new CustomEvent('click'));
    });
深層強化学習(DQN)でオセロもどきAIを作ってみた

どうも、オリィ研究所（http://orylab.com/） の ryo_grid こと神林です。
今回は深層強化学習 (DQN) を試してみたので、それについて書いてみます。


#概要
以下を大いに参考（大半のコードを流用させてもらって）にして、(深層)強化学習でオセロもどきのAIを作ってみました。エージェントには駒を多く取ったら勝ちといった知識も与えずに、対戦した勝敗結果(ここの判定だけは学習の時に行う)から打ち方を学ばせます。
コードは間違っているとこがあるかもしれないので、指摘してもらえると幸い。
なお、エージェント自体の学習ロジックは下記の参考コードからほとんどいじっていません（うまく分離されていて素晴らしい！）

ChainerでDQN。強化学習を三目並べでいろいろ試してみた。（Deep Q Network、Q-Learning、モンテカルロ）
http://qiita.com/narisan25/items/e64a5741864d5a3b0db0

作成したコードはこちら。

https://github.com/ryogrid/RL_reversi/blob/master/RL_Q_reversi.py

もどきといっているのは以下のため。
 - 最初に4コマ置くのを端折っている
 - はさめるところにしか置けないという制約がない。というか空いているところはどこにでも置ける。
 - 盤面を4x4と小さくしている

#学習結果 
ランダム君との対戦成績で強さをはかる。
##Q-Learning君
- ランダム君相手に10万回対戦して学習 → εを0にして対戦すると多少勝ち越せるようにはなった。
- 20万回。大して変わらず。 → QL1:4454,Random:4302,DRAW:1244
- うーん

##DQN君
- 2万回学習 → DQN:481,Random:396,DRAW:123 とQ-Learning君よりは強い？
- 10万回学習 → DQN:5423,Random:3373,DRAW:1204 いくらか強くなったかな

#学習結果 (8x8の正規のサイズでやってみる)
ランダム君との対戦成績で強さをはかる。
##DQN君
10万回。NNの素子数もいくらか増やした。　→　QL1:2391,Random:1629,DRAW:180　頑張ってるけど、期待したほど強くはないかなあ。。。

#他に参考にした記事
倒立振子で学ぶ DQN (Deep Q Network)
http://qiita.com/ashitani/items/bb393e24c20e83e54577
Ruby練習問題01

```ruby:Hello,Rubyと表示してください。
puts "Hello, Ruby"
```

```ruby:10+4と表示してください。
puts "10+4"
```

```ruby:入力された文字列をgets.chompを用いて受け取り、その文字列の文字数と反転した文字列を表示
puts '好きな文字列を入力してください'
x = gets.chomp
puts x.length
puts x.reverse
```

```ruby:入力された日数を受け取り、その日数が、何時間、何分、何秒であるかを計算して表示
puts '日数を入力してください'
# getsで受け取った文字列を「to_i」メソッドを用いて
# 数値に変換する
days = gets.chomp.to_i

hours = days * 24
puts "#{hours}時間"

minutes = hours * 60
puts "#{minutes}分"

seconds = minutes * 60
puts "#{seconds}秒"
```
[Ruby on Rails] 配列を書かれた順番通りに取得する

# Overview
Rubyで、一時的なテストがしたいとかの理由で、特定のIDを配列に書かれた順番通りにfindして表示させたいということがたまにあり、そんなとき用の書き方メモです。

# Detail
#### ▼順番指定なし
普通に書くとID順とかになってしまう

``` ruby:順番指定なし
array = [10,2,4,7,5]

ordered_hoges = Hoge.find(array)

#=> 展開すると 2,4,5,7,10 の順になる
```


#### ▼順番指定あり
sort_byでアレしてやると順番通りになる

``` ruby:順番指定あり
array = [10,2,4,7,5]

ordered_hoges = Hoge.find(array).sort_by{ |o| array.index(o.id)}

#️=> 展開すると 10,2,4,7,5 の順になる！
```

MySQLを使っている場合は、ActiveRecord経由でField関数を使って書いてもいいらしい
ref: http://qiita.com/chezou/items/8c0481044c954c4bca3b

``` ruby:順番指定あり/別パターン
array = [10,2,4,7,5]

ordered_hoges = Hoge.where(id: array).order("field(id, #{array.join(',')})")
```
R > plot > y軸の範囲を変更する > plot(y,ylim=c(10,20))

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1
```

R機能マップ http://qiita.com/7of9/items/0f911bcb95d3a8bbd703

plot()を使う時にy軸の表示範囲を指定したくなった。

参考 https://stat.ethz.ch/pipermail/r-help/2010-November/259254.html

```R
> f<-function(x) 2*x
> y<-f(1:10)
> plot(y)
> plot(y,ylim=c(10,20))
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e8e8587e-193a-3998-4db2-1219b299ecfd.png)
Bootstrap 3 Date/Time Picker で週の始まりの曜日を変更したい場合


[Bootstrap](http://getbootstrap.com/) と併用する日時ピッカーのこれが便利なんだけど

http://eonasdan.github.io/bootstrap-datetimepicker/

デフォルトでは週の始まりが日曜日になっていて、ドキュメントを見てもこれを変更するオプションが見あたらない。

けど月曜始まりのカレンダーを使いたいから何とかしたい。

Bootstrap 3 Date/Time Picker は日時の処理に [moment.js](http://momentjs.com/) を使ってるから、moment 側でロケール設定を変えればいいのだった。

```JavaScript
moment.locale('ja', {
    week: {
        dow: 1
    }
});
```

これで月曜始まりになる。よかった。
2016年11月30日 FirebugでJavaScriptがデバグできない

11月18日ぐらいから、1部のPCでFirebugで「スクリプト」タブを開くと、

このページにはJavaScriptがありません

と表示され、JavaScriptのデバグが出来なくなった。

本日も2.0.18がリリースされたが、その状況は変わらず。

Firefoxの「開発ツール」と統合するためだとかの噂があったが定かではない。

Firefoxのバージョン50.0が悪いのでダウングレードしたら動くという人もいた。

他にも手はあるけど、使い慣れていたので、残念。
shunit2をsubmoduleとして登録しCircleCIで実行する

CircleCIの使い方やShunit2でのテストの書き方については素晴らしいQiitaエントリがたくさんあるので割愛します

### Shunit2
https://code.google.com/archive/p/shunit2/
GoogleCode上のプロジェクトですが
>NOTICE(2015-06-26): shunit2 has moved to GitHub! http://github.com/kward/shunit2
とあるので

https://github.com/kward/shunit2

こちら使わせていただくことにします

### submodule追加

上記GitリポジトリにあるShunit2をサブモジュールとして追加します

```
[submodule "shunit2"]
	path = shunit2
	url = git@github.com:kward/shunit2.git
```

### circle.yml

circle.ymlは

```
checkout:
  post:
    - git submodule sync
    - git submodule update --init

test:
  override:
    - bash test/bl_test.sh
```

こんな感じにしておきます

### テストの内容

```
#!/bin/bash

testMain(){
  assertEquals 1 1
}

. ./shunit2/source/2.1/src/shunit2
```

任意のテストを書いたあと、最終行にshunitのパスを記載しておきます

#### 実際にこちらのプロジェクトで使ってみました

https://github.com/okisanjp/homebrew-bl

![スクリーンショット 0028-11-30 13.00.36.png](https://qiita-image-store.s3.amazonaws.com/0/26917/9da09e96-2b20-4817-822d-a3377bf5e831.png)

![スクリーンショット 0028-11-30 13.01.03.png](https://qiita-image-store.s3.amazonaws.com/0/26917/5952b657-3ff2-330e-4fa7-a3a939d5f421.png)

各ファイルの置き場所や、相対パスの関係がどうなっているのかなどの参考になれば幸いっす
マイナンバーのチェックデジットをAppleScriptで計算する

[マイナンバーのチェックデジットを計算する](http://qiita.com/qube81/items/fa6ef94d3c8615b0ce64)(Ruby版)を参考に、練習も兼ねてAppleScriptでコードを書きました。

## 動作環境
macOS Sierra 10.12

`/Applications/Utilities/Script Editor.app`をおもむろに開き、以下のソースを貼り付けて`⌘+R`

## ソースコード
```applescript:validMyNumber.scpt
on validateMyNumber(myNumber)
	
	-- 数値にキャストできるか
	try
		myNumber as number
	on error
		return false
	end try
	
	-- 12桁か
	if (count of myNumber) is not 12 then
		return false
	end if
	
	-- チェックデジットを分離
	set checkDigit to end of characters of myNumber as integer
	set digits to reverse of characters of text 1 thru -2 of myNumber
	
	-- 数列の和を11で割った余りを計算
	set theSum to 0
	set n to 1
	repeat with digit in digits
		set p to digit as integer
		if n ≤ 6 then
			set q to n + 1
		else
			set q to n - 5
		end if
		set theSum to theSum + (p * q)
		set n to n + 1
	end repeat
	
	-- check digit
	set remainder to theSum mod 11
	if remainder ≤ 1 then
		return checkDigit = 0
	else
		return checkDigit = (11 - remainder)
	end if
	
end validateMyNumber

log validateMyNumber("123456789010") -- false
log validateMyNumber("123456789011") -- false
log validateMyNumber("123456789012") -- false
log validateMyNumber("123456789013") -- false
log validateMyNumber("123456789014") -- false
log validateMyNumber("123456789015") -- false
log validateMyNumber("123456789016") -- false
log validateMyNumber("123456789017") -- false
log validateMyNumber("123456789018") -- true
log validateMyNumber("123456789019") -- false

```

## 追記
[@Piyomaru](https://twitter.com/piyomaru)さんよりいただいた、
> リスト中の変数「sum」は、よく使われているスクリプティング機能拡張（OSAX）で使いがちな英単語なので、「aSum」とか「theSum」といった英単語にした方が安全です。

との指摘を元に修正しました！
SQLServer: インデックスツリー構造の階層数について

クラスタ化/非クラスタ化インデックスのデータ構造はツリー構造になっていることは知っていたのですが、どのくらいの階層になるのかは知らなかったので調査しました。
調査の結果、個人的に思っていたよりも階層数はずっと少ない数でした。

■ 計測したテーブル

```sql
CREATE TABLE [dbo].[TSampleTabl](
	[Column1] [int] IDENTITY(1,1) NOT NULL,
	[Column2] [int] NOT NULL,
	[Column3] [int] NOT NULL,
	[Column4] [int] NOT NULL,
	[Column5] [int] NOT NULL,
	[Column6] [smalldatetime] NOT NULL,
)
```
レコード数は約2000万

■ 計測に使ったDMVのクエリ

```sql
DECLARE @DB_ID int, @OBJECT_ID int
set @DB_ID = DB_ID('db名')
set @OBJECT_ID = OBJECT_ID('TSampleTable')

SELECT
	*
FROM sys.dm_db_index_physical_stats (@DB_ID, @Object_ID, NULL , NULL, 'DETAILED') as A
JOIN sys.objects as B on A.object_id = B.object_id
```

■ 結果
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/148310/5afad77b-c6bb-3f04-fe6a-d4a3879b6c98.png)


■ 考察
2000万レコードで、インデックスの階層は3階層でした。
勝手に沢山階層が作られているイメージだったので最初は驚きでした。
ただ、page_countをチェックすると納得です。ルートノード、中間ノードの各ページには、インデックスキーと次の階層へのリンク情報くらいしか格納されていないはずなので、1ページにかなり多くの情報を格納できるよなぁと。（正確には、もうちょい+αで情報をもっていた気がしますが）

この結果を受けて考えると、ユニークなクラスタ化インデックスキーで絞り込むようなSQLだと、ルートノード→中間→リーフノードの合計3ページくらいしかIO発生しないことになりますよね。
たしかにIndexScanと比べて劇的に速くなるのも納得です。
Cloud9のタイムゾーンを日本時間（JST）に変更する

# 経緯
Cloud9で朝コーディングしてcommit&pushしてもgithubに草が生えない。
（メールアドレスもデフォルトブランチも間違っていない）
よくよく調べるとCloud9のタイムゾーンがUTCとなっていて、9時間ずれていた。
（＝朝9時以降のコミットじゃないと草が生えない）


# 手順

変更前

```
$ date
Wed Nov 30 03:34:11 UTC 2016
```

タイムゾーンを変更

```
$ echo "Asia/Tokyo" | sudo tee /etc/timezone
Asia/Tokyo
```

```
$ sudo dpkg-reconfigure --frontend noninteractive tzdata

Current default time zone: 'Asia/Tokyo'
Local time is now:      Wed Nov 30 12:35:34 JST 2016.
Universal Time is now:  Wed Nov 30 03:35:34 UTC 2016.
```

確認

```
$ date
Wed Nov 30 12:36:18 JST 2016
```

# 環境
今回の環境は以下の通り。（cloud9で生成された環境です）

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.3 LTS"
```



# 参考
以下のサイトを参考にさせて頂きました。

[タイムゾーンの設定方法をメモ(RHEL6, RHEL7, Ubuntu編)](https://siguniang.wordpress.com/2015/03/20/set-timezone/)
Fess LDAP連携してログイン

Fess 10.3 (Mac OS)
CentOS7 (VirtualBox)

CentOS7のLDAPユーザーでMacのFessにログインしてみます。

## LDAPの設定
・CentOS
[サーバーマネージャー]
LDAPアクセス用のユーザーを設定

| ユーザー         |
|:-------------|
| systemadmin    |

一般ユーザーにuser1とuser2を設定しました。

| ユーザー         |    グループ   |
|:-------------|:------------------|
| user1    | Group1 |
| user2   | Group2 |

・Mac
[ターミナル]
ldapsearchコマンドの結果が返ってくることを確認します。

```shell-session
$ ldapsearch -x -W -D "cn=systemadmin,dc=example,dc=local" -h 192.168.56.101 -b
 "dc=example,dc=local" "cn=systemadmin"
```

## Fessの設定
管理>システム>全般> LDAP

| 項目         |       設定値 |
|:-------------|:------------------|
| LDAP URL     | ldap://[LDAPサーバーのURL or IPアドレス]:ポート番号 |
| Base DN      |  |
| Bind DN      | cn=systemadmin,dc=example,dc=local |
| パスワード      | LDAPアクセス用ユーザーのパスワード |
| User DN      | uid=%s,ou=people,dc=example,dc=local |
| アカウントフィルタ | uid=%s |
| memberOf属性  | isMemberOf |

更新ボタンをクリック
LDAPのユーザー(user1,user2)でFessにログインすることができるようになります。
react,redux を typescript で開発して webpack でビルドして karma でテストするサンプルアプリ・開発環境

# 対象

* 掲題の環境をサクッと構築したい方。
* 類似の環境を構築していて、うまくいかなかった方。
* サンプルコードを見て、作り方の参考にしたい方。
* readable で testable なクライアント開発がしたい方。

# 概要

WEBアプリを新規開発するに当たって、開発手法の検証のために、TODO アプリを作成しました。

react, redux を typescript で開発して、webpack でビルドして karma でテストしています。

使いこなすことができれば、結構いい感じな構成（readable で testable）だと思っています。しかし、このくらいの複雑さになってくると環境構築がめちゃくちゃ面倒ですし、周辺ライブラリの使い方も良く分からなかったりすると思うので、このサンプルアプリが参考になればと思います。※特に typescript 周りが面倒かな・・・

[対象]()の通り、この記事の主な目的は環境構築サポートおよび各技術についての初歩的なサンプルコードの提供です。各技術要素の詳細については他の記事を参照してください。

ちなみにですが、TODOアプリは redux 公式のサンプルをベースに、typescript 化したり機能追加したりしています。

# 使用しているツール・ライブラリ

## クライアントサイド

* 言語
    * typescript 2.0
* フレームワーク・ライブラリ
    * react
    * redux
    * redux-saga （非同期処理、pure ではない処理など）
    * axios （Ajax）
    * inversify 2.0 （DI:依存性注入）
* ビルドツール
    * webpack
* テスト
    * karma
    * jasmine
* その他
    * sass(.scss)
    * babel-polyfill 

## サーバサイド

play2.5(scala) です。

# 動作環境

IE11* およびモダンブラウザです。

*IE9 以上を対象にする場合は、inversifyjs の ＠inject を使用しないように修正してください。＠inject は reflect-metadata を使用しますが、これを import すると IE9, 10 はクラッシュしてしまいました。
サンプルアプリで ＠inject を使用している箇所は kernel.get で代替可能です。※格好悪くなりますが・・・

# ソースコード

https://github.com/QuantsResearch/webProto

# サンプルコードのビルド方法

上記 URL から git clone してください。

## 事前準備

以下をインストールしてください。

* sbt (play2.5 を実行するために必要です）
* nodejs (v4.6.2)


## ビルド（開発時）

webpack を watch モードで起動します。

```
npm install
export NODE_ENV=development     (Windows の場合は set NODE_ENV=development)
npm run build:webpack
```

別のターミナルにて、sbt を debug モードで起動します。

```
sbt ~run
```

別のターミナルにて、js のテストを起動します。

```
npm run test
```

ブラウザで http://localhost:9000/sample/ を開いてください。

## ビルド（リリース時を想定）

```
npm install
export NODE_ENV=production
npm run test:prod
npm run build:webpack:prod
sbt stage
target/universal/stage/bin/webboilerplate -Dconfig.resource=dev.conf -Dlogger.resource=log/dev.xml
```

# コメント

## typescript ⇒ ES5 への変換

typescript を一旦 ES6 にトランスパイルした後に、babel で ES5 にトランスパイルしています。ES6 の polyfill として babel-polyfill を使用しています。

typescript ⇒ ES5 へのトランスパイルもトライしましたが、babel-polyfill との相性が悪いようでうまくいかなった（詳細は忘れました）ので、上記のように二段階にしています。
参考：  http://bouzuya.hatenablog.com/entry/2016/03/15/145210

## DI でクライアントの永続化ストレージを切替

クライアント側のデータ保存先を localStorage or cookie で切り替えられるようにしています。（inversify.js を使用）

## typings で取得した d.ts の修正

redux-logger, js-cookie については修正したファイルをローカルに配置しています。

```
export = hoge ⇒ export default hoge
```

## play2 との連携

webpack で固めた jsファイル（スタイルや画像を含む）を public ディレクトリに配置することで play2 に取り込んでいます。
GitLab のソースコードのタブ幅をブラウザのアドオンで変更する

各ブラウザのタブ幅は 8 がデフォルトなので、ブラウザ上でソースコードを見るととても見づらかったりします。
GitHub でタブ幅を変える方法はいろいろ見つかりますが、GitLab でタブ幅を変える方法は意外と少なかったので記事にしてみました。

GitLab 側の設定を変更することでタブ幅を変更することもできるようですが、タブというのはただのインデントで、その幅がどのくらいかは個人で好きなように設定できるべきだと思うので、ここではブラウザのアドオンで変更する方法について述べます。

私が使用しているブラウザは Firefox ですので、Firefox で説明していますが、CSS の書き方自体は他のブラウザのアドオンにも適用できると思います。

# 使用するアドオン

Firefox では [Stylish](https://addons.mozilla.org/ja/firefox/addon/stylish/) というアドオンがあるので、これを使います。

# 設定方法

アドオンをインストールしたら画面右上に Stylish のアイコンが表示されます。
アイコンをクリックし、「新しいスタイルを書く」からスタイルを作成します。

例えば、以下のようにスタイルを記述することで GitLab のタブ幅を変更できます。

```
@-moz-document url-prefix("http://example.com/") {
  code, .tab-content{
    -moz-tab-size: 4 !important;
    -webkit-tab-size: 4 !important;
    -o-tab-size: 4 !important;
    tab-size: 4 !important;
  }
}
```

書き方についての詳細はググってください。
`code` のタグはファイルを単体で表示したとき用に指定しています。
`tab-content` のクラスはマージリクエスト時など、ソースを差分表示したとき用に指定しています。
ここらへんは GitLab のページの HTML ソースを解析して割り出しましたが、もしかしたらもっと良い指定方法があるかもしれません。 

# 参考URL

以下のページを参考にさせていただきました。

- http://qiita.com/sue738/items/c68bf768f4aa30e88682
- http://rosylilly.hatenablog.com/entry/2014/06/26/152913
- http://nekonenene.hatenablog.com/entry/2015/09/13/100819
Xode シミュレーターのフォルダを探す

Xcode 8に切り替わった後、なぜかSimPholdersが使えなくなりました。

代わりに、Open SourceのOpenSimを使っています。なかなかいい感じです。

https://github.com/luosheng/OpenSim

![image](https://qiita-image-store.s3.amazonaws.com/0/113437/01f55d77-34a6-ea63-04f5-d060ffa10ffe.png)
phonegap: visual studio codeで開発

今、windowsのbracketsでコーディングして、phonegapbuildでビルドして、iosで問題があったらmac開いてデバッグしてる。
面倒なので、macのvisual studio codeでコーディングしたら楽になるのかもと思ったメモ。

http://blog.aqutras.com/entry/2016/04/25/210000

https://blogs.msdn.microsoft.com/visualstudio_jpn/2016/11/29/whatss-new-for-ios-and-android-developers-using-javascript/
JavaScriptでGETパラメータを取得するワンライナー

読みやすくするために改行しています。
ちゃんとしたワンライナー(`;`無し)になったのは2だけです。
(もうちょっと頑張れるのかも知れませんが…)

ES2015版の動作確認は Firefox 50.0, Chrome 54.0.2840.98 で行いました。

## 1. ES2015
```js
window.location.search.substring(1).split('&')
  .reduce((result, query) => {
    const [k, v] = query.split('=');
    result[k] = decodeURI(v);
    return result;
  }, {});
```

## 2. ES2015 (Object.assignを使ったバージョン)
```js
window.location.search.substring(1).split('&')
  .map(query => query.split('='))
  .reduce((result, [k, v]) => Object.assign(result, { [k]: decodeURI(v) }), {});
```

## 3. ES5
```js
window.location.search.substring(1).split('&')
  .reduce(function(result, query) {
    var pair = query.split('=');
    result[pair[0]] = decodeURI(pair[1]);
    return result;
  }, {});
```

# 使い方
```js
// ES2015
const getUrlParams = () => window.location.search.substring(1).split('&').reduce((result, query) => { const [k, v] = query.split('='); result[k] = decodeURI(v); return result; }, {});
```

```js
//ES5
var getUrlParams = function() {
  return window.location.search.substring(1).split('&').reduce(function(result, query) { var pair = query.split('='); result[pair[0]] = decodeURI(pair[1]); return result; }, {});
}
```

```js
getUrlParams();
```

## 実行結果
サンプルURL

* https://www.google.co.jp/search?site=&source=hp&q=%E3%81%82%E3%81%84%E3%81%86+%E3%81%88%E3%81%8A&oq=%E3%81%82%E3%81%84%E3%81%86+%E3%81%88%E3%81%8A

結果

```js
{ 
  site: "",
  source: "hp",
  q: "あいう+えお",
  oq: "あいう+えお"
}
```
W: GPG error: https://apt.dockerproject.org ubuntu-precise Release: The following signatures were invalid: BADSIG F76221572C52609D Docker Release Tool (releasedocker) <docker@docker.com>

https://github.com/docker/docker/issues/22599

when apt-get update 

W: GPG error: https://apt.dockerproject.org ubuntu-precise Release: The following signatures were invalid: BADSIG F76221572C52609D Docker Release Tool (releasedocker) <docker@docker.com>

replace

```bash
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
```

with

```bash
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F76221572C52609D
```

and
```
sudo rm /var/lib/apt/lists/apt.dockerproject.org_repo_dists_ubuntu-*
```
before apt-get update
情報セキュリティマネジメント（ISO27001）のトレーニングに関して

## ISO27001の資格をとった
必要に迫られてISO27001（日本のJIS27001はISO27001がもとになっている）の資格をとった。

[詳しくはこちらの記事へ](http://blog.shota-kameyama.com/2016/11/29/un-information-security/)

海外にいるので、英語のトレーニングがどこも高い。そこで色々さがしているうちに、ISO27001のオンライントレーニングに行き着いた。

## オンライントレーニング
オンライントレーニングも色々あるが、中でも無料でオンライントレーニングをしているところがあるので、ためしに受講してみた。思いのほかよかったので共有します。

https://training.advisera.com/

ここではISO27001の他にISO14001、ISO9001の無料オンライントレーニングを公開している。トレーニングは主に基礎コースと内部監査官の二つ。またブログの記事やメルマガも充実していて、個人的にすごく気に入っている。一気に資格へのハードルが下がった。

## 資格に関して
払うべき費用は、資格の試験代のみ。Foundationsで約1万円、Internal Auditorで3万円、また[Lead Implementer](https://www.infosecskills.com/products/kits/pecb-isoiec-27001-lead-implementer-exam)は別途自分で探す必要があり、リンクのサイト先で5万円ほど。FoundationsとInternal Auditorはオンライン試験。ちゃんとチートできないような仕組みになっているから、安心して試験を受けることができる。個人的にはオンライン試験がもっと普及すればいいなと願っている。
エクセルでUMLを頑張るのはもう辞めよう！テキストベースでUMLが書ける♪

# 概要
エクセルでUML図やフロー図を書くのがもー嫌で嫌で代替え案を探していました。
http://hige-sun.net/plantuml-on-atom/
こちらの記事を参考に（というかまるっと）追ってやった時のメモです。


# 前提
- Mac 
- Atomがインストールされていること
- javaがインストールされていること

# plantUMLインストール
[ココ](http://plantuml.com/download)からPlantUML compiled Jarをダウンロードする
ダウンロードしたファイル`plantuml.jar`は、PlantUMLファイルを画像化する時に使います。

# Atom pluginインストールと設定
## atom pluginインストール
- plantuml-viewer
- language-plantuml

## plantuml-viewer plugin設定
- `Charset`を`utf8`にすること
- 再起動（自分は再起動しないとViewが表示されませんでした）

# サンプルコード
```sample.pu
@startuml{you&i.png} 
you -> I : hello
I -> you : hello
|||
loop 1, 3
  you -> I : shall we dance?
end
|||
you <- I : sure, my pleasure♡
note right: oh! handsome guy♪
@enduml

```
# ビューを表示する
`Control`+`option`+`p`でViewを表示する
<img width="1329" alt="スクリーンショット 2016-11-30 午後0.03.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/34039/ef13a894-9d0a-45a8-9bbd-db4eed74c663.png">


# platUMLファイルを画像化する

```
java -jar plantuml.jar file/sample.pu
```

`you&i.png`画像ファイルができる
PAMで特定のユーザだけ別の認証をしたい場合


最近二要素認証だったりでPAMを使うことが増えました。
ですが、二要素目が `keyboard-interactive` になることが多く、複数の二要素認証を使い分けようとするとどうすれば良いか困ったのでメモとして残しておきます。

ただ、色々試していてこれで行けそうという感じなので、本当に理解が正しいかはわかりません（PAMの設定は難しすぎる）。
こういう意味だ、とかこうした方が良い、などありましたらご指摘下さい。

主に `auth` の箇所について書いてます。

# 環境
以下の環境で試しました。

- OS
	- CentOS 6.5
- PAM
	- 1.1.1
- OpenSSH
	- 5.3p1


# SSHの設定
今回は[DUO](https://duo.com/)と[Yubikey](https://yubikey.yubion.com/)が利用したいとします。
その場合、sshd_configに分けて書ければ良いのですが、大体以下のようになってしまいます。

```shell-session
$ cat /etc/ssh/sshd_config
...
RequiredAuthentications2 publickey,keyboard-interactive
```

OpenSSHのバージョンによっては以下のようになります。

```shell-session
AuthenticationMethods publickey,keyboard-interactive
```

Yubikeyの場合もDUOの場合も `keyboard-interactive` となってしまいsshdの設定では使い分けできません。
そこで、何とか分けられないかなと思ってPAMの設定をしてみました。

# PAMの設定
PAMでは成功した場合や失敗した場合の処理が設定可能です。
詳細は参考ページを見て頂けると分かると思います。

PAMでは基本的に上から順にチェックされていきます。
例えば、以下のように書いた場合だと `success=2` というのが成功した場合に2行スキップされることを意味します（pam_permitへ行く）。
`default=ignore` は失敗した場合は無視して次の行へ移動することを意味しています。

```shell-session
auth	[success=2 default=ignore]	pam_unix.so nullok_secure
auth	[success=1 default=ignore]	pam_winbind.so krb5_auth  try_first_pass
auth	requisite			pam_deny.so
auth	required			pam_permit.so
```

このようにスキップをうまく使えばif文のように書けるので特定のユーザだけ別のPAMで認証させることができそうです。

`pam_succeed_if.so` というのがあるので、これを使ってみます。
以下のように書けるかと思います（コメントのあとは目印として記号を振っているだけです）。

```shell-session
auth      required pam_sepermit.so 
auth      [success=ignore ignore=ignore default=1] pam_succeed_if.so user in test1:test2 # - (a)
auth      [success=done default=die]        pam_duo.so # - (b)
auth      [success=done default=ignore] pam_yubico.so id=XXXXX key=hoge authfile=/etc/yubikey_mappings # - (c)
auth      required                      pam_deny.so # - (d)
```

(a) まず `pam_succeed_if.so` を使ってユーザの判定を行っています。
`user in test1:test2` のところでtest1かtest2のユーザの場合のみ成功を返します。
`success=ignore` なので、成功した場合は次の行（b）へ行き、 `pam_duo.so` で認証が行われます。
失敗した場合はdefault=1なので1行スキップされ、 `pam_yubico.so` の認証(c)が行われます。
ちなみに `ignore=ignore` がないとエラーが出ますが、まだよく分かってません。

(b) ここでは `success=done` なので成功した場合は終了、 `default=die` なので失敗した場合も終了します。


(c) `success=done` なのでここで成功すれば終了で、 `default=ignore` なので失敗した場合は次の行(d)へ行きます。

(d) 最後に `pam_deny.so` に行き失敗します。

まとめるとユーザがtest1かtest2の場合はDUOで認証され、それ以外のユーザの場合はYubikeyで認証されます（多分そうなっているはず。。）

### 擬似コード
口で説明してもよくわからないと思うので `pam_succeed_if.so` 以降に関して擬似コードを書きました。
大枠こんな感じだろう、と僕の中では思ってますが、正確ではない可能性があります。
正確な挙動を知ってる人がいたら教えてください。

```python
if user in ["test1", "test2"]:
    result = duo()
    if result == success:
        return success
    else:
        exit(1)
else:
    result = yubico()
    if result == success:
        return success
    else:
        deny()
```


## 参考
http://baalzephon.no-ip.org/tech/index.php?Linux%2FPAM%E3%83%A1%E3%83%A2
[備忘録]androidでのadmobの表示

チュートリアルをコピペたして動かなかったのでメモ。

activityのxmlで、チュートリアルは、

```xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <TextView android:text="@string/hello_world" android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <com.google.android.gms.ads.AdView
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        ads:adSize="BANNER"
        ads:adUnitId="@string/banner_ad_unit_id">
    </com.google.android.gms.ads.AdView>
```

という感じで、RelativeLayoutのタグにxmlns:adsを記述しているが、
これだと、エラーになる。
ググってみても、

```
    xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
```

とか、

```
    xmlns:ads="http://schemas.android.com/apk/lib/アプリのパッケージ名"
```

とか、出てくるけど、これも、起動時、Viewの部分に、adSizeが記述されてない的なメッセージが出て表示されない。

正解は、「com.google.android.gms.ads.AdView」タグに記述する。

```xml
   <com.google.android.gms.ads.AdView
        android:id="@+id/adView"
        xmlns:ads="http://schemas.android.com/apk/res-auto"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        ads:adSize="BANNER"
        ads:adUnitId="@string/banner_ad_unit_id"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true" />

```

これだと、表示される。。。
ググってstackoverflowみても、コードで、onCreate時に、
AdViewに、adSizeやunitid設定しろとか書いてるけど、動かない。
（adSize定義してないとか表示される。）

かつ、上記設定をした場合、コードで、unitidを設定すると、
２回unitid設定はエラーになる。
UITableViewで不自然なスペースが先頭に入る問題

## 現象
`UIViewController`に対してヘッダ用の`View`を追加し、そこにMargin0pxで`UITableView`を配置したところ、どうも20pxほど謎のスペースが発生する現象が起こりました。

<img width="250" alt="IMG_0003.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/34166/773e49e8-8d5e-10e2-1e9b-878bd31adc34.png">

`tableHeaderView`に0pxの`View`を配置したり、`sectionHeader`に0pxを設定してもこの問題が解消されることはありませんでした。


## 対処方法

こちらで解説されていたように、`UIViewController`の`Adjust Scroll View Insets`のチェックを外せば解消します。

■ Why is there extra padding at the top of my UITableView with style UITableViewStyleGrouped in iOS7
http://stackoverflow.com/questions/18880341/why-is-there-extra-padding-at-the-top-of-my-uitableview-with-style-uitableviewst

`Storyboard`から`UIViewController`を選択し、チェックを外します。
![スクリーンショット 2016-11-30 11.36.21.png](https://qiita-image-store.s3.amazonaws.com/0/34166/972ec604-76c3-0722-61ad-dc4600c228f6.png)

![スクリーンショット 2016-11-30 11.png](https://qiita-image-store.s3.amazonaws.com/0/34166/74d22011-0962-a925-4ce0-8a64beb41616.png)

問題が解消しました。
<img width="250" alt="IMG_0004.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/34166/7a69b75c-b4a7-5b49-a17a-8cfae7dd7f04.png">


このフラグは、ステータスバーの領域や`Navigation Bar`の領域に当たる`Extend Edges`の分だけ自動的に`Content Insets`を設定させるためのフラグなんですが、今回のように全画面ではなく画面の途中から始まる場合などに設定されていると無駄にずれるだけなので外しておいた方がいいです。
はじめての Maya スクリプト導入

# はじめに
Maya の便利スクリプトを作成することになったので、導入のための一連の流れを書き留めておく。


# 手順

##テスト用のスクリプトを用意

下記のようなサンプルファイルを用意する。
※ すでにスクリプトがある場合はもちろん省略。

```helloWorld.py
# -*- coding: utf-8 -*-
def main()
  print u'hello こんにちは'
```

##スクリプト置き場

下記のディレクトリにスクリプトを配置するとMaya上で呼べる。

※ 優先順位順（複数のディレクトリに同じ関数名のスクリプトが混在する場合、上にあるものほど優先される）

### Maya 2015
#### Mac
- /Users/<ユーザ名>/Library/Preferences/Autodesk/maya/2015-x64/ja_JP/scripts
- /Users/<ユーザ名>/Library/Preferences/Autodesk/maya/scripts
- /Users/<ユーザ名>/Library/Preferences/Autodesk/maya/2015-x64/ja_JP/prefs/scripts

### Maya 2016
#### Mac
- /Users/<ユーザ名>/Library/Preferences/Autodesk/maya/2016/ja_JP/scripts
- /Users/<ユーザ名>/Library/Preferences/Autodesk/maya/scripts
- /Users/<ユーザ名>/Library/Preferences/Autodesk/maya/2016/ja_JP/prefs/scripts

### Maya 2017
#### Mac
- /Users/<ユーザ名>/Library/Preferences/Autodesk/maya/2017/ja_JP/scripts
- /Users/<ユーザ名>/Library/Preferences/Autodesk/maya/scripts
- /Users/<ユーザ名>/Library/Preferences/Autodesk/maya/2017/ja_JP/prefs/scripts




##実行してみる
1. 画面右下にあるアイコンを押すと「スクリプトエディタ」が起動する。
2. 表示された「スクリプトエディタ」の下のエリアにコマンドを入力し 「Ctrl + Enter」で処理が実行される。

    ```py
    import helloWorld
    helloWorld.main()
    ```

3. 上のエリアにコマンドの結果が出力される。

![スクリーンショット 2016-11-30 11.05.36.png](https://qiita-image-store.s3.amazonaws.com/0/56504/fea6571e-08d3-f26f-6edc-cf37b1dbf381.png)


##ショートカットの作成
シェルフに入れるコードを選択したのち、マウス中ボタンを押しながら②に向かってドラック＆ドロップするとショートカットが作成される。
以降は、シェルフのショートカットを押すだけで実行されるようになる。

![スクリーンショット 2016-11-30 11.38.01.png](https://qiita-image-store.s3.amazonaws.com/0/56504/2d0be070-b041-7e0f-8418-627f0b1d10f8.png)
react material-ui のサンプル

# reactとmaterial-uiのサンプル

チェックボックスを使いたくで、[ドキュメント](http://www.material-ui.com/#/components/checkbox)を見ながら配置してみた。

ドキュメントの内容：

```js
import React from 'react';
import Checkbox from 'material-ui/Checkbox';
import ActionFavorite from 'material-ui/svg-icons/action/favorite';
import ActionFavoriteBorder from 'material-ui/svg-icons/action/favorite-border';
import Visibility from 'material-ui/svg-icons/action/visibility';
import VisibilityOff from 'material-ui/svg-icons/action/visibility-off';

const styles = {
  block: {
    maxWidth: 250,
  },
  checkbox: {
    marginBottom: 16,
  },
};

const CheckboxExampleSimple = () => (
  <div style={styles.block}>
    <Checkbox
      label="Simple"
      style={styles.checkbox}
    />
以下略
```

ふむふむ。なるほどね？っと上記を真似て配置したが、全然うまくいかず・・・

いろいろと探った結果、こんなルールがあった(気付きにくいよー涙)

```js:App.js
import { browserHistory } from 'react-router';
import React, { Component } from 'react';
// MuiThemeProviderをimport
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';

import './App.css';


class App extends Component {
  render() {
    return (
      // <MuiThemeProvider>でラッピング
      <MuiThemeProvider>
      <div>
        <main>
          <div>
               { this.props.children }
          </div>
        </main>
      </div>
      </MuiThemeProvider>
    );
  }
}
```

```js:使う側のコンポーネント
import getMuiTheme from 'material-ui/styles/getMuiTheme';
import Checkbox from 'material-ui/Checkbox';

・・・・略
          <Checkbox
            id="rv_rhd_site"
            label=""
            value="1"
            // ↓をやらないとmuiがないよ！ってエラーが起きる。
            muiTheme={getMuiTheme("checkbox")}
            style={styles.checkbox}
            labelStyle={styles.label}
            defaultChecked={incident.rv_rhd_site==1?true:false}
          />
・・・略
```

へい！アメリカンぴーぽー！
ドキュメントの例は、もっと親切にしてYO!

英語よくわかんねーYO!

ちなみに

[usage](http://www.material-ui.com/#/get-started/usage)に書いてあります。

でも、サンプルにも書いてくれてもよくない・・・？

この記事でmaterial-ui使えたよ!!って人は「いいね！」宜しくですw
Office 2016 > link > Office 2013へのダウングレード

Office 2013で使用していると、延々と「新しいOfficeをインストールしましょう」なるメッセージが出てくる。

人によっては、それを間違って有効にしてしまう場合があり、その人のPCがOffice 2016になってしまう。Office 2016で不具合に遭遇しなければいいけど、Office 2013に戻す方法も知っておくのがいいように感じた。

以下の情報が参考になった。
http://alstroemeria.hatenadiary.jp/entry/2016/05/17/190200

情報感謝です。

> 普段Officeの中で活用するのは、主にExcel／PPTなんですが、Excelがダメダメでした。
フィルタをかけると固まってしまう、関数がうまく動かない、結果が違うとか、基本機能が動かないんですよ ( ﾟДﾟ)ﾄﾞﾙｧ!!

「結果が違う」というのは気づけばいいが、気づかなかった場合に致命傷になるような気がする。
WindowsServerからインターネット接続できてしまった

Windows Serverのインスタンス立ち上げて、Security groupも設定したがインターネット接続ができてしまい、あれ？なんで？ってなってしまった。
色々わけのわからないところに迷い込んだあげくの原因がかなりしょうもなかったので、自戒として記す。


##インターネット接続できてしまった原因
原因はは何だったのかってやっぱりSecurity groupの設定が悪かっただけ。

![image](https://qiita-image-store.s3.amazonaws.com/0/150939/e9458007-c398-db8b-dc25-820f4d9ebf70.png)
**Outboundフルオープン状態……。**

All trafficを変更してインターネット接続ができないようになった。


##何故気づかなかったのか
ただただ俺のInboud/Outboundの理解ができてなかったってだけ。

![image](https://qiita-image-store.s3.amazonaws.com/0/150939/c9c6eb9a-9905-277c-b4c6-c8f1393928b3.png)
インスタンスからインターネットにアクセスする（出ていく）んだから、Outboundだろ常考なところを、Inboundばっかり気にしていたという。


##備考
メモとして、じゃあ逆にインターネット接続したい場合はOutboundどうする？記載しておく

![image](https://qiita-image-store.s3.amazonaws.com/0/150939/3f302f78-7d9c-bfa7-481b-b9f18aaa2131.png)
IPがフルオープン状態だけど、一旦それはおいておく
DwCC2017 始める前の設定カスタマイズメモ

Adobe 2012 とかそのあたりにちらっとDw使ったぶり。
新しくなって色々デキそうなので触ってみたメモ。
主にエディタとして使用。
お役立ち情報は無し。
随時追記。

#タブ・スペース・改行を表示する
アプリケーションメニューの[表示]-[コードビューオプション]-[非表示の文字]をクリック。
![image](https://qiita-image-store.s3.amazonaws.com/0/69733/492fa4d2-cff8-5cf4-a5b5-2bd1aba10fc9.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/69733/b5bdb262-9a3d-791a-babf-a61f37d5f318.png)
↓
![image](https://qiita-image-store.s3.amazonaws.com/0/69733/678c23f2-44e7-daef-48a7-8a0b8a7e0f53.png)
なんか見づらい…改行の色を薄くしたい。
気が向いたら調べる。

#デフォルトの改行コードを変える
デフォルトの改行コードがCRLF。しかも既存ファイルを開いても自動判定してくれなく強制変換！
いつもLFで統一してるのでdiffツールが真っ赤っ赤ー！！
## 環境設定のコードフォーマットカテゴリを開く
アプリケーションメニューの[編集]-[環境設定]で環境設定パネルを開いて、左の[コードフォーマット]をクリック。
![image](https://qiita-image-store.s3.amazonaws.com/0/69733/12c30f3b-be3e-3846-abac-7e867f333d8c.png)
## 改行タイプを変更する
![image](https://qiita-image-store.s3.amazonaws.com/0/69733/6c308d2a-5a29-2575-4393-e0331430b5a8.png)
OK!

# UTF-8ファイルのBOMの有無を確認する
トラブルメーカーBOM。
昔、DwでいじるとBOMが勝手に付いて困った事があったような。。
さすがにDwもBOM無しが標準になってると思うけど、改めて。

## プロパティパネルを開く
[ウィンドウ]-[プロパティ]をクリック
<img width="260" alt="image" src="https://qiita-image-store.s3.amazonaws.com/0/69733/45e1bd1c-15fd-d8e5-040e-32dc7f4b230b.png">
##ページプロパティを開く
[ページプロパティ]ボタンをクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/69733/ea566bdd-c5a9-a3c8-0896-1ecc4d3cfed8.png)
##ページプロパティのタイトル/エンコーディングを確認
左のカテゴリから[タイトル/エンコーディング]を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/69733/7f8554ae-6e69-bd0c-1a90-814cf3712466.png)

[Unicode署名を含める(BOM)]にチェックが入っていればBOM有、無ければBOM無

##参考サイト
https://helpx.adobe.com/jp/dreamweaver/using/set-title-encoding-properties-page.html
Faster R-CNNを使ってリアルタイムオブジェクト検出をしてみよう

#はじめに
これまで、R-CNNとしてBINGやSelective Searchといった手法を紹介してきました。
・過去の記事はこちら
[CNNの前処理としてOpenCVでBINGを使ってみた](http://qiita.com/Almond/items/ad56ce29112d6397a704)
[R-CNNとしてSelective search を使ってみた](http://qiita.com/Almond/items/7850cf81903fbe2a2c6c)
しかし、BINGについてはあまり精度がよくない事、
Selective Searchについては処理速度が遅いといった不満が残ります。
そこで今回はFaster R-CNNを試したみたいと思います。

#Faster R-CNNとは
物体の候補検出もCNNで行うことにより高速化された手法です。
もともとはFast R-CNNという手法が先に発表されましたが、
すぐ後に更に高速となったFaster R-CNNが発表されました。
（この世界の進歩の速度は恐ろしいものがあります。。）
詳しくはCornnel　Univercityのページを参照してください
 https://arxiv.org/abs/1506.01497


#やり方
オリジナルはCaffe の方ですが
https://github.com/rbgirshick/py-faster-rcnn/tree/96dc9f1dea3087474d6da5a98879072901ee9bf9
個人的な趣味でCaffe はあまり使いたくないので、今回はChainerのバージョンを使います。
https://github.com/mitmul/chainer-faster-rcnn

環境：Ubuntu16.04LTS、Python2.7.12、 Chainer1.12.0
ReadMeに書かれた手順に従って実行していくだけです。

□ chainer-fast-neuralstyleをcloneします。
 
```
$ git clone https://github.com/mitmul/chainer-faster-rcnn
```

□ ライブラリフォルダに移動しビルドします

```
$ cd chainer-faster-rcnn/lib
$ python setup.py build_ext -i
$ cd ..
```

□ トレーニング済みモデルをダウンロードします

```
$ if [ ! -d data ]; then mkdir data; fi; cd data
$ wget https://dl.dropboxusercontent.com/u/2498135/faster-rcnn/VGG16_faster_rcnn_final.model`
$ cd ..
```

□ テスト画像をダンロードし実行します

```
$ wget http://vision.cs.utexas.edu/voc/VOC2007_test/JPEGImages/004545.jpg
$ python forward.py --img_fn 004545.jpg --gpu 0
```




#結果
テスト画像の結果です
![result_master.jpg](https://qiita-image-store.s3.amazonaws.com/0/99765/2eea19a4-547f-a461-925d-b8a143a1c9c7.jpeg)
こちらは自分で用意した画像
![result_dog.jpg](https://qiita-image-store.s3.amazonaws.com/0/99765/13b2638f-9690-a196-4c2d-863228024c73.jpeg)
どちらも正確に検出されていますね。
さらにGTX970を使った場合では約0.3～0.4秒で検出されています。
ちなみにCPUのみの場合30秒ほどかかりました。

#まとめ
Faster R-CNNは現時点ではかなり優れた手法と言えそうです。
グラフィックックスボードが必須ですが。
今後、モバイルデバイスでも動作するような軽量モデルも出てくることでしょう。

[2016/11/30追記]
と思っていたら、より高速なSingle Shot Multi-box Detectionという手法があるみたいですね。
https://arxiv.org/abs/1512.02325
こちらも暇な時間に試してみたいと思います。
KitKat以降で利用できるPDF表示ライブラリを試してみた

# 概要
AndroidアプリでのPDF表示はandroid.graphics.pdf.PdfRendererが利用できますが、Lolipop以降のみ利用可能なため、KitKat端末でも表示できる方法を探してみました。
幾つか採用できそうなライブラリがありましたが、動かしてみた範囲で安定しており、導入も容易だった以下を今回は採用しました。

barteksc/AndroidPdfViewer
https://github.com/barteksc/AndroidPdfViewer

# 使い方

## 導入

`compile 'com.github.barteksc:android-pdf-viewer:2.3.0'`

## Viewの配置

``` xml
<com.github.barteksc.pdfviewer.PDFView
        android:id="@+id/pdfView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
```

## 読み込みと表示

``` java
PDFView pdfView = (PDFView)findViewById(R.id.pdfView);
pdfView.recycle();
pdfView.fromAsset(String)
    .enableSwipe(true) //スワイプオンオフ
    .swipeHorizontal(false) //縦スクロールでページ切り替え
    .enableDoubletap(true)　//ダブルタップでの拡大
    .defaultPage(0) //初期表示ページ。表示ページのstate復旧はこれで
    .onPageChange(onPageChangeListener)//表示ページのstate保持はこれで
    .onPageScroll(onPageScrollListener)
    .onError(onErrorListener)
    .enableAnnotationRendering(false)
    .password(null)
    .scrollHandle(null)
    .load();
```

## サンプル
PDFファイル群を一覧表示して表示するサンプルを作ってみました。

miyanqii/PDFViewerSample
https://github.com/miyanqii/PDFViewerSample

# 参考
PdfRenderer
https://developer.android.com/reference/android/graphics/pdf/PdfRenderer.html

barteksc/AndroidPdfViewer
https://github.com/barteksc/AndroidPdfViewer
PythonでAzure使った音声認識のお試し（マイクロフォンからの入力）

（2016/11/30現在、まだメモ書きです）

Pythonでとりあえず、マイクロフォンから音声認識させることを試して見ました。
使用したのは、AzureのBing Speech API。https://www.microsoft.com/cognitive-services/en-us/speech-api/documentation/overview

アカウント作って、お試しボタンなどぽちぽちしていたら、Azureの画面で、Cognitive Services account というものができて、API使用するのに必要な、KEYの情報が出てきました。

いまのところ、まだ無料で試すコースがあるみたいですね。


Pythonで使用するにあたっては、
これ
https://github.com/Uberi/speech_recognition

使いました。
pip install SpeechRecognition
でインストールです。けっこう高機能そう。

また、pyaudioなるものもインストール必要でした。これもpipからインストールできます。とりあえず、SpeechRecognition入れて、サンプルソース実行すると、pyaudio必要です、ってエラーが出るので、それみて、インストールしました。


サンプルコードは、
https://github.com/Uberi/speech_recognition/blob/master/examples/microphone_recognition.py
そのまま使いました。とりあえず動きます。
concrete5 で作ったホームページのうち、一部のページを iframe で呼び出し可能にする x_frame_options設定

concrete5 で作ったページを iframe で呼び出し可能にしたかったので、以下のような作業を行いました。concrete5のバージョンは5.7.5.9です。

## デフォルトの設定を確認する
デフォルトでは、concrete5 で作ったページを iframe で表示したい場合、同一ドメイン内からのみ許可しています。
chromeで確認してみると、下記のようになります。
![sameorigin.png](https://qiita-image-store.s3.amazonaws.com/0/31643/0fc965c4-ba31-d1a8-c787-bf35eccc129c.png)

この設定により、クリックジャッキングと呼ばれる攻撃を防いでいます。

## クリックジャッキングについて
クリックジャッキングとは、罠ページ(A)に、誤操作させたいページ(B)を重ね合わせて、ユーザーが意図していない操作を行わせる攻撃方法です。

1. 誤操作させたいページ(B)を透明にした状態で罠ページ(A)に重ねて表示する
2. ユーザーが罠ページ(A)でクリックなどの操作を行う
3. 実際には、誤操作させたいページ(B)で操作をしたことになる

というものです。詳しくは https://www.ipa.go.jp/files/000026478.pdf をごらんください。

## クリックジャッキングを防ぐ
クリックジャッキングを防ぐには、外部ページに埋め込みされた場合に表示しないようにすれば良いです。上の 1. の状態が発生しないようにするわけです。
そのためには、x_frame_optionsを設定します。

- DENY - 一切不可
- SAMEORIGIN - 同一ドメインから許可
- ALLOW-FROM <i>uri</i> - 指定したドメインから許可

concrete5ではデフォルトで SAMEORIGIN になっています。

## x_frame_options の設定を変更する
concrete5では、application/config/concrete.phpファイルで、設定を行うことができます。(このファイルが存在しない場合は作成してください。)
x_frame_options を設定しないようにする場合は、下記のようになります。

    'security' => array(
        'x_frame_options' => false,
    ),

詳しくは http://concrete5-japan.org/help/5-7/recipes/config/ をごらんください。

この設定をすると、iframe呼び出しが可能になります。

※追記 concrete5 ver.8.4では下記のようになります。

    'security' => array(
        'misc' => array(
            'x_frame_options' => false,
        ),
    ),

## 特定のページ(群)を許可する

上の設定だと、ウェブサイトの全てのページでクリックジャッキング防止設定が無くなります。これだと、ログインページなどもクリックジャッキング防止設定が無くなります。さすがにまずいですね。
なので、ページを表示するときに、ページに応じてヘッダー出力を変更するようにします。
concrete5には、ページを表示するときに発火するイベントが用意されています。

    public function on_start() {
        Events::addListener('on_page_view', array($this,'on_page_view'));
    }
    public function on_page_view()
    {
        $c = Page::getCurrentPage();
        if (mb_substr($c->getCollectionPath(),0,11) != '/estimation' ) {
            header("X-Frame-Options: DENY");
        }
    }

このようなコードを書くと、iframeを許可するページ、iframeを許可しないページを作ることができます。上の例では、「ページのURLが/estimationで始まる場合のみiframeを許可する」にしています。

こうすることで、
[マイミツ ログインページ](https://my-mitsu.jp/) はiframeを許可しない
[見積フォームのサンプル](https://my-mitsu.jp/estimation/274) はiframeを許可する
という設定ができました。

埋め込み表示の例は[ホームページへの埋め込みを許可しました。 :: 見積書作成時間を削減する「マイ見積」](https://my-mitsu.com/news/homepage)をご覧ください。
YARNが止まらない

（インストールしている状態で停止するので「YARNが止まる」の方が適切だったか…？）

YARNを初めて使ったらインストールでつまずいたのでメモ。

```
$ yarn
yarn install v0.17.8
info No lockfile found.
[1/4] 🔍  Resolving packages...
warning babel@6.3.26: Babel's CLI commands have been moved from the babel package to the babel-cli package
warning debowerify > bower > glob > minimatch@1.0.0: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
warning browser-sync > resp-modifier > minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
warning debowerify > bower > bower-config > graceful-fs@2.0.3: graceful-fs v3.0.0 and before will fail on node releases >= v7.0. Please update to graceful-fs@^4.0.0 as soon as possible. Use 'npm ls graceful-fs' to find it in the tree.
warning debowerify > bower > insight > tough-cookie@0.12.1: ReDoS vulnerability parsing Set-Cookie https://nodesecurity.io/advisories/130
warning debowerify > bower > request > node-uuid@1.4.7: use uuid module instead
warning browser-sync > localtunnel > request > node-uuid@1.4.7: use uuid module instead
warning debowerify > bower > update-notifier > latest-version > package-json > registry-url > npmconf@2.1.2: this package has been reintegrated into npm and is now out of date with respect to npm
[2/4] 🚚  Fetching packages...
██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ 931/932
```

931/932の状態で進展なし。

使ってたNodeのバージョンが6.0.0だったのですが、v6.9.1（LTS）に上げたら解決。

nvm使ってる場合は

```
$ nvm install 6.9.1
$ nvm alias default 6.9.1
$ npm install -g yarn
```

でOK。

YARNデビューしました。
[Ruby on Rails] 複数の条件で条件分岐したい時の書き方4種

# Overview
Rubyで1つの値に対して複数の条件で条件分岐させたい時の記述方法メモです。
自分はデザイナー職なのでhtmlのクラス名の出し分けで使ったりすることが多く、ワンライナーで書ける3のinを使う方法が好み。

# 1: or を使う
単純にorで繋げた原始的なやりかた。

``` ruby:
if name == 'kaoru' || name == 'nana' || name == 'ryoko'
  処理A
else
  処理B
end
```


# 2: case文 を使う
case文ならwhenで引数を複数渡せるので、複数条件が複数あるときの分岐はこれが便利か。三項演算子でワンライナーでいけないのが欠点。

``` ruby:
case name
when 'kaoru','nana','ryoko'
  処理A
else
  処理B
end
```

# 3: in? を使う
ActiveSupport のinを使う。ワンライナーでも書きやすいし可読性が良い。
ソース http://api.rubyonrails.org/classes/Object.html#method-i-in-3F

``` ruby:
if name.in?(['kaoru','nana','ryoko'])
  処理A
else
  処理B
end
```
``` ruby:三項演算子ver.
name.in?(['kaoru','nana','ryoko'])? 処理A : 処理B
```

# 4 include?　を使う
3同様ワンライナーで書きやすい。
けど値が最初にきてわかりづらいから3のほうが個人的にはすき。

``` ruby:
if ['kaoru','nana','ryoko'].include?(name)
  処理A
else
  処理B
end
```
``` ruby:三項演算子ver.
['kaoru','nana','ryoko'].include?(name)? 処理A : 処理B
```
apache「mountしたよ！」root「してないんだよなあ」apache「してるじゃん！ファイルも見れるよ！」

root「ないです。apacheになって見てやんよ」
su apache 「ないです」

# <i class="fa fa-graduation-cap" aria-hidden="true"></i> 結論

[Systemd入門(5) - PrivateTmpの実装を見る - めもめも]
にすべてが書いてある。
おわり！

>これは、あくまでsystemdから起動するプロセスに対して設定するべき内容です。普通に上記の操作をすると、システム上のすべてのプロセスに対して、ファイルシステムの状態が変更されてしまいます。ここで登場するのが、「ファイルシステムのnamespace」（以降は単に「namespace」と表記）の機能です。これを使うと、プロセスごとにファイルシステムの構成状態（マウント状態）を分離することができます。systemdでは、この機能によって、起動プロセスから見えるファイルシステムの構成状態（マウント状態）のみを変更しています。

,

>PrivateTmpの機能も同様に、namespaceを利用しています。「/tmp/systemd-private-XXXXXX」（XXXXXXはランダム）という空のディレクトリを用意して、該当プロセスに対しては、/tmpをここにバインドマウントします。これで、このプロセスに対して、/tmpの中身は、/tmp/systemd-private-XXXXXXになります。/var/tmpも同様に別の空ディレクトリにバインドマウントします。

,

>また、このシェルからは、次のように/tmpがバインドマウントされているエントリが確認できますが、別の端末からログインした方では、このエントリは見えません。これからもファイルシステムのnamespaceが分離されていることが分かります。

,

>プログラム内で、具体的にnamespaceの分離を行う部分をコメントに記してあります。(*1)でnamespaceを分離した後に、(*2)で/以下に「MS_SLAVE」というマークをつけています。これは、このnamespaceで行った変更（追加のバインドマウントなど）を元のnamespaceには反映しないという指定です。これによって、(*3)のバインドマウントは、このプロセスのnamespaceのみで実施されて、他のプロセスからは見えなくなります。

,

>上記で説明したように、PrivateTmpを利用してプロセスを起動すると、そのプロセスが追加のバインドマウントを行っても、それは他のプロセスからは見えません

***

`/usr/lib/systemd/system/httpd.service`
の`PrivateTmp=true`を`PrivateTmp=false`にすると問題が発生しない。
他の一部機能が`true`な場合も同様の状態が発生すると思われる。

***

`PrivateTmp`の仕様というか、副作用により、ブラウザ(Apache)を経由して実行される`mount`はそのプロセスからしか参照できない。
プロセス内でmountすることでリードオンリーにしたり、`/tmp`に`/tmp/systemd-private-XXXXXX`をmountして、`/tmp`への書き込みにprivateTmpを実現しているのだが、このとき、PHPでもあるようなnamespaceを使うことで、他プロセスとはmount状況を独立させることができる。

この影響はプロセス内で残り続けるので、PHPで`exec('mount hogehoge')`としても、そのmountは同じnamespaceのプロセス内でしかmountされていることにはならない。

したがって、端末のrootやapacheユーザーであろうと、mount状況は見えない。

# <i class="fa fa-cogs"></i> 環境

* CentOS7 64bit
* Apache/2.4.6 (CentOS)
* systemd 219

# <i class="fa fa-cubes"></i> 問題

## 書いていたコード

ブラウザから入力された内容でmountを行い、ブラウザでファイル一覧を確認したり、バッチ処理でデータの読み書きを行う。

CentOS7移行前まで稼働実績あり

## 起こったこと

バッチでのmount領域内の処理が失敗する。
というか、`mount`コマンドでmountされているかの確認を行うが、されていないと出るので処理が行われない。

sshで入り確認するも、手動の`mount`や`df`ではやはり確認出来ないが、
ブラウザから確認すると、同様のmountチェックコードでも正常にmountされていることが確認できてしまう。

Apacheでしか`mount`できないわけではなく、Apacheでのmount状態がApache以外では確認できないような状態だった。
(Apacheと端末で同じ領域に別々にmountしたりできてしまった)

## <i class="fa fa-code"></i> 確認した方法

最小構成のPHPを公開領域に置き、ブラウザでアクセスした場合と手動で実行した場合で問題が再現したので、Apacheの問題とした。

```php

<?php

exec('/usr/bin/sudo /bin/mount -t nfs 192.168.1.123:/nas /nas');

echo shell_exec('/usr/bin/sudo /bin/mount');

```

***

`PrivateTmp`はデバッグ時のファイル書き出しで引っかかって覚えていたのですが、デバッグ以外では`/tmp`に書き込まないからと放置していた結果の落とし穴でした。

`PrivateTmp`の無効方法およびその他の落とし穴は
[お前らもさっさとハマって泣くべきCentOS7の落とし穴4つ - Qiita]
をどうぞ。
`/tmp`問題はこっちを先に見ていたのに忘れてハマって泣いたんですけど。





[Systemd入門(5) - PrivateTmpの実装を見る - めもめも]:http://enakai00.hatenablog.com/entry/20130923/1379927579
[お前らもさっさとハマって泣くべきCentOS7の落とし穴4つ - Qiita]:http://qiita.com/suemoc/items/e29285e8e67263298f35
ページヘッダーとフッターの作成

ページヘッダーやフッターのサイト名やコピーライトはページ内に2回以上登場する可能性ががないためクラス属性ではなく「id」属性をつけるとよい。
そうすることにより、ページに1つしか存在しない固有の要素であることを明確に示すことができる。

また、コピーライトなどの細目は「small」タグで囲むと文字が一回り小さくなる。

```html:filename.html
<p id="copyright"><small>コピーライト</small></p>
```
SSHでいつもやる設定 (ControlMaster / Bash補完)

# ControlMaster

SSHコネクションを束ねて使いまわす機能です。1ホストに対して多量のSSHコネクションを張る場合や、コマンドを実行する場合効果が現れます。

- 接続済みの相手への接続時間が減る
- TCPセッション数が減る

```:~/.ssh/config
Host *
  ControlMaster auto
  ControlPath ~/.ssh/mux-%r@%h:%p
  ControlPersist 10
```

```bash:速度計測
$ # 1. 最初の接続なので時間がかかる
$ time ssh hostname date
Wed Nov 30 10:40:55 JST 2016

real    0m0.508s
user    0m0.016s
sys     0m0.047s

$ # 2. セッションが残っているので、高速に接続できる
$ time ssh hostname date
Wed Nov 30 10:40:58 JST 2016

real    0m0.089s
user    0m0.000s
sys     0m0.031s

$ # 3. ControlPersistで指定した10秒を経過したので、セッションは消えている
$ time ssh hostname date
Wed Nov 30 10:41:16 JST 2016

real    0m0.506s
user    0m0.016s
sys     0m0.063s
```


参考: [OpenSSHのセッションを束ねるControlMasterの使いにくい部分はControlPersistで解決できる - Dマイナー志向](http://d.hatena.ne.jp/tmatsuu/20120707/1341677472)

# Bash Completion

Bashでの強力な補完をサポートする `bash_completion` では、以下に記載のあるホスト名に対してSSHコマンドなどの補完を行います。

- `~/.ssh/config`
- `/etc/hosts`
- ハッシュ化されていない `~/.ssh/known_hosts`

上2つを手入力で入れるのは現実的ではないように感じます。3つ目の機能を使用することにより、今まで接続したホストに対して補完が効くようになります。

ただ最近のOpenSSHでは、標準の設定が `HashKnownHosts yes` となっています。なので、 `known_hosts` からホスト名を列挙することが出来ません。鍵と `known_hosts` が漏れた際に攻撃のリスクを最小限にするためだと思われます。

```:~/.ssh/config
Host *
  User ubuntu
  HashKnownHosts no
```

このように設定すると、新しい接続先に対してはハッシュ化されずに記録されるようになります。今までに接続したことが有るホストもハッシュ化を解除したい際は、 `known_hosts` の該当行を削除するのが手軽です。

```bash
$ ssh-keygen -R hostname
```

---

以上の設定を全て書いて、自分はこのような設定を使用しています。Ubuntuマシンに接続する場合が多く、接続先が主にプライベートネットワークで、ControlMasterによって影響を受ける機能を使用していないためこのように設定しています。

```
Host *
  User ubuntu
  ControlMaster auto
  ControlPath ~/.ssh/mux-%r@%h:%p
  ControlPersist 10
  HashKnownHosts no
```
[メモ] OpenMediaVault3サーバで、pi-hole(ドメインベースの広告除去)もやらせる

## 概要
- NAS鯖(OMV)に、 Pi-holeをいれて、一台ですませたい。
- pi-holeはlighttpd、OMVはNginxだったよなぁ。しかし、
- pi-holeのwikiにこんなものが...=> [Nginx Configuration](https://github.com/pi-hole/pi-hole/wiki/Nginx-Configuration)

- 関連
    - [[メモ]NAS設定 OpenMediaVault 3 (らずぱい/Armbian on BananaPro)](http://qiita.com/mt08/items/e95acfcb3d503242e2fb )
    - [らずぱい: Pi-Holeで、ネット広告遮断 (インターネット広告のブラックホール)](http://qiita.com/mt08/items/c48aab78a079f8e619a6)


## 環境
- Raspberry Pi 2
    - Raspbian: `2016-09-23-raspbian-jessie-lite.img`から、update
    - OMV(3.0.54)
    - USB接続メディア HDD/フラッシュ
- Banana Pro
    - armbian: `Armbian_5.20_Bananapipro_Debian_jessie_4.7.3.img` から、update
    - OMV(3.0.54)
    - SATA HDD
    - USB接続メディア HDD/フラッシュ

\# Intel版でもOK 

## 手順
1. OMV環境を準備
2. コマンドラインで..

    ```bash
# 1. pi-holeをインストール
curl -L https://install.pi-hole.net | bash
#
# 2. rootになって
sudo bash
#
# 3. lighttpdを削除.
systemctl status lighttpd
systemctl stop lighttpd
systemctl disable lighttpd
apt-get remove lighttpd --purge
#
# 4. 設定を。ポートはぶつからないように81番.
cat <<EOF >  /etc/nginx/sites-available/pihole
server {
            listen 81 default_server;
            listen [::]:81 default_server;
            root /var/www/html;
            index index.html index.htm index.php;
            server_name _;
            autoindex off;
            location / {
              expires max;
              return 204 'pixel';
            }
            location /admin {
              root   /var/www/html;
              index index.php;
              auth_basic "Restricted"; #For Basic Auth
              auth_basic_user_file /etc/nginx/.htpasswd;  #For Basic Auth
            }
            location ~ \.php$ {
              include snippets/fastcgi-php.conf;
              fastcgi_pass unix:/var/run/php5-fpm.sock;
            }
}
EOF
#
# 5. Symlinkをはる
cd  /etc/nginx/sites-enabled/
ln -sf ../sites-available/pihole .
#
# 6. nginx再起動
systemctl restart nginx
#
# 7. htpasswdをインストール
apt-get install apache2-utils -y
#
# 8. ベーシック認証のユーザとパスワード設定 user_nameは、うまいやつを。
htpasswd -c /etc/nginx/.htpasswd user_name
```

3. ブラウザから、`http://IPアドレス:81/admin` を開いて、ユーザとパスワード入力すると、pi-hole管理画面がでてくる
4. クライアントのDNSを、こいつのIPアドレスに設定する。(DHCPサバでうまく配布できるなら、そっちのがラク)


## その他
- だれか、もっとうまい設定とか、OMVのプラグインをつくってくれなだろうか。