OmniAICreator/Qiita-1.07M huggingface dataset:
iOSのリストっぽいのを作るために、ExpandableListViewをExpand/Collapseしないようにする

# なぜAndroidのListViewにはSectionがないんだ

セクションさえあればとても便利なのに……と思うタイミングは数多く。

どうしてもセクションを作りたいと思って、ExpandListViewを使うことにしました。
もしかしたら、もっと良い方法が有るのかもしれませんが……。

# onGroupClickは、何もせずtrueをreturn

簡単です。以下のとおりです。

1. ExpandableListViewに、OnGroupClickListenerをセット
2. implementするメソッドonGroupClickで、何もせずtrueをreturn

## 実装例

```java
public class MyActivity extends Activity implements ExpandableListView.OnGroupClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...

        _expandableListView = (ExpandableListView) findViewById(R.id.listview);
        _expandableListView.setGroupIndicator(null);  // nullにするとグループのセルの左に出る矢印が消えます
        _expandableListView.setChildIndicator(null);  // 同様、左に表示されるインジケータが消えます
        _expandableListView.setOnGroupClickListener(this);

        // 引数: context, 1階層目のdata, cellのlayout, mapKey, 挿入先のlayoutID, 2階層目のdata...
        SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(
                this,
                genres,
                R.layout.item_group_as_section /* セクションとなるレイアウト */,
                new String[] {key},
                new int[] {android.R.id.text1},
                categories,
                R.layout.item_expand_child /* タップできるセルとなるレイアウト */,
                new String[] {key},
                new int[] {android.R.id.text1}
        );

        listView.setAdapter(adapter);

        // すべてのグループをexpandする処理
        for (int i = 0; i < genres.size(); i++) {
            listView.expandGroup(i);
        }
    }

    /*
     * グループ(セクション)をタップすると、ここが実行される
     * trueを返すと、そこで終了。falseを返すと、デフォルトの動作（=collapse/expand）になる
     */
    @Override
    public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
        return true;
    }

}
```

実装例は長くなってしまいましたが、大事なのは上の数行です。簡単だと思います。
Goroutine の同時実行数を制限する

Goroutine の同時実行数を制限します。

# やりかた

下の例では、10 個のタスク (do_something) が 2 個ずつ並列実行されます。

```go
// num 個のワーカーを生成し、tasks チャンネルを監視させる
func GenWorkers(num int) chan<- func() {
	tasks := make(chan func())
	for i := 0; i < num; i++ {
		go func() {
			for f := range tasks {
				f()
			}
		}()
	}
	return tasks
}

func main() {
	// 2 個ずつ実行するワーカー
	tasks := GenWorkers(2)

	// 10 個のタスクを渡す
	for i := 0; i < 10; i++ {
		tasks <- func() {
			do_something()
		}
	}
	return
}
```

# 参考

