OmniAICreator/Qiita-1.07M huggingface dataset:
rubyとruby on rails書籍のサンプルプログラム配布サイトの一覧

ruby書籍
みるみるRubyがわかる本
http://www.shuwasystem.co.jp/support/7980html/1929.html
アジャイル時代のオブジェクト脳のつくり方 Rubyで学ぶ究極の基礎講座
http://www.shoeisha.co.jp/book/download/9784798134659/detail
パーフェクトRuby
http://gihyo.jp/book/2013/978-4-7741-5879-2/support
Ruby逆引きレシピ
http://rubysappororecipe.com/sample_code.html
effective ruby
https://github.com/pjones/effrb
Rubyによるクローラー開発技法
http://www.sbcr.jp/support/12019.html

ruby on rails書籍
改訂3版 基礎Ruby on Rails
https://www.oiax.jp/rails4book
Ruby on Rails環境構築ガイド
https://www.oiax.jp/rails_kochiku_guide
Ruby on Rails 4アプリケーションプログラミング
http://www.wings.msn.to/index.php/-/A-07/978-4-7741-6410-6/
実践Ruby on Rails 4
https://www.oiax.jp/jissen_rails
Ruby on Rails 5 超入門
http://www.shuwasystem.co.jp/support/7980html/4832.html
RailsによるアジャイルWebアプリケーション開発 第4版
http://www.ohmsha.co.jp/data/link/978-4-274-06866-9/

その他
Rubyソースコード完全解説
http://i.loveruby.net/ja/rhg/book/
JavaScriptでクラスを作るときにprivateをどうするか考えてみた

JavaScriptで自作クラスを作るときに問題となるprivateをどう実装するか、
とりあえずこんな感じだとどうだろう的なものを考えてみた。
ついでに他の言語っぽく変数定義→コンストラクタ→関数の順にも書きたかった。

# private変数のあるクラス

例なので、とりあえず
- インスタンス数を```private static```な変数で持っておいて、```public static```な関数で取得
- カウント数を```private```な変数で持っておいて、```public```な変数でカウント吸うを増やしたりカウント数を取得したりする
というだけのクラスです。

```js:test.js
(function () {
    'use strict';

    // private static 初期化
    let _instanceCount = 0;

    let Class = function () {
        // public
        let _public = this;

        // private 初期化
        let _count = 0;

        // コンストラクタ
        let _constructor = function () {
            _instanceCount++;
        };

        _public.addCount = function () {
            _count++;
        };

        _public.getCount = function () {
            return _count;
        };

        _constructor();
    };

    // public static
    Class.getInstanceCount = function () {
        return _instanceCount;
    };
}());
```

## 補足
- 実際には、```Class```を```myApp.Class```のような名前空間を作ってそこに代入して使う想定。
- ```public static```を下にしかかけないのが辛い
- 書いた本人は言語仕様に詳しくないのでもっと良い書き方があると思う

## 追記
- WeakMapを使った場合は以下のような感じ
- 
```js:test.js
(function () {
    'use strict';

    // WeakMap
    let _weakMap = new WeakMap();

    let _getPrivate = function(object) {
        let map = _weakMap.get(object);
        if(map === null) {
            map = {};
            _weakMap.set(object, map);
        }
        return map;
    }

    // private static 初期化
    let _instanceCount = 0;

    let Class = function () {
        // public
        let _public = this;

        // private 初期化
        let _private = getPrivate(this);

        // コンストラクタ
        let _constructor = function () {
            _instanceCount++;
            _private.count = 0;
        };

        _public.addCount = function () {
            _private.count++;
        };

        _public.getCount = function () {
            return _private.count;
        };

        _constructor();
    };

    // public static
    Class.getInstanceCount = function () {
        return _instanceCount;
    };
}());
```

JavaScriptのclassも、classを使わずにこういう書き方するのもあまり好きじゃない・・・
TeratermのSSHログインするTTLとショートカットの設定

# SSHで自動ログインするTTL

```
;; 定数定義
HOST_ADDRESS = 'localhost'
USER_NAME = 'root'
PASSWORD = 'password'  
INI_FILE = 'TERATERM.INI'
INI_FILE2 = 'TERATERM2.INI'
KEY_FILE = 'KEYWORD.CONF'

;; コマンド設定
COMMAND = HOST_ADDRESS
strconcat COMMAND ':22 /ssh /2 /user='
strconcat COMMAND USER_NAME  
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWORD
strconcat COMMAND ' /F='
strconcat COMMAND INI_FILE

TITLE="商用環境へのアクセス確認"

;; 警告メッセージの設定
MESSAGE="\n"
MESSAGE_FRAME = "######################"
MESSAGE_PAYLOAD = 商用環境へのアクセスしますか？"

strconcat MESSAGE MESSAGE_FRAME
strconcat MESSAGE "\n\n"
strconcat MESSAGE MESSAGE_PAYLOAD
strconcat MESSAGE "\n\n"
strconcat MESSAGE MESSAGE_FRAME
strspecial MESSAGE

;; 警告ダイアログ
yesnobox MESSAGE TITLE
;; NOの場合
if result=0 then
    end
endif

;; 接続
connect COMMAND
;; ウィンドウカラーを変更する

;; iniファイルの読み込み
restoresetup INI_FILE

;; キー設定ファイルを読み込み
loadkeymap KEY_FILE

;; 別のiniファイルを読み込み
;; TTL実行後にウィンドウの色を変更させたいときなど
restoresetup INI_FILE2

end
```

---

## マクロのショートカットキーの割当

KEYWORD.CONFの一番下に下記のように記載する。

```
;[User keys]
;User1=キーコード,コントロールフラグ,TTLのファイルパス
User1=1083,2,"C:\test.ttl"
```

### キーコード

TeraTermにおけるキーの組み合わせを数値化したもの。

キーコードは、以下の実行ファイルで、調べられる。

```
"C:\Program Files (x86)\teraterm\keycode.exe"
-> 1083のなら、Ctrl + F1
```

### コントロールフラグ
キーを押したときに <文字列> をどのように取り扱うかを指定するフラグ。

* 0	<文字列>をそのまま送出する。
* 1	<文字列>に含まれる漢字や改行コードを
		Tera Term の設定にあわせて変換し、変換
		された文字列を送出する。
* 2	<文字列>のファイル名のマクロファイルを
    実行する。
* 3	メニュー ID <文字列> で指定される
   Tera Term のメニューコマンドを実行する。
Ruby メソッドの引数まとめ

Rubyのメソッドの引数についてまとめました。動作確認はRuby 2.4.2 で行っています。

## ここで扱う引数の定義
引数について、ここでは以下の言葉で統一します。

- 仮引数
    - メソッドの定義側で記述される引数
- 実引数
    - メソッドを呼び出す側で記述される引数

```ruby:仮引数（定義側）
def foo(bar) # barが仮引数
  p bar
end
```

```ruby:実引数（呼び出す側）
foo('hoge') # 'hoge'が実引数
```

ちなみに上記がいわゆる一般的なメソッド呼び出しにあたります。呼び出し時にはからなず実引数を記述する必要があります。

## 省略可能な仮引数
メソッドの仮引数にデフォルトを指定すると、呼び出し時に実引数を省略した場合、デフォルト値が仮引数に代入されます。

```ruby
def foo(bar = 'Hello')
  p bar
end

# 実引数を省略した場合デフォルト値が代入される
foo # => "Hello"

# 呼び出し時の括弧は省略可能
foo('hogehoge') # -> "hogehoge"
foo 'hogehoge' # -> "hogehoge"
```

省略可能な仮引数は複数記述できますが、以下のような場合。途中の引数を省略してメソッドを呼び出すことはできません。

```ruby
def foo(bar, baz = 'World', qux = '!!!')
  p "#{bar}、#{baz + qux}"
end

# 実引数を省略した場合デフォルト値が代入される
foo('Hello') # => "Hello、World!!!"
foo('Hello', 'Ruby') # => "Hello、Ruby!!!"

# 途中の引数を省略することは不可
foo('Hello', , 'xxx') # -> syntax error, unexpected ')', expecting end-of-input
```

rails本体よく見られる`options = {}` のようにするとハッシュを複数まとめて受けられます。この場合も実引数を省略することが可能です。

```ruby
def foo(bar, options = {})
  p bar
  p options
end

foo('Hello', {baz: 'hoge', qux: 'hoge', quux: 'hoge'})
# => "Hello"
# => {:baz=>"hoge", :qux=>"hoge", :quux=>"hoge"}

foo('Hello')
# => "Hello"
```

## 可変長引数
メソッドの仮引数の前に`*` を付けると、複数の引数をまとめて配列として受け取ることができます。ただしこの可変長引数は1メソッドにつき、1つだけしか指定するができません。

