OmniAICreator/Qiita-1.07M huggingface dataset:
zabbixを使ってRDS for Auroraの内部ステータスを取得してみました。

#目的
Aurora のステータス情報をzabbixで取得したい

#手法
Auroraををzabbixで直接参照することはできない（RDSにzabbix-Agentは入らないので）
代替えのインスタンスを起動して、EC2のAgentを使ってAWS Auroraから値を取得する。

#検証環境

・Aurora　5.6.10a 
・Auroraエンドポイント用のEC2インスタンス（zabbixサーバへ登録済み）
・zabbixサーバ



#詳しい手順

Auroraへzabbix監視ユーザの登録

```mysql
grant process on *.* to 'zabbix'@'%' identified by 'zbxpass';
```

EC2インスタンスに.my.cnfの作成

```bash
$ sudo mkdir /var/lib/zabbix
$ sudo vim /var/lib/zabbix/.my.cnf
$ sudo chmod 400 /var/lib/zabbix/.my.cnf
$ sudo chown -R zabbix:zabbix /var/lib/zabbix
```

.my.cnfの中身

```bash
[client]
user = zabbix
password= zbxpass
```

/etc/zabbix/zabbix_agentd.d/userparameter_mysql.confの編集

```bash
変更前
UserParameter=mysql.status[*],echo "show global status where Variable_name='$1';" | HOME=/var/lib/zabbix mysql -N | awk '{print $$2}'
変更後
UserParameter=mysql.status[*],echo "show global status where Variable_name='$1';" | HOME=/var/lib/zabbix mysql -hxxxxxxx.cluster-xxxxxxx.ap-northeast-1.rds.amazonaws.com -N | awk '{print $$2}'
```

```bash
変更前
UserParameter=mysql.size[*],bash -c 'echo "select sum($(case "$3" in both|"") echo "data_length+index_length";; data|index) echo "$3_length";; free) echo "data_free";; esac)) from information_schema.tables$([[ "$1" = "all" || ! "$1" ]] || echo " where table_schema=\"$1\"")$([[ "$2" = "all" || ! "$2" ]] || echo "and table_name=\"$2\"");" | HOME=/var/lib/zabbix mysql -N'
変更後
UserParameter=mysql.size[*],bash -c 'echo "select sum($(case "$3" in both|"") echo "data_length+index_length";; data|index) echo "$3_length";; free) echo "data_free";; esac)) from information_schema.tables$([[ "$1" = "all" || ! "$1" ]] || echo " where table_schema=\"$1\"")$([[ "$2" = "all" || ! "$2" ]] || echo "and table_name=\"$2\"");" | HOME=/var/lib/zabbix mysql -hxxxxxxx.cluster-xxxxxxx.ap-northeast-1.rds.amazonaws.com -N'
```

```bash
変更前
serParameter=mysql.ping,HOME=/var/lib/zabbix mysqladmin ping | grep -c alive
変更後
serParameter=mysql.ping,HOME=/var/lib/zabbix mysqladmin -hxxxxxxx.cluster-xxxxxxx.ap-northeast-1.rds.amazonaws.com ping | grep -c alive
```

これで疑似的にEC2上で動くMySQLとして認識されるのでRDSでTemplate App MySQLを利用することができる。

クラスタエンドポイントや、読み込みエンドポイントをそれぞれ指定すれば
両方のステータス値が取得できる。

デメリットとして、RDSが複数ある場合、その台数分の代替えインスタンスが必要になるが
zabbix-agentを動かすだけなら、t2.nanoでも十分かも。
PHPExcel でセルの幅をうまく調整する

## はじめに
PHPExcelというライブラリがあります。PHPでExcelファイルを生成したり出来るので便利です。

```php

$sheet->getColumnDimension('A')->setAutoSize(true);
```
なんてするとカラムの幅を自動調整してくれる、みたいな記事が出回ってるのですが、実際のところ、これできちんとカラムの幅が整うことはないと思ってほうがよいです。これは日本語フォントを使ってるときだけではなく、アルファベットのフォントでもいまいちきちんと計算されてないぽいです。

これをどうにかします。

## どうするか
以下、コメントを入れつつ書いていきます。

```php

//自動調整を有効にします。
$sheet->getColumnDimension('A')->setAutoSize(true);
//これをだと -1 が表示されます。
echo $sheet->getColumnDimension('A')->getWidth();

//以下のメソッドをまわすことで実際の幅が計算され、格納されるぽいです。
$sheet->calculateColumnWidths();

//ここがミソ。これを設定しておかないと以下のsetWidth()が無視されます。
$sheet->getColumnDimension('A')->setAutoSize(false);

//これをだと 8.140869 などと表示されます。
echo $sheet->getColumnDimension('A')->getWidth();
$width = $sheet->getColumnDimension('A')->getWidth();

// 50%増しにしてみました。もともとのカラムの幅によってそこまでは必要ないことも多いと思いますが、とりあえず。
$sheet->getColumnDimension('A')->setWidth($width * 1.5);

//12.2113035 という値になります。
echo $sheet->getColumnDimension('A')->getWidth();

```
このあと、ブックを保存するとよいです。

## まとめ
PHPExcelは便利なんだけど、落とし穴が多いです。ハマると抜け出すのは大変なので、頑張って抜け出しましょう。
Unityでシリアル通信を行う


# はじめに

Unityでシリアル通信を行う時、だいたいの人はトラブルにぶつかるらしい。しかしどうもトラブルの原因や対処方法はOS、Unityのバージョン、通信対象の機器によって変わってくるように思える。

トラブルにぶつかった人が冷静に自分の状況を把握する助けになるよう、このページにいくつかの事項をまとめる。

