OmniAICreator/Qiita-1.07M huggingface dataset:
Macのショートカットでよく使う「⌘⌥⇧⌃」記号の覚え方

* Macのショートカットでよく見る記号の意味を毎回忘れるので覚え方をメモってみました
* 由来がわかれば覚えやすいんですが、それらしき資料が見つからず。。
* コメント大歓迎です。
* **コメントで由来をおしえていただきました! とても覚えやすいので、ぜひコメントから御覧ください。** @hage@githubさん、@usagimaruさん、どうもありがとうございます!

# Macのキーボードショートカットの覚え方
|記号|読み方 |覚え方(むりやり)|
|:-----------:|:------------|:------------|
|⌘|command|キーボードに印字されているので覚えやすい|
|⌥|option / alt|モアイはおまけ(=option)(モアイの顔に見えるから)|
|⇧|shift|shiftでlift(上に持ち上げる)
|⌃|control|ハットをコントロール(帽子投げ選手権をイメージ)|

(苦しい…)
unity > グラフ描画したい > DrawLine.cs使用

http://tips.hecomi.com/entry/2014/06/23/222805
を参考にグラフを作成してみる。

３つの方法のうち、DrawLine.csを使用。

1. DrawLine.csはリンク先の情報から yoyoさんの書込みをコピペ
2. EmptyGameObjectを作成
3. OriginalInspector.csを作成し、EmptyGameObjectに関連付ける。中身は何も変更せず。
4. Assets以下にEditorフォルダを作成して OriginalInspectorEditor.cs を新規作成し、リンク先のコードをコピペする。

すると、以下の部分でエラがでた。

```csharp
AddData( (target as CustomInspector).random );
```

```txt:エラーメッセージ
The type of namespace name 'CustomInspector' could not be found. ...
```

よくわからないが、CustomInspectorというのを用意しないといけないが、その方法が分からない。

ダメ元で以下のように変更した。

```csharp
AddData (Random.Range(0.0f, 5.0f));
```

するとグラフが出た。

![Scence_unity_-_150801_graph_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/bb575ed6-05b6-111e-e626-61a656b8a98d.jpeg)

このグラフ表示では(0.0, 5.0)の範囲の点を描画している。

はまったのは(-5.0, 5.0)というマイナスを入れた時にグラフが描画領域におさまらなくなったこと。マイナスには対応していないようだ。


#code

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

public class OriginalInspector : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}
```

変更後のOriginalInspectorEditor.csファイルは以下　（AddDataの１行しか変えてない)

```OriginalInspectorEditor.cs
using UnityEditor;
using UnityEngine;
using System.Collections.Generic;
using System.Linq;

[CustomEditor(typeof(OriginalInspector))]
public class OriginalInspectorEditor : Editor
{
	private List<float> data_ = new List<float>();
	
	override public void OnInspectorGUI()
	{
		EditorGUILayout.Space();
		
		if (Application.isPlaying) {
//			AddData( (target as CustomInspector).random );
			AddData (Random.Range(0.0f, 5.0f));
		}
		
		var area = GUILayoutUtility.GetRect(Screen.width, 200f);
		
		// Grid
		const int div = 10;
		for (int i = 0; i <= div; ++i) {
			var lineColor = (i == 0 || i == div) ? Color.white : Color.gray;
			var lineWidth = (i == 0 || i == div) ? 2f : 1f;
			var x = (area.width  / div) * i;
			var y = (area.height / div) * i;
			Drawing.DrawLine (
				new Vector2(area.x + x, area.y),
				new Vector2(area.x + x, area.yMax), lineColor, lineWidth, true);
			Drawing.DrawLine (
				new Vector2(area.x,    area.y + y),
				new Vector2(area.xMax, area.y + y), lineColor, lineWidth, true);
		}
		
		// Data
		if (data_.Count > 0) {
			var max = data_.Max();
			var dx  = area.width / data_.Count; 
			var dy  = area.height / max;
			Vector2 previousPos = new Vector2(area.x, area.yMax); 
			for (var i = 0; i < data_.Count; ++i) {
				var x = area.x + dx * i;
				var y = area.yMax - dy * data_[i];
				var currentPos = new Vector2(x, y);
				Drawing.DrawLine(previousPos, currentPos, Color.red, 3f, true);
				previousPos = currentPos;
			}
		}
		
		EditorGUILayout.Space();
	}
	