```ruby
def foo(bar, *baz)
  p bar, baz
end

foo('Hello', 'qux', 'quux') # => "Hello"
                            # => ["qux", "quux"]
```

`*`と記述することで受け取った引数を無視するようにも使用できます。

```ruby
def foo(bar, *)
  p "#{bar} Hello!!!"
end

foo('Hi', 'hoge', 'fuga') # => "Hi Hello!!!"
```

同様に`**` とアスタリスクを2つ定義すると複数の引数をhashでまとめて受けられます。

```ruby
def foo(bar, **baz)
  p bar, baz
end

foo('Hello', qux: 'hoge', quux:'fuga') # => "Hello"
                                       # => {:qux=>"hoge", :quux=>"fuga"}
```

## 配列展開
実引数の前に`*`と記述することで配列を展開して渡すことができます。

```ruby
def foo(bar, baz, qux)
  p bar << baz << qux
end

foo(*['Hello', 'World', '!!!']) # => "HelloWorld!!!"
```
もう少し調べてみると単純にArrayクラスのオブジェクトを展開しているだけではなく以下の様なことを行っているようです。

- 引数のオブジェクトが`Array`であれば展開して渡される
- `to_a`を持ってるオブジェクトであれば、`to_a`が実行された状態で展開される
- `to_a`を持っていなければそのまま何もせずに渡される


```ruby
def foo(*bar)
  p bar
end

foo(*{baz: '1', qux: '2', quux: '3'}) # => [[:baz, "1"], [:qux, "2"], [:quux, "3"]]
foo(*1..10) # => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
foo(*123, *'hoge') # => [123, "hoge"]
```
Hyper-V 上に構築した Minikube の VM に SSH で接続する

# 2017/09/18 22:20追記
この記事投稿して少し経った後に`minikube help`見て気づきました。

```ps1
minikube ssh
```

これだけでOKでした。
`--profile`を指定している場合は

```ps1
minikube --profile="hoge" ssh
```

こんな感じです。

---

Hyper-V 上に構築した（`--vm-driver="hyperv"`を指定） Minikube の VM に接続したいことがあったため、それのメモ。
VM ドライバや Kubernetes バージョン以外は全てデフォルト値を使用して構築しています。

# 環境など

* Windows10 Pro
* Minikube 0.22.1 [^1]
* [Win32-OpenSSH](https://github.com/PowerShell/Win32-OpenSSH "github.com/PowerShell/Win32-OpenSSH") インストール済み

[^1]: 2017/09/18 時点の話ですが、 [リポジトリの Releases](https://github.com/kubernetes/minikube/releases "github.com/kubernetes/minikube/releases") で配布されているバイナリだと`minikube start`が途中でコケます（鍵の転送がうまくいっていない模様）。なので[こちら](https://github.com/kubernetes/minikube/pull/1959#issuecomment-329984084 "Minikube Pull request #1959")のバイナリを使用しました。

# 接続
PowerShell を使用して接続します（ OpenSSH インストール済み）。

```ps1
$MK_PF = "minikube"; ssh -i $env:HOMEDRIVE$env:HOMEPATH\.minikube\machines\$MK_PF\id_rsa docker@$(((Get-VM $MK_PF).networkadapters[0]).ipaddresses[0])
```

`minikube start`時に`--profile`オプションを指定して VM 名を設定している場合は、`$MK_PF`変数にその VM 名を設定してください（デフォルトは minikube）。

## 簡単な説明
SSH で使用する VM の秘密/公開鍵はユーザホームフォルダの`.minikube\machines\VM名\`に保存されています。
ユーザ名は`docker`になります。ログイン後`su -`で root に昇格できます。
VM のIPアドレスは`Get-VM`を使用して取得しています。 VM 名は`minikube start`時の`--profile`オプションで指定した文字列が使用されます。

### 蛇足
Windows の場合、`.minikube`フォルダが作成される場所は、以下の順番で評価され決定されます。

1. `HOME`環境変数に値が設定されており、その値のフォルダが存在するか
2. `HOMEDRIVE`環境変数と`HOMEPATH`環境変数に値が設定されており、`HOMEDRIVE`と`HOMEPATH`を結合し、その結合した値のフォルダが存在するか
3. `USERPROFILE`環境変数に値が設定されており、その値のフォルダが存在するか
4. 上記3つとも値が設定されていないまたはフォルダが存在しない場合、`HOME`環境変数の値が無条件で使用される

これらの処理は https://github.com/kubernetes/client-go/blob/master/util/homedir/homedir.go に書かれています。
Rubyのattr_accessorとインスタンス変数

Rubyの`attr_accessor`と`@インスタンス変数`について調べたのでまとめました。

## 外部からのインスタンス変数へのアクセス

```ruby
class Foo
  attr_accessor :bar
end

foo = Foo.new
foo.bar = 'instance!!!'
foo.bar # => "instance!!!"
```

`foo.bar = 'instance!!!'` は一見、変数へ代入しているように見えますが、実態は`attr_accessor` が作成した以下のような`Foo#bar=` メソッドを呼び出しています。

```ruby
def bar=(val)
  @bar = val
end
```
従って`foo.bar = 'instance!!!'` の右辺はメソッドの引数です。また、Rubyにはsyntax sugarが用意されており、`foo.bar=` と書かなくても`foo.bar =` のように代入しているみたいに書けるのです。

参照についても同じく`foo.bar`は、`@bar` を返す`bar` という以下のようなメソッドを呼び出しています。

```ruby
def bar
  @bar
end
```



## インスタンスメソッドからのアクセス
```ruby
class Foo
  attr_accessor :bar

  def method_baz
    p "#{@bar} from method_baz"
  end 

  # attr_accessor :bar が定義されていなければ、barメソッドを呼び出せすNameErrorとなる
  def method_qux
    p "#{bar} from method_qux"
  end
end

foo = Foo.new
foo.bar = 'instance!!!'
foo.method_baz # => "instance!!! from method_baz"
foo.method_qux # => "instance!!! from method_qux"
```


`method_qux` では`@` を付けなくてもインスタンス変数を参照しています。
これも上記と同じく`attr_accessor` が作成した`@bar` を返す`bar` というメソッドを呼び出しているからです。
従ってアクセサが定義されていなければ、`method_qux` はエラーになります。

## インスタンスメソッドからのアクセス 2

```ruby
class Foo
  attr_accessor :bar

  def method_quux
    p bar
    bar = 'blue!!!'
    p bar
    p @bar
    p bar()
  end 
end

foo = Foo.new
foo.bar = 'red!!!'
foo.method_quux # => "red!!!"
                # => "blue!!!"
                # => "red!!!"
                # => "red!!!"
```

`method_quux` では1回目の`p bar` と2回目の`p bar` で出力される値が異なります。
これは1回目の`p bar` では`attr_accessor` が作成している`@bar` を返す`bar` というメソッドを呼び出しているのに対して、2回目の`p bar` では直前に定義された同名のローカル変数を参照しているためです。
この場合、インスタンス変数を参照したい時は素直に`@bar` とするか`bar()`と括弧を付けて明示的にメソッド呼び出しにする必要があります。

## 参考
以下の記事が参考になりました。
http://qiita.com/mogulla3/items/cd4d6e188c34c6819709
Rubyのクラスまとめ

Rubyのクラスについてまとめます。

## インスタンスとインスタンスメソッド
クラスからインスタンスを生成するには`new`メソッドを使用します。
クラス内に定義したメソッドはそのインスタンスから呼び出せます。このメソッドをインスタンスメソッドと言います。
クラスにはインスタンスメソッドとして`initialize`が用意されており、インスタンス化時の処理をここに書くことができます。(不要な場合は省略可)

```ruby
class Foo
  def initialize
    p 'initialize!!!'
  end

  def sample_method
    p 'sample_method!!!'
  end
end

foo = Foo.new # => "initialize!!!"
foo.sample_method # => "sample_method!!!"
```

## インスタンス変数
- インスタンス内でのみ参照可能な変数で状態を保持できる
- 外から参照するにはアクセサを定義する必要がある
- インスタンス変数の定義は`@bar`のように先頭に@を付ける

```ruby
class Foo
  def initialize
    @bar = 'instance!!!'
  end
  
  def sample_method
    p @bar
  end
end

foo = Foo.new
foo.sample_method # => "instance!!!"
```

#### インスタンス変数に外部からアクセスする
インスタンス変数に外部からアクセスするには以下のメソッドを追加する必要があります。

- 代入するメソッド
    - `Foo#bar=`
- 参照するメソッド
    - `Foo#bar`


```ruby
class Foo
  def bar=(value)
    @bar = value
  end

  def bar
    @bar
  end
end

foo = Foo.new
foo.bar = 'instance!!!' # syntax sugarが用意されており、foo.bar= と書かなくても代入のように書ける
foo.bar # => "instance!!!"
```

これを簡単にしたのが`attr_accessor`でアクセサと呼ばれます。
アクセサを用いることで、上記のようにわざわざメソッドを定義しなくてもこれだけで外部からインスタンス変数を使用することができます。実態は`Foo#bar=`メソッドや`Foo#bar`メソッドを`attr_accessor`が作っているのです。

```ruby
class Foo
  attr_accessor :bar # 引数は可変長のため複数定義が可能 => attr_accessor :bar_a, :bar_b
end

foo = Foo.new
foo.bar = 'instance!!!'
foo.bar # => "instance!!!"
```


## クラスメソッド
インスタンス化せずともクラスに対して直接メソッドを呼び出すことができます。
クラスメソッドの定義は`self.sample_method` のように`self.` をメソッド名の前につけます。

```ruby
class Foo
  def self.sample_method
    p 'class method!!!'
  end
end

Foo.sample_method # => "calss method!!!"
```

また以下のように `class << self..end` の中にメソッドを定義することでも、クラスメソッドとなります。こうすることで複数まとめてクラスメソッドを定義でき、ネストすることでインスタンスメソッドとの区別が明確になります。

```ruby
class Foo
  class << self
    def method_bar
      p 'class method bar!!!'
    end

    def method_baz
      p 'class method baz!!!'
    end
  end
end

Foo.method_bar # => "calss method bar!!!"
Foo.method_baz # => "calss method baz!!!"
```
DictionaryのTValueにStreamWriterを入れる

メモリ4GB(32bit)の環境で、2.5GBのCSVを処理する必要に迫られました。
当初は1行ごとにStreamWriterを開く、書く閉じるを繰り返していましたが、あまりに遅かったため全部開きっぱなしにて効率よく管理するために、Dictionaryに持たせてみました。
想定通り動いてくれたのでメモ書き。

```csharp:Program.cs
using System;
using System.Collections.Generic;
using System.IO;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"C:\test\";
            int div = 200;

            // テスト用ファイルを作る
            using (StreamWriter sw = new StreamWriter(path + "test.txt"))
            {
                for (int i = 1; i < 50000000; i++)
                {
                    sw.WriteLine(i.ToString() + ",いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす");
                }
            }

            // 書き込み用のStreamWriterを開く
            Dictionary<int, StreamWriter> writer = new Dictionary<int, StreamWriter>();
            for (int i = 0; i < div; i++)
            {
                writer.Add(i, new StreamWriter(path + i.ToString() + ".txt"));
            }

            // ここで内容判断、書き込み先の分岐処理を行う
            using (StreamReader sr = new StreamReader(path + "test.txt"))
            {
                while (sr.Peek() >= 0)
                {
                    string s = sr.ReadLine();
                    writer[Convert.ToInt32(s.Split(',')[0]) % div].WriteLine(s);
                }
            }

            // 忘れずにStreamWriterを閉じる
            for (int i = 0; i < div; i++)
            {
                writer[i].Close();
                writer[i].Dispose();
            }
        }
    }
}
```
Wordpressとtwitter


最近Wordpress好きです。
というわけでWordpressの記事を書きます。

twitterのTL（タイムライン）をホームページに乗っけてみました。
備忘録ついでに方法を記載します。

## 手順１ まずはこのサイトにアクセス！

https://publish.twitter.com/?url=https%3A%2F%2Ftwitter.com#https://publish.twitter.com/?url=https%3A%2F%2Ftwitter.com#

入力エリアにtwitterのMy Page のリンクを貼り付けましょう。

![スクリーンショット 2017-09-16 23.00.54-min.png](https://qiita-image-store.s3.amazonaws.com/0/136533/5482cd53-712f-ab72-8960-442cb7cf4a75.png "スクリーンショット 2017-09-16 23.00.54-min.png")


私の場合はこんなURLです。

https://twitter.com/ENZEN0129?lang=ja

## 手順２ →ボタンを押すと画面がスクロールされて以下のような画面になります
左側のイメージをクリックします。

![スクリーンショット 2017-09-16 23.04.48-min.png](https://qiita-image-store.s3.amazonaws.com/0/136533/ce1d42ec-80f5-9a2f-548d-19aff54b494a.png "スクリーンショット 2017-09-16 23.04.48-min.png")


## 手順３ set customization options リンクをクリックします

![スクリーンショット 2017-09-16 23.07.28-min.png](https://qiita-image-store.s3.amazonaws.com/0/136533/0802888e-0a2c-d8e0-8ecb-84ed23263ab6.png "スクリーンショット 2017-09-16 23.07.28-min.png")


## 手順４ お好みの設定に変更して Update ボタンをクリックします

![スクリーンショット 2017-09-16 23.11.27-min.png](https://qiita-image-store.s3.amazonaws.com/0/136533/38185865-4d6b-70a0-0651-6472bc8ee7c5.png "スクリーンショット 2017-09-16 23.11.27-min.png")


## 手順５ Copy Codeをクリックします

![スクリーンショット 2017-09-16 23.13.01-min.png](https://qiita-image-store.s3.amazonaws.com/0/136533/1dfc1362-d6e8-3ec0-c127-db3b010502b8.png "スクリーンショット 2017-09-16 23.13.01-min.png")


## 手順６ 次はWordpressの操作でダッシュボードの外観のウィジェットをクリックします。

![スクリーンショット 2017-09-16 23.14.29-min.png](https://qiita-image-store.s3.amazonaws.com/0/136533/0d2f01d3-0db2-6840-bb00-db572511aa6d.png "スクリーンショット 2017-09-16 23.14.29-min.png")


## 手順７ テキストを選択して先ほどコピーしたコードをペーストします。


![スクリーンショット 2017-09-16 23.21.15-min.png](https://qiita-image-store.s3.amazonaws.com/0/136533/07755675-6878-bbb5-fcd4-90ec3328b9a1.png "スクリーンショット 2017-09-16 23.21.15-min.png")



保存をクリックして終了です。

私のブログの画像です。高さや幅を指定してぴったり表示されていますね。

![スクリーンショット 2017-09-16 23.22.20-min.png](https://qiita-image-store.s3.amazonaws.com/0/136533/adad485f-a03b-360e-8458-373a77a5f5e5.png "スクリーンショット 2017-09-16 23.22.20-min.png")


ついでにTwitter公式のプラグインをいれたので
twitterに記事のリンクを貼るとカードが表示されるようになりました。

![Kobito.2QRqKk.png](https://qiita-image-store.s3.amazonaws.com/0/136533/b290201d-156d-9a41-df5d-203ddf073545.png "Kobito.2QRqKk.png")


ちなみになんでTLを入れたかというと以下のメリットがあるようです。

 - ブログの更新が行われていなくても画面に変化をつけやすい。
 - 動いている感じがする
 - リアルタイムな情報収集ができる
 - 交流のきっかけのひとつになる


などの効果があるそうなのでいれました。
プログラミングやコーディングを一切しなくていいのにすごいですね。
DokuwikiのChangesプラグインで対象ページを限定する

[DokuWiki](https://www.dokuwiki.org/)のサイドバーなどで変更履歴を表示するのに[Changesプラグイン](https://www.dokuwiki.org/plugin:changes)を使っているのですが、デフォルトではサイドバー自身やplaygroundの変更履歴も表示されてしまい、今ひとつです。
[プラグインの仕様](https://www.dokuwiki.org/plugin:changes)を見ると、`ns`というパラメータがあり、対象とする名前空間(namespace)を指定することができることがわかります。マイナスをつければ除外したい名前空間も指定できます。

```
{{changes>ns = -playground,-wiki}}
```

これで解決すれば特に問題はなかったのですが、これだとplaygroundやwikiの名前空間はめでたく除外されるのですが、sidebarは名前空間がないのでうまく指定できません。試しに、

```
{{changes>ns = -playground,-wiki,-}}
```

とマイナスだけ指定してみてもうまくいきませんでした。

他に使えそうなパラメータもないので、改造するしかないかなと思ってソースを見始めたのですが、ありました、隠しパラメータが。

```syntax.php
    case 'excludedpages':
        foreach(preg_split('/\s*,\s*/', $value) as $page) {
            if(!empty($page)) {
                resolve_pageid(getNS($ID), $page, $exists);
                $data[$name][] = $page;
            }
        }
        break;
```

これを使って除外対象ページを直接指定すれことで、変更履歴の対象から外すことができました。

```
{{changes>ns = -playground,-wiki&excludedpages = sidebar}}
```
[Monaca] iOS 10で <input type='file' /> を利用する際の注意点

iOS 10から、ユーザーのプライバシー情報にアクセスする際のセキュリティが強化されました。
そのため、フォトライブラリーにアクセスする際には、利用者に許可をしてもらう必要があります。

Monacaで開発するアプリをiOS 10で使用した場合、`input` タグの `type` 属性に `file` を指定されていると、通常フォトライブラリーが開きます。この時、アプリに適切な設定がされていないと、フォトライブラリーにアクセスした際に、アプリが落ちてしまいます。

# NSPhotoLibraryUsageDescriptionの設定

Monacaでは、config.xmlに下記の設定を行うことで回避することができます。

```xml:config.xml
<platform name="ios">
  <config-file target="*-Info.plist" parent="NSPhotoLibraryUsageDescription">
    <string>ここに、説明文を記載します。</string>
  </config-file>
</platform>
```

Monacaデバッガーには、`NSPhotoLibraryUsageDescription` の設定がされているため、iOS 10で使用しても上記の理由で落ちることはありません。

ビルドしたアプリをiOS 10で使用した際、フォトライブラリーにアクセスした時にアプリが落ちる場合は、上記の設定をお試しください。
[AWS]EC2シャットダウン時にログをS3に逃がす

AWS上でAutoScaleを利用していると、ヘルスチェックでミスったりの予期せぬEC2停止でEC2ごと削除されることがままあります。
いざ原因をログから解析しようと思っても、EC2ごとログが消えているため、どうにもならないことがありました。

そんなときのためにEC2停止時に指定したログをS3上に逃がすスクリプトを作成しました。
*注：この方法は、EC2がshutdownコマンドなどで正常停止する場合に取得可能です。（AutoScaleなどから切り離された時など）
EC2自体がカーネルパニックやハードウェア障害で正常に停止していない場合はこの方法では救えません（経験上ほぼないですが）*

###[必要なもの（※Amazon Linuxに設定する前提）]
-EC2停止時にS3にログを退避するスクリプト
-退避する対象のログリスト
-ログ退避スクリプトをEC2停止時に実行するサービス起動・停止（init.d）スクリプト


##### [EC2停止時にS3にログを退避するスクリプト]
日付とインスタンスIDをログに付与してS3にアップロード
※1 以下はawsの情報取得にcredentialsにアクセスキーを記載して利用しているが、IamRoleを利用できるならばそのほうがよい
※2 パスも/usr/local/bin/と/usr/local/etc/を利用しているが任意

```bash:/usr/local/bin/logmvs3_shutdown.sh
#!/bin/sh

DATESTR=`date +%Y%m%d_%H%M%S`

# コンフィグ情報読み込み
INSTANCEID=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
AWSSETTING=/root/.aws/credentials
SRCFILELIST=/usr/local/etc/shutdown_targetfile.txt
TMPCPPATH=/tmp/logtmp
BUCKET=hogehoge-log
FOLDER=hoge/shutdown

export AWS_CONFIG_FILE=$AWSSETTING

# ログ取得の対象を作業フォルダにコピー
mkdir -p $TMPCPPATH 2>/dev/null

cat ${SRCFILELIST} | while read FILEPATH
do
cp -f ${FILEPATH} $TMPCPPATH/
done

# 指定パス対象にgzip化
for i in `find $TMPCPPATH -maxdepth 1 -type f | egrep -v gz`
do
        gzip -c $i > $i"_shutdown_"$INSTANCEID"_"${DATESTR}.gz
        rm -f $i
done

# S3のフォルダへ.gzファイルをアップロード　合わせて、取得したログ一覧も
aws s3 cp $TMPCPPATH s3://$BUCKET/$FOLDER/$DATESTR/ --exclude "*" --include "*.gz" --recursive
aws s3 cp $SRCFILELIST s3://$BUCKET/$FOLDER/$DATESTR/

# 作業フォルダを削除する
rm -rf $TMPCPPATH
```

##### [EC2停止時にS3にログを退避するスクリプト]
ファイル単位で指定
ここではシステム関連の/var/log/のみ退避させている。tomcatやnginxなどのアプリケーションログも指定可能
各システムに必要なものを指定する

```none:/usr/local/etc/shutdown_targetfile.txt
/var/log/messages
/var/log/cron
/var/log/secure
```

##### [ログ退避スクリプトをEC2停止時に実行するサービス起動・停止（init.d）スクリプト]
サービス起動時に2重起動防止をしておき、サービス停止時（マシン停止時）にスクリプトを実行
chkconfig: runlevel 起動順番 終了順番　のため、起動を一番遅く、停止時は一番早く実行する

```bash:/etc/rc.d/init.d/logmvs3_shutdown
#!/bin/bash
#
# Version: 0.1
#
# chkconfig: 345 99 01
# description: logmvs3_shutdown shell
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin

# Source function library.
. /etc/init.d/functions

start() {
        touch /var/lock/subsys/logmvs3_shutdown
}

stop() {
        rm -f /var/lock/subsys/logmvs3_shutdown
        /usr/local/bin/logmvs3_shutdown.sh
}

restart() {
        stop
        start
}


case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                restart
                ;;
        *)
                echo "Usage: $0 {start|stop|restart}"
                exit 1
esac
exit 0
```

##### [サービス登録と確認]
あとは以下のコマンドを実行し、サービスに登録および開始しておく
`chkconfig --add　logmvs3_shutdown`
`service logmvs3_shutdown start`

再起動してみて、指定のS3バケットのフォルダにログがアップロードされていればOK
ASP.Net Core2.0 で ReactJS.NETを使う際にはConfigureServicesメソッドでIServiceProviderを返さないとInvalidOperationException

ASP.Net Core2.0でReactを使おうと勉強してたら軽くハマってしまったが、エラーメッセージでググったら瞬殺でした・・・

[Setting Up ReactJS on .NET Core 2.0, InvalidOperationException](https://stackoverflow.com/questions/45288226/setting-up-reactjs-on-net-core-2-0-invalidoperationexception)


以下、軽く日本語訳 + 説明

>and trying to add ReactJS by following the tutorial here: (https://reactjs.net/getting-started/tutorial.html)
When going through the tutorial, however, I get an "InvalidOperationException" error that says: 'Cannot resolve scoped service 'React.AspNet.HttpContextLifetimeProvider+PerRequestRegistrations' from root provider.'
Specifically the error comes from the app.UseReact(config=> ... ) section of the tutorial.


チュートリアルに従ってコーディングしてたら『app.UseReact(config=> ... )』の箇所でInvalidOperationExceptionになっちゃった ＞＜



>see https://github.com/reactjs/React.NET/issues/433
change in Startup.cs
public void ConfigureServices(IServiceCollection services)
to
public IServiceProvider ConfigureServices(IServiceCollection services)
and return services.BuildServiceProvider();

これをみてごらん
[Error on startup in core 2.0 'React.AspNet.HttpContextLifetimeProvider` #433](https://github.com/reactjs/React.NET/issues/433)

Startup.csのConfigureServicesの返り値をIServiceProvider にして
services.BuildServiceProvider()を返すんだ。


Before

```csharp:Startup.cs
public void ConfigureServices(IServiceCollection services)
{
}
```

After


```csharp:Startup.cs
public IServiceProvider ConfigureServices(IServiceCollection services)
{
    return services.BuildServiceProvider();
}
```
macOS SierraのインストールUSBの作成

# はじめに
macOS SierraのUSBメモリを使ったインストールメディアを作成する。

# 必要なもの
+ macOS Sierra
+ 8GB以上のUSBメモリ(できるだけ高速なもの)


# 手順
### 1.『macOS Sierra』をApp Storeからダウンロードする。（完了すると、/Applicationsフォルダに保存される。）
![スクリーンショット 2017-09-18 18.05.20.png](https://qiita-image-store.s3.amazonaws.com/0/54439/598e4ac7-df6e-f608-ad20-c4423b909eb7.png)

### 2. 『ディスクユーティリティ.app』でUSBメモリの名前を『Untitled』にして、USBメモリを消去する。![スクリーンショット 2017-09-18 18.25.47.png](https://qiita-image-store.s3.amazonaws.com/0/54439/bde9a29c-618e-970f-1616-bb249a5c619d.png)

### 3. USBメモリのマウントを確認する。
次のコマンドを実行して先ほど作成したUSBメモリをマウントしていることを確認する。

```
$ ls /Volumes/
```

![スクリーンショット 2017-09-18 20.17.39.png](https://qiita-image-store.s3.amazonaws.com/0/54439/0c853edb-3c85-be47-dcf6-5e817472501b.png)


### 4. インストールUSBメディアを作成する。
次のコマンドを実行してインストールUSBメディアを作成する。

```
$ sudo /Applications/Install\ macOS\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/Untitled --applicationpath "/Applications/Install macOS Sierra.app"
```

![スクリーンショット 2017-09-18 20.30.00.png](https://qiita-image-store.s3.amazonaws.com/0/54439/e6917876-671d-c733-5d43-24d6b789816b.png)
OpenWrt/LEDEでUSBシリアル変換アダプタを使う

Silicon Labs CP2102を利用したUSB-TTL変換モジュールをOpenWrt/LEDE環境で使おうと思った。手元のマシンは古いBuffaloのルータにLEDE 17.01.2をインストールしたもの。

cp210xのカーネルモジュールだけインストールしたら動くかと思いきや、USB一式を別途インストールする必要があった。

```
# opkg update
# opkg install kmod-usb-uhci
# opkg install kmod-usb-ohci
# opkg install kmod-usb2
# opkg install kmod-usb-serial-cp210x
```

結果。

```
# dmesg
 (snip)
[   12.139580] usbcore: registered new interface driver cp210x
[   12.145297] usbserial: USB Serial support registered for cp210x
 (snip)
[   12.747034] cp210x 2-1:1.0: cp210x converter detected
[   12.752381] usb 2-1: cp210x converter now attached to ttyUSB0
 (snip)
```

無事 `/dev/ttyUSB0` にシリアルデバイスが作られた。
ButterKnife をアップデート後、ビルド時に ZipException が出た時の対応


## 発生状況
* `ButterKnife 7` -> `8.8.1` に変更
* `KotterKnife 0.1.0-SNAPSHOT`

```:error
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: 
duplicate entry: butterknife/BuildConfig.class
```

## 原因
* `ButterKnife` と `KotterKnife` のpackage名が重複し、その結果BuildConfigが重複したことによるエラー
	* ※ButterKnife 7系はBuildConfigを生成しないためエラーが発生していなかった

## 対応
* [修正PR](https://github.com/JakeWharton/kotterknife/pull/46)はすでに `master` にマージされているため、該当PRマージ時のコミット番号を指定して取得する。
	* 先駆者に感謝😀
	* `Github` から ソースを取得するために [JitPack.io](https://jitpack.io/) を利用します。
	* `master` を指定でも良いですが、よく分からない修正が入るのは怖いため、コミット番号指定がオススメです

```

repositories {
    maven { url "https://jitpack.io"; }
}
dependencies {
    compile 'com.github.JakeWharton:kotterknife:11748c0b1e16fd66f75b381e5266c9ec99f67dab'
}
```
react-chartjs-2の例 （幅と高さの固定方法）

#概要
手軽にグラフを描けるライブラリ[Chart.js](http://www.chartjs.org/)を、
Reactのコンポーネントとして扱うことができるライブラリ、[react-chartjs-2](https://github.com/jerairrest/react-chartjs-2)を使用する際に、幅と高さを固定幅にする際にハマったのでメモにしました。

#環境
```
npm install --save react-chartjs-2@2.6 chart.js@2.6
```

#ハマったところ
[react-chartjs-2](https://github.com/jerairrest/react-chartjs-2)の公式サイトでは、幅と高さをカスタマイズするためには、optionとして`maintainAspectRatio: false`とすると書いてあります。
しかし、その通りにして実行すると、heightは設定した通りになるのですが、widthは横幅いっぱいに広がってしまいます。
この解決方法としては、optionに `responsive: false`を加えることで、レスポンシブルデザインをオフにすることで固定幅にすることができます。

#例
実際のコードと実行例は次の通りです。
### コード

```js:index.jsx
import React from 'react';
import ReactDOM from 'react-dom';
import { Line } from 'react-chartjs-2';

const App = () => {
  const chartData = {
    labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
    datasets: [
      {
        label: 'My First dataset',
        fill: false,
        lineTension: 0.1,
        backgroundColor: 'rgba(75,192,192,0.4)',
        borderColor: 'rgba(75,192,192,1)',
        borderCapStyle: 'butt',
        borderDash: [],
        borderDashOffset: 0.0,
        borderJoinStyle: 'miter',
        pointBorderColor: 'rgba(75,192,192,1)',
        pointBackgroundColor: '#fff',
        pointBorderWidth: 1,
        pointHoverRadius: 5,
        pointHoverBackgroundColor: 'rgba(75,192,192,1)',
        pointHoverBorderColor: 'rgba(220,220,220,1)',
        pointHoverBorderWidth: 2,
        pointRadius: 1,
        pointHitRadius: 10,
        data: [65, 59, 80, 81, 56, 55, 40],
      }
    ]
  };

  const options = {
    maintainAspectRatio: false,
    responsive: false,
  };

  return (
    <Line
      data={chartData}
      options={options}
      width={200}
      height={200}
    />

  );
};

ReactDOM.render((
  <App />
), document.getElementById('app'));
```

### 実行例
<img width="716" alt="動作例.png" src="https://qiita-image-store.s3.amazonaws.com/0/131125/d7e291b2-0e07-a8fc-c197-59d76ae77679.png">
get the data from Linked Server

最近Linked Serverを使用する事がありその際の情報共有です。
以外に接続方法が分からない人は下記をお試しください。
※事前に下記URLよりLinked Serverの設定済の方対象。
linked serverの設定は大体下記のURLでOK
URL:
http://learnsqlwithbru.com/2012/01/06/create-linked-server-to-connect-to-another-sql-server-part-i/
型:
select *
from [server IP].[DB名].[dbo].[table名]
例:
selecg * from [192.168.184.111].[DB].[dbo].[TableA]
ポイントは[]を外さないこと。
dboの箇所はそのまま使用。
変更箇所は、server IP,DB名,テーブル名の３カ所
[Wordpress]テキストウィジェットにリンク付き画像を追加するショートコード


サイドバーにリンク付き画像を置くのにウィジェットを利用しようとするも、画像のみ、もしくはテキストのみのウィジェットしかなく、リンク付き画像するためにはHTMLで書かなければなりません。

例えば投稿や固定ページのように「メディアを追加」機能があれば良いのですが、ウィジェットにはそれがなく、定期的にバナーを差し替えたりするのに都度HTMLを書くのは手間ですよね。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/62022/7ef21370-c125-875a-5a18-b844467da992.png "01.png")


そこで、テキストウィジェットを使ってリンク付き画像を置くショートコードを作りました。

## 仕様

* 検証バージョン：WordPress 4.8.1
* テキストウィジェットを利用し、ショートコードで画像＆リンク先を指定
* 画像はメディアへアップロードしたものを利用
* リンクは別窓で開くものとします

## コード
### function.phpに記述するコード

function.phpの編集に慣れていない方は、function.phpの最終行以降に追加しましょう。（途中に挿入したりしない）

```php
// ウィジェット内でショートコードを有効にするための設定
add_filter('widget_text', 'do_shortcode' );

function imgLink($atts){
  extract(shortcode_atts(array(
    'name' =>null,
    'url' =>null
  ),$atts));

  $bannerData = get_page_by_title( $name, OBJECT, 'attachment' );

  $imgId        = $bannerData->ID;
  $imgCaption   = get_post_meta($imgId, '_wp_attachment_image_alt', true);
  $imgData      = wp_get_attachment_metadata($imgId);
  $imgPath      = wp_upload_dir()['baseurl'].'/'.$imgData['file'];

  $src = '<p>'; // 開始タグ

  // 画像にリンクする場合
  if($url != null) {
    $src = '<a href="'.$url.'" target="_blank">';
    $src .= '<img src="'.$imgPath.'" alt="'.$imgCaption.'">';
    $src .= '</a>';
  } else {
  // リンクしない場合
    $src = '<img src="'.$imgPath.'" alt="'.$imgCaption.'">';
  }

  $src .= '</p>'; // 終了タグ

  return $src;
}
add_shortcode('img','imgLink'); //前者がショートコードなので分かりやすい名前にしましょう。
```

以上で前準備は完了です。

### ショートコードの使い方

まず、画像をアップロードします。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/62022/e3cf43bb-def7-dcd7-0208-8cf0e0c6519f.png "02.png")


画像には
1. タイトル
2. 代替テキスト
を、それぞれ設定します。
代替テキストには、画像の説明文を記入してください。

![03.png](https://qiita-image-store.s3.amazonaws.com/0/62022/077c5a14-c882-41f7-07b9-491828c18b28.png "03.png")


画像をアップロードしたら、外観 ＞ ウィジェットのページから、リンク付き画像を置きたいウィジェットスペースを選択し、利用できるウィジェットの中から「テキスト」を選んで、ウィジェットスペースへ追加します。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/62022/0da7b117-9401-cdb9-688b-b95215768991.png "04.png")



ウィジェットの本文に、先に設定したショートコードを記入します。

```
[img name="画像のタイトル" url="リンク先URL"]
```


例えばこの画像を使う場合は、

![03.png](https://qiita-image-store.s3.amazonaws.com/0/62022/a19aa5a7-da26-4f10-ea92-a8793904067f.png "03.png")


```
[img name="banner" url="http://hoge.com"]
```
という書き方になります。

リンクせず画像のみを置く場合は

```
[img name="banner"]
```

と書きます。

ショートコードを書いたら、最後にウィジェットの保存ボタンを押して保存します。

![06.png](https://qiita-image-store.s3.amazonaws.com/0/62022/0466d188-15fd-cb56-fb44-a30f75c2a67c.png "06.png")

これでリンク付き画像が完成しています。

実際にページを見てみると、このようになります。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/62022/7f95a97b-d717-853b-b7df-9d3297e0ae41.png "05.png")


### 出力されるHTML

```html
<div class="textwidget">
	<p><a href="http://hoge.com" target="_blank"><img src="サイトURL/wp-content/uploads/2017/09/banner.png" alt="バナー"></a></p>
</div>
```

※```src="..."```のuploads以降のディレクトリは画像ごとに異なります。
利用しているテーマやテンプレートファイルの設定によりますが、デフォルトのままであれば

```<div class="textwidget">...</div>```で囲われます。

また、画像のalt属性に「代替テキスト」が適用されているのがわかります。

尚、ショートコードは投稿や固定ページの本文でも同じ使い方ができます。

以上です。

今回はこのようなショートコードを作りましたが、実際はもっと簡単にリンクくらい貼れると思うのですが…私が知らないだけでしょうか…。
もし分かる方がいらっしゃったら是非教えていただけると助かります。
NanoPi NEO, NEO2, NEO Plus2, Duo スペックまとめ

# NanoPi NEO, NEO2, NEO Plus2, Duo スペックまとめ

NanoPi NEOシリーズ概ね揃ったので、Duo 含めスペックについて纏めてみた。

<img width="512" alt="_72D0845.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/187531/fcbb8722-e774-01b7-2482-9f798860b6f4.png">

# スペック比較

||NanoPi Duo|NanoPi NEO|NanoPi NEO Core|NanoPi NEO2|NanoPi NEO Plus2|NanoPi NEO Core2|RaspberryPi3|BeagleBone Black|NanoPi M1 Plus|NanoPi NEO Air|NanoPi A64|NanoPi K2|NanoPi Fire2A|NanoPi Fire3
|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--
|SoC|Allwinner H2+|Allwinner H3|Allwinner H3|Allwinner H5|Allwinner H5|Allwinner H5|Broadcom BCM2837|TI AM335x|||Allwinner A64|Amlogic S905|S5P4418|S5P6818
|CPU|Cortex-A7 x4|Cortex-A7 x4|Cortex-A7 x 4|Cortex-A53 x4|Cortex-A53 x4|Cortex-A53|Cortex-A53 x4|Cortex-A8 x1|Cortex-A7 x4|Cortex-A7 x4|Cortex-A53 x4|Cortex-A53 x 4|Coretex-A9 x 4|Cortex-A53 x 8
|GPU|ARM Mali400 MP2?|ARM Mali400 MP2|???|ARM Mali450 MP4|ARM Mali450 MP4|???|VideoCore IV|SGX530|ARM Mali400 MP2|???|Mali400 MP2|ARM Mali450 penta-core|???|???
|Memory|256MB/512MB|256MB/512MB|256/512MB|512MB|1GB|512M/1GB|1GB|512MB|1GB|512MB|1GB|2GB|512MB|1GB
|LAN|100Mbps|100Mbps|100Mbps|1Gbps|1Gbps|1Gbps|1Gbps|100Mbps|1Gbps|-|1Gbps|1Gbps|1Gbps|1Gbps
|Wifi|802.11n|-|-|-|802.11n|-|802.11n|-|801.11n|802.11n|802.11n|802.11n|-|-
|Bluetooth|-|-|-|-|4.0|-|4.1|-|4.0 dual mode|4.0 dual mode|-？|4.0 dual mode|-|-
|OnBoard eMMC|-|-|0/8/16/32GB|-|8GB|8/16/32GB|-|4GB|8GB|8GB|-|- (eMMC socket)|-|-
|Size|25.4 x 50|40 x 40|40 x 40|40 x 40|40 x 52|40 x 40|85 x 56|86 x 53|64 x 60|40 x 40|64 x 64|56 x 85|75 x 40|75 x 40
|面積 ㎜2|1270|1600|1600|1600|2080|1600|4760|4558|3840|1600|4096|4760|3000|3000
|Price|＄7.99/＄11.99|＄7.99/＄9.99|＄12.5|＄14.99|＄24.99|＄39.00|5,670円|6,559円|＄38.00|＄28.00|＄19.99|＄45.00|＄28.00|＄35.00

# NanoPi-NEO2 LTS の変更点

NanoPi-NEO2(v1.0) が NanoPi-NEO2(v1.1)LTSとなりました。
http://www.friendlyarm.com/index.php?route=product/product&product_id=180
http://wiki.friendlyarm.com/wiki/index.php/NanoPi_NEO2#March-20-2018


LTSは、LongTermSupportの略で長期サポートですね。
組み込み用途をちゃんと意識しているようです。

以下、変更点です。
- 値段高くなった 14.99 → ＄19.99
- メモリ1GBが選択可能に。
- ピンヘッダ未はんだ付け版は廃止(常時はんだ付け)

- SD CardSlot がPopupタイプに
- Audio用ピンヘッダ追加
- LANコネクタの方向変更(NEOと同じ向きになった)
- CVBS出力対応
- MountingHoleが2穴追加
- CPU電圧が 1.1v固定 →　1.1v/1.3vの可変に。

CPU 電圧が1.3vになったことで、CpuFreqがPlus2と同じ1.2GHz動作が可能になっています。

# おまけ

秋月さんが、NanoPiのPiはPythonのPiと言っていますが、
本当はRaspberryPiのPiです(笑

その証拠？として、ピンのレイアウト互換があります。
あくまでもピンレイアウト互換のため、LinuxからのGpioNoとかは異なりソフトウェア的な互換は無いかもしれません。
Pin1~24がレイアウト互換になっています。(完全互換ではありません。一部です。)

NanoPi-NEO/NEO2/NEO Plus2のピンレイアウト
http://wiki.friendlyarm.com/wiki/index.php/File:NEO_pinout-02.jpg

RaspberryPiのピンレイアウト
https://pinout.xyz/

このピンレイアウト互換により、SPI接続のRappberryPi用LCD等や、I2C関係は、NanoPiでも使えたりします。
(ただし、TouchPanel LCDの場合、Pin27がTouch用に使われており、かつ、NanoPi側にはないため、タッチ操作させるためには、LCDにちょっと改造が必要になってしまいます)
eclipseでSpring Bootで開発を始めるまで1

初投稿になります。

今まで業務でも自宅でもWindowsを使用していましたが、Macもいいかなと思いMac book Proを購入しました。

「よーし、これから開発の自己学習をしっかりしていくぞ！」と思ったのも束の間、あれ？あれ？となりまくっているので、自己学習のメモとしてこの記事を書いていきます。

### ※多少設定進めてしまってからの記事なので、少し順序の抜け漏れがあるかもしれません。

今回はeclipseを使用してSpring Bootで開発を始めるまでです。

＜現在の状況＞
・eclipseインストール：OK (OXYGEN)
・eclipse日本語化：OK
・gitアカウント作成：OK
・gitリポジトリ作成：OK
・ローカルリポジトリ作成：NG

それでは始めていきます。

###1.マーケットプレイスで「STS(Spring Tool Suite)」をダウンロードする。

まず、ｅｃｌｉｐｓｅを起動し、ツールバーの「ヘルプ」をクリックします。
<img width="856" alt="スクリーンショット 2017-09-18 18.19.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/147235/1a43d8c5-8928-9d03-003b-1c6968691a72.png">

そうすると以下のようなメニューが展開されますので、反転している「Eclipse マーケットプレース」をクリックします。
<img width="354" alt="スクリーンショット 2017-09-18 18.20.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/147235/e6b3bd44-49f7-66af-b968-2aad8c037e57.png">

以下の画面が起動します。

<img width="700" alt="スクリーンショット 2017-09-18 18.27.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/147235/0b9d6716-543b-f2ed-c967-848347425ceb.png">

画面が起動したら検索に「Spring Boot」と入れてEnterキーをターンとやってください。
検索結果の中に以下の画面のSTSという緑色のアイコンが出て来ると思いますので、インストールボタンを押してインストールしてください。
<img width="702" alt="スクリーンショット 2017-09-18 18.33.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/147235/5191921f-898d-c1ee-600f-bae93ddc606b.png">

インストールボタンを押すと以下の画面が表示されますので、そのまま「確認>」ボタンをクリックします。
<img width="700" alt="スクリーンショット 2017-09-18 18.56.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/147235/5fedbb4b-6d7d-0a37-5234-84e379fa9251.png">

そのあとはライセンスに同意するかどうかの画面が表示されますので、使用条件を読んで「同意します」を選択すると「完了」ボタンが押せるようになるのでクリックします。
<img width="702" alt="スクリーンショット 2017-09-18 18.57.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/147235/073137ce-1231-17eb-02f7-cb3e34072201.png">


完了をクリックするとダイアログが閉じて、少しすると再起動を促されるメッセージが表示されるので、再起動します。

これ以上画像がアップできないようなので、一度ここまでとして2に続きます。
ZaifAPIを使って仮想通貨の売買をする

# 環境

```
- MacOS Sierra 10.12.6
- Python 3.5.3 :: Anaconda 4.4.0 (x86_64)
- Jupyter 4.3.0
```

# 背景
- Zaif取引所は、ビットコインだけでなく、NEM、Monacoinなど、ここでしか日本円とペアで売買できない仮想通貨のある貴重な仮想通貨取引所である。
- Zaif取引所は、ビットコイン関連の（主にネガティブな）ニュースが報じられた際などに取引量が急増すると、Webサイトが非常に重くなり、取引どころかログインすることすらできなくなることがある。

# 問題
- サーバへの過負荷やDDoS攻撃などが原因でZaif取引所のWebサイトにログインできない状態になると、Webサイトから仮想通貨の売買を行うことができなくなる。

# 解決
- Zaif取引所は、売買価格情報の取得や取引を行うことができるAPIを公開しており、Webサイトが重くなっていてもAPIは生き残っていることが多い。そのため、APIを使うことで、Webサイトにログインできなくても仮想通貨を売買することができる。
- 売買はその時の値動きを確認しながら行う必要がある。Webサイトにログインすることなく値動きを確認する方法についてはこちらの手順を参照：[Zaif取引所のAPIで仮想通貨の売買価格を取得しチャートを作成する](http://qiita.com/occha/items/ed9637a383b1ed49bf5f)（この手順により生成したチャートは[こちら](http://zaif.cryptocurrencies.tokyo/)）

# 事前準備
- APIによる仮想通貨の売買を行うためには、事前に取引用のAPI key及びAPI secretを取得しておく必要がある。これは、Zaif取引所にログインし、[アカウント] > [開発者向けAPI] > [API keys]設定画面から取得することができる。**なお、API keyには必要最低限の権限のみ与えることが安全面から推奨される**（今回は、「info」と「trade」が必要）。**また、取得したAPI key及びAPI secretは、絶対に他人に公開してはいけない。**

# 手順
ZaifAPIを利用し、シンプルに手動で仮想通貨の売買を行う。

- zaifapiモジュールをインポート

```py3
from zaifapi import ZaifPublicApi, ZaifTradeApi
```

- 指値で買う（リミット売りを設定）

```py3
key = "****************************" #API keyを入力
secret = "****************************" #API secretを入力
zaif = ZaifTradeApi(key, secret)

price = 23　#売買を行う価格を設定（ここでは23円で買う）
amount = 1000　#売買を行う量を設定（ここでは1000XEM買う）
limit = 28　#リミット売りする価格を設定（ここでは28円で売る）
currency_pair = "xem_jpy" #売買を行う通貨ペアを設定（ここではNEMを日本円で買う）
action = "bid" #買いか売りかを設定（ここでは買いを設定）

#売買を実行
zaif.trade(currency_pair=currency_pair, action=action, price=price, amount=amount, limit=limit)
```

- 指値で売る（リミット買いを設定）

```py3
key = "****************************" #API keyを入力
secret = "****************************" #API secretを入力
zaif = ZaifTradeApi(key, secret)

price = 28　#売買を行う価格を設定（ここでは28円で売る）
amount = 1000　#売買を行う量を設定（ここでは1000XEM売る）
limit = 23　#リミット売りする価格を設定（ここでは23円で買う）
currency_pair = "xem_jpy" #売買を行う通貨ペアを設定（ここではNEMを日本円で買う）
action = "ask" #買いか売りかを設定（ここでは売りを設定）

#売買を実行
zaif.trade(currency_pair=currency_pair, action=action, price=price, amount=amount, limit=limit)
```


# まとめ
- APIを利用して仮想通貨の売買を行えると、取引所のWebサイトにログインできない状況でもAPIさえ動いている状況であれば売買を行うことができるため、買い時、売り時を逃さず取引することができる。**特に、Webサイトが過負荷になるような状況は相場の動きが激しい場合に発生することが多いため、APIで売買できるよう準備しておくことは重要である。**
ABC02CとD問題

#C問題
問題はhttp://abc002.contest.atcoder.jp/tasks/abc002_3 から

##解答の方針
外積使えばすぐできそうなので何も考えずNumpyを調べた。

##コード
```python:abc02c.py
import numpy as np
s_1,s_2,a,b,c,d = list(map(int,input().split()))

a -= s_1
c -= s_1

b -= s_2
d -= s_2

B = [a,b]
C = [c,d]

print(abs(np.cross(B,C)/2))
```

#D問題
問題はhttp://abc002.contest.atcoder.jp/tasks/abc002_4　から

##解答の方針
最初は、辞書型の配列に格納して、
再帰関数に（参照する人の番号、人数、選んだ人）を渡して、
参照する人の番号が最後尾に来た時に、大きい人数に更新するという作戦でやっていたが、
うまくできなかったので、ほかの人のものを参考にした。

隣接行列のようなものを利用し、参照する値がNに達した時に、
２重ループにて双方向的につながりがあるかをチェックし、ansを更新する。


##コード
```python:abc02d.py
N, M = list(map(int, input().split()))
xy = [[0 for i in range(N)] for i in range(N)] #隣接行列
v = []
ans = 0

def dfs(v, k=0):
    global ans
    if (k==N):
        for i in range(len(v)):
            for j in range(i+1, len(v)):
                if (xy[v[i]][v[j]] == 0):
                    return
        ans = max(ans, len(v))
    else:
        dfs(v, k+1)
        v.append(k)
        dfs(v, k+1)
        v.pop()
for i in range(M):
    x, y = list(map(int, input().split()))
    xy[x-1][y-1] = 1

dfs(v)
 
print(ans)
```
##コード2（いつか直す）
```python:abc02miss.py
N,M = list(map(int,input().split()))
dic = {}
x = [[]for i in range(13)]
queue = []

for i in range(M):
    a,b = list(map(int,input().split()))
    x[a].append(b)
    x[b].append(a)

for i in range(1,13):
    dic[i] = x[i]

res = 0
count = 0
flag = True
queue = []

def dfs(i,j,list):
    global count
    global flag
    print(list,i,j)
    if i == N :
        count = (max(j,count))
        return
    if dic[i] == []:
        flag = False
    for k in dic[i]:
        for l in list:
            if l not in dic[k]:
                flag = False
                break
    if flag:
        list.append(i)
        dfs(i+1,j+1,list)
    else:
        dfs(i+1,j,list)
        flag = True
    

dfs(1,0,queue)


print(count)

```
Rails5.1でBootstrap3を利用してHerokuでデプロイ

## 経緯
Rails5.1系をHerokuでデプロイするにあたり色々、つまずいたのでまとめます。
(※ 今まで[Ruby on Rails チュートリアル](https://railstutorial.jp/)を参考にHerokuにデプロイしてましたが、その通りではできませんでした。)
Rails5.1からjQueryを利用するために手動で設定する必要があります。Bootstrapを利用するにあたり必要でしたのでその手順もあわせます。
## 開発環境
- Linux(Ubuntu 16.04LTS)
- Ruby 2.4.1
- Rails 5.1.4

## yarnのインストール
jQueryを利用する為にyarnをインストールします。
※Linux(Ubuntsu)環境です。

```
$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list

$ sudo apt-get update && sudo apt-get install yarn
```
参考:
https://yarnpkg.com/lang/en/docs/install/

## yarnでjQueryを追加
```
$ yarn add jquery
```
jQueryの最新バージョンがインストールされますがBootstrapは、最新バージョンでは動きませんのでバージョンを1.9.1より上かつ、3.0以下にします。

## package.jsonでjQueryのバージョンを指定
バージョンを1.9.1に指定します。

```json:/package.json
{
  "name": "my_project",
  "private": true,
  "dependencies": {
     "jquery": "^1.9.1"
  }
}
```
指定後に

```
$ yarn install
```
でプロジェクト全体に反映させます。

## application.jsに設定を反映
```js:assets/javascripts/application.js
//= require rails-ujs
//= require turbolinks
//= require jquery
//= require bootstrap
//= require_tree .
```
JQueryはbootstrapよりも上にかきます。

参考：
[Rails5.1でjQueryを追加する方法](http://qiita.com/Fendo181/items/7b5c4fc8cd0639fe2283)

## bootstrap-sassをbundle install

```rb:Gemfile
gem 'bootstrap-sass', '3.3.6'
```

## .scssでbootstrapをimport

assets/stylesheet内にbootstrapをimportする為の.scssファイルを作成します。
※ ここでは、「custom.scss」という名前にします。

```scss:assets/stylesheets/custom.scss
@import "bootstrap-sprockets";
@import "bootstrap";
```


これでjQueryが使用できるようになります。

## Herokuのセットアップ
Herokuでデプロイする為にセットアップします。
DBを開発環境では、sqlite3、本番環境ではpostgreSQLを利用しているケースです。

```rb:Gemfile
group :development, :test do
  # sqlie3をgroupの中に移動
  gem 'sqlite3'
end

group :production do
  gem 'pg'
end
```

```package.json
{
  // 省略、以下行を追加
  "engines": {
    "yarn": "あたなのyarnのバージョン",
    "node": "あなたのnodeのバージョン"
  }
}
```
enginsにyarnとnodeのバージョンを記載し開発環境をHerokuに知らせる必要があるようです。

参考：
[[Rails5][yarn] herokuにデプロイする際にremote rejectされる問題](http://qiita.com/taka3tk/items/25fa2c969d033ffc8a12)

上記を設定したら

```bash
$ heroku create

$ heroku buildpacks:add --index 1 heroku/nodejs
$ heroku buildpacks:add --index 2 heroku/ruby

$ git push heroku master
```
上記でHerokuでデプロイでき、bootstrapが効いていることも確認できました。
[macOS]NSNibからNSViewを簡単に生成するExtension

先日、[iOSDC2017](https://iosdc.jp/2017/)があり非常に楽しかったということを伝えたいのと、自分も何かアウトプットしなければと思ったためにニッチですが1つ最近調べたことを紹介したいと思います。


##NSNib
NSNibを使って.xibファイルからViewを生成しようとしたとき、UINibの感覚で使おうと思ってたらinstantiateの使い型が異なっていて困ってしまいました。

```Swift
func instantiate(withOwner owner: Any?, topLevelObjects: AutoreleasingUnsafeMutablePointer<NSArray?>?) -> Bool
```

AutoreleasingUnsafeMutablePointerってなんだろう？🤔

最初よくわからなくてAutoreleasingUnsafeMutablePointer.initから頑張って作ったりしてたのですが、[ここ](https://stackoverflow.com/questions/41312945/instantiate-nsview-with-custom-objects-in-it-using-nsnib)に載ってたコードによると話は単純で、Cライクにポインタを渡すように書けばいいだけみたいでした

```Swift:instantiateの使い方
var topLevelObjects: NSArray = []
guard nib.instantiate(withOwner: owner, topLevelObjects: &topLevelObjects) else {
    ...
}
...
```

これを踏まえて、[AppStoryboard](https://gist.github.com/Gurdeep0602/4fc3892c1b2861d4cd2062ddfddf3262)の実装を参考にしてNSNib用にextensionを作成しました


###コード
```Swift:NSNib+instantiate.swift

import Foundation
import Cocoa

enum AppNib: String {
    case MyNibName1
    case MyNibName2
    
    var instance: NSNib {
        return NSNib(nibNamed: self.rawValue, bundle: Bundle.main)!
    }
    
    func view<T: NSView>(viewClass: T.Type) -> T {
        for object in instance.instantiate(withOwner: nil) {
            if let view = object as? T {
                return view
            }
        }
        
        fatalError("\(T.className()) is not found in \(self.rawValue) Nib.")
    }
}

extension NSView {
    static func instantiate(fromNib appNib: AppNib) -> Self {
        return appNib.view(viewClass: self)
    }
}

extension NSNib {
    public func instantiate(withOwner owner: Any?) -> [Any] {
        var topLevelObjects: NSArray = []
        guard instantiate(withOwner: owner, topLevelObjects: &topLevelObjects) else {
            return []
        }
        return topLevelObjects as? [Any] ?? []
    }
}

```

###利用方法

```Swift
let myview = MyView.instantiate(fromNib: .MyNibName1)
```

.xibのファイル名をあらかじめenumのAppNibに定義しておく必要があります


##おわりに
iOSDC2017楽しかったです！
箱ひげ図で外れ値になる確率を計算する

# この記事の概要
- 正規分布を仮定したときに、箱ひげ図における「外れ値」がどれぐらいの確率で出現するのかを調査
- 「外れ値」の定義：第１四分位点-四分位範囲*1.5 より小さい、または、第１四分位点-四分位範囲*1.5 より大きい標本（極値も含んでます）
- 「外れ値」が出現する確率は、およそ 0.70 %

# この記事を書こうと思った動機
- 業務で統計解析を行う際に、箱ひげ図を描いてみると、「外れ値」がよく出てくる
- ある分布を仮定したときに、「外れ値」がどれぐらいの確率で出現するのかを知りたくなった


# はじめに：箱ひげ図と外れ値
箱ひげ図および箱ひげ図における外れ値に関する説明は以下のサイトなどを参照してください。
- [箱ひげ図 - Wikipedia](https://ja.wikipedia.org/wiki/%E7%AE%B1%E3%81%B2%E3%81%92%E5%9B%B3)
- [箱ひげ図の読み方](http://rplus.wb-nahce.info/statsemi_basic/stat_boxplot.html)



# 正規分布における外れ値の出現確率を算出する
標準正規分布の確率密度関数を使って、外れ値となる確率を計算してみます。

    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    from scipy import stats

    q1_ideal = stats.norm.ppf(q=0.25, loc=mu, scale=sd) # 第１四分位点
    q3_ideal = stats.norm.ppf(q=0.75, loc=mu, scale=sd) # 第３四分位点
    iqr_ideal = q3_ideal-q1_ideal # 四分位範囲
    lb_ideal = q1_ideal-1.5*iqr_ideal # 下側外れ値境界
    ub_ideal = q3_ideal+1.5*iqr_ideal # 上側外れ値境界

    print('Q1:', q1_ideal)
    print('Q3:', q3_ideal)
    print('IQR:', iqr_ideal)
    print('Lower Bound:', lb_ideal)
    print('Upper Bound:', ub_ideal)
    print('下側外れ値となる確率:',stats.norm.cdf(x=lb_ideal, loc=mu, scale=sd) *100,'%')
    print('上側外れ値となる確率:',stats.norm.sf(x=ub_ideal, loc=mu, scale=sd) *100,'%')
    print('外れ値となる確率:',(stats.norm.sf(x=ub_ideal, loc=mu, scale=sd)+stats.norm.cdf(x=lb_ideal, loc=mu, scale=sd)) *100,'%')

    >Q1: -0.674489750196
    >Q3: 0.674489750196
    >IQR: 1.34897950039
    >Lower Bound: -2.69795900078
    >Upper Bound: 2.69795900078
    >下側外れ値となる確率: 0.348830161964 %
    >上側外れ値となる確率: 0.348830161964 %
    >外れ値となる確率: 0.697660323928 %

というわけで、正規分布であれば外れ値が得られる確率は、0.7%という結果です。1000個の標本があれば、7個ぐらいは外れ値となります。3σの外側に来るのが0.3%なので、それよりは多いですね。

# 実際にそうなっているか検証

正規分布からランダムサンプリングしたデータを使って、本当にそうなるのか確かめてみます。

    # データ生成
    n = 1000000 # サンプル数
    mu = 0 # 平均
    sd = 1 # 標準偏差
    q1 = stats.scoreatpercentile(data, 25)
    q3 = stats.scoreatpercentile(data, 75)
    iqr = q3-q1
    lb = q1-1.5*iqr
    ub = q3+1.5*iqr
    print('Q1:', q1)
    print('Q2:', med)
    print('Q3:', q3)
    print('IQR:', iqr)
    print('Lower Bound:', lb)
    print('Upper Bound:', ub)
    print('上側外れ値となった標本数の全標本数に占める割合:', len(np.where(data<lb)[0]) / n * 100,'%')
    print('下側外れ値となった標本数の全標本数に占める割合:', len(np.where(data>ub)[0]) / n * 100,'%')
    print('外れ値となった標本数の全標本数に占める割合:', (len(np.where(data>ub)[0])+len(np.where(data<lb))) / n * 100,'%')

    >Q1: -0.674873830027
    >Q2: -0.00106013590319
    >Q3: 0.673290672641
    >IQR: 1.34816450267
    >Lower Bound: -2.69712058403
    >Upper Bound: 2.69553742664
    >上側外れ値となった標本数の全標本数に占める割合: 0.3554 %
    >下側外れ値となった標本数の全標本数に占める割合: 0.3478 %
    >外れ値となった標本数の全標本数に占める割合: 0.7032 %

ランダムサンプリングで計算した外れ値となる標本の割合は0.7％となり、確率密度関数から計算した値とほぼ一致しました。