OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Lambda× Goを試す

## はじめに
AWS LambdaでGoがサポートされたので、早速、試してみました。

この記事では、

* AWS Lambdaの簡単な使い方
* AWS LambdaでGoを動かす方法

を紹介しています。

**ザクザク行けば、10分くらいでLambdaの実行までいけると思います**

## Lambdaを作成する
AWS Lambdaのトップから、`関数の作成`を選択
<img width="1440" alt="Lambda_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/99874/8dadc2f1-7cf3-be39-7ced-927d02aabf76.png">

名前やロールなどを設定し、`関数の作成`を選択
**ランタイムは`Go 1.X`とします**
ロールは、使用されるリソースに応じてお好みで。
<img width="1440" alt="aws_lambda_sample.png" src="https://qiita-image-store.s3.amazonaws.com/0/99874/470476ab-3cbe-f7e2-23a4-73f314051cea.png">


## Lambdaで動かすGoを作る
### 公式ライブラリを使用する
[公式のGoのライブラリ](https://github.com/aws/aws-lambda-go)を`go get`します。

```bash
go get -u github.com/aws/aws-lambda-go/lambda
```

### コードを書く
※公式のサンプルのまま書いています。

```go:main.go
package main

import (
	"github.com/aws/aws-lambda-go/lambda"
)

func hello() (string, error) {
	return "Hello ƛ!", nil
}

func main() {
	// Make the handler available for Remote Procedure Call by AWS Lambda
	lambda.Start(hello)
}

```

### ビルドする
ビルドのターゲットは以下を指定

```
GOOS=linux GOARCH=amd64 go build -o hello
```

これで、 `hello`という名前のバイナリがカレントディレクトリに生成されます。

```bash
$ ls
hello          main.go
```

### zipに圧縮する
手動アップロードの場合、Lambdaに上げる時はzipで上げなければいけないため、固めます。

```bash
$ zip hello.zip hello 
  adding: hello (deflated 66%)
$ ls
hello              hello.zip          main.go
```

## アップロード
`アップロード`から、先程作成した`hello.zip`を選択してアップロードを実行します。
アップロード後は、右上のテストボタンを選択します。
<img width="1440" alt="Lambda_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/99874/0cfa56b6-ef5d-6c8a-ef76-419c65e41e48.png">

## テスト
テストを作成します。作成後、右上の保存を選択してください。
<img width="1440" alt="Lambda_Management_Console2.png" src="https://qiita-image-store.s3.amazonaws.com/0/99874/1412df8e-fe09-f041-b65b-03c614b9671f.png">

テストを実行すると…
ちゃんと、 `Hello ƛ!`と出力されています :tada: 
<img width="1440" alt="Lambda_Management_Console3.png" src="https://qiita-image-store.s3.amazonaws.com/0/99874/62e2337d-790f-df47-79cf-963958380f0b.png">

## 終わりに :airplane: 
読んで下さりありがとうございます。
今回はサンプルだけなので、次回は実際に活用した記事を書く予定です。
MapFragmentを使って自分のアプリにGoogleMapを表示した

#この記事において前提としていること
Android Studio 3.0.1 でアンドロイド開発の勉強をしています。
Fragmentを理解する必要があることを悟り、[Fragmentを用いてタブを実装するチュートリアル(?)](https://maxalley.wordpress.com/2013/05/18/android-creating-a-tab-layout-with-fragmenttabhost-and-fragments/)を写経しました。

#Google Map Activityを追加する

AndroidStudioのプロジェクト名の上で右クリック → New → Google → Google Map Activityをクリックして自分のプロジェクトにGoogleMapのアクティビティを追加。
生成されたgoogle_maps_api.xmlにご丁寧にも"TODO: Before you run your application, you need a Google Maps API key.　To get one, follow this link, follow the directions and press "Create" at the end:"という説明書きとともにAPIキー取得のURLが書かれていたので、そのページからAPIキーを取得。
キーを以下の所に追加。

```google_maps_api.xml
<string name="google_maps_key" templateMergeStrategy="preserve" translatable="false">ここ</string>
```

MainActivity.javaで`com.google.android.gms.maps.MapFragment;`をimport。
FragmentTabHost#addTab()の第二引数にTabのContentとなるクラスを渡しているので、`MapFragment.class`を渡してあげる。
エミュレータを起動し、GoogleMapを追加した”TAB 3”を選択すると、以下の画像のようにGoogleMapが表示されました！
![Screenshot_1516200883.png](https://qiita-image-store.s3.amazonaws.com/0/145181/af5ab2a9-df94-2fb5-bf67-e4ba61ce990c.png)

実質3行に手を加えるだけでGoogleMapが追加できました。すごい。

#最終的なMainActivity.java

```MainActivity.java

package com.example.kouhei.tabapplication;

import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTabHost;
import android.os.Bundle;
import com.google.android.gms.maps.MapFragment; // MapFragmentをimport

public class MainActivity extends FragmentActivity {
    private FragmentTabHost mTabHost;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        mTabHost = (FragmentTabHost)findViewById(R.id.tabhost);
        mTabHost.setup(this, getSupportFragmentManager(), R.id.tabContent);

        // "FragmenteTab"は自分で実装するクラス
        // addTab()の第一引数がTabSpec、第二引数は表示するFragmentをclass名で渡す。第三引数はFragmentで読み込むデータをBundleで渡す。
        // TabSpecはタブの情報
        // setIndicator()はタブのView
        mTabHost.addTab(
                mTabHost.newTabSpec("tab1").setIndicator("Tab 1", getDrawable(R.drawable.ic_spa_black_24dp)),
                FragmentTab.class,
                null);
        mTabHost.addTab(
                mTabHost.newTabSpec("tab2").setIndicator("Tab 2", getDrawable(R.drawable.ic_sentiment_satisfied_black_24dp)),
                FragmentTab.class,
                null);
        mTabHost.addTab(
                mTabHost.newTabSpec("tab3").setIndicator("Tab 3", getDrawable(R.drawable.ic_android_black_24dp)),
                MapFragment.class, // ここに書いてあったFragmentTabを書き換えました。
                null);
    }
}

```
CentOS 6 向け PortForwarder 設定メモ

## 前提
- CentOS 6 の OpenSSH (openssh-server) は ed25519 に対応していないっぽいので, ECDSA-521 で代用する。
- と思っていたら, そもそも PortForwarder が ecdsa にも対応していなさそうなので, ビット長を長くした RSA で代用する。
- PortForwarder の config.txt はネットワーク管理者から受領するものとする。
- Tera Term は Ver. 4.97 で検証した。

## Tera Term での作業
1. Tera Term の **設定** - **SSH 鍵生成** をクリックする。
   - *TTSSH: 鍵生成* ウィンドウが開く。
1. 以下の通り設定し, **生成** ボタンを押下する。
   1. 鍵の種類: **RSA** にチェックが入っていることを確認する。
   1. ビット数: **4096** と入力する。
      - *bcrypt KDF 形式* にチェックは *入れない。*
      - しばらく待機すると, *鍵を生成しました。* と表示される。
1. **鍵のパスフレーズ** と **パスフレーズの確認** にパスフレーズを入力する。
   - *コメント* 欄はそのままで OK.
1. **公開鍵の保存** ボタン, 及び, **秘密鍵の保存** ボタンをそれぞれ押下し, 公開鍵, 秘密鍵を保存する。
1. **公開鍵** をネットワーク管理者に送付する。
   - 間違っても秘密鍵を送付してはいけない。

## SSH サーバーでの作業
- 事前に UID を確認の上, `useradd -g users` しておく。

### ディレクトリー作成
```
[hogehoge@sshsv01 ~]$ mkdir -vm 0700 ~/.ssh
mkdir: created directory `/home/hogehoge/.ssh'
[hogehoge@sshsv01 ~]$
```

```
[hogehoge@sshsv01 ~]$ ls -ld ~/.ssh
drwx------. 2 hogehoge users 4096  1月 17 23:01 2018 /home/hogehoge/.ssh
[hogehoge@sshsv01 ~]$ ls -dZ ~/.ssh
drwx------. hogehoge users unconfined_u:object_r:user_home_t:s0 /home/hogehoge/.ssh
[hogehoge@sshsv01 ~]$
```

### 公開鍵登録
```
[hogehoge@sshsv01 ~]$ cd ~/.ssh; pwd
/home/hogehoge/.ssh
[hogehoge@sshsv01 .ssh]$ cat > authorized_keys
(省略)
[hogehoge@sshsv01 .ssh]$ cat authorized_keys
ssh-rsa (中略) hogehoge
[hogehoge@sshsv01 .ssh]$
```

```
[hogehoge@sshsv01 .ssh]$ chmod -v 0600 authorized_keys
`authorized_keys' のモードを 0600 (rw-------) に変更しました
[hogehoge@sshsv01 .ssh]$
```

```
[hogehoge@sshsv01 .ssh]$ ls -l authorized_keys
-rw-------. 1 hogehoge users 261  1月 17 23:03 2018 authorized_keys
[hogehoge@sshsv01 .ssh]$ ls -Z authorized_keys
-rw-------. hogehoge users unconfined_u:object_r:user_home_t:s0 authorized_keys
[hogehoge@sshsv01 .ssh]$
```

## PortForwarder 設定
1. [Releases - comuttun/portforwarder - GitHub](https://github.com/comuttun/portforwarder/releases) より最新の zip ファイルをダウンロード, 展開する。
1. ネットワーク管理者から受領した config.txt と SSH 鍵を展開したフォルダに格納する。
   - 格納する鍵は秘密鍵だけで良いが, 管理の手間を考えて公開鍵も格納して OK.
1. PortForwarder.exe を起動する。
1. 以下の通り設定し, **Connect** ボタンを押下する。
   1. Config file: 右の **...** ボタンを押下し, **config.txt** を指定する。
   1. Host: プルダウンより対象のホスト名を選択する。
   1. **Automatically** にチェックを入れる。
      - 接続されるとタスクトレイに格納される。
1. 終了する場合はタスクトレイのアイコンを右クリックし, **Exit** をクリックする。

以上。
NavigationBarを含んだ画面でViewで全体を覆う方法

##はじめに
・n番煎じです
・AppDelegateが持つwindowにはaddSubviewしません
・Storyboard上のView部品を使用します

##画面全体を覆うViewを表示したい時
て割とありますよね。通信処理中に画面を触って欲しくない時に、インジケーターと一緒に文言とか出して、黒透過なViewを表示するアレです。
NavigationBarが無い場合は特に意識することなくself.viewの最前面に覆いたいViewを追加すれば良いのですが、NavigationBarがあるとそれだけでは覆ってくれません。

こんな感じ
<img src="https://qiita-image-store.s3.amazonaws.com/0/57541/692c7811-62da-904f-454f-1f00147b40fa.png" width=40%>

この対処法として、AppDelegateが持つwindowインスタンスにViewを追加するという方法もあるのですが、windowに貼りつけたり取り外したりはバグの温床になることもあるので(経験談)、出来ればそれはしない方法でやりたいと思います。

## NavigationBarを覆うパタン
こうします
<img src="https://qiita-image-store.s3.amazonaws.com/0/57541/c1494406-a036-0f1c-fd51-52ad37a55621.png" width=40%>

## 実装
・被せる用のViewを、被せたいViewControllerの部品内に用意します
　-> 被せたいVIewはHiddenにしておきます
　-> Viewcontroller.view内には設置かないのがポイント
　-> ViewController部品の上に被せたいView部品が表示されます

<img width="1011" alt="Untitled.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/57541/23841cfc-ac05-7e43-543b-f48b08d0202d.jpeg" width=50%>


・コードは以下のような感じです。
　-> self.navigationController?.view.addSubview(self.coverView)がキモ

```ViewController.swift

	@IBOutlet private weak var coverView: UIView!

	override func viewDidLoad() {
        super.viewDidLoad()
        // ここがキモ
        self.navigationController?.view.addSubview(self.coverView)
	} 

     // MARK: - Action
	
	@IBAction func didTapShowButton() {
		self.coverView.isHidden = false
    }

	@IBAction func didTapCloseButton() {
		self.coverView.isHidden = true
	} 

```

## コードはこちら
https://github.com/tony1224/NavigationBarCoverSample
Cloud Firestore で複数の DocumentReference に対し Transaction を実行する

Firestore では、 [トランザクションと一括書き込み  \|  Firebase](https://firebase.google.com/docs/firestore/manage-data/transactions?hl=ja) にあるように、下記のコードで transaction が実行できます。

```js
var transaction = db.runTransaction(t => {
    return t.get(cityRef)
        .then(doc => {
            // Add one person to the city population
            var newPopulation = doc.data().population + 1;
            t.update(cityRef, { population: newPopulation });
        });
})
.then(result => {
    console.log('Transaction success!');
})
.catch(err => {
    console.log('Transaction failure:', err);
});
```

この例だと transaction は1つの DocumentReference に対してのみ行われていますが、複数の reference に対しても Transaction を張ってみます。

## 複数 Transaction

3つの商品があり、同時に1つずつ在庫数を減らしているサンプルコードです。
※ TypeScript です。

```ts
const decreaseStock = async (productRefs: FirebaseFirestore.DocumentReference[]) => {
  return admin.firestore().runTransaction(async (transaction) => {
    const promises: Promise<any>[] = []
    for (const product of productRefs) {
      const t = transaction.get(product).then(tproduct => {
        const newStock = tproduct.data().stock - 1
        transaction.update(product, { stock: newStock })
      })
      promises.push(t)
    }
    return Promise.all(promises)
  })
}

const productData = [...Array(3).keys()].map(index => {
  return { price: 5000, stock: 1000, index: index }
})
const productRefs = await Promise.all(productData.map(data => {
  return admin.firestore().collection('product').add(data)
}))

await decreaseStock(productRefs)
```

for の中で `transaction.get` を複数作成して、 `Promise.all` でそれらを実行するようにしています。

これで3つの商品の更新に対し Transaction を実行できました。3つの商品全て stock: 999 になっており、問題なさそうです。

## 本当に Transaction になっているのか検証する

本当に Transaction として機能しているのか、3つの商品のうち1つの更新が失敗する状況を作ってみましょう。
Transaction として実行しているので、1つの商品の更新がこけたら他の2つの商品の更新もされないはずです。

3つある商品のうち、 index === 2 だったら throw しています。

```ts
const decreaseStock = async (productRefs: FirebaseFirestore.DocumentReference[]) => {
  return admin.firestore().runTransaction(async (transaction) => {
    const promises: Promise<any>[] = []
    for (const product of productRefs) {
      const t = transaction.get(product).then(tproduct => {
          if (tproduct.data().index === 2) {
            throw `index 2`
          } else {
            const newStock = tproduct.data().stock - 1
            transaction.update(product, { stock: newStock })
          }
      })
      promises.push(t)
    }
    return Promise.all(promises)
  })
}

const productData = [...Array(3).keys()].map(index => {
  return { price: 5000, stock: 1000, index: index }
})
const productRefs = await Promise.all(productData.map(data => {
  return admin.firestore().collection('product').add(data)
}))

await decreaseStock(productRefs)
```

この結果は商品3つとも stock: 1000 になっていて、ちゃんと Transaction になっています。
Transaction 内部のすべてが成功しないと update されません。


## おわり

ドキュメントには1つの DocumentReference に対してしかのサンプルがありませんが、複数の DocumentReference に対しても Transaction ができました。
複数に対し同時に Transaction を張るということはロック時間が長くなってしまうので、積極的に使うのは避けたいですね。
windowsでnyaovim

#はじめに
　いやー、vimもすごいですねえ。
　neovimのAPIでnyaovimなんてのができてたんですねえ
　ちょっと動かしたんで感想

#前提
　os : windows7
　neovimはインストールしてありました
　nodeも既にインストール済みなんで
　<pre>
  npm install -g nyaovim
  </pre>
　一発で、起動まではできました。

#あれれ？
　どうも
　<pre>
 nyaovim ファイル名
 </pre>
　が動いてくれません。
　どうしてなんでしょうねえ・・
　npm install -gなんで
　私の場合nodistを使っているので
　program files\nodist\bin\nyaovimと
　program files\nodist\bin\nyaovim.cmdがインストールされ
　これが起動されるわけで、これは
　<pre>@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe"  "%~dp0\node_modules\nyaovim\bin\cli.js" %*
) ELSE (
  @SETLOCAL
  @SET PATHEXT=%PATHEXT:;.JS;=;%
  node  "%~dp0\node_modules\nyaovim\bin\cli.js" %*
)
</pre>
　こんなことになっていて、動いても良さそうなんだけどなあ？？？

#font-size
 やっぱり、READmeにも書いてあるけど、font-sizeを設定する。
　これは%APPDATA% = AppData\Roming\nyovim\nyaovimrc.html
 の<neovim-editor>ってタグを編集するということです。

#今後
　これで、webインターフェースを使えるということなんで
　いろいろ試そうかなあというとこです
Mochaでのテストファイルのフォルダ構造とnpm設定

# 概要

Node.jsのMochaテストフレームワークのフォルダ構造に関するメモです。
多数のテストファイルを置くときのフォルダ構造について「こうするといい」ってのに、そういえば出会ってないな、と（探し方の問題の可能性）。
で、自分の場合は「こんな感じが良さげ」というメモです。

合わせて、`npm test`で実行する前提で、`package.json` への記述についてもメモ。

一般にはどんなフォルダ構造と実行方法が「良い」とされてるんだろうか？


# テストファイルの置き方

以下のように機能に、testフォルダ配下にフォルダでまとめて配置。

```
\test
   \api1\target1_test.js
        \target2_test.js
   \api2\target3_test.js
        \target4_test.js
   \target999_test.js
```

# package.jsonのtestに関する記述

Mochaの呼び出しで、「サブディレクトリを含めて実行」を指定しておく。

なお、以下はWindows環境で且つ、Mochaをローカルインストールしている場合の例（startは、、、まぁ雰囲気で一緒に載せる）。

```javascript:package.json
  "directories": {
    "test": "test"
  },
  "scripts": {
    "test": "node_modules/.bin/mocha --recursive",
    "start": "node server.js"
  },

```

# 実行方法（小分け実行と、まとめて実行）

`npm test` に続けて「フォルダへの相対パス」を記述する。相対パスの記述にはコマンドラインの補完機能が使える。具体的には「`npm test test\`」まで打って、TABキーを押す。すると、フォルダ候補が補完されるので楽。

具体的な実行例は以下。

```
npm test test\api1
```
で、`target1_test.js` と `target2_test.js` に記述されたテストが実行される。


```
npm test test\api2
```
で、`target3_test.js` と `target4_test.js` に記述されたテストが実行される。

フォルダ指定を省略すると、`test`フォルダ配下すべてを指定したことになる。具体的には、

```
npm test 
```
で、`target1_test.js` ～ `target4_test.js` と、直下の `target999_test.js` に記述されたテストが対象になる。つまり、`test`フォルダ配下のテストすべてを実行される。


以上ー。

# 参考サイト

- https://mochajs.org/#usage
- https://mochajs.org/#the-test-directory

(分割する場合のフォルダー構成について、公式の案内は特に無いのね・・・)
初心者の負荷試験入門1

## はじめに
- Webアプリケーションについて負荷試験が必要になり、初心者ながら負荷試験についての基礎事項を調べてまとめておこうと思います
- この分野に詳しい人の話をぜひ聞いてみたいものです…

## 負荷試験って目的とは
- 負荷試験の目的とは、システムの可用性を高めることだと思います。そしてそれはオンプレミスの場合とクラウドの場合で異なる
    - オンプレミスの場合
        - ユースケースを想定して、システムの応答性能を推測するため
        - 高負荷時のシステム改善を実施するため
        - 目的の性能を提供するために必要なハードウェアをあらかじめ選定するため

    - クラウドの場合
        - ユースケースを想定して、システムの応答性能を推測するため
        - 高負荷時のシステム改善を実施するため
        - 目的の性能を提供するために必要なハードウェアをあらかじめ選定するため
        - システムがスケール性を持つことを確認するため
        - システムのスケール特性を把握するため
            - クラウドではスケーラブルなクラウドデザインパターンを構成するのみでなく、スケール性をもつシステムを担保することが非常に重要である


## 負荷試験の指標
- スループット
    - 単位時間に処理を行う量
        - webシステムでは「1秒間に処理を行うHTTPリクエストの数」を示すことが多く、rps(Request Per Second)と呼ぶ
    - 「ネットワーク上を流れるデータ転送速度」として利用する場合もある
        - ネットワーク帯域と呼ぶ
- レイテンシ
    - 処理時間には2種類が存在する
        - 「ユーザーから見た処理時間」
            - ユーザーがリクエストを送ってレスポンスを受け取るまでの時間
        - 「システムから見た処理時間」
            - Webシステムがリクエストを受け取ってからレスポンスを返すまでの時間
        - 2種類の処理時間には以下のような関係が成り立つ
        - 「ユーザーから見た処理時間」=「システムから見た処理時間」+「データがネットワークを往復する時間」
        - ブラウザを利用する場合は、ブラウザがデータを受け取ってから画面描画が完了するまでをレイテンシと呼ぶ場合もある
        
## システムの性能改善
- スループットの改善
    - 複数のサブシステムによって構成されているWebシステムは、もっともスループットが低いサブシステムによって全体のスループットが制限される
        - もっともスループットが低いサブシステムをボトルネックと呼ぶ
    - ボトルネックを改善したら次のボトルネックを検知して間然するPDCAを繰り返して全体のスループットを向上させる
        - ***ボトルネックは移動するもの***だと理解すること
        - 重要なことは負荷試験は繰り返し実施されること
- レイテンシの改善
    - 待ち時間を含めた各サブシステムの処理時間の総和であるため、「大きな処理時間を要している処理」から順々に改善できる点がないかを検討する
    - 処理時間にとって最大の改善個所はアプリケーションの実装部分であることが多い
        - 非効率なアルゴリズム
        - 無駄なI/O
        - データベースのインデックス不足
    - アプリケーションの実装部分である場合は、プロファイラーを利用して処理の詳細な処理時間を確認することが可能
        - yourkitなど
            - https://www.yourkit.com/
    - 重要な点としてレイテンシは ***「待ち時間を含めた時間」*** であるため、スループットが上限に近づくと必然的に待ち時間も増加するため、裏を返せばスループットが向上すればレイテンシも改善することもありうる

## 今後について
- ひとまず負荷試験を行う上での用語や性能改善については調べられたので、今後は負荷試験に利用するtoolを調べてみることにする

##  関連
[初心者の負荷試験入門2](https://qiita.com/Junichi_M_/items/f96eb17f8db41ebbe641)
MariaDBのAUTO_INCREMENTについて

# はじめに
以下のページのざっくり訳メモです。

[MariaDB Documentation - AUTO_INCREMENT](https://mariadb.com/kb/en/library/auto_increment/)

## Description
* 新規にレコードを追加するときにkeyの値を自動的に増やす仕組み
* defaultは1
* tableは1つだけAUTO_INCREMENTを設定したカラムを持つことができる
    * それはkeyである必要があるが、PRIMARY KEYやUNIQUE KEYである必要はない

## Setting or changing the auto_increment value
* tableにAUTO_INCREMENTを設定する方法は2つ
    * ALTER TABLE
    * insert_idというvalueにset

## InnoDB/XtraDB
* 10.2.3まではauto-increment数はメモリに保管されており、serverを再起動すると数はtable内のもっとも高い値に設定される
* 10.2.4からはこの制約は解除され、AUTO_INCREMENTは永続的になる
* [AUTO_INCREMENT Handling in XtraDB/InnoDB](https://mariadb.com/kb/en/library/auto_increment-handling-in-xtradbinnodb/)も見るとよい
    * 今更ですけどAUTO_INCREMENTってあるPKの次に設定される値で、どんどん大きくなるんですね。ON/OFFではなく。

## Setting explicit values
* AUTO_INCREMENTの値は対象のkeyに存在してはいけない
* 新しい値は現在の最大値より大きくないといけない。
* もし現在の最大値より小さい値が挿入された場合はAUTO_INCREMENTは変化しない

例が分かりやすい。

## Missing values
* AUTO_INCREMENTは欠損することがある
* 行が削除された場合やAUTO_INCREMENTが明示的に更新された場合、古い値は決して使われない
* 結果的に、AUTO_INCREMENTは時系列的に(昇順に)並ぶが、整数列にはならない

## Replication
* galeraによるmalti-master replicationを安全に行うためにはAUTO_INCREMENTはauto_increment_incrementとauto_increment_offsetを使いクラスタ内でユニークな値を生み出す必要がある。
    * [auto_increment_increment](https://mariadb.com/kb/en/library/replication-and-binary-log-server-system-variables/#auto_increment_increment) ... AUTO_INCREMENTの増分(increment)
    * [auto_increment_offset](https://mariadb.com/kb/en/library/replication-and-binary-log-server-system-variables/#auto_increment_offset) ... AUTO_INCREMENTのオフセット

ここがキモ。OFFSETは開始位置で、INCREMENTが増分。multi-musterの場合は以下のように増えていかないといけない。

```
* maria1: 1 -> 4 -> 7 (INCREMENT=3, OFFSET=1)
* maria2: 2 -> 5 -> 8 (INCREMENT=3, OFFSET=2)
* maria3: 3 -> 8 -> 9 (INCREMENT=3, OFFSET=3)
```

## CHECK constraints, DEFAULT values and virtual columns
* MariaDB 10.2.6以降ではauto_incrementカラムは以下の環境下では許可されない
    * [CHECK constraints](https://mariadb.com/kb/en/library/constraint/) .. カラムの制約条件のこと
    * [DEFAULT value expressions](https://mariadb.com/kb/en/library/create-table/#default) ... カラムのデフォルト値のこと
    * [virtual columns](https://mariadb.com/kb/en/library/generated-columns/) ... (計算式を入れたりする?)仮想カラム
* 10.2.4より低いバージョンでは許可されるが、うまく動かない可能性がある。詳細は[MDEV-11117](https://jira.mariadb.org/browse/MDEV-11117)参照

ちょっとここはよくわかんなかったな。

# おわりに
AUTO_INCREMENTの考え方がわかった。次はgaleraによるmulti-master replicationを行うときの動きについて、[wsrep_auto_increment_control](https://mariadb.com/kb/en/library/galera-cluster-system-variables/#wsrep_auto_increment_control)を見ていく。
swift代码

1解决bug
看一个方法被调用的次数，可以右键，点击Find Call Hiererarchy；
不要背代码，要执行代码，看问题出现在哪里，然后去解决；
Command + R 运行，发现问题，然后结局问题；
写代码要测试，看有没有数据再往下写；
打断点多用PO；
2编码习惯
Sql 语句在数据库里查好了，再往代码里写；
增强代码的可读性：在参数后面换行。如： vc.tabBarItem.selectedImage = UIImage(named:
            "tabbar_" + imageName + "_selected")?
            .withRenderingMode(.alwaysOriginal)；
3代码规范
最重要的方法放在上面，页面的东西放在下面不常改；
代码优化
封装类的方法：看见重复额的代码，抽取出来，见参数就写参数；
能用颜色的不用背景图片；
2018年センター試験数学ⅡB 第1問(3)をだいたいsympyを使って解く

```python
#2018年センター試験数学ⅡB 第1問(3)をだいたいsympyを使って解く
#城南予備校 【数学Ⅱ・B】>>ワンポイント解く#https://www.johnan.jp/sokuhou/pdf/18_sugaku2B_3.pdf
from sympy import *
var( 'x,t')
exp=(2*sin(t+pi/ 5))+(-2*cos(t+pi/30))
print("①.",exp)
exp=(2*sin(t+pi/ 5)).subs(t,x-pi/5)+(-2*cos(t+pi/30)).subs(t,x-pi/5).rewrite(sin,cos)-1
print("キ.",exp)
exp=expand(exp,x,trig=True)
print("ク.",exp)
exp = simplify(exp).rewrite(cos,sin)/-2
print("ケ.",exp)
exp = exp.subs(x,t+pi/5)
print("サ.",solve(exp))

#①. 2*sin(t + pi/5) - 2*cos(t + pi/30)
#キ. 2*sin(x) - 2*cos(x - pi/6) - 1
#ク. sin(x) - sqrt(3)*cos(x) - 1
#ケ. sin(x + 2*pi/3) + 1/2            sympyで「三角関数の合成」ができませんでした。     　　　　
#サ. [3*pi/10, 29*pi/30]
```
ケをsin(x - pi/3) - 1/2 にする方法がありますか。よろしくお願いします。
[Eloquent]Union()で重複行があるのでdistinctしたい

### 処理の順番がおかしい可能性がある

#### 現状

```php:UNION_ALLと同じ

$first = DB::table('users')
    ->whereNull('first_name')
    ->get();

$users = DB::table('users')
    ->whereNull('last_name')
    ->get()
    ->union($first);

```
これだと、$firstと$userがそれぞれget()した形がunion()されるのでUNION ALLと同等になる。

#### 改善
```php:UNIONになる
$first = DB::table('users')
    ->whereNull('first_name');

$users = DB::table('users')
    ->whereNull('last_name')
    ->union($first)
    ->get();
```
クエリを持った状態でget()前にunionするため、UNION ALLとならない

#### thanks
[UNION DISTINCT in laravel query builder - Stack Overflow](https://stackoverflow.com/questions/33238199/union-distinct-in-laravel-query-builder)
アクセラレーションブースト？

# CPUの仕組み

年明けに公開されたCPUのバグについて、アクセラレーションブーストなる珍説で原稿料を稼いでる不届き者がいるので、まず、CPUの中がどのような仕組みになっているのかざっくりと説明してみます。（ざっくりなので、実際の挙動と違うことをお許しください）

## ストール
デスクトップやサーバー用のCPUはクロック周波数が数GHｚとなっており内部ではナノ秒単位で動いています。正確にはサブナノ秒で、真空中での光の速度が約30万Km/sなので、1クロックで光が10cmしか進みません。それほどの高速で動いてはいますが、実際にはCPUの外にあるメモリなどのアクセスでは数百クロックを要するため、データが届くまで待たされることになります。これをメモリアクセスによるストールと呼びます。

また、内部で命令を実行しているとき、通常は連続したメモリアドレスから命令を読み込み、解読して内部信号に変換します。この場合にはアドレスが連続しているため、先読みすることでメモリアクセスによって生じるストールを相殺することができますが、条件分岐の場合別のメモリアドレスから命令を読み込むため、このままではストールが発生します。また、変数がメモリ上に割り付けられている場合にも、これをアクセスするためにストールが発生します。

## 投機実行
条件分岐の際に条件をすぐに判定できればいいのですが、通常このような条件文は様々な計算を伴いますので、条件文自体の実行に多少時間がかかります。そこで条件文が成功する場合、失敗する場合をとりあえず両方実行してしまい、条件文の計算が終了したときに、実行している二つのうち条件に合致したほうを採用し、失敗したほうを捨てます。これが投機実行と呼ばれる仕組みです。

## 論理レジスタと物理レジスタ
ここまでの説明で、「投機実行で条件の両方を同時に実行なんてできるの？内部のレジスタを両方で使うと問題にならない？」という疑問がでてきます。例えばx86系のCPUではAX,BX,CXなどというレジスタがあり、コンパイラがこれらのレジスタを使用するように機械語を生成します。投機実行で同時にこれらのレジスタを使うわけにはいきませんが、8086の時代には内部にこれらのレジスタ群がありましたが、現在のCPUでは内部にはより多くのレジスタが組み込まれており、これらのレジスタにコンパイラが生成したレジスタを動的に割り当てています。Skylakeでは整数を扱うレジスタが180個あり、これを便宜的に物理レジスタ（ファイル）、コンパイラが生成した機械語のレジスタを論理レジスタと呼びましょう。

つまり、投機実行で条件文が成功したとき、失敗したときの両方を別々の物理レジスタに割り付ければ、同じ論理レジスタを使う場合でも実際には別の物理レジスタですので問題なく両方を実行できるというわけです。そのうえで条件文の計算が終了した時点で、条件に合致したほうのレジスタをそのまま使い続け、合致しなかったほうの物理レジスタは解放してしまえばよいというわけです。

## 分岐予測
ここまでは”理想的”なCPUの仕組みで説明しましたが、条件分岐の両方を共に実行する場合に”現実的”なCPUでは内部のALUなどの数に限りがあり、両方を同時に実行した場合はこれら有限のリソースの奪い合いが発生し、ストールします。もし、条件文の結果がある程度予測できるとしたら、その予測結果をもとに条件分岐の片方だけを実行し、リソースの奪い合いを回避することができます。

ある程度まで予測した条件分岐のほうを実行し、もしこの条件が間違っていた場合には、前に述べたように分岐の時点で論理レジスタを別の物理レジスタにコピーしておき、この内容を使って処理を切り替えればよいというわけです。

この方法では条件分岐の予測がどの程度正確かが問題となります。私はあるとき二世代のCPUについて分岐予測の精度を測定したことがありますが、一世代前のCPUで85％（かなり前のことなので大体このくらいとしか覚えていません）でしたが、その次の世代のCPUではこの値が一気に95％まで向上しており、驚いた覚えがあります。おそらく、現在のCPUではさらに分岐予測の精度は上がっていると考えられます。ここまで予測精度が上がってくると、条件分岐の片方だけを投機実行しても十分な実行速度が出せるのです。

## 結論

で、アクセラレーションブーストなどというものは、不届き者の妄想の産物なんです。
例のcode penが使えると知ったので使ってみた

[例の記事](https://qiita.com/Qiita/items/edae7417214c8e957f54)で知ったので早速使ってみました。

<p data-height="500" data-theme-id="0" data-slug-hash="wpYxxO" data-default-tab="html,result" data-user="k-shimoji" data-embed-version="2" data-pen-title="wpYxxO" class="codepen">See the Pen <a href="https://codepen.io/k-shimoji/pen/wpYxxO/">wpYxxO</a> by k.shimoji (<a href="https://codepen.io/k-shimoji">@k-shimoji</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>


グラデーションの再現がちょっと例のアレでした。
期待する結果（ブラウザで直接表示した結果）↓

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/107536/9580e4d0-f307-1ad5-09a4-68a37f0ff3c5.png)

# まとめ
これは便利かも！ブラウザでできることが全部表現できてしまうような気がする。よくわかっていないですが。
あと、CSS書いてると楽しい！
めくるカレンダーをつくってみた(swift)

#はじめに
objective-cでつくったはいいけど**使っていない**クラスをswiftに書き換えてgithubにあげてみたので、そのクラスについて紹介したいと思います。自分はまだ使う場面がない（今のところ思いつかない）ので、あわよくばだれかに使ってもらえたらいいなと思います。(第三弾)

[第一弾（時計）](https://qiita.com/am10/items/0222e6966d58062d2eca)

[第二弾（スピードメーター）](https://qiita.com/am10/items/0fe8cffac7dd7659eb2a)

2019/04/21 せっかくなんでswift5.0対応しました

#GitHub
今回はこちらのクラスについて紹介します。

[AMCalendar](https://github.com/adventam10/AMCalendar)

#見た目
![calendar.gif](https://qiita-image-store.s3.amazonaws.com/0/225999/5677b632-86e0-154f-c068-c03d82e2226b.gif)

#機能
日付を選択するためのカレンダー

* 上下にページをめくり月を変更できる（上限なし）
* 文字色など設定できる

#使い方
1. 初期設定をする  
表示したいViewControllerから下記のメソッドを呼ぶ

	```swift
	let calendar =
	AMCalendar.setCalendar(onView: view, parentViewController: self,
                           selectedDate: Date(), delegate: self)
	```
	
	引数
	* `onView` : カレンダーを置くためのView
	* `parentViewController` : 呼び出し元のViewController
	* `selectedDate` : 選択日付（初期表示する日付）
	* `delegate` : デリゲート

2. 初期表示  
上記メソッドの `selectedDate` に日付を設定するとその日付の月が表示される。 
初期選択の日付がnilの場合は当日の月が表示される。  	
選択日付には赤色の塗りつぶしの丸が表示される。  
当日には緑色のくり抜きの丸が表示される。  
<img width="263" alt="calendar_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/225999/fb5848ce-7eda-9af1-21af-f0dd177129dd.png">

3. デリゲートを設定する  
日付を選択すると下記が呼ばれる

	```swift
	func calendar(_ calendar: AMCalendar, didSelectDate date: Date?)
	```

端末のカレンダーの設定などを変更すると下記のような表示になります。
<img width="263" alt="calendar_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/225999/8ac656dc-83b5-02bf-9789-0e7224f12ff1.png">

その他いろいろ設定すると下記のような表示もできます。
<img width="260" alt="calendar" src="https://user-images.githubusercontent.com/34936885/66266249-09786b00-e85d-11e9-896b-7aa53a070642.png">

#つくったきっかけ
UIPageViewControllerを使っていた時に、「これを使えばめくるカレンダーがつくれる！」と思った。すでに日付選択用のクラスはあったが、左右のスワイプで月を変更するものだった。カレンダーならめくって月を変更したいと思いつくった。

#使わなかった理由
1. 既存のクラスがある  
すでに日付選択用のクラスがあり、慣れもあるためコイツに取って代わることはなかった。
2. 動きがわかりにくい  
強いて理由をあげるなら上下のジェスチャで月変更というのが初見のユーザーにはわかりにくいかもしれない。

#さいごに
以上の理由から今のところは使用していませんが、もしかしたら今後使う場面があるかもしれません（もしくは思いつくかもしれない）。めくるカレンダーはおもしろいと思ったが既存のものには勝てなかった。

私はほぼObjective-Cしか使ったことがないペーペーのプログラマーなので記事内容やgithubのコードにおかしなところがあればご指摘いただければ幸いです。

#つくったのまとめ
* [アナログ時計を描画してみた（swift）](https://qiita.com/am10/items/0222e6966d58062d2eca)
* [スピードメーターをつくってみた（swift）](https://qiita.com/am10/items/0fe8cffac7dd7659eb2a)
* [めくるカレンダーをつくってみた(swift)](https://qiita.com/am10/items/2a929ca8196f33cb1d4a)
* [グラフを描画してみた(swift)](https://qiita.com/am10/items/aee964a8a7a9712d66f8#_reference-ca2e5485de5acf8eca97)
* [ちからわざで日本地図を描いてみた(swift)](https://qiita.com/am10/items/26de3242ee33b4bd4aae)
* [カラーピッカーをつくってみた(swift)](https://qiita.com/am10/items/82a4adb2267979841c9e)
* [面積比がそれっぽいベン図を描いてみた(swift)](https://qiita.com/am10/items/858041f70be4d8de5090)
* [UIViewを燃やしてみた（swift）](https://qiita.com/am10/items/f7b32ea5725feeb1469f)

##動作確認用にまとめたプロジェクト
* [Carthageで入れたやつ](https://github.com/adventam10/TestCarthage)
* [CocoaPodsで入れたやつ](https://github.com/adventam10/TestCocoaPods)
スピログラフをPythonで書いてみる

#環境
- [Python 3.6.3 :: Anaconda, Inc.](https://www.anaconda.com/download/)

#できたもの
- [書いたコード_gist](https://gist.github.com/trickre/e5876efa4b3cecba106b93f734c3d54c)

![n25_h50.png](https://qiita-image-store.s3.amazonaws.com/0/26413/91fe0b00-57b3-e8b5-80a0-f8b587f1cddd.png)

![n50_h100.png](https://qiita-image-store.s3.amazonaws.com/0/26413/f074b046-45ac-c8ec-58f2-20ad79935e99.png)

#数式
こちらを参考にしました。
-["正多角形とスピログラフの数式"](http://slpr.sakura.ne.jp/qp/polygon-spirograph/#troc2d)

以下のように実装しました。

``` 計算式実装.py
def get_spirograph(n,h):
    x = []
    y = []
    for idx in range(100000):
        x.append(func_x(t_radian(idx),n,h))
        y.append(func_y(t_radian(idx),n,h))
    return x,y

def func_x(t,n,h):
    ans = 0
    ans = ((n-1)*np.cos(t) + h*np.cos((n-1)*t))/n 
    return ans

def func_y(t,n,h):
    ans = 0
    ans = ((n-1)*np.sin(t) + h*np.sin((n-1)*t))/n 
    return ans
```

#実際にグラフに描かれると面白い
上記の数式がなぜスピログラフを表すことになるのかはさっぱりわかりません。が、子供のころにくるくるやったきれいなグラフが描かれると楽しいです。
プログラミングにおける識別子の表記法まとめ🐫🐍⛓

プログラミングにおける識別子（クラス名、関数名、変数名など）の表記法（○○ケース）には、以下のようなものがあります。

<table>
<tr><th colspan="2">名前</th><th>説明</th><th>例</th></tr>
<tr><th rowspan="2">キャメルケース</th><th>アッパーキャメルケース</th><td>大文字で始めて、<br>各単語の先頭を大文字にする</td><td>UserName</td></tr>
<tr><th>ローワーキャメルケース</th><td>小文字で始めて、<br>各単語の先頭を大文字にする</td><td>userName</td></tr>
<tr><th rowspan="2">スネークケース</th><th>アッパースネークケース</th><td>すべて大文字にして、<br>各単語をアンダースコア（_）でつなぐ</td><td>USER_NAME</td></tr>
<tr><th>ローワースネークケース</th><td>すべて小文字にして、<br>各単語をアンダースコア（_）でつなぐ</td><td>user_name</td></tr>
<tr><th colspan="2">チェインケース（ケバブケース）</th><td>各単語をハイフン（-）でつなぐ</td><td>user-name</td></tr>
</table>

## 使い分け例
以下は、もっとも多くの表記法が混在するであろう、HTML+CSS+JavaScriptにおける使い分けの例です。

```html
<!DOCTYPE html>
<html>
<head>
<style>
body {
  color: #ffffff;
  background-color: #55c500;
}
</style>
</head>

<body>
ようこそ、<span id="user_name" data-prop="user_name"></span>さん

<script>
class MetaElement{
  constructor(element){
    this.element = element;
  }

  static fromId(id){
    return new this(document.getElementById(id));
  }
  
  data(name){
    return this.element.getAttribute(`data-${name}`);
  }

  text(value){
    this.element.textContent = value;
    return this;
  }
}

function fetchConfig(){
  //Mock
  return JSON.parse(
`{
  "user_name": "ムニエル"
}`);
}

const USER_NAME_AREA_ID = 'user_name';

const config = fetchConfig();
const userNameArea = MetaElement.fromId(USER_NAME_AREA_ID);
const userName = config[userNameArea.data('prop')];
userNameArea.text(userName);
</script>
</body>
</html>
```

<p data-height="265" data-theme-id="0" data-slug-hash="qpJyWN" data-default-tab="js,result" data-user="munieru_jp" data-embed-version="2" data-pen-title="qpJyWN" class="codepen">See the Pen <a href="https://codepen.io/munieru_jp/pen/qpJyWN/">qpJyWN</a> by Munieru (<a href="https://codepen.io/munieru_jp">@munieru_jp</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

### キャメルケース🐫
#### アッパーキャメルケース🐫
- JavaScriptのクラス名

#### ローワーキャメルケース🐫
- JavaScriptの関数名
- JavaScriptの変数名

### スネークケース🐍
#### アッパースネークケース🐍
- JavaScriptの定数名

#### ローワースネークケース🐍
- HTMLの属性値
- JSONのプロパティ名

### チェインケース（ケバブケース）⛓
- HTMLのカスタムデータ属性名
- CSSのプロパティ名
Resonance Audio SDKとExoPlayerで再生可能な3rd order Ambisonicsの動画を作成する方法

Googleの[Resonance Audio SDK](https://developers.google.com/resonance-audio/develop/android-studio/getting-started)と[ExoPlayer](https://github.com/google/ExoPlayer)を使うと動画に埋め込まれたアンビソニック音声を再生できます。Resonance Audio SDKは3rd orderまでのアンビソニックのデコードに対応しているので、これを使えばGear VRで3rd order Ambisonicsの360度動画が再生できるぞ！と思ったのでやってみたらいろいろ罠がありました。

## ハマったポイント

* AACは規格上48chまで対応しているが、エンコーダーが8chまでしか対応していない (参考:[AAC encoders](http://wiki.hydrogenaud.io/index.php?title=AAC_encoders))
* Androidは5.1chまでのAACしかサポートしていない (参考: [Supported Media Formats](https://developer.android.com/guide/topics/media/media-formats.html))

上記の理由により、**MP4(音声コーデックAAC)を使用することができません。**

Androidでサポートされているその他の音声コーデックはFLAC, MP3, Opus, Vorbis, PCM(非圧縮)がありますが、[Supported Media Formats](https://developer.android.com/guide/topics/media/media-formats.html)によればFLAC, MP3はステレオまでしかサポートしていません。PCMは非圧縮データでありファイルサイズが大きくなりすぎるのであまり現実的ではありません(1秒間で約1.3MB)。
最終的に残る候補はOpus, Vorbisの二つです。ただしOpusのFFmpegサポートはまだ実験段階らしいので、今回はVorbisを使うことにしました。

Vorbisを音声に使用できるコンテナフォーマットはMKVとWebMがありますが、今回MKVで試してみたらうまくいきました。映像コーデックはH264です。
ちなみにReaperから16ch音声のWebMを書き出そうとしたらうまく行きませんでした。

ただし、なかなか一発でこの形式に書き出せる映像編集ソフトはないと思うので(REAPERではできなかった)、まず映像と音声を別々に書き出した後でFFmpegで結合するという方法をとりました。以下のようにします。

* 16ch音声をVorbisで書き出す。
* ↑の音に合う映像をMP4(H264)で書き出す(音声は付いていても付いていなくても良い)。

上記二つのファイルを用意した後、以下のコマンドで映像と音声を結合します。例として映像ファイルは`video.mp4`、音声ファイルは`audio.ogg`だとします。

```
ffmpeg -i video.mp4 -i audio.ogg -c:v copy -c:a copy -map 0:v:0 -map 1:a:0 output.mkv
```

これで映像+音声(3rd order Ambisonics)のMKVファイル output.mkv ができます！

あとはこれをAndroid端末に入れてExoPlayer + GVR Extensionで再生するだけです。細かいことは省きますが、だいたい以下のようなことをします。

## ExoPlayerとResonance Audioをプロジェクトに追加

```build.gradle
implementation 'com.google.android.exoplayer:exoplayer-core:r2.5.4'
implementation 'com.google.android.exoplayer:extension-gvr:r2.5.4'
implementation 'com.google.vr:sdk-audio:1.101.0'
```

## ExoPlayerのインスタンスを作成

```kotlin
// フィールドに保持
val gvrAudioProcessor = GvrAudioProcessor()

fun createExoPlayer() : SimpleExoPlayer {
  val trackSelector = DefaultTrackSelector()
  val renderersFactory = object : DefaultRenderersFactory(context) {
    override fun buildAudioProcessors(): Array<AudioProcessor> = arrayOf(gvrAudioProcessor)
  }

  return ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector)
}

// 毎フレーム呼び出す
fun update() {
  // w,x,y,z にユーザーのヘッドトラッキングのQuaternionの値を入れる
  gvrAudioProcessor.updateOrientation(w, x, y, z)
}
```
Ergodoxに足を付けて傾斜させる（tenting, tilt対応）

ErgodoxEZではなく、Ergodoxにはtiltが無く、傾斜が欲しい、ということで、以下のブログポストを参考に、足を自作し傾斜を付けました。
https://blog.kksg.net/posts/ergodox

結果的には、以下のような足になりました。
![IMG_0116.png](https://qiita-image-store.s3.amazonaws.com/0/104778/69e1b1bb-b95d-73da-db35-6883daf7a974.png)
不要なキーキャップ外しすぎて気持ち悪いですが…。

足を付けている人は沢山いるようですが、具体的な記事はあまり見かけなかったので、参考として自分の例を晒しておきます。

# 予備知識

* キーボードに傾斜を付ける方法や、足を付ける系のググり方は、「tilt」、「tenting」。
* ErgodoxのStandardCaseのネジ穴は、m3(3m、ということ)。

# 購入商品

## ハイロジック ミニ金具の、L型とフラット型

https://www.monotaro.com/p/5888/8234/?displayId=5
https://www.monotaro.com/p/5888/8453/?displayId=5

まず、m3の穴を持つプレートが見つからないので、これを探すだけで1時間以上かかりました。ホームセンターにいって探したほうが早いかもしれません。

## ネジ一式

https://www.amazon.co.jp/gp/product/B071KFW25K/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1

これは多すぎました。前述したとおり、m3サイズのネジだけあれば良いので、適当に探してみてください。

# 組み立て

あとはネジを外して、L型プレートをはさみ、そこにフラットプレートを繋げるだけです。内側に一つ足を付けるだけで、しっかりと安定したので、作業は簡単です。
プレートを追加する位置を変えれば、好きな傾斜にすることができると思います。
ただし、現状は長さ調整ができないので、一度決めたらこの傾斜一択、となるのが辛い…。

# 結論

足欲しい、、、とか言い出すなら、今ならErgodoxEZを買いましょう！
https://ergodox-ez.com/

私はこれから自作沼に沈んでいく予定です…。
homebrewで入れたsbtのバージョンを確認する方法

`sbt [--]help`とかやっても出てくれなかったのでメモ。

# インストール
```bash
$ brew install sbt@1
```

# 確認
```bash
$ sbt about
[warn] No sbt.version set in project/build.properties, base directory: {CURRENT_DIR}
[info] Set current project to downloads (in build {CURRENT_DIR})
[info] This is sbt 1.1.0
[info] The current project is ProjectRef(uri("{CURRENT_DIR}"), "hoge") 0.1.0-SNAPSHOT
[info] The current project is built against Scala 2.12.4
[info] Available Plugins: sbt.plugins.IvyPlugin, sbt.plugins.JvmPlugin, sbt.plugins.CorePlugin, sbt.plugins.JUnitXmlReportPlugin, sbt.plugins.Giter8TemplatePlugin
[info] sbt, sbt plugins, and build definitions are using Scala 2.12.4
```
Mac で濁点や半濁点が分離する時の対処法


本稿では Mac を利用した際に発生する濁点や半濁点が分離する時の対処法を示す.

# 発生状況

pdf 中の文章をコピーペーストによって, 貼り付けた場合に生じることが多い.
特に論文を執筆中に, 他の論文からコピー&ペーストした後に内容を編集することが多い大学生は注意すべきである.

# 具体例

[![https://gyazo.com/1339aae8733e3bfd8be87c37c8d818e4](https://i.gyazo.com/1339aae8733e3bfd8be87c37c8d818e4.png)](https://gyazo.com/1339aae8733e3bfd8be87c37c8d818e4)
のように濁点半濁点が分離してしまう.

ただし, エディターなどでは下記の用に分離していない風に見える場合がある.

```
プログラミング # 通常の文字列
プログラミング # 濁点 半濁点が分離している文字列
```


# 対処法

https://qiita.com/takuyabe/items/ac13aa99306ad69743e7
に有るように NKF を利用すること対処出来る.
また, Webブラウザ上で利用出来るものもある (http://tsuyobi.heteml.jp/html/tools/nfd2nfc/)


複数ファイルにこの問題が発生している場合やいちいち変換しながら書くのは面倒な場合のためにワンライナーを用意した.
一番最後の`*.tex` は対象ファイルを指定しているので, 適宜書き換え利用する.

```sh
ruby -rnkf -i -pe '$_  =  NKF.nkf(" -w --ic=UTF8-MAC", $_)' *.tex 
```
Bash on WindowsでPyTorchを使えるようにする。

メインでWindowsを使っているのですがUbuntuでPyTorchを使う必要が出てきたので、Bash on WindowsにPyTorchをインストールしてみた。(２０１８年１月現在)PyTorchは0.3が最新のバージョンですが普段は0.2を使っているのでここからー＞(http://pytorch.org/previous-versions/) 古いのを自分の環境に合わせてインストールする。
python3.5を使っているので、ターミナル上で次のコマンドを実行する。

```
pip install http://download.pytorch.org/whl/cu80/torch-0.2.0.post3-cp35-cp35m-manylinux1_x86_64.whl
```

```:結果
$ pip install http://download.pytorch.org/whl/cu80/torch-0.2.0.post3-cp35-cp35m-manylinux1_x86_64.whl
Collecting torch==0.2.0.post3 from http://download.pytorch.org/whl/cu80/torch-0.2.0.post3-cp35-cp35m-manylinux1_x86_64.whl
  Downloading http://download.pytorch.org/whl/cu80/torch-0.2.0.post3-cp35-cp35m-manylinux1_x86_64.whl (486.7MB)
    100% |████████████████████████████████| 486.7MB 6.4MB/s
Collecting pyyaml (from torch==0.2.0.post3)
  Downloading PyYAML-3.12.tar.gz (253kB)
    100% |████████████████████████████████| 256kB 2.3MB/s
Requirement already satisfied: numpy in /home/user/.pyenv/versions/3.5.1/lib/python3.5/site-packages (from torch==0.2.0.post3)
Installing collected packages: pyyaml, torch
  Running setup.py install for pyyaml ... done
Successfully installed pyyaml-3.12 torch-0.2.0.post3
```

これでBash on WindowsでもPyTorchが使えると思ったら、

```
$ python mnist.py
RuntimeError: module compiled against API version 0xb but this version of numpy is 0xa
Traceback (most recent call last):
  File "mnist.py", line 5, in <module>
    import torch
  File "/home/user/.pyenv/versions/3.5.1/lib/python3.5/site-packages/torch/__init__.py", line 53, in <module>
    from torch._C import *
ImportError: numpy.core.multiarray failed to import
```
エラーがでた＼(^o^)／
自分の環境の場合、以下のコマンドで解決しました。

```
$ pip install -U numpy
```
これでPyTorchが使えるようになりました。
wercker CLIを使ってwercker.ymlをローカルで実行する

wercker.ymlを作成するときは、CLIでローカル実行して確認すると楽。

# インストール（Linuxの場合）

予めDockerをインストールして起動しておく。

[公式](http://www.wercker.com/cli/install/linux)に書いてある通り、下記コマンドでインストール（rootで実行）：

```
curl -L https://s3.amazonaws.com/downloads.wercker.com/cli/stable/linux_amd64/wercker -o /usr/local/bin/wercker

chmod u+x /usr/local/bin/wercker
```

動作確認：

```
wercker help
```

ログイン：

```
wercker login
（werckerのユーザー名とパスワードの入力を求められる）
```

# 実行

カレントディレクトリのwercker.yml内の`build`パイプラインを実行：

```
wercker --verbose build
```

カレントディレクトリのwercker.yml内の`dev`パイプラインを実行：

```
wercker --verbose dev
```

`build`はホストのディレクトリをコンテナにコピーするのに対し、`dev`は直接コンテナ内にマウントするらしい。つまり、`dev`だと実行中にファイル作成・書き換えした場合、実行後もホストのファイルに残る。

# 環境変数

ローカルの環境変数で`X_`で始まるものがコンテナ内にエクスポートされる。
つまり

```
export X_HOGE=123
```

としておくと`HOGE=123`がエクスポートされる。

# 参考

[Usage](http://devcenter.wercker.com/docs/cli/usage)
[Developing with the CLI](http://devcenter.wercker.com/docs/cli/usage/developing)
[Building Apps Locally with the CLI](
http://devcenter.wercker.com/docs/cli/usage/building)
プログラム超初心者メモ  　配列（ [ ] のアレイについて ）

[]のアレイについて

＜ []のアレイの特徴　＞
　・要素数の増減には向いていない。が、処理が速いらしい。
　・固定のデータ以外は要素数だけつくっておいて、後から中身を更新するほうが使いやすいかも・・・

以下テストコード丸ごと
※ Unity Mac VScode 利用でのテスト用
　てきとうなゲームオブジェクトにこのコードを貼り付けてインスペクタで
　ループモードを変えれば、プリント内容が変わります。

```csharp

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ArrayOfInitial : MonoBehaviour {

//配列系の確認 ＜　[]のアレイ　＞ とりあえず宣言と初期値設定まとめ

//＜　宣言時のもろもろな書き方　＞
    //------------------------------------------------------
    //　①　多分基本形はこれだけど、要素数と要素を合わせるのが面倒でメリットが薄そう
    public int[] Num3 = new int[5] { 0, 1, 2, 3, 4 };
    //------------------------------------------------------
    //　②　とりあえず変数宣言のみのスタイル
    //　　　Start() などの実行時か、UnityEditorのインスペクタで値を入れないと中身を作れない
    //     結局これでいい気がするけど・・・
    //     これ以外は、Unityの場合は初期値を変数宣言時に行うと、メタファイルに情報が残るからか？
    //　　　あとから宣言時の値をスクリプトで管理しにくいのが不便に感じる...
    public int[] Num;
    //------------------------------------------------------
    //　③　要素数だけ決めて中身は後からのスタイル
    //　　　インスタンスを入れたり、座標の合成代入先など...
    public int[] Num1 = new int[3];    
    //------------------------------------------------------
    //　④　いきなり要素を作るスタイル 
    //　　　要素を書いたら要素数が決まる！　要素数は省略できる！
    public int[] Num2a =new int[] { 0, 1, 2, 3 };

    //　　　new int[] も省略可能...だが変数宣言時のみ下記のスタイルが許容されている
    public int[] Num2b = { 0, 1, 2, 3 };
    //     中途半端な省略はエラーになる
    //　　　public int[] Num2c =new int { 0, 1, 2, 3 };
    //------------------------------------------------------
    //  ※　その他のエラーパターン
    //　・ 因みに 下のように最後に（）をつけてはいけない！ 
    //　　 上のどのパターンでも()は付けたらダメ！　Listと勘違いしないように！っと
    //　　 public int[] i_NumXX4 = new int[5] { 0, 1, 2, 3, 4 }();

    //　・ 当然、配列の枠と要素数とが合っていない場合はエラー。
    //　　 public int[] i_Num4 = new int[5] { 0,1, 2, 3, 4,5,6 }; 
    //------------------------------------------------------

    
//＜　関数内での書き方　＞
    //------------------------------------------------------
　 　int[] NumX;
    void Example0()
    { 
        //　　new int[] 省略形　はアウト！
        //　　下記はやっぱりコンパイルエラーになる。
        //  　NumX2 = {9,8,7}; 
        //　　▼　これならOK
        NumX = new int[]{9,8,7}; 

   　　　//    new int[] 省略形は、 このように変数の要素をさきに作っても...
        　int[] num2b=new int[4];
        //　　下記の行はコンパイルエラーがでて許容されない。
        // num1b = { 0, 1, 2, 3 };

        //　　変数宣言時ならローカル変数でも問題ない...わかりにくい！ ("=";)
        //　　多分つまり...この書き方は変数宣言時にしか使えない。
        int[] numX = {9,8,7};
    }   
    //-----------------------------------------------------
    
//＜　Start()内での確認　＞
    //------------------------------------------------------
    //　　変数を宣言し、Start()　内部で要素数を決める。
    //　　この書式は汎用性があり使いやすい。
    //　　結果的に行が増えるが、Unityでは変数宣言時に要素数を決めないほうが使いやすいのでは？？
    //　　要素もプールとして使うなら、 for などのループ処理で生成するほうが使いやすいのでは？
    public int[] NumInStart;
    void Start () {
       　 NumInStart= new int[5];
    //------------------------------------------------------ 　 
    }               
}
```
LineのMessaging APIとAWS(API GatewayとLambda)を使っておうむ返しbotを作って見た

初めてのQiita投稿

LineのMessaging APIを使ってやりたいことがあるから
その検証用で作って見た。

#使ったもの
- Messaging API
- AWS Lambda
- API Gateway

Messaging APIの使い方とかは色々と情報ある
[Messaging APIでできることのまとめ - おーがの日記](https://hatenablog-parts.com/embed?url=http://syogo0417.hatenablog.com/entry/2017/08/23/130004)

あとは公式にもしっかりと書いてある
[Messaging APIを利用するには](https://developers.line.me/ja/docs/messaging-api/getting-started/)
のでここら辺を参考に

#そんなこんなでざっくりやりたいこと

 1. Lineで某友達に文字列を投稿する
 1. その文字列をAPI GateWayで受け取る
 1. 文字列をLambda(文字列受け取り)で受け取る
 1. 別のlambda(他のシステムへ橋渡し)をlambda(文字列受け取り)から起動する
 1. lambda(文字列受け取り)は他のシステムと連携して処理をする
 1. lambda(文字列受け取り)はlineに応答する（今回はおうむ返し）  
 
![blog.Linebot.png](https://qiita-image-store.s3.amazonaws.com/0/231875/9c355e9e-13cd-908c-3769-82dd5a176d16.png)

今回、lambdaを二つに分けたのは機能別でlambdaを分けたかったから
lambdaの連携はStep FunctionやAPI GateWayをさらに噛ませる方法もあるが
今回は簡易的に実装するためにinvokeで連携した。

そんなこんなで以下実現したコード


```javascript:bot.js
// load modules
var http = require("http");
var aws = require('aws-sdk');

exports.handler = (event, context, callback) => {
    console.log(event.body);
    var data = JSON.parse(event.body);
    var replyToken = data.events[0].replyToken;
    var text = data.events[0].message.text;
    var opts = {};


//linebot返却オプション
    var data = JSON.stringify({
       replyToken: replyToken,
       messages: [{type: "text", text: text}]
    });
    opts = {
        hostname: 'api.line.me',
        path: '/v2/bot/message/reply',
        method: 'POST',
        headers: {
            "Content-type": "application/json; charset=UTF-8",
            'Content-Length': Buffer.byteLength(data),
            "Authorization": "Bearer {Channel Access Token}" // LINE Developersの「Channel Access Token」を使用
        },
        json: data,
    };


//Linebotに返却
    var req = https.request(opts, function(res) {
        res.on('data', function(res) {
            console.log('SUCESS'+res.toString());
        }).on('error', function(e) {
            console.log('ERROR: ' + e.stack);
        });
    });
    req.write(data);
    req.end();
    
//外部呼び出し
    var lambda = new aws.Lambda({apiVersion: '2014-11-11'});
    var params = {
        FunctionName: "lamda name",
        InvokeArgs: JSON.stringify({
            "messages": [
                {
                "type": "text",
                "text": text
                }
            ]
        }
            , null, ' ')
        };

    lambda.invokeAsync(params, function(err, data){
        if(err) context.done(err, err.stack);
        else context.done(null, '');
    })
}
```

Lineのwebhook先にAPI Gatewayのendpointを設定したがこれはよくて
Lineはちゃんとしたサーバ証明書によるSSLでしか受け付けない
さらにちゃんと200 OKも返さないといけない（当然だが）
ただ遊ぶだけにサーバ証明書取るのはなんだかなぁ・・・
レスポンスもめんどくさいなぁ・・・というものぐさなわさしは
API GateWayのまともなSSLをしてレスポンスもよきに返してくれるので非常に楽だった。

ということで備忘録てきな初投稿
Node.jsで画像をダウンロードして保存する（axios利用）


axiosを使うとPOSTリクエストなどでデータの送信をする場面が多いですが、今回は画像のダウンロードをしてみます。

今日、[ジーズアカデミー](https://gsacademy.tokyo/)で授業して来ましたが、調べるとSOFのページ([Download an image using Axios and convert it to base64](https://stackoverflow.com/questions/41846669/download-an-image-using-axios-and-convert-it-to-base64))などが出てきてあまり記事が無いのでメモです。

千石電商さんのページから[Nefry BT](http://sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-55W8)の画像をDLして保存してみます。

```bash
$ npm i --save axios
```

```app.js
'use strcit';

const axios = require('axios');
const BASE_URL = `http://sengoku.co.jp/item/images/th230/nefry_BT_.jpg`;
const fs = require('fs');

const main = async () => {
	const res = await axios.get(BASE_URL, {responseType: 'arraybuffer'});
    fs.writeFileSync(`./nefry.jpg`, new Buffer.from(res.data), 'binary');
    console.log(`done`);
};

main();
```

これで保存できます。
2017年に読み終えた書籍

2017年はあまり本を読まなかった1年でした。読み終えた本は合計21冊。うち技術書が5冊、語学学習書が5冊と、どちらかと言えば語学学習に力を入れた1年でした。

## 技術書: 5冊

| No | 著者 | タイトル |
|---:|---|---|
| 1 | Bruce Tate他 | [Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages](https://www.amazon.co.jp/exec/obidos/ASIN/B00AYQNR46/x7edimv35x-22/)（Kindle版） |
| 2 | キャメロン デビッドソン=ピロン | [Pythonで体験するベイズ推論 PyMCによるMCMC入門](https://www.amazon.co.jp/exec/obidos/ASIN/4627077912/x7edimv35x-22/) |
| 3 | Allen B. Downey | [Think Bayes ―プログラマのためのベイズ統計入門](https://www.amazon.co.jp/exec/obidos/ASIN/4873116945/x7edimv35x-22/) |
| 4 | 結城 浩 | [暗号技術入門 第3版](https://www.amazon.co.jp/exec/obidos/ASIN/4797382228/x7edimv35x-22/) |
| 5 | 上田 勲 | [プリンシプル オブ プログラミング3年目までに身につけたい一生役立つ101の原理原則](https://www.amazon.co.jp/exec/obidos/ASIN/4798046140/x7edimv35x-22/) |

## 語学学習書: 5冊

| No | 著者 | タイトル |
|---:|---|---|
| 1 | James M. Vardaman | [毎日の英文法 頭の中に「英語のパターン」をつくる](https://www.amazon.co.jp/exec/obidos/ASIN/4023310999/x7edimv35x-22/) |
| 2 | 鈴木 陽一  | [DUO 3.0](https://www.amazon.co.jp/exec/obidos/ASIN/4900790052/x7edimv35x-22/) |
| 3 | 中山 | [試験に出ない英単語 普及版](https://www.amazon.co.jp/exec/obidos/ASIN/4864103038/x7edimv35x-22/) |
| 4 | サマー・レイン | [ネイティブに笑われないクールイングリッシュ ―日本人の9割はダサい英語を話している](https://www.amazon.co.jp/exec/obidos/ASIN/B01M3SHL9V/x7edimv35x-22/)（Kindle版） |
| 5 | ジェームス・M・バーダマン | [3つの基本ルール＋αで英語の冠詞はここまで簡単になる](https://www.amazon.co.jp/exec/obidos/ASIN/B00W4LIN7U/x7edimv35x-22/)（Kindle版） |

## 実用書: 6冊

| No | 著者 | タイトル |
|---:|---|---|
| 1 | 山崎 元 他 | [難しいことはわかりませんが、お金の増やし方を教えてください!](https://www.amazon.co.jp/exec/obidos/ASIN/4866510420/x7edimv35x-22/) |
| 2 | 滝澤 ななみ | [スッキリわかる 日商簿記2級 工業簿記 第6版](https://www.amazon.co.jp/exec/obidos/ASIN/4813268889/x7edimv35x-22/) |
| 3 | TAC簿記検定講座 | [合格テキスト 日商簿記2級 商業簿記 Ver.10.0](https://www.amazon.co.jp/exec/obidos/ASIN/4813264700/x7edimv35x-22/) |
| 4 | TAC簿記検定講座 | [合格テキスト 日商簿記2級 工業簿記 Ver.8.0](https://www.amazon.co.jp/exec/obidos/ASIN/4813261582/x7edimv35x-22/) |
| 5 | 井庭 崇 他 | [プレゼンテーション・パターン: 創造を誘発する表現のヒント ](https://www.amazon.co.jp/exec/obidos/ASIN/4766419898/x7edimv35x-22/) |
| 6 | 森 拓郎 | [運動指導者が断言! ダイエットは運動1割、食事9割 決定版](https://www.amazon.co.jp/exec/obidos/ASIN/B00LVU59CC/x7edimv35x-22/)（Kindle版） |

## 小説: 1冊

| No | 著者 | タイトル |
|---:|---|---|
| 1 | 村上 春樹 | [騎士団長殺し 第1部 顕れるイデア編](https://www.amazon.co.jp/exec/obidos/ASIN/410353432X/x7edimv35x-22/) |

## コミック: 4冊

| No | 著者 | タイトル |
|---:|---|---|
| 1 | 中村 光 | [荒川アンダー ザ ブリッジ 9巻](https://www.amazon.co.jp/exec/obidos/ASIN/4757526865/x7edimv35x-22/) |
| 2 | 中村 光 | [荒川アンダー ザ ブリッジ 10巻](https://www.amazon.co.jp/exec/obidos/ASIN/4757528582/x7edimv35x-22/) |
| 3 | 中村 光 | [荒川アンダー ザ ブリッジ 11巻](https://www.amazon.co.jp/exec/obidos/ASIN/4757530374/x7edimv35x-22/) |
| 4 | 吉田 貴司 | [やれたかも委員会 1巻](https://www.amazon.co.jp/exec/obidos/ASIN/4575312738/x7edimv35x-22/) |
wercker + RailsでPostGISを使う

Dockerイメージ [mdillon/postgis](https://hub.docker.com/r/mdillon/postgis/) をserviceとして使う。


```yaml
box: ruby

services:
    # このnameをpostgresにしておかないとコンテナ間のリンクができない
    - name: postgres
        id: mdillon/postgis
        env:
            POSTGRES_PASSWORD: $POSTGRES_PASSWORD
            POSTGRES_USER: $POSTGRES_USER

build:
    steps:
        - bundle-install
        - rails-database-yml:
            service: postgresql-docker
        - script:
            name: rspec
            code: bundle exec rspec
```
matplotlibで無色のヒストグラムを描く

### histgramの棒の色を白にしたら見えなくなってしまう問題

```
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.hist([data1, data2], color=['white', '#a4a4a4'])
```

### 解決策
```
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.hist([data1, data2], color=['white', '#a4a4a4'], edgecolor='black')
```