OmniAICreator/Qiita-1.07M huggingface dataset:
Eigenを使って疎行列の計算をする


行列計算ライブラリEigenには密行列だけではなく、疎行列の計算を行うためのルーチンも含まれている。
（Eigenの紹介についてはこちらを参照 [C++行列計算ライブラリEigen入門](https://qiita.com/yohm/items/a03006790dc1e54a87be)）

疎行列とはほとんどの要素が０で、非ゼロの要素が小数個しかない行列。
全行列要素をメモリに置くかわりに、非ゼロ要素の位置と値だけを保持する。密行列表現ではメモリに乗らないような巨大な行列も取り扱うことができる。

# 行列要素のセット

一番シンプルなコードは以下のようになる。

```cpp:sparse.cpp
#include <iostream>
#include <vector>
#include <Eigen/Sparse>

typedef Eigen::Triplet<double> T;

int main() {
  std::vector<T> tripletVec;

  tripletVec.push_back( T(0,0,0.2) );
  tripletVec.push_back( T(0,1,0.5) );
  tripletVec.push_back( T(1,0,1.0) );
  tripletVec.push_back( T(1,1,2.0) );

  Eigen::SparseMatrix<double> M(2,2);
  M.setFromTriplets(tripletVec.begin(), tripletVec.end());
  std::cout << M << std::endl;

  return 0;
}
```

```txt
Nonzero entries:
(0.2,0) (1,1) (0.5,0) (2,1)

Outer pointers:
0 2  $

0.2 0.5
1 2
```

これで $\begin{pmatrix} 0.2 & 0.5 \\\\ 1 & 2 \\ \end{pmatrix}$ という2x2行列を表現している。（この例は全く疎行列ではないが。）

行列要素をセットしていくには `Eigen::Triplet` の配列を作る。Tripletのコンストラクタは３つの引数を取り（行index、列index、要素の値）を表している。
Tripletのvectorを作ったら、`M.setFromTriplets()`を呼んで要素に値をセットすることができる。

詳細は http://eigen.tuxfamily.org/dox/group__TutorialSparse.html を参照のこと。

このようにして作った疎行列に対しては密行列とどうように +,-,* などの演算子が適切に定義されている。だいたい直感的に使えるようになっている。
ただし、計算コストがかかる場合があるので一応注意が必要。

密行列との演算も可能。

```cpp
  Eigen::MatrixXd D(2,2);
  D << 3, 2,
       1, 4;
  std::cout << "M*D: " << M*D << std::endl;
```

# 連立一次方程式を解く

疎行列に対するSolverもEigenにいくつか用意されている。
http://eigen.tuxfamily.org/dox/group__TopicSparseSystems.html

どのmoduleを使って解くにしろ、以下のようなコードを書くことになる。

```cpp
#include <Eigen/RequiredModuleName>
// ...
SparseMatrix<double> A;
// fill A
VectorXd b, x;
// fill b
// solve Ax = b
SolverClassName<SparseMatrix<double> > solver;
solver.compute(A);
if(solver.info()!=Success) {
  // decomposition failed
  return;
}
x = solver.solve(b);
if(solver.info()!=Success) {
  // solving failed
  return;
}
```

具体的なコードは以下の通り。例えばQR分解を使って解く場合。

```cpp:sparse_solve.cpp
#include <iostream>
#include <vector>
#include <Eigen/Sparse>
#include <Eigen/Dense>
#include <Eigen/SparseQR>

typedef Eigen::Triplet<double> T;

int main() {
  std::vector<T> tripletVec;

  tripletVec.push_back( T(0,0,0.2) );
  tripletVec.push_back( T(0,1,0.5) );
  tripletVec.push_back( T(1,0,1.0) );
  tripletVec.push_back( T(1,1,2.0) );

  Eigen::SparseMatrix<double> M(2,2);
  M.setFromTriplets(tripletVec.begin(), tripletVec.end());
  std::cout << M << std::endl;

  Eigen::SparseMatrix<double> b(2,1);
  std::vector<T> tripletVecb;
  tripletVecb.push_back( T(0,0,1.0) );
  tripletVecb.push_back( T(1,0,2.0) );  // b = (1.0 2.0)
  b.setFromTriplets(tripletVecb.begin(), tripletVecb.end());
  std::cout << b << std::endl;

  Eigen::VectorXd x;  // 解のベクトル

  Eigen::SparseQR< Eigen::SparseMatrix<double>, Eigen::COLAMDOrdering<int> > solver;  // solverオブジェクトを構築する。
  solver.compute(M);

  if( solver.info() != Eigen::Success ) {
    std::cerr << "decomposition failed" << std::endl;
  }
  x = solver.solve(b);
  if( solver.info() != Eigen::Success ) {
    std::cerr << "solving failed" << std::endl;
  }
  std::cout << x << std::endl;

  return 0;
}
```
電子回路入門　アナログ入力

#**はじめに**
[書籍](https://www.amazon.co.jp/%E9%9B%BB%E5%AD%90%E9%83%A8%E5%93%81%E3%81%94%E3%81%A8%E3%81%AE%E5%88%B6%E5%BE%A1%E3%82%92%E5%AD%A6%E3%81%B9%E3%82%8B-Raspberry-Pi-%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C%E5%AE%9F%E8%B7%B5%E8%AC%9B%E5%BA%A7-%E7%A6%8F%E7%94%B0/dp/4800711614)に沿って引き続き進めていきます。

今回は可変抵抗から贈られるアナログ値を利用して、LEDの明るさを制御します。

#**アナログ入力とは**
デジタル入力(ON,OFF)と違い、様々な値を入力できる。
温度や湿度など、変化するような値を電圧として扱います。
ラズベリーパイやマイコン等でアナログ値を入力する場合はADコンバータを使用します。
ADコンバータ...アナログ値をデジタル値に変換する。
マイコンに内蔵されているものとされていないものがあるので、仕様書を確認しましょう。
(ラズベリーパイには内臓されていませんが、PsoCには内蔵されているので、それを使用します。)
内蔵されいないものは[外部のADコンバータ](http://akizukidenshi.com/catalog/c/cadc/)を使用します。

#**使用部品**
- PSoC 5LP
- 抵抗(100,10kΩ)
- LED
- [可変抵抗10kΩ](http://akizukidenshi.com/catalog/g/gP-03277/)

--可変抵抗の型番の読み方--
今回の場合は103
10　×　10³　= 10000 = 10kΩ
202の場合は
20　×　10²　= 2000　= 2kΩ

#**PSocの設定変更**
珍しくPSoCの設定を記載します(｀・ω・´)
以前作ったPWMの設定に**ADC_SAR**を追加します。(アナログデジタルコンバータ)
Analog入力とsocには0をつなげてください。
![ADC.png](https://qiita-image-store.s3.amazonaws.com/0/195542/da68653b-8d21-130b-7934-b51991df8fdf.png)


ADC_SARをダブルクリックすると設定画面になるので、以下のように変更してください。

![ADC設定.png](https://qiita-image-store.s3.amazonaws.com/0/195542/c198232f-e2c7-f6a6-9d12-b6df3aa0d3fe.png)

- Modes
       - Resolution --出力bit数(とりあえず大きく)
       - Conversion rate --一秒間に何回サンプリング（アナログデータを取り込む）か。(とりあえずこれくらい)
- Sample mode
       - Software trigger --プログラムから制御します
- Clock source
       - Internal --内部クロックを使用
- Input
       - Input range --入力される電圧の範囲
       - Reference --ADの基準電圧です(コメントより。今回は精度はあまり気にしないので内部のものを使用します。)

#**回路図**
![可変抵抗_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/195542/5b7c49fa-9032-a06f-7872-12fec5fd7939.png)

5Vと可変抵抗の間に150Ωを入れています。
これはPSoCの設定の際に、入力電圧の範囲を0~2Vくらいに設定したので、可変抵抗に2V以上かからないようにするためにつけてあります。
2V ÷ (5V -2V) × 10kΩ = 7kΩくらい
7kΩくらいですが、持ってないので10kΩを使用します。(0~2.5Vまで変動)
![可変抵抗_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/195542/6edc512f-6749-b98f-e80a-d9b100383b14.png)


#**プログラム**
```c
#include "project.h"

int main(void)
{
    CyGlobalIntEnable;
    //PWMスタート
    PWM_Start();
    //ADCスタート
    ADC_Start();
    for(;;)
    {
      //変換開始
      ADC_StartConvert();
      //開始されるまで待つ
      while(ADC_IsEndConversion(ADC_RETURN_STATUS) == 0);
      //12bitがくるので16bitで取得
      int val = ADC_GetResult16();
      //↑で返ってきた16bitの値×PWMの最大値÷16bitの最大値
      double t = (val * 255 /4095);
      PWM_WriteCompare(t);
    }
}
```
指定箇所を赤字にする(LaTeX)


LaTeXで指定箇所を赤字にしたいときは、プリアンブルに

```
\usepackage{color}
```
と書き、本文中で

```
\textcolor{red}{疲れた}
```
とすると、
<font color="Red">疲れた</font>
と表示することができる。

ただ、論文の修正箇所を赤字にする場合などは、赤字にする箇所が増えるので毎回これを書くのは面倒。
そんなときは、プリアンブルに

```
\newcommand{\red}[1]{\textcolor{red}{#1}}
```
を書いておくと、

```
\red{疲れた}
```
だけで済むので少し楽になる。
GAEのFWとCRON設定について

# AppEngine Cronを利用する際のFWの設定についてメモ

## 事象

cron設定したが、リクエストに失敗する
stackdriverをみてもリクエストログが出力されない

## 原因

FW設定で、許可アドレスの指定が間違っていた

## 対応

　選択言語によって、IPアドレスが異なり、
`10.0.0.1` と `0.1.0.1`の2パターンあるので適切なほうを設定する。

言語なのか、flexibleとstandardの違い？かわかりませんが、
適切にドキュメントにアクセスすれば問題ないと思います。

## 参考
https://cloud.google.com/appengine/docs/flexible/nodejs/scheduling-jobs-with-cron-yaml?hl=ja
SQL | COUNT(DISTINCT column_name) は「同じ値の種類数」をカウントする

初歩。

# テーブル例

こんなテーブルがある場合。


```
mysql> SELECT * FROM scores ORDER BY name;
+-------+--------+-------+
| name  | sex    | score |
+-------+--------+-------+
| Alice | female |    60 |
| Bob   | male   |    70 |
| Carol | female |    70 |
| David | male   |    80 |
| Eric  | male   |    80 |
+-------+--------+-------+
```

## sex には male / famale の二種類がある。

```sql
mysql> SELECT COUNT(DISTINCT(sex)) AS sex_kind FROM scores;

+----------+
| sex_kind |
+----------+
|        2 |
+----------+
```

## score には 60点 / 70点 / 80点の三種類がある。

```sql
mysql> SELECT COUNT(DISTINCT(score)) AS score_kind FROM scores;

+------------+
| score_kind |
+------------+
|          3 |
+------------+
```

# 環境

- mysql  Ver 14.14 Distrib 5.5.56, for osx10.12 (x86_64) using  EditLine wrapper

# 参考

- [COUNT句内でDISTINCTを使う／重複を排除したカウント - 裏・社内SEにょえのブログ](http://d.hatena.ne.jp/nyoe3/20100313/1268468670)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
VSCodeでマークダウンを編集する時用のオススメの設定

いまだにちょっとしたテキストだったらVimで編集していたりもするのですが、複数のマークダウンファイルを編集したりするときには、Command(Winの方はctrl) + k, vで開くプレビュー機能のあるVSCodeを利用しています。

そのオススメの設定の健忘録。まずは、Electronのバグに対処するために、[Remove backspace control character](https://code.visualstudio.com/docs/getstarted/settings) をインストール。 Command(Winの方はctrl) + p で、

```
ext install satokaz.vscode-bs-ctrlchar-remover
```

を実行、これでオートフォーマット時に、例の厄介なバックスペースの制御文字を除去してくれるようになります。

あとはユーザー設定に、

```javascript
  // マークダウンでのみ保存時フォーマットを有効化
  "[markdown]": {
    "editor.formatOnSave": true,
    "editor.formatOnPaste": true,
    "editor.wordWrap": "on",
    "editor.renderWhitespace": "all",
    "editor.acceptSuggestionOnEnter": "off"
  },
```

以上を追記。保存時、張り付け時のフォーマット、テキスト折り返しあり。ホワイトスペース描画、サジェストを切る。という設定となっています。

皆さん楽しいマークダウン執筆生活を！
関数内実行、上からするか？下からするか？

タイトルはお分かりの通り、「打ち上げ花火、下から見るか？横から見るか？」の~~パクリ~~影響を受けています:eyes:

なんとなく思いついただけなので、気軽に見てってください（）

# 関数内実行
関数についてはお分かりだと思うので、説明は割愛させてもらいますが、

# 上からするか？
関数は基本的に上から実行です。

```function.swift
func fromTop() {
	print("A")
	print("B")
	print("C")
	print("D")
}
```

```execute.swift
fromTop()
// 出力
// A
// B
// C
// D
```
タイトルの半分の説明が終わりました（「上からするか？」部分）:sunglasses:

# 下からするか？
関数内を下から実行していこうという~~ネタ~~テクニックです

```function.swift
func fromBottom() {
	defer {
		print("D")
	}
	defer {
		print("C")
	}
	defer {
		print("B")
	}
	print("A")
}
```
swiftには`defer`というものがあります。関数の最後にdefer内に記述した処理を実行させることができます。
また、今回のようにdeferが複数ある場合、あとから記述したdeferから先に実行されていきます。「先入れ後出し」ですね!

```execute.swift
fromBottom()
print("E")
// 出力
// A
// B
// C
// D
// E
```
（関数の最後にdeferが実行されているのをわかりやすくするため、`print("E")`を追加しています）

関数内の処理の実行を下からすることに成功しました:sunglasses:

# まとめ
やりたかったのは、これだけです。
ここまで読んでくださりありがとうございました:bow:

[猿がようやく理解したSwiftのdeferの使いどころ](https://qiita.com/ika_tarou/items/f9d61b7a352d946ed20c)
[Swift 3.0 エラー処理入門](https://qiita.com/koishi/items/67cf4d0f51c4d79f1d22)
[Swift 2のdefer文](https://qiita.com/takebayashi/items/541db03c7449ee41fd36)
こちらの記事にdeferの良い使い方が書いてありますので、みなさんは正しくdeferを使ってあげてください。deferもその方がきっと喜びます:relaxed:
Alibaba Cloud はコンソール経由でインスタンスへ VNC ログイン出来る

## 概要
インスタンスがグローバル IP アドレスを持っていれば、直接 ssh でリモートログインすれば良いですが、持っていない場合は踏み台インスタンスを経由してログインする必要があり、ちょっとした作業をする場合に少し面倒です。
また、そもそも ssh が許可されておらずリモートログインが出来ないケースもあるかもしれません。

Alibaba Cloud には「マネージメントターミナル」という機能があり、コンソールからインスタンスへ VNC 出来る機能があります。便利に使えると思ったので紹介します。

## 接続手順
### 1. グローバル IP を持たないインスタンスを準備しました。

<img width="1073" alt="スクリーンショット 2018-02-27 12.39.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/41564d5c-f6f8-fb4f-7997-1279d8bd48d0.png">

### 2. VNC 接続するためのパスワードを設定します。　

<img width="1072" alt="スクリーンショット 2018-02-27 12.40.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/24da8b1c-6114-5de7-a503-628f5af2e4f4.png">

### 3. パスワードは 6 文字で設定

<img width="593" alt="スクリーンショット 2018-02-27 12.40.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/4089ff11-a107-0a90-f3f1-441d22e2121e.png">

### 4. VNC をクリック

<img width="1075" alt="スクリーンショット 2018-02-27 12.46.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/4784667f-05db-35da-1d69-47f0ce54081e.png">

### 5. 先程設定したパスワードを入力

<img width="1311" alt="スクリーンショット 2018-02-27 12.41.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/4aff31e9-386e-89c3-11a4-fc153c427a1c.png">

### 6. ログイン成功！

<img width="487" alt="スクリーンショット 2018-02-27 12.43.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/7344503c-a6b7-c848-ba4a-4098f0948bb6.png">



## まとめ
インスタンスがグローバル IP アドレスを持たない場合や、ssh が許可されていない場合などに、マネージメントターミナルは便利！
error_log風味のファイル書き込み

```php
function elog($obj)
{
    $filePath = '/var/log/php';
    $date = new DateTime();
    $result = file_put_contents($filePath, $date->format('[Y-m-d H:i:s] ') . var_export($obj, true) . "\n", FILE_APPEND);

    if (!$result) {
        error_log($filePath . 'への書き込みに失敗しました');
        error_log(var_export($obj, true));
    }
}
```
空のArrayではなく、空のActiveRecord_Relationがほしい

空のArrayオブジェクトではなく、空のActiveRecord_Relationオブジェクトが欲しい時がある。

そんなときは`none`が便利。

```ruby
Hoge.none
# => []

Hoge.none.class
# => Hoge::ActiveRecord_Relation
```

こんなケースで、空の配列を返すと`pluck`を使えない。

```ruby
class Hoge < ActiveRecord::Base
  class << self
    def latest_hoges
      something = HogeHoge.order(created_at: :desc).first.try(:hoge)
      return [] unless something
      Hoge.where(something: something)
    end
  end
end

Hoge.latest_hoges.pluck(:id)
# => NoMethodError: undefined method `pluck' for []:Array
```

`none`なら使える。

```ruby
class Hoge < ActiveRecord::Base
  class << self
    def latest_hoges
      something = HogeHoge.order(created_at: :desc).first.try(:hoge)
      return Hoge.none unless something
      Hoge.where(something: something)
    end
  end
end

Hoge.latest_hoges.pluck(:id)
# => []
```
5. クラスター計算機で udocker を利用する: 基本コマンド編-3

#
[基本コマンド編-2](https://qiita.com/percipere/items/1dfb95bc64a2d45f8a6b)に引き続いて、基本的なコマンドの実行を行う

## udocker ps: 展開済みのコンテナの一覧

docker ps は動作中のコンテナの一覧を表示するが、udocker psは展開されているコンテナの一覧を表示する

```bash
$ ./udocker ps
CONTAINER ID                         P M NAMES              IMAGE
0ca3cd40-ff32-35c2-a4dd-d0e331ba449c . W ['ubuntu']         ubuntu:latest
577c1cc4-603a-30b3-a78c-773c14d22e28 . W                    debian:latest
f7c8f293-77a6-3c65-bb78-94d7da03c206 . W                    debian:latest
```

`udocker run イメージ名`で多数のコンテナを利用すると、何やらやたらと起動しているように見える

`udocker run イメージ名`では、実行した時点でユーザーのディレクトリ上にファイルを展開し、そのディレクトリをルートディレクトリとして見えるように実行環境に介入しているだけなので、実際に仮想マシンが起動しているという意味ではない

`udocker run イメージ名`で起動したコンテナは異なるCONTAINER IDを与えられて、どんどん増えていく

これを避けるには、`udocker run`コマンドで

* 既存のCONTAINER IDを指定するか
* `udocker create --name`で名前を付けたコンテナ名を指定するか

のいずれかの方法を利用して、一度展開したコンテナのファイルを再利用することが望ましい

ここは起動したコンテナを終了させると実行中のコンテナの一覧から存在しなくなる`docker run`とは大きく異るところ

というわけで、増やしてしまったコンテナを消去する手立ては次の通り

## udocker rm *コンテナ ID* : 展開したコンテナの消去

コンテナのIDを指定して、展開したコンテナを消去する

```bash
$ ./udocker ps
CONTAINER ID                         P M NAMES              IMAGE
0ca3cd40-ff32-35c2-a4dd-d0e331ba449c . W ['ubuntu']         ubuntu:latest
577c1cc4-603a-30b3-a78c-773c14d22e28 . W                    debian:latest
f7c8f293-77a6-3c65-bb78-94d7da03c206 . W                    debian:latest
$ ./udocker rm 577c1cc4-603a-30b3-a78c-773c14d22e28
Info: deleting container: 577c1cc4-603a-30b3-a78c-773c14d22e28
$ ./udocker ps
CONTAINER ID                         P M NAMES              IMAGE
0ca3cd40-ff32-35c2-a4dd-d0e331ba449c . W ['ubuntu']         ubuntu:latest
f7c8f293-77a6-3c65-bb78-94d7da03c206 . W                    debian:latest
```

* udocker psで起動中(ここでは展開中のコンテナの意味)を取得
* udocker rmで`CONTAINER ID`を指定してコンテナを消去
* udocker psで起動中(ここでは展開中のコンテナの意味)で、rmで消去したコンテナが表示されない事を確認

確かに、`577c1cc4-603a-30b3-a78c-773c14d22e28`というIDのコンテナが消去された

そんなわけで、udockerを利用する際には、

* `udocker create`で名前を付けてコンテナを展開
* `udocker run`でcreate時に付与した名前を指定してコンテナを利用

という手順でコンテナを利用して行くほうが良い

ここに留意しないと、ディスク上に大量に展開されたコンテナでディスクが逼迫する事になる

## udocker protect: 誤って消去しないようにコンテナを保護する

`udocker rm`コマンドが利用できると、間違ってコンテナを消去してしまう事も有るかもしれない。どうしても消してしまっては困るコンテナを保護するには`udocker protect`を利用しよう

```bash
$ ./udocker protect ubuntu
$ ./udocker ps
CONTAINER ID                         P M NAMES              IMAGE
0ca3cd40-ff32-35c2-a4dd-d0e331ba449c P W ['ubuntu']         ubuntu:latest
f7c8f293-77a6-3c65-bb78-94d7da03c206 . W                    debian:latest
$ ./udocker rm 0ca3cd40-ff32-35c2-a4dd-d0e331ba449c
Error: container is protected
```

* `udocker protect`で名前(又はコンテナID)を指定してコンテナを保護
* `udocker ps`で Pのカラムが ”.”から”P”に変化している事を確認
* `udocker rm`で保護したコンテナが消去できない事を確認

消去しようとするとエラーが発生する

## udocker unprotect: コンテナの保護を取り消す

`udocker unprotect 名前(又はコンテナID)`でコンテナを消去できるようにする
実行例は示さない...

今日はここまで:smiley:
WC REST API v2.0 を利用するためのサーバー設定

WC REST APIを使うために必要な手順を説明します。
基本的にはSSHが使えるサーバーではないと無理かなと思います。
今回の例は多くの人が使えたらと思いますので、レンタルサーバーのXserverで設定した内容を書きます。
2018年2月27日現在

環境は以下となります。

- WooCommerce 3.3.2
- WordPress 4.9.4
- WC-REST-API 2.0
- composer 1.6.3

##composerのインストール

WC-REST-API を利用するには composer をインストールする必要があります。
curl コマンドを使ってインストールする場合は、以下の php7.0 の部分を使っている PHP のバージョンに合わせる必要があります。
公式サイトでは[こちらのように説明](https://getcomposer.org/download/)されていますが、 brew でもインストールできそうなので、 Xserver などでなければ、そのような方法もあるかと思います。

```sh:composer_install
[artws@sv**** ***.com]$ curl -s https://getcomposer.org/installer | /usr/bin/php7.0
All settings correct for using Composer
Downloading...

Composer (version 1.6.3) successfully installed to: /home/artws/demo01web.info/composer.phar
Use it: php composer.phar
[artws@sv**** ***.com]$ 
```
###composer の動作確認
composer と入力して動作するかを確認します。
以下のような画面が出てきたら大丈夫です。

```sh:composer
[artws@sv**** ***.com]$ composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.6.2 2018-01-05 15:28:41

Usage:
  command [options] [arguments]

Options:
  -h, --help                     Display this help message
  -q, --quiet                    Do not output any message
  -V, --version                  Display this application version
      --ansi                     Force ANSI output
      --no-ansi                  Disable ANSI output
  -n, --no-interaction           Do not ask any interactive question
      --profile                  Display timing and memory usage information
      --no-plugins               Whether to disable plugins.
  -d, --working-dir=WORKING-DIR  If specified, use the given directory as working directory.
  -v|vv|vvv, --verbose           Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

```
##WC-REST-API のインストール
[A PHP wrapper for the WooCommerce REST API](https://packagist.org/packages/automattic/woocommerce)
上記に記載されている方法で、 WC-REST-API をインストールします。

```sh:wc_rest_api_install
[artws@sv**** ***.com]$ composer require automattic/woocommerce
Using version ^2.0 for automattic/woocommerce
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing automattic/woocommerce (2.0.0): Downloading (100%)         
Writing lock file
Generating autoload files
[artws@sv**** ***.com]$
```
これで、 WC-REST-API が利用できるようになります。

WC-REST-API の WordPress 側での設定や使い方は次の記事で。
gitで色々を集計するワンライナー

# (追加 - 削除) 行の集計

```bash
git log --pretty='format:%an' --no-merges --shortstat |
awk -F ',' '
/^[^ ]/ {name = $1}
/^ /{
  split($2, data, " ");
  ary[name] += data[1];
  split($3, data, " ");
  arydel[name] += data[1]
}
END{
 for (name in ary){
  print ary[name] - arydel[name] " lines : " name " added " ary[name]  " lines, deleted " arydel[name] " lines"
  }
}'|
sort -n
```

# メールアドレス毎のコミット数の集計

```bash
git shortlog --summary --email|
awk '{arry[$NF] += $1;} END{for(i in arry){print arry[i] " " i}}'|
sort -n
```
RFM95とSX1276について



RFM95でSX1276用のLoraライブラリが使えますか？
[RFM95W LoRa stack \- Question \| Mbed](https://os.mbed.com/questions/77151/RFM95W-LoRa-stack/)


SX1276MB1xASにはRFスイッチがあり、デュアルバンドをサポートしています。 RFM95Wは1つの帯域専用ですが、そのRFはPA_BOOSTから出てきます。 したがって、SX1276LibのsetRxConfig（）メソッドとsetTxConfig（）メソッドを変更する必要があります。


STM B_L072Z_LRWAN1 LoRaボードとRFM95モジュールのサポート
[Support for the STM B\_L072Z\_LRWAN1 LoRa board and RFM95 modules \- Question \| Mbed](https://os.mbed.com/questions/78000/Support-for-the-STM-B_L072Z_LRWAN1-LoRa-/)


MBED用ライブラリっぽい
[STM32L0\_LoRa \- Lora support for the STM B\_L072Z\_LRWAN1 board o\.\.\. \| Mbed](https://os.mbed.com/users/Helmut64/code/STM32L0_LoRa/)



## Raspberry側

### Gatewayプログラム

[tftelkamp/single\_chan\_pkt\_fwd: Single Channel LoRaWAN Gateway](https://github.com/tftelkamp/single_chan_pkt_fwd)



### Arduino 


#### Arduino LoRa

[LoRa \- Arduino Libraries](https://www.arduinolibraries.info/libraries/lo-ra)


[sandeepmistry/arduino\-LoRa: An Arduino library for sending and receiving data using LoRa radios\.](https://github.com/sandeepmistry/arduino-LoRa)

Semtech SX1276/77/78/79 based boards including:
Dragino Lora Shield
HopeRF RFM95W, RFM96W, and RFM98W
Modtronix inAir4, inAir9, and inAir9B



### Arduino and the RFM95. 

[RadioHead: RH\_RF95 Class Reference](http://www.airspayce.com/mikem/arduino/RadioHead/classRH__RF95.html)


```
                Arduino      RFM95/96/97/98
                GND----------GND   (ground in)
                3V3----------3.3V  (3.3V in)
interrupt 0 pin D2-----------DIO0  (interrupt request out)
         SS pin D10----------NSS   (CS chip select in)
        SCK pin D13----------SCK   (SPI clock in)
       MOSI pin D11----------MOSI  (SPI Data in)
       MISO pin D12----------MISO  (SPI Data out)
       
```
Laravel5でCSRFチェックを外す

Laravelはセキュリティも万全なのでPOSTのformにはCSRF対策用のトークンが自動的に埋め込まれる。
これによって不正なPOSTリクエストにはTokenMismatchExceptionを出して処理を止めるようになっている。
しかし、ときにはこれが問題となることもある。
例えばAPIを作って外部からのPOSTリクエストを受け付けようとしたとき、送られてくるフォームデータにCSRFトークンは含まれていない。
なのでTokenMismatchExceptionとなって正常な処理が実行されない。
それだといけないので敢えてCSRFのチェックを外す場合、Laravelではどうするか。
それはミドルウェアのVerifyCsrfTokenに除外するURIを追加すればよい。

app/Http/Middleware/VerifyCsrfToken.php

```php
namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        '除外するURI',
    ];
}
```

これでOK:thumbsup_tone1:
なんでも受け付けるようになるので、別に認証の仕組みを作ったほうが安全だと思うがそれはまた別の話。
【AWS】請求書に"OCB～"という項目で高額請求が来た。

#概要
まず結論から言っちゃいます。
OCB は Out of Cycle BIll の略だそうで、AWS 側で利用料が計測出来なかったサービスの請求を
毎月の利用料とは別の請求書で請求してきたときにサービス名の頭に付くみたいです。(カスタマーサービスより)

私の場合は、計測出来ていなかった2か月分がまとめて来たため、予想以上に高額でかなり驚きました。

#請求が来るまでの流れ
振り返ってみると、色々とおかしかったのでまとめました。

**12月 AWS ElementalMediaLive 利用開始** 

- 請求なぜか来ない --$0

**1月 AWS ElementalMediaLive引き続き利用する**

- 請求来るも idle料金(channel を持っていると利用していない時間にも取られる料金)のみの請求 --$5.5


**2月 AWS ElementalMediaLiveを使わなくなるも、突然来る“OCBAWSElementalMediaLive へのサインアップの確認”というメールと高額請求**

- 謎のサービスに勝手に登録されたかと思い、調べるもヒット0件
- 2月が終わっていないのにも関わらず、2月分の請求書が届き、"OCBAWSElementalMediaLive"というサービスからの高額請求 --$99.17
- ここでようやく何かがおかしいと気づき、AWS カスタマーサービスに連絡
- 回答をもらい冒頭のような結論にたどり着く

#まとめ
このサービス、料金の説明より全然安いじゃん！と余裕こいてた矢先だったので、通常の料金なのに高く感じました。
新しくリリースされたサービスだったために、計測出来なかったという問題があったのだと思うので、AWS のほとんどのサービスでは起きないような事例だと思いますが
同じ理由で焦っている方に届けば幸いです。
初投稿なので、駄文だったと思いますが、お読みいただきありがとうございました。
変数や配列の縦位置を揃えてはいけない！！（ほとんどの場合は）

「縦位置を揃える」というのは、空白を追加してカラム位置を揃えることです。

```
// こういう、複数の変数定義を
const marginTop = 16;
const marginBottom = 24;
const marginLeft = 16;
const marginRight = 24;

// こう整列する？
const marginTop    = 16;
const marginBottom = 24;
const marginLeft   = 16;
const marginRight  = 24;
```

たしか[リーダブルコード](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655)でも、紹介されていたはず（今手元にないので、うろ覚えですが）。

でも、私は縦位置を揃えることを**積極的には賛成しません**。

# コードフォーマッタでは対応できない

私も**実際、縦位置が揃っていた方が見やすい**とは思います。
揃っていないよりは、揃っていた方が良い。問題は揃えるために支払うコストです。

Go言語の`go fmt` を皮切りに、どの言語でも**コードフォーマッタが普及してきて**いるようです。コードフォーマッタを使うと、

- 書く時に細かいコードの体裁を気にしなくてもいい
- レビューでコードの体裁をレビューしなくてよくなる
- 不毛な議論を避けられる（「ルールではインデントすることになってますが、ここではインデントするのが*自然*です！」なんて言い出す人が出てくる）

と、コードの体裁に関するコストを削減し、その分**本質的な部分に時間をかける**ことができるようになります。

**ところで、あなたが使っているコードフォーマッタは、「縦位置を揃える」ことができますか？** 

できるのなら、おめでとう。

できないとしたら・・・。

もし、どうしても縦位置を揃えたいのなら、コーディング規約を定めて、手動で入力しなければなりません。でもそれって、

- 書く時にコードの体裁を気にしなければならない
- レビューで、コードの体裁を気にしなければならない
- 時々、不毛な議論になる（「ルールでは縦揃えすることになってますが、ここでは揃えないのが*自然*です！」なんて言い出す人が出てくる）

って、コードフォーマッタ以前に払っていたコストを、（部分的に）払い続けるってことですよ？

私としては、縦位置は揃っていた方が良いが、別に揃っていなくても我慢できなくはありません。むしろ、**縦位置なんて諦めた方が総合的には幸せになれる**と思います。

# （余談）縦位置を揃えない "間違った" 理由

ところで、縦位置を揃えない派の中には、

> 変更時に、レイアウト調整のために、無関係な行も変更しなければならない

って理由を挙げる人がいます。

こんな diff は嫌だ！ってことです:

```diff
-const marginTop  = 16;
-const marginLeft = 16;
+const marginTop    = 16;
+const marginLeft   = 16;
+const marginBottom = 24;
+const marginRight  = 24;
```

でも、これはコーディングスタイルの問題というより、どちらかというと**ツールの問題**って気がします。

例えば、`git diff` では `--word-diff-regex` を使うと、空白の変更しかない行は無視できます:

```
$ git diff --word-diff-regex='\\w+|[^[:space:]]'
```

```diff
 const marginTop  = 16;
 const marginLeft = 16;
+const marginBottom = 24;
+const marginRight  = 24;
```

エイリアスとして登録しておくと便利です。

```
# ~/.gitconfig
[alias]
  diff-word = diff --word-diff-regex='\\w+|[^[:space:]]'
```
CAD > Tinkercad > UI > 垂直にオブジェクトを動かす > Ctrl+上 or +下 | マウス操作

```txt:動作環境
Windows 8.1 pro (64bit)
Google Chrome バージョン: 64.0.3282.186（Official Build） （64 ビット）
```

オンラインで使用可能なAutoCADのTinkercadを試してみた。

水平方向にはマウスカーソルで移動可能だ。
垂直方向にはどう移動するのか?

https://www.tinkercad.com/things/eNXWpplo3PI-tinkertip-move-objects-along-z-axis

Ctrlと上カーソル(下カーソル)を使うようだ。ここだけキーボード操作になる。

組立・分解式のキッチンツールを作ってみた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b833ab81-8791-ea04-c662-284f729535c3.png)

実際に先週末に工作したものは、全ねじとほぞ2つ（割り箸から作成）と端切れと檜板からなる。使用しないときは分解して、収納する。


### v0.2

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2cf287f2-9993-4d5f-b9e3-485fd1f85160.png)


### マウス操作

オブジェクトを選択時、表示される上方向の矢印をクリックすると、垂直方向の移動ができるようだ。


### 関連

- [SketchUp > M6の六角ボルトの寸法入力(内接円の半径) > 外接円の半径にして入力する](https://qiita.com/7of9/items/90d35c28b2fbb76bdfa7)
    - v0.2 (アクリル板とビスと金属スペーサーとファルカタ材からなる)
ghost のメール設定で社内SMTPを使用する

社内ナレッジ共有用に使用していたブログサービスの [Ghost](https://ghost.org/)で、ユーザを追加をするために、メールの設定をする必要がありました。

ただ、[Ghostのメール設定](http://docs.ghostchina.com/ja/mail/)　に記載の指定できるサービスが社外のサービスのため、社内ローカルサーバ環境で設定するには厳しかった。

末尾の参考サイトを見つつ、微調整しながらなんとかユーザ追加まで出来るようになっため、メモ書きとして残しておきます。(数年前から使っているため、バージョンはかなり古いです)


Ghost Version: 0.5.9

Ghostをインストールしたディレクトリ内の comfig.js に
以下の記載を追加、Ghostの再起動をすることでユーザ追加(メール送信)が可能に。

```javascript
mail: {
    transport: 'SMTP',
    options: {
        host: 'hostname',
        port: 1234,
    }
},
```

以下は参考サイト。バージョンによっては、以下の設定で実施出来るのでは。
[Add mail setting with ghost.](https://qiita.com/rasc33/items/3201be5365e017d9319d)
[Ghost: use custom smtp server](http://cheparev.com/ghost-use-custom-smtp-server/)
Dynamics365 PSA(Project Service Automation) の上部のプロセスバーを変更する方法

Dynamics365 PSA(Service Automation) にプロジェクトを作成すると上部にスケジュールを選択できるバーが出現します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/240857/da75b107-f9ed-29ab-82f5-41d2edb42854.png)


これはPSAだと「プロセス」という名前の概念です。プロセスとして「新規」⇒「見積もり」⇒・・・と推移していき最後クローズするということみたいです。
そこでプロセス名前の変更や、項目の追加/削除方法を調べてみました。

# プロセスバー変更方法
1 上部バーから[設定]-[カスタマイズ]-[システムのカスタマイズ]をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/240857/f5ce8f64-c1e2-df36-9074-f1213d1d69b6.png)

2 左バーから[コンポーネント]-[プロセス]を選択。
3 主エンティティが「プロジェクト」でカテゴリが「業務プロセスフロー」のプロセスを選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/240857/b6ece058-93bd-1493-1e75-59f10995487b.png)

4 プロセスバーの内容と一致したプロセス一覧が表示。(なぜか英語ですが、内容的には一致)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/240857/0f3136ae-9ae5-0cd2-8c24-7154a18288b3.png)

5 ここで編集すれば更新される。(消したり追加したり)

上記は直接プロジェクト用のプロセスステージを変更していますが、新規で作成することもできるっぽい。
論文まとめ：mixup Beyond Empirical Risk Minimization

#はじめに
H. Zhang らの論文「mixup: Beyond Empirical Risk Minimization」のまとめ

arXivは https://arxiv.org/abs/1710.09412

GitHub上には既に
https://github.com/unsky/mixup
など幾つかの実装が存在する。

# 要点
1. 新たな data augmentation 手法である
2. 別のクラスの２つのデータからある比率で新たなデータを作成し、それに対応するラベルも同じ比率で作成する
3. $x$を入力データ、$y$をラベルとし、$(x_i,y_i)$と$(x_j,y_j)$という２つのサンプルに対する新たなサンプルは$\lambda \in [0,1]$を用いて以下

```math
\tilde{x} = \lambda x_i + (1-\lambda )x_j \\
\tilde{y} = \lambda y_i + (1-\lambda )y_j
```

# 理論的な背景
### Empirical Risk Minimization
教師あり学習においては真のデータ$x$、真の目標値$y$とその結合分布$P(x,y)$との関係$f \in \mathcal{F}$とし、lossを$l$とするとリスク関数は

```math
R(f) = \int l(f(x),y)dP(x,y)
```

となる。しかし実際は真の分布はわからず、入手したデータとラベルの分布$P_{\delta} (x,y)$を用いて

```math
R_{\delta}(f) = \int \mathcal{l}(f(x),y)dP_{\delta}(x,y) = \frac{1}{n} \sum^n_{i=1} l(f(x_i),y_i)
```

### Vicinal Risk Minimization
もっと真の分布$P$に近いものを用いたい。そこで

```math
P_v(\tilde{x} ,\tilde{y}) = \frac{1}{n} \sum^n_{i=1} v(\tilde{x} ,\tilde{y} \ | \ x_i,y_i)
```

とする。$v$は例えば Gaussian vicinities 

```math
v(\tilde{x} ,\tilde{y} \ | \ x_i,y_i)= \mathcal{N}(\tilde{x} - x_i, \sigma^2)
```

を用いた場合、結局 data augmentation としてGaussian noiseを加えたものになる。

mixupを用いる場合は

```math
v(\tilde{x} ,\tilde{y} \ | \ x_i,y_i) = \frac{1}{n} \sum^n_{j} \mathbb{E}_{\lambda} [\delta(\tilde{x} = \lambda \cdot x_i + (1-\lambda ) \cdot x_j, \tilde{y} = \lambda \cdot y_i + (1-\lambda) \cdot y_j)]
```

となる。$\lambda$は$\lambda \sim Beta(\alpha, \alpha), \  for \ \alpha \in (0,\infty)$ 。

#実験と結果
<font color="red">書きかけ</font>
#コーディング例
<font color="red">書きかけ</font>
naming > ASXST55とASXST-55

**下記の名前はフィクションですが、実際に起こっていることです。**

- 海外製品: ASXST55
- 日本の代理店の販売: ASXST-55

日本語で作っている資料すべてが「ASXST-55」になっている例が実際にある。

以下のような結果となる

- ASXST-55で一致検索した人には日本語の情報しか得られない
- (気付いた人は)ASXST55で検索することで、製造元（海外）のDatasheetを見つけることはできる
    - 同様の名前付け失敗の部品すべてに関して、2種類の検索をするコストが生じる
- ASXST-55で多く販売された後に代理店がASXST55に変更するコストは高い
    - 代理店内部の打合せ、資料の改訂、公開、通知
    - 購入者側の打合せ、図面資料の改訂
    - etc
    - 結果として、ASXST-55として販売が続くだろう
- 将来、ASXST78を販売するときにも引きずられて「ASXST-78」にすることになるかもしれない
    - 現在の失敗ではなく、過去の失敗による命名かもしれない

最初の資料を作る段階で、名前について吟味しておけばこういう状況は発生しなかっただろう。

**「調べるのは面倒だから」などの理由による[数分]のコスト減が、結果として[数時間 |
 数日オーダー]*[関係者数]のコスト増につながる**。

(海外メーカーの表記と意図的に分けるための"-"の追加、という理由はあるのだろうか?）。

### 自分の失敗

rowとcolumnの定義を間違えて、extractCsvRow()という列(項目)を取得する関数を作った。それを多くのソースで実装、使用してしまったことがある:[link](https://qiita.com/7of9/items/e28895f22afda103092e)。
extractCsvRow()からextractCsvColumn()へ変更するコスト（と記憶の改訂）は高く、失敗したと思っている。

### 予防案

- 第一の情報源を確保しておく
- 名前を使う時は「第一の情報源」を参照するようにする
- プロトタイプで適当な名前を使ったとしても、プロダクトにかかわる段階で適切な名前にする
    - (追記 2018/02/27) さらに、@tenmyo さんの[コメント](https://qiita.com/7of9/items/a1844ec9a318651ec143/#comment-137d7d6c1adf1155b389)も検討した方が良いでしょう
        - 情報感謝です
SSH Key 生成 for Mac

gitlabに登録する公開鍵を生成したので、その際のめも。

## とりあえず何を使えばって場合はこれで

```
ssh-keygen -b 4096 -t rsa
```

▼オプション補足
-b: 鍵のビット数(設定しない場合は、デフォルトの1024ビット)
-t: 鍵の種類(dsa, ecdsa, ed25519, rsa, rsa1)


※そのほかのオプションについては、下記を参考にしてください。
人によっては、-Cオプションでコメントをつける場合もあるようです。

[OpenSSH-7.3p1 日本語マニュアルページ]
(https://euske.github.io/openssh-jman/ssh-keygen.html)


## ssh key生成の手順

### ファイル名で見る公開鍵、秘密鍵の違い
・id_rsa.pub = 公開鍵
・id_rsa = 秘密鍵

### 既存のkeyを確認

`ls -al ~/.ssh`で確認できます。

```
UserNames-MacBook-Pro:~ UserName$ ls -al ~/.ssh
total 8
drwx------   3 UserName  staff    96  2  7 11:42 .
drwxr-xr-x+ 35 UserName  staff  1120  2 23 11:23 ..
-rw-r--r--   1 UserName  staff   209  2  7 11:42 known_hosts
```

「id_rsa.pub」も「id_rsa」もないので、既存のkeyは無いことが確認できました。


### keyの生成

#### オプション設定しない場合の鍵生成
`ssh-keygen`を実行します。

```
UserNames-MacBook-Pro:~ UserName$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/UserName/.ssh/id_rsa): （保存先に指定がなければEnterを押してください） 
Enter passphrase (empty for no passphrase):  （パスワード入力）
Enter same passphrase again: （パスワード入力）
Your identification has been saved in /Users/UserName/.ssh/id_rsa.
Your public key has been saved in /Users/UserName/.ssh/id_rsa.pub.
The key fingerprint is:
（省略）
The key's randomart image is:
（省略）
```

```
+----[SHA256]-----+
UserNames-MacBook-Pro:~ UserName$ ls -al ~/.ssh
total 24
drwx------   5 UserName  staff   160  2 27 12:03 .
drwxr-xr-x+ 35 UserName  staff  1120  2 23 11:23 ..
-rw-------   1 UserName  staff  1766  2 27 12:03 id_rsa
-rw-r--r--   1 UserName  staff   418  2 27 12:03 id_rsa.pub
-rw-r--r--   1 UserName  staff   209  2  7 11:42 known_hosts
```

「id_rsa.pub」も「id_rsa」のどちらも生成されてますね。

#### オプション設定しない場合の暗号度合い
`ssh-keygen -l -f ~/.ssh/id_rsa.pub`を実行します。

```
UserNames-MacBook-Pro:~ UserName$ ssh-keygen -l -f ~/.ssh/id_rsa.pub
2048 SHA256:（省略） (RSA)
```
通常、2048あれば十分と言われていますので、あくまでも確認程度です。（暗号方式も確認できますね。）


### オプション設定した場合の鍵生成
`ssh-keygen -b 4096 -t rsa`を実行します。

```
UserNames-MacBook-Pro:~ UserName$ ssh-keygen -b 4096 -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/UserName/.ssh/id_rsa): （保存先に指定がなければEnterを押してください） 
Enter passphrase (empty for no passphrase): （パスワード入力）
Enter same passphrase again: （パスワード入力）
Your identification has been saved in /Users/UserName/.ssh/id_rsa.
Your public key has been saved in /Users/UserName/.ssh/id_rsa.pub.
The key fingerprint is:
（省略）
The key's randomart image is:
（省略）
```

```
UserNames-MacBook-Pro:~ UserName$ ls -al ~/.ssh
total 24
drwx------   5 UserName  staff   160  2 27 12:14 .
drwxr-xr-x+ 35 UserName  staff  1120  2 23 11:23 ..
-rw-------   1 UserName  staff  3326  2 27 12:14 id_rsa
-rw-r--r--   1 UserName  staff   762  2 27 12:14 id_rsa.pub
-rw-r--r--   1 UserName  staff   209  2  7 11:42 known_hosts
```

「id_rsa.pub」も「id_rsa」のどちらも生成されてますね。

#### オプション設定した場合の暗号度合い
`ssh-keygen -l -f ~/.ssh/id_rsa.pub`を実行します。

```
UserNames-MacBook-Pro:~ UserName$ ssh-keygen -l -f ~/.ssh/id_rsa.pub
4096 SHA256:（省略）(RSA)
```

オプションで設定した通り、4096ビットで生成されました。
こちらの方が強度がありますね。

### 余談
クリップボードへのコピーはこのコマンドを使用すると便利です。

```
UserNames-MacBook-Pro:~ UserName$ pbcopy < ~/.ssh/id_rsa.pub
```

これで公開鍵の内容がコピーできたので、あとはペーストするだけ。
GAE/py + SQLAlchemyで "2062, Cloud SQL socket open failed"


## エラー遭遇

Google AppEngine Standard Environmentにデプロイしている、
pythonのサーバからCloud SQLへSQLAlchemyを用いて接続していましたが、
単発での接続では問題がなかったのに、連続稼働していると、以下のようなエラーが起きました。

```py
OperationalError: (_mysql_exceptions.OperationalError) (2062, 'Cloud SQL socket open failed with error: Transport endpoint is not connected')
```
SQLAlchemyのエラーは[SQLAlchemyのエラー回避備忘録](https://qiita.com/yukiB/items/67336716b242df3be350)などが大変参考になりましたが、該当するエラーはありませんでした。
というか、Cloud SQLと言っているのでGCP上でのエラーと思われます。

発生箇所はConnectionを貼るところでした。
taskを分割して別スレッドで連続して作業していると、突然コネクションが貼れなくなるようです。

<img width="511" alt="スクリーンショット 2018-02-27 12.00.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/42594/dfd817c8-8a65-00e6-b1e8-0b6d51b7fe1f.png">


こんな感じでした。

## 解決方法

検索するとすぐに出てくるのですが、とても簡単な話で、SQLサーバへの接続がスレッドごとにきちんとcloseされていないためでした。

- [Task queues end up with “(2062, 'Cloud SQL socket open failed with error: No such file or directory')”](https://stackoverflow.com/questions/35828567/task-queues-end-up-with-2062-cloud-sql-socket-open-failed-with-error-no-suc)

コメントが違うエラーでしたが中身は同じで、12個以上のコネクションを同時に張ってはいけないようです。
[FAQ](https://cloud.google.com/sql/faq#sizeqps)にもちゃんと記載がありました。

> スタンダード環境で動作する各 App Engine インスタンスは、Google Cloud SQL インスタンスに対する同時接続数が最大 12 個に制限されます。

### SQLAlchemyでの切断
SQLAlchemyで、query等にSessionを使っていました。
sessionオブジェクトにもcloseがあるのですが、これは厳密にはConnectionと対応していないようで、
sessionをcloseしてるにもかかわらず、相変わらずエラーが起きていました。

```py
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine(url, encoding='utf8', echo=False)
Session = sessionmaker(bind=engine)
session = Session()
...
# ちゃんとcloseしていてもエラーが起きる
session.close()
```

SQLAlchemyではConnectionのPoolが使用されていて、connectionを再利用するため？にpool内で接続が維持されるようです。

- [How to close a SQLAlchemy session?](https://stackoverflow.com/questions/21738944/how-to-close-a-sqlalchemy-session)

上のスレッドで紹介されていましたが、単発で使って、別スレッド等でコネクションを共有されないような場合ではpoolをdisableにすれば、毎回connectionがcloseされるようです。
disableにする最も簡単な方法はengineを作るときに[NullPoolを指定する](http://docs.sqlalchemy.org/en/latest/core/pooling.html#switching-pool-implementations)ことです。

```py
from sqlalchemy.pool import NullPool
# poolclassにNullPoolを指定するとpoolがdisableになる
engine = create_engine(url, poolclass=NullPool)
Session = sessionmaker(bind=engine)
session = Session()
...
# エラーが起きなくなった！
session.close()
```

他にも方法があるかと思いますが、今回はこのような対処をしました。
SQLAlchemyを使っていれば常識なのかもしれませんね、、以上です。
Alibaba Cloud ECS でのインスタンスメタデータとユーザデータの取得方法

実行中のインスタンス上で、インスタンスメタデータ・ユーザデータを取得する方法についてです。

ちなみに、Amazon EC2 の場合は以下で取得できます。

```
$ curl http://169.254.169.254/latest/meta-data
$ curl http://169.254.169.254/latest/user-data
```

Alibaba Cloud ECS の場合、アドレスを `100.100.100.200` に変更すればO.K.です。

```
curl http://100.100.100.200/latest/meta-data
curl http://100.100.100.200/latest/user-data
```

## インスタンスメタデータ
```
$ curl http://100.100.100.200/latest/meta-data
dns-conf/
eipv4
hostname
image-id
instance-id
instance/
launch-index
mac
network-type
network/
ntp-conf/
owner-account-id
private-ipv4
region-id
serial-number
source-address
sub-private-ipv4-list
vpc-cidr-block
vpc-id
vswitch-cidr-block
vswitch-id
zone-id
```

いくつか取得してみました。


image-id

```
$ curl http://100.100.100.200/latest/meta-data/image-id
centos_7_04_64_20G_alibase_201701015.vhd
```

instance-type

```
$ curl http://100.100.100.200/latest/meta-data/instance/instance-type
ecs.n4.small
```

region-id

```
$ curl http://100.100.100.200/latest/meta-data/region-id
ap-northeast-1
```

## ユーザデータ

```
$ curl http://100.100.100.200/latest/user-data
#!/bin/bash
echo "Hello! Test!"
```

## まとめ
- `http://100.100.100.200/` で取得
- メタデータのリストはドキュメントを参照:
  - https://jp.alibabacloud.com/help/faq-detail/49122.htm
Dynamics365でバックアップ⇒リストア時にハマった

Dynamics365のPSA(Project Service Automation)を利用している環境でバックアップとリストアを試してみました。その時の手順とハマったことを記載します。

# ①事前作業(暗号キーのバックアップ)
内部DBの暗号化に使っている暗号キーがリストア後なぜか消えます。ｗ
そのための事前に以下の作業が必要です。

1.Dynamics365のPSAにログイン。
2.上部バーから、[設定]-[データ管理]をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/240857/66ed8c31-f1c4-3628-23a6-163722dacc70.png)
3.現在の暗号化キーを表示して、コピペ。どっかに保存。



# ②Dynamics365 PSA環境のバックアップ

1 Office365にログインし、全てのアプリから「管理者」を押下。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/240857/c0e4df8b-a745-108d-2663-bfcebf3f32de.png)

2 管理センターからDynamics365を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/240857/89b71873-ae8c-a507-9d32-a110933e6ff7.png)
 
3 管理センター開きますので「バックアップと復元」タブを選択、バックアップの開始。

# ③Dynamics365 PSA環境のリストア

1 管理センターの「バックアップと復元」タブで、バックアップデータを選択し、復元を実行。
2 リストア中///(30分ぐらいかかりました)
3 リストア完了！しかしいざプロジェクトを開いてみると暗号化エラーが出る。。。
4 ①事前作業(暗号キーのバックアップ)の手順で[データ管理]を開くと、暗号化キーが空白になってる、、、
5 バックアップしておいた暗号キーを張り付けて完了！
Androidの端末回転時のライフサイクルを確認

Android開発をしていて、端末回転時のライフサイクルの確認をしたくなる時がちょこちょこあったので備忘録を残す。

-----------------Activity起動-----------------
D/debug: onCreate()
D/debug: setUp()
D/debug: onStart()
D/debug: onResume()
-------------------端末回転-------------------
D/debug: onSaveInstanceState()
D/debug: onDestroy()
D/debug: onCreate()
D/debug: onStart()
D/debug: onRestoreInstanceState()
D/debug: onResume()

ついでに基本的なActivity(とFragment)のライフサイクルも記載する。

### Activityのライフサイクル
https://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle
![Activity-life-cycle.png](https://qiita-image-store.s3.amazonaws.com/0/143619/9a9b40df-9da7-68bc-2ecd-4dafc92b8ea9.png)

### Fragmentのライフサイクル
https://developer.android.com/guide/components/fragments.html#Creating
![Fragment-life-cycle.png](https://qiita-image-store.s3.amazonaws.com/0/143619/e19404bd-d815-3f50-5f36-af1b45eedeee.png)
無料サーバー XREA vim設定

xreaでlamp環境を整える方法。
vimってどうやってインストールするのか困ったので、この手順でやれば設定できます。

##１．アカウント開設後、vimインストールのshellスクリプトをアップロードして、起動する。#

下記のshellスクリプトを作成し、実行します。

```vim_install_log_on_xrea.sh
# Vim本体の取得
wget ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2
bunzip2 vim-7.3.tar.bz2
tar xf vim-7.3.tar

# 最新のパッチを取得
cd vim73
mkdir patches
cd patches
curl -O 'http://ftp.nluug.nl/vim/patches/7.3/7.3.[001-861]'

# パッチを適用してインストール
cd ..
for i in `ls patches/7.3.*`; do patch -p0 < $i; done
./configure --with-features=big --enable-multibyte --without-x --disable-gui --prefix=$HOME/local
make
make install

# お疲れ様でした
export PATH="${HOME}/local/bin:${PATH}"
```

##2．vimの起動設定#
このままだとvimで起動出来ないので、「.bashrc」を編集し追記します。

```.bashrc
export PATH="$HOME/local/bin:$PATH"
export TERM=xterm-256color
alias view="vim -R"
```

##3．.vimrcの設定#
初期設定として「.vimrc」を作り、下記をぶち込みます。

```.vimrc
"文字コードをUFT-8に設定
set fenc=utf-8
" バックアップファイルを作らない
set nobackup
" スワップファイルを作らない
set noswapfile
" 編集中のファイルが変更されたら自動で読み直す
set autoread
" バッファが編集中でもその他のファイルを開けるように
set hidden
" 入力中のコマンドをステータスに表示する
set showcmd
" バックスペースで削除
set backspace=indent,eol,start
"前回のカーソル位置を記憶
au BufWritePost * mkview
autocmd BufReadPost * loadview


" 見た目系
" 色をつける
syntax on
" 現在の行を強調表示
"set cursorline
" 行末の1文字先までカーソルを移動できるように
set virtualedit=onemore
" インデントはスマートインデント
set smartindent
" ビープ音を可視化
set visualbell
" 括弧入力時の対応する括弧を表示
set showmatch
" ステータスラインを常に表示
set laststatus=2
" コマンドラインの補完
set wildmode=list:longest
" 折り返し時に表示行単位での移動できるようにする
nnoremap j gj
nnoremap k gk


" Tab系
" 不可視文字を可視化(タブが「▸-」と表示される)
set list listchars=tab:»-
" Tab文字を半角スペースにする
"set expandtab
"" 行頭以外のTab文字の表示幅（スペースいくつ分）
set tabstop=2
" 行頭でのTab文字の表示幅
"set shiftwidth=2

" 検索系
" 検索文字列が小文字の場合は大文字小文字を区別なく検索する
set ignorecase
" 検索文字列に大文字が含まれている場合は区別して検索する
set smartcase
" 検索文字列入力時に順次対象文字列にヒットさせる
set incsearch
" 検索時に最後まで行ったら最初に戻る
set wrapscan
" 検索語をハイライト表示
set hlsearch
" ESC連打でハイライト解除
nmap <Esc><Esc> :nohlsearch<CR><Esc>
```
私仕様に変えてあります。



>引用
https://gist.github.com/raimon49/5162247
https://qiita.com/mfujimori/items/9fd41bcd8d1ce9170301
http://sangoukan.xrea.jp/cgi-bin/tDiary/?date=20090806
https://qiita.com/omega999/items/23aec6a7f6d6735d033f
https://www.turbolinux.co.jp/support/document/knowledge/441.html
コマンドでの環境変数の受け渡し

## 概要
コマンド実行する際に、環境変数を渡す機会があり、そのやり方について調べた内容をメモしておく。

## 実行時に環境変数を定義する
動作確認用のシェルスクリプトを作成する。

```sh:test.sh
#!/bin/bash
echo $APP_ENV
echo $APP_FILE_TYPE
```

**実行例１）**

```sh:ターミナル
$ APP_ENV=development APP_FILE_TYPE=direct sh test.sh
development
direct
```

**実行例2）**

```sh:ターミナル
$ export APP_ENV=development; export APP_FILE_TYPE=direct; sh test.sh
development
direct
```

## 別ファイル(.sh)に定義したものを読み込む
環境変数を定義したファイルを作成する。

```sh:secrets.sh
#!/bin/bash

# Environment
export APP_ENV=testing

# Environment file type.
export APP_FILE_TYPE=shell
```

実行してみる。

```sh:ターミナル
$ source ./secrets.sh; sh test.sh
testing
shell
```

## 別ファイル(.env)に定義したものを読み込む
環境変数を定義したファイルを作成する。

```:.env
# Environment
APP_ENV=local

# Environment file type.
APP_FILE_TYPE=config
```

実行してみる。

```sh:ターミナル
$ export $(cat .env | grep -v ^# | xargs); sh test.sh
local
config
```


## 参考サイト
- [シェルスクリプトに環境変数を渡して表示する方法](https://qiita.com/Yinaura/items/978b8c44cbddae1b8df7)
- [cron の実行時に外部ファイルから環境変数を export する](http://walkingmask.hatenablog.com/entry/2017/12/05/181024)
- [Set environment variables from file](https://stackoverflow.com/questions/19331497/set-environment-variables-from-file)
IBM Cloud 開発環境を整えるその５

IBM Cloud 開発環境を整えるその５

■ ソース管理(git)

プログラムは生き物です。
時を経て様々なニーズを取り込んで進化します。
つまり、プログラムは固定化されたものではなく、不定の前提故に、プログラムのリリースするタイミングでソースの版管理をする必要が発生します。
また、複数人で開発するプロジェクトでは共通のプログラムをよってたかって修正することもおこります。
先祖がえり（デグレード）が発生する所以です。
これを発生させないために、ソース管理が重要となってきます。
VSCodeに実装しているgitのソース管理について、基本操作を学習します。

コマンドパレット(Ctrl+Shift+p)を開きます。
「git」と入力します。
![EX-20-20180227.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/5e2f99fa-51dc-c235-a720-03ebb65d57d7.jpeg)

先頭のGit リポジトリの初期化を選択します。
エクスプローラーが表示されます。
![EX-21-20180227.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/a0ac5c3d-5b55-d6b6-2c4b-3c2cf3dc7a1e.jpeg)
リポジトリの初期化ボタンを押下します。
※1 現在のHollo Worldディレクトリがデフォルトで選択しましょう。

ソース管理ボタンに青丸の中に26が表示されます。
マウスカーソルをボタンに合わせると「ソース管理(Ctrl+Shift+G) - 26個の保留中の変更」と表示されます。
日本語訳のニアンスがちがうような、「26個の変更が保留中」という意味です。

![EX-22-20180227.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/131554d2-1c9b-0ac3-ce08-6cb4717e2d98.jpeg)

![EX-23-20180227.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/87a2b56d-e7e0-ddc9-b381-fe204607ac56.jpeg)

ソース管理画面にダッシュが表示されます。マウスカーソルを合わせると「Commit」(コミット)と表示されます。
コミットは変更を確定させるという意味になります。

![EX-24-20180227.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/03bb5d5c-f32f-5351-4a9f-3afa533db09f.jpeg)

ソースリストの右端に「U」の文字が表示されます。これは「Update」(更新)を表します。

ダッシュ(コミット)ボタンを押下します。

![EX-25-20180227.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/f8b84d2d-76da-c55a-ace7-97f1357f5d17.jpeg)

「はい」ボタンを押下。
コマンドパレットにコミットメッセージの入力がもとめられるので,「Ver1.00」を入力。


次に、エクスプローラーボタンを押下して、Program.vbを選択し、下記のようにコードを追加。

![EX-26-20180227.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/7fcc2a47-d974-efbb-0407-9c955bad4305.jpeg)

9行目 Debug.Print("Debug.Print")
※2 DebugのPrint機能メッソドで"Debug.Print"を出力。

変更後、Program.vbを保存すると、デバッグボタンに変更したソースのカウント数が表示されます。
![EX-27-20180227.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/3f8b832a-f477-c02b-3e55-a9abb95c2cae.jpeg)

ソース管理ボタンを押下すると、
ソース管理されている変更前のソースと変更後のソースが表示されます。(Working Tree)
最初の変更箇所にカーソルがあります。←　→　ボタン押下で、次の変更箇所、前の変更箇所に移動できます。

![EX-28-20180227.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/47196526-dfc4-1ec4-9412-e132feaa543f.jpeg)

再びコミットします。
コマンドパレットにコミットメッセージの入力がもとめられるので,「Ver1.01」を入力。

![EX-29-20180227.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/397c5dad-ab9d-2a7d-f0f3-ff69d93094ff.jpeg)

[ターミナル]git log を打鍵します。

![EX-30-20180227.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/f71630d5-504e-742c-601c-76dbdd0e5964.jpeg)

git でコミットした日付時刻にコミットメッセージが出力されます。
コメットメッセージには変更履歴などを記入します。

VSCodeのソース管理の基本機能を説明しました。
これでVSCodeの基本操作を終えます。
次回こそ脱線します。

以上、おそまつ
jQueryMobileのThemeRollerではまった話。


今時、jQueryMobileを使っている人はいないと思いますが、過去に作ったプログラムの修正ではまったのでメモ。

jQueryMobileでは、ThemeRoller(http://themeroller.jquerymobile.com) というツールで画面のテーマをカスタマイズすることが出来ます。あまり使いやすいものではありませんが、それでもないよりはマシです。

ですが、以前のバージョンでは問題なかったのですが、最新の1.4.5のThemeRollerでは、以下のバグがあり、正しくテーマが反映されません。

- ボタン等のスタイルが以下のように生成され、意味のないスタイルになります。

```css
html head   body .ui-btn.ui-btn-f,
```

- 修正方法は簡単で以下のように不要な```head``` , ```body``` を削除します。

```css
html .ui-btn.ui-btn-f,
```

修正は簡単でしたが、気がつくまでに時間がかかってしまった。
Vue.jsでクリックイベントを２つ持たせる方法

# Vue.jsでクリックイベントを複数持たせる方法

単純にクリックイベントに２つ書けばいけます。

```javascript
v-on:click="click_1(); click_2()"
@click="click_1(); click_2()"
```

あんまり使わないとは思いますが、検索で出てこなかったので書いておきます。

# その他

## 動作サンプル
https://ykhirao.github.io/qiita/click_vuejs/

## ソースコード

[最新版](https://github.com/ykhirao/qiita/blob/master/click_vuejs/index.html)

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <script src="https://unpkg.com/vue@2.5.3/dist/vue.js"></script>
  <title>Vue.js</title>
  <style>
    p {
      padding: 2em;
      width: 200px;
      border: solid;
    }
    p:hover {
      border-color: #6C9BD2;
      color: #6C9BD2;
    }
  </style>
</head>
<body>
  <div id='demo'>
    <p v-on:click="click_1(); click_2()">クリックイベントはこちら</p>
    <ul v-for="text in list">
      <li>{{text}}</li>
    </ul>
  </div>
  <script>
    new Vue({
      el: '#demo',
      data: {
        list: []
      },
      methods: {
        click_1: function() {
          this.list.push("by click 1")
        },
        click_2: function() {
          this.list.push("by click 2")
        }
      }
    })
  </script>
</body>
</html>

```
Project Euler 37「切り詰め可能素数」

[Project Euler 35「巡回素数」](https://qiita.com/yopya/items/6189d06965e61ec9c9f1)とほぼ同じ。

# Problem 37 「切り詰め可能素数」
3797は面白い性質を持っている. まずそれ自身が素数であり, 左から右に桁を除いたときに全て素数になっている (3797, 797, 97, 7). 同様に右から左に桁を除いたときも全て素数である (3797, 379, 37, 3).
右から切り詰めても左から切り詰めても素数になるような素数は11個しかない. 総和を求めよ.
注: 2, 3, 5, 7を切り詰め可能な素数とは考えない.

```python
def hoge():
    ignore_digits = set('024568')
    ans = []
    n = 11
    while len(ans) < 11:
        str_n = str(n)
        if len(str_n) > 2 and ignore_digits & set(str_n):
            n += 2
            continue
        flg = True
        for i in range(len(str_n)):
            if not is_prime(int(str_n[i:])) or not is_prime(int(str_n[:i+1])):
                flg = False
                break
        if flg == True:
            ans.append(n)
        n += 2
    return sum(ans)

import math
def is_prime(n): # 素数判定
    if n < 2: return False
    elif n == 2: return True
    elif n % 2 == 0: return False
    for i in range(3, int(math.sqrt(n))+1, 2):
        if n % i == 0: return False
    return True

print(hoge())
```
Unity Facebook連携 SDK 7.11がiosビルド通らなかった

環境はUnity2017.3.0f1
OSはMac Sierra
Xcode 9.2

Facebook SDKをUnityに入れようと思ったら
AssetStoreの<a href="https://www.assetstore.unity3d.com/jp/?stay#!/content/10989" target="_blank">Facebook SDK</a>がどうも3年前ので怪しい。
レビューも古いってあって・・・。
AssetStoreのやつのバージョンは7.2.2
そして設定画面もなんだかちゃんと項目が表示されてなかったりで・・・。
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/4275f97e-3e0e-c58b-88c4-61b8b836d3aa.png" width="300"/>

なので<a href="https://developers.facebook.com/docs/unity/downloads/" target="_blank">公式サイトからSDK</a>をダウンロード
バージョンは7.11.0
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/6b2c955d-d4ed-9abd-fada-c7c3a4f5462d.png" width="300"/>

iosでのビルドでxcodeにてエラーがなかなか解決できずに苦労した
まず大量のiosのバージョン8にしてねってエラーが出てたのでターゲットのiosの最低バージョンを8に。
bitcodeがどうたらーってでてたのでNoに
<img width="400" alt="スクリーンショット 2018-02-26 23.08.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/8f1c59d2-7ef1-08dc-f2ee-1e1478857d2c.png">

ここまではいいのですが、そのあとこのエラーでハマる。
![face3.png](https://qiita-image-store.s3.amazonaws.com/0/46444/e666ca3c-f5be-4e05-ddff-e55c02a5408c.png)

この辺まで行くとgoogle先生も英語のやつしか出してくれないので
翻訳を駆使しながら・・・・
<a href="https://github.com/facebook/facebook-sdk-for-unity/issues/135" target="_blank">ここ</a>
バグで上がってた。
ここのchamnassi2 さんの書き込みの一時ファイルをダウンロード
Facebook.Unity.dll
ファイルをダウンロードしたものと差し替えたら動きました。
きっといずれは対応してくれると思うけど。
結構ハマったので残しとく。