ここに挙げられていないUnityのシリアル通信における事実をご存知の方は、ぜひ[@tnayuki](https://twitter.com/tnayuki)までメンションしてほしい。

# 確定的な事項

いくつか確定的な事項をあげる。

## API Compatibility Levelの変更

Unityからシリアル通信を行うSystem.IO.Ports.SerialPortクラスを使うためには、Player SettingsにあるAPI Compatibility Levelを.NET 2.0 Subsetから.NET 2.0に変更する必要がある。

これは.NET 2.0 SubsetにはSystem.IO.Ports.SerialPortクラスが含まれないため。

## SerialPortクラスのOnDataReceivedイベントは呼ばれない

データを受信した場合に呼ばれるはずのOnDataReceivedイベントは決して呼ばれない。
これはUnityが使っている[monoのソースコード](https://github.com/Unity-Technologies/mono)を検索するとわかる。誰もOnDataReceivedを呼んでいない。

# 未確定な事項

## SerialPortクラスのBytesToReadプロパティはWindowsで正しい値を返さない

自分自身では確認していないが、SerialPortクラスのBytesToReadプロパティはWindowsでは正しい値を返さない、らしい。これと上の「OnDataReceivedイベントは呼ばれない」件が組み合わさることによって、別スレッドでポーリングする、短めのタイムアウトを設定してReadするなどのつらみが発生しているようだ。

## Arduinoのシリアル通信はハードウェアフロー制御に対応していない

調査した限り、Arduinoのシリアル通信はハードウェアフロー制御(RTS/CTS)に対応していない。そのため、Arduino側の受信バッファを超えるデータをPCから送信/PC側の受信バッファを超えるデータをArduinoから送信するとデータが失われる(文字落ち)可能性があるのではないか。
ソフトウェアフロー制御(Xon/Xoff)に対応しているかは不明(自前で実装する必要がある？)。

また、DTRはファームウェア書き込み時にArduinoをリセットするために用いられているようだ。これだとうっかりPC側でDTRをオン(Lowレベル)にしてしまった場合、Arduinoがリセットされ、不安定な挙動になるのではないだろうか。
Delphi入れてみた

昔は無償版があっていろんなフリーソフト出てたんだけど、そのあとはしばらく有償版だけになって、去年くらいに再び無償版が出たみたいで、試しに入れてみた。
Delphiは昔、Delphi6 Professional買って趣味的なプログラムは作ってたことがあるんで、懐かしいな。

IDEは昔とコンポーネントパレットの位置が変わってるくらいで、だいたい一緒かな。
とりあえず定番なのを書いて動かす。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/151329/42c8d0d1-1131-cf71-8c62-d400650bbe51.png)



無償版でビルドできるのはWindowsの32bitアプリのみだけどコンポーネントはかなりの数あるし
いろいろ遊べそう。

有償版はアンドロイドやiosアプリも作れるらしい。

DelphiはObject Pascalだけど、言語をC++にした
C++Builderもある。こっちも無償版あり

ここ(Qiita)に書くネタ用にいろいろやってみるか、仕事でよく使うC,C++と対比させるのも面白いかもしれない
setAttributedTitleへのnil渡しに注意

`setAttributedTitle:forState:`へのnil渡しについて、
少し不思議な挙動をするので、覚書として。

#概要
通常、ボタンのタイトル設定は
・ただタイトルを設定する場合は、`setTitle:forState:`
・文字装飾したタイトルを設定する場合は、`setAttributedTitle:forState:`
となります。

**ただし、文字列にnilを渡した場合、
`setAttributedTitle:forState:`は`setTitle:forState:`と異なる挙動をします。**

#動作確認
以下のスクリーンショットは
上は、`setTitle:forState:`にnil渡し
下は、`setAttributedTitle:forState:`にnil渡し
です。
![スクリーンショット 2017-02-14 21.09.10.png](https://qiita-image-store.s3.amazonaws.com/0/46091/dc766a83-9d99-de25-3c29-568166a0de62.png)

`setTitle:forState:`は空文字になっていますが、
`setAttributedTitle:forState:`は、InterfaceBuilderで設定したままのタイトルです。

**`setAttributedTitle:forState:`へのnil渡しは、
以前に`setTitle:forState:`でセットした文字列、
もしくは`setTitle:forState:`を未設定の場合は、InterfaceBuilderで設定したテキストになります。**

ちなみに、一度`setAttributedTitle:forState:`で文字列を設定してある場合でも、
再度`setAttributedTitle:forState:`でnil渡しを行うと、
`setTitle:forState:`やInterfaceBuilderの設定に戻ります。

nilでなく、空文字(@"")の`NSAttributedString`を渡した場合でも同様の結果になります。

#つまるところ
イマイチ理解に苦しむ挙動です。
`setAttributedTitle:forState:`にnil渡しは、極力避けるべきでしょう。
potatotips #36 Androidまとめ

1/13　マネーフォワードさん開催 potatotips#36 のまとめです!
くつろげる雰囲気の会議室で行われました。執務エリアのど真ん中にもくつろぎスペースがあり、アイディアベースの雑談するのに楽しそうです。

# 実際Xamarinってどうなの？
資料：https://speakerdeck.com/koutalou/shi-ji-xamarintutedounafalse
発表：[koutalou](https://github.com/koutalou)さん
XamarinにはNative AppとXamarin.form Appの種類があり、iOSとAndroidそれぞれのプラットフォームを生かしたUIにするなら、Native Appがいいそうです。
toBでWindows向けのアプリケーション開発するなら、開発コスト抑えるのに検討しても良さそうですね。

# GitHubでみるOSSライブラリ導入の判断指標
資料：https://speakerdeck.com/yoichitgy/githubdemiruossraiburaridao-ru-falsepan-duan-zhi-biao-potato-tips-number-36
発表：[yoichitgy](https://github.com/yoichitgy)
tokoroさんのツイート：全体に関わるライブラリはメンテされていることを参考に検討、ちょっと画面で使いたい程度であればカジュアルに使っちゃう->なるほど。
というわけで、GitHubでのOSSが活発な基準の見方を紹介されました。
定期的にメンテされているのは、大事なポイントですね。

# AndroidのLayout Parseがクソすぎるので助けてAsyncLayoutInflater！！
発表：[operandoOS](https://twitter.com/operandoOS)さん
layoutのパースってメインスレッドでやってたんですね、目から鱗です。
- LayoutInflator: UIThread でxmlパースされる
- AsyncLayoutInflater: 非同期でパースできる


# yokomakuさん
資料：https://speakerdeck.com/keithyokoma/resource-management-in-robolectric
発表：[KeithYokoma](https://github.com/KeithYokoma)さん
Robolectricのコアなお話。
material icons

#概要
MaterialDesignLite のアイコンを一覧してみた。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/S/U/b/SUbm.jpg?t=1487075456)

#成果物

http://jsdo.it/ohisama1/SUbm

#大元

https://getmdl.io/
CakePHP3のハマリどころ：孫associationを指定する記法はメソッドによって異なる

Cakephp3を使っていると頻出する`association`指定について、特に孫associationを指定する場合の記法が意外と難しいのでまとめました。

# パターン1. クエリビルダのcontain
CakePHP3をやっていると一番馴染み深いパターンではないでしょうか。
ただ、この書き方だけ知っていると、他ではまることも・・・。

```php
'contain' => [
  'Childs' => [
    'GrandChilds',
    'OtherGrandChilds'
  ]
  ...
]
```

# パターン2. `Entity->newEntity()` など

こちらが比較的はまりがちのパターンで、パターン1と同じように書いてしまうと、
孫アソシエーションがうまく働いてくれません。
特にエラーメッセージなども出ないので、孫エンティティの一括登録を諦めてしまう人もいるのではないでしょうか（私です）

該当するメソッドはこちらになります。(他にもありましたらコメントお願いします）
- `Entity->newEntity()` , `patchEntity()` , `save()`
- `FormHelper->create()` のcontext=>validatorオプション

記法としては2種類存在します。

## `.`繋ぎで深い関連を指定するパターン

```php
Users->newEntity($data, [
        'associated' => [
            'Childs' => [
                'validate' => 'register'
            ],
            'Childs.GrandChilds' => [
                'validate' => 'register'
            ],
            'Childs.OtherGrandChilds' => [
               'validate' => 'register'
            ],
        ], 
    ]);
```

ポイントとしては、

- 配列のネストではなく、`.`繋ぎで、より深い関連を指定する
- テーブル名のネスト配列には`validate`を指定する(省略された場合には `defaultValidator` が呼び出されます)

`FormHelper->create()` のcontext=>validatorで書く場合はこんな感じになります。

```php
$this->Form->create($user,[
                    'type' => 'post',
                    'url' => [
                        'action' => 'save',
                        'controller' => 'user',
                    ],
                    'context' => [
                        'validator' => [
                            'Childs' => 'default',
                            'Childs.GrandChilds' => 'order',
                            'Childs.OtherGrandChilds' => 'order'
                        ]
                    ],
                ])
```


# `associated ` オプションを入れ子で使用する

こちらは公式の[データの保存](https://book.cakephp.org/3.0/ja/orm/saving-data.html)に書かれている方法です。

```php
// 入れ子になったアソシエーション付きの新しいエンティティ
$articles->newEntity($data, [
    'associated' => [
        'Tags', 
        'Comments' => [
            'associated' => ['Users']
        ]
    ]
]);
```

子エンティティの配列の中に、さらに`associated`オプションを指定する感じですね。
(試してないのですが、こちらの記法で`FormHelper->create()`はどう書くのでしょう・・・。validatorのなかにassociatedを書くのでしょうか。

------

いかがでしょうか。個人的には `.`区切りの記法のほうがネストが複雑にならず、シンプルに書けるイメージです。
ちょっと高機能な掛け算九九表

jQueryを使って、最終的には下記のようなハイライト機能を持ったかけ算九九表を作ります。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/27816/3aab5b9c-9a42-673b-2d74-67808f4fb9cf.png)

- - -
## デモ
- デモ: https://sutara79.github.io/demo-kuku/
- ソースコード: https://github.com/sutara79/demo-kuku

- - -
## 基本
for文を入れ子にして行と列を作ります。
jQueryを使っているのでお手軽です。

```js
let table = $('<table>').appendTo('body');
let row, col;
for (row = 1; row < 10; row++) {
  let tr = $('<tr>').appendTo(table);
  for (col = 1; col < 10; col++) {
    $('<td>').text(row * col).appendTo(tr);
  }
}
```

- - -
## 見出しをつける
計算結果の表だけでなく、行と列にそれぞれ見出しをつけます。
まず、for文の初期値を`1`から`0`へ変更し、見出しを置く余地を作ります。
そして、前章では`<td>`タグを置くだけだった箇所に分岐を設けて、行と列の始まりでは`<th>`タグで見出しを置くようにします。

```js
if (row === 0 && col === 0) {
  // 縦と横の見出しが交差するセル
  $('<th>').text('×').appendTo(tr);
}
else if (row === 0) {
  // 横軸の見出し
  $('<th>').text(col).appendTo(tr);
}
else if (col === 0) {
  // 縦軸の見出し
  $('<th>').text(row).appendTo(tr);
}
else {
  // かけ算の結果
  $('<td>').text(row * col).appendTo(tr);
}
```

- - -
## 行・列数を柔軟に
行・列数をハードコーディングせず、引数で渡すようにします。
ES2015は初期値を設定できるので便利ですね。

```js
/**
 * 行・列数が自由な九九表
 * @param {number} [orig_row=9] - 九九表の行数
 * @param {number} [orig_col=9] - 九九表の列数
 */
function kukuFlexible(orig_row = 9, orig_col = 9) {
```

- - -
## ハイライト機能
最後に、冒頭に挙げたハイライト機能を追加します。
以下のような処理を行っています。

1. `<td>`でマウスオーバーを検知する。
2. その`<td>`が属する`<tr>`のインデックスを取得する。(縦の座標)
3. (2)の`<tr>`内での`<td>`のインデックスを取得する。(横の座標)
4. 座標を元に行と列をハイライトする。
5. マウスオーバーしている`<td>`は別のCSSクラスでハイライトする。
CORESERVERでCakePHP3を動かす

環境依存度が低く、そのへんのレンタルサーバーにそのまま設置すればそのまま動くと言うことで好評を得ていた[要出典] CakePHP2ですが、CakePHP3をはじめ最近のPHPフレームワークではphp-intlを求められることが多く、そのままでは動かない場合があります。

ぼくが普段使っているCORESERVERでもデフォルトではphp-intlは読み込まれておらず、なんとか力ずくでphp-intlを読み込ませようと思ったら、思いのほか簡単な手順でphp-intlを有効にできたので、それを紹介したいと思います。

## PHPの実行バージョンを5.6(以上)にあげる

PHP5.3だとphp-intlが無いのですが、CakePHP3の要件に合わせてPHPの実行バージョンを上げるだけでphp-intlが読み込まれるようになります。
マジでCORESERVER神。

<img width="1067" alt="スクリーンショット 2017-02-14 21.36.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/16060/6e0824df-d1c6-7163-2889-b254cd4bd776.png">


## 補足

たぶんXREAやCORE-MINIでも同じです。
5 優先順位付けの括弧に対応する

# はじめに

以前の記事で[インタプリタにprintlnを追加](http://qiita.com/quwahara/items/82067b00cbe1cb974e4a)しました。
その過程でLexerへ`(`と`)`を解析する機能を加えました。
加えたついでに括弧による演算の優先順位付けにも対応しましょう。

# 優先順位付けの括弧対応でやりたいこと

説明の必要もないと思いますが、例えば下のようなプログラムがあったら、計算結果`a`の値が`35`になることを目指します。

```JS
a = (3 + 4) * 5
```

# 実装の仕方

実装は構文解析(Parser)へ行います。
構文解析のどこへ実装するかを考えるのに、現状の構文解析の仕方を観察して考えます。

観察対象として下の括弧のない式を取り上げます。
括弧のない式を構文解析するとき、`1`トークンの順番とどのメソッドで処理されるかに注目します。

```JS
a = 1 + 2
```

`1`トークンはトークンの並びで3番目にあり、Parserの`lead()`メソッドで処理されます。

続いて対応したい括弧のある下の式を、括弧のない式と比べながら考えます。
括弧のある式の3番目のトークンは`(`です。

```JS
a = (3 + 4)
```

先の観察から、`1`トークンと同じ位置に`(`トークンがあるので、
`(`トークンは`lead()`メソッドに中であらわれることが予測できます。
そして、`(`トークンのあとの`３ + ４`は普通の式になっているので、
`expression()`メソッドで解析できます。
そして、最後に閉じ括弧`)`があることを確認すれば、構文解析できそうです。

# Javaで実装してみる

実装にうつります。

## Parser.java

Parser.javaの実装です。
`<-- Add`の箇所へ優先順位付け括弧対応の処理を追加しました。
まずは`lead()`メソッドの中で`(`トークンがあらわれたことを確認します。
`Token expr = expression(0)`で括弧内の式の解析結果を一旦保持しておきます。
そのあと`consume(")")`で閉じ括弧があることを確認します。
戻り値は保持しておいた解析結果です。
対応らしい対応は以上です。

```Java:Parser.java
    private Token lead(Token token) throws Exception {
        if (factorKinds.contains(token.kind)) {
            return token;
        } else if(token.kind.equals("paren") && token.value.equals("(")) {  // <-- Add
            Token expr = expression(0);
            consume(")");
            return expr;
        } else {
            throw new Exception("The token cannot place there.");
        }
    }
```

## Interpreter.java

Interpreter.javaの実装です。
優先順位付け括弧の対応が反映されるか、
`String text = "a = (3 + 4) * 5";`を括弧のある式へ変えました。
標準出力に`35`がでるはずです。

```Java:Interpreter.java
    public static void main(String[] args) throws Exception {
        String text = "a = (3 + 4) * 5";    // <-- Update
        text += "println(a)";
        List<Token> tokens = new Lexer().init(text).tokenize();
        List<Token> blk = new Parser().init(tokens).block();
        new Interpreter().init(blk).run();
        // --> 35
    }
```

実装は以上です。
ありががとうございました。

# おわりに

ソースの全文はこちらで公開しています。

**Calc**
https://github.com/quwahara/Calc/tree/article-5-parenthesis/Calc/src/main/java

続きの記事があります。

**単項演算に対応する**
http://qiita.com/quwahara/items/4069d47b511e4d11f44b
batファイルのカレントディレクトリの取得方法

# batファイルのカレントディレクトリの取得方法


```bat:test.bat
echo %~dp0
pause
```

デスクトップ上でbatファイルを実行したとして、以下の結果がコマンドプロンプトに表示されます。
C:\Users\xxx\Desktop\


以下解説
%0：batファイルに元から設定されている環境変数。「"C:\Users\xxx\Desktop\test.bat"」のように格納されている。
~：%0から"(ダブルコート)を取り除く
d：%~0からドライブ名のみを取得する。「C:」のように値を取得できる。
p：%~0からドライブ名を除いたパスを取得する。「\Users\xxx\Desktop\」のように値を取得できる。
Spring Bootでテスト用のapplication.propertiesを読み込む


テスト用にapplication.propertiesを用意して、テスト時にはそちらを読み込む。

https://github.com/myahal/spring-property-test


src/resources/application.properties

```
app.name=props-app
app.comment=this is app:${app.name}
```

test/resource/application.properties

```
app.name=props-test
app.comment=this is test:${app.name}
```

### @Valueでインジェクションする

PropsService.java

```
@Service
public class PropsService {
   @Value("${app.name}")
   private String appName;

   @Value("${app.comment}")
   private String appComment;
 
   public String getAppName() {
     return appName;
   }

   public String getComment() {
     return appComment;
   }
}
```

### @ConfigurationPropertiesで読み込む

- PropsConfig.java

```

@Component
@ConfigurationProperties(prefix = "app")
public class PropsConfig {
    private String name;
    private String comment;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getComment() {
        return comment;
    }

    public void setComment(String comment) {
        this.comment = comment;
    }
}

```


- PropsService.java

```
@Service
public class PropsService {
    @Autowired
    PropsConfig propsConfig;

    public String getAppName() {
        return propsConfig.getName();
    }

    public String getComment() {
        return propsConfig.getComment();
    }
}
```


### テストコード

- PropsServiceTest.java


```
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class PropsServiceTest {
    @Autowired
    PropsService service;

    @Test
    public void test_getAppName() {
        assertThat(service.getAppName()).isEqualTo("props-test");
    }

    @Test
    public void test_getComment() {
        assertThat(service.getComment()).isEqualTo("this is test:props-test");
    }
}

```

@SpringBootTestを入れ忘れて読み込まれなくて苦しんだ。
GLPKで「basis matrix is singular to working precision」というエラーが出たら

とりあえず、一言だけ。
glp_simplexを呼ぶ前に、glp_scale_probとglp_std_basisも呼んどこう。以上。

ちゃんとした記事にする意欲が不足しているので、とりあえず、直近で10分つまずいて、Google先生がいまいちな結果だったので、自己解決した件をメモっておく。

前計算を延々とやってからモデルを自動生成してGLPKを叩くプログラムを回しているので、無事動き始めた今は、待つのみ。計算が終わるのを気長に待ちながら、ニコニコで「はいふり」一挙見てくる。
[C#]カルチャの設定の影響でFileLoadExceptionが出た話

# 環境
Visual Studio Community 2015 Update3

# 経緯
ある日、自作のライブラリのDLLを読み込もうとしたらFileLoadExceptionが出ました。以下のようなものです。

```
例外がスローされました: 'System.IO.FileNotFoundException' (Nac.Altseed.Test.exe の中)

追加情報:ファイルまたはアセンブリ 'Nac.Altseed, Version=0.1.5.0, Culture=ja-JP, PublicKeyToken=null'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。
```

`Nac.Altseed`というのが自作のライブラリです。それで、この例外にはFusionLogプロパティが含まれていました。FusionLogが見られるようにするためには何か下準備が必要だった気がしますが、今回は割愛します。

FusionLogの最後は以下のような行が含まれていました。

```
ログ: 新しい URL file:///D:/Documents/Visual Studio 2015/Projects/Tools/Nac.Altseed/Dev/Nac.Altseed.Test/bin/Debug/ja-JP/Nac.Altseed.DLL をダウンロードしようとしています。
ログ: 新しい URL file:///D:/Documents/Visual Studio 2015/Projects/Tools/Nac.Altseed/Dev/Nac.Altseed.Test/bin/Debug/ja-JP/Nac.Altseed/Nac.Altseed.DLL をダウンロードしようとしています。
ログ: 新しい URL file:///D:/Documents/Visual Studio 2015/Projects/Tools/Nac.Altseed/Dev/Nac.Altseed.Test/bin/Debug/ja-JP/Nac.Altseed.EXE をダウンロードしようとしています。
ログ: 新しい URL file:///D:/Documents/Visual Studio 2015/Projects/Tools/Nac.Altseed/Dev/Nac.Altseed.Test/bin/Debug/ja-JP/Nac.Altseed/Nac.Altseed.EXE をダウンロードしようとしています。
```

ファイルパスを何パターンか探してみてダメだったみたいですね。それで、`bin/Debug/ja-JP/Nac.Altseed.DLL`とかに探しに行ったようですが、実際にDLLが置いてあるのは`bin/Debug/Nac.Altseed.DLL`で、`ja-JP`ディレクトリが無いので見つからなかったみたいです。ということは、プロジェクトのカルチャの設定が悪さをしているのでしょう。

調べてみると、プロジェクト設定の「アプリケーション > アセンブリ情報 > ニュートラル言語」の設定が「日本語」になっていました。NuGetにアップロードする際に日本語のプロジェクトだからといってカルチャを設定していたのが悪かったみたいです。ですが、この設定を「(なし)」にしてみても症状は改善しませんでした。

試しに`AssemblyInfo.cs`を見てみたところ、次のような1行を見つけました。

```C#
[assembly: AssemblyCulture("ja-JP")]
```

プロジェクト設定から変更しただけではこの属性が消えないことがあるのかもしれません。この行を消してみると、FileLoadExceptionが出ずに読み込むことができました。
JavaScriptでCIE94色差計算

[Color difference（wikipedia）](https://en.wikipedia.org/wiki/Color_difference#CIE94)で公開されているCIE94の色差計算式をJavaScriptで書いてみました

wikipediaで公開されている計算式は以下のとおりです。
> ![CIE94](https://wikimedia.org/api/rest_v1/media/math/render/svg/3d211e32392967ee23e92b1e3cdc0fe2e0ef4061)
（「[Color difference](https://en.wikipedia.org/wiki/Color_difference#CIE94)」（5 Feb 2017, at 02:30. UTC）『ウィキペディア』より引用）

CIE76やユークリッドと比較すると複雑なものとなります。また、CIE76やユークリッド、CIE2000ではL1a1b1とL2b2a2の値が入れ替わったとしても同じ結果になるのに対して、CIE94では違う値を返すため、ちょっと扱いにくい印象があります。計算式が間違っているだけかもしれませんが…

```js:cie94
function cie94(L1,a1,b1, L2,a2,b2, kL=1,kC=1,kH=1) {
	//https://en.wikipedia.org/wiki/Color_difference#CIE94

	var K1;
	var K2;
	if (kL == 1) {
		K1 = 0.045;
		K2 = 0.015;
	} else {
		K1 = 0.048;
		K2 = 0.014;
	}
	var deltaL = L1 - L2;
	var C1 = Math.sqrt(Math.pow(a1, 2) + Math.pow(b1, 2));
	var C2 = Math.sqrt(Math.pow(a2, 2) + Math.pow(b2, 2));
	var deltaCab = C1 - C2;
	var deltaa = a1 - a2;
	var deltab = b1 - b2;
	var deltaHab = Math.sqrt(
			Math.pow(deltaa, 2) +
			Math.pow(deltab, 2) -
			Math.pow(deltaCab, 2)
		);
	var SL = 1;
	var SC = 1 + (K1 * C1);
	var SH = 1 + (K2 * C1);

	return Math.sqrt(
			Math.pow((deltaL/(kL*SL)), 2) +
			Math.pow((deltaCab/(kC*SC)), 2) +
			Math.pow((deltaHab/(kH*SH)), 2)
		);
};
```

CIE94はRGBではなくLabの値が必要となりますので、実際に使うには[JavaScriptでCIE76色差計算](cda9b95395468ee7e0f8)と同様に[JavaScriptでRGBからLab色空間への変換](09caabe6bec46a2a0858)を使ってRGBからLabへの変換する必要があります。以下のような感じになると思います。

```js
var [L1, a1, b1] = rgbToLab(r1, g1, b1);
var [L2, a2, b2] = rgbToLab(r2, g2, b2);
distance = cie94(L1,a1,b1, L2,a2,b2);
```

または

```js
distance = cie94.apply(this, 
		rgbToLab(r1,g1,b1).concat(rgbToLab(r2,g2,b2))
		)
```

## 関連リンク
- [色差アルゴリズムの違いをビジュアル化してみた](98c218bc5616eaaba9a0)
- [JavaScriptでCIEDE2000色差計算](860f061a2ab7a4f2d06f)
- [JavaScriptでCIE76色差計算](cda9b95395468ee7e0f8)
- [JavaScriptでユークリッド色差計算](28c7b61d6b8ca54c5b94)
- [JavaScriptでHSVからRGBに変換](633d1bf6baf008e82847)
- [JavaScriptでRGBからLab色空間への変換](09caabe6bec46a2a0858)
iOS 10.2以降でNSHTTPCookieStorageがクッキーを食べてくれない

# クッキーを食べてくれない！
クッキーに認証情報をセットして、アプリからWebViewでサービスにログインするアプリがありまして、iOS10.2以降限定で、WebViewでは認証エラーが起こるけどアプリ内のログイン自体は有効になっているという事態に遭遇しました。

色々調査を進めていった結果、
`setCookie:` でクッキーをセットしたのに、クッキーがセットされていなくて、WebViewで無効な認証情報でログインしようとしていた！

そうか、バレンタインだからクッキーを食べてくれないのか、チョコがいいのか？チョコ食べる？

なんて頭のおかしい回答ではチケットをクローズできるはずもなく・・・


# 単にクッキーを削除したら食べてくれたよ！お腹がいっぱいだったのか！
新しい名前のクッキーはセットできてたんです。出来ないのは同じ名前のクッキーを上書きすること。
なのでこれ、削除してからセットしたらイケるのでは・・・？

いけました。

先に、 `deleteCookie:` で同じ名前のクッキーを削除してあげると、エラーも治って万事解決！



本当はサンプルコードとかHTTPヘッダとか合わせて載せたかったんですが、Macが壊れてしまってXcodeを動かせないので、とりあえずメモだけ。
mysqldumpで複数テーブルを除外する方法


# 手打ち
一つ二つだったら良いけど十個もあるととても面倒です。そして長いから汚いです。

```bash
mysqldump -u root -p password --ignore-table=dbname.tbl1 --ignore-table=dbname.tbl2 .... dbname | gzip -c > dbname.sql.gz
```

# bashのforを使ってみた

```bash
#!/usr/bin/env bash

TABLES=("tbl1" "tbl2" "tbl3" "tbl4" "tbl5" ... "tbl100")
IGNORE_TABLES=""
for X in ${TABLES[@]}; do
  IGNORE_TABLES=$IGNORE_TABLES" --ignore-table=dbname.${TBL}"
done

mysqldump -u root -p password ${IGNORE_TABLES} dbname | gzip -c > dbname.sql.gz
```

多分これで動くはず。
[Swift]  ソート済み配列をバイナリサーチ

汎用的なバイナリサーチを実装して見た。

## 基本実装
まず本体

```swift
extension MutableCollection where IndexDistance == Int {
    private func bsearch(min: Int, max: Int, comparator: (Iterator.Element) -> ComparisonResult) -> Iterator.Element? {
        if max < min { return nil }
        let current = min + (max - min) / 2
        let v = self[self.index(self.startIndex, offsetBy: current)]
        let compRes = comparator(v)
        
        if compRes == .orderedSame { return v }
        
        let newMin = (compRes == .orderedAscending) ? current + 1 : min
        let newMax = (compRes == .orderedDescending) ? current - 1 : max
        return bsearch(min: newMin, max: newMax, comparator: comparator)
    }
    
    func binarySearch(comparator: (Iterator.Element) -> ComparisonResult) -> Iterator.Element? {
        return bsearch(min: 0, max: self.count - 1, comparator: comparator)
    }
}
```

`Array`でいいと思うんだけど、よくわからないので`sorted()`を持ってる`MutableCollection`を拡張しました。 
間違えてる場合は指摘してくださるとありがたいです。
*（いつか実装されるはずの末尾再帰の最適化のために末尾再帰にしています）*

使用法は

```swift
let original = [8, 5, 9, 10, 66, 4, 3, 6, 12, 13, 16, 27, 58, 3]
let sortedArray = original.sorted()
let target = 5
sortedArray.binarySearch {
    if $0 == target { return .orderedSame }
    if $0 < target { return .orderedAscending }
    return .orderedDescending
} // 5
```

のようになります。

## 補助的実装

クロージャの中がゴチャゴチャしていてすごくわかりにくいです。
なので`ComparisonResult`を返す演算子を作っちゃいます。

```swift
infix operator ==? : ComparisonPrecedence
func ==? <T: Comparable> (lhs: T, rhs: T) -> ComparisonResult {
    if lhs == rhs { return .orderedSame }
    if lhs < rhs { return .orderedAscending }
    return .orderedDescending
}
```

ここでは`==?`を使いましたがお好みで。
比較対象が`Comparable`に準拠していれば使えます。

これを使うと先のバイナリサーチはこうなります。

```swift
sortedArray.binarySearch { $0 ==? target }  // 5
```

一気に見やすくわかりやすくなりました。演算子偉大です。

## 補足

比較部分が外部に出ているので要素自体が`Comparable`に準拠していなくても使えます。

```swift
struct Member {
    let id: Int
    let name: String
}

let members = sortedArray.map { Member(id: $0, name: "") }

members.binarySearch { $0.id ==? target }   // Member(id: 5, name: "")
```

比較対象が`Int`のため、構造体`Member`自体を`Comparable`に準拠させることなくバイナリサーチが利用できます。
オンプレと比較してAuroraの利点と欠点を考える

自分の理解のために記載する。
ベンチマークを回していない経験からのコメントなのでツッコミ大歓迎です。
勉強不足だとお怒りの場合は勉強し直せと数意見ございましたら取り消していつか再挑戦します。

#利点
メンテナンスフリー
読み込みにキャッシュが効くために早い
サーバのスケールアップ、スレーブ台数を増やすのが簡単
問題があった場合にロールバックが数クリックで終わる
NVMeに入りきらない容量(2.1~64TB)も高速
格納データが暗号化できる(経路暗号化はできない)
PostgreSQLが正式版になればOracleに高いお金を払わなくても高負荷システムの安定が望める

#欠点
フェイルオーバーに1分弱かかる
MySQL5.6から独自進化し始めている
どんなひどいクエリでもパフォーマンスが安定なのでエンジニアが育たない
AWSロックイン、マルチクラウドからAWSへ接続などたまに安定していないIPsecが必要に
キャッシュが数時間で使えなくなるなどAurora特有のトラブルも稀にある
問題が起きたときに頼り先が高くつく（キャッシュが数時間で効かなくなる、参照インスタンスが数秒で切り替わりロックがおかしくなる、F.O.しなかった）
容量でのコストが雪だるま式になる
コストが見積もれない
Microsoft AzureとGoogle Cloudの連携アーキテクチャ

GYAOのtsです。
我々のチームは、オールパブリッククラウドで、[Microservice Architecture](http://microservices.io/patterns/microservices.html)を採用した次期バックエンドを設計中です。

# 経緯
[前回の投稿](http://qiita.com/tstakano-yj/items/4b804b3bdab2b05eea18)にもあるとおり、最近は我々のチームはAzureを使い倒す形になってきたわけだが、最近はGoogle、MicrosoftやAmazonの担当者の方々もご来社いただいて、設計のアドバイスや効果的な使い方等をサポートしていただいています。

そんな中、チーム内でずっと[こんなデザイン](http://qiita.com/tstakano-yj/items/21f78336a8a3aae50f82)で進めてきたのだが、進めていくうちにかなり変わってきた。
社内政治的なところもあるのだが、そもそもこのシステムを作って具体的に何を成し遂げるのかが社内でいまいち明らかになっておらず、
ハコはできたものの実際作るものが決まった時にどうなるかがわからない。今できることとしては

* ベンダーの切り替えさえもできるように極力疎結合にデザインする
* 費用感を掴んでおく
* 拡張性、再利用性を担保する

くらいかなと。

データ連携をするある程度大きなシステムを作る際、どう作るにしてもほぼ必ず通る道はあるわけで、それを抽象化したものが、[Enterprise Integration Patterns](http://www.enterpriseintegrationpatterns.com/)だが、何か作りたいと思った時に手持ちのコンポーネントを組み合わせて短時間で大きな成果を上げられるようなシステムを目指す。そういう意味では[LogicApp](http://qiita.com/tstakano-yj/items/967edafec3a2be83e67f)はとてもいいアプローチだと思っている。欲をいえば、コネクタをカスタマイズできるといいかと思う（特定のインターフェイスを実装することでコネクタを作成できてデプロイできるみたいな）。
LogicAppを採用すると親和性からGatewayもAzureになってくる。うまくできてるなぁ。

# 現在のデザイン
![export.png](https://qiita-image-store.s3.amazonaws.com/0/114329/217127c9-d57b-7e3e-9285-4b5a5e80ab91.png)

| 機能 | 役割 |過去のハンズオン|
|:--|:--|:--|
|Database|Metaデータの保存先。直にクライアントに公開していいと思っている。MLとかでごにょごにょやった結果の保存先、データを正規化してその保存先としても使える。|-|
|BlobStorage・DataFactory|大量データをファイルで扱うケースがあるので、Blobにコンテンツが置かれたら一定の処理が走るようにしたい（DataFactoryではなく、stream処理の方がいいかなと最近思っている）。逆にLogicAppでエクセルを吐き出して、fileストレージとして保存とかもできる。NASとして担当者が端末にマウントすれば自動レポートの生成ツールみたいなこともできる。|functionsを使用したハンズオン[パート1](http://qiita.com/tstakano-yj/items/624c81e4aa28820c350d)、[パート2](http://qiita.com/tstakano-yj/items/c7b609750dc9171442bd)|
|LogicApp|新規APIや、タイマー処理をここで構築していく。提供されているコネクタでは足りないケースがあると思うので、restAPIを別途作成して補完する方針。|[AzureLogicAppsでAPI wrapper](http://qiita.com/tstakano-yj/items/967edafec3a2be83e67f)|
|kubernetes・swagger|restAPIの作成場所。別にここでなくてもいいのだが、チーム内で作ってきて慣れているのと、フルマネージド、高機能なので今の所GKE。|GoogleCloudで汎用Database構築4 - kubernetes & SpringBoot & intelliJ & Apache Camel - [パート1](http://qiita.com/tstakano-yj/items/45b209e1fcc1fb5269f2)、[パート2](http://qiita.com/tstakano-yj/items/baaaed3199d89c5c3141)、[パート3](http://qiita.com/tstakano-yj/items/7e2d0fd28ddda3dbbe54)|
|APIManagement|webserviceを束ねるGatewayとして使用。認証を一元管理する。|[APIManagement + LogicApp](http://qiita.com/tstakano-yj/items/4b804b3bdab2b05eea18)|


懸案は速度。どのくらい性能が出るかは今後ストレステスト等を行って評価していく。
nginxでSSIを有効化する

nginxの環境でServer Side Includesを使用する機会があったのでメモ

#/etc/nginx/nginx.confを編集
location /内で下記の通りssiを有効化する

```nginx.conf
http {
	server {
		location / {
	            ssi  on;
	            ssi_last_modified on;
	    }
    }
}
```

#nginxの再起動
`$ sudo service nginx restart`


#テストとして.shtmlファイルを作成
公開ディレクトリに`$ sudo vi test.shtml`でファイルを作成する

```test.html
<!--#config timefmt="%A %B %d, %Y" -->
Today is <!--#echo var="DATE_LOCAL" -->
```


#確認
http://IP_Adress/test.shtml にアクセスする
正しく設定されていれば、日付が表示されるはず
複数ポートでLISTENしているGCEインスタンスの負荷分散(ロードバランサ)の設定

はまったので書いておく。
とりあえず、AWSのELB + EC2構成をGCPにつくりたいんだけどって人向け。

GCPの負荷分散(ロードバランサー)って?
https://cloud.google.com/compute/docs/load-balancing-and-autoscaling

## やりたかったこと
これ↓

```
     |GCEインスタンス|
     /
|LB| 
     \
     |GCEインスタンス|
```
- GCEインスタンス2台
    - ともにapiがport3000でListen
    - ともにfrontがport4000でListen

- やりたいLBの設定
    - front.example.jp:80 -> LB -> 3000でGCEにリクエスト
    - api.example.jp:80 -> LB -> 4000でGCEにリクエスト

- Http負荷分散 + 非マネージドインスタンスグループで実現した
  - マネージドインスタンスグループでの負荷分散に関しては書きませんごめんなさい
  - マネージドインスタンスグループがgoogle推奨みたいです
  - https://cloud.google.com/compute/docs/instance-groups/

## やったこと
### 1. インスタンス作成 x2
- Compute Engine -> VMインスタンス -> インスタンスを作成
  - firewallのHTTP(s)を許可するをチェック
  - zoneもasia-north-eastあたりにしとく
  - あとはお好きなように埋める

### 2. インスタンスグループ作成
- Compute Engine -> インスタンスグループ -> インスタンスグループを作成
  - ロケーションはシングルゾーンにチェック
  - "ポート名のマッピングを指定する"リンクをクリックし、以下を登録
     - api: 3000
     - front: 4000
  - 作成方法は"既存のインスタンスを選択"をチェック
  - VMインスタンスの選択欄で、作成した2つのインスタンスを指定
          
### 3. 負荷分散の設定
#### a. 負荷分散の作成
- ネットワーキング -> 負荷分散 -> ロードバランサの作成 -> HTTPS負荷分散の"設定を開始"をクリック
  - 適当に名前を入れる
  
#### b. バックエンドサービスの作成(api用とfront用の2つ)
- バックエンドの設定 -> バックエンドサービスを作成または選択 -> バックエンドサービスを作成
  - 名前を適当に
  - インスタンスグループに先ほど作成したグループを選択
  - ポップアップで"インスタンスグループは名前付きポートを所有済み"がでるのでapi(ポート:3000)を選択する
     - ("ポート番号"の欄に3000と記入するでもいい)
  - あとはお好きに設定

- 同様にバックエンドサービスを作成または選択 -> バックエンドサービスを作成 からfront用のバックエンドサービスを作る
  - ポップアップで"インスタンスグループは名前付きポートを所有済み"がでるのでfront(ポート:4000)を選択する
     - ("ポート番号"の欄に4000と記入するでもいい)

#### c. ホストとパスのルールの作成
- ホストとパスのルールで以下を設定
  - `ホスト: front.example.jp`, `パス: /*`, `バックエンド: front用のバックエンドサービス`
  - `ホスト: api.example.jp`, `パス: /*`, `バックエンド: api用のバックエンドサービス`

#### d. フロントエンドの設定
- フロントエンドのIPとポートを追加で以下を設定
  - プロトコル: HTTP, IP: エフェメラル, ポート: 80

## 注意
- 同一のインスタンスは複数のLBに設定できない
- 同一のインスタンスは複数のバックエンドサービスに設定してLBに紐付けできない
- TCP負荷分散ではportフォワーディングできない
MTU > Link > IPv4での最小サイズ: 68バイト

UDP通信のパケットロスで35文字目から303文字ロスしている症状が見つかっている。
(UDP通信でなく、送信前のソフトバグの可能性もあるかもしれないが、文字列連結で抜けが発生するという不具合はこれまで経験したことがない)。

IPv4の場合のMTUの最小サイズについて気になったので調べた。

以下に説明とリンク情報が見つかった。
http://networkengineering.stackexchange.com/questions/18997/what-is-the-minimum-mtu-size

68バイト以上にするように (Every internet module must be able to forward a datagram of 68 octets without further fragmentation. )とのことらしい。

- 35文字: 到達
- 303文字: ロス
- 57文字: 到達

通信の暗号化などが絡んでいるのか、区切り(パケットサイズ)は明瞭ではない。
macOSはアロケーションユニットサイズ（クラスタサイズ）が1024KB以上のexFATボリュームをマウントできない

# 概要
タイトルの通り、macOSはアロケーションユニットサイズを1024KB（1048576B）以上でフォーマットしたexFATのボリュームをマウントできない。

# 環境

- フォーマットしたWindows
    - Windows 10
- 接続したmacOS
    - macOS Sierra 10.12.3

# なぜ気付いたか
いつもWindowsで使っているHDDをMacに刺したところ、認識しなかった。
（Macでもマウントできるように！と思ってexFATでフォーマットしたのに）

おかしいなと思い色々と調べていると以下のページを発見。

[exFAT mounting problem | Official Apple Support Communities](https://discussions.apple.com/thread/2767345?tstart=0)

ガーン:innocent:

# 検証方法
コンソールを開いた状態で、分かりやすいように検索欄に「mount」と入力しておいて、ディスクユーティリティから当該ボリュームをマウントすると、以下のログが吐き出される。

```
exfat: bytes per cluster (2097152) > MAXBSIZE (1048576).  Can't mount.
```

`2097152`の部分はフォーマットした際に決めたアロケーションユニットサイズになっていると思います。

# その後どうしたか（どうするか）

おとなしくフォーマットし直す予定です。
いい方法がありましたらコメント欄にてご教示ください。
RecentChangesを見易くする？Userscriptを書いた

# はじめに
自分の職場では、情報共有や日誌としてPukiWikiがまだまだ頑張っている。
更新チェックにRecentChangesのページをよく開くが、前回どこまで見たのかピンとこないことがあるので、前回RecentChangesを開いてから更新がないページを目立たなくするUserscriptを書いてみた。

# スクリプト

```js:highlightupdated.user.js
// ==UserScript==
// @name        HighlightRecentChanges
// @namespace   http://horihiro.net/
// @include     http://SERVER_NAME/index.php?RecentChanges
// @version     1
// @grant       none
// ==/UserScript==

(function(){
  var lastAccess = localStorage.lastAccess;
  // 前回開いた日時があるかチェック
  if (lastAccess && !isNaN(lastAccess)) {
    try {
      lastAccess = new Date(parseInt(lastAccess));
      Array.prototype.forEach.call(document.querySelectorAll(".list1>li"),  function(li){
        // 各項目の更新日時を取得
        var updated = new Date(li.innerText.replace(/(\d{4}-\d{2}-\d{2}).*(\d{2}:\d{2}:\d{2}).*$/,'$1 $2'));
        // 前回開いた日時と比較
        if (updated.getTime() < lastAccess.getTime()) {
          // 前回開いた日時よりも更新時間が古ければ薄くする
          li.style.color = 'lightgray';
        }
      });
    } catch(ex) {
      console.log(ex);
    }
  };
  // 現在日時をlocalStorageに保存
  localStorage.lastAccess = Date.now();  
})();
```

ヘッダーの`SERVER_NAME`はPukiWikiのサーバ名に置き換える。

# 注意
localStorageにアクセス日時を保存して、それと各ページの更新日時を比較してる。
なので、PCを変えるのはもちろん、同じPCでもブラウザを変えたら、既に見たページも薄くならない。
Python3からC++の関数を呼び出す


## はじめに

Pythonは書きやすいけど速度が残念…
ということで、一部をC++で書き直してPythonから呼び出そうとしたんですが新しめの情報が少なかったのでまとめておきます。
Cythonを利用しますが、Cythonの導入やC++のコンパイラの導入などは解説しないので、他記事を参照してください。

例としてC++で足し算を行うadd_cという関数を作り、それをPythonから使ってみます。

## C++側

Pythonから使うために特別な書き方をする必要はなく普通に書きます。

```cpp:calc_c.hpp
#ifndef __GUARD
#define __GUARD

int add_c(int x, int y);

#endif

```

```cpp:calc_c.cpp
#include "calc_c.hpp"

int add_c(int x, int y){
    return x + y;
}

```

## Python側

直接PythonからC++の関数を呼ばずに、Cythonを経由して型の情報をつけてからC++の関数を呼びます。

```python:calc.pyx
cdef extern from "calc_c.hpp":    #使いたい関数を含むC++のヘッダーを指定する
    cdef int add_c(int x, int y)  #使いたい関数を宣言する

#C++の関数を型情報をつけて呼び出すラッパー関数
def add(int x, int y):
    cdef int ans
    ans = add_c(x, y)
    return ans

```

## コンパイル
calc.pyxをコンパイルするための設定ファイルを書きます。

```python:setup.py
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

#コンパイルするソースファイルをリストで指定
source = [
    'calc_c.cpp',
    './calc.pyx'
    ]

setup(
    cmdclass = dict(build_ext = build_ext),
    ext_modules = [
        Extension(
            'calc',				#この名前でimportできるようになる
            source,
            language='c++',		#C++でコンパイルするために必要
        )
    ]
)
```

以下のコマンドを実行するとコンパイルが実行されて、共有ライブラリ(拡張子:so)ができます。

```shell
$ python3 setup.py build_ext
```

## 使ってみる

コンパイルして作った共有ライブラリを同階層に置いておけばimportで読み込めます。

```python:main.py
import calc

print(calc.add(1, 1))
```

## 注意

C++側の関数名とCython側の関数名が被っているとコンパイルに失敗します。
Redis Sentinel 手動でのフェイルオーバー(スイッチオーバー)

サーバーのOSのバージョンアップを行なった際、
手動でRedis Sentinelのフェイルオーバーを行なった際のメモ

master nodeが落ちたことをSentinelが検知するまでの時間を短くするため、手動でフェイルオーバーを行ったほうがいい、ということで...

[公式ドキュメントで手動のフェイルオーバーについて記載してある箇所](https://redis.io/topics/sentinel#sentinel-commands)

```
SENTINEL failover <master name> Force a failover as if the master was not reachable, and without asking for agreement
to other Sentinels (however a new version of the configuration will be published so that the other Sentinels will update their configurations).
```

## コマンド

こんな感じで(dockerで運用しています)  

```
docker exec -it docker_redis-sentinel1_1 bash
redis-cli -p 26379
SENTINEL failover mymaster
```

## Redis Nodeのフェイルオーバー先の重み付け

[http://download.redis.io/redis-stable/redis.conf](http://download.redis.io/redis-stable/redis.conf)

```
# The slave priority is an integer number published by Redis in the INFO output.
# It is used by Redis Sentinel in order to select a slave to promote into a
# master if the master is no longer working correctly.
#
# A slave with a low priority number is considered better for promotion, so
# for instance if there are three slaves with priority 10, 100, 25 Sentinel will
# pick the one with priority 10, that is the lowest.
#
# However a special priority of 0 marks the slave as not able to perform the
# role of master, so a slave with priority of 0 will never be selected by
# Redis Sentinel for promotion.
#
# By default the priority is 100.
slave-priority 100
```

slave-priorityを100より小さい値を設定して優先度を変える
redux Loop コンポーネントで幸せになりたい！！

#redux Loop コンポーネントで幸せになりたい！！

##目的
- redux 汎用 Loop コンポーネント 
- mapを使ってapiから受け取ったデータを表示していたけど、
ループなんだからやってることは一緒なんじゃね？

```jsx:Loop
const api = [
 {
   id: "123",
   text:" hoge"
 }
]

<Loop data={api}>
  <Item>
</Loop>

```

みたいな感じで書きたい。。。

##やってみた!!

### Loopコンポーネント


####初期の実装
まぁ、とりあえずchildrenを表示させるけど
this.props.childrenにどうやって新しくprops渡せばいいんだ？？？？

```jsx:Loop

const Loop = ({children}) => {
  return (
      <ul>
         {children}
      </ul>
  );
};

```

#### 改良版 React.cloneElementでpropsを新しく追加

React.cloneElementでpropsを新しく追加

https://facebook.github.io/react/docs/react-api.html#cloneelement

```jsx:Loop

const Loop = ({data,children}) => {
  return (
      <ul>
         {
          data.map((item,index)=> {
            return (
              React.cloneElement(
                children,{
                 item,
                 key:index
                }
              )
            ) 
          })
        }
      </ul>
  );
};

```

#####参考にさせていただいたサイト
- [Reactで子要素を渡せるコンポーネントを作りたい](http://qiita.com/hokaccha/items/8d810e023251103ec060)
- [React.cloneElementでpropsを追加する](http://qiita.com/halhide/items/31cb9d828d2021dc8324)
- [React.Children and the React Top-Level API] (http://callahan.io/blog/2016/09/16/react-dot-children-and-the-react-top-level-api/)
- http://stackoverflow.com/questions/40490826/react-cloneelement-and-component-instance
- https://github.com/DefinitelyTyped/DefinitelyTyped/issues/12267


あとはItem コンポーネント側で ```this.props.item```から取りたい値を取ってくるだけ！
React + redux は奥が深い・・・

多分、いろいろと不備があると思うので(keyとか)アドバイス等あればお願いします！！
JavaEE、glassfish、CentOS７でWebアプリをwarファイルでデプロイするまでにやったこと、はまったとこまとめ自分用

最初の注意
このやり方では絶対にglassfish4.1, CentOS7でやること


terminalでssh接続の最初の設定は、調べればとくに難しくない。VPSのコンソールでの注意点というか間違えたところ
https://teratail.com/questions/65380

このサイトのやり方はCentOS６なので、所々やり方が違うので注意。
http://www.xn--vps-073b3a72a.com/


一応この記事にあるようにbash_profileの内容を変えたけど意味があったかは不明。


bash_profileを編集するときはviを使う。touchは新規作成になる。

start-databaseできないー＞glassfish3でやっていたせい
centOS6,7の違いのせいでrestartじゃなくてsystemctlじゃないと反映できないー＞７はsystemctlを使う

asadminコマンドは、glassfish/binディレクトリで、`./asadmin コマンド`
のようにしないとasadmin command not foundが出る

川場さんの記事にあるこのコマンドはなぜかエラーが出てうまくできなかったので、

<img width="1031" alt="Screen Shot 2017-02-14 at 19.23.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/116252/6dc1ca45-55d7-89d3-0456-794a203ab533.png">

`vim /opt/glassfish4/bin/glassfish-resources.xml`
を使って新しくファイルを作成すること。
ファイルに書く内容は川場さんの記事にある。
アプリをデプロイしたらLaunchをクリックする。
WindowsでBase64エンコード/デコードする方法

##WindowsでもBase64エンコード/デコードができるんです!

コマンドプロンプト標準搭載の`certutil`コマンドを使えば、Windowsでも追加インストールなしでBase64エンコード/デコードを行うことができます。
##エンコード

```:encode
certutil -f -encode "入力ファイル" "出力ファイル"
```

※出力ファイルの最初と最後にそれぞれ、`-----BEGIN CERTIFICATE-----`と`-----END CERTIFICATE-----`が追加される仕様となっています。
また、画像ファイルをエンコードにも対応しています。
##デコード

```:decode
certutil -f -decode "入力ファイル" "出力ファイル"
```

##certutilコマンド
`certutil`コマンドは、証明書関係のコマンドです。
証明書のインストールなどの他にも、`-hashfile`を使えばハッシュ値も計算できます。

```:MD5
certUtil -hashfile "ファイルパス" MD5
```

##参考リンク
[Windowsでbase64エンコード・デコードする方法 - Eiji James Yoshidaの記録](http://d.hatena.ne.jp/EijiYoshida/20140618/1403092855)
[Winodws Server 2012R2 「certutil」コマンドの一覧 : 派遣社員からフリーランスへ！英語×ITスキル×海外投資=至高の経済的自由を手にするブログ](http://forfreeworld.com/archives/35346016.html)
エンジニアの転職メモ

# Webアカウントの作成・提示
相手先に自身のWebアカウントを提示する（提示は職務経歴書内で行う形）
具体的には下記のアカウント。

- GitHub
- Qiita
- SlideShare

他にも技術系のWebサービスを積極的に利用していれば、そちらのアカウントを提示する（自分の場合は[teratail](https://teratail.com/)）
StackOverflowを積極利用していれば、そちらのアカウント名になるはず。

技術ブログがあれば、そのURLも共有する（自分の場合はQiitaがそれ）。
その他差し支えなければ、Twitter, Facebookアカウントも提示する。

# 履歴書
## URL共有
- [Wantedly](https://www.wantedly.com/)のプロフィールページのURL共有。
- この形式で問題ない企業に対しては、これが一番早い。
 - そしてこの業界だと問題ないケースが多い。
 - 人事に共有する場合は、通常の共有URLではなく「限定公開URL」を共有すること。
 - 通常の共有URLだと設定によるが公開範囲が限られており、見せたい情報を共有できない可能性が高い。
- 履歴書の磨き込みはWantedlyのプロフィールの更新という形に注力できる。 
- 海外向けの場合は[LinkedIn](https://www.linkedin.com/)の方が良い。
 - 海外のエンジニアは転職にLinkedInを活用している。  

## 印刷する場合
- PCで作成する。
- 手書きなんか必要ない。
- PCの最低限のスキルも示せるので、PCで作らない理由がない。
- データの更新が容易。
- 写真込みで印刷ができる（写真は白黒で良い）
- JIS規格のフォーマットをハローワークのWebサイトで配っているので利用する。
 - [履歴書・職務経歴書の書き方](https://www.hellowork.go.jp/member/career_doc01.html) - ハローワーク

# 職務経歴書
- [職務経歴書OSS化](http://qiita.com/okoysm/items/abcad0b4aefa585bc50b)の記事のようにGitHubリポジトリのURL共有が早い。
- スキルがわかればよいため、紙にこだわる必要はなく、形式はなんでも良いとのこと（人事担当者より）。
- Web業界のスキルについては紙で表現しにくいので、GitHubを活用する形が良い。
- コミットとして更新が残せたり、GitHub上にあれば更新端末を選ばなくなるので都合が良い。

# スキルが分かるもの
- こちらもGitHubのURLで共有する形で良い。
- Readmeにスキルが分かるポートフォリオ、コードのURLを一覧化して共有する。
 - フロントエンドのコード共有だと、[Codepen](http://codepen.io)、[jsdo.it](http://jsdo.it/)、[jsFiddle](https://jsfiddle.net/) などが活用できる。
 - もちろん利用するサービスのアカウントは作成しておくこと。
 - 自作の解説記事があれば、サンプルコードと併せてリンクしておくと、よりアピールできると考えている。
- 必要があれば、[GitHub Pages](https://pages.github.com/)も活用する。

# 備考
- URL共有は意外と問題ない。
- 就活の段階になっていきなり作り出すより、普段からコードを書くようにしておき、就活時にそれを集約する形の方がまとめるだけでよいので、手早く作れる。
- 普段からいろんな事をコードにしたり、記事にまとめておく癖があると、非常に楽である。

#
C++ Builder > Application->ProcessMessage()後の処理の違い / モーダル表示のフォームがある時 > Windows 7: 処理が続く / Windows 8.1, Windows 10: 処理が固まる

```txt:動作環境
C++ Builder XE4
```

以下のような処理をするソフトの修正をしている。

- TTimer処理
   + 内部で`Application->ProcessMessage()`をコール
- 同じフォーム上の別の処理
   + 特定の条件が成立したときに別フォームをモーダル表示

OSによって動作の違いが見られた。

### Windows 7

TTimer処理の`Application->ProcessMessage()`の次の処理に戻ってくる。

### Windows 8.1, Windows 10

TTimer処理の`Application->ProcessMessage()`で処理が止まる。
モーダル表示のフォームがクローズされるまで処理停止状態。

### 対応方法

TTimerなどの「すぐに抜けるべき処理」において`Application->ProcessMessage()`を使わない。

前任者がなぜそこに「Application->ProcessMessage()」を入れたかは不明であるが、TTimer処理内で入れるべきではないと考えている。

修正後のソフトをWindows 7/8.1/10にて動作確認した。

Windows 7で問題がなかったのは、たまたまなのか。Windows 8.1以降で内部処理が変わったのかは未消化。
centos7 のリモートデスクトップでGUIアプリを実行

ちょっと必要になったのでメモ。
vagrant 上に構築した。

# vagrant

```rb:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "4096"
  end
end
```

```
[vagrant@localhost ~]$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
```

# デスクトップ

KDEは重いし、gnomeはnvidiaのcuda入れるとおかしくなる[^1]ので、Xfce にした。

```bash
sudo yum -y install epel-release

sudo yum -y groupinstall "X Window System"
sudo yum -y --enablerepo=epel groupinstall Xfce
# 日本語化
sudo yum -y install ibus-kkc vlgothic-*
```

# vnc

```
sudo yum -y install tigervnc-server
```

とりあえず一回起動して設定を初期化してから、止める。
初回起動時にパスワードを聞かれるので覚えておく。

何も指定しなければ、デフォルトで `Display Number` は `:1` になる。

```
vncserver
vncserver -kill :1
```

xfce用にvnsの設定ファイルを書き換え。

こちらを参考に。
http://tilfin.hatenablog.com/entry/2014/08/16/172144

```bash:~/.vnc/xstartup
#!/bin/sh

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
x-window-manager &
exec xfce4-session &
```

# 再度vnc起動

```
vncserver
```

`~/.vnc/<hostname>.<domainname>:<display number>.log` にログが出るはず。
ex) localhost.localdomain:1.log

# 接続

## mac

ならFinderの`サーバへ接続`で繋げるはず。
デフォルトだとポート番号は　`5900+<display number>` になると思う。
　
<img width="613" alt="スクリーンショット 2017-02-14 18.55.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/41925/538560c9-5fa2-d5d6-b729-65cb85338d61.png">

## windows

は試してないからわかんないけど、RealVNCとか使えばいいと思う。

# 実行の図

dlibのimglabを起動したところ。

![スクリーンショット 2017-02-14 18.35.00.png](https://qiita-image-store.s3.amazonaws.com/0/41925/c7c7fa3c-2007-5ebb-7ffd-d3a1fc7cc53a.png)

# 超余談

imglab 起動すると、強制的に画面の中央にウインドウ表示しようとするので、ディスプレイ２枚繋げてると残念なことになる…


[^1]: https://github.com/TigerVNC/tigervnc/issues/39#issuecomment-56778374
mb_convert_variables()は連想配列のキーまで変換してくれない:warning: 


古いシステムのリプレイスをする機会があり、その時に困ったかつ誰も記事にしてなかったのでメモ。

## 太古のOracleDBとPDO
古いシステムのリプレイスをする案件で、DBはそのまま残し、アプリケーションだけ更新するというものがあった。その時のDBは文字コードがsjisのOracle。

**しかも一部のテーブル名やカラム名まで日本語。:anger:**

PDOでcharsetに`AL32UTF8`(この辺よくわからない)を指定することで解決したかと思いきやエラーが発生した。

`PDOStatement::fetchAll(): column * data was too large for buffer and was truncated to fit it in *`

「バッファに対してデータがデカすぎるから削って入れたぜ。」

エラーメッセージでググってみると、原因は文字コード周りのPDOのバグ(仕様?)だった。
PDOがDBからデータを引っ張ってくる際にバッファを用意するが、そのバッファの大きさより大きいデータが来たためエラー(Warning)が発生しているそう。

要するに、もともとsjisのデータ(`n byte`)だったものをutf8(`1.5n byte`)で持ってきて、PDOはそれをサイズが`n byte`のバッファに入れてしまうため、バッファがオーバーフローしてしまいエラーが発生する。

色々ググって見た結果、やはり同様のエラーをいただいている日本人の方々がいて、DBのカラムの型を変えたり、pdoを書き換えたりしてたが、そんなリスキーなことはしたくなかったので、別の回避策を考えてみた。

## 回避策 :eyes: 
単純かつ簡単。
1. 発行するSQLを`utf8`から`sjis`に変換してからPDOに渡す。
2. PDO <-> Oracle は`sjis`でやってしまう。
3. 結果は`sjis`から`utf8`に変換し、処理を続ける。

文字コードを変換する処理が手順1と手順3に入る分処理が重くなるが仕方ない。

## mb_convert_variables()は便利だけど...
[mb_convert_variables()](http://php.net/manual/ja/function.mb-convert-variables.php)は変数の文字コードをまるっと変換してくれる便利な関数。
今回、手順1と手順3で文字コードを`mb_convert_variables()`で変換しようとしたが、手順3で期待した結果が得られなかった。

**`mb_convert_variables()`は連想配列の値は変換してくれても、連想配列のキーまでは変換してくれない。**

今回扱うDBのテーブルには、カラム名に日本語を使っているものが多数あり、キーが日本語になるためキーも変換して欲しかったので、結局自前で実装。

やってることはすごく単純でコメントもついてるから読んでみてください。
あと、誰かいい関数名つけてください。

## 書いたコード :baby::pencil:  
```php
/**
 * @param  mixed $arg 変換前変数
 * @return mixed 変換後
 */
function convertArraySjisToUtf8($arg) {
    if (is_array($arg)) {
        foreach ($arg as $sKey => $value) {
            // キーをsjisからutf8に変換
            $uKey = mb_convert_encoding($sKey, "UTF-8", "SJIS");
            // キーがsjisの元要素は消す
            unset($arg[$sKey]);
            // キーと値をutf8にして入れ直す
            $arg[$uKey] = convertArraySjisToUtf8($value);	// 再帰
        }
    } else {
        $arg = mb_convert_encoding($arg, "UTF-8", "SJIS");
    }
    
    return $arg;
}
```
これをSQLを発行する前と、結果を取得する前に噛ませることで万事解決！

「もっとこうした方がいいぞ」とかご意見がありましたら是非ください。
composer-fabricのインストールエラーへの対応「node-pre-gyp ERR! Pre-built binaries not found for grpc@1.0.0 and node@7.5.0」

## 問題
composer-fabricdeのインストールをするときに下記のエラーが発生。

```shell-session
➜  fabric-composer git:(master) sudo lerna bootstrap                   
Password:
Lerna v2.0.0-beta.32
Bootstrapping 18 packages
Preinstalling packages
Installing external dependencies
NpmUtilities.installInDir     ("./packages/composer-connector-hlf", ["hfc@^0.6.5"])
npm WARN deprecated node-uuid@1.4.7: use uuid module instead
node-pre-gyp ERR! Tried to download: https://storage.googleapis.com/grpc-precompiled-binaries/node/grpc/v1.0.0/node-v51-darwin-x64.tar.gz 
node-pre-gyp ERR! Pre-built binaries not found for grpc@1.0.0 and node@7.5.0 (node-v51 ABI) (falling back to source compile with node-gyp) 
2017-02-14 18:21:09.017 xcodebuild[39061:1335224] [MT] PluginLoading: Required plug-in compatibility UUID E0A62D1F-3C18-4D74-BFE5-A4167D643966 for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/XcodeBoost.xcplugin' not present in DVTPlugInCompatibilityUUIDs
2017-02-14 18:21:09.018 xcodebuild[39061:1335224] [MT] PluginLoading: Required plug-in compatibility UUID E0A62D1F-3C18-4D74-BFE5-A4167D643966 for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/VVDocumenter-Xcode.xcplugin' not present in DVTPlugInCompatibilityUUIDs
2017-02-14 18:21:09.019 xcodebuild[39061:1335224] [MT] PluginLoading: Required plug-in compatibility UUID E0A62D1F-3C18-4D74-BFE5-A4167D643966 for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/HighlightSelectedString.xcplugin' not present in DVTPlugInCompatibilityUUIDs
2017-02-14 18:21:09.020 xcodebuild[39061:1335224] [MT] PluginLoading: Required plug-in compatibility UUID E0A62D1F-3C18-4D74-BFE5-A4167D643966 for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin' not present in DVTPlugInCompatibilityUUIDs
../src/node/ext/byte_buffer.cc:99:49: warning: 'NewInstance' is deprecated [-Wdeprecated-declarations]
  Local<Object> fastBuffer = bufferConstructor->NewInstance(3, consArgs);
```

grpcのライブラリが見つからないようである

## 原因
どうも最新のnode（v7系全般？）だとNGらしい

>https://github.com/node-inspector/node-inspector/issues/950

## 解決方法
nodeのバージョンを下げる

* nvmのインストール

```shell-session
git clone https://github.com/creationix/nvm.git ~/.nvm 
cd ~/.nvm
git checkout `git describe --abbrev=0 --tags`
. ~/.nvm/nvm.sh
```

* nvmの設定

下記を.bashrcなどに記述しておく

```
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
```

* versionを下げる

```shell-session
nvm install 6.9.1
```

* もう一度、ビルドコマンドを実行

```shell-session
sudo lerna bootstrap 
```

## 補足
本エラーはcomposer-fabricに限ったことではなく、7系のNodeを使っている状態で`grpc@1.0.0`をnpm installしようとすると出てくると思われる
centos にて apacheユーザーになる方法

#コマンド
 mkdir -m 700 /home/apache 
 chown apache:apache /home/apache 
 mkdir -m 700 /home/apache/.ssh 
 chown apache:apache /home/apache/.ssh 
 usermod -d /home/apache -s /bin/bash apache

**apacheを止めてからユーザー変更**
 service httpd stop
 su apache
 service httpd start

※backlogにapache専用のユーザを作成し、ssh登録をする。

git remote -v で接続方法がhttpsにっている時は、
.git/config
のurl情報をssh方式に書き換える.
Windowsのコマンドプロンプトで大量ファイルを1つのファイルにまとめる

大量のファイルを1つにまとめてくださいという依頼が来たとき、テキストエディタを開いて1つずつコピペしていくのは面倒です。
copyコマンドはコマンドプロンプトでファイルをコピーするコマンドですが、複数のファイルを結合してコピーもできるので覚えておくと便利です。

###複数のファイルを結合してコピーする
`copy a.txt + b.txt ab.txt`
a.txtとb.txtを結合してab.txtにコピーする
2つだけでなく複数可能です

###ワイルドカードを使って結合する場合
`copy *.txt all.txt`
createtable*.sql など、特定の文字を含むファイルに限定することも可能
Terraformの "aws_emr_cluster" でbootstrap_actionを複数指定する

こんな感じで並べればOKでした。

```
resource "aws_emr_cluster" "emr-cluster" {
  name          = "emr-cluster"
  release_label = "emr-5.3.0"
  applications  = ["Spark"]

  ## 省略

  bootstrap_action {
    path = "s3://elasticmapreduce/bootstrap-actions/run-if"
    name = "runif"
    args = ["instance.isMaster=true", "echo running on master node"]
  }
  bootstrap_action {
    path = "s3://elasticmapreduce/bootstrap-actions/run-if"
    name = "runif"
    args = ["instance.isMaster=false", "echo running on core node"]
  }
　　
　　## 省略

}

```