OmniAICreator/Qiita-1.07M huggingface dataset:
技適済み格安高性能Wi-FiモジュールESP8266 コピペでWiFi接続出来るArduinoIDE用ソースコードとその解説

さて前回の[ArduinoIDE上にESP8266の開発環境](http://qiita.com/azusa9/items/264165005aefaa3e8d7d)が出来上がった所で、「どうやってWiFiに接続すれば良いのか分からん！」と言う事になると思うので、次は、このソースコードをコピペしてプログラムを送り込んで楽しんでみて下さい。
結構はまるポイントがあるので、最後まで目を通して下さい。




## ESP8266でWiFi接続するためのプログラム

以下のソースコードをコピペしてコンパイルして書き込んで下さい。
起動すれば、IO5のピンがHIGH（3.3v）になり、無線の接続が途絶えるとLOW（0v）になり、また接続されるとHIGH（3.3V）に出力が変化するはずです。

デバッグ用にシリアルにWiFiのステータスや、DHCPで取得したIPを送信するプログラムにしてあります。
書き込めたら、ArduinoIDEにあるシリアルモニタを開くなどして、WiFi状態やIPを確認して下さい。


WiFi環境は、次の環境で試しています。

* WPA2 パーソナルのアクセスポイントに接続
* SSIDは広報している（ANY接続拒否のステルスモードでも繋がる事確認しました。マルチSSIDだと繋がらないこともあるようです。2015.08.06修正）
* ネットワーク上にDHCPサーバが用意されている




```Java:QiitaWiFi01
#include <ESP8266WiFi.h>

char toSSID[] = "XXXXXXXX";
char ssidPASSWD[] = "YYYYYYYYYYY";

void setup() {
  //デバッグ用にシリアルを開く
  Serial.begin(115200);
  Serial.println("PG start");

  //WiFiに繋がったらLEDを点灯させるので、そのピンをOUTPUTに設定して、LOWに。
  pinMode(5, OUTPUT);
  digitalWrite(5, LOW);

  //WiFiクライアントモード設定
  WiFi.mode(WIFI_STA);

  //WiFiを繋ぐ前に、WiFi状態をシリアルに出力
  WiFi.printDiag(Serial);

  //WiFiの設定を入れる。IPは、デフォルトがDHCPのようで、IPが共有されるときはWiFiのアクセス情報だけでOK
  WiFi.begin(toSSID, ssidPASSWD);

  // 固定IPではネットワークステータスが上手く動かないので、今は使えなさそう。
  // 本家にバグ登録はされているらしい。
  //  WiFi.config(ip, gateway, subnet);

  //接続が確立するまで、・・・を表示
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");

    //WiFi.printDiag(Serial);

  }

  //ここに来たら、接続完了している。

  //改行して繋がったことをシリアルで伝える。
  Serial.println("");
  Serial.println("WiFi connected");

  //WiFiの状態を表示
  WiFi.printDiag(Serial);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  // 無線LAN接続OK LED点灯
  digitalWrite(5, HIGH);


}

void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    // コネクション確立済み以外のステータスなので
    // 無線LAN接続NG LED消灯
    digitalWrite(5, LOW);
  } else {
    //コネクションOKなので、点灯
    digitalWrite(5, HIGH );
  }

  delay(500);

}
```


## とても、とても大切な注意事項

上記のプログラムが動く様になるまで、結構苦戦しました。
以下の各注意事項は、ESP8266 by ESP8266 Community 1.6.4-673-g8cd3697  を使った時の事なので、今後変わると思います。自分がどのバージョンを使っているのか確認して下さい。

* 固定IP設定用のメソッド　WiFi.config(ip, gateway, subnet)　が用意されているが、固定IPを設定しようとすると上手くWiFi接続出来ない。クライアントモードではDHCP一択の状態（接続状態を確認する関数が上手く動いていないようですが、どのソースが悪いのかは未確認）

**以下だけ、1.6.5-988-gfd1d9daのバージョンで2015.08.06再確認**

* マルチSSIDだと繋げなさそう（手元にある、BUFFALO WAPS-HP-AM54G54で確認した結果。当初はステルスモードだと繋げないと思っていましたが、再確認したら繋げました。私の手元の無線APは一般的でないので他の機種ではマルチSSIDでも繋がる可能性はあります。2015.08.06修正）


## 次にやろうと思っている事
* [AD変換](http://qiita.com/azusa9/items/26e74e4e0d5773ce9c41)
* [ディープスリープモード](http://qiita.com/azusa9/items/65a5c3772c41631b5ca1)

です。お楽しみに～

またハマりどころを、下記に順次まとめています。あわせてこちらもご覧下さい。（随時更新中なので、ストックしてもらえれば更新時に通知させてもらいます）
http://qiita.com/azusa9/items/fe20794aa858a73fd97b
データ容量が大きいログファイルをgrepする

データ容量が多いとうまくgrepすると時間がかかるが、oオプションをつけると該当パターンの箇所のみを表示するので便利。

`grep -o [検索内容] [ファイル名]`

wc -lでパイプすると対象行数がカウント出来るのでさらに便利。

`grep -o [検索内容] [ファイル名] | wc -l`
PythonでUser Agentをパーズする

User Agentをパーズするために、[httpagentparser](https://pypi.python.org/pypi/httpagentparser)を使ってみました。
手っ取り早い方法ですと、こんな感じで使えます。

```py
import httpagentparser
 
user_agent = 'Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.307.11 Safari/532.9'
httpagentparser.simple_detect(user_agent)
# ('Linux', 'Chrome 5.0.307.11')
```

`httpagentparser.detect()`の場合、User Agentの情報をもう少し細かい単位で取ることができます。

```py
httpagentparser.detect(user_agent)
# {'platform': {'version': None, 'name': 'Linux'}, 'os': {'name': 'Linux'}, 'bot': False, 'browser': {'version': '5.0.307.11', 'name': 'Chrome'}}
```

Python 3にも対応しております。User Agentに応じた処理を書く必要が生じた場合には、便利かもしれません。
物体の当たり判定【Unity】


Colliderの当たり判定をとる時にisTriggerを使用した場合の挙動でハマりました。

##OnTriggerEnter
GameObjectにColliderを適応して、isTriggerにチェックを入れることで、OnTriggerEnterハンドラが有効になります。
しかし、これだと物体をすり抜けてしまいます。
ユーザーには見えないゾーンの判定やアイテムゲットの時に使えばいいかと思います。

``` C#:
void OnTriggerEnter(Collider other) {
	// 他のColliderと衝突した瞬間に呼ばれます
}
```

##OnCollisionEnter
こちらはisTriggerにチェックを入れなくても有効になります。
すり抜けることなく、反発して再度衝突したときにも呼ばれます。

``` C#:
void OnCollisionEnter2D(Collision2D other) {
	// 他のColliderと衝突した瞬間に呼ばれます
}
```
UIScrollViewとUINavigationBarがずれた時の対応


## 現象
UINavigationBarがあるViewControllerにScrollViewを全画面で置いて、
UIコンポーネントを置いていきました。
しかしStoryBoadの表示位置とビルドした時のiPhoneの画面がどうしてもずれる。
その解決方法を調べました。

UIコンポーネントの階層は

* View(rootView)
	* ScrollView
		* View(コンテンツビュー）
			* IBコンポーネント（実際に配置するコンポーネント）

------
(20150719日追記)

AutoLayoutの設定はVisual Format Languageで表すと

* ```H:|-(-16)-[ScrollView]-(-16)|```
	*  ScrollViewの水平位置はrootViewの左右の端（左右は16ポイントのマージンがあるので-16を指定）
* ```V:|-[ScrollView]-|```
	* ScrollViewの垂直位置はrootViewの上下の端
* ```|-[View(600)]-|```
	* コンテンツビューはScrollViewの上下左右の端。そして高さ横幅600ポイント
* ```H:|-8-[Label]|```
	* ラベルは左端から8ポイント離れる
* ```V:|-153-[Label]|```
	* ラベルは上から153ポイント離れる

---------

![スクリーンショット 2015-07-13 17.50.25.png](https://qiita-image-store.s3.amazonaws.com/0/31587/56b1b6b4-f880-5cb7-61ff-cf456d6ed509.png "スクリーンショット 2015-07-13 17.50.25.png")

Storyboad上ではナビゲーションのすぐ下にラベル「IBと表示位置が違う」を配置しました。


### アプリを実行した際の表示
![iOS Simulator Screen Shot 2015.07.13 17.54.47.png](https://qiita-image-store.s3.amazonaws.com/0/31587/2a86cd13-9bdb-064d-8b2c-988a919992f9.png "iOS Simulator Screen Shot 2015.07.13 17.54.47.png")

実行した際のレイアウトはラベルがナビゲーションのかなり下に来てしまいました。
（ナビゲーションと同じ距離離れている？？）

## 解決方法
**ViewControllerのAttributesInspector**にある
*Layout > Adust Scroll View Insets*
をオフにするとIBでの表示と同じになりました。

![スクリーンショット 2015-07-13 18.12.29.png](https://qiita-image-store.s3.amazonaws.com/0/31587/71072751-536f-7d48-f703-8374b63bfddd.png "スクリーンショット 2015-07-13 18.12.29.png")



###　Adust Scroll View Insetsをオフにしてのアプリ実行表示

![iOS Simulator Screen Shot 2015.07.13 17.54.33.png](https://qiita-image-store.s3.amazonaws.com/0/31587/b9df8037-76bb-8e69-7098-2fc878c79cee.png "iOS Simulator Screen Shot 2015.07.13 17.54.33.png")


## 仕組み
Adjust Scroll View InsetsとUnder Top Barsの両方にチェックをした場合に
contentInsets.topが調整されて
UIScrollはナビゲーションバーの下から始まるようです。
なので、Adjust Scroll View Insetsはオフにしたほうがいいようです。

## 参考
やはりお前らのiOS7対応は間違っている(解説編)
http://qiita.com/yimajo/items/254c7cebab7864678246
perlでslack通知

とりあえず送れればいい人向け

```lang:perl
use LWP::UserAgent;
use HTTP::Request::Common;
use JSON;

my $url = "https://hooks.slack.com/services/......"; #webhook url
my $post = {
    "channel" => "#hoge",
    "username" =>  "perl bot",
    "text" => "fuga"
};

my $request = POST( $url, Content_Type => 'application/json', Content => encode_json($post));
my $ua = LWP::UserAgent->new;

$ua->request($request);

```
grunt-spritesmithのscssファイルに自動挿入されるコメントを削除したい場合

デフォルトテンプレートだと下記コメントがscssファイルに自動挿入される
→expand形式でコンパイルすると`/*　*/`のコメントが残ってしまう

```
/*
SCSS variables are information about icon's compiled state, stored under its original file name

.icon-home {
  width: $icon-home-width;
}

The large array-like variables contain all information about a single icon
$icon-home: x y offset_x offset_y width height total_width total_height image_path;

At the bottom of this section, we provide information about the spritesheet itself
$spritesheet: width height image $spritesheet-sprites;
*/
```

cssコンパイル時に`/*　*/`のコメントが残らないように、生成されるscssファイルにコメントが入らないようにする

scssのテンプレートを作成し、cssTemplateの値にセットすればOK

**spritesmith_tmp.txt**

```
{{#items}}
${{name}}_x : {{px.x}};
${{name}}_y : {{px.y}};
${{name}}_offset_x : {{px.offset_x}};
${{name}}_offset_y : {{px.offset_y}};
${{name}}_width : {{px.width}};
${{name}}_height : {{px.height}};
${{name}}_total_width : {{px.total_width}};
${{name}}_total_height : {{px.total_height}};
${{name}}_image : '{{{escaped_image}}}';
${{name}} : {{px.x}} {{px.y}} {{px.offset_x}} {{px.offset_y}} {{px.width}} {{px.height}} {{px.total_width}} {{px.total_height}} '{{{escaped_image}}}';
{{/items}}
```

**Gruntfile.js**

```
sprite: {
dev: {
  src: ['*.png'],
  dest: 'sprite.png',
  destCss: '_sprite.scss',
  imgPath: 'sprite.png',
  algorithm: 'top-down',
  algorithmOpts: {
    sort: false
  },
  cssTemplate: 'spritesmith_tmp.txt',
  padding: 50
},
```

自作テンプレートを設定するので`@mixin`の自動挿入も解除されます。
（@mixinはそのまま設定したい場合は自作テンプレートに追記する）

下記ページのテンプレートを参考にさせていただきました。
> grunt-spritesmith でカスタマイズCSSファイルに差し替える
> http://lab.geo.jp/blog/javascript/grunt-spritesmith.html


`@mixin`の自動挿入のみを解除するには`cssOpts: {functions: false}`を設定するのみでOK
AnsibleでMySQL 5.6をインストールしてみた

Vagrantで素のCentOS 6.5を起動できたので、AnsibleでMySQL 5.6.25をインストールしてみました。

CentOS 6.5でyumインストールすると古いバージョンのものがインストールされてしまうので、
rpmをダウンロードしてインストールするようにしました。
Ansibleの設定はYAMLで記載しますが、「with_items」の書き方でハマりました…。

### ■環境

VagrantとAnsibleを実行する環境は、以下の通りです。

| OS/Tool | Version |
|:-----------|------------:|
| Mac OS X Yosemite | 10.10.4 |
| Vagrant | 1.7.2 |
| Ansible | 1.9.1 |

### ■前提

* Vagrantで、CentOS 5.6を起動済み
(「config.vm.network "private_network", ip: "192.168.33.10"」のコメントを削除して起動)
* 「Vagrantfile」と同じディレクトリに「hosts」ファイルを作成し、以下の内容で保存済み

```
[dev]
192.168.33.10 ansible_ssh_private_key_file=.vagrant/machines/default/virtualbox/private_key ansible_ssh_user=vagrant
```

### ■Ansibleの設定

「Vagrantfile」と同じディレクトリに「playbook.yml」ファイルを作成し、以下の内容で保存しました。
(YAMLファイルは、どこに置いても問題無しです)

```yaml:playbook.yml
---                                                                                                                                   
- hosts: dev
  sudo: yes 
  vars:
    mysql_url: http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6
    mysql_ver: "5.6.25-1"
    mysql_items:
      - rpm: MySQL-client-{{ mysql_ver }}.el6.x86_64.rpm
      - rpm: MySQL-shared-compat-{{ mysql_ver }}.el6.x86_64.rpm
      - rpm: MySQL-shared-{{ mysql_ver }}.el6.x86_64.rpm
      - rpm: MySQL-devel-{{ mysql_ver }}.el6.x86_64.rpm
      - rpm: MySQL-server-{{ mysql_ver }}.el6.x86_64.rpm
  tasks:
    # mysql install
    - name: install mysql
      yum: name={{ mysql_url}}/{{ item.rpm }} state=present
      with_items: mysql_items
      tags: mysql

    # mysqld自動起動設定
    - name: be sure mysqld is running and enabled
      service: name=mysqld state=running enabled=yes
      tags: mysql
```

#### ★ハマりポイント

最初は、「mysql_items」と「yum」を以下のように記載していました。

```yaml:playbook.yml
# (省略)
    mysql_items:
      - MySQL-client-{{ mysql_ver }}.el6.x86_64.rpm # 「rpm」の記載なし
      - MySQL-shared-compat-{{ mysql_ver }}.el6.x86_64.rpm # 「rpm」の記載なし
      - MySQL-shared-{{ mysql_ver }}.el6.x86_64.rpm # 「rpm」の記載なし
      - MySQL-devel-{{ mysql_ver }}.el6.x86_64.rpm # 「rpm」の記載なし
      - MySQL-server-{{ mysql_ver }}.el6.x86_64.rpm # 「rpm」の記載なし
  tasks:
    # mysql install
    - name: install mysql
      yum: name={{ mysql_url}}/{{ item }} state=present # 「item.rpm」ではなく「item」のみ
      with_items: mysql_items

    # (省略) 
```

これを実行すると、1個目(MySQL-client〜)は成功しましたが、2個目は失敗しました。

### ■Ansibleの実行

「Vagrantfile」と同じディレクトリで、以下のコマンドを実行します。

```
$ ansible-playbook -i hosts provisioning/playbook.yml
```

### ■インストール確認

CentOSにSSH接続し、

```
$ vagrant ssh
```

以下のコマンドでMySQL 5.6がインストールされているか確認します。

```
$ mysql --version
mysql  Ver 14.14 Distrib 5.6.25, for Linux (x86_64) using  EditLine wrapper
```

YAMLで指定したバージョン「5.6.25」がインストールできていました！

### ■参考にさせていただいたサイト

初めてのAnsible…いろいろとハマりましたが、以下のサイトを参考にさせていただき、
無事インストールすることができました。ありがとうございます！

* [Ansibleで最新のMySQLをインストールする際にハマったこと。MySQL-shared-compatのこと。](http://mosuke5.hateblo.jp/entry/2015/04/15/171127)
* [Ansible Tutorial](http://yteraoka.github.io/ansible-tutorial/#mysql)
* [Ansibleのyumにwith_itemsを指定するときの落とし穴と回避策](http://qiita.com/hnakamur/items/f8d8ceec3d0e8c4c3a86#1-3)
フォームのテキストボックスが設定した覚えがないのに背景黄色になっている場合

## 背景が黄色になる条件
テキストボックスが「オートコンプリート」機能を使って入力されている場合。

## 仕様
chromeが持っている独自スタイル「user agent stylesheet」により背景黄色で表示されている。

```
input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill {
  background-color: rgb(250, 255, 189);
  background-image: none;
  color: rgb(0, 0, 0);
}
```

## 回避方法
背景色に指定→×
シャドウで設定→○
とのこと

```
input:-webkit-autofill {
  -webkit-box-shadow: 0 0 0px 1000px white inset;
}

```
- http://blog.shg25.com/?p=99
  

 
  


## 参考

- オートコンプリートについて(http://qa.nifty.com/cs/catalog/faq_nqa/qid_13803/1.htm?classification=500007)
Pythonで作ったコマンドラインツールをbrew install出来るようにする


# tl;dr
1. `homebrew-[name]` というリポジトリを作る
2. ごにょごにょする（これから説明）
3. `brew tap [user name]/[name]`
4. `brew install [name]`

# ごにょごにょ
今回は、ドルを円に換算するだけの単純なスクリプトを用意しました
[Pythonを使ってWebAPIをコマンドラインツールに落としこむまでの流れ](http://qiita.com/kei-sato/items/f5df705744ab9263dd4e)
これを、brew install出来るようにします

まずは、homebrew-usdexという名のリポジトリを作成して、クローン

```bash
$ git clone https://github.com/kei-sato/homebrew-usdex.git
$ cd homebrew-usdex
```

ルートに[name].rbというファイルを作成します

```ruby:usdex.rb
class Usdex < Formula
  desc "Exchange usd to any currency, or any currency to usd"
  homepage "https://gist.github.com/kei-sato/98675769952ec7538d6a"
  url "https://gist.githubusercontent.com/kei-sato/98675769952ec7538d6a/raw/3b041cdd0e93c93986b15d158bff158927cb84b1/usdex"
  sha256 "976ae1b2066b2cb40be934fb2265ccd3bd8489f78683c6eaecba29c50edd4758"
  version "1.0.0"

  def install
    bin.install "usdex"
  end
end
```

* desc - アプリケーションの説明
* homepage - あればホームページ、なければgitリポジトリ
* url - ダウンロードするファイルURL（Gistの場合はRawというボタンのリンク先がファイルへの直URL）
* sha256 - ダウンロードするファイルのハッシュ値（後述）
* version - 必須

あとは push, tap, install

```bash
$ git push origin master
$ brew tap kei-sato/usdex
$ brew install usdex
$ usdex -p 2.5 -v
1(USD) => 122.54078(JPY)
2.5(USD) => 306.35195(JPY)
```



## SHA256?
[SHA-256 (Secure Hash Algorithm 256-bit)](http://e-words.jp/w/SHA-256.html)
> SHA-256とは、任意長の原文から固定長の特徴的な値である「ハッシュ値」を求める計算手順(アルゴリズム)の一つ。

* データを64文字（ハッシュ値）にしてくれるアルゴリズム
* 同じデータは同じハッシュ値になる + 違うデータは（ほぼ確実に）違うハッシュ値になる
* つまり、ファイルが2つあった時に、それぞれをハッシュ値にして、同じハッシュ値だったら同じファイルだと言える
* すると、ファイルとそのファイルに対応するハッシュ値が公開されていれば、ファイルをダウンロードした時に、ダウンロードしたファイルのハッシュ値を取って、それを公開されているハッシュ値に照らしあわせて、同じだったらダウンロードしたファイルが改ざんされていないことが確認できる

opensslで生成できます

```bash
$ echo "hello" | openssl dgst -sha256
5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03
$ echo "hello, world" | openssl dgst -sha256
853ff93762a06ddbf722c4ebe9ddd66d8f63ddaea97f521c3ecc20da7c976020
$ echo "hello, world" > /tmp/hello
$ openssl dgst -sha256 /tmp/hello
SHA256(/tmp/hello)= 853ff93762a06ddbf722c4ebe9ddd66d8f63ddaea97f521c3ecc20da7c976020
```

Homebrewでダウンロードするファイルのハッシュ値を生成します

```bash
$ openssl dgst -sha256 usdex
SHA256(usdex)= 976ae1b2066b2cb40be934fb2265ccd3bd8489f78683c6eaecba29c50edd4758
```

# 参考サイト
http://deeeet.com/writing/2014/05/20/brew-tap/
http://qiita.com/masawada/items/484bbf83ef39cad7af74
SortedListとRecyclerViewでちょっと幸せ


Android Support Library 22.1.0からv7 recyclerview libraryにSortedListというクラスが追加されています。
特に必要とされていないのか、同様のふるまいを自力で実装している人が多いのかあまり話題には上りませんが、RecyclerViewのお伴としてなかなか便利なクラスでしたのでご紹介したいと思います。

## 役割
名前の通り、RecyclerView上のリストのソートを自動で行うほか、データの重複や更新チェックなどしてくれます。ページングでリストに次々とデータを追加するような場面で活躍しそうです。
詳細は、簡単な実装方法とともに紹介したいと思います。

## 実装
SortedListはリストに追加するデータクラスと、リストに変更があった際のふるまいを決めるコールバックとともに宣言されます。

```java
SortedList sortedList = new SortedList(MyData.class, new MyCallback());
```

具体的な機能は、このコールバックの実装メソッドを見ると分かりやすいです。
<br/>

```java
compare(T2 o1, T2 o2)
```
データの順番を決定します。
リスト内の順番は、追加順に関わらずこの実装によって決定されます。
``Comparator.compare()``と仕様は同じです。
o1がo2より前ならば負の値、後ならば正の値、同じならば0を返します。
<br/>

```java
areContentsTheSame(T2 oldItem, T2 newItem)
```
リスト内のデータが変更された際、更新通知を行うかどうかを決定します。
ここでtrueを返すと``onChanged()``（※後述）が呼ばれません。
<br/>

```java
areItemsTheSame(T2 item1, T2 item2)
```
リストにデータが追加された際、既に存在するデータとの比較を行います。
既存データとみなされたデータは、リストに追加されません。
ユニークIDの比較などをここでしておくと重複表示が防げます。
<br/>

```java
onChanged(int position, int count)
```
リスト内のデータに変更があった場合に呼ばれます。
<br/>

```java
onInserted(int position, int count)
```
リストに新しいデータが追加された場合に呼ばれます。
<br/>

```java
onMoved(int fromPosition, int toPosition)
```
データの順番に変更があった場合に呼ばれます。
<br/>

```java
onRemoved(int position, int count)
```
データがリストから削除された場合に呼ばれます。
<br/>

あとは普段のListクラスのようにAdapterに組み込んで、RecyclerViewに設定してあげましょう。
それぞれのon～でAdapterに更新通知をするとよいと思います。

SortedListが面白いのは、更新のバッチ処理が作成できる所です。
``beginBatchedUpdates()``と``endBatchedUpdates()``で囲んだ処理をまとめることができます。
例えば、

```java
sortedList.beginBatchedUpdates();
sortedList.add(data1);
sortedList.add(data2);
sortedList.add(data3);
sortedList.endBatchedUpdates();
```

と書くと、``onInserted()``が1度だけ呼ばれます。
無駄な更新通知が行われないほか、RecyclerViewのアニメーションとも相性がいい機能です。
ちなみに、SortedListはListと名前がついているくせにCollectionを実装しておらず、~~addAll()が存在しません。
22.1.0時点ではclear()もなかったと記憶しているのですが、いつの間にか追加されていました。~~
　→22.2.1にてaddAll()も追加されたようです！
addAll(), clear()ではバッチ処理を明記しないでも更新通知が１度しか呼ばれません。

## サンプルコード

お約束の[サンプルコード](https://github.com/citrous/sortedlistsample)を用意しました。
簡単な要素の追加と削除の挙動が確認できます。
本当はソートの定義を差し替えて並び替えができるように…と思っていたのですが手付かず。。。

まとまった追加・削除、重複チェックなどが簡単に実装できるので、知っておくと役に立ちそうなクラスです。
C# DataSetで作ったGridView TIPS


#基本
```csharp
public partial class Form1 : Form
    {
        DataSet dataSet1 = new DataSet();
        DataTable dt = new DataTable();

        public Form1()
        {
            InitializeComponent();

            //ひとつしか選択できないようにする
            dataGridView1.MultiSelect = false;
            //列の幅を一杯に広げる
            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
        }


        private void Form1_Load(object sender, EventArgs e)

        {
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Description", typeof(string));
            // 4行追加します。
            for (int i = 0; i < 4; i++)
            {
                DataRow row = dt.NewRow();
                row["Name"] = "名前";
                row["Description"] = "説明";
                dt.Rows.Add(row);
            }
            //GridViewにセット
            dataSet1.Tables.Add(dt);
            //テーブルデータ表示
            dataGridView1.DataSource = dt;
        }
 }
```

#選択した下に空白行を追加
 ```csharp
        private void Add_btn_Click(object sender, EventArgs e)
        {
                int insert_pos = 0;
                insert_pos = dataGridView1.CurrentRow.Index + 1;
                //挿入する行の生成
                DataRow newRow = dataSet1.Tables[0].NewRow();
                //選択行の下に追加
                dataSet1.Tables[0].Rows.InsertAt(newRow, insert_pos);
            }
        }
```
#選択行を削除
 ```csharp
        private void Delete_bt_Click(object sender, EventArgs e)
        {
            if (dataGridView1.CurrentRow == null)
            {
                MessageBox.Show("これ以上は削除出来ません");
            }
            else
            {
                DataRow myRow = dataSet1.Tables[0].Rows[dataGridView1.CurrentRow.Index];
                myRow.Delete();
            }
            
        }
  ```
#選択セルに文字列追加
```csharp
   if (dataGridView1.CurrentRow == null)
            {
                dt.Rows.Add("文字列");
            }
            else
            {
                dataGridView1.CurrentCell.Value = "文字列";
            }
```
JUnit4 と Robotium を共存させる方法

JUnit4 と Robotium を共存させる方法です。
`@RunWith(Enclosed.class)` でテストクラスを階層化・グルーピングして、テストの条件ごとにテストメソッドを分類して整理できるようになるので便利です。

# Gradle まわり
テスト対象のアプリの build.gradle に設定を書いていきます。
行うことは2つです。
## テストコードの依存関係の解決
* JUnit4（など）
* Robotium

の依存関係を解決します。

```groovy
dependencies {
    androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
    androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.2.1'

    // もしくは、 jar ファイルを ディレクトリに置いておくなら
    // androidTestCompile fileTree(dir: 'testlibs', include: '*.jar')
}
```

## テストランナー (android.support.test.runner.AndroidJUnitRunner) の設定

```groovy
android {
    defaultConfig {
        testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
    }
}
```

# テストクラス
main と同じ階層に androidTest ディレクトリを作ります。そのなかに java ディレクトリを作成します。
図にすると下のとおりです。

```
src
┣ main
┃ ┗ java
┃    ┗ com.example // アプリのコード
┗ androidTest
   ┗ java
      ┗ com.example.debug.test // テストクラスはこの中！
```

テストクラスは次のようになります。

* 各テストクラスの親クラスになる `BaseTest` クラス
* サブクラスの `SampleTest` （`@RunWith(Enclosed.class)` で階層化してみました）

の2つにわけてみました。

```java:BaseTest.class
@RunWith(AndroidJUnit4.class)
abstract public class BaseTest extends ActivityInstrumentationTestCase2<AppBaseActivity> {

	protected Solo solo;

	public BaseTest() {
		super(AppBaseActivity.class);
	}

	@Before
	@Override
	public void setUp() throws Exception {
		super.setUp();
		injectInstrumentation(InstrumentationRegistry.getInstrumentation());
		solo = new Solo(getInstrumentation());
		getActivity();
	}

	@After
	@Override
	public void tearDown() throws Exception {
		solo.finishOpenedActivities();
		super.tearDown();
	}
}
```

```java:SampleTest.class
@RunWith(Enclosed.class)
public class SampleTest {

	@RunWith(AndroidJUnit4.class)
	public static class FooTest extends BaseTest {

		public FooTest() {
			super();
		}

		@Test
		public void runFoo() {
			// テストコード
		}

		@Test
		public void runFooWithExpiredToken() {
			// テストコード
		}
	}

	@RunWith(AndroidJUnit4.class)
	public static class BarTest extends BaseTest {

		public BarTest() {
			super();
		}

		@Test
		public void runBar() {
			// テストコード
		}
	}
}
```

# テスト実行
## GUI
Android Studio。塗りつぶしている箇所はモジュールを選択。
![run_on_android-studio.png](https://qiita-image-store.s3.amazonaws.com/0/44676/38b73d7e-32f2-98a6-b20b-5cb00e923b35.png)
## CUI
```bash
./gradlew clean assembleDebug assembleAndroidTest

# テスト対象のアプリ 
adb install -r sample/build/outputs/apk/app-debug.apk

# テスト
adb install -r sample/build/outputs/apk/app-debug-androidTest-unaligned.apk

adb shell am instrument -w com.example.debug.test/android.support.test.runner.AndroidJUnitRunner
```

# 感想
JUnit4 は JUnit3 に比べて色々と便利なアノテーションが追加されていますね。あまり知らないので学んでいきたいと思いました。
SalesCubeでテーブルから取得したidとnameをプルダウンに反映させる方法

WarehouseService.java に下記メソッドが実装されているとする。

	public List<WarehouseJoin> hhooggee() throws ServiceException {
		try {
			return this.selectBySqlFile(WarehouseJoin.class,
					"warehouse/test.sql").getResultList();
		}catch (Exception e) {
			throw new ServiceException(e);
		}				
	} // function

test.sql は下記のとおりである。

	SELECT
	  WAREHOUSE_CODE
	  ,WAREHOUSE_NAME
	  ,WAREHOUSE_ZIP_CODE
	  ,WAREHOUSE_ADDRESS_1
	  ,WAREHOUSE_ADDRESS_2
	  ,WAREHOUSE_TEL
	  ,WAREHOUSE_FAX
	  ,MANAGER_NAME
	  ,MANAGER_KANA
	  ,MANAGER_TEL
	  ,MANAGER_FAX
	  ,MANAGER_EMAIL
	  ,WAREHOUSE_STATE
	  ,CRE_FUNC
	  ,CRE_DATETM
	  ,CRE_USER
	  ,UPD_FUNC
	  ,UPD_DATETM
	  ,UPD_USER
	FROM
		WAREHOUSE_MST_TRADE

このとき、InputPOrderAction.java から、下記のように呼び出すとよい。

	List<WarehouseJoin> nagoya = warehouseService.hhooggee();
	int sszz = nagoya.size();
	java.lang.System.out.println("yamatoken いんとさいず: " + sszz );						
	
	this.yamatoList.clear();
	for(int i=0 ; i < sszz ; i++){
		LabelValueBean bean = new LabelValueBean( nagoya.get(i).warehouseName , nagoya.get(i).warehouseCode );
		this.yamatoList.add(bean);
	}

ビュー側は下記のようにしておく。

	<html:select property="ctaxRate" styleId="ctaxRate" tabindex="107" style="width: 135px;" onchange="changeTaxRate()">
	    <html:options collection="yamatoList" property="value" labelProperty="label"/>
	</html:select>
PEPPER Detectした人の年齢と性別を識別する


## 概要

BasicAwarenessを使ってDetectした人の性別と年齢を取得します。

## 使うボックス

Choregraphe標準のボックスを使って実装します。

### 1. BasicAwareness

ALBasicAwarenessの制御とイベントの監視を行うボックスです。
そもそもBasicAwarenessっていうのは
Pepperが音に反応したり、顔を見つけたりするための機能です。

![BA.png](https://qiita-image-store.s3.amazonaws.com/0/84155/548ac162-c566-da5e-e6bf-3ad81bde5e44.png)
上から2番目が音に反応したときのイベント
3番目が顔を見つけたときのイベント
4番目が顔を見失ったときのイベントです。

UserSessionにもFocusedUserがありますが、
役割は別なのでうまく使い分けましょう。

### 2. Get Gender

![GetGender.png](https://qiita-image-store.s3.amazonaws.com/0/84155/bcd29eda-42cd-9fff-381c-19ada91e67f4.png)

名前の通り性別を識別するためのボックスです。
レンチマークで閾値（年齢の正確さ）とタイムアウトを設定できます。
閾値が高すぎるとタイムアウトして性別が取れないのでいい感じのところを設定して下さい。

### 3. Get Age

![GetAge.png](https://qiita-image-store.s3.amazonaws.com/0/84155/20c50342-a2cc-3f7d-3349-91f73b8009dd.png)

こちらも上のGet Genderボックスと同じインターフェースになってます。

## 実装

上記のボックスを使用して実装する場合このような配置になります。

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/84155/544ec029-067e-cf22-c767-0c0a7ee2777c.png)

### 解説

Get GenderとGet Ageのボックスを見るとわかりますが、
PeoplePerception/PeopleListというメモリにPeopleIdが入っているかを見ています。

BasicAwarenessによって人の顔を認識した場合
BasicAwarenessボックスのHumanTrackedからPeopleIdが出力されます。
つまりBasicAwarenessのHumanTrackedから値が出力されたときは
かならずPeopleIdがPeoplePerception/PeopleListに入っているので
Get AgeとGet Genderボックスで年齢と性別を取得できる確率が非常に高くなります。
BasicAwarenessボックスがUnloadされない限りは監視を続けるので
アプリ内でDetect中の人の年齢や性別を使うアプリではボックスをUnloadせずに常駐させておくといいです。
Processingを使った光の絨毯

![111.jpg](https://qiita-image-store.s3.amazonaws.com/0/84973/f8498f6b-8891-9d1a-e340-25133b7add61.jpeg)

noise()を使ってパーティクルの波をランダムに発生させ、宇宙空間ぽくしました。
今回は3次元なので、x軸、y軸、z軸にパーリンノイズを生成するためにnoise(x,y,z)として、各パラメータを取得しました。

[noise()　ノイズの生成](http://www.musashinodenpa.com/p5/index.php?pos=476)
>　コンピュータグラフィクスで自然物を表現するときのテクスチャや地形描写などで使われるパーリンノイズの生成に使います。 

>【構文】 
noise(x) 
noise(x, y) 
noise(x, y, z) 

>【パラメータ】 
x ノイズ空間におけるx座標(float) 
y ノイズ空間におけるy座標(float) 
z ノイズ空間におけるz座標(float) 

>【戻り値】 
0.0から1.0の間の値(float) 

またlerp関数を使用して、-speedとspeedの間の値を取得しました。
**lerp(a, b, c)・・・aとbの間の、比cで指定される値を求める**


```lang:p5.pde
int nPoints=30000;
float complexity =3;
float maxMass=0.05;
float timeSpeed=0.002;
float phase=PI;

float windSpeed=70;
int step=10;

float[] pollenMass;
float[][] points;

void setup(){
  //size(500,400,P3D);
  size(displayWidth, displayHeight,P3D);
  background(0);
  frameRate(30);
  points=new float[nPoints][2];
  pollenMass=new float[nPoints];
  
  for(int i=0;i<nPoints;i++){
    points[i]=new float[]{
     random(0,width),random(0,height) 
    };
    pollenMass[i]=noise(0,maxMass);
  }
}

void draw(){
  background(0);
  stroke(255);
  smooth();
  
  //camera(mouseX, mouseY, 220.0, width/2, height/2, height/2, 1, 1, 1);
  
  for(int i=0; i<nPoints; i++){
  pushMatrix();
    float x = points[i][0];
    float y = points[i][1];
    float z = points[i][1];

    float normx = norm(x, 0, width);
    float normy = norm(y, 0, height);
    float normz = norm(z, 0, -1000);
    float u = noise(phase, normx * complexity, normy * complexity);
    float v = noise(phase, normy * complexity, normz * complexity);
    float w = noise(phase, normz * complexity, normx * complexity);
    float speed = (1 + noise(u, v, w)) / pollenMass[i];
    x += lerp(-speed, speed, u);
    y += lerp(-speed, speed, v);
    z += lerp(-speed, speed, w);

    strokeWeight(z/random(100, 500));
    point(x, y, z);
    //image(particleImg, x, y, 30, 30);

    points[i][0] = x;
    points[i][1] = y;
    points[i][1] = z;
    popMatrix();
  
  }
}

void mousePressed(){
  setup();
}

void keyPressed() {
  if ( key == ' ' ) {
    save( "hoge.png" );
  }
}
```

またパーティクルの数（nPoints）は30000としていますが、
これ以上増やすと自分のマシンが遅くなるので、とりあえずこの数にしています。
もっと増やすと綺麗になりますが、処理落ちしてしまうので、この辺りは数を増やしたり減らしたりして、さじ加減が必要になるかと思います。
Backlogの課題のコメント表示等のショートカット（ブックマークレット）

課題のページでそれぞれ以下を実行する。

# コメント表示
## 表示／非表示
- 全て表示
```
javascript:$('#switch-all').click();
```
- コメントのみ表示
```
javascript:$('#switch-comment').click();
```

## 展開／折りたたみ
- 全て展開
```
javascript:$('#expandAll').click();
```
- 全て折りたたむ
```
javascript:$('#collapseAll').click();
```

# コメント投稿
## 編集／プレビュー
- 編集
```
javascript:$('#editor\\.tab\\.link').click();
```
- プレビュー
```
javascript:$('#preview\\.tab\\.link').click();
```
SalesCubeでWarehouseService.javaのhhooggeeを呼び出す方法

MySQLで下記のようなテーブルがあるとする。


![souko.gif](https://qiita-image-store.s3.amazonaws.com/0/75451/f11e69f1-6ab1-bf22-0242-c98dd79fa91c.gif)

WarehouseService.java には、下記のメソッドが実装されているとする。

	public List<WarehouseJoin> hhooggee() throws ServiceException {
		try {
			return this.selectBySqlFile(WarehouseJoin.class,
					"warehouse/test.sql").getResultList();
		}catch (Exception e) {
			throw new ServiceException(e);
		}				
	} // function

このとき、test.sql の内容は下記のとおりである。

    SELECT
      WAREHOUSE_CODE
      ,WAREHOUSE_NAME
      ,WAREHOUSE_ZIP_CODE
      ,WAREHOUSE_ADDRESS_1
      ,WAREHOUSE_ADDRESS_2
      ,WAREHOUSE_TEL
      ,WAREHOUSE_FAX
      ,MANAGER_NAME
      ,MANAGER_KANA
      ,MANAGER_TEL
      ,MANAGER_FAX
      ,MANAGER_EMAIL
      ,WAREHOUSE_STATE
      ,CRE_FUNC
      ,CRE_DATETM
      ,CRE_USER
      ,UPD_FUNC
      ,UPD_DATETM
      ,UPD_USER
    FROM
	    WAREHOUSE_MST_TRADE

この状態で、 InputPOrderAction.java から hhooggee を呼び出すには、下記のようにする。

    import jp.co.arkinfosys.entity.join.WarehouseJoin;

を宣言する。

	List<WarehouseJoin> nagoya = warehouseService.hhooggee();
	String name0 = nagoya.get(0).warehouseName;
	String name1 = nagoya.get(1).warehouseName;			
			
	java.lang.System.out.println("yamatokenねーむ0: " + name0 );			
	java.lang.System.out.println("yamatokenねーむ1: " + name1);						

を実装する。

コンソールには下記のように表示される。

    yamatokenねーむ0: テストそうこＡ
    yamatokenねーむ1: テスト倉庫２
JDBCでSSHトンネルを経由してMySQLに接続する方法


vagrant等で起動した仮想マシン上のMySQLにローカルマシンからSSHトンネルを利用してJDBCで接続する方法を調べたのでメモ

##参考にしたサイト
- http://qiita.com/opengl-8080/items/05d9490d6f0544e2351a#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9

- http://cryptofreek.org/2012/06/06/howto-jdbc-over-an-ssh-tunnel/

##環境
- Java 8
- SpringBoot
- Gradle
- vagrant
 - CentOS7
 - MySQL 5.6.25


##vagrantのポートフォワード設定

下記の設定を追記する

```Vagrantfile
config.vm.network "forwarded_port", guest: 3306, host: 3306
```

##必要なライブラリの設定

jschをライブラリの依存関係に含める。

```build.gradle(抜粋)
dependencies {
    compile 'org.springframework.boot:spring-boot-starter'
    compile 'org.springframework.boot:spring-boot-starter-jdbc'
    compile 'mysql:mysql-connector-java:5.1.35'
    compile 'com.jcraft:jsch:0.1.53'
}
```

##DB接続設定

```application.properties
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/${DB名}
spring.datasource.username=${ユーザ名}
spring.datasource.password=${パスワード}
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
```

###MySQLのデータ

test_table

| id | value |
|--:|:--|
| 1 | hoge |
| 2 | fuga |
| 3 | piyo |


##実装

JSchを利用してSSH接続し、ポートフォワードする。
vagrant側でポートフォワードしている為、不要かと思ったがコメントアウトした状態では接続できなかった。

```Main.java
@SpringBootApplication
public class Main {

    public static void main(String[] args) {
        try (ConfigurableApplicationContext ctx = SpringApplication.run(Main.class, args)) {
            Main m = ctx.getBean(Main.class);
            m.method();
        }
    }

    @Autowired
    private JdbcTemplate jdbc;
    
    public void method() {

        Session session = null;

        try {
            String strSshUser = "vagrant";
            String strSshPassword = "vagrant";
            String strSshHost = "127.0.0.1";
            int nSshPort = 2222;

            String strRemoteHost = "127.0.0.1";
            int nLocalPort = 3306;
            int nRemotePort = 3306;


            final JSch jsch = new JSch();
            session = jsch.getSession(strSshUser, strSshHost, nSshPort);
            session.setPassword(strSshPassword);

            final Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);

            session.connect();
            session.setPortForwardingL(nLocalPort, strRemoteHost, nRemotePort);

            List<Map<String, Object>> list = this.jdbc.queryForList("SELECT * FROM test_table");
            list.forEach(System.out::println);

        } catch (JSchException e) {
            e.printStackTrace();
        } finally {
            session.disconnect();
        }
    }
}
```

```実行結果
{id=1, value=hoge}
{id=2, value=fuga}
{id=3, value=piyo}
```
Winソフト > ScreenSize > タスクバーの高さ > 40ピクセル

画面サイズが限られたノートPCにて、高さ一杯のソフトを作る場合。

タスクバーを隠す設定もできるが、タスクバーは常時表示が望ましい場合もある。

タスクバーは40ピクセル。

<hr>
(追記 2016/11/13)

> タスクバーは40ピクセル。

ただし「小さいアイコンを使う」のチェックが入っていない場合。
Chainerで機械学習と戯れる： ログファイルの行から /apple/i を含む行を見つける、を学習できるか？


はじめに
=======

[k/Nの実数入力から k を出力できるのか？](http://qiita.com/mokemokechicken/items/fb362343c38c22282bc8) の後にふと思ったのが、ログファイルの1行を入力とみなして例えば単純に特定の文字列を含む行を見つけられるのか？ ということでした。

1行の中の各文字を `[char byte code]/255` の実数すると、1行は普通のベクトルで表されます。
ここから特定のパターンを学習できるのでしょうか。

お題： ログファイルの行から /apple/i を含む行を見つけられるか？
======

問題
-----
* 問題： ログファイルの各行から `/apple/i` を含む行を見つける、ということを学習できるか?
* 入力： 1行は100文字以下からなるとする。1文字は `[char byte code]/255` という実数で表される。（入力層は100個）
* 出力： 正規表現の /apple/i がマッチする行のときにy2=1とする。何もマッチしないならy1=1とする。（出力層は２個）

実験
-----
今回使った `log.txt` は 1000行で、`/apple/i` にマッチする行は135行あります。
`log.txt` の90％を学習データ、残り10％を評価データとします。
学習は 100回のbatchで loss が 0.001 以上改善しなければ、打ち切るようにしました。

[実験で使ったソースコードはこちら](https://github.com/mokemokechicken/PlayingChainer/blob/master/src/grep_log/find_error_from_log.py)になります。一緒に log.txt もUpしてありますが、うーん、LocalPCのログとは言え結構怖いなぁ。。

結果
-----

ある試行では、7000バッチ目で学習が打ち切りになり、その時の評価データの正解率は約96.0%でした。
中間層は [100,20] のケースのみ試しました（あまり試行錯誤してないです）。
※つまり **IN:100 -> H1:100 -> H2:20 -> OUT:2** という構造です。

考察
----
ログファイルって出現する文字の位置が結構決まっているので、特に工夫をしなくても思ったより高い値になりますね。
一般的にはもっと工夫しないと全然厳しいとは思いますが、こういう形での利用も有りのような気がしました。

さいごに
======

個人的に少し有意義な結果が得られたような気がします。
監視システムとか特にルールを教えなくても、エキスパートの振る舞いを見て学習してくれると嬉しいんですけどねー

[足し算ゲームをChainerを使って強化学習できるか？](http://qiita.com/mokemokechicken/items/aa1535696514bfe51329)
Storyboardを使ってViewController+TableView

あとで調べたいことがあるのでシンプルに。

# Project
* Xcode 6.4
* Single View Application

# View Controller - View
* BackgroundをOrange、Alphaを0.8にする。 (Storyboard)
* Table Viewを乗せる。 (Storyboard)

# View Controller - View - Table View
* 子ViewのBackgroundをGreen、Alphaを0.8にする。 (Storyboard)
* Separatorの色をBlackにする。 (Storyboard)
* Constraintは親ViewのCenter合わせで一回り小さく。 (Storyboard)

# TableViewの設定
* Table ViewをView Controllerに繋ぐ。 (Storyboard)

```objc:ViewController.h
@property (weak, nonatomic) IBOutlet UITableView *tableView;
```

* Table ViewのdataSourceとdelegateをView Controllerに繋ぐ。 (Storyboard)
* ViewController.hにプロトコルを記述する。 (Code)

```objc:ViewController.h
@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
```

* セル再利用の設定。 (Code)

```objc:ViewController.m
#define _CELLID @"cellId"
- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:_CELLID];
}
```

* UITableViewDataSOurceのrequiredメソッドを追加する。 (Code)

```objc:ViewController.m
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 5;//適当
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:_CELLID forIndexPath:indexPath];
    cell.textLabel.text = [NSString stringWithFormat:@"Section#%02d Row#%02d", (int)indexPath.section, (int)indexPath.row];
    return cell;
}
```

# ここまで
![TestTableView.png](https://qiita-image-store.s3.amazonaws.com/0/18828/728ba37b-4f66-4d1e-5d79-806910b47663.png)
xcode AVAudioPlayerの違い　ios7.1/ios8.4 

ios7.1でAVAudioPlayerで音源を複数回stop/play繰り返すと音がでなくなる場合がありました。
(再生中/停止状態に関係なく[**** play];/[**** stop];繰り返し
ios8.3では発生しないようです。
原因は。わかりませんが。curentTimeがマイナスになる場合があるようです。
0に戻せば再生が解決できそうなので、[**** play]の前にcurentTimeの設定を追加しました。

PS. ****.playingで再生中はcurentTimeを0にすれば、早いとかあったんだけど
　　実験したら音がでない場合があった。
Drone.io で npm install の cache を利かせる

こんかなんじになりました。

```
image: "bradrydzewski/node:0.10"
cache:
  - /tmp/npm
  - /tmp/node_modules
  - /tmp/bower_components
script:
  - pwd
  - whoami
  - mkdir -p /tmp/{npm,node_modules,bower_components}
  - ls -la /tmp/{npm,node_modules,bower_components}
  - sudo chown -R ubuntu:ubuntu /tmp/{npm,node_modules,bower_components}
  - ln -snf /tmp/npm /home/ubuntu/.npm
  - ln -snf /tmp/node_modules node_modules
  - ln -snf /tmp/bower_components app/bower_components
  - time npm install -g coffee karma yo generator-angular grunt-cli bower # -g cannot use cache
  - time npm install
  - time bower install --allow-root --config.interactive=false
  - time grunt test
```

`$(pwd)/node_modules` は npm install でモジュールがインストールされるディレクトリで、`$HOME/.npm` はその時にキャッシュが入るディレクトリ。両方とも、/tmp 以下の cache: で指定したディレクトリに symlink 貼っている。

同様の方法で bower の cache も利かせている。

npm install -g は `npm config set prefix` でインストール場所を変更することができたが、そもそも -g だと再利用してくれないようで意味がなかった。
SalesCubeでWarehouseServiceのメソッドをInputPOrderActionから呼び出す方法

WarehouseService.java に下記のようなメソッドを定義する。

	public List<BeanMap> ppiiyyoo() throws ServiceException {
		try {
			List<BeanMap> results = this.selectBySqlFile(BeanMap.class, 
				"yamato_sql/yamato.sql").getResultList();
			java.lang.System.out.println("yamatokenきーた: "+results);
			return results;
		} catch (Exception e) {
			throw new ServiceException(e);
		}				
	} // function

このメソッドを InputPOrderAction.java から呼び出すには、下記のようにする。

    import jp.co.arkinfosys.service.WarehouseService;

を宣言する。

	@Resource
	protected WarehouseService warehouseService;	

を宣言する。

    warehouseService.ppiiyyoo();

のように呼び出す。

コンソールには下記のように表示される。

    yamatokenきーた: [{id=1, name=kenichiro}, {id=2, name=harumi}, {id=3, name=makiko}, {id=4, name=shouji}]

なお、

	List<BeanMap> yamatoke = warehouseService.ppiiyyoo();	
	java.lang.System.out.println("yamatokenにーし: "+yamatoke);

のようにすると、コンソールには下記のように表示される。

    yamatokenにーし: [{id=1, name=kenichiro}, {id=2, name=harumi}, {id=3, name=makiko}, {id=4, name=shouji}]
@SpringBootApplication アノテーションとは

`@Configuration` と `@EnableAutoConfiguration` と `@ComponentScan` を設定したのと同じ意味になる。  
頻繁に使われるから、`@SpringBootApplication`って書けば設定できるようにしてる。

http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-using-springbootapplication-annotation.html
VirtualBoxが起動しない。

##環境
MAC OS X Yosemite
Virtual Box 5.0

##エラー内容
COMオブジェクトの生成に失敗しました

と出て突如起動しなくなった。

内容は
NS_ERROR_FACTORY_NOT_REGISTERED
と出ている。

##解決
色々ググってやっと解決できたのがここ
http://ilovemylinux.blogspot.jp/2013/04/virtualbox-error-nserrorfactorynotregis.html

/tmpをsudo chmodで権限付与したら起動しました。

何やら/tmp/.vbox〜の様に隠しフォルダを生成してるっぽいので
そこらのrwでコケてたみたい。しかし何故急に。

Windowsで同じ症状の対策に、管理者モードで起動すりゃ良いと書いてあったので
あーなるほど、といったトコです。
Swiftで文字列長

なんでこれに時間かかったんだろ…。

# 環境

Xcode6.4
Apple Swift version 1.2

# 文字列長の取得

```swift
Swift.count("abc")
```

`utf16count`やら`count`やら`countElements`やらが使えなくなってました。
そもそも`countElements`が`count`となり、`count`に`String`渡すと以下のコンパイルエラーがおきました。

> cannot invoke 'count' with an argument list of type (String)

ちょっと困ったのでメモっておきます。
shooting OpenGL 01 move


シューティングゲームの原型。　敵機、自機の移動まで！

```c++:shooting.cpp
#include <GLUT/glut.h>
#include <cmath>
#include <iostream>
#include <cstdlib>
using namespace std;
#define WIDTH 640
#define HEIGHT 480
#define PI 3.141592

class Enemy{
private:
	float xr; // x軸の半径
	float yr; // y軸の半径
	float x;  // x座標
	float y;  // y座標
public:
	void genel(int Num);	// 円生成
	Enemy();				// 初期化コストラクタ
};
	
	static float movex = 0.0;	// 自機のx軸移動値
	float mx = (30.0 / 640.0);	// 自機のx軸
	float my = (30.0/480.0);	// 自機のy軸
	float mh = -1 + (30 * sqrt(3)) / 480 + my;	// 自機の三角の頂点
	static float Emovex = 0.0;		// 敵機のx軸移動値
	int l = 1;				// 円を動かす変数の符号を判断する

Enemy::Enemy(){		// 円の半径
	xr = 60.0/640.0;
	yr = 60.0/480.0;
}

void Enemy::genel(int Num){		// 円生成
	glColor3d(1.0, 1.0, 0.0);
	glBegin(GL_POLYGON);
	for(int i = 0; i < 1000; ++i){
		x  =  -(520.0/640.0) + xr * cos(i);
		y  =   (360.0/480.0) + yr * sin(i);
		glVertex2f((x + (240.0/640.0) * Num ) + Emovex ,y);
					// クラス配列で生成した時に軸をズラす
	}
}
e.jo

void display(){
	Enemy e[5];

	glClear(GL_COLOR_BUFFER_BIT);
	for(int i = 0; i < 5; ++i){
		e[i].genel(i);			// 円作成
		glEnd();				// ５つループで生成するため、中にglEndを入れる
	}
	glBegin(GL_POLYGON);		// 三角(自機)の生成
	glVertex2f(-mx + movex, -1 + my);
	glVertex2f(mx + movex, -1 + my);
	glVertex2f(0 + movex, mh);
	glEnd();
	glutSwapBuffers();		// ダブルバッファリングの関数
}

void shoot(){
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_POLYGON);
	float shootx = (5/640)
}

void keyboard(unsigned char key, int x, int y){

	switch(key){
		case 'a':	// a を入力すると左に動く
		case 'A': 
		if(-mx * 2 + movex > -1){
			movex -= 0.05;
			glutPostRedisplay();
		}
		break;

		case 'd':	// d を入力すると右に動く
		case 'D': 
		if(mx * 2 + movex < 1){
			movex += 0.05;
			glutPostRedisplay();
		}
		break;
			
		case 'q':	// q Q ESC を入力するとプログラム終了
		case 'Q':
		case '\033':
		exit(0);

		default: break;
	}
}


void timer(int value){	// 毎秒ごとに再描画して、アニメーションさせる
	if(0.0 < Emovex && Emovex < 0.2){	// 範囲内の時に動かす
		Emovex += l * 0.01;
	}else{
		l = -1 * l;						// 範囲外にきたら符号を逆転させる
		Emovex += l * 0.01;
	}
	
	glutPostRedisplay();				// 再描画
	glutTimerFunc(40, timer, 0);		// 第一引数毎秒で繰り返す
}



void init(){
	glClearColor(0.0, 0.0, 0.0, 1.0);	// 背景色　黒
}

int main(int argc, char *argv[]){
	glutInitWindowPosition(100, 200);
	glutInitWindowSize(WIDTH, HEIGHT);
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
	glutCreateWindow(argv[0]);
	glutDisplayFunc(display);
	glutKeyboardFunc(keyboard);
	glutTimerFunc(100, timer, 0);
	init();
	glutMainLoop();
	return 0;
}
```
![スクリーンショット 2015-07-13 14.37.06.png](https://qiita-image-store.s3.amazonaws.com/0/85547/5aeba038-1b50-38c6-366b-dab8e595772b.png "スクリーンショット 2015-07-13 14.37.06.png")
xcode SKShapeNode小さい違い　ios7.1/8.4

xcode上でSpriteKitの勉強中に気になったので投稿します。


SKShapeNodeは、多角形の作成に便利なのですが、比較すると
細かい事かもしれないですが、線の継ぎ目が、ios7.1/ios8.4で違うのです。

**ios7.1の場合**
![shape7.1.jpg](https://qiita-image-store.s3.amazonaws.com/0/75082/39f885f4-27ff-ca45-3c4a-8ef3c8ea1e57.jpeg)

**ios8.4の場合**
![shape8.4.jpg](https://qiita-image-store.s3.amazonaws.com/0/75082/b7b49d7a-b12d-9144-c6d2-c29b256dcc7a.jpeg)

小さな事でした。
JavaでList<LabelValueBean>にラベルとバリューを設定する方法

下記のように yamatoList が定義されているとする。

    public List<LabelValueBean> yamatoList = new ArrayList<LabelValueBean>();

この状態で、下記のように bean と add を用いて、ラベルとバリューを追加できる。

	this.yamatoList.clear();
	LabelValueBean bean1 = new LabelValueBean("りんご","アップル");
	LabelValueBean bean2 = new LabelValueBean("みかん","オレンジ");
	LabelValueBean bean3 = new LabelValueBean("ぶどう","グレープ");			
			
	this.yamatoList.add(bean1);
	this.yamatoList.add(bean2);
	this.yamatoList.add(bean3);			

ビュー側にセレクトリストとして表示させるには、次のようにする。

    <html:select property="ctaxRate" styleId="ctaxRate" tabindex="107" style="width: 135px;" onchange="changeTaxRate()">
    <html:options collection="yamatoList" property="value" labelProperty="label"/>
    </html:select>

![ringoList.gif](https://qiita-image-store.s3.amazonaws.com/0/75451/0294a795-4aae-cb2a-30aa-4a80aabb9916.gif)
[RaspberryPI2] (2016-01-25 updated) CentOSイメージが配布されてた

~~[Another Proof of Concept armv7hl Release, this one for the Raspberry Pi2](http://seven.centos.org/?p=381)~~
~~22, June ということで、3週間前くらいの記事。~~

2015年12月11日ごろにアップデートが配布されてました。
http://news.softpedia.com/news/centos-7-linux-officially-released-for-raspberry-pi-2-banana-pi-and-cubietruck-497891.shtml



### ダウンロード

~~[http://people.centos.org/](http://people.centos.org/hughesjr/armv7hl/rpi2/images/)~~
http://mirror.centos.org/altarch/7/isos/armhfp/

### 解凍

```shell-session
$ unxz CentOS-Userland-7-armv7hl-Minimal-1511-RaspberryPi2.img.xz
```


### SDカードへのインストール

[DD for Windows](http://www.si-linux.co.jp/techinfo/index.php?DD%20for%20Windows)

[Win32DiskImager](http://osdn.jp/projects/sfnet_win32diskimager/)


### 起動

無事起動しました。
以下注意事項。

 * rootユーザーのパスワードは ~~ありませんでしたので、各自設定をしてください。~~ ``centos`` になってます。(https://wiki.centos.org/SpecialInterestGroup/AltArch/Arm32#head-6c398ac6c18c92aca61ac974866636e43c48d2eb) 起動後に変更してください。

 * 起動直後は英語キーボード配列になっておりますので、記号の位置が日本語キーボードと違います。お気をつけて。。。

| 英語キーボード | 日本語キーボード |
|---|---|
| : | [Shift] ; |
| = | ^ |
| _ | [Shift] - |

 * ~~日本語キーボード対応してました！~~
 * ~~↑うそでしたすみません。。（ターミナル経由で操作していたので勘違いしました。申し訳ありません。）~~
 * 日本語キーボードに設定する

```shell-session
# localectl set-keymap jp106
# cat /vconsole.conf
KEYMAP="jp106"
``` 

 * ~~ログインしたら、記事に載っているように、``/etc/firewalld/firewalld.conf``を編集して``IPv6_rpfilter=no``と設定してください。~~

 * バージョン的な情報は下記のとおりでした。

```shell-session
# uname -a
Linux rpi2 4.1.11-v7+ #822 SMP PREEMPT Fri Oct 23 16:22:18 BST 2015 armv7l armv7l armv7l GNU/Linux

# cat /etc/redhat-release
Derived from Red Hat Enterprise Linux 7.2 (Source)
```

 * 日付が``Thu Jan  1 00:37:11 UTC 1970``になっているので、まずは日付を設定しましょう。[タイムゾーンの設定](http://qiita.com/snaka/items/a291423d6ceac9f091a7)

```shell-session
# yum install -y ntpdate
# ntpdate -b ntp.nict.jp
25 Jan 07:39:43 ntpdate[7738]: step time server 133.243.238.243 offset 1453704983.460838 sec
# date
Mon Jan 25 07:39:58 UTC 2016
# cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# date
Mon Jan 25 16:42:21 JST 2016
```

### 事始め記事書きました。
[[Raspberry Pi] RaspberryPi 2でCentOS7 ことはじめ](http://qiita.com/pb_tmz08/items/16da9c91f9f5efe46683)


## 関連記事

（2015-11-17）
[Raspberrypi2のRaspbian or CentOSインストール手順とssh接続(Mac使用)](http://qiita.com/shu920921/items/c0c47067fd696b2b77af)

（2016-01-15）
[RaspberryPI 2にCentOSでwebmin、virtualmin環境（ローカルWEB開発環境）を構築する（予定）](http://qiita.com/mmt_eun/items/2206a69e43f769664a0f)

（2016-02-03）
[centos7でキーボードレイアウト変更](http://qiita.com/sue71/items/64c513ae181e9f7aa8f4)
Vagrant で VirtualBox の guestproperty を使って cloud-init を使ってみる

Vagrant で cloud-init を、どうにかこうにかして使ってみました。

- ホスト
    - Windows 7
    - Vagrant 1.7.2
    - VirtualBox 4.3.26
- ゲスト
    - CentOS 7.1.1503
    - cloud-init 0.7.5

## Box の作成

Vagrant で適当な CentOS 7 の環境を作って SSH でログインします。

```sh
vagrant up
vagrant ssh
```

cloud-init をインストールします。

```
yum install -y cloud-init
```

cloud-init の設定ファイルを作ります。
[cloud-init を None データソースで動作確認する][None DataSource] のように None データソースを使います。

```sh
cat <<EOS> /etc/cloud/cloud.cfg.d/vbox-cloud-init.cfg
datasource_list: [None]
datasource:
  None:
    metadata:
    userdata_raw: |
      #include
      /etc/cloud/user-data
EOS
```

VirtualBox の guestproperty を使うとホスト/ゲスト間で値を共有することができます。
これを利用して↑の cloud-init の設定ファイルで指定した位置に user-data を配置するためのスクリプトを作ります。

```sh
cat <<EOS> /usr/local/libexec/vbox-cloud-init.sh
#!/bin/bash
VBoxControl --nologo guestproperty get user-data | sed '1s/^Value: *//' > /etc/cloud/user-data
EOS
chmod +x /usr/local/libexec/vbox-cloud-init.sh
```

このスクリプトをシステム起動時に実行するために systemd のユニットを作ります。
cloud-init 関連のサービスよりも先に実行する必要があります。

```sh
cat <<EOS> /etc/systemd/system/vbox-cloud-init.service
[Unit]
Description=vbox-cloud-init
Before=cloud-init.service cloud-init-local.service cloud-config.target cloud-config.service cloud-final.service
After=local-fs.target systemd-journald.socket basic.target system.slice

[Service]
Type=oneshot
ExecStart=/usr/local/libexec/vbox-cloud-init.sh
RemainAfterExit=yes

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

systemd の設定ファイルを読み直して有効にします。

```sh
systemctl daemon-reload
systemctl enable vbox-cloud-init
systemctl status vbox-cloud-init
```

ホスト側のコンソールに戻って box を作ります。

```
vagrant package --output vbox-cloud-init.box
```

Box を追加します。

```
vagrant box add vbox-cloud-init vbox-cloud-init.box --force
```

## Vagrant の環境の起動

別のディレクトリで Vagrantfile を作ります。
ホストのファイルから guestproperty を設定しているのがポイントです。

```ruby
Vagrant.configure(2) do |config|
  config.vm.box = "vbox-cloud-init"

  config.vm.provider :virtualbox do |vb|
    vb.customize ['guestproperty', 'set', :id, 'user-data', File.read('user-data')]
  end
end
```

user-data も適当に作ります。

```yaml
#cloud-config
user: oreore
hostname: oreore.example.com
fqdn: oreore.example.com
timezone: "Asia/Tokyo"
```

起動して接続します。

```sh
vagrant up
vagrant ssh
```

cloud-init によりホスト名の設定やらユーザーの作成やらが行われています。

```
$ uname -n
oreore.example.com

$ id oreore
uid=1000(oreore) gid=1000(oreore) groups=1000(oreore),4(adm),10(wheel),190(systemd-journal)
```

---

Vagrant の provision でいいじゃん！ って感じですが、Vagrant の provision だと sshd が起動した後になるので、例えばホスト名とかはもっと前の段階で設定させたいこともあると思うし、vagrant ssh のための公開鍵を設置したりもできるので、もうとっと作りこめばそれなりに有用かもしれないです。


[None DataSource]: http://qiita.com/ngyuki/items/e2d0c13f54054e4f35e4 "cloud-init を None データソースで動作確認する"
Laravel5.0でAWS S3にファイルアップロード

# パッケージインストール
https://github.com/aws/aws-sdk-php-laravel
Laravel5.0の場合、これの2.xを使う。

```json:composer.json
  "require": {
    "aws/aws-sdk-php-laravel": "2.*"
  },
```

⇒ composer update

# 設定
公式ドキュメント記載の通り、`config/app.php` の`providers`, `aliases`に追記。

```php:app.php
    'providers' => array(
        'Aws\Laravel\AwsServiceProvider',
    )

    ...

    'aliases' => array(
        'AWS' => 'Aws\Laravel\AwsFacade',
    )
```

アクセスキー回りも公式ドキュメントの通り.envに書く。

```env:.env
AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXX
AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXX
AWS_REGION=us-west-2
```

# サンプルコード
```php:
// postされたファイルを取得
$file = $request->file('my_image');

// S3へアップ
$s3 = App::make('aws')->get('s3');
$result = $s3->putObject(array(
    'Bucket'     => 'バケット名',
    'Key'        => 'XXXXX/test.png',
    'SourceFile' => $file->getRealPath()
));
```

# おまけ - 実装しながらハマった初歩的なこと

## App::が使えない
`use Illuminate\Support\Facades\App;`
を書かないと使えない。

## aws-sdkのcreateClientメソッドがundefined
Usageに、
`$s3 = App::make('aws')->createClient('s3');`
とあったのでそのままコピペして使おうとしたらメソッドが存在しなかった。

ここは`createClient`ではなく`get`でOK.

## 入力フォームでファイル選択したのにpostデータがNULL
`<form>`に`enctype="multipart/form-data"`を指定してなかったのが原因。

bladeで下記のように`'files'=> true`を書けば指定できる。
`{!! Form::open(array('action' => 'TestController@store', 'files'=> true)) !!}`

## putObjectは実行できたっぽいけどS3にファイルが上がってない
putObject関数の引数'Key'に、ディレクトリまでのパスしか書いてなかったのが原因。

`ファイル名.拡張子` まで指定するとちゃんとアップされる。
c > -1を使用してmaskすべてのビットを立てる > ~0の方が個人的にはいいように思いました

```c
// const unsigned long mask = 0xFFFFFFFF;
const unsigned long mask = -1;
```

これだとunsigned longが64ビットになっても問題ない。
0xFF...FFで宣言していると64ビットでは上位が0になるのでコードの変更が必要になる。

<hr>
(追記 2017/01/18)

@shiracamus さんの[コメントの記載方法](http://qiita.com/7of9/items/d4a2e4cf56f93065249d/#comment-d27476e93bd6e41b341e)の方が、個人的にはいいように思います。