OmniAICreator/Qiita-1.07M huggingface dataset:
Mac で Eclipse を使い始めたメモ ( Emacs 設定も )

# Mac で Eclipse
こんにちは。7cocoです。いろいろありまして Java を書くことになり、それに伴って Mac に Eclipse をインストールしました。
Eclipse というものには初めて触れたのですが、聞くところによると Eclipse は Mac との相性があまりよくなく、Windows での設定とは違った設定をしなければならない局面が多々あるとか。

そんなこんなで実際に Eclipse のセットアップをしてみて躓いた点についてまとめます。

## 黒くしたい
まずプラグインのインストール。
( 参考 ： [Eclipse を黒くする](http://qiita.com/mdstoy/items/e3a3489758b5341b8e62) )

1. [Help] -> [Eclipse Marketplace...] を選択
2. Eclipse Color Theme や Eclipse Moonrise UI Theme (黒くなります) をインストール

![スクリーンショット 2017-03-27 23.20.55.png](https://qiita-image-store.s3.amazonaws.com/0/167559/19b1a1b2-49a1-000a-3c3c-e10f2ec6613f.png)

![スクリーンショット 2017-03-27 23.22.01.png](https://qiita-image-store.s3.amazonaws.com/0/167559/5485a762-9e5c-a803-14e4-139183487d57.png)


ここまではいいのですが、この後の設定が Mac だとわかりづらいです。
###  Mac には [Window] -> [Preferences] がない！
上記の理由から、インストールしたものをどこから反映すればいいのか探すのにかなり時間を割きましたw
Mac の場合は

1. [環境設定] -> [General] -> [Appearance] を開き
2. theme から 好きなテーマ ( 私の場合は Moonrise(standalone) ) を選択
3. さらに [Appearance] -> [Color theme] から好きなものを選べます。

![スクリーンショット 2017-03-27 23.29.25.png](https://qiita-image-store.s3.amazonaws.com/0/167559/7e6ec626-2912-998d-ec27-154a9284982a.png)

## Emacs キーバインド使いたい
### ^H は別途設定が必要！
Emacs キーバインドが使いたい場合、

1. [環境設定]　-> [General] -> [keys] を開き、
2. Scheme を Emacs に変更する

とだいたいいい感じになります。
ただ、いくつか別途設定が必要です。
中でも私が困ったのは `^H` が一文字削除に割り当てられていないこと。そこで、

1. [環境設定] -> [General] -> [keys]　を開き、
2. "Open Serch Dialog" で検索
3. "Open Serch Dialog" に 下の方にある Binding で別のショートカットを割り当て
4. "Delete Previous" で検索
5. 下の方にある Binding で `^H` を入力

して、 `^H` で一文字削除ができるようになりました。
![スクリーンショット 2017-03-28 9.34.19.png](https://qiita-image-store.s3.amazonaws.com/0/167559/17fe48bc-03b7-df5b-346f-0fba0091c545.png)

## 補完機能を使いたい
### Macの初期設定では ⌘Space や ^Space でできないかも。
Eclipse には強力な補完機能がありますが、Mac の Eclipse の初期設定状態ではどうやって補完するのかわからない時があります。

補完機能のショートカットキーの割り当ては、

1. [環境設定] -> [General] -> [Keys] を開き、
2. "Content Assist" で検索
3. 下の方にある Binding で好きなショートカットキーを入力
4. 
すると行えます。
![スクリーンショット 2017-03-27 23.10.21.png](https://qiita-image-store.s3.amazonaws.com/0/167559/7523c02b-a43f-afed-fa4d-dadcc09b9976.png)

## フォーマッタ機能を使おう
Eclipse には強力なフォーマッタ機能があります。ただ、これも設定をする必要がある場合があります。

1. [環境設定] -> [Java] -> [Code Style] -> [Formatter] を開き
2. 好きなようにフォーマットできるように設定。
3. ([環境設定] -> [Java] -> [Editor] -> [Save Actions] でセーブのたびにフォーマットするように設定すると便利です。)

![スクリーンショット 2017-03-28 11.25.44.png](https://qiita-image-store.s3.amazonaws.com/0/167559/e36f11dc-11f7-d5de-fd9a-fe80fc1a5f65.png)

![スクリーンショット 2017-03-28 11.25.30.png](https://qiita-image-store.s3.amazonaws.com/0/167559/e53bbaff-550b-94a5-f285-640f993b788c.png)

今後もカスタマイズしていく中で躓いた点があれば追記するつもりです。
XAMPPの設定ファイルをGitで管理する

## 目標
バックアップや新バージョンのXAMPPへの移行、複数のPCでの共通化のために、XAMPPの設定ファイルをGitで管理します。
たとえば`php.ini`や`httpd.conf`などです。
`htdocs/`の中身やMySQLのデータは対象外です。別途バックアップしてください。

## 環境
- Windows 10
- XAMPP 7.2.2
- Git 2.16.1

## Gitで管理する
`C:\xampp`でリポジトリを作成します。
最初のコミットの前に、管理対象を絞り込むために`.gitignore`を作成します。
除外すべきファイルが多すぎるので、一旦`xammp/`内を全て除外した後で、必要なファイルの除外だけを打ち消します。
**必要なファイルへの経路にあるフォルダの除外も解除しなければならない**ので、ちょっと面倒です。

```text:.gitignore
# 一旦すべてを除外する
*

# 必要なファイルだけを管理対象とする
## このファイル自体
!.gitignore

## 復元の手順などをメモしたリードミー
!README.md

## PHP設定ファイル
!php/
!php/php.ini

## Apache設定ファイル
!apache/
!apache/conf/
!apache/conf/httpd.conf
!apache/conf/extra/
!apache/conf/extra/httpd-ssl.conf
!apache/conf/extra/httpd-vhosts.conf

## 自作のSSLサーバ証明書 (オレオレ証明書)
!apache/conf/ssl.crt/
!apache/conf/ssl.crt/my-server.crt
!apache/conf/ssl.key/
!apache/conf/ssl.key/my-server.key
```

- 参考: [Git - gitignore Documentation](https://git-scm.com/docs/gitignore#_pattern_format)

> An optional prefix "!" which negates the pattern; any matching file excluded by a previous pattern will become included again. It is not possible to re-include a file if a parent directory of that file is excluded. Git doesn’t list excluded directories for performance reasons, so any patterns on contained files have no effect, no matter where they are defined.
訳: 任意の接頭辞"!"は除外パターンを打ち消します。つまり、それまでのパターンで除外されたけれどもこの接頭辞のパターンに当てはまるファイルは、再び管理対象に含まれることになります。
**ただし、そのファイルの親ディレクトリが除外されている場合は不可能です。**
Gitはパフォーマンス上の理由で、除外されたディレクトリを記録しません。
よって、除外されたディレクトリ内のファイルに対するパターンは、どこで定義されても無効です。

## 新環境へ移行する
1. 下記のファイルとフォルダを退避。
    - `.git/`
    - `.gitignore`
1. 旧XAMPPをアンインストール。
3. 新XAMPPをインストール。
4. 退避させていたファイルとフォルダを戻す。
5. Git GUIでdiffを表示し、衝突を修正する。  
  たいていは`php.ini`だけを修正することになるはず。  
  そこで、下記のようにする。
    1. 新しい`php.ini`を退避。
    2. `git reset --hard <最後のコミット番号>`を実行。
    3. 退避させていた`php.ini`を戻す。
    4. diffで見比べてひとつずつ修正。
7. 動作確認。
8. 問題がなければコミット。
Delphi で iOS のステータスバー色を変更するには

#iOS ステータスバーの色変更

たまに iOS のステータスバーの色を変更したいと思うときがあります。
ステータスバーはここの色のことです（オフィシャルより拝借）。

![FireMonkeyStatusBariOS_Option1.png](https://qiita-image-store.s3.amazonaws.com/0/12977/7d7f2ec9-aa40-cf54-ba9f-b8995653ca8e.png)

##Delphi 10.2 Tokyo の場合
TCommonCustomForm に [SystemStatusBar](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/FMX.Forms.TCommonCustomForm.SystemStatusBar) というプロパティが増えて簡単に iOS のステータスバー色を変更できるようになりました！

詳しくはオフィシャルブログをご覧下さい。
[Delphi / C++Builder iOSステータスバー色変更方法[JAPAN]](https://community.embarcadero.com/blogs/entry/delphi-c-builder-ios-japan)

##Delphi 10.1 Berlin 以前の場合
でも Delphi のバージョンが色々な事情があって Tokyo に上げられないなんて事もあると思います。

では、どうするか？というと、実は FireMonkey には TFMXViewController.SetStatusBarBackgroundColor というステータスバー色を変更するメソッドが存在します。

ですが、これは隠蔽されているため普通には呼び出せません。
そのため、RTTI を使って無理矢理呼び出します。

以下 RTTI を使って SetStatusBarBackgroundColor を呼び出すコードです。
めんどくさい！

```delphi
procedure SetStatusBarColor(const iColor: TAlphaColor);
var
  RttiType: TRttiType;
  RttiField: TRttiField;
  RttiMethod: TRttiMethod;
  Cocoa: TObject;
  AppDelegate: TObject;
  FMXWindow: TObject;
  ViewControler: TObject;
  Intf: IInterface;
begin
  Intf := TPlatformServices.Current.GetPlatformService(IFMXApplicationService);
  if (Intf = nil) then
    Exit;

  Cocoa := (Intf as TObject);

  // TPlatformCocoaTouch
  RttiType := SharedContext.GetType(Cocoa.ClassType);
  if (RttiType = nil) then
    Exit;

  RttiField := RttiType.GetField('FAppDelegate');
  if (RttiField = nil) then
    Exit;

  AppDelegate := RttiField.GetValue(Cocoa).AsObject;
  if (AppDelegate = nil) then
    Exit;

  // TApplicationDelegate
  RttiType := SharedContext.GetType(AppDelegate.ClassType);
  if (RttiType = nil) then
    Exit;

  RttiField := RttiType.GetField('FMainWindow');
  if (RttiField = nil) then
    Exit;

  FMXWIndow := RttiField.GetValue(AppDelegate).AsObject;
  if (FMXWIndow = nil) then
    Exit;

  // TFMXWindow
  RttiType := SharedContext.GetType(FMXWIndow.ClassType);
  if (RttiType = nil) then
    Exit;

  RttiField := RttiType.GetField('RootViewController');
  if (RttiField = nil) then
    Exit;

  ViewControler := RttiField.GetValue(FMXWIndow).AsObject;
  if (ViewControler = nil) then
    Exit;

  // TFMXViewController
  RttiType := SharedContext.GetType(ViewControler.ClassType);
  if (RttiType = nil) then
    Exit;

  RttiMethod := RttiType.GetMethod('SetStatusBarBackgroundColor');
  if (RttiMethod = nil) then
    Exit;

  RttiMethod.Invoke(ViewControler, [iColor]);
end;
```

と、まあ、こんな感じで Tokyo 以外でもステータスバーの色を変更できます。

#まとめ
TFMXViewController.SetStatusBarBackgroundColor が元々あったのは、今回の TCommonCustomForm.SystemStatusBar への布石だったのかも。
【初心者備忘録】CakePHP2でログインセッション時間を変更する方法

社内で管理画面のログインセッション時間を長くしたい！という要望があったので、対応しました。
その際の事を備忘録として残します。
（間違っている点や抜け漏れあれば、コメント頂けると嬉しいです！）

##実行環境
- CentOS 6.8
- PHP5.6.30
- CakePHP2.4.10

#要望
弊社で開発しているサービスの管理画面において、
未操作時にセッションが切れる時間を、
現状の1440秒（24分）から、3600秒（60分）に変更して欲しい。

#開発手順
調査した結果、app/config/core.phpでセッション設定している事を確認。

````php:core.php(変更前)

Configure::write('Session', array(
　　'defaults' => 'php',
));
```
↓

試しに30秒後にセッション切れるように設定した見た結果・・・
30秒、1分経過してもログアウトしない！何故だ！

````php:core.php(変更後)
Configure::write('Session', array(
　　'defaults' => 'php',
　　'timeout' => '30',
));
```
そこで再調査。
core.phpの191行目にtimeoutの指定は**分数**でしてくれ！と記載してありました。秒数では無かったんですね〜。
参考記事にも記載してありました(汗)

```php:core.php
 * - `Session.timeout` - The number of minutes you want sessions to live for. This timeout is handled by CakePHP
```

↓

なので、`'timeout' => 60`に設定変更して、対応完了！

```php:core.php(~完成版~)
Configure::write('Session', array(
    'defaults' => 'php',
    'timeout' => 60, //  1hours

));
```

#参考文献

CakePHP 2.x Authコンポーネントのセッションタイムアウト設定
http://teraxlh.wp-x.jp/?p=29

CakePHP2でログイン周りのセッション時間変えてみた
http://u0u1.net/CzYm

CakePHPのセッションタイムアウトの指定はSession.timeoutだけではダメだった
https://inoccu.com/blog/2012/11/21/223145.html
古いAndroid WebviewでUglifyJSを通ったVue.js 1.0.28がSyntax Errorと判断される

以下のdependenciesでお送りします

``` json:package.json
{
  "vue": "1.0.28"
}
```

## 該当ケース

該当端末は OPTIMUS L-01D とか古いArrowsとか。
元2.3端末が4.xに更新されたものの、Webviewがまともに更新されていない系端末に見られるバグで、
通常のAndroid Browser上では問題ないので意識低めのエッジケース。
Android 2.x系もなるんじゃないだろうかと思いつつ、今の時代に考えても意味がないので今回は考えない。

## 解決法

`output.keep_quoted_props`を`true`にする。


``` js:webpack.js
plugins: [
  new webpack.optimize.UglifyJsPlugin({
    output: {
      keep_quoted_props: true
    }
  })
]
```

## 原因

https://github.com/vuejs/vue/blob/1.0/src/directives/internal/index.js#L9
ここのクォーテーションが取れて`Uncaught SyntaxError: Unexpected strict mode reserved word`となる。
予約語の`class`だと判断されてしまうようだ。
NTTひかり電話ルータ(?)VG430iへSIP接続(?)するための情報を取得する方法

# 概要

ひかり電話ルータとフレッツフォン(VP1000等)は、SIPで通信しているはずなのにID/パスワードがどこにもない。もしかして固定？
と検索しまくっていたら見つけました。

# SIP接続情報取得方法

## ステップ(1) ルータから空いている内線番号をGETする

以下のURLへGETアクセスします。

```
http://ルータのアドレス/cas_tel_list/
```

### 取得例

```
% curl -v http://192.168.1.1/cas_tel_list                                                                                        
*   Trying 192.168.1.1...
* Connected to 192.168.1.1 (192.168.1.1) port 80 (#0)
> GET /cas_tel_list HTTP/1.1
> Host: 192.168.1.1
> User-Agent: curl/7.50.1
> Accept: */*
> 
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Content-Type: text/plain
< Content-Length: 32
< Server: mcas/3.0 (VG430I 8.0.0.0; B2BUA; NTTEAST/NTTWEST)
< 
ResultCode=0000
ConfList=11

* Closing connection 0
```

## ステップ(2) クライアント情報をPOSTする

以下のURLへパラメータをPOSTします。

```
http://ルータのアドレス/cas_tel_conf/
```

### パラメータ

| パラメータ名 | 値 |
|:--|:--|
| id  | クライアントのMACアドレス  |
| ip_tel_num  | ステップ(1)で取得した内線番号のうちのひとつ |
| term_type | 1（音声専用端末？） or 2（専用端末？） |


### 取得例

```
% curl -v --data 'id=**********&ip_tel_num=10&term_type=1'  http://192.168.1.1/cas_tel_conf
*   Trying 192.168.1.1...
* Connected to 192.168.1.1 (192.168.1.1) port 80 (#0)
> POST /cas_tel_conf HTTP/1.1
> Host: 192.168.1.1
> User-Agent: curl/7.50.1
> Accept: */*
> Content-Length: 41
> Content-Type: application/x-www-form-urlencoded
> 
* upload completely sent off: 41 out of 41 bytes
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Content-Type: text/plain
< Content-Length: 206
< Server: mcas/3.0 (VG430I 8.0.0.0; B2BUA; NTTEAST/NTTWEST)
< 
ResultCode=0000
ip_tel_num=10
username=10
password=od2*****
rtpport1=
rtpport2=
dscp=46
sipsv_addr=192.168.1.1
sipsv_port=5060
regsv_addr=192.168.1.1
regsv_port=5060
sip_domain=ntt-east.ne.jp

* Closing connection 0
```


# 参考

- [NTT VG430i／830a adminのユーザー名及びpass（初期値）](https://oshiete.goo.ne.jp/qa/5263355.html)
- [NEC IX2005でミラーリング機能を使う](http://www.pc-links.com/blog/router/ix2005-port-mirror/)
- [NTT 光ルータに undocumented api があった](http://d.hatena.ne.jp/mhayashi1120/20150802/1438479717)
AWS Amazon EC2にrbenvでRuby環境を構築する

## この記事の対象者

* 複数バージョンのRubyを使いたい方
* CentOS上にrbenvを導入したい方
* Rubyのバージョンを上げたい方

## 前提条件

* AWSでアカウントを作成している
* Amazon EC2のインスタンスを起動している
* Amazon EC２へログインする際に必要なキーペアを持っている

## やりたいこと
- rbenvでインスタンスに複数バージョンのRubyを管理したい
- 全ユーザがrbenvに管理されたRubyを使えるようにしたい

## 作業内容

### EC2にログイン
EC2インスタンス上で作業するために、まずはログインします。
秘密鍵のパスとusername、IPアドレスについては各自の設定を参照してください。
ログイン後、rootユーザに切り替えます。

```bash:command
$ ssh -i [~/.ssh/keypair.pem] [usarname]@xxx.xxx.xxx.xxx
$ sudo su -
```


### 必要なパッケージのインストール


```bash:command
$ yum -y install gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel libffi-devel libxml2 libxslt libxml2-devel libxslt-devel sqlite-devel
```

### rbenvのインストール
Githubからrbenvをcloneし、その後rbenvコマンドを呼び出せるよう、環境変数を設定してPATHを通します。

```
$ git clone https://github.com/sstephenson/rbenv.git /opt/rbenv
$ vim /etc/profile.d/rbenv.sh
```

vimで `/etc/profile.d/rbenv.sh` を開いたら、以下を記述します。

```bash:/etc/profile.d/rbenv.sh
export RBENV_ROOT="/opt/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
```

### ruby-buildをインストール
次に、ruby-buildをインストールします。

```bash:command
$ git clone https://github.com/sstephenson/ruby-build.git /opt/rbenv/plugins/ruby-build
```

### ユーザの追加
次にユーザを追加します。
wheelグループに属しているユーザが`rbenv`コマンドを使用できるようにします。

#### 新しく追加する場合

```bash:command
$ adduser newuser
$ passwd newuser
```

上記コマンドを実行し、新しくつくりたいユーザの名前、そのユーザのパスワードを設定します。作成したユーザにsshでアクセスできるようにするには、サーバ上ではなくローカルで公開鍵と秘密鍵のペアを作成する必要がありますが、ここでは説明を割愛します。

#### ユーザをwheelグループに所属させる

```bash:command
$ usermod -G wheel newuser
```

wheelグループに所属するユーザを確認するには、以下のコマンドを実行します。

```bash:command
$ grep wheel /etc/group
```

### rbenvのパーミッション変更

wheelグループのユーザがrbenvコマンドを使えるように、ディレクトリの権限を変更します。

```bash:command
$ chown -R wheel:wheel /opt/rbenv
$ chmod -R 775 /opt/rbenv
```

以下のコマンドでディレクトリの状態を確認できます。

```bash:command
ll /opt/
```

パーミッションは`rwxrwxr-x`、グループとユーザは`wheel:wheel`になっていればOKです。

### Rubyのインストール
いよいよrbenvを使ってRubyをインストールします。
設定した環境変数を読み込むために以下のコマンドを実行します。

```bash:command
$ source /etc/profile.d/rbenv.sh
```

読み込みが無事に終わったら、以下のコマンドを実行します。
インストール可能なバージョンの一覧が表示されるので、使いたいバージョンのRubyをインストールしましょう！

```bash:command
$ rbenv install -l # インストール可能バージョンのリスト
$ rbenv install 2.5.1 # ruby 2.5.1をインストール
$ rbenv versions # 切り替え可能なバージョン一覧
```

### Rubyをインストールできたら実行すること

rbenvの同期

```bash:command
$ rbenv rehash
```

rbenvでインストールしたRubyをシステム全てに適用する

```bash:command
$ rbenv global 2.5.1
$ ruby -v #=> 2.5.1
```

## 補足

* 一部のディレクトリのみRubyバージョンを変えたい場合

```bash:command
$ cd path/to/app # 任意のディレクトリに移動
$ rbenv local 2.5.1 # このディレクトリ以下のrubyバージョンが2.5.1になる
```

* Gemを入れたいとき

```bash:command
$ rbenv exec gem install ... # rbenv execをつけると、現在適用中のバージョンのrubyに対して処理します。
```

## 参考
[rbenv + ruby-build はどうやって動いているのか](http://takatoshiono.hatenablog.com/entry/2015/01/09/012040)
[Amazon Linuxに、Ruby + Railsのインストールをしよう！]
(http://ticklecode.com/step9-ruby-rails-install/)
[AWS EC2 Amazon Linuxインスタンス起動後、最初にやることまとめ](http://qiita.com/yangci/items/ef2ab9b6f0d28bad0881#ec2-user%E3%81%AE%E5%89%8A%E9%99%A4)
[Linuxユーザーの追加〜SSH公開鍵登録まで](http://qiita.com/soushiy/items/fabe64ec382a007a753c)
金融工学入門(オプションとは何か)

#オプションとは何か
オプションとは、あらかじめ決められた日に、決められた価格で、決められた資産を購入ないし売却する権利をいう。権利であるから、オプションの保有者にとって不都合であるなら、この権利を放棄することも可能である。

資産を購入する権利としてのオプションを、コールオプションといい、売る権利としてのオプションを、プットオプションという。

たとえばコールオプションは、1年後に、100円で、トヨタの株を購入する権利、のように設計される。
現時点のトヨタの株価が100円ちょうどだとして、この株が1年後、120円になった場合と80円になった場合に、このコールオプションから得られる利益を考えよう。

株価が120円になった場合、このオプションの保有者は、120円の株をあらかじめ約束した価格100円で購入する権利がある。権利を行使し100円で取得した株を、すぐさま市場で売却することで、オプション保有者は20円の利益を得られる。

一方、株価が80円になった場合、オプションを行使すれば、80円の株を100円出して買うことになってしまう。このような取引は全く合理的でないから、オプション保有者は自らの権利を行使しない。したがって、その場合の利益は0円である。

このように、（コール/プット）オプションの保有者は、株価の変動のうち（アップサイド/ダウンサイド）の利益のみを得ることが出来るのである。

数式を用いて表現してみよう。
あらかじめ決められた日を$T$、決められた価格を$K$とし、時点$t$における株価を$S_t$とすれば、
$Call~Value=Max(S_T-K,0)$
$Put~Value=Max(K-S_T,0)$
と表現できる。

上記のように表現した「時点$T$における」オプションの価値が、「現在」いくらであるかを知るには、更なる議論が必要である。
高名なブラック・ショールズ式による価値の計算は[こちらの記事](http://qiita.com/Oz-Spade/items/c41155d415ca321f2c73)を、近年普及してきたモンテカルロ・シミュレーションによる計算は、[こちらの記事](http://qiita.com/Oz-Spade/items/b8efb975756364ff574d)を参照されたい。
GORMを使っているプロジェクトでDB接続をstubする

GORM (https://github.com/jinzhu/gorm)
を使っているプロジェクトのDB接続をstubするために色々調べた時のメモ。

最初、go-sqlmock (https://github.com/DATA-DOG/go-sqlmock)
を見つけて、これ使えば簡単にいけそうだなーと思って調べてみたらGORM側のsql.DBを保持しているフィールドが隠蔽されていてどうしたものかと悩んだ。

しばらくソースを読んでいると、Open()を呼ぶ際に引数として渡すドライバ名とデータソース名でsql.Open()を呼んでいて、その結果をそのままDB structのフィールドに保持しているということが分かった。
https://github.com/jinzhu/gorm/blob/8b058a707f156b411e280bc55c5aa20544e64873/main.go#L61


sql-mockのソースコードも読んでみると、sqlmockという名前でドライバが登録されており、NewWithDSNという関数を使えばデータソース名を引数にDB接続を取得できることが分かった。
https://github.com/DATA-DOG/go-sqlmock/blob/master/driver.go#L16
https://github.com/DATA-DOG/go-sqlmock/blob/master/driver.go#L67

参考：database/sqlインターフェース　https://astaxie.gitbooks.io/build-web-application-with-golang/ja/05.1.html


というわけで

```go

	var db *gorm.DB
	_, mock, err := sqlmock.NewWithDSN("sqlmock_db_0")
	if err != nil {
		panic("Got an unexpected error.")
	}
	db, err = gorm.Open("sqlmock", "sqlmock_db_0")
	if err != nil {
		panic("Got an unexpected error.")
	}
	defer db.Close()

	rs := sqlmock.NewRows([]string{"count"}).FromCSVString("1")
	mock.ExpectQuery(`SELECT count.* FROM "whitelist"  WHERE.*$`).
		WithArgs(12345).
		WillReturnRows(rs)
		....
		....
```

こんな感じでDB接続をstubできるようになりました。
コマンドプロンプト　フォルダ内のファイルをテキストファイルにかき出す方法

スタートメニューの検索で「cmd.exe」と入力

以下のように入力しEnterキーを押します。（※フォルダ名はフルパスで入力するか、フォルダをコマンド画面にドラッグ ）

Dir /b フォルダ名 > 出力ファイル名  　★/bを付ける と要約や日時、サイズなどを省略し直下のファイル・フォルダの名前のみ出力されます。

Dir /b /a-d フォルダ名 > 出力ファイル名  ★/a-dを付けるとサブフォルダ名は出力しません。（直下のファイル名のみ出力）

Dir /b /s フォルダ名 > 出力ファイル名 ★/sを付けるとフォルダ 、サブフォルダ内の全ファイル名をフルパスで出力します。

Dir /b /s /a-d フォルダ名 >出力ファイル名 ★全フォルダ内のファイル名をフルパスで出力します。

Dir /ad フォルダ名 >出力ファイル名  ★/ad はフォルダ名のみ出力します。
　
例：デスクトップの「Works」フォルダのファイル名一覧をC:\File.txtというテキストファイルに保存する場合は以下のように入力します。

 Dir /b C:\Users\Name\Desktop\Works   >C:\File.txt
数分で構築できた！ansibleでCent7 Pacemaker/Corosync 

# 使用したもの

Ansible playbooks for Linux-HA Japan Pacemaker repository package.
https://github.com/kskmori/ansible-pacemaker/

### 前提
* Cent7をインストールしたマシンを2台(ha1,ha2)用意
* ansibleサーバーは別途用意せずha1で実行

### /etc/hosts編集
pacemakerに設定するのと同じhosts名を付けておきます。

### gitとansibleをインストールし、playbookをclone
<pre>
yum install epel-release
yum install ansible --enablerepo=epel
yum install git
git clone https://github.com/kskmori/ansible-pacemaker.git
</pre>

### cloneしてきたansible-pacemakerディレクトリに移動して編集
* ユニキャストの場合はhosts.sample.udpuをベースに
* hosts.sampleだとマルチキャストの設定

### known_hosts登録
ansibleがこけないように、1回SSHで繋いでおきます。
<pre>
ssh ha2
</pre>

### playbookの実行
(1)から順番に実行していきます。
SSH鍵認証設定していないので、最後に-kオプションを付けてパスワード認証します。
<pre>
ansible-playbook 00-download.yml -k
</pre>

### ha1,ha2生成された設定ファイルを確認
<pre>
/etc/corosync/corosync.conf
/etc/sysconfig/pacemaker
</pre>

### corosync.confなどを再設定したい場合
ansible-playbook -i hosts 10-pacemaker-install.yml
を再実行するとまたインストールから始まってしまうので、
roles/pacemaker-install/tasks/pacemaker-install.yml
でconfファイルの生成部分だけ抜粋した方がよいかも・・

## 感想
ansibleでconfファイルを生成すると設定間違いがなくていいですね。
linux-haのサイトはきちんと熟読しなくては・・

# Pacemaker-1.1.15-1.1 リポジトリパッケージ
http://linux-ha.osdn.jp/wp/archives/4591
NetworkXでネットワーク分析---コミュニティ検出の巻

ネットワーク全体から「お互いが全て繋がり会ってる小グループ」つまりコミュニティのようなものを抽出したくなったので、pythonのライブラリ「NetworkX」でやりました。

https://networkx.org/

#ここでいうコミュニティとは

人間でいうところの「お互いに友達同士の人の集まり」の事であり、ネットワーク全体の補集合で完全グラフ（全て繋がってる）であるような集合の事です。
グラフ理論では「Clique」というらしいです。


#グラフ構造を作る

6ノードから成る小さい集合で実験します。


```

from networkx import *
import matplotlib.pyplot as plt

#元データ
data = [["A","B"],["A","C"],["C","B"],["D","C"],["D","E"],["C","E"],["E","F"]]

#ノードの構築
G = nx.Graph()
for p in list(set([r[0] for r in data] + [r[1] for r in data])):
    G.add_node(p)

#エッジの構築
for d in data:
    G.add_edge(d[0],d[1])

#描画
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G, pos, node_size=1200,node_color="white")
nx.draw_networkx_edges(G, pos)
nx.draw_networkx_labels(G, pos)
plt.show()

```

可視化されたグラフ構造

![スクリーンショット 2017-03-28 16.19.25.png](https://qiita-image-store.s3.amazonaws.com/0/72976/d06bcc7a-f686-b9a3-2323-7466dcb2143e.png)


#構築済みのグラフ構造からcliqueを抽出

さて、グラフ構造ができたのでコミュニティを検出してみましょう。

```

cliques = nx.find_cliques(G)
#標準出力
print  [ c for c in cliques]

```


標準出力

```
[['C', 'A', 'B'], ['C', 'E', 'D'], ['F', 'E']]
```

出ました！
ちゃんとコミュニティが抽出できてますね！

小さいデータだとフーンという感じですが、大きなデータでやると色々発見があります。

#パフォーマンス

10万件程度のデータだと数秒で処理できるのでとても早いです。
しかし、clique検出はノード数増加に伴い処理時間が爆発する系の処理（多分NPなんとか問題です）っぽいので、もっとデカイデータだとNetWorkXだと頭打ちになる可能性がありますが、まだ謎です。

https://en.wikipedia.org/wiki/Clique_problem

多分、本気の人はSparkとか使うんだと思います。
手元の全 Ruby バージョンから特定の gem を一掃する

(2017/03/29 10:50 追記)

rbenv でインストールしたバージョン全てに対してコマンドを実行する [rbenv-each](https://github.com/rbenv/rbenv-each) というプラグインがあったので、以下のコマンドでやりたいことが実現できました。

```bash
$ rbenv each gem uninstall -x gemname
```

rbenv-each は @sakuro さんにコメントでご教示いただきました。ありがとうございました。

---

```bash 
$ export GEM_NAME=gemname
$ for v in `rbenv whence $GEM_NAME`; do rbenv shell $v; gem uninstall -x $GEM_NAME; rbenv shell --unset; done
```

昔 Ruby で作ったコマンドラインツールを Go で書き換えた、けど rbenv のパスが `PATH` の先頭寄りに書かれていて優先されてしまう（下の例）…というときに便利です。nodenv や plenv でも、適切なコマンドに入れ替えれば応用できそう。

```
$ gemname
rbenv: gemname: command not found

The `gemname' command exists in these Ruby versions:
  2.3.0
  2.3.1
  2.3.2
  2.3.3
```

他との兼ね合いで `PATH` いじりたくないこともあるので…
`Failed to load Info.plist from bundle at path {your_path}` でビルド出来ないときの対応

TIPS。
題名のメッセージに {your_path}にAlamofireのが入ってる場合が多い。

# 結論
Xcode再起動して、SIMULATORも再起動すると治る。

# 他
* Cacheクリアして再実行：NG
* 再現性に規則性がない.
Windows環境でのanaconda（python3）でTensorFlowをインストール


windowsPCで機械学習まわりをやれる環境を準備するためTensorFlowを導入する
（割と最近windowsにも対応した)

TensorFlow(テンソルフロー)は、Googleが提供しているオープンソースの機械学習/ディープラーニング/多層ニューラルネットワークライブラリ

普段実装で使っている環境と分けたいので、まずはテスト用の仮想環境を作成。pythonのverは今回は3.5で行う
```
conda create --name=tensorenv python=3.5
```
エラーが出なければ下記のように処理が進む
途中の Proceed ([y]/n)?  はyでok
![image](https://qiita-image-store.s3.amazonaws.com/0/41877/9e36e252-b94a-a6d3-ecf1-5ef4f48d209e.png)

実行完了したら、一応環境一覧をチェック
```
conda info -e
```

問題なければ、環境をアクティベート
※戻る場合は「deactivate」
```
activate tensorenv
```

tensorflowのインストール
（windows64bit,anaconda,python3,2017/03時点の話なので、これでうまくいかないときもあるかも）
```
pip install -U --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.0.0-cp35-cp35m-win_amd64.whl
```

完了。
anaconda自体がすでに入っていれば、準備自体は結構かんたん
macOS SierraでDockerを再インストールしたときに発生した問題

辛かった話。

# 発生した問題

* DockerToolboxがインストールできない
* DockerHubにコマンドからログインできない

# （きっかけ）docker loginできなかった

Docker ID のパスワードを変更したことをきっかけに、
「お、Dockerログインし直さなければ……」と動き出したところ、ハマりました。

以下のようなエラーで苦しみました。

```zsh
$ docker logout
$ docker login -u sutchan
password: xxxxxxxx
Error response from daemon: Get https://registry-1.docker.io/v2/16: net/http: request canceled while waiting for connectio
n (Client.Timeout exceeded while awaiting headers)
```

なお、dockerのバージョンは、
**17.03.0-ce**

ブラウザからとかcurlでアクセスできるから、hostに問題はない。
docker daemonも動いている。

全くログインできない。
とにかくいろいろやってみるけど、全く解決しない。

ホストとかdockerのディレクトリに変更を加えたり色々したけど解決しなかった。
`~/Library/Containers/com.docker.docker/Data/database/com.docker.driver.amd64-linux/slirp/dns` を全部コメントアウトしたりしたけど…。

## （解決）Docker CE for Mac (Edge) でログインできた

そもそも今のStable版でログインに不具合があるっぽい？
結局、Stable版ではなく、Edge版をインストールしたらログインできた。

```zsh
$ docker -v                                                                                                                                                                                                                                                           
Docker version 17.03.1-ce-rc1, build 3476dbf
```

**17.03.1-ce-rc1**
おそらく、次のアップデートでログイン問題は直るんでしょうね。。

-  https://store.docker.com/editions/community/docker-ce-desktop-mac?tab=description

# （次の問題）Docker Toolbox がインストールできない

- [Docker Toolbox](https://www.docker.com/products/docker-toolbox)

ここからDocker ToolboxがDLできますが、macOS Sierraでは、インストールできません。
（普通にpkgからウィザードが実行されますが、インストールが開始されません）

## （解決）HomeBrewでインストール

詳しくは↓
- [macOS Sierra Docker Toolbox のインストーラがエラるので Brew cask でインストールした](http://qiita.com/ytyng/items/56ecd4ebc57c313974f2)
- [macOSのSierraではDocker Toolboxのインストールが出来ない](http://qiita.com/Ryosuke-Hujisawa/items/67f9dff2fadd729165dc)

```zsh
$ brew update
$ brew cask install docker-toolbox
```

なお、docker自体もbrewで入れられるので、そのほうがシンプルかも？

- [macOS Sierra に Homebrew Cask で Docker for Mac をインストールする](http://stangler.hatenablog.com/entry/2016/11/17/141705)

以上、SierraでDockerをインストールするときの気をつける話でした。
Xcode8の実機確認でApp installation failed  This application’s application-identifier entitlement does not match that of the installed application. These values must match for an upgrade to be allowed.

うう、、よければ [こっち](http://off.tokyo/blog/2017/03/28/app-installation-failed-this-applications-application-identifier-entitlement-does-not-match-that-of-the-installed-application-these-values-must-match-for-an-upgrade-to-be-allowed/) で見ていただけると吐きます

# 解決策

ビルドチームを変えたりすると起こるみたいです、一度アプリを消してやり直せば治りました

# 状況

Xcode8
iPhone7

# エラー内容

```err
App installation failed

This application’s application-identifier entitlement does not match that of the installed application.
These values must match for an upgrade to be allowed.

```
tail -F して指定した文字がでてきたら終了するシェル芸

メモ。kill するしかないよなぁ

```bash
FILENAME="test.txt"
KEYWORD="test"

tail -F -n0 "$FILENAME" \
| grep --line-buffered "$KEYWORD" \
| while read l; do pkill -f "tail -F -n0 $FILENAME"; done
```

追記: コメントで頂きました。sed の q なるほど。

```bash
sed "/$KEYWORD/q" <(tail -F -n0 "$FILENAME")
```
LP用の素敵な素敵なroutesを作る(いずれのPathでも、同じshowアクションで処理する)

# やりたいこと
LP(ランディングページ)のような、LPディレクトリ内にいろんなファイル名でファイルを設置するんだけど、すべて処理は特になくてただHTMLをレンダリングしてあげたい。

/lp/hogehoge1.html
/lp/hogehoge2.html
/lp/hogehoge3.html
というアクセスをいずれも同じshowアクションでこなしたいなと。

## 何が困ったのか
LPを増やすば増やすほど、

```lp_controller.rb
def hogehoge1; end
def hogehoge2; end
def hogehoge3; end
```

```routes.rb
get 'hogehoge1', to: 'lp#hogehoge1'
get 'hogehoge2', to: 'lp#hogehoge2'
get 'hogehoge3', to: 'lp#hogehoge3'
```
とか書かないといけない。このように愚直に書けば実現できるけど、生産性低すぎ＆面倒＆忘れるわ、こんなん。
一発でできんかね？

## 方法

```lp_controller.rb
def show
  render params[:page]
end
```

```routes.rb
get 'lp/:page', to: 'lp#show'
```
### 解説
:page という部分が重要で、これがhogehoge1だろうがhogehoge2だろうがの部分になります。
controllerでは、渡ってきたhogehoge1やhogehoge2を解釈してrenderしてくれるので、適したhogehogeを返してくれます。

これでviewがhogehoge100とかになってもcontrollerやroutesをいじる必要なし！

## メリット
* hogehoge100とか大量になっても手間が増えない
* viewさえ増やせばいい という単純明快な作りになる

## 余談
アクションが変わる場合はこれ使えません。
paramsを受け取る形になるので、何かしらparamsを要因とする処理は走らせることができるのでただのHTMLよりは処理に幅が出せます。
なぜWebアプリケーション開発が今まで人気が高かったのですか？

今日の世界では、モバイルとWebアプリケーションの開発は、顧客やクライアントにコンテンツを伝達して配信するための効率的で堅牢なメディアを提供します。あなたのビジネスは優れたオンラインプレゼンスの恩恵を受けるだけでなく、PR、マーケティング、顧客関係管理の戦略を成功させるためにも非常に重要です。
今日、あらゆる種類の企業が開発とサポートを行うためには、オンラインでのプレゼンスが重要です。インターネット上で商品やサービスを購入することはますます人気が高まっています。

しかし、ウェブサイトだけでは成功への保証ではありません。タブレットやスマートフォンのようなポータブルデバイスの人気が高まっている現在、多くの人々はウェブサイトを経由したり、購入ニーズを把握したり、情報を入手したりするよりも、ウェブアプリケーションを使いやすくしています。
Webアプリケーションは、企業のバックボーンのように機能し、オンラインビジネスの計画、実行、管理のあらゆる段階をサポートするために非常に重要です。
有益なWebサービスは、
セキュリティ
認証
ユーザー管理
コンテンツ管理
アナリティクス
言い換えれば、Webアプリケーションは、実際の市場のように機能している仮想ビジネス市場の成長を後押ししています。 Web上で開発されたアプリケーションは、業務を円滑にし、より良いコンセプトを開始してすべての人の生産性と成功を得るためのビジネス戦略とポリシーを強化しています。
Webアプリケーションは、アプリをゲートウェイとして使用して必要なものを手に入れて検索するのではなく、Webアプリケーションを使用すると、オンラインでの人生、仕事、商取引を簡素化し、加速することができます。これらのアプリのおかげで、製品の売り手やサービスプロバイダに接続することは、顧客にとって本当に便利になります。
Webアプリケーション開発は、より短時間でより多くの人々にアプローチしたいときに不可欠になってきました。インターネットへのアクセスとその使用法は過去10年間で深く変化しました。そのような特殊なプログラムの重要性は、多数の人々がデスクトップやラップトップから適応可能なガジェットに移行したために拡大しました。
概要
今日のWebアプリケーションは、ビジネスの重要なモジュールとなっています。企業や組織がその要求を満たすために不可欠な役割を果たすことができます。
Webアプリケーションのメリット
安全なログインを提供する
ライブデータを保護する
どこからでもアクセス可能
オンラインで製品情報を提供する
クイックインストール
簡単なメンテナンス
- 稼働率24 * 7
Webアプリケーションは、アップグレード、メンテナンス、開発コストの削減が容易であり、プラットフォーム依存のデバイスがありません。あなたはいつでもどこからでもあなたが望むどんなデバイスででもそれを利用することができます。
Webベースのアプリケーションは長い道のりを歩んでおり、従来のソフトウェアベースのシステムに競争上の優位性をもたらしています。企業はシステムやプロセスを統合し、とりわけ経費を削減することができます。
技術が頻繁に進歩するにつれて、Webアプリケーションはますます良くなり、ビジネスオーナーはより多くの利益とそのユーザーに、さらに容易になります。エキスパートのWebアプリケーション開発者は、最近の市場動向とビジネスを成長させるための有用な機能について常に目を通しています。彼らはあなたのビジネスニーズに正確なアプリケーションを構築することができます。
多くのための Webアプリケーション
http://www.rginfotechnology.com/Services/website_application.html
Swift3 - UITextFieldのキーボードを自動的に出す方法

ああ、ええとよければ[こっち](http://off.tokyo/blog/2017/03/28/automatically-make-keyboard-show/) で見ていただければ嬉しいです

# 実装 

例えば、フォントピッカーを作ってフォントが選ばれるたびに自動的に下からビューンッてキーボードが出るようにしたいとか思った時は、下記のように書けば好きなタイミングで自動的にキーボードが出せます。

```swift

//自動的にテキストフィールドを出す
textField.becomeFirstResponder()


```

#　参考

[[Swift] Automatically make keyboard show](https://forums.macrumors.com/threads/swift-automatically-make-keyboard-show.1848768/)
CSSアニメーション初心者備忘録

CSSで様々なアニメーションができると知ってはいたけれども、触ってみたら割とわからないことだらけだったので、備忘録。
### やりたいこと
div要素をアニメーションさせて、ボタンで何らかの操作をする

[デモ](https://jsbin.com/nefaxe/edit?html,css,js,output)
###やったこと
- div要素をCSS animation で回転させる
- div要素を複製する
- 回転させる速度を変更する -1
- 回転させる速度を変更する -2

####div要素をCSS animation で回転させる
div要素を作ります。

```html
<div class="squareBox"></div>
```

CSSを書きます

```css
.squareBox{
      position: absolute;
      width: 100px;
      height: 100px;
      background-color: aqua;
      margin-top: 50px;
      margin-left: 50px;
}
```

上記CSSに以下の一文を書き込みます。
animation要素というものがあることに気が付かされます。
今回は30秒で○○するみたいなことを書きたかったの以下になりました。

```css
animation: rotate 30s linear infinite;
```

@keyframesで、rotateを定義します。
360度回転するということを書くだけです。

```css
@keyframes rotate{
      100%{ transform: rotate(360deg);}
}
```

回転しました。

####div要素を複製する
htmlにボタン要素を追加します。

```html
<button id="addSquare" class="asBtn">click</button>
```

位置調整にCSS追記します。

```css
.asBtn{
      margin-top: 50px;
}
```

jQuery使いました。
これで、clickボタンを押すと、\<div\>要素が追加されます。

```js
$(function(){
      $("#addSquare").click(function(){
          $("body").append('<div class="squareBox"></div>');
      });
});
```

####回転させる速度を変更する -1
取り合えず、CSSの書き換え方がわからなかったので、ボタンを押すとCSSが書き換わるコードを探しました。

htmlにボタンを追加しました。

```html
<button id="speedChange" class="scBtn">speed</button>
```

jsに追記。
これで、\<div\>要素が1回転するスピードが30秒から15秒になります。

```js
$("#speedChange").click(function(){
      $(".squareBox").css('animation','rotate 15s linear infinite');
});
```

####回転させる速度を変更する -2
回転する速度を可変にしたいと思いスライダをつけました。
htmlにスライダを追加。

```html
<input type="range" name="speedNum" id="speedNum" max="30" min="1" step="1">
```

js側で、スライダの値を取って、ボタンを押すとその値で回るように設定。

```js
$("#speedChange").click(function(){
      var spnum = $("#speedNum").val();
      $(".squareBox").css('animation','rotate ' + spnum + 's linear infinite');
});
```

終わりです。良かったですね。

inputのon要素などでイベント発出しても良かったのですが、今回はclickイベントだけ使いました。
Homebrewってなあに？

macで開発していると時々でてくる`homebrew`ですが、よくわからなかったので調べてみました。

# Homebrewとは
本当にざっくりと言うと
**ソフトのインストールをコマンド（ターミナルとか）でやるためのソフト**
でしょうか。

以下の記事がとても参考になりました。
[homebrewとは何者か。仕組みについて調べてみた](http://qiita.com/omega999/items/6f65217b81ad3fffe7e6)
[「パッケージ管理システムとは」by Windowsユーザー](http://qiita.com/chihiro/items/e522f9be6115a7fc197d)
[]()
rubyでランダム英数字を生成(l1,o0,9q等似た文字を除外)

# lと1、oと0など似た文字を除外してランダム文字を生成させるコード
```
length=8
except="19q0iol" #似た文字は使用しない
loop do
  v = rand(36**(length * 3)).to_s(36).delete(except)[0,length]
   if v.size == length
    p v
    break
   end
end
````
シェルを使うだけのためのDockerコンテナ

[Dockerで簡単なCICDツールチェーンを構築](http://qiita.com/takahigashi/items/b914430ced520ecbeb11)した時に、デモの操作もコンテナ上で操作したいと考えていた。
たどり着いた方法は単純で、「sleepで一定時間眠って寿命が来たら停止する」イメージを用意した。

以下はDockerfileの例。ubuntuにしてみた。

```
FROM ubuntu

ADD <デモプロジェクトファイルとか>
ADD <環境設定ファイルとか>
RUN apt-get install -y <エディタとかgitとか必要なコマンド>
RUN <その他必要な処理がもしあれば>

ENTRYPOINT sleep 36000
```
起動後10時間で予告なく終了する、残業を控えさせる思いやりと常にタイムマネジメントを意識させるスパルタ教育を兼ね備えた作業環境が実現できた。

上記Dockerファイルで作成したイメージをデモ環境コンテナネットワークに接続して実行し、docker exec bashなどでログインして使うだけ。

教訓: デモは1日10時間まで
Atomでslimだけ「emmet」のフィルターが効かない（タブキーを押しても展開されない）

テキストエディターに「Atom」を使用。

パッケージに「emmet」を使用しています。


# HTMLのみ展開できる
HTMLのみフィルターで下記のように展開ができます。

```
!
```
タブキーを押す
↓↓↓↓

```
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  
</body>
</html>
```
このように展開される。


# slimだけできない。

sublimeだとできて、なぜかAtomではできない。。

~~どなたか優しい方、設定方法などご助言いただけないでしょうか。~~

# 解決

keymap.cson というファイルに、
下記のような記述を追加すれば、展開してくれるようになりました。

```
'atom-text-editor[data-grammar="text html basic"]:not([mini]), atom-text-editor[data-grammar~="erb"]:not([mini]), atom-text-editor[data-grammar~="slim"]:not([mini])':
    'tab': 'emmet:expand-abbreviation-with-tab'
```

上記だと、html、slim、erbの3種類に適応させていますが、
シンプルにslimだけだと、下記のような記述でいいです。

```
'atom-text-editor[data-grammar~="slim"]:not([mini])':
    'tab': 'emmet:expand-abbreviation-with-tab'
```

keymap.csonというファイルは、
Keybindingsを開いた状態で、「your keymap file」というリンクをクリックするとファイルが開きます。

![スクリーンショット 2017-03-28 18.01.22.png](https://qiita-image-store.s3.amazonaws.com/0/115664/178abbff-5918-f4b2-d1fd-b9881a9a0cdf.png)
AWSのEC2にJenkinsをインストール(3/3)

■リポジトリの追加
yumでダウンロードするためには、Jenkinsにどんなバージョンがあるのかなどの情報があるリポジトリをyumが参照できるようにする必要がある
デフォルトのyumのリポジトリはJenkinsのダウンロードができないので追加する。

■今参照しているリポジトリを見て、Jenkinsのリポジトリがないこと確認を確認する

``` 
yum repolist all
```

■jenkinsのインストールできるパッケージを確認

``` 
yum list \*jenkins\*
``` 

■ リポジトリの追加

``` 
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
``` 

■ リポジトリが追加されたか見てみる

``` 
cat /etc/yum.repos.d/jenkins.repo
``` 

■jenkinsの公開鍵のインポート

``` 
sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
``` 

■Jenkinsのインストール

``` 
sudo yum install jenkins
``` 

■ポートの変更
(ジェンキンスのデフォルトのポートは8080で、毎回、リクエストを投げるときに、8080を指定するのは面倒。なので、HTTPの80ポートでJenkinsが起動するようにしたい。)

A：Jenkinsのポートをデフォルトの8080からHTTPで使用するポート80へ変更する
B：Jenkinsのポートはそのままで、apacheを導入する。HTTPの80でリクエストがきたら、8080にリダイレクトして、jenkinsにリクエストを出す。

方法Bのほうが、EC2、Apache、Jenkinsの役割を切り分けられそうなので、Bにしました。

■apacheの導入
http://qiita.com/gitya107/items/25887864f07fa4cc7ce1
を参考にさせていただきました。


■導入が終わったら、再起動する。

``` 
sudo service httpd start
sudo service jenkins start
``` 

■ブラウザを開いて、EC2インスタンスのPublic DNS (IPv4)/jenkinsにアクセスする
grepってなあに？

コマンドでよく見る`grep`ですが、実はよく知らなかったので調べてみました。

# grep とは
>
grepとは、テキストファイルから文字列を検索するプログラムの名称である。もともとは、UNIXのコマンドの一つであったが、MS-DOSやWindowsにも移植され用いられている。

引用：[Weblio 辞書]()

検索のコマンドなんですね。
ちなみに`grep`は`Global Regular Expression Print`の頭文字だそうです。

# 使い方

ここのサイトがわかりやすく感じました。
[grepコマンドで覚えておきたい使い方14個(+3個) - 俺的備忘録 〜なんかいろいろ〜](https://orebibou.com/2014/12/grep%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E4%BD%BF%E3%81%84%E6%96%B914%E5%80%8B/)
《Wordpress》Contact Form 7でサンクスページへ移動する

入力フォームプラグイン「Contact Form 7」で、フォーム送信後サンクスページに移動したいときのコードです。

これも日本の古き良きの慣習ですが、この実装は要件によく含まれますね。

## フォームの編集

WordPressの管理画面のコンタクトフォームの編集画面から
以下のコードを入力します。

```html

<script>
  document.addEventListener( 'wpcf7mailsent', function( event ) {
    location = 'http://domail/your-thanks';
  }, false );
</script>

```

`wpcf7mailsent`というイベントでリダイレクトを発火させます。

```js

location = 'http://domail/your-thanks'

```

この部分を任意の移動したいURLに変更してください。


## でも

実際は、コンバージョンはイベントトラッキングで把握できるので、サンクスページいらない説もかなりを占めますね。
しかし、要望がなくならないのも現状ということ、、、
Photoshop・Illustratorの新規ドキュメント作成を一瞬で爆速にする方法

Adobe Photoshop CC、 Adobe Illustrator CC(共にCC 2017)で新規ドキュメントを作成すると、最近使用したファイルやテンプレート・プリセットが表示されるため、表示はあまり早くありません。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/92ec0dc2-2e54-b777-4374-b638e4f8ffab.gif)

渋谷Stocker.jp / Spaceで開催された「[スマートフォン時代のWebデザインスクール](http://stocker.jp/diary/web-design-school/)」の体験レッスンに参加した際、この**新規ドキュメント作成を高速化する設定を教えていただき、ストレスフリーなドキュメント作成ができるようになりました**。主催者様より許可をいただきましたので、シェアします。

# 従来のドキュメント作成インターフェースで起動を高速に
[CC 2017の新しいドキュメント作成機能](https://helpx.adobe.com/jp/photoshop/using/create-documents.html)では、豊富なテンプレートやプリセットを選択してドキュメントを選択できるようになりました。しかし、案件によってはテンプレートやプリセットが不要な場合も多いことでしょう。この新機能を使わず、従来のドキュメント作成機能を使用することで、新規ドキュメント作成を高速にすることが可能です。

## Photoshopの設定

Photoshopでは、[Photoshop CC]→[環境設定]→[一般]より、[従来の新規ドキュメントインターフェイスを使用]にチェックを入れ、[OK]ボタンをクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/b437ed99-2e3e-b023-c5c8-c57e939613c6.png)

新規ドキュメントを作成すると、テンプレート使用時よりも高速にドキュメントを作成できることがわかります。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/46f76b36-3dd9-f34e-b036-feeb445eeea6.gif)


## Illustratorの設定
Photoshopでは、[Illustrator CC]→[環境設定]→[一般]より、[以前の新規ドキュメントインターフェイスを使用]にチェックを入れ、[OK]ボタンをクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/a4149e2f-a831-6979-2e07-d4bf3838601f.png)

Photoshopと同様、ドキュメント作成が高速になっていることがわかります。

![illustrator_fast4.gif](https://qiita-image-store.s3.amazonaws.com/0/67884/c27e62a5-cad6-fe2c-37e4-08f2163a75f4.gif)

# 遅いと感じたら設定の見直しを
CC 2017の新しいドキュメント作成機能は便利であるものの、テンプレートなしで作成するケースが個人的には多いです。その為、**基本的には今回の設定にし、テンプレートを多用する案件になった場合のみ、新機能を使える設定に戻すという方法にしています**。もしドキュメント作成が遅いと感じたときには、本設定を見直してみてください。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/b2a11ab2-9be9-7e67-e35d-ab6252706606.gif)
[PHP編]stdClassとは？--------Predefined Classes

*きっかけ*
```$args = new stdClass();```　👈　「コレは何？？？？...」
初めて見たchaiちゃんの頭に❔はいっぱい！
答えは「速く調べてくれ！」、＝.＝
じゃ...いつもの「とは」から...

#さっそく「stdClass」
####自己紹介
わたくしは「stdClass」と申します。宜しくお願いします。
自己紹介をさせていただきます。
えっど,,,私はクラスです。
更にPHPでは全てのクラスの基本という存在です。（＝.＝知らなきゃ）
アイ(I)ラブ(love)オブジェクトのデータ、ランド(and)配列のデータは嫌だ。
一先ずオブジェクトの形を保存したいとき、絶対可愛い私を思い出してね！

####取扱説明
こういう風に使っていいよ！

```ruby:sample 
 $args = new stdClass();
 $args->dog  = '';
 $args->cat  = '';
 $args->fish = '';
```

####さようなら！
じゃなくて、「また会いましょう！」

*参考*：
・[PHP標準クラスのstdClassについて](http://phpspot.net/php/pgPHP%E6%A8%99%E6%BA%96%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AEstdClass%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6.html)
・[Standard Defined Classes](http://php.net/manual/en/reserved.classes.php)

---I Love PHP (｡･ω･｡)ﾉ♡
Androidアプリのデータ削除をadbコマンドでやる

# nexus端末以外はデータ削除がめんどくさい（ときがある）

nexus系端末はアプリ長押しドラッグで「アプリ情報」までやればデータ削除が簡単ですが、
独自UI？ホームランチャー？が入っている端末（xperiaとかgalaxyとか）はどうやったらいいかわからないときあります。
長押ししたりしても出てこないし、じゃ設定アプリから行こうと思ってもまず設定アプリがどこにあるかわからない。
そんな状況ないでしょうか。

そこでadbコマンドでアプリのデータ削除をする方法を紹介します。

# adbコマンドでデータ削除


```
adb shell pm clear パッケージネーム
```

です。

パッケージネームは

```
adb shell pm list packages
```

で調べられます！

<br>
<br>

***


この記事はDroidkaigi 2017でoperandoOSさんが発表したhttps://speakerdeck.com/operando/komantonasitehokuhaandroidkai-fa-tekinaihua-1 を元に書きました。
レジストリについて

##レジストリ
.com、.net等のトップレベルドメイン情報の、データベースを管理している団体。

##レジストラ
レジストリに認定されて、レジストリデータベースに直接ドメイン情報を登録できる、民間機関。
お名前.comなど。

##代理店
レジストラに頼んで、ドメイン情報を登録する代理店。

参考
http://www.onamae.com/clever/about/regist.html
AWSのEC2にJenkinsをインストール(2/3)

Jenkinsを動かすためには、Javaが必要なのでインストールします。
のまえに、EC2インスタンスのソフトウェアの更新がないかチェックします。

■インスタンスソフトウェアの更新
　sudo yum update

次に、Javaのインストールをしていきます。

■ ダウンロードできるJavaのjdkを確認
　yum list \*java-1\* | grep open

■今入っているJavaのバージョンの確認
　java -version

■最新のものをインストール
　sudo yum install java-1.8.0-openjdk.x86_64

■インストールしただけだと、versionが変わらないので、変更する
　sudo alternatives --config java
　入っているjdkのバージョンを選択

■ちゃんと選択されているか確認
　java -version
AWSのEC2にJenkinsをインストール(1/3)

■流れ

- EC2インスタンスの作成
- EC2インスタンスにJavaをインストール
- EC2インスタンスにJenkinsをインストール & 疎通確認

■EC2インスタンス作成

----

■AMIの選択

- Amazon Linux AMI 2016.09.1 (HVM), SSD Volume Typeを選択

■インスタンスタイプの選択

- t2.mediumを選択
- 次の手順：インスタンスの詳細の設定

■インスタンスの設定

- インスタンス数
- 購入のオプション
- ネットワーク
- サブネット
- 自動割り当てパブリック IP  
- IAM ロール 
- シャットダウン動作  
- 削除保護の有効化
- モニタリング
- テナンシー  
の設定を行う

■ストレージの追加

- サイズ：10GB
- ボリュームタイプ：汎用SSD(GP2)を選択

■add tags

- キー：name
- 値：表示される名前

■セキュリティグループの設定

- SSH TCP 22 IP/サブネット
- HTTP TCP 80 IP/サブネット
- HTTPS TCP 80 IP/サブネット 
- カスタムTCPルール 8080 IP/サブネット(疎通確認用)

■確認

- 作成
はじめてのgo test

## ReadMeFirst
こんにちは @marnie_ms4 です。
筆不精で、今まではブログを書いては放置したりばかりだったのですが、
業務でgoを使っているので、golangについて記事を書き溜めていこうと思います。
（主に自分の備忘的なところもありますが)

さて、golangでは自動テストを標準でサポートしています。
なにはなくとも言語を使う上でテストコードは必須ですよね。
ということで、この記事ではテストの実行や作り方について記載します。

## テストの作り方

testファイルは `****_test.go` という命名で作成します。

* `example.go`

```go:example.go
package main

import (
    "errors"
)

func example(code string) (int,error) {
  if code == "hoge" {
       return 1,nil
  }
  return 0,errors.New("code must be hoge")
}
```

* `example_test.go`

testing packageの以下に従って作成します。

```
To write a new test suite, create a file whose name ends _test.go that contains the TestXxx functions as described here. 
```

```go:example_test.go
package main

import (
	"testing" // テストで使える関数・構造体が用意されているパッケージをimport
)

func TestExampleSuccess(t *testing.T) {
	result, err := example("hoge")
	if err != nil {
		t.Fatalf("failed test %#v", err)
	}
	if result != 1 {
		t.Fatal("failed test")
	}
}

func TestExampleFailed(t *testing.T) {
	result, err := example("fuga")
	if err == nil {
		t.Fatal("failed test")
	}
	if result != 0 {
		t.Fatal("failed test")
	}
}

```

## 実行

`go test ` ` go test -run ` でテストが行えます。

```sh
go test packagePath  # cf. go test github.com/hoge/moge パッケージを指定
go test -run ''      # カレントディレクトリ内の全てのテストを実行
go test -run Foo     # Fooを含むテスト関数を実行
```

[testing package](http://golang.org/pkg/testing/) より。
`go test -help`でオプションを確認可能。

再帰的に行いたい場合は以下など便利。

```sh
go test -v hoge/...　# hoge/以下のテストを実行
go test ... # GOPATH以下全てテストしようとするので終わらないので注意
```

実行すると

```sh
$ go test -run ""
PASS
ok  	playground_/moge	0.794s
```

## まとめ

こんな感じでテストを書いたり、実行する事ができます。
他に

* BenchMark用のテストユーティリティやパッケージも用意されている
* 標準でassertionがない
* subTest,tableDrivenTest
* `-parallel n`による並列実行

など書きたいことがありますので、別記事でtesting packageの説明も交えつつ、
より実践的な内容を書きたいと思います。

## 参考
* [testing package](http://golang.org/pkg/testing/)
* [go cmd](https://golang.org/cmd/go/)
git 特定のコミットだけ消したい時（revert）

下図のようにいくつか前の特定のコミットだけを消したい、もとに戻したいというときの方法や手順をなるべくやさしく紹介します。
この方法ではコミット履歴を消したりはしません。（打ち消した歴史が残ります。）

<img width="550" alt="revert.png" src="https://qiita-image-store.s3.amazonaws.com/0/126861/93d4a6cf-e44a-8c30-17db-3aa63227e2fe.png">

この図では最新がCでBのコミットだけ消したいという状況です。
参考：[過去のコミットを打ち消す](http://www.backlog.jp/git-guide/stepup/stepup6_2.html)

# 消したいコミットのコミット番号を調べる
まずは消したいコミットのコミット番号を調べます。
ここでは図と同じようなコミット履歴があり、Bのコミットを消すということを想定したいと思います。

`git log`

でコミットログを見ることができます。

```
C:\Users\hogehoge>git log
commit e0a8bfe80216ed2fc1b86f40edf9d823d9a28eea
Author: hogehoge
Date:   Tue Mar 28 14:30:39 2017 +0900

    C commit

commit 04ceb4571109766e89d5ef16dcbb70ed42eb31f5
Author: hogehoge
Date:   Tue Mar 28 14:30:22 2017 +0900

    B commit

commit fbdfe8f496804135ce25a5a2dc0974e7ebfbce04
Author: hogehoge
Date:   Tue Mar 28 14:29:44 2017 +0900

    A commit
```

英数字がいっぱい並んでいるのがコミット番号ですね。
Bのコミット番号は`04ceb4571109766e89d5ef16dcbb70ed42eb31f5`です。

ログを抜けるには`q`で抜けられます

# コミットを打ち消す（＝revertする）

`git revert コミット番号`
でできます。

実際にBのコミットを消してみます

```
C:\Users\hogehoge>git revert 04ceb4571109766e89d5ef16dcbb70ed42eb31f5
```

と打つと、

```text
Revert "B commit"

This reverts commit 04ceb4571109766e89d5ef16dcbb70ed42eb31f5.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch sample
# Your branch is ahead of 'kamorits/develop' by 7 commits.
#   (use "git push" to publish your local commits)
#
# Changes to be committed:
#       deleted:    /src/main/java/com/hoge/SampleRevert2.java
#
# Changes not staged for commit:
#       modified:   gradle.properties
#
```

と出てきて何やらメッセージを入力するモードに切り替わります。
初心者はここでどうしてよいやら迷いますが、とりあえず`:q`と打てばこのモードを抜けることができます。

そうするとrevertしたっぽいメッセージが出てきくるのこれで完了です。

試しにもう一度ログを見てみると、

```
C:\Users\hogehoge>git log
commit 345b1a2e769da9296883f04244408fa904a95248
Author: hogehoge
Date:   Tue Mar 28 14:31:12 2017 +0900

    Revert "B commit"

    This reverts commit 04ceb4571109766e89d5ef16dcbb70ed42eb31f5.
```

できているようです！

おつかれさまでした。
chainerアップデートしたら、`Compilation failed`でエラーが出た

Chainerの新しいバージョンが出たのは知っていたので`pip install -U chainer`でアップデートして、テストとして昔書いたchainerのプログラムを動かしてみたら見たこともないエラーが。
どうも、c++で書かれていてコンパイルしなければならないファイルのコンパイル中にエラーで出ているようでコンパイルに失敗したC++ファイルの中身が出力されて、長いエラーメッセージの後に`Exception: Compilation failed (return status=1)`といわれる。

http://stackoverflow.com/questions/38589886/sorry-unimplemented-64-bit-mode-not-compiled-in
このページを見て解決法を探った。
## 環境

```
OS: Windows 10
Python: Python 3.5.1 :: Anaconda 2.4.0 (64-bit)
Chainer: 1.22.0
```
## 原因

どうも、C++をコンパイルしているMinGWというやつが原因らしい。
さらに具体的にはMinGWのモード（バージョン？）によって64bitのコンパイルができないとか。。。

そこで、`g++ -v`を確認

```
>> g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.5.2/lto-wrapper.exe
Target: mingw32
Configured with: ../../src/gcc-4.5.2/configure --build=mingw32 --enable-languages=c,c++,ada,fortran,objc,obj-c++ --enable-threads=win32 --enable-libgomp --enable-lto --enable-fully-dynamic-string --enable-libstdcxx-debug --enable-version-specific-runtime-libs --with-gnu-ld --disable-nls --disable-win32-registry --disable-symvers --disable-werror --prefix=/mingw32tdm --with-local-prefix=/mingw32tdm --enable-cxx-flags='-fno-function-sections -fno-data-sections' --with-pkgversion=tdm-1 --enable-sjlj-exceptions --with-bugurl=http://tdm-gcc.tdragon.net/bugs
Thread model: win32
gcc version 4.5.2 (tdm-1)
```
この、`Target: mingw32`が`Target: x86_64-w64-mingw32`にならないといけないらしい。

## 解決策

MinGWの最新バージョンをインストールする。

まず、現在は入っているMinGWをアンインストールする。（このステップがないとうまくいきませんでした）
アンインストールは、単に`C:\MinGW`を消すだけ。

次に、
http://www.mingw.org/wiki/Getting_Started
から、`mingw-get-setup.exe`をダウンロードして実行。

全て終わってから、もう一度`g++ -v`をチェックすると

```
>> g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=C:/TDM-GCC-64/bin/../libexec/gcc/x86_64-w64-mingw32/5.1.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../../../src/gcc-5.1.0/configure --build=x86_64-w64-mingw32 --enable-targets=all --enable-languages=ada,c,c++,fortran,lto,objc,obj-c++ --enable-libgomp --enable-lto --enable-graphite --enable-cxx-flags=-DWINPTHREAD_STATIC --disable-build-with-cxx --disable-build-poststage1-with-cxx --enable-libstdcxx-debug --enable-threads=posix --enable-version-specific-runtime-libs --enable-fully-dynamic-string --enable-libstdcxx-threads --enable-libstdcxx-time --with-gnu-ld --disable-werror --disable-nls --disable-win32-registry --prefix=/mingw64tdm --with-local-prefix=/mingw64tdm --with-pkgversion=tdm64-1 --with-bugurl=http://tdm-gcc.tdragon.net/bugs
Thread model: posix
gcc version 5.1.0 (tdm64-1)
```
となっていた。`Target`がきちんと設定されていて、chainerプログラムの実行できた。
Altera SoC FPGA ボード選び

なんだかAltera(現Intel) FPGAの開発学習評価ボードを試してみたい気分が盛り上がってきたので、お買い物をしようと調べてみた。ボードのモデル名が大変ややこしい！

| Year | Model | FPGA | Price |
|--:|:--|:--|--:|
| 2005 | DE1 | Cyclone II | $150 |
| 2005 | DE2 | Cyclone II | $495 |
| 2009 | DE0 | Cyclone III | $119 |
| 2011 | DE0-Nano | Cyclone IV | $79 |
| 2014 | DE1-SoC | Cyclone V SoC | $249 |
| 2015 | DE0-Nano-SoC/Atlas-SoC Kit | Cyclone V | $99 |
| 2016 | DE10-Lite | MAX 10 | $85 |
| 2017 | DE10-Nano/Atlas-SoC+ Kit | Cyclone V | $130 |

ここ数年ほどで FPGA と ARM をパッケージした SoC FPGA の値ごろ感が出てきて、Cyclone IV は FPGA 単品で Cyclone V は FPGA-SOC に路線変更（進化？）したってことか。

そうすると FPGA 単品のシンプル安価な学習ボードがなくなってしまうので、DE10-Lite が追加投入された感じか。

現時点（2017/03）では DE10-Nano なボードは digi-key にも出てきてないので、FPGA-SOC な学習ボードという意味では DE0-Nano-SoC が良いという事かな…？

今（2017/04）は terasic から[買える](http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=167&No=1046) らしいので、こっちがいいのかも。

補足：DE0-Nano-SoC と Atlas-SoC はボードは同じで、SD カードのイメージ違い。Atlas-SoC が SoC 指向。 [参考1](http://qiita.com/yukitaketake/items/96f9fd8607cc1f3c8e7c), [参考2](https://www.altera.co.jp/products/boards_and_kits/dev-kits/partners/cyclonev_soc_atlas.html)
iOS リモートPushのSoundペイロード指定ファイルのアプリ変更方法について（iOS9以降）

[このブログ](http://bhind.site/info/2730/)のコピーです。
## 概要
iOSのリモートPush（APNS）でSoundペイロードが指定でき、その再生ファイルをアプリ側でコントロール可能なのですが、その挙動についてiOSのバージョン（iOS8と9以降）で異なるので記事にしました。

## 環境
- macOS Sierra 10.12.3
- Xcode 8.2.1
- iOS 10から8まで

## APNSペイロード
    {
        "aps": { 
            "alert": {
                "body":"🍺APNSプッシュテストです",
                "title":"🌟APNSプッシュテストタイトル🌟",
                "action-loc-key":"アプリへ"
            },
            "badge":1,
            "sound":"b.caf",
            "mutable-content":"1"
        }
    }

## コード
```objc:AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // テスト用なのでdidFinishLaunchingWithOptionsで力強く実行
    ///(snip)
    NSError* error = nil;
    BOOL result;
    NSFileManager* fm = [NSFileManager defaultManager];
    NSString* libraryDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
    NSString* dataDir = [libraryDir stringByAppendingPathComponent:@"Sounds"];
    NSLog(@"dataDir: %@", dataDir);
    // Library/Soundsディレクトリが未作成なら作成します
    if(![fm fileExistsAtPath: dataDir isDirectory: &result] && !result) {
        NSLog(@"create dir");
        [fm createDirectoryAtPath: dataDir
         withIntermediateDirectories:YES
         attributes:nil
         error:&error];
        if(error) {
            /// FIXME
            NSLog(@"Error: %@", error);
        }
    }
    // copy先が存在するとエラーとなるので削除します
    [fm removeItemAtPath:[dataDir stringByAppendingPathComponent:@"b.caf"] error:nil];
　　　　　　　　// main bundle配下のファイルをサーバー指定"b.caf”でLibrary/Soundsディレクトリにコピーします
    result = [fm copyItemAtPath:[[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"a.caf"]  toPath:[dataDir stringByAppendingPathComponent: @"b.caf"] error: &error];
　　　　　　　　// 別のファイルにすれば音も変わります（サーバー側のsound payloadは"b.caf"固定）
    // result = [fm copyItemAtPath:[[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"c.caf"]  toPath:[dataDir stringByAppendingPathComponent: @"b.caf"] error: &error];
    if(!result) {
        /// FIXME
        NSLog(@"Error: %@", error);
    }
```

## 結果
iOS10 カスタム音が鳴る
iOS9 カスタム音が鳴る
iOS8 カスタム音が**鳴らない**  Σ(ﾟДﾟ)ﾌｱｯ
一通りドキュメントを探してみたのだが、エビデンスは見当たらなかった… orz

## ハマったこと・課題など
- 　**iOS8でカスタム音が鳴らない**

## github
なし

## 参考
- [Local and Remote Notification Programming Guide](https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/SupportingNotificationsinYourApp.html#//apple_ref/doc/uid/TP40008194-CH4-SW10)