OmniAICreator/Qiita-1.07M huggingface dataset:
Xtion2をUbuntu 16.04で使う

# はじめに
ASUSから、[Xtion2 Depth Camera](https://www.asus.com/3D-Sensor/Xtion-2/specifications/)が2017年8月に発売されました。
[公式マニュアル](https://www.asus.com/3D-Sensor/Xtion-2/HelpDesk_Manual/)にWindowsでのインストール方法は書かれているのですが、LinuxでのSDKインストール方法がほとんど書いてなかったので、記事に残しておきます。

# Xtion2
Kinect2やRealSenseの登場、および[AppleによるPrimeSenseの買収](http://japanese.engadget.com/2013/11/24/3d-primesense-kinect/)で、XtionやCarmineの開発は止まっていたと思ったのですが、そんなことなかったようです。
ちなみにXtionはエクシオンもしくはエクションと読みます。

公式スペックシートには載っていませんが、[ToFセンサはTexus Instruments製](http://www.naturalsoftware.jp/entry/2017/08/10/105435)とのことです。RGBはどこだか知っている方いたら教えてください。

# 環境
- Ubuntu 16.04 LTS 64bit

# OpenNI2.2のインストール

下記リンクから、ドライバとSDKをダウンロードします。

- https://www.asus.com/3D-Sensor/Xtion-2/HelpDesk_Download/
- OSはUbuntuを選択します。
- [2018.02.23] 本記事更新時にダウンロードしたVersionは2017/10/26版でした。
- カメラ付属のディスクにも同じファイルが入っています。
- OpenNI2はaptからでもインストールできますが、Xtion2を使うのであれば上記Xtion2用のものを使いましょう。

ダウンロードしたzipを展開し、中には入ります。

- `unzip SDK.tar.gz`
- `cd ASUS-Linux-x64-OpenNI2.2`

インストールスクリプトに実行権限をつけ、root権限で実行します。

- `chmod +x install.sh`
- `sudo ./install.sh --install`
  - `sudo ./install.sh --uninstall`でアンインストールもできます。
  - このスクリプト内でlibglutをインストールしていますが、すでにGLUTがインストールされている場合
    - copying glut lib...ln: failed to create symbolic link '/usr/lib/x86_64-linux-gnu/libglut.so': File exists
    - ln: failed to create symbolic link '/usr/lib/x86_64-linux-gnu/libglut.so.3': File exists
  - と表示されますが気にしなくて大丈夫です。


# サンプルの実行

SimpleRead

- カメラ真正面の1点のDepthを標準出力に表示し続けるサンプルのようです。
- `cd Samples/Bin`
- chmod +x SimpleRead
- `./SimpleRead`

SimpleViewer

- DepthイメージのGUIサンプルです。これを起動するには追加の手順が必要です。
- まずおもむろに、USB3.0のケーブルでカメラをPCの**USB2.0ポート**に接続します（！）
  - 3.0ポートのままだと下記のエラーが発生します。
  - `VIDIOC_STREAMON error 28, No space left on device`
  -  https://stackoverflow.com/questions/45257954/ubuntu-camera-vidioc-streamon-error-28-no-space-left-on-device
- 下記のコマンドで、USBの帯域幅を変更します。
  - `sudo rmmod uvcvideo`
  - `sudo modprobe uvcvideo quirks=640`
    - このコマンドの後`dmesg`をみると`uvcvideo: Forcing device quirks to 0x280 by module parameter for testing purpose.`という表示が見つかると思います。
    - この設定は、PCを再起動するとリセットされます。
- これで準備が整いましたので、SimpleReadと同様に実行権限を付与して実行します
- `cd Samples/Bin`
- `chmod +x SimpleView`
- `./SimpleView`
- [こちら](http://www.tekwind.co.jp/products/ASU/entry_13578.php)で掲載されているような黄色っぽいデプス画像が表示されればOK。

NiViewer

- Depth&Color&IRフレームを表示するGUIサンプルです。
- SimpleViewerと同様にuvcの帯域変更が必要です。
- 起動します。SamplesではなくToolsディレクトリの中にあります。
- `cd Tools`
- `chmod +x NiViewer`
- `./NiViewer`
- 画面上にフルスクリーンでDepthとColorのフレームが表示されます。右クリックで設定をいろいろいじれます。


# おわりに
[公式マニュアル](https://www.asus.com/3D-Sensor/Xtion-2/HelpDesk_Manual/)には,
> Linux システムのUSB 2.0 ポートに接続して使用する場合、次のコマンドを実行します。

という感じでuvcvideoの帯域幅変更コマンドが丁寧に書かれてはいたのですが、まさかこれがUSB3.0ポートでは動作しないとは思いもせず、しばらくハマりました。

私と同じようなところでハマっている人の参考になれば幸いです。
dockerのgetsockopt: no route to host問題

# 背景
社内のprivate docker registryにある日突然アクセスできなくなった
いままでできてたのになぜ？

こんなエラーが出て`docker login`できない・・・

```shell-session
$ docker login -u username -p password <private docker registry>
Error response from daemon: Get https://<private docker registry>/v2/: dial tcp 172.24.79.240:443: getsockopt: no route to host
```

# 原因
`docker network create`で作ったネットワークとアドレスが被っていた

`docker network create`では`--subnet`オプションを使ってネットワークアドレスを指定することが出来る。
指定しないとデフォルトでクラスBのプライベートアドレス（172.16.x.x〜172.31.x.x）から順番に割り当てられていくようだ。

この際、ルーティングテーブルにも追加されるので、dockerで作られたネットワークの方を見に行ってしまうようになる。

特に`docker-compose`を使っていると裏でネットワークがバンバン作られていくので気づきにくい・・・

docker networkでどのsubnetが使われているかは、以下のコマンドで確認出来る。

```shell-session
$ docker network inspect $(docker network ls --format {{.Name}}) --format '{{.Name}} {{.IPAM.Config}}'
bridge [{172.17.0.0/16  172.17.0.1 map[]}]
myproject_default [{172.18.0.0/16  172.18.0.1 map[]}]
host []
none []
```

# 対処方法
`docker network create`した時に割りあてるsubnetをオプションかなんかで指定できれば良いのだが、そういったものは無い模様
※[issue](https://github.com/moby/moby/issues/21776) も出てるっぽい

## 使ってないネットワークを消す
使ってるネットワークが被ってたらダメだけど・・・

```shell-session
$ docker  network prune
```

## docker-compose.ymlで明示的に指定する
http://docs.docker.jp/compose/compose-file.html#ipam

当然、他のdocker-compose.ymlとsubnetが被ってはいけないのでアドレスを管理する必要がある。
（めんどくさい・・・・）

## subnetを明示的に指定していして docker network createする
docker-comoseは `<projectname>_default`というネットワークを作成するので、同じ名前で事前に作っておく。

めんどくさいけどこれが一番ましな方法なきがする。
[iOS11]UINavigationBarのUIBarButtonItemが大きくなってしまう問題

**原因**

UIBarButtonItemのレイアウト設定がautolayoutに対応したのが原因のようです



**解決策**

```swift
 let widthConstraint = button.widthAnchor.constraint(equalToConstant: 32)
 let heightConstraint = button.heightAnchor.constraint(equalToConstant: 32)
 heightConstraint.isActive = true
 widthConstraint.isActive = true
```
このように縦と横の制約を追加すれば解決できました。



**引用元**

>[navigation bar rightbaritem image-button bug iOS 11
Ask Question](https://stackoverflow.com/questions/44442573/navigation-bar-rightbaritem-image-button-bug-ios-11)
「command not found: atom」はAtomを起動しなおしたら直った

なぜか`atom`コマンドが消えていて……

```
❯ atom .
zsh: command not found: atom
```

```
❯ which atom
atom not found
```

おかしいなと思ってアプリの方のAtomを起動。

そうしたら`atom`コマンドが配置されました。

```
❯ ls /usr/local/bin/atom
/usr/local/bin/atom
```

Atomって起動時にコマンドが無くなっていると自動で修復してくれるんですね。気が利く。
送る に送るbat

# 送る は便利
windowsの右クリックメニューには「送る」があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37184/341a7a31-b96b-9312-6a82-5f2aa1c7a191.png)

ここによく起動するアプリやbatを登録しておくと色々とはかどります。

登録と言っても、**決められたフォルダ**にショートカット等を置くだけです。

場所は

```
C:\Users\[ユーザー名]\AppData\Roaming\Microsoft\Windows\SendTo
```

になります。　なおこの`AppData\Roaming`までは、環境変数%appdata%で定義されているので、

```
%appdata%\Microsoft\Windows\SendTo
```

でOKです。

# でも、このパス覚えてられないな

送るメニューに登録するためにググって調べて、「あー、こんなパスだったな」と独りごちながら作業をし、次また何かの機会で送るメニューに追加しようと思ったときにはもう忘れているというあるある。

なので、**送るメニューに送るbatを送るメニューに置く**事にしました。

```[送るに登録.bat]
copy %1 %appdata%\Microsoft\Windows\SendTo
```

この、batファイルを`%appdata%\Microsoft\Windows\SendTo`に置きます。

すると、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/37184/7efac0cd-6f3f-b257-7465-553125ac7ac5.png)

送るメニューに**送るに登録.bat**が出てくるようになります。

#例

これで、例えばAndroidのアプリケーションバイナリ（APKファイル）を端末に直流ししてインストールするbatファイルを作ったとして

```[apk_install.bat]
adb -d install -r %1
```

作ったbatファイルを右クリックして送るメニューから、**送るに登録**を選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/37184/af7d0177-b358-6647-4ef2-90228e203018.png)

これにより、簡単に送るメニューに登録をすることができるようになりました！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/37184/6972f68f-4130-71fe-e61a-cb2fab6a1f1c.png)

#あとがき
よく考えれば、この `%appdata%\Microsoft\Windows\SendTo` へのショートカットをデスクトップにでも置いておけばいいと言えばそれまでですね。
でも僕はデスクトップに置いたことすら忘れてしまうのでこれでウッドボールです。　それではまた。
この解消方法→「dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.58.dylib」

Macで突然nodeが使えなくなった。次のようなエラーが出てしまう。

```txt:エラー
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.58.dylib
  Referenced from: /usr/local/bin/node
  Reason: image not found
zsh: abort      node
```

nodeをhomebrewで入れていたが、icu4c抜きでインストールし直せば解決する。


```
brew reinstall node --without-icu4c
```
AppCode で override や delegate を簡単に実装する

# TL;DR
- 継承クラスがあるクラスのスコープ内で `Command + O` で Override
- デリゲートの宣言があるクラスのスコープ内で `Command + I` で Implement
- 過去に `CBPeripheralDelegate` でうまく動作しなかった

# About
Jetbrains IDE の中でも AppCode を使っている人は少ない気がしますが自分メモ。
delegate 可能なものをリストしてそこから選択してガワをつくる、みたいなことをやる方法。

# HowTo
やってみます。
ちなみにクラスはこういう定義 ↓ です。

```
class ViewController: UIViewController, CBCentralManagerDelegate {
```

## Ctrl + N の Generate から Override methods （Command ＋ O）
![スクリーンショット 2017-10-03 10.52.10.png](https://qiita-image-store.s3.amazonaws.com/0/34022/12cc1f64-9df5-2672-aecf-165b362c52a0.png)

## Ctrl + N の Generate から Implement methods （Command ＋ I）
![スクリーンショット 2017-10-03 10.52.29.png](https://qiita-image-store.s3.amazonaws.com/0/34022/56cffe0a-f046-fdc3-04de-df6b52df46a2.png)


# Attention
でいいかんじになるはずだったんだけど、コメント欄で自分でつっこんでる
CBPeripheralDelegate のだいじなデリゲートが表示されず沼にハマったので絶対に許さない。
Issue ないかなー。
https://youtrack.jetbrains.com/issues/OC?q=implement

おわり。
Javaのstatic

javaの変数の前につく「static」ってなに？って思ったので。。。

言葉で説明すると「大元のクラスフィールドに紐付いた変数」。

```
public class car{
   static int num_car = 0;
   String type;
   String color;

   Car(String type,String color){
      this.type = type;
      this.color = color;
      num_car++;
   }
}
```

こんな感じのコードがあった場合に"type"と"color"はそのインスタンスフィールド固有のものであるが、"num_car"はインスタンスの数であるため、carクラスフィールド自体に紐づいていてどんどん更新されていくもの。
プロキシ環境下のUbuntu 16.04へのDocker CEインストール方法 2017年10月2日版 

<!-- Ubuntu 16.04へのDocker CEインストール方法　2017年10月2日版-->

# はじめに
Docker CEのインストール方法を説明します。
古いバージョン（Docker Engine）とインストール方法がいろいろ違っているみたいなので、ご注意ください。今後もまた変わるかもしれません。タイトルに明示的に日付を含めたのはそのためです。

Ubuntu 16.04と14.04でもインストール方法が若干異なるのでご注意ください。
ここではUbuntu 16.04 LTSへのインストール方法を説明します。

実際はこの公式マニュアルに沿って行うだけなのですが、一応日本語記事として載せておきます。
https://docs.docker.com/engine/installation/linux/ubuntu/#install-using-the-repository


# インストール手順

- 依存するパッケージをインストール

```
sudo apt-get install apt-transport-https
sudo apt-get install ca-certificates
sudo apt-get install curl
sudo apt-get install software-properties-common
```

- Dockerの公式GPGキーを追加

```
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```
"OK"と表示されればOKです。

- fingerprintの確認

```
sudo apt-key fingerprint 0EBFCD88
```
"フィンガー・プリント = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88"　と表示されればOKです。

- Dockerのリポジトリを追加

```
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```

- リポジトリリストのアップデート

```
sudo apt-get update
```

- Dockerのインストール

```
sudo apt-get install docker-ce
```

- 動作確認

```
sudo docker run hello-world
```

"Hello from Docker! This message shows that your installation appears to be working correctly.
"というメッセージのあと、Dockerの仕組みの簡単な説明がでてくればOKです。

- プロキシ環境下ではここで失敗するはずですので、下記ページに習って設定を行います。
 - HTTP/HTTPS proxy - https://docs.docker.com/engine/admin/systemd/#start-automatically-at-system-boot
 - プロキシを使っていない環境では、下記は飛ばして[sudoなしでもdockerを起動できるようにする](#sudoなしでもdockerを起動できるようにする)まで進んでください。

- docker用のsystemdディレクトリを作成する

```
mkdir -p /etc/systemd/system/docker.service.d
```

- 下記内容を記述したファイルを`/etc/systemd/system/docker.service.d/http-proxy.conf`として保存
  - `http://proxy.example.com:80/`の部分は各自のプロキシアドレス・ポート番号を入れてください。

```
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"
```

- HTTPと同様にHTTPSについても下記内容を記述したファイルを`/etc/systemd/system/docker.service.d/https-proxy.conf`として保存

```
[Service]
Environment="HTTPS_PROXY=https://proxy.example.com:443/"
```

- 変更を適用

```
sudo systemctl daemon-reload
```

- Dockerをリスタート

```
sudo systemctl restart docker
```

ここで再度`sudo docker run hello-world`をやると、正常に動くはずです。

# sudoなしでもdockerを起動できるようにする

- "docker"グループの作成

```
sudo groupadd docker
```
おそらく、すでにグループは存在している旨のメッセージが表示されると思います。

- 現在のユーザをdockerグループに追加

```
sudo usermod -aG docker $USER
```

- 一度ログアウトして、再度ログイン
- sudoなしでdocker runが動くことを確認

```
docker run hello-world
```


# おわりに
以上で一通りの手順は完了です。プロキシ対応のページがちょっとわかりにくいですが、この通りやれば大丈夫だと思います。
文字列をコマンドとしてパースする

`shellwords ` でARGV相当に分解してから `optparse ` でいい感じにできるっぽい。

```irb
irb(main):001:0> require 'shellwords'
=> true
irb(main):002:0> require 'optparse'
=> true
irb(main):003:0>
irb(main):004:0* str = Shellwords.split <<-EOD
irb(main):005:0" awsome_cmd -f -m "Hello world" --extra-flag --extra-args "extra args" a b c
irb(main):006:0" EOD
=> ["awsome_cmd", "-f", "-m", "Hello world", "--extra-flag", "--extra-args", "extra args", "a", "b", "c"]
irb(main):007:0>
irb(main):008:0* cmd = str.first
=> "awsome_cmd"
irb(main):009:0> argv = str.drop(1)
=> ["-f", "-m", "Hello world", "--extra-flag", "--extra-args", "extra args", "a", "b", "c"]
irb(main):010:0>
irb(main):011:0* params = OptionParser.getopts(argv, "m:f", "extra-flag", "extra-args:")
=> {"m"=>"Hello world", "f"=>true, "extra-flag"=>true, "extra-args"=>"extra args"}
irb(main):012:0>
irb(main):013:0* argv
=> ["a", "b", "c"]
```
JavaのPackageとimportについて

Javaに初めて触れてみて知ったこと。

#Package
Javaの特性上クラスをまとめるものが必要。
書き方は

```
package パッケージ名;
```

この中に多くのクラスが所属する。

#import
他のパッケージやクラスを呼び出して使う
書き方は

```
import パッケージ名.クラス名;
```
や
```
import パッケージ名.インターフェイス名;
```

packageの下に書くことが多い。
Unityで２つのテクスチャを合成(度合い設定可)するシェーダーを書いてみる

[Unityシェーダ入門】テクスチャをブレンドして自然な地形を表示する - おもちゃラボ](http://nn-hokuson.hatenablog.com/entry/2016/10/27/185618) を参照して2つのテクスチャーを混ぜて表示するシェーダーを書いてみたのでメモしておく。

## 環境

* Unity 5.6.3p1

## 作ったシェーダーについて

![materialInspector2.png](https://qiita-image-store.s3.amazonaws.com/0/16768/7e6ad4fd-3a11-374e-b3a3-e92907c040a5.png)

シェーダーを適用したマテリアルで2つのテクスチャとブレンドの度合いを設定できる。

![blend.PNG](https://qiita-image-store.s3.amazonaws.com/0/16768/8fa7ab3a-777f-ea0e-8410-3480c75c314e.png)

Blendが0.5の場合の表示。
0でAを表示、1.0でBを表示する。

## シェーダーの作り方

[Create] => [Shader] => [Standard Surface Shader]でBlendという名前のシェーダーを作成しコードを以下のように修正する。

```
Shader "Custom/Blend" {
	Properties {
		_Color ("Color", Color) = (1,1,1,1)
		_MainTex ("Main Texture", 2D) = "white" {}
	    _SubTex("Sub Texture", 2D) = "white" {} // 追加
		_Glossiness("Smoothness", Range(0,1)) = 0.5
		_Metallic("Metallic", Range(0,1)) = 0.0
		_Blend("Blend", Range(0,1)) = 0.0 // 追加
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		// Physically based Standard lighting model, and enable shadows on all light types
		#pragma surface surf Standard fullforwardshadows

		// Use shader model 3.0 target, to get nicer looking lighting
		#pragma target 3.0

		sampler2D _MainTex;
		sampler2D _SubTex; // 追加

		struct Input {
			float2 uv_MainTex;
		};

		half _Glossiness;
		half _Metallic;
		half _Blend; // 追加
		fixed4 _Color;

		// Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
		// See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
		// #pragma instancing_options assumeuniformscaling
		UNITY_INSTANCING_CBUFFER_START(Props)
			// put more per-instance properties here
		UNITY_INSTANCING_CBUFFER_END

		void surf (Input IN, inout SurfaceOutputStandard o) {
			// Albedo comes from a texture tinted by color
			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
			fixed4 c2 = tex2D(_SubTex, IN.uv_MainTex) * _Color; // 追加
			o.Albedo = lerp(c.rgb, c2.rgb, _Blend); // 修正
			// Metallic and smoothness come from slider variables
			o.Metallic = _Metallic;
			o.Smoothness = _Glossiness;
			o.Alpha = c.a;
		}
		ENDCG
	}
	FallBack "Diffuse"
}

```

## スクリプトからの設定

以下のような感じでシェーダーの変数を設定できる。

```csharp
// 変数の設定
GetComponent<Renderer>().material.SetTexutre("_MainTex", texture);
GetComponent<Renderer>().material.SetTexutre("_SubTex", texture);
GetComponent<Renderer>().material.SetFloat("_Blend", 0.5f);

// 変数の取得
GetComponent<Renderer>().material.GetFloat("_Blend");
```
@types/* を（あれば）まとめてインストール 

[jeffijoe/typesync](https://github.com/jeffijoe/typesync) を使う。

## インストール

```
npm i -g typesync
```

## `@types/... @types...`としていた部分を`typesync`だけで

これだけでいけますね。

```diff
-npm i react react-dom && npm i -D @types/react @types/react-dom
+npm i react react-dom && typesync
```
>```bash:log
+ react@16.0.0
+ react-dom@16.0.0
added 18 packages in 10.626s
» TypeSync v0.2.0
✔ 2 typings added:
+ @typings/react
+ @typings/react-dom
```
>```json:package.json
{
  "dependencies": {
    "react": "^16.0.0",
    "react-dom": "^16.0.0"
  },
  "devDependencies": {
    "@types/react": "^16.0.7",
    "@types/react-dom": "^15.5.5"
  }
}
```
Ruby で一番長いメソッド名を取得する

一番長いメソッド名を取得出来ます。

```rb
p ObjectSpace.each_object(Module).flat_map { |m| m.instance_methods + m.private_instance_methods }.uniq.max_by(&:size)
```

試しに自分の手元で試してみました (ruby 2.4.2p198)

```
:fix_syck_default_key_in_requirements
```



## 参考サイト

https://docs.ruby-lang.org/ja/latest/class/Object.html
Dracoで3Dモデルの圧縮


## Draco

https://github.com/google/draco
3Dモデルの圧縮ライブラリ

Dracoの使い方
[Compress 3D model files with Draco](http://yomotsu.net/blog/2017/09/18/draco.html)

![スクリーンショット 2017-10-03 10.16.08.png](https://qiita-image-store.s3.amazonaws.com/0/136286/76c83406-1b06-1168-8f9d-7fb10da68e28.png "スクリーンショット 2017-10-03 10.16.08.png")

Three.jsでのサンプル
https://threejs.org/examples/webgl_loader_draco.html

Three.jsのloaderを読み込む
（読み込みの順番は変えない）

```html
<script src="./js/lib/three.min.js"></script>
<script src="./js/lib/loader/draco_decoder.js"></script>
<script src="./js/lib/loader/DRACOLoader.js"></script>
```

```
const loader = new THREE.DRACOLoader();
loader.load('./model/Cerberus.obj.drc', geometry => {
	// 読み込み後の処理
})
```

https://github.com/mo49/qiita/tree/master/docs/draco
RailsでDBにmysqlを使用し、groupdateのgemを使用した際に出るエラーについて　



groupdateはchartkickなどのグラフ表示の際にとても便利なのですが、mysqlにDBを変更した途端以下エラーで動かなくなりました。

```
Groupdate::Error - Be sure to install time zone support - https://github.com/ankane/groupdate#for-mysql:
```

エラー文のとおり、documentを確認し、以下コマンドを入力すればOKでした。

```:bash
$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
```
Windows 環境で Java 実行時に CreateProcess error=206 が出てこけるのを解決する

Java で開発している最中に以下のようなエラーが発生し始めて、結構ハマったのでメモ。

```
Exception occurred executing command line. 
Cannot run program "C:\Program Files\Java\jre1.8.0_144\bin\javaw.exe" (in directory "C:\Users\ore\myproject"): CreateProcess error=206, The filename or extension is too long
```

## 原因
最初見たときはまったく意味が分からなかったが、java コマンド実行時に指定されている classpath の指定の文字列( java -cp "c:\myproject\main;c:\Users\\.gradle\...."みたなやつ)が長すぎて、Windows の createProcess の引数の上限文字数である 32768  を超えてしまったことが原因のようだ。

## 対処
### ライブラリを減らす
これが選択できるならこれが一番いい。今回は全部必要なライブラリだったので無理だった。

### プロジェクトのディレクトリを階層の低いところに移動する
例えば今が c:\Users/ore/nanika/nantoka/are/sore/koko においてあるなら、c:\Users/ore/ に移動するとか。
これが次にお手軽かなと思ってやってみたが、だめだった。理由は次の項目で。

### Gradle のホームディレクトリを変更する
エラー発生時の java コマンドに指定されている classpath をよく見ると c:\Users\ore\\.gradle\nantoka_library\nantoka.jar みたいなのが非常に多かった。そこで gradle のデフォルトのダウンロード先を c:\Users\ore\\.gradle から c:\\.gradle に移してみた。

Windows では 「システム」->「システム詳細設定」->「環境変数」-> ユーザー環境変数のところに GRADLE_USER_HOME を作って値を C:\\.gradle という手順で指定する。

これで IDE を再起動しいてビルドしなおしたら上手くいった。あまりいい方法ではないけど、ハマっている方は試す価値はあるかもしれない。

## そもそもちゃんとした対処はないの？
java コマンドにあまりに長すぎる引数を設定しているのが問題なので、これをやめればよい。
Java 9 の module が使えれば、こんなに大量で長い classpath を指定する必要がなくなるので解決する。ただ Java 9 が普及してかつライブラリが対応するまでには結構時間がかかりそう。
VirtualBoxのSierra（ゲストOS）をGitLab runnerでService起動

# はじめに
あらかじめ書いておくと、gitlab runnerの10系以降はservice起動は廃止する方向らしいです。

<img width="766" alt="スクリーンショット 2017-10-03 8.47.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/61b65ad4-aa78-4f41-233a-cdd51098f265.png">
https://gitlab.com/gitlab-org/gitlab-runner/issues/2710

# runnerのインストール
## 公式の方法
https://docs.gitlab.com/runner/install/osx.html#installation

## brewでのインストール

```bash
$ brew search gitlab
==> Searching local taps...
gitlab-runner ✔
==> Searching taps on GitHub...
==> Searching blacklisted, migrated and deleted formulae...
```

# 困っていたこと
`gitlab-runner run`では動くのに`gilab-runner start`ではエラーが発生してました
brewでインストールした場合も同じ。

<img width="785" alt="スクリーンショット 2017-10-03 8.54.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/87850027-0516-818c-c5bd-a4d9d1038dfc.png">

# 設定

## 公式の記述
一応かいてくれてはいるんですが、伝わらない。
Sierraをホストでのサービス起動についての明確な記述がない。
理解はLaunchAgentsを使うんだ、くらいでした。

https://docs.gitlab.com/runner/install/osx.html#limitations-on-macos
<img width="589" alt="スクリーンショット 2017-10-03 8.58.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/f5e98f4f-4cc1-db23-92be-4423b3859ee7.png">


## 具体的なヒント
https://gitlab.com/gitlab-org/gitlab-runner/issues/1557#note_37669240

<img width="509" alt="スクリーンショット 2017-10-03 8.51.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/9f1630b6-980e-b698-c44f-27f536405368.png">

EnvironmentVariablesの記述についてはこちらを参考にしました
https://qiita.com/kegamin/items/e035304e7295750cdf7d#homebrew_updateplist

```xml:~/Library/LaunchAgents/gitlab-runner.plist
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd" >
<plist version='1.0'>
<dict>
<key>Label</key><string>gitlab-runner</string>
<key>ProgramArguments</key>
<array>
・・・省略・・・
</array>
    <key>EnvironmentVariables</key>
    <dict>
        <key>PATH</key>
        <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>


<key>SessionCreate</key><false/>
<key>KeepAlive</key><true/>
<key>RunAtLoad</key><true/>
<key>Disabled</key><false/>
</dict>
</plist>
```
# 参考
https://qiita.com/takara@github/items/d5fe0d1929fa06eb34e3

# さいごに
現状でも設定の問題はいくつか残っているのですが、日本語で問題解決しているサイトがググれずGitLabでのCIってまだまだなのかなと。無料で動かせてめちゃ便利ですよ:grinning:
CircleCIのアクセス権周りでハマったら

CircleCIで自動デプロイを設定しているとこの辺よくハマると思うので備忘録として残します。
想定は以下の感じ
- GithubのBranch更新をトリガーにデプロイ
- CircleCI起動してGCPにSSHでシェルを叩いてGit pullでデプロイする

## まずはデプロイ先のインスタンスのGit設定を確認
~/.ssh にconfigというファイルを作成してあるかの確認。
![ssh.png](https://qiita-image-store.s3.amazonaws.com/0/1593/d51d7052-2235-0544-5776-2173172319c5.png)

存在していたら中見を確認。以下のように認証に使う鍵ファイルを指定
![ssh-config.png](https://qiita-image-store.s3.amazonaws.com/0/1593/02743c79-a07a-c4c9-3d04-4968f77aa0fb.png)

## そもそも鍵ファイルが存在するかの確認
**ssh-keygen -t rsa** で作成可能。ファイル名はデフォルトではなく個別に指定が吉かも。
ファイル名はフルパスで指定する。
なお、パスワードもナシにすること。

![sshkeygen.png](https://qiita-image-store.s3.amazonaws.com/0/1593/28754e6b-eb3e-a367-0faf-2bbd44ad80ae.png)

## CircleCIからSSHアクセスするのであればauthorized_keysに鍵登録
鍵自体は自分のPCもしくはサーバ内で作成してauthorized_keysには公開鍵を登録
![authkey.png](https://qiita-image-store.s3.amazonaws.com/0/1593/0e87d913-603c-73a3-dda1-dd5be2fd49f8.png)

CircleCIのSSH Permissionには秘密鍵を登録。
![Project settings   flic360 Flic360Make_service   CircleCI (2).png](https://qiita-image-store.s3.amazonaws.com/0/1593/ed8f4aad-1686-6931-418f-f4485ffe4ca6.png)

## CircleCIのCheckout using deploy keyでエラーになる場合
Checkout SSH Keysの欄からDeployKeyを設定する。
![Project settings   flic360 Flic360Make_service   CircleCI (1).png](https://qiita-image-store.s3.amazonaws.com/0/1593/a2bf64b9-73d3-cfa4-3535-42f1f82242ae.png)

## CircleCIのGCP連携にはサービスキーが必要
GCPをCircleCIから操作することができない場合はこれの登録が出来てないことが原因かと思われる。
サービスアカウントキーの作成方法とCircieCIへの登録に関しては以下のドキュメントも参照のこと。
https://qiita.com/hardreggaecafe/items/2630eee4e04678913d73
![Project settings   flic360 Flic360Make_service   CircleCI.png](https://qiita-image-store.s3.amazonaws.com/0/1593/e6537d72-50fe-fe33-0682-e14dd2bbb159.png)
Azure Functions で Queue が書けない、取れないとき

## 前提

- Visual Studio 2017 Update 3
- Azure Functions
- QueueTrigger

---
## 現象

- Queue が取れない
- ポータルで refresh してもメッセージが見えない
- もしかして Queue が書けていない???
- エラーは出ていない

---
## 原因

- 同じ Queue を取り合っている
  - ローカルの function 同士
  - ローカルの function と Azure 上の function
- つまり、書けているが、他の function に取られている

---
## 対策

- 不要な function は止めよう
- function の止め方を調べてみました

---
### Azure で function を止める

1. **ステータス** を **無効** にする
1. アプリケーションを **再開** する ( これを忘れがち )

---
### ローカルの function を止める

- DisableAttribute を付ける

```
[Disable]
public static class Function1
{
    ...
```

または、

```
[FunctionName("Function1"), Disable]
public static void Run([QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")]string myQueueItem, TraceWriter log)
{
    ...
```

---
### ローカルの function を止める ( 別解 )

- NoAutomaticTriggerAttribute を付ける

```
[FunctionName("Function1"), NoAutomaticTrigger]
public static void Run([QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")]string myQueueItem, TraceWriter log)
{
    ...
```

---
## 属性

他にどんな属性があるか調べてみました。まず、入力/出力バインドは次のページを参照してください。

- [Azure Functions での .NET クラス ライブラリの使用#トリガーとバインド](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-dotnet-class-library#triggers-and-bindings) - docs.microsoft.com

---
### 入力/出力バインド以外の属性一覧

<table>
<tr><th>Target<th>Attribute
<tr><td>Class, Method, Parameter<td>DisableAtrribute
<tr><td>Class, Method, Parameter<td>ServiceBusAccountAttribute
<tr><td>Class, Method, Parameter<td>StorageAccountAttribute
<tr><td>Class, Method<td>FunctionExceptionFilterAttribute
<tr><td>Class, Method<td>FunctionInvocationFilterAttribute
<tr><td>Class, Method<td>TimeoutAttribute
<tr><td>Class, Method<td>TraceLevelAttribute
<tr><td>Class<td>BindingAttribute
<tr><td>Class<td>ConnectionProviderAttribute
<tr><td>Method<td>FunctionNameAttribute
<tr><td>Method<td>NoAutomaticTriggerAttribute
<tr><td>Method<td>SingletonAttribute
</table>
jsdoでMK-80 その4

#概要
jsdoでMK-80やってみた。
ハンドアセンブラは、きついので、アセンブラを用意した。
アセンブルして、メモリーへロードするまで、自動化した。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/K/N/I/KNIs.jpg?t=1506947351)

#成果物
http://jsdo.it/ohisama1/KNIs

#使い方

```
run click
run2 click
8 2 0 0 adrset
run
```

以上
iTerm2のHotkeyを使わないなんてもったいない！！

# iTerm2のHotkeyを使わないなんてもったいない！！

iTerm2を使っている人は結構多いと思うのですが、意外とHotkeyを使っている人が少ない気がしたので、書いておきます。


![iterm.gif](https://qiita-image-store.s3.amazonaws.com/0/62822/4baf57dc-fc7f-8a41-6b2a-abca910335e5.gif)


## HotKeyを設定するメリット
- **早い**

Hotkeyの設定をすると、複数のデスクトップを開いていてもこのように上からターミナルが降りてきてすぐにコマンドが叩けるようになります。

- **写経が楽**

若干透明度を設定しておくことで、ターミナル越しにブラウザを見ながらコマンドを打つこともできて大変便利です。コピーペーストする際の無駄なトラックパッド操作が省けます

- **かっこいい**

にょろーん！っといきなり黒い画面が降ってくると、親戚一同の前ではあなたはヒーローになります。

## 設定方法

### Hotkeyを有効にする

- iTerm2の設定に、 `keys` -> `Create a Dedicated Hotkey Window...` というのがあるのでそれを押します。

<img width="956" alt="Screen Shot 2017-10-03 at 0.23.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/4c48bd74-4511-8040-b923-76adac909e85.png">

- ここでHotkeyを設定するわけですが、**私のおすすめは `Double-Tap Key` をControlにすることです**
    - これにより、Controlを２回押すとどこでも画面が舞い降りてきます。(また、英字キーボードであればCaps lockをControlに変えているので左手小指の運動で一発です。)
    - もちろん好きなKeyを設定してもかまいません。その時はHotkeyで設定してください。

<img width="575" alt="Screen Shot 2017-10-03 at 0.24.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/124438c6-25f9-45f4-9763-097c46791efe.png">


### Default windowで開かないようにする
- Hotkeyの設定をしてもやもやすることが、デフォルトのウインドウとHotkeyのウインドウが混在してしまう問題です。
- この事態を避けるため、`Only Restore Hotkey Window` に変えます。そうすることで、Hotkeyのみでウインドウが起動するようになります。

<img width="799" alt="Screen Shot 2017-10-03 at 0.23.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/f7da8d4e-9d89-2f43-c699-d045b35def3d.png">

### 透明度と幅
- profilesタブに Hotkey Windowが追加されていると思いますが、そこのWindowの設定で透明度やStyleを設定することをおすすめします。

<img width="920" alt="Screen Shot 2017-10-03 at 0.24.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/2ad03c0c-ada7-e1c3-fbc6-c028c8baa086.png">

## 設定するとこうなる
- Control + Control でターミナルが降ってきます。

![iterm.gif](https://qiita-image-store.s3.amazonaws.com/0/62822/4baf57dc-fc7f-8a41-6b2a-abca910335e5.gif)


## まとめ
- なんとまあ、ターミナルへの入力が5000兆円早くなったではありませんか！！
- その他おすすめの設定などあれば書いていこうと思いますので今日はこのへんでお疲れ様でした。
Go で文字列と16進数の相互変換



## REPL

REPL として gore を利用します。起動は次のコマンドです。

```go
gore
```

次のパッケージをあらかじめ導入します。

```bash
go get -u github.com/motemen/gore
go get -u github.com/nsf/gocode
go get -u github.com/k0kubun/pp
go get -u golang.org/x/tools/cmd/godoc
```

## 文字列とバイト列の相互変換

```go
> []byte("あ")
[]uint8{
  0xe3, 0x81, 0x82,
}
> []byte("\xe3\x81\x82")
[]uint8{
  0xe3, 0x81, 0x82,
}
> string([]byte{0xe3, 0x81, 0x82})
"あ"
> string([]byte{'\xe3', '\x81', '\x82'})
"あ"
```

## 文字とコードポイントの相互変換

文字を rune の配列に変換することでコードポイントを求めることができます。

```go
> :import fmt
> r := []rune("あ")
[]int32{
  12354,
}
> r[0]
12354
> fmt.Sprintf("%x", r[0])
"3042"
> string([]rune{0x3042})
"あ"
```

コードポイントからバイト列の相互変換をするには一度文字列に変換する必要があります。

```go
> []byte(string([]rune{0x3042}))
[]uint8{
  0xe3, 0x81, 0x82,
}
> []rune(string([]byte{0xe3, 0x81, 0x82}))
[]int32{
  12354,
}
```

## 文字列と16進数文字列の相互変換

```go
> :import encoding/hex
> hex.EncodeToString([]byte("あ"))
"e38182"
> ret, _ := hex.DecodeString("e38182")
[]uint8{
  0xe3, 0x81, 0x82,
}
> string(ret)
"あ"
```

`hexdump -C` と同じ結果になります。

```go
> hex.Dump([]byte("あ"))
"00000000  e3 81 82                                          |...|\n"
```

## 整数と16進数文字列の相互変換

```go
> :import strconv
> strconv.FormatInt(0xe38182, 16)
"e38182"
> strconv.ParseInt("e38182", 16, 32)
14909826
nil
gore> 0xe38182
14909826
```

`strconv.FormatInt` の代わりに `fmt.Sprintf` を使うこともできます。

```go
> :import fmt
> fmt.Sprintf("%x", 0xe38182)
"e38182"
```

## 整数とバイト列の相互変換

前述の結果をもとに整数とバイト列の相互変換することができます。

```go
> ret, _ := hex.DecodeString(strconv.FormatInt(0xe38182, 16))
[]uint8{
  0xe3, 0x81, 0x82,
}
> string(ret)
"あ"
> strconv.ParseInt(hex.EncodeToString([]byte{0xe3, 0x81, 0x82}), 16, 32)
14909826
nil
> 0xe38182
14909826
```



## UTF-8 とレガシーエンコーディングの相互変換

```bash
go get -v golang.org/x/text/encoding/japanese
go get -v golang.org/x/text/transform
```

それぞれのエンコーディングごとに定義される NewEncoder、NewDecoder を呼び出します。

```go
> :import golang.org/x/text/encoding/japanese
> :import golang.org/x/text/transform
> transform.String(japanese.ShiftJIS.NewEncoder(), "あ")
"\x82\xa0"
3
nil
> transform.String(japanese.ShiftJIS.NewDecoder(), "\x82\xa0")
"あ"
2
nil
```

Shift_JIS のバイト列をあらわす整数を UTF-8 の文字列に変換してみましょう。

```go
> ret, _ := hex.DecodeString(strconv.FormatInt(0x82a0, 16))
[]uint8{
  0x82, 0xa0,
}
> string(ret)
"\x82\xa0"
> transform.String(japanese.ShiftJIS.NewDecoder(), string(ret))
"あ"
2
nil
```
Electron プロジェクト始めかた


##プロジェクト作成

作りたい場所にターミナルで移動して

``` ターミナル
npm init -y
```


``` index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ElectronApp</title>
</head>
<body>
<p>Hello World</p>

</body>
</html>
```

``` index.ts
const electron = require('electron');
const BrowserWindow:typeof Electron.BrowserWindow = electron.BrowserWindow;
const app:Electron.App = electron.app;

class MyApplication {
    mainWindow:Electron.BrowserWindow = null;

    constructor(public app:Electron.App) {
        this.app.on('window-all-closed', this.onWindowAllClosed);
        this.app.on('ready', this.onReady);
    }

    onWindowAllClosed() {
        if (process.platform != 'darwin') {
            this.app.quit();
        }
    }

    onReady() {
        this.mainWindow = new BrowserWindow({
            width: 400,
            height: 400,
            minWidth: 500,
            minHeight: 200,
            acceptFirstMouse: true
        });

        this.mainWindow.loadURL('file://' + __dirname + '/index.html');
        this.mainWindow.webContents.openDevTools();

        this.mainWindow.on('closed', () => {
            this.mainWindow = null;
        });
    }
}

const myapp = new MyApplication(app);
```



アプリの起動は

```ターミナル
electron .
```
Android StudioからANEを書き出す


参考
[[AS3] Android Studio でもANE用のjarを作りたい « きんくまデザイン](http://www.kuma-de.com/blog/2016-10-02/7254)


##javaでソースを描いたら

![](http://www.kuma-de.com/wp/wp-content/uploads/2016/10/and_studio_jar5.png)


##コンパイルでJarを作る

![](http://www.kuma-de.com/wp/wp-content/uploads/2016/10/and_studio_jar6-159x300.png)


プロジェクトフォルダ/モジュール名/build/intermediates/bundles/release/classes.jar


こういうエラーが出る
![](https://www.evernote.com/l/Ai41STyO7KJGjpIFRYHImhkXWDvRZrhWhjcB/image.png)

[Umipla: Adobe AIR ANE for Android を試してみた（ハマってみた）](http://umipla.blogspot.jp/2015/07/adobe-air-ane-for-android.html)

8.ネイティブ拡張記述ファイルの作成
　Flexプロジェクトのフォルダ直下にextension.xmlというファイルを作成します。


``` ターミナル
　adt -package -target ane ANEMySounds extension.xml -swc bin/ANEMySounds.swc -platform Android-ARM library.swf classes.jar

```
[Rails] rails generateコマンドの使い方 

# rails generate controller
- 使用方法

```
$ rails generate controller file_uploader
      create  app/controllers/file_uploader_controller.rb
      invoke  erb
      create    app/views/file_uploader
      invoke  rspec
      create    spec/controllers/file_uploader_controller_spec.rb
      invoke  helper
      create    app/helpers/file_uploader_helper.rb
      invoke    rspec
      create      spec/helpers/file_uploader_helper_spec.rb
```

- 不要ファイルを作成しない設定  
今回はassets(javascript,coffee script, scss)が作成されないように設定した。

```rb:config/applicationo.rb
class Application < Rails::Application
  .....

  config.generators do |g|
    g.assets false
  end

end
```
gensimのWord2Vecを使って膨大なデータを逐次的に学習する方法

# この記事を3行でまとめると
Word2Vecで膨大なデータをミニバッチ学習するために
gensimを使ってコードを書いて
ついでにどうでもいいプルリクを送りつけた話


## 1. 導入
gensimを使ってWord2Vecを学習するとき、普通は1つの学習データを食わせて学習するかと思います。

しかし、学習データのサイズが大きすぎるとメモリにのらないんじゃないかと不安になります。（数GBのデータが10個ほどあるような場合を想定しています。）

そこで、学習データを複数に分けて読み込み、別々に学習するために

gensimのソースコード読んで、目的に叶うコードを書きました。

## 2. 環境
Python 3.4.3
gensim (2.3.0)


## 3. 目的
複数のファイルを順次モデルに渡していき、その都度学習させること

## 4. コード

```python
from gensim.models import word2vec
model = word2vec.Word2Vec(window=1, min_count=1)

files=["data0.txt", "data1.txt", "data2.txt", ...]
update=False
for file in files:
    # 適当な処理"load"をして学習用のsentencesをfiles[i]から抜き出す
    sentences = load(file)
    model.build_vocab(sentences, update=update)
    update=True
for file in files:
    sentences = load(file)
    model.train(sentences, total_examples=len(sentences),
                epochs=model.iter)

# !!注意!! (追記:2018/1/12)
# あとで判明しましたが中の人によるとこのコードのようにtrain関数を複数回使うことは望ましくありません。
# コメントに書いたようにPathLineSentencesクラスを使うと
# train関数の使用は1回ですみ、訓練しつつ逐次的にデータを読み込むことが可能です。
# build_vocabも1回ですみます。
```
※
model.iterはdefaultでは5

これで目的達成です。
お疲れ様でした。


## おまけ：重箱の隅

gensimでは単語の出現回数をbuild_vocabするたびに0から数えなおしています。

そのため、今回のように異なるデータを複数回に分けて扱う場合、厳密な意味でmin_count以下の出現回数の単語のみを弾くことは現状のソースコードではできません。

例えば、min_countを2に指定した（＝頻度1の単語はカウントしない）場合

```
sentences1=[["a","a","x"], ["b","b","y"]]
```

でbuild_vocabした後に

```
sentences2=[["b","b","x"], ["a","a","y"]]
```

でbuild_vocabして学習すると、それぞれのbuild_vocabにおいて"x"と"y"はともに出現回数は1なので語彙としてカウントされません。

しかしsentences1とsentences2を合わせた全体での出現回数は"x"も"y"も2なのでmin_countの制約をクリアしており、語彙として加えられるべきです。

この問題()を解決するためには以下のようにソースコードを書き変えました。

https://github.com/RaRe-Technologies/gensim/compare/develop...shinochin:patch-1

・・・それなりに大きいサイズなのに、各データでmin_countを下回っているような単語は超どうでもいいものな気がするので、本当に重箱の隅だと思います・・・

が、せっかくコード追加したのでプルリク送ってみました。
もしかするとプロジェクトによってはmin_countが重要なファクターになることがあるかもしれません。
https://github.com/RaRe-Technologies/gensim/pull/1606
英語つらい
pugで書くRiot Routerの開発環境メモ

# はじめに
[pugで書くRiotの開発環境メモ](https://qiita.com/PVCresin/items/3b49600720c8ecefedd4) の続き
Riotの公式Routerである[Riot Router](https://github.com/riot/route)が動くことが目的なので，それ以外の設定は手抜きです．
pugでスイスイ～っとルーティングするぞ！
Riotのバージョンは`3.7.3`
Riot Routerのバージョンは`3.1.2`

# ソース
https://github.com/pvcresin/testRiotRoute

1. `git clone`したら`yarn`して`yarn watch`してください．
1. `live-server`が起動するので，コードをいじって保存すれば自動でコンパイルし，ブラウザがリロードされます．

構成は前回と全く同じです．
変わった事といえば，`dependencies`に`riot-route`が入ったぐらい．

# 動作確認
ページ上部に4つのaタグのリンクが表示されます．
それぞれ，

1. ページをリロードしてトップページに飛ぶ `href="/"`
2. トップページに飛ぶ `href="#"`
3. フルーツページに飛ぶ `href="#fruit"`
4. 検索ページに飛びクエリを投げる `href="#search?keyword=hello"`

という動作をします．

# 具体的には
- `example.com`, `example.com/`, `example.com/#`では`top`タグを表示
- `example.com/#fruit`では`fruit`タグを表示
- `example.com/#search?keyword=hello`では`search`タグを表示します．また`route.query()`でクエリの取得も行います．
- その他のパスは`other`タグで404と表示します．
- URLの変更やブラウザの進む/戻るボタンでも動作します．

# コードと軽い説明
コードで変わったのは`app.tag`だけです．

```jade:app.tag
app
	nav
		a(each='{link in links}' href='{link}') {link}
	router
		route(path='')
			top
		route(path='fruit')
			fruit
		route(path='search..')
			search
		route(path='..')
			other

	style.
		a {
			margin: 1rem;
			font-size: 2rem;
		}

	script.
		this.links = ['/', '#', '#fruit', '#search?keyword=hello']

top
	h1 top page

fruit
	h1 fruit page

search
	h1 search page
	p(each='{value, key in query}') {key}: {value}

	script.
		import route from 'riot-route/lib/tag'
		this.on('route', () => this.query = route.query())

other
	h1 404
```

重要なのは，この部分↓

```jade
router
	route(path='')
		top
	route(path='fruit')
		fruit
	route(path='search..')
		search
	route(path='..')
		other
```

ここでfruit，searchといったタグを表示する設定をしています．
v3.1からタグベースでのルーティングが出来るようになりました．（とてもよい）
ただし，これを使うには`import route from 'riot-route'`の代わりに **`import route from 'riot-route/lib/tag'`** とする必要があるので，注意！！（[公式ドキュメント](https://github.com/riot/route/tree/master/doc)にのってるけど）

# 最後に
- Riotだけでもドキュメント読みづらかったり，人口少ないのに，Riot Routerとなるとホントに参考になるサイトが少なくて困りました．誰かの役に立てばいいなと思います．
- ハッシュ`#`ではなく，`/`のみでルーティングしたい場合には，いきなり下の階層にアクセスると404が出るので，サーバでSPA用の設定をしてやってください．
- また，ファイル数が多くなるのを避けるために`app.tag`に`top`や`search`などのタグを一緒に書いて定義しましたが，
実際にはちゃんとファイルに分けたほうがいいと思います．
- 今回は使いませんでしたが，`route.stop()`や`route.base('/app')`，`route.create()`なども場合によっては必要になってくるので，いい感じに組み込んでください．（雑）

# 参考
- http://riotjs.com/api/route/
- https://github.com/riot/route/tree/master/doc
今さらながらのGitHub導入

# はじめに
研究でQiitaとGitHub(に上がっているソースコード)にお世話になっていながら自分では使ってこなかったので，Qiitaに書く練習でGitHubの導入方法を書いていきます．

# [Github](https://github.com)とは
Gitを用いてソースコード等を保存・管理できる無料のwebサービス．
GitHubに公開されているものはオープンソースというのもポイントですね．

# 導入方法
コマンドは基本READMEに従っています．

## 実行環境
OS: ubuntu 16.04LTS(Windows8.1の仮想環境)

## アカウントの登録
[こちらから](https://github.com/)
Username, Email, Passwordを記述して Sign up for GitHubを押してアカウントを仮作成します．
登録したメールアドレスに本登録確認のメールが来るのでVerify email addressを押して本登録をしてください．

## とりあえずHello World的な
本登録が完了し，サインインしたら右上の+を押してNew repositoryを選択してください．
Repository nameにHelloGit(なんでもいいです)と入力してPublicを選択し，Create Repositoryを押してください．
すると

```
…or create a new repository on the command line

echo "# HelloGit" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/Username/HelloGit.git
git push -u origin master
…or push an existing repository from the command line

git remote add origin https://github.com/Username/HelloGit.git
git push -u origin master
…or import code from another repository
You can initialize this repository with code from a Subversion, Mercurial, or TFS project.
```

とREADMEが出てきます．以降は基本これに従います．
が，まずはGitHub用のディレクトリを作成します．

```
mkdir github
cd github
```
次に今回用のディレクトリも作成します．

```
mkdir hellogit
cd hellogit
```

後はREADMEに従っていきます．

```
git init
echo "# HelloGit" >> README.md
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/Username/HelloGit.git
git push -u origin master
```
ここで自分のGitHubに登録したメールアドレスとユーザ名を設定しないとエラーが出ます．(出なかった場合は飛ばしてください)

```
git config user.email メールアドレス
git config user.name ユーザ名
```
メールアドレスとユーザ名を設定をしたら再びgit pushを実行してください．
すると，GitHubのUsernameとPasswordを聞かれるので入力すれば，無事にGitHub上にアップロードされるはずです．
以上です，お疲れ様です．

---
# おわりに
- ほとんど自分の備忘録に…
- 初投稿ということもありだいぶ見辛い感じになってしまった．
- 今後はGitHubと連携させながら，機械学習系の基本的なコードをまとめていけたらなと思います．
- 今回の記事でおかしいところがあれば教えていただければ幸いです．
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第五章 ソフトウェアで表現されたモデル6(エンティティ・実装)

# エンティティの実装

[前々回(エンティティとは)](https://qiita.com/YasuhiroKimesawa/items/30d1dbaf963c7dfbd0c8)・[前回(エンティティのモデル)](https://qiita.com/YasuhiroKimesawa/items/7d250aeb572e4f7bfd34)の続き。

## ポイント
- 識別子で同一性の比較をする場合はequals(hashCodeも)をオーバーライドする
- 属性はバリューオブジェクトにする
- 識別子もバリューオブジェクトにすると便利

色々省略してますが、一応例です。

```java:Order.java

class Order{
  OrderID orderId;

  Items items;

  Order canceled(...){
    ...
  }

  boolean equals(other){
    ...
    return this.orderId.equals(other.orderId)
  }

　　　　int hashCode(){
     ...
  }
}

```

```java:OrderId.java

class OrderId{
  final Integer value;

  boolean equals(other){
    ...
    return this.value.equals(other.value)
  }

  int hashCode(){
     ...
  }
}

```

equalsやhashCodeなどを持ったEntityインターフェイスを用意しておいて、それを実装するとか、Entityの属性をfinalにするとかアクセス修飾子とかメソッドはDomainEventを返すとか色々あると思いますが、ひとまずポイントだけを押さえた例を書きました。

必ずequalsをオーバーライドするかとか使うときだけそうするとか、そういうのも含めチームで決めればよいと思います。

とにかく、[同一性・連続性に着目](https://qiita.com/YasuhiroKimesawa/items/30d1dbaf963c7dfbd0c8)し、[本質的な特徴を踏まえること](https://qiita.com/YasuhiroKimesawa/items/7d250aeb572e4f7bfd34)です。

ただ、識別子はプリミティブな属性(intとかStringとか）で持つより、きちんと値オブジェクトにするほうがいいと思います。
Entity全体でなく、識別子だけ他のモデルに参照されることがよくあり、そのときに識別子がプリミティブな値だと関連がつかなくなってしまうためです。
NavigationBarの「戻る」ボタンの文言を数行で一括設定する

## 前提

　NavigationBarの戻るボタンに設定されている文言、デフォルトだと単に前の画面のタイトルの文言を表示したり、文字数によっては省略されて勝手に"戻る"に設定されたりします。
　画面によって見た目がバラつくので、いっそ全て"戻る"や"Back"で一括設定したい場合は多いです。
　ただ、そのために全てのViewControllerでBaseViewControllerを継承して云々するようなことはとても面倒です。
　そこで楽に設定する方法がないか調べました。

## コード

　UINavigationControllerのExtensionから一括設定できます。
　**以下のコードをプロジェクト中のどこかに書くだけで、全てのNavigationController以下のViewControllerで有無を言わさず戻るボタンの文言が上書きされます。**

```
extension UINavigationController {
    override open func viewDidLayoutSubviews() {
        let backButton = UIBarButtonItem()
        backButton.title = "もどる"
        self.navigationBar.topItem?.backBarButtonItem = backButton
    }
}
```

## 画像

![スクリーンショット 2017-10-03 2.59.46.png](https://qiita-image-store.s3.amazonaws.com/0/195638/b9c37ef6-7eaf-f081-93ba-614ec53b99a2.png)
![スクリーンショット 2017-10-03 3.00.02.png](https://qiita-image-store.s3.amazonaws.com/0/195638/ab0a0c85-6d16-6675-3f16-bfa47e5b8c29.png)
![スクリーンショット 2017-10-03 3.00.12.png](https://qiita-image-store.s3.amazonaws.com/0/195638/e0e37b2d-eaec-7f07-c9a8-f5d99064dd34.png)

- 補足1

　`viewWillLayoutSubviews`のoverrideではNavigationControllerのRootVCでしか文言設定が適用されない場合がありました。

- 補足2

　詳しくは失念しましたが、上記のようなコードはAppleのガイドラインから逸脱しているのではないか、という指摘がコードレビューでありました（ただ明確に否定する根拠もなかったということです）。使用される際は自己責任で。。
ImportError: attempted relative import with no known parent packageの解決方法

[TensorFlow Neural Machine Translation (seq2seq) Tutorial](https://github.com/tensorflow/nmt)を試してる時に下記エラーに遭遇

```py:python36の場合
(py36) C:\tf\nmt> python -m nmt.nmt --xxxxxx
Traceback (most recent call last):
  File "C:\anaconda3\envs\tf\lib\runpy.py", line 183, in _run_module_as_main
    mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
  File "C:\anaconda3\envs\tf\lib\runpy.py", line 109, in _get_module_details
    __import__(pkg_name)
  File "C:\tf\nmt\nmt\nmt.py", line 28, in <module>
    from . import inference
ImportError: attempted relative import with no known parent package
```

```py:python35の場合
(py35) C:\tf\nmt> python -m nmt.nmt --xxxxxx
Traceback (most recent call last):
  File "C:\anaconda3\envs\tf35\lib\runpy.py", line 183, in _run_module_as_main
    mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
  File "C:\anaconda3\envs\tf35\lib\runpy.py", line 109, in _get_module_details
    __import__(pkg_name)
  File "C:\tf\nmt\nmt\nmt.py", line 28, in <module>
    from . import inference
SystemError: Parent module '' not loaded, cannot perform relative import
```



#原因
nmt.pyがあるディレクトリ(C:¥tf¥nmt)で下記コマンドを実行していたことが原因

```
tf
├── nmt(ココ)
│   ├── nmt.py
│   ├── inference.py
│   └── train.py
```

```
C:¥tf¥nmt> python -m nmt.nmt --xxxxx
```



#解決方法
nmt.pyがあるディレクトリの一つ上(C:¥tf)に移動し、下記コマンドを実行する

```
tf(ココ)
├── nmt
│   ├── nmt.py
│   ├── inference.py
│   └── train.py
```

```
C:¥tf¥nmt> cd ..
C:¥tf> python -m nmt.nmt --xxxxx
```

オチ自体はとてもしょうもないのですが、割と長時間ハマった＆[Issue](https://github.com/tensorflow/nmt/issues/39)で困ってる人が結構いたので記事にしました。
pugで書くRiotの開発環境メモ

# はじめに
Riotが動くことが目的なので，それ以外の設定は手抜きです．
特にスタイルなんてほぼ書いていないので，そこら辺は個人の好みでカスタマイズしてください．
Riotのバージョンは`3.7.3`（新しめなはず）

# ソース
https://github.com/pvcresin/testRiot

1. `git clone`したら`yarn`して`yarn watch`してください．
1. `live-server`が起動するので，コードをいじって保存すれば自動でコンパイルし，ブラウザがリロードされます．

# 構成
```
root
  ├ dist
  │  ├ js
  │  │  └ index.js
  │  └ index.html
  └ src
    　├ js
  　  │  └ index.js
  　  ├ pug
  　  │　└ index.pug
  　  └ tag
　   　  └ app.tag
```

いじるのは`src`フォルダの中にある`index.js`, `index.pug`, `app.tag`の3つのファイルになります．

# npm scriptでやってること
- pugは`pug-cli`でhtmlに自動変換．
- tagは`tag-pug-loader`を通した後，`babel-preset-es2015-riot`によってjsに自動変換．
- jsも同じく`babel-preset-es2015-riot`で自動変換．
- ファイルに変更があったらブラウザをリロード（`live-server`）

# 動作確認
ボタンを押すと，タイムスタンプ的な時刻が羅列されるようなコードになっています．
そのままでもRiotのクリック検知やeachなどの文法の最低限の把握には使えるかもしれない．（？）

# コードと軽い説明
pugでbodyの中に書いた`app`タグに`app.tag`をマウントしています．
マウントは`index.js`の`riot.mount('app')`の部分で行っています．

```jade:index.pug
doctype html
html(lang="ja")
	head
		meta(charset="UTF-8")
		meta(name="viewport", content="width=device-width, initial-scale=1.0")
		meta(http-equiv="X-UA-Compatible", content="ie=edge")
		title Riot
	body
		app
		script(src="js/index.js")

```
```index.js
import app from '../tag/app'

console.log('index.js')

riot.mount('app')
```
```js:app.tag
app
	div
		h1 app.tag
		button(click='{clicked}') count: {this.list.length}
		ul
			li(each='{item, index in list}') {index}: {item}

	style.
		div {
			background: cyan;
		}
		button {
			font-size: 1.5rem;
		}

	script.
		this.list = []

		this.on('mount', () => {
			console.log('app.tag mounted', opts)
		})

		clicked(e) {
			this.list.push(new Date().toString())
		}

```
PHPフレームワーク「Slim」でTwitter APIから取得したデータをMackerelのメトリックに登録してみる


## 概要
[前回の記事](https://qiita.com/juve_534/items/2d03b1ffe890860bd4b1)でTwitter APIを利用する所まで来ました。今回はチームにMackerelの調査結果を報告するため、SlimからTwitter APIの検索を行い、実行結果をMackerelのメトリックとして登録します。

## Slimにmackerel-client-phpを導入
PHPでMackerelのAPIを操作するためのライブラリとして「[mackerel-client-php](https://github.com/ariarijp/mackerel-client-php)」というものがあります。
今回はこちらのライブラリを使って操作を行っていきます。

まずは、Slimにmackerel-client-phpを導入します。
composerでの導入が可能なので、Slimのディレクトリに入って下記コマンドを実行します。

```
composer require ariarijp/mackerel-client:dev-master
```

インストール後はvendor配下にライブラリが配置されます。

## mackerel-client-phpの読み込み設定
mackerel-client-phpの導入が終わったので、今度は設定を行っていきます。今回は汎用的に使うことを意識して、setttings.phpに設定を記載します。

```php:src/setttings.php
// mackerel設定
'mackerel' => [
    'mackerel_api_key' => '',
],
```
次に、オブジェクト生成を行います。

```php:src/dependencies.php
// mackerelクライアント
$container['mackerel'] = function ($c) {
    $settings = $c->get('settings')['mackerel'];
    $client = new \Mackerel\Client([
        'mackerel_api_key' => $settings['mackerel_api_key'],
    ]);
    return $client;
};
```

これで使う準備は整ったので、APIを使って操作を行っていきます。

## Twitterの検索結果をMackerelに登録する
### Twitter APIで検索
準備が整ったらroutes.phpにコードを記載していきます。
今回は特定ワードで検索するルーティングとコードを記載します。

```php:src/routes.php
// TwitterAPIを実行
$params = [
    'q'     => '検索ワード',
    'count' => 100,
];
$tweets = $this->twitter->get('search/tweets', $params);
```

これで「検索ワード」が含まれるツイートが100件取得できます。

### Mackerelのメトリックに追加
次は取得した結果をMackerelのメトリックに追加します。

```php:src/routes.php
// Mackerelにカウント数を登録
$host = $this->mackerel->getHost('HOST_ID');
$metric = [
    'hostId' => $host->id,
    'time' => time(),
    'name' => 'metric.twitter.検索ワード',
    'value' => $tweets->search_metadata->count,
];
$this->mackerel->postMetrics([$metric]);
```
これでroutes.phpで設定したURLにアクセスするとMackerelのメトリックにTwitterの検索結果が登録されます。

## まとめ
Twitter APIの実行結果をMackerelにメトリックとして登録しました。今回のCodeは常に100となってしまうため、条件を設定して、一度集計したデータを引っ掛けないようにすると、適切なメトリックとなると思います。
今回作ったCodeは[こちら](https://github.com/juve534/PHPFramework/tree/feature/php_for_mackerel/slim-skeleton)に上げてみました。
参考までに。

この記事の内容は以上になります。
最後まで読んで頂きありがとうございました。
FileMaker の「レコード ID」の取り扱いは難しい

# 「レコード ID」の公式リファレンスの定義
「レコード ID」とは何か。「レコード ID」を取得する関数である`Get (レコード ID)`について、[公式リファレンス](https://fmhelp.filemaker.com/help/16/fmp/ja/index.html#page/FMP_Help%2Fget-recordid.html%23)には以下のような記載があります。

> 返されたこの番号は、レコードの作成時に FileMaker Pro によって生成された 10 進法の値 (整数) です。この値が変更されることはありません。

# すなわち「主キー」である
上記の定義より、「レコード ID」はいわゆる「主キー」であることが分かります。FileMaker では「主キー」が存在しなくてもデータベースを運用できます（ように見える）が、主キーに相当する部分が裏側では用意されていることになります[^1]。

# しかし「レコード ID」の取り扱いは難しい
しかしながら、この「レコード ID」はなかなかにその取り扱いが難しいです。その理由は、**「レコード ID」はフィールドとして存在していない**からです。

このため、「レコード ID」は範囲を指定して検索することができません[^2]。また、リレーションシップに組み込むこともできません。

# ではどう扱えばいいか
となるとこの「レコード ID」はどう利用すればよいのでしょうか。

だいたい感づいているとは思いますが、そう、**「レコード ID」がそのまま入るフィールドを作ればよい**のです。そしてそれをテーブルの主キーにしてしまえばいいでしょう。「レコード ID」は未来永劫ユニークで、かつ NOT NULL であることが保証されていて、さらに「意味を持たない」「数値」を取るため、主キーとしてはもってこいです。

予め用意されていることが確定しているので、「サロゲートキーの要・不要議論」などに振り回されること無く「利用してやれ」の一択でしょう。

# 補足

1. テーブルの主キーを誤って設定してしまった場合（当初設定した主キーが、主キーの要件を満たさなくなりそうな場合）にも、「レコード ID」の値が入るフィールドを作ってあげればそこで主キーの要件が満たされ、助かることでしょう[^3]。

1. 同種の値に「[レコード編集回数](https://fmhelp.filemaker.com/help/16/fmp/ja/index.html#page/FMP_Help%2Fget-recordmodificationcount.html%23)」というのもあり、こちらの値もフィールドとして外に出してあげてよいかと思います[^4]。

[^1]: そうでないとレコードの一意性が保証されなくなってしまいます
[^2]: 一つ一つ値をを決め打ちして検索することはできる
[^3]: 「最後の砦」になり得る
[^4]: 使いどころが難しいですが