OmniAICreator/Qiita-1.07M huggingface dataset:
UnityのAndroidビルドができなくなった時の対処法

先日のAndroid Studio 2.3へのアップデートがあったあたりから、今までできていたUnityでのAndroidのビルドが突然できなくなった。ビルドしようとするとUnable to list target platforms. Please make sure the android sdk path is correct. ... というメッセージが出てきて止まってしまう。

![89185-buildfailure.png](https://qiita-image-store.s3.amazonaws.com/0/56668/0d59b68c-b0b2-51ef-97c3-b26d550eab40.png)

Android SDKのパスは何度も設定しなおして確認しているが、改善しない。

![89170-snip20170302-1.png](https://qiita-image-store.s3.amazonaws.com/0/56668/d0253c75-9add-077f-be3c-47e2d8bb28fa.png)

調べてみたところ、[Unityのフォーラム](http://answers.unity3d.com/questions/1320634/unable-to-list-target-platforms-when-i-try-to-buil.html)にドンピシャな回答があったので紹介。

※リンク切れのため[stackoverflowの記事](http://stackoverflow.com/questions/42538433/not-finding-android-sdk-unity)よりリンクを差し替え。

1. [tools_r25.2.5-windows.zip](http://dl-ssl.google.com/android/repository/tools_r25.2.5-windows.zip) をダウンロードして、好きな場所に展開する(Windowsの場合。その他のOSであれば適宜読み替えること)
2. Android Studioが利用しているAndroid SDKの場所を開き、そのフォルダの中にある*tools*フォルダを先程展開してできた*tools*フォルダで上書きする（上書きするだけでダメかもしれないので、元のtoolsフォルダを消して↑でダウンロードしたtoolsフォルダで置き換えると良いかも）

最近のAndroid Studioのアップデートに伴ってAndroid SDKにも変更があって、SDK Managerというスタンドアローンのアプリケーションが使えなくなっていたりしていたので、その影響かなと。
Railsでログイン時のルーティングを定義する(deviseのauthenticatedみたいなやつ)

deviseを使うとconfig/routes.rbに

```config/routes.rb
Rails.application.routes.draw do
  authenticated :user do
    root to: 'dashboard#show', as: :user_root
  end

  root to: 'landing#show'
end
```

こんな感じで、ログイン時とそうでない時のルーティングが書けます。

> **authenticated-instance_method**
> http://www.rubydoc.info/github/plataformatec/devise/master/ActionDispatch/Routing/Mapper#authenticated-instance_method

これをdevise以外で実現したい時は、[constraints](https://railsguides.jp/routing.html#%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%88%E3%82%92%E5%88%B6%E9%99%90%E3%81%99%E3%82%8B)で実現できます。

```config/routes.rb
class AuthenticatedConstraint
  def matches?(request)
    request.session['user_id'].present?
  end
end

Rails.application.routes.draw do
  constraints AuthenticatedConstraint.new do
    root to: 'dashboard#show', as: :user_root
  end

  root to: 'landing#show'
end
```

便利(\\( ⁰⊖⁰)/)
2つのテキストファイルの同じ要素を持つ行だけ抽出したい

grep芸だけでできた。

あるテキストファイル a.txt と b.txt について、同じ要素の行だけ抽出したいなら以下の通りにすれば良い。

`$ grep -x -f {a, b}.txt`

個数（行数）を知りたいならば


`$ grep -c -x -f {a, b}.txt`
hubotでwebhookを処理する時のデバッグ方法とかあれこれ

# 概要
hubotもnodejsもcoffeeも全く知見ない状態からやり始めて苦労したので備忘録としてメモ
webhook拾う部分とそのデバッグについて書いといた
hubotのアダプタをshellにして見るか、↓の設定しておいて```forever```で動かした後に```tail -f```しとけばデバッグ楽ちんだった

# hubotのスクリプト
```hubot/scripts/sample.js
let fs = require('fs');
let Log = require('log');
let stream = fs.createWriteStream('my.log');
let logger = new Log(process.env.HUBOT_LOG_LEVEL || 'info', stream);

module.exports = function (robot) {
  robot.logger = logger;
  robot.router.post(/webhook/, function (req, res){
    let data = req.body;
    robot.logger.info(data);
  });
};
```
my.logはhubotディレクトリ下に吐かれるよ
# NginxのリバースプロキシでPOSTを渡す設定
``` /etc/nginx/conf.d/hubot.conf
server {
  listen 80 default;
  server_name webhook.sample.com;

  if ($request_method = POST) {
    return 418;
  }
  error_page 418 @POST;
  location ~ @POST {
    proxy_read_timeout 300;
    proxy_connect_timeout 300;
    proxy_redirect     off;

    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_set_header   Host              $http_host;
    proxy_set_header   X-Real-IP         $remote_addr;
    proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header   Host $host;
    proxy_pass http://localhost:8080;
  }
}
```
参考
http://wiki.nginx.org/IfIsEvil
WordPress カスタム投稿タイプのアーカイブをカスタムメニューで追加してCSSクラスもいい感じに付与

# 歴史的経緯

- カスタム投稿タイプ自体は ver 2.9から実装されている
- 脚光を浴び始めたのは ver 3.0 ぐらいから
- カスタム投稿タイプはアーカイブが持てる、かつそのアーカイブへのリンクを作成する関数もあるのに、なぜか外観＞メニューのカスタムメニューでは追加できなかった。
    - ただし、メニューの「カスタムリンク」を使えばリンク自体は作成できたが、カスタムリンクなので `current-menu-item` といったCSSクラスは付与されなかった。
- よってカスタムメニューでカスタム投稿タイプのアーカイブを追加（かつ current などのCSSクラスが適切に付与される）ためにはプラグインを利用する必要があった

# ver 4.4以降

リリースノートにコメントとして記載されていないが、この機能はver 4.4で実装されている。

https://core.trac.wordpress.org/ticket/16075

- トラックにあるように `'has_archive' => true`であれば出てくる
- 文字列をいい感じにしたい場合は `labels` で `archives` の値を設定しておく

https://codex.wordpress.org/Function_Reference/register_post_type

こうやって作成したメニューではカスタム投稿タイプのアーカイブを表示してる時、そのメニュー要素に `current-menu-item` クラスが付与されている。

# ところが
カスタム投稿タイプの各投稿を表示してる時、カスタム投稿タイプのアーカイブのメニュー要素には `current-post-parent` や `current-post-ancestor` といった「この投稿の親（先祖）に当たる要素につくべきCSSクラス」が付与されない。
（ちなみに、投稿の場合、その投稿が所属するカテゴリーがメニューにあればそのメニューには付与されている）
なんてこった。

# どうすんの
`nav_menu_css_class` フィルターフックで。
付与する CSS クラスは ドキュメント見てよしなに。
https://developer.wordpress.org/reference/functions/wp_nav_menu/

※ただしこのコードは将来的なコアの実装でいらなくなる可能性あります

```php
<?php
function my_special_nav_class( $classes, $item ) {
	// カスタム投稿タイプ　special　の投稿が表示されてる時カスタム投稿タイプアーカイブがメニューにあればCSSクラスを追加。
	if ( is_singular( 'special' ) && $item->type === 'post_type_archive' && $item->object === 'special' ) {
		if ( ! in_array( 'current-post-ancestor', $classes ) ) {
			$classes[] = 'current-post-ancestor';
		}
	}
	return $classes;
}

add_filter( 'nav_menu_css_class', 'my_special_nav_class', 10, 2 );
```

現場からは以上です。
『Visual Studio 2019』をオフラインでインストールする方法

# Visual Studio 2019にはISOインストーラーがない

2019年4月2日、Visual Studio 2019の正式版がリリースされました。すでにRC版でダウンロードしている方もいるかもしれません。

VS2019をインストールする前に、マイクロソフトの[サイト](https://visualstudio.microsoft.com/ja/downloads/)から「ダウンロードソフト」をダウンロードすることになります。このソフト自体は小さいサイズで、すぐにダウンロードが終了します。これを展開し、起動させてると、さらに数十ギガバイトもあるVS2019 本体のダウンロードが始まります。気が遠くなりますね。

前の2015バージョンにはISOファイルがダウンロードサイトにあり一度ダウンロードすれば次からはISOファイルからインストールできましたが、2017版と今回はISOファイルが用意されていないようです。

これは別のPCに入れる際も、最初のダウンロードから始まり、インストールまで同じ手順を踏まなければならないことを意味します。

たとえ高速インターネットに接続していても、毎回40GB近いデーターをPCごとにダウンロードするには無駄が多いと思います。（VS2019はVS2017と比べ、データ量は減ったようです）

![vs2019.png](https://qiita-image-store.s3.amazonaws.com/0/139807/5c1b92aa-0eda-ce06-1360-3e2ed9e454e7.png)


# オフラインインストールファイルの作り方

そこで、本題に入ります。ISOのインストーラーがないと書きましたが、VS2019(VS2017も）には「オフラインインストールファイル」を作成して、オフラインのPCでもインストールできる方法があります。これだけ聞いただけで、敷居の高さを感じますが、我慢して順番に見ていきましょう。

1. まず[Visual Studio 2019](https://www.visualstudio.com/downloads/)のインストーラーをダウンロードします。（以後Communityを例にあげます）。

2. OSがWindows 10であれば、C:\Users\<username>\Downloadsフォルダ内に「vs_community__xxxxxxxx.xxxxxxx.exe」ファイルがあるはずです。

3. このダウンロードフォルダ内の空きスペースにカーソルを持っていき、Shift＋右クリックを押して、メニューにあるコマンドプロンプトを起動させます。メニューがない場合は、コマンドプロンプトを起動したあと、ダウンロードした同じフォルダー内にカレントディレクトリを置きます（Windows10の場合、左下の「ここに入力して検索」に`cmd`または`dos`と入力し、コマンドプロンプトを選びます）。Cドライブ直下であれば、`cd c:\`と入力してカレントディレクトリを移動させます。

4. コマンドラインに以下のように入力します。(ローカルのフォルダー名は任意で決めてください)
　`vs_community__xxxxxxxx.xxxxxxx.exe --layout c:\vs2019offline`
　ダウンロードされたファイル名(vs_community__xxxxxxxx.xxxxxxx.exe)をコピーして貼り付けてください。インストールしたいディレクトリを最後に記述します。実行後、しばらくすると別のコマンドプロンプトが立ち上がりファイルのダウンロードが開始されます。

5. ４のコマンドでダウンロードされるファイルサイズが20GBを超えますので、回線の混んでいないときに実施したほうが良いでしょう。平均的な回線速度でもダウンロードに数時間程度かかります（VS2019ではファイルサイズが減り、ダウンロード時間がVS2017に比べかなり高速になりました。回線状況により、もっとかかる場合もあります）。ダウンロードが完了したら、VSのダウンロード用コマンドラインに完了のメッセージが表示されます。これでオフラインインストールファイルの作成が完了しました。

6. インストールする場合は、c:\vs2019offline\vs_community__xxxxxxxx.xxxxxxx.exeをクリックして実行します。インストール・ウィザードの手順に従います。

上の4のコマンドの記述を変更すると、ダウンロードする言語やコンポーネントを選択できます。上のコマンドだとすべての言語、及びすべてのコンポーネントがダウンロードされます。通常はそれでいいのですが、ダウンロードのサイズを減らすために、必要な言語とコンポーネントを選択することができます。

・英語と日本語言語の全コンポーネントをダウンロード

```
vs_community__xxxxxxxx.xxxxxxx.exe --layout C:\vs2019offline --lang en-US ja-JP
```

・日本語のみの全コンポーネントをダウンロード

```
vs_community__xxxxxxxx.xxxxxxx.exe --layout C:\vs2019offline --lang ja-JP
```

・オプションのコンポーネントをダウンロードする場合

```
vs_community__xxxxxxxx.xxxxxxx.exe --layout C:\vs2019offline --add Microsoft.VisualStudio.Workload.Azure
```

#最新バージョンにアップデートする方法

クライアントPCからVS2019 を最新のアップデート得る場合は、Visual Studio Installer（インストーラー）を実行し、更新(update)を押します。この場合、インターネット経由でオンライン・ダウンロードされるので注意が必要です。

社内ネットワークならサーバー側のデーターを常に最新にしておけば、クライアントPCからいつでも最新のVisual Studioがダウンロードできます。

最初にサーバー用PCのローカルにVisualStudio2019をダウンロードします。

コマンドプロンプトを開きます。サーバー用PCでカレントディレクトリを更新前のデーターがあるVS2019offlineフォルダー内に置きます。
最初にダウンロードした時と同じように、次のコマンド実行します。

```
vs_community__xxxxxxxx.xxxxxxx.exe --layout c:\vs2019offline
```

サーバーPCに更新ファイルが追加されます。（１時間～数時間程度かかります）
次に、クライアントPCからサーバー側PCのvs_community__xxxxxxxx.xxxxxxx.exeファイルをクリックし、ダウンロード、インストールします。
IAMユーザーで請求情報を見る方法

#目次
- アカウントで設定
- 必要に応じてIAMロールを設定


#手順
①IAMユーザーで請求情報を見るためには、まず、rootアカウントでログインし、
TOPページの[アカウント名]から展開し、[アカウント]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159589/7806cce2-1c9f-932b-4286-7487a97b13c0.png)

---

②アカウントの中の「IAMユーザー/ロールによる請求情報へのアクセス」の[編集]をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/159589/39266398-c6d8-295e-3803-c147d6402a74.png)

---

③[IAMアクセスのアクティブ化]のチェックボックスにチェックを入れ、[更新]をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159589/6e659fe1-5d0c-e2ea-4be9-f4476684cc34.png)

---

④ユーザーもしくはグループがAdminAccessのポリシーをつけていれば何もしなくても見れるが、
参照だけしたい場合は、IAMロールからBillingを選択しアタッチすればOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159589/b151ad9b-0c7e-9479-d32b-ceb4a0d8f15b.png)
Failed to find required executable git

# 再現手順

sudo でrootユーザーの実行権限で、次のようなplaybookを実行したら発生する。

```yml:playbook.yml
- hosts: localhost
  connection: local
  tasks:
  - name: clone github repos
    tags: github
    sudo: no
    git:
      repo: https://github.com/cubicdaiya/slackboard.git
      dest: $HOME/slackboard
```

# 現象

次のようなエラーが発生してリポジトリをCloneできない。

```
TASK [clone github repos] ******************************************************
fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "Failed to find required executable git"}
```

# 原因

sudoで実行するrootユーザーに、gitのPATHが通っていないため、gitが実行できない。

# 対応方法

昔は、`sudo=no` をtaskに指定すればよかったが、Ansible 1.9 から非推奨になっている。

```
[DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and make sure become_method is 'sudo' (default).
```

[becom](http://docs.ansible.com/ansible/become.html)を使うことが推奨されている。
各種高位合成ツールが生成するモジュールの外部インターフェース

# はじめに

ちょっと内輪で必要になったので各種高位合成ツールが生成するモジュールの外部インターフェースをまとめてみました。まだ未完成です。これからいろいろと追加していく予定。


# Synthesijer Method Interface

![Fig.1 Synthesijer Method Interface](https://qiita-image-store.s3.amazonaws.com/0/24981/d39866b3-9ac1-d944-dba1-c72852d14f0c.jpeg "Fig.1 Synthesijer Method Interface")

Fig.1 Synthesijer Method Interface

<br />



* 制御は  _func_  \_req と  _func_  \_busy の2本のハンドシェイク。
*  _func_  \_busy が L の時に  _func_  \_req を H にすることでメソッド呼び出し(cycle 1)。
*  _func_  \_busy が H になった時点で速やかに  _func_  \_req をL にする(cycle 2)。ただし次のクロックの立ち上がり(cycle 3)まで H でも可。
* メソッドの引数は  _func_  \_req が H の時に有効な値を入力(cycle 2)。
* メソッドの終了は  _func_  \_busy が H から L に遷移したことで判別する(cycle 6)。
* メソッドの戻り値は  _func_  \_busy が H からL に遷移したサイクル(cycle 6)の一つ前のサイクル(cycle 5)で出力されるようだ。
* cycle 5 でなんらかの信号を出力してくれると、呼び出し側としては１サイクル早くシーケンスを進めることが出来るのにと思わないでもない。




# Polyphony Method Interface



![Fig.2 Polyphony Method Interface](https://qiita-image-store.s3.amazonaws.com/0/24981/58dab016-abfa-9974-ff90-9bd8ff462c8e.jpeg "Fig.2 Polyphony Method Interface")


Fig.2 Polyphony Method Interface

<br />



* 制御は  _func_  \_ready、  _func_  \_valid、  _func_  \_accept の３本。
*  _func_  \_ready を H にすることでメソッド呼び出し(cycle 1)。   
ただしモジュールが動作中かどうかを示す信号が提供されていないので、メソッド呼び出しに関してハンドシェイクが出来ないのが難点。メソッド実行中に  _func_  \_ready を H にしても無視される。
* メソッドの引数は  _func_  \_ready が H の時に有効な値を入力(cycle 2)。
* メソッドの戻り値は  _func_  \_valid が H の時有効(cycle 5〜)
* メソッドの終了は  _func_  \_valid が H の時に  _func_  \_accept を H にした時(cycle 5)。
* メソッド終了(cycle 5)以降も  _func_  \_valid は H の状態であることに注意。次のメソッド開始まで H の状態を保つ。


# Vivado-HLS Method Interface



![Fig.3 Vivado-HLS ap_ctrl_hs Interface (non-pipeline)](https://qiita-image-store.s3.amazonaws.com/0/24981/b6a457be-81c9-189b-7ab9-7a6614c38b1d.jpeg "Fig.3 Vivado-HLS ap_ctrl_hs Interface (non-pipeline)")

Fig.3 Vivado-HLS ap_ctrl_hs Interface (non-pipeline)

<br />

* メソッドの開始は ap_start と ap_ready でハンドシェイク。   
ap_start を H にすることでメソッド開始。ap_ready が H になるまで ap_start は H の状態を保つ。
* メソッドの引数は ap_start が H の時に有効な値を入力(cycle 1-5)。
* メソッドの終了は ap_done が H になったことで判別(cycle 5)。
* メソッドの戻り値は ap_done が H の時有効(cycle 5)。
* メソッドが動作中は ap_idle は L になる。
* パイプライン処理で無い場合は、ap_ready が H になるタイミングは ap_done が H になるタイミングと同じ(cycle 5)。
* パイプライン処理の場合は下の図のようにap_ready が H になるタイミングと ap_done が H になるタイミングがズレる。


![Fig.4 Vivado-HLS ap_ctrl_hs Interface (pipeline)](https://qiita-image-store.s3.amazonaws.com/0/24981/3dfac3cc-68e6-4ef8-344f-37f33045e0a1.jpeg "Fig.4 Vivado-HLS ap_ctrl_hs Interface (pipeline)")


Fig.4 Vivado-HLS ap_ctrl_hs Interface (pipeline)

<br />
react-native + redux で hot reloading でのエラー対応

ベタに書くと、 Redux 2.x からは Hot Reloading に失敗してエラーが出る。

```js
const store = createStore(reducers);

class App extends Component {
  render() {
    return (
      <Provider store={store}>
        <View>
          <Router />
        </View>
      </Provider>
    );
  }
}

export default App;
```

![スクリーンショット 2017-03-08 14.08.42.png](https://qiita-image-store.s3.amazonaws.com/0/5330/d44ffc31-4d53-419a-9983-e18c7db7a680.png)

# 対応法

store の動的差し替え出来るようなコードにする。

```
function configureStore() {
  return createStore(reducers);
}

class App extends Component {
  state = {
    store: configureStore(),
  };
  render() {
    return (
      <Provider store={this.state.store}>
        <View>
          <Router />
        </View>
      </Provider>
    );
  }
}

export default App;
```

It works!
Mac OS CatalinaでXAMPPとかでメール送信を行う。

※「postfix動かそうとしてもログが/var/log/maillogに無い件」という記事を書き換えました。

#Mac でXAMPPとかでメール送信させてみる

### 以下Sierraのときに書いた記事だったけど、Catalinaも同様でした。ただ、ipv6を使うと送信先がGmailだと接続を許さないのでipv4設定を行うこと。

下のほうに記述してあるSMTPログをキャッチすると以下のログがでていることがわかる。
ちょっと改行してわかりやすくしてます。
ipv6使う場合は、認証しろよってことです。

```
relay=ASPMX.L.GOOGLE.COM[2404:6800:4008:c04::1a]:25, 
delay=2.2, 
delays=0.19/0.01/1.5/0.49, 
dsn=5.7.1, 
status=bounced (host ASPMX.L.GOOGLE.COM[2404:6800:4008:c04::1a] 
said: 550-5.7.1 [240d:1b:2f:9700:5cc1:b:db35:f619] 
Our system has detected that this 550-5.7.1 message 
does not meet IPv6 sending guidelines regarding PTR records 550-5.7.1 and authentication. 
Please review 550-5.7.1  
https://support.google.com/mail/?p=IPv6AuthError for more information 
550 5.7.1 . e77si318755pfh.23 - gsmtp (in reply to end of DATA command))
```

### macのpostfixを設定
postfixはデフォルトで、protocolがallになっているので、ipv4だけにします。

```bash:/etc/postfix/main.cf
#inet_protocols = all
inet_protocols = ipv4
```

ちなみに、postfixは、SMTPサーバーでもあるけどクライアントでもあります。なので、常時起動（デーモン）でなくてもいいです。なので、ファイルを編集するだけで、すぐ適用されると思ってください。

ちなみに、メールが送れたり送れなかったりするのは、all指定されているので、ipv4だったりipv6だったりどういうタイミングかわからないけど勝手に使い分けているので、ivp4固定にすればそういう問題も解決です。

---
Macで開発してて、ローカル環境にてウェブはMANPP とか　XAMPPとかあって便利だけど最近のウェブアプリはメール送信したりけっこうあるよね。

Macにはpostfixってのが基本的には入ってて、起動はしてないけどpostfix startで起動できる。
（自動起動させる方法もあるけどまあ、開発のときだけstartすればいいので）

で、設定したんだけど、ぜんぜんメールできへん！って思って調べても、/var/log/maillogを見ればってある。そう、Linuxだとあたりまえのようにそれをみればすぐわかる。

でも、Sierraになってから（もう一つ前からかもしれないけど）/var/log/maillogが無い。どこにもない。ぜんぜんない。syslogだと/var/log/maillogを用意しておいてあげる必要があるとおもって、

```
touch /var/log/maillog
```
としても、ファイルに追記されない。
どーにもこーにもできずに数日経過。

もう一度検索したら見つかった。

> MaOS Sierra postfix doesn't write log
> https://discussions.apple.com/thread/7691357?start=0&tstart=0


```bash:commandline
log stream --predicate  '(process == "smtpd") || (process == "smtp")' --info
```

これを起動させておくとsmtpd、smtpdの情報が取れる。なんなら

```bash:commandline
log stream --predicate  '(process == "smtpd") || (process == "smtp")' --info > /var/log/maillog
```
こうすればmaillogできるけど、まあ、Windowを２つ開いてやればええな。

ということで、すぐさま、設定ファイルの一部が間違っているのがわかって修正して無事起動しましたとさ。
エラーログって大事ですね。大事ですね。
認証局(CA)の構築と証明書作成


#環境

##OS
CentOS 6.7

##OpenSSL
OpenSSLをアップデートする。

```Bash
# アップデート
$ sudo yum install openssl
# バージョン確認
$ openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013
```

#認証局(CA)の構築

```Bash
# CA作成用のスクリプトと設定ファイルがあるので、/etc/pki/CAにコピーして使用
$ sudo cp -p /etc/pki/tls/misc/CA /etc/pki/CA/
$ sudo cp -p /etc/pki/tls/openssl.cnf /etc/pki/CA/

# スクリプトを修正
$ sudo vi /etc/pki/CA/CA

== 以下を修正 ==
CADAYS="-days 3650"     # 10 years
SSLEAY_CONFIG="-config /etc/pki/CA/openssl.cnf"

# openssl.cnfを修正
$ sudo vi /etc/pki/CA/openssl.cnf

== 以下を修正 ==
countryName_default
stateOrProvinceName_default
localityName_default
0.organizationName_default

# CA秘密鍵とCA証明書の作成
$ sudo /etc/pki/CA/CA -newca

== 生成物 ==
/etc/pki/CA/cacert.pem・・・CA証明書
/etc/pki/CA/private/cakey.pem・・・CA秘密鍵
/etc/pki/CA/careq.pem・・・CA証明書の作成に使ったCSR

# CA秘密鍵のアクセス制限 (rootのみアクセス可能)
$ sudo chmod 600 /etc/pki/CA/private/cakey.pem
```

#SSL証明書の作成

```Bash
# サーバー用SSL証明書のためのCSRと秘密鍵を生成
$ sudo /etc/pki/CA/CA -newreq

== 生成物 ==
./newreq.pem・・・サーバー証明書の作成に使用するCSR
./newkey.pem・・・サーバー秘密鍵

# 作成したCSRに署名する
$ sudo /etc/pki/CA/CA -sign

== 生成物 ==
./newcert.pem・・・サーバー証明書

# 秘密鍵のパスワードを解除する(必須ではない)
$ sudo openssl rsa -in newkey.pem -out cert.key

== 生成物 ==
./cert.key・・・パスワードを解除したサーバー秘密鍵

あとは、cert.keyとnewcert.pemを適当な場所に置いて使用する。
```

#参考資料
- https://www.qoosky.io/techs/c41cdb3b7f
- https://rms-digicert.ne.jp/howto/basis/decrypt_key.html
- http://www.asobou.co.jp/blog/web/ssl
- http://gihyo.jp/design/serial/01/server-knowledge/0003?page=1
- http://qiita.com/numa_numa/items/c53d137f06fe6266df03
- http://qiita.com/Ka2ya30201/items/0d4ae08e1eda5fa6c821
Grafana で設定されているグラフのクエリ式をさっと確認する


**grafana-print-expr.sh**

```sh
#!/bin/bash

set -eu

for dashboard in "$@"; do
  curl -s \
    -H "Authorization: Bearer $GRAFANA_KEY" \
    -H "Content-type: application/json" \
    "http://$GRAFANA_HOST/api/dashboards/db/$dashboard" |
    jq -r --arg dashboard "$dashboard" '
      .dashboard.rows[].panels[] |
      select(has("targets")) |
      ["[" + $dashboard + "::" + .title + "]", (.targets[].expr | . + "\n")][]
    ' |
    sed 's/^\[/\x1b[0;32m[/' |
    sed 's/\]$/]\x1b[m/'
done
```

例えばこんな感じの出力が得られる。

```sh
./grafana-print-expr.sh prometheus-stats
```

```
[prometheus-stats::Uptime]
(time() - process_start_time_seconds{job="prometheus"})

[prometheus-stats::Local Storage Memory Series]
prometheus_local_storage_memory_series

[prometheus-stats::Interal Storage Queue Length]
prometheus_local_storage_indexing_queue_length

[prometheus-stats::Samples ingested (rate-5m)]
rate(prometheus_local_storage_ingested_samples_total[5m])

[prometheus-stats::Target Scrapes (last 5m)]
rate(prometheus_target_interval_length_seconds_count[5m])

[prometheus-stats::Scrape Duration]
prometheus_target_interval_length_seconds{quantile!="0.01", quantile!="0.05"}

[prometheus-stats::Rule Eval Duration]
prometheus_evaluator_duration_seconds{quantile!="0.01", quantile!="0.05"}
```
rbenv でインストールした fakes3 を launchctl 経由で起動するように設定する


毎回立ち上げるのが面倒だったので設定した時のメモ

### 環境:
- OSX: v10.12.3
- rbenv: 1.1.0-2-g4f8925a

### 前提:

rbenv はユーザーにインストールしてる

### 参考:
- https://gist.github.com/nebiros/2776085
- http://serverfault.com/questions/111391/use-an-environment-variable-in-a-launchd-script
- http://paulownia.hatenablog.com/entry/2013/03/09/202949

### 実行コマンド

```sh
gem install fakes3
cat << EOS > ~/Library/LaunchAgents/homebrew.mxcl.fakes3.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>KeepAlive</key>
    <dict>
      <key>SuccessfulExit</key>
      <false/>
    </dict>
    <key>Label</key>
    <string>homebrew.mxcl.fakes3</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/$USER/.rbenv/shims/fakes3</string>
      <string>-r</string>
      <string>/usr/local/var/fakes3</string>
      <string>-p</string>
      <string>4567</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WorkingDirectory</key>
    <string>/usr/local/var</string>
    <key>StandardErrorPath</key>
    <string>/usr/local/var/log/fakes3.log</string>
    <key>StandardOutPath</key>
    <string>/usr/local/var/log/fakes3.log</string>
  </dict>
</plist>
EOS

launchctl load ~/Library/LaunchAgents/homebrew.mxcl.fakes3.plist
```
EC2にGoのパッケージ依存関係ツールdepをインストールする

EC2にyumでepelリポジトリで追加したgoでdepをインストールしようとすると今現在エラーが出てできない。


```
$ sudo yum install -y golang
```

```
$ go get -u github.com/golang/dep/...
# github.com/golang/dep
..\github.com\golang\dep\lock.go:130: enc.SetIndent undefined (type *json.Encoder has no field or method SetIndent)
..\github.com\golang\dep\lock.go:131: enc.SetEscapeHTML undefined (type *json.Encoder has no field or method SetEscapeHTML)
..\github.com\golang\dep\manifest.go:129: enc.SetIndent undefined (type *json.Encoder has no field or method SetIndent)
..\github.com\golang\dep\manifest.go:130: enc.SetEscapeHTML undefined (type *json.Encoder has no field or method SetEscapeHTML)
```

このときインストールされているgoが`1.6.3`となっている。

```
$ go version
go version go1.6.3 linux/amd64
```

depのissueによると`1.7`以上でないといけないそうです。
https://github.com/golang/dep/issues/230


バージョン`1.6.3`のGoを削除する。

```
$ sudo yum remove golang
```

バージョン`1.7`のGoをインストールする。

```
$ cd /tmp
$ wget https://storage.googleapis.com/golang/go1.7.linux-amd64.tar.gz
$ tar -xvf go1.7.linux-amd64.tar.gz
$ mv go/ /usr/local/go/
$ echo "export GOPATH=${HOME}/.golang" >> ~/.bashrc
$ echo "export GOROOT=/usr/local/go" >> ~/.bashrc
$ echo "export PATH=$GOPATH/bin:$GOROOT/bin:$PATH" >> ~/.bashrc
$ . ~/.bashrc
```

goが`1.7`以上になったことを確認。

```
$ go version
go version go1.7 linux/amd64
```

以上でインストールして使えるようになる。

```bash
$ mkdir -p $GOPATH/src/production
$ cd $GOPATH/src/production
$ git clone https://github.com/xxxxxxxxxx/xxxxxxxxxxxx.git .

$ go get -u github.com/golang/dep/...
$ dep init
$ dep ensure
```

# 参考
http://mattn.kaoriya.net/software/lang/go/20170125023240.htm
https://tecadmin.net/install-go-on-centos/
EC2インスタンス内から情報を取得する方法

# 概要

AWS EC2のインスタンスIDやホスト名、AMI-IDなどの情報を、EC2インスタンス内から取得する方法を記載します。
169.254.169.254を叩くと色々と教えてくれるようです。


## インスタンスIDを取得する
curlコマンドを使って取得できます。

````
$ curl 169.254.169.254/latest/meta-data/instance-id/
i-577f7355
```

## 取得可能な項目一覧
何が取れるかを知りたいときに

```
$ curl http://169.254.169.254/latest/meta-data/
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
instance-action
instance-id
instance-type
kernel-id
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
```

## グローバルIPアドレスを知りたいとき

EC2インスタンスに付与されている、IPv4アドレスを知りたい場合は、このコマンドで取得できます。

```
$ curl -q http://169.254.169.254/latest/meta-data/public-ipv4
xxx.xxx.xxx.xxx
```
PostCSSをが使えるwebpackでつくったときのメモ


PostCSSで遊ぶためにミニマムな環境作った時メモ

* https://github.com/eiel/start-PostCSS-in-WebPack/tree/v0.0.2

```
$ yarn
$ yarn serve
```

で作業環境が立ち上がる。

cssどうなってるかみたい場合は、思ったら開発者ツールのSourceでみる。
`yarn build`すると`dist`ディレクトリに`index.html`、`bundle.js`、 `styles.css`ができるので、そこをみてもよい。

# 使ったもの

* webpack
* webpack-dev-server 
	* プレビューするのにつかう
* html-webpack-plugin
	* html生成するのに使う
* style-loader
	* 読み込んだCSSをDOM適用したり、styleタグで挿入してくれるみたい。入ってるけど、ExtractTextPluginで切り出してるのでいらないっぽい。
* postcss-loader
	* cssファイルを呼んで AST に変換して、設定されているプラグインを適用してCSSにするっぽい。(ちゃんとみてない
* css-loader
	* CSSを読み込みする
* extract-text-webpack-plugin
	* CSSを別ファイルに分離するのに使う

# やったこと

* 必要なnode_modulesのインストール
* postcss.config.jsの作成
* webpack.config.jsの作成
* postcssに処理をかけるCSSの用意 (app/css/index.css)
* cssをloaderする javascriptを用意 (app/index.js)

# 追伸

リポジトリ名をにWebPackってしてしまったがwebpackが正しいです。
python-fireへの雑な理解と素振りメモ

[Python-fire](https://github.com/google/python-fire)の記事とかがはてぶとかでちょこちょこ上がったので、素振りして見たメモ。

# 動作確認してた環境

- Macbook Pro 13inch Early 2015
- Python 3.6.0 from pyenv

# 自分でREADMEを読んでみただけの時の感想

`argparse`でよくね？


# 実際に比較する

単純な「受け付けた引数2個を足した結果をかえす」サブコマンド`add`を持つCLIについて考えてみました。
`calc-1.py`は`python-fire`に任せたもの、`calc-2.py`はそれを`argparse`に置き換え直したものです。

```py3:calc-1.py
import fire

class Calcurator(object):
    def add(self, first, second):
        return int(first) + int(second)

if __name__ == '__main__':
    fire.Fire(Calcurator)
```

```py3:calc-2.py
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('mode')
parser.add_argument('first')
parser.add_argument('second')

class Calcurator(object):
    def add(self, first, second):
        return int(first) + int(second)

if __name__ == '__main__':
    args = parser.parse_args()
    cli = Calcurator()
    print(getattr(cli, args.mode)(args.first, args.second))
```

ものすごく、可読性がよくなる気がする。
ちょこちょこCLIな処理を書くと、コードの結構な割合をargument parserの部分が占めるので、これがなくなると割とありがたいかもしれない。

## ヘルプ表示的なもの

`(subcommand) -- --hep`で引数情報とかを取ってくれるらしい。

```shell-session:calc-1.py
$ python calc-1.py add  -- --help
Type:        method
String form: <bound method Calcurator.add of <__main__.Calcurator object at 0x1036f8fd0>>
File:        ~/Dropbox (nijibox)/Applications/act/calc-1.py
Line:        5

Usage:       calc-1.py add FIRST SECOND
             calc-1.py add --first FIRST --second SECOND
```

```shell-session:calc-2.py
$ python calc-2.py -h
usage: calc-2.py [-h] mode first second

positional arguments:
  mode
  first
  second

optional arguments:
  -h, --help  show this help message and exit
```

ファイル情報とかはちょっと邪魔だけど、Usageとしての役割は果たしている模様。

## 処理時間を比較する

何も考えずに呼び出しをすると、あからさまに`calc-1.py`の方が処理が遅くなる。

```shell-session
$ time python calc-1.py add 12345 67890
80235
python calc-1.py add 12345 67890  0.60s user 0.29s system 30% cpu 2.945 total

$ time python calc-2.py add 12345 67890
80235
python calc-2.py add 12345 67890  0.07s user 0.07s system 77% cpu 0.179 total
```

単純に一回だけ比較するとこんな感じ。0.5secぐらいの差がある模様。

で、こんなループをさせてみた。

```py3:loop.py
import sys
import subprocess

script = sys.argv[1]
count = int(sys.argv[2])

for _ in range(count):
    proc = subprocess.Popen('python {} add 12345 67890'.format(script).split(), stdout=None)
    proc.communicate()
```

```shell-session:loop.py
$ time python loop.py calc-1.py 10 > /dev/null
python loop.py calc-1.py 10 > /dev/null  4.29s user 1.20s system 97% cpu 5.651 total

$ time python loop.py calc-2.py 10 > /dev/null
python loop.py calc-2.py 10 > /dev/null  0.40s user 0.17s system 93% cpu 0.614 total

$ time python loop.py calc-1.py 100 > /dev/null
python loop.py calc-1.py 100 > /dev/null  45.53s user 12.45s system 88% cpu 1:05.32 total

$ time python loop.py calc-2.py 100 > /dev/null
python loop.py calc-2.py 100 > /dev/null  3.39s user 1.06s system 94% cpu 4.731 total

```

雑に回数重ねてみたけど、平均するとやっぱり0.4〜0.5秒ぐらいの時間が余計にかかっている感じ。
サンプルコードはメイン処理が余りにもシンプルな処理なことを考慮すると、実運用だと誤差になってくるケースは十分ありそう。


# 軽く検証した後の感想

`python-fire`いいな
簡単MVVM入門 with Prism

Prismを用いたMVVMの簡単なサンプルページが少なかったので勉強も兼ねて書いてみる。

MVVMとは、大規模なプログラムになってくるとコードビハインドにコードを書いてると魑魅魍魎と化してしまい、保守性が損なわれてしまうのでView+Model+ViewModelの三役でプログラムを制御できたらいいなってことで開発された技術である。多分WebフレームワークのMVCみたいなものである。.NET標準機能だけでMVVMを実装すると大変なのでLivetとかPrismみたいなMVVMフレームワークを用いるのが普通らしい。今回は足し算するだけのWPFアプリケーションを作ってみよう。

###Prismの導入
NuGet経由で

###Modelの実装
ここにはViewModel,Viewに書かれるべきでない処理を書いてやる。プログラムの大まかなロジックとかはここに書いてやれば良い。特筆することはない。

```C#:Model.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Calclator.Model
{
    class Models
    {
        public double calc(double x, double y)
        {
            return x + y;
        }    
    }
}
```

###VIewModelの実装
View,ViewModel間の状態変化を通知するのに```INotifyPropertyChanged```なるものを実装しないといけないのだが、.NET標準機能のみで実装すると面倒なのである。そこでPrismの出番である。```BindableBase```というのが標準実装されていてこいつを使えば以下のように実装できる。コード中で実装されている```DelegateCommand```というやつはViewのボタンとデータバインディングしてやり処理を行う時に用いる。普通のMVVMなら```ICommand```とか実装してやらないとダメらしいけどここもPrismが頑張ってくれている。

```C#:ViewModel.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Calclator.Model;
using Calclator.ViewModel;

using Microsoft.Practices.Prism.Commands;
using Microsoft.Practices.Prism.Mvvm;

namespace Calclator.ViewModel
{
    class ViewModels : BindableBase
    {
        public Models model;

        public ViewModels()
        {
            model = new Models();
        }

        private double _x;
        public double X
        {
            get { return _x; }
            set { SetProperty(ref _x, value); }
        }

        private double _y;
        public double Y
        {
            get { return _y; }
            set { SetProperty(ref _y, value); }
        }

        private double _ans;
        public double Ans
        {
            get { return _ans; }
            set { SetProperty(ref _ans, value); }
        }

        private DelegateCommand calcComamnd;
        public DelegateCommand calcCommand
        {
            get { return calcComamnd = calcComamnd ?? new DelegateCommand(calc); }
        }

        private void calc()
        {
            Ans = model.calc(X, Y);
        }
    }
}
```

###Viewの実装
ツールボックスからTextBoxを3つ、ボタンを1つ並べてやり、TextBoxをそれぞれViewModelsのX,Y,Ansとデータバインディング、ButtonをcalcCommandとバインディングしてやる。コードビハインドには```InitializeComponent()```の下に```this.DataContext = new ViewModels()```とだけ書いてやれば良い。コードビハインドの行数の少なさ、これがMVVMの醍醐味と言えよう。(多分)
【Chrome】隠しFormの送信が出来なくなった

# Chromeで隠しFormオブジェクトの送信が出来なくなった

## 概要
JavaScriptで画面上に存在してないフォームを生成してsubmitしたら面白いんじゃないか？

と思い立って、内向けのシステムに以下のような記述をやって、動作させていました。

```js
var form = $("<form></form>");
form.attr({
    "action": "http://localhost/#",
    "method": "post",
    "accept-charset": "UTF-8",
    "enctype": "application/x-www-form-urlencoded"
});

form.append("<input type='hidden' name='hoge' value='hage'>");
form.submit();
```

具体的には、jsのファイル内部でしか存在しないformオブジェクトを作成し、それをHTMLに書き出さないままpostすることで、HTML上にあるpostのフォームと同じ意味のことを、HTML内にはフォームが存在してなくても行うという感じです。

ちなみに完全に内向けのサービスなので、利用ブラウザはChromeのみです。

## ところが・・・
最近、利用者から上記のスクリプトで書いたページで送信が出来なくなっていると連絡が入りました。
確認すると、どうやら最近のアップデートで、こういうことをやろうとするとChromeのコンソールで以下のWarningエラーが発生し、動作できないようになっているようでした。

> Form submission canceled because the form is not connected

## 解決
解決というよりは場当たり的な方法ですが、以下のようにしたら動作しました。

```js
var form = $("<form></form>");
form.attr({
    "action": "http://localhost/#",
    "method": "post",
    "accept-charset": "UTF-8",
    "enctype": "application/x-www-form-urlencoded"
});

form.append("<input type='hidden' name='hoge' value='hage'>");
$("body").append(form);
form.submit();
```

submitした時点で画面遷移してフォームが消えるのであんまり変わらない気がしますが、少なくともbody内にformがあればいいようです。
~~最初からページ内にform作って、idでも割り振っておいて内部にappendやsubmitしたほうが良いと思います~~

## 備考
ちなみに今回の件とは完全に関係ないですが、httpsページで上記の操作を行ってhttpページへ送信するとこっちのWarningエラーも同時に出ます

> Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.

以上です。
せっかく書いたチケットの内容がWAFのせいで失われる前に

ポエム

チケットの本文を一生懸命書いたけど、WAFに引っかかって、書いた内容が全て失われてしまった。。。
なんてことが、結構ある。

引っかかる理由は、色々あるらしいけど基本的に非公開。
ディレクトリのパスなどを書くと引っかかるようだけど、書かざるを得ない。

引っかかった場合は、落ち着いてブラウザのDeveloperToolsを起動して、再POSTしよう、どうせ引っかかるけど、POST内容がわかるので、時間をかけて書いたチケットの内容が抜き出せる。

これを思い出せば、ひどい言葉を吐かなくて済む。
LINE Messaging API for PHPをherokuで運用するには？

# はじめに

LINE Messaging API for PHPでbotを作り、それをどうしてもherokuで動かしたかったのですが、どうにもこうにも反応してくれない。ふと、Fixieのプロキシを通してないからだと気付き、SDKを少しだけ改修する必要があることに気がつきました。ちなみにLINE Messaging API for PHPのライセンスは「Apache License v2.0」なので改修OKです。

LINE BOT API Trialで作られたbotの記事などでは、こうしたことにはほとんど触れられてないので気にせず動かせたのだと思いますが、LINE Messaging APIになってからは、恐らくこの修正をしないとherokuでは動かせないのではないかと思います。

そこでこの記事では、heroku上でどうしてもLINE Messaging API for PHPを動かしたい人のためのヒントになればと思いまとめてみました。

# herokuの設定

この記事に興味を持ってくれた人は言われなくてもわかるかと思いますが、まずherokuでIPを固定にするためにアドオンのFixieを導入してください。導入後、FixieのプロキシURLが自動的にherokuの環境変数に登録されますが、ポート番号は削除しておきます。

***修正前***
`FIXIE_URL http://fixie:**********.usefixie.com:80`

***修正後***
`FIXIE_URL http://fixie:**********.usefixie.com`

またFixieのアカウント設定の画面に表示される二つのIPを控えておいてください。

# LINE BUSSINESS CENTERの設定

アカウント一覧に表示れている制作中のボットのカラムから「LINE developers」の画面に移動し、サイドメニューの「Server IP Whitelist」を選択してください。表示されているフォームにFixieで控えておいた二つのIPを登録しておきます。ちなみにポート番号は不要なようです。

# SDKの改修

/vendor/linecorp/line-bot-sdk/src/HTTPClient/CurlHTTPClient.php

***改修前：90行目***

    $headers = array_merge($this->authHeaders, $this->userAgentHeader, $additionalHeader);
 
    $options = [
        CURLOPT_CUSTOMREQUEST => $method,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_HEADER => false,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_BINARYTRANSFER => true,
        CURLOPT_HEADER => true,
    ];

***改修後：90行目***

    $headers = array_merge($this->authHeaders, $this->userAgentHeader, $additionalHeader);
 
    $options = [
        CURLOPT_CUSTOMREQUEST => $method,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_HEADER => false,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_BINARYTRANSFER => true,
        CURLOPT_HEADER => true,
        // 以下を追加します。
        CURLOPT_HTTPPROXYTUNNEL => true,
        CURLOPT_PROXYPORT => '80',
        CURLOPT_PROXY => getenv('FIXIE_URL'),
    ];

プロキシのURLは直接記述せず、登録してある環境変数を参照した方がスマートかと思います。

# 最後に

自分の場合は、このことに気がつくまでに何時間も無駄にしてしまいました。。。どうしてもherokuでLINEボットを動かしたいと思っている人のヒントになれば幸いです。それともこんなことをしなくても動かすことができるのでしょうか。何かご存知でしたら教えていただければと思います。LINE BOT AWARDSにわたしもエントリーしてみたのですが、さてさて結果はどうなるんでしょうか。

それでは、このへんで。
Grafana + Heapster + InfluxDB で Kubernetes のリソース監視をする

Qiita 初投稿なので手探りしつつ執筆...

最近 Kubernetes と戯れてるのだけど，k8s のリソース監視鉄板ってなんじゃらほいって調べたら addon として Grafana + Heapster + InfluxDB を使うことが出来るらしい．addon なら簡単っしょ，と思って導入しようとしたけど思いっきり時間がかかってしまったので記事にしてみるなぞ．

## 何も考えずに kubectl create -f してみる

addon ということで，公式に Deployment と Service を用意してくれてます．
[kubernetes/heapster](https://github.com/kubernetes/heapster)
こいつを clone してきておもむろに，
`kubectl create -f heapster/deploy/kube-config/influxdb/`
...多分起動しません．

## ServiceAccount の設定

`/var/log/message` を見てみると，ServiceAccount に対して token が存在しないとかいうメッセージが出てます．
> no API token found for service account default/default, retry after the token is automatically created and added to the service account

面倒くさがって k8s インストール時にすっ飛ばした ServiceAccount 関連設定の模様．色々調べた結果，下記サイトを参考にして設定しました．

[kubernetesの認証とアクセス制御を動かしてみる](https://ishiis.net/2017/01/21/kubernetes-authentication-authorization/)

ちゃんとした証明書で TLS 設定をしていると自動的にその鍵を使って ServiceAccount の token を払い出してくれるみたいですが，オレオレ証明書の場合は明示的にオプション指定する必要があるみたい．

無事設定が終わると，`create -f` で一応 Pod が起動するようになるはずです．内部的には，自動的に "default" という ServiceAccount を使うように構成を修正してデプロイしてくれる模様．

## InfluxDB - Heapster - Grafana 接続設定

ただ，この状態では Heapster のログをみると kube-apiserver にも InfluxDB にも接続てきていないはず (kube-dns が設定されているとこの時点でつながるようになるかも)．

まず，InfluxDB を ClusterIP でつながるようにします．IP アドレスは環境に合わせて ClusterIP のレンジの中から適当に割り当て．

```yaml:influxdb-service.yaml
spec:
  clusterIP: 192.168.254.1
```

続いて Heapster の接続先を設定．

```yaml:heapster-deployment.yaml
command:
        - /heapster
        - --source=kubernetes:https://192.168.0.1?useServiceAccount=true&insecure=true
        - --sink=influxdb:http://192.168.254.1:8086
```

ポイントは，

* 192.168.0.1 は kube-apiserver の clusterIP．`kubectl get services --all-namespace` とかすると一番上に出てくる (おそらくレンジの先頭の IP アドレス)
* 先程 ServiceAccount の設定をしているので，`userServiceAccount=true`．加えてオレオレ証明書なので，`insecure=true`
* InfluxDB は先程設定した clusterIP + ポート番号 (default: 8086)

最後に Grafana の接続先を設定．

```yaml:grafana-deployment.yaml
env:
        - name: INFLUXDB_HOST
          value: 192.168.254.1
```

加えて，addon として proxy 経由でのアクセスをしたいので，以下を書き換え．

```yaml
 - name: GF_SERVER_ROOT_URL
          # If you're only using the API Server proxy, set this value instead:
          value: /api/v1/proxy/namespaces/kube-system/services/monitoring-grafana/ # コメントアウト解除
          # value: / # コメントアウト
```

## 起動 & grafana にアクセスしてみる

先程のゴミが残ってる場合は，
`kubectl delete -f heapster/deploy/kube-config/influxdb/` 
してから，
`kubectl create -f heapster/deploy/kube-config/influxdb/`

正しく起動すると，
`http://<kube-apiserver address+port>/api/v1/proxy/namespaces/kube-system/services/monitoring-grafana/`
でアクセス可能なはずです．

`Home` をクリックすると，`Cluster` と `Pods` があって，Cluster は k8s ホストマシン群のリソース状況を，Pods はそのまま Pods のリソース状況を確認出来ます．

Pods クリック後，(選択肢には出ないですが) 既に配備済みの namespace & pods があるのであれば，手動で入力することで対象 namespace の pods 群のリソースが見られます (地味に「配備してあるのに選択肢に出ない...」と困惑した)．

![grafana.JPG](https://qiita-image-store.s3.amazonaws.com/0/169279/f8c9041b-530b-3fe0-a947-d17f7d77c9a3.jpeg)

近いうちに kube-dns 設定とか，prometheus でのリソース監視とかもやってみようかな．
2017-03-08 ImageMagick > link > 画像の違いを ImageMagick でビジュアル化 | bashスクリプト > diff_image_180918_exec > v0.1

```txt:動作環境
// 差分画像作成
CentOS 6.8 (64bit)
// 元画像生成
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Tektronix TDS 2024C (200 MHz, 2GS/s)
とあるI2Cセンサ
```

@fujiwarasoftservice さんに[教えていただいた](http://qiita.com/7of9/items/0a3398ccf226733679b7/#comment-a3f2d55a4c412ea4592a)blog(Rabbit Noteさん）。
その中で気に入ったのがImageMagickによる差分画像の作成。
http://rabbit-note.com/2015/11/14/image-diff-by-imagemagick/

現在取り組んでいるI2C通信の差分画像を作ってみた。

![F0002TEK.png](https://qiita-image-store.s3.amazonaws.com/0/32870/085853aa-d9ac-f5b8-48b3-7f2a181de879.png)

![F0003TEK.png](https://qiita-image-store.s3.amazonaws.com/0/32870/fdb9fd71-e7aa-8c83-f04a-e0a1e77ff566.png)


```
$ convert -type GrayScale +level-colors Red,White F0002TEK.png a_red.png
```
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9db26482-48d6-27f5-bac3-4dea1a50ae95.png)

```
$ convert -type GrayScale +level-colors Blue,White F0003TEK.png b_blue.png
```
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/316390a0-216f-bc6c-7807-e5f4768bf196.png)


```
$ convert -compose Multiply -composite a_red.png b_blue.png diff.png
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9e1b6ad8-d107-d580-d069-21ab6f594a42.png)

どこが変化したか見やすくなりました。
情報感謝です。

この「変化をとらえる」というのはNeural Network関連でも使えるかもしれない。

### bashスクリプト
(2018-09-18追記)

2つの画像から差分画像を作るbashスクリプトを追加。

```bash:diff_image_180918_exec
#/usr/bin/env bash
set -eu # just in case

#v0.1 Sep. 18, 2018
#   - can make image with the difference of two images

if [ $# -lt 2 ];then
	echo "Error: insufficient parameters"
	echo 
	echo "[cmd] [redImage.png] [blueImage.png]"
	exit
fi

RESFILE="res_diff.png"
WRKRED="work_red.png"
WRKBLUE="work_blue.png"

convert -type GrayScale +level-colors Red,White $1 $WRKRED
convert -type GrayScale +level-colors Blue,White $2 $WRKBLUE
convert -compose Multiply -composite $WRKRED $WRKBLUE $RESFILE

rm -f $WRKRED $WRKBLUE
echo "[$RESFILE] is produced".
```

```shell
$ bash diff_image_180918_exec 20171206_220000_48.png 20171206_220000_36.png 
[res_diff.png] is produced.
```

### 検索用キーワード (2020-07-10)

- RGB
- color
- オシロスコープ
-
PCLの最新プロジェクトをお手軽にインストールしたい。windows

PCLでGPUを使いたいと思ったのですが、All-in-one installersに含まれていません。いやだ。あのたくさんのライブラリを導入したくない。というわけで、3rd party libraryは既に導入しているAll-in-one installersの物を流用しつつ、最新のPCLをgithubから導入したいと思います。

##僕の環境
windows 10 home 64bit
visual studio 2015
intel core i5
gtx1080

##前提
PCLの本家で用意されているAll-in-one installersは古く、VS2015やPCL1.8に対応していません。しかし有難いことに、UnaNancyOwenさんが用意してくれているものがあります。

https://onedrive.live.com/?authkey=%21AEFU1iDLVaRRBPA&id=EC9EBB2646FF189A%2149089&cid=EC9EBB2646FF189A

PCL1.8のinstallerを実行したのですが、openglの関係か何かでvisualizerでエラーが出ていました。これはPCL1.8.0RC2のOpenGL2 backendを利用すると解決しました。

このAll-in-one installersを事前にインストールしておきます。ただしここでインストールするPCLは使いません。同時に導入される3rdPartyがほしいだけです。

##最新のPCLを入手
gitより最新バージョンのソースを落としてきます。そして自分でビルドしてインストールします。基本 https://gist.github.com/UnaNancyOwen/59319050d53c137ca8f3 を見れば問題ありません。

##3rdPartyのライブラリの環境変数を変える
ここだけが前述したURLと違ってて、事前にインストールしたAll-in-one installersの3rdPartyを参照するようにします。これだけなのですが、僕は色々ミスを犯しました。それを書いていこうと思います。

##ミス１、advanceのチェックをつけなかった。
gistにも「GroupedとAdvancedにチェックを入れるとわかりやすい。」と書いてあるのに、cmake guiにてチェックをつけずに、実行結果が違う違うと悩んでいました。

##ミス２、64bit指定忘れ
一番最初のVisualStudioのバージョンを指定する際に、VisualStudio14 2015を指定してしまいました。VisualStudio14 2015 Win64を指定すべきだったのに。それによってVTKの環境変数が読めず、VTKのビルドが延々通りませんでした。参考のためcmakeで表示されたエラーメッセージを書いておきます。

```
Could not find a configuration file for package "VTK" that is compatible
  with requested version "".
```

##終わり
できてしまえば意外とすんなりとビルドできると思います。これでGPUであそぶぞー
Sublime Textで空白文字が半角英字より小さく表示されるときの対処法

SublimeText上でスペースをインデントとして使うと、なぜかgit diffしたときにずれていた。

```ruby
def my_method
  hoge = if foo?
           hoo
         end
end
```
のつもりで打っていても、git diffで見てみると次の用になっている

```ruby
def my_method
  hoge = if foo?
            hoo <-ここがずれている
          end   <-ここがずれている
end
```

原因は半角スペース１つ分の大きさが、半角英字１文字分の大きさよりも小さかったから。

そこで、以下の様に明示的にフォントを指定する。

SublimeTextの上部メニューの基本設定（Preferense) -> Settings
からユーザ設定（二分割されているエディタの右側）の "font_size": **
の上に１行追加する

```
"font_face": "Courier New",
```
間違ってNetrw を実行してしまったときの対処法

# 現象

ターミナルでVim を使って.bashrcファイルを編集しようとした際に、間違って以下のように実行してしまった。

```
$ vim .
```

そうすると以下のような画面が表示され、？？？となってしまった。

```
" ============================================================================
" Netrw Directory Listing                                        (netrw v140)
"   /Users/username
"   Sorted by      name
"   Sort sequence: [\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\
"   Quick Help: <F1>:help  -:go up dir  D:delete  R:rename  s:sort-by  x:exec
" ============================================================================
../
.Trash/
.bash_sessions/
.cache/
.config/
.local/
.vim/
Applications/
Desktop/
Documents/
Downloads/
```

# 環境

- OS： Mac OS X EI Capitan 10.11.6
- Software
    - Terminal: 2.6.1
    - Vim: VIM - Vi IMproved 7.3

# 対処法

通常のVimと同じく[ESC]キーを押してから :q → [Enter]キーの順で入力すると元の画面に戻れる。

表示された画面は**「Netrw」**というVimのファイルブラウザでした。
Netrw はVim にデフォルトでインストールされているプラグインのようです。

# おまけ

Netrw の詳しい使い方が気になる方は、以下を参照してください。

[Netrwを使いこなす - ΔS > 0](http://hagure-beans.hatenablog.com/entry/20100603/1275591475)
[vim netrw 使い方 Vim Netrw でお手軽ブラウジング(デフォルトでインストール)](http://sawasawato.blog.fc2.com/blog-entry-57.html)
Phalconでroutes.phpを使いこなす！カスタムルート設定時はAction引数は使わない。

Phalcon3.0.3を使い続けて数ヶ月。
大きなプロジェクトも終わりかけたそのとき！

tokyo.sample.com/
というドメインの構想でつくっていたものを要望により
www.sample.com/tokyo/
としたいとのこと。


これは、拡張性も考えて

www.sample.com/tokyo/
www.sample.com/kanagawa/
www.sample.com/saitama/
とできるように、とのことでしたので対応してみました。


config/routes.php
を変更するわけですが、

```php:app/config/routes.php
$router->add('/([a-z]*)/:controller/:action/:params', [
    'pref' => 1,
    'controller' => 2,
    'action' => 3,
    'params' => 4,
]);
```

と、まあPhalconのマニュアルにもあるように記述してみました。
ちなみに、以下のように書いてもいいのですが、今回は１つめが都道府県を示すため文字だけにしておきたかったので正規表現にしています。

```php:app/config/routes.php
$router->add('/{pref}/:controller/:action/:params', [
    'pref' => 1,
    'controller' => 2,
    'action' => 3,
    'params' => 4,
]);
```

ここでparamsは、action名以降の指定はparamsで取得され、xxxAction($param1,$param2)みたいに取得できるものかと思っていました。
それはそれでうまくいきます。

デフォルト設定を指定したときにうまくいかなくなります。

```php:controller
xxxAction($param1=false,$param2=false)
```
としたとき。

xxxActionを呼び出そうと
tokyo/controller1/xxx/

と呼び出されると、（ここ重要）
xxxAction内で期待されるのは、$param1=falseなのですが、なんと$param1="tokyo" となります。


なんと、routesで指定したprefなんですが、こいつもparamsに入ってきてました。

tokyo/controller1/xxx/param1/param2

```php
params[0] = //param1
params[1] = //param2
params['pref'] = //
```

で、Actionの引数で取得しようとすると、たぶん、paramsをarray_shiftして順にセットしているようで、、。

以下の場合だと
tokyo/controller1/xxx/

```php
params['pref'] = //
```
となり、
$param1 = "tokyo"
となるわけですね。

なのでroutes.phpでcontroller.action.params以外のカスタマイズパラメータを追加する場合は、Actionの引数には要注意、というよりも使わないのが一番です。
AWS CentOS 7にSSHで初回接続エラーが出る時の対応

# 現象
以下のようなエラーが発生することがある。

```
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```

インスタスを作成し直したり、証明書を新規に用意しても発生する。

# 原因

これの原因は、ssh接続時に指定しているユーザー名が間違っている可能性がある。
EC2で作成した仮想マシンのユーザー名は、`ec2-user`だと思い込んでいたら、
CentOSは、ユーザー名`centos`だった(´Д` )
PHPUnit+CodeIgniter ユニットテストの備忘録＜随時更新＞

[株式会社オズビジョン](http://www.oz-vision.co.jp/)の@terra_yuccoです。

現在、レガシーコードにテストコードを網羅していこうの活動を、エンジニアチームとしてやっています。とはいえ、テストコードだけをひたすら書く活動をするわけではなく、新規に開発を行うときはテストコード必須、可能なら修正時に参照した箇所をテストコード付きでcosme、といった感じで進めています。
利用しているフレームワークはCodeIgniter2.0.3がメインです。
(バージョンを上げられないのも、リスクがあって踏み切れないというところ…)

この記事は私的な備忘録なので、随時更新していきます。

# update_batchがnoticeレベルのエラーを出す
## エラー内容
```text
[CIUnit] PHP Error: Notice - Array to string conversion File Path: database/DB_active_rec.php (line: 1414)
[CIUnit] PHP Error: Notice - Array to string conversion File Path: database/DB_active_rec.php (line: 1414)
```

## 該当コード
```php
$database->update_batch($table, $update_data, 'id');

/**
 * var_dump($update_data); の結果
 *
 * array(1) {
 *   [0] =>
 *   array(3) {
 *     'id' =>
 *     string(7) "1234567"
 *     'register_date' =>
 *     string(19) "2017-03-08 11:10:00"
 *     'update_date' =>
 *     string(19) "2017-03-08 11:10:00"
 *   }
 * }
 */
```

## 原因は古いCodeIgniterのバグ
自分のコードが悪いのかと思いましたが、どうもCodeIgniterのバグである模様。
ユーザガイドを見ると呼び出し方はあっていますが、以下のStackoverflowに回答がありました。2.1.4では修正されているようです。
バージョンの違いがあるため行数は少しずれていますが、試しに手元で同様の修正をしたところ、無事にNoticeは消えました。
※とはいえフレームワークを変更することになるので、事象の確認ができたところで元に戻しています。

- [Active Record クラス：CodeIgniter ユーザガイド 日本語版](http://codeigniter.osdn.jp/kenji/ci-ja/user_guide_ja/database/active_record.html)
- http://stackoverflow.com/questions/11279262/update-database-field-error-codeigniter/12910038#12910038

>Just stumbled upon the exact same problem here. Fortunately, I'm using the same CI version. :)
>
It's true that the answer from M_A_K helps remove the "Notice", but I don't think that is the right solution for the problem. So I decided to take a look at line 1407 in DB_active_rec.php and I believe that this is nothing but a minor bug in CI 2.1.2.
>
Here's my fix. I simply changed the original code:
>
`$not[] = $k.'-'.$v;`
into this:
>
`$not[] = $k2.'-'.$v2;`
Voila! The "Notice" doesn't appear anymore. :)
>
We can clearly see that line 1407 was not meant to use `$k` and `$v` because line 1407 is inside a foreach loop iterating through `$v` as `$k2` and `$v2`.


# この記事について
最初にも書いた通り、他にもいくつもいろいろ踏み抜くと思うので、随時更新していきます。
Firefox で画面共有

Firefox 51 までは、about:config の media.getusermedia.screensharing.allowed_domains でブラウザ毎に画面共有を使用するサイトのドメインを登録するか、または、Mozilla のフォームから申請して、画面共有を使用するサイトのドメインを登録する必要がありました。

しかし、Firefox 52 ではこの申請が不要になり、代わりに、Web カメラ使用時と同じように事前に共有してよいか確認させるようになり、以前と比べて簡単に画面共有を使用できるようになりました。

# 例

## mediaSource に screen を指定した場合

```js
navigator.mediaDevices.getUserMedia({
  video: {mediaSource: "screen"}
})
```

<img width="516" alt="スクリーンショット 2017-03-08 2.40.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/36202/3b618941-866a-36e4-cff6-1d53e1cafe27.png">

プレビューも表示されます

<img width="520" alt="スクリーンショット 2017-03-08 2.39.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/36202/0f08c733-6d02-f00c-5c54-fcc3f1c8bd5d.png">

## mediaSource に window を指定した場合

```js
navigator.mediaDevices.getUserMedia({
  video: {mediaSource: "window"}
})
```

<img width="514" alt="スクリーンショット 2017-03-08 2.35.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/36202/2f1923c0-5fc4-8cf2-b33e-b2ee1dcf5454.png">


<img width="518" alt="スクリーンショット 2017-03-08 2.38.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/36202/867fe338-7e1c-c585-434f-b35542e25f59.png">
Vue.jsは気難しい（配列編）

本記事は Vue 2.2 時代（2017/03頃）に記載したものです。
最新のVueでは未検証です（たぶん通用すると思う）ご留意ください。

# はじめに

Vue.jsは便利だ
インスタンス内のプロパティの変更を感知し、DOMに反映してくれる
（他のフレームワークも同様だろうけど）

だが、値は**Vueが認識できる形で**変更しなければならない
値の変更をVueに気づいてもらうための、配列の変更のコツを紹介する

# 配列の気の遣い方

## 指定indexの値を変更したい
`items` 配列 `index: 3` の 要素を `"yeah!"` に変更する例

**×** index直指定では認識できない

```javascript
this.items[3] = "yeah!";
```

**○** spliceを使おう

```javascript
this.items.splice(3, 1, "yeah!");
```

## 配列の長さを変更したい
`items` 配列の長さを `5` に変更する例

**×** lengthの変更では認識できない

```javascript
this.items.length = 5;
```

**○** spliceを使おう

```javascript
this.items.splice(5);
```

## 末尾に値を追加したい
`items` 配列の末尾に `"whoop!"` を追加する

**○** push()を使おう

```javascript
this.items.push("whoop!");
```

## 要素を削除したい
`items` 配列 `index: 3` の 要素を削除する例

**○** spliceを使おう

```javascript
this.items.splice(3, 1);
```

# おわりに

これまで `.splice()` という関数を使ったことが無かったので
メモ代わりに記載した

[オブジェクト編](http://qiita.com/tmak_tsukamoto/items/7623f458448fa7cd01c7)も記載しました

公式ドキュメントも参照のこと
[Vue.js リストレンダリング 配列の変化を検出](https://jp.vuejs.org/v2/guide/list.html#配列の変化を検出)
I2C > 中途半端な電圧(intermediate level)になる症状 > SDAの方向設定の問題かもしれない

```txt:動作環境
MSP430
Tektronix TDS 2024C (200 MHz, 2GS/s)
とあるI2Cセンサ
```

とあるI2Cセンサからデータを読み出すコードを実装中。
I2Cの処理はソフトウェアで実装する。

プロトコルは以下。

- start conditionを生成する
- 7bitのslave addressを送信
- ACKを受信
- 8bitのデータを受信
- ACKを送信 (続きのデータ読取があるという意味)
- 8bitのデータを受信
- NAKを送信 (続きのデータ読取がないという意味)
- stop conditionを生成する

本来、Low/Highが0または3.3Vとなるはずであるが、中途半端な電圧(2Vなど)が出る状況が続いた。

[Raspberry Piで同じI2Cセンサを扱ってSCK, SDAの波形を確認し](http://qiita.com/7of9/items/0a3398ccf226733679b7)、それを再現するMSP430での動作を実装し、ほぼ動くようになった。

**そこで分かったことは、SDAの入出力方向の切替タイミングをあやまると、中途半端な電圧になるということ**。

intermediate levelで検索して以下を見つけた。

https://www.embeddedrelated.com/showthread/comp.arch.embedded/203940-1.php
> It's a familiar problem when the master drives pins hi and lo instead of Hiz and lo.

センサとマスター(MSP430)とで電圧のhigh,lowの引っ張り合いになり、中途半端なレベルになっていたという感じがする。
それは、適切なタイミングで入出力方向を切り替えることで、回避することができた。
Fish Shell で、文字列内でサブコマンドの結果を展開

Fish は便利なんだけど、ところどころ互換性が無くて、Bash/Zsh前提に作られているチュートリアルで困る。

`Fish Shell` では文字列内でサブコマンドの結果を展開することができない。

# やりたいこと

```bash:bash
curl -L "https://hoge.com/docker-compose-$(uname -s)-$(uname -m)" \
    -o /usr/local/bin/docker-compose
```

# 方法1

予め変数に入れる

```bash
set uname_s (uname -s)
set uname_m (uname -m)
curl -L "https://hoge.com/docker-compose-$uname_s-$uname_m" \
    -o /usr/local/bin/docker-compose
```

# 方法2

つなげる

```bash
curl -L "https://hoge.com/docker-compose-"(uname -s)"-"(uname -m) \
    -o /usr/local/bin/docker-compose
```

# 方法3

Fishを諦めてBashにする

```bash
bash -c 'curl -L "https://hoge.com/docker-compose-$(uname -s)-$(uname -m)" \
    -o /usr/local/bin/docker-compose'
```
【ECCUBE3】 twig ファイル レンダー種類

```php:filename.php
<?php

// @return Response A Response instance
$app['twig']->render('ファイルパス', array('変数名' => 値));

// @return string The rendered view
$app->renderView('ファイルパス', array( '変数名' => 値));

// @return string The template source code
$app['twig']->getLoader()->getSource('ファイルパス');

```