	private void AddData(float value)
	{
		data_.Add(value);
		if (data_.Count > 100) {
			data_.RemoveAt(0);
		}
	}
}
```

playmodeにしてEmptyGameObjectを選択するとインスペクタにグラフが描画される。

インスペクタをクリックするごとにグラフが更新されていく。
UnityでOpneCVを利用したハコスコVR体験

#全天球カメラ動画でVRアプリ

前回の記事「[UnityでOpneCVを利用した動画再生をしてみた](http://qiita.com/utibenkei/items/aaaa6cf5b470aa4f69d5)」の続編です。

今回は**全天球カメラ動画を使ったVRアプリの作成+簡易HMD(ハコスコ)体験**をしたいと思います。

##下準備

####投影用3Dモデルの配置

「[360度カメラTHETAで撮った写真・動画をUnityで使う](http://psychic-vr-lab.com/blog/unity/360%E5%BA%A6%E3%82%AB%E3%83%A1%E3%83%A9theta%E3%81%A7%E6%92%AE%E3%81%A3%E3%81%9F%E5%86%99%E7%9C%9F%E3%82%92unity%E3%81%A7%E4%BD%BF%E3%81%86/)」を参考に、全天球動画を貼りつけるための球状の3Dモデルをシーンに配置します。
面方向が内側に向くように面を反転させた球状のオブジェクトを作成する必要があります。
ありがたいことに参考サイト内でプロジェクトファイルが公開されているので、その中の3Dモデル「Sphere_for_360Camera」をそのまま使用させていただきました。

####全天球動画の変換

[前回の記事](http://qiita.com/utibenkei/items/aaaa6cf5b470aa4f69d5)と同じようにffmpegを使ってMJPEG形式の動画に変換します。
(とりあえず以下の設定で変換しました)
`ffmpeg -i ThetaMovie.MP4 -vcodec mjpeg -an -qscale 2 -s 640x320 ThetaMovie.avi`

####マテリアル設定とテクスチャの表示

- 投影用3Dモデル用に新しいmaterialを作成して、shaderは「Unlit/Texture」を使用します。（照明の影響を受けないようにするため）
- 前回の記事で作成した動画再生スクリプトを3Dモデルにアタッチします。


![QiitaOpenCV_VR_screenshot.jpg](https://qiita-image-store.s3.amazonaws.com/0/28558/dcd60355-3b41-5f76-6ced-f15b9762d53b.jpeg)


##ヘッドトラッキング機能のAsset追加
「[簡易HMDを使ったVRハンズオンセミナー](http://qiita.com/warapuri/items/da59cac31feba06a837e)」を参考にして、ヘッドトラッキング機能のAssetをシーンにインポートします。
今回は、上の記事でもオススメされている「[Durovis Dive SDK](https://www.durovis.com/sdk.html)」を使用しました。

- DurovisのサイトからDLした「Dive_Plugin_2.1.5.unitypackage」をインポートします。
- 「Dive/Prefabs」フォルダ内にあるDive_CameraプレハブをHierarchyにドラッグして読み込みます。読み込んだカメラを含んだオブジェクトは投影用3Dモデルの中心に移動しておきます。
- BuildSettingの[Scenes of Build]の一番上に「Dive/Scenes/Dive-Splashscreen」を追加するのを忘れずに。

**これだけでiPhone/Android端末の傾きに対応してカメラ角度が変化するヘッドトラッキング機能が追加できました。**


##ハコスコで体験

さっそく「[ハコスコ タタミ2眼](http://www.amazon.co.jp/%E3%83%8F%E3%82%B3%E3%82%B9%E3%82%B3-T2-%E3%82%BF%E3%82%BF%E3%83%9F2%E7%9C%BC/dp/B011I9FCGS/ref=sr_1_3?s=electronics&ie=UTF8&qid=1438371489&sr=1-3)」を購入してVRアプリを試してみました。

![QiitaOpenCV_VR_hakosuko.jpg](https://qiita-image-store.s3.amazonaws.com/0/28558/a23ef4ff-ca5a-65a7-3588-62fabbf47c59.jpeg)


ヘッドトラッキングの追従性も良好で、思った以上に没入感があります。

参考サイトの内容をほぼそのまま組み合わせただけで簡単にVRアプリが作成できました。

※この記事では、前回記事からの流れでの動画再生に「[OpenCV for Unity](https://assetstore.unity.com/packages/tools/integration/opencv-for-unity-21088)」を使用していますが、動画再生機能だけならモバイルプラットフォーム対応の動画再生AssetをAssetStoreで購入して利用することをオススメします。（そっちのほうが安上がりで対応動画形式が豊富です）

# 関連記事
[UnityでOpenCVを利用した顔検出・画像処理アプリ事始め](http://qiita.com/utibenkei/items/fb93623a7ccaabb342f2)
[UnityでOpenCVを利用した顔検出・画像処理アプリ事始め2 サンプルコード詳解](http://qiita.com/utibenkei/items/290e83d2c50cdadbcb2d)
[「OpenCV for Unity」Assetのインポートサイズを削減する方法](http://qiita.com/utibenkei/items/eee141cd2f1656b19cc2)
[UnityでOpneCVを利用した動画再生をしてみた](http://qiita.com/utibenkei/items/aaaa6cf5b470aa4f69d5)
UnityでOpneCVを利用したハコスコVR体験
Embulk のプラグイン開発に IntelliJ IDEA を使う

Java のコードは流石に vim で書くよりは IDE を使ったほうがいいよな、と思ったので試してみたメモ。対象は Java な Embulk のプラグインの開発で、JRuby なプラグインの開発の場合はまだ試していない、というか vim でいいかなと思っていて試していない。

補完利いてブレークポイントが貼れるようになったので最高。

## IntelliJ IDEA のインストール

省略します。https://www.jetbrains.com/idea/ へどうぞ。

JAVA_HOME を調べておく必要があるので、Mac の場合

```
/usr/libexec/java_home -v 1.8
```

のようにして調べておくと良い。

## プロジェクトの読み込み

IntelliJ を起動して、Open を選び、プラグインのディレクトリを開くと Gradle プロジェクトとして認識されるはずなので、あとは以下のように設定すると良い．基本的にはこれだけ。

![image](https://qiita-image-store.s3.amazonaws.com/0/9641/fc6432ed-058d-14b6-eb39-9b04aa96b65f.png)

* Use auto-import をチェック(お好みで)
* Create directories for empty content roots automatically (お好みで)
* Use default gradle wrapper (recommended) をチェック
* Gradle JVM に調べておいた JAVA_HOME のパスを設定

開くと gradle wrapper を使って gradle が落とされてきて、gradle を使って依存ライブラリも落とされて来て、補完なんかも利くようになるはず。

## ビルドタスクを作る

`./gradlew classpath` や `./gradlew test` などを IntelliJ から実行できるようにする。

Run > Edit Configurations

![image](https://qiita-image-store.s3.amazonaws.com/0/9641/e7d9cb71-f48d-b884-22b4-56b545e320b8.png)


+ > Gradle

![image](https://qiita-image-store.s3.amazonaws.com/0/9641/db6036ba-d193-ba61-fcfd-e2320e94d9f3.png)

例えば `gradlew test` 相当を作りたいなら、Tasks に `test` と入れる。

![image](https://qiita-image-store.s3.amazonaws.com/0/9641/8ea3b312-e1b3-86b3-9059-1e599da96f63.png)

Ctrl + Option + r でビルドタスク一覧が出て来るので選択して走らせる。

![image](https://qiita-image-store.s3.amazonaws.com/0/9641/be06f437-03e0-6b4e-f6d1-546327319377.png)

## 実行タスクを作る

Embulk をお試し実行するタスクを作る。

同じく Run > Edit Configuration から、今度は + > JAR Application を選択する。

![image](https://qiita-image-store.s3.amazonaws.com/0/9641/3f1c5215-7a95-3517-271d-db9604c9ffe5.png)

embulk のインストール先([README](https://github.com/embulk/embulk#linux--mac--bsd)通りであれば、`~/.embulk/bin/embulk`) と引数を指定したタスクを作る。自分は example.yml を置いているので、それを指定する。

![image](https://qiita-image-store.s3.amazonaws.com/0/9641/7a671e84-af9e-aefd-5241-fb818b2fc05b.png)

これで、そのタスクを実行すれば `embulk run -I lib example.yml` を実行できるようになった。

TIPS: VM options に `-XX:+AggressiveOpts -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -Xverify:none` を入れておくと起動が早いかもしれない。`embulk -J-O run` と実行した時に Java に渡される最適化をオフにするオプション

## git を使う

最初から Git Plugin が入っているようで、VCS メニューから、Commit などを選択できた。

## ブレークポイントを貼る

行の所をクリックすると赤丸が出る。

![image](https://qiita-image-store.s3.amazonaws.com/0/9641/2a1434ce-0f32-b85d-07d6-34118605123c.png)


Debug モードでタスクを実行すれば良い。例えば、Ctrl + Option + d で Debug 実行できる

![image](https://qiita-image-store.s3.amazonaws.com/0/9641/e2680f3a-9160-6493-ae96-a3cbe2f116bc.png)

右上の Run メニューの虫マークとか。

![image](https://qiita-image-store.s3.amazonaws.com/0/9641/efeda1f5-11d8-6b6b-08d3-b6a46c4a34af.png)


走らせるとブレークポイントを貼った行で止まって、Debug コンソールが出るので Step Over で次の行に進んだりすればよい。

![image](https://qiita-image-store.s3.amazonaws.com/0/9641/5771e9dd-24fb-096d-81b7-b5d47e6b1e33.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/9641/0ea3eb3f-b4f6-af75-9fc7-8f3ceb26bee3.png)

## 特定のテストだけ走らせる

UnitTest のコードにカーソルをあてて Ctrl + Option + r で Run メニューを出す。

![image](https://qiita-image-store.s3.amazonaws.com/0/9641/f96b7f7e-7984-8287-34c6-db9a54489d58.png)


この例では `testNotEquals` だけ走らせる選択肢が増えていることがわかる。
Laravel5.0.x の Elixir3.0.x で compass を使う

```js
var gulp = require('gulp');
var compass = require('gulp-compass');
var Elixir = require('laravel-elixir');
var Task = Elixir.Task;

var compassTask = function(src, output, options) {
    new Elixir.Task('compass', function() {
        return (gulp.src(src).pipe(compass(options)).pipe(gulp.dest(output)));
    }).watch(config.get('assets.css.sass.folder') + '/**/*.+(sass|scss)');
};
Elixir.extend('compass', function() {
    compassTask.apply(this, arguments);
});

Elixir(function(mix) {
    mix
        .compass('resources/assets/sass/*.scss', 'public/assets', {
            config_file: './config.rb',
            project: __dirname + '/resources/assets',
            css: '../../public/assets/css'
        });
});
```
unity > custome editor > [CustomEditor(typeof(...))] / OnInspectorGUI() / EditorGUILayout.IntField() / EditorGUILayout.LabelField()


https://unity3d.com/learn/tutorials/modules/intermediate/editor/building-custom-inspector

1. EmptyGameObjectを追加する
2. 以下のスクリプトを関連づける

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

public class LevelScript : MonoBehaviour {
	public int experience;

	public int Level
	{
		get { return experience / 750; }
	}

}
```

3. Assetの下に Editor フォルダを作成する
4. Editor フォルダに LevelScriptEditor.cs を作成する

```csharp:LevelScriptEditr.cs
using UnityEngine;
using System.Collections;
using UnityEditor;

[CustomEditor(typeof(LevelScript))]
public class LevelScriptEditor : Editor {
	public override void OnInspectorGUI()
	{
		LevelScript myLevelScript = (LevelScript)target;

		myLevelScript.experience = EditorGUILayout.IntField ("Experience", myLevelScript.experience);
		EditorGUILayout.LabelField ("Level", myLevelScript.Level.ToString());
	}
}
```

これをすると何ができるかというと、EmptyGameObjectのLevelScriptインスペクタにLevelという項目が追加され、その値はLevelScript.csで定義した計算式に基づく。
Day10 高德地图 音频视屏 （网络第03天）


#高德地图
（查看文档AMap_iOS_API_Guide_V2.6.0  网络第07天里）

    @property (nonatomic , strong) MAMapView * mapView;
    @property (nonatomic , strong) AMapSearchAPI * search;


    //key值
    [MAMapServices sharedServices].apiKey = @"d60542548c37aff7c70597a7c15039e9";
    //设置地图 （卫星地图）MAMapTypeSatellite
    self.mapView.mapType = MAMapTypeSatellite;

//创建地图视图

    CLLocationCoordinate2D c2d =   CLLocationCoordinate2DMake(30.662221, 104.041367);
    MACoordinateSpan span = MACoordinateSpanMake(0.01, 0.01);
    MACoordinateRegion  region = MACoordinateRegionMake(c2d, span);
    [self.mapView setRegion:region];
    [self.view addSubview:self.mapView];