[How would you define a pool of goroutines to be executed at once in Golang? - Stack Overflow](http://stackoverflow.com/a/18406762)
Ansibleのロールベストプラクティスにあえて抗ってみるプラグイン

(アホみたいな不具合が2箇所あったので、これから直します)

# まえがき

先月あったAnsible Meetup Tokyoに参加した際のLT枠で[yunanoさん](http://qiita.com/yunano)が発表していた[この内容](http://qiita.com/yunano/items/65b8d3989d15c71287df)に触発されて、 **rolesフォルダに置いてあるYAMLファイルの中身をロールとして展開して使うようにするプラグイン** というのを作成してみました。
途中雑になりながらもテストコード書きながら実装進めてみたり、サンプルのplaybookも準備しながらコード書いたので実用は多分可能です。実用性は保証できないですが。

あと、「抗う」なんて書いてはみたもののある程度複雑なら普通にベストプラクティスに従うといいと思います。


# 実物

ここ↓
https://github.com/attakei/ansible-packed-role-plugin

こんな動きします。

![ansible-packed-roles-plugin.gif](https://qiita-image-store.s3.amazonaws.com/0/6805/82a8791a-5c05-7d9b-bfbc-b32b8e1bbf81.gif)

## 何をしてくれるか

* コールバックプラグインの場所に plugins/packed_role.py を含まれるようにする
* Playbookに指定されたロールがroles/フォルダにYAMLファイルとして置かれている

上記のように設定してPlaybookを実行すると、YAMLファイルをロールとして扱って動いてくれます。

### もうちょっと細かく

↓のようなフォルダ構成を用意します。rolesフォルダの中にはYAMLファイルがあるだけでフォルダは無いです。

```
+ hosts
+ roles
  + nginx.yml
+ webserver.yml
```

playbook(webserver.yml)の中身。

```yaml
- hosts: web
  roles:
    - nginx
```

nginx.ymlの中身。

```yaml
tasks:
  - name: Install nginx
    sudo: yes
    yum: name=nginx state=present
  - name: Enable service nginx
    sudo: yes
    service: name=nginx enabled=yes state=started
handlers:
  - name: Reload nginx
    sudo: yes
    service: name=nginx state=reloaded
```

playbookを実行します。

```shell-session
$ ansible-playbook -i hosts webserver.yml
```

問題なくnginxのロールが実行されて、フォルダ構成が以下のように変わると思います。

```
+ hosts
+ roles
  + nginx/
    + defaults/
      + main.yml
    + files/
    + handlers/
      + main.yml
    + tasks/
      + main.yml
    + templates/
    + vars/
      + main.yml
  + nginx.yml
+ webserver.yml
```

## 副作用とか

現時点のプラグインだとrolesフォルダにロールの内容を直接展開してしまうため、余計なファイル群を大量に作ります。（それこそベストプラクティス通りのフォルダとmain.ymlを生成します）

```
+ roles
  + nginx/
    + files/
      + nginx.conf
    + tasks/
      + main.yml
  + nginx.yml
```

例えば、上のようなフォルダ構成になっていた場合には、nginxロールを指定したplaybook実行時ににnginx.ymlの中身を無条件展開するため、nginx/tasks/main.ymlを編集していた場合は中身を上書きしてしまいます。

# やってみたいこと(やるべきこと)

* YAMLファイルの出力先を既存のrolesフォルダとは別にする
* main.yml以外を出力できるようにする
* YAMLファイルも別のフォルダに置く？
* もうちょっと英語ドキュメントちゃんとする

# 謝辞(参考にしたページまとめ)

* http://qiita.com/yunano/items/65b8d3989d15c71287df
* http://tdoc.info/blog/2014/02/16/ansible_callbacks.html
Linux のロケール設定を日本にするレシピ

#[SoftLayerクッキングLABO] (http://qiita.com/MahoTakara/items/464da29ccf932698b753)

# このレシピで出来ること

SoftLayerはアメリカの企業なので、OSを起動すると、米国中部地域のロケール設定になっている。東京データセンターでインスタンスを起動しても、やはり米国中部に設定されている。 そこで、このレシピは、Linuxのロケール設定を日本に変更するものです。 
ロケール設定とは、メッセージの日本語表示、時計表示のJSTに変更など、言語や地域に関連する設定を総称として表すものです。


# レシピの要約
この locale01 レシピは、以下の設定を適用します。

- リポジトリに登録された更新を適用
- 日本語パッケージをインストール 
- 言語を 日本語に変更
- 時刻を JST へ変更


# レシピの作成と解説
解説用のバージョンで、GitHubに登録したものが最新版です。

```
# Debian系とRedHat系で、対応が異なる部分を分岐します。
case node['platform']
###
### Ubuntu の設定
###
when 'ubuntu'
  execute 'apt-get update' do
    command 'apt-get update'
    ignore_failure true
    action :run
  end

  %w{
    language-pack-ja-base
    language-pack-ja
  }.each do |pkgname|
    package "#{pkgname}" do
      action :install
    end
  end

  execute 'update-locale LANG=ja_JP.UTF-8 LANGUAGE=ja_JP:ja' do
    command 'update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"'
    ignore_failure true
    action :run
  end

###
### RedHat/CentOSの設定
###
when 'centos','redhat'
  execute 'yum update' do
    command 'yum update -y'
    ignore_failure true
    action :run
  end
  #
  # RedHat/CentOS 7 からロケール設定が変わったので、ここで分岐します。
  # 
  if node['platform_version'].to_i == 7 then
    package 'man-pages-ja.noarch' do
      action :install
    end
    execute 'localectl set-locale LANG=ja_JP.UTF-8' do
      command 'localectl set-locale LANG=ja_JP.UTF-8'
      action :run
    end
  else
    # こちらが RedHat/CentOS 6 に対応する部分です。
    execute 'yum -y groupinstall "Japanese Support"' do
      command 'yum -y groupinstall "Japanese Support"'
      ignore_failure true
      action :run
    end
    bash "change locale" do
      code <<-EOC
        sed -i.org -e "s/en_US.UTF-8/ja_JP.UTF-8/g" /etc/sysconfig/i18n
      EOC
    end
  end

end # node['platform']

#
# こちらは、Debian/Ubuntu RedHat/CentOS で共通部分です
# タイムゾーンの設定
script "Change TIMEZONE " do
  interpreter "bash"
  user        "root"
  code <<-EOL
    rm -f /etc/localtime
    ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
  EOL
end
```


# 対応するソフトレイヤー活用ガイド
- [1.2.2 設定スクリプトの自動実行](https://www.change-makers.jp/post/10294)


# テスト済みのLinuxディストリビューション
SoftLayerで選択出来るOSで確認したもののリストです。

- Ubuntu 14.04 64bit minimal install
- CentOS 7 64bit minimal install
- CentOS 6 64bit minimal install
- Debian 7 64bit minimal install (タイムゾーン設定のみ)


# レシピの置き場所
最新版のレシピはGitHubにあります。
- [GitHub https://github.com/takara9/chef-repo/tree/master/site-cookbooks/locale01] (https://github.com/takara9/chef-repo/tree/master/site-cookbooks/locale01)


# Chef 関連マニュアル
このレシピを作るにあたって参照したCHEFマニュアルのリンクです。
- script  (https://docs.chef.io/resource_script.html )
- execute (https://docs.chef.io/resource_execute.html )
- package (https://docs.chef.io/resource_package.html )
- About the Recipe DSL (https://docs.chef.io/dsl_recipe.html#about-the-recipe-dsl )
- About Ohai (https://docs.chef.io/ohai.html )
Circular Gravity Forceで遊んでみた

<a href="https://www.assetstore.unity3d.com/jp/#!/content/8181" target="_blank"><img src="https://qiita-image-store.s3.amazonaws.com/0/46444/a9bca336-3d4c-70ea-e492-8c0522c2f2fa.png"></a>

使い方は
<a href="http://resurgamstudios.com/cgf.html" target="_blank">チュートリアル</a>
こちらの動画を見れば全てわかるので割愛。

##こんなの作ってみた
十字キーで移動、スペースキーでオブジェクトを回収
ようするに羊とか牛とかを誘拐するゲームみたいなやつ・・・。
<img src="http://ayumegu.daa.jp/img/Qiita/gravity.gif" width="350px">

なんとソースはこれしか書いていない
回収したオブジェクトを消すところだけ

```csharp

using UnityEngine;
using System.Collections;

public class CatchPoint : MonoBehaviour {

	void OnTriggerEnter(Collider other) {

		if(other.gameObject.tag == "Object")
		{
			Debug.Log (other.gameObject.name + "Get!");
			Destroy(other.gameObject);
		}
	}
}

```

こんな感じになってます
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/2e582ffc-f9f9-b436-5023-b0a6e811093f.png" width="300px">

ホバークラフトのインスペクタ
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/c9c6a60a-ed37-59e3-359e-70138e28a6dc.png" width="250px">

ほとんどがインスペクタの設定で完了しています。
ホバークラフトの動作や惑星の設定はほとんどデモのprefabのままです

###ホバークラフトのTrigger Hoverの設定
回収するcubeのLayerをObjectにしているのでIgnore LayerにObjectを設定してあげます。
そうしないと、キューブの高さ分ホバークラフトが浮き上がってしまいます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/140c09df-1737-c2b5-0508-acfa7582ba8b.png" width="350px">

###吸引するところの設定
Spaceキーで動作するようにCGF_KeyControlsをアタッチしています。
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/9dd3603c-4394-4a00-75ec-ecde1659cd7e.png" width="350px">

###キャッチするところ
からのゲームオブジェクトにBoxColliderをアタッチしています。
そこに唯一コーディングしたCatch Pointをアタッチ。これで範囲に入ったオブジェクトを消します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/6d8622cd-a26c-3762-290a-b68434d47800.png" width="350px">
設定で注意なのがLayerをObjectにしていること。
これでホバーのあたり判定に引っかからないようにしています。設定しないとどこまでも上にいってしまいます
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/58d80e66-6bb1-62af-ea0d-cc1ea55c0c38.png" width="350px">
Ubuntu15.04でNested KVM


# 1.自分のPCでHW仮想化が使えるかを確認する
```
root@Mary:~# egrep '(vmx|svm)' /proc/cpuinfo
```
結果にVMXが入っていればOK

# 2.Nestedにするためにkvmのパラメータを変更
```
root@Mary:~# bash -c 'echo "options kvm-intel nested=1" >/etc/modprobe.d/kvm-intel.conf'
```

# 3. 再起動

# 4.Nestedが可能かを確認する
```
root@Mary:~# cat /sys/module/kvm_intel/parameters/nested 
Y
```

# 5. KVMのインストール
```
onodes@Mary:~$ sudo apt install kvm libvirt-bin
onodes@Mary:~$ sudo apt-get install virt-manager
```
apiサーバーのテスト書くときによく使う型の作り方

テストを書く時によく使う型の生成方法。
たぶんいくつもあるだろうけれど、普段よく使っているもの。

## io.Reader

```go
var reader io.Reader = strings.NewReader("")
```

## io.ReadCloser

```go
r := strings.NewReader("")
var readCloser io.ReadCloser = ioutil.NopCloser(r)
```

## http.ResponseWriter

```go
var w http.ResponseWriter = httptest.NewRecorder()
```

## http.Request

```go
req, err := http.ReadRequest(bufio.NewReader(strings.NewReader("GET / HTTP/1.0\n\n")))
```

# ユースケース

## http.Handler

よくhttpサーバー作るときに見るあれ。

```go:main.go
package main

import "net/http"

func handler(w http.ResponseWriter, r *http.Request) {
  w.WriteHeader(http.StatusOK)
}

func main() {
  http.HandleFunc("/", handler)
  http.ListenAndServe(":8080", nil)
}
```

```go:main_test.test
package main

import (
  "io/ioutil"
  "net/http"
  "net/http/httptest"
  "net/url"
  "strings"
  "testing"
)

func TestHandler(t *testing.T) {
  r := &http.Request{}
  // 必要にあわせて
  // var err error
  // if r.URL, err = url.Parse("http://localhost"); err != nil {
  //   t.Fatal(err)
  // }
  // r.Body = ioutil.NopCloser(strings.NewReader(""))
  w := httptest.NewRecorder()
  handler(w, r)

  if w.Code != http.StatusOK {
    t.Error("200じゃない")
  }
}
```

# その変数や型がinterfaceに対応しているかを確認する

api全然関係ないけれど、よく使うのでこれも。

## 変数

```go
s := strings.NewReader("")
var _ io.Reader = s
var _ io.Reader = "abc" // cannot use "abc" (type string) as type io.Reader in assignment
```

## 型

```go
package main

type E struct{}

func (_ E) Error() string {
	return ""
}

type F struct{}

func main() {
	var _ error = (*E)(nil)
	var _ error = (*F)(nil) // cannot use (*F)(nil) (type *F) as type error in assignment
}
```
さくらVPSでKurentoを動かす

さくらのVPSに、Kurento Media Server (KMS)を導入し、そのサンプルアプリ(Node.js)を動かすまでのメモです。

# 1. Ubuntuインストール
KMSはUbuntu 14.04が必須条件なので、VPSコントロールパネルからカスタムOSインストール機能を利用します。

 * [カスタムOSインストールガイド - Ubuntu 12.04/14.04｜さくらインターネット公式サポートサイト](https://help.sakura.ad.jp/app/answers/detail/a_id/2403)

# 2. Node.jsその他のインストール
今回はnode.js環境でKMSを利用したいので、nodejsおよびnpmをインストールします。悩みたくない人は素直にapt-getでインストールするのがおすすめです。

```
$ sudo apt-get update
$ sudo apt-get install nodejs npm
```
```
$ sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
```

また、サンプルアプリを入れるのにgitおよびbowerが必要になるので、これらもインストールしておきます。

```
$ sudo apt-get install git
```
```
$ sudo npm install -g bower
```

 * [Ubuntu 14.04 に Node.jsをインストールする - Qiita](http://qiita.com/moris/items/281a588b9773357b27f7)
 * [Linux - Ubuntu でapt を使用してNode.js をインストールする3 つの方法(Ubuntu 15.04, Ubuntu 14.04.2 LTS) - Qiita](http://qiita.com/TsutomuNakamura/items/7a8362efefde6bc3c68b)

# 3. Kurento Media Serverのインストール
公式マニュアルの通りに入力するだけです。インストールが終わったら、サービスを立ち上げます。

```
echo "deb http://ubuntu.kurento.org trusty kms6" | sudo tee /etc/apt/sources.list.d/kurento.list
wget -O - http://ubuntu.kurento.org/kurento.gpg.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install kurento-media-server-6.0
```
```
sudo service kurento-media-server-6.0 start
```

 * [Kurento Media Server Installation &mdash; Kurento 6.0.1 documentation](http://www.kurento.org/docs/current/installation_guide.html)

# 4. Node.jsサンプルアプリのインストール
git cloneして、npm installするだけです。
初回のみbower installも自動実行されるはずですが、なぜか私の環境ではコケていたので手動で打ち直しました。

```
git clone https://github.com/Kurento/kurento-tutorial-node.git
cd kurento-tutorial-node/kurento-hello-world
npm install
```
```
cd static
bower install
```

# 5. Node.jsサンプルアプリの実行
npm startする前に、server.jsの27, 28行目にあるアドレスを書き換えておきます。
たとえばサーバーのアドレスが192.168.100.1だった場合は以下になります。

```server.js
as_uri: 'http://192.168.100.1:8080/',
ws_uri: 'ws://192.168.100.1:8888/kurento'
```

また、ポート8080および8888を忘れずに開放しておきます。通すのはtcpのみで大丈夫なはずです。
用意ができたらnpm startします。

```
npm start
```

chromeまたはfirefoxから http://192.168.100.1:8080/ にアクセスします（アドレスは例）。
緑のStartボタンを押して、Webカメラの認証後に両方のstream映像が表示されたら成功です。

![kurento-screenshot.jpg](https://qiita-image-store.s3.amazonaws.com/0/60718/b9e9d0f1-f320-c790-9441-1521a9138e67.jpeg)
[Swift]省略記法で$0.0と$0.1を使う例


# enumerate().forEach
enumerate().forEachを使うと、省略記法で$0.0と$0.1を使う場合がある。初見だと最初戸惑ったのでメモ。

```swift
let array = ["カレー","ラーメン","ハンバーグ"]

array.enumerate().forEach { (index, element) in
    print("index:\(index) element:\(element)")
}

//省略記法
array.enumerate().forEach {
    print("index:\($0.0) element:\($0.1)")
}
```

出力結果

```swift
index:0 element:カレー
index:1 element:ラーメン
index:2 element:ハンバーグ
```
Arduino のライブラリを作って再利用しやすい形で公開する


そういえば作ったこと無かったということで、手元にあった温度・湿度センサーの [HDC1000](http://akizukidenshi.com/catalog/g/gM-08775/) の Arduino 向けライブラリを作って公開してみた。

- https://github.com/hotchpotch/Arduino-HDC1000

他の人も作ってるので車輪の再発明ぽいけど手順を身につけておきたかった & [PlatformIO](http://platformio.org) に登録して使いたかったので…。

![20151004-DSC04489.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/e33dd5ab-42db-b3af-068d-1c5ed405a6b6.jpeg "20151004-DSC04489.jpg")


## Arduino のライブラリを作るには

[Writing a Library for Arduino](https://www.arduino.cc/en/Hacking/LibraryTutorial) に書いてあるためあんまり言うことが無い…。

ディレクトリ構成はトップ階層に .h のヘッダファイルと cpp(or c) ファイルを、examples 以下に Arduino のスケッチがあることが多いみたい。今回作ったらこんな構成になった。

```
.
├── HDC1000.cpp
├── HDC1000.h
├── LICENSE.txt
├── README.md
├── examples
│   └── hdc1000.ino
├── library.json // PlartformIO 登録用の情報
└── platformio.ini // この階層で platformio run できるため
```

## zip でくれ

Arduino IDE には zip ファイルをライブラリとして追加できる機能があるので、README.md から適当に github の zip へのリンクを張っておく。github 便利。

## PlatformIO に登録する

やっぱり PlatformIO から使いたいよね〜、というわけで library.json を作って

```bash
$ platformio lib register https://raw.githubusercontent.com/hotchpotch/Arduino-HDC1000/master/library.json
```

して申請しておく。数時間〜数日で platform.io のほうにも反映される。library.json のフォーマットについては [オフィシャルのドキュメントにまとまってる](http://platformio.readthedocs.org/en/latest/librarymanager/config.html)。

なお PlatformIO については

- [コマンドラインでArduino開発 : vim + platformio](http://qiita.com/caad1229/items/7b5fb47f034ae6e0baf2)
- [PlatformIO でライブラリを使う & 普通のライブラリを直接使う](http://qiita.com/hotchpotch/items/4777979835cf04453e2e)

あたりをどうぞ。
連想配列の中身が空かどうかを確認する。wondaの備忘録

フォームのエラー判定で何か問題あれば
$err[ ]にメッセージをつめていくプログラムの場合
連想配列の中身がすっかり空なのか（この場合次のページへいく流れ）
どうかの判定には少し工夫が必要。

初心者用に実験結果と解決法を残しておきます。



\$var =[ ];//$varを配列に初期化

Aパターン
\$var{'a']="blue";
\$var['b']=" ";
$var['c']="red";

Bパターン
\$var['a']=" ";
\$var['b']=" ";
\$var['c']=" ";


いろいろ実験してみます。
・実験1
print_r ($var);
結果
Aパターン
Array ( [a] => blue [b] => [c] => red )

Bパターン
Array ( [a] => [b] => [c] => )




・実験2
if(empty ($var['a'])){
print '空です';
}else{
print '入ってます';}

Aパターンのみ
結果
入ってます

・実験3
if(empty ($var['b'])){
print '空です';
}else{
print '入ってます';}

Aパターンのみ
結果
空です


・実験4
if(empty ($var)){
print '空です';
}else{
print '入ってます';}

Aパターン
結果
入ってます

Bパターン
結果
入ってます

※Bパターンでは配列の中身は空なのにemptyではないと判定されてしまう。（issetでは中身があると判断される）
これは$varという箱の中に、もっと小さな箱a,b,cが入っていますよ、という反応。
これでは配列の中身が空かどうか調べられない。

emptyとは箱の中になにも入ってない状態なので
配列もセットされていてはならない。
ならば連想配列が空の場合、一端それ自体削除してから判定すればよい。
空の連想配列を削除する関数はarray_filter
今回でいうとAパターンの$var['b']なんかはこの関数で
取り除いてくれる

・実験5
print (array_filter($var);
結果　Aパターン
Notice: Array to string conversion in ~
おう？ああ、そうだ。print には配列を渡してはいけないだった。
配列の中身を表示する関数はprint_r

・実験6
print_r (array_filter($var));

結果
Aパターン
Array ( [a] => blue [c] => red )
Bパターン
Array ( ) 

うむ、うまくいきました。

ということで
連想配列の中身が空かどうかを確認するためのプログラムは
こちら

:bulb: ・実験7
\$judge = array_filter(\$var);
//一番肝心なところでバグがおきてますね。ジャッジと名づけた箱にアレイフィルターを通した配列を入れてます。
if(empty($judge)){
print '空だよ';
}else{
print '安心してください。入ってます。';}


![array.jpg](https://qiita-image-store.s3.amazonaws.com/0/87543/5a1cde98-a9a6-4976-2938-367bdda43482.jpeg)


結果　
Aパターン
安心してください。入ってます。

Bパターン
空だよ

以上、覚書として残しておきます。


追記
～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～
コメントでご指摘いただいて修正です。

エラーがある場合配列にエラーメッセージを格納する。
エラーがある場合、再びフォームに戻す、のような場合
これだけで十分でした。
![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/87543/8383cf7f-e552-bcac-b077-67f6c31740a8.jpeg)

{ }の中は例です。
エラーがなかった場合のプログラムを書きます。

いや～、非常に簡潔です。
vpnへSoftEther VPNをインストール

#環境
Debian8

#手順

##Server side
ダウンロードから
コンポーネントを選択
SoftEther VPN Serverを選択

プラットフォームを選択
Linux

CPUを選択
Intel x64 / AMD64(64bit)
※cpu情報は `cat /proc/cpuinfo`で調べられます。

選択すると下にリンクが出てきます。(こんなの)
![スクリーンショット 2015-10-04 5.27.39.png](https://qiita-image-store.s3.amazonaws.com/0/82224/2d30a120-bf9c-009a-0697-813d073494e5.png "スクリーンショット 2015-10-04 5.27.39.png")

```
$curl -O "リンク"
$tar zxvf softether-vpnserver-v4.19-9578-beta-2015.09.15-linux-x64-64bit.tar.gz
$cd vpnserver
$ls 
Authors.txt  code  hamcore.se2  lib  Makefile  ReadMeFirst_Important_Notices_cn.txt  ReadMeFirst_Important_Notices_en.txt  ReadMeFirst_Important_Notices_ja.txt  ReadMeFirst_License.txt

$make
```
```
--------------------------------------------------------------------

SoftEther VPN Server (Ver 4.19, Build 9578, Intel x64 / AMD64) for Linux Install Utility
Copyright (c) SoftEther Project at University of Tsukuba, Japan. All Rights Reserved.

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


Do you want to read the License Agreement for this software ?

 1. Yes
 2. No

Please choose one of above number: 1

--中略--

Did you read and understand the License Agreement ?
(If you couldn't read above text, Please read 'ReadMeFirst_License.txt'
 file with any text editor.)

 1. Yes
 2. No

Please choose one of above number: 1

Did you agree the License Agreement ?

1. Agree
2. Do Not Agree

Please choose one of above number: 1
```
ライセンスとか合意とか聞かれるので、必要な所は読んで先へ進みます。

```
$ls
Authors.txt  code         lang.config  Makefile                              ReadMeFirst_Important_Notices_en.txt  ReadMeFirst_License.txt  vpnserver
chain_certs  hamcore.se2  lib          ReadMeFirst_Important_Notices_cn.txt  ReadMeFirst_Important_Notices_ja.txt  vpncmd
```

無事makeできてvpnserverができてますね。
`$sudo ./vpnserver start`
起動します。


##windows side(サーバー管理)
※sever側(CUI)で調整する場合は飛ばしてください。  

server管理用のwindowsアプリケーションをDLしてきます。
serverをDLしてきた所のコンポーネントで
`SoftEther VPN Server Manager for windows`を選択してDLしてきます。
解凍化かインストールしてvpnsmgr立ち上げます。
![スクリーンショット 2015-10-04 5.59.08.png](https://qiita-image-store.s3.amazonaws.com/0/82224/36fa3f02-4cb7-be4c-a5bc-51f432d59dce.png "スクリーンショット 2015-10-04 5.59.08.png")

```
1.新しい接続設定を選択
2.接続設定名とホスト名、port番号を入力
3.OK
4.接続
5.接続方式等の設定
6.アカウント作成
```

##windows client
コンポーネントでSoftEther VPN ClientをDL

```
仮想Lanカードを作成
1.新しい接続設定の作成
2.serverで設定管理と同様に、ホスト名・port番号をいれて、先ほどの設定で作ったHUB名もいれる。
3.認証はserverで設定した方式を選択
4.OK
```



##参考
[Ubuntu Server / SoftEther VPN サーバーの構築 (その2)](http://tomorrow.meyon.gonna.jp/?eid=1005110)
rails consoleのSQLログの表示を無効にする方法


開発中に実行したSQLのログが邪魔になるときがあり、非表示にする方法を探してみた。

loggerを変更すれば実現できる。

```
old_logger = ActiveRecord::Base.logger
begin
    ActiveRecord::Base.logger = nil
	# 処理
ensure
    ActiveRecord::Base.logger = old_logger
end
```

ファイルに出力したい場合はLoggerインスタンスを指定

```
ActiveRecord::Base.logger = Logger.new('log/sql.log')
```
ニフティクラウド mobile backendのpythonモジュールを使って見る


## ncmbのpythonモジュールがあるらしい・・・

先日のハッカソンでこの話しを聞き、早速使ってみようと思った次第
詳しくはいかにある・・・
http://petitviolet.hatenablog.com/entry/20141011/1413037537

## pipインストール

前に[やったことがある方法](http://xhatenen.hatenablog.com/entry/2014/12/14/232824)で下記のコマンドを打ってみたがうまくいかず

```
curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python
```

結局[このサイト](http://make.bcde.jp/category/34/)に載っている

```
$sudo apt-get install python-pip
```

でpipインストールを行える状態にした。

しかし、バージョンの問題でインストールできない・・・
そもそもラズパイのPythonバージョンをあげる

## ラズパイのバージョンを2.7.7にアップデート

アップデートは[この記事](http://sowingseasons.com/blog/building-python-2-7-10-on-raspberry-pi-2.html)を参考に行った

以下のコマンド群を入力することでバージョンアップを図った

```
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install build-essential libncursesw5-dev libgdbm-dev libc6-dev 
sudo apt-get install zlib1g-dev libsqlite3-dev tk-dev
sudo apt-get install libssl-dev openssl
```

```
cd ~
wget https://www.python.org/ftp/python/2.7.7/Python-2.7.7.tgz
tar -zxvf Python-2.7.7.tgz
cd Python-2.7.7
./configure
make -j 4
sudo make install
```

アップデート後は再起動

```
sudo reboot
```

再起動後はバージョンを確認

```
python -V
```

と打つと

```
Python 2.7.7
```

とでて正しくインストールできていることがわかる

## pipの再度インストール

```
wget https://bootstrap.pypa.io/get-pip.py
sudo python2 get-pip.py
```

これでpipの準備を行える

## ncmbのpythonモジュールのインストールと準備

```
sudo pip install py_nifty_cloud
```

また、初期化（シグネチャ生成）のための準備。このモジュールはyamlファイルアプリケーションキー、クライアントキーを読み込むようになっているらしいのでそれを準備する。
下記のような形で・・・

```yaml:nifty_cloud.yml
APPLICATION_KEY: 'your application key'
CLIENT_KEY: 'your client key'
```

## データベースに書き込みを行う

データベースへの書き込みのコードは下記のように書く

```python:ncmb_post.py
#import
from py_nifty_cloud.nifty_cloud_request import NiftyCloudRequest

# instanciate with yaml file contains APPLICATION KEY and CLIENT KEY
ncr = NiftyCloudRequest('./nifty_cloud.yml')
path = '/classes/TestClass'
method = 'POST'

# post a new recode
values = {'key': 'test'}
response = ncr.post(path=path, query=values)
print(response.status_code)
```

実行すると下図のようになる
![スクリーンショット 2015-10-04 21.21.39.png](https://qiita-image-store.s3.amazonaws.com/0/55227/c5a3f131-c51c-8e0d-7e1a-c05e8d46943e.png "スクリーンショット 2015-10-04 21.21.39.png")

また、コマンドの画面で下記のような警告が出る

```
InsecurePlatformWarning
```

どうしてもでてしまうものらしい・・・

## データベースから値を引き出す

同様に引き出すコードは下記

```python:ncmb_get.py
#import
from py_nifty_cloud.nifty_cloud_request import NiftyCloudRequest

# instanciate with yaml file contains APPLICATION KEY and CLIENT KEY
ncr = NiftyCloudRequest('./nifty_cloud.yml')
path = '/classes/TestClass'
query = {'where' : {'key': 'test'}}
method = 'GET'

# standard way to request
# get recodes which matches a query from path, with GET or POST or PUT http method
response = ncr.request(path=path, query=query, method=method)
type(response)
# >>> requests.models.Response

# show status code
print(response.status_code)
# show response as json format
print(response.json())
```

結果は以下

```
200
{u'results': [{u'key': u'test', u'createDate': u'2015-10-04T12:17:49.729Z', u'updateDate': u'2015-10-04T12:17:49.730Z', u'objectId': u'mVgYUeowLXFuEQ0R', u'acl': {u'*': {u'read': True, u'write': True}}}]}
```
NokogiriでDOM要素の深さを知る方法

Nokogiriにはノードの深さを知るメソッドがない
------

需要がないのかもしれませんが、DOMツリー上でのあるノードの根ノード(HTMLなら`<html>`あるいは`<body>`要素)からの深さを調べたいと思いました。
[Nokogiriのドキュメント](http://www.rubydoc.info/github/sparklemotion/nokogiri)を探しましたが、よしなにやってくれそうな関数が見つかりませんでした。

従って独自にメソッドを作ってみました。

```ruby
# HTMLドキュメントを読み込む
html = <<EOS
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <p></p>
  <p>
    <div>
      <span id="hello">hello</span>
    </div>
  </p>
  <p></p>
</body>
</html>
EOS

# id="hello"のノードの深さを知る場合
node = Nokogiri::HTML(html).css("#hello")[0]
parent = node.parent
depth = 1

while parent && parent.name != "body" # bodyを根ノードにする
  parent = parent.parent
  depth += 1
end
puts depth
```

要領としては、ひたすら親をたどっていき、親が特定のノードにマッチしたら終了させます。

単純すぎる解決方法ですが自分用にメモ。
複数の mp3 ファイルを 1つに結合する

今回は、特定のディレクトリ以下の mp3 ファイルを１つの mp3 ファイルに連結します。

```
$ cat ./*.mp3 > output.mp3
```

```
$ mp3wrap output.mp3 ./*.mp3
```

```
$ ffmpeg -f concat -i <( for f in *.mp3; do echo "file '$(pwd)/$f'"; done ) output.mp3
```

## REF

> 
- Mp3Wrap Project Homepage : http://mp3wrap.sourceforge.net/
- FFmpeg : https://www.ffmpeg.org/
H2Oをcmake出来ない

どこのバージョンからなのかの検証は行っていませんが、`cmake`を行うタイミングでエラーが発生するようになりました。

エラー内容は下記の通り。

```
CMake Error at CMakeLists.txt:21 (CMAKE_MINIMUM_REQUIRED):
  CMake 2.8.12 or higher is required.  You are running version 2.8.11
```

`yum`でインストールすると、2.8.11でインストールされるようなので、バージョンが足りなくなってしまった様です。

ということで、`yum`ではなくてソースからコンパイルすればOKです。

その辺りの流れは[コチラの投稿を参考](http://qiita.com/nobu_blast/items/dfe92a7c14136d1dafe9#3-2)にさせて頂きました。

```
# cd /usr/local/src/
# wget http://www.cmake.org/files/v2.8/cmake-2.8.12.tar.gz
# tar xvfz cmake-2.8.12.tar.gz
#  cd cmake-2.8.12
# ./configure
# make
# make install
```

[Let's Enjoy H2O Life!](https://github.com/h2o/h2o)
Unityについて紹介メモ


「それUnityでよくない？」的な話が多いので紹介メモ。
# 主観
iPhone/Android のクロスプラットフォーム対応を考えると、最近は以下でいいんじゃないかと思っている。
~~それ以外を学ぶ余裕があるのなら、積読の一冊でも消化したほうがよい。~~

- Unity - 高いインタラクティブ表現が必要とされるもの
- Monaca - Unityほどのインタラクティブ表現が必要ないもの
- 要件によっては、Swift(Objective-C)、Javaなどのネイティブで作成

# ゲームエンジン（或いはインタラクティブなフレームワーク）
あって当たり前のものは当たり前にある。

- フレーム単位処理
- 衝突判定
- 落下や衝突などの2D/3D物理演算
- アニメーション
- 2Dスプライト
- 3Dでのカメラ視点や光源
- 3Dオブジェクトへのレンダリング

あと、パーシャル、マルチプレーヤー、経路探索、VRとか諸々。
# カジュアルな2Dゲーム
Unityというと、ハイエンドな3Dゲーム用開発キットというイメージが大きいが、カジュアルな2Dゲームも普通に作れる。そもそも新規作成時に3Dか2Dを選択する。
実際には「オブジェクトをZ座標0に配置」「カメラ視点をZ軸に対し固定」なので、純粋な2Dというわけでないが、開発上あまり問題にならない。

# AssetStore
Unityの魅力の半分は「AssetStoreの充実度」。
2D/3Dオブジェクト、音源、背景、アニメーション、スクリプト、開発ツールなどが膨大にあり、無料／有料で入手できる。

# Personal版、Professional版
Presonal版(無料)とProfessional(有料、18万ぐらい）があるが、ゲームエンジンとしての機能差は実は殆どない。
**「収益による制限」「スプラッシュスクリーンの変更」**等には注意する必要がある。

# mBaaSとの連携
Parseや Nifty Cloudのmobile backendはUnity用SDKを出している。デファクトであることの強み。

# 開発
Unityの開発作業はGUI上での調整が多い。元々、コード主体のIDEでの開発が多いと、違和感があるかもしれない（が、慣れればどうってことはない）。

## ざっくりな実装の流れ
- １つのプロジェクトは複数のシーン(メニュー画面、メイン画面など）を持つ。
- シーンにオブジェクト(GameObjet)を配置し、見た目（大きさとか向きとか）や衝突範囲を調整する。
- ある程度、調整が済んだら、prefab化し、再生成可能にする。自機や固定障害物など複製されないオブジェクトなら、prefab化しなくてもよいかもしれない。
- オブジェクトにコンポーネントやビヘイビアスクリプトをくっつける（アタッチ）。
- グローバルな処理がしたいのであれば、シーンにそれ専用のオブジェクトを作成する(GameController的なやつ)。

## ビヘイビアスクリプト
パラメータはGUIから設定するが、ロジックはビヘイビアスクリプトに記述する。
言語はC#。JavaScriptも使えるけど、サンプルの入手容易性を考えると、C#に寄せたほうが良い。

```csharp:Enemy.cs
using UnityEngine;
using System.Collections;

public class Enemy : MonoBehaviour {

	// publicパラメータはGUIから上書きが可能
	public int point = 10;

	// 初期化時処理
	void Start () {
	}
	
	// フレーム毎処理
	void Update () {
	}

	// colliderコンポーネントをアタッチした場合、衝突時呼び出される。
    // 通常、イベントは自動で紐付けられるが、UIの場合、手動で行うこともある
	void OnTriggerEnter(Collider collider) {
	}
}

```
## コルーチン
コルーチンを利用することにより、フレーム単位処理が容易になる。

```csharp
void Start() {
  StartCoroutine("Wave");
}

IEnumerator Wave(){
  while(true){
    FirstAction();
    // 1フレーム待機後再開
    yield return null;
    SecondAction();
    // 20秒後再開
    yield return new WaitForSeconds(10);
  }
}
```

# 管理画面
標準のUIコンポーネントやwebviewプラグインもあるにはある。
が、データの一覧とか入力フォームとかそういった管理画面っぽいものを作りたいなら、HTMLのほうが楽。
Raspberry Pi + Piano Hatで宴会を盛り上げよう！

Piano Hatで遊んでみました。
Piano Hatは、[Audafruit](https://www.adafruit.com/product/2695)から買えます。
商品ページからリンクされている[Github](https://github.com/pimoroni/piano-hat)のDocumentがありますが、これはその補足です。
PianoHat触る際にご参考にしていただければと思います。
***
**必要なもの：**
- PianoHAT
- スピーカー　（Piano HATにはスピーカーはついてません）
- Raspberry Pi 　(販売元曰く、2の方がお勧めだそうです）
Piano Hatはこんな風にRaspberry Piにかぶせます。
![KIMG0775s.jpg](https://qiita-image-store.s3.amazonaws.com/0/5848/ba725a70-4c28-8b36-ca66-76af92947b1a.jpeg)


私の持っているUSBスピーカーは、ALTECのBXR1220というものです。
USBは電力供給のみに使い、ヘッドホンジャックから音を取ります。
設定を変えずにできました。

が、もしできなかったら　[オフィシャルのオーディオ設定にあるように](https://www.raspberrypi.org/documentation/configuration/audio-config.md)
raspi-config　の　Advanced Options-Audioでは　Autoもしくは　Analog　1を選び、
Outputを
`amixer cset numid=3 1　`
では　1　のHeadphone Jackを選びます。（HDMI出力なら2、デフォルトが0）

Piano Hat導入には、[Github](https://github.com/pimoroni/piano-hat)に書かれているようにまず、
`$ curl -sSL get.pimoroni.com/pianohat | bash`

>This script will install Piano HAT libraries
>and dependencies for both Python 2 and 3.
>This process may take several minutes.　
>Do you wish to continue? [y/N]　

と聞かれるので、y入力、次に

>Piano HAT requires I2C, enable now? [y/N] 

と聞かれるのでyと入力

ちょっと待ちます。
インストールがすべて成功していたら、python-smbus、cap1xxx、Piano-HATといったほかの必要なものも落ちてくるはずです。
もしどこかに失敗メッセージが出たら、[こちらのページに各々の落とし方あります]
(http://sandyjmacdonald.github.io/2015/08/10/piano-hat/)
このあたりですね。

`sudo apt-get install python-smbus
git clone https://github.com/pimoroni/cap1xxx.git
cd cap1xxx && sudo python setup.py install
git clone https://github.com/pimoroni/Piano-HAT.git
cd Piano-HAT && sudo python setup.py install`

試しにPimoroni/pianohatにあるbutton.pyを実行してみます。
`~/Pimoroni/pianohat $ sudo python buttons.py`
とやって、鍵盤を触ると、LEDが光るようになります。
Ctrl+Cで終了します。

せっかくなので音も出してみましょう。
`sudo python simple-piano.py`
で、音が出ます。

あらら、**Cを叩いてAが鳴ります**ね。
ちょっと気持ち悪いので、多少乱暴ですが、simple-piano.pyの中の、
`def handle_note (channel, pressed):` 
の中の
`channel = channel + (12*octave)`
をこう直しました。　
`channel = channel + (12*octave) +3`

オクターブも使えるので、いろいろ弾けます。
これからの時期増えるパーティや忘年会、かくし芸大会にいかがでしょう？
[![Youtube Pimoroni PianoHat](https://qiita-image-store.s3.amazonaws.com/0/5848/03dca38b-d057-361c-fa56-f37159bfa275.jpeg)](https://www.youtube.com/watch?v=UDJs5d16crI)

***

*TODO：*
Yoshimiと連携して、もっとMidiで遊びたいと思います。
どうやらYoshimiはともかく、JackdはGUIがあった方が設定しやすいようです。
しかし、[上記に記したPimoroniのSupportページのように](http://forums.pimoroni.com/t/piano-hat-cannot-get-yoshimi-synth-to-work/903/6)

`jackd -dalsa -n4 -r44100 -p512 &
yoshimi -K -a &
cd examples
sudo python ~/Pimoroni/pianohat/midi-piano.py`

とやったところで、
`ImportError: No module named sequencer`
とエラーが出てしまいました。
OSXやWindowsでは[似たようなissueが出ているようです](https://github.com/vishnubob/python-midi/issues/16])。
しかし動いている人もいるので、どこか私が見落としてのだと思います。

それはまた後日。
raspberry Piにnode.jsをいれてみる。

自分用のメモ

## nodebrewのインストール
```
curl -L git.io/nodebrew | perl - setup
```

## bashrcへの設定
```
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bashrc
source .bashrc 
```

## node.jsのインストール
### 使えるバージョンの確認
```
nodebrew ls-all
````

v4.1.1 


v0.XX.XXが最新だと思っていたが、
[こちら](https://nodejs.org/en/download/)をみると上記のバージョン最新だった（投稿日付時点）

そのままインストール。

```
nodebrew install-binary v4.1.1 
```

ARM6lのバイナリを取得してインストール
ARM版がfetchされる。

```
fetch: http://nodejs.org/dist/v4.1.1/node-v4.1.1-linux-armv6l.tar.gz
######################################################################## 100.0%
```

v4.1.1を設定

```
nodebrew use v4.1.1
```

動作確認

```
pi@raspberrypi ~ $ npm -v
2.14.4
```

完了
RxJSで始めるRx(Reactive Extensions)入門2

前回([RxJSで始めるRx(Reactive Extensions)入門1 - Qiita](http://qiita.com/erukiti/items/6a82dfd3506e9773d592))はRxJSの基本部分の説明をしたので、今回はすこし応用的なところに行きましょう。

## stream生成

RxJSでは様々なオペレータを駆使してstreamを加工することで目的を達成するのですが、現存するライブラリのほとんどでは残念ながらRxのstreamは提供されていないので、ライブラリをstreamに変換するアダプターが必要となります。また自分でライブラリを書く場合にも必要になりますね。

### Rx.Observable.create()

今日紹介する方法の一つ目は`create`メソッドです。このメソッドはストリームを生成します。詳しい使い方を見てみましょう。

```js
Rx = require('rx');
fs = require('fs');

observable = Rx.Observable.create(function(obs) {
  fs.readFile("hoge.txt", function(err, text) {
    if (err) {
      obs.onError(err);
      return;
    }
    text.toString().split("\n").forEach(function(line) {
      obs.onNext(line);
    });
    obs.onCompleted();
  });
});

observable.filter(function(line){
  return line.substr(0, 2) != '# ';
}).subscribe(function(line){
  console.log(line);
});
```

このプログラムはhoge.txtのテキストを読み込んで、#とスペースで始まらない行のみを表示するものです。

Rx.Observable.createは引数に関数を取りますが、この関数の中でストリームを制御します。制御するための仕組みはこの関数が受け取る引数`obs`が持っています。

`obs.onNext()`でデータを送ります。今回のプログラムだとnodeの`fs.readFile`メソッドを実行し、コールバック内で読み込んだtextを改行で分解し、一行ずつ`onNext`しています。すべて読み込んだら、次は`obs.onCompleted()`でストリームを終了させます。また、エラーがある場合は`obs.onError()`でエラーを送ることができます。

Rx.Subject

Rxの世界で一般的に使われるのが`Subject`です(たぶん)。`Subject`は上述の`onNext`などのメソッドを使えると同時に`subscribe`することもできます。

```js
Rx = require('rx');
fs = require('fs');

Hoge = function() {
  this.subject = new Rx.Subject();
  this.observable = this.subject.publish();
  this.observable.connect();
}

Hoge.prototype.read = function(filename) {
  self = this
  fs.readFile(filename, function(err, text) {
    if (err) {
      self.subject.onError(err);
      return;
    }
    text.toString().split("\n").forEach(function(line) {
      self.subject.onNext(line);
    });
    self.subject.onCompleted();
  });
}

var hoge = new Hoge();
hoge.observable.filter(function(line){
  return line.substr(0, 2) != '# ';
}).subscribe(function(line){
  console.log(line);
});
hoge.read("hoge.txt");
```

このコードでは`subject`をいったん、`publish()`したものを`observable`としています。このやり方が正しいのかどうかは知らないのですが、インスタンスを利用する側で、`onNext()`ができたりするのはあまりよくないと思って`Subject`としての機能をいったん封印しています。`connect()`は、`publish()`した後は`connect()`しないとストリームが流れてくれないのでしています。Hot/Coldがどうたらとか？(間違ってたら突っ込みください)

`Subject`の利点は`create`とは違って、例えば`subject`を保有するオブジェクトに対するメソッド呼び出しに応じて自由にストリームを操作できる点ですね。

今回はひとまずここまでにしようと思います。
Mac OS X El Capitan(rootless環境)でCocoaPodsインストールする方法

# 概要
Mac OS X El Capitan(rootless環境)では/usr/binに(標準では)ファイルを配置できなくなっているので、バイナリファイル(podコマンド)の配置先にrootless対象外の/usr/local/binを指定する

## 手順
```
$ sudo gem install -n /usr/local/bin cocoapods
```

## 注意
CocoaPodsは/usr/bin以外へのコマンドインストールを推奨していない(?)ようなので自己責任で。

# 参考
* [Can any one install on OS X 10.11]
(https://github.com/CocoaPods/CocoaPods/issues/3680)
* [Command Reference - RubyGems Guide]
(http://guides.rubygems.org/command-reference/#gem-install)
SublimeText3(DevChannel) で Elixirの開発環境を整える (OSX)

Sublimetext3側の問題で少しだけ嵌ったのでメモっとく。

# 入れるプラグイン
- https://packagecontrol.io/packages/Elixir
- https://packagecontrol.io/packages/ElixirSublime
- https://packagecontrol.io/packages/SublimeLinter-contrib-elixirc
- https://packagecontrol.io/packages/Fix%20Mac%20Path

# 設定
## User Prefsに追記するもの
```js
"env":  {
          "PATH": "/usr/local/Cellar/elixir/1.1.0/bin"
        },
```

## .bash_profileに追記するもの
`/usr/local/bin`へのパスを確実に通しておく。

```sh
export $PATH=$PATH:/usr/local/bin
```

# FixMacPathを入れる理由

ElixirSublimeのオートコンプリート機能を正常に使うため。

https://github.com/vishnevskiy/ElixirSublime/issues/9

Sublimetext3ではプラグインの実行がユーザーのシェルではない別のシェルで行われるらしい。そのためPATHを認識することができず、iexが見つからない結果ElixirSublimeのオートコンプリート機能（iexの機能を使って補完しているらしい）が使えない。
MongoDBをcentos6.4にインストール後のエラーの回復方法

vagrant@vagrant-centos65 mongodb_lessons]$ mongo --version
Failed global initialization: BadValue Invalid or no user locale set. Please ensure LANG and/or LC_* environment variables are set correctly.

vagrant@vagrant-centos65 mongodb_lessons]$ export LC_ALL=C

[vagrant@vagrant-centos65 mongodb_lessons]$ mongo --version
MongoDB shell version: 3.0.6
EventTriggerについて

## イベントとは
ボタンコンポーネントにはOn Clickのイベントがデフォルトで付いている。
このような「◯◯されたら」というのをイベントと呼ぶ。

![image](https://qiita-image-store.s3.amazonaws.com/0/93944/431ccd33-1f14-64dc-6f08-e746ea9e8194.png)

このイベントだが、ButtonオブジェクトにはOn Clickイベントしかなく、何かと不便である。
細部にまでこだわったものを作るとなると事足りない。

## EventTrrigerとは
この不便さをなくすために、Unityでは自分でイベントを作ることができる機能が備わっている。
それがイベントトリガーコンポーネントである。
Add ComponetでEvent Triggerを選択。
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/3dd8e879-84ce-4d3e-0e20-628c169e860a.png)
## EventTypeの種類とは

| イベントタイプ | 内容 |
|--------|--------|--------|
|PointerEnter|カーソルが範囲内に入った時|
|PointerExit|カーソルが範囲内から出た時|
|PointerDown|範囲内でボタンを押す(タップ)した時|
|PointerUp|PointerDown後にボタン(指)を放した時|
|PointerClick|PointerDown後に自身の範囲内でボタン(指)を放した時|
|BeginDrag|ドラッグ開始時に発生する|
|Drag|PointerDown後に押しっぱなしのまま移動している時|
|EndDrag|ドラッグ終了時に発生する|
|Drop|他の範囲内でドラッグ状態になったものが範囲内に移動してきた放された時|
|Scroll|カーソル位置が範囲内にある時にマウスホイール動作があった時|
|UpdateSelected|それ自体が選択状態の時、毎フレーム発生する|
|Select|マウス、タッチ操作の時はPointerDownと同様|
|Deselect|範囲外でPointerDown操作があった時|
|Move|カーソルが範囲内にある時に方向キーの入力があった時|
|Submit|選択状態で決定ボタンの入力があった時|
|Cancel|選択状態でキャンセルボタンの入力があった時|

## メモ
上記のトリガー発動時に特定のスクリプトを再生させる。などの処理を行うことで細部にまでこだわった演出が可能である。
Cloud SQLの料金体系におけるPackages Billing PlanとPer Use Billing Planの違い

あくまで2015-10-04時点での話。
引用元へのリンクはなるべく残すので、原文と変わっていないことを必ず確認すること。
Google Cloud SQLそのものについての説明は割愛します。

## 料金プランの概要

[Pricing - Cloud SQL — Google Cloud Platform](https://cloud.google.com/sql/pricing)にまとまっている。
英文だが比較的読みやすいし、日本語で読みたければ以下のページに翻訳された文章が書かれている(ただし価格が常時変動しているので参考程度にすること)。

* [Google Cloud SQLの新規利用の概要 | 無料レンタルサーバ(格安・有料)情報のレンサバ.com](http://rensrv.com/vps-free/cloudsql/cloud-sql/)
* [Road to Happy Engineer: Google Cloud SQLの料金について（和訳）](http://motoy3d.blogspot.jp/2012/05/google-cloud-sql-httpsdevelopers.html)

## Packages Billing Plan(Packages)とPer Use Billing Plan(Per Use)の違い

さて、Cloud SQLの料金体系について一番戸惑ったのがここである。
Packagesの場合、実際にそのDBが使用されているかどうかにかかわらずインスタンスの起動期間に合わせて料金が発生する。
対してPer Useの場合は1時間単位での使用に合わせて料金が発生するようだ。

疑問に思ったのがPer Useプランでの"使用"の概念で、どのような状態にあればそのインスタンスが使用状態だとされるのか。
答えはFAQの方にあり、[FAQ - Cloud SQL — Google Cloud Platform - How is use of my instance calculated?](https://cloud.google.com/sql/faq#how_usage_calculated)によるとこう書かれている。

> By default, your instance is spun up whenever you access it (whether from a SQL prompt, an external application, or from an App Engine application), and remains up for 15 minutes after the completion of the last access. After this time, the instance is shut down. You will not be charged for the time your database is not up.

> 標準では、あなたのインスタンスはあなたがアクセスすると(それがSQLプロンプト、外部アプリケーションまたはAppEngineアプリケーションであるかは問わない)スピンアップし、そして最後のアクセスの完了から15分後まで残り続ける。その後、このインスタンスはシャットダウンされる。あなたはあなたのデータベースがアップしていないこの時間は支払いが発生しない。

というわけで、DBのアクセスごとにUpし、最後のアクセスから15分後にはDown状態へ移行するらしい。

### PackagesとPer Useどちらを選択するべきか

Tier D0で計算すると、Packagesでの一日あたりの料金は$0.36, それに対してPer Useでの1時間あたりの料金は$0.025である。
単純計算

```math
0.36 \div 0.025 = 14.4
```
から一日平均14.4時間以上アクセスが発生するようなDBの使い方の場合、Packagesのほうがお得ということになる。

### サーバーの起動ポリシーについて補足

Cloud SQLインスタンスを作成するときに以下のような起動ポリシーを選べる。
Per Useにもかかわらずここで常時起動を選択してしまうとPackagesより常に高い料金を支払い続けることになるので注意。
![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/30316/2418e3e0-935c-fac8-7c58-fd85b1b6c56d.jpeg)
Oracle R Enterprise Tips

ORE 使用時の備忘録です。
ORE のインストール手順は[こちら](http://qiita.com/ryo0123/items/03b0e794388a34203121)から。

# DB 接続

```
> library(ORE)
> Sys.setenv(TZ = "JST")
> ore.connect(user="ORE", service_name="orcl", host="192.168.56.101", password="ore", port=1521, all=TRUE)
> ore.is.connected()
```

# ORE ユーザのオブジェクト参照

user=ORE で接続したユーザのオブジェクトを参照可能です。

```
> ore.ls()
[1] "EMP" "T1" 
> EMP
   EMPNO  ENAME       JOB  MGR   HIREDATE  SAL COMM DEPTNO
1   7369  SMITH     CLERK 7902 1980-12-17  800   NA     20
2   7499  ALLEN  SALESMAN 7698 1981-02-20 1600  300     30
3   7521   WARD  SALESMAN 7698 1981-02-22 1250  500     30
4   7566  JONES   MANAGER 7839 1981-04-02 2975   NA     20
5   7654 MARTIN  SALESMAN 7698 1981-09-28 1250 1400     30
6   7698  BLAKE   MANAGER 7839 1981-05-01 2850   NA     30
7   7782  CLARK   MANAGER 7839 1981-06-09 2450   NA     10
8   7788  SCOTT   ANALYST 7566 1987-04-19 3000   NA     20
9   7839   KING PRESIDENT   NA 1981-11-17 5000   NA     10
10  7844 TURNER  SALESMAN 7698 1981-09-08 1500    0     30
11  7876  ADAMS     CLERK 7788 1987-05-23 1100   NA     20
12  7900  JAMES     CLERK 7698 1981-12-03  950   NA     30
13  7902   FORD   ANALYST 7566 1981-12-03 3000   NA     20
14  7934 MILLER     CLERK 7782 1982-01-23 1300   NA     10
Warning message:
ORE object has no unique key - using random order 
> T1
[1] COL1
<0 rows> (or 0-length row.names)
Warning message:
ORE object has no unique key - using random order 
>
```

念のため、DB 側で作成されているオブジェクトを確認してみます。

```
SQL> conn ore/ore
Connected.
SQL> show user
USER is "ORE"
SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
EMP                            TABLE
T1                             TABLE

SQL>
```

# 任意のスキーマのオブジェクト参照

一度 sync コマンドで対象のオブジェクトをマッピングしなければいけないようです。

```
> ore.sync(schema="SYS", table="DBA_HIST_ACTIVE_SESS_HISTORY")
> ore.exists(schema="SYS", name="DBA_HIST_ACTIVE_SESS_HISTORY")
[1] TRUE
> ore.get(schema="SYS", name="DBA_HIST_ACTIVE_SESS_HISTORY")
```
Railsのgsubでハマった話


railsの練習にTwitterのクローンアプリを作ってたときの話。結構ハマったので自分用にメモ。

##問題発生

ツイートのリプライになってる部分をリンクに置換する簡単なヘルパーメソッドを定義しました。

```ruby:application_helper.rb
def ids_to_link(text)
  text.gsub(/@([a-z0-9_]{1,15})\b/) do |word|
    link_to word, user_path($1)
  end
end
```

覚えたてのRubyでこんなコードを書きました。正規表現の該当部分を`link_to`で置換するだけの簡単なコード。私は意気揚々とブラウザのリロードボタンを押しました。しかし、、、

![スクリーンショット 2015-09-27 14.59.23.png](https://qiita-image-store.s3.amazonaws.com/0/68584/e1e82b44-5a7f-b2f2-1134-001e81b35e6a.png "スクリーンショット 2015-09-27 14.59.23.png")

###動かない・・・ッ！！！

`gsub`の使い方は正しいはずなのになぜか`$1`が空っぽで困り果てました。

##原因

このメソッドを適用する直前で`h()`を呼んでいたので、文字列が`String`ではなく`SafeBuffer`になっていたことが原因でした。どうやら`String`と`SafeBuffer`では`gsub`の挙動が違うようです。
私はこの時`SafeBuffer`というものの存在を初めて知りました。erbでエスケープするものとしないものを区別するためにあるようです。

##解決

`gsub`を呼ぶ前に`to_str`を呼ぶとちゃんと動きました。

```ruby:application_helper.rb
def ids_to_link(text)
  text.to_str.gsub(/@([a-z0-9_]{1,15})\b/) do |word|
    link_to word, user_path($1)
  end
end
```

ちなみにこの時、`to_s`だとダメでした。何が違うんだろ、、、

##まとめ

なんで`gsub`だけ`String`と仕様違うんですかね。
PHP Turned off ShortOpenTag on OS X El Capitan


PHP on OS X El Capitan upgraded to 5.5.20 for Apache2 and 5.4.2 for CLI.

> PHP Version 5.5.20
php-osx.liip.ch by Liip (originally developed by www.local.ch)

And

>PHP 5.4.42 (cli) (built: Jun 12 2015 07:59:53) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies

Then, the short open tag parameter had been set to `off`. 

	short_open_tag = Off
	
So any one had placed `<? /*...*/ ?>` in php file should have been trapped. Such as

	PHP Parse error:  syntax error, unexpected end of file in [ANY PHP FILE]

Well, that's hint.
プログラミングのフラグについて。


俺、この戦いが終わったら、あの子と結婚するんだ。。 <= 死亡フラグが立った。。。。



```
フラグ
意味「BOOL値を保持する変数、もしくは箱」
ブーリアン型 … 真/偽, YES/No, 1/0, など「どちらか」という型（容量最小）

説明1
bool値のtrueとfalseがスイッチのオン・オフのような役割を主に行うプログラムの事


説明2
条件が合っていれば真(True)、否であれば偽(False)である。

真の場合を「フラグが立っている」
偽の場合を「フラグが落ちている」
真にすることを「フラグを立てる」
偽にすることを「フラグを倒す」

```



```

一般的なフラグに関して

フラグとは、真か偽、どちらかの値を入れておく変数（箱みたいなもの）のことです。これが、現在ではまわりまわって以下のような意味で使われることが多いですよね。

フラグ（Flag）とは旗を示す英単語であるが、ここで扱うフラグは小説・ドラマ・漫画・アニメ・シミュレーションゲーム等のストーリーにおいて、後に特定の展開・状況を引き出す事柄を指す用語である。伏線と同義であるものの、フラグは比較的単純で定型化された「お決まりのパターン」の含意があるとされる。
```

参考URL
http://ateitexe.com/commentary-on-flag/


C言語におけるbool値に関して

```
if文では 0 以外のとき真とあつかわれ、BOOLの真は1であることを保証しません。
int a = 0;
if ( 100 ) {
    a++; // C言語では、ここの処理に入ります
}
また、
BOOLに対してはTRUE, FALSE
boolに対してはtrue, false
※ 処理系によっては未定義
と対応させ、True、FalseはC言語では見かけず、容量最小ではありません。
Amazon RedShiftにMacのSQL WorkBench Jから接続する方法

備忘録

# 作業手順
## MacにJavaをインストール
- 次のページからJavaインストーラーをダウンロードしてインストール 
 - [無料Javaソフトウェアをダウンロード](https://www.java.com/ja/download/)

## RedShiftのJDBCドライバーをインストール
- [JDBC 接続を設定する - Amazon Redshift](http://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/configure-jdbc-connection.html)
 - JDBCドライバーをダウンロードして適当な場所に保存しておく

## SQL Workbench/Jのダウンロードと起動
- [SQL WorkBench/Jのダウンロードページ](http://www.sql-workbench.net/downloads.html)にアクセス
- [Mac用のバイナリ](http://www.sql-workbench.net/Workbench-Build118-MacJava7.tgz)をダウンロードして解凍
- セキュリティでブロックされた場合は次の手順で許可を与える
  - 「システム環境設定」の「セキュリティとプライバシー」を開く
  - 「一般」タブの「ダウンロードしたアプリケーションの実行許可」の「そのまま開く」をクリック

## SQL Workbench/Jの設定
- [SQL Workbench/J を使用するクラスターに接続する - Amazon Redshift](http://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/connecting-using-workbench.html)に沿って設定を行う。
- 下記が注意点
  - 上記でインストールしたJDBCドライバ（jarファイル）をコネクタとして登録しておく
  - jdbcのURLの末尾に次を追加
     - ?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory
rails 4, bootstrap 3で navbarがmobileでresponsiveにならないのを解決する。

#railsでbootstrapを使う

1. [getbootstrap.com]() からbootstrap.min.cssとbootstrap.min.jsをダウンロードして、それぞれvendor/assets/stylesheetsと vendor/assets/javascriptsに入れる

2. app/assets/javascripts/application.jsに以下を追加

```rb
//= require bootstrap.min
```
3. app/assets/stylesheets/application.cssに以下を追加

```rb
*= require bootstrap.min
```

これで、基本的にbootstrapが使えるようになったはず。

#navbarを入れる

app/views/layouts/application.html.hamlのbodyに(または、templateに分けた部分に)以下を書く


```rb
%nav.navbar.navbar-default
  .container-fluid
    / Brand and toggle get grouped for better mobile display
    .navbar-header
      %button.navbar-toggle.collapsed{"aria-expanded" => "false", "data-target" => ".navbar-collapse", "data-toggle" => "collapse", :type => "button"}
        %span.sr-only Toggle navigation
        %span.icon-bar
        %span.icon-bar
        %span.icon-bar
      = link_to "App Name", '#', class: "navbar-brand"
    / Collect the nav links, forms, and other content for toggling
    .collapse.navbar-collapse
      %ul.nav.navbar-nav
        %li= link_to 'Link', '#'
        %li.dropdown
          %a.dropdown-toggle{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", :href => "#", :role => "button"}
            Dropdown
            %span.caret
          %ul.dropdown-menu
            %li= link_to 'About', '#'              
            %li= link_to 'Another action', '#'
            %li= link_to 'Something else here', '#'
```

これで、PCのブラウザではresponsiveが動く。幅を小さくすると、dropdownボタンになる。

しかし、mobileでは、responsiveにならない。


#mobile版のresponsiveを直す。

app/views/layouts/application.html.hamlに以下を%headの中に追加

```rb
%meta{name: "viewport", content: "width=device-width, initial-scale=1.0" }
```
これで、思い通りに動くようになった。


参考ページ

http://stackoverflow.com/questions/20020603/bootstrap-3-navbar-wont-collapse-on-mobile-browsers-but-will-in-undersized-deskt
Mongodb への外部接続を許可する

# 環境
CentOS6.6

(参考)Ansible での Mongodb インストール
https://github.com/Chanmoro/ansible-sample/tree/master/roles/mongod

# ローカル外からの接続
デフォルトのまま利用すると以下のようなエラーになり mongodb へのリモート接続ができません

```bash:
$ mongo 192.168.56.101
MongoDB shell version: 3.0.2
connecting to: 192.168.56.101/test
2015-10-04T12:06:20.651+0530 W NETWORK  Failed to connect to 192.168.56.101:27017, reason: errno:61 Connection refused
2015-10-04T12:06:20.653+0530 E QUERY    Error: couldn't connect to server 192.168.56.101:27017 (192.168.56.101), connection attempt failed
    at connect (src/mongo/shell/mongo.js:181:14)
    at (connect):1:6 at src/mongo/shell/mongo.js:181
exception: connect failed
```


# リモート接続を許可する
mongodb が listen するIPアドレスはデフォルトでは 127.0.0.1 に設定されており、ローカルからのみアクセスを許可するようになっています

mongod.conf の bind_ip に設定されたIPアドレスで listen するのでこれを変更することで外部からの接続を許可します

ここに 0.0.0.0 を設定すると全てのIPアドレスからの接続を許可します

```text:/etc/mongod.conf
# Listen to local interface only. Comment out to listen on all interfaces.
bind_ip=0.0.0.0
```

複数のIPを設定することも可能です

```text:/etc/mongod.conf
# Listen to local interface only. Comment out to listen on all interfaces.
bind_ip=127.0.0.1,192.168.56.101
```


mongod を再起動すると反映

```bash:
$ service mongod restart
```

設定反映後はリモート接続ができるようになります

```bash:
$ mongo 192.168.56.101
MongoDB shell version: 3.0.2
connecting to: 192.168.56.101/test
> 
> show dbs
local  0.078GB
> 
```
c++ builder > JSON > Clear()に該当する処理

```txt:動作確認
C++ builder XE4
```

`<DBXJSON.hpp>`を使ったJSONの処理で、Clear()に該当するものが見つからなかった。

以下のように実装した。

```
void __fastcall TForm1::Clear()
    int size = jsonObj->Size();
    for(int pi=0; pi < size; pi++) {
    	pairObj = jsonObj->Get(0); // 常に0番目を消す
	    key = pairObj->JsonString->Value();
	    jsonObj->RemovePair(key);
    }
}
```

jsonObjは`TJSONObject *`で定義している。

`Get()`する時に`Get(pi)`としていたが、RemovePair()するたびにサイズが変わるので、常に0を取るようにした。
c++ builder XE4, 10.2 Tokyo > TForm > FormがShowModal()で開かれたか、Show()で開かれたかの確認 > if (FormState.Contains(fsModal)) {

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

FormAからFormBを開いた時、FormB側のOnShow()でShow()とShowModal()のどちらで開いたか確認したかった。

StackOverflowで聞いたところ、delphiコードを教えていただいた。
[SO](http://stackoverflow.com/questions/32929890/is-it-possible-to-know-the-form-is-shown-with-show-or-showmodal)

delphiの`if fsModal in FormState then`をC++ Builderのコードにすると以下となることがわかった。
参考: http://www.borlandtalk.com/tform-question-vt17251.html

```
void __fastcall TForm1::FormShow(TObject *Sender)
{
    if (FormState.Contains(fsModal)) {
        ShowMessage(L"ShowModal");
    } else {
        ShowMessage(L"Show");
    }
}
```
MacとiPhoneをUSBで繋いだのに、ネットワーク設定から接続ができない。応答がない。

初めてとか久しぶりとか再セットアップ後に接続しようとして
繋がらない場合、iPhone側に
信頼する／しない、のダイアログが出ている場合があるので、
それを実行する。
macもiphoneも何も言わないので意外とハマる
Railsでディレクトリがロードされない場合

## 現象
Draperを使用してDecoratorクラスで定義したメソッドを使用しようとした際に
Decoratorクラスがロードされていないために、uninitialized constantが発生。
(Railsのバージョンは4.2.1、Draperのバージョンは2.1.0)

## 解決策
config/application.rbに特定のディレクトリを自動ロードする設定を追加。

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

  # Decoratorディレクトリをロードする
  config.autoload_paths += Dir["#{config.root}/decorators/**/"]

end
```

編集後、railsを再起動させる。