OmniAICreator/Qiita-1.07M huggingface dataset:
[elasticsearch2.0] Pipeline Aggregationを試す -Bucket Script Aggregation

###テーマ
**「期間Aと期間Bで単語の出現頻度の差を算出する」**

* if-idf的なことをやるためのお試しといった感じです
* 出現頻度：その単語を含む記事数

###方針
1. terms aggregation　→　単語毎の出現頻度を数える
2. filter aggregation　→　期間Aと期間Bに分割
3. **bucket script aggregation**　→　期間Aと期間Bを比較

###設定

```yaml:elasticsearch.yml
script.engine.groovy.inline.aggs: on
```

###query

```json:bucket-script-agg.json
GET _search?search_type=count
{
  "query": {
    "match_all": {}
  },
  "aggs": { // 1.terms aggregation
    "term": {
      "terms": {
        "field": "text",
        "size": 5
      },
      "aggs": { // 2.filter aggregation
        "dateRange1": { // 期間A
          "filter": {
            "range": {
              "datetime": {
                "gte": "2014-04-01T00:00:00+0900",
                "lte": "2014-04-10T23:59:59+0900"
              }
            }
          }
        },
        "dateRange2": { // 期間B
          "filter": {
            "range": {
              "datetime": {
                "gte": "2014-04-11T00:00:00+0900",
                "lte": "2014-04-20T23:59:59+0900"
              }
            }
          }
        },
        "tf-idf": { // 語弊あり
          "bucket_script": { // 3.bucket script aggregation
            "buckets_path": {
              "range1": "dateRange1._count", //doc_countを取り出す
              "range2": "dateRange2._count"
            },
            "script": "range2 - range1" //簡単なscript
          }
        }
      }
    }
  }
}
```

###結果

```json:response.json
{
  "took": 133,
  "timed_out": false,
  "_shards": {
    "total": 7,
    "successful": 7,
    "failed": 0
  },
  "hits": {
    "total": 48762,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "term": {
      "doc_count_error_upper_bound": 6688,
      "sum_other_doc_count": 904138,
      "buckets": [
        {
          "key": "い", // term(analyzerの設定が適当なので変な感じ)
          "doc_count": 23490, // hits全体での件数
          "dateRange2": {
            "doc_count": 7642 // 期間Aでの件数
          },
          "dateRange1": {
            "doc_count": 8270　// 期間Bでの件数
          },
          "if-idf": {
            "value": -628 // 期間B - 期間A の結果
          }
        }
...
      ]
    }
  }
}

```

###まとめと感想
* かなり柔軟に処理を書けそう
* scriptで扱うbucketの数が特定できないと使えないような気が
* bucketからドキュメント件数を取り出すには`{backet_path}._count`を使う
* ひとまず思ったとおりのことができた
* bucketを任意の条件でfilterするaggregationの構想もあるらしいので期待
    * (20151112追記) bucket selector aggregationと言うのがそれらしい
* Senseが超便利


###課題
* 期間Aと期間Bそれぞれの全ドキュメント数で正規化するような処理を入れたい
* terms aggregationとfilter aggregationの順序を逆に出来るだろうか

###参考
* https://www.elastic.co/guide/en/elasticsearch/reference/master/search-aggregations-pipeline-bucket-script-aggregation.html
* https://www.elastic.co/blog/out-of-this-world-aggregations
AngularJSの$timeoutを引数無しで実行した時の挙動

AngularJSで以下のコードに遭遇する時がたまにある。

```js
$scope.data = resultData;

$timeout(function() {
  // 何かDOMを弄ぶ処理
  $('.test').addClass('xxx');
});
```

$timeoutって秒数を指定して遅延させる処理なんじゃないの？
何で引数なしに使っているのか、$timeout無しでもいいんじゃないのか。

AngularJSの$timeoutサービスはwindow.setTimeoutのラッパーなので、
上記の書き方は`setTimeout(Function, 0)`に等しいです。

上記の理由は以下のサイトの説明がわかりやすかったです。
遅延実行 | JavaScript プログラミング解説 
http://so-zou.jp/web-app/tech/programming/javascript/window/delay.htm