//搜索服务

    self.search = [[AMapSearchAPI alloc]initWithSearchKey:@"d60542548c37aff7c70597a7c15039e9" Delegate:self];
    //构造request请求 对象 ，配置关键字搜索参数   搜地方的请求
    AMapPlaceSearchRequest * poliRequest = [[AMapPlaceSearchRequest alloc]init];
    poliRequest.searchType = AMapSearchType_PlaceKeyword;
    poliRequest.keywords = @"大学";
    poliRequest.city = @[@"成都"];
    [self.search AMapPlaceSearch:poliRequest];


   //搜索的信息回调
   
      -(void)onPlaceSearchDone:(AMapPlaceSearchRequest *)request response:(AMapPlaceSearchResponse *)response{
    
       NSArray * array = response.pois;
    for (AMapPOI * poi in array) {
        NSLog(@"%@",poi);
         }
    }
   //显示隐藏交通状况
   
    -(void)foo:(UIButton *)btn{
    self.mapView.showTraffic = !self.mapView.showTraffic;
}



#断点续传
HTTP协议请求头可以设置Range：bytes=字节数-，

#应用沙盒 
（网络第03天）详情

#音乐播放
Ruby 配列 Array

配列：Array

names = [ "A", "B", "C" }
names = [0]
print "最初の名前は", name[0], "です"
>> 最初の名前はAです

array.size 配列の大きさを得るメソッド

配列と繰り返し

配列.each do |変数|
繰り返したい処理
end

do - end ブロック eachの様なメソッドをブロックつきメソッドという
names = [ "A", "B", "C", "D"]
names.each do |n|
puts n
end
Ruby基礎の基礎 用語解説 while文

メソッド：オブジェクトを扱うための手続き
引数：メソッドに渡す情報
変数：変数名：オブジェクト
a = 10 >> aは変数、10はオブジェクト

while 繰り返し続ける条件 do
 繰り返したい処理
end

i = 1 
while i <= 10
print i, "\n"
i = i +1
end
JavaのテストにはAssertJがオススメ


JavaでのテストはJUnit4が使われていると思いますが、自分としては、それに加えてAssertJをオススメします。

- [AssertJ](http://joel-costigliola.github.io/assertj/)

# AssertJが使いやすい理由

JUnit4のassertThatと比べてAssertJが使いやすい理由は2つあります。

## 流れるようなインターフェース

AssertJは「Fluent assertions for java」とトップページに大きく書かれているように、流れるようなインターフェースが最大の特徴です。いちいちドキュメントを調べなくても、IDEの補完機能で適切なメソッドを調べられるので、JUnit4のassertThatに比べて書きやすいです。

## 拡張がMatcherに比べて遥かに楽

Matcherの拡張対象は「比較方法」で、AssertJの拡張対象は「クラス」なので比較するのは適切ではないかもしれませんが、Matcherの拡張が靴の上から足を掻く感じなのに比べて、AssertJの拡張はシンプルです。

それに、実際にプログラムを書いていると、比較方法の拡張が必要なケースはあまりなく、自作クラスでAssertしたいことの方が圧倒的に多いです。

### カスタムAssertionの定義

FooClassのカスタムAssertionは以下のように作れます。Genericsの使い方がちょっと不思議に感じるかもしれませんが、自分で作ってみると納得できます。

```java
public class FooClassAssert extends AbstractAssert<FooClassAssert, FooClass> {
  // ここは定型文
  public FooClassAssert(FooClass actual) {
    super(actual, FooClassAssert.class);
  }

  // ここも定型文
  public static FooClassAssert assertThat(FooClass actual) {
    return new FooClassAssert(actual);
  }

  // 独自Assertion
  public FooClassAssert hasValue(String key) {
    // ここも定型文
    isNotNull();

    // Assertionの実質的な本体
    if (actual.getValue(key) == null) {
      failWithMessage("エラーメッセージ");
    }

    // メソッドチェーンをするためthisを返す
    return this;
  }
}
```

### カスタムAssertionの使用

```java
// assertThatを使うためのstatic importは必要
assertThat(fooObj).hasValue("bar");
```

## 最後に

AssertJは日本だとびっくりするくらいマイナーなのが残念です。JUnit4のassertThatにモヤモヤしている人は試してみてはどうでしょうか？
unity > トルクゲー > 回転3くらいで着地せよ > Mathf.Abs() / Mathf.Epsilon / Ridigbody.angularVelocity.y / AddForce() / AddTorque()

```txt:動作確認
Unity 5.1.2 on MacOS X
```

トルクを調整してPlaneにCubeを着地させるゲーム。

##code

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

public class CubeControl : MonoBehaviour {

	public Rigidbody myRigid;
	private int score = 0;
	private bool gameEnd = false;

	void Judge() {
		float torq;
		torq = Mathf.Abs( myRigid.angularVelocity.y );
		print (torq.ToString ());
		if (Mathf.Abs(torq - 3.0f) > Mathf.Epsilon) {
			score = (int)(100000.0f / Mathf.Abs(torq - 3.0f));
		} else {
			score = 10000000;
		}
	}

	void OnCollisionEnter() {
		gameEnd = true;
		Judge ();
	}

	void OnGUI() {
		Rect rect1 = new Rect (10, 10, 100, 30);
		GUI.TextField (rect1, score.ToString ());
	}

	void Update () {
		if (gameEnd) {
			return;
		}
		if (Input.GetKey (KeyCode.UpArrow)) {
			myRigid.AddForce(Vector3.up);
		}
		if (Input.GetKey (KeyCode.DownArrow)) {
			myRigid.AddForce(Vector3.down);
		}

		if (Input.GetKey(KeyCode.LeftArrow)) {
			myRigid.AddTorque(Vector3.up);
		}
		if (Input.GetKey(KeyCode.RightArrow)) {
			myRigid.AddTorque(Vector3.down);
		}	
	}
}
```

##準備
1. Planeを追加 (Y: -0.5)
2. Cubeを追加 (Y: 2.0)
3. CubeにRigidBodyを追加 (Use Gravity:OFF)
4. Cubeに上記スクリプトを関連づける

##遊び方
上下カーソルでCubeが上下移動。
左右カーソルでCubeが左右回転。
左右回転をさせた状態でPlaneに着地させることで、判定が行われる。
トルクの絶対値が3付近で高得点。
Rubyの基礎 名前付きルート

ルーティングで設定した名前URLには、"名前付きルート"が割り振られる
Railsではこの名前つきルートを使ってURLを取得できる
名前つきルートはターミナルからrake routesコマンドで確認できる

左の図、黄色の枠内の名前に"_path"をつけたものが名前つきルートになる
リンクの送信先のURLなどは名前つきルートを使って指定

$ rake routes

Prefix   Verb  URI Pattern Controller#Action
top     GET    /top        home#top
about(about_path生成) GET /about home#about(about_path(名前つきルート)は/aboutを指す
WebBrowserで使用するIEのバージョンを変える方法

はまったのでメモ。
VisualC#でWebBrowserを使って、Webページを表示するとき、使用されているIEのバージョンが7と古くて崩れてしまうページが多い。

なので、使用するIEのバージョンを変更してあげる必要がある。

レジストリエディタを起動して、以下にキーを追加する。

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

たとえば、WebDriverApp.exeをIE11で動かしたい場合は以下のように、
WebDriverApp.exeという名前のキーをを追加すればよい。REG_DWORD＝11000(10進数)

![capture.png](https://qiita-image-store.s3.amazonaws.com/0/1553/d0867cb1-cf34-0ff3-a0f2-ba120cec09f5.png)

VISUALStudioでデバッグしたいときは.vshost.exeも忘れずに。

HKEY_LOCAL_MACHINEでも行けると思うのだけど、私の環境では無視されてしまった。（権限の問題だと思うけど）
『Error: Default Activity Not Found』が出た時の対処法

AndroidアプリをRunする時に `Error: Default Activity Not Found` と出てしまった時の対処方法です。

# AndroidManifestを確認
AndroidManifest.xmlのactivityのところに、 `android.intent.action.MAIN` と `android.intent.category.LAUNCHER` がセットされているかを確認しましょう。

```AndroidManifest.xml
<activity
    android:name="com.your.package.name.YourActivity"
    android:label="@string/app_name">
    <!-- このへん -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
```

# AndroidStudioのキャッシュをクリア
AndroidManifestに問題ない場合、AndroidStudioのキャッシュが悪さをしている可能性があります。

`File > Invalidate Caches / Restart...` から `Invalidate and Restart` してみましょう。

![File_と_Menubar.png](https://qiita-image-store.s3.amazonaws.com/0/15267/a98a4951-f484-a311-cfcd-71ebd149bab9.png "File_と_Menubar.png")

AndroidStudio経由ではなくコマンドでビルドして走らせてる場合は問題ないはずです。

以上！
[Mac]Cocos2d-x開発環境構築＆Hello World


# 1. 概要
## `Cocos2d-x`とは
`Cocos2d-x`はゲーム開発でよく用いられる、主に2次元の描画を得意とするフレームワークです。
iOSもAndroidも、Cocos2d-xを使えば同じ記述で描画ができてとても便利です。

※ iOSのみ（or Androidのみ）に特有の処理が必要な場合もあり、「完全に同じ記述で描画可能」とは限らないため注意。

## 開発に必要なもの
- `Cocos2d-x`：Cocos本体。
- `Xcode`：iOS開発に必要。統合開発環境（IDE）。
- `Android SDK`：Android開発に必要。
- `Android NDK`：Androidアプリケーションの一部をCやC++で開発するために必要。
- `Apache Ant`：ビルドツール。Javaで書かれている。

# 2. 開発環境構築
## 2-1. 必要なもののダウンロード、インストール
### Cocos2d-xのインストール
- ダウンロードURL：http://www.cocos2d-x.org/download
- ダウンロードしたzipを解凍

### Xcodeインストール
- AppStoreからダウンロード

### Android sdkインストール
- ダウンロードURL：https://developer.android.com/sdk/index.html#top

### Android ndkインストール
- ダウンロードURL：http://developer.android.com/ndk/downloads/index.html

ダウンロードしたbinを実行する。
（ダウンロードしたファイルがあるディレクトリに移動しておくのを忘れずに）

```
chmod a+x android-ndk-r10e-darwin-x86_64.bin
./android-ndk-r10e-darwin-x86_64.bin
```

### Apache antのインストール
- ダウンロードURL：https://www.apache.org/dist/ant/binaries/

zipをダウンロードしてきて、ダブルクリックで展開すればOK。

ここまでが完了し上手く行っていたら、

- android-ndk-r10e
- android-sdk-macosx
- apache-ant-1.9.5
- cocos2d-x-3.7

がローカルにある状態となっているはず。
（バージョンは適宜読み替えてください）

## 2-2. `setup.py`の実行
```
/path/to/cocos2d-x-3.7/setup.py
source ~/.bash_profile
```

`setup.py`を実行すると、対話的に

- android-ndk
- android-sdk
- apache-ant

のパスが求められる。
それぞれ、該当するファイルパスを入力して`Enter`を押せばよい。

```
Please enter the path of NDK_ROOT (or press Enter to skip):/path/to/android-ndk-r10e
Please enter the path of ANDROID_SDK_ROOT (or press Enter to skip):/path/to/android-sdk-macosx
Please enter the path of ANT_ROOT (or press Enter to skip):/path/to/apache-ant-1.9.5/bin
```

`source ~/.bash_profile`により、`~/.bash_profile`の内容をshellに反映させることができる。

### android sdkの更新
```
/path/to/android-sdk-macosx/tools/android update sdk
```

これを実行することで、SDKマネージャが立ち上がる。選択されているものをinstallすればOK。

# 3. Hello World
`Cocos2d-x`プロジェクトの新規作成や実行は、コマンドライン上でコマンド実行することで可能。

- `cocos new`コマンド：プロジェクト作成
- `cocos run`コマンド：プロジェクト実行

## 3-1. `cocos new`（プロジェクト作成）
▼実行例

```
cocos new MyGame01 -d ~/Cocos2dx -p com.mycompany.mygame01 -l cpp
```

- `cocos new プロジェクト名`：指定したプロジェクト名の新規プロジェクトを作成
- `-d`オプション：プロジェクトを作成するディレクトリを指定
- `-p`オプション：パッケージ名を指定
- `-l`オプション：使用する言語を指定
  - `cpp`：C++
  - `lua`：Lua
  - `js`：JavaScript

詳細なオプションが気になる時は、`cocos new -h`を実行すればOK。

## 3-2. `cocos run`（プロジェクト実行）
▼実行例

```
cocos run -s ~/Cocos2dx/MyGame01/ -p ios
```

- `-s`オプション：プロジェクトのソースディレクトリのパスを指定
- `-p`オプション：プラットフォームを指定
  - `ios`
  - `android`

詳細なオプションが気になる時は、`cocos run -h`を実行すればOK。

runを実行成功すれば、Hello Worldが表示される。
Rubyの文法 メソッド、リンク

メソッド名 (引数1, 引数2)
の様にメソッドは引数を与えて呼び出す
引数はメソッドごとに与えられる順番が決まっていて、
カンマを区切って指定する
Rubyではこの引数を囲む()を省略できる

<%=link_to ("Progateへようこそ", "http://prog-8.com ") %>
本来は( ) の中に引数を与える
<%=link_to "Progateへようこそ", "http://prog-8.com" %>
( ) を省略して引数を与える事ができる
＊引数の前に必ず半角スペース入れる
Railsにおけるリンクの書き方

HTML <a href = "URL">

Rails: link_to ヘルパー
ヘルパー：Railsに標準んで用意されている便利なメソッド
<% = link_to "表示するテキスト", "URL" %>

top.html.erb
<%= link_to "about", "/about" %>

top.html
<a href= "/about"> About <a>
(href = "localhost:3000/about"と同じ)
QGISプラグインの作り方（パッケージ生成編）


## 概要
QGISはPythonでプラグインを書くことができます。QGISと連動させる形でPythonを色々と利用ができますが、プラグインを記述することはその一つの使い方です。

QGISとPythonでできることは公式サイトの以下ページに記述があります。
http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/

プラグイン作成についての公式サイトの該当ページ
http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/plugins.html#developing-plugins

あるユーザー（ただしGoogler）による英語での手順記事
http://www.qgistutorials.com/en/docs/building_a_python_plugin.html

必要なファイル一式を生成できるプラグインがあるので、ここではそれを使ったファイル一式を用意するまでの手順を以下に記します。

## 必要なツールのインストール
- Plugin Builder (プラグイン生成プラグイン)
- Qt Designer (GUIを編集するツール)
	- Qt Creator on Mac (http://qt-project.org/downloads)
	- Qt Designer on Ubuntu (apt-getでインストール。'sudo apt-get install qt4-designer')
	- WinPython on Windows (http://winpython.sourceforge.net/)
- Plugin Reloader (プラグイン上の機能を修正した際に、アプリの再起動なしに修正内容を反映させることができるプラグイン。必須ではないです)

## 使ってみる

QGISのプラグインメニューからPlugin Builderを起動します。

![スクリーンショット 2015-08-01 15.53.03.png](https://qiita-image-store.s3.amazonaws.com/0/1417/a45fa78c-b380-cffd-0e69-a0e70a27c794.png "スクリーンショット 2015-08-01 15.53.03.png")

必要な項目を記載して、OKボタンを押します。
保存場所を聞かれます。どこに保存することもできますが、QGISがプラグインフォルダと認識している場所に保存しないとQGISからは認識されません。

![スクリーンショット 2015-08-01 16.34.37.png](https://qiita-image-store.s3.amazonaws.com/0/1417/82a926ab-4a15-69d6-54dd-6e5761affe1b.png "スクリーンショット 2015-08-01 16.34.37.png")

Macの場合、以下の場所が、デフォルトのプラグインを置く場所です。
  /Users/(username)/.qgis2/python/plugins

![スクリーンショット 2015-08-01 15.55.19.png](https://qiita-image-store.s3.amazonaws.com/0/1417/e178be13-f7b9-1584-be68-33d5eb9599d8.png "スクリーンショット 2015-08-01 15.55.19.png")

.が頭につくフォルダは初期設定のFinderでは表示されないためGUIでは移動できませんが、「移動」→「フォルダへ移動…」というメニューを選び、上記ファイルパスを入力すると確実です。もしくはCUIでフォルダを移動させてください。


## プラグイン・アイコン
QGIS上で表示するアイコン画像をカスタマイズすることができます。ただし用意されたツールでQGISが読み込める用に変換してあげる必要があります。このファイルは必須にもかかわらず、このツールでファイルを生成した状態には含まれていないので、カスタマイズするしないにかかわらず、一度は変換命令を実行する必要があります。
プラグインのディレクトリ内で以下のコマンドを実行します。

```
pyrcc4 -o resources_rc.py resources.qrc
```
アイコン画像の有りかをXML形式で記述したresources.qrcが生成されます。

## UIの編集
- ******._dialog_base.ui(***はプラグイン名)をQt Creatorで編集します。

![スクリーンショット 2015-08-01 16.41.29.png](https://qiita-image-store.s3.amazonaws.com/0/1417/8d70843a-67f1-9960-dd49-496b2129e8d0.png "スクリーンショット 2015-08-01 16.41.29.png")

## プラグイン機能をファイルへ記述する
- ******.py(***はプラグイン名)に記述していきます。
- 外部ライブラリを読み込む際は、このファイルの冒頭に記述します。
-最低限必要な関数は以下のとおりです。
	- __init__ QGISからアクセスできるようにするために必要
	- initGui() プラグインが読み込まれた際に実行される
	- unload() プラグインが終了する際に実行される
	- run(self) プラグインの内容を記述していく
Ruby on Rails 基礎編 変数

progate資料より

アクションの中で、@変数名として変数を定義すると、
その変数を対応するビューの中で用いることができる@をつけ忘れるとビューで用いる事はできない。
必要な変数を全てコントローラで定義すると、ビューは見た目を作る事に専念させる事ができる。

home_controller.rb
def top
@message = "ようこそGatebookへ"
titile = "Ruby on Rails"
end
end

top.html.erb
<h1> こんにちは </h1>
<%= @message %>
<%= title %> 機能しない
CentOS 7 で日本語入力関連設定

## 前提
CentOS7 でも標準の Gnome デスクトップ環境であれば、簡単に日本語入力ができるのだが、私は Gnome を経由しない XMonad 環境を使っているので、設定が必要だった。

## やったこと
```shell-session
$ sudo localectl set-keymap jp-OADG109A
$ sudo localectl set-locale LANG=ja_JP.utf8
$ sudo localectl --no-convert set-x11-keymap jp106
$ ibus-setup
```
 日本語を Ctrl+Space で入力できるように設定
 
 ibus-setup を実行すると日本語入力時はちゃんと日本語キーボードのレイアウトなのだが、アルファベット入力のときに、なぜか英語キーボードのレイアウトとなった。理由は不明。

対処として .bash_profile に下記を追記した。

```shell-session:.bash_profile
/usr/bin/ibus-daemon --daemonize --xim # おまじない
setxkbmap -rules evdev -model jp106 -layout jp
```

上記設定を .xinitrc や .xprofile に設定するのも試してみたが、うまくいかず、 .bash_profile で設定するとうまくいった。

詳しい人、教えてほしい。
unity > Torqueの大きさを取得 > Rigidbody.angularVelocity.y;

```txt:動作確認
Unity 5.1.2 on MacOS X
```

Torqueの大きさを知りたい。

http://answers.unity3d.com/questions/17012/how-to-get-local-angularvelocity.html

```csharp
if (Input.GetKey (KeyCode.Space)) {
  double torq;
  torq = myRigid.angularVelocity.y;
  print (torq.ToString());
}
```

コンソールに表示して見たところ、[-7,7]の間で変化した。
torque <= |7|の制限はどこから来るのか不明。
Ruby on Rails基礎編 CSS/HTML

引き続きprogateの秀逸な学習資料からメモ

＊CSSファイルはapp/assets/stylesheetsフォルダ
home.scssファイル
scssはCSSを効率的に書く文章を使用できる

＊erb = embedded Ruby Rubyの埋め込みが出来るHTMLファイル
<%  %>(表示されない) か <%=  %>の中にRubyのコードを埋め込む(表示：HTMLとして出力)

＊ビュー＝見た目を作るファイル 必要最低限 コントローラ＝変数定義

top.html.erb
<% message = "こんにちは" %>
<%= message %>

home_controller.rb
class HomeController
def top
end
end
ConohaにDockerをインストールする


前提: [ConohaにVPSを設置して、SSHログイン、ポート番号変更、rootログイン禁止までを30分で！](http://qiita.com/ongaeshi/items/bb17ebfbd4d22057c8fd)が終わり、作業ユーザーでログインしている

## Dockerのインストール

[公式同人誌](https://www.conoha.jp/download/books/conoha-book-03-docker.pdf)があるのでそちらを使います。

```
$ sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6 
$ sudo yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum -y install docker-io
$ sudo service docker start
```

※ rootユーザーじゃないのでsudoが必要です。

CentOS7だとrpmのインストールは不要かもしれません。

```
$ sudo yum -y install docker-io
$ sudo service docker start
```

無事インストールされました。

```
$ sudo docker --version
Docker version 1.6.2, build ba1f6c3/1.6.2
```

再起動(sudo reboot)したときのために自動起動も設定しておきましょう。

```
$ sudo systemctl enable docker.service
```

## まとめ

これでVPS環境でDockerを使えるようになりました。次はWebアプリケーションをコンテナベースでデプロイしていきましょう。
ちゃんと確認してる？スマホアプリの異常系テストケース例

ずっとWebアプリケーションの開発を担当していた私ですが、最近初めてスマートフォンアプリの開発に関わりました。いざリリースしてみたら、想定していない挙動や不具合が多発してしまい。。。テストケースをもっと多くしておけばよかったなあと反省しまして。

では、どんなテストケースがあれば良かったのか？
スマートフォンアプリでは、Webアプリと違って下記のような異常系の操作を考慮しないといけないようです。簡単ですがまとめてみました。

# API連携での異常系

* ネットワークエラー（ネットワークに接続できていない場合）
* ネットワークエラー（サーバが停止している場合）

# イレギュラーなオペレーション

* ボタン連打
排他制御が行われていなかったりすると、同じ画面を複数会開こうとしてしまったりの不具合が。
* 複数のボタンを同時に押す
例えば課金アイテムを複数同時に押す、など。課金処理が中途半端に成功したりしてユーザに正しく課金アイテムを反映できなかったりする恐れが。
* 高速スクロール
メモリを考慮しない実装だと、アプリが落ちやすくなったりする。
* 何かの処理中（API通信とか）にアプリをバッググラウンドに移動させる
* 何かの処理中に戻るボタンを押下（Android）

他にもこんなケースが危ない！などありましたら教えていただけると幸いです。
unity > Cubeを上下移動、左右回転 > AddForce() / AddTorque()

```txt:動作確認
Unity 5.1.2 on MacOSX
```

Cubeを上下に移動したり、左右に回転させる。

```csharp
using UnityEngine;
using System.Collections;

public class CubeControl : MonoBehaviour {

	public Rigidbody myRigid;

	void Start () {
	
	}
	
	void Update () {
		if (Input.GetKey (KeyCode.UpArrow)) {
			myRigid.AddForce(Vector3.up);
		}
		if (Input.GetKey (KeyCode.DownArrow)) {
			myRigid.AddForce(Vector3.down);
		}

		if (Input.GetKey(KeyCode.LeftArrow)) {
			myRigid.AddTorque(Vector3.up);
		}
		if (Input.GetKey(KeyCode.RightArrow)) {
			myRigid.AddTorque(Vector3.down);
		}		               
	}
}
```

ここで、「左回転」は操作者から見た左への回転とする。

http://docs.unity3d.com/ScriptReference/Rigidbody.AddTorque.html
> 
x	Size of torque along the world x-axis.
<font color=red>y	Size of torque along the world y-axis.</font>
z	Size of torque along the world z-axis.

http://docs.unity3d.com/ScriptReference/Vector3-up.html
> Shorthand for writing Vector3(0, 1, 0).
Ruby on Rails基礎編 ルーティング

引き続き 秀逸な教材progateの学習メモ

＊ブラウザ＞ルーティング＞コントローラ(アクション)＞ビュー＞ブラウザ という動き

＊Gatebookのaboutページ：localhost:3000/about

＊Railsでは、アクションはファイル名を手掛かりにビューを探すので、ビューのフォルダ名とファイル名は非常に重要。ビューのフォルダ名＝コントローラ名、ビュールファイル名＝アクション名

＊ルーティグファイル
Rails.application.routes.draw do
get '/about' => 'home#about'
end

＊ブラウザ＞localhost:3000 > ルーティング get 'top' => 'home#top' > homeコントローラ def top end > home/top.html.erb

＊ターミナルで、rake routesをコマンド入力すると、ルーティングの一覧が表示され、URL(リクエスト)に対応するコントローラとアクションを確認できる。ルーティングを確認し、正しいURLを指定する。
$ rake routes
Prefix  verb  URI Pattern(URLのパターン) Controller#Action(URLに対応するアクション)
home_top / GET / home/top / home#top
about ? GET / /about / home#about
Emacs で Crystal を書く

みんな大好き Emacs で [Crystal](http://crystal-lang.org/) を書くための記事です。

Ruby ライクなシンタックスを持っているということもあって意外と ruby-mode でいけるのでは感はあります。実際、Crystal 独自機能を使わないようなコードを書く分には十分です。
ただ、型宣言とかマクロのような Crystal 独特のものを書こうとすると ruby-mode ではシンタックスハイライトが死にます。やはり Crystal に合わせたメジャーモードを使いたいところです。

ruby-mode でマクロを表示させた時の悲しい例:
![image](https://qiita-image-store.s3.amazonaws.com/0/17508/fb8d8ca4-39ed-ec71-22b1-4c192b9d8de9.png)

そして [Crystal Wiki の Editor support](https://github.com/manastech/crystal/wiki#editor-support) で Emacs がハブられている！どういうことだ！

## メジャーモード

[jpellerin/emacs-crystal-mode](https://github.com/jpellerin/emacs-crystal-mode)

crystal-mode があります。が、このメジャーモードは今のとこ MELPA とかに登録されている気配が無いです… [^1]
el-get 使いなら以下の一文を `init.el` にでも書いときましょう。

```el
(el-get-bundle jpellerin/emacs-crystal-mode)
```

マクロもちゃんとハイライトされてます。String interpolation がまだあやしいけど…
![image](https://qiita-image-store.s3.amazonaws.com/0/17508/bcf31b50-facd-c16a-ee3d-7dcdae7cc911.png)


自分は使ってないですが、[flycheck 用のコード](https://github.com/jpellerin/emacs-crystal-mode/blob/master/crystal-flycheck.el)も入っているみたいです。

## マイナーモード

マイナーモードに関しては、Ruby のものを流用することができます。
たとえば、

- ruby-block
    - `end` に対応する行をハイライトしてくれる
- ruby-end
    - `def`, `if` 等に対応した `end` を自動で挿入してくれる

```el
(add-hook 'crystal-mode-hook 'ruby-block-mode)
(add-hook 'crystal-mode-hook 'ruby-end-mode)
```

## そのほか

Projectfile は crystal-mode で開くよう設定しておきましょう。

```el
(add-to-list 'auto-mode-alist '("Projectfile$" . crystal-mode))
```

## おわりに

みんなで Crystal 書きましょう :exclamation: 

## REF
- [dtan4/dot.emacs.d](https://github.com/dtan4/dot.emacs.d)
    - [dot.emacs.d/60-crystal.el at master · dtan4/dot.emacs.d](https://github.com/dtan4/dot.emacs.d/blob/master/inits/60-crystal.el)

[^1]: Issue をたてたぞ [Make crystal-mode available on MELPA · Issue #6 · jpellerin/emacs-crystal-mode](https://github.com/jpellerin/emacs-crystal-mode/issues/6)
ぼくのかんがえたさいきょうの .gitignore

久しぶりの投稿です。頭使わなすぎて腐るかと思いました。
最近新しいリポジトリを作るときはとりあえず僕の秘伝の `.gitignore` を流しこむことにしている。

ソース一式とか言って ZIP で固めたソースファイルに紛れ込んでたりしますね。
以下のようなルールとなっている。

1. Emacs や Vim が作るバックアップファイル (`~`) 、テンポラリファイル (`.swp`) 系だったり
2. Windows 系のエディタやマージツールが吐き出すバックアップファイル `.bak` を無視するようにしている。
3. OSが吐き出すファイル `.DS_Store`, `Thumbs.db`
3. Ruby の Bundler 系で入れる gem は無視するようにしている。
4. Office 関係のファイルを開いた時にできる忌まわしい隠しファイルも無視 `~$*`
5. Vagrant のディレクトリも無視
6. 運用でよく紛れ込む `config.php.20150801` とかいう忌まわしいもの。

編集リクエストウェルカム
-------------------------

### スペシャルサンクス

1. @hirokishirai さん yyyyMMdd -> `[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]` glob での書き換えを教えてもらいました！

```:.gitignore
# Project Specific rules here

# Temporary Files
#---------------------------
# vim
[._]*.s[a-w][a-z]
[._]s[a-w][a-z]
*.un~
Session.vim
.netrwhist
# Emacs
.\#*
# Backup files
#---------------------------
*~
*.orig
*.bak
# yyyyMMdd
*.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
# yyyyMMddHHmm
*.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
# yyyyMMddHHmmss
*.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
# OS dependent files
#---------------------------
.DS_Store
Thumbs.db
# Bundler specific
#---------------------------
/vendor/bundle/
/.bundle/
# Office specific
~$*
*.tmp
# Vagrant specific
.vagrant/
```

ソース管理にこういうゴミファイルを平気で突っ込んでいる人がいたらやさしく注意してあげたい。
そして以下のようにする。

```
git rm --cached config.php.20150801
```

生ファイルは以下。

-
 https://gist.githubusercontent.com/wnoguchi/36cc49a9590cbec4aba3/raw/20d3e63eae925a9c600fee66cd3ea21433a48aef/common.gitignore

元の Gist は以下を参考にされたい。

- [ぼくのかんがえたさいきょうの .gitignore 。](https://gist.github.com/wnoguchi/36cc49a9590cbec4aba3)

その他に必要な無視ルールはプロジェクト特性ごとに区切って

- [gitignore.io - Create Useful .gitignore Files For Your Project](https://www.gitignore.io/)

で自動生成できたり、

- [github/gitignore](https://github.com/github/gitignore)

にプロジェクト特性ごとにリポジトリとして揃っているので、そこから引っ張ってくるのが良い。
イベントリスナを実装してみる。

プロトタイプでイベント定義していくやつ使いどころがよくわからなかったのがだんだん見えてきたのでメモ。

オブジェクトに汎用性が出てくるのでうまく使えたら便利かもしれない。

```js
var timer  = null;
var timer2 = null;

window.addEventListener("load", function()
{
  timer = new Timer();
  timer.addEventListener("f",  function(time){ console.log(time + ": fizz"); });
  timer.addEventListener("b",  function(time){ console.log(time + ": buzz"); });
  timer.addEventListener("fb", function(time){ console.log(time + ": fizzbuzz"); });
  timer.start();

  setTimeout(function()
  {
    timer2 = new Timer();
    timer2.addEventListener("f",  function(time){ console.log(time + ": fizz!"); });
    timer2.addEventListener("b",  function(time){ console.log(time + ": buzz!"); });
    timer2.addEventListener("fb", function(time){ console.log(time + ": fizzbuzz!"); });
    timer2.start();
  }, 500);
});

function Timer()
{
  this.time = 0;
  this.events = {};
}
Timer.prototype.start = function()
{
  var _this = this;

  setInterval(function()
  {
    _this.time = _this.time + 1;

    if(_this.time % 15 == 0)     _this.trigger("fb", _this.time);
    else if(_this.time % 5 == 0) _this.trigger("b" , _this.time);
    else if(_this.time % 3 == 0) _this.trigger("f" , _this.time);
  }, 1000);
};
Timer.prototype.addEventListener = function(key, func)
{
  this.events[key] = func;
};
Timer.prototype.trigger = function(key, arg)
{
  if(!this.events[key]) return;
  this.events[key](arg);
};
```

出力。延々とfizzbuzzを出力する。実際動かしてみるとはりあってる感じでちょっとかわいい。

```text
3: fizz
3: fizz!
5: buzz
5: buzz!
6: fizz
6: fizz!
9: fizz
9: fizz!
10: buzz
10: buzz!
12: fizz
12: fizz!
15: fizzbuzz
15: fizzbuzz!
18: fizz
```

気をつけないといけないのは。prototypeの定義が呼び出しより後になっていると動かない。function Hoge(){}の定義の流れでprototypeも定義しがちなのでちょくちょく引っかかる。

NG（barは定義されていません。）

```js
var foo = new Foo();
foo.bar();

function Foo(){ /* variables */ }
Foo.prototype.bar = function(){ /* process */ };
```

OK

```js
function Foo(){ /* variables */ }
Foo.prototype.bar = function(){ /* process */ };

var foo = new Foo();
foo.bar();
```
niconico動画の視聴履歴から各動画IDを取得する

```js
(function (document){
  var history_children=document.querySelectorAll("#historyList > div");
  var len=history_children.length,i=0;
  var arr=[];
  while(len-i){
    arr[arr.length]=(history_children[i].id).split("_")[1];
    i+=1|0;
  }
  console.dir(arr);//何か処理
}(document));
```

GreaseMonkeyで使えたらと思い、適当に書いてみた。
querySelectorAllを使っているので比較的新しいブラウザ向けで想定。
AngularJS: GA でexception をtracking する


# GA 側

* GA ではexception トラッキング用の方法が用意されている
    * https://developers.google.com/analytics/devguides/collection/analyticsjs/exceptions

* ただ、それをどう表示側で見ればよいか、ドキュメントを見るだけではよくわからない

* カスタムレポートを作ってくれている人がいたので、これを利用させてもらう
    * http://stackoverflow.com/a/28726883/1380850
    * https://www.google.com/analytics/gallery/#posts/search/%3F_.viewId%3DZ7mmQrXHRMG-Adw4TqA2xQ/

# Angular 側

* Angular では 基本 window.onerror が発火しない
    * デフォルトで$exceptionHandler というサービスが拾うようになっている
    * http://stackoverflow.com/questions/27782933/possible-to-catch-javascript-errors-within-an-angular-app-from-window-onerror

* exceptionHandler は、デフォルトではエラーをconsole に吐くことしかしない。今回はこれをoverride して利用する
    * https://docs.angularjs.org/api/ng/service/$exceptionHandler

* こんなかんじ

```js
app.factory('$exceptionHandler', ['$window', '$log', function($window, $log) {
    return function(exception, cause) {
      $log.error.apply($log, arguments);
      if ( $window.ga) {
        $window.ga( 'send', 'exception', {
          'exDescription': exception.stack,
          'exFatal': true,
          'appName': 'Compathy',
          'appVersion': '0.3'
        });
      }
    };
  }])
```

* ちなみに、exception をそのまま渡すと、exception.message のみがtoString() されてしまい、エラー箇所(ファイルや行番号) が抜けてしまうので、あえてexception.stack を指定している

# 確認

* まずブラウザから、exception が発生したときに、GA への送信がされていることを確認する
    * Develper Console のNetwork で"collect" でフィルタするとよい

* 次に、GA のカスタムレポートで、レポートが見えることを確認する
    * リアルタイムでは見れないので、少し待つ必要あり
rootViewControllerのときだけNavigationBarを非表示にさせる

rootViewControllerに以下を設定。

```swift:rootViewController.swift
override func viewWillDisappear(animated: Bool) {
    navigationController?.setNavigationBarHidden(true, animated: true)
}
```

配下のViewControllerに以下を加えればできると思います。

```swift:SampleViewController.swift
override func viewWillDisappear(animated: Bool) {
    navigationController?.setNavigationBarHidden(true, animated: true)
}

override func viewWillAppear(animated: Bool) {
    navigationController?.setNavigationBarHidden(false, animated: true)
}
```
シェルスクリプトで関数を利用する

# 関数の定義

シェルスクリプトでは、関数を次のようにして定義します。

```bash
#!/bin/bash
function 関数の名前 () {
    処理
}
```

このとき、functionは省略可能です。

```bash
#!/bin/bash
関数の名前 () {
    処理
}
```

# 関数の呼び出し

関数の呼び出しは、関数を定義した後に関数の名前を書くだけです。

```
関数の名前 引数
```

このとき、関数の名前に続けて、引数を書くことができます。関数内では、通常のシェルスクリプトの引数を処理するのと同じように\$1、\$2、...という形でアクセスできます。

# 簡単な例

```bash
#!/bin/bash
# 関数の定義
say_hello () {
    echo "Hello, world!"
}
# 関数の呼び出し
say_hello
```

これで"Hello, world!"が出力されます。

# 引数をとる例

```bash
#!/bin/bash
# 関数の定義
say_hello_people () {
    echo "Hello, $1 and $2!"
}
# 関数の呼び出し
say_hello_people taro hanako
```

これで"Hello, taro and hanako!"が出力されます。

# 参考
- http://shellscript.sunone.me/function.html
- http://www.k4.dion.ne.jp/~mms/unix/shellscript/shell_opt.html
celery/kombu メモ

# kombu.utils.symbol_by_name()

## 文字列で指定したモジュールを import する

```
>>> import kombu.utils
>>> kombu.utils.symbol_by_name('argparse')
<module 'argparse' from '/Users/sximada/.anyenv/envs/pyenv/versions/3.4.2/lib/python3.4/argparse.py'>
```
## セミコロンを使ってモジュール内にあるobjectを取得する

```
>>> kombu.utils.symbol_by_name('argparse:ArgumentParser')
<class 'argparse.ArgumentParser'>
```

# celery.utils.instantiate()

## 文字列で指定したobjectをインスタンス化する

```
>>> import celery.utils
>>> celery.utils.instantiate('argparse:ArgumentParser', description='test')
ArgumentParser(prog='', usage=None, description='test', formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)
```

# kombu.utils.cached_property()

propertyのcache。reifyみたいな感じ。

# コネクションプール

redisを使う場合、デフォルトではredis.ConnectionPool()が使われる。
なので接続タイミングはredisのconnectionを取得する際にpool.get_connetion()するタイミングでコネクションが足りなければmake_connection()により作成される。

# applicationの引き継ぎの流れ

1. CLIパラメータで Celery() object名(--appで指定)とceleryコマンド(第一引数)を指定
2. celery.bin.celery.CeleryCommand() のコンストラクタでappプロパティが設定される
3. celery.bin.celery.CeleryCommand.execute() 内で第一引数に対応するコマンドを取得して、インスタンス化する際にapp objectを渡す
ログイン機能における [RuntimeException: java.lang.reflect.InvocationTargetException] について

こんにちは、深澤です。
最近、何かとplayframeworkを使う機会が多いのですが、あるアプリケーションのログイン機能を実装してたらこんなエラーが出ました。

>play.api.Application$$anon$1:Execution exception[[RuntimeException: java.lang.reflect.InvocationTargetException]]

わかりにくいな、これは。
検索しても日本のサイトには出会いません。

そんな中、こんなサイトに出会いました。
http://stackoverflow.com/questions/19134105/playframework-runtimeexception-java-lang-reflect-invocationtargetexception

今回はこのサイトの定義やメソッドなどを参考にさせていただきながら、和訳的な感じで、日本語でわかりやすく書いていけたらなと思います。
なお、今回はplay2.4のjava8です。

# これって何が起きてるの？？
結論から申し上げると、javaエンジニアの方なら一度は経験しているであろう、NullPointerExceptionが発生してます。
エラーにはそんなこと、一言も書いてませんけどね・・・（笑）
なので、何も入っていない値を呼び出しているのが原因です。

# なんでそうなるの？
僕はこの現象、ログイン機能を実装した際に発生したのですが、playでログイン機能を実装する時って、フォームに入った値をバインドする（取り出す）際にパスワードとユーザ名をデータベースで検索すると思います。
それで、その時って、javaの場合はインナークラスなり、別クラスなり、フォーム用のクラスを定義して、その中にvalidateメソッドを用意、そこからmodelsの適当なメソッドを呼び出すと思うんですね。
そのmodelsのメソッドの部分で、このNullPointerExceptionが起きている可能性が高いです（この流れ通りならNullPointerExceptionが発生するのはmodelsしかないので）。
ここでどのように値を取り出すかがポイントになってきます。
たぶん、playでjavaを使う時は先ほど紹介させていただいたサイトの方のように、こんな感じでFinderのインスタンスを作って、検索メソッドを用意する方法がほとんどだと思います。

```
public static Model.Finder<String,User> find = new Model.Finder<String,User>(String.class, User.class);
```

検索をする時、次のように書くことで検索にヒットしたレコードの特定の値を取り出すことができます。

```
String tempId = AccountDetails.find.where().eq("email", email).eq("password", password)
                  .findUnique().userId;
```

しかし、この書き方は危険です。
万が一、検索にヒットしなかった場合などにはNullPointerExceptionが発生します。

# じゃあ、どうしたらいいの？？
findUnique()メソッド自体は例えnull値（検索にヒットしなかった）だとしても単純にnullを返すだけですが、その検索結果のインスタンスに対して変数（コンストラクタ）を呼び出そうとすると、万が一検索にヒットしなかった場合はnullとなりますので、NullPointerExceptionになるわけです。

つまり、上記のサイトの解答例にも書いてある通り、次のようにfindUnique()の値を直接参照するのではなく、findUnique()の結果からコンストラクタを呼び出すべきです。

```
AccountDetails accountDetails = AccountDetails.find.where().eq("email", email).eq("password", password).findUnique();

if (accountDetails != null) {
    String tempId = accountDetails.userId;
}

```

これにより、無事に String tempId を取り出すことに成功しました。

# まとめ
今回はログインの際の処理にフォーカスして記事を書いたのですが、
こういうようなケース以外にも、findUnique()した値の一部が欲しいケースは多いと思います。

僕もよくやってしまうのですが、検索結果のインスタンスに対して、直接、値を参照してしまうとエラーになりますので気をつけて下さい。

以上です。
また今回もコメントなどあればお気軽にお願いします。

ありがとうございました。
Jenkins公式Dockerでイメージ作成



#Jenkinsについて
継続的インテグレーションの代名詞のようなツールですね。
知ってる人は読み飛ばしてくださいｗ

繰り返し運用するような作業の間違い（品質）や作業時間の短縮（納期短縮）等を手伝ってくれるツールです。

## 使いどころ

自分はよく以下のようなことで使いますね。

- テスト
- デプロイ

細かいのは上げればきりがないのですが、上記のような何回もやるような作業は登録しておくといいです。誰が何時やったか残りますし、誰がやっても同じ結果になるという点ではいいです。

## 使うことによっての利点

Shellやbatで単体でも書いても結果は同じだったりもしますが。
以下の点で各自が作って実行するより遥かに優れていると自分は思っています。

- 標準でブラウザベースのUIが付いてくる
- ノウハウのある人が作り、中身をは知らない人でも目的が分かれば運用も可能[^1]
- Shell等だとスクリプトが各マシンに散らばるがJenkins内に集約することができる。
- Linuxのアカウントを使用するとかなり細かく権限を設定できる

## Dockerfile
自分はLinuxのアカウントでの管理がグループなども使えて便利かと思っているのでここでユーザーを追加しておきます。
あとは、参考にしたサイトから日本時間にしておきます。

```Dockerfile:Dockerfile
FROM jenkins

USER root
RUN useradd -m -s /bin/bash -G sudo <useri>
RUN echo "<userid>:<passwd>"|chpasswd
RUN usermod -aG shadow jenkins

ENV JAVA_OPTS -Djava.awt.headless=true -Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Tokyo -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8

USER jenkins
```

##Makefile
[DockerのMakefile](http://qiita.com/takara@github/items/a0a295d265ab5ff43ddc)テンプレートの以下の部分だけ差し替える

```Makefile:Makefile
NAME=myjenkins
VERSION=1.0.0

start:
        docker run -d \
                -p 8080:8080 \
                -v /var/jenkins_home:/var/jenkins_home \
                --name $(NAME) \
                $(NAME):$(VERSION)

```

## 実行

```bash:
$ make build
$ make start
```

## 動かしてみたら文字化け（追記）

![gitコメント文字化け](https://qiita-image-store.s3.amazonaws.com/0/12727/66961971-b037-3dcf-38a0-a613f23ecf31.png)

gitコメントが化けている。ＵＴＦ−８の設定を追加

そして、gitのコメントが正しく表示されることを確認。

![正しく表示](https://qiita-image-store.s3.amazonaws.com/0/12727/b09cce37-bf2f-9510-0700-887612911fac.png)



[^1]: デプロイできるとか知っていれば中身を知らなくても良い

## 参考サイト
- [Jenkinsの公式Dockerイメージ使ってみた](http://knjname.hateblo.jp/entry/2015/02/10/040833)
- [Amazon Linux/CentOSのJenkinsのタイムゾーンを指定する](http://qiita.com/mechamogera/items/05ce25bc63e4d858d433)
- [Jenkinsのコンソール出力が読みづらくなっている人向けのメモ](http://qiita.com/dakuton/items/b3e0a329378e9e4e9486)
Canvas.toDataURL()→node.jsでBase64デコード→ファイル保存などのやり方

例えばファイルをアップロードする時、Canvasに描画していいサイズにしてからサーバに送りたい事があると思います。
その場合、CanvasではtoDataURL()でBase64エンコードされたpng|jpegデータが得られるため、これをサーバに送って処理することで画像のアップロードができるわけです。

で、そのサーバ側がnode.jsの時にうまくBase64デコードできなかったのでまとめ。

## クライアント側サンプル

こんな感じのソースで

```html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8" />
</head>
<body>
<div style="width:200px;height:200px;overflow:hidden;border-radius:10px;background-color:gray;">
<canvas id="canvas" width="25" height="25" style="width:200px;height:200px;"></canvas>
</div>
<div id="img"></div>

<script>
var cv = document.getElementById( "canvas" );
var ctx = canvas.getContext('2d');
ctx.strokeStyle = "red";
ctx.fillRect(100, 100, 200, 200);
document.getElementById( 'img' ).textContent = cv.toDataURL('image/jpeg');
</script>

</body>
</html>
```

こんな感じのデータが取得できるはず。

```text
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAZABkDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8qqKKKACiiigAooooAKKKKAP/2Q==
```

これをサーバ側に渡したと仮定します。

## サーバ側サンプル

```js
// データを受け取って格納。
// data:image/jpeg;base64,というデータはBase64ではなくゴミなので排除する。
var data = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAA...省略...KKKKAP/2Q=='.split( ',' );

// Base64のデータのみが入っている。
var b64img = data[ 1 ];

// npm i urlsafe-base64 でインストールしたモジュール。
var base64 = require('urlsafe-base64');
// これでBase64デコードするとimgにバイナリデータが格納される。
var img = base64.decode( b64img );

// npm i fs でインストールしたモジュール。
var fs = require('fs');
// 試しにファイルをsample.jpgにして保存。Canvasではjpeg指定でBase64エンコードしている。
fs.writeFile('sample.jpg', img, function (err) {
    console.log(err);
});
```

これで正常に画像がアップロードされたはず。

Base64はモジュールによって全く違う結果になるので、闇はかなり深い……。
Androidでアプリ終了時にOSがフリーズ・クラッシュした問題

Androidで一定時間ごとに現在地を取得しているアプリの開発中、長時間アプリを使用したあとにアプリを終了しようとするとOSがしばらくフリーズ（場合によってはシステムUIが停止やOSが終了etc）する問題が発生したのでまとめ。
###原因
原因は現在地を取得するたびに`LocationManager`の`requestLocationUpdates`を呼び出して毎回新しく`LocationListener`を登録していたのが原因でした。

```java
// この処理を一定間隔ごとに呼び出し
locationManager.requestLocationUpdates(
    LocationManager.NETWORK_PROVIDER,
    10000,
    0,
    new LocationListener() {
    // 略
    });
```
詳細は分かりませんがアプリ終了時に`LocationManager`に登録している全ての`Listener`の解除か何かが行われて（アプリ側では`Listener`の解除の処理は書いていませんでした）アプリの終了処理に時間が掛かってタスク管理のプロセスが停止->OSフリーズという感じかなと予想しています。
ちなみに`Listener`を登録しまくっていてもアプリの動作自体が明らかに遅くなることはあまり感じられず、アプリを終了したときにのみ問題が起こるという感じでした。

フリーズする時間やOSが終了するかなどは端末によって違いましたが以下のコードでNexus7(2013)で試してみると、

* 100個：問題なく終了
* 300個：数秒フリーズ
* 500個：数秒フリーズして「システムUIは応答していません。」のダイアログが表示される
* 900個：数秒フリーズして「システムUIは応答していません。」のダイアログが表示されてさらにしばらくすると画面が真っ暗になってしばらく操作できなくなる。

という感じでした。

```java

    private void test(int n) {
        for (int i = 0 ; i < n; i++) {
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3000, 0, new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
            }

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
            }

            @Override
            public void onProviderEnabled(String provider) {
            }

            @Override
            public void onProviderDisabled(String provider) {
            }
        });
    }
```
###対応
`requestLocationUpdates`を呼ぶ際に`new LocationListener()`をせず、`LocationListener`を`implements`した`this`を指定することで発生しなくなりました。
（が、そもそも`requestLocationUpdates`を一定時間ごとに呼ぶ必要がないのに呼んでいたり、`Listener`を登録してるのにイベントを受け取っても何も処理をしていなかったりと問題だらけだったので全面的に変更しました）
###まとめ
アプリ終了時に特に重い処理を行っていないのにOSがフリーズしたりする場合があれば`Listener`の登録箇所もチェックしてみると良いかもしれません。
【FileMaker】変数の繰り返し数（配列）

他言語から来て、こちらも一時期「は！？」と固まった変数の繰り返し数（配列）の指定方法。

以下をやりたいとします。
変数名：abc
配列数：10

単純に他言語とかなら、

```
int abc[10];
```

とか書くんですけど、GUIモード（こんな言葉も懐かしい）のFileMakerでは変数名に"abc[10]"とか書いたら指定できない文字を入れるな、と怒られました。
しかもFMでは、配列の宣言っていらないんですねー。

これが正しい。（当たり前だけど）
![スクリーンショット 2015-08-01 13.04.59.png](https://qiita-image-store.s3.amazonaws.com/0/60538/4baf4f2d-3e5a-0fa7-d06e-fefd297484b8.png)
「名前」のところではなく、「繰り返し」にデータを挿入したい配列の番号を書く！


そうすると、
![スクリーンショット 2015-08-01 13.05.05.png](https://qiita-image-store.s3.amazonaws.com/0/60538/be26a704-3f60-c54c-4c77-da15cf2c585c.png)
入るよー。
配列になったよー。
よかったよー。

ちゃんと入ってたよー。
![スクリーンショット 2015-08-01 13.07.53.png](https://qiita-image-store.s3.amazonaws.com/0/60538/c5128e9f-2d44-795d-c3bf-400fa5a1bb31.png)


言語間ギャップだよー。
[VirtualBox][仮想マシン]64bitのosが選択しが表示されない時の対処法

virtualboxにlinux 64bitのOSを入れようとしたら、ひっかかったのでメモ。

自分はlenovoのPCだったので、それを前提に進めていきます。（他のPCも、だいたいは一緒なはず）

以下が手順

1. biosを開く。(自分のPCでは起動した時に映る「Think pad」の画面でF1キーを押すと開ける)
- インテル製CPUなら Intel Virtualization TechnologyをEnableにする。(AMD製CPUなら、おそらくAMD VirtualizationをEnableにすればいいはず)
- 普通にPCを起動して、もう一度virtualboxを開けば64bitを洗濯できるようになってるはず

以上
ローカルとリモートの同期はrsyncが便利！


Macに乗り換えてはや数ヶ月。

gitからcloneしたディレクトリと、
実際に作業する用のディレクトリを
うまいこと同期できないかな…と思っていたら、
ナイスなコマンドを見つけました。

##rsyncコマンド
基本的にはコピーするコマンドみたいです。

用途は２つのファイルやディレクトリの中身を同期するときによく使うみたい。
オプションを併用することでディレクトリの中身を再帰的にチェックしてくれる。

### -r
コピー元のディレクトリ内を再帰的にチェック

### -a
-r に加えて、タイムスタンプなどもそのままにコピーするようになる

### -u
コピー元で追加・更新されたファイル・ディレクトリのみを同期

z### -v
同期するファイル名やバイト数などの情報を表示

### --delete
コピー元で削除されたものを同期

### --progress
同期の進捗状況まで出力

##私用メモ

> localディレクトリとremoteディレクトリを同期させる場合
> $ rsync -auv --delete --progress local/ remote/





##参考

[LINUX入門：rsyncコマンド](http://webkaru.net/linux/rsync-command/)