OmniAICreator/Qiita-1.07M huggingface dataset:
R MarkdownでKnitした日付を自動的に挿入

## この記事の目的
私が大好きなRMarkdownについて、Tipsを集中的に連載しようという思いつきの企画です。あと自分の中で進めている別企画のメモという位置づけでもあります。なので**大した中身はありません**。

### R Markdownとは
Markdown記法をベースに、チャンクという形でRのコードを記述して評価・出力することができるものです。RStudioのクイックリファレンスでは以下のように説明してあります:

> R Markdown is an easy-to-write plain text format for creating dynamic documents and reports. 

## 日付をKnitしたタイミングで自動的に更新したい

R Markdownでドキュメントを作成すると、大抵の場合あとで何度も修正を重ねてやっと完成させることになるかと思います。しかし、RStudioでそのままRmdファイルを新規で作成すると、冒頭のyaml部分が自動的に生成されるかと思います。

```
---
title: "Untitled"
author: "kazutan"
date: "2015年12月9日"
output: html_document
---
```

この`data: `が日付で、これをKnitするとそのまま表示されます。ただ自動的に入る日付は作成日であって、公開日に修正するには手作業でその度に修正することとなります。実に面倒です。せめてKnitした日にできればいいのに、と思うはずです。

## Knitした日に自動的に更新するためには?

この手法は以下のサイトを参考にしています:

- [第4回　レポつく自由自在 ～R Markdownにまつわるエトセトラ～：R Markdownで楽々レポートづくり｜gihyo.jp … 技術評論社](http://gihyo.jp/admin/serial/01/r-markdown/0004)

冒頭のyaml部分を、以下のように修正するとOKです:

```
---
title: "Untitled"
author: "kazutan"
date: "`r format(Sys.time(), '%Y/%m/%d')`"
output: html_document
---
```

ポイントは、**yaml部分であってもrチャンクが有効**であることです。これを利用し、Rでシステム時刻を取得して日付の形式に整えて出力させています。なるほどです。

このテクニックは色々応用が聞くと思いますので、ぜひ色々試してみてください。

Enjoy!
値をboolで返すには ()だけでは変換されない【5パターン】

`if`のように`()`で囲めば暗黙の`true`との比較で`bool`が得られると勘違いしていたので戒めとしてメモる。

`($hoge > $huga)`が`bool`になるのは、あくまで比較演算子での式が`bool`を返すから。

# <i class="fa fa-code"></i> コードパターン

```php:ifでできる書き方

if ($a == true) {}
if ($a) {} // trueとのゆるい比較で上と同義


```

```php:簡略化できるパターン

if ($result == $hoge) {
    $return = true;
} else {
    $return = false:
}

return $result;

```

```php:簡略化

return ($result == $hoge);

```

```php:同様にはできない簡略化パターン

if ($result) {
    $return = true;
} else {
    $return = false:
}

return $result;


```

```php:失敗パターン

return ($result); // $resultの値そのままが返る
// そもそもこれでは省略可能なreturnの()を省略していないだけでは？
var_dump(($result)); // これもboolにはならない

```



# <i class="fa fa-refresh"></i> 変換方法

```php:boolへの変換(ワンライナー)

(bool) $result         // キャスト (boolean)でも可
boolval($result)       // 関数。5.5以上
($result == true)      // 比較結果
!!$result              // JSなどでたまに見る。反転時にboolになり、その反転で正しいbool値取得
$result ? true : false // 三項演算子(デバッグでboolのstring変換とかで似たものをよく使う)

($result && true)      // 論理積。使い道なし…と思う(自動キャストされてる？)

```

他にもあるかな？

***

PHPに限りませんが、キャストと関数が用意されているとどちらを使えばいいかちょっと迷いますね。


# <i class="fa fa-book"></i> 参考記事

* [PHP: 論理型 (boolean) - Manual]
* [PHP: 式 - Manual]
* [PHP: 型の相互変換 - Manual]
* [【PHP入門講座】 型変換 - Qiita]
* [！！【追記あり】 - 汎用日記（仮）]


***

今更調べたら`if ($hoge)`の資料ってあんまり出ないですね。
PHP逆引きレシピには書いてあったのですが…
`while ($hoge)`とかもよく使うんですが、値のみを式として評価ってどっからきてるんだ…？

[PHP: 論理型 (boolean) - Manual]:http://php.net/manual/ja/language.types.boolean.php
[PHP: 式 - Manual]:http://php.net/manual/ja/language.expressions.php
[【PHP入門講座】 型変換 - Qiita]:http://qiita.com/mpyw/items/3aac811629622f7f4d8b#1-5
[PHP: 型の相互変換 - Manual]:http://php.net/manual/ja/language.types.type-juggling.php#language.types.typecasting
[！！【追記あり】 - 汎用日記（仮）]:http://chiiiiiiiii.hatenablog.com/entry/2012/08/16/110204
CS-Cart: Add-onでコアのテンプレートを上書き(override)する

コアのテンプレートの改変をAdd-on側で管理したいことがある。言い換えると、Add-onのテンプレートでコアのテンプレートを上書き、ということになるが、そういった場合は、design/backend/templates/addons/`addon-id`/overridesに上書きしたいファイルを作成する。

## 例

例えば、次を上書きしたいとき

* design/backend/templates/views/products/manage.tpl

次のファイルを作る

* design/backend/templates/addons/`addon-id`/overrides/views/products/manage.tpl


テンプレートを追加したら、「一般設定」→「ストレージ」→「キャッシュのクリア」をするとすぐに読み込まれる。
Git エラー： warning: remote HEAD refers to nonexistent ref, unable to checkout.

Gitクローン時のエラーで　
warning: remote HEAD refers to nonexistent ref, unable to checkout.
が出る場合の対処。

今回は、 リモートリポジトリのHEADが指定するブランチがなかったのでその場合の対処

対処1.
git branch -aで表示されるブランチをチェックアウトする

対処2.
リモートのHEADが指定するブランチを設定する
やり方は以下を参照
http://qiita.com/suisuina/items/2d12b0ab8862c43c8f4a
c++ builder XE4, 10.2 Tokyo > ユーザリストを取得する

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

http://qiita.com/AinoMegumi/items/f46dc3f6da4bb62e622e
にて試していることが興味を引いたので実装してみた。

```Unit1.cpp
#include <Windows.h>
#include <iostream>
#include <LM.h>
#pragma comment(lib, "netapi32.lib")

...

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{

	PVOID pv;
	DWORD n, i = 0, err;
    do
    {
        switch (err = NetQueryDisplayInformation(0, 1, i, MAXDWORD, MAX_PREFERRED_LENGTH, &n, &pv))
        {
        case 0:
        case ERROR_MORE_DATA:
            if (n)
            {
                PNET_DISPLAY_USER p = (PNET_DISPLAY_USER)pv;

				do
                {
					i = p->usri1_next_index;
					OutputDebugString(p->usri1_name);
                } while (p++, --n);
            }
            NetApiBufferFree(pv);
            break;
        }
	} while (err == ERROR_MORE_DATA);

}
//---------------------------------------------------------------------------
```

```txt:結果
デバッグ出力: Administrator プロセス Project1.exe
デバッグ出力: Guest プロセス Project1.exe
デバッグ出力: [自分のユーザ名] プロセス Project1.exe
...
```


上記のコードはC++ BuilderというよりWin32APIというものなのかもしれない。

Delphiコードは以下にあるが、上記のコードの方が読みやすい。
http://stackoverflow.com/questions/27689479/delphi-list-all-windows-users-logged-on-a-computer
Git リモートリポジトリのHEADのブランチを変更する

Git リモートリポジトリのHEADのブランチを変更する方法について記載



1.リモートサーバーにログイン

2.サーバのリポジトリに移動
```
$ cd /path/to/repos/hogehoge.git
```

3.HEAD を develop ブランチに変更する
```
$ git symbolic-ref HEAD refs/heads/develop
```
これで、cloneしたときのブランチはdevelopになります
JAVA hashCode() メモ

割と難しい
いや、ほんとに難しい..
▪️Hero54.java

```java

public class Hero54 {
	private int hp;
	public String name;

	public boolean equals(Object o) {
		if (o == this)
			return true;
		if (o == null)
			return false;
		if (!(o instanceof Hero54))
			return false;
		Hero54 r = (Hero54) o;
		if (!this.name.trim().equals(r.name.trim())) {
			return false;
		}
		return true;

	}

	public int hashCode() {
		int result = 37;
		result = result * 31 + name.hashCode();
		result = result * 31 + hp;
		return result;

	}

}
```

▪️Test54.java

```java
import java.util.*;

public class Test54 {
	public static void main(String[] args) {
		Set<Hero54> list = new HashSet<Hero54>();
		Hero54 h1 = new Hero54();
		h1.name = "ミナト";
		list.add(h1);
		System.out.println(h1);
		System.out.println("要素数＝" + list.size());
        //これをやることでc2オブジェクトのメンバー変数が全部空っぽになります
		h1 = new Hero54();
		h1.name = "アサカ";
		System.out.println(h1);
		list.remove(h1);
		System.out.println("要素数＝" + list.size());
	}

}
```

▪️実行結果
Hero54@16f4c828
要素数＝1
Hero54@16d8bb2d
要素数＝1
ビルド時に Unable to execute dex: method ID not in [0, 0xffff]: 65536 が出た場合の対処

Android Studio 1.5.1で確認しています。

Android Studio上で、ライブラリを追加したとたん、以下のタスクから進まなくなりました。
:app:transformClassesWithDexForDebug

```
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
```


AndroidStudio上のエラーメッセージを見てもまったくわからないので

http://ja.stackoverflow.com/questions/8020/androidstudiogradle%E3%81%A7%E3%83%93%E3%83%AB%E3%83%89%E3%82%A8%E3%83%A9%E3%83%BC-process-finished-with-non-zero-exit-value-2

↑を参考にコマンドラインからビルドしてみました。

```bash
bash <ANDROID_STUDIO_HOME>/gradle/gradle-<version>/bin/gradle :app:assembleDebug
```

例：私の環境の場合

```bash
cd [プロジェクトのディレクトリ]
bash /Applications/Android\ Studio.app/Contents/gradle/gradle-2.8/bin/gradle :app:assembleDebug
```

と、以下のメッセージをゲットしました。

```bash
:app:transformClassesWithDexForDebug

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
	at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:484)
	at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:261)
	at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:473)
	at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:161)
	at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
	at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504)
	at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
	at com.android.dx.command.dexer.Main.run(Main.java:277)
	at com.android.dx.command.dexer.Main.main(Main.java:245)
	at com.android.dx.command.Main.main(Main.java:106)


:app:transformClassesWithDexForDebug FAILED

```

どうやらライブラリを追加した結果、メソッド数の上限を超えてしまった模様。
ていうかメソッド数に上限なんてあったのね。

公式サイトを見ながら対処
Building Apps with Over 65K Methods
http://developer.android.com/intl/ja/tools/building/multidex.html

build.gradleを修正

```build.gradle
android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 21
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.0'
}
```

Manifestのアプリケーションも修正

```AndroidManifest.xml
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    </application>
```

私の環境ではこれで解消しました。
参考になれば。
PC上の全てのユーザー名を取得するプログラム

@7of9 さんと@yumetodo さんの協力のもと、日本語ユーザーも出るようになりました。
netapi32.libのリンカー指定が必要なので注意してください。

```cpp:main.cpp
#include <Windows.h>
#include <iostream>
#include <LM.h>
int main() {
    PVOID pv;
    DWORD n, i = 0, err;
    std::wcout.imbue(std::locale(""));
    do
    {
        switch (err = NetQueryDisplayInformation(0, 1, i, MAXDWORD, MAX_PREFERRED_LENGTH, &n, &pv))
        {
        case 0:
        case ERROR_MORE_DATA:
            if (n)
            {
                PNET_DISPLAY_USER p = (PNET_DISPLAY_USER)pv;

                do
                {
                    i = p->usri1_next_index;

                    //                  DbgPrint("<%S> <%S>\n", p->usri1_name, p->usri1_comment);
                    std::wcout << p->usri1_name << std::endl;

#if 0   // for C++ Builder XE4
                    OutputDebugString(p->usri1_name);
#endif

                } while (p++, --n);
            }
            NetApiBufferFree(pv);
            break;
        }
    } while (err == ERROR_MORE_DATA);
#if defined(_WIN32) && !(defined(_MSC_VER) && !defined(__clang__))
    std::system("pause");
#endif
    return 0;
}
```


# 初代コード(Guest読み取りでエラー)
```cpp:main.cpp
#ifndef UNICODE
#define UNICODE
#endif
#include <Windows.h>
#include <iostream>
#include <LM.h>
#pragma comment(lib, "netapi32.lib")

int main() {
	PNET_DISPLAY_GROUP buf;
	wchar_t szServer[256] = TEXT("");
	DWORD dwRec, i = 0, res;
	do {
		res = NetQueryDisplayInformation(szServer, 1, 0, 10, 1024, &dwRec, (PVOID*)&buf);
		if (res == ERROR_SUCCESS || res == ERROR_MORE_DATA) {
			PNET_DISPLAY_GROUP p = buf;
			for (; dwRec > 0; dwRec--) {
				std::wcout << p->grpi3_name << std::endl;
				i = p->grpi3_next_index;
				p++;
			}
			NetApiBufferFree(buf);
		}
		else std::cout << res << std::endl;
	} while (res == ERROR_MORE_DATA);
	return 0;
}
```
# ２代コード(日本語ユーザー名の読み取りができない)

```cpp:main.cpp
#ifndef UNICODE
#define UNICODE
#endif
#include <Windows.h>
#include <iostream>
#include <LM.h>
#pragma comment(lib, "netapi32.lib")
int main() {
	PVOID pv;
	DWORD n, i = 0, err;
	do
	{
		switch (err = NetQueryDisplayInformation(0, 1, i, MAXDWORD, MAX_PREFERRED_LENGTH, &n, &pv))
		{
		case 0:
		case ERROR_MORE_DATA:
			if (n) {
				PNET_DISPLAY_USER p = (PNET_DISPLAY_USER)pv;

				do{
					i = p->usri1_next_index;
//                  DbgPrint("<%S> <%S>\n", p->usri1_name, p->usri1_comment);
					std::wcout << p->usri1_name << std::endl;

#if 0   // for C++ Builder XE4
					OutputDebugString(p->usri1_name);
#endif

				} while (p++, --n);
			}
			NetApiBufferFree(pv);
			break;
		}
	} while (err == ERROR_MORE_DATA);
	return 0;
}
```
新入社員が半年で出会ったダメダメコミットベスト3

# はじめに

こんにちは。risacanです。 :candy: :lollipop: :sparkles: 
7月からIDCフロンティアUX開発部に配属になりRubyの勉強をしています。UX開発部に配属になるまでプログラミング経験は全くなく、MatzのこともGitのこともGithubのことも知りませんでした。

この記事では、そんな私がこの半年で出会ったダメダメコミットベスト3を発表したいと思います！ :scream: 

バージョン管理システムにおいて、コミットメッセージとコミット粒度が適切だと、ソフトウェアの調査がしやすい、コードビューしやすい、などのメリットがあります。しかしながら、世の中わかりやすいコミットばかりではありません。ダメダメコミットが溢れているのです！

この記事ではそんなわかりにくいコミット＝ダメダメコミットを紹介しながら、より良いコミットにする基本的なポイントをご紹介していきたいと思います。
よければお付き合いください。 :walking: :dog2: 

# ダメダメコミット
## 第1位 コミットサブジェクトになんの情報もない
![スクリーンショット 2015-12-09 20.43.48.png](https://qiita-image-store.s3.amazonaws.com/0/85537/4f654a80-9542-7344-b19e-7fa733ed63e8.png)

コミットサブジェクト（コミットメッセージの1行目）の情報が少なすぎる例です。
Githubのコミット一覧では、コミット日時とコミットサブジェクトが表示されます。たとえばバグ :bug: が発見され、発生原因のコードを調べようとしたとしましょう。上記の例では、3つのコミットサブジェクトがすべて「編集」で、どこをどのように編集したのかはわかりません。これでは、バグの発生原因となったコミットを探しだすのに膨大な労力と時間がかかるでしょう。バグフィックスが遅れてサービスにも影響がでてしまうかもしれません :scream: 

### ポイント
__コミットサブジェクトを大切に！__
コミットサブジェクトには、コミットの内容を簡潔に書きましょう :point_up: :triumph: 


## 2位 作業時間で区切ったコミット

コードを書いていて、時間的に区切りがついたところでコミットしてしまう例です。
コミットとは巻き戻せる単位です。休み時間がきたからといって、作業の途中で中途半端なままコミットしてしまうと後々大変です。コミットを巻き戻したとき、作業途中のファイルに戻ってしまう可能性があるからです。

### ポイント
__コミットは意味のある単位でわけよう！__
作業時間ではなく、作業の内容でコミットを分けましょう :point_up: :triumph: 

## 3位 インデント修正のコミットを分けない
<img width="1222" alt="_memo__Fix_doc_·_idcf_idcf-dns-ruby_fd57394.png" src="https://qiita-image-store.s3.amazonaws.com/0/85537/0bb00397-a633-a302-0c14-be4c53363838.png">

（引用: https://github.com/idcf/idcf-dns-ruby/commit/fd573940ff58f342d14619519f901fcb5dcba266）
インデントの修正とソースコードの変更を一緒にコミットしてしまった例です。
インデントの修正が複数行にまたがって赤くハイライトされています。同じコミット内でUUIDの変更をしているのですが、他のハイライトに埋もれてしまい目立たなくなっています。これでは、コードレビューのときに気をつけて確認するべき重要な変更を見逃してしまう可能性があり、危険です。

### ポイント
__インデントの修正は1つのコミットにしよう！__
プログラム的に意味のある変更とそうでない変更を区別し、それぞれの変更を確認しやすくしましょう :point_up: :triumph:

# おわりに
いかがでしたでしょうか？「新入社員が半年で出会ったダメダメコミット」というタイトルでここまで書きましたが、実は上記の3点すべて私がやってしまったコミットです :weary: 
失敗は成功のもとということで、お許し下さい・・・ :pray: 

 
# 参考にしたページ
[コミットメッセージの書き方](http://www.clear-code.com/blog/2012/2/21.html)
"Unity"+"leap motion" [練習九つ]: VRGUI Project

<h2>VRGUI Project： 「Raycastについて」</h2>
<h3>Goal: 空間に浮かぶGUIを作る</h3><ul>
<li>Step 1: UnityでLeap Motionを使ってGesture Motion認識ができる。</font></li>
<li>Step 2: uGUIでメニューを作って空間に浮かべる </li>
<li><font color=red>Step 3:メニュー選択。任意のGameObjectからRaycastを飛ばしてメニューを選択できる。選択状態で色を変える。できたら音も。</font></li>
<li>Step 4:メニューで選択した項目を実行。メニューに任意のアクションを割り当てられるように実行する。</li>
</ul>
<hr/>
Unityは　**"Raycast”**という、ものがある。

仮想的な線を利用して衝突検出をする機能だ。

基本的には、**Physics.Raycast** という、関数を使う。

第五parameterまであるけど、第三のparameterまでは必須だ。第四と、第五のparameterは必須じゃない。

第一引数にはレイキャストの原点の位置、第二引数は方向、第三引数には衝突情報、第四引数には検知を行う距離、第五引数にはレイヤーマスクをとります。

UnityでLeapmotionの手の指からraycastが見えるように連取しましょう。

<hr/>

列

```lang:RaycastExample.cs
 RaycastHit hit;

 if(Physics.Raycast( transform.position,Vector3.right,out hit, 10 ))
 {
 hit.transform.gameObject;
 }
```
positionから右方向に10進んだ先までにオブジェクトがあればtrueが返される。

第三引数にoutで指定すると衝突したオブジェクトの情報が入る
<hr/>
指からdraw Raycastの例：

```lang:raycastVisualize.cs
using UnityEngine;
using System.Collections;
using Leap;

public class GetLeapFingers : MonoBehaviour 
{
	HandModel hand_model;
	Hand leap_hand;

	void Start() 
	{
		hand_model = GetComponent<HandModel>();
		leap_hand = hand_model.GetLeapHand();
		if (leap_hand == null) Debug.LogError("No leap_hand founded");
	}

	void Update() 
	{
		for (int i = 0; i < HandModel.NUM_FINGERS;i++)
		{
			FingerModel finger = hand_model.fingers[i];
			
			Debug.DrawRay(finger.GetTipPosition(), finger.GetRay().direction, Color.red); 
		}
	}
}
```

<img width="1158" alt="Screen Shot 2015-12-09 at 14.59.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/99307/d3260cff-a773-d1d9-166d-44a7633c2129.png">

<hr/>


```lang:raycastTest.cs
using UnityEngine;
using System.Collections;
using Leap;

public class raycastTest : MonoBehaviour 
{
	HandModel handModel;
	Hand leapHand;

	// Use this for initialization
	void Start () 
	{
		handModel = GetComponent<HandModel>();
		leapHand = handModel.GetLeapHand ();
		if (leapHand == null) 
		{
			Debug.LogError ("No leapHand Founded");
		}
	}
	
	// Update is called once per frame
	void Update () 
	{
		Vector3 fwd = transform.TransformDirection (Vector3.forward);
		RaycastHit hit;
		for (int i = 0; i < HandModel.NUM_FINGERS; i++) 
		{
			FingerModel finger = handModel.fingers[i];
			if(Physics.Raycast(finger.GetTipPosition(),fwd,out hit))
			{
				float distanceToGround = hit.distance;
				Debug.Log ("hit something"+distanceToGround);
			}
			Debug.DrawRay(finger.GetTipPosition(),finger.GetRay().direction, Color.red);
		}

	}
}

```
<img width="1159" alt="Screen Shot 2015-12-09 at 14.43.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/99307/187936ab-65a5-8c21-f075-55305d7af75a.png">

<hr/>
これを応用して、Raycastを使ってtoggleとか、いろんなことができる。
コメント > 考察 > 最初のバージョンのコメント

## 前提
VCSのコミットメッセージ以外に、ソースにバージョンコメントを残すという場合。

## v0.1のコメント例

既存のコードのバージョンアップ時は以下のようなコメントでいいと思う。

- v0.2 2015/11/23 xxという機能を追加した

しかしながら、新規作成の場合、一番最初(v0.1)のバージョンコメントは何が適切なのだろうか?
v0.1でいくつもの機能を実装してしまう場合での考察。

以下、例と考察。

1. v0.1 2015/11/23 とりあえずの機能を実装した
  - どこまでが「とりあえず」なのか分からない。
2. v0.1 2015/11/23 funcAAA()、funcBBB()、procXXX()を実装した
  - どの関数が最初に作られたか分かる。
  - v0.1で何が実装されていたか分かるのがいいのだろうか?  
  - v0.2以降のコメントと対比すれば分かることかもしれないが、v0.2以降のコメントなどから読み解くのに時間がかかる場合、v0.1だけで分かる方がいいと思う
3. v0.1 2015/11/23 新規作成
  - 2015年11月23日から作っているという情報のみ分かる
  
gitのコミットメッセージでは"1st commit"がよく使われる。
それと対応するのは「新規作成」だろうか。


## v0.1のコメントで知りたいこと

v0.1のコメントから知りたいことは何だろう?

- 作成日時
  - 作業時間の振り返りに使う? 2015/07/11から始めた.
  - そのファイルがどれくらい古いものかはわかる.
- 他のプロジェクトでも共用されるファイルである場合、同じバージョンかどうかを知りたい
  - 元ファイル更新時に、他のプロジェクトへのバージョンアップ対応する時
  - VCSの共有なりgit submoduleなりを使えば回避できることかもしれない


現状(2015/12/09)では、上記の例の項目2 (`v0.1 2015/11/23 funcAAA()、funcBBB()、procXXX()を実装した`)というコメントが最初のバージョンコメントとしていいように考えている。
その際、複数の記載をする場合は、以下のような記載がいいように思う。

```
v0.1 2015/11/23
  - procXXX()を追加した
  - funcBBB()を追加した
  - funcAAA()を追加した
```
[Objective-C] 日付を比較する


##指定した期間内にアクセスすると1度だけダイアログを出すプログラムを作ってみた

こんな感じで

```objective_c
EventDateRecorder.h
#import <Foundation/Foundation.h>
@interface EventDateRecorder : NSObject
+ (BOOL)christmasEventDateRecorder;
@end
```

```objective_c
EventDateRecorder.m
#import "EventDateRecorder.h"

// ダイアログ表示期間
static NSString *const chrismasEventDateKey = @"chrismasEventDate";
static NSString *const chrismasfromDateString = @"2015-12-25 00:00:00";
static NSString *const chrismasAfterDateString = @"2015-12-26 00:00:00";

@implementation EventDateRecorder

+ (BOOL)chrismasEventDateRecorder
{
   BOOL isChrismasEvent = [self eventDateRecorderWithKey:chrismasEventDateKey fromDateString:chrismasfromDateString afterDateString:chrismasAfterDateString];
    return isChrismasEvent;
}

+ (BOOL)eventDateRecorderWithKey:(NSString *)eventKey fromDateString:(NSString *)fromDateString afterDateString:(NSString *)afterDateString
{
    NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    [formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    
    NSDate *fromDate = [formatter dateFromString:fromDateString];
    NSDate *afterDate = [formatter dateFromString:afterDateString];
    
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSDate *eventDate = [defaults objectForKey:eventKey];
    NSDate *now = [NSDate dateWithTimeIntervalSinceNow:[[NSTimeZone systemTimeZone] secondsFromGMT]];
    if ([now compare:fromDate] == NSOrderedDescending && [now compare:afterDate] == NSOrderedAscending) {
        if (eventDate) {
            if([eventDate compare:fromDate] == NSOrderedDescending && [eventDate compare:afterDate] == NSOrderedAscending) {
                return NO;
            } else {
                [defaults setObject:now forKey:eventKey];
                [defaults synchronize];
                return YES;
            }
        } else {
            [defaults setObject:now forKey:eventKey];
            [defaults synchronize];
            return YES;
        }
    } else {
        return NO;
    }
}
@end
```

使い方は

>BOOL isChrismasEvent = [EventDateRecorder chrismasEventDateRecorder];
>if (isChrismasEvent) {
>    //YESが返ってきた時の処理;
>} else {
>  }
Raspberry Pi A+にWifiドングルを接続してリモートPCからSSH接続する方法

#はじめに

Raspberry Pi A+にWifiドングルを接続してリモートPCからSSH接続する方法を書いておきます。
具体的には以下の設定を行います。

（STEP1）Wifi子機を接続してlsusbする
（STEP2）wpa_passphraseで暗号化したパスフレーズを作成する
（STEP3）wpa_supplicant.confを編集する
（STEP4）interfacesを編集する
（STEP5）パワーマネジメントをOFFにする
（STEP6）SSH接続を有効にする
（STEP7）TeraTermで接続する
	
順に解説していきます。

##（STEP1）Wifi子機を接続してlsusbを実行する
使用したWifi子機はBUFFALOのWLI-UC-GNM2です。

余談ですが、この機器は非常に発熱するので使わないほうがよいと思われます。あまりにもドングルが発熱するので私はUSBポートに銅製のヒートシンクを張り付けています。（STEP5で設定するパワーマネジメントをOFFにしているから発熱しているのかもしれない。）

Raspberry Pi A+にはUSBポートが一つしかないので、USBハブを利用してキーボードとWifiドングルを接続します。Wifiの設定が終わった後、USBハブを取り外してRPiのUSBポートにWifiドングルを直接接続します。

最初にWifiドングルが認識されているかを確認します。

```
$ lsusb
Bus 001 Device 004: ID 0411:01ee BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM2 Wireless LAN Adapter [Ralink RT3070]
```

##（STEP2）wpa_passphraseで暗号化したパスワードを作成する

wpa_suplicant.confを設定するために使う暗号化されたパスワードを作成します。

```
$ wpa_passphrase [無線アクセスポイントのSSID]  [暗号化前のパスワード]
network={
	ssid="[ 無線アクセスポイントのSSID ]"
	#psk="[ 暗号化前のパスワード ]"
	psk=[ 暗号化されたパスワード ]
}
```


##（STEP3）wpa_supplicant.confを編集する

ここではWPA2-PSKで接続を行う例を示します。

```
$ cat /etc/wpa_supplicant/wpa_supplicant.conf
network={
        ssid="[ 無線アクセスポイントのSSID ]"
        proto=WPA WPA2
        scan_ssid=1
        key_mgmt=WPA-PSK
        pairwise=CCMP TKIP
        group=CCMP TKIP
        psk=[ 暗号化されたパスフレーズ ]
}
```

デフォルトで入っている以下の行は削除してください。
この行がはいっていることでなぜかアクセスポイントに接続できなかったため削除しました。

```
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
```

##（STEP4）interfacesを編集する

/etc/network/interfacesを編集します。
nanoを使うと簡単です。

```
$ sudo nano /etc/network/interfaces
iface lo inet loopback

allow-hotplug wlan0
iface wlan0 inet dhcp

wpa-conf  /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
```

上の例はDHCPを使う前提です。
固定IPの場合は以下の通りです。

```
$ sudo nano /etc/network/interfaces
iface lo inet loopback

allow-hotplug wlan0
iface wlan0 inet static
address 192.168.11.100
netmask 255.255.255.0
Gateway 192.168.11.1 
 
wpa-conf  /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
```

ここまで設定できたらイーサネットインタフェースの再起動を行い、設定を有効化します。

```
$ sudo ifdown wlan0
$ sudo ifup wlan0
```

##（STEP5）パワーマネジメントをOFFにする

WifiドングルのパワーマネジメントをOFFにします。これをしないとSSH接続した時に入力の反応が非常に悪くなる可能性があります。

```
$ cat /etc/network/interfaces
iface lo inet loopback

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

wpa-conf  /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

wireless-power off
```

```
$ sudo ifdown wlan0
$ sudo ifup wlan0
```

##（STEP6）SSH接続を有効にする

SSHを有効にするにはRaspberry Piの設定コマンドである「raspi-config」コマンドで行います

```
$ raspi-config
```

「8. Advanced Option」→「A4 SSH」を選択してEnableにします。

##（STEP7）TeraTermで接続する

「新しい接続」メニューを選択して「TCP/IP」ラジオボタンを選択し、サービスはSSHを選択します。
OKボタンを押下して接続します。IDとパスワードを入力してログインします。

以上です。
GitBucket導入　覚書き

Mac内にGitサーバーをGitBucketを使って構築した時の覚書き
ProductName:	Mac OS X Server
ProductVersion:	10.7.5
BuildVersion:	11G63

前提
MacにJava7以上が無いと動かない

ここをクリアせず進めると
※MAMPを使ってTomcat上でGitBucketを起動しても404エラーで表示されない
※ターミナル上で実行した場合にエラーが出る

```
Exception in thread "main" java.lang.UnsupportedClassVersionError: JettyLauncher : Unsupported major.minor version 51.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:643)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
Could not find the main class: JettyLauncher. Program will exit.
```

制作者が回答されています。
https://github.com/gitbucket/gitbucket/issues/633

MAMPで実行する場合はTomcatを導入する
http://www.tristancollins.me/computing/serving-java-with-mamp/

AWSでサーバ立てるなら
http://dev.classmethod.jp/cloud/aws/aws-cfn-advent-calendar-2013-gitbucket/
MonacaからMilkcocoaへデータを送る

[Milkcocoa](https://mlkcca.com/)を触ってみようと思ったところ、ちょうどいい[チュートリアル](https://mlkcca.com/tutorial/page1.html)があったので、[Monaca](https://ja.monaca.io/)を使って試してみた。

## Milkcocoaの準備
※詳細はチュートリアルを参照
1. アカウントを作る
2. アプリを作成する

## Monacaでプログラミング
<ol>
<li>プロジェクトを作成する（「最小限のテンプレート」を使う）</li>
<li>index.htmlのbodyタグ部分を以下の内容に書き換える

```lang:index.html
<body>
<div id="output"></div>
<script src='https://cdn.mlkcca.com/v2.0.0/milkcocoa.js'></script>
<script src="main-sp.js"></script>
</body>
```
</li>
<li>index.htmlと同階層にmain-sp.jsファイルを作成し、以下の内容を記述する

```lang:main-sp.js
window.onload = function(){

  var currentMode = 'portrait';
  var output = document.getElementById('output');

  // app_idは自分のものに書き換えてください
  var milkcocoa = new MilkCocoa("app_id.mlkcca.com");
  var ds = milkcocoa.dataStore('gravity');

  window.addEventListener('devicemotion', function(e){
    gravity = e.accelerationIncludingGravity;

    output.innerHTML
    = 'x方向: '+gravity.x
    + '<br>y方向: '+gravity.y;

    sendModeFromGravityValue(gravity);

  },true);


  function sendModeFromGravityValue(g){

    // 絶対値を取得
    var x = Math.sqrt(g.x * g.x);
    var y = Math.sqrt(g.y * g.y);

    // portrait -> landscape
    if(currentMode === 'portrait' && x > 8.5 && y < 1.5){
      currentMode = 'landscape';
      ds.push({mode: currentMode});
    }

    // landscape -> portrait
    if(currentMode === 'landscape' && x < 1.5 && y > 8.5){
      currentMode = 'portrait';
      ds.push({mode: currentMode});
    }
  }
};
```
※公式サイトのチュートリアルはds.send（データを保存しない）にしていたがpushに変更

## 保存されたデータの確認
スマホの向きを変えたタイミングでMilkcocoaにデータが送信される。
保存されたデータはダッシュボードで確認できる。
![Milkcocoa.png](https://qiita-image-store.s3.amazonaws.com/0/30557/3a1fbcc7-04e3-453c-15d3-898e8f3513fb.png)
Xubuntu16.04をインストールして日本語入力

この記事はLinux Desktop Advent Calender 2015の9日目です。

* Ubuntu次のLTSである16.04をいち早くインストールしてみました。

## download

* [xenial-desktop-amd64.iso](http://cdimage.ubuntu.com/xubuntu/daily-live/current/)

## Hash sum mismatchエラーがでる場合

* [apt - Trouble downloading packages list due to a "Hash sum mismatch" error - Ask Ubuntu](http://askubuntu.com/questions/41605/trouble-downloading-packages-list-due-to-a-hash-sum-mismatch-error)

```bash:
sudo rm -rf /var/lib/apt/lists/*
sudo apt-get update
```

これでも治らない場合、ミラーサイト側の問題が考えられる。

```diff:/etc/apt/sources.list
- deb http://jp.archive.ubuntu.com...
+ deb http://archive.ubuntu.com...
```

```bash:
sudo apt-get update 
```

自分の場合はこれで治った。

## 日本語入力

```bash:
sudo apt-get install -y fcitx-mozc
```

* fcitx-autostartの追加が必要。

![日本語.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f83df416-94ce-0d15-a588-ee2e263332d9.png)

# 感想

* docker-composeがパッケージツリーに追加されています。
* 今のところkernelは`4.3.0-2-generic`です。
* Xubuntu16.04から投稿してみました。
勉強会に行ったら人生変わったｗｗｗ


勉強会に行き始めてから僕のエンジニアとしての生き方が変わりました。
勉強会について、つらつらと書いていこうと思います。

## 行って得られるもの
* 各社のステッカー
* モチベーション
* トレンド/ホットワード
* エンジニアの空気感
* 技術のとっかかり

## 行って得られないもの
* 技術力
  * 行って話を聞いて学んだ気になってる人がいるかも知れないですが、技術的には成長していない

## 勉強会に行き続けて学んだこと
* 何個か行くようになると行った方がいいイベント、行かなくてもいいイベントが感覚である程度わかるようになる
* 本当にすごい人なんてごく一部であること
* LTすることなんて、意外と簡単

## 勉強会に行ってて思ったこと
* 自分も発表してみたくなる
* 色々な会社のオフィスに行くの楽しい
* 行って無駄になるのは時間だけだということ
* 一人で頑張るよりもモチベーション湧きやすい
* 全然知らない領域、興味のない領域の話を聞くことで得られることも意外とある。

## 発表することについて
* 発表者も緊張している
* 30分は無理だけど、5分とかのLTなら勢いでなんとかなる
* 誰もが最初から話すのがうまいとか技術力が高いなんてことはない
* 発表者になった方がなにかと得

## 勉強会に行かない人に向けて
* 時間がもったいないと思っている人
 * つまんなかったら帰ればいい。
* 俺は完璧でなんでも知っているから行っても学べることなんてないと思っている人
  * 将来化石になる方に来てほしくないので、くんな
* 行くのがこわいと思っている人
  * こわくなんてないです。まずは参加人数の多い勉強会などから行ってみましょう。
 

## 僕の中ではこんな人はエンジニアっぽくない感じがする
* 会ってすぐ名刺交換
* 「Facebookシェア」させていただきます


## 運営者に向けて
* 初参加者に優しくしてください
  * 内輪で話すのとかはあんまやらない方が話しやすいかも

### あると嬉しい

* Guest Wi-Fi
* 座りやすい椅子
* 懇親会がある場合はある程度お腹が膨れる量の料理


## 参加者に向けて

### 必ずやってほしいこと

* 欠席する場合は早めにキャンセル
 * 人気の勉強会だと席に空きがあるのに行きたい人が入れない現象が発生します

### できれば
* 発表聞く際には少しオーバーリアクションでお願いします
  * 発表者が話しやすくなる

## 僕の体験について

2年前ぐらいに初めて勉強会に行きました。
当時ずっとSIerみたいなことをやっていたのですが、勉強会に行き、
僕の知らない技術、レベルの高い人達、こんなワクワクすることあるんだって思いました。
それからWeb系に転身してエンジニアとしてやれている、今の自分があります。

## 最後に
* とりあえず、勉強会行きましょう！
* 発表していない人がいたら、LTだけでもしましょう！
Blei-Lab の DTM (Dynamic Topic Model) の実行エラー

# まとめ
- 時系列のトピックモデルを扱うDTMのライブラリが Segmentation Fault で落ちる…
- main.c の 40行目 0 -> false に修正するとOK

# 詳細
## 現象
LDAなどで有名なBlei-Labで公開されているDTMを gcc 4.8.X でコンパイルすると，
“main”実行時に Segmentation Fault: 11 で落ちる．

## 環境
- Source:
 - https://code.google.com/p/princeton-statistical-learning/downloads/detail?name=dtm_release-0.8.tgz&can=2&q=
 - https://github.com/Blei-Lab/dtm

- コンパイルなど
 - g++ (GCC) 4.8.3 @ CentOS7.1 

## なにが問題か？

```main.c
     39 DEFINE_bool(initialize_lda,
     40             0,
     41             "If true, initialize the model with lda.");
```
この40行目の“0”がダメ．

## 解決方法

40行目の値はboolが来るはずなので以下のように正しく記述．

```main.c
     39 DEFINE_bool(initialize_lda,
     40             false,
     41             "If true, initialize the model with lda.");
```
で，OKです．
CS-Cart: テンプレート・翻訳・Add-onの更新方法

CS-Cartはファイルを書き換えただけでは更新されないものがあるのでまとめる。

## コアのテンプレート

デバッグモードをOnにすると、ファイル書き換えで即時反映される。

```php:config.local.php
...

define('DEBUG_MODE', true);

...
```

## コアの翻訳(poファイル)

[CS-Cartの言語変数.poファイル更新を適用する方法 - Qiita](http://qiita.com/suin/items/b39466012777a524f253)

## Add-onのテンプレート

* 新規追加したテンプレート
    * 「一般設定」→「ストレージ」→「キャッシュのクリア」
* 既存のテンプレートを変更した場合
    * 上記「コアのテンプレート」と同じ。


## Add-onの翻訳(poファイル)

上記「コアの翻訳」と同じ。

## Add-onのテーブルのスキーマ更新

アドオンをアンインストールして、インストールしなおす。

## Add-onのpermissionの追加・更新

* 「一般設定」→「ストレージ」→「キャッシュのクリア」
コマンドラインから、特定のスレッドだけにシグナルを送る


そのスレッドのtidをあらかじめ知っているなら、
単純に、
kill tid
で、そのtidのスレッドだけに、シグナルを送ることができる。

以下、pidとtidを知っている前提で、
/proc/pid/taskの下を確認しながら
killをした結果。

<pre>
[root@localhost task]# pwd
/proc/19483/task
[root@localhost task]# ll
total 0
dr-xr-xr-x 6 root root 0 Dec  9 13:32 19483
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19484
dr-xr-xr-x 6 root root 0 Dec  9 13:32 19485
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19486
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19487
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19488
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19489
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19490
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19492
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19493
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19494
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19495
dr-xr-xr-x 6 root root 0 Dec  9 13:33 25241
[root@localhost task]# kill 19495
[root@localhost task]# ll
total 0
dr-xr-xr-x 6 root root 0 Dec  9 13:32 19483
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19484
dr-xr-xr-x 6 root root 0 Dec  9 13:32 19485
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19486
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19487
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19488
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19489
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19490
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19492
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19493
dr-xr-xr-x 6 root root 0 Dec  9 12:19 19494
dr-xr-xr-x 6 root root 0 Dec  9 13:33 25241
[root@localhost task]#
</pre>

killの後、該当するtidがなくなっているのが分かる。
※このプログラムは、自分で作ったプログラムで、
　スレッドは、SIGTERMがきたら、その旨をログに出して、
　ちゃんと終了する形にしている。
[*その他*] アプリからの外部データの取得（Access-Control-Allow-Origin編）

# はじめに
外部サーバーとAjax通信したい場合について調べます。

# Access-Control-Allow-Originとは
通常、異なるドメインへのAjax通信はできないが、サーバー側でレスポンスヘッダーに**Access-Control-Allow-Origin**を付けることで自身のサーバーへのアクセスを許可するというもの。

|項目|説明|
|:--|:--|
|Access-Control-Allow-Origin|「*」を設定するとすべてのサイトからのリソースへのアクセスを許可してしまうため、特定のサイトからのアクセスのみ許可するといった設定にしたほうが良い。|
|Access-Control-Allow-Methods|どのメソッドを許可するかの設定。GET、PUT、DELETEなどを指定。|

# コード
レスポンスヘッダーに「Access-Control-Allow-Origin」を設定する。
今回は「*」を指定。

```java:servlet
@WebServlet(name = "CrossServlet", urlPatterns = {"/CrossServlet"})
public class CrossServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        
        String name = request.getParameter("name");
        
        response.setHeader("Access-Control-Allow-Origin", "*");
        
        try (PrintWriter out = response.getWriter()) {
            out.println(name + "さんこんにちは！");
        }
    }
}
```

画面はJavaScriptを呼び出すボタンのみ。

```html:html
<ons-page>
    <ons-toolbar>
        <div class="center">AjaxJSON</div>
    </ons-toolbar>

    <div style="text-align: center">
        <ons-button onclick="crossAjax()">
            Cross Ajax
        </ons-button>
    
        <div id="ajax"></div>
    </div>
</ons-page>
```

外部サーバーにPOSTでリクエストを送る。
データにはnameというパラメーターにMaryを設定。
成功したらデータを受け取って画面に表示。

```js:js
function crossAjax(){
    $.ajax({
        type: "POST",
        url: "http://examplea.com:/AllowAccessCross/CrossServlet",
        data: "name=Mary",
        success: function(data){
            $("#ajax").append("<div>" + data + "</div>");
        }
    });
}
```

# 実行結果
Monacaはhttpsに対して、私が立てているサーバーはhttpでのアクセスなので、安全ではないスクリプトを読み込もうとしているとしてChromeの開発者ツールにエラーが出るので、アドレスバーの右端のマークをクリックして、**安全ではないスクリプトを読み込む**を押下。
![スクリーンショット 2015-12-09 13.34.57.png](https://qiita-image-store.s3.amazonaws.com/0/48912/7e1961e4-034d-89cb-633a-b19cf73c342e.png)

クライアント側から送ったnameパラメーターの値を元にサーバー側からデータを取得して画面に表示。
![スクリーンショット 2015-12-09 13.35.37.png](https://qiita-image-store.s3.amazonaws.com/0/48912/369f0a78-0b0a-be7a-a998-54662e7c1284.png)

# まとめ
サーバー側がクロスオリジン制約を受けているわけではないので、サーバー側で許可すればよいだけっていう感じです。
セキュリティ的なことは考慮に入れないといけませんが。

# 参考
* [HTTP access control (CORS)](https://developer.mozilla.org/ja/docs/HTTP_access_control#Access-Control-Expose-Headers)
Amazon Product Advertising APIの署名認証について

Amazon Product Advertising APIではリクエストの認証のためパラメータとしてTimestamp、Signatureが必要になります。
Timestampは国際標準時を「YYYY-MM-DDThh:mm:ssZ」で編集します。
Signatureはプログラムで作成した値をリクエストに追加する必要があります。

今回は[Product Advertising API Scratchpad](http://webservices.amazon.co.jp/scratchpad/index.html)のPHPコードスニペットを参考にSignatureの作成手順を確認します。

```php
<?php

// Product Advertising APIアカウント作成後に取得するアクセスキーを設定します。
$aws_access_key_id = "アクセスキー";

// Product Advertising APIアカウント作成後に取得するシークレットアクセスキーを設定します。
$aws_secret_key = "シークレットアクセスキー";

// エンドポイントを指定します。
$endpoint = "webservices.amazon.co.jp";

$uri = "/onca/xml";

// リクエストパラメータを指定します。
// ここではISBNが4873115655の書籍の情報を取得します。
$params = array(
    "Service" => "AWSECommerceService",
    "Operation" => "ItemLookup",
    "AWSAccessKeyId" => "アクセスキー",
    "AssociateTag" => "アソシエイトタグ",
    "ItemId" => "4873115655",
    "IdType" => "ISBN",
    "ResponseGroup" => "Images,ItemAttributes,Offers",
    "SearchIndex" => "Books"
);

// タイムスタンプを追加します。
if (!isset($params["Timestamp"])) {
    $params["Timestamp"] = gmdate('Y-m-d\TH:i:s\Z');
}

// キーを基準にパラメータをソートします。
ksort($params);

$pairs = array();

// パラメータを key=value の形式に編集します。
// 同時にURLエンコードを行います。
foreach ($params as $key => $value) {
    array_push($pairs, rawurlencode($key)."=".rawurlencode($value));
}

// パラメータを&で連結します。
$canonical_query_string = join("&", $pairs);

// 署名に必要な文字列を先頭に追加します。
$string_to_sign = "GET\n".$endpoint."\n".$uri."\n".$canonical_query_string;

// RFC2104準拠のHMAC-SHA256ハッシュアルゴリズムの計算を行います。
// これがSignatureの値になります。
$signature = base64_encode(hash_hmac("sha256", $string_to_sign, $aws_secret_key, true));

// Siginatureの値のURLエンコードを行い、リクエストの最後に追加します。
$request_url = 'http://'.$endpoint.$uri.'?'.$canonical_query_string.'&Signature='.rawurlencode($signature);

echo "Signed URL: \"".$request_url."\"";

?>
```

生成される署名付きURLはこんな感じ

```
http://webservices.amazon.co.jp/onca/xml?
AWSAccessKeyId=アクセスキー
&AssociateTag=アソシエイトタグ
&IdType=ISBN
&ItemId=4873115655
&Operation=ItemLookup
&ResponseGroup=Images%2CItemAttributes%2COffers
&SearchIndex=Books
&Service=AWSECommerceService
&Timestamp=2015-12-09T04%3A18%3A41Z
&Signature=19NRyLoK2qnPtEAguD2FC3ZTWrtNp1C6w9zVnKRqa8Y%3D
```
AS3 のサウンドマネージャのライブラリを作ってみました

# 前置き
自分は相変わらず仕事で AS3 を使っているのですが、その中でサウンド管理機能が必要になったため、ライブラリを作ってオープンソースとして、初めて GitHub に上げてみました。AS3 でサウンドマネージャライブラリって幾つかあるにはありますが、ちょっと自分の想定していた感じではなかったので、勉強がてら作ってみました。

まぁもしよろしければご使用頂ければ有り難いかなと思いますので、紹介など軽く。

# SoundConductor

https://github.com/Hiiragi/SoundConductor

このライブラリは、主にゲーム関連での実装を想定されています。特に目玉となるのは「イントロ付き無限ループ機能」です。

ゲームでよくありますよね。最初はイントロから始まり、後は A メロ、B メロ、C メロとかだけで構築したいっていうの。たとえば、FinalFantasy の初期のバトル曲とか、最初のベースがソロでイントロを奏で、それ以降はイントロ以外のところをループします。そんなことが可能になるわけですね。

こちら、SoundGenerator 機能を使用しているため、バイト単位でループを構築できるので、サウンドのつなぎ目が（ちゃんと時間設定すれば）綺麗につながるというものです。まぁ案外 Flash のサウンド系ライブラリには無かった機能だと思うんで、気になる方は使って頂ければと思います。

# デモ

それ以外の機能とか使い方とかは、Github の方に書いちゃっているので、簡単なデモを。（作りこむ時間がないので簡素ですみません
[Demo](https://dl.dropboxusercontent.com/u/37111207/InifiniteLoopDemoBySoundConductor/InifiniteLoopDemoBySoundConductor.swf)

音楽素材は「Wingless Seraph」さんより、「Battle for Honor」という曲を拝借しました。
http://wingless-seraph.net/

1 ループ 50 秒ほどの BGM を延々とループさせるだけのものです。一番上はマスタボリューム系のパネル、次の通常のサウンド機構を使用したループ、最後に SoundConductor の「イントロ付き無限ループ機能」のデモとなります。

普通の Sound クラスを使用したループは、最後まで再生した上でループさせるだけですので、綺麗に繋がるわけではなく、更にはループの際に瞬無音状態が入ってリズムがつっかかってしまいます。
ですが、SoundConductor の「イントロ付き無限ループ機能」を使用すると、アラ不思議、綺麗に繋がりますねー。ちゃんと、2回目以降のループはイントロが付いてないですね。スライダを見ていただくと、半分あたりから最初らへんに戻るのが確認できるかと。
（あ、ちなみにスライダにシーク機能はつけていません。御了承ください。）

# その他の機能
その他、以下の機能がありますので、詳細は Github を参照してください。多分ゲームに良くある機能は最低限網羅しているかと思います。

- サウンドのグルーピング機能
- ボリュームのフェードイン・アウト
- 「マスターボリューム」「グループボリューム」、そして「音そのもののボリューム」を使用した多段性のボリューム調整機能
- ポーズ・リジューム機能

フィードバックとかあれば頂ければと思いますので、宜しくお願いします。

# 追記
デモ作ってたら、バグがありましたので、調査予定です（バグ修正完了しました
・個別のミュート機能
・「SoundPlayType.SINGLE_SOUND_GENERATOR」での初期ボリュームが最大
逆引きレシピについて

現在PHPを学習しているのですが、先日書店でPHP逆引きレシピというのを見つけて購入しようか迷っています。
逆引きレシピが出たのが2013年ですが現在のPHPとの違いなどはあるものなのでしょうか？
またさまざまな言語にはこういった逆引きレシピやポケットリファレンスなどあるみたいですが、こういった物は学習するにあたり持っておいたほうがいいのでしょうか？
旧バージョンのJDKのダウンロード方法

最新バージョン以外のJDKで開発をする場合、旧バージョンのJDKをダウンロードする方法をまとめました。

# 最新バージョンのダウンロード

最新のJDKのダウンロードは[こちら](http://www.oracle.com/technetwork/java/javase/downloads/index.html)から(Oracle.com英語サイト)

# 旧バージョンのダウンロード

旧バージョンのJDKが必要な場合の手順。
**アーカイブからのダウンロードはOracle.comプロファイルが必要です**
Oracle.comプロファイルって何？という場合は[こちら](http://www.oracle.com/jp/corporate/contact/contact-accounthelp-078887-ja.html)を(日本オラクルのサイト)。

1. 最新バージョンと[同じページ](http://www.oracle.com/technetwork/java/javase/downloads/index.html)の一番下にあるリンクからアーカイブのページへ移動。
 ![無題.png](https://qiita-image-store.s3.amazonaws.com/0/31205/e11566cb-0314-434e-8b68-192b826faf46.png)

2. バージョンごとのリンクがあるので、必要なバージョンのページに移動。
 ![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/31205/a4784ce8-6973-fca9-4d88-70f026dfd180.png)

3. アップデート番号を選択してダウンロードする。
![無題3.png](https://qiita-image-store.s3.amazonaws.com/0/31205/92ac929c-40e9-1832-752e-f6b199f5b6bc.png)
![無題4.png](https://qiita-image-store.s3.amazonaws.com/0/31205/47cb3d68-d4f4-382b-16f9-1051307557bf.png)
cin でテキストファイルから読み込み

例えば下記オンラインのプログラミング問題では、基本的に標準入力からデータを読み取るために cin を多用します。
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0001&lang=jp

まず最初にこんな感じで回答コードを書くわけですが、

```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
  vector<int> vec;

  // 標準入力から値を 10 個読み取る
  for(int i = 0; i < 10; ++i)
  {
    int n;
    cin >> n;
    vec.push_back(n);
  }

  // 降順ソート
  std::sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; });

  // 大きい順に3つ出力
  for(int i = 0; i < 3; ++i) { cout << vec[i] << endl; }

  return 0;
}
```

果たしてこれが正しい回答なのか、手元のPCで色々な入力をテストしたいと思うことがたびたびあります。そんなとき、

- 標準入力を毎回手で打つのはしんどいのでファイルから読み取らせたい
- しかし提出するコードをあまり変えたくはない

という2つの要求でてきます。

コードを3行付け足すだけで cin の入力元を指定ファイルに変更できます。

```cpp
// ...

// 追加１
#include <fstream>

int main()
{
  // 追加２, 以降 cin の入力元が 'input.txt' になる
  std::ifstream in("input.txt");
  std::cin.rdbuf(in.rdbuf());

  // ...
}
```

コードを提出するときには上の3行を削除するだけで OK です。
python > mmという文字を含まない > if "mm" not in text: / print "not including mm"

pythonで"mm"という文字列を含まないという判断をしたい

http://stackoverflow.com/questions/3437059/does-python-have-a-string-contains-substring-method

http://ideone.com/yCVsHS

```test.py
text = "hello"

print text

if "ll" in text:
	print "including ll"
	
if "mm" not in text:
	print "not including mm"
```

```txt:結果
Success	time: 0.03 memory: 44680 signal:0
hello
including ll
not including mm
```
sublime text 3でgolang開発するためのプラグインなど

この記事は、2015年の[Advent Calendar Go その2](http://qiita.com/advent-calendar/2015/go2)の9日目の記事です。

最近乗り遅れまいとgolangをさわり始めました。
普段使っているエディタがsublime textなので、sublime textでgolangの開発をする際に入れたプラグイン等を書こうと思います。


# GoTools

[ironcladlou/GoTools](https://github.com/ironcladlou/GoTools)
[Package Control GoTools](https://packagecontrol.io/packages/GoTools)

[GoSublime](https://github.com/DisposaBoy/GoSublime)が定番っぽいのですが更新が止まっているようなので、似たような総合パッケージのGoToolsを使っています。

主な機能は、

- フォーマット
- 自動補完
- 関数などの宣言元へのジャンプ
- build関連

になります。

### GoToolsインストール,初期設定

必要なライブラリをイントール後、いつも通りなPackage Controlからインストールします。

- 必要な外部ライブラリをインストール

```
go get -u -v github.com/nsf/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v golang.org/x/tools/cmd/goimports
go get -u -v golang.org/x/tools/cmd/oracle
go get -u -v golang.org/x/tools/cmd/gorename
```

その後、Preferences > Package Control: Install Package
からGoToolsをインストールします

インストール後、初期設定としてgopathの設定が必要です。
Preferences >　Package Settings > GoTools > Settings - Users
に↓的なgopathを設定します。

` "gopath": "/home/hoge/go"`

自分のgopathは、以下で確認できます。

```
go env GOPATH
```

### フォーマット

保存時に自動でフォーマットをしてくれます
またフォーマットの方式を'gofmt', 'goimports', 両方から選択できます
先ほどの、Preferences > Package Settings > GoTools > Settings - Userに

`"format_backend": "both"`

と設定するとgoimportsしてからgofmtするので、
不要なimportがあったら削除、importが不足していたら勝手に追加してくれます。


### 関数などの宣言元へのジャンプ

キーバインディングを設定すれば、宣言元へジャンプしてくれます
Preferences > Key Bindings - Userに下記のように設定すれば宣言元へジャンプしてくれます。
ありがたい・・・

`{"keys": ["ctrl+g"], "command": "gotools_goto_def"},`

# Golang Build

build関連もGoToolsでsublime text上からできるのですが、公式のbuildパッケージがあるのでそちらを使用しています。

[Package Control Golang Build](https://packagecontrol.io/packages/Golang%20Build)
[golang/sublime-build](https://github.com/golang/sublime-build)

インストールはいつも通り
Preferences > Package Control: Install PackageからGolang Buildを選択してインストールするだけです。
合わせて、こちらにも初期設定としてgopath等を、
Preferences > Package Settings > Golang Config > Settings - Userに設定します。

```
{
  "GOPATH": "/home/hoge/go",
  "PATH:": "/home/hoge/go/bin"
}
```

なんらかキーバインディングを設定するのでもよいですが、
デフォルトならTools > Build System でgoを選択後、
macに場合、
command + b でbuild実行。
command + shift + b でrun,testなどが選択できるウィンドウが出るので目的のものを選択できます。

<br>

参考になる方いらっしゃったら幸いです＞＜
秒を日:時:分:秒に変換するシェルスクリプト

```bash
#!/bin/sh
if [ $# -eq 2 ]; then
	start_time=$1
	end_time=$2
elif [ $# -eq 1 ]; then
	start_time=0
	end_time=$1
fi

diff=$((end_time - start_time))
let day="$diff / 86400"
let diff="$diff % 86400"
let hour="$diff / 3600"
let diff="$diff % 3600"
let minitue="$diff / 60"
let second="$diff % 60"
echo "${day}d:${hour}h:${minitue}m:${second}s"
```
引数が1個の場合は、秒を日:時:分:秒に変換。
引数が2個の場合は、経過時間を日:時:分:秒に変換。
Jive OAuth 入門

Jive に REST API でアクセスして情報収集がしたい。

Jive の認証は単純な userid/password ではなく OAuth なる手法を使う模様。以下
[How To Use OAuth 2.0 for REST API Calls](https://community.jivesoftware.com/docs/DOC-157031)
の記載に従って REST API で Jive へアクセスしてみる。

#STEP 1a: 
オプションなので無視

#STEP 1b: Jive Add-on の生成
Jive へ OAuth でアクセスするには [Jive Add-on](https://community.jivesoftware.com/docs/DOC-99941) を生成する必要がある。Add-on は OAuth で最も基本になる設定ファイルで取り急ぎ以下のイメージを持っておけばよい。

・ZIP形式のファイルでその中にフォルダとファイルを持つ
・ファイルの内もっとも重要なのが meta.json と definition.json である
・フォルダは /data と /i18n
・Jive のユーザインターフェイスから中身を確認可能（下図）
![20151209-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/104747/56382034-4c11-122d-5d19-36b16e815ed6.png)

## meta.json と definition.json の作り方
初めての人は [meta.json のサンプル](https://community.jivesoftware.com/docs/DOC-157031#jive_content_id_metajson) と [definition.json のサンプル](https://community.jivesoftware.com/docs/DOC-157031#jive_content_id_definitionjson) をコピペして使えばよい

```meta.json
{
    "package_version": "1.0",
    "id": "INSERT_UUID_HERE",
    "type": "client-app",
    "name": "oauth.support",
    "description": "This add-on provides OAuth 2.0 support for the REST API",
    "minimum_version": "0070300000",
    "icon_16": "lightbulb-16.png",
    "icon_48": "lightbulb-48.png",
    "released_on": "2015-05-12T19:11:11.234Z",
    "register_url": "%serviceURL%/register",
    "unregister_url": "%serviceURL%/unregister",
    "service_url": "http://INSERT_URL_HERE"
}
```

"id" "service_url" "unregister_url" "redirect_url" の値を自身のサイトに合わせて書き換える

```definition.json
{  
    "integrationUser": {  
        "systemAdmin": true,  
        "jiveServiceSignature": "INSERT_SIGNATURE_HERE"  
    }  
}  
```

System admin 権限が必要な場合は "jiveServiceSignature" の値を signature へ書き換える。まずは system admin 権限は不要なのでこの値を削除して "systemAdmin" を false にすればよい。

# STEP 1c: Add-on をコミュニティにインストール

meta.json と definition.json を Zip ファイルにして[こちら](https://community.jivesoftware.com/docs/DOC-141123)の手順にしたがってインストールする
.gitignore対象にしないで、git addの候補から外す。めも。

.gitignore対象にしたくないけど、git addに出てきてほしくないファイルがあった。(開発環境用に書き換えるconfigファイルなど)

コミット時に毎回git addから外すのめんどくさい。たまに間違えてコミットしてたりしてめんどくさい。

以下で対象からはずせた。

```bash
git update-index --skip-worktree target.file
```

詳しくは: http://qiita.com/usamik26/items/56d0d3ba7a1300625f92
Swiftのprotocol extension内でprotocolから同じオブジェクトかを比較する

## まず始めに

`protocol extension`内で適合先のオブジェクトが全く同じものかを`generics`を使用せずに`protocol`自身を引数として受け取って比較したい場合があるかと思います。
その際に少々躓いたので、備忘録として2パターンのコードを書き残そうと思います。

### パターン1

`protocol`の適合先が**Swiftクラス**または**`NSObject`を継承しているクラス**である場合に限り、`protocol`に対して`class`を適合することによって、`===`での比較が可能となります。
※`NSObject`のクラスに限る場合には、`class`ではなく`NSObjectProtocol`でも同様に可能です。

```swift
protocol HogeProtocol: class {
    func execute(hp: HogeProtocol) -> String
}

extension HogeProtocol {
    func execute(hp: HogeProtocol) -> String {
        if self === hp {
            return "executed"
        }
        return "not executed"
    }
}

class HogeObject: HogeProtocol {}

let ho = HogeObject()
ho.execute(ho) //executed
ho.execute(HogeObject()) //not executed
```

### パターン2

`protocol`の適合先が**`struct`**または**`enum`**である場合には、`protocol`に`uuid`を要求する制約を定義し、`protocol extension`内で`uuid`の比較をすることで同じものかどうかの判断ができるようになります。
※`class`や`NSObjectProtocol`を付与しない限り`self`を使用することができないのですが、`struct`や`enum`では`class`や`NSObjectProtocol`が使用できない(`NSObjectProtocol`に関しては、適合先のクラスで制約を実装すれば使用可能)ので、`uuid`比較が良いのではないかと考えております。

```swift
protocol HogeProtocol {
    var uuid: String { get set }
    func execute(hp: HogeProtocol) -> String
}

extension HogeProtocol {
    func execute(hp: HogeProtocol) -> String {
        if uuid == hp.uuid {
            return "executed"
        }
        return "not executed"
    }
}

struct HogeStruct: HogeProtocol {
    var uuid = NSUUID().UUIDString
}

let hs = HogeStruct()
hs.execute(hs) //executed
hs.execute(HogeStruct()) //not executed
```
Android OS バージョン別推移（2015年12月版）


2015年12月7日に最新データが更新されましたので、半年ぶりにアップデートします。

## 過去の投稿
* 2015年6月
[Android OS バージョン別推移（2014年1月〜2015年6月）](http://qiita.com/hmukaida/items/9502eb435b0e0c24dcfa)

* 2014年12月
[Android OS バージョン別年間推移（2014年）](http://qiita.com/hmukaida/items/94b97d5d3d0924b3dcca)

## 参考
* [juggly.cn](http://juggly.cn/archives/tag/android%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E5%88%A5%E3%82%B7%E3%82%A7%E3%82%A2)
* [developer.android.com](https://developer.android.com/about/dashboards/index.html)

## 注意
* 日本のシェアではなく、Google が発表している世界的なシェアとなります。 

# Android OS バージョン別推移
## 推移：表

* 抜けている箇所は特に発表が無かった為にデータなしとなっているものです。

￼￼￼![kobito.1449630802.721916.png](https://qiita-image-store.s3.amazonaws.com/0/39380/8265c9d9-a9a3-e11d-e660-fd379be71c89.png "kobito.1449630802.721916.png")


## 推移：グラフ（折れ線）

* コードネーム毎に折れ線にて。

![kobito.1449630853.072330.png](https://qiita-image-store.s3.amazonaws.com/0/39380/513a96ac-6239-9728-1064-3717a006de2e.png "kobito.1449630853.072330.png")

￼

## Android OS バージョン4.1以上のシェア：約95%
* Android 4.1以上のシェアとしては、95%に迫る勢いとなっています。

￼![kobito.1449630871.747547.png](https://qiita-image-store.s3.amazonaws.com/0/39380/73095f8d-1a5d-d8b9-5089-68f8c44a88bd.png "kobito.1449630871.747547.png")


## WebView：Chroniumベースエンジンのシェア：約67%
* WebView が Chronium ベースとなっているのは Android4.4以上となっています。
* シェアとしては 67% に迫っています。

￼![kobito.1449630883.244091.png](https://qiita-image-store.s3.amazonaws.com/0/39380/004a86c1-19c7-7cf2-9ddb-c3ab38933b27.png "kobito.1449630883.244091.png")


## まとめ

* 直近の動きとしては、Android OSのメジャーバージョンアップが進んでいます。あわせて Nexus 製品の裾野が広がっているようにも思います。
* Android 4.1以上のシェアとしては、95%に迫り、ChroniumベースのWebView シェアも 67%に迫ってきました。
* Android 5.0以上では、WebViewそのものが Google Pay経由でアップデートされるますが、グローバルでもシェアは30%程度ですのでまだまだこれからでしょうか。
cocos2d-x 3.9 python2.7 Windows10でのbuild_native.pyがエラーになる回避方法

http://www.cocos2d-x.org/programmersguide/G/index.html#environment-requirements

ここを見ると
[Dependencies: Python 2.7]
と書いてある。

すでにpython 2.7を入れていたのでOKと思っていた。(--versionで確認)

```shell-session:command
python --version
2.7
```

[build_native.py]でエラーとなってうまくいかない。

apache antのところでエラーになるから、そのあたりを探ってみてたけど解決しない。
android-ndk周辺もチェックしたけどだめ。

結局のところ、
Python 2.7.11（現時点で最新）にすると問題なく通った。


どうやら、build_native.pyが’（シングルコーテーション）で全体を囲ってその中で”（ダブルコーテーション）を使ってるようなコマンドがある。これがpython 2.7では理解できないみたい。python 2.7.11で解決している。けっこう重要な問題だね。これ。