![スクリーンショット 2015-11-11 17.35.15.png](https://qiita-image-store.s3.amazonaws.com/0/33823/97878e54-a6d3-e5ae-745e-1b765cafc675.png)

つまりは<strong>イベント発火時の関数(イベントハンドラ)やDOMの状態の更新が終了</strong>してからsetTimeout内にセットした関数が呼び出されるということ。0秒はドキュメントの状態が整ってからからなるべく早く実行するよーという意味。

0秒を指定してもその処理が実際に行われるのは平均0.4秒くらいかかるらしいです。
だからなるべく早くの意味で0秒を指定するらしい。

AngularJSではサービスから受け取った内容をスコープに保存してその結果をビューに表示するということが基本ですが、
最初に挙げた例では、そのスコープ結果のDOMにJQueryでClassを追加しており、ドキュメントの状態が整ってからでないとエラーになるんですね。だからこのように書きます。ハックですね。。

もちろん、明示的にもっと遅くしたい時は1000を指定したりは自由に出来ます。
ShinobiLayer: TCO CalculatorによるSoftLayerの価格見積もり

#はじめに
SoftLayerでは、価格を見積もる方法として、今まで
1) Customer Portal(https://control.softlayer.com )にログインして見積もる
2) Store Front(https://store.softlayer.com/configure )を使って見積もる
などの方法がありました。
ただし、これは１つ１つのサーバーを見積もる際にしか使えません。例えばオブジェクトストレージはxxxGB使って、転送量はxxxだけで・・・となると、また別のページから検索しないといけなかったですし、そのための情報を収集するのにも一苦労でした。なんといっても、折角見積もった情報を保管して、後から再利用することもできなかったのです・・・。
今回新たにSoftLayerから提供されるTCO Calculator(http://www.softlayer.com/tco/ )はこういった課題を解決してくれるWebツールです。早速次項から見てみましょう。

※ただし、この見積もりツールは完全にSoftLayer内部の価格情報と同期されている訳ではなさそうです。もし見積もりツールとCustomer Portalの価格が食い違っていた場合は、後者の内容が優先されると思われます。

#TCOツールのトップ画面
http://www.softlayer.com/tco/ からアクセスしてみましょう。
![TCO_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/e1456962-6955-f038-4986-c82b15a4b769.jpeg)

* No present data.<br>これは、一から新規に見積もる時に利用します。多くの人はまずここから選択すると良いでしょう。
* Load a sample configuration that you can adjust to your requirements.<br>これは、サンプルの構成を使って見積もる時に利用します。テンプレートとして、以下のものが選択できるようです。<br>![TCO_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/c640617f-ef7c-0ad6-3a4e-fe413417a7eb.jpeg)
* Restore saved input.<br>こちらは、既存の見積もりを復元して、見積もり値を確認する際などに利用します。

#イチから見積もってみる
全く最初から見積もる場合は、上記画面にて**No present data**を選択し、**Launch CALCULATOR**を押下すると、以下のような画面が出てきます。
![TCO_03.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/3c873f19-9c82-a804-42f0-66555fbd7058.jpeg)

この画面から、サーバーやストレージやネットワークオプション（Load BalancerやFirewallなど）の費用を見積もることが可能です。例えば、仮想サーバーの計算をしたい場合は、左のパネルから**Servers**を選択したあと、中央のパネルで**Add a Virtual Server**のタブを選択します。そうすると以下のような画面が現れるので、各種オプションを選択して下さい（例えば、hourlyなのかmonthlyなのか、OSはWindowsなのかLinuxなのか、等）。全て選択した後に、画面赤字の**ADD Server**を選択すれば、リストに追加されます。
![TCO_04_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/75185253-f7ae-c7b2-98f2-d57783e40cb9.jpeg)

もしかしたらオプションの中に分からないものがあるかもしれませんが、その際には画面右上の**Live Chat**を選択してみて下さい。ここでSoftLayerのセールスチームからの支援が得られると思います。

このようにして、物理サーバもストレージもネットワーク関連サービスも追加していくことで、複数のアイテムにまたがった見積もりが可能になります。
![TCO_04_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/9ec38967-2edd-847f-f2ba-a909249ef4ab.jpeg)

なお、再編集したい場合は、Dropbox上のActionから、Editボタンを選択すれば良さそうです。
![TCO_04_5.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/bb49f79f-dc2c-29ba-8df8-4644dea0b60d.jpeg)

#Cost総額を確認する
左側のパネルから、Cost Summaryを選択することで確認が可能です。
![TCO_06.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/68257728-e92b-e061-8779-d280299e7187.jpeg)

#見積もり内容をpdfに出力したり保管する
見積もりをpdf形式で出力したい場合は、**Snapshots**を選択します。一方、見積もり情報を保管したい場合は、**Save your input**を選択します（なんか若干バグがある気がしないでもないけど・・・）。
![TCO_04_4.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/554600aa-a2eb-48d0-5869-56da1d8ba930.jpeg)

#オンプレミス環境との価格費概算を確認する
左側のパネルから、**Compare cost models**を選択することで、オンプレミスとの価格概算を比較し、どういう対費用高価が得られるかを確認することができます。
![TCO_07.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/0070bf3f-d6ef-0358-3df1-851f8aa95360.jpeg)
Macで複数の画像を結合させて１枚の画像に変換する方法

[GIFアニメをCSS3のanimation-timing-functionに置き換えて容量を削ろう](http://qiita.com/narikei/items/d71cc6df60a6df66ab35)の記事で画像を作る際に一枚一枚手でくっつけてたんじゃ時間かかるので、一瞬で済ますコマンド

## ImageMagickをHomeBrewでインストール

```bash
$ brew install imagemagick
$ convert -version
Version: ImageMagick 6.9.2-4 Q16 x86_64 2015-10-11 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC Modules 
Delegates (built-in): bzlib freetype jng jpeg ltdl lzma png tiff xml zlib
```

## 画像を結合させる

例えばこの５つの画像ファイルの場合

- 001.jpg
- 002.jpg
- 003.jpg
- 004.jpg
- 005.jpg

```bash:縦に結合
$ convert -append 001.jpg 002.jpg 003.jpg 004.jpg 005.jpg output.jpg
```

```bash:横に結合
$ convert +append 001.jpg 002.jpg 003.jpg 004.jpg 005.jpg output.jpg
```
GoでAWSのS3からファイルをダウンロードする

# 最初に
AWS SDK for Go使います。
持ってない人は[こちら](https://github.com/aws/aws-sdk-go/wiki/Getting-Started-Using-the-SDK)

Goを使ってのAWS S3からのダウンロード記事をさっぱり見ない。アップロードの記事はちらほら見かけるのに...

# やりたいこと
AWSのS3から何かのファイルをひとつダウンロードするよ。
SDKのS3Managerパッケージを使うとダウンロードが簡単に出来るらしい。

# コード
長くなった...

```lang:main.go
package main

import (
	"fmt"
	"os"
	"path/filepath"
	"strings"

	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/defaults"
	"github.com/aws/aws-sdk-go/service/s3"
	"github.com/aws/aws-sdk-go/service/s3/s3manager"
)

//ダウンロードするオブジェクトの構造体
type downloader struct {
	*s3manager.Downloader
	bucket string
	file   string
	dir    string
}

func main() {
	ACCESSKEY_ID := "AWSのアクセスキーID"
	SECLET_ACCESSKEY := "AWSのシークレットアクセスキー"
	REGION := "AWSアカウントのリージョン情報"

	//AWSの認証情報を設定
	defaults.DefaultConfig.Credentials = credentials.NewStaticCredentials(ACCESSKEY_ID, SECLET_ACCESSKEY, "")
	defaults.DefaultConfig.Region = &REGION

	bucketName := "バケット名"
	key := "ファイル名"
	localDir := "ダウンロード保存先のローカルパス"

	//S3に接続してダウンロード
	if err := Download(bucketName, key, localDir); err != nil {
		fmt.Printf("ダウンロード失敗！！　%s", err)
	}

}

func Download(bucketName string, key string, dir string) error {
	client := s3.New(nil)

	params := &s3.ListObjectsInput{Bucket: &bucketName, Prefix: &key}

	//respにはkeyに部分一致したS3の全てのオブジェクトが入る
	resp, connectErr := client.ListObjects(params)
	if connectErr != nil {
		return connectErr
	}

	//respの中身にダウンロードするファイルがあるのかをチェック
	if !exists(key, resp) {
		return fmt.Errorf("バケット内にダウンロードするファイルが存在しない")
	}

	manager := s3manager.NewDownloader(nil)
	d := downloader{bucket: bucketName, file: key, dir: dir, Downloader: manager}
	if file, err := d.downlowdFile(key); err != nil {
		if err := os.Remove(file); err != nil {
			fmt.Println(err)
		}
		return err
	}
	return nil
}

func exists(downloadFile string, resp *s3.ListObjectsOutput) bool {
	for _, content := range resp.Contents {
		if *content.Key == downloadFile {
			return true
		}
	}
	return false
}

func (d *downloader) downlowdFile(key string) (string, error) {
	buffKeys := strings.Split(key, "/")

	fileName := buffKeys[len(buffKeys)-1]
	file := filepath.Join(d.dir, fileName)

	//ダウンロード保存先に、ダウンロード用のファイルを作成
	fs, err := os.Create(file)
	if err != nil {
		return file, err
	}
	defer fs.Close()

	fmt.Printf("ダウンロード中.. s3://%s/%s to %s...\n", d.bucket, key, file)
	params := &s3.GetObjectInput{Bucket: &d.bucket, Key: &key}

	//実際にダウンロードが行われるのはこのDownload関数
	if _, err := d.Download(fs, params); err != nil {
		return file, err
	}

	fmt.Printf("ダウンロード完了！ %s", file)

	return file, nil
}

```

AWSの認証情報を設定している部分は、SDKのdefaultパッケージとcredentials
パッケージを使ってハードコーディングしてます。
でも、あまり推奨されない方法なので環境変数を設定するか、専用の認証ファイルを作成するのが普通みたいです。([ここ](https://github.com/aws/aws-sdk-go/wiki/Getting-Started-Credentials)に書いてあった)

実際にダウンロードを行うd.Downloadは、SDKの*s3manager.Downloaderの関数です。
ソースコードを見た感じだと、先にローカルの保存先にファイルを作成してから、そのファイルポインタを渡して内容を書き込んでるように見えます。違ったらごめんなさい。

# 終わり
コードに無駄な部分があるかもしれないけど、とりあえず動いたから良し。
関数の引数で型のチェックを済ませる

# 前提
PHPは他の言語より型のチェックが甘いと言われてきたが、
少しずつ厳格になる動きをここ最近感じています。
PHP7からは関数の引数でも様々な型をチェックできるようなるみたいです。

【PHPドキュメント】
http://php.net/manual/ja/functions.arguments.php#functions.arguments.type-declaration.types

厳格にした方が思わぬ動作を減らせるので、もちろん良いことだと思います。
今回はPHP5でも似たようなことができないか考えてみます。

PHP5でクラス名、self、配列とcallable(関数)のみですね。
intやboolなどは使えないため、関数の中で引数を漏れ無くチェックする必要があります。

今回は引数にクラス名を指定する方法を利用して、型のチェックをやってくれるクラスを
組んでみました。時には厳格過ぎない指定が出来た方がスムーズに進行することが多いので、
型のチェックだけではなく、簡単な型変換も含めています。自分が使いやすくしているだけなので
プロジェクトで使いたい方は一度プログラムを検証してくださいね。

# ダウンロード
Gitにアップしておきましたので、興味のある方はどうぞ。
https://github.com/web-picker/Strict-Value

# 使い方
```lang:sample.php
<?php 

require_once("Strict_Value.php");

class Sample {

	public function calculate( Int $a, Int $b )
	{

		if( $a->is_valid() && $b->is_valid() )
		{
			echo $a->get() + $b->get();
		}

	}

}

$a = new Int();
$b = new Int();

$a->set("100");
$b->set("100");

$sample = new Sample();
$sample->calculate( $a, $b );

// result 200
```

ちょっとめんどくさい気もしますが、一応こんな感じです。
is_validメソッドで値の型が正しいかどうかをチェックし、
正しい場合はgetメソッドで取得できます。

setメソッドで値を設定した際に型のチェックが行われます。
もし型に問題があった場合は、エラーを発生させています。
エラーを発生させたくない場合は、STRICT_VALUE_DEBUG定数をFALSEにして下さいね。
定数の指定は、クラスファイルを読み込む前にしないといけません。

Gitに上がっているtest.phpに型のテストが載っていますので、
どのようにチェックを都合良くしているのかは使う前にご確認下さい。

あくまでも私の都合で作っているので、一般的に便利ではないのかも・・・

何かありましたらコメント下さい〜
はじめに

はじめに

自身はプログラミングのプの字も知らない超初心者。
手始めに1年掛けてjava言語を学び、今ではマトラボ言語を習得中。
とはいえ、自分で実装していても納得をしていないし課題ばかりが溜まり続けている。

（自分の重い課題）
 - 責務をいつまでたっても分割できない
 - 上記のためにちょっとした改修でさえ困難
 - 人にお見せできるコードじゃない（苦）

仕事にならないんですよ。
自分でさえあきれてしまうほど・・・。

ということで、今までノートに取ろうとして何度も挫折していた知識をこういった形に切り替えてみます。

目的は以下の通り。

　①　知識・ノウハウの貯蔵
　②　問題の共有
　③　解決策の取得

これからこちらの方で活動してみます。

end
シェルでドットの入ったファイル名を変換

ファイル名にドットを入れるなんて、と思っていたけど入っていた事例があり(なぜ入っていたかは謎)、そのファイルがCakePHPのバージョンを1.3から2系にあげるにあたり、プラグイン記法(http://book.cakephp.org/2.0/ja/appendices/glossary.html#term-2) にひっかかったため、変更をする.
対象ファイルはメールのテンプレートファイル.

```bash
$ ls
hoge.foo.bar.tpl

全ファイルの拡張子を除去

$ for f in `ls`; do mv $f ${f/\.tpl/}; done
$ ls
hoge.foo.bar

ファイル名のドットをアンダースコアに変換

$ for f in `ls`; do mv $f ${f/\./_}; done
$ ls
hoge_foo.bar

$ for f in `ls`; do mv $f ${f/\./_}; done
$ ls
hoge_foo_bar

拡張子.tplをつける

$ find . -type f -exec mv '{}' '{}.tpl' \;
$ ls
hoge_foo_bar.tpl
```

もっといい方法があるかもしれないが一番シンプルで分かりやすかった
WPFでMXComponentを使う時のメモ

MX ComponentをWPFで使う時のメモ。
書いておきながら、マニアックな問題と思う。一言でまとめるなら、COM参照すれば良い。
下記の方法は、ActProgTypeを採用する。ActUtlTypeを使いたいときは適宜変えていってください。

# WPFでMX Componentを使う手順
1. COM参照にActProgTypeを追加する。
2. ModelでImports ActProgTypeする。
3. ModelでActProgTypeのオブジェクトを生成する。

これだけ
## COM参照にActProgTypeを追加する
![参照.png](https://qiita-image-store.s3.amazonaws.com/0/48960/b8de038d-e2f5-b63f-08d6-02fc445133f5.png)

上記をクリックし、

![参照2.png](https://qiita-image-store.s3.amazonaws.com/0/48960/3ec9a52e-c1c1-0ae0-a607-7019298b06b8.png)

「MITSUBISHI Act」で検索し、
ActProgType(ActUtlTypeの時はActUtlType)にチェックを入れ、OKを押す。

## ModelでImports ActProgTypeする
ファイルの文頭に

```vbnet
Imports ActProgTypeLib
```

を、入れる。

## ModelでActProgTypeのオブジェクトを生成する
あとは、適当な場所で生成すれば良い。
ここでは、コンストラクタで生成する。

```vbnet
Private _actProgType As ActProgType

Public Sub New()
  _actProgType = New ActProgType
  _actProgType.ActUnitType = &H30S
End Sub
```

ちなみに、&H30SはGX Simulatorと通信する時の値。

後は適当にバインディングすれば良い。

# 参考文献
[MX Component v4을 이용하여 C# 프로그램 만들기. ](http://orangetazo.tistory.com/19)
MQTT～sango編～

MQTTブローカー：[sango](https://sango.shiguredo.jp/)（無料プラン）
MQTTクライアント：MQTTlens（Chromeアプリ）
※2台のPC（Chrome）を用意し、それぞれPublisherとSubscriberとして利用

sangoにアカウント登録すると接続先の情報が確認できるようになる。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/30557/fcc0e256-52bd-3f85-dfeb-7807122f086c.png)

MQTTlensの設定（PublisherとSubscriberで違いは無い）
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/30557/60a2c50d-fc11-24e3-34cd-21b92f29bdce.png)

Subscriber側PCの設定
Topicはsangoで確認できる情報を設定する
「Githubアカウント/#」になってるはず
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/30557/2789827f-9f9b-e53d-edfa-1a11ae2a3a36.png)

Publisher側PCの設定
Topicには「Githubアカウント/test」みたいな感じで適当に設定
Messageに任意の内容を記述してPublishする
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/30557/57690345-73d4-83cc-1d86-8484f04c6d9f.png)

Subscriber側でメッセージが表示される！
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/30557/6abc5845-8244-5a4e-1c58-272ef037d5f9.png)
spree3.0 インストールメモ

「Spree is dead.」
なんて言われてますが、railsでECならSpreeかなということでインストールしてみました。
https://github.com/spree/spree

### 環境
Ruby 2.2.2
Rails 4.2.4

### spree3.0のstableのインストール
```gem 'spree', github: 'spree/spree', branch: '3-0-stable'```
```bundle install```

インストールジェネレータを設定
```rails g spree:install --sample=false --seed=false```

以下のエラーが出た
>rescue in spec': Specified 'mysql2' for database adapter, but the gem is not loaded. Add `gem 'mysql2'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord). (Gem::LoadError)

DBの作成して再度実行
```rake db:create```
```rails g spree:install --sample=false --seed=false```

>Spree has been installed successfully. You're all ready to go!
>Enjoy!



そして次のコマンドを実行
```bundle exec rake railties:install:migrations```
```bundle exec rake db:migrate```
```bundle exec rake db:seed```
```bundle exec rake spree_sample:load```

### サーバ立ち上げ
```rails s```
ブラウザで次のURLを確認 http://localhost:3000
![スクリーンショット 2015-11-11 12.35.12.png](https://qiita-image-store.s3.amazonaws.com/0/40699/72f60d91-a4b8-1d8a-7e61-3ddc468701ab.png)

### 認証機能を追加
```gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: '3-0-stable'```
```bundle install```
```bundle exec rake spree_auth:install:migrations```
```bundle exec rake db:migrate```

```config/initializers/spree.rbを編集
Spree.user_class = 'Spree::LegacyUser'
から
Spree.user_class = 'Spree::User'
へ
```

```bundle exec rake spree_auth:admin:create```
とりあえず初期設定でadminユーザを作成
>Create the admin user (press enter for defaults).
Email [spree@example.com]: 
Password [spree123]: 
Done!
Done!


### 管理画面
ブラウザで次のURLを確認 http://localhost:3000/admin
<img width="685" alt="スクリーンショット 2015-11-11 12.55.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/40699/e25d5823-062f-385f-88b7-43fd8d9f273e.png">
先ほどのadminユーザでログイン
<img width="1296" alt="スクリーンショット 2015-11-11 12.56.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/40699/a8e1880e-4665-80be-d3fc-29320b478212.png">
管理画面が確認できた。

### 国際化対応
```gem 'spree_i18n', github: 'spree-contrib/spree_i18n', branch: '3-0-stable'```
```bundle install```
```rails g spree_i18n:install```

Adminユーザで再度ログインすると
[CONFIGURATIONS]-[General Settings]-[Localization Settings]
が増えている。
[AVAILABLE LOCALES]に”日本語(ja~JP)(ja)“を追加してUpdate

その後、再度[Localization Settings]を開き、[SUPPORTED LOCALES]に
”日本語(ja~JP)(ja)“を追加してもう一度Update

```application.rbに以下を追加
config.i18n.default_locale = :ja
```
そしてRailsを再起動
```rails s```

ちなみに英語と日本語の２つに対応したかったので、この方法です。
日本語だけでいい方は、[SUPPORTED LOCALES]を日本語だけにすると良いと思います.

こんな感じで右上にロケールを選択できるプルダウンができました。
<img width="1205" alt="スクリーンショット 2015-11-11 16.37.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/40699/7ccfea5c-0a09-f78e-340f-a52c9285f41c.png">

アパッチ野球ジャージ(笑
ScaleWay で部分的なネットワーク障害があったみたいです

今日、11月11日の朝11時頃(1が続きますね)、scaleway で動かしているサービスが突然反応しなくなり、ping も通らない状態に
Dashbord を見ると Server は普通に動いているみたいなんだけど、console ボタンを押しても connecting ... のまま
hard reboot をしても現象かわらず

support に URGENT で issue を挙げる
関係ない（事も実はないのかもしれない）けど communitiy サイトもつながらない

昼の1時前にサポートから「ネットワーク障害かもしれない」との連絡が
昼の4時頃に「部分的なネットワーク障害だった。治したよ、ごめんね」との連絡、見てみると治ってました。ああよかった
たまたま同じ目にあわれた方がいらっしゃいましたら、もう治ってるみたいですよ
iOSアプリ等でwebviewを表示する際に、拡大はするがユーザーがピンチで拡大や、スクロールができないようにする。

iphoneアプリ等で、webviewを部分的に表示する際に、
そのwebviewのサイズにフィットさせてhtmlを表示したい場合。

かつ、ピンチイン・アウトでhtmlを拡縮したりスクロール**できない**ようにしたい場合。

## アプリ側

```
_webView.scalesPageToFit = YES;
```

webview側に**scalesPageToFit**で自動フィット＆ピンチイン・アウト等が可能に。


## 次にhtml側

```html
<html>
<head>
<meta name='viewport' content='width=device-width,user-scalable=no' />
</head>
<body>
```

**user-scalable=no**でユーザーの操作を受け付けないようにする！！

以上。
参考になれば幸いです！
JAVA SimpleDateFormat

#独自に書式を指定して「2015年11月11日16時」の様な文字列を生成したい場合は、**java.text.SimpleDateFormatクラス**を使います。
<FONT color="#ff0000">■DateからStringを生成する</font>
**Date now = new Date();
SimpleDateFormat f = new SimpleDateFormat(書式文字列);
String s = f.format(now);**

<FONT color="#ff0000">■StringからDateを生成する</font>
**SimpleDateFormat f = new SimpleDateFormat(書式文字列);
Date nnn = f.parse(文字列);**

```java
■例①
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test03 {
	public static void main(String[] args) throws ParseException {
		Date now = new Date();
		SimpleDateFormat f = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		String s = f.format(now);
		System.out.println(s);

		SimpleDateFormat aa = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒");
		String bb = aa.format(now);
		System.out.println(bb);

		Date nnn = f.parse("2007/05/21 16:20:26");
		System.out.println(nnn);

		SimpleDateFormat xx = new SimpleDateFormat("MM月dd日");
		String yy = xx.format(now);
		System.out.println(yy);
	}

}

■例①実行結果
2015/11/11 16:42:10
2015年11月11日 16時42分10秒
Mon May 21 16:20:26 JST 2007
11月11日
```
詳しく＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿

```java
■StringからDateを生成する
		Date nnn = f.parse("2007/05/21 16:20:26");
		System.out.println(nnn);

■StringからDateを生成する 実行結果
Mon May 21 16:20:26 JST 2007
```

```java
■DateからStringを生成する
		Date now = new Date();
		SimpleDateFormat xx = new SimpleDateFormat("MM月dd日");
		String yy = xx.format(now);
		System.out.println(yy);

■DateからStringを生成する 実行結果
11月11日
```

```java
■例②
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test03 {
	public static void main(String[] args) {
		Date now = new Date();
		SimpleDateFormat v = new SimpleDateFormat("西暦yyyy年MM月dd日");
		String y = v.format(now);
		System.out.println(y);
	}
}
■実行結果
西暦2015年11月12日
```
ROS奮闘　gmapping編　その２　

前回の失敗をもとにいろいろと調べた結果

・センサがtfツリーに関連付けられていない

ということがわかった。
これは由々しき事態である。

わい「ｔｆってなんや」
ｔｆ「わいはtransformや」


なるほどわからん
で調べてみました。
ざっくりいうと

・　ROSではセンサやロボットのプログラムを走らせるノードが分散しているので、それぞれで座標系が存在してしまう。
・　実際動かすのは一斉に動作するため相対的な位置がわからないとこまる
・　それを解消するために先に座標系の関系を決めてしまおう

ってことみたい(間違ってるかも)
詳しくは[この辺](http://wiki.ros.org/ja/navigation/Tutorials/RobotSetup/TF)かなぁ
[チュートリアルはこっち](http://wiki.ros.org/ja/tf/Tutorials)

なんかクォンターニオンというかっこいい単語が出てきてますが、要はどの軸に何度回転してるかの姿勢を表現しているそうです


でとりあえずtfの便利なコマンドがあって
$rosrun tf view_frames
で動いてるフレーム(一つの座標系くらい？)がわかる
![Screenshot from 2015-11-11 11:57:10.png](https://qiita-image-store.s3.amazonaws.com/0/98159/90c97653-a208-22bf-066f-0ebc6e7bd7cb.png)
といったpdfファイルが出力される(便利なもんでゲソ)

mapフレームがあってその子フレームにodomフレーム、その子フレームにbase_linkフレームがあるよってかんじ
センサのフレームがないってわけね

ということでbase_linkの子フレームにしたりする必要があると・・・

どうするんですかねー

とりあえずセンサのフレームの名前をbase_linkにすればいけるやろ(なぜそうなった)

$rosparam set hokuyo_node/frame_id "base_link"
でhokuyo_nodeのフレーム名がbase_linkになったのでとりあえずツリー内には入った(かなり強引)

・・・・・・・・・・・・・



とりあえず前回のwrningで動かなかったgmappingは動いた
まぁ当たり前か。
でもたぶんフレーム間のパラメータとかぐちゃぐちゃ・・・

この辺もパラメータセットのコマンドで解消できるのかね


正直ランチャファイルを書けばいちいち設定しなくて良さそうなのでそこら辺もやらないと

・・・・

なんか全然ｔｆについて勉強できてない気がする
勉強しなきゃ行けないことばっかですね、もうちょっと勉強続けます。

【追記】
とりあえずあとで研究室ぐるっと動かして作った地図。
![Screenshot from 2015-11-13 10:52:22.png](https://qiita-image-store.s3.amazonaws.com/0/98159/f98dcafe-3cc2-1c3f-1142-505745757507.png)

やっぱりいろいろずれてるみたい。
ルンバに直進指示だしても右にぶれてたからそのへんも影響してそう。
キャリブレーションしないといけませんねぇ・・・(遠い目
El Capitan (OSX 10.11)でpumaのインスールに失敗する場合の回避策

# 概要
El Capitan (OSX 10.11)にアップデートしたら`bundle install`で[puma](https://github.com/puma/puma)のインストールにこけたので備忘録として残しておく。



# エラー内容
一部抜粋

```
mini_ssl.c:3:10: fatal error: 'openssl/bio.h' file not found
```

# 解決方法
[こちらのissue] (https://github.com/puma/puma/issues/718)に解決方法の記載がありました。
どうも参照先のディレクトリがEl Capitanで変わったようなので、以下のコマンドを打ちます。

```
$ bundle config build.puma --with-opt-dir=/usr/local/opt/openssl

$ cat ~/.bundle/config
---
BUNDLE_BUILD__PUMA: "--with-opt-dir=/usr/local/opt/openssl"
```

再度`bundle install`すると今度は成功するはずです。
[ ohai ] ネストされた特定の値をohaiコマンドで取得したい

##0. やりたいこと
ohaiコマンドでOS情報を取得するとき、ネストされている値だけ欲しいときがある。例えば以下のような情報がohaiコマンドで取得できるが、本当は`machine`の値だけ欲しいとか、そういう状況になることがある。

```bash
[~]$ ohai kernel
{
  "name": "Linux",
  "release": "2.6.32-431.3.1.el6.x86_64",
  "version": "#1 SMP Fri Jan 3 21:39:27 UTC 2014",
  "machine": "x86_64",
  "os": "GNU/Linux",
  "modules": {
    "vboxsf": {
      "size": "37631",
      "refcount": "1"
    },
  (以下省略)

```


##1. 解決
以下のように`/(スラッシュ)`を使えば値を取れる。

```bash:kernelのmachineの情報が欲しい
[~]$ ohai kernel/machine
[
  "x86_64"
]

```

```bash:もう一段階ネストされてても値はとれる
[~]$ ohai kernel/modules/vboxsf
{
  "size": "37631",
  "refcount": "1"
}

```

```bash:hashのkeyを指定しても値がとれる
[~]$ ohai kernel/modules/vboxsf/size
[
  "37631"
]


```
MacからWindowsファイルサーバーのパスワードを変更する

手元にはMac。使っているファイルサーバーはWindows。そしてWindowsパスワードの有効期限が切れた。

わりとよくあるシチュエーションではないかと思います。
そんな時泣く泣く近所のWindowsユーザーの手を借りてパスワード変更をしていませんか？

**今日からその涙は不要です。**

MacにはHomebrewがあるのですから。んで、Homebrewでsamba入れちゃえばsmbpasswdが付いてくるのですから。



**Homebrewとは**
簡単にいえばmac用パッケージ管理ツールです。
http://brew.sh/index_ja.html


**sambaとは**
簡単にいえばWindowsファイルサーバーを立ち上げたりなんだりするツールです。
https://www.samba.org/

MacOS 10.10で確認しています。

# Install
terminalを立ち上げ以下のコマンドを打ち込みます。

### Homebrewのインストール
```bash
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

xcode command line tools がインストールされていない場合には途中でインストールを求められるので流れに身を任せてください。
![Screen Shot 2015-11-12 at 09.45.20.png](https://qiita-image-store.s3.amazonaws.com/0/74328/9043641c-5d1e-4171-ad40-7c40cd54c2b2.png)


### sambaのインストール
```bash
brew install homebrew/boneyard/samba
```
sambaが公式のfomulaから外れてしまったらしく、bonyardからインストールします。


2行で準備が済みました。

# How to use
パスワードの変更です。
terminalを立ち上げ以下のコマンドを打ち込みます。

```bash
smbpasswd -r サーバー名 -U ユーザー名
```

古いパスワード、新しいパスワード(×2)入力でパスワード変更完了です。簡単ですね！

では良いMacライフを。
iOS Human Interface Guidelines 3D Touchの意訳メモ

自分用メモです。間違い、抜け漏れあるかもしれないです。
 [iOS Human Interface Guidelines 3D Touch](https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/3DTouch.html)の超ざっくり意訳

----
3D TouchはiPhone6S、iPhone6S+から搭載されている（iOS9〜）新しいインタラクションのことです。


#3D Touchってなに？
- iOS9から提供しているインタラクション
- スクリーンをちょっとプレスするだけでそのアプリの特徴的なActionが起動できるよ

#Peek and Popってなに？
<img width="260" alt="webview_peek_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/66873/da22a4c5-5aaa-ab0a-53c1-2e2f5e3f4da7.png">



- Peekはユーザーが今のコンテンツを保持したまま他のアイテムのActionをプレビューできる
- Peekはユーザーが画面をプレスするとそのアイテムの詳細がチラ見出来る
    - 例えばユーザーがそのWebページを開く前や友達にURLをシェアする前に、そのWebページのプレビューがプレビュー出来る
- 現在のタスクから離れてPeekで表示されたアイテムにフォーカスしたい時はPopで同じアイテムを表示しましょう
- ユーザーが混乱するので編集メニューとPeekのメニューは違うものにしましょう
- Peek内でボタンに見えるような要素は表示させないようにしましょう。その要素をタップしようと指を離した時にPeekが消えてしまいます
- Peekを表示している時にTap&Holdしながらスワイプアップすると関連メニューを表示させることも出来ます。
    - 例えばメールアプリだったら「返信」「転送」「移動」等のコンテキストメニュー
- すべてのユーザーやデバイスで3Dタッチが有効という訳ではないです。Peekで提供するアクションがそのアクションへアクセス出来る唯一の方法にしないでください

# Quick Actionsってなに？

<img width="256" alt="home_screen_quick_actions2-65_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/66873/01282369-3f02-04d2-b2cb-96ef2dd65de8.png">


- ユーザーがホーム画面からそのアプリ固有の便利なアクションをすぐに実行できる
- ホーム画面のアプリアイコンを深くプレスするとクイックアクションが出てきます
- アイコンを付けてラベルは短めに、必要であればサブタイトルを入れましょう
- クイックアクションはそのアプリにとって価値の高いタスクを提供しましょう
    - 例えばマップアプリだったら現在地の周辺検索や自宅への帰り方等
- 簡単にナビゲーションにアクセスする事を目的にしないでください。
    - ナビゲーションにアクセスする事に時間がかかるアプリならまずはそこから直せ
- Notificationとしてクイックアクションを使わないでね
- クイックアクションのラベルにはアプリ名や本質的ではない情報は入れないでね。あとローカライズしてね。

# Quick Actionsのデザインテンプレート
[Template Icons](https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/BarIcons.html#//apple_ref/doc/uid/TP40006556-CH21-SW1)
Swiftチュートリアル(初めての方に対して)


Implement a Custom Control/カスタムコントロールを実装にて、ミスがあります。

下記コード記述の際に必要なプロパティが存在しないためエラーが出ます。


```
override func intrinsicContentSize() -> CGSize {
        let buttonSize = Int(frame.size.height)
        let width = (buttonSize + spacing) * stars
        
        return CGSize(width: width, height: buttonSize)
    }
```


僕は下記のコードを記述して解決しました。

```
// MARK: Properties 星を出現させるためのプロパティを記述する。
//追加するプロパティです。
    var spacing = 5
    var stars = 5

```

参考URL
https://forums.developer.apple.com/thread/23021
http://inaka-gurashi.hatenablog.com/entry/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%E5%8D%B1%E9%99%BA%E6%80%A7
https://programmer-engine.work/archives/16831
Swift2.0 ナビゲーションバー 透過無効

# スクロールした時とかに曇りガラスにしたくない時に使う方法


通常何もしなければ、ナビゲーションバーの下にあるものは、曇りガラスが適用されてボケて見える。
![Simulator Screen Shot 2015.11.11 17.42.13.png](https://qiita-image-store.s3.amazonaws.com/0/54553/0712142b-582f-f224-30c5-88ecb43e67c1.png)



上記のコード、1行入れるとボケにくくなる。
![Simulator Screen Shot 2015.11.11 15.39.17.png](https://qiita-image-store.s3.amazonaws.com/0/54553/20f8cd79-4d81-c497-2231-2c5ff50ffeda.png)



```swift:AppDelegate.swift
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    internal var window: UIWindow?
    private var navigationController: UINavigationController!


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        let viewController: ViewController = ViewController()
        navigationController = UINavigationController(rootViewController: viewController)
        self.navigationController?.navigationBar.tintColor = UIColor.whiteColor()
        // 下記の1行を追加する
        self.navigationController?.navigationBar.barTintColor = UIColor.whiteColor()
//        self.navigationController?.navigationBar.translucent = false
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window!.rootViewController = navigationController
        self.window!.backgroundColor = UIColor.whiteColor()
        self.window!.makeKeyAndVisible()
        return true
    }

    func applicationWillResignActive(application: UIApplication) {}
    func applicationDidEnterBackground(application: UIApplication) {}
    func applicationWillEnterForeground(application: UIApplication) {}
    func applicationDidBecomeActive(application: UIApplication) {}
    func applicationWillTerminate(application: UIApplication) {}
}
```
treeコマンドでファイルリストを表示(納品物リストの作成時などに便利)


```
この記事ではMac OSX(10.10.4)をつかっています。
コマンドラインの$は入力不要です。
```

treeコマンドを使うとディレクトリ階層をツリー形式で出力してくれてとても便利です。
一度インストールしてしまえば使い方はとても簡単ですが、オプションを覚えておくともっと便利です。
[Homebrewとtreeのインストール](http://qiita.com/fivestarHoshi/items/8e7120c7beb04b84e718)はこちら



**指定した階層まで表示**
***
```
& tree -L LEVEL
```
※LEVELの部分には数字を指定

**ディレクトリのみ表示したい**
***
```
$ tree -d
```
**階層ではなく、ただリストアップしたい**
***
```
$ tree -i
```
**不可視ファイルも含めたい**
***
```
$ tree -a
```

**HTMLで出力**
***
```
& tree -H baseHREF
```
※baseHREFの部分には任意の階層を指定

**helpを表示**
***

```
$ tree --help
```
詳しくはヘルプを参照
【jQuery】スクロールする要素内で指定要素が表示状態かを判定する

※自分でちょっとハマったのでメモします。

# きっかけ
ページの四方をメニューなどで固定表示していて、中の要素を
```overflow: scroll;```　しているとします。（UI的にどうなの？というのは置いといて）
この**要素内の要素**がスクロールによって表示されているかどうかを判定したい時

よくあるページ内のスクロール量によって処理する場合

```js
//要素のスクロール位置
$(selector).offset().top;
//現在のスクロール位置
$('body,html').scrollTop();
```

これを比較してどうこうすれば行けますが
スクロールする要素内の要素のスクロール位置（もっといい表現ないかな。。）は
どうやって取るの？となりました。

# シンプルなhtml構造なら、、、
以下の様にシンプルなhtml構造であれば　```$('.target').position().top```　で取れますが

```html
<!-- スクロールする要素 -->
<div style="position: relative">
  <p>テキスト</p>
  <p>テキスト</p>
  <p class="target">ここを取りたい</p>
</div>
```

極端な話、以下の様な構造だと面倒です。

```html
<!-- スクロールする要素 -->
<div style="position: relative">
  <div style="position: absolute">
    <p>テキスト</p>
    <p>テキスト</p>
  </div>
  <div style="position: absolute">
    <p>テキスト</p>
    <p>テキスト</p>
    <div style="position: absolute;">
      <p class='target'>ここを取りたい</p>
    </div>
  </div>
</div>
```

# 結局 offset() でいけましたっていう話
今件の場合、四方を固定されていて、スクロールするのはその中の要素です。
つまり、bodyはスクロールせず、中のdivなりがスクロールします。
この状態で以下の処理をしてみます。

```js
var wh = $(window).height(),
    fh = $('footer').height();
//selector1はスクロールする要素
$(selector1).on('scroll', function() {
  //selector2は判定したい要素
  var t = $(selector2).offset().top;
  if (t < wh - fh) {
    console.log('表示エリアに入りました。');
  }
});
```

　```offset()```　はbodyの左上を基点としますが（あえてbodyと書いています）、
bodyはスクロールしないため、結果判定したい要素が近づいてくる形になります。
これで　```window```　の高さと　```offset().top```　の値を比較すれば
表示されたかどうかがわかるわけです。
（減算している fh は下部に固定されている要素の高さ）

# 結論
四方が固定表示されていなくても、bodyがスクロールしない状態なら
上記方法でいけます。
「```offset()```　で取れる値は常に固定だよね」と思っていたのでハマりました。

※書いてみたものの、かなりわかりにくいですね。自分でも後から見直してわかるかどうか。。
h2oでCORSに対応する

```
user : root
listen: 8080
hosts:
  default:
    path:
      /:
        file.dir: /home/vagrant/h2o_doc_root
        access-log: /home/vagrant/h2o_log/log
        header.add: "Access-Control-Allow-Credentaial:true"
        header.add: "Access-Control-Allow-Headers:Accept, X-Access-Token, X-Application-Name, X-Request-Sent-Time"
        header.add: "Access-Control-Allow-Methods:GET,POST,OPTIONS"
        header.add: "Access-Control-Allow-Origin:*"
```

説明は後日追記。
UnityにAndroid aarを入れたらハマったのでメモ((φ(･д･｡)

あるUnitySDKを使用したらバグっていたので、
Androidプラグインを入れようとしたらめちゃくちゃハマったのでメモ

#UnitySDKがバグっていた件
あるサービスのUnitySDKを導入したら、バグバグで使い物になりませんでした。
で、改修の進んでいるAndroidのSDKをUnityに直接組み込みむことに

#aar？なにそれおいしいの？
知ってはいました。
Androidのライブラリプロジェクト全体をまとめたやつでしょ？これ入れれば万事解決でしょ？余裕じゃん。


この甘い認識で地獄を見ることに。

#プラグインプロジェクトのダウンロード
AndroidStudioでサンプルプログラムの動作確認を行い、そのまま、ブリッジ用のモジュールを作成。それをUnityにしようと思ったときに気付きました。
「このSDKをUnityに突っ込まないと動かなくね？どこにあるんだろ・・・」

そのときは、軽く探したものの見つからず、もうmavenで落としちゃえ！ということでmavenの調査と導入。

mavenの導入（動作まで）のメモ((φ(･д･｡)
http://qiita.com/wakameyy/items/f3698d38fd333f55a251

MavenでAndroidのライブラリをダウンロードするメモ((φ(･д･｡)
http://qiita.com/wakameyy/items/1d89f30f12b09c9cbb65


#Unityビルド
ビルドが通らないので、調査。
ライブラリ内のクラスが見つからないと言われてしまう。
（ライブラリのjarには入っていた。）
原因がわからないので、別のアプローチから。

#ダウンロードしたライブラリが足りているのかどうか
AndroidStudioでの製作とmavenでのダウンロードが別々だったので、
AndroidStudio内でダウンロードできる方法を模索

#AndroidStudioのタスクから実行
関連するモジュールを全てコピーするタスクを作成して実行

```grade:build.bradle
task copyLibs << {
    configurations.compile.each { lib ->
        if (lib.path.startsWith("${projectDir}/libs")) {
            // libs内のものはコピー対象外
            return
        }
        copy {
            from lib.path
            into 'release'
        }
    }
}
```

これで、release フォルダ直下にライブラリがダウンロードされた。
一部のライブラリがダウンロードされていなかったり、バージョンが古かったのでエラーになっていたみたい。
更新したらエラーがきえました。


参考ページ
UnityのAndroidでライブラリを使う - ほげほげ（仮）
http://starzero.hatenablog.com/entry/2015/07/11/223032


とまあ、今回はこれくらい
純正の ARMv8アーキテクチャシミュレータを使用する

# はじめに
ARM が純正で ARMv8 アーキテクチャのシミュレータを配布していることを知ったので、さっそく動かしてみた。

## 動作確認環境
* Ubuntu 12.04.4 LTS 64bit 版

# シミュレータのダウンロード
[公式サイト](https://silver.arm.com/browse/FM00A) からダウンロードできるが、ユーザ登録が必要。それが済むと、ARM V8 Foundation Platform (Linux) というところに Download ボタンがあるので、そこからダウンロードできる。このときに住所とか入力フォームが出てくるが、必須ではないのでそのまま次に進める。

# 実行してみる
展開すると Foundation_Platformpkg というディレクトリができる。

内容はこんな感じ

```console
$ tree
Foundation_Platformpkg
├── doc
│   ├── DUI0677E_foundation_platform_ug.pdf
│   └── FoundationPlatform_Readme.txt
├── examples
│   ├── foundation-platform.dts
│   ├── hello.axf
│   ├── hello.c
│   └── Makefile
├── LES-PRE-20164-V5_0_-_Foundation_Platform.txt
└── models
    └── Linux64_GCC-4.1
        ├── Foundation_Platform
        ├── libarmctmodel.so
        └── libMAXCOREInitSimulationEngine.so.2

4 directories, 10 files
```

example に ELF があることが確認できる。
中身は、printf するだけ。

```c:hello.c
#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("Hello, 64-bit world!\n");
    return 0;
}
```

Foundation_Platformpkg/models/Linux64_GCC-4.1/Foundation_Platform がシミュレータ本体っぽいので、これを実行してみる。

```console
$ ./Foundation_Platform --image=../../examples/hello.axf                                                                                                                                       
terminal_0: Listening for serial connection on port 5000
terminal_1: Listening for serial connection on port 5001
terminal_2: Listening for serial connection on port 5002
terminal_3: Listening for serial connection on port 5003
Simulation is started
Hello, 64-bit world!
```

期待通り動いていそう。シリアルがどうとか出力されるので、UART とかで出力は出来そう。

# おわりに

今回はとりあえず動かすところだけだが、これだけでは全く面白くないので、自分で作ったプログラムを動かしたい。armcc は有償なので、gcc か llvm で出来ればよいかなと思っている。
ubuntu14.04でusermodしてsudoできなくなったとき

# やっちまった

ubuntuでusermodしてはいけない( http://d.hatena.ne.jp/thegoodbadugly/20130116/1358316032 )のを知らずにやらかしてしまったものの，先人たちのお知恵によって直せたのでメモ．

http://slumbers99.blogspot.jp/2011/06/ubuntu-usermod-g-admin.html
を参考にさせていただきました．
自分の環境だとちょっと違う部分があったのでそこを変えて書き留めておきます．

# なおしかた

GRUBで
`Advanced options for Ubuntu` -> `Ubuntu, with Linux *** (Recovery mode)`
でリカバリーモードに入って，

`root Drop to root shell prompt `
でrootログインして，

`mount -o remount,rw /`
でRead/Writeモードで再マウントして
(http://qiita.com/ironsand/items/f40581705a7bb402c01d を参考にさせていただきました)

`usermod -G adm,dialout,cdrom,plugdev,lpadmin,sudo,(ユーザー名) (ユーザー名)`
でグループに追加

`su (ユーザー名)`でそのユーザーになってみて，
`sudo cat /etc/group`とかやってみて`sudo`できるか確認．
python > udp > IPv4アドレスのホストアドレスが空文字列の場合、 INADDR_ANY として処理されます。

UDP受信にてC実装ではINADDR_ANYを使っていた。
Pythonではどうなのか、という疑問に関しての調査。

http://docs.python.jp/2/library/socket.html
> IPv4アドレスのホストアドレスが空文字列の場合、 INADDR_ANY として処理されます。
linux > udp > recvfrom() > 同じPCから: 受信成功 / 別のPCから: 受信失敗 

```txt:動作確認
CentOS 6.5
```

UDP受信のC実装を試す。[python実装](http://qiita.com/7of9/items/e2fdf7908fef1b313084)が失敗している原因の追究のため。

```udp.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define SIZE_BUF 200

int main(void)
{
    unsigned short port = 9880;
    struct sockaddr_in rcvAddr;
    int sockfd, slen, rcvdLen;
    char rcvBuf[SIZE_BUF];
    int ret;

    slen = sizeof(rcvAddr);

    sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sockfd == -1) {
        exit(EXIT_FAILURE);
    }
    memset((char *) &rcvAddr, 0, sizeof(rcvAddr));     
    rcvAddr.sin_family = AF_INET;
    rcvAddr.sin_port = htons(port);
    rcvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    bind(sockfd , (struct sockaddr*)&rcvAddr, sizeof(rcvAddr) );

    while(1) {
        fflush(stdout);
        rcvdLen = recvfrom(sockfd, rcvBuf, SIZE_BUF, 0, 
            (struct sockaddr *) &rcvAddr, &slen);
        if (rcvdLen == -1) {
            close(sockfd);
            exit(EXIT_FAILURE);
        }
        if (strstr(rcvBuf, "req") == NULL) {    // accept only "req"
            continue;
        }
        printf("rx: %s", rcvBuf);

        // remove <LF>
        if (rcvBuf[rcvdLen - 2] == '\n') {
            rcvBuf[rcvdLen - 2] = 0x00;
        }
        strcat(rcvBuf, ",OK\n");

        ret = sendto(sockfd, rcvBuf, strlen(rcvBuf)+1, 0, 
            (struct sockaddr*) &rcvAddr, slen);         
        if (ret == -1) {
            close(sockfd);
            exit(EXIT_FAILURE);
        }
    }
    close(sockfd);
    return 0;
}
```

ポート9880へ送ればいい。

- 同じPCから
  - `echo "req" | nc -u 192.168.124.139 9880` : 受信成功
  - `echo "req" | nc -u 127.0.0.1 9880` : 受信成功
 
- 別のPCから : 受信失敗

別のPCからCentOSへのポートが閉じているのかもしれない。

空きポートのチェックは以下でやっている。
http://qiita.com/7of9/items/e70588e500894c278ee2

やはりCentOSで使うポートが閉じていた。
「クリップボードにコピー」を実装する


### clipboard.js を使う

[clipboard.js — Copy to clipboard without Flash](https://zenorocha.github.io/clipboard.js/)


↓ github にあるこんな感じのものを作ります。

![clipboard_js.png](https://qiita-image-store.s3.amazonaws.com/0/18743/0c2a4324-da8f-dc2f-2c6b-9bc301707489.png "clipboard_js.png")


デモを下記に置きました。

http://inouet.github.io/sample_html/002.copy_clipboard.html


HTMLは下記のような感じ。
ボタンの data-clipboard-target="XXX" の部分にコピー対象のエレメントを指定しておく。

```html
<html>

  <head>
    <meta charset="UTF-8" />
    <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
    <script src="https://cdn.jsdelivr.net/clipboard.js/1.5.3/clipboard.min.js"></script>
    <script>
        $(function () {
          var clipboard = new Clipboard('.btn');
        });
    </script>
  </head>

  <body>

    <!-- コピー対象 -->
    <input id="foo" value="https://github.com/zenorocha/clipboard.js.git" size="60">

    <!-- コピーボタン -->
    <button class="btn" data-clipboard-target="#foo">
        クリップボードにコピー
    </button>

  </body>
</html>


```


このままだと、コピー対象文字列が選択状態のままになるので、選択状態を解除するには、success のイベントでclearSelection を呼ぶ。

```javascript
var clipboard = new Clipboard('.btn');

clipboard.on('success', function(e) {
    e.clearSelection();
});
```

失敗の時のコールバックとかもあるみたい。

詳細は下記参照

* [clipboard.js — Copy to clipboard without Flash](https://zenorocha.github.io/clipboard.js/)
* [Flashなしのクリップボード統合を実現する軽量JavaScriptライブラリ](http://www.infoq.com/jp/news/2015/10/clipboard-js-no-flash)
[CentOS6.7] コマンドでUSB接続モジュールを抜き差し

# 経緯
* とあるサーバからUSB変換シリアルコンソール経由でルーターへアクセスしたい
* `screen`コマンドで接続するもなんか挙動が変だぞ
* USBの抜き差ししたいけどデータセンター遠い・・・＼(^o^)／
* コマンドでUSBリセットかければUSBの抜き差しに相当するみたいなのでやってみよう！

# 概要
1. USB ID を調べる
2. UNBIND実施
3. BIND実施
4. 接続確認

# 現象

```shell-session
[root@centos6 ~]# screen /dev/ttyUSB0
24aes.i elervrdCo7hnsori8T pet t9ed Cp88-1i t 20o2Al0c4m5s
```
謎の文字列が表示され操作不可

# 手順
## 1. USB ID を調べる

```shell-session
[root@centos6 ~]# udevadm info --query=path --name=/dev/ttyUSB0
/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1:1.0/ttyUSB0/tty/ttyUSB0
```

* USB ID は上記から　**2-1**　と確認できる
 - 最初の　**2**　がUSBバスID
 - 後ろの　**2**　がデバイスID

## 2. UNBIND
* USB接続解除

```shell-session
[root@centos6 ~]# echo -n "2-1" > /sys/bus/usb/drivers/usb/unbind
```

* 確認

```shell-session
[root@centos6 ~]# udevadm info --query=path --name=/dev/ttyUSB0
device node not found
```

## 3. BIND
* USB再接続

```shell-session
[root@centos6 ~]# echo -n "2-1" > /sys/bus/usb/drivers/usb/bind
```

* 確認

```shell-session
[root@centos6 ~]# udevadm info --query=path --name=/dev/ttyUSB0
/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1:1.0/ttyUSB0/tty/ttyUSB0
```

## 4. 接続確認
* `screen`コマンドにて接続確認

```shell-session
[root@centos6 ~]# screen /dev/ttyUSB0
Password:
```

正常に接続できることを確認！

#参考
[こちら](http://blog.be-dama.com/2012/10/01/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7usb%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%82%92%E6%93%8D%E4%BD%9C/)を参考にさせて頂きました！ありがとうございます！
@SpringBootApplication利用上の注意

前回、RabbitMQの実装をしていて気づいたのですが、
@SpringBootApplicationアノテーションを付与したmainメソッドを持つクラスを1つのProjectに2つ用意した場合に同時に動くという事がわかりました。
知らないで利用しているとちゃんと動いているのか不安になるのですが、知っていればフロントエンドとバックエンドを一つのインスタンスでまかなえるという事に気づいたりします。

http://stackoverflow.com/questions/33612130/multiple-springbootapplication-annotation-in-a-project

STSではメインメソッドが複数ある場合に下記のように選択でき、build.gradleでも起動時のメインメソッドを指定できるので、サンプル用に1つのプロジェクト内に沢山のメインメソッドを入れていました。
![スクリーンショット 2015-11-09 23.57.29.png](https://qiita-image-store.s3.amazonaws.com/0/89997/10f562dc-6091-7550-5309-ce3e2d8f7552.png)

こっちがもともとあるフロント用のクラスです。
@SpringBootApplicationが
@Configuration,@EnableAutoConfiguration,@ComponentScanを呼び出します。
@ComponentScanで@Componentを全部使えるようにしてくれるので、@Componentを含む@Controllerが有効になります。

```java:SpringDemoApplication.java
package demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class SpringDemoApplication {

public static void main(String[] args) {

        SpringApplication application = new SpringApplication(SpringDemoApplication.class);
        ApplicationContext context = application.run(args);

    }
}
```
あとから、バックグラウンド用の処理に追加したクラス。
タイマーなどを組み合わせるとより正確に定期実行のタスクを簡単にプロジェクト内に組み込む事ができます。
ウェブの機能が入っているのと同じJARファイル内で動いています。

@Component
```java:BackgroundTasks.java
package demo;

import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class BackgroundTasks implements CommandLineRunner {

	@Autowired
	ApplicationContext context;
	
    public static void main(String[] args) throws InterruptedException {
        SpringApplication.run(RabbitMQApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("Waiting five seconds...");
       
        while(0 < 1){
        	for(int i = 0 ; i < 5 ; i++){
        		System.out.println(new Date().toGMTString() + ": " + String.valueOf(i));
        	}
        	Thread.sleep(10000);
        }
    }
}
```


訂正
@SpringBootApplicationではなく、
@ComponentとCommandLineRunnerが実装されている場合に、同じインスタンス内で起動してるみたいです。
std::set<T>の所属判定をスマートに書く

C++ STLで集合を表現する`std::set`クラスは、この手のクラスによくあるような`contains`メソッドのようなものを持っていません。
だから、集合`s`が要素`e`を含んでいるかどうかは

```cpp
s.find(e) != s.end()
```

と表現します。訓練されたC++使いにはこれが`s.contains(e)`のように目に飛び込んでくるんでしょうが、一般的に言ってこれは意図とコードが直結していないよろしくない表現です。
だから、ヘッダファイルにこんな演算子オーバーロードを用意しましょう。

```cpp
/// <summary>std::setの所属判定演算子</summary>
template <typename T>
static bool operator>(const std::set<T>& s, const T& item){
	return s.find(item) != s.end();
}

/// <summary>std::setの所属判定演算子</summary>
template <typename T>
static bool operator<(const T& item, const std::set<T>& s){
	return s > e;
}
```

演算子オーバーロードにテンプレート使えるんですね。
さてこれを定義しておくと…

```cpp
s > e
// もしくは
e < s
```

こう書けます。スマート。数学の⊂記号を演算子に使えたらもっと良かったんでけれど。
`std::vector`版も置いていきますね。

```cpp
/// <summary>std::vectorの所属判定演算子</summary>
template <typename T>
static bool operator>(const std::vector<T>& s, const T& item){
	return std::find(s.cbegin(), s.cend(), e) != s.cend();
}

/// <summary>std::vectorの所属判定演算子</summary>
template <typename T>
static bool operator<(const T& item, const std::vector<T>& s){
	return s > e;
}
```
OmniAuthでFacebook認証を複数のモデルで使う

# はじめに
複数のモデルでのFacebook認証を実装しようとすると、
deviseではうまくいかない(deviseが単一モデルしか対応していない)
ため、deviseから外れた形で実現する必要がある。
日本語の情報が少ないため、覚書として記録しました。

# 環境
* ruby 2.2.1
* rails 4.2.3

# 前提
devise + omniauth-facebook
を利用してuserモデルのFacebook認証、ログインを実装済みであるところからスタートします。
[よくあるこんな形](http://qiita.com/yu_0105/items/1decf7e1c167cb602c7c)ができてるのが前提です。

userモデルとanotherモデル両方でFacebookログインが可能である形をゴールとします。

# 実装手順

## devise + omniauthableをやめる
まずdeviseの呪縛から開放しましょう。

1.下記の記述を消す。

```app/models/user.rb
devise :omniauthable
```

2.設定記述箇所を変更する

```config/initializers/devise.rb
config.omniauth( :facebook,		
         [FACEBOOK_APP_ID],		
         [FACEBOOK_APP_SECRET],		
         scope: 'email', 
         info_fields: 'name, first_name, last_name, email' )
```

を消して

```config/initializers/omniauth.rb
provider :facebook,
   [FACEBOOK_APP_ID],
   [FACEBOOK_APP_SECRET],
   scope: 'email',
   info_fields: 'name, first_name, last_name, email'

```

に移動する

3.deviseのomniauth_callbacks_controller.rbを使わないようにする

```app/controllers/users/omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

  def facebook
    hoge
  end
```

これを任意のcontrollerに移動し、routingもそれに合わせて書き換える。
users_controllerのfacebookメソッドに移動した場合は下記のようにする。

```app/controllers/users_controller.rb
  def facebook
    hoge
  end
```

```config/routes.rb
  get '/auth/facebook/callback', to: 'users#facebook'
```

view側の指定は下記。

```
<%= link_to 'facebookログイン', '/auth/facebook' %>
```
以上で、deviseのomniauthableを使わずに、omniauth-facebookのgemだけでfacebookログインができるようになります。

## omniauthプロバイダを追加する
omniauth-facebookがやってくれていることを、同じようにもう一つ実装します。
facebookAPP側の設定ももう一つ必要なので、[こちら](https://developers.facebook.com/)でもう一つ作っておきます。

1.プロバイダを作る
lib/omniauth/strategies/以下に、
FacebookのAPIと認証・トークン取得などのやり取りをするプロバイダを
自前で作成しないといけないところを、すでに作ってくれているのがomniauth-facebookのgemです。
今回は、もう一つfacebookAPPとやりとりする別名のプロバイダを用意する必要があるので、omniauth-facebookをを継承して、option :nameの部分だけオーバーライドします。

```lib/omniauth/strategies/facebook_another.rb
module OmniAuth
  module Strategies
    class FacebookAnother < OmniAuth::Strategies::Facebook
      option :name, 'facebook_another'
    end
  end
end
```

2.設定を追加する
新たに作ったfacebookAPPのIDとSECRETの設定を追加し、先ほど作ったプラグインをrequireで読み込みます。

```config/initializers/omniauth.rb
require 'omniauth/strategies/facebook_another'

provider :facebook_another,
   [FACEBOOK_ANOTHER_APP_ID],
   [FACEBOOK_ANOTHER_APP_SECRET],
   scope: 'email',
   info_fields: 'name, first_name, last_name, email'
```

3.コールバックメソッドを実装する
任意のcontrollerにメソッドを実装し、routingも追加する。
anothers_controllerにfacebookメソッドを実装した場合は下記のようにする。

```app/controllers/anothers_controller.rb
  def facebook
    hoge
  end
```

```config/routes.rb
  get '/auth/facebook_another/callback', to: 'anothers#facebook'
```

view側の指定は下記。

```
<%= link_to 'facebookログイン', '/auth/facebook_another' %>
```
以上で、複数モデルに対してomniauthを使ったFacebook認証・ログインが実装できます。

# 参考資料
* http://qiita.com/RyosukeKawamura/items/ff1116b0a1d861a24c62
PHPStorm の diff で Ctrl や Shift を押すと追加や削除ができる

PHPStorm で２つのファイルを選択し、Ctrl + D で diff を表示させると、
下記のようにどちらの状態を反映させるかというアイコンがでる。

![image](https://qiita-image-store.s3.amazonaws.com/0/29899/6126d825-9f6f-7e0e-ca2b-7ad36791a0fe.png)
ここで Shift を押すと
![image](https://qiita-image-store.s3.amazonaws.com/0/29899/723e1aac-6c05-f6ea-80a3-29e05c8072b2.png)
このように 「×」に変わり、
ここで Ctrl を押すと
![image](https://qiita-image-store.s3.amazonaws.com/0/29899/c98afe61-43c0-5a03-587f-1ca2a80a79a7.png)
のように追加アイコンに変わって差分を追加できるようになる。

今まで気づかなかったけど、これは便利！
c++ > クラス > インスタンス関数 / 静的関数


http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1220329577
> それはechoはHumanのインスタンスが行うことです。つまり、人が行う動作なので、人(インスタンス)毎に行わせたいものです。
逆にprintBeingsは、その人(インスタンス)毎に基本行うことではありません(できますが、クラスの存在自体がHumanを示します)。

同じ考えだ。

---

ある処理を並列してそれぞれ異なる設定で動かす場合、インスタンス関数とする。メンバ変数としてそれぞれの設定を持たせる。

例として、異なるIPアドレスからデータ受信する処理を3つ並列に走らせる場合。IPアドレスはそれぞれのインスタンスのメンバ変数に持たせる。

---

異なる設定がなく同じ処理をする場合は、静的関数とする。

例として、IPアドレスから名前を得る処理。
ipythonで過去に実行したコマンドを簡単に再実行する方法

通常のUNIX系のターミナルでは、
`$ history`
コマンドで過去に実行したコマンドの履歴を番号付きで表示してくれます。
そして
`$ !◯◯◯(コマンドの番号)`
と入力することによって、過去に実行したコマンドを簡単に再実行することができます。

ipythonで、
![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/88804/2e794d74-1afc-466d-564c-6aabe2bf31c3.png)
こんな感じでコマンドを走らせていて、
「ターミナルみたいに過去のコマンドを簡単に呼び起こせたらいいな...」
と思って調べてみたら自分が目当てにしていたコマンドがありましたのでここに備忘録として残しておきます。

# **1.過去のコマンドの履歴を番号付きで表示させる**

`In[10]: history -g`
上記のコマンドによって、番号付きで過去のコマンドの履歴を表示させることができます。
"-g"というのが、番号も合わせて表示させてくれるオプションです。
実行すると以下のようになるはずです。
![aab.png](https://qiita-image-store.s3.amazonaws.com/0/88804/ca8ec075-fca6-7580-3a5b-89f94d5cb1fd.png)

ここで再実行させたいコマンドを探し、対応するコマンド番号をチェックします。

# **2.再実行させたいコマンドを呼び出す**
`In[11]: recall ◯◯◯(コマンドの番号)`
"recall"コマンドによって、その番号に対応するコマンドを呼び出すことができる。
例えば今、263番めのコマンドをもう一度実行させたいとすると、
![aac.png](https://qiita-image-store.s3.amazonaws.com/0/88804/42d01957-040c-f123-27b4-fdeab4c98789.png)
無事コマンドを呼び出すことが出来ました。


# たったこれだけ。
非常に簡単ですね。
"history"コマンドのオプション"-g"と、"recall"コマンドを組み合わせるだけです。
それでもターミナルに比べると操作数やキーの入力数が少し多いですが...。
CentOS 6.x でJenkinsをインストールするには

## 実現したいこと

* jenkinsをyumコマンドでインストール/管理したい
* jenkins official siteで公開されている最新安定版のrpmを利用したい

## 設定ファイル編集
```
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo
sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
```
## インストールコマンド
```
yum install jenkins
```


## 情報源

* http://pkg.jenkins-ci.org/redhat/
* https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Red+Hat+distributions