OmniAICreator/Qiita-1.07M huggingface dataset:
Knockout.jsをなぞる

#はじめに
fkskです。qiitaでは初めての投稿で緊張しています。
よろしくお願いします。

さて、巷ではjavascriptのフレームワークで賑わっているようです。
いかんせん、そういったモノに触れたことが無いので、今回の投稿を期にほんの気持ち程度やっていこう思います。
今回は数あるフレームワークの中でも、最も強そうな名前のKnockout.jsが気になったので、ぼちぼちやっていきます。
#まずKnockout.jsって
Knockout.jsはMVVMのパターンをサポートするためのもので、データバインドを使って、ViewとViewModelを宣言的に関連付けるものらしいです。
そうすると何ができるかって話ですけど、ViewとViewModelのどちらか一方を変更すると、もう一方にその変更が自動的に反映されるそうです。

また、Viewのhtmlのボタンをクリックするなどのアクションも、データバインドを使ってViewModelのメソッドと関連付けることができるそうな。
##そもそもMVVMって
MVCモデルしか知らない自分は「なんでModel2つあんの？なんでView2つあんの？Controllerどこ？」とか思います。
まぁ調べると「Model」「View」「ViewModel」の意で、
ModelではJavaScriptでWebサービス呼び出しなどを行うドメインロジックを実装している
ViewではHTMLでUIのテンプレートを定義している
ViewModelではJavaScriptで、ViewへのデータバインドのためにViewの状態を保持し、プレゼンテーションロジックを実装する
ほかにもたくさん書いてましたが、ゴチャゴチャしててわからなかったので省きます。
#使ってみたい
Knockout.jsの導入は簡単で
http://knockoutjs.com/downloads/index.html
↑ここからJSファイルを落としてきて、scriptタグで読み込めばいいみたいです。
楽勝ですね。
ということで、ちょっとHelloWorldもどきをしてみたいと思います。

```example.html
<html>
  <head>
    <!-- さっき落としてきたknockoutをインポート -->
    <script src="knockout-3.2.0.js"></script>
    <!-- 下に表示してるViewModelのファイルをインポート -->
    <script src="example.js"></script>
  </head>
  <body>
    <p>FirstName: <input data-bind="value: firstName" /></p>
    <p>LastName: <input data-bind="value: lastName" /></p>
    <h2>Hello, <span data-bind="text: fullName"> </span>!</h2>
  </body>
</html>
```

```example.js
window.onload = function () {
  var ViewModel = function(first, last) {
      this.firstName = ko.observable(first);
      this.lastName = ko.observable(last);
      this.fullName = ko.computed(function() {
          return this.firstName() + " " + this.lastName();
      }, this);
  }; 
  // このViewModelとView(上のexample.html)を関連付け
  ko.applyBindings(new ViewModel("showk", "fksk"));
}
```

こうすることで、KnockoutはUIの更新を検知し、firstNameとlastNameのどちらを編集してもfullNameの内容が更新されるようになります。
つまり、firstNameには"fksk"、lastNameには"showk"が初期値として出ていますが、変更するとfullNameの"showk fksk"にそれが反映されるということです。
デモをした方が分かりやすいのですが、サーバ動かないのでやめます。
察してください。
#感想とか
そもそもjsフレームワークの知識がありませんでした。
当然、調べていくと更に分からないものがでてきます。
未知の世界。勉強不足を痛感。一つ一つモノにしていきたいですね。

#参考記事
[Knockout] MVVMパターンでアプリケーションを構築する
　http://www.buildinsider.net/web/bookjslib111/89
MVVMパターンの常識 ― 「M」「V」「VM」の役割とは？
　http://www.atmarkit.co.jp/fdotnet/chushin/greatblogentry_02/greatblogentry_02_01.html
Knockout.js入門
　http://tech.aainc.co.jp/archives/5346
Knockout.js 日本語ドキュメント
　http://kojs.sukobuto.com/tips/helloWorld
[Knockout.js基本編]最低限の構成で「Hello World」してみる
　http://analogic.jp/knockout-usage/
vpternlogd

3項論理演算します。


3入力、1出力のLUTがあれば、3入力の論理演算を実現できます。(これを応用したのがFPGAと言える)


例えば、 (A | B) & C は、


| A | B | C | (A or B) &C |
|---|---|---|-----------|
| 0 | 0 | 0 |     0     |
| 0 | 0 | 1 |     0     |
| 0 | 1 | 0 |     0     |
| 0 | 1 | 1 |     1     |
| 1 | 0 | 0 |     0     |
| 1 | 0 | 1 |     1     |
| 1 | 1 | 0 |     0     |
| 1 | 1 | 1 |     1     |


という感じですね。


これを実現するのが、vpternlogd (intrinsic は \_mm512_ternarylogic_epi32) 等です。

3つのベクタレジスタと、8bitの即値を入力にとります。

各ベクタレジスタから 1bit ずつとってきて、3bit のインデックスを作ります。8bitの即値から、そのインデックスに対応するビットを出力します。


これを使うと、複数の論理演算を一命令で実現できる可能性が出てきます。

```cpp
#include <immintrin.h>
#include <stdio.h>

unsigned int data1[16] = {0x00000fff};
unsigned int data2[16] = {0x0000faaa};
unsigned int data3[16] = {0x000000ff};
                   
unsigned int out[16];

static inline unsigned int __attribute__((always_inline))
test(const unsigned int table)
{
    __m512i a = _mm512_loadu_si512(data1);
    __m512i b = _mm512_loadu_si512(data2);
    __m512i c = _mm512_loadu_si512(data3);
    __m512i d;

    d = _mm512_ternarylogic_epi32(a,b,c,table); // 4番目の引数は定数必須なので-O2とかでビルドすること
    _mm512_storeu_si512(out, d);

    for (int i=0; i<8; i++) {
        printf("table[%d] = %d\n", i, (table>>i)&1);
    }

    for (int i=0; i<16; i++) {
        unsigned int bit1 = (data1[0]>>i)&1;
        unsigned int bit2 = (data2[0]>>i)&1;
        unsigned int bit3 = (data3[0]>>i)&1;

        unsigned int bit4 = (out[0]>>i)&1;

        printf("0b%d%d%d = %d\n", bit1, bit2, bit3, bit4);
    }

}

int
main()
{
    test(0b01010101);
    puts("--");
    test(0b00001111);
}
```

```
$ ./sde -- ./a.out
table[0] = 1
table[1] = 0
table[2] = 1
table[3] = 0
table[4] = 1
table[5] = 0
table[6] = 1
table[7] = 0
0b101 = 0
0b111 = 0
0b101 = 0
0b111 = 0
0b101 = 0
0b111 = 0
0b101 = 0
0b111 = 0
0b100 = 1
0b110 = 1
0b100 = 1
0b110 = 1
0b010 = 1
0b010 = 1
0b010 = 1
0b010 = 1
--
table[0] = 1
table[1] = 1
table[2] = 1
table[3] = 1
table[4] = 0
table[5] = 0
table[6] = 0
table[7] = 0
0b101 = 0
0b111 = 0
0b101 = 0
0b111 = 0
0b101 = 0
0b111 = 0
0b101 = 0
0b111 = 0
0b100 = 0
0b110 = 0
0b100 = 0
0b110 = 0
0b010 = 1
0b010 = 1
0b010 = 1
0b010 = 1
```

明日からは @tanakmura がみんな大好きシャッフル命令を一個ずつ説明していく可能性があります。
Go で入力をサンプリングして出力するコマンド作った

## 2014-12-05 01:00 追記

はてなブックマークのコメントで @zetamatta さんより、`awk` で同じことをやる例を教えていただきました。

<blockquote class="twitter-tweet" data-cards="hidden" lang="ja"><p>「一般的な UNIX ツールにそれを叶えてくれるツールは探しても見つからなかった」－ awk &quot;rand() &lt; 0.1&quot; で済むよ！<a href="https://twitter.com/hashtag/golangjp?src=hash">#golangjp</a> <a href="https://twitter.com/hashtag/awk?src=hash">#awk</a> / “Go で入力をサンプリングして出力するコマンド作った - …” <a href="http://t.co/YhvDQfQEGp">http://t.co/YhvDQfQEGp</a></p>&mdash; ζ (@zetamatta) <a href="https://twitter.com/zetamatta/status/541499615460077568">2014, 12月 7</a></blockquote>

なるほど！という感じですね。

なお実際試すと、同じファイルに対して何度実行しても同じ結果が返ります。
だいたいのケースにおいて特に問題にならないと思いますが、気にする場合は以下のようにするといいでしょう。

```
$ awk 'BEGIN { srand() } rand() < 0.1' file
```

まぁタイプ数増えて面倒ですね...
引数を省略した場合はタイムスタンプが暗黙的に使われるとのことなので、秒単位で同時であればこれも同じ結果になります。

あと、 @lestrrat さんからも同様の例が。

<blockquote class="twitter-tweet" lang="ja"><p>perl -ne ‘print if rand() &lt;= 0.01’ でもいけそうだな</p>&mdash; Daisuke Maki (@lestrrat) <a href="https://twitter.com/lestrrat/status/541568749007286272">2014, 12月 7</a></blockquote>

もっと UNIX 的であろうと思わされた週末でした。

---

ログの集計・分析において、入力データが巨大で、かつ大まかな傾向さえわかれば良いというときにはサンプリングするものだと思います。
意外なことに、一般的な UNIX ツールにそれを叶えてくれるツールは探しても見つからなかったので、Go で作ってみました。

[yuya-takeyama/sample](https://github.com/yuya-takeyama/sample)

## インストール

とりあえず `go get` によるインストールのみに対応しています。
GitHub Releases によるバイナリ配布も、いい感じのやり方を調べてやってみたいところです。

```
$ go get github.com/yuya-takeyama/sample
```

## 使い方

### 標準入力をサンプリング

`-r` でサンプリングする割合を指定します。
この場合は 1% にサンプリングされます。

```
$ cat hoge | sample -r 0.01
```

tail -f などを受け取ることもできます。

### ファイルをサンプリング

ファイル名は複数指定可能です。

```
$ sample file1 file2
```

なお、`-r` を省略したときのデフォルト値は 0.1 (10%) です。

Enjoy!
uGUI Panelの色を変えてみます。

# はじめに
uGUIのPanelとSliderを使って、PanelのColor制御を行いました。

# 目標
画面の黒部分をRGBA制御を行い変化させます。

![スクリーンショット 2014-12-06 20.03.30.png](https://qiita-image-store.s3.amazonaws.com/0/37367/47566cb3-db37-447a-3224-c82766e567d8.png)
## 使うもの
* UI Panel, Slider, Text
* 制御用のスクリプト

# Panelの設置
”制御するPanel”と”RGBA制御用Sliderの背景になるPanel”を、それぞれ設置します。

| 制御するPanel | RGBA制御用Sliderの背景になるPanel |
|:------------:|:------------:|
|![スクリーンショット 2014-12-06 21.08.17.png](https://qiita-image-store.s3.amazonaws.com/0/37367/0c1495d1-2c56-3a5c-2b6d-bb8e35bbfd76.png)|![スクリーンショット 2014-12-06 21.09.02.png](https://qiita-image-store.s3.amazonaws.com/0/37367/a73b0e7d-cd81-15c9-977c-130cee267dc8.png)|

# Sliderの設置
RGBA制御用のSliderを置きます。（画像１）
この時に作者都合でAlpha制御用Slider（AlphaSlider）のValueを１に、それ以外のSliderのVauleを０にしております。（画像２）

| 画像１ |
|:------------:|
|![スクリーンショット 2014-12-06 21.12.21.png](https://qiita-image-store.s3.amazonaws.com/0/37367/3f4e7ba3-59b2-0575-95fd-af2fb3d647d9.png)|

**画像２**

| Alpha | それ以外 |
|:------------:|:------------:|
|![スクリーンショット 2014-12-06 21.14.13.png](https://qiita-image-store.s3.amazonaws.com/0/37367/e14254e7-d770-9026-8948-58cb7a69f017.png)|![スクリーンショット 2014-12-06 21.14.03.png](https://qiita-image-store.s3.amazonaws.com/0/37367/3f9b3944-eb45-07fe-a65a-77dfa0254697.png)|

# スクリプトの設置
設置したUIを制御するスクリプトを作ります。
![スクリーンショット 2014-12-06 21.28.54.png](https://qiita-image-store.s3.amazonaws.com/0/37367/ae278f45-e243-7b4e-c50e-109633e81ac9.png)


```csharp:ColorController.cs
using UnityEngine;
using UnityEngine.UI;	// UIを使います。
using System.Collections;
public class ColorController : MonoBehaviour { 
	private GameObject redslider, greenslider, blueslider, alphaslider;
	private GameObject panel_object;
	// Use this for initialization
	void Start () {
		// GameObjectを取得します。
		this.redslider = GameObject.Find ("RedSlider");
		this.greenslider = GameObject.Find ("GreenSlider");
		this.blueslider = GameObject.Find ("BlueSlider");
		this.alphaslider = GameObject.Find ("AlphaSlider");
		this.panel_object = GameObject.Find ("ColorBackground");
	}
	// Update is called once per frame
	void Update () {
		// 変動する値を取得します。
		float red = this.redslider.GetComponent<Slider> ().value;
		float green = this.greenslider.GetComponent<Slider> ().value;
		float blue = this.blueslider.GetComponent<Slider> ().value;
		float alpha = this.alphaslider.GetComponent<Slider> ().value;
		// 取得した値をカラー値にセットします。
		this.panel_object.GetComponent<Image>().color = new Color(red, green, blue, alpha);
	}
}
```

# 完成画面

| Game | Hierarchy |
|:------------:|:------------:|
|![スクリーンショット 2014-12-06 21.34.18.png](https://qiita-image-store.s3.amazonaws.com/0/37367/f981a221-95a8-25ad-b221-b90d4b46c467.png)|![スクリーンショット 2014-12-06 21.04.12.png](https://qiita-image-store.s3.amazonaws.com/0/37367/9ef3d140-6bcd-3e86-b841-590420ee1db7.png)|
技術的要素に触れる人を考える

技術的要素を決定するのはエンジニアが決めている場合が多いように思う。

（ここで自分が言っている技術的要素は、Rails、Haml、AngularJS、CoffeeScript などのソフトウェアや言語のことである）

しかし、その技術的要素はエンジニアのみが扱う場合と複数の職種が扱う場合があると思う。

ここでは後者の場合について言及する。

後者の場合の複数の職種とはエンジニアとデザイナーのことだ。これにディレクターが加わる場合もあったりする。

デザイナーが触れる技術的要素には以下のようなものがあげられる。

1. テンプレートエンジンを利用した HTML コーディング
2. 動的でリッチな UI のための JavaScript コーディング

`1.` を行う際に関わってくる技術要素は主にフレームワーク (Rails) や記述する言語 (Haml) で
`2.` を行う際に関わってくる技術要素は主にフレームワーク (AngularJS) や記述する言語 (CoffeeScript) だ。

\* 括弧内の言語やソフトウェアはここでの例のために選択したものである。
\* `2.` に関しては、フレームワークによって HTML 要素に多くの技術的要素が含まれる場合がある。

これからもわかるように、デザイナーもフレームワークや言語といった技術的要素を扱う。

だから、これら技術的要素を決める場合は、技術的要素を触れる他の職種についても考える必要がある。
そしてエンジニアは技術的要素を導入するとこれまでと何が変わるのかを説明しなければならない。

誰だって未知のものを説明もされないまま体験したくはない。
（エンジニアは未知のものを好むが他の職種の場合はそうでないことのほうが多いだろう）

それに、これまでに扱ったことのない技術的要素ならば学習をしなくてはいけないのでなおさらだ。
学習をするためには時間を使う。サービス開発における時間はとても貴重だ。

我々はスケジュール通りにサービスをリリースすることが求められている。
なるべく形を作るのに時間を使いたい。
この貴重な時間を使うのに値するものなのかを知る必要がある。

技術的要素を双方の同意のもと決定したら、それでおわりではない。

日々サポートが必要である。

新しい技術的要素を扱うにはすんなりといかない。
エンジニアだって悩み試行錯誤しながら徐々に馴染ませていく。

サポートの仕方は、わからないことを聞かれたら直接教えるであったり
エンジニアとデザイナ双方で勉強会を行うことだったりいろいろなやり方がある。

最近では GitHub を用いて Pull Request を使ったワークフローを導入しているところが多いと思う。
この Pull Request 上で「今まではこうやればできていたんだけど、今だとどう書けばいいんだろう」といった疑問を
コメントして自分以外の人に伝えるのも大事である。

公開すれば、そのサービスの担当者、またはそれ以外の人が見てくれ、教えてくれるかもしれない。
他の人を巻き込むのはとても大事なことだ。

疑問を公開することは、サービス開発の時間短縮、品質向上に繋がる。

このように新たな技術を取り込みながらエンジニアとデザイナで相互協力して開発をしていくことが
これからのウェブサービス開発に向き合っていく大切なポイントなんだと思う。

---

この記事は Pepabo Advent Calendar の 6日目のエントリです。
次は @ume3_ さんです。
TEMPer1の温度データ取得プラグイン作成方法

# 概要

USB温度センサTEMPer1の温度データを元にMunin用のプラグインを作成します。

前提として、USB温度センサのデータを`temper`コマンドで取得できるようにしておく必要があります（[詳細](http://qiita.com/zembutsu/items/9b718416f6b30a19d83c)）。なお、本環境は Pydora 2014 R3 (Fedora20相当)を使用しています。

# 詳細

## 仕組み

温度を出力する`temper`コマンドの実行結果は、日時データと温度データであり、2つのデータはカンマ(,)で区切られています。

```
[root@pidora temper]# temper
06-Dec-2014 11:16,20.945581
```

Muninに渡したいデータは温度部分だけなので、出力結果を`cut`コマンドで整形します。

```
[root@pidora temper]# /usr/bin/temper | cut -f2 -d','
21.009874
```

あとは、Muninプラグインの中で、このコマンドを都度実行するようにします。


## プラグインの設置

エディタを使い、`vi /etc/munin/plugins/temp` 等で編集します。

```/etc/munin/plugins/temp
#!/bin/bash

if [ "$1" = "autoconf" ]; then
        echo yes
        exit 0
fi

if [ "$1" = "config" ]; then

        echo 'graph_title Room Temperature'
        echo 'graph_args --base 1000 -l 0'
        echo 'graph_vlabel Celsius'

        echo 'graph_scale no'
        echo 'graph_category RasPi'

        echo 'temp.label Room1'
        print_warning temp
        print_critical temp

        echo 'graph_info Room Temperature'
        echo 'temp.info /usr/bin/temper'

        # Last, if run with the "config"-parameter, quit here (don't
        # display any data)
        exit 0
fi


echo -n "temp.value "
/usr/bin/temper | cut -f2 -d','
```

ファイルの作成後はパーミッションを変えます。

```
# chmod 755 /etc/munin/plugins/temp
```

次に、`temper`コマンドはroot権限で実行させる必要があります。そのため、muninのプラグイン設定用ファイルを置き、実行時のユーザがrootになるように明示します。これをしないと Permission denied のエラーが出ます。

```
# cat << EOF > /etc/munin/plugin-conf.d/temp
[temp]
user root
EOF
```

動作テストのために`munin-run`コマンドを実行します。次のように温度情報が表示されれば問題ありません。

```
# /usr/sbin/munin-run temp
temp.value 20.945581
```

最後に munin-node の再起動をかけます。

```
# systemctl restart munin-node
```

あとは、自動的にグラフが生成されます。

![temp-day.png](https://qiita-image-store.s3.amazonaws.com/0/13002/3e9202f0-f21b-0cb4-0f76-c381a36ce4ea.png)
USB温度センサTEMPer1の温度を取得するには

#概要

[PCsensor社](http://www.pcsensor.com/)のUSB温度センサTEMPer1を使い温度データをLinuxで取得する。PaspberryPiとTEMPer1はUSBで接続できる。Linux(Pydora20)で、コマンドラインで温度データを取得する方法。

#詳細

[GitHub上のリポジトリ](https://github.com/bitplane/temper)からソースを取得し、makeする。

## 環境構築手順

```
$ sudo yum -y install git libusb-devel
$ git clone git://github.com/bitplane/temper.git
$ cd temper
$ make clean
$ make
$ sudo cp ./temper /usr/bin/temper
$ sudo temper
06-Dec-2014 11:08,21.009874
```

## 備考

* temper 実行時には root 権限が必要
* lsusbでデバイスを見ると `Bus 001 Device 004: ID 0c45:7401 Microdia TEMPer Temperature Sensor` と表示される
古いカーネルを削除しようとしたけどダメだった on Fedora20

### 環境

Fedora20

### 概要

カーネルをアップグレードするたびに起動時に増えていくカーネル…
これをどうにかしたくてリンクを

[不要なカーネルの削除](http://www.geocities.co.jp/HeartLand-Icho/5345/lin_krnl.html)

以下になりました。

```sh
rpm -e kernel-3.11.10-301.fc20.x86_64
エラー: 依存性の欠如:
        kernel-uname-r = 3.11.10-301.fc20.x86_64 は (インストール済み)kernel-modules-extra-3.11.10-301.fc20.x86_64 に必要とされています

```
AndroidでAdMobの全画面広告（インタースティシャル広告）実装時にハマったこと

https://developers.google.com/mobile-ads-sdk/docs/admob/advanced
のページのSample通りに実装したあと、単純に

`displayInterstitial()`

を呼び出したらはまった。
どうやら、広告データを読み込んでから表示するようなので、Activity遷移後すぐに表示しようとすると、広告データを読み込む前で表示されない。

`interstitial.setAdListener(new AdListener(){
          public void onAdLoaded(){
               displayInterstitial();
          }
});`

で解決。
Androidアプリ開発初心者が実機で動かす時に困ったこと。

#Androidのアプリを作った初心者が困った物語を書いた投稿です。
##中級者以上の方には、役立たないかもしれません。

1. 導入
1. 状況
1. 原因
1. 結論

<dl>
<dt>
SurfaceViewをActivityに一個だけ載せただけのあぷりをつくていました。
<dd>実機でデバックしようとしていました。</dd>
</dt>
<dt>
さて、実機で動かそう！ぽち！！
</dt>
<dt>
問題が発生したため{アプリ名}を終了します。……
</dt>
<dd>エラーだー</dd>
<dt>
</dt>
</dl>


<dl>
<dt>まずは、LogCatを見てみました。</dt>
<dd>

``
DeviceMonitor: Sending jdwp tracking request failed!
DeviceMonitor: Adb connection Error:EOF
DeviceMonitor: Connection attempts: 1
DeviceMonitor: Connection attempts: 2
DeviceMonitor: Connection attempts: 3
DeviceMonitor: Connection attempts: 4
DeviceMonitor: Connection attempts: 5
DeviceMonitor: Connection attempts: 6
DeviceMonitor: Connection attempts: 7
DeviceMonitor: Connection attempts: 8
DeviceMonitor: Connection attempts: 9
DeviceMonitor: Connection attempts: 10
DeviceMonitor: Connection attempts: 11
``
</dd>
<dd>

##頭の悪い自分には、正直よくわかんなかった

</dd>
</dl>

今度は、Deviceの方のLogCatを見たら、なんとかわかった、
java.lang.RuntimeException: Unable to start activity ComponentInfo{アクチヴィティ名}}: java.lang.NullPointerException

これを見る限り、SurfaceViewの初期化がうまく行われていないだろうと踏んだ、、
あっSurfaceViewの初期化を忘れていた、
と思っていたら原因は違った、
原因は、



Actionbarが原因でした。
Edison@Debian(ubilinux)でusb0なネットワークを使う。With Ubuntu14.04

usb0なネットワークの使い方がわかったので記録。
ちなみにここのホストPCはUbuntu14.04なので注意。

# これは何？
これはAndroidでもusbテザリングに使われるもののようで
ホストマシンのusbにEdisonをOTGポートにつなぐと出現する。
Edison側にもusb0ネットワークデバイスが出現する。
ただし、ホストになった場合はデバイス側に機能がないと出現しない。

## 使い方
さて、これを使用する場合
debian系なので/etc/network/interfaceをいじる。

#### USBファンクション機（Edison）
`nano /etc/network/interface`

```lang:/etc/network/interface
auto usb0
iface usb0 inet static
    address 192.168.2.15
    netmask 255.255.255.0
```

#### USBホスト機（Ubuntu14.04なマシン）
自動的に出現するのでipアドレスとネットマスクのみを変更しファンクション機とネットワークセグメントを合わせる。
`sudo ifconfig usb0  192.168.2.2 netmask 255.255.255.0`
恒久的に使用したければ、ファンクション機同様に/etc/network/interfaceにエントリーを書く

### EdisonをUSB経由で外に繋ぎたい場合は？
上記の設定ではUSBホスト機とUSBファンクション機の間でしか通信はできません。
やってないのですがUSBホスト機側でブリッジを形成するか、natエントリーをIptablesかfirewalldに作成することになります。

##### 前提条件
###### Edison側
無線LANを無効化するか、ルーティングテーブルをいじってデフォルトゲートウェイをusb0側にします。
まあ目的が持ち歩きなら無効化するほうが省電力でいいかと思われます。
一時的にやるなら以下のコマンドでOK
`ifconfig wlan0 down`

* natの場合はネットワークセグメントをホスト機のつながっているネットワークと別にします。
* ブリッジの場合はネットワークセグメントを同じにして、他に使われていないアドレスにします。もちろんデフォルトゲートウェイも参加先のネットワークに合わせます。

###### USBホスト機（Ubuntu14.04相当）
ipv4でやります、Linuxカーネルへipv4パケットをリレーすることを許可します。
`sudo nano /etc/sysctl.conf`
以下の行のコメントを外す。

```lang:/etc/sysctl.conf
net.ipv4.ip_forward=1
```
即座に反映（本当は再起動した方がよい）
`sudo sysctl -p`
確認
`cat /proc/sys/net/ipv4/ip_forward`
１が帰ってくればOK

* nat(masquerade)を構成する場合。
以下を参考にします。
http://qiita.com/Kshi-Kshi/items/2fa1436248f1d4938861
 ここでは以下のように設定します。
`sudo iptables -t nat -A POSTROUTING -s 192.168.2.0/255.255.255.0  -j MASQUERADE`
再起動後のことを考えないならこちらがお手軽です。
間違えた場合、以下で行番号を確認
`sudo iptables -t nat -L --line-numbers`
指定の行番号を削除、確認は上のコマンドで再度行ってください。
`sudo iptables -t nat -D POSTROUTING 行番号`

* bridgeを恒久的に構成する場合。
bridge-utilsのbrctlコマンドを使えば一時的にも可能です
ブリッジは固定でWifiのインターフェイス（dhcp）に設定して、
このブリッジに対してusb0のインターフェイスを参加させていく方法を考える。

```lang:/etc/network/interface
auto lo
iface lo inet loopback

auto wlan0
iface wlan0 inet manual

auto br0
iface br0 inet dhcp
bridge_ports wlan0
bridge_maxwait 0
bridge_df 0
bridge_stp off
```

動的にインターフェイスの追加行う

```lang:console
sudo brctl addif br0 usb0
sudo ifconfig usb0 0.0.0.0
```

多分、これで使えるはずです。※試してないので試したら追記します。
骨董品から個体識別情報を取得する方法（古来伝授編）

# 骨董品（ガラケー）からUIDを取得する必要があった時に調べた＆教えていただいた内容のメモ
![](http://nakijingusuku.com/museum/%E8%A4%90%E9%87%89%E9%99%B6%E5%99%A8%E5%A3%BA2.JPG)

## そもそもUIDとはなにか
- 個体識別情報
    - ユニークな情報（ID)で個体を識別するためのもの

## 実際の取得方法PHP編
- 今回取得したガラケーの対象キャリア
    - DOCOMO
    - KDDI
    - SOFTBANK
- 上記のキャリアでUIDを取得する際に注意すること
    - DOCOMOだけ取得する際に以下のようにURLパラメータを指定する必要がある

        > http://www.hoge.com/?guid=ON
    - ※これを指定しないとUIDが取得できない

```php
private function getUidFeaturePhone($carrier){
    if($carrier == CARRIER_TYPE_DOCOMO){
        return $_SERVER['HTTP_X_DCMGUID'];
    }
    if($carrier == CARRIER_TYPE_KDDI){
        return $_SERVER['HTTP_X_UP_SUBNO'];
    }
    if($carrier == CARRIER_TYPE_SOFTBANK){
        $useragent = $_SERVER['HTTP_USER_AGENT'];
        preg_match("/^.+\/SN([0-9a-zA-Z]+).*$/", $useragent, $match);
        return $match[1];
    }
    if($carrier == CARRIER_TYPE_JPHONE || $carrier == CARRIER_TYPE_VODAFONE){
        return $_SERVER['HTTP_X_JPHONE_UID'];
    }
}
```
zshでEnterを連打したときにいろいろ実行する

zsh で Enter を連打したときに順番にコマンドを実行するというのをやってみました。

参考にしたのは [Zsh - Enter で ls と git status を表示すると便利 - Qiita](http://qiita.com/yuyuchu3333/items/e9af05670c95e2cc5b4d "Zsh - Enter で ls と git status を表示すると便利 - Qiita") です。

## 概要と実装

`.zshrc` に以下のような感じで追加して空 Enter を押すと
最初は `ls` で次に
`svn status` または `git status -sb` を実行するようになります。
連打したときに終わりがわかりやすいように 3 回目は何も実行しないようにしています。

```sh
function my_enter {
    if [[ -n "$BUFFER" ]]; then
        builtin zle .accept-line
        return 0
    fi
    if [ "$WIDGET" != "$LASTWIDGET" ]; then
        MY_ENTER_COUNT=0
    fi
    case $[MY_ENTER_COUNT++] in
        0)
            BUFFER=" ls"
            ;;
        1)
            if [[ -d .svn ]]; then
                BUFFER=" svn status"
            elif git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
                BUFFER=" git status -sb"
            fi
            ;;
        *)
            unset MY_ENTER_COUNT
            ;;
    esac
    builtin zle .accept-line
}
zle -N my_enter
bindkey '^m' my_enter
```

## 解説

詳細は [blog記事](http://blog.n-z.jp/blog/2014-12-06-zsh-enter.html) の方に書いたので参考にしてみてください。
Node.js環境構築からhello,worldとパッケージ管理npmまで

# はじめに
Node.jsはサーバサイドのjavascript環境です。
javascriptを使ってhttpサーバにしたり、パーサやバッチを書いたりできます。

本家
http://nodejs.org/

Node.js日本ユーザグループ
http://nodejs.jp/

# インストール
Linux環境を想定しています。

## nvmを利用
nvmはNode.jsのバージョン管理してくれます。
https://github.com/creationix/nvm
Install scriptでインストール

```bash
$ curl https://raw.githubusercontent.com/creationix/nvm/v0.20.0/install.sh | bash
source ~/.nvm/nvm.sh
# 起動時によむ
echo 'source ~/.nvm/nvm.sh' >> ~/.bash_profile 
```
## stableをインストール
ついでにデフォルトで使用するバージョンもstableに

```bash
$ nvm install stable
  nvm alias default stable
```

# hello,worldとか
マニュアル参照
http://nodejs.jp/nodejs.org_ja/docs/v0.10/api/synopsis.html

# パッケージ管理
パッケージ管理はnpmで行います。

## UglifyJSをインストール
一例にjavascript難読化、圧縮ツールのUglifyJSをインストールしてみます。
https://github.com/mishoo/UglifyJS2

記載のコマンド通り実行します。

```bash
$ npm install uglify-js -g
```
npm installするとnpmjs.orgから取得しにいきます。
https://www.npmjs.org/package/uglify-js

gオプションをつけると、shellからそのまま実行できるglobalインストールになります。

```bash
$ uglifyjs hoge.js
```
GenerateExportHeader: visibilityの制御用ヘッダを自動的に生成する



c++でdllを作成する際に、FOO_EXPORTのようなマクロを定義して、dllimport と dllexport を切り替えて使用するケースがある。（このへん正直あまりよくわかっていないのだけど・・・・）

GenerateExportHeaderモジュールを使用すると、このマクロを定義するファイルを自動的に生成できる。

```cmake

include(GenerateExportHeader)
add_library(foo SHARED foo.cc)
generate_export_header(foo)
```

上記を実行すると、ビルドツリーに `foo_export.h` が生成されて、以下のマクロが定義される。
 - `FOO_EXPORT`
 - `FOO_NO_EXPORT`
 - `FOO_DEPRECATED`
 - `FOO_DEPRECATED_EXPORT`
 - `FOO_DEPRECATED_NO_EXPORT`

Linux+gcc 環境では下記のファイルが生成された

```cpp

#ifndef FOO_EXPORT_H
#define FOO_EXPORT_H

#ifdef FOO_STATIC_DEFINE
#  define FOO_EXPORT
#  define FOO_NO_EXPORT
#else
#  ifndef FOO_EXPORT
#    ifdef foo_EXPORTS
        /* We are building this library */
#      define FOO_EXPORT __attribute__((visibility("default")))
#    else
        /* We are using this library */
#      define FOO_EXPORT __attribute__((visibility("default")))
#    endif
#  endif

#  ifndef FOO_NO_EXPORT
#    define FOO_NO_EXPORT __attribute__((visibility("hidden")))
#  endif
#endif

#ifndef FOO_DEPRECATED
#  define FOO_DEPRECATED __attribute__ ((__deprecated__))
#  define FOO_DEPRECATED_EXPORT FOO_EXPORT __attribute__ ((__deprecated__))
#  define FOO_DEPRECATED_NO_EXPORT FOO_NO_EXPORT __attribute__ ((__deprecated__))
#endif
```

あとは、ライブラリのソースファイルで生成されたファイルをインクルードして、さらにインストール対象にファイルを含めればいい。

細かいオプションは下記を参照すること。
http://www.cmake.org/cmake/help/v3.0/module/GenerateExportHeader.html
ディレクトリやファイルのパスをクリップボードにコピーする関数

ディレクトリやファイルのパスをコピペしたい時が時々あるので関数を作った。

`~/.bash_profile`などに定義しておく。

```bash:~/.bash_profile
cpath() {
  echo $(grealpath $1) | tee >(tr -d '\n' | pbcopy)
}
```

- 名前は`cpath (copy path)`にした。
- `grealpath`は`sudo port install coreutils`すればインストールされる。
- `>(command)`の部分は[Bashのプロセス置換](http://www.gnu.org/software/bash/manual/bashref.html#Process-Substitution)という機能。
- `tr`で改行を削除。
- `pbcopy`でペーストボードへ格納。

使用例はこんな感じ。

```bash
$ cpath .
/Users/masayuki/cpath-demo
$ cpath test.txt
/Users/masayuki/cpath-demo/test.txt
```

パスはペーストボードにも格納されている。
Laravelを使ってみる

### Laravelのインストール

#### インストール

最初に、インストールに必要な`composer`をインストールする

```
curl -sS https://getcomposer.org/installer | php
```

#### プロジェクトの作成

```
# 通常のプロジェクト
create-project laravel/laravel プロジェクト名 --prefer-dist

# 日本語化されたプロジェクト
create-project laravel-ja/laravel プロジェクト名 --prefer-dist
```

#### 最低限の設定をする


* アプリケーション全体の設定

```app/config/app.php

//43行目あたり　URLの設定
'url' => 'http://www.hoge.com/',
 
//69行目あたり　ロケール設定
'locale' => 'ja',
 
//82行目あたり　暗号生成用の乱数。デタラメな32文字を付ける
'key' => '******',
```

この時に、16行目付近にある`degbug　=> false`の値をtrueにしておくとLaravelのエラーメッセージが表示されるようになります

* DB関連の設定

```app/config/database.php
//以下はMySQLを使う場合の設定
//69行目あたり以降
'mysql' => array(
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'DBname', //DB名
    'username'  => 'username', //MySQLユーザ名
    'password'  => 'password', //MySQLパスワード
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => ''
),
```

* Apacheの設定をする

ララベルの場合は、`{プロジェクト名}/public`以下がドキュメントルートになるので、`/etc/httpd/conf/httpd.conf`にドキュメントを追加します。

httpdを再起動します。

```
sudo service httpd restart
```


* 確認してみる

この時点で、一旦ブラウザからアクセスしてみる。
ララベルのマークと`You have arrived`ってメッセージが表示されてればOK.


☆ 人によっては、この時に`app/storage`へパーミションの関係で書き込みが出来なかったみたいなエラーが出る場合があるそうです。
その場合は、app/storageのアクセス権などを664などに変えて見て下さい。

#### sentryをインストールしてみる

ララベルで最も有名なユーザ管理パッケージに`sentry`というものがあるそうです。

これを使うと、簡単にユーザ情報を登録したり、照会したり出来るようになるそうなので、どんなものか試すために入れてみようと思います。

```プロジェクト名/composer.json

"require": {
    "laravel/framework": "4.1.*", //カンマを忘れずに付け加える
    "cartalyst/sentry": "2.0.*",  //この行を追加する
},

```

インストールする
```
composer update
```

#### ララベルの設定にsentryを追加する

```app/config/app.php
//95行目あたりから
'providers' => array(
    'Illuminate\Foundation\Providers\ArtisanServiceProvider',
    'Illuminate\Auth\AuthServiceProvider',
    /*省略*/
    'Cartalyst\Sentry\SentryServiceProvider', //この行を追加
),
/*省略*/
'aliases' => array(
    'App'             => 'Illuminate\Support\Facades\App',
    'Artisan'         => 'Illuminate\Support\Facades\Artisan',
    /*省略*/
    'Sentry'          => 'Cartalyst\Sentry\Facades\Laravel\Sentry', //この行を追加
),
```


#### mysqlにsentryで使うユーザ管理テーブルを作成

```
php artisan migrate --package=cartalyst/sentry
```


### ルーティングの設定をしていく

* ルーティングの記述場所

`app/routes.php`に書いてきます。

* ルーティングの記述方法

```
Route::ルーティングメソッド('パス`, 呼び出す処理);
```

こういった形式で書いてきます。

Laravelのルーティングには大きく分けて2通りの処理の呼び出し方法があります。

1. クロージャで書く

```routes.php
Route::get('hello/', function()
{
   return "hello warld"; // こんな感じで、routes.phpに直接処理を書いてしまう
}};

```

2. コントローラに渡す

```routes.php
Routes::get('hello/', 'HelloController@helloWorld');
// これはHelloControllerというコントローラのhellowWorldというメソッドを呼び出します。
```


大体、複雑な処理を書くってなると、コントローラに書くのが普通ですが、単純なデバックとかであれば、クロージャで書く場合もあるそうです。

まま、ここらへんは使ってけばわかると思うので、続きを進めていきましょう。

### ルーティングメソッド

メソッドには大きく`get`と`post`の2つがあります。
go-json-rest を触ってみる


## go を用意する

### インストール

[Downloads - The Go Programming Language](https://golang.org/dl/) からダウンロード. インストールをしておく.

### GOPATH を通す

`.bashrc` を編集.

```~/.bashrc
export GOPATH=$HOME/golang
```

適用

```bash
source ~/.bashrc
```

- 自分は golang 以外も ghq で運用しているので `$HOME/code` としている.
- [GOPATH は適当に決めて問題ない - Qiita](http://qiita.com/yuku_t/items/c7ab1b1519825cc2c06f)

## ghq を用意する

- [ghq: リモートリポジトリのローカルクローンをシンプルに管理する - 詩と創作・思索のひろば](http://motemen.hatenablog.com/entry/2014/06/01/introducing-ghq)
- [motemen/ghq](https://github.com/motemen/ghq)

`go get` で入れる.

```bash
go get github.com/motemen/ghq
```

## peco を用意する

ghq 時代のディレクトリ移動を楽にするため.

- [ghq + cpan-ghq + pecoを組み合わせる 〜ghq編〜 - Masteries](http://masteries.papix.net/entry/2014-06-30-ghq.html)
- [pecoを使ってフィルタリング＆ディレクトリ移動 - Qiita](http://qiita.com/trapple/items/84266915af282aa06af7)

## go-json-rest を用意する

先ほど用意した ghq で落とす.

```bash
ghq get ant0ine/go-json-rest
```

## 動かしてみる

sample の `main.go` を落とす.

```bash
wget https://raw.githubusercontent.com/ant0ine/go-json-rest-examples/master/api-and-static/main.go
```

起動

```bash
go run main.go
```

curl してみる

```bash
curl -i http://127.0.0.1:8080/api/message
curl -i http://127.0.0.1:8080/static/main.go
```

OK.

- [ant0ine/go-json-rest-examples](https://github.com/ant0ine/go-json-rest-examples)
	- 便利サンプル

## References

- [go-json-rest-examples/api-and-static at master · ant0ine/go-json-rest-examples](https://github.com/ant0ine/go-json-rest-examples/tree/master/api-and-static)
- [ant0ine/go-json-rest](https://github.com/ant0ine/go-json-rest)
- [Getting Started - The Go Programming Language](https://golang.org/doc/install)
PlaneGeometryをSin波で、はためかせる

[WebGLのアドベントカレンダー](http://qiita.com/advent-calendar/2014/webgl)８日目です。

Three.jsを使って、旗をはためかせるアニメーションの作り方を説明します。物理的に正しい動きというより、PlaneGeometryとSin波を使い簡単なコードでそれっぽいものを目指します。以前[このPCサイト](http://bapa.ac)で使っていたものです。

[![hoge.jpg](https://qiita-image-store.s3.amazonaws.com/0/17747/1a6992fd-9bdc-5532-11a9-ccfebeec6831.jpeg)](http://bapa.ac)


#やりかた
まずPlaneGeometryのMeshを用意します。

```js:plane_junbi
//hoge.jpgをテクスチャにしたSEGX,SEGYに分割されたPlaneを作る。
var texture = THREE.ImageUtils.loadTexture('hoge.jpg');
var geometry = new THREE.PlaneGeometry(1300, 1228, SEGX, SEGY);
var material = new THREE.MeshLambertMaterial({map:texture});
plane = new THREE.Mesh(geometry, material);
scene.add(plane); 
```


このPlaneのverticesを毎フレームをsin波で動かします。z方向のみ波うたたせます。

```js:plane_ugokasu
plane.geometry.verticesNeedUpdate=true;//これを忘れずに書く
for (var i=0;i<SEGX+1;i++) {
	for (var j=0;j<SEGY+1;j++) {
		//(i,j)のvertexを得る
		var index = j * (SEGX + 1) + i % (SEGX + 1);
		var vertex = plane.geometry.vertices[index];
		//時間経過と頂点の位置によって波を作る
		var amp=100;//振幅
		vertex.z = amp * Math.sin( -i/2 + time*15 );
	}			
}
```
ポイントはgeometry.verticesNeedUpdate=trueにすることと、Planeの各Vertixの参照のしかたです。
amp=100とかi/2,time*15とかの数値は適当に変更してみてください。


[こんな感じにできました。](http://kitasenjudesign.com/test/1206/sin/)　細かなコードはこちらを参照してください。iOS8とかでも動きます。


#Perlinノイズも使ってみる
Sin波だけだと、ちょっと退屈な動きなのでperlinノイズhttps://github.com/josephg/noisejs   で変化を付けてみます。perlinノイズは、連続的でゆるやかな乱数が得られます。

先ほどsin波の振幅amp=100としていた部分に、perlinノイズも加え、以下のように変更しました。

```js:perlin_kuwaeru
//perlin.jsを使用
var amp = 50 + 300 * noise.perlin3(i/20+time/5,j/70,time);
vertex.z = amp * Math.sin( -i/2 + time*15 );
```
perlinノイズnoise.perlin3(x,y,z)は、よくわかってないですがx,y,zをちょっとかえたら、戻り値もちょっとかわるみたいなイメージです。

[結果、こんな感じになりました。](http://kitasenjudesign.com/test/1206/perlin/) sinだけのものより変化がつきました。


#おわりに
以上、擬似的に旗っぽいものを作りました。そもそもzしか変えてないので、物理的におかしく、生地がのびてるわけですが、それっぽくも見える気もます。
実際に私が使ったときは、生地がのびないような処理を入れたりしました、パラメータをかえるだけでも、もっとよくなったりするかもしれません。

あすは@Rinforzando_960さんです。おねがいします！
Nagoya.R #12に参加してきた


Rはかなり前に挫折してそのまま放置していたので[Nagoya.R #12](https://atnd.org/events/58339)に参加しました。とはいえ聞いていただけなのです。



## Rprofile 作成のすすめ

* CRAN(しーらん): Rのpackageのリポジトリ。ミラーたくさん。
* デフォルトだとRが終了するたびにリセットされる。悲しい上に面倒くさい。

* 作業フォルダに`.Rprofile`というファイルを作成して、そのなかに起動時に実行するスクリプトを書いておくことで解決。

* いつも定義するようなものは`.Rprofile`に書いてしまおう
```例.Qだけ打つとRを終了させる
class(Q)=Q="no";print.no=q
```

## 非線形の相関関係を検出する指標の算出

* 線形な関係: アイスの売上と気温の関係
* 非線形な関係: スポーツにおける緊張と成績(逆U字の関係)

* 積率相関係数(いつもの相関係数)は線形の相関を想定するため、非線形の相関は検出できない

* MIC(Maximal Information Coefficient: 最大情報係数)は非線形に対応
	- 相互情報量が最大になるようにグリッドを分割して計算
	- Y = sin(X) のような相関

* Rのパッケージでは`minerva`で提供されている`mine`で計算可能

* いくつかの指標
	- MIC: R^2 に相当
	- MICR2: 積率相関係数との差を表示
	- MAS: 単調性の指標

* MICの弱点
	- ビッグデータ前提
	- 関係性の強さはわかるが値がどう変わるかは不明

## Rを用いた一般化可能性理論

* 一般化可能性理論: 主観的評価における測定方法やテストの適切さを図る方法の一つ
* 項目数や被験者数の
* まあいいだろうという値は0.6
* ブログからコピペで使える

## 一般化線形混合モデル入門の入門

* [スライド](http://www.slideshare.net/yutamura1/ss-42303827)
* lme4の使い方 

```
install.packages("lme4")
library(lme4)
lmer(x ~ y + z, data = ratings)
```
* lmerTestパッケージ: lme4パッケージ(作成者はアンチp値)にないp値の計算用パッケージ
* step関数 : モデルからモデルフィッティングに寄与しない変数を削除し、モデルを提供してくれる。便利。

## Rでテキストマイニング

* tmパッケージを利用
* いろんな形式のデータを利用可能(WebとかOfficeとかPDFとかいろいろ)

* tm_mapを使って、前処理できる
	- 大文字を小文字にしたり
	- gsub(正規表現を使ったテキスト変形関数)を使って処理したり
	- snowballCパッケージを使って、stemDocumetsを使って語句の変化を消去したり
	- 機能語(Stop words)を消去したり(removeWords, Stopwords)
	- stripWhitespaceで空白を削除したり


* 頻度の分析: DocumentTermMatrix()

## 非線形回帰（レーベンバーグ・マルカート法）と信頼区間（ブートストラップ法）

* 結論: 非線形回帰した場合、信頼区間はブートストラップ法を使うと簡単に求められる
* nlsでできるが、データに異常値があったりするとエラーが頻発してしまって辛い
* minpackのnls.lm関数を利用

* rm(list=ls())はスクリプトの頭につけるのを癖にしておくのがよい
	+ 今までに作成した変数の定義を消去

* ブートストラップ法自体はスクリプトで実装

## モザイクプロットいかがですか

* 分割表で利用
* mosaicplot()関数を利用して描画する
	+ 分割表の解析結果を可視化する関数
* 可視化大事

## 最後に

* 前半ぶっちぎって後半から参加したけれど前半も出ればよかった
* ブートストラップの泥臭さと力強さすごい
* 統計は理論の説明って難しいんだなあと改めて実感

主催してくださった[川口勇作](https://sites.google.com/site/kwsk3939/)さんありがとうございました！
AR小ネタ：Extended Tracking for junaio

マーカー認識を用いたARコンテンツを作成していると、マーカーを見失った時でも
CGの表示を継続させたい場合があるかと思います。
このような問題を解決する機能を、metaioCreatorを使った場合を例に紹介します。

方法は至って簡単です、Trackablesをクリック後にExtended Image Trackingを
クリックしてマーカーとして使用したい画像を選択するだけです。
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/61742/8b52c980-a879-a18b-d369-a0b7b6bc5e14.png)



その後はマーカー上に表示させたい3Dモデルや画像・動画などを登録します。
それだけで以下の動画のようにマーカーを見失っても表示を継続させることが可能になります。
http://youtu.be/TkOG7NABgOA


【metaioCreatorを使ったコンテンツの作成に興味がある方はこちらも合わせてお読みください】
ARコンテンツを作ろう：ARコンテンツを作ってみる①
http://vizyoshinaga.sblo.jp/article/67835484.html
ARコンテンツを作ろう：ARコンテンツを作ってみる②
http://vizyoshinaga.sblo.jp/article/67942069.html
rbenvでruby環境再構築


なんかrubyがおかしい！

+ gem installできない(permission deniedされる)
+ そもそもrbenvが働いて無くね？？


自分のrubyの環境はよくわかっていないころにどっかのサイト見ながら作ったから自分でもどう設定したのか分からない。
ということで再構築する。

##そもそもrbenvとは
rubyのversionを切り替えるために使うバージョン管理アプリ。  
似たものにrvmてのがあるけどそれと比べて軽いらしい(詳しくは知らない)  
rvmと違い、gemの管理はしないのでrbenv-gemsetやbundlerを使う。bundlerを使いたければrbenvの方がいいのかな？

ようはデフォルトと違うversionを使いたいなら使いましょうて事だろう。  
なんか前設定した時によく分からず入れて結局systemのを使ってたからハマっているんだろう。  
初めての人はめんどくさくても調べたほうがいいよ！

##homebrewで必要なものをインストールしていく

###rbenv rbenv-build
インストール済みなので省略
まだなら下記のコマンド出来る。

```
brew install rbenv
brew install ruby-build
```

###rbenv-gemset rbenv-gem-rehash
せっかくなので入れておく

```
brew install rbenv-gemset
brew install rbenv-gem-rehash
```

|                  |                                                         |
| :--              | :--                                                     |
| rbenv-gemset     | gemをsetごとに管理するのに便利                          |
| rbenv-gem-rehash | gemをインストールしたりした時に自動的にrehashしてくれる |

##zshrcに追記

```
export PATH="$HOME/.rbenv/bin:$PATH"

if which rbenv > /dev/null; then
	eval "$(rbenv init -)";
fi
```

##rubyをインストール

```terminal
rbenv install -l #インストール可能なversion一覧
rbenv install 2.1.5 #2.1.5をインストール
rbenv global 2.1.5 #rbenvのdefaultのバージョンを変更する
```
これで設定終わり

```
rbenv version #現在のversionが表示されればok
```

##gemインストール

```
gem install "package_name"
```
で出来る。

##最後に
結局何がだめだったのかはっきりとは分からかったけど、まあ動いているからよしとする。
macでサウンドだけAppleTVに飛ばす方法


![](https://www.evernote.com/shard/s20/sh/030127fe-e98a-49f9-a356-a6d4fe3542c0/689f994393535d1514bd6eeaa12d6f84/deep/0/スクリーンショット-2014-12-06-17.16.54.png)

確認したのはバージョン　OS X 10.9.5。


これ、ずっとググってたのにやり方分からない日々がかれこれ半年以上。

こんなに簡単にできたとは・・・ということでメモ代わりに。
論理演算を使った値の初期化

## 引数をとる関数に引数がない場合 NaNとなる

もしadd1();が実行されたときに、
引数になにもなかったらNaNになる。

```javaScript
var add1 = function(num){
 num += 1;
 return num;
}

// 実行
add1(); // NaNとなる
```
<br>

## 引数がない場合に値を設定する

下記の例は引数が存在しなかった場合、
論理演算を使って値を初期化することができる。

```javaScript
var add1 = function(num){
 num = num ||  10
 num += 1;
 return num;
}

// 実行
add(); //11
```


引数に何もなかったら
引数 = undefined (false) となり、
後方が評価され、numに10が代入される。



```javaScript
num = num || 10
// num = undefined || 10
```
Java properties ファイルからの値の取得


Java勉強中にて、初歩的なところから。
設定ファイル的なやつから値をどうやって読み込むのが良いのかなと思って調べた方法。

本当は ini ファイル形式のほうがよかったけど、とりあえず、key valueで取れれば良し。


sample.properties

```
id = some_id
password = some_password
```

ConfigTest.java

```java
import java.util.Properties;
import java.io.FileInputStream;
import java.io.InputStream;

public class ConfigTest {
    public static void main (String[] args) {

        Properties properties = new Properties();
        
        String file = "/tmp/sample.properties";
        try {
            InputStream inputStream = new FileInputStream(file);
            properties.load(inputStream);
            inputStream.close();

            // 値の取得
            System.out.println(properties.getProperty("id"));
            System.out.println(properties.getProperty("password"));

        } catch (Exception ex) {
            System.out.println(ex.getMessage());

        }

    }
}
```

ちなみに、phpだと、下記だけですむ。

```php
<?php
$config = parse_ini_file("sample.properties");
echo $config['id'] ."\n";
echo $config['password'] ."\n";
```
VirtualBoxをインストールしたらVMware Playerが動かなくなったときの対処法

## 概要
VMware Playerをインストール済みの環境にVirtualBoxをインストールしたら，VMware Playerが起動しなくなった．

## 環境
- OS: CentOS 6.6
- VMware Player 6.0.4
- VirtualBox 4.3.18

## 問題
VMware Playerから仮想マシンを起動すると次のエラーが出る．

```
Could not open /dev/vmmon: No such file or directory. Please make sure that the kernel module `vmmon' is loaded.
```

## 解決策
`vmmon` と関連モジュールをリビルドする．

```
vmware-modconfig --console --build-mod vmmon
vmware-modconfig --console --build-mod vmnet
vmware-modconfig --console --build-mod vmci

modprobe vmmon
modprobe vmnet
modprobe vmci

service vmware restart
```

これでVMware Playerから仮想マシンが動くようになった．
リファレンス渡し

コールする関数に、コール元の変数のリファレンスを渡す事も出来ます。以下に、その方法を示したサンプルと結果を。

```php
<?php
    function func(&$ref){
        echo $ref."<br />";
        $ref = "HODENASU!!";
    }
    
    $var = "NDA!";
    
    func($var);
    
    echo $var;
?>
```

結果

```php
NDA!
HODENASU!!
```

関数「func()」は、関数内の変数（要するにローカル変数）「\$ref」に「"HODENASU!!"」を（無意味に）代入してるようにも見えますが、仮引数の部分が「\&\$ref」となっています。この場合、関数内のローカル変数「\$ref」には、実引数に指定した変数へのリファレンスが自動的にセットされます。
よって、関数内のローカル変数「$ref」は引数に指定した変数「$var」へのリファレンスを持つことになり、「関数のローカル変数$ref」へ代入した値は「変数$var」でも参照できるようになります。
当然、この場合の関数が想定する実引数は変数へのリファレンスであるので、引数に変数以外のものを指定するとエラーになります。

参考：http://www.shigeweb.jp/php/project_p/?section=first&page=var2
AngularJS: UI Bootstrap の datepicker-popup の使い方


[UI Bootstrap の `datepicker-popup`](http://angular-ui.github.io/bootstrap/#/datepicker) は、クリックしたら Datepicker を表示するようにするためのディレクティブです。日付選択のためのカレンダーですね。

こんなやつです。

![Screen Shot 2014-12-06 at 4.42.06 PM.png](https://qiita-image-store.s3.amazonaws.com/0/3732/8265041b-55ae-5837-362f-3fe47210cff6.png "Screen Shot 2014-12-06 at 4.42.06 PM.png")

## まずはコード

以下のような感じで利用することができます。

```html
<div class="input-group" ng-controller="DatePickerController">
  <input type="text"
          class="form-control"
          ng-model="date"
          datepicker-popup
          is-open="datePickerOpen">
  <div class="input-group-addon" ng-click="toggleDatePicker($event)">
    <i class="glyphicon glyphicon-calendar"></i>
  </div>
</div>
```

```js
angular.module('datepicker-example', ['ui.bootstrap'])
.controller('DatePickerController', function($scope) {
  $scope.date = new Date();
  $scope.datePickerOpen = false;
  $scope.toggleDatePicker = function($event) {
    // これが重要！！！
    $event.stopPropagation();

    $scope.datePickerOpen = !$scope.datePickerOpen;
  };
});
```

動くコードは [Plunker](http://plnkr.co/edit/MxqQ8ZhLogfenJSbgA4a?p=preview) に上げてます。

## ng-model

`datepicker-popup` を設定する要素には `ng-model` が必要です。Datepicker で選択した日付の `Date` オブジェクトが `ng-model` で指定したプロパティに入ってきます。

## ポップアップの開閉

`is-open` に渡したフラグを on/off することで、datepicker の入ったポップアップを開閉します。

一番のハマりどころが、 **クリックイベントのバブリングを止める必要がある** ところ。

`datepicker-popup` は、ポップアップの外をクリックした際に閉じるようにするために、親の要素に `click` イベントが来るとポップアップを閉じてしまいます。`$event.stopPropagation()` をしないと、開閉のためのフラグが `true` になった直後に親要素のイベントハンドラによって `false` にされてしまい、ポップアップが開きません。確かに公式サイトの例にもそう書いてあるのですが、見落としていると全く意味がわからないので要注意です。

## 設定

HTML の属性でカスタマイズすることもできるのですが、アプリ全体で共通の設定は UI Bootstrap で提供されている設定オブジェクト（constant）を変更するのが楽です。

```js
angular.module('datepikcer-example')
.config(function(datepickerConfig, datepickerPopupConfig) {
  angular.extend(datepickerConfig, {
    showWeeks: false,
    formatDay: 'd'
  });

  angular.extend(datepickerPopupConfig, {
    currentText: '今日',
    clearText: 'クリア',
    closeText: '閉じる'
  });
});
```

オプションの一覧は [公式ドキュメント](http://angular-ui.github.io/bootstrap/#/datepicker) にあります。

## 一つの要素で

上記の例ではポップアップを出す要素とクリックする要素が分かれていますが、一つの要素に統合することもできます。

![Screen Shot 2014-12-06 at 4.49.43 PM.png](https://qiita-image-store.s3.amazonaws.com/0/3732/448bfbb2-e45b-3de1-43dc-f7271d7974b7.png "Screen Shot 2014-12-06 at 4.49.43 PM.png")


```html
<div ng-controller="DatePickerController">
  <button type="text"
          class="btn btn-default"
          ng-model="date"
          datepicker-popup
          is-open="datePickerOpen"
          ng-click="toggleDatePicker($event)">
    {{date | date : 'yyyy年MM月dd日'}}
  </button>
</div>
```

`ng-model` って任意の要素に追加できるんですね。

## スタイリング

ポップアップには `datepicker-popup-wrap` という属性がついているので、それを使うのが良さそうです。

例えば・・・

```css
[datepicker-popup-wrap] {
  padding: 10px;
}
```
Leiningen REPLを再起動せずにリフレッシュする

Clojureで開発するときにはREPLが重要、というか開発ライフサイクルの一部となるので、常にREPLを立ち上げた状態でファイルを編集して開発していきます。

ただ、ファイル編集するたびにREPLを再起動するのはあまりにも辛いので、再起動せずに編集内容を反映させる方法をまとめておきたいと思います。

# namespaceをreloadする
一番シンプルな方法は編集したファイルのnamespaceを指定して再読み込みすることです。

#### 利用方法
namespaceを再読み込みするときは以下のようにREPL内でコマンドを実行します。

````clj:
my-app.repl=> (use 'my-app.edited.namespace :reload)
nil
````

# [tools.namespace](https://github.com/clojure/tools.namespace)を使う
namespaceを直接reloadする方法でも良いのですが、これだと指定したnamespaceしかreload出来ないので複数のnamespaceに跨る編集を行っている場合はreload済とまだのものが混ざってしまうことが問題になります。

tools.namespaceというライブラリを使うとそこが解決され、プロジェクト内にあるクラスファイルすべてを一度に再読み込みしてくれます。

#### インストール
まずproject.cljの:dependenciesセクションに以下を追加して下さい。

````clj:project.clj
  :dependencies [[org.clojure/tools.namespace "0.2.7"]]
````

その後、依存関係を解決するため以下のコマンドを実行します。

````
$ lein deps
````

#### 利用方法
プロジェクト内のすべてのnamespaceを再読み込みするときは以下のようにREPL内でコマンドを実行します。

````clj:
; refreshコマンドを読み込んで、実行可能にする
my-app.repl=> (use '[clojure.tools.namespace.repl :only (refresh)]) 
nil
my-app.repl=> (refresh) ; すべてのnamespaceを再読み込み
:reloading (...) ; ()の中に読み込まれているnamespaceが表示される
:ok
````

# おわりに
快適なREPL駆動開発を！
Safari機能拡張作成の前準備


# Safari機能拡張を作成するために

下記準備が必要なので、設定します。

1. AppleIDの登録
2. Safari Developer Programへの登録
3. 機能拡張を作成するために必要な証明書をもらうための、認証局要求書用のファイルを作成
4. Appleからの証明書をインストール

なんともまぁめんどくさいですねぇ。

## AppleIDの登録 & Safari Developer Programへ登録

[Safari Developer Program](http://developer.apple.com/programs/safari/)へ行って登録しましょう。

[Join now]を押せばいいはず。

AppleIDを持ってない人はここで登録しておきましょう。

いろいろ入力していって、「Activation complete」が出てきたら終了。

## 認証局要求書用のファイルを作成

とりあえずMac主体で説明します。
多分、他のOSの人はSafariとか使わんでしょ。。。

Macでキーチェーンアクセスを起動します。
(Ctrl+SpaceでSpotlight検索を開いて、「キーチェーンアクセス」と入力するとすぐ開けます)

メニューバー >> キーチェーンアクセス >> 証明書アシスタント >> 認証局に証明書を要求を選ぶとなんか画面が開きます。

開いた画面で下記を入力しましょう。

* ユーザのメールアドレス：自分のメールアドレス
* 通称：自分の名前
* 要求の処理：「ディスクに保存」にチェック

「続ける」を押すと、保存先を聞かれるので適当に保存。

## 証明書をインストール

[Safari Certifivation のページ](https://developer.apple.com/account/safari/certificate/overview.action)に行って、「Certificates」を押しましょう。

「About Creating a Certificate Signing Request (CSR)」画面で「Continue」を押すと
「Generate your certificate.」画面が出てくるので、先ほど保存したファイルを選択して「Generate」を押しましょう。

作成し終わったら、証明書をダウンロードしましょう。

ダウンロードした証明書を実行してインストールできれば、
無事Safari機能拡張を作成できるようになります。

機能拡張の作成についてはまた後日。
【備忘録】TortoiseSVNでログメッセージを強要する方法

# tortoiseSVNでコミットメッセージを強制する方法

そのままのtortoiseSVNでは空メッセージでのコミットが許可されているのでプロパティを設定することでメッセージを入れることを強制できる

##手順
1. チェックアウトしたフォルダを右クリック
2. TortoiseSVN > プロパティ
3. 新規 > ログサイズ
4. コミットメッセージに入力する最小文字数 0 > 1以上の任意の数字

これで設定した数値以上のコミットメッセージを書かないとコミットできなくなる。

個人としては2以上をお勧めしたい
IPythonとpryのコマンド対応表

[IPython](http://ipython.org/)、[pry](http://pryrepl.org/)でよく使いそうなコマンドの対応表。

IPythonがpryのコマンドと同じaliasを持っている場合が多いのでなるべく揃えている。

|                       | IPython                   | pry               |
|:----------------------|:--------------------------|:------------------|
| ヘルプ                 | ?                         |help               |
| オブジェクトのヘルプ     | ? object                   |? object, ri object |
| ソースコードの表示       | ?? object, psource object | $ object          |
| ソースコードの編集・実行  | edit [object]             | edit [object]     |
| ファイルの読み込み・実行  | run example.py            | play example.rb   |
| 履歴の表示              | hist                      | hist              |
| システムコマンドの実行    | !command [args]           | .command [args]   |
iso,imgを移動したらKVMで仮想マシンが起動しなくなったときの対処法

## 背景
[仮想マシン構築](http://centossrv.com/kvm.shtml) を元にKVMで仮想マシンを構築した．
isoファイルやimgファイルは上記サイトに習い `/var/lib/libvirt/images` に格納していた．
`/` 以下の容量が逼迫してきたので，isoファイルやimgファイルを `/home/user/kvm` に移動したところ，
仮想マシンを起動できなくなった．

## 問題
下記のコマンドで仮想マシンの作成と起動を試みる．

```
$ virt-install \
  --name CentOS6.5 \
  --ram 1024 \
  --vcpus=1 \
  --file=/home/user/kvm/CentOS6.5.img \
  --file-size=10 \
  --cdrom=/home/user/kvm/CentOS-6.5-x86_64-LiveDVD.iso \
  --os-variant=rhel6 \
  --network bridge=br0 \
  --accelerate \
  --graphics spice,listen=0.0.0.0 --channel spicevmc \
  --video qxl \
  --autostart \
  --noreboot
```

結果，下記のエラーメッセージが表示された．仮想マシンは起動せず．

```
Starting install...
Creating storage file CentOS6.5.img                      |  10 GB     00:00     
ERROR    internal error Process exited while reading console log output: char device redirected to /dev/pts/1
kvm_create_vm: Device or resource busy
failed to initialize KVM: Operation not permitted
No accelerator found!

Domain installation does not appear to have been successful.
If it was, you can restart your domain by running:
  virsh --connect qemu:///system start CentOS6.5
otherwise, please restart your installation.
```

## 原因と解決策
所有者やらパーミッションやらの問題の様子．

ディレクトリのパーミッションを確認．

```
$ ls -l /home/user
drwx------. 43 user user  4096 12月  6 15:16 2014 kvm
```

別途ディレクトリを作成し，所有者をqemu:qemuに変更．

```
$ mkdir /home/kvm
$ chown -R qemu:qemu kvm
```

isoファイルやimgファイルを作成したディレクトリへ移動．

```
$ mv /home/user/kvm/* /home/qemu/
```

パスを書き換えて再度 `virt-install` コマンドを実行したところ，仮想マシンが問題なく起動した．
VNC経由でリモートサーバ上のVMwareの仮想マシンにアクセスした際にキーマップがおかしくなる問題の対処法

## 概要
サーバにCentOSをインストールし，リモートからVNC経由でアクセスして使用しています．
今回サーバ上にVMwareをインストールし，VMware上でWindows 7の仮想マシンを動かしました．
その際，Windows 7のキー入力がおかしくなったので，そのときの対処方法を記します．

## 環境
- ローカルマシン（Ubuntu 14.04）
	- VNCクライアントにRemminaを使用
	- 日本語キーボード（106）を使用
- サーバ（CentOS 6.6）
	- VNCサーバにTigerVNCを使用
	- VMware player 6.0.4を使用
	- VMware上でWindows 7の仮想マシンを稼働

ローカルマシンからVNC経由でサーバにアクセスし，そこからVMware上のWindows 7を触っています．

## 問題
仮想マシンのWindows 7上で記号を正しく入力できない．

```
!"#$%&'()~-^\@[;:],./_=~|`{+*}<>?\
```

と入力したはずが

```
!*#$%'*   -6]]2@;;[,./-~ } `~({>?}
```

となる．

vmxファイルに `RemoteDisplay.vmc.keymap = jp` を追記するも改善されず．

## 調査と原因
`xev` コマンドで確認する．

ローカルのマシンで`^`キーを入力したときの挙動は以下の通り．

```
KeyPress event, serial 37, synthetic NO, window 0x4e00001,
    root 0x91, subw 0x0, time 7963289, (-705,523), root:(883,575),
    state 0x0, keycode 21 (keysym 0x5e, asciicircum), same_screen YES,
    XLookupString gives 1 bytes: (5e) "^"
    XmbLookupString gives 1 bytes: (5e) "^"
    XFilterEvent returns: False

KeyRelease event, serial 37, synthetic NO, window 0x4e00001,
    root 0x91, subw 0x0, time 7963385, (-705,523), root:(883,575),
    state 0x0, keycode 21 (keysym 0x5e, asciicircum), same_screen YES,
    XLookupString gives 1 bytes: (5e) "^"
    XFilterEvent returns: False
```

同じく，VNC経由でサーバ（CentOS）にログインして`^`キーを入力した時の挙動は以下の通り．

```
KeyPress event, serial 33, synthetic NO, window 0x4000001,
    root 0xdc, subw 0x0, time 316499652, (170,414), root:(243,495),
    state 0x0, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 33, synthetic NO, window 0x4000001,
    root 0xdc, subw 0x0, time 316499652, (170,414), root:(243,495),
    state 0x1, keycode 15 (keysym 0x5e, asciicircum), same_screen YES,
    XLookupString gives 1 bytes: (5e) "^"
    XmbLookupString gives 1 bytes: (5e) "^"
    XFilterEvent returns: False

KeyRelease event, serial 33, synthetic NO, window 0x4000001,
    root 0xdc, subw 0x0, time 316499652, (170,414), root:(243,495),
    state 0x1, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 33, synthetic NO, window 0x4000001,
    root 0xdc, subw 0x0, time 316499787, (170,414), root:(243,495),
    state 0x0, keycode 15 (keysym 0x36, 6), same_screen YES,
    XLookupString gives 1 bytes: (36) "6"
    XFilterEvent returns: False
```

どうやら間に挟んだVNCの通信でキー入力が変換されている様子．

## 対処方法
間にVNCを挟まず，直接仮想マシンのWindows7にアクセスすることにする．

### VMwareのVNC接続を有効にする
1. VMware Playerを起動
2. 仮想マシンを選択し Edit virtual machine settings を選択
3. Option の VNC Connectionsを選択して Enable VNC Connectionsをチェック．
PortとPasswordを入力．

### サーバのiptablesを編集
VNCの通信が通るようにする．

1. `vi /etc/sysconfig/iptables` で編集
2. 下記を追記

```
-A INPUT -p tcp -m state --state NEW -m tcp --dport 5902 -j ACCEPT 
-A INPUT -p udp -m state --state NEW -m udp --dport 5902 -j ACCEPT
```

### ローカルから接続
Remminaを使って接続する．
サーバー欄は ホスト名:(Port-5900) と入力（今回の例なら ホスト名:2 ）
仮想マシンにアクセスできることを確認．
記号文字を入力し，正しく入力できることを確認．