OmniAICreator/Qiita-1.07M huggingface dataset:
【Docker】build失敗したイメージをまとめて消す

## 状況
docker buildをしまくっていると

```
$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
<none>                       <none>              297d5f942b3d        6 minutes ago       400 MB
dockercomposedev_db          latest              022c5bd2184e        8 minutes ago       400 MB
<none>                       <none>              7dd230c58bd5        18 minutes ago      400 MB
<none>                       <none>              71c356015e59        27 minutes ago      400 MB
dockercomposedev_web         latest              ba78760c2a64        55 minutes ago      995 MB
dockercomposedev_composer    latest              24ccc18fed40        55 minutes ago      974 MB
<none>                       <none>              ad01480e1b50        55 minutes ago      405 MB
<none>                       <none>              5a177d6ea178        6 days ago          800 MB
<none>                       <none>              cbe98a41a9a0        6 days ago          800 MB
<none>                       <none>              9a0d86d1cdbd        6 days ago          862 MB
<none>                       <none>              44e5700ca5c0        7 days ago          704 MB
<none>                       <none>              2a7cd690ac25        7 days ago          704 MB
<none>                       <none>              f08bf01212e5        7 days ago          704 MB
<none>                       <none>              f28e283f4316        7 days ago          704 MB
<none>                       <none>              85ae7bb228c0        7 days ago          704 MB
<none>                       <none>              2e8b46a20e74        7 days ago          704 MB
<none>                       <none>              efaaff2b1318        7 days ago          704 MB
```

みたいなことが起こってしまうことがある。
こんな時の対処法

## 下記コマンドで一掃しよう
`docker images | grep '<none>' | awk '{print $3}' | xargs docker rmi`
めざせpythonライブラリマスター （68）pazudorasolver

#【ライブラリ説明】
　パズドラで最適な解を求められる？
　（コードについてはよく分からない・・・）
　（実行結果もどうやって使っていいのか分からない・・・）

#【環境】
　python2.7では実行時にライブラリのエラーが出たため、python3.5で実行

#【プログラム】

```
# -*- coding: utf-8 -*-

from pazudorasolver.board import Board
from pazudorasolver.piece import Fire, Wood, Water, Dark, Light, Heart, Poison, Jammer, Unknown
from pazudorasolver.heuristics.greedy_dfs import GreedyDfs
from pazudorasolver.heuristics.pruned_bfs import PrunedBfs

weights = {Fire.symbol: 2.0,
           Wood.symbol: 2.0,
           Water.symbol: 2.0,
           Dark.symbol: 2.0,
           Light.symbol: 2.0,
           Heart.symbol: 1.0,
           Poison.symbol: 0.5,
           Jammer.symbol: 0.5,
           Unknown.symbol: 0.0}

board = Board.create_randomized_board(5, 6)
matches = board.get_matches()

print(board)
print(matches)

# try GreedyDfs heuristic
solver1 = GreedyDfs(weights)
solution = solver1.solve(board, 50)

print(solution)

# try PrunedBfs heuristic
solver2 = PrunedBfs(weights)
solution = solver2.solve(board, 50)

print(solution)
```

#【結果】

```
  | 0 1 2 3 4 5
---------------
0 | G B G Y B P
1 | B Y B R R Y
2 | Y Y Y P G Y
3 | R P G H R B
4 | R H G P H H

[(Y, {(2, 0), (2, 1), (2, 2)})]
(2163.113082258987, ((2, 2), (0, -1), (-1, 0), (-1, 0), (0, -1), (0, 1), (0, -1), (0, 1), (0, 1), (0, -1), (0, -1), (0, 1), (0, -1), (0, 1), (0, 1), (0, -1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (-1, 0), (1, 0), (1, 0), (-1, 0), (1, 0), (-1, 0), (-1, 0), (1, 0), (-1, 0), (1, 0), (1, 0), (-1, 0), (1, 0), (-1, 0), (-1, 0), (1, 0), (-1, 0), (1, 0), (1, 0), (-1, 0), (-1, 0), (1, 0), (-1, 0), (1, 0), (1, 0), (-1, 0), (1, 0), (-1, 0), (1, 0), (-1, 0)),   | 0 1 2 3 4 5
---------------
0 | G G Y B P Y
1 | B B B R R Y
2 | Y Y Y P G Y
3 | R P G H R B
4 | R H G P H H
)
(4293.289237815047, ((2, 4), (-1, 0), (0, -1), (0, -1), (0, -1), (-1, 0), (0, 1), (1, 0), (0, 1), (-1, 0), (0, -1), (0, -1), (0, 1), (0, -1), (0, 1), (0, -1), (0, 1), (0, -1), (0, 1), (0, -1), (0, 1), (0, -1), (0, 1), (0, -1), (0, 1), (0, -1), (0, -1), (0, 1), (0, -1), (0, 1), (0, 1), (0, -1), (0, 1), (0, -1), (0, 1), (0, -1), (0, 1), (0, -1), (0, 1), (0, -1), (0, 1), (0, -1), (0, -1), (0, 1), (0, -1), (0, 1), (0, -1), (0, 1), (0, 1), (0, -1), (0, 1)),   | 0 1 2 3 4 5
---------------
0 | G G G Y B P
1 | B B B Y R Y
2 | Y Y Y P R Y
3 | R P G H R B
4 | R H G P H H
)
```

pythonのIDE、Spyderで実行したが出力結果のボードは色付きで表示されていた。

#【参考サイト】
[github](https://github.com/ethanlu/pazudora-solver)
[pypi](https://pypi.python.org/pypi/pazudorasolver/0.2.0)
オフラインリアルタイムどう書くE11 Ruby で解く

問題はこちら:
http://qiita.com/Nabetani/items/10b2ccc28301e44e09e6
http://nabetani.sakura.ne.jp/hena/orde11tredis/

parents を覚えさせておいて `Array#&` で共通の親を取得する。
近い順に並んでいるのであとは index とるだけ。

```rb
require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'

  gem 'minitest', require: 'minitest/autorun'
  gem 'minitest-reporters'

  gem 'awesome_print'
  gem 'tapp'

  gem 'pry'
  gem 'pry-rescue', require: 'pry-rescue/minitest'
  gem 'pry-stack_explorer'
end

class Tree
  attr_reader :base, :leaves, :parents

  include Enumerable

  def initialize(base, parents=[])
    @base = base
    @parents = parents
    @leaves = dividers_for(base).map do |n|
      Tree.new(n, [self] + parents)
    end
  end

  def each(&block)
    block.call(self)

    leaves.each do |leaf|
      leaf.each(&block)
    end
  end

  def distance(a, b)
    as = select {|tree| tree.base == a }
    bs = select {|tree| tree.base == b }

    as.product(bs).map {|_a, _b|
      next _a.parents.index(_b) + 1 if _a.parents.include?(_b)
      next _b.parents.index(_a) + 1 if _b.parents.include?(_a)

      common_parent = (_a.parents & _b.parents).first
      _a.parents.index(common_parent) + _b.parents.index(common_parent) + 2
    }.min
  end

  private

  def dividers_for(base)
    return [] if base <= 3

    (2...base).select {|n| base % n == 0 }.map {|n| n + 1 }
  end
end

def solve(input)
  base, a, b = input.scan(/\d+/).map(&:to_i)
  Tree.new(base).distance(a, b).to_s
end

TEST_DATA = <<~EOS
/*0*/ test( "50:6,3", "1" );
/*1*/ test( "98:5,11", "4" );
/*2*/ test( "1000:33,20", "7" );
/*3*/ test( "514:9,18", "8" );
/*4*/ test( "961:5,4", "3" );
/*5*/ test( "1369:1369,3", "2" );
/*6*/ test( "258:16,12", "5" );
/*7*/ test( "235:13,3", "2" );
/*8*/ test( "1096:19,17", "8" );
/*9*/ test( "847:7,17", "6" );
/*10*/ test( "1932:3,5", "2" );
/*11*/ test( "2491:4,8", "3" );
/*12*/ test( "840:421,36", "2" );
/*13*/ test( "1430:37,111", "3" );
/*14*/ test( "496:17,9", "2" );
/*15*/ test( "891:6,10", "1" );
/*16*/ test( "1560:196,21", "2" );
/*17*/ test( "516:20,12", "5" );
/*18*/ test( "696:30,59", "2" );
/*19*/ test( "1760:5,441", "2" );
/*20*/ test( "1736:11,26", "5" );
/*21*/ test( "1518:17,34", "4" );
/*22*/ test( "806:63,16", "5" );
/*23*/ test( "1920:3,97", "2" );
/*24*/ test( "1150:13,22", "4" );
/*25*/ test( "920:116,5", "1" );
/*26*/ test( "2016:7,337", "2" );
/*27*/ test( "408:9,25", "2" );
/*28*/ test( "735:36,8", "2" );
/*29*/ test( "470:5,31", "2" );
/*30*/ test( "2100:12,351", "3" );
/*31*/ test( "870:36,10", "1" );
/*32*/ test( "1512:253,13", "2" );
/*33*/ test( "697:12,15", "3" );
/*34*/ test( "1224:5,14", "2" );
/*35*/ test( "986:125,17", "3" );
/*36*/ test( "864:12,13", "3" );
/*37*/ test( "500:21,51", "2" );
/*38*/ test( "819:33,21", "4" );
/*39*/ test( "594:55,3", "2" );
/*40*/ test( "638:17,24", "3" );
EOS

Minitest::Reporters.use!(Minitest::Reporters::ProgressReporter.new)

describe 'Doukaku' do
  TEST_DATA.each_line do |test|
    number, input, expected = test.scan(/(\d+).*"(.*)", "(.*)"/)[0]

    it "##{number}" do
      assert_equal expected, solve(input)
    end
  end
end
```
Promiseで並列処理をつなぐ

メモ。近いうちもっと分かりやすいPromise記事書こう。

```ruby:qiita.js
    function randomInt(min, max) { 
        return Math.floor(Math.random() * (max - min) + min);
    }
    function timerPromisefy(index) {
        return new Promise(function (resolve) {
            const interval = randomInt(100, 1000);
            setTimeout(function () {
                console.log('index: ' + index + ' interval: ' + interval);
                resolve();
            }, interval);
        });
    }
    const startDate = Date.now();
    Promise.resolve()
    .then(function() {
        return Promise.all([
            timerPromisefy(1),
            timerPromisefy(1),
            timerPromisefy(1),
            timerPromisefy(1)
        ]);
    }).then(function() {
        return Promise.all([
            timerPromisefy(2),
            timerPromisefy(2)
        ]);
    });
```
HTML要素の追加方法いろいろ　挿入位置で分類

要素の追加方法がいろいろあるのでメモ。
`<div id="test">test</div>`に対してどこに挿入するかで分けました。

## 開始タグの前に挿入

### insertAdjacentHTML ("beforebegin")

```js
var test = document.getElementById('test');

test.insertAdjacentHTML('beforebegin','<div>BeforeBegin</div>');
```

### insertBefore

```js
var element = document.createElement('div');
element.innerHTML = "BeforeBegin";

document.body.insertBefore(element, test);
```

### jQueryのbefore または insertBefore

```js
$('#test').before('<div>BeforeBegin</div>');
//または
$('<div>BeforeBegin</div>').insertBefore('#test');
```

### 結果
```html
<div>BeforeBegin</div>
<div id="test">
 test
</div>
```

## 開始タグの後に挿入

### insertAdjacentHTML ("afterbegin")

```js
test.insertAdjacentHTML('afterbegin','<div>AfterBegin</div>');
```

### jQueryのprepend または prependTo

```js
$('#test').prepend('<div>AfterBegin</div>');
// または
$('<div>AfterBegin</div>').prependTo('#test');
```

###　結果

```html
<div id="test">
 <div>AfterBegin</div>
 test
</div>
```

## 終了タグの前に挿入

### insertAdjacentHTML ("beforeend")

```js
test.insertAdjacentHTML('beforeend', '<div>BeforeEnd</div>');
```

### jQueryのappend または appendTo

```js
$('#test').append('<div>BeforeEnd</div>');
// または
$('<div>BeforeEnd</div>').appendTo('#test');
```

### 結果

```html
<div id="test">
 test
 <div>BeforeEnd</div>
</div>
```

## 終了タグの後に挿入

### insertAdjacentHTML ("afterend")

```js
test.insertAdjacentHTML('afterend','<div>AfterEnd</div>');
```

### jQueryのafterまたはinsertAfter

```js
$('#test').after('<div>AfterEnd</div>');
//または
$('<div>AfterEnd</div>').insertAfter('#test');
```

### 結果

```html
<div id="test">
  test
</div>
<div>AfterEnd</div>
```
Raspbian ネットインストール

#はじめに
Raspberry Pi に NOOBS LITE を利用して raspbian インストールした際のメモ

---
#用意するもの
- PC（Windows）
- Raspberry Pi 2 Model B
- マイクロSDカード
- イーサネットケーブル
- USB Wi-Fiドングル
- キーボード
- マウス
- HDMIディスプレイ

詳細は[別投稿](http://qiita.com/halchiyo/items/d43e4187a2e7bbeb5d4a)参照

---
#SDカード準備
1. SDカードフォーマット
	1. SDアソシエーションの[ダウンロード](https://www.sdcard.org/jp/downloads/formatter_4/index.html)ページからフォーマッタダウンロード
	1. PCにフォーマッタインストール
	1. SDカードフォーマット
1. NOOBS LITEダウンロード
	1. RaspberryPi公式サイトの[ダウンロード](https://www.raspberrypi.org/downloads/)から [NOOBS](https://www.raspberrypi.org/downloads/noobs/) ページを選択
	1. NOOBS LITE をダウンロード＆解凍
	1. 解凍物一式を、SDカードにコピー

---
#ネットワークインストール
1. 冒頭紹介したものをすべて接続
1. NOOBS LITEを展開したSDカードを挿入
1. 電源コードを刺して起動
1. OS選択でRaspbian[RECOMENDED]を選択
    - インストール中、下段に Language と Keyboard を選ぶメニューがでる
    - 日本語の配列の場合は、ここの Keyboard を jp に
    - 進捗バーが100%になってもしばらくかかります
1. インストールが完了したら再起動＆デスクトップ環境で起動します
1. ログインしましょう
    - 初期ID/パスワードは pi / raspberry です
---
#OS・ファームウェアの更新
デスクトップ画面からターミナルを呼び出して…

-  Raspbian のパッケージ更新

```
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
```

- ファームウェアアップグレード（お好み、公式には非推奨）

```
$ sudo rpi-update
```

---
#Wi-Fi設定

デスクトップの右上の↑↓のアイコンで設定
（CLIで設定するより楽）

終わったらイーサネットケーブルはお役御免

---
#基本の変更
GUIだと以下の流れで選択します。

```左上の ラズベリーアイコン > 設定 > Raspberry Pi の設定```

CLIだと`raspi-config` を使った変更になります
```$ sudo raspi-config```

- 「4 Internationalisation Options」の「12 Change Timezone」で、Asia の Tokyo
- 「8 Advanced Options」の「A1 Overscan」を Disable 
- 「2 Change User Password」でパスワードを変更

Finish で終了すると再起動するか聞いてくるので、再起動します。

---
#SSH有効化
GUIでSSHサービスを有効化します
GUIだと以下の流れで選択します。

```左上の ラズベリーアイコン > 設定 > Raspberry Pi の設定```

SSH起動前に認証情報は更新しましょう。
変更しないでSSH有効化すると毎度以下のように警告されます。

```
SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.
```

---
#おわり
あとはお好みで
liveとon・・・何故liveメソッドは廃止になったのか？

昔、jQueryにはliveという便利なメソッドがあり、よく使われていました。
イベント処理定義の時点で、そのオブジェクトが存在しなくてもよいという、非常に優れたメソッドでした。
しかし、バージョン1.7で非推奨となり、バージョン1.9では廃止になりました。
他にバージョン1.9で廃止されたメソッドにbind,delegateなどがあります。

○:正式   △:非推奨  ×:削除  －:無し

|jQueryのバージョン | bind | live | delegate | on |
|:-:|:-:|:-:|:-:|:-:|
|1.7より前|○|○|○|－|
|1.7|△|△|△|○|
|1.9|×|×|×|○|

では、何故便利なliveメソッドが廃止されたのでしょう？
その理由を探る前に、liveメソッドの使い方を確認しておきしょう。

```js
$('div').live('click', function(e) {
    console.log('clicked');
});
```

前述した通り、このliveメソッドの主体である$('div')が存在しなくても、定義ができ
尚且つ$('div')があるときだけ、コールバック関数が実行されます。

**では、なぜ$('div')が存在しなくても、定義できるのでしょうか？**

実はliveメソッドでイベント処理を定義すると、
処理が実行されるのは、documentのバブリングフェーズで実行されます。
documentがliveで定義されたイベントがあるか見張っていて、
そのイベントが発生し、且つイベントの発生元のDOMオブジェクトが指定したセレクタに含まれている時
登録したメソッドが実行されます。
delegateメソッドがわかる人であれば、
liveメソッドはdocumentにdelegateすると言ったほうが分かりやすいかもしれません。

赤矢印：キャプチャフェーズ  緑矢印：バブリングフェーズ
![image0.png](https://qiita-image-store.s3.amazonaws.com/0/163605/e16bc6dc-2bb6-130d-19bc-d91a5a846303.png)

しかし、liveメソッドのオブジェクトは$('div')なので、
divにイベントが到達した時に、メソッドが実行されると勘違いしてしまいますよね？
**そう、これがまさにliveメソッドが廃止された理由なのです。**

ちなみに、liveと同じことをバージョン1.9以上のjQueryで実装すると、以下のようになります。

```js
$(document).on('click', 'div', function(e) {
    console.log('clicked');
});
```

説明は以上です。
クロージャつかってローパスフィルタ

はじめに
--------------------

履歴を残すための変数をグローバルで置くとスコープが広がって嫌だな〜と思ってましたが、クロージャを使えば隠しておけるんですね。自分用のメモです。

コード
--------------------

```py
import numpy as np

def get_lpf(alpha):
    prev = np.nan * np.ones(1)
    calc = lambda pre, new : alpha * prev + (1.-alpha) * new

    def lpf(val):
        prev[0] = calc(prev[0], val) if not np.isnan(prev[0]) else val
        return prev[0]

    return lpf

lpf = get_lpf(0.8)

for i in range(100):
    new = numpy.random.normal()
    filtered = lpf(new)
    
    print("new=%f, filt=%f" % (new, filtered) )
```

解説的なもの
--------------------

```py
prev = np.nan * np.ones(1)
calc = lambda pre, new : alpha * prev + (1.-alpha) * new
```

- 履歴保持用の変数 `prev` をlpfの生成用関数 `get_lpf` 内で作る
- `calc` はLPFの計算 $y_n = \alpha y_{n-1} + (1-\alpha)x_n$ を実行する関数

```py
prev[0] = calc(prev[0], val) if not np.isnan(prev[0]) else val
```

- `prev =` としてしまうと、外部変数の参照ではなく新たに定義したと認識されてエラーになる
- 長さ1の配列を定義し、配列の要素を参照するようにすることで、無理やり参照扱いにする
- `prev` は `numpy.nan` で初期化しているので、 `numpy.nan` でなくなるまではそのまま出力する
Raspberry Pi 3 Model B に Haskell 開発環境を構築する

この文章は Raspberry Pi 上に Haskell 開発環境を構築する際のメモです。内容としては OS のインストールから `stack new` したプロジェクトをビルド、実行できるところまでの最小構成です。Mac を使用して開発環境を構築していますが、PC が Windows や Linux の場合は該当箇所を読み替えてください。

## TL;DR

Mac 上での作業：

```bash
$ brew install ddrescue
$ curl -LO https://downloads.raspberrypi.org/raspbian_lite_latest
$ unzip raspbian_lite_latest
$ for f in `ls *-raspbian-*.img`; do IMG=$f; done
$ diskutil list  # SD カードがどのデバイスかを目視確認する（ここでは /dev/disk2 として進める）
$ DISK=disk2  # ここで目視したディスクを環境変数に入れる
$ diskutil unmountDisk /dev/$DISK
$ sudo ddrescue $IMG /dev/$DISK --force
$ touch /Volumes/boot/ssh  # ssh を有効にする
$ diskutil eject $DISK
$ unset IMG
$ unset DISK
$ ssh pi@raspberrypi.local -o PreferredAuthentications=password  # Raspberry Pi 起動後、しばらくしてから実行
```

Raspberry Pi 上での作業：

```bash
$ sudo dd if=/dev/zero of=/var/swap.extended bs=1M count=2048
$ sudo mkswap /var/swap.extended
$ sudo chmod 600 /var/swap.extended
$ sudo swapon /var/swap.extended
$ sudo sh -c 'echo "/var/swap.extended swap         swap    defaults          0       0" >> /etc/fstab'
$ sudo apt-get update
$ sudo apt-get -y upgrade
$ sudo apt-get -y install llvm-3.9
$ sudo ln -s /usr/bin/opt-3.9 /usr/bin/opt
$ sudo ln -s /usr/bin/llc-3.9 /usr/bin/llc
$ mkdir -p ~/.local/bin
$ echo 'export PATH=$HOME/.local/bin:$PATH' >> ~/.profile
$ source ~/.profile
$ curl -sSL https://get.haskellstack.org/ | sh
$ stack upgrade
$ stack setup

```

最新の Stack がインストールできました 🎉

## 補足

2018 年 10 月現在、apt-get でインストールできる stack はバージョンが 1.1.2-7 と古く、`AesonException "Error in $.packages.cassava.constraints.flags` というエラーが出力されます。`curl -sSL https://get.haskellstack.org/ | sh` で導入すれば 1.7.1 がインストールされるため、こちらの方法をおすすめします。なお、現段階の Stack の LTS は 12.12 で、対応する GHC は 8.4.3 ですが、ARM 向け GHC は 8.2.2 までしかないので、LTS 11.8 を使用する必要があります。

2018 年 2 月現在、Raspberry Pi は Debian Stretch ベースになり、普通に以下のように Stack が入れられるようになりました。

```shell-session
$ sudo apt-get install haskell-stack
```

2017 年 4 月 21 日現在、[https://get.haskellstack.org](https://get.haskellstack.org) のスクリプトでは stack をインストールできません。代わりに以下サイトよりバイナリをダウンロードしてください。

- [stack download](https://github.com/satosystems/share/blob/master/stack/arm/stack) 

## 参考サイト

* [Rasberry Pi3 (ARMv7)にhaskell-stackをインストールする - Qiita](http://qiita.com/aiya000/items/fe45952da33ddc99d4be)
    * Raspberry Pi に Stack がインストールできることを気が付かせてくれたエントリです。もともと本エントリは上記エントリの追試だったのですが、最新の Stack を使用することで `stack setup` ができるようになったため、行っている内容はかなり違います
* [Raspberry Pi 3を買ってMacを使ってWiFi接続とSSHの接続するまで - Qiita](http://qiita.com/toshihirock/items/8e7f0887b565defe7989)
    * Wi-Fi 設定を行う場合に参考になるエントリです
* [haskell - `cabal update` failed due to `out of memory` - Stack Overflow](http://stackoverflow.com/questions/20769183/cabal-update-failed-due-to-out-of-memory)
    * Raspberry Pi 上でメガトン級のライブラリ（cabal や ghc-mod など）をビルドしようとすると、メモリとスワップをすべて使いつくして OS が落ちてしまいます。この問題はスワップを増やすことで回避できます
applyとcallとbindのまとめ

忘れた時用

| メソッド| 脳内変換前 | 脳内変換後 | 
|:-:|:-:|:-:|
| call  | methodA.call(obj, a, b, c);  | obj.methodA(a, b, c);  | 
| apply	  | methodA.apply(obj, [a, b, c]);  | obj.methodA(a, b, c);  | 
| bind	  | methodA.bind(obj, a, b, c);  | function(a, b, c) { obj.methodA(a, b, c); }  |
朗報！Electron、Windowsでもクリックスルーを実現可能に

うれしくて飛び上がりました。
 
なんと、Electron、ウィンドウのクリックスルー(クリックを感知しない)機能がWindows版にもいつの間にか実装されていたんです！！
 
もう知ってたらスイマセン。
 
## 詳細
 
[Electron on Macでclick-thruを実現する](http://qiita.com/erukiti/items/b1b90b948c0981539849)
この記事では、
 
>0.36.0からOS Xに限り実装されました！
 
とあり、なんだ、Macだけなのかと思い、Windowsの情報もなかったので、断念してiMac買おかと思っていたんですが、ふと、今のバージョンはもう1.4.2じゃないかと思い、公式の[Github](https://github.com/electron/electron/blob/master/docs/api/browser-window.md)見てみると、Macのみという記述はなかったので、行けんじゃねと思い、興奮しながら
`mainWindow.setIgnoreMouseEvents(true);`
と叩いて実行してみると、見事に後ろのウィンドウを触ってくれたんです！！
 
### 実装方法
 
いたって簡単。
 
`win.setIgnoreMouseEvents(true);`
 
「`win`」のところはご自分で変えてください。
これをどこかに入れてください。これでクリックスルー化します。
 
## さいごに
 
アプリ開発の幅が広がりますね！！
 
コメント予想：うん。しってた。
Raspberry Pi3でElecrow3.5インチタッチパネルを使う

Raspberry Pi３でElecrow3.5インチタッチパネルを使う方法です。
GPIOに刺しただけでは真っ白な画面になりますが、ドライバをインストールするだけで簡単に使えます。

ドライバインストールはこのフォーラムを参考にしています。
http://forum.banggood.com/forum-topic-109743.html

ドライバのインストールは下記コマンドをうちます。

```
wget http://www.spotpear.com/download/diver24-5/LCD-show-161112.tar.gz
tar xvf LCD-show-161112.tar.gz
cd LCD-show/
sudo ./LCD35-show
```



最後のコマンドを打つと再起動が走り無事にディスプレイに出力されます。
![IMG_6218.JPG](https://qiita-image-store.s3.amazonaws.com/0/10803/e62d2bbe-1380-c778-64e3-ee597169365d.jpeg)


２０１７年現在はLCD-show-161112.tar.gzが一番新しそうですが、適宜下記URLにアクセスして最新のドライバをチェックすると良いかもしれません。
http://www.spotpear.com/download/diver24-5/
オフラインリアルタイムどう書くE11 の問題


オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/55293 )を行っています。

問題は「ツリーの中の距離」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/orde11tredis/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間あればなんとかなると思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
Iciql + SQLiteで複合キー付きのテーブルを生成するときの注意点

# はじめに
Iciql + SQLiteの組み合わせでモデルからテーブルを作らせたときに、複合主キーの設定に苦戦したので、情報共有します。

# Iciqlについて
こちらを参照。
http://iciql.com/

# バージョンなど
・Javaのバージョン ... 8
・iciqlのバージョン ... iciql-2.2.1
・sqlite jdbcドライバ ... sqlite-jdbc-3.8.11.2.jar

# 結論
復号キーは以下のように設定します。
(primaryKeyにカンマで繋いだフィールド名を設定)

```java
@IQTable(name = "model", primaryKey= "field1,field2" )
public class Model {
	
	@IQColumn(name = "field1")
	public String field1;
	
	@IQColumn(name = "field2")
	public int field2;
	
	@IQColumn(name = "value")
	public String value;

}
```

# ダメな例その１
このようにしたところ、field2にしかprimary keyは設定されませんでした。
(primaryKeyにフィールド名を配列で設定)

```java
@IQTable(name = "model", primaryKey={"field1","field2"} )
public class Model {
	
	@IQColumn(name = "field1")
	public String field1;
	
	@IQColumn(name = "field2")
	public int field2;
	
	@IQColumn(name = "value")
	public String value;

}
```

# ダメな例その２
こちらもfield2にしかprimary keyは設定されませんでした。
(@IQColumnのprimaryKeyにそれぞれtrueを設定)

```java
@IQTable(name = "model")
public class Model {
	
	@IQColumn(name = "field1", primaryKey=true)
	public String field1;
	
	@IQColumn(name = "field2", primaryKey=true)
	public int field2;
	
	@IQColumn(name = "value")
	public String value;

}
```

# 他のDBについて
postgres（※）だと上記のダメな例1, 2共に、意図通りの動作をします。
他のDBについては検証していません。

※）postgresのバージョンは9.6, jdbcドライバはpostgresql-9.4.1211.jarを使用。
LINE Beacon設定

# Line Beaconの設定をしてみる

## LINE Beaconとは
ビーコン↓こんなの

![IMG_9043.JPG](https://qiita-image-store.s3.amazonaws.com/0/53020/3e5867dc-13bb-f0ff-84aa-cf265810ce4d.jpeg)

がオンの状態で近くにあると、自分の端末のLINEアカウントが

- ビーコンが紐付けてあるLINE@のアカウントと友達
- LINE ビーコンを受信する設定になっている(後述)
- 端末のBlueToothがオンになっている

ならば、LINEビーコンに設定されたwebhookにリクエストが行く
あくまでも近くにいる状態(30mくらい？)を検知するだけ
回数制限もないらしい


## LINE@アカウントの作成
LINE BUSINESS CENTER
https://business.line.me/ja/services/bot

Developer Trialを始めるボタンをクリック。

![スクリーンショット 2017-02-04 13.19.43.png](https://qiita-image-store.s3.amazonaws.com/0/53020/2aedcfe5-80c5-f908-6ccf-f1db49261b76.png)

色々設定項目を入力していけばアカウントの作成が完了
webhookの設定は後からでも大丈夫



## LINE@アカウントとビーコンの紐付け
こちらのURLにアクセス
https://admin-official.line.me/beacon/register

LINE@MANAGERのページに飛ぶので
アカウント一覧から先ほど作成したLINE@アカウントを選択
ちなみにここのページに内部から行く方法は不明

![スクリーンショット 2017-02-04 16.00.15.png](https://qiita-image-store.s3.amazonaws.com/0/53020/05c91e45-9d10-848b-7060-bbf8b246bab4.png)

次に端末IDとパスワードの入力画面になるはず
ここにビーコン本体に記載されたIDとパスワードを入力

![スクリーンショット 2017-02-04 16.00.52.png](https://qiita-image-store.s3.amazonaws.com/0/53020/79ae683c-47e3-bc64-3ab2-86708f7e9383.png)


それが完了すれば設定と紐付けは完了


## WebHook設定
LINE@Managerの以下のページで、webhookを有効化

![スクリーンショット 2017-02-04 16.26.55.png](https://qiita-image-store.s3.amazonaws.com/0/53020/e564e01b-b3da-4ed0-bf76-f25dd2108451.png)

同ページでLINE Developersで設定するを選択

![スクリーンショット 2017-02-04 16.29.28.png](https://qiita-image-store.s3.amazonaws.com/0/53020/49a3163b-a5f8-ee9f-4b07-00de045f89ad.png)

別ページに飛ぶので、右下EDITボタンをクリック

![スクリーンショット 2017-02-04 16.32.21.png](https://qiita-image-store.s3.amazonaws.com/0/53020/add1eef7-276c-2171-3640-96d54d8372e3.png)

WebHook URLにリクエストを送りたいURLを入れればOK
ただし、リクエストの送信先はきちんと証明書の発行されたhttps接続でないとだめ
適当に偽装しようとしても弾かれた
![スクリーンショット 2017-02-04 16.32.30.png](https://qiita-image-store.s3.amazonaws.com/0/53020/092ec362-65aa-83f2-c407-f5dd54146003.png)


## ビーコンの使い方
使い方と言っても電池を入れて横のスイッチをONにするだけ
しばらく裏のLEDが点滅したあと光らなくなるが動作している模様
節約？
電池が切れたかはわからない仕様
おおよそ１年半くらいはもつらしい


## 端末の設定
- BlueToothをオンにする。
- 設定のプライバシー管理からLINE Beaconを利用をオンにする。

<img width="375" alt="IMG_0098.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/53020/af5a553c-cd7f-3ced-cd59-c4618e5d4784.png">

- LINE@アカウントを友達登録する。


## アカウント連携の解除
どうやらLINE Beaconは一つのLINE@アカウントにしか登録不可
他のアカウントから追加で紐付けしようと思ってもできない。
もし開発等で複数利用したい場合は、逐一連携を解除する必要がある

1.[LINE@Manager](https://admin-official.line.me/)にアクセス

![スクリーンショット 2017-02-04 16.06.51.png](https://qiita-image-store.s3.amazonaws.com/0/53020/45a3df86-3ba8-7a6b-29af-5ed3105d526a.png)

2.アカウント一覧からLINE Beaconとの紐付けを解除するアカウントを選択

3.左メニューからLINE Beaconを選択

![スクリーンショット 2017-02-04 16.17.59.png](https://qiita-image-store.s3.amazonaws.com/0/53020/c591004c-21f9-57ca-5006-a126e5494928.png)

4.アカウント連携画面に紐付けてあるビーコン一覧が現れるので、解除したいビーコンと同じIDのビーコンの連携解除ボタンをクリック

![スクリーンショット 2017-02-04 16.23.03.png](https://qiita-image-store.s3.amazonaws.com/0/53020/feb98c74-21c3-0eb8-d189-210be17a486c.png)


# リクエスト先について
また次回
gitよく使うコマンドをまとめる

## git command manual

#### ローカルにリポジトリを作成

```
git init
```
＜使い方＞

$ cd <好きなディレクトリ>

$ git init

カレントディレクトリを Git リポジトリに変換します。このコマンドを実行するとカレントディレクトリに .git フォルダーが作成され、プロジェクトのバージョンの管理を開始することができます。

#### リモートリポジトリをクローン

```
git clone <repository>
```

リモートリポジトリをローカルにコピーします。

＜使い方＞

$ cd <好きなディレクトリ>

$ git clone https://github.com/daisuke-awaji/SGP.git


#### ローカルのブランチ一覧を表示

```
git branch
```
リポジトリのブランチ一覧を表示します。

＜使い方＞

$ git branch

`* master`

#### ローカルにブランチを作成

```
git checkout -b <branch>
```

「-b」オプションで指定したブランチ名で、新しいブランチを切る。

＜使い方＞

$ git checkout -b develop-issues-1

`Switched to a new branch 'develop-issues-1'`

$ git branch

`* FIX-001`

`  master`


#### ソースコードの差分を表示

```
git diff
```

ソースコードの差分を表示します。

＜使い方＞

#### 変更されたファイルの一覧を表示

```
git status
```

変更されたファイルの一覧を表示します。


＜使い方＞


#### ステージング

```
git add <file>
```

差分をステージングします。

＜使い方＞


#### コミット

```
git commit -m  "コメント内容"
```

ステージ環境のファイル差分をリポジトリにコミット（ローカル）

＜使い方＞

#### プッシュ

```
git push <repository> <branch>
```

ローカルリポジトリのコミット差分をリモートリポジトリに更新（プッシュ）する。

＜使い方＞
Unity5の教科書 Chapter 3 学習メモ

年明けから [Unity5の教科書](http://www.sbcr.jp/products/4797386790.html) で Unity の勉強を始めたので、その学習メモです。

## ゲームを作る際の流れ

1. 画面上のオブジェクトを洗い出す
    - 動かすオブジェクト、動かさないオブジェクトを分けておく
1. オブジェクトを動かすためのスクリプトを作る
1. オブジェクトを自動生成するためのスクリプトを作る
1. UI を更新するためのスクリプトを作る

## オブジェクトを動かすスクリプトの作成

Chapter 3 では オブジェクトを動かすためのスクリプトを作る という点を 「マウスボタンを押すとルーレットが回る」という簡単なゲームを作りながら学びました。

### マウスボタンの入力をトリガーに処理をおこなう

`Input.GetMouseButton`, `Input.GetMouseButtonDown`, `Input.GetMouseButtonUp` を使ってマウスからの入力を検出することができます。
マウスのボタンが押された・離された、などは各メソッドの返り値(`bool`)をもとに判別します。具体的には次のように if 文と組み合わせて使います。

```C#
if(Input.GetMouseButtonDown(0)) {
    //左ボタンが押されたときの処理
    //      :
}
if(Input.GetMouseButtonDown(1)) {
    //右ボタンが押されたときの処理
    //      :
}
if(Input.GetMouseButtonDown(2)) {
    //中ボタンが押されたときの処理
    //      :
}
```

上記の例は、ボタンを押すとルーレットが回るというような処理をするときに使えます。ただし `Input.GetMouseButtonDown` はボタンが押されたフレームのみ `true` を返すので、ボタンが押され続けていることは検出できません。ボタンが押され続けていることを検出したい場合は、`Input.GetMouseButton` を使います。

各メソッドが判別できるイベントをまとめると次のようになります。

- `Input.GetMouseButton`: ボタンが押され続けているか
- `Input.GetMouseButtonDown`: ボタンが押されたか
- `Input.GetMouseButtonUp`: ボタンが離されたか

詳細を確認したい場合は以下の公式ドキュメントを参考にしてください。

- https://docs.unity3d.com/ja/current/ScriptReference/Input.GetMouseButton.html
- https://docs.unity3d.com/ja/current/ScriptReference/Input.GetMouseButtonDown.html
- https://docs.unity3d.com/ja/current/ScriptReference/Input.GetMouseButtonUp.html

### オブジェクトを回転させる

`Transform` というオブジェクトの位置、回転、スケールを扱うことのできるクラスを利用します。
オブジェクトの回転は `Transform.Rotate` を使って記述します。

```C#
Transform.Rotate(0, 0, 10);
```

引数は左から `x軸の回転量`, `y軸の回転量`, `z軸の回転量` です。
上の例では、`x軸の回転量`,`y軸の回転量` は 0、`z軸の回転量` は 10 なので、z 軸方向に 10 ずつ回転させることができます。

こちらも詳細は公式ドキュメントを参考にしてください。

- https://docs.unity3d.com/ja/current/ScriptReference/Transform.Rotate.html

### オブジェクトの回転をゆっくり停止させる

「マウスボタンの入力をトリガーに処理をおこなう」、「オブジェクトを回転させる」を組み合わせることで、マウスボタンをクリック→ルーレットが回る というところまでは実装ができます。
あとは、ルーレットの停止です。

オブジェクトを回転させる際には `Transform.Rotate` を使いました。回転量は引数で指定しており、先ほどは z 軸方向に回転させるために、

```C#
Transform.Rotate(0, 0, 10);
```

のように引数を指定していました。回転が止まっている状態というのは以下のように引数がすべて 0 の状態です。


```C#
Transform.Rotate(0, 0, 0);
```

そのため、回転量を徐々に 0 に近づけていくようにすれば、ルーレットの回転をゆっくり停止することができます。

```C#
float xRotateSpeed = 10;

void Update() {
    Transform.Rotate(0, 0, xRotateSpeed);
    xRotateSpeed *= 0.96f;
}
```

例のコードは大分はしょっているのですが、`xRotateSpeed` を 10 で初期化して、`Update` 関数の中で 0.96f との乗算を繰り返すことで、徐々に 0 に近づけていくという方法です。

## おまけ

### MonoDevelop-Unity の vi mode にする方法

1. `Preferences`
1. `Text Editor`
1. `Behavior`
1. `Navigation` → `Use Vi modes` にチェック
Ubuntu on Windows で Windows のフルパス名で cd する

# Ubuntu on Windows の bash で Windows のフルパスで cd できるようにしてみた

Ubuntu on Windows では Windows 側のフォルダが /mnt/ 以下に見えておるわけですが、Windows 側フォルダに一発で cd できると良いなあと思って実装してみました。

動作例はこんなカンジ。**注意点としては Windows のフルパスはシングルクオートで囲む必要があること**。こういうことができると Windows 側から見えているファイルを Ubuntu on Windows で処理するのが色々捗ると思うんですよねー。

![image](https://qiita-image-store.s3.amazonaws.com/0/149350/03ed4d95-a807-0ddd-1e50-f6b677cd9a12.png)


# 実装

単純に考えると「パスを置換してcdする処理」をスクリプトにすればよさそうですが、実はこれではだめです。そのスクリプトは実行中のシェルの子プロセスですから、現在作業中のシェルに対しては何の効力もない。

というわけで、この処理は作業中のシェルで使う関数として書きつつ、本来の cd コマンドを alias で置き換えています。.bashrc とかに以下の内容を追加して新しいシェルを開いてもらえればよいです。

```bash:.bashrcなどへの追加内容
# 入力文字列がWindowsのフルパスの場合に Ubuntu on Windows のパスに置換する処理
__change_winpath2buwpath() {
    if [[ "$1" =~ ^([A-Za-z]):(.*) ]]; then
        # 入力文字列が Windows のフルパスならば
        # ドライブレターとディレクトリに分解する
        windows_driveletter=${BASH_REMATCH[1],}
        windows_path=${BASH_REMATCH[2]}

        # ドライブレターとパスを含めて Ubuntu on Windows 上でのパスにする
        # このときにドライブレターは小文字に変換し
        # バックスラッシュをスラッシュに置換している
        newpath="/mnt/${windows_driveletter}${windows_path//\\/\/}"
    else
        newpath="$1"
    fi
}

#
__cd() {
    if [ "$1" == "" ]; then
        # パラメータが未指定の場合は cd コマンドをパラメータ無しで実行する
        \cd
    else
        # Windowsのフルパスが含まれていたら
        # Ubuntu on Windows のパスに変換する処理
        __change_winpath2buwpath "$1"
        \cd "$newpath"
    fi
}
# cd コマンドを __cd に置換する
alias cd=__cd
```

# 参考資料

ここらへんの内容を参考にしています。

samba経由で参照中のフォルダのパスをssh経由でログイン中のシェルでcdする。
http://pslabo.hatenablog.com/entry/2016/01/27/samba%E7%B5%8C%E7%94%B1%E3%81%A7%E5%8F%82%E7%85%A7%E4%B8%AD%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AE%E3%83%91%E3%82%B9%E3%82%92ssh%E7%B5%8C%E7%94%B1%E3%81%A7%E3%83%AD%E3%82%B0%E3%82%A4

Bashで変数を大文字小文字変換(uppercase/lowercase)する
http://qiita.com/kawaz/items/211266021515b3f033a3

[Bash]正規表現マッチした部分文字列を再利用する方法
http://dqn.sakusakutto.jp/2013/06/bash_rematch_regexp.html
プロデルでディスク空き容量監視バッチを作る

日本語プログラミング言語「プロデル」を使って、ディスクの空き容量を監視して、10%以下になったら警告メールを送信するバッチを作ります。
プロデルは、monoをインストールすればWindowsのみならずLinuxやMacOSでも動作しますので、VPSに構築したLinuxにこのバッチを入れておくという用途に使えます。

```checkdisksize.rdr
ドライブ情報(「/」)を作ってDとする
空き割合は、Dの空き容量/Dの容量

もし空き割合が0.1以下なら

	システムメールサーバというアカウントを作る
	システムメールサーバの送信サーバのサーバ名は、「server@myserver.com」
	システムメールサーバの送信サーバのポート番号は、587

	システムメールサーバの送信サーバの送信者名は、「myserver.com」
	システムメールサーバの送信サーバの認証は、○
	システムメールサーバの送信サーバのユーザ名は、「server@myserver.com」
	システムメールサーバの送信サーバのパスワードは、「」

	通知メールという送信メールを作る
	通知メールの件名は、「空き容量警告」
	通知メールの宛先は、「server@myserver.com」
	通知メールの本文は、「残り容量が[Dの空き容量/1024/1024]MB ([空き割合*100]%)になりました。」
	通知メールをシステムメールサーバから送る

もし終わり
```

『ドライブ情報(「/」)を作ってDとする』の部分で、空き容量を調べるドライブを指定します。
このプログラムは、Linux用に書いていますので、Windowsの場合は次のように書けば、Cドライブの空きサイズを取得できます。

```
ドライブ情報(「C」)を作ってDとする
```

なお、指定できるドライブ一覧は、次のように書くことで調べることもできます。

```
ドライブの一覧を報告する
```


# CentOSでプロデルを動作させる
プロデルは、[Mono](http://www.mono-project.com/)をインストールすることでLinuxとMacOS環境で動作します。

プロデルでは、CUI向け実行環境(pconsole.exe)が用意されています。
次のようにコマンドラインを指定することで、mono環境下でもプロデルで書いたスクリプトを実行できます。

```
$ mono pconsole.exe batch.rdr
```

## mono環境下で動作させるには
上記のようなコマンドラインでスクリプトを実行させるようにするには、monoをインストールして、プロデルのランタイム環境を展開します。

1. monoをインストールします。
主要なディストリビューション向けのバイナリ形式がインストール手段と共に提供されていますので、通常はmakeしてコンパイルする必要はありません。CentOS7といったRedHat系は、[yumを使ってインストール](http://www.mono-project.com/docs/getting-started/install/linux/#centos-7-fedora-19-and-later-and-derivatives)できますので、VPSなどOSが選べる場合にはこちらを利用してインストールするのがおすすめです。

2. [mono版プロデル](http://rdr.utopiat.net/files/mono.html)をタウンロードした上で、任意のディレクトリに展開します。こちらも展開すればすぐに利用できます。

```
$ cd /home/produire/
$ mkdir rdr
$ cd rdr
$ wget http://rdr.utopiat.net/files/mono/produire-mono-1.5.tar.gz
$ tar tvzf produire-mono-1.5.tar.gz
$ mono pconsole.exe /e 時刻を報告する
```

最後のコマンドを実行して、時刻が表示されればプロデルの実行環境ができあがりました。
なお、プロデルではプログラムの文字コードにUTF-8/UTF-16/EUC-JP/Shift_JISが利用できます。例えばターミナルの文字コードを予めUTF-8にしておけば、vimでもスクリプトを変更できます。

##cronを設定する
Linuxサーバ上でcronを使って定期的に空き容量を監視させたい場合には

```
$ crontab -e
```

した後に

```
* 0-23/1 * * * cd /home/produire/rdr/;mono pconsole.exe checkdisksize.rdr
```

などと指定することで1時間ごとにチェックさせることができます。

# Windowsで定期的に実行するには

Windowsの場合は、[タスクスケジューラ](https://technet.microsoft.com/ja-jp/library/cc721931(v=ws.11).aspx) で指定した時間にプログラムを実行させることができます。

#日本語プログラミングでバッチ処理を書くメリット
シェルスクリプトやPowerShellなどのバッチ処理系が充実しているので、わざわざプロデルで作る必要もないかと思われるかもしれません。

バッチスクリプトは、一度作成すると、その後ほとんど手を付けることはありません。ただその後サーバの構成が変化して、バッチを修正する機会があると思います。その時に、スクリプトにしっかりコメントを残していないと、何をしているのかすぐに思え出せない、これが必要なのか無駄なのかわからない。ということもあると思います。

日本語プログラミング言語でバッチスクリプトを書けば、スクリプトそのものに日本語名を使うことになるので、例えば数年前に書いたバッチを見直した際にも、意味を思い出しやすくなります。

自分や日本人しか読む可能性がないスクリプトにわざわざ英語でコメントを書いたり、そもそも面倒くさがってコメントを省いて書いて、後で困ることを考えれば、はじめから「日本語名でバッチスクリプトを書いてみる」という選択肢もアリなのではないでしょうか。
JBODなマシンの後ろの方のディスクにDebianインストールしようとしたらコケてた（ので直した）

すっげぇ多くのディスク付けたマシン（JBODでね）にdebian-installer(d-i)でインストールしようとすると失敗する、という話を昔聞いた。要は/dev/sdaから始まってディスク１個毎にアルファベットが変わるのだけど、/dev/sdzの次は/dev/sdaaってなって、このディスクへインストールしようとするとバグ踏んでgrubのインストールがコケる（/dev/sdaa以降のディスクにgrubをインストールしなければ、関係ない）。

d-iでgrubのインストール作業はgrubパッケージじゃなくてgrub-installerパッケージが担当してた。読む。直した。

```
--- grub-installer.orig	2017-02-03 22:51:57.598613756 +0900
+++ grub-installer	2017-02-04 00:19:37.085153540 +0900
@@ -254,7 +254,7 @@
     /dev/mapper)
 	disc_offered_devfs="$bootfs"
 	;;
-    /dev/[hsv]d[a-z0-9]|/dev/xvd[a-z]|/dev/cciss/c[0-9]d[0-9]*|/dev/ida/c[0-9]d[0-9]*|/dev/rs/c[0-9]d[0-9]*|/dev/mmcblk[0-9]|/dev/nvme[0-9]*n[0-9]*|/dev/ad[0-9]*|/dev/da[0-9]*)
+    /dev/[hsv]d[a-z0-9]*|/dev/xvd[a-z]|/dev/cciss/c[0-9]d[0-9]*|/dev/ida/c[0-9]d[0-9]*|/dev/rs/c[0-9]d[0-9]*|/dev/mmcblk[0-9]|/dev/nvme[0-9]*n[0-9]*|/dev/ad[0-9]*|/dev/da[0-9]*)
 	disc_offered_devfs="$prefix"
 	;;
     *)
```

/dev/[hsv]d[a-z0-9] ではなく /dev/[hsv]d[a-z0-9]* としただけ。


検証は
 * VirtualBoxに大量の仮想ディスクを追加して環境を作成
 * d-i RC2で再現させて、シェルに落ちる
 * /usr/bin/grub-installer を編集…するのだけど、自分がヘタレなのでvimを使うことに。chroot した/target 以下にあるので/lib/x86_64-linux-gnu/以下を/libにコピーして、/target/usr/bin/vim.tiny を立ち上げて編集
 * シェルをexitしてgrubをインストールして再起動
 * 無事起動した。/dev/sdab を使っているのが確認できる

![VirtualBox_debian_04_02_2017_13_41_39.png](https://qiita-image-store.s3.amazonaws.com/0/33063/eaebbb71-6cd7-3f86-5268-897297fd100e.png)

多分過去にバグレポートされたのがあるだろうと思って検索、見つけたのでパッチを添付してgrub-installerにreassignしてtag付けといた。
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=839894

まぁ、この程度の技術レベルでも作業できる訳ですのでレッツトライ。
dlibをiosのSwiftで動作させる時の注意点

この辺にiosで動作させる方法について、記載があります。
・[dlibを使用してiOSで顔の輪郭検出、オブジェクト候補領域抽出を行う](http://qiita.com/hirokimu/items/d37e01d712a9ca873dee)
・[zweigraf/face-landmarking-ios](https://github.com/zweigraf/face-landmarking-ios)
しかし最新版のdlib（執筆時点では19.2が最新）では
"_USER_ERROR__missing_dlib_all_source_cpp_file__OR__inconsistent_use_of_DEBUG_or_ENABLE_ASSERTS_preprocessor_directives_"
というエラーが出てしまいます。

最新版では、Processor Macrosに「NO_MAKEFILE」を追加するかsource.cppをプロジェクトに追加するとコンパイルが成功するようになりました。
また、注意点として、Build SettingsのHeader Search Pathsには、「/***/dlib-19.2/dlib/..」のように、指定してnon-recursiveを設定する必要があるようです。

### 追記
xcodeを8.2に上げたところ、「Undefined symbols for architecture x86_64:」というエラーが発生してしまいましたが、[こちら](http://stackoverflow.com/questions/39807835/how-to-use-dlib-in-xcode-c-console-application)の投稿にあるように、TARGETSからBuild Phasesを選択して、Link Binary With LibrariesでAccelerate.frameworkを選択するとエラーが消えるようになりました。
heroku上のDBをリセットする

# heroku上でのDB操作

herokuで

```
rake db:reset
rake db:migrate:reset
```
のようにデータベースを操作する場合、

```
Running rake db:reset on ⬢ hidden-mountain-82613... up, run.9384 (Free)
FATAL:  permission denied for database "postgres"
DETAIL:  User does not have CONNECT privilege.
/app/vendor/bundle/ruby/2.2.0/gems/activerecord-4.2.5
```

となり、Permission deniedされてしまう。

そこで、herokuでDBを操作する場合は

```
heroku pg:reset DATABASE_URL
```

を行う。

## その後
```
heroku run rake db:migrate
heroku run rake db:seed
```
などを行う。
Raspberry Pi 構成

# Raspberry Pi 構成

自分用の覚書です。

|項目|商品|備考|
|:--|:--|:--|
|本体|[Raspberry Pi2 Model B ボード＆ケースセット (Standard, Clear)-Physical Computing Lab](https://www.amazon.co.jp/gp/product/B00TBKFAI2/ref=od_aui_detailpages00?ie=UTF8&psc=1)||
|電源|[Raspberry Piスターターパック (Pi2 用Standard)](https://www.amazon.co.jp/gp/product/B00TLGADDS/ref=od_aui_detailpages00?ie=UTF8&psc=1)||
|マイクロSDカード|[Raspberry Piスターターパック (Pi2 用Standard)](https://www.amazon.co.jp/gp/product/B00TLGADDS/ref=od_aui_detailpages00?ie=UTF8&psc=1)||
|イーサネットケーブル|[Raspberry Piスターターパック (Pi2 用Standard)](https://www.amazon.co.jp/gp/product/B00TLGADDS/ref=od_aui_detailpages00?ie=UTF8&psc=1)||
|USB Wi-Fiドングル|[BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM2 Wireless LAN Adapter](http://buffalo.jp/product/wireless-lan/client/wli-uc-gnm2/)||
|モニタ用HDMIケーブル|[Raspberry Piスターターパック (Pi2 用Standard)](https://www.amazon.co.jp/gp/product/B00TLGADDS/ref=od_aui_detailpages00?ie=UTF8&psc=1)||
|モニタ用HDMIケーブル|[Amazonベーシック ハイスピードHDMIケーブル - 0.9m (タイプAオス - タイプAオス/イーサネット/3D/4K/オーディオリター) ](https://www.amazon.co.jp/gp/product/B014I8SIJY/ref=oh_aui_detailpage_o08_s00?ie=UTF8&psc=1)||
|キーボード|[サンワサプライ USBキーボード(ブラック) SKB-L1UBK](https://www.amazon.co.jp/gp/product/B005LL9J9G/ref=oh_aui_detailpage_o04_s00?ie=UTF8&psc=1)||
|マウス|[エレコム 有線マウス BlueLED 3ボタン Sサイズ 1.0mケーブル ブラック M-BL16UBBK](https://www.amazon.co.jp/gp/product/B008JBQDQM/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)||
|カメラ・マイク|[LOGICOOL ウェブカム HD画質 120万画素 C270](https://www.amazon.co.jp/gp/product/B003YUB660/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)||
|ディスプレイ・スピーカ（本体）|[Pumpkin AC-DC 変換アダプター](https://www.amazon.co.jp/gp/product/B01CQJQ5MY/ref=oh_aui_detailpage_o08_s00?ie=UTF8&psc=1)||
|ディスプレイ・スピーカ（電源）|[Pumpkin CH1003B （10.1インチ DVDプレーヤー）](https://www.amazon.co.jp/gp/product/B01A5JEKLA/ref=oh_aui_detailpage_o08_s00?ie=UTF8&psc=1)||
canvasのパフォーマンス向上


## プリレンダリング

imgタグではなく、canvasタグを配列に格納

```javascript:preloadCanvas.js
export function preloadCanvas (paths) {
  return new Promise((resolve, reject) => {
    let canvasAry = [];
    let loadCount = 0;
    paths.forEach((path, index) => {
      // loadの中に入れるとcanvasの順番が変わってしまう
      // 場合があるので、外に出しておく
      const canvas = document.createElement("canvas");
      canvasAry.push(canvas);
  
      let img = new Image();
      img.src = path;
      img.addEventListener('load', () => {
        // 1度canvasに描く
        const ctx = canvas.getContext("2d");
        canvas.width = img.naturalWidth;
        canvas.height = img.naturalHeight;
        ctx.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight);

        loadCount += 1;
        if (loadCount == paths.length) {
          resolve(canvasAry)
        }
      }, false)
    })
  })
}
```


```javascript:script.js
import {preloadCanvas} from "./lib/preloadCanvas";
// 画像のパスを渡して、一度描画したcanvasを得る
const preloadedCanvasAry = preloadCanvas(fileAry);

・・・（略）Promise処理とか

// 一度描画したcanvasを再びcanvasに描画する
ctx.drawImage(preloadedCanvasAry[index], 0, 0, canvas.width, canvas.height)


```

> 参考
[HTML5 canvas のパフォーマンスの改善](https://www.html5rocks.com/ja/tutorials/canvas/performance/)
Scalazの"~>"ってなに？(Scalaの中置記法について)

ScalazのFreeモナドについて勉強中なのですが、ryobbyさんの[scalaz - Free](http://qiita.com/ryoppy/items/c03b47b34ddfd710809c)の記事を拝見している際に

```scala
val interpMock = new (Command ~> Id) {
  def apply[A](a: Command[A]): A = a match {
    ...
  }
}
```

という構文が出てきまして、本題のFreeモナド以前に「この"~>"ってなんだ？(-_-;)」っていうところで躓いてしまったので、調べてみました。

# ~>の定義

```scala:pakage.scala
package object scalaz {
  type ~>[-F[_], +G[_]] = NaturalTransformation[F, G]
}
```

```scala:NaturalTransformation.scala
trait NaturalTransformation[-F[_], +G[_]] {
  ...
}
```

要するに`~>[A, B]`は`NaturalTransformation[A, B]`のエイリアスのようです。

しかし問題のコードは

```scala
val interpMock = new ~>[Command, Id] {
```

ではなく

```scala
val interpMock = new (Command ~> Id) {
```

という記述になっています。なぜこんな記法が可能なのでしょうか？

# 中置記法

kmizuさんの[Scala変態技法最速マスター](http://kmizu.hatenablog.com/entry/20100203/1265192486)に答えが書いてありました。引用させて頂きますと

> Scalaでは２つの型パラメータを持つジェネリックな型は中置記法で書くことができるというシンタックスシュガーが導入されています。

とのことです。

ということで、`type`によるエイリアス指定と合わせて、

```scala
val interpMock = new (Command ~> Id) {
  ...
}
```

は

```scala
val interpMock = new NaturalTransformation[Command, Id] {
  ...
}
```

だということですね。

# 実験

一応自分でコードを書いて実験してみました。

```scala
class MySample[F, G]
// defined class MySample

type ~>[F, G] = MySample[F, G]
// defined type alias $tilde$greater

new ~>[Int, String]
// MySample[Int,String] = MySample@158d255c

new (Int ~> String) // こう書ける
// MySample[Int,String] = MySample@48e64352

new (Int MySample String) // これもオーケー(恐ろしい)
// MySample[Int,String] = MySample@51a06cbe

new Int ~> String // これは駄目
// error: object java.lang.String is not a value
```

# まとめ

GoogleでScalaの記号を検索する場合の用語集が欲しいですね・・・(-_-;)。

("~>"の場合は"scala tilde greater"で検索すると色々ヒットしました)
SwingでMat型画像をGUI上に表示

#概要
Swingを使ったGUI上でOpenCVの処理結果を表示してみる.

#Swingとは
JavaのGUIツールキットでありAWTを拡張したものになります．
Swingで作成したGUIはOSのコンポーネントに頼らずに独自のGUIコンポーネントで描画を行うため
実行環境によらずに使用できる点がメリットです．
デメリットとしてはOSのコンポーネントではなくなるために動作処理が遅くなる点があります．

#Swingでの画像の扱い
Mat型からSwing上で画像を表示するために本稿ではBufferedImageを使用します．
BudderedImageはアクセス可能なバッファを持つイメージデータでColorModelとRasterで構成されています．
RasterのSampleModel内のバンド数と型はその色とアルファ値を表すためのColorModelに必要な数と型と一致する必要があります．
また(0,0)座標は左上隅となっています．そのためRasterはminX=0,minY=0でなければなりません．

#準備段階
次のものを導入します．
・java開発環境
・OpenCV3.1

調べれば様々な日本語での説明ページがでるため割愛します．

#実装するメソッド
処理部分は次のようになります．

```Java:Mat2Image
public static BufferedImage Mat2Image(Mat src) {

//Mat srcのチャネル数を取得
	    int type = 0;
	    if (src.channels() == 1) {
	        type = BufferedImage.TYPE_BYTE_GRAY;
	    } else if (src.channels() == 3) {
	        type = BufferedImage.TYPE_3BYTE_BGR;
	    } else {
	        return null;
	    }
//新規BufferedImage型をsrcの幅，縦，チャネル数で作成．
	    BufferedImage image = new BufferedImage(src.width(), src.height(), type);
//作成したBufferedImageからRasterを抜き出す.
      WritableRaster raster = image.getRaster();
//抜き出したRasterからバッファを抜き出す．
	    DataBufferByte Buf = (DataBufferByte) raster.getDataBuffer();
	    byte[] data = Buf.getData();
	    src.get(0, 0, data);

	    return image;
	}
```

これを呼び出してSwingのLabelに.setIconしてあげれば表示されます．

```Java:SetIcon
    lblNewLabel = new JLabel();
    ImageIcon image = new ImageIcon(createAwtImage(src));
    lblNewLabel.setIcon(image);
   ```



#実行結果

![lena.png](https://qiita-image-store.s3.amazonaws.com/0/162880/abc7d9eb-f2fe-7fda-19bd-7634b85e0b4b.png)

無事GUI上にImreadで読み込んだMat型の画像を表示することができました．

#コード配布
今回作成した画像表示用GUIのソースはこちらになります.
https://github.com/JackdMasaki/Mad2Image/blob/master/Mat2Imagetest.java

#参考
当記事の作成にあたって次のページを参考にさせていただきました．
深く感謝申しあげます．
http://answers.opencv.org/question/10344/opencv-java-load-image-to-gui/
https://docs.oracle.com/javase/8/docs/api/index.html?java/awt/image/BufferedImage.html
特定のclassを削除する


デモ：http://codepen.io/mo4_9/pen/dNdQed

```javascript
function removeSpecificClass($elm, str) {
  const regexp = new RegExp(`\\b${str}\\S+`, 'g');
  console.log(regexp)
  $elm.removeClass(function(index, className) {
    return (className.match(regexp) || []).join(' ');
  });
}
removeSpecificClass( $(".item"), "is-" );
removeSpecificClass( $(".item"), "can" );
```

> 参考
[jQueryの.removeClass()で「特定の文字列で始まるclass」をすべて削除する](http://qiita.com/shouchida/items/01bada913bf660cdad03)
[正規表現を使ったマッチングに変数を使用する](http://qiita.com/ykob/items/6e4d0b07bed57881a2bd)
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp
Unity5の教科書　Chapter2後半を学習してみた（配列、関数、クラス）

#**初めに**
[Unity5の教科書](http://www.sbcr.jp/products/4797386790.html "Unity5の教科書")　2章の後半を学習してみました。
自分なりの解釈を加えてアウトプットしています。

Unity初心者の為、指摘などあれば頂けると嬉しいでっす。

#**配列**

- 使いどころ

 複数のプレイヤーの点数を管理する場合、1000個の変数をすべて宣言するのは大変であるが、配列を使えば1000でも10000でも作れる。

- 配列の宣言

```
int[] points = new int[10];　　　　　　　　　　　　　　　　　　　　　　
```

　int型のpointsを宣言
　new int[10] でint型の箱を10つ作成

- 配列の順番配列は0から作成される

　　points[0]　1番目
　　points[1]　2番目
　　points[2]　3番目
　　　・
　　　・ 
　　points[9]　10番目

- コード例<br>

　*int型のpointsを5つ作成後、値を入れる。

```
  int[] points = new int[5];  
  points[0] = 10;  
  points[1] = 20;
  points[2] = 2;
  points[3] = 6;
  points[4] = 30;
```
　*変数の宣言と同時に値を入れる

```
int[] points = {10, 20, 2, 6, 30}; 
```

同時に沢山の変数を宣言できるのが、配列と理解しました。
更に[Unity5の教科書](http://www.sbcr.jp/products/4797386790.html "Unity5の教科書")では配列の使い方の例など分かりやすく説明していました。

#**関数**
- 使いどころ

　一連の処理をまとめたい時などに使用する

``` 
　　　　→　攻撃処理
　処理　→　防御処理　　　　　　
　　　　→　逃げる処理
```
攻撃の時は攻撃処理を呼び出して、防御の時は防御処理を呼びだすなど

- 引数、返り値

　引数は複数渡せる
　返り値はひとつだけ

関数を呼び出して使用する方法や引数を渡して関数で計算をして
返り値として値を戻す方法が使い方としてあります。

- コード例<br>

*引数も返り値も無い関数

```
void Hey(){
    Debug.Log("I'm tanaka");
    }

void start(){
    Hey();
    }

出力結果
I'm tanaka
```
voidは返り値なし
Heyは関数名、()は引数なし。

*引数のある関数

```
void Call(string name){
    Debug.Log("Hello" + name);
    }

void start(){
    Call("tanaka");
    }

出力結果
Hello tanaka

```
voidは返り値なし
callは関数名、(string name)はstr型の変数name


*引数と返り値のある関数

```
int Add(int a, int b){
    int sum = a + b;
    return sum;
    }

void start(){
    int answer;
    answer = Add(10, 20);
    Debug.Log(answer);
    }

出力結果
30

```
Add関数に引数を2つ渡しています。
「10をint a」、「20をint b」に値を渡しています。
関数内で計算した結果sumを返り値として返します。
結果 answer = sumとして計算された結果がAdd(10, 20)を置換されるイメージになります。




#**クラス**
- 使いどころ

　関数と変数をまとめるときに使う。
　関係のある変数と関数をひとまとまりにしてスクリプト管理が楽になる。

- クラスの使い方

　1.作成したクラスを、intやstrの様に型として使用することができる。
　2.tanakaクラスを作成した場合、tanaka型として使用が可能になります。

```
tanaka mytanaka;　　　　この段階では空の箱を作っただけの状態
```
通常の変数で数値などの値を代入するように、tanaka型のmytanakaにも実体を代入する必要があり実体の事を「インスタンス」と呼びます。

　*インスタンス作成

```
tanaka mytanaka = new tanaka();
```

- アクセス修飾子

　public    アクセス可能
　private   アクセス不可能

関数内の変数や関数に対してアクセス可能かアクセス不可能か決めるために使用します。

| アクセス修飾子 | アクセス可能なクラス |
|:-----------|------------:|:------------:|
| Public     | 全てのクラスからアクセスが可能|
| protected  | 同じクラスとそのサブクラスからアクセス可能|
| private    | 同じクラスからのみアクセス可能|

#**Vectorクラス**
- 使いどころ

　キャラクターを動かす時などに使用する。
　加速度、力、移動速度などの数値として使う事も可能。 
　2DではVector2を使用する。
　3DではVector3を使用する。
  

- コード例<br>

Vector2 クラス名 = new Vector2(x軸, y軸);

```
Void start(){
   Vector2 tanaka = new Vector2(10.0f, 3.0f);
 }
```

Vector3 クラス名 = new Vector3(x軸, y軸, z軸);

```
Void start(){
   Vector3 tanaka = new Vector3(10.0f, 3.0f, 1.0f);
 }
```
SwaggerファイルをHTMLへ変換する

# 目的
yaml形式で作成したswaggerファイルをドキュメントとして共有するためにHTML形式に変換します。

# 方法
## yamlからasciidocへ変換
swagger2markup-cli
https://github.com/Swagger2Markup/swagger2markup-cli
をクローンしてビルドします。

```
$ git clone https://github.com/Swagger2Markup/swagger2markup-cli.git 
$ ./gradlew jar
```
build/libsディレクトリにjarが出力されます。
以下のように実行します。
```
$ java -jar swagger2markup-cli-1.2.1-SNAPSHOT.jar convert -i swagger.yaml -f swagger
```
 -i swaggerファイル名
 -f 出力ファイル名

## asciidocからHTMLへ変換
Asciidoctorをインストールします。
http://asciidoctor.org/
```
$ gem install asciidoctor
```

以下のように実行します。
```
$ asciidoctor -a toc=left swagger.adoc	
```
-a toc=left
を付けるとサイドバーに目次を付けることができます。

Swagger Editorのサンプルswaggerファイルを変換すると以下のようなHTMLが生成できます。
<img width="1216" alt="スクリーンショット 2017-02-04 19.02.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/83184/a153a55f-4ec1-2318-ba43-112500384c4e.png">

<img width="1215" alt="スクリーンショット 2017-02-04 19.04.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/83184/a3d30038-9744-1dac-781e-69cd10eb27db.png">
収益2倍キャンペーン中のNendフルボード広告をUnityで実装する

## はじめに
2017年2月1日よりはじまっているnendの収益２倍キャンペーン。フルボード広告というのも初めて聞きましたが、おもしろそうな広告だったので入れてみることにしました。1時間もあれば実装できるんですが、つまらないことでハマって半日かかってしまったので、ここに記録しておきます。

https://www.nend.net/event_app_fullboard/

## 実装方法
めちゃくちゃ簡単です。というか公式にあるサンプルがまんま使えます。（SpotIdとApiKeyは変える必要があります）
https://github.com/fan-ADN/nendSDK-Unity/blob/master/NendUnitySample/Assets/Scripts/FullBoardController.cs

## やはりハマったその１
サンプルを流用していればよいのですが、SDKのドキュメントそのままで実装するとハマるポイントがあります（ハマってからサンプルの存在に気づいたorz）

こちらのSDKマニュアルを参考に実装すると、UNITY_EDITORのケースが考慮されていません。
https://github.com/fan-ADN/nendSDK-Unity/wiki/%E3%83%95%E3%83%AB%E3%83%9C%E3%83%BC%E3%83%89%E5%BA%83%E5%91%8A

```
 m_fullBoardAd = NendAdFullBoard.NewFullBoardAd ("your spot id", "your api key");
```
ここの処理は、UNITY_EDITORだとnullが返ってきます。nendはUNITY_EDITOR上で動かす試すことができません。サンプルと同様にnullチェックを入れる必要があります。

## やはりハマったその２
実機で動かすと、AdFailedToLoadがコールバックされていました。エラーのタイプは`FailedAdRequest`でした。

```
FullBoardAdErrorType.FailedAdRequest
```
ApiKeyが間違っているのかなーと何度も確認しましたが、怪しいところはないし、ググってもヒットしないし困りましたが、こういうときはやっぱり公式ドキュメント。ちゃんと書いてありました。

https://github.com/fan-ADN/nendSDK-Unity/wiki/FAQ#inquiry1
> 端末の言語設定が日本語以外になっていないか
> 言語設定（日本語以外）によっては配信可能な広告の在庫がないために受信エラーになる場合があります

英語でデバッグするために言語設定を英語にしていました。日本語に変更したところ無事表示できました。

実行する端末の言語設定によって広告が表示できない場合があるので、Loadに失敗したケースを考慮して実装しておく必要があります。


## 今回のアプリは絶賛配信中です(nendの実装は近日公開予定)

[![動画](http://img.youtube.com/vi/d84vL9UgOBc/0.jpg)](http://www.youtube.com/watch?v=d84vL9UgOBc)


配信：
iOS: https://itunes.apple.com/jp/app/id1189800250
Android: https://play.google.com/store/apps/details?id=com.keepgamesimple.rollingsphere