OmniAICreator/Qiita-1.07M huggingface dataset:
VMware > ゲストOS同士の(テキスト,ファイル)コピペ失敗について

```txt:動作環境
VMware(R) Workstation 12 Pro v12.5.1
ホストOS: Windows 10 pro
ゲストOS1: Windows 8.1 pro (64bit)
ゲストOS2: Windows 7 pro (32bit)
```

ゲストOS同士のテキスト(とファイル)のコピペができなくなる症状について気づいたこと。

- ゲスト間
  - ゲストOS2からゲストOS1へコピペできない
      - Ctrl+c, Ctrl+vではコピペできない
      - ファイルのコピペはドラッグではできない
  - ゲストOS1からゲストOS2へコピペできる
- ゲスト・ホスト間
  - ゲストOS1からホストOSへコピペできる
  - ホストOSからゲストOS1へコピペできない
      - ファイルのコピペはドラッグではできる
      - Ctrl+c, Ctrl+vではコピペできない
  - ゲストOS2からホストOSへコピペできる
  - ホストOSからゲストOS2へコピペできる

~~テキストだけでなく、ファイルのコピペも同様の動きだ。~~

ゲストOS1がどうもあやしい。

vmxファイルを変更して、コピペできるようになっても何かの機会で同じ状態になってしまう。永続的な解決方法でないため、時間を浪費している。

上記の動作を理解して使い続けることになりそうだ。

### 対処1 > 失敗

ゲストOS1, ゲストOS2ともに「VMware Toolsの修正」を行った。
問題は解消しなかった。

### 対処2 > 失敗

ゲストOS1, ゲストOS2ともに以下を行った。

- VMware Toolsの削除
- 再起動
- VMware Toolsのインストール

問題は解消しなかった。

### 対処3 > 成功 > 失敗
(追記 2017/02/09)

問題のある2つのゲストOSで以下の処理を行った。

1. VMWare Toolsのアンインストール
2. 再起動
3. セーフモードでの起動
4. VMWare Toolsのインストール
5. 再起動

以上によりゲストOS同士のコピペ（双方向）が可能になった。

いつまで有効なのだろうか。

(追記 2017/03/02)
2週間くらいで有効でなくなった。

再度、上記の処理を行ったところ、問題の解消はできなかった。

以下の方法では解消できた。
http://qiita.com/7of9/items/7facd5aa07497b53a2ec

vmwareの設定を変更するたびに`isolation.tools.copy.disable = "FALSE"`の定義がファイルの最終行でなくなり、コピペ不可になる、ということを繰り返している。
CakePHP3：プルダウンにvirtualfieldsを表示する

仮にprefecturesというテーブルに都道府県名が入っているとします。
また別にaddressesという住所のテーブルがあり、都道府県はprefecturesテーブルの値をプルダウンで選びたいとします。

普通にprefecturesとaddressesをbakeすると、生成されるフォームは都道府県名をプルダウンに表示します。ここで 1: 北海道 2: 青森県 といった具合にidを含めたい場合は以下の手順を行います。

まず、PrefectureのEntityにvirtualfieldを定義します：

```Model/Entity/Prefecture.php
    protected $_virtual = ['id_and_name'];

    protected function _getIdAndName() {
        return $this->_properties['id'] . ' : ' . $this->_properties['name'];
    }

```

次に、Addressのコントローラのaddメソッドにおいて、Viewに渡す配列を作成します：

```AddressesController.php
        $this->loadModel('Prefectures');
        $records = $this->Prefectures->find()->select(['id','name'])->order(['id' => 'ASC']);

        $prefectures = array();
        foreach($records as $record){
            $prefectures[$record->id]=$record->id_and_name;
        }
＜中略＞
        // 次の行はbakeされた際に生成されるが、削除する
        // $prefectures = $this->Addresses->Prefectures->find('list', ['limit' => 200]);
        $this->set(compact('addresses', 'prefectures'));
        $this->set('_serialize', ['addresses']);

```

最後に、テンプレートではoptionsにて、Controllerから渡ってきた配列を指定します：

```Template/Addresses/add.ctp
<div class="addresses form large-9 medium-8 columns content">
    <?= $this->Form->create($addresses) ?>
    <fieldset>
        <legend><?= __('Add Address') ?></legend>
        <?php
            echo $this->Form->input('prefecture_id', ['options' => $prefectures]);
        ?>
    </fieldset>
    <?= $this->Form->button(__('Submit')) ?>
    <?= $this->Form->end() ?>
</div>
```

なお、コントローラでは次のfindは出来ない点にご注意ください。これがデキるとスッキリなのですが！

```ng.php
// 動かない
$records = $this->Prefectures->find()->select(['id_and_name'])->order(['id' => 'ASC']);
```
js 連続するアルファベットから抜け落ちている文字を返す

##お題
連続するアルファベットから抜け落ちている文字を返す。
抜け落ちている文字がなければundefinedの状態で返す。

```js
function missingLetters(str) {
 //write your code.
  return missing;
}

missingLetters("abce");//d
```

##出力結果　例

```js
("abcdefghjklmno") // i
("bcd") // undefined
("yz") // undefined
```

##使ったもの
[charCodeAt()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt)
[fromCharCode()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)
map()
split()

##考え方
・引数(str)のアルファベットASCIIコードと比較用ASCIIコードの値を順に比較していく。
比較用ASCIIコード(compare)はstr.charCodeAt(0)で取得する。
引数のアルファベットASCIIコードはstr.split(' ').map()で順に取得する
・値が一致していれば比較用ASCIIコードに1を足していく。
・一致しなければ合わなかった比較用ASCIIコードの数値をfromCharCode(compare)でアルファベットに変換して変数(missing)に入れる。
・全てが一致すればundefinde、不一致があれば変数missingを返しておわり


##コード

```js
function missingLetters(str) {
    let compare = str.charCodeAt(0), 
        missing;

  str.split('').map(function(letter,index) {
    if (str.charCodeAt(index) == compare) {
      ++compare;
    } else {
      missing = String.fromCharCode(compare);
    }
  });

  return missing;
}

missingLetters("abc");//d
```

###他にもコードが浮かんだ方、コメントお待ちしております。
Zenhubのboardからepicだけを非表示にする

# 背景

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/064f2ae5-a1fe-2e6b-8aaa-a84e95b4671b.png)

- Zenhubには多数のフィルタが用意されているが、`epic`のみを非表示にするフィルタはパッと見存在しない。
- `epic`をアジャイルのストーリー的に使用する場合、`epic`配下に多数のissueがぶら下がり、boardが見づらくなるので、解決方法を探した。


# How

「`label`に`epic`がついていない」という条件でフィルタすると解決できる。 `not:lanbelname`とタイプすると可能。

![image](https://qiita-image-store.s3.amazonaws.com/0/83135/a30bf08c-3b4c-9807-5286-90b972229bae.png)
WordPress デバッグモードについて

WordPress初心者ですが、今回はデバッグモードについて学んだので、記事にまとめます。
デバッグモードをONにすることで、コードのエラーや警告をブラウザ上で確認できるため、開発に役立ちます。

##デバッグモードをONにする
まずwp-config.phpを開いてください。84行目に

```php:wp-config.php
define('WP_DEBUG', false);
//もしくは
define('WP_DEBUG', true);
```

となっているはずです。
ここでtrueになっていれば、デバッグモードがONになっているということです。

##エラー文をブラウザに表示せずログファイルに書き出す
もちろんエラー文をログに残しておくこともできます。

```php:wp-config.php
define('WP_DEBUG', true); //デバッグモード有効
if (WP_DEBUG) { //デバッグモードの場合
define('WP_DEBUG_LOG', true); //debug.logファイルに記録
define('WP_DEBUG_DISPLAY', false); //エラーをブラウザに表示しない
@ini_set('display_errors', 0); //エラーをブラウザに表示しない
}
```
こうすることでwp-contentフォルダ内のdebug.logファイルにエラーの内容が保存されて残ります。

##致命的なエラー（E_ERRORやE_PARSE）だけをブラウザに表示する
デバッグモードをONにするとWordPressの非推奨のタグに対しても反応してしまいエラーが表示されます。そこでの対応として以下のコードを記述します。


```php:wp-config.php
define('WP_DEBUG', false); //デバッグモード無効
@ini_set('log_errors','On'); //エラーメッセージをログファイルに書き出す
@ini_set('display_errors','On'); //エラーをブラウザに表示
@ini_set('error_log','/logs/php_error.log'); //ログファイルのパス指定する
```


以上簡単なまとめでした。実際にサーバーにあげる際はデバッグモードをOFFにすることをお忘れなく。
Oculus Platform IAPで設定できる価格一覧

2017年2月10日時点での数値であり、今後の為替レートの変動等の理由により変更される可能性があります。

USD | JPY
--- | ---
0.01 | 1
0.10 | 10
0.99 | 90
1.49 | 142
1.99 | 190
2.00 | 194
2.37 | 245
2.49 | 245
2.67 | 261
2.75 | 275
2.99 | 290
3.34 | 328
3.49 | 343
3.99 | 390
4.49 | 445
4.99 | 490
5.35 | 529
5.99 | 590
6.69 | 663
6.79 | 671
6.99 | 690
7.49 | 742
7.99 | 790
8.49 | 841
8.99 | 890
9.74 | 968
9.89 | 963
9.99 | 990
11.24 | 1117
11.99 | 1190
12.99 | 1290
13.49 | 1341
13.99 | 1390
14.99 | 1490
15.99 | 1592
16.74 | 1700
16.99 | 1690
17.99 | 1790
18.74 | 1117
19.99 | 1990
22.49 | 2242
22.99 | 2290
24.99 | 2490
26.99 | 2690
29.99 | 2990
31.99 | 3192
33.49 | 3340
34.99 | 3490
36.99 | 3690
39.99 | 3990
41.99 | 4190
45.99 | 4590
48.99 | 4890
49.99 | 4990
59.99 | 5990
89.99 | 8990
99.99 | 9990
159.99 | 15990
199.99 | 19990

なぜか一部にUSDとJPYの大小関係がおかしい箇所がありますが、ミス？
メール通知を介してGoogle Apps Scriptによりサービス間の連携を行う

# はじめに

社内コミュニケーションの中心にビジネスチャットツールを据えて情報を集約している会社も多いと思います。天下のSlack様であれば、最初から連携可能なサービスも豊富に用意されていますが、まだまだ対応できてないサービスもあることでしょう。Slack以外となれば推して知るべし。

「なんだよ、連携できねーのかよ。使えねーな！」と言う前に、メール通知機能は備わっていませんか？Gmailのメールアドレス宛に通知して、Google Apps Scriptで処理を行い、連携先のAPIを呼び出す。ただ、これだけです。

「なんだ、そんなことか。つまらん。」という方、その通りです。そんなつまらない内容です。

# サービス連携の図

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/131050/e0537a50-9713-4d4a-47af-305e5c1d477b.png)

# 一例

私の会社では、請求管理システムとして「働くDB」というサービスを利用しています。データベースを核とした業務システムを簡単に構築できる、よくあるサービスです。
なぜそんなものを利用しているのかは置いといて、このサービスはExcelファイルへのデータ埋め込みによる帳票出力機能は備えていますが、PDFファイルの直接出力はできません。
そこで、Google Apps Scriptを使って処理したいと思います。

# 概略図

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/131050/5c8b3b44-3120-712d-8ce6-0a0c7b6e2292.png)

# スクリプト

```js
function myFunction() {
  var threads = GmailApp.search('label:働くdb subject:承認 label:unread');
  if (threads.length == 0) {
    return;
  }
  
  for (var i = threads.length - 1; i >= 0; i--) {
    var messages = threads[i].getMessages();
    for (var j = messages.length - 1; j >= 0; j--) {
      if (messages[j].isUnread()) {
        var subject = messages[j].getSubject();
        var body = messages[j].getPlainBody();
        var attachment = messages[j].getAttachments()[0];
        var ss = convertExcel2Sheets(attachment.copyBlob(), attachment.getName());
        var pdf = convertSheet2Pdf(ss, attachment.getName().replace(/\.xlsx$/, '.pdf'), '見積書フォルダID');
        
        var notice = new Notice(subject, body);
        var message = chatwork.addMention('', chatwork.getIdByHDBName(notice.user), notice.user);
        message += notice.title+"\n";
        message += notice.url+"\n";
        message += "見積書の作成が完了しました。\n";
        message += pdf.getUrl();
        chatwork.postMessage(ROOMNUMBER, message);
        
        messages[j].markRead();
        clear(attachment.getName());
      }
    }
  }
}

function Notice(subject, body) {
  var lines = body.split("\n");
  this.title = lines[0].trim();
  this.url = lines[1].trim();
  this.user = lines[2].trim();
}

function convertSheet2Pdf(spreadsheet, filename, folderId) {
  var params = {
    headers: {'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()}
  };
  var response = UrlFetchApp.fetch('https://docs.google.com/spreadsheets/d/'+spreadsheet.getId()+'/export?format=pdf&size=A4&fitw=false&portrait=true', params);
  var folder = (typeof folderId == 'undefined') ? DriveApp : DriveApp.getFolderById(folderId);
  return folder.createFile(response.getBlob()).setName(filename);
}
```

# 解説

- Excelファイルを直接PDFファイルに変換することができません。一度Googleスプレッドシートに変換します。（参考1）
- レイアウトを気にしないのであれば、Fileクラスの`getAs('application/pdf')`でも変換可能ですが、変換時のオプションを指定するためにURLを呼び出しています。
- 社内ではチャットワークを利用しており、よく使う処理を別途ライブラリにまとめています。
- スクリプトを作成したら、トリガーを設定して定期的に実行することを忘れずに。

# 参考

1. convertExcel2Sheets
https://gist.github.com/azadisaryev/ab57e95096203edc2741

2. Google Apps Script リファレンス
https://developers.google.com/apps-script/reference/

3. チャットワーク API ドキュメント
http://developer.chatwork.com/ja/
Windows Server 2012 R2にphpMyBackupProをインストールする

# はじめに
phpMyBackupProに必要なPHPなどの環境は整っているものとします。

## 参考文献

> ▼phpMyBackupPro
> http://www.phpmybackuppro.net/

> ▼「phpMyBackupPro」でDBを定期的に自動バックアップ
> http://www.hanemaru.com/itemcolumn/11phpmybackuppro01.html

# バージョン
phpMyBackupPro v.2.5
phpMyBackupPro-2.5.zip

# インストール
Zipを解凍して任意のディレクトリに設置するだけ。

# 設定

## 世代管理
1. http://localhost/phpmybackuppro/にアクセス
1. 「configuration」タブをクリック => メニュー直下の「Extended configuration」テキストリンクをクリック
1. 「Automatic deletion of backup files」の箇所が世代管理になる。
 
## タスクスケジューラ
「操作」タグの設定は以下のとおり

- プログラム/スクリプト：php
- 引数の追加：<phpMyBackupProのパス>backup.php %%ALL%% 1 1 1 1

【詳しくは】
Zipを解凍したときに生成される「doc」の「SHELL_MODE.txt」を読めば全てが書いてある。
macOSのコマンドラインアプリでdylibをよろしく扱う方法


一般に動的ライブラリを扱う場合には2つの方針があると思います。

- ライブラリはシステムにインストールして、アプリはそれを使う
- ライブラリをアプリ用に用意してまとめて配布する

後者の場合のよろしいやり方について調べたのでまとめました。

# 構成

コマンドラインアプリと一緒にlibディレクトリを置き、その中にdylibが入っているという構成にします。ファイルをリストすると下記のようになります。

- app_dir/app
- app_dir/lib/libfoo.dylib
- app_dir/lib/libbar.dylib

ライブラリはfooとbarがあって、barはfooに依存しているとします。

# ライブラリの本体パスと依存パスの設定

macのdylibはバイナリ内部に自身のパスと依存するライブラリ達のパスが書き込まれています。この自身のパスは下記のようにして得られます。

```
$ otool -D libfoo.dylib
```

また、依存するライブラリのパスは下記のようにして得られます。

```
$ otool -L libfoo.dylib
```

まず、自身のパスを `@rpath` 直下の形に書き換えます。

```
$ install_name_tool -id "@rpath/libfoo.dylib" libfoo.dylib
$ install_name_tool -id "@rpath/libbar.dylib" libbar.dylib
```

また、依存するライブラリのうち、一緒に配布するものは `@rpath` 直下を探すように書き換えます。この例ではbarの中にfooへの依存があるのでこれを修正します。コマンドの引数として元々のパスを指定しますが、これは先述の方法で取得した結果を用います。

```
$ install_name_tool -change "/Users/omochi/temp/libfoo.dylib" "@rpath/libfoo.dylib" libbar.dylib
```

ここで設定した `@rpath` は変数で、アプリが起動する時に変数展開されます。

# アプリの実行時rpathの設定

アプリの実行時のrpath変数はビルド設定で指定できます。Xcode > ターゲット設定 > Build Settings > Runpath Search Pathesを下記の値に設定します。

```
@executable_path/lib
```

`@executable_path`は変数で、アプリ実行時のアプリ自体のファイルパスになります。これにlibを付けておくことで、同じディレクトリにあるlibディレクトリの中からライブラリが探索されます。

# アプリのビルド時のライブラリの設定

dylibはxcode上で登録しておき、アプリターゲットに対してリンクされるよう設定しておきます。さらに、ビルド時にアプリと一緒にlibディレクトリを作りその中にコピーされるように、Build PhasesでCopy Filesの設定を作ります。DestinationはProducts Directoryにして、Subpathは `lib` にします。そしてdylib全てを登録します。

# アプリの状態

rpathの設定内容はアプリバイナリ自体に書き込まれます。また、アプリの依存ライブラリは、リンクしたライブラリに書かれていた、ライブラリ自身のパスが書き込まれます。これらは下記のコマンドで確認できます。

```
otool -l app
```

# 配布

これで、ビルドした際にProductsの中にアプリとlibディレクトリが作られるようになるので、これらをまとめて配布すれば実行が可能になります。
pythonで三項演算子のネスト

三項演算子は単純なif-else文を1行でまとめてくれて、読みやすくしてくれます。

# if-else文

例えば、vが10より大きいときの値でfoo、それ以外はbarと表示させたいとき、if-else文で書くと4行で書きます。


```python:if-else文で書くと4行
In [22]: for v in range(-5, 15):   
    ...:     if v > 10:               
    ...:         p = 'foo'            
    ...:     else:                    
    ...:         p = 'bar'            
    ...:     print(v, p)              
    ...:                              
-5 bar                                
-4 bar                                
-3 bar                                
-2 bar                                
-1 bar                                
0 bar                                 
1 bar                                 
2 bar                                 
3 bar                                 
4 bar                                 
5 bar                                 
6 bar                                 
7 bar                                 
8 bar                                 
9 bar                                 
10 bar                                
11 foo                                
12 foo                                
13 foo                                
14 foo                                
```


# 三項演算子

三項演算子の文法は

```
(変数) = (条件がTrueのときの値) if (条件) else (条件がFalseのときの値) 
```

三項演算子なら1行で書けます。

```python:三項演算子で書くと1行
In [26]: for v in range(-5, 15):
    ...:     p = 'foo' if v > 10 else 'bar'
    ...:     print(v, p)
-5 bar
-4 bar
-3 bar
-2 bar
-1 bar
0 bar
1 bar
2 bar
3 bar
4 bar
5 bar
6 bar
7 bar
8 bar
9 bar
10 bar
11 foo
12 foo
13 foo
14 foo
```

**ここではfor-print文の間のif-else文を三項演算子でまとめています。**


# ネスト

## if-elif-else文

一つ条件を加えて0未満であれば'foobar'と出力するとき、`elif`を加えます。

これで「10より大きければ'foo'、0未満であれば'foobar'、それ以外は'bar'」を出力します。

```python:if-else文条件が2つ以上
In [36]: for v in range(-5, 15, 1):
    ...:     if v > 10:
    ...:         p = 'foo'
    ...:     elif v < 0:
    ...:         p = 'foobar'
    ...:     else:
    ...:         p = 'bar'
    ...:     print(v, p)
    ...:
-5 foobar
-4 foobar
-3 foobar
-2 foobar
-1 foobar
0 bar
1 bar
2 bar
3 bar
4 bar
5 bar
6 bar
7 bar
8 bar
9 bar
10 bar
11 foo
12 foo
13 foo
14 foo
```

## 三項演算子のネスト

三項演算子をネストする場合の文法は

```
(変数) = (条件がTrueのときの値) if (条件) else (条件がFalseのときの値) if (条件) else (条件がFalseのときの値) ...if-()-else-()無限につなげていく
```


```python:ネストした三項演算子
In [38]: for v in range(-5, 15, 1):
    ...:     p = 'foo' if v > 10 else 'foobar' if v < 0 else 'bar'
    ...:     print(v, p)
-5 foobar
-4 foobar
-3 foobar
-2 foobar
-1 foobar
0 bar
1 bar
2 bar
3 bar
4 bar
5 bar
6 bar
7 bar
8 bar
9 bar
10 bar
11 foo
12 foo
13 foo
14 foo
```


### 参考
[Qiita - 三項演算子(Python)](http://qiita.com/howmuch/items/bf6d21f603d9736fb4a5)
機械学習論文読みメモ_23


[A Random Matrix Approach to Recurrent Neural Networks](http://jmlr.org/proceedings/papers/v48/couillet16.pdf), ICML2016
RNN、特に線形なRNNは様々なconfigurationにおける性能分析を通して、その質的洞察を得てきた。
対して本論では新たなランダム行列に基づく、特にecho-state netowrk(ECN)に基づいて量的洞察を与える。
ECNはreserviorと呼ばれる、ランダムに作成されその後固定して使われる接続行列（connectivity matrix)を用いてネットワークを構築する。
このECNは過剰適合のリスクを低減する事が出来るが、短期的な記憶能力しか持てない。
ECNの解析は行列が固定される事より難しくはなく、すでに様々な質的な洞察が得られており、特に作用素ノルムとスペクトル半径が重要な意味を持つ事がわかっている。
しかしより詳細な量的洞察はまだ得られておらず本論ではそれを扱う。
本論では内部ノイズを含むような線形ECNの平均二乗誤差に関連した理論解析を行った。
解析はランダム写像の理論に基づいて行われた。

[Pliable Rejection Sampling](http://www.jmlr.org/proceedings/papers/v48/erraqabi16.pdf), ICML2016
Rejection samplingは複雑な分布をサンプルするための技術の１つである。
この手法は、サンプルしたい対象の確率分布をすべて下側に包含するような、サンプル可能な提案分布を利用する。
提案分布によりサンプルされた点に対して、さらに０からサンプル点における提案分布確率値の間に一様サンプルを行い、それが
対象分布にお含まれる場合の採択する。
これにより採択されたサンプルの集合はそのまま対象分布を表現できる。
この手法はしかしながらサンプル採択率の低さにより、その実用性が制限されている。
提案手法では、カーネル密度分布を提案分布として利用し、この利用により、採択率の下限が保証できることを示した。
また得られるサンプルは高い確率でi.i.d.であり、対象分布から得られたものであるといえる。

[CryptoNets: Applying Neural Networks to Encrypted Data with High Throughput and Accuracy](http://jmlr.org/proceedings/papers/v48/gilad-bachrach16.pdf), ICML2016
様々な分野で、データのprivacyやsecurityを担保した形でデータ処理を行うことが求められている。
本論では暗号化されていないデータに対して学習したNNモデルを、暗号化されたデータに適用可能な形に変換する手法を提案する。
そのために、homomorphic encryptionを導入する。
これは、特定に計算処理に関して、復号化を事前に行うことなくそのまま適用する事を可能にする。
特にleveled homomorphic encryption schemeでは、多項式計算を可能にするが、予めその最大次数を決めておく必要があり、その大きさでパラメータ数が決定される。
そのためいかに低い次数の多項式計算で対象モデルを構築するかが重要になってくる。
ここで本論ではNNモデルを用いてモデルの表現力を向上させ、またボトルネックであった非効率性についても改善する事ができた。
Unityの起動ロゴが表示されないくらいアプリの起動が重くなった話

現在Unity 5.5.0f3でスマホ向けにアプリを作っています。

ひとつのシーンにゲームの中身を全部詰め込む方式で作っていたのですが、
作り込んでいくうちにだんだんとアプリの起動が重くなっていって、ついには
Unityのロゴが表示されないくらい重くなってしまいました。

### どうしよう。

Resourcesに画像につめこみすぎたかな・・・？
などとしばらく悩みましたが、ゲームの起動時にからっぽのSceneを表示するようにしてみたところ、
アプリの起動がサクサクになってみごと解決。

このからっぽのSceneでローディングなりタイトルを表示するなりして
お茶を濁せば良さそうです。
（SceneManager.LoadSceneAsyncを使えばシーンをロードしながら画面が更新出来る）

スプラッシュスクリーンが表示中かどうか判定する機能もあるようです。
http://unitynightowlgames.hatenablog.com/entry/2016/09/24/193450

追記
僕の場合、どうやらサウンドファイルのロードに時間がかかっていたみたいでした。
サウンドアセットを選択した状態でインスペクターに表示される
「Load in Background」
という項目にチェックを入れると、ロード時間を短くすることができました。
ただし、音を再生するタイミングになってからロードが始まるみたいなので、Play()してから実際に音が鳴るまで若干のタイムラグが発生します。
Pythonで特異値分解(SVD)、低ランク近似(LRA)する

高速化したいならLapackとかPythonから使うことないと思うので、そういう科学技術計算をcudaとかCとかC++でやる人の答え合わせ程度に使っていただけると

と思ってメモ

#ソースコード

```low_rank_approximation.py
import numpy as np
from scipy import linalg

def low_rank_approximation(a,rank):
    u, s, v = linalg.svd(a)
    ur = u[:, :rank]
    sr = np.matrix(linalg.diagsvd(s[:rank], rank,rank))
    vr = v[:rank, :]
    return np.asarray(ur*sr*vr)

A = np.array([[1,2,3],[4,5,6],[7,8,9]])
print A
B = low_rank_approximation(A,1)
print B

# python low_rank_approximation.py
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]
# [[ 1.73621779  2.07174246  2.40726714]
#  [ 4.2071528   5.02018649  5.83322018]
#  [ 6.6780878   7.96863051  9.25917322]]
```

#参考
- http://qiita.com/kaityo256/items/48de63526b469235d16a
- http://qiita.com/kyoro1/items/4df11e933e737703d549
- http://oppython.hatenablog.com/entry/2014/01/21/003245
Xamarin.Forms XAML で、Margin の上下左右の順番

Xamarin.Forms の XAML で マージン(Margin)やパディング(Padding)を書くとき、上下左右の順番がわからなくなるのでメモ。

XAML に Margin や Padding （いわゆる ``Thickness``）をリテラルで書くときの順番は、 **「left, top, right, bottom」** だ。

```csharp:
<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
		xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
		xmlns:local="clr-namespace:MarginTest" 
		x:Class="MarginTest.MarginTestPage" 
		BackgroundColor="Silver">
	
	<BoxView 
		Margin="10, 20, 30, 40"
		BackgroundColor="Red"
		HorizontalOptions="FillAndExpand" 
		VerticalOptions="FillAndExpand" />
	
</ContentPage>
```

![](http://blog.amay077.net/assets/images/posts/xamarin_forms_margin_definition_01.png)

**「"左" をスタートに時計まわり」** と覚えておきたい。

Thickness のコンストラクタの引数を見てもよい。

* [Thickness(double, double, double, double) - Xamarin](https://developer.xamarin.com/api/constructor/Xamarin.Forms.Thickness.Thickness/p/System.Double/System.Double/System.Double/System.Double/)

```csharp:
// syntax
public Thickness (Double left, Double top, Double right, Double bottom)
```

ちなみに css の ``margin: 10px 20px 30px 40px;`` は、 ”上” をスタートに時計まわり だ、紛らわしい。
AWS CLI オレオレTIPS

これから書き溜めていく。
主にインスタンスの調査用に使用するAWS CLIコマンド類。

# RDSの情報取得系
## RDSのインスタンス名とMySQLのEngineVersionを引っ張る。
```
$ aws rds describe-db-instances | jq '.DBInstances[] |{DBInstanceIdentifier,EngineVersion}'
```

# EC2の情報取得系
## 自分の作成したAMIイメージのNameと作成日を作成日順に逆順ソートして取得する。
- --owners selfで自分所有(作成)を指定。
  - IAM環境なら同じ環境にいる人も含むっぽい。
- sort_by(Images,&CreationDate)でソート。
  - トップツリーのImages内のCreationDateでソートかけているイメージ。
     - たぶん↑の解釈は間違っている気がするので、どなたか教えてください
  
```
$ aws ec2 describe-images --owners self --query 'sort_by(Images,&CreationDate)[].{Name:Name,CreationDate:CreationDate}'
```

### 逆順ソートはこっち。reverse()で囲む。

```
$ aws ec2 describe-images --owners self --query 'reverse(sort_by(Images,&CreationDate)[].{Name:Name,CreationDate:CreationDate})'
```
CentOS のロケールの変更

## 現在のロケールの確認
### locale コマンド
```bash
locale
```
```bash:出力例
LANG=ja_JP.utf8
LC_CTYPE="ja_JP.utf8"
LC_NUMERIC="ja_JP.utf8"
LC_TIME="ja_JP.utf8"
LC_COLLATE="ja_JP.utf8"
LC_MONETARY="ja_JP.utf8"
LC_MESSAGES="ja_JP.utf8"
LC_PAPER="ja_JP.utf8"
LC_NAME="ja_JP.utf8"
LC_ADDRESS="ja_JP.utf8"
LC_TELEPHONE="ja_JP.utf8"
LC_MEASUREMENT="ja_JP.utf8"
LC_IDENTIFICATION="ja_JP.utf8"
LC_ALL=
```
### localectl コマンド
```bash
localectl
```
```bash:出力例
   System Locale: LANG=ja_JP.utf8
       VC Keymap: jp
      X11 Layout: jp
```
## ロケールの変更
### localectl set-locale
```bash
localectl set-locale LANG=en_US.utf8
```
### 設定の反映
`set-locale` だけでは反映されないので以下を実行する。

```bash
source /etc/locale.conf
```
DocumentDBをmongodbプロトコルで使うと、Utf-８の文字がおかしくなる？

Microsoftさんには既に報告済みですがMicrosoft Windows AzureのDocumentDBをmongodbプロトコルで利用しようとしたら日本語のUpdateがうまくいかないバグを発見したので共有。

https://github.com/kazkondo/documentdb-bug

なお、通常のmongodbに接続すればうまくいきます。

--
追記
Microsoft側で不具合を確認したので、2017/1月末までに修正されるということです。
以上。
lbzip2: exec 不能: そのようなファイルやディレクトリはありません

## tar.bz2 の展開エラー
minimal でインストールされた CentOS では .tar.bz2 ファイルを展開しようとしたときに以下のようなエラーになる。

```bash:実行例
tar xf httpd-2.4.25.tar.bz2
```
```bash:出力例(ja_JP)
tar (child): lbzip2: exec 不能: そのようなファイルやディレクトリはありません
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
```
```bash:出力例(en_US)
tar (child): lbzip2: Cannot exec: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
```

## bzip2 のインストール
bzip2 パッケージをインストールすると .tar.bz2 ファイルを tar コマンドで展開できるようになる。

```bash
yum install bzip2
```
5分でstorybookをnginx(docker上)で動かす

# 動機

reactのcomponentをstorybookで開発しようと思ったが、storybookの解説ではnodeのwebserver機能を使っていて腑に落ちないので私の大好きなnginxに置き換えたかった。動かすまでが仕事。

# やってみる

## バージョン

- Docker for Mac:1.12.5 (14777)
- npm:3.10.10
- node:v7.3.0

## storybookとreactのインストール

[Slow Start Guide](https://getstorybook.io/docs/react-storybook/basics/slow-start-guide)を見ながら準備します。

想定しているディレクトリ構成

```
.
├── node_modules
├── out
├── package.json
├── stories
│   └── index.js
├── storybook
│   └── config.js
└── web
    └── Dockerfile
```

### まずはインストール

```
npm init
npm install --save-dev @kadira/storybook
npm install --save react react-dom
```

### 次に[Slow Start Guide](https://getstorybook.io/docs/react-storybook/basics/slow-start-guide)のサンプルをそのままコピペ。

```js:stories/index.js
import React from 'react';
import { storiesOf, action } from '@kadira/storybook';

storiesOf('Button', module)
    .add('with text', () => (
<button onClick={action('clicked')}>Hello Button</button>
))
.add('with some emoji', () => (
<button onClick={action('clicked')}>😀 😎 👍 💯</button>
));
```

```js:storybook/config.js
import { configure } from '@kadira/storybook';

function loadStories() {
    require('../stories/index.js');
    // You can require as many stories as you need.
}

configure(loadStories, module);
```

## Dockerの準備

使うのはnginx:alpineイメージです。

```:web/Dockerfile
FROM nginx:alpine
```

docker-composeは以下のような設定してlocalhost:8080/out/で確認します。
**ポイントはvolumesで出力先ディレクトリの親ディレクトリを指定しているところです。**

```yaml:docker-compose.yml
version: '2'
services:
  web:
    build: ./web
    ports:
     - "8080:80"
    volumes:
     - ".:/usr/share/nginx/html"
```

## npm scriptsの設定

最後に[Exporting Storybook as a Static App](https://getstorybook.io/docs/react-storybook/basics/exporting-storybook)を見ながらnpmのscriptsを設定します。storybookディレクトリのconfig.jsを参照して、outディレクトリに成果物を生成する設定です。

```json:package.jsonの抜粋
  "scripts": {
    "storybook": "build-storybook -c ./storybook -o ./out",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
```

ここまで終わったら

```
docker-compose up
npm run storybook
```

で好きなタイミングで生成して`http://localhost:8080/out/`(要スラッシュ)にアクセスすればOKです。

## 注意点

- build-storybookの-oオプションで指定したディレクトリは実行の都度削除して作り直すという動作します。-oオプションで指定したディレクトリをvolumesでマウントするとbuildごとにinodeが変更されてしまい、正しくマウントできません。そのためその親ディレクトリをマウントしています。以下のようなコード(抜粋)が実行されています。

```js:react-storybook/src/server/build.js 
// create output directory (and the static dir) if not exists
shelljs.rm('-rf', outputDir);
shelljs.mkdir('-p', path.resolve(outputDir));
shelljs.cp(path.resolve(__dirname, 'public/favicon.ico'), outputDir);
```

- nginx側のセキュリティとか全く考慮してないので、公開ディレクトリなどはきちんと設定した方が気持ちいいと思います。outディレクトリだけ公開するとか。

# 参考

[Slow Start Guide](https://getstorybook.io/docs/react-storybook/basics/slow-start-guide)
[Exporting Storybook as a Static App](https://getstorybook.io/docs/react-storybook/basics/exporting-storybook)
[React Storybook入門：コンポーネントカタログがさくさく作れちゃうかもしれないオシャレサンドボックス環境](http://qiita.com/beijaflor/items/4fc01f8d557c1926c38d)
[React Storybook で変わるUI開発フロー (Redux Flavor)](http://qiita.com/kitaly/items/85254fd346e2e575582b)
Pythonでグローバルコマンドを含んだパッケージを作る

Pythonでグローバルコマンドを含んだパッケージを作ったので、そのメモ。

グローバルコマンドとは、/usr/local/bin/などの通常PATHが通っている場所にあるコマンドの事をいっており、/usr/local/bin/に任意のコマンドをpipでインストールできる事を目的とします。

## 環境

* MacOS X 10.11.13
* Python 2.7.10
* setuptools (1.1.6)

## 構成

```
myapp/
　　├ setup.py
　　└ myapp/
　　　　├ __init__.py
　　　　└ main.py
```

setup.pyの内容

```
import setuptools 

if __name__ == "__main__":
    setuptools.setup(
        name='myapp',
        version='0.0.1',
        packages=setuptools.find_packages(),
        entry_points={
            'console_scripts':[
                'myapp = myapp.main:main',
            ],
        },
    )

```

`entry_points`で、実行するファイルと関数を指定している。
`'myapp = myapp.main:main'`は、myappという実行ファイルを実行すると、myapp/main.pyのmain関数を呼び出すということを意味している。

`setuptools.find_packages()`によって、`__init__.py`があるディレクトリをパッケージに入れる。

実際に実行する関数を格納したmain.pyの内容

```
import sys

def main():
    print(sys.argv)
```


## パッケージの作成

```
$ python setup.py sdist
```

これでパッケージ本体 `dist/myapp-0.0.1.tar.gz` と、
メタデータディレクトリ `myapp.egg-info/` ができる。

## パッケージをインストール

```
$ sudo pip install dist/myapp-0.0.1.tar.gz
```

手元のMacOS X環境では、以下のファイルがインストールされた

```
  /Library/Python/2.7/site-packages/myapp-0.0.1-py2.7.egg-info
  /Library/Python/2.7/site-packages/myapp/__init__.py
  /Library/Python/2.7/site-packages/myapp/__init__.pyc
  /Library/Python/2.7/site-packages/myapp/main.py
  /Library/Python/2.7/site-packages/myapp/main.pyc
  /usr/local/bin/myapp
```

`/usr/local/bin/myapp`に実行ファイルが登録されているのが分かる

## 動作確認

これで、どこからでもmyappコマンドが打てるようになった

```
$ myapp hoge bar
['/usr/local/bin/myapp', 'hoge', 'bar']
```
EmbulkでTreasureData検索結果をsftp PUT

プラグインインストール

```
$ embulk gem install embulk-output-sftp
2017-01-05 12:54:24.469 +0900: Embulk v0.8.15
Fetching: embulk-output-sftp-0.0.8.gem (100%)
Successfully installed embulk-output-sftp-0.0.8
1 gem installed
```

Embulk設定ファイル(鍵認証版)

```
in:
  type: td
  apikey   : ■APIキー■
  endpoint : ■エンドポイント(「https://」なし)■
  database : ■データベース■
  query : |
    SELECT
      ～略～
out:
  type: sftp
  host: ■sftpサーバ■
  port: 22
  user: ■ユーザ■
  secret_key_file: ■キーファイル■
  path_prefix: /dir1/file1.csv
  sequence_format: ""
  file_ext: ""
  formatter:
    type: csv
    header_line: true
```
機械学習の勉強会のためにPyData環境の構築を行う (2017年1月）


# 前提条件

[Python機械学習プログラミング(インプレス)](http://amzn.to/2iKe2r5) を題材に内輪で勉強会を行う事になりました。
Python 3.6 もリリースされたこともあるので、改めて環境構築方法をまとめます。

ここで行う環境構築は、以下のとおりです。

- VirtualBox + Vagrant
- Ubuntu 16.04 LTS
- Python 3.6
- PyData関連(NumPy/Pandas/scikit-learn(sklearn))

以下は導入済みとします。

- VirtualBox (5.0.30)
- Vagrant (1.9.1)


```バージョン確認
$ VirtualBox --help
Oracle VM VirtualBox Manager 5.0.30

$ vagrant version
Installed Version: 1.9.1
Latest Version: 1.9.1
```

# VirtualBox + Vagrant


Vagrant用のフォルダを準備。今回は、機械学習の勉強をするので、 `~/vagrant/ml-study` というフォルダを準備して環境等を整える。

```
$ mkdir ~/vagrant/ml-study
```

Vagrant Box の追加

```
$ vagrant box add ubuntu/xenial64 https://atlas.hashicorp.com/ubuntu/boxes/xenial64/versions/20170104.0.0/providers/virtualbox.box
```

Vagrant 起動

```
$ vagrant init ubuntu/xenial64
$ vagrant up
```

Vagrant設定 (Vagrantfileを編集)
最下部の `config.vm.provision` を有効にして以下のように記述する


```Vagrantfile 
...
  config.vm.provision "shell", inline: <<-SHELL
    apt-get update
    sudo apt-get install -y build-essential libssl-dev libxml2-dev libxslt1-dev libbz2-dev zlib1g-dev python-setuptools python-dev libjpeg62-dev libreadline-gplv2-dev
    sudo apt-get install -y libblas-dev liblas-dev liblapack-dev gfortran libfreetype6-dev
  SHELL
...
```

設定の反映

```
$ vagrant provision
```


# OSの関連パッケージ

Vagrantfile に必要なパッケージを記述したので、vagrant側でインストール済みとなる。


# Python 3.6

```フォルダを作る
$ mkdir ~/tmp
$ sudo mkdir /opt/python36
$ sudo chown ubuntu /opt/python36
```

```Pythonインストール
$ cd tmp
$ wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz
$ tar zxvf Python-3.6.0.tgz
$ cd Python-3.6.0/
$ ./configure --prefix=/opt/python36
$ make && make install
```

```venv環境
$ cd ~
$ /opt/python36/bin/python3 -m venv python
$ source python/bin/activate
```

# Pythonの関連モジュール

```
$ pip install numpy scipy pandas scikit-learn matplotlib
$ pip install ipython[notebook]
$ pip install seaborn
$ pip install pyprind
```



# 設定後に使う時

```ホストマシン
$ cd ~/vagrant/ml-study
$ vagrant up
$ vagrant ssh
```

```仮想マシン
$ cd ~
$ source python/bin/activate
$ jupyter notebook
```

停止時

```ホストマシン
$ vagrant halt
```


# jupyter notebook の設定

(2017年1月8日追記)

ホストマシンからブラウザで直接Jupyter notebookにアクセスしようとすると、IP制限で拒否されてしまう。以下の設定を行うことで、IP制限を解除できる。

```
$ source python/bin/activate
$ jupyter notebook --generate-config
```

```~/.jupyter/jupyter_notebook_config.py
c.NotebookApp.ip = '*'
```
Rspecでwarningが多すぎて辛い時

# 概要
rspec実施時に出るwarningを消したい場合は、.rspecファイルとspec_helper.rbに出てくるwarningと書かれてる部分をとにかく消しまくればOK

# 背景
下のようにrspecを実施するとwarningがたくさん出て、肝心のエラーが見つけにくい

```shell-session
$ rake
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby -I/Users/hoge/.gem/ruby/2.0.0/gems/rspec-support-3.5.0/lib:/Library/Ruby/Gems/2.0.0/gems/rspec-core-3.5.3/lib /Library/Ruby/Gems/2.0.0/gems/rspec-core-3.5.3/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
/Library/Ruby/Gems/2.0.0/gems/holiday_japan-1.2.2/lib/holiday_japan.rb:65: warning: assigned but unused variable - name
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55: warning: loading in progress, circular require considered harmful - ./date.rb
...
```

# 解決策
1. .rspecの修正
2. spec_helper.rbの修正

## 1. .rspecの修正
./.rspecを下記のように修正

```diff
- --warnings
```

これだけで解決する場合もあるが、下記が同ファイルに記載されている場合は、2を実施する必要があるかもしれない

```.rspec
--require spec_helper
```


## 2. spec_helper.rbの修正
./spec/spec_helper.rbを下記のように修正

```diff
-  config.warnings = true
+  config.warnings = false
```


# 参考
* [Rspec の warning を消す](http://qiita.com/bibio/items/7549f875c99e44fdf219)
* [Guard with RSpec on Rails 4 giving a lot of warnings](http://stackoverflow.com/questions/24003316/guard-with-rspec-on-rails-4-giving-a-lot-of-warnings)
備忘録_neovimでxoを使用する


xoを導入したのでメモ

### neomakeの導入

```dein.toml
[[plugins]]
repo = 'neomake/neomake'

```


### init.vimに設定を追加

```init.vim
"================================================
"linter setting
"================================================


" 保存時に実行
autocmd! BufWritePost * Neomake

" eslint setting
let g:neomake_javascript_enabled_makers = ['xo']

```


### 対象プロジェクトにてxoを導入

```
$ npm i -D xo
```
 

これでエディタ上で保存した際にxoが走ってくれる

以上
ネイティブアプリとWebAPIでOAuth認証するときのシーケンス図

図はFacebook前提ですが、基本的には他のプラットフォームでも一緒なはず。

要点としては
* Facebookが提供しているSDKを利用
* Facebookのトークンをそのまま利用するのではなく、Facebookの情報をDBに保存後、トークンは新たに生成して次回以降のリクエストはそのトークンリクエストに付加してサーバー側で認証する

![認証.png](https://qiita-image-store.s3.amazonaws.com/0/52847/69b8f2ef-0397-f0a1-191a-a89ab79c3afc.png)

図はcacooで作成
simplepieの使い方

simplepieの使用方法がググってもあまり無かったので取り敢えず役に立つかなと思って投稿。

```php

$rss="http://headlines.yahoo.co.jp/rss/zdn_pc-c_sci.xml";

$feed=new SimplePie();
$feed->set_feed_url($rss);
$feed->enable_cache(false);
$feed->init();
$feed->handle_content_type();

foreach($feed->get_items() as $item) {
	$title = trim($item->get_title());
	$link = trim($item->get_permalink());
	$content=$item->get_content();
	preg_match("/src=\"https?:\/\/[\w\/\.\-_]+(\.)+(png|jpe?g|gif)?/msi",$content,$match);
	$img=str_replace(array("src=\"","'"),"",$match[0]);
 
        print "<a href=\"$link\" target=\"_blank\">$title</a><br>";
        if(!isset($match[0])){print "<img src=\"$img\">";}else
        {return false;}                    

}
```
Kibanaのscript定義を利用して、Timestampから曜日フィールドを作成する


# 問題
- Kibanaを用いて、曜日毎のデータ集計を行いたい。
- 曜日フィールドを設けるために、事前にデータ加工するのは手間がかかる。

# 対策
- Kibanaのscript定義を利用して、Timestampから曜日フィールドを作成する。

# 結果
- scriptの内容

	```
	(ceil((doc['@timestamp'].value + (9 * 60 * 60 * 1000)) / 1000 / 60 / 60 / 24) - 4) % 7
	```

- 説明
    - doc['@timestamp'].valueで日付のlong値表現を取得。
    - `9 * 60 * 60 * 1000`を減算することで、標準時と日本時間とのズレを補正する。
    - long値の基点となる1970/1/1は水曜日のため、`4`を減算することで、日曜日が0になるように補正する。
CentOS6.4+nginx+php-fpmの環境でwordpressを動かす

CentOS + nginx + PHP環境の構築方法はこちら
http://qiita.com/jshimazu0820/items/01f6abc2c3f3e1667d45


## MySQLクライアント、サーバーとphp-mysqlモジュールのインストール

```
yum install -y mysql
yum install -y mysql-server
yum install -y php-mysql
```

## なぜか初期画面が表示されない
ドキュメントルートにアクセスしてwordpressの初期画面が表示されると思ったら、
なぜか「お使いのサーバーの PHP では WordPress に必要な MySQL 拡張を利用できないようです。」
とエラーがでたので原因を探る


## php-mysqlの拡張モジュールはインストールされているか

```
php -m | grep mysql
mysql
mysqki
pdo_mysql
```

が表示されればOK

## php.iniの設定

```/etc/php.d/mysql.ini
extension=mysql.so
```

が記述されていればOK

## php-fpmはちゃんと再起動されているか
nginx+php-fpm構成の場合は、nginxの再起動ではなく、php-fpmを再起動する必要がある。
僕はここではまっていた

```
/etc/init.d/php-fpm restart
```

## 参考
http://blog.kujira-station.com/201501261644
[Rails][React] react-railsでReactのaddonを使う

CSSTransitionGroupを使う例


デフォルトでaddonは使えないようになっているので使えるようにする

```application.rb
config.react.addons = true
```

```Hoge.js.jsx
render() {
    const CSSTransitionGroup = React.
    return (
        <CSSTransitionGroup>
        </
    );
} 
```
null チェックをいちいち書かないで action を実行する方法

#コード
```csharp
public class Hoge() {

    public void Example() {
        Action            act   = null;
        Action<int>       act2  = null;
        Func<string>      func  = null;
        Func<int, string> func2 = null;
        UnityAction       uact  = null;
        UnityAction<int>  uact2 = null;

        // act(); // NullReferenceException

        act.NullSafe();
        act2.NullSafe( 1 );
        Debug.Log( "func:"  + func.NullSafe()   + ";" ); // "func:;"
        Debug.Log( "func2:" + func2.NullSafe(1) + ";" ); // "func2:;"
        uact.NullSafe();
        uact2.NullSafe( 1 );
    }
}

public static class ActionExtensions {

    public static void NullSafe( this Action action ) {
        if (action!=null) { action(); }
    }

    public static void NullSafe<T>( this Action<T> action, T arg ) {
        if (action!=null) { action(arg); }
    }
}

public static class FuncExtensions {

    public static TResult NullSafe<TResult>( this Func<TResult> func ) {
        return func!=null ? func() : default(TResult);
    } 

    public static TResult NullSafe<T, TResult>( this Func<T, TResult> func, T arg ) {
        return func!=null ? func(arg) : default(TResult);
    }
}

public static class UnityActionExtensions {

    public static void NullSafe( this UnityAction action ) {
        if (action!=null) { action(); }
    }

    public static void NullSafe<T>( this UnityAction<T> action, T arg ) {
        if (action!=null) { action( arg ); }
    }
}
```

#経緯
Unity いじってて
`if (action!=null) { action(); }` って書くのめんどくせ
と思ったので拡張メソッドを書いた
が、ジェネリック部分で詰まったので例によって Stackoverflow を参考にした

>http://stackoverflow.com/questions/872323/method-call-if-not-null-in-c-sharp

別に拡張しなくても
**`action?.Invoke()`**
という書き方ができるみたいだけど
これは **C# 6.0** から使える書き方で、Unity では不可っぽいので素直に拡張しちゃおうね～

え？ いちいち .NullSafe() とか書くのめんどい？
if 書くよりマシだろ！

#備考
検索してる時は英語ページしかでてこなくて、なんでや！
と憤ったが
ひととおり記事を書き終わった後に日本語ページを見つけた

>【C#】Actionデリゲートのnullチェックを省略するための拡張メソッド
http://baba-s.hatenablog.com/entry/2014/04/09/182626

そうか null チェックか・・・ それで検索すればよかったか・・・
俺はアホか・・・(´・ω・\`)

#あんまり関係ないおまけ
C# には **?? 演算子** とかいうのがある（読み方不明）
action が null の時、新しい action を代入しとく
という処理は
`action = action ?? delegate { Debug.Log("action"); };`
という感じで実現できる

今回の件に使えるかと思ったけど、別になにも使えなかった
iOS10 イメージ付きNotificationで詰まったこと(ローカル通知)

#やろうとしたこと
1.Viewをキャプチャして保存
2.指定曜日のn時に通知を一斉登録
　ex.(月),(火),(水) 19:00に通知
3.↑に画像付きの通知にする
#ダメだったこと
1.ローカルに保存した画像ファイルを指定
2.保存した1つの画像ファイルを複数の通知で登録
#どうしたか？
1.->(ダメ1).pngや.jpgとサポートされているファイル形式で命名
2.->(ダメ2)同じデータファイルを別名ファイルで複数用意
 ex. image.png を image-1.png, image-2.png, image-3.png ...と保存

2.に関しては容量を無駄に喰ってスマートではないので、通知直前で画像読み込みを行った方がスマート。

いや、書いたこと違うぜよ。。ちゃんとできるで。
という方、ぜひご教授ください。
MacOSXでpostgresSQLのインストール→起動→ログイン→停止

### 環境
OS: Mac.OS 10.10
brew: 0.9.5
psql (PostgreSQL): 9.4.1

ローカル環境でたまにPostgreSQLを使う機会があるが、
そのたびにググって時間とられるのでシンプルに備忘録

### インストール

```
brew install postgresql
```

出力をみるとインストールと一緒に起動まで行われている

```
==> Downloading https://homebrew.bintray.com/bottles/postgresql-9.4.1.yosemite.bottle.1.tar.gz
Already downloaded: /Library/Caches/Homebrew/postgresql-9.4.1.yosemite.bottle.1.tar.gz
==> Pouring postgresql-9.4.1.yosemite.bottle.1.tar.gz
==> Caveats
If builds of PostgreSQL 9 are failing and you have version 8.x installed,
you may need to remove the previous version first. See:
  https://github.com/Homebrew/homebrew/issues/2510

To migrate existing data from a previous major version (pre-9.4) of PostgreSQL, see:
  http://www.postgresql.org/docs/9.4/static/upgrading.html

To have launchd start postgresql at login:
    ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
Then to load postgresql now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Or, if you don't want/need launchctl, you can just run:
    postgres -D /usr/local/var/postgres
==> Summary
🍺  /usr/local/Cellar/postgresql/9.4.1: 2996 files, 40M


```

※ バージョンによってはできるらしいが、自分のバージョンだとどうやらbrewでインストールすると自分で起動・停止ができないらしい


### 起動

```
postgres -D /usr/local/var/postgres
```

### 停止
```
pg_ctl -D /usr/local/var/postgres stop
```

### コンソールログイン
```
psql 
```


### コンソール終了
```
\q
```

### 参考：

psqlの使いかた
http://ash.jp/db/pg_psql.htm
textareaのplaceholderで改行されず突き抜ける

どうしても改行ができない機種があるようです。
（Firefox, Android一部機種）

W3C仕様に従順なFirefoxが対応していないということで、仕様を確認したところ、

https://www.w3.org/WAI/GL/wiki/Using_@placeholder_on_input

> The placeholder attribute is applied to the input element, and must have a value that is a short hint, word or phrase.

「input element向けのもので、短くまとめなさい。」 ということで、textareaで長文のケースには公式で対応していないようです。
PHPで無名関数を使用した場合のスコープの継承について

PHP5.3から無名関数が使えるようになったので調子に乗って使っていたらスコープ周りでハマったのでめも


```php
$message = "Hello World!!";

$func = echoMessage() {
    echo $message;
}

$func();

```

これだと
Hello Worldは表示されない
表示させたい場合はuseでスコープ継承する必要がある

```php

$message = "Hello World!!";

$func = echoMessage() use($message){
    echo $message;
}

$func();

```


## 参考
http://php.net/manual/ja/functions.anonymous.php
D3.jsを扱うときに理解しておくとはかどるポイント

D3.jsはSVGでのグラフ描画を手助けしてくれるJavascriptのポピュラーなライブラリです。
Githubでのスター数を見ても、相当人気であることが伺えます。（現時点で38k) 

ただ、便利ではあるのですが、いくつかクセのある部分があり誰もがきっと苦労すると思ったので、そのポイントをまとめてみました。

※ D3.jsを触ったことがない方は以下のチュートリアルをさくっとやってみてから本記事をみるとより参考になるかと思います。

D3.jsチュートリアル（日本語訳版）：
http://ja.d3js.info/alignedleft/tutorials/d3/

## d3.jsは使わずにSVGだけでグラフを書いてみる
チュートリアルにはないですが、D3.jsを扱う前に、SVGだけで
\<rect\>, \<g\>, \<path\>, \<circle\> をいじってみましょう。
それぞれにHTMLタグでは見られない独自の属性をもっています。
rect, circleあたりは簡単ですが、pathを使って円グラフを書こうとするとしんどいはずです。

## Path Generatorの存在を知る
チュートリアルではd3.svg.axis()しか使ってないですが、
その他d3.svg.line(), d3.svg.arc()がグラフ作成に有効です。これのお陰で、前述のpathで円弧を書いたりしなくてもよい恩恵が得られます。
https://github.com/mbostock/d3/wiki/SVG-Shapes#line

## グラフの体裁を整えるための強引なCSSでの位置寄せ
ここが個人的には一番ストレスになりました。思い通りのレイアウトのグラフが描けない・・Otz
軸（axis)や判例(tick)を表示するのに、CSSのtransform: translateが必要になります

## 直感的でない独特なメソッドを理解する
data()
enter()
一つにまとめてくれてもいいのでは・・・と誰もが思うツッコミどころですが、一度理解してしまえば間違えはしないのでここは目をつぶりスルー。

domain() → 入力値の最小値、最大値
range() → 出力値の最小値、最大値
outputRangeとか、inputRangeとかいう名前をつけてくれれば直感的だったのに・・


## まとめ
以上を乗り越える工夫ができれば、きっとD3.jsをつかって自在にグラフを描くことができるようになるはず・・・！
データ可視化ができると、エンジニアとしての市場価値もあがるので頑張りましょう！

参考記事: D3.jsがとっつきにくい理由
http://blog.phiyard.net/entry/2014/10/26/010822
SoftetherVPNの言語設定をEngilishへ変更

# 概要
* ログ監視で日本語表記だと対応が面倒な事があるので言語設定をEnglishへ変更したい

# 対象ファイル
* SoftetherVPNのインストールディレクトリにある lang.config 中で ja を en に変更

```
～
# Available Language IDs are:
#  ja: Japanese (日本語)
#  en: English (English)
#  cn: Simplified Chinese (?体中文)


# Specify a Language ID here.
en
```

* サービスを再起動で ログが英語で出力されている事を確認する
Digdagのsh>の環境変数

```
$ cat a.dig
timezone: Asia/Tokyo

_export:
  var1: var1value

+a:
  _export:
    var2: var2value
  sh>: env
$ digdag run a.dig
2017-01-05 11:51:35 +0900: Digdag v0.9.1
2017-01-05 11:51:38 +0900 [WARN] (main): Using a new session time 2017-01-05T00:00:00+09:00.
2017-01-05 11:51:38 +0900 [INFO] (main): Using session /home/vagrant/tmp/.digdag/status/20170105T000000+0900.
2017-01-05 11:51:38 +0900 [INFO] (main): Starting a new session project id=1 workflow name=a session_time=2017-01-05T00:00:00+09:00
2017-01-05 11:51:41 +0900 [INFO] (0016@+a+a): sh>: env
～以下めぼしい行のみ～
project_id=1
timezone=Asia/Tokyo
var1=var1value
var2=var2value
session_uuid=2f981bc2-1ce5-4c1a-ac82-d1ca53b766b2
session_date=2017-01-05
session_date_compact=20170105
session_time=2017-01-05T00:00:00+09:00
session_local_time=2017-01-05 00:00:00
session_unixtime=1483542000
session_tz_offset=+0900
last_executed_session_date=
last_executed_session_date_compact=
last_executed_session_time=
last_executed_session_local_time=
last_executed_session_unixtime=
last_executed_session_tz_offset=+0900
～ここまでめぼしい行のみ～
Success. Task state is saved at /home/vagrant/tmp/.digdag/status/20170105T000000+0900 directory.
  * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
  * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
```

see http://docs.digdag.io/workflow_definition.html#using-variables

サーバモードでもほぼ同じ、ただしproject_idがそれなりの値になるのと、「--session now」とすると以下のように時刻が設定される(もちろんローカルモードでも「--session "2017-01-01 01:01:01"」とかつければ設定される)

```
session_local_time=2017-01-05 11:57:27
session_time=2017-01-05T11:57:27+09:00
```

last_executed_session_dateとか使う予定ないけどどういうときに設定されるのかな
digファイルの中に`schedule:`を書いたときかも
framer-material-kitを試す

# framer-material-kitとは
![framer-material-kit](https://camo.githubusercontent.com/4e8a7bc2534e27d64edfcb9fa6d74a71a9788a6b/68747470733a2f2f646c2e64726f70626f7875736572636f6e74656e742e636f6d2f752f3134333237303535362f6d6174657269616c2d6b69742f6c6f676f2e706e67)
[k-vyn/framer-material-kit](https://github.com/k-vyn/framer-material-kit)

framer.jsのプロトタイプ上でマテリアルデザインのアニメーションを使うときにコマンド入力一つでsnackbarやダイアログといったコンテンツを作ることができるようになるモジュール

# 導入手順
 - モジュールを[ダウンロード](https://github.com/k-vyn/framer-material-kit/archive/master.zip)
 - framer-material-kit-master > Material Kit Module　をFramerプロジェクトのModuleフォルダに入れる
 - プロジェクトの１行目に```m = require "material-kit"```と記述

# このモジュールでできること
コマンド１行書くだけで、
androidの画面でよく使うsnackbarやdialog, ripple効果といった要素を
framerプロジェクトに付け加えることができます
![capture_06.gif](https://qiita-image-store.s3.amazonaws.com/0/54076/4c4245ce-7174-fbf7-1bba-80a3b0c62cb2.gif)


# Modules
### status Bar
![status bar](https://camo.githubusercontent.com/adb3fbd1f9a0227554066820612f42c1e8de2aef/68747470733a2f2f646c2e64726f70626f7875736572636f6e74656e742e636f6d2f752f3134333237303535362f6d6174657269616c2d6b69742f7374617475736261722e706e67)
画面の上にあるアレ。背景色も塗り色も変えられる

```
status = new m.StatusBar
	color:"white"
```

### Navigation Bar
![nav bar](https://camo.githubusercontent.com/16e1be4251853e89788c69ca74f9140e838cc8b4/68747470733a2f2f646c2e64726f70626f7875736572636f6e74656e742e636f6d2f752f3134333237303535362f6d6174657269616c2d6b69742f6e61762e706e67)
画面の下にあるボタン類。押した時のホバーエフェクトもリアル

```
nav = new m.NavBar
```

### Button
![ボタン類](https://camo.githubusercontent.com/d81c16d752966642f4831fda5ca7c55aaea6ca9f/68747470733a2f2f646c2e64726f70626f7875736572636f6e74656e742e636f6d2f752f3134333237303535362f6d6174657269616c2d6b69742f627574746f6e732e706e67) 
エレベーションもfloating, raised, flatの３段階で調整できる

```
button = new m.Button
text:"Download"
　　　　type:"raised"
```

### Snackbar
![snack bar](https://camo.githubusercontent.com/c9e80df5719e07945529356e244375ab329aa643/68747470733a2f2f646c2e64726f70626f7875736572636f6e74656e742e636f6d2f752f3134333237303535362f6d6174657269616c2d6b69742f736e61636b6261722e706e67)

```
snack = new m.SnackBar
	text:"I'm afraid you can't do that."
	action:"Retry"
```

###  Dialog
![dialog](https://camo.githubusercontent.com/6c790432e9d8085271249bbb0bd6c5c1d14e57e5/68747470733a2f2f646c2e64726f70626f7875736572636f6e74656e742e636f6d2f752f3134333237303535362f6d6174657269616c2d6b69742f6469616c6f672e706e67)

```
dialog = new m.Dialog
	title:"Warning"
	message:"Don't do this"
	actions:["OK", "Cancel"]
```

### Ripple効果
![capture_02.gif](https://qiita-image-store.s3.amazonaws.com/0/54076/26e8dd39-80a9-1ff2-c35e-b0d97f1f955f.gif)
リップルもレイヤーを指定して簡単に作れる
```
m.utils.inky
	layer: thumbnail #レイヤー名
	color: 'red' #rippkeの色
```
他にもたくさんあります

# モジュールをアニメーション操作する
### モジュール要素をアニメーションさせる
モジュールによって生成された要素は、基本的に、layerと同じようにプロパティを追加し、扱うことができます。
### Stackを活用せよ
何も記述しないでモジュールを宣言・追加すると、
画面を読み込んで最初にそのモジュールが現れる。snackbarやdialogはユーザーが何がしかのアクションをしてから表示されるものなので、これでは都合が悪い。そこでstackの出番。stackはその名の通り"物置"。```m.addToStack(layer)```と書き込んでやることで、最初に要素が表示されるのを防ぐ。

以上です。

[Dynamic Layout](https://github.com/k-vyn/framer-material-kit#dynamic-layout)についても時間のあるときにまとめて取り上げようと思います
開発でのDocker②

[開発でのDocker①](http://qiita.com/takaheraw@github/items/93bc048ae594b8110273)の続き

# やること

+ テキスト入力をPOSTして画像を表示するWebアプリ
+ 画像を返却するAPIサーバは既存のdnmonsterイメージを利用
+ Redisサーバは既存のイメージを利用


# Webアプリ

```py
from flask import Flask, Response, request
import requests
import hashlib
import redis

app = Flask(__name__)
cache = redis.StrictRedis(host='redis', port=6379, db=0)
salt = "UNIQUE_SALT"
default_name = 'Joe Bloggs'


@app.route('/', methods=['GET', 'POST'])
def mainpage():

    name = default_name
    if request.method == 'POST':
        name = request.form['name']

    salted_name = salt + name
    name_hash = hashlib.sha256(salted_name.encode()).hexdigest()
    header = '<html><head><title>Identidock</title></head><body>'
    body = '''<form method="POST">
              Hello <input type="text" name="name" value="{0}">
              <input type="submit" value="submit">
              </form>
              <p>You look like a:
              <img src="/monster/{1}"/>
              '''.format(name, name_hash)
    footer = '</body></html>'

    return header + body + footer


@app.route('/monster/<name>')
def get_identicon(name):

    image = cache.get(name)
    if image is None:
        print ("Cache miss", flush=True)
        r = requests.get('http://dnmonster:8080/monster/' + name + '?size=80')
        image = r.content
        cache.set(name, image)

    return Response(image, mimetype='image/png')

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')
```

# Dockerfile

```
FROM python:3.4

RUN groupadd -r uwsgi && useradd -r -g uwsgi uwsgi
RUN pip install Flask==0.10.1 uWSGI==2.0.8 requests==2.5.1 redis==2.10.3
WORKDIR /app
COPY app /app
COPY cmd.sh /

EXPOSE 9090 9191
USER uwsgi

CMD ["/cmd.sh"]
```

# docker-compose.yml

```
identidock:
  build: .
  ports:
    - "5000:5000"
  environment:
    ENV: DEV
  volumes:
    - ./app:/app
  links:
    - dnmonster
    - redis

dnmonster:
    image: amouat/dnmonster:1.0


redis:
    image: redis:3.0
```

# 起動

```
# docker-compose build
# docker-compose up
```

# イメージの配布

```
# docker tag "identidock:0.1" "takaheraw/identidock:0.1"
# docker push takaheraw/identidock:0.1
```
開発でのDocker①

[はじめてのDocker](http://qiita.com/takaheraw@github/items/b7855a4dfe518aab7ae2)の続き

# やること

+ Hello World Webアプリ
+ DEV環境がflask単体起動、PRODUCT環境がwsgi+flaskで起動

## Hello World Webアプリ用意

```
# mkdir -p identidock/app
# cd identidock
# vi app/identidock.py
```
```py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello Docker!\n'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')
```
## Dockerfile

```
# vi Dockerfile
```
```
FROM python:3.4

RUN groupadd -r uwsgi && useradd -r -g uwsgi uwsgi
RUN pip install Flask==0.10.1 uWSGI==2.0.8
WORKDIR /app
COPY app /app
COPY cmd.sh /

EXPOSE 9090 9191
USER uwsgi

CMD ["/cmd.sh"]
```
```
# vi cmd.sh
```
```shell-session
#!/bin/bash
set -e

if [ "$ENV" = 'DEV' ]; then
  echo "Running Development Server"
  exec python "identidock.py"
else
  echo "Running Production Server"
  exec uwsgi --http 0.0.0.0:9090 --wsgi-file /app/identidock.py --callable app --stats 0.0.0.0:9191
fi
```
```
# chmod +x cmd.sh
```

### 起動

```
# docker run -e "ENV=DEV" -p 5000:5000 identidock
```

## Composeを使った自動化

### install

```
# sh -c "curl -L https://github.com/docker/compose/releases/download/1.5.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose"
# chmod +x /usr/local/bin/docker-compose
```

### docker-compose.yml

```
# vi docker-compose.yml
```
```
identidock:
  build: .
  ports:
    - "5000:5000"
  environment:
    ENV: DEV
  volumes:
    - ./app:/app
```

### 起動

```
# docker-compose up
```