OmniAICreator/Qiita-1.07M huggingface dataset:
GPU マイニングをはじめて 1 年経ったので振り返る(2018 年 4 月 20 日)

GPU マイニングをはじめて 1 年が経ちましたので振り返ってみます.

<img width="804" alt="Screen Shot 2018-04-20 at 15.30.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/36275/41048ebd-9f2d-fffb-a0b2-742d00dbfb44.png">


イーサリアムを GPU マイニングしてみる(2017/04/21 時点)
https://qiita.com/syoyo/items/b577d594f55679513d19

> 2017/04/21 時点では, 29 MH/s で 1 hour で 0.00176 ETH, 1 日で 0.04233 ETH.

2018 年 4 月 20 日時点では, 29 MH/s で 0.00403 ETH/day 程度と 1/10 の収益となりますが, ETH 自体の価格が 10 倍くらいになっています(1 ETH 60,000 円ほど). 昨年度に採掘した ETH を HODL していたとすると, 実質 2500 円/day の信用創造があったことになりますね.
(ただしちょうど 5 月くらいから仮想通貨の価格上昇 & マイニングブームがおとづれたので, ~2017/04 の間にもっとマイニングしておくべきでしたね...)   

Ice age は到来しませんでした(difficulty の上昇やリセットはあったが, まったくマイニングで収益が出ない状態にはならなった. また, Caspter(PoS)は 2018 年 4 月時点では来ず)

* 2017 年初夏(5 ~ 7 月) : 熱暴走したりマイナープログラムがうまく動かないなどで苦戦. 
* 2017 年夏(8 ~ 9 月) : Powerlimit で HW 的には安定し始めるが, マイナープログラム, pool の接続や GPU driver 周りで不安定はたまに起きる.
* 2017 年秋 : マイナープログラムと, NVIDIA 系は概ね安定期. AMD はドライバ周りがまだまだ. Linux であれば 1 ヶ月ほど連続稼働
* 2018 年冬 : 暖房としてつかえる. 2 ヶ月ほど連続稼働もできるようになり概ね手がかからない子に成長してくれる. AMD もマザーによっては安定稼働を確認(e.g. x299 マザー)

特に, NVIDIA Pascal 水冷 + Ubuntu の rig では, Ubuntu のアップデートを適用するとき以外はまったく手のかからない子になりまして, ほんとうによい.

## 故障について

この一年, 10 ~ 20 枚ほどマイニングで動かしていますが, 幸いなことに, 今の所新品で買った GPU や PC パーツが故障したことはありませんでした(中古で買った GPU は壊れてしまったのが一つありました). 

ただしこれは確率の問題でもあり, 最近は GPU の値段も上がっており ROI も長め(6 ~ 12 ヶ月くらい)ですので, 値は張っても長期保証のある新品の GPU を調達するのが良いでしょう.

## 故障や火災について

幸いのところ今のところ火災になったりなにか焼けたりということはありませんでした. しかしこれについては常に注意していく必要があります. 定期的に清掃しホコリをとったり, コネクタを確認ですかね. 理想はやはり液浸にして不可燃にするでしょうか.

夏場は冷房をつけず, 室温が 40 度になるときもありましたが, そこで GPU の故障というのもありませんでした(今までなかっただけなので, GPU の寿命としては縮まっている可能性はあります).

高温環境で計算機を動かすというのは以前よく行われていたようです.

温水で冷却する砂漠のデータセンター：米イーベイ
https://wired.jp/2012/03/07/ebay-desert-data-center/

とはいえ, GPU 温度は 80 度を越えるとと熱暴走しやすいので(and マザーもあまり高温になると落ちる)注意です. なるべく 70 度台になるように powerlimit しましょう. 夏場は可能であれば GPU は水冷, マザーや電源も高温耐性の高いものをチョイスするとよいでしょう.

少なくとも, X99 マザーはエラッタもありますし, 高温耐性も高くないので選ばないほうがよいです.

X99 マザー + Linux + NV GPU 複数枚刺しで常時運用してはいけない
https://qiita.com/syoyo/items/596355e6f285181038cb

今ですとマイニング用に長期稼働耐性のあるものか, x399, x299 あたりがよさそうかと思います.
中古のサーバ向けマザーボードもおすすめかもしれません.

## 今後の予定

この一年で採掘量も減りつつありますが, 少なくともあと 2, 3 年は GPU マイニングはなくならそう & リアルタイムレイトレーシングも主流になりつつあり GPU を本来のグラフィックス用途で酷使する機会も増えていくので, EVGA の GPU や, TITAN V のように 3 年保証のあるハイエンド GPU を調達し, 3 年稼働にチャレンジしたいところです.


## 今後の課題

GPU を 3~5 年の漢の無金利ローンで調達し, キャッシュフローをよくする財務スキームを確立したい.

レイトレーシング/機械学習のプログラムと, マイニングのプログラムの自動切り替えをしたい(レイトレーシング/機械学習のタスクが走っていないときはマイニングが走るなど)

電気代や電力はやはり課題の一つであるので, 太陽光+蓄電池, 水力, 風力でマイニングをするスキームをしたい. 特に長野あたりの水利権と土地を手に入れ, 水力発電やりたい.

採掘した仮想通貨で資産運用や dapp を極めてくれる優秀なブロックチェーン若人を探す旅に出たい.

GPU の利用状況をブロックチェーンで管理し, 仮想通貨でレンタルしたりするスキームを確立したい.

Vectordash https://vectordash.com/ のように GPU リソースを機械学習タスクに貸し出すサービスで GPU 調達費用をまかなうスキームを確立したい.

液浸 GPU 冷却にチャレンジしたい.
いろんなタイムアウトを一行で説明する

# タイムアウト三兄弟

Apache の HttpAsyncClient にはざっと３つのタイムアウトがある。下に行けば行くほど一般的な用途（なはず）

## ConnectionRequestTimeout
ConnectionManager がフルの際、何ミリ秒リクエストを待機させるのか？

## ConnectTimeout
client から server に接続要求を行って、ACK が帰ってくるまでの時間で何ミリ秒待つのか？

## SocketTimeout
ソケット通信のスタートから終了まで、何ミリ秒経ったら強制的に終了するか？
kotlin はじめました (1) プロジェクト作成〜TextViewを変更

自分はJavaでAndroid開発するのもちょっと自信ない感じなので、きままに勉強のために書いていこうと思います。もし間違ってるところなどあればご指摘いただけると嬉しいですmm

## 環境

android studio 3.0.1
kotlin 

## まずはプロジェクト作成

kotというプロジェクトを作って include Kotlin supportにチェックをいれて、Empty Activityを作った。

## まずは起動してみる

あたりまえだけど、

```xml:actity_main.xml
<TextView
  android:text="Hello World!"
...
```

とかいてあるので、Hello World!と書かれた画面が出てきた。

![0.1f6y1d3wtjd.png](https://qiita-image-store.s3.amazonaws.com/0/68684/dcdf9c5c-e7d3-20d4-b8ca-9a0c6e3de89a.png)



## Hello Worldのテキストを動的に変えてみる

まずはIDを追加。main_text_viewというidにしてみた。

```xml:actity_main.xml
<TextView
   android:id="@+id/main_text_view"
        ...
```

`Kotlin Android Extensions` という便利機能が標準ではいってるらしいので、Javaの時のように `findViewById` を使わなくてもアクセスできる模様。

```kotlin:MainActivity.kt
import kotlinx.android.synthetic.main.activity_main.* // 追加

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        main_text_view.text = "hoge" // 追加
    }
```
これで再度実行すると、ちゃんと表示される文字が hoge に変わった。便利！

![0.0tzt2w2yun0j.png](https://qiita-image-store.s3.amazonaws.com/0/68684/1501dfb8-6815-4e8a-80e0-985f5c0cd48e.png)
Ruby on RailsのMVCの基本概念をおさえる



# Ruby on RailsのMVCについて

Ruby on Railsでアプリ開発する上で重要となるMVCの概念について簡単にまとめました。


# MVCとは？

MVCは「Model（モデル）」「View（ビュー）」「Controller（コントローラ）」の略です。



### MVCのアーキテクチャ



![gainen_400.png](https://qiita-image-store.s3.amazonaws.com/0/245663/b14580a7-e87c-c00f-de2c-d5fd758e1f25.png)


※「routes.rb」上のパスを通してユーザーから受けたリクエストに基づきコントローラーが各セクションへ指示を出す。（ユーザーがアクセスできるページは「config/routes.rb」に記述されている。）


### Model（モデル）の役割

モデルでは**データの管理**がメイン業務になります。

コントローラーから受けた指示に従って必要なデータをデータベース（DB）から取り出してコントローラーへ情報を返します。

また、コントローラーからの命令に基づいて情報をデータベースに入力したり、特定の情報を別の情報に書き換えたりすることもあります。



### Controller（コントローラー）の役割

コントローラーは、名前の通り**「司令塔」**的な役割を果たします。

コントローラーからモデルに対してデータの取り扱いについて指示を出したり、ビュー（View)へデザインやUIについての指示を出します。

コントローラーは「MVC」の中において中枢的な役割を果たし、モデルとビューはコントローラーの手足のように機能するというイメージになります。


基本的にコントローラーは、ユーザーから受けたリクエストに基づいて各セクションへ命令を下します。


ただ、ユーザーへの情報の出力・提示に関しては、直接的にはビューが担当しています。

ですので、見かけ上ではビューがユーザーとの直接窓口であるかのようなニュアンスで解説しているサイトも散見されるようです。

ですが厳密には、**MVCの概念上**においては、ユーザーからのリクエストをコントローラーが受け取り、その後、コントローラーがモデルやビューに対して必要な指令を出している、と捉えるのが一般的といわれています。


### View（ビュー）の役割について

ビューには、**デザイン**や**ユーザーインターフェース**を司る役割があります。


コントローラーから渡されたデータを利用してWebサイト上でどのように表現するのかビューで定義しています。


アプリやWebサイトをユーザーが操作したときに、操作した内容に応じて入力フォームを正しく表示させたり、必要な機能を展開させるといった役割もビューが担っています。


# MVCを常に意識する必要性


アプリ・Web制作ではたくさんのファイルを扱ったり細かい編集作業を大量に実行することになります。

コマンドでアプリ実装を開始すると、「app」というディレクトリの直下に大量のフォルダとファイルが展開されます。



![app_yousu.png](https://qiita-image-store.s3.amazonaws.com/0/245663/f1e99508-f785-ff2f-fca3-e51fd1608431.png)



「controllers」「models」「views」以外の他にも、アプリを構成するために必要なフォルダ・ファイルがたくさん展開されているのが分かります。


アプリの開発規模が大きければ大きいほど、扱うフォルダやファイル数も増えていきます。


ですので、規模の大きいアプリを開発をする場合、今どの役割を持ったファイルを編集しているのか注意する（MVCの構造を意識する）必要があります。
DataBindingのxml内でsealed classを利用する

``` kotlin
 class HogeViewModel {
 	val status = ObservableField<Status>(Status.Init)
 	
 	sealed class Status {
 		object Init: Status()
 		object Loading: Status()
 		object Success: Status()
 		object Error: Status()
 	}
 }
```

``` xml
 <import type="HogeViewModel.Status" />
 <data>
  <variable
    name="viewModel"
    type="HogeViewModel" />
 </data>
 ...
 <TextView
   android:text="@{viewModel.status instanceof Status.Loading ? @string/loading : @string/hoge"
   />
```

`instanceof` で比較を行うことで評価が出来る。間違っても `==` は使っちゃダメゼッタイ
[備忘録]nginxのドキュメントルート

### nginxのドキュメントルート
nginxのドキュメントルートはここです。
root /usr/share/nginx/html

### nginxのドキュメントルート変更する方法
設定ファイル書き換える。
root /etc/nginx/confファイルにある、以下の記述を変更したらok

```:root/etc/nginx/confファイル
location / {
  root /usr/share/nginx/html
}
```
Mac OS X 10.10.5(Yosemite)にUSB - UART ブリッジ VCP ドライバをインストール

スタートガイド通りやってもできなかった。いろいろ調べたら解決したのでメモ。

Silabからドライバをダウンロード
https://jp.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers#mac

<img width="1024" alt="スクリーンショット 2018-04-20 14.40.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/126461/9af81d3f-503b-db6f-4069-e9f32110f663.png">

解凍してdmgをマウントしたらLegacy MacVCP Driverフォルダの内のSillicon Labs VCP Driver.pkgを実行。

<img width="773" alt="スクリーンショット 2018-04-20 14.42.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/126461/4e1a3da5-5dd4-4486-479f-e3cb379558c8.png">

これでinstallは成功するけど、ドライバは認識されていない（Arduinoのポート選択に出てこない）



調べたらこれが出てきた。

https://www.silabs.com/community/interface/forum.topic.html/cp210x_usb_to_uartb-73qX

 >With the new strict restrictions on Yosemite, Apple requires driver signature with drivers placed into /Library/Extensions, which is their preferred location moving forwards.  I updated the driver installer to be smart enough to install the correct version (64 vs 32 bit) based on the OS.

Appleの拡張ドライバの扱いが違うみたいで、codesignコマンドを打って、リロードする必要があるみたい。

```code
#Verify code signature
codesign -vvvvd /Library/Extensions/SiLabsUSBDriver.kext

#Verify ownership = root:wheel and permissions = rwxr-xr-x and loadable
kextutil -tn /Library/Extensions/SiLabsUSBDriver.kext

#unload the driver
sudo kextunload SiLabsUSBDriver.kext

#Reload the driver
sudo kextload -v 6 SiLabsUSBDriver.kext
```
これで/dev/cu.SLAB_USBtoUARTが選択できるようになって、M5Stackに書き込みもできるようになった。

<img width="698" alt="スクリーンショット 2018-04-20 15.03.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/126461/2c634412-6eee-468a-23da-958a675d55dd.png">


蛇足
ググってすぐ出てくるこのフォーラムは過去のpkg(SiLabsUSBDriverYos.kextが置かれる)に対しての対処方法なので、コマンドは通らない（そんなファイルないので）
https://www.silabs.com/community/interface/forum.topic.html/os_x_10_10_cp210xvc-2k97
[復習]javaでファイルの読み込み書き込み(JDK6)

#目的
java.nio.file.Filesを使ってみる前に復習(最近やってなかったので・・・)。

#ソース


```java:FileInputOutput.java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class FileInputOutput {

	/**
	 * ファイルの読み込み書込みサンプル。<br>
	 * ファイルを読み込んで別ファイルに書き込みする。<br>
	 * 入力ファイルはSJIS。<br>
	 * 出力ファイルはUTF-8(BOM付)
	 *
	 * @param args
	 */
	public static void main(String args[]) throws Exception {

		BufferedReader br = null;
		BufferedWriter bw = null;

		try {
			// ファイル読み込み
			//
			File inFile = new File("D:/", "input.csv");
			br = new BufferedReader(new InputStreamReader(new FileInputStream(
					inFile), "SJIS"));

			// ファイル出力用ストリーム
			File outFile = new File("D:/", "output.csv");
			FileOutputStream os = new FileOutputStream(outFile);

			// BOMを付与。
			os.write(0xef);
			os.write(0xbb);
			os.write(0xbf);

			// BufferedWriterの生成
			bw = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));

			String str;

			// ファイルに書き込み
			while ((str = br.readLine()) != null) {
				bw.write(str + "\n");
			}

			// ファイル削除(コメントアウト外すと読込ファイル削除できるよ)
			// inFile.delete();
			br.close();
			bw.close();
		} finally {
			if (br != null) {
				br.close();
			}
			if (bw != null) {
				bw.close();
			}
		}
	}
}
```
#入力ファイル
![input.JPG](https://qiita-image-store.s3.amazonaws.com/0/200087/decdfa50-d4df-b22d-59d2-95cc7b2b0855.jpeg)

#出力ファイル
![output.JPG](https://qiita-image-store.s3.amazonaws.com/0/200087/e57b1f7b-87e4-b636-a021-83e3c99b3c66.jpeg)

ちゃんと入力ファイルの内容がUTF-8(BOM付)で出力できました。
WSL(Windows Subsystem for Linux)でelectron開発をやろうとは思うな！

一人で勝手にドはまりしていたので同じ人が減るように書き残しておきます、、、

###結論
素直にWindows版のNode.jsをインストールしてelectronを動かしましょう。パッケージングもちゃんと動きます。

###格闘の経緯
最初はちゃんとコマンドメモってましたが、途中から省略してます、、。

・純正のnpmをインストールする
> sudo apt-get install nodejs npm

・nをインストール
> sudo npm install -g n

・nodeのltsをインストール
> sudo n lts

・npmの最新化
> sudo npm install -g npm

・もとのnodejsを消す
> sudo apt-get purge nodejs npm
> sudo apt-get autoremove

・Node.js のバージョンを確認
> node -v

・npmバージョン確認
> npm -v

・Xwindowを立ち上げられるようにする(20分)
http://estuarine.jp/2017/11/wsl-x-window/
具体的にはVcXsrvというXサーバーのインストールと設定

・/mnt/c 以下のちょうどいいディレクトリに作業フォルダを作る

・electronをローカルインストール

・実行、しようとするとlibgtk2.0-0から始まりパッケージがもろもろ無いと言われ続けるので耐えながらインストールを続ける(30分)

・何とか動くようになる
Hello worldは何とか起動。

・パッケージしようとして elecron-packager でWindows版のパッケージを作ろうとするとwineが必要と言われる、、

・WSLでwineのパッケージを入れられない！(60分)
↑パッと原因分からなかったのでここで止めました。

###ぼやき
これ要は、せっかくのマルチプラットフォーム開発なのに
・仮想マシン(WSL)上で違うOSを動かし
・仮想マシンからの画面をXserverで無理やり受け取り
・さらにその環境でビルドしようとしてWindowsに戻すためにエミュレータを動かす
みたいな本末転倒を一周してますね、、。今日はストロングゼロを飲もう。
intersect of array-containing arrays

#objective
to propagate how great built-in functions are

## baseline
```php
$arr1 = ["a", "b"];
$arr2 = ["a", "c"];
var_export(array_intersect($arr1, $arr2));
//array (
//  0 => 'a',
//)
```
> Note: Two elements are considered equal if and only if (string) $elem1 === (string) $elem2. In words: when the string representation is the same.
> -- <cite>[array_intersect/note](http://php.net/manual/en/function.array-intersect.php#refsect1-function.array-intersect-notes)</cite>

so what if the parameters were arrays of array(and so on)?

```php
$arr3 = [["a"], ["b"]];
$arr4 = [["a"], ["c"]];
var_export(array_intersect($arr1, $arr2));
// this causes "PHP Notice:  Array to string conversion"
// and echoes
// array (
//   0 => 
//   array (
//     0 => 'a',
//   ),
//   1 => 
//   array (
//     0 => 'b',
//   ),
// )
// because (string)["a"] or (string)["b"] or (string)["c"] should be "Array"
```

## solution

use array_uintersect;

```php
var_export(array_uintersect($arr3, $arr4, function($a, $b) { if ($a == $b) return 0; else return -1;}));
//array (
//  0 => 'a',
//)
```

and read document.
致命的な警告が生成され、リモート エンドポイントに送信されました。これにより、接続が終了される可能性があります。TLS プロトコルで定義されているこの致命的な警告のコードは 10 です。Windows SChannel エラーの状態は 1203 です。

Schannel　36888　エラー

致命的な警告が生成され、リモート エンドポイントに送信されました。これにより、接続が終了される可能性があります。TLS プロトコルで定義されているこの致命的な警告のコードは 10 です。Windows SChannel エラーの状態は 1203 です。

に関して調査してみるっ


https://social.technet.microsoft.com/Forums/ja-JP/366a3ed7-cf03-45a7-811d-4fd33a923bd6/3687436888?forum=winserver8
　サーバーに対して、利用出来ない暗号方式（この場合はTLS1.0）でのアクセスがあったことが記録されているだけですので、クライアント側から接続出来ている（他の暗号方式でリトライして接続出来ている）ならば、気にする必要はないたぐいのログになります。

カナ？？？
同じファイルのgzipのmd5が異なる件

# はじめに

弊社のETLシステムを差し替えることになった際に、旧システムでETL処理した `old.tsv.gz` ファイルと新システムでETL処理した`new.tsv.gz` ファイルが同じ内容になっているか確認する必要が生じました。（もちろんETL前は同じファイルです。）

しかし、md5sumを取ってみると、二つのファイルのハッシュ値が異なり、原因を調査したのでまとめます。

## 現象

```bash
$ ls -la old.tsv.gz new.tsv.gz
-rw-rw-r-- 1 user 425983  4月 20 14:36 old.tsv.gz
-rw-rw-r-- 1 user 425983  4月 20 14:36 new.tsv.gz
```
ファイルサイズが同じなので、内容も同じだという気分になってきます。
しかし、md5sumを計算してみると下記のように結果が異なります。

```bash
$ md5sum old.tsv.gz new.tsv.gz
0a4d0421dbaafc3e1c2f535ff8dfa7da  old.tsv.gz
6453d46698d5e237b7ae7d8686819171  new.tsv.gz
```

中身はきっと同じはず、、、、、
伸長（解答）したファイルの中身が一致していることを確認してみましょう。

```bash
$ gzip -d -c old.tsv.gz|md5sum
89257d0ba2167c69a7bc054ff68b4f48
$ gzip -d -c new.tsv.gz|md5sum
89257d0ba2167c69a7bc054ff68b4f48
```


## 原因

gzipコマンドのマニュアルを読んでみると下記のオプションの存在に気づきます。

> -n --no-name
デフォルトでは、圧縮時に元ファイルの名前とタイムスタンプを保存させない。 (元の名前を切り詰める必要がある場合は、元の名前は必ず保存される。) 伸長時に、元のファイル名が存在しても復元せず (圧縮ファイル名から gzip 拡張子を取り除くだけとし)、 元ファイルのタイムスタンプが存在しても復元しない (圧縮ファイルからコピーする)。 **このオプションは伸長時のデフォルトである。**
-N --name
 **圧縮時に元ファイルの名前とタイムスタンプを保存する。 これがデフォルトである。** 伸長時に元ファイルの名前とタイムスタンプが存在するなら復元する。 このオプションは、ファイル名の長さに制限があるシステムや、 ファイル転送の後にタイムスタンプが失われた場合に役立つ。

https://linuxjm.osdn.jp/html/GNU_gzip/man1/gzip.1.html

デフォルトのgzipコマンドで圧縮する際には、元ファイルの名前とタイムスタンプを保存します。
開発していた旧システムと新システムでは、保存されるタイミングが異なるため、タイムスタンプが異なっていたようです。




## 対策

用途によっては、元のファイルの名前、タイムスタンプを保存するのは不便だと感じます。
その際には、

```bash
gzip -n [file name]
```
としましょう。

また、pythonでgzipを作るときには、

```python
with open('out.gz', 'wb') as f, gzip.GzipFile(filename='', mode='wb', fileobj=f, mtime=0.) as gz:
    gz.write(str.encode('sample content'))
```
とすると良いでしょう。

## 参考

https://docs.python.jp/3/library/gzip.html#gzip.GzipFile
多重unwrap

`a: A??` を要領よくアンラップしたい

```swift
let a: A??

if let z = a ?? nil {}
```

---

元ネタ：

> @cocoaphony let w: UIWindow? = app.delgate?.window?? nil
> That is my approach for double optionals in 1.2. (trailing ? works in 1.1.)

https://twitter.com/jl_hfl/status/573880245578776577

### 解説

シンタックスシュガー `?` や `??` があるとわかりにくいので外す
それぞれの定義は以下

```swift
// ? (Optional)
// https://github.com/apple/swift/blob/7ed7354003406c8e4a708195b86c1950b2c1f381/stdlib/public/core/Optional.swift#L122-L133
enum Optional<T> {
  case none
  case some(t: T)
}

// ?? (Nil-Coalescing Operator)
// https://github.com/apple/swift/blob/7ed7354003406c8e4a708195b86c1950b2c1f381/stdlib/public/core/Optional.swift#L655-L663
public func ?? <T>(optional: T?, defaultValue: @autoclosure () throws -> T)
    rethrows -> T {
  switch optional {
  case .some(let value):
    return value
  case .none:
    return try defaultValue()
  }
}
```

処理の中身を見ていく

```swift
// 以下の二行は同義
let a: A??
let a: Optional<Optional<A>>

// この文を分解していく 
if let z = a ?? nil {}  

// ?? と if-let に分離
let b = a ?? nil  // ①
if let z = b {}     // ②

// ①から見ていく
// a は Optional<Optional<A>> であるので、?? (Nil-Coalescing Operator) のジェネリック型 T は Optional がひとつ外れた Optional<A> である
// ということは右辺の nil は Optional<A>.none であることがわかる
// つまり b は Optional<A> である
let b: Optional<A> = a ?? nil

// あとは②に入れるだけ
if let b = z {}  // z: A?
```
深度カメラIntel Realsense D415をMacで動かす際の細かい設定

Realsenseという安価で高性能な深度カメラがIntelから販売されており、
D435は売り切れということで、D415を購入しました。

https://qiita.com/OTL/items/ce49410580730d6dd499
https://github.com/IntelRealSense/librealsense/blob/master/doc/installation_osx.md

こちらの記事を参考に設定させていただきましたが、
ちょっとしたつまずきがありましたのでシェアします。

#基本的なコマンド
```sh

brew install libusb pkg-config
brew install homebrew/versions/glfw3
brew install cmake
git clone https://github.com/IntelRealSense/librealsense
cd librealsense
mkdir build && cd build
cmake .. -DBUILD_EXAMPLES=true -DBUILD_WITH_OPENMP=false -DHWM_OVER_XU=false -G Xcode
open librealsense2.xcodeproj

```

#エラーが出てうまく動作しない時
上記のコマンドで下記のようなエラーが出てしまう場合

```shell-session

XXX:build Username$ cmake .. -DBUILD_EXAMPLES=true -DBUILD_WITH_OPENMP=false -DHWM_OVER_XU=false -G Xcode
-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
CMake Error at CMakeLists.txt:4 (project):
  No CMAKE_C_COMPILER could be found.



CMake Error at CMakeLists.txt:4 (project):
  No CMAKE_CXX_COMPILER could be found.



-- Configuring incomplete, errors occurred!
See also "/Users/Username/librealsense/build/CMakeFiles/CMakeOutput.log".
See also "/Users/Username/librealsense/build/CMakeFiles/CMakeError.log".

```

##以下の処理をする

1.　Xcodeがダウンロードされているか？
されていなければ最新版でかまわないのでダウンロードの上、インストール。

2.　コマンドラインツールがうまく動作していない可能性があるため検証
以下を入力してみる。

```sh
sudo xcode-select -s /Applications/Xcode.app
$xcode-select --switch /Applications/Xcode.app
```
すると、きちんとコマンドラインからXcodeを動かすことができるようになる。
そこで基本的なコマンドに記載されている通りbuildフォルダ内で、再度以下のコマンドを入力する。一応ルートから行くと以下の通り。

```sh
cd
cd librealsense
cd build #一回試してbuildフォルダは出来ているはずなのでmkdirはしない
cmake .. -DBUILD_EXAMPLES=true -DBUILD_WITH_OPENMP=false -DHWM_OVER_XU=false -G Xcode
open librealsense2.xcodeproj
```

#Xcodeが自動的に立ち上がった後の処理
左上にrealsense-viewerとなっていればOK、なっていなければ選択。
その後「▲」で立ち上げると自動的にRealSense Viewerが起動する。

![スクリーンショット 2018-04-20 14.40.42.png](https://qiita-image-store.s3.amazonaws.com/0/95511/46fc93c5-a97c-14a7-7c36-4abc4c12d14f.png)

#2018/4/20追記　RealSense Viewerが落ちる
一件落着かと思いきや、カメラをつなげるとエラーを吐いております。
目下、対応中でございます。ご助言頂けましたら大変助かります。

![スクリーンショット 2018-04-20 15.47.46.png](https://qiita-image-store.s3.amazonaws.com/0/95511/5722892a-c957-4132-1fcc-658f7f684ca3.png)
brewでインストールしたmysqlが勝手に再起動するのを直す

### 現象
brewでインストールしたmysqlが`mysql.server stop`してもpidを変えて再起動してくる．

```sh
❯ mysql.server status
 SUCCESS! MySQL running (28216)

❯ mysql.server stop
Shutting down MySQL
.. SUCCESS!

❯ mysql.server status
 SUCCESS! MySQL running (28667)
```

### 原因
macには`launchctl`という仕組みがあり，plist定義を作っておくと，自動でデーモンを起動してくれる．これにmysqlが定義されていた．

```
❯ launchctl list | grep mysql
30154   0       homebrew.mxcl.mysql
```

### 対処
以下のコマンドでlaunchctlの管理から除外できる．

```sh
❯ brew services stop mysql
Stopping `mysql`... (might take a while)
==> Successfully stopped `mysql` (label: homebrew.mxcl.mysql)
```
※再度登録は`brew services start サービス名`とすると良い
PIXI.jsでテキストの折り返しを行う

PIXI.jsは他のフレームワークに比べてテキストの設定が比較的充実しているが、オプションが多い為にわかりずらい。

http://pixijs.download/dev/docs/PIXI.TextStyle.html

テキストの折り返しを行うには以下の3つのプロパティを設定する必要がある

* wordWrap
  単語の折り返しを行うかどうか、これがtrueになっていないと以下の2つのオプションは動作しない

* wordWrapWidth 
  折り返しをする際のwidth(幅)を設定する。但し、単語の折り返しである為、単語がもの凄く長かったとした場合は折り返しされない。

* breakWords = true;
  単語が長かったとしても折り返すオプション

```js
var style = {
  font:'12pt Arial',
  fill:'white',
  wordWrap:true,
  wordWrapWidth:100,
  breakWords: true
};
  var t  = new PIXI.Text('', style);
  t.wordWrap = true;
  t.wordWrapWidth = 100;
  t.breakWords = true;
```
Ethereum: Solidity v0.4.23〜 の新しいコンストラクタの書き方

[Solidity v0.4.23](https://github.com/ethereum/solidity/releases/tag/v0.4.23)から、コンストラクタの書き方が新しくなりました。
それに伴い以前の記法は非推奨(deprecated)となります。

# 旧
```javascript
pragma solidity 0.4.23;

contract Foo {
  function Foo() public {
    // ...
  }
}
```



# 新
```javascript
pragma solidity 0.4.23;

contract Foo {
  constructor() public {
    // ...
  }
}
```

# 備考
v0.4.23以降では、旧コンストラクタ記法を使用すると以下のような警告が出ます。

```bash
Warning: Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
```

最終的には新しい記法へ統一する予定のようですので、今後は新規法に統一したほうが良さそうです。
ROS関連メモ

# ROS関連メモ

ROSは巨大なので，ちょいちょい情報を見失ったり，フォーラムで言及されているだけだったりすることがあるので，ここに困ったときのメモを残します．
適宜困ったことがある度に追記します．

# ROSのお約束

## ROSで使う単位系

http://www.ros.org/reps/rep-0103.html

# catkin_make

## 指定したパッケージだけビルド

```
catkin_make --pkg パッケージ名
```
ディレクトリ名じゃなくてパッケージ名なので注意．

## ビルドに使うスレッド数の設定

```
catkin_make -j1
```

catkin_makeに```-j```オプションを渡すと，makeにまで浸透する．
通常では，勝手にCPU数と同じだけのスレッド数が指定されるので，同時ビルドになりメモリ使用量が多くなりがち．

## 最適化オプション

```
catkin_make -DCMAKE_CXX_FLAGS=-O0
```

# rosparam

## rosrunのオプション
rosrunするときにオプションで配列のパラメータを渡すときの挙動がcppとpythonで違うらしい．

[https://answers.ros.org/question/58838/how-to-assign-array-to-a-parameter-with-rosrun/](https://answers.ros.org/question/58838/how-to-assign-array-to-a-parameter-with-rosrun/)

cppだとダメみたい．
自分の環境でもだめだった．

# topic

## publish の latch 機能

時々，「一度だけTopicをpublishできればいい」ということがあるのですが，そういう時はpublisherを定義するときにadvertiseのlatchをtrueにする．
latch引数はデフォルト引数でfalseになってるので，普通の使い方になれていると存在を忘れがち．

これをfalseのままにしておくと，publishしたtopicが読めないことが多い．
trueにすると，最後にpublishしたtopicを保持(latch)してくれるので，publishしたあとに別のノードを起動して，subscriveし始めてもtopicを読むことができる．

参考 : [http://docs.ros.org/jade/api/roscpp/html/classros_1_1NodeHandle.html#a6b655c04f32c4c967d49799ff9312ac6](http://docs.ros.org/jade/api/roscpp/html/classros_1_1NodeHandle.html#a6b655c04f32c4c967d49799ff9312ac6)

# gazebo

## kinetic でコンパイルが通らなくなった

apt upgrade したらコンパイルが通らなくなった．
どうやらprotocolbufferのバージョン不整合らしい．
これを解決するためには，protocolbufferのバージョンを下げるか，gazeboをソースからコンパイルするかどちらかになるので，今回は前者を選んでみた．
方法は[gazebo Answers](http://answers.gazebosim.org/question/18096/this-file-was-generated-by-an-older-version-of-protoc/)に書かれている一番したの投稿と基本的には同じで，ただもともとインストールされているものは削除しないでやってみても多分大丈夫．
Python > UDP > UDP送信して応答を受ける > netcatとsubprocess使用

```txt:動作環境
CentOS 6.9 (64bit)
Python 3.4.5
```

### 処理概要

- UDP送信する
- UDP応答を受信する
- socketを使わない
    - 深い意味があるわけではない
- 受信タイムアウト: 1秒

### code v0.1

```udp_send_recv_180420.py
import subprocess as sb

'''
v0.1 Apr. 20, 2018
  - add send_recv()
'''

# on CentOS 6.9 (Final)
# on Python 3.4.5


def send_recv(ipadr, udpport, msg):
    acmd = 'echo "%s" | nc -u %s %s -w 1' % (msg, ipadr, udpport)
    return sb.getoutput(acmd)

IPADR = "192.168.0.7"
UDPPORT = 7000

for loop in range(3):
    res = send_recv(IPADR, UDPPORT, msg="TEST2")
    print(res)

```

### 相手側

IPアドレス: 192.168.0.7

受信内容を返信するエコーサーバーを動かしておく。

- [Visual Studio | WPF > UDP > echo server > v0.1, v0.2](https://qiita.com/7of9/items/dc3cb128bcc2766cdf78)
- その他実装色々 [link](https://qiita.com/search?utf8=%E2%9C%93&sort=created&q=user%3A7of9+title%3Aecho+server)

### 結果

```shell-session
$ python3 udp_send_recv_180420.py 
TEST2
TEST2
TEST2
```

### nc -w 

https://explainshell.com/explain?cmd=nc+-w

### 制限事項

nc(netcat)によるタイムアウトは秒単位での指定。ミリ秒単位ではできない。


### 関連

- [linux > udpで "TEST2" を送信する > echo "TEST2" | nc -u 192.168.10.6 6000](https://qiita.com/7of9/items/fc97f966ac51b8a15d66)
- [RPi2 / python > UDP送信](https://qiita.com/7of9/items/da02a0f6826db8b04ddb)
- [linux / udp > 受信文字列を表示したい > tcpdump -A -n udp portrange 6000](https://qiita.com/7of9/items/cea9e874a14c854c3190)
- [linux > 5秒ごとにUDPで文字列を送信するbashスクリプト (不完全版)](https://qiita.com/7of9/items/1cf64a125784db309100)
秋葉原でパーツを調達する際のLessons Learned

# 秋葉原でパーツを調達する際のLessons Learned を書きます。

## リュックサックはNG
パーツ屋は通路がせまい。路面店であっても、ビルの中にある店舗であっても。
リュックサックを背負ってると邪魔だし、うっかり商品に引っ掛けてしまうかもしれない。
また、回路図や部品表、それらが掲載されている雑誌など何度も参照することになるため、ショルダーバッグの方が便利である。

## イメージトレーニングをすること
幸いなことに、パーツ屋の多くは通販を行っている。よってWebサイトを見れば、どの店で何が売っているかがわかる。
また、Webサイトに載っていないものは、本当に在庫がないと考えたほうがいい。
部品表を見ながら、どの店で何を買うのかリストアップするとともに、購入するシーンをイメージトレーニングしておこう。

## 互換パーツもあるぞ
自作本などの部品表に載っているパーツが、どの店のサイトでも売られていないとする。しかし大抵の場合、互換パーツがある。これは、メーカー違いだったり、バージョンアップされていたりで、オリジナルのパーツと同じように使えるらしい。
「ＮＪＭ４５５８Ｄ　互換」などとgoogleで検索すると沢山でてくる。

## 一度で買おうと思うな
恐らく何らかのお買い物リストを作成し、秋葉原に臨む方が多いと思うが、どんなに準備しても漏れがある。これは我々の仕事と同じ、どんなに準備してもテストがパーフェクトなんてことはない。
なので、ランチをはさんでトライするとか、別の日に回す、通販で補充するということを考えた方がいいし、予めそのように計画することをお勧めする。

## がんばろうな
IoTという概念、すっかりビジネス用語として定着しているし、キャリア形成上も有利になるっぽい。
ArduinoやRapsberry PIといったアイテムを用いて自作してみると、理解が深まるので、ソフトウエアエンジニアにとっても非常に有益である。また、そういうことやっってみる人のほうが信用できるのは間違いない。
Get Wild等トライして頂きたい。
riot.js 子tagの独立性を上げる。

### riotは親子関係を把握することが出来るが、互いのモジュールを知らないほうが独立性が上がり、並行してモジュール開発が出来る。

### 自分自身にトリガーを引いて(change)、第三者モジュールが変更を検知して参加者全員に知らせる。(changed)
自分自身は参加者は知らないし、誰がchangedしたのかも知らない。ただ、変更されたデータストアが投げられる。

```js
riot.tag('ed','<div ref="code" contenteditable="plaintext-only" oninput="{input}"></div>',function(opts){
 let self=this,code=null;
 self.on('mount',()=>{code=self.refs.code})
 self.on('changed',(d)=>{ if(code.textContent!=d.ed) code.textContent=d.ed })
 self.input=()=>{ self.trigger('change',{ed:code.textContent}) }
})
```

### 第三者は最近ではデータストアそのものであることが多い。
```js
var sys=new function(){
 riot.observable(this); 
 let self=this,cs=[],share=()=>{ cs.filter(d=>d).map(d=>d.trigger('changed',self.store))}
 //cs.filter mean fall the child.
 ,init =(d)=>{d.on('change',(o)=>{ Object.assign(self.store,o); share() })} 
 self.store={}
 self.on('join',(me)=>{ cs.push(me); init(me); share(); })
}/*usage: sys.trigger('join',me)*/
;
```

### システムに自分自身を知らせる。これによりchange changedをデータストアが管理できる。
```js
sys.trigger('join',riot.mount('res',{})[0])
```
### 全部
edとresはお互いを知らないがデータ変更されたことは第三者から通知される。

```html
<script src="//gnjo.github.io/riot.js"></script>
<div><ed></ed></div>
<div><res></res></div>
<style> div{border-bottom:1px solid}</style>
```
```js
var sys=new function(){
 riot.observable(this); 
 let self=this,cs=[],share=()=>{ cs.filter(d=>d).map(d=>d.trigger('changed',self.store))}
 //cs.filter mean fall the child.
 ,init =(d)=>{d.on('change',(o)=>{ Object.assign(self.store,o); share() })} 
 self.store={}
 self.on('join',(me)=>{ cs.push(me); init(me); share(); })
}/*usage: sys.trigger('join',me)*/
;
riot.tag('ed','<div ref="code" contenteditable="plaintext-only" oninput="{input}"></div>',function(opts){
 let self=this,code=null;
 self.on('mount',()=>{code=self.refs.code})
 self.on('changed',(d)=>{ if(code.textContent!=d.ed) code.textContent=d.ed })
 self.input=()=>{ self.trigger('change',{ed:code.textContent}) }
})
sys.trigger('join',riot.mount('ed',{})[0])
;
riot.tag('res','<label>{result}</label>',function(opts){
 let self=this;
 self.result=0;
 self.on('changed',(d)=>{ if(d.ed) self.result = d.ed.length||0; self.update(); })
})
sys.trigger('join',riot.mount('res',{})[0])
;
```
RubyフレームワークのRamazeを使ってみる

# Ramazeについて

RubyのフレームワークではRoRやSinatraが有名だが今回はRamazeというフレームワークを使ってみました。

http://ramaze.net
https://github.com/Ramaze/ramaze

# 特徴
Rubyの文法を忠実に使用しているという感じ。

# Ramazeのインストール方法
公式にある下記のコマンドでインストール

```
$ gem install ramaze
$ ramaze create アプリ名
```

# Ramazeの起動

```
$ cd アプリ名
$ rake ramaze:start
```

すると `localhost:7000` でアクセスできるようになります。

Welcome画面
<img width="565" alt="スクリーンショット 2018-04-20 10.17.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/201127/bf154468-38f1-444f-ea2e-8283339eedf4.png">

# Ramazeのディレクトリ

<img width="191" alt="スクリーンショット 2018-04-20 13.40.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/201127/dfa8d8d5-3c8a-8463-eebc-f5a3f43bc7a6.png">


# アプリの画面を作る
試しにcontrollerの直下に `ramaze.rb` というファイルを作成します。

```ruby:ramaze.rb
require 'ramaze'

class MyController < Ramaze::Controller
  map '/'

  def index
    return "Hello, Ramaze!"
  end
end

Ramaze.start

```

mapにルーティングを指定します。
今回はルートパスですね。

この状態で `ruby ramaze.rb` をターミナルから実行します。

`localhost:7000` にアクセスすると Hello, Ramaze! が表示されます。


# わからないこと
・ページ数を増やしたいときにcontrollerにファイルを増やさないといけないのか。
・各ファイルの記述の意味がわからない。
iOS定期購読課金のレシートに追加された「pending_renewal_info」をみてみる

以前書いた [iOS定期購読課金 ステータスが追加された件](https://qiita.com/natty420/items/ccb569a07a0da9b739c2)の保留中の課金状態についての詳細です。
定期購読時のレシートにフィールド「pending_renewal_info」が追加され、保留中の定期購読状態が取得できます。

https://developer.apple.com/jp/documentation/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html

## 保留中の定期購読状態とは

保留中の定期購読状態とは将来予定されている定期購読(現在購読中で今後も更新されるかもしれない、また以前購読していて自動更新もOFFに)や、何らかの理由で過去に失敗した定期購読のことです。

- 現在購読中、今後も更新されるかもしれない購読
- 過去に購読していたが現在は期限も切れており自動更新もOFFにしている状態だが、今後自動更新をONにされるかもしれない購読
- 定期購読の自動更新はONになっているがなんらかの理由で決済ができない状態で期限切れの購読
    - なんらかの理由は以下がありそうです
        - iThunsカードチャージが足りていない
        - クレジット決済ができなかった
        - キャリア決済の上限に達した

## pending_renewal_info

| キー | 説明| 値 |
|:-----------|:-----------|:--------------------------------|
| auto_renew_product_id  |The current renewal preference for the auto-renewable subscription.<br>|プロダクトIDではあるが、購入状態の優先されるプロダクトIDとなります。※1|
| product_id  |購入したアイテムのプロダクトID|現在購読中もしくは期限切れの場合は最後に購読していたプロダクトID|
| original_transaction_id  |Appleアカウントで一意となる購入ID|latest_receiptのフィールド内の値と同じです|
| auto_renew_status  |自動更新型購読について現在の更新ステータス|“1” - 現購読期間の最終日に更新される。つまり自動更新はONになっている。<br>“0” - 顧客が購読の自動更新をオフにした。次は更新されない。|
| expiration_intent  |購読期限切れの理由<br><font color="red">※期限切れの場合のみ</font>|“1” - 顧客が購読をキャンセルした<br>“2” - 課金エラー; 顧客の支払い情報が有効でなくなったなど<br>“3” - 顧客が値上げに同意しなかった<br>“4” - 更新の時点でプロダクトが購入できる状態でなかった<br>“5” - 原因不明のエラー。
| is_in_billing_retry_period  |期限切れになった購読についてAppleがなお自動更新を試みているか否か<br><font color="red">※期限切れの場合のみ</font>|“1” - App Storeは購読更新を試みている<br>“0” - App Storeは購読更新の試みをしていない|


### ※1 auto_renew_product_idとproduct_id

product_idはlatest_receipt_infoの最後のレシート(最後に購入したもの)のプロダクトIDとなり、現在購読中もしくは期限がきれたものとなる。
auto_renew_product_idは現在のアカウントがなにを購入しているかの予約までも考慮したプロダクトIDとなります。
[アップグレード/ダウングレード](https://qiita.com/natty420/items/b7cc167406813e9a3c00)や[クロスグレード](https://qiita.com/natty420/items/5979bee604271d03f8dc)を使った場合、次の更新で別のプロダクトIDに切り替わる場合に切り替わる予定のプロダクトIDがこのフィールドに設定されます。

#### 例

 ① あるアプリにはプロダクトA(月額)とB(年額)があります。同グループ同レベルに設定することによりクロスグレードとなります。(クロスグレードについては[iOS定期購読課金 クロスグレード](https://qiita.com/natty420/items/5979bee604271d03f8dc)を参照)
 ② ユーザはAを購入します。このときpending_renewal_infoは以下のようになります。

```json
"pending_renewal_info":[
  {
    "auto_renew_product_id":"product_a", 
    "original_transaction_id":"XXXXXXXXXXXXXXXX", 
    "product_id":"product_a", 
    "auto_renew_status":"1"
  }
]
```
 ③ 有効期限内にBに乗り換えます。(クロスグレード)この時点ではまだAの有効期限内なのでレシート情報は更新されていない。このときのpending_renewal_infoは以下のようになります。

```json
"pending_renewal_info":[
  {
    "auto_renew_product_id":"product_b", 
    "original_transaction_id":"XXXXXXXXXXXXXXXX", 
    "product_id":"product_a", 
    "auto_renew_status":"1"
  }
]
```
 ④ Aの有効期限日になり、Bに切り替わりました。この時点でレシートが更新され、Aは有効期限切れ、Bが有効期限内となります。このときのpending_renewal_infoは以下のようになります。

```json
"pending_renewal_info":[
  {
    "auto_renew_product_id":"product_b", 
    "original_transaction_id":"XXXXXXXXXXXXXXXX", 
    "product_id":"product_b", 
    "auto_renew_status":"1"
  }
]
```

## つかえる場面

今までわからなかったことがわかるようになるのでいろいろ使えそうですね！

:metal: ユーザが自動更新をONにしているかOFFにしているかがわかるのでユーザ動向がわかる
:metal: クロスグレードしたかどうかがわからなかったがレシートからわかるようになった
:metal: 有効期限切れの理由がわかるので、iTunesチャージ切れの場合などはアプリでお知らせするなどで促進できる
Gitbucket-docker を Raspberry Pi3で動かす

Github 互換のソフトウェアである [gitbucket](https://github.com/gitbucket/gitbucket)をラズパイ上のdockerで動かしてみます。実は Dockerfileを書こうとしたら、作者の takezoeさんが [gitbucket-docker](https://github.com/takezoe/gitbucket-docker)を作成していました。そこで、gitbucketのリリースを最新版にして docker-compose用のファイルを作成するだけで動かすことができています。

参考： [Raspberry Pi用docker-composeの構築](https://qiita.com/tkyonezu/items/ceaaf41924df39254058)

## 1.　Dockerファイルの作成
元々の[github-docker](https://github.com/takezoe/gitbucket-docker.git)の Base Image をラズパイ用にして、[Gitbucketのリリース](https://github.com/gitbucket/gitbucket/releases)を最新版の[4.23.1](https://github.com/gitbucket/gitbucket/releases/tag/4.23.1)にしているだけです。

```
FROM arm32v7/openjdk:10-jre

ADD https://github.com/gitbucket/gitbucket/releases/download/4.23.1/gitbucket.war /opt/gitbucket.war

RUN ln -s /gitbucket /root/.gitbucket

VOLUME /gitbucket

# Port for web page
EXPOSE 8080

# Port for SSH access to git repogitory (Optional)
EXPOSE 29418

CMD [ "java", "-jar", "/opt/gitbucket.war"]
```

## 2. gitbucket-dockerのビルド

以下のようにしてビルドしておきます。

```
docker build -t arm32v7/gitbucket .
```

## 3. docker-compose.yml の作成

例えば、こんな感じになります。

```
version: '3.1'

services:

  gitbucket:
    image: arm32v7/gitbucket
    restart: always
    ports:
      - 8080:8080
      - 29418:29418
    volumes:
      - /mnt/gitbucket/data:/gitbucket
```

ここでは、ラズパイに HDD を /mnt としてマウントしている想定です。

## 4. gitbucket の起動

docker-compose で起動します。

```
docker-compose up -d
```

## 5. ブラウザからのアクセス

ポート番号 8080 を指定していますので、ブラウザから `http://<ホスト名>:8080/` のようにしてアクセスします。初回のログインでは、ユーザー root パスワード rootとなっていますので。パスワードを変更しておきましょう。
大量データ投入検証時のMySQLタイムアウトを解決する

2018/06/25
サーバー側ではなくアプリ側で対応しよう、という旨追記しました。

`Ruby + Rails + MariaDB`

開発環境で大量データの投入検証をしようとすると、下記のエラーが発生。
長いinsert文も一緒に吐かれるので混乱したけど、
つまりはMysqlがタイムアウトしてしまっていました。

```
Mysql2::Error: MySQL server has gone away
```

原因としてはコネクションプールの不足なんかも挙げられるようですが、
私の場合は単純に`max_allowed_packet`が足りていないことでした。
my-large.cnfを元にしていたのだけど、足りなかったらしい。

```/etc/my.cnf.d/server.cnf
[mysqld]
max_allowed_packet = 1000M   # 1M->1000Mに修正。
```

`systemctl restart mysqld.service`でOK。

ちなみにプール数を増やす場合、タイムアウトを伸ばす場合、
再接続を行う場合`(reconnect: true)`は`database.yml`で設定できる。

2018/06/25追記
状況によりけりですが、冷静に考えると`server.cnf`をいじるよりも
アプリ側でSQLを適宜分割して発行する方がいいと思います。
大量データの投入って1秒を争わないと思うので。

参考リンク
[“MySQL server has gone away” with Ruby on Rails](https://stackoverflow.com/questions/100631/mysql-server-has-gone-away-with-ruby-on-rails)
[ActiveRecordのコネクションプールの理解を深める](https://qiita.com/katsuyuki/items/42b3c69bcd76c44ad64a)
Kotlin JSON (Moshi) 使い方

KotlinでJSONを扱うのに [Moshi](https://github.com/square/moshi) を利用した。

### ライブラリの設定

GradleにMoshiを追加する。

```gradle:app/build.gradle
// 追加
implementation 'com.squareup.moshi:moshi:1.5.0'
implementation 'com.squareup.moshi:moshi-kotlin:1.5.0'

```

jarで利用する場合は、以下を用意する。

```:libs
moshi-1.5.0.jar
okio-1.14.0.jar  ← moshiが利用している
```

### エンティティ

```Kotlin:User.kt

import com.squareup.moshi.Json

data class User(
        var name: String,
        var age: Int,
        @field:Json(name = "last_update")   // @Json(name = "last_update")
        var lastUpdate: Long                // ↑これだと、変換されなかった
)
```

### JSON -> エンティティ に変換

```Kotlin:
val jsonText = ...
val adapter = Moshi.Builder().build().adapter(User::class.java)
val user = adapter.fromJson(jsonText)
```
### エンティティ -> JSON に変換

```Kotlin:
val user = User("hoge", 1, System.currentTimeMillis())
val adapter = Moshi.Builder().build().adapter(User::class.java)
val jsonText = adapter.toJson(user)
```
Mac OS + Go 言語を始めた


## インストール

* [Getting Started](https://golang.org/doc/install) に従って作業する
* [Downloads](https://golang.org/dl/) のインストーラを実行
* インストールされるファイル
  * /usr/local/go
  * /etc/paths.d/go

## 動作確認

```
$ mkdir -p $HOME/go/src/hello
$ cd $HOME/go/src/hello

$ cat <<EOT > hello.go
package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}
EOT

$ go build
$ ./hello 
hello, world

$ go install

$ ~/go/bin/hello 
hello, world
```

## [Workspace](https://golang.org/doc/code.html#Workspaces)

お節介な事であるが、Go では開発者のディレクトリの構成を強制している。これを Workspace という。デフォルトで $HOME/go 環境変数 GOPATH で変更出来る。GOPATH にはデリミタで区切って複数のディレクトリを指定出来る。

* `bin`: `go install` で出来た実行ファイルがここに入る。
* `pkg`: `go install` で出来たライブラリパッケージがここに入る。
* `src`: ソースコードを入れる所。

ライブラリが入る場所が環境変数で決まる言語はよくあるが、バイナリやソースの位置まで指定するのは珍しい。

残念ながら標準でライブラリのバージョンを固定する機能は無い。Go の設計思想から言ってそういうのも標準に入れるべきだと思うが今は [govendor](https://github.com/kardianos/govendor) などサードパーティのツールを使う。そうすると npm っぽく使えるようだ。
PIXI.jsでカーソルを変更する


簡単にカーソル変更ができなかったのでメモ

# PIXI.js 4.3.0で仕様が変更になっている
* http://pixijs.download/dev/docs/PIXI.interaction.InteractionManager.html

具体的には、先にappに変更に使いたいカーソルを設定しておかないとダメ
デフォルトではクリック用のpointerと、カーソルの2種類しか使えない。
それ以外を指定しても無効化される

```js
app.renderer.plugins.interaction.cursorStyles["ew-resize"] = "ew-resize";
```

```js
sprite.interactive = true;
sprite.cursor = "ew-resize";
```

# 参考
* [実際に動作するサンプルページ](https://codepen.io/Tazy/pen/VbLLeX)
PostgreSQLでserial(SEQUENCE)を使った自動採番を飛ばしの番号にする

idを自動で採番する際に普通は1,2,3,4,..となるが
1,3,5,7,... こんな感じで2飛ばしにしたい。

### 背景

論理レプリケーションを試した際に
https://qiita.com/miyawa-tarou/items/5964d364aa6f5747d45c


テーブルにserialを入れる場合
一方的に送り付ける分には問題ないが、たまにスレーブ側でも書きたいと思うとSEQUENCEのほうが同期が取れないため、以下のような場合

```sql
CREATE TABLE hogehoge (
  id SERIAL,
  data character varying(255) NOT NULL
);
/* 自動でhogehoge_id_seqができる */
```
|id |data|
|---|----|
|1  |aaa |
|2  |bbb |
|3  |ccc |

みたいにマスタで書いた後スレーブ側でIDはserialとして新規に書き込むと、serial的には1から始まるためduplicate keyが出てしまう

```
SQLSTATE[23505]: Unique violation: 7 ERROR:  duplicate key value violates unique constraint "hoge_pkey"
DETAIL:  Key (id)=(1) already exists.
```

MySQLのデータベースレプリケーションで言えば
```
auto_increment_increment=2
auto_increment_offset=1
```
こんなのはあったなぁと思いつつ、テーブルレベルでできるかとかそのあたりを調べていた


### 方法

SEQUENCE側に設定を入れる

```sql
// 1,3,5,7,...
ALTER SEQUENCE hogehoge_id_seq INCREMENT BY 2;
// 2,4,6,8,...
ALTER SEQUENCE hogehoge_id_seq INCREMENT BY 2 RESTART WITH 2;
```

テーブルとは別途SEQUENCEを作る場合はCREATE SEQUENCEの際に作れる模様
https://docs.oracle.com/cd/E60665_01/db112/SQLRF/statements_6015.htm
はじめてのCosmos DB

## こんな人に向けた記事
Azure Cosmos DBを使ってみたいと思ったけど、所謂普通のDBと何が違うのか必要最低限だけまともにまとめてある記事あったら楽なのになぁと思っていた人向け。

## RUって何？
Request Unitの略で、この数値が性能であり課金単位となります。
後述するデプロイ方法により、最低に指定できる値が400 RUか1,000 RUかの２パターンあります。
400 RU＝約2,943円/月が最低金額になります。開発環境用に100 RUで作れればいいのにね、というのが本音。また、課金かかる単位は「コレクション」単位でかかります。

## コレクションて何？
SQL Databaseでいうところのテーブルだと考えてください。はい、これわりと大問題です。前述で「400 RU＝約2,943円/月が最低金額」「課金かかる単位は「コレクション」単位」と説明しています。ということは、10コレクション作成した場合は約3万円が最低でも月々かかってしまうわけです。
そういったわけで、月額費用を抑えるためにはコレクション数を減らす形で設計しなければいけない、という制約条件がつくわけです。
お金さえ気にしなければ、今までのDB設計と同じノリでコレクションを使えますが、こういった理由があり設計で工夫しないと「Azure Cosmos DBは高い」と、わけがわからん事を言う人が出てくるので、しっかり工夫しましょう。

## 具体的にRUっていくつあれば足りるの？
CRUDのどの処理を行うか、実データの大きさがどのくらいか、等で必要なコストは変わります。
参考としてですがIoT系でほぼ登録なシステムの場合、400 RUで20 count/sec程度でした。
利用条件で変化しますので、まずは実測しましょう。

## データ量と最低RUの関係
[MSのBLOG](https://azure.microsoft.com/en-us/blog/azure-cosmosdb-entry-point-for-unlimited-containers-is-now-60-cheaper-and-other-improvements/ "MSのBLOG")に書いてあるものしか正確な情報ないのですが、DocumentCollectionを作成する際のオプションOfferThroughputで400 RUと2,500 RUで作成した場合で、それぞれデータ容量と指定できるサイズのレンジが異なります。
（これは現在の仕様なので変更される可能性あるなぁと個人的には思っています。なにせわかりにくい！）

### 400 RU指定の場合
Storage capacity : Fixed (10GB)
Throughput (400 - 10,000 RU/s)

### 2,500 RU指定の場合
Storage capacity : Unlimited
Throughput (1,000 - 50,000 RU/s)

### コレクション作成コードサンプル（C#)
```C#
private static async Task CreateCollectionIfNotExistsAsync(
    Action<DocumentCollection> indexPolicyAction, bool highperformance)
{
    var offerThroughput = highperformance ? 2500 : 400;

    var result = await _client.CreateDocumentCollectionIfNotExistsAsync(
        UriFactory.CreateDatabaseUri(_setting.DatabaseId),
        new DocumentCollection
        {
            Id = _setting.CollectionId,
            PartitionKey = new PartitionKeyDefinition()
            {
                Paths = new Collection<string>() { _setting.PartitionKeyName }
            }
        },
        new RequestOptions { OfferThroughput = offerThroughput }
        ).ConfigureAwait(false);
    if (result.StatusCode == HttpStatusCode.Created
        && indexPolicyAction != null)
    {
        indexPolicyAction(result);
    }
}
```

### TIPS
2,500RU指定でコレクションを作成した場合、テスト環境であればAzureポータルでRUを2,500→1,000に下げておきましょう。
Cosmos DB→コレクション→スケール　から変更できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242111/7385bbf4-2117-2f99-5798-b347f2db64bc.png)


## SQL Databaseとの使い分け
用途が異なるので使い分け・併用することも検討してください。
ざっくりいうと「マスタ」「トラン」はCosmosDB、「複合検索インデックス」はSQL Databaseにすると良いのではないか、というのが私の今のところの考え。

### Cosmos DBの得意なこと

* 応答時間にSLAがある（＝読み取りがほとんどなマスタ系に向いている）
* 容量制限のないコレクションを作成可能（＝IoTのような大量なデータ蓄積にも向いている。SQL Databaseはせいぜい数TBが上限）
* スキーマレスなので不定なデータを扱いやすい

### Cosmos DBの苦手なこと

* 突発的に負荷が上昇するシステム。確保しているRUを使い切ると瞬間的にエラーとなるので、何等かの方法で稼働状況を監視していないとシステム止まってたなんてことになります。まあこれはSQL DatabaseでもDTU 100%張り付きで動かなっていう状態と同じなのですが、それにしてもSQL Databaseよりもスパイクに弱い気はします。個人の感想です。

### SQL Databaseの得意なこと

* JOINして複雑な検索が可能（＝検索インデックスをSQL Database側に作成し、実体をCosmos DBに配置といった構成はおすすめ）
* ASP.NET Identityのデータストア（Cosmos DBでむりくり使うようなGithubライブラリはありますが、更新されていないので私は採用せず）
* バックアップがフルオートで35日保持。

### SQL Databaseの苦手なこと

* データ容量がある
* JSONのような不定なデータを扱いにくい

## 具体的な設計例
次回書きます。
電子回路 > トランジスタのスイッチ動作 v0.1 > コレクタ負荷, hFE=200, Load(5V, 120mA)

### 関連

[電子工作 > Using Bipolar Transistors As Switches > Bipolar Transistorの式](https://qiita.com/7of9/items/4db135013f5b49bd3d28)

### 回路v0.1

電子回路の勉強中 (BJT: Bipolar Junction Transistor)。

- V_CEを低くするためコレクタ負荷
- モーター(5V, 120mA)の回路がない？ので抵抗にした
    - **あっている自信はない**
- ベース抵抗は下記の式とした。

```math
R_B = \frac{V_{CC} - V_{BE}}{I_C / hFE}
```
V_CC: 5 V
V_BE: 0.7 V
I_C: 0.120 mA
hFE: 200
(データシートの勉強が必要だ)。

R_B = 7166.66

6.8kを選択した。
http://tinyurl.com/y896tnea


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/56cbc097-d1d5-3941-e316-83dde29d6308.png)

すごい勢いで電気が流れている。

汗

> 2 bad connections

逆起電力対策のダイオード(flyback diode)で接続エラー。


@rrii さんに[アドバイスいただいた](https://qiita.com/7of9/items/4db135013f5b49bd3d28#comment-dc37bab5e44a7ff1694a)安定化用のコンデンサは未実装。
IntelliJのファイル選択ダイアログでフリーズの対応

IntelliJでファイル選択のダイアログを表示したとき、ホームの全ファイルをスキャンしているらしくフリーズしてしまう。

これでは使い物にならないので、調べた結果、カスタム設定で

> idea.chooser.lookup.for.project.dirs=false

を追加すれば、スキャンしなくなり解決。

環境: Windows10, IntelliJ 2018.1.1(64bit)



https://intellij-support.jetbrains.com/hc/en-us/community/posts/206600305-Open-File-or-Project-dialog-window-unresponsive-with-Very-Large-directories

> in your personal idea.properties file (obtained via Help -> Edit Custom Properties...),
> 
> does inserting this line:
> > idea.chooser.lookup.for.project.dirs=false
【PHP】二次元配列から共通要素を取得する

たとえばこんな配列があるとする

```php
$c = [[1,2],[2,3],[3,4]];
$d = [[1,2],[3,5],[6,7]];
```

これらの配列から共通要素（[1,2]）を取り出したい
配列の共通要素を取得するのに、array_intersect()という関数があるらしいので、
それをつかってみると、

```php
$e = array_intersect($c, $d);
```

```
Notice: Array to string conversion in　XXX
```

というエラーメッセージがでて、うまく取得できません
PHPの配列処理に有効な処理方法として、こんなものがありました

###  foreachは配列を反復処理するための便利な方法です
http://php.net/manual/ja/control-structures.foreach.php

なので、foreachをつかってみると共通要素がとれました


```php
$common = [];

foreach ($c as $v1) {

	foreach ($d as $v2) {
		
		if ($v1 == $v2) {

			array_push($common, $v1);

		}

	}

}

```


```php
print_r($common);
Array ( [0] => Array ( [0] => 1 [1] => 2 ) )
```
git cloneに失敗したとき

環境
--

```shell
[root@CentOS7 ~]# cat /etc/redhat-release 
CentOS Linux release 7.0.1406 (Core)
```

事象
--

```shell
[root@CentOS7 git]# git clone https://github.com/jeromeetienne/AR.js.git
Cloning into 'AR.js'...
fatal: unable to access 'https://github.com/jeromeetienne/AR.js.git/': Peer reports incompatible or unsupported protocol version.
```

解決
--

```shell
yum -y install epel-release
yum -y update nss curl
```
axiosによる呼び出しを AWS X-Rayで分析する

AWS Lambdaの実行速度が遅かったので、[AWS X-Ray](https://aws.amazon.com/jp/xray/)を使って調べてみました。

遅いのは外部サービスをHTTP経由で呼び出している部分と思われたのですが、Promiseベースの [axios](https://github.com/axios/axios) を使っていたために、[AWS X-Ray SDK](https://github.com/aws/aws-xray-sdk-node) をインストールしただけでは分析が出来ませんでした。

Lambdaのコードに、[ここ](https://github.com/aws/aws-xray-sdk-node/pull/11)に書いてあるおまじないを追加すると、X-Rayで分析をすることが出来ました。私の環境(Node.js 6.10)では、以下のコードを追加すれば OK でした。

```javascript
const awsXRay = require('aws-xray-sdk');
const awsSdk = awsXRay.captureAWS(require('aws-sdk'));

awsXRay.captureHTTPsGlobal(require('http'));
awsXRay.capturePromise();
const axios = require('axios');
```
mysql8.0.11を"とりあえず"立ち上げる

MySQL8.0リリース記念。
とりあえず立ち上げたので、メモ書き。

---
インストール先: /opt/mysql
DataDir: /var/lib/mysql
mysql実行ユーザ: mysql

---

###### [PATH追加]
``` ~/.bashrc
PATH=$PATH:/opt/mysql/bin
```
```console
# source ~/.bashrc
```


###### [tar展開とインストール]
```console
# cd /opt
# tar zxvf /root/mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz
# ln -s mysql-8.0.11-linux-glibc2.12-x86_64 mysql
# mysqld --initialize --user=mysql --basedir=/opt/mysql --datadir=/var/lib/mysql
# mysql_ssl_rsa_setup --datadir=/var/lib/mysql
```
**---> root@localhostの初期パスワードが表示されるのでメモっておく**

###### [systemd設定]
```ini:/etc/systemd/system/mysqld.service
[Unit]
Description=MySQL Server

[Service]
Type=simple
ExecStart=/opt/mysql/bin/mysqld
PIDFile=/var/lib/mysql/mysqld.pid
User=mysql
Restart=always

[Install]
WantedBy=multi-user.target
```

```console
# systemctl enable mysqld
```

###### [my.cnf設定]
```ini:/etc/my.cnf
[mysqld]
basedir = /opt/mysql
datadir = /var/lib/mysql
pid_file = /var/lib/mysql/mysqld.pid
socket = /var/lib/mysql/mysql.sock
port = 3306

[client]
socket = /var/lib/mysql/mysql.sock
```

###### [mysql server 起動]
```console
# systemctl start mysqld
# mysql -uroot -p
```

**初期パスワードでログイン後、rootパスワードを変更しておく**

###### [root password 変更]
```sql
mysql> set password = 'xxxxx';
mysql> flush privileges;
mysql> exit
```

文字コードやらメモリ設定やらは抜きにして、とりあえず起動するところまで♪
COUNT field incorrect or syntax error が出るときの対処方法

#忘れっぽいので覚書

##COUNT field incorrect or syntax errorってなんぞ？
よくこんなエラーが出る。
"[Microsoft][ODBC Driver for SQL Server]COUNT field incorrect or syntax error "

一見なんのこっちゃ解らんエラーですが、大体においてplaceholderの名前の付け方が問題であることが多い。
なのでSSMSやその他のツールでSQLを発行すると問題なく発行できてしまうのが悩みの種だ。。。

placeholderは同じ値を使用する場合でも同じ名前を使うことはできない。

##以下にサンプルを記しておく。

```sql:sample.sql
wordtext ← '%お知らせ%'

SELECT
  [掲示板].[タイトル]
 ,[掲示板].[投稿者]
 ,[掲示板].[投稿日]
FROM [掲示板]
WHERE [掲示板].[内容] like :wordtext
   OR [掲示板].[概要] like :wordtext
```
とかやっちゃうとエラーになるわけである。。。

```sql:sample.sql
wordtext1 ← '%お知らせ%'
wordtext2 ← '%お知らせ%'

SELECT
  [掲示板].[タイトル]
 ,[掲示板].[投稿者]
 ,[掲示板].[投稿日]
FROM [掲示板]
WHERE [掲示板].[内容] like :wordtext1
   OR [掲示板].[概要] like :wordtext2
```
こうしないとダメぽ。

面倒だねぇ・・・
VSCode　はじめてみる

#概要
- Sublime Text 3を使っていたが日本語変換がインライン表示でできない
- IMESupportを使えば対応できるようだが、Windows10の私の環境だと改善できず。。
- 他のEditorに乗り換えようと思った所、、
- AtomかNSCodeが評判良さそう
- NSCodeを使うこととする

#ショートカット
- コンソール表示　Ctrl-@

# カラーテーマを変える
- Ctrl + Shift ⇒p
- テーマと入力する
- 選ぶ　Monokai　を選んでみた

# 拡張機能
## Insert Date String
## Table Formatter
## Auto-Open Markdown Preview
## vscode-icon
- ファイル、基本設定、ファイルアイコンのテーマ

# Markdownプレビューを見る
- コマンドパレット：［Markdown: プレビューを横に表示］
- キーボード：［Ctrl］＋［K］→［V]
- 

# git
##　概要
- PortableGit
## 初期設定
- git-for-windows の　GitHubの最新を以下からダウンロード
- https://github.com/git-for-windows/git/releases/latest 
- 以下に展開
- C:\data\tool
- 以下のフォルダにgit.binができる　
- C:\data\tool\PortableGit\bin　
- VSCodeでパスを通す
- 左下の歯車⇒設定⇒git.pathの左の鉛筆をクリック
-    "git.path": null
-    を
-    "git.path": "C:\\data\\tool\\PortableGit\\bin\\git.exe"
-    へ変更
- 作業メモ
    - git のパスが見つからなくて
- Git を求めて次の場所を探しています: C:\Program Files\Git\cmd\git.exe
- Git を求めて次の場所を探しています: C:\Program Files (x86)\Git\cmd\git.exe
- Git を求めて次の場所を探しています: C:\Program Files\Git\cmd\git.exe
- Git installation not found.
- が表示される。
-  "git.path": "C:\\data\\tool\\PortableGit\\bin\\git.exe"
-  じゃだめで、これはWindowsの環境変数へのパスが通っていないからみたい
-  Windowsマーク⇒環境変数⇒Path⇒編集
- "C:\data\tool\PortableGit\bin\git.exe"を追加
##　参考
- https://azriton.github.io/2017/12/18/Visual-Studio-Code%E3%81%A7git%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E3%81%A8%E8%A8%80%E3%82%8F%E3%82%8C%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6/
- https://azriton.github.io/2017/08/21/PortableGit-for-Windows%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/