OmniAICreator/Qiita-1.07M huggingface dataset:
WindowsにGitをインストールしてAtomから使う

# Gitインストール
Gitクライアントには[Git for Windows](https://git-for-windows.github.io/)をインストールしました。
このページの説明が詳しいです。https://opcdiary.net/?page_id=27065

筆者はインストール時に下記項目だけデフォルトから変更しました。

- Line Encodingだけ一番上から一番下(checkout, commit両方asis)に変更
- terminal emulatorを"mintty"から"default console"に変更。

アカウントを作っておかないとコミットできないので、PowerShellなどで最低限の設定をします。

```
git config --global user.email "<mail address>"
git config --global user.name "<name>"
```

インストールしたらすでにパスが通っているので、コマンドプロンプトやPowerShellから利用できます。

# Atomの設定
特に設定なしで使用できるようになっています。
PowerShellではgitの出力がUTF-8で文字化けしてしまいますが、Atomのgit plus等を使えばUTF-8のままでも文字化けせずにdiffなどを確認できます。

ただし、Atomを起動中にGit For Windowsをインストールしてしまうとパスの更新が反映されないので、Atomの再起動が必要です。
FAIL.TXT "The interface firmware FAILED to reset/halt the target MCU"の対策

# 事象

.binファイルをmbedドライブにコピーしても、正常にプログラムが入らない模様。
FAIL.TXTが生成されて、その中身をみると
**The interface firmware FAILED to reset/halt the target MCU**
と書かれている。

# 原因

Windows 10が、mbedドライブに隠しファイルを作成しているのが作用している。

# 対策

ローカルグループポリシーエディター（gpedit.msc）で、
コンピュータの構成 > 管理用テンプレート > Windowsコンポーネント > 検索
にある、
リムーバブルドライブ上の場所のライブラリへの追加を許可しない
を有効にする。

![20170708B.png](https://qiita-image-store.s3.amazonaws.com/0/109634/42c292fb-b9ce-2c14-86b8-c82ae3b833f3.png)


# 参考

[Prevent System Volume Information folder creation on USB in Windows 10 / 8.1](http://www.thewindowsclub.com/prevent-system-volume-information-folder-usb)
Python 開発環境構築 on macOS

すいません、ほぼ自分向けのメモになります。

# 参考
- http://qiita.com/spyc/items/73d1295f8b3dde3b49ca
- http://beachside.hatenablog.com/entry/2016/08/17/004500

# 手順
## Homebrew
```:bash
brew doctor
brew update
```

## Xcode
```:bash
xcode-select --install
```

## pyenv

インストール

```:bash
brew install pyenv
pyenv install 3.6.1
pyenv global 3.6.1
```

パス設定

```:bash
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

pipインストール

`easy_install pip`

## Visual Studio Code
環境設定に以下を追加

```:json
"python.venvPath": "~/.pyenv"
```
雪豹にRTLSDR Scannerをインストール

Mac OS Xの10.6にRTLSDR Scannerをインストールしてみた。

platofomioでpython2.7はインストール済みだったので、とりあえず本体をインストール。

```
$ pip install rtlsdr-scanner
```

依存でいろいろ入ります。

後はwxpythonのパッケージをwxPython3.0-osx-3.0.2.0-cocoa-py2.7.dmgからインストール。

これだけだとlibrtlsdrとlibusbが無いので、librtlsdrを手動で作ります。portsは使わない主義です。FreeBSDでconfigure作って通したファイルをコピーして、libusb.hをincludeにコピーするとsrc/.libs/の下に.oができてlibのリンクでこけます。

```
$ sudo cp /hoge/hoge/libusb.dylib /usr/local/lib/
$ sudo install_name_tool -id /usr/local/lib/libusb.dylib /usr/local/lib/libusb.dylib
$ cd src/.libs
$ gcc -L/usr/local/lib -lusb -dynamiclib -o  librtlsdr.dylib *.o
$ sudo cp librtlsdr.dylib /usr/local/lib/
```

RTLなドングルにつないで以下を実行。

```
$ python -m rtlsdr_scanner
```

ウインドウが表示されます。SSGを接続して90MHzにして、ScanメニューからStartを実行。

![スクリーンショット（2017-07-08 10.02.32）.png](https://qiita-image-store.s3.amazonaws.com/0/104066/e87e0d3b-474f-e4b5-9335-12b7db43814a.png)

昔スペアは数百万とかしてたと思うのですが、ハードオフで315円のドングルで実現できてしまうって、ほんとすごい時代ですよね。

あまり無線関係詳しくないので勉強します。

Back to Snow Leopard.
ローカルネットワーク内マシンのMACアドレスからSSHログイン

投稿直後に致命的なミスを見つけたので再投稿です
# 目的
RaspberryPiのような頻繁に持ち運んだりOS吹っ飛ばしたりするようなマシンのIPアドレスを固定するのも面倒なので、MACアドレスから動的に割り振られたipアドレスを参照してsshログインします。
# やること
- ```arp```でログインしたいマシンのipアドレスを調べる。
- ```gawk```でarpの標準出力からipアドレス部分を切り出す。ユーザ名を指定する場合ここで指定する
- 切り出したipアドレスに```ssh```でログインする。  
~~これをone-linerでやっていきます。  
```bash
arp |grep "mac_address"|gawk 'gensub(/(\s*?)(\S+)/,"\2","") {print "user@" $1}'|xargs ssh -t -t
```~~
 
長いのでaliasに登録するとすっきりします。結局面倒なので本末転倒感が
クォーテーションのエスケープ(特にgawk)を忘れずに。
### 追記
上の書き方だとログインまではできますがリモートホストでのコマンド実行ができません。
BSD版```xargs```であれば```-o```オプションを付加するだけで対応できますが、GNU版の場合は以下のようになります。
```
arp|grep "mac_address"|gawk 'gensub(/(\s*?)(\S+)/,"\2","") {print "user@" $1}'|xargs sh -c 'ssh "$@" </dev/tty' ssh
```


## Bash on Windows環境の場合(Creators Updateでは要検証)
linuxの```arp```コマンドが使えないためWindowsの```arp```を使用します。
[cbwin](https://github.com/xilun/cbwin)([wsl-terminal](https://github.com/goreliu/wsl-terminal)に同梱)を使用すれば```wcmd COMMAND```でWindowsのコマンドをbashのterminal上から使えます。
今回の場合、先頭の```arp```を```wcmd|arp -a```に書き換えればokです
```bash
wcmd arp -a|grep "mac_address"|gawk 'gensub(/(\s*?)(\S+)/,"\2","") {print "user@" $1}'|xargs sh -c 'ssh "$@" </dev/tty' ssh
```

## 注意点  
~~```xargs``` で```ssh```に引数を渡して実行する際に```-t```オプションが2つ必要になります。
スクリプト内で```ssh```を実行しているため、```-t```オプションが付いていない場合
```
Pseudo-terminal will not be allocated because stdin is not a terminal.  
```
とwarningが出てリモートホストのシェルには入れません。
```-t```オプションが2つ必要になる理由はわからなかったです。~~
追記を参照してください。


# 参考文献
- [正規表現にマッチした部分だけを取り出す - 日本 GNU AWK ユーザー会 0.2](http://d.hatena.ne.jp/Rocco/20071120/p6)
- [AWK Users JP :: gawk で後方参照](http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_002)
- [ssh を用いてリモートでスクリプトを実行 : 音のない声](http://takat.exblog.jp/12216326/)
- [Bash on Ubuntu on Windows + オールインワンmintty](http://qiita.com/shiena/items/b8036514c217000a221e)  
追記
- [GNU版, BSD版 xargsの挙動の違い - syohex’s diary](http://syohex.hatenablog.com/entry/20140702/1404250291)
Unity Shader Hightmap from Alpha channel

影を書き込んだテクスチャ＋アルファチャンネルでハイトマップのような事をしたかったのでやってみた。
スケールにより、_Pow /= scale^2 する必要がある。
![Heightmap.jpg](https://qiita-image-store.s3.amazonaws.com/0/162132/69676220-2233-8b21-0ad2-23db40b5e059.jpeg)


    Shader "Unlit/HeightAlpha"
    {
	    Properties
	    {
            _MainTex("Texture", 2D) = "white" {}
            _Pow ("Height", Range(0,0.1)) = 0.05
	    }
	    SubShader
	    {
		    Tags { "RenderType"="Opaque" }
		    LOD 100

		    Pass
		    {
			    CGPROGRAM
			    #pragma vertex vert
			    #pragma fragment frag
			    #pragma multi_compile_fog
			
			    #include "UnityCG.cginc"

			    struct appdata
			    {
				    float4 pos : POSITION;
                    float2 uv : TEXCOORD0;
                    float3 normal : NORMAL;
                    float4 tan : TANGENT;
			    };

			    struct v2f
			    {
				    float2 uv : TEXCOORD0;
                    float2 hightVec : TEXCOORD1;
				    UNITY_FOG_COORDS(1)
				    float4 vertex : SV_POSITION;
			    };

			    sampler2D _MainTex;
			    float4 _MainTex_ST;
			    float _Pow;

			    v2f vert (appdata v)
			    {
				    v2f o;
				    o.vertex = UnityObjectToClipPos(v.pos);
                    o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                    float2 a = (UnityObjectToClipPos(v.pos + v.normal).xy - o.vertex.xy);
                    float2 b = (UnityObjectToClipPos(v.pos + v.tan.xyz).xy - o.vertex.xy);
                    o.hightVec = float2((a.y * -b.y - a.x * b.x), a.y * b.x - a.x * b.y) * _Pow;
				    UNITY_TRANSFER_FOG(o,o.vertex);
				    return o;
			    }
			
			    fixed4 frag (v2f i) : SV_Target
			    {
                    fixed height = tex2D(_MainTex, i.uv).a;
				    fixed4 col = tex2D(_MainTex, i.uv + i.hightVec * height);
				    UNITY_APPLY_FOG(i.fogCoord, col);
				    return col;
			    }
			    ENDCG
		    }
	    }
    }
さくらVPS v4 -VPSをはじめてつかってみる②

無事にsshでログインできたので、
以下の記事を参考に一般ユーザーを作ったり、
rootユーザーのログイン権限を無くしたり。

http://knowledge.sakura.ad.jp/beginner/2751/


参考記事のおかげでさくっとはできたけど、
vim(VPSに標準インストールされているエディタ。初めて知った。。。けど、きっと常識)の
扱いに苦戦しました。
yum でコマンド名からインストール可能なパッケージを探す (CentOS)

# yum でコマンド名からインストール可能なパッケージを探す (CentOS)

たまーにさわると、すっかり忘れている私向け備忘録。

たとえば、CentOS 7 を minimal インストールしたら `locate` が入っていない場合に locate が入っているパッケージを探す。

## provides

```shell-session
[root@localhost ~]# yum provides locate
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
mlocate-0.26-6.el7.x86_64 : An utility for finding files by name
リポジトリー        : base
一致          :
ファイル名    : /usr/bin/locate
```


## search all

```shell-session
[root@localhost ~]# yum search all locate
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
===================================================== 一致: locate =====================================================
mlocate.x86_64 : An utility for finding files by name
booth.x86_64 : Ticket Manager for Multi-site Clusters
ctags.x86_64 : A C programming language indexing and/or cross-reference tool
dnsmasq.x86_64 : A lightweight DHCP/caching DNS server
findutils.x86_64 : The GNU versions of find utilities (find and xargs)
fontconfig.i686 : Font configuration and customization library
fontconfig.x86_64 : Font configuration and customization library
ledmon.x86_64 : Enclosure LED Utilities
libXcursor.i686 : Cursor management library
libXcursor.x86_64 : Cursor management library
libguestfs-tools.noarch : System administration tools for virtual machines
memkind.x86_64 : User Extensible Heap Manager
perl-Email-Address.noarch : RFC 2822 Address Parsing and Creation
perl-File-ShareDir.noarch : Locate per-dist and per-module shared files
perl-local-lib.noarch : Create and use a local lib/ for perl modules
postgresql.i686 : PostgreSQL client programs
postgresql.x86_64 : PostgreSQL client programs
targetd.noarch : Service to make storage remotely configurable
which.x86_64 : Displays where a particular program in your path is located
wvdial.x86_64 : A heuristic autodialer for PPP connections
xinetd.x86_64 : A secure replacement for inetd
```

インストールする

```
[root@localhost ~]# yum install mlocate
```

## 確認した環境

OS: Linux localhost.localdomain 3.10.0-514.21.2.el7.x86_64 #1 SMP Tue Jun 20 12:24:47 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux (CentOS 7)
さくらVPS v4 -VPSをはじめてつかってみる①

サーバの勉強をしよう、、、ということで、VPSサーバをはじめて契約してみた。
（レンタルサーバとftpソフトしか使った事がないレベルのweb制作者です）

このへんの記事を参考に契約を済ませ、
http://knowledge.sakura.ad.jp/beginner/2978/
早速ターミナルで[ssh root@IPアドレス]を打ち込んでみたところ、
[port 22:Connection refused]の表記。
サーバを再起動したところ、[Operation timed out]。うーん？

ネットの記事を参考に、さくらVPSの管理画面（コントロールパネル）からコンソールを確認したところ
[kernel panic]の表示(サーバ側の知見はほぼないけど、よくないやつだという事は何となく察する)


===============================================
[解決策]

①.OSの再インストールCENT OS6
>とりあえず、[kernel panic]の表示は消えて、OSが正常に動いている状態となった様子。
しかし、まだsshでログインしようとしても[port 22:Connection refused]と返ってきてしまう。


②ちょっと待ってみた
>VPSは起動が遅い？という記事を見つけ（きっと常識なんだと思われ）
９０分ほど待ってみて、再度sshでログインしたらあっさりと成功。
多分、サーバの再起動とか再インストールしなくても時間をおけば上手くログインできたんだと思うw
Xcodeカスタムフォント

カスタムフォントを使う時に間違ってしまうのでメモ。

##コードで利用する名前の確認方法

Font Book を起動して、フォントを選んで「i」を選択

![ss01.png](https://qiita-image-store.s3.amazonaws.com/0/30834/9fd70612-37ab-c9b7-a6c4-f25edbdc5b6e.png)


フォントの情報が表示される

* PostScript名
* 正式名称
* ファミリー
* スタイル  etc.

「正式名称」ではなく「 **PostScript名** 」を確認して

```swift
UIFont.init(name: "PostScript名", size: 12)
```

注意点として、UIFontのinitはオプショナル

```
init?(name fontName: String, size fontSize: CGFloat)
```

なので間違って「正式名称」や「ファミリー」を指定するとnilになるので「!」してるとクラッシュします。
VSCode vue拡張子 htmlとして関連付ける

他の人も書かれていると思いますが、デフォルト設定外の
拡張子（今回ではvue)を関連付ける方法をまとめました。
（毎回ググっているので、メモ代わりです）

![20170622163552.png](https://qiita-image-store.s3.amazonaws.com/0/188508/577a475a-c065-9d1c-d86f-c0e1eddd7f11.png)　⇒　![20170622163543.png](https://qiita-image-store.s3.amazonaws.com/0/188508/0901c26e-4ca6-c691-d5b1-a69b6a03ae20.png)

こうしたい

ファイル(F) ⇒　基本設定(P) ⇒　設定　をクリック。
![20170622163008.png](https://qiita-image-store.s3.amazonaws.com/0/188508/7e9c9e6c-499e-320e-8322-aa1efb69612d.png)


そうするとsetting.jsonというファイルが勝手に作られます。
![20170622163411.png](https://qiita-image-store.s3.amazonaws.com/0/188508/fdb77239-1897-fe8d-3479-56c166262fe2.png)

以下の様に修正する事で関連付けがされます。

```
{
    "files.associations": {
        "*.vue":"html"
    }
}
```
[Vim] ホームポジションで頑張りたい人へ

同僚が知らなくてびっくりしたのでここに記す。

いつでも

|キー|効果|
|:--|:--|
|C-[|Esc|

インサートモード

|キー|効果|
|:--|:--|
|C-h|カーソルの左にある一文字を削除|
|C-w|カーソルの左にある単語を削除|
|C-m, C-j|改行|

だいたいこんな感じ。
ちょっと C-[ は変態的かもしれないが慣れたら慣れる。
C-i で Tab など他にもあると思うけど、私が活用してるのはこれくらい。
コマンドラインでも同じ挙動をするのでオススメ。
Equatableとは？(swift) ~ object同士を比較できるようにしよう〜

## 1. Equatableとは？

Equal (=) イコール
Equatable イコールできるようにする、つまり比較可能です。

つまり **今まで比較できなかったObject同士**を比較できるようにするものです。大雑把にまとめると**自分で作ったカスタムクラス**などです。

## 2. Equatableじゃない例

Teacherクラスを作ってみました。変数はnameただ一つです。

```Teacher.swift
class Teacher{
    var name:String
    
    init(name: String) {
        self.name = name
    }
}
```
4人先生を作って名前を与えました。

```
var teachers:[Teacher] = []

var one = Teacher(name:"AJ")
var two = Teacher(name: "Bob")
var three = Teacher(name: "Amy")
var four = Teacher(name: "John")

teachers.append(one)
teachers.append(two)
teachers.append(three)
teachers.append(four)

```

name同士は比較できる! (String同士を比較しているため)

```
if one.name == two.name{
    print("match!")
}
```

でもクラス同士を比較するとエラーが起きる!

```
if one == two{
    print("same!")
}

if teachers[0] == teachers[1]{
}
```
![Screen Shot 2017-07-07 at 2.00.20 PM.png](https://qiita-image-store.s3.amazonaws.com/0/158705/0fe3e96a-31a7-234b-49a5-312fe5b738c9.png)

他にも Array.index(of: <Any>)が使えない！(これが一番困った。)
teachersの配列はTeacher構成されるため、比較できない。

```
if let index = teachers.index(of: teachers.name){
}
```

## 3. Equatableにしてみる

1. まずTeacherクラスに:Equtableをつける必要がある。
2. Teacherクラス内にEquatableメソッドを追加

```Teacher.swift
class Teacher:Equatable{
    var name:String

    init(name: String) {
        self.name = name
    }

　　func ==(lhs: Teacher, rhs: Teacher) -> Bool{
    return lhs.name == rhs.name
　　}
}
```

比較メソッドの中の、lhs は 左側(left)のobject, rhs は 右側(right)のobjectを意味する。
比較判定方法を名前でしている。比較してみるとエラーが起きないはず！

```
print(one == two)
//false

```
※ 同じ名前じゃないため、falseを返している。

## 3. 複数変数でEquatableしてみる

```Teacher.swift
class Teacher: Equatable{
    var name:String
    var age:Int
   
    init(name: String, age:Int) {
        self.name = name
        self.age = age
    }

    static func ==(lhs: Teacher, rhs: Teacher) -> Bool{
        return lhs.name == rhs.name && lhs.age == rhs.age
    }
}
```
こうすると、nameとageが同じかどうかが比較可能になりました。

コードはこちら！
https://github.com/Saayaman/swift/tree/master/Practices/Equatable

参考:
http://nshipster.com/swift-comparison-protocols/
USキーボードFAQ（USキーボードの勧め）

# USキーボードのススメ 理由
1.最近のOSはUS配列でも日本語入力に難なく対応してる
2.物理的に購入を考えた場合、選択肢が広がる
3.それなりに品質の良い国内メーカーのキーボードは数万円するのが、海外では数千円で買えたりする
4.そもそも英語基準で設計されているので疲れにくいはず、日本語配列は中心線がずれていたりする

## ￥ってどうやって打つの？
```
alt + Y key
```

## "\" backslash バックスラッシュ は？
```
alt + ¥ key
```

## 一番上の7、8、9、0ええええとその隣のキーが覚えにくい
```
!@#$% &*() _+ (+shift)
12345 7890 -=
```
てな感じで覚えるしかない慣れるまで↑を付箋(stickies)に書いてディスプレイに貼る

## 右側の p , l , m キーあたりの記号があやふや
```
P{}| (+shift)
p[]¥

L:" (+shift)
l;'

M<>? (+shift)
m,./
```

## US配列のおすすめキーボード
![s-l500.jpg](https://qiita-image-store.s3.amazonaws.com/0/191161/35f67711-429f-bf1a-25a1-2d4767e7fbd6.jpeg)
最近買ったDrevo 71
amazonで6000円くらい
青軸 http://amzn.to/2tDYk6r
赤軸 http://amzn.to/2vXoqiY
茶軸 http://amzn.to/2uPXgKA
黒軸 http://amzn.to/2eLEFbs
キータッチが上から順番に重くなる、赤軸が人気だそうだ
LEDでキートップが光るがOFFにしておけば
HHKBの墨シリーズのような刻印がうすーく見えるタイプと
同じ見た目になるので気に入ってる

#### end of file
SORACOM Air for LoRaWAN は違法？


---------------------------

**2017-07-11 追記**
SORACOM玉川さんより「登録済み」との[コメント](http://qiita.com/miminashi/items/124c804c48d5f0408054#comment-911da2ad2ece348b76cb)がありました。

---------------------------

https://anond.hatelabo.jp/20170707132857

> 最後になりますが、LoRaWANをやっている某事業者はいかがですか。

要約するとLoRaWANゲートウェイを第3者に使わせたら電気通信役務に該当するから届け出が必要なんじゃないのか、という話なんですが、10年くらい前にFONが日本上陸したときにさんざん似たような議論があった気がするのでちょっと調べてみたら、総務省が以下のような文書を公開しているのを見つけた。

[無線LANビジネスガイドライン 第2版](http://www.soumu.go.jp/main_content/000444788.pdf)

この文書によると、設置したWiFiを第三者に使わせることについては、

> 無線LANアクセスポイントを設置して、利用者に公衆無線LANサービスを事業として提供する場合は、原則として事業法第9条の登録又は同法第16条第1項の届出が必要となる

としながらも、以下のようなケースを届け出不要なケースとしている。

1. 本来の業務に付随して公衆無線LANサービスを提供する場合
2. 対価を得ずに公衆無線LANサービスを提供する場合
3. 無線LANルーターを購入した者同士が相互に無料で無線LANを利用できるコミュニティを形成し、一のコミュニティメンバーが、自ら所有するルーターのアクセスポイント機能を他のコミュニティメンバーに開放する場合

それぞれ具体的なケースが挙げられているので、詳しくは本文を参照してみてください。
3なんかは完全にFONのことですね。

The Things Network はFONと同じような形態（特定小電力無線かつ無償で他人に基地局を貸し出す）なので、FONと同じような扱いになるんじゃないかという気もするけど、SORACOM Air for LoRaWAN はしっかり利用料をとってるので同じとはいかないかもしれないですね。
（もちろんFONがOKだからTTNもOKとなるとは限らないけど）

いずれにしても電気通信事業者にならずに使えたほうが嬉しいに決まっているので、LPWAを事業としてやっていく気持ちになっている各社におかれましてはロビイング活動を頑張って欲しいところです。（署名くらいだったら協力できます）
RubyOnRailsOnWondowsでハマったこと

# RubyOnRailsOnWondowsでハマったこと

## 概要


WEBアプリケーションフレームワークの"Rails"をWindowsのローカルに導入する際、
盛大につまづきまくったのでメモを残しておきます。
どうしてもRailsをWindows上で使いたい人は参考にしてみても良いかもしれません。

なんだかんだ言ってVagrantとかの仮想環境って偉大だなと思いました。（Vagrantもあれはあれで癖がありますが）

Windowsに導入時の"ぐぬぬ"が、世界から少しでも軽減されることを祈っています。

### 環境

- OS:Windows10 64Bit
- CPU:Corei7-4712MQ
- RAM:8GB

### 今回インストールしたもの

- Ruby2.4.1（gem 2.6.1）
- DevKit
- rails 5.1.2
- sqlite3

## いざ導入

### Ruby
![rubyicon.png](https://qiita-image-store.s3.amazonaws.com/0/179198/9cc4c9f2-449e-6068-9280-80179fa39297.png)

まずはRubyが無いとどうもこうもいきません。

[ここ](https://rubyinstaller.org/)でRubyInstallerをダウンロードします。
もちろんBit数はお使いの環境に合わせてくださいね。
にっちもさっちもいかなくなるので。

また、インストールしただけではPATHが通りません。
コントロールパネル->システム->システムの詳細設定->環境変数からPATHの編集をしましょう。

### gem
![rubyems.png](https://qiita-image-store.s3.amazonaws.com/0/179198/39cd1728-a263-49f1-5411-e6f413a7e1d8.png)

gem自体はRubyに標準でついているのでPATHを通せば普通に使えます。
が、ここで

```
C:\>gem install rails 
```
とかやると"ぐぬぬ"となります。

### DevKit

デベロッパーキットの導入が必要です。

また[ここ](https://rubyinstaller.org/)にアクセスしダウンロードタブをクリック、
DevKit-mingw32- または DevKit-mingw64- をダウンロードします。

これは実行ファイルの見た目をしてますが自己解凍ファイルです。
"DevKit"という名前のディレクトリを作って実行ファイルをダブルクリック。
保存指定先を聞かれるので先程作ったディレクトリを指定します。

**次に"DevKit"を"Ruby24-x64"の中に保存します。自分の環境ではそうしなければ"ぐぬぬ"となりました。**

ここまで来たら
```C:Ruby24-x64\DevKit>ruby dk.rb init```
```C:Ruby24-x64\DevKit>ruby dk.rb install```

とかやればインストール完了です。

無事にインストール出来れば諸々のアップデートとかを先にやっておきます。

```
C:\> gem install bundler
```

バンドルのインストールもやっときましょう。


### やっとRails


やっとここまで来ました。
MACとかLinuxであればたぶん１０分もあれば足りるのでしょうが、
舐めてかかったせいか５時間くらいかかりました。

```
C:\>gem install rails 
```
コマンドを叩きます。

すると

```
C:\>rails -v
rails 5.1.2
```

ででーん！
しかしまだ終わりではありませんでした。

### sqlite3

プロジェクトからデータベースの設定をしようと思い

```
C:\>rails db
```
を打つとコマンドラインにはこんな文字が

```
 > Couldn't find database client: sqlite3.exe. Check your PATH and try again. 
```

ぐぬぬ。

Gemfileの設定もしたしエラー無くbundle installも通ったのに？

長くなってきたので端折りますが、結局コマンドラインアプリのsqlite3.exeを使える状態しておかなければならないようです。

[ここ](http://www.sqlite.org/download.html)から```sqlite-tools-win32-x86-3190300.zip(1.56 MiB)```を落としてきて適当な場所に解凍します。
そこにPATHを通せば完成です！

## まとめ

最初の方は思い出しながら書いたので、もしかすると抜けている点があるかもしれません。
まさかこんなに工程数が多いなんて夢にも思いませんでしたので、メモなんて残してないですし。
なんかもっといろいろゴチャゴチャさわった気もする。

とりあえずMacBookが欲しい！
この煩わしいレジストリにさよならを

※ Windows 10 Fall Creators Update (1709) で修正された模様。 2017/10/24

Windows 10 Creators Update で顕著になった
Dism /online /Cleanup-Image /RestoreHealth で 0x800f0906 になる
エラーを回避する為のレジストリを削除するバッチを作りました。
バッチをコピペして管理者として実行して下さい。
削除したレジストリを戻す気が無いので、バックアップは手動で行って下さい。

このバッチで使用している「regini.exe」が応答ファイルを必要とするので
書き込みが出来るフォルダに置いて使用して下さい。

SubinAcl や SetAcl の様な外部ツールを使っていないので
このバッチだけで処理が完了します。

2017/7/7 の時点で 2017/6/28 に 配信された KB4022716 を適用しても
エラーが出てクリーンアップが異常終了するので対応する事にしました。
メーカーＰＣでクリーンインストール直後に行って出るエラーですので
おそらく、バグが解消されていない状況だと思います。

このレジストリは、通常の手段で削除が出来なくて
レジストリエディタでアクセス許可を変更してからでないと削除出来ません。
なので、削除には「reg.exe」ではなく「regini.exe」を使用します。

実際にレジストリエディタを開くと分かるのですが
キー名がとても長く、同じ階層に沢山キーが並んでいるので探すのも大変です。
１つ消すだけでも面倒なのに、２つキーを消す必要があるので結構手間になります。

使用しているＰＣが１台だけなら一度だけ作業を行えばいいのですが
複数台所有している場合とか、自社でキッティングを行っているとか
管理している台数分だけ作業回数が増えるので苦痛の元です。

紹介しているサイトも手作業ばかりでしたので、これも作成理由になりました。

マイクロソフトが直してくれれば、このバッチ要らなくなるのですけどね。

2017/7/12 : ちょっこし修正

```Dism_Cleanup-Image_RestoreHealth_Fix.cmd
cd /d "%~dp0"

SET textFile="Dism_Cleanup-Image_RestoreHealth_FixReg.ini"

SET BaseRoot="HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing"
SET TestRoot="Microsoft-Windows-TestRoot-and-FlightSigning-Package"
SET FindHKEY=/B /C:"HKEY_LOCAL_MACHINE"

TYPE                                                                                                                         NUL>  %textFile%
FOR /F "delims=" %%0 in ('REG QUERY %BaseRoot% /S ^| FIND /I %TestRoot% ^| FINDstr %FindHKEY%') do @echo;%%0 [1 5 7 11 14 17 21]>> %textFile%
FOR /F "delims=" %%0 in ('REG QUERY %BaseRoot% /S   /F       %TestRoot% ^| FINDstr %FindHKEY%') do @echo;%%0 [DELETE]>>            %textFile%
regini                                                                                                                             %textFile%
DEL /F                                                                                                                             %textFile%
pythonで実行中のファイル、関数、行番号を取得する

python3でエラーになるので
`frame = inspect.currentframe(depth + 1)`から
`frame = inspect.currentframe().f_back`に修正

```python

import inspect
import os

def location(depth=0):
  frame = inspect.currentframe().f_back
  return os.path.basename(frame.f_code.co_filename), frame.f_code.co_name, frame.f_lineno

def func1():
  print(location())

def main():
  print(location())
  func1()

if __name__ == '__main__':
  main()
  exit(0)
```

```
('a.py', 'main', 13)
('a.py', 'func1', 10)
```

# 参考

Python で現在のファイル名と行番号を調べる。 - kなんとかの日記 http://d.hatena.ne.jp/kwatch/20100410/1270851205

Python Tips：現在の関数の名前や引数を取得したい - Life with Python http://www.lifewithpython.com/2015/11/python-get-function-name.html

実行中の関数・メソッド名を取得したい - Qiita http://qiita.com/megmogmog1965/items/0b4ea3d58e34f1854158
sshサーバとクライアント間で接続維持のパケット送受信

　sshサーバとクアイアント間で、それぞれから接続維持を確認するパケットを、一定の秒間隔で送信することができる。介在するルータやファイアウォールの設定で、一定時間以上通信がない場合に切断されてしまう事態を回避することができる。サーバー側から発信する場合は /etc/ssh/sshd_config に以下の2行を書き込み、sshdを再起動する。

```
# ls -l /etc/ssh/sshd_config
-rw-------. 1 root root 3872 Sep  7  2011 /etc/ssh/sshd_config
# vi /etc/ssh/sshd_config	# ClientAliveInterval と ClientAliveCountMax を設定
# grep ClientAlive /etc/ssh/sshd_config
ClientAliveInterval 1024
ClientAliveCountMax 4
# /etc/init.d/sshd restart
```

　通常は、サーバー側からではなく、クライアント側から発信すればよい。その場合 ~/.ssh/config に以下の2行を書き込み、sshを実行する。

```
$ ls -l ~/.ssh/config 
-rw------- 1 glire glire 47 Jul  8 01:34 /home/w3glires/.ssh/config
$ cat ~/.ssh/config
ServerAliveInterval 1024
ServerAliveCountMax 4
```
solrをdockerで導入 2017年版

# solrをdockerで導入 2017年版

- 以前書いた「solrをdockerで導入から」時間が経過したので今のバージョン(6.6.0 stable?)で書き直してみます。

## 前提

- dockerとdocker composeを使います。
- OSはubuntu16.04です。(linuxなら多分違いは無い)

以下のコマンドでインストールできると思いますが、dockerのバージョンが古いと思うのでサイトからのインストールを推奨します。

```
$ sudo apt install docker.io
$ sudo apt install docker-compose
```
## 準備

- coreを配置するローカルディレクトリを作成する。

```
$ sudo mkdir /data
$ sudo chown 8983:8983 /data
```

## Solrコンテナのダウンロード

- DockerとDocker composeのインストールが出来たら

以下のコマンドでsolrのコンテナをダウンロード

```
$ sudo docker pull solr
```

```
junk@ubuntu-vm:~/solr$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
solr                latest              4bc40f825e4c        2 weeks ago         518MB
```
## docker composeの用意

自分のhomeディレクトリに適当にディレクトリを作成し、以下のファイルを作成する。

```docker-compose.yml
version: '2'
services:
  solr:
    image: solr
    ports:
     - "8983:8983"
    volumes:
     - /data:/opt/solr/server/solr/mycores
    restart: always
```
以下のコマンドでsolrコンテナを起動する。

```
$ cd /home/junk/solr
$ sudo docker-compose up -d
```

作成が成功すると以下の感じに。

```
junk@ubuntu-vm:~/solr$ sudo docker-compose up -d
Creating solr_solr_1

junk@ubuntu-vm:~/solr$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
c42fa13db748        solr                "docker-entrypoint..."   About a minute ago   Up About a minute   0.0.0.0:8983->8983/tcp   solr_solr_1
```

この段階で、ブラウザで以下のアドレスにアクセスすれば画面が表示できる。

```
http://127.0.0.1:8983/
```
![Screenshot from 2017-07-08 01-19-25.png](https://qiita-image-store.s3.amazonaws.com/0/84915/87c9165d-9e8f-c66c-ad3c-d4c9a2b22385.png)

## coreの作成

- Solrコンテナが起動したまま以下のコマンドを実行し、coreを作成する
- 下記「solr_solr_1」部の1つ目のsolrはdocker-compose.ymlのフォルダ名による。適時変更。

```
$ sudo docker exec -it --user=solr solr_solr_1 solr-precreate test
```
solr_solr_1は、コンテナの名前
testは、coreの名前
デス。

実行すると以下のようになります。

```
junk@ubuntu-vm:~/solr$ sudo docker exec -it --user=solr solr_solr_1 solr-precreate test
Executing /opt/docker-solr/scripts/solr-precreate test
created test

Port 8983 is already being used by another process (pid: 1)
Please choose a different port using the -p option.
```

- solrのコンテナを再起動する

```
$ sudo docker restart solr_solr_1
```

- コンテナを再起動し、サイトを再表示すればcoreがロードされます。

![Screenshot from 2017-07-08 01-29-18.png](https://qiita-image-store.s3.amazonaws.com/0/84915/3b545e8b-6d79-1ab1-d8de-177f432ea0d8.png)

- ローカルのコアディレクトリーにtest coreが作成されていることを確認。

```
junk@ubuntu-vm:/data$ ll
合計 12
drwxr-xr-x  3 8983 8983 4096  7月  8 01:24 ./
drwxr-xr-x 25 root root 4096  7月  7 00:58 ../
drwxr-xr-x  4 8983 8983 4096  7月  8 01:28 test/

```

https://hub.docker.com/_/solr/
にも色々書いてあるけど、分かりやすくは無いのでまとめてみた。
Terminal のテキスト編集

sedの使い方
===========

``` r
# 1行目から5行目を削除する
# -iは上書き, -eはコマンド
sed -i -e 1,5d /tmp/dow.csv 
# 1行目から5行目以外を削除する(シングルクォーテーションいる)
sed -i -e '1,5!d' /tmp/dow.csv 
```
データ分析ためにRとPythonはどっちを勉強すべきか

# この記事について
データ分析といえば、やっぱり最近はRとPythonしかないんじゃないかな。
特にPythonはすごく若手エンジニアに人気ある。データ分析だけじゃなくて、いろいろな使い道あるからでしょう。

最近私もデータ分析系の仕事をやり始めていて、先輩にRを勧められたけど、Pythonのほうが少しだけ経験がある。ほぼ初心者なので、どれを使うのか悩んでた。

#実際データを見てみましょう
そこで、早速データをみて決めようと思いました。
仕事に特化したサーチエンジンIndeedでRとPythonのJob Trend検索したら、こちらの結果でした（2017/07/08 時点の最新データは四月までしかでないみたい）

#求人のトレンド
<img width="765" alt="Screen Shot 2017-07-08 at 12.44.52 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/104343/1b5afb8a-e739-0cfc-8beb-4ec4e3a4520d.png">

- Rの方が多い
- どっちも明らかなトレンドが見えてない。

#求職者のトレンド
<img width="758" alt="Screen Shot 2017-07-08 at 12.49.43 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/104343/b7e2c603-d858-04e1-e2f5-d86e9350d80b.png">
（画像引用元　https://www.indeed.com/jobtrends/q-R-q-Python.html）

一方、仕事探す側はどうでしょう。

- 明らかにPythonのほうが人気急上昇。
- Rはある範囲内で変動するだけ。

#結論
*求人のトレントは変わらないが、Pythonができる人が増えている。逆に、Rができる人は増えていない。*
単純に求人マーケット価値を追求するなら、Rの方がいいんじゃないかと思いました。

*ただし*、どっちもopen sourceなので、ユーザが増えれば増えるほど、使い勝手のよいパッケージも増えて、新しい技術が適用される優先度も高くなる。求職者の図からすると、Pythonの求職者数はRの求職者数を上回ったということ。やっぱり人気なPythonにすべきかも。

結論としては、まだ決めていませんということです。


# 参考
Indeed Job Trend
https://www.indeed.com/jobtrends
(例として出てるData ScientistとDevopsの比べは面白い)
FizzBuzzで学ぶブラックボックステスト


以下の処理のテストケースを考えてみます。

メソッドexecuteFizzBuzz()


 - 引数:整数を受け取ります
 - 戻り値: 3の倍数の場合はfizz,5の倍数の場合はbuzz,3と5両方の倍数である場合はfizzbuzzを返します。1~100の範囲外である場合は常に0を返します


# 境界値テスト 

境界値テストではOff-by-one error(後述)の対策である。
条件範囲の境界に最も近い2点をテストケースとして選ぶ

## Off-by-one errorの対策
>30メートルのフェンスを作り、3メートルごとにフェンスの支柱を立てる場合、必要な支柱の本数は何本か？

30÷3=10で10本と考えがちだが、実際に支柱は11本必要。
このような勘違いを一般的にOff-by-one errorと呼ぶ。

 - 数値の選定ミス(開始を1,0どちらにするか。終端をn、n+1どちらにするか)
 - 不等号のミス(< ,<=どちらをつかうのか)

のような範囲を扱う数値の勘定ミスによるバグは

 - 一目でバグとわかりにくい
 - 静的解析で発覚しないことが多い
 - コンパイルエラーにならないことが多い
 - エラーの多くは実行時まで見つからない

*だから境界値を検査することには大きな意味がある。*

## 境界値テストのケース

今回のテスト対象では範囲が１以上、100以下であり、範囲外の場合は0を返すため

1. 0  (範囲外(未満)で最大)
2. 1  (範囲内で最小値)
3. 100(範囲内で最大値)
4. 101(範囲外(多すぎ)で最小値)

この4種類を境界値のテストとする


# 同値クラステスト

同値クラステストでは同じ内容の処理となる値を同値クラス
に分割し、代表値を選んでテストケースを減らす工夫を行う。

## 同値クラステストのケース

処理結果をグループ分けし、代表値を一つ選んでテストする。

1. fizzを返すもの (15の倍数を除く3の倍数) 例:99
2. buzzを返すもの (15の倍数を除く5の倍数) 例:20
3. fizzbuzzを返すもの (15の倍数) 例:45
4. 範囲外で失敗するもの(小) 例:-1
5. 範囲外で失敗するもの(大) 例:123

今回はこの5種を同値クラスとする。
※4,5は境界値テストで他の代表値を検査できているので
本来は実施しなくてもよい。

# 他
0は特別な数字なので、
数値を処理対象としているなら検査すべき。

# 最終的なテストケース

| ケース番号 | 入力                 | 出力       | 
|-------|--------------------------|----------| 
| 1     | 0  (範囲外(未満)で外最大)   | 0        | 
| 2     | 1  (範囲内で最小値)        | 1        | 
| 3     | 100(範囲内で最大値)        | buzz     | 
| 4     | 101(範囲外(多すぎ)で最小値) | 0        | 
| 5     | 99(3の倍数)               | fizz     | 
| 6     | 20(5の倍数)               | buzz     | 
| 7     | 45(15の倍数)              | fizzbuzz | 
| 8     | -1(範囲外で失敗)           | 0        | 
| 9     | 123(範囲外で失敗)          | 0        | 
| 10    | 0(特別な数値)             | 0        | 


# より実践的なケース

現場だとケースそのものを実行するのではなく、
更に同値クラスを排除した実行結果をエビデンスとして用意し、
テストケースと対応させて無駄な作業を省略しています。

ケース10は1と同じinput output なので排除可能です。(ケース1は境界値検証をしているので排除不可です)
ケース8はケース2と同値クラスなので排除可能です。
ケース9はケース4と同値クラスなので排除可能です。
ケース6はケース3と同値クラスなので排除可能です。


| 実行番号 | 入力                 | 出力       | 
|-------|--------------------------|----------| 
| 1     | 0  (範囲外(未満)で外最大)   | 0        | 
| 2     | 1  (範囲内で最小値)        | 1        | 
| 3     | 100(範囲内で最大値)        | buzz     | 
| 4     | 101(範囲外(多すぎ)で最小値) | 0        | 
| 5     | 99(3の倍数)               | fizz     | 
| 6     | 45(15の倍数)              | fizzbuzz | 


| ケース番号 | 入力                 | 対応する実行番号       | 
|-------|--------------------------|----------| 
| 1     | 範囲外(未満)で外最大   | 1        | 
| 2     | 範囲内で最小値    | 2        | 
| 3     | 範囲内で最大      | 3     | 
| 4     | 範囲外(多すぎ)で最小値 | 4        | 
| 5     | 3の倍数               | 5     | 
| 6     | 5の倍数               | 3   | 
| 7     | 15の倍数              | 6| 
| 8     | 範囲外で失敗(小さすぎる) | 1        | 
| 9     | 範囲外で失敗(大きすぎる) | 4        | 
| 10    | 0の入力確認     | 1| 


同値クラスを見つけて重複を除くことで実施回数が10個→6個に減らせました。
テスト結果を確認する人が各ケースがどのエビデンスと対応しているのかわかりやすいように示しておきましょう。
Blenderを起動するとすぐに終了する問題を解決した話

##経緯
新しいパソコンを購入。
５年前に購入した古いパソコンからGTX1060を新しいパソコンに付け替えて、古いPCには前のグラボ(GTX550)に戻す。
古いPCでは1060でも550でも問題なくBlenderが起動できたが、新しいPCでは1060でBlenderが起動しない。

古いPCの環境は…
win10 64bit(HDD) / i3-2100 / GTX1060でも550でもBlenderが起動する。
新しいPCは…
win10 64bit(SSD) / i7-7700K / GTX1060で起動しない。

※どちらも何度もドライバの確認・更新やwindowsアップデートの確認を行っている。

##新PCでの現象
Blender 2.78cをインストールして起動すると、コマンドプロンプトが一瞬だけ立ち上がりすぐに終了してしまう。
Blenderのショートカットからではコマンドプロンプトがすぐ閉じてしまうため、一見するとエラーメッセージなども確認できない。

##対処
思いつく限りの基本的な対処法では解決しませんでした。
・アンインストール＋関連ファイルの削除→再起動→インストール
・32bit版　64bit版で試したり、インストール版とzip版で試したりもした。
・念のため、Visual C++ 2008 SP1 の32bit版と64bit版でのインストール
（ランタイムエラーは出てないので関係ないと思いますが…）
・最新のグラフィックドライバ(GTX1060)の再インストール
・念のためwindowsを初期化して、上記の一連の流れをもう一度。

##結論
CYCLES_OPENCL_TEST=NONE に設定してからBlenderを起動する。（わかるかこんなの）

まず、試す前にコマンドプロンプトを起動して。

```.bat

cd C:\Program Files\Blender Foundation\Blender
```

cd半角スペースの後に、blender.exeが保存されてるフォルダのパスを入力してください。
そうすると、コマンドプロンプト上でblender.exeのあるフォルダを開いてる事になります。
そのあとに

```.bat

blender.exe --debug-all
```
を実行してみてください。
これはblender実行時にデバックログを表示させるオプションです。
コマンドプロンプトから直接実行すると、ショートカットからの起動とは違い、コマンドプロンプトはとじたりしません。
自分はその結果…

```.bat

I0708 05:39:33.004971  7244 device_cuda.cpp:1346] CUEW initialization succeeded
I0708 05:39:33.004971  7244 device_cuda.cpp:1348] Found precompiled kernels
I0708 05:39:33.207995  7244 device_opencl.cpp:58] CLEW initialization succeeded.
Error: EXCEPTION_ACCESS_VIOLATION
```
このタイミングでエラーしていました。
前の行のdevice_opencl.cppが重要で、[opencl](https://ja.wikipedia.org/wiki/OpenCL)に関する読み込みです。
おなじ箇所でつっかえてるようでしたら、以下のbatファイルを作成して実行してみてください。
(batファイルはメモ帳開いて、bat用のコマンド書いて、拡張子をtxtではなくbatにして保存すればOK)

```Blender.bat

cd C:\Program Files\Blender Foundation\Blender
set CYCLES_OPENCL_TEST=NONE
start blender.exe
pause
```

**１行目の cd 以降はBlender.exeが保存されてるディレクトリへのパスを指定してください。**
そうするとうまくいきます…エラーメッセージの EXCEPTION_ACCESS_VIOLATION は意味する内容が非常に多く、キーワードにひっかけても特定のエラーや解決方法にたどり着きません。
偶然海外のフォーラムで２週間した無駄にした兄貴のおかげでヒントを得て解決に至りました。
該当スレッド→[Blender 2.77 to 2.78 crash when choose Cycles in top menu](https://developer.blender.org/T49584)

結局のところ、何が原因だったか根本的な部分はわかりませんでした。
openclの後にコケてるから（なんとなくグラフィックに関連する問題なんだろうなぁ…）ぐらいのまま、解決方法だけわかりました。
※もしわかる方居ましたらご教示お願いします…
この問題はショートカットを起動しただけではただ強制終了するだけで一切メッセージがでないので、解決に時間がかかると思われますので備忘録としても書き残しておきます。
これのために何回再インストールした事か…

##参考URL
[Blender 起動時の EXCEPTION_ACCESS_VIOLATION の解決方法](http://blog.fujiu.jp/2016/08/blender-exceptionaccessviolation-how-to.html)
[How do I fix Exception Access Violation error on startup?](https://blender.stackexchange.com/questions/61749/how-do-i-fix-exception-access-violation-error-on-startup)
[Upgrade from 2.78a to 2.78c, Now have cycles issues.](https://developer.blender.org/T50868)
Leaf Classificationで良精度を出すまで＿１日目

データ分析初学者がKaggleのLeaf Classificationをやってみることにしました。
(https://www.kaggle.com/c/leaf-classification/data)

##まず問題を把握する
###問題
**192の特徴量**(margin1~64, shape1~64, texture1~64)から**99クラス分類**を行う。

###データセット

+ 1584個の画像＋特徴量
+ 正解ラベルは99個
+ 訓練データは990個
+ また、１クラスにつき１０個の訓練データが与えられている。
+ テストデータは594個


##思ったこと、考えたこと

### **各データに対して訓練データ10は少ないんじゃないか？**
 
→平行移動などでデータセットを増やしてみるのも良さそうです。
コードを書いて同じラベルのものをどの程度動かしても良さそうかを見てみます。

```py3:samelabel_leaf.py
lst = [0,316,905,1001,1124,1158,1269,1319,1449, 1503]#同じラベルの画像のインデックス
for i,j in enumerate(lst):
    plt.subplot(2,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.imshow(images[j], "gray")
```

<img width="363" alt="スクリーンショット 2017-07-07 22.52.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/190157/fdc87028-d426-e99d-31a9-a001b4823809.png">

向きがほとんど一緒なので、あまり回転させすぎるのは得策ではないかもしれません。
拡大、縮小も控えめに行った方がむしろ良さそうな気もします。

###**192個の『特徴量』とはどういうことだろう？**

→ margin, shape, textureの意味がよくわからないので、調べてみます。

[PLANT_LEAF_CLASSIFICATIONの論文](https://www.researchgate.net/profile/Charles_Mallah/publication/266632357_Plant_Leaf_Classification_using_Probabilistic_Integration_of_Shape_Texture_and_Margin_Features/links/547072f40cf216f8cfa9f72c.pdf)

####**3.2 Leaves**
『この問題は少数の例で幅広いクラスの分類をすることは重要である。』
どうやら、少ないのは意図的なようです。

####**4.1 Leaf Shape Feature**
『二次元領域、または教会を表す一次元のデータである。
CCDCはスケール、平行移動、回転不変のshape descriptorである。
最終的にベクトルを適切なサイズにスケーリングし、同じ要素数を持つようにして計算時間を短縮できるようにしている。』
なにやらよくわからないですが、

shapeの重心$\bar{x}, \bar{y}$を、

$\bar{x}=\frac{\sum_{i=1}^{s}x_i}{s}, \bar{y}=\frac{\sum_{i=1}^{s}y_i}{s}$

として、

$d_i = \sqrt{(x_i-\bar{x})^{2}+(y_i-\bar{y})^{2}}$

$d_i^{'}=\frac{d_i}{\sum_{i=1}^{s}d_i}$

としていると考えると、どうやら重心の平均をとって全体の重心からの離れ具合を表しているようです。

####**4.2 Leaf Texture Feature**
『各画像について、**1024個のsmall windowsがランダムに選択**される。
それらに対して、**回転不変のGaborフィルター**をかける。
フィルタの重心の標準偏差を変化させることで**５つの異なるスケールフィルタ**を作る。
各フィルタは各windowと畳み込まれ、そのフィルタの**４つの特徴**が計算される。
そのあと、1024x20個の特徴ベクトルの各々を64個のベクトルに割り当てる。
その割り当てられた1024個のベクトルからヒストグラムが構築され、64個の特徴ベクトルが与えられる。』
おそらく、small windowsとは画像から切り取った5x5などの小要素のことだと思いますが、**どういうことなのかわかりませんでした。**

####**4.3 Leaf Margin Feature**
『まず、**メディアンフィルタをbinary leaf画像に適用し、画像を平滑化する**。
これによって輪郭全体をm個の点で表すことができ、この**各点について元の輪郭上の対応する点を計算する。**
1.**大きさ**：平滑化されたマージンの点と元の対応する点との符号付き距離
2.**勾配**：現在の点と次の点との符号付き差
3.**曲率**：前の点と次の点との間の現在の点での角度
のそれぞれについて正、負の２つのフィーチャがwindowごとに6つの特徴discriptorを生成する。
マージンwindowの特徴ベクトルは4.2と同じ方法で64個の特徴を生成するために使用される。』

つまり
![d61e0c76dd87fe4126a47b5dfe250193.jpg](https://qiita-image-store.s3.amazonaws.com/0/190157/b5ba3290-5c3c-0b7f-5e16-52ca52638f5c.jpeg)
という感じです。

おそらく、どうやら平滑化を行った事で輪郭を認識し、その結果マージンを認識できるという事でしょうか。


###**縦横比が違っているデータが多くあるが、これはどうしよう。**
→２つ考えた。

+ 全て同じサイズに拡大or縮小をしてリサイズをする。
+ 全てが同じサイズになるように正方形を基準として、元の画像の縦横比を保ったまま縦or横方向に0paddingを行う。

前者だと、**例えば細長い画像のデータを丸い葉と認識してしまいそう**なので後者の方が良さそう。


###**画像、大きくない？**
これは小さくすれば解決すると思う。
Mnistも10クラス分類とはいえ28x28で**結構な精度が出る**ということは、ある程度小さく縮小しても大丈夫そう。
→これについては、色々なサイズで実験して考察することもできそう。


**というわけで明日から実装しよう。**
RubotyのRocket.Chatアダプターを書くメモ

# はじめに
Rocket.Chatをよく使う。
ChatといえばBotでBotといえばHubotだけど```coffeescript好きくない```。

coffeescriptよりRubyのほうが好きなので探したらRobotyに行き着いた。
RobotyいいけどRocket.Chatアダプターがない。
なので書く。けどRuby詳しくないので色々調べながらの作業

## 最初わからなかったこと

* Bundler
* Rocket.Chat API
* Rocket.Chat TestServer構築
* Adapterのテスト
* module

## わかったこと

### Bundler
gemがRubyのプラグインで、Bundlerはプラグイン管理
http://qiita.com/oshou/items/6283c2315dc7dd244aef

Rubotyはgemで自作AdapterもgemなのでBundler経由で作ると楽そう

初回環境構築は
```
bundler gem ruboty-rocketchat
```

### Rocket.Chat API

Rocket.Chatから発言を拾うため本家から繋ぎ方を調べる。 
https://rocket.chat/docs
https://rocket.chat/docs/developer-guides/rest-api
まだβ版らしい。

REST APIに対応したgemもあるが発言は未対応っぽい
https://github.com/abrom/rocketchat-ruby

REST APIで発言を抜くのはあれっぽい。
非公開APIだけどREALTIME API使うとよさげ
https://rocket.chat/docs/developer-guides/realtime-api

hubotは公式がAdapterを公開してるので、Adapterソースを見てみる
https://github.com/RocketChat/hubot-rocketchat/blob/master/src/rocketchat_driver.coffee

MeteoraとかAsteroidはよくわからないけど、websocketでsubscribeしてchangeを受け取れば良い気がする。

まだ調べ中
Reactの学び2 (オブジェクトへの読み書きを安全に行う)

## 当記事はとてもシンプルです

## 今までの実装

```js:DoneButton.js
class DoneButton extends React.Component {
  state = { arg: 'Done' }

  handleClick = () => {
    this.setState({
      arg: this.state.arg + 'だーん'
    })
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.arg}
      </button>
    )
  }
}

ReactDOM.render(<Button />, document.getElementById('root'))

```

## 今後の実装

```js:DoneButton.js
class DoneButton extends React.Component {
  state = { arg: 'Done' }

  handleClick = () => {
    this.setState((prevState) => {
      return {
        arg: prevState.arg + 'だーん'
      }
    })
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.arg}
      </button>
    )
  }
}

ReactDOM.render(<Button />, document.getElementById('root'))

```

## リファクタリング

```js:DoneButton.js
class DoneButton extends React.Component {
  state = { arg: 'Done' }

  handleClick = () => {
    this.setState((prevState) => ({
      arg: prevState.arg + 'だーん'
    }))
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.arg}
      </button>
    )
  }
}

ReactDOM.render(<Button />, document.getElementById('root'))

```

`handleClick `に注目してください。

取り急ぎこれぐらいにしておいて、気付きがあればまた追記します。
コマンド備忘録


主にlinuxにおけるコマンドを記述していきます。

### **grep コマンド**
|オプション|説明|
|:---------- |:-----|
|-n	|各行の前に行番号を表示する
|-i	 |検索条件に大文字と小文字の区別をなくす
|-r  |再帰的に実行される(複数のファイルで検索が可能)
|-w |パターン・マッチを，単語全体で行うようにする

|正規表現|-
|:---------- |:-----|
|.	|改行文字以外の任意の1文字|
|*	|直前の1文字の0回以上の繰り返しに一致。
|^|	行の先頭を表す
|$|	行の末尾を表す
|[ ]|	かっこ内の任意の文字に一致。ハイフン（-）で範囲指定もできる。かっこ内の最初の文字に^を使用すると，意味が逆転する
|+|	直前の文字の1個以上の連続
|?|	直前の文字の0または1文字にマッチ
|(pattern)|	patternをグループ化する
|\\|	正規表現に使われる記号を普通の文字として扱う
今いるディレクトリ内でパターンを検索する。
`$ grep -rnw ./ -e "パターン"`

### **(コマンド名) コマンド**
|オプション|説明|
|:---------- |:-----|
|オプション１ |説明１|
|オプション２ |説明２|
|オプション３ |説明３|
例の説明
`$ ここにコマンドの例を記述`
kotlin + retrofit2 + MoshiでAPIアクセス

kotlinでretrofit2を使ってAPIアクセスする処理を書いてみたのでメモ。
今回はjsonパーサにMoshiを使ってみました。

```java:app/build.gradle
dependencies {
    //...

    def retrofit_version = '2.3.0'
    compile "com.squareup.retrofit2:retrofit:$retrofit_version"
    compile "com.squareup.retrofit2:adapter-rxjava2:$retrofit_version"
    compile "com.squareup.retrofit2:converter-moshi:$retrofit_version"

    def moshi_version = '1.5.0'
    compile "com.squareup.moshi:moshi:$moshi_version"
    compile "com.squareup.moshi:moshi-kotlin:$moshi_version"

    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
}
```

```kotlin:TestService.kt
object TestService {
    fun test() {
        val retrofit = Retrofit.Builder()
                .baseUrl("http://www.xxx.com")
                .addConverterFactory(MoshiConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build()
        val testClient = retrofit.create(TestClient::class.java)

        selfClient.getSomething()
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe ({
                    val user = it
                    print(user)
                })


    }
}
```

```kotlin
interface SelfClient {
    @GET("/test")
    fun authenticate(@Header("Authenticate") authenticate: String): Observable<TestDto>
}
```

だいたいこんな感じで取得できます。
外部から社内のパソコンへWake on lanを実装したときのまとめ（サーバー側）

外部からリモートデスクトップするためのwake on lanを実装したときのサーバー側のまとめ

### 前提資料
http://www.atmarkit.co.jp/ait/articles/0602/25/news014_2.html

### 必要事項
・外部から見れるサイトを社内にサーバーを立てれること
※Web UIとかログイン認証、sslは別途でやってね

## 概要
### **前提として下記の設定が必要になります。（マシンによって異なる）**
![8e70e928d849800df74cd206b0d90d74.png](https://qiita-image-store.s3.amazonaws.com/0/25470/fd8a184b-346a-0ef0-6e7a-bac08f2d1682.png)

### 今回はphpでWake on lanを実施する部分のみ

wakeonlanにはMAC Addressが必要だが、Ip Addressしかわからない人がいるのでコマンドを使って探す処理を実装

```***.php

//ip address → mac address
if(isset($ip_address && $ip_address != ""){
    $mac = "";
    $pcs = shell_exec("nmap -sP {$ip_address} ");
    $pcs = shell_exec("arp -a");
    $pcss = explode("\n",$pcs);

    foreach($pcss as $value){
        if(strripos($value,$ip_address !== false){
            if(preg_match("/([0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}/",$value,$match) === 1){
                $mac = $match[0];
                break;
            }
        }
    }
    if($mac != ""){
        $ping = "　{$ip_address} → MAC address　{$mac}";
    }else{
        $ping = "get faild";
    }
}
```

その逆

```***.php
//mac address → ip address 
if(isset($mac_address) && $mac_address != ""){
    $ip = "";
    #Need to change *.*.*. (192.168 or 172.16 or ....)
    $pcs = shell_exec("nmap -sP 192.168.6.* ");
    $pcs = shell_exec("arp -a");
    $pcss = explode("\n",$pcs);

    foreach($pcss as $value){
        if(strripos($value,$mac_address) !== false){
            if(preg_match("/\(([a-zA-Z0-9.]+)\)/",$value,$match) === 1){
                $ip = substr(substr($match[0],1),0,-1);
                break;
            }
        }
    }
    if($ip != ""){
        $ping = "MAC address　{$mac_address} → IP address　{$ip}";
    }else{
        $ping = "get failed";
    }
}
```

また上記で参照できないことがあるので下記をcronで走らせる
\*.\*.\*.は192.168.1や192.168.2、172.16.3等に環境に応じて変える

~~~***.php
for a in `seq 1 254`; do ping -c 1 -w 0.5 *.*.*.$a > /dev/null && arp -a *.*.*.$a | grep ether; done
~~~

## MAC Addressがわかったら下記でバッチに引き数を渡す
#### **※batchの実行ユーザーに気を付ける事、この場合はapacheのユーザーを使用して実行**

~~~***.php
#run user apache
shell_exec("wakeonlan.sh ".$mac_address);
~~~

~~~wakeonlan.sh
#!/bin/sh
echo 'apache' | sudo -S ether-wake $1
echo "$1 start"
~~~

その後の起動確認は下記で実装

~~~***.php
$res = shell_exec("ping -c 4 -W 5 ".$ip_address);
$array = explode("\n",$res);
if(strripos($res,'0 received') === false){
    $ping = "boot success";
}else{
    $ping = "boot failed";
}

~~~

まとめgithub:https://github.com/abotkugyu/wakeonlan
Raspberry Pi 64bitモードでリアルタイムOS(TOPPERS/FMP)を動かす

<img src="https://qiita-image-store.s3.amazonaws.com/0/176334/b5aed92f-df82-b0a6-3afb-e7c3b3e34698.jpeg" width=75%>

# リアルタイムOSをRaspberry Pi 3の64bitモード向けに移植した

リアルタイムOSは，TOPPERS/FMPカーネル (https://www.toppers.jp) を使用した．
Zynq Cortex-A53 AArch64向けパッケージをベースに，Raspberry Pi 3 Cortex-A53 AArch64向けに移植した．

ソースコードは以下に置いてある．
https://github.com/YujiToshinaga/RPi64Toppers

## 概要

 - TOPPERS/FMPカーネルを移植 (https://www.toppers.jp)
 - Raspberry Pi 3のARMv8 AArch64モードで動作
 - 4コアでマルチコア動作
 - キャッシュ，MMUはON
 - 各コアのARM Generic Timerを使用
 - Raspberry PiのMini UARTを使用
 - 例外レベル3(EL3)でブートし，例外レベル1ノンセキュア(EL1NS)でカーネル動作
 - 割込み優先度のハードウェア機能が無いためソフトウェアで疑似的に再現

QEMU(エミュレータ）を用いた実機レスの動作も可能である．
https://qiita.com/toshinaga/items/1af5948b45d62cc20509

デバッグ用途向けに実行ファイルをローダするツールも提供している．
https://qiita.com/toshinaga/items/4b38a2e21f559d273f09

制限事項

 - ~~プロセッサ間割込み，タスクマイグレーション等のコア間処理が動作せず~~
 ~~なぜかAArch64モードでコア間割込みを起こせない・・・~~ （2017/09/11解決済み）
 - ~~割込み優先度の概念は未実装~~ （2017/09/11実装済み）

## 必要な機材

 - Raspberry Pi 3 + 電源

 - microSDカード + カードリーダー
FAT32フォーマットされたmicroSDカードを用意する．
数十MB程度の空きがあれば十分である．

 - USBシリアル変換ケーブル
シリアルコンソールで通信するために使用する．
TTL-232R-3V3を使用した．

 - PC（Windows/Linuxどちらでも可）
ビルド，および動作に使用する．

## 開発環境の構築

 - コンパイラ
以下からフリーのARMv8 AArch64用コンパイラを入手する．
https://www.linaro.org/downloads/
Versionは`gcc-linaro-6.3.1-2017.02-xxx_aarch64-elf`を使用した．
xxxはPC環境によって適切なものを選択する．
ダウンロードして適当な場所に展開したら以下にpathに通す．
`<解凍したディレクトリ>/gcc-linaro-6.3.1-2017.02-xxx_aarch64-elf/bin`

 - コンフィギュレータ
以下からコンフィギュレータを入手する．
https://www.toppers.jp/cfg-download.html

 - ターミナルアプリ
シリアルコンソールで通信するためにTera Term，GTKTermなどをインストールしておく．

 - その他ツール
おそらく以下パッケージが必要となる．
make, perl, git, gcc-core, gcc-g++

## ビルド

リポジトリを取得してfmp.binをビルドする．

```shell-session
git clone https://github.com/YujiToshinaga/RPi64Toppers.git
cd RPi64Toppers/fmp
mkdir -p cfg/cfg
mv <コンフィギュレータを解凍したディレクトリ>/cfg cfg/cfg
chmod 755 cfg/cfg/cfg
mkdir build
cd build
perl ../configure -T rpi_arm64_gcc
make fmp.bin
```

## 動作準備

### SDカードの準備

FAT32フォーマットされたSDカード直下に以下の4ファイルを置いてRaspberry Piに挿す．

 - bootcode.bin, start.elf
 以下からbootcode.binとstart.elfをダウンロードする．
 https://github.com/raspberrypi/firmware/tree/master/boot

 - config.txt
 リポジトリのRPi64Toppers/fmp/targets/rpi_arm64_gcc/config.txtを使用する．

 - fmp.bin
 ビルドしたfmp.binを使用する．

### シリアルコンソールの接続

Raspberry PiのGPIO14(TXD1), GPIO15(RXD1), GroundをそれぞれUSB-シリアル変換ケーブルのRXD，TXD，Groundと接続する．

Raspberry Piのピン配置
https://www.raspberrypi.org/documentation/usage/gpio-plus-and-raspi2/README.md

TTL-232R-3V3を使用する場合

RPiのピン | 結線 | TTL-232R-3V3のピン
---|---|---
GPIO14(TXD1) | - | Yellow(RXD)
GPIO15(RXD1) | - | Orange(TXD)
Ground | - | Ground |

PCとUSB-シリアル変換ケーブルを接続し，ターミナルアプリからシリアルコンソールを開く．
ボーレートは115200bpsを設定する．

<img width="300" src="https://qiita-image-store.s3.amazonaws.com/0/176334/50cb4128-7d63-079f-b3d6-3c5a7b531e58.jpeg">

## 起動

Raspberry Piの電源を入れる．

<img width="450" src="https://qiita-image-store.s3.amazonaws.com/0/176334/43c642ad-7d72-0c49-2f57-dbc2582ec8f9.jpeg">
curlコマンドでデータを送るときに、ファイルに保存されたデータを使う

## 概要
curlコマンドでHTTPリクエストのボディにデータを入れるときに、コマンドラインで指定するだけでなく、ファイルから読み込んだデータを使うことができる。

## やり方

データを送る一般的なやり方。

```
$ curl -d "{ \"key\": \"value\"}" -H "Content-Type: application/json" http://example.com
```

ファイルから読み込む。

```
$ curl -d @your_file.json -H "Content-Type: application/json" http://example.com
```

標準入力から読み込むこともできる。


```
$ curl -d @- -H "Content-Type: application/json" http://example.com
```
Reactの学び1 (public fields and private fields)

## 当記事はとてもシンプルです

## 今までの実装

```js:DoneButton.js
class DoneButton extends React.Component {
  constructor(props) {
    super(props)
    this.state = { arg: 'Done' }
  }

  render() {
    return (
      <button>
        {this.state.arg}
      </button>
    )
  }
}

ReactDOM.render(<DoneButton />, document.getElementById('root'))
```

## 今後の実装

```js:DoneButton.js
class DoneButton extends React.Component {
  state = { arg: 'Done' }

  render() {
    return (
      <button>
        {this.state.arg}
      </button>
    )
  }
}

ReactDOM.render(<DoneButton />, document.getElementById('root'))
```

TC39によりstage 2 Draftの一つで[Integrated public and private fields proposal](https://tc39.github.io/proposal-class-fields/)があります。
僕達がJavaで書いてきたように**public fields**と**private fields**が実装できるようになります。  
上記のサンプルで説明すると

- public fields  
    `state = { arg: 'Done' }`
- private fields  
    `#state = { arg: 'Done' }`

取り急ぎこれぐらいにしておいて、気付きがあればまた追記します。
DI, DIコンテナ, サービスロケーターについて

# 概要
ZendFramework2でServiceManagerを利用しているが、DI、DIコンテナ、サービスロケーター等、ある程度理解を深めたくメモ

# DI(Dependency Injection)とは
## DIじゃない実装
```php:sample.php
class Sample
{
    const LOG_FILE_PATH = 'sample.log';

    private $logger = null;

    public function __construct()
    {
        $this->logger = new FileLogger();
        $this->logger->setFilePath(self::LOG_FILE_PATH);
    }

    public function doSomething()
    {
        // 何か処理
        // ログを残す
        $this->logger->info('doSomething successed!');
    }
}
```
外部オブジェクトを直接記載

## DIな実装
```php:sample.php
class Sample
{
    private $logger = null;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public function doSomething()
    {
        // 何か処理
        // ログを残す
        $this->logger->info('doSomething successed!');
    }
}
```
Interfaceを渡すことで実際のオブジェクトへの依存を減らしている。
他クラスが未完でも作業ができ、テスト時にモック化もできてbetter

## DIコンテナとは
```php:container.php
<?php

require_once __DIR__ . '/vendor/autoload.php';

use Pimple\Container;

use FileLogger;
use TwitterManager;
use DatabaseUserAuthenticator;
use Sample;

$container = new Container();

$container['file.logger'] = $container->protect(function($logFileName) {
    return new FileLogger($logFileName);
});

$container['twitter.manager'] = function ($c) {
    $logger = $c['file.logger']('twitter_manager.log');
    return new TwitterManager($logger);
};

$container['database.authenticator'] = function ($c) {
    return new DatabaseUserAuthenticator();
};

$container['sample'] = function ($c) {
    return new Sample($c['file.loggger']('sample.log'), $c['twitter.manager'], $c['database.authenticator']);
};

```
コンテナを作成してオブジェクトの生成をそこに一任する。

## サービスロケーターとは
```php:sample.php
<?php

require_once __DIR__ . '/vendor/autoload.php';

class Sample
{
    public function __construct($c)
    {
        $this->logger            = $c['file.logger']('sample.log');
        $this->sns               = $c['twitter.manager'];
        $this->userAuthenticator = $c['user.authenticator'];
    }
}

$sample = new Sample($container);
```
DIコンテナでは完全にコンテナにオブジェクトの生成を一任していたが
サービスロケーターではクラス内でコンテナ内のオブジェクトを探しに行っている。

# 参考サイト
- [DIとDIコンテナ](http://qiita.com/ritukiii/items/de30b2d944109521298f)
- [DIとサービスロケーター](http://blog.a-way-out.net/blog/2015/08/31/your-dependency-injection-is-wrong-as-I-expected/)
Arrayの連結

参考：[知って得する！５５のRubyのトリビアな記法](http://melborne.github.io/2013/03/04/ruby-trivias-you-should-know-4/)

#Array#*

Array#*に整数を渡すとそれを繰り返した新たな配列を返します。
小数でもエラーにはならないですが、小数点以下の部分は切り捨てされた分が増えます。
また、これは配列に対する処理なので文字列にも同じような処理ができます。

```ruby
irb(main):014:0> [1, 2] * 1
# => [1, 2]
irb(main):015:0> [1, 2] * 1.5
# => [1, 2]
irb(main):016:0> [1, 2] * 2
# => [1, 2, 1, 2]
irb(main):011:0> ["aa","bb"] * 1
# => ["aa", "bb"]
irb(main):013:0> ["aa","bb"] * 1.5
# => ["aa", "bb"]
irb(main):012:0> ["aa","bb"] * 2
# => ["aa", "bb", "aa", "bb"]
```

Array#*に文字列を渡すとjoinのような処理をします。

```ruby
[2009, 1, 10] * '-'
# => "2009-1-10"
["a", "b", "c"] * '-'
# => "a-b-c"
```
php-buildでpeclコマンドをインストールする

表題の通りなんですが、最近の`php-build`で`pecl`コマンドが欲しくなった場合には下記のようにすれば手に入ります。

```
$ PHP_BUILD_CONFIGURE_OPTS=--with-pear PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4 phpenv install 7.1.6
```