OmniAICreator/Qiita-1.07M huggingface dataset:
DynamoDBLocalとAWS SDK for PHP2でごにょごにょする3 - putとget

[DynamoDBLocalとAWS SDK for PHP2でごにょごにょする2 - create table](http://qiita.com/duke-gonorego/items/a1c2eba2a3ce8192bde4)で作成したテーブルにデータを入れて、検索をしてみようと思います。


#### 環境
---
 * VirtualBox 4.3
 * ubuntu 14.04
 * PHP 5.5.9-1ubuntu4.5 (cli)

#### データ投入
---

```php:PutItem.class.php
<?php
require_once 'DynamoDB.class.php';
class PutItem {
    private $dynamo;
    public function __construct() {
        $this->dynamo = DynamoDB::conn();
    }

    public function execute() {
        for ($i = 1; $i <= 10; $i++) {
            for ($j = 1; $j <= 10; $j++) {
                $item = array(
                    'user_id' => array('N' => $i),
                    'customer_id' => array('N' => $j)
                );

                $map = array(
                    'TableName' => 'user',
                    'Item' => $item
                );
                $this->dynamo->putItem($map);
            }
        }
    }
}
$putItem = new PutItem;
$putItem->execute();
```

```
php PutItem.class.php 
```

投入されたようです。では実際にデータを取得してみましょう

#### データ取得
---

```php:GetItem.class.php
<?php
require_once 'DynamoDB.class.php';
class GetItem {
    private $dynamo;
    public function __construct() {
        $this->dynamo = DynamoDB::conn();
    }

    public function execute() {
        $param = array(
                'TableName' => 'user',
                'KeyConditions' => array(
                'user_id' => array(
                    'AttributeValueList' => array(
                        array('N' => 1)
                    ),
                    'ComparisonOperator' => 'EQ'
                )
            )
        );

        $iterator = $this->dynamo->getIterator('Query', $param);

        $data = array();
        $i = 0;
        foreach ($iterator as $item) {
            $data[$i]['user_id'] = $item['user_id']['N'];
            $data[$i]['customer_id'] = $item['customer_id']['N'];
            $i++;
        }
        var_dump($data);
    }
}
$getItem = new GetItem;
$getItem->execute(); 
```

```
$ php GetItem.class.php 
array(10) {
  [0]=>
  array(2) {
    ["user_id"]=>
    string(1) "1"
    ["customer_id"]=>
    string(1) "1"
  }
  [1]=>
  array(2) {
    ["user_id"]=>
    string(1) "1"
    ["customer_id"]=>
    string(1) "2"
  }
  [2]=>
  array(2) {
    ["user_id"]=>
    string(1) "1"
    ["customer_id"]=>
    string(1) "3"
  }
…
```

データのputとgetが成功しました。

※各パラメータについては
[AWS SDK for PHP](http://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.DynamoDb.DynamoDbClient.html#_query)を参考にしました
MacでCocos2d-x 3.4を動かす（Android）

クロスプラットフォームのCocos2d-xを触ってみようということになり、Macで環境構築を行いました。iPhoneでのセットアップはものの30分ほどで完了しましたが、Androidで手こずりました。
以下備忘録としてまとめます。
※Windowsでも同様の作業を行いましたが、Pythonのインストールがプラスαあるだけで、概ね同じでした。

## 環境構築
[【cocos2d-x 3.3】MacでAndroid版の環境構築](http://tech.sanwasystem.com/entry/2015/02/04/131311)
上記サイトをもとに、Eclipse、SDK、NDKをインストールします。
大変わかりやすくまとめてくださっており、感謝です。

## Cocos2d-xプロジェクトの生成
Cocos2d-xのプロジェクトを作成するルートフォルダへ移動し、cocosコマンドからプロジェクトを生成します。

```
$ cd /cocos2d/
$ cocos new MyGame -p com.mycompany.mygame -l cpp
$ cd MyGame
$ cd proj.android
$ ./build_native.py
```

## Eclipseへインポート
- Workspaceの設定
Workspaceは任意の場所で問題なさそうです。
![workspace.png](https://qiita-image-store.s3.amazonaws.com/0/70446/8e835b3b-0b18-e135-a722-b26856434ed3.png)
- NDK_ROOTの設定
![NDK.png](https://qiita-image-store.s3.amazonaws.com/0/70446/18f87923-04b5-c9ff-d485-26b49c66d121.png)

- Preferences - AndroidのAPI Level 16以上のものを選択する。
※私の環境では、この設定をしなければビルドできませんでした。
![target.png](https://qiita-image-store.s3.amazonaws.com/0/70446/2f7a1a98-750f-c4ae-f944-01d8918ada75.png)

- Eclipseへプロジェクトをインポートする。手順は、File - New - Other - Android - Android - Project from Existing Code
Root Directory に/Cocos2d/MyGame/proj.androidを指定し、Finishを押下します。
さて、上記設定だけでは、AppActivity.javaがエラーになり、ビルドすると"Your project contains erros(s), please fix them before running your application."と表示されてしまいます。
![error.png](https://qiita-image-store.s3.amazonaws.com/0/70446/c7a80700-63cb-fa54-c352-9954be29d7bf.png)

libcocos2dのライブラリが参照できていないようなので、プロジェクト名を右クリックし、Propaties - Java Build Path - Source - Link Sourceから./cocos2d-x-3.4/cocos/platform/android/java/srcをリンクします。

![nexus.png](https://qiita-image-store.s3.amazonaws.com/0/70446/53dd49d1-c641-8713-e66e-2b2e031b7397.png)

リンクが完了すれば、無事Helloworldプロジェクトを実行することができました。
Masterブランチにマージ済みのローカルブランチを一括削除する方法

目的:
リリースが終わって、Masterブランチにマージ済みの手元のブランチを一括削除したい。

#コマンド
```bash
git fetch && git branch --merged origin/master | grep -v "^\s*master" | grep -v "^*" | xargs git branch -D
```

#概要

```git branch --merged {COMMIT}``` で特定のCOMMITを指定してマージ済みのブランチを取得できる。そこからカレントブランチとmasterブランチを除外して削除。

ちなみにローカルにあるリモートブランチへの参照は

```
git remote prune origin
```

とか

```
git fetch -p
```

とかで消せる。

aliasを貼っておくと更に便利

```
alias git-delete-merged-br='git fetch && git branch --merged origin/master | grep -v "^\s*master" | grep -v "^*" | xargs git branch -D'
```
Markdownの箇条書き(List)がyardの出力に反映されない

#概要
<dl>
  <dt>症状</dt>
  <dd>Markdownにで使用したListが，yardで出力した際に正常に表示されない．githubや，<a href="https://atom.io/">Atom</a>のプレビューでは正しく表示される．
  <dt>原因</dt>
  <dd>リストの上下には空行が必要．</dd>
</dl>

#詳細
Markdownを使って以下のように箇条書きを書いていた．

	[v0.1.5]
	* デバッグ
	  * StandardErrorで例外を捕縛できない問題を修正
	  * DatParseException, NotA2chUrlException発生時に与えられたURLを表示するよう変更

しかし，[yard](http://yardoc.org/)での出力はこのようなものだった．

	[v0.1.5] * デバッグ * StandardErrorで例外を捕縛できない問題を修正 * DatParseException, NotA2chUrlException発生時に与えられたURLを表示するよう変更

このように表示された原因は「[リストの上下に空行が必要](http://qiita.com/Qiita/items/c686397e4a0f4f11683d#lists---%E3%83%AA%E3%82%B9%E3%83%88)」だった．上下に空行を入れ，

	[v0.1.5]
	
	* デバッグ
	  * StandardErrorで例外を捕縛できない問題を修正
	  * DatParseException, NotA2chUrlException発生時に与えられたURLを表示するよう変更

と記述することで，

[v0.1.5]

* デバッグ
  * StandardErrorで例外を捕縛できない問題を修正
  * DatParseException, NotA2chUrlException発生時に与えられたURLを表示するよう変更

と表示された．

#補足
Kobitoでは，空行を入れないとプレビューが崩れるため，すぐに気づく．

Kobitoでの表示：

	[v0.1.5]
	* デバッグ
	* StandardErrorで例外を捕縛できない問題を修正
	* DatParseException, NotA2chUrlException発生時に与えられ	たURLを表示するよう変更

Original: http://blog.dogwood008.com/2015/03/markdownlistyard.html
I/O処理


|クラス|用途|
|:---|:---|
|FileStream|バイトベースのファイル入出力|
|StreamWriter|文字ベースの出力ストリーム|
|StreamReader|文字ベースの入力ストリーム|
|BinaryWriter|バイナリデータの出力ストリーム|
|BinaryReader|バイナリデータの入力ストリーム|
|MemoryStream|メモリベースのストリーム|
|StringReader|メモリベースの文字ストリーム（入力）|
|StringWriter|メモリベースの文字ストリーム（出力）|

```cs:WindowsでシフトJIS形式で出力する方法
using System.IO;
using System.Text;

StreamWriter fout = new StreamWriter("test.txt", false, Encoding.Default);
fout.Write("日本語");
fout.Close();
```
Unityは、左手座標系です。


|方向|向き|
|:---|:---|
|X方向|右が正|
|Y方向|上が正|
|Z方向|奥が正|

Vector2のプロパティ

|プロパティ|説明|
|:---|:---|
|zero|Vector2(0, 0)|
|one|Vector2(1, 1)|
|right|Vector2(1, 0)|
|up|Vector2(0, 1)|

Vector3のプロパティ

|プロパティ|説明|
|:---|:---|
|zero|Vector3(0, 0, 0)|
|one|Vector3(1, 1, 1)|
|left|Vector3(-1, 0, 0)|
|right|Vector3(1, 0, 0)|
|forward|Vector3(0, 0, 1)|
|back|Vector3(0, 0, -1)|
|up|Vector3(0, 1, 0)|
|down|Vector3(0, -1, 0)|
C#入門


|データ型|メモ|
|:----|:----|
|decimal|128ビットの数値型。リテラルには最後にmを付ける（10.10mなど）。丸め誤差がない。|
|char|16ビットの符号なし整数型。Unicode文字を表す。|
|構造体|struct 構造体名 { }|
|列挙型|enum 列挙型名 { 列挙値のリスト };

|参照型|メモ|
|:----|:----|
|クラス|class クラス名 { }|
|インターフェイス|public interface インターフェイス名 { }|

|フォーマット文字列|メモ|
|:---|:---|
|Console.WriteLine("{0:#.##}", 10.0/3.0);|出力：3.33|
|Console.WriteLine("{0:C}", 12345m);|出力：¥12,345|

```cs:文字列を数値型データに変換する
string str;
try {
	str = Console.ReadLine();
	decimal decimalVal = Decimal.Parse(str);

	str = Console.ReadLine();
	double doubleVal = Double.Parse(str);

	str = Console.ReadLine();
	float floatVal = Single.Parse(str);

	str = Console.ReadLine();
	long longVal = Int64.Parse(str);

	str = Console.ReadLine();
	int intVal = Int32.Parse(str);

	str = Console.ReadLine();
	short shortVal = Int16.Parse(str);

	str = Console.ReadLine();
	ulong ulongVal = UInt64.Parse(str);

	str = Console.ReadLine();
	uint uintVal = UInt32.Parse(str);

	str = Console.ReadLine();
	ushort ushortVal = UInt16.Parse(str);

	str = Console.ReadLine();
	byte byteVal = Byte.Parse(str);

	str = Console.ReadLine();
	sbyte sbyteVal = SByte.Parse(str);
}
catch (FormatException exc) {
}
catch (OverfloatException exc) {
}
```
node.js



### expressのバージョン

``$ npm install -g express ``  
ver.3.0.0rc1がインストールされてしまう。


//バージョン指定  
``$ sudo npm install express@2.5.8 ``
 
//2だけでもOK。この場合、2.5.11がインストールされました。
``$ npm install -g express@2``


### socket.ioのバージョン
npm install socket.io@0.9.16


---

ipaddress
``ifconfig``


### mongodb のバージョン
``$ npm install mongodb@1.3.23 ``
【メモ】配列のキーを変更したいけど…

なんだか簡単に変更できない。
ドキュメントを見てもそれらしい関数が無い？
有用ではないのでメモとして。

#結論
関数作ってみたけど…

* 車輪の再発明感がすごい。
* 一つ一つ手動で入れればいいじゃん。そんなに楽にならないよ。
* そもそも受け手でキーを変更するなら最初から必要な名前にしなさい(サフィックス・プレフィックスはまだ使いドコロがあるかも…)
* 数値添字とか考慮してない

結局ほぼ使わなかったので動作検証とかはないです。

#出来ないこと

```php
foreach ($array as &$key => $value) {
    $key .= 'hoge';
}
```
はキーにリファレンス使えないと怒られる。

`array_walk`とかは構造を変更できないらしい。
>変更される可能性があるのは配列の値だけであり、 その構造を変更することはできません。つまり、 プログラマは要素の追加や削除そして並べ替えなどができないということです。 コールバック関数がこの条件を満たさない場合は、 この関数の動作は未定義で予期せぬ結果を得ることになります。 

#作ったもの

もやもやするけど作る

```php:キーにサフィックスをつける関数
function array_key_suffix(array $array, $suffix = '')
{
    $result = array();
    foreach ($array as $key => $value) {
        $result[$key . $suffix] = $value;
    }
    return $result;
}
```
作るという程のものでもないが。
` $result[$suffix . $key]`にすればプレフィックス
関数にしなければ直接`$array`に入れていいが、代わりに`unset($array[$key])`が必要。

###任意のキーを付けるなら

`array_combine`?
でも配列の数と順番が一致しないといけない。
やはり変更前後の表を作って変換するしかないが、存在チェックもしなければいけない

```php
array_key_change(array $map, array $array)
{
    $result = array();
    foreach($map as $before => $after) {
        if(array_key_exists($before, $array)) {
            $result[$after] = $array[$before];
        }
    }
    return $result;
}
```

`$before`が無ければ`$after`が生まれない。`null`を入れておく

```php
function array_key_change(array $map, array $array)
{
    $result = array();
    foreach($map as $before => $after) {
        if(array_key_exists($before, $array)) {
            $result[$after] = $array[$before];
        } else {
            $result[$after] = null;
        }
    }
    return $result;
}
```
じゃあ三項演算子でいいのか。

```php
function array_key_change(array $map, array $array)
{
    $result = array();
    foreach($map as $before => $after) {
        $result[$after] = array_key_exists($before, $array) ? $array[$before] : null;
    }
    return $result;
}
```

キーがないならキーごとのデフォルト値を入れたい場合は…?

```php
function array_key_change(array $map, array $array, array $default)
{
    $result = array();
    foreach($map as $before => $after) {
        $result[$after] = array_key_exists($before, $array) ? $array[$before] : $default[$before];
    }
    return $result;
}
```

んーこれだとキーが定義されて値が`null`だと`null`が入るはず。この場合は`isset()`のほうがいいのかな…

そもそも期待するキーが無ければ無いままでいいのかもしれない。
あと配列内のキーの付け替え(値交換)にも使えそう。
swiftでカレンダー情報を使う

## カレンダーへの登録
自分で作った実装のメモの抜き出しであるが、だいたい以下のように
カレンダーを登録するViewがいて、そのインスタンス変数にイベント情報を管理するModelである
EKEventを持っておいて、swiftに大感謝なプロパティ監視のdidsetをつけておいて、
イベント情報の更新の度にViewを更新してくれるようにした。

便利だ〜。

```
    var addEvent:EKEvent = EKEvent(eventStore: Calender.sharedInstance.database)
        {
        didSet{
            self.startDateLbl.text = NSDate.datetime(self.addEvent.startDate)
            self.endDateLbl.text = NSDate.datetime(self.addEvent.endDate)
        }
    }

    @IBAction func save(sender: AnyObject) {
        addEvent.title = self.titleField.text
        addEvent.calendar = Calender.sharedInstance.defaultCalendar
        var err:NSError?
        var res = Calender.sharedInstance.database.saveEvent(addEvent, span: EKSpanThisEvent, error: &err)
        if !res {
            if let error = err {
                println("save failure: \(error.localizedDescription)")
            }
        }
        NSNotificationCenter.defaultCenter().postNotificationName(NotifType.CloseAddEvent.rawValue, object: nil)
    }

```

あと肝は
```
Calender.sharedInstance.defaultCalendar
```

一部引っこ抜くと以下のような感じだけど、シングルトンでデータマネージャ系は扱っている、
この参照が思ったより重い

```

class Calender: NSObject {
    var database = EKEventStore()
    var defaultCalendar:EKCalendar!
    var eventStore:EKEventStore = EKEventStore()
    
    override init() {
        super.init()
        if self.determineStatus()
        {
            self.defaultCalendar = self.eventStore.defaultCalendarForNewEvents
        }
    }
    
    class var sharedInstance : Calender {
        struct Static {
            static let instance : Calender = Calender()
        }
        return Static.instance
    }
```
CentOS6.6インストール~設定

# インストール
# ようこそ
1番上


## [Disc Found]
ディスクのチェックなので**[SKIP]**を選択

## [What language 〜]
**日本語**を選択

## ストレージデバイス
基本

## 既存でOSがあった場合
- 新規
- アップグレード

お好きに。

## [ホスト名]と[ネットワーク]の設定


### ホスト名
hogohoge.jp

### ネットワーク設定
- ネットワークは手動
- ip 
  - 192.168.80.52
  - 24
  - 192.168.80.1


## [使用するタイムゾーン〜]
アジア/東京
「システムクロックでUTCを使用」のチェックを外す

## [rootパスワード]
例）root

## [どのタイプのインストールをしますか？]
すべての領域を使用する

## [ストレージ構成をディスクに書き込み中]
（データがすべて失われる旨の警告が表示されます）
データが削除されても問題がなければ「変更をディスクに書込む」を選択

## [CentOSのデフォルトインストールは最小限インストールです。オプションとして追加の〜]
Basic Server

## 再起動
再起動を促すメッセージが表示されるので再起動

#　再起動後ターミナルにて作業

## ネットワークの設定
### 起動時にネットワークが起動するかの設定
`/etc/sysconfig/network-scripts/ifcfg-eth0` を編集
`ONBOOT=no` を `ONBOOT=yes` に変更

## アップデートと各種設定

`yum -y update`

`sudo yum groupinstall "Development tools" -y`

`sudo yum install kernel-devel yum-utils vim-enhanced -y`

`sudo service vboxadd setup`

## SELinux無効設定
[SELinuxとは(Wiki)](http://ja.wikipedia.org/wiki/SELinux])
`/etc/selinux/config`を編集
`SELINUX=enforcing`　を　`SELINUX=disabled`　に変更

## iptableの設定
[iptableとは(Wiki)](http://ja.wikipedia.org/wiki/Iptables)

チェインCHAIN（省略した場合はすべて）のルールを一覧表示するリストを表示
`iptables -L`

iptablesが自動起動しているか確認
`chkconfig --list iptables`

iptableの自動起動を切る
`chkconfig iptables off`

再度、自動起動しているか確認
`chkconfig --list iptables`

## ユーザーの作成
`useradd -g wheel username`

## パスワードの設定
`passwd username`

wheelグループに入れる意味は、rootに昇格できる(suコマンドでrootになれる)ようにするため

## ログイン後rootで作業する場合
`su -` か `su -l`(こちらは同等のコマンド)
JavascriptでJSONエスケープをする。


JSONでよく使うエスケープの\uXXXX形式って「Unicode escape sequence」って呼ぶらしいですね。
JavaScriptで文字列をこの形式に変換する関数を作ってみました。

実行すると下記のようになります。
1行目が元の文字列、2行目がJSONエスケープした文字列、3行目がまた文字列にアンエスケープした文字列です。

    hello_1234abc日本語~!@#$%^&*()_+{}[]:";<>,./?	world
    hello_1234abc\u65e5\u672c\u8a9e\u007e\u0021\u0040\u0023\u0024\u0025\u005e\u0026\u002a\u0028\u0029_\u002b\u007b\u007d\u005b\u005d\u003a\u0022\u003b\u003c\u003e\u002c\u002e\u002f\u003f\u0009world
    hello_1234abc日本語~!@#$%^&*()_+{}[]:";<>,./?	world


```JavaScript
//\uXXXX形式:Unicode escape sequence

String.prototype.json_escape = function() {
	var result = '';
	var str = "" + this;
	if (str === undefined || str === null) return result;
	for (var i = 0; i < str.length; i++) {
		var ch = str[i];
		if (ch != '_' && !(ch >= '0' && '9' >= ch) && !(ch >= 'a' && 'z' >= ch) &&
			!(ch >= 'A' && 'Z' >= ch)) {
			var unicode_ch = ch.charCodeAt(0).toString(16);
			result += "\\u";
			for (var j = 0; j < 4 - unicode_ch.length; j++) {
				result += "0";
			}
			result += unicode_ch;
		} else {
			result += ch;
		}
	}
	return result;
};

//元の文字列
var str = 'hello_1234abc日本語~!@#$%^&*()_+{}[]:";<>,./?'+"\t"+'world';
//JSONエスケープ：Unicode escape sequence
var escaped_str = str.json_escape();
//元にもどした文字列
var unescaped_str = eval('{"' + escaped_str + '"}');

console.log(str);
console.log(escaped_str);
console.log(unescaped_str);
```

難解な文字だと処理怪しいかな...？
コメントにてツッコミよろしくお願いします。
三項演算子(Python)

　三項演算子を使うことで代入の条件分岐を一行でスマートに記述することができます。

<h1>用法</h1>
```plaintext
(変数) = (条件がTrueのときの値) if (条件) else (条件がFalseのときの値)
```
<h1>例</h1>
　例えば次のような条件によってxの値を分けたいとき

```py:python
if n == 10:
    x = "OK"
else :
    x = "NG"
```
　
　これを三項演算子を用いて一行で表現すると次のようになります。

```py:python
x = "OK" if n == 10 else "NG"
```
Spark CoreをOSXとUSB-Serial接続してWi-Fiのセットアップする

Spark CoreをSpark Cloudと接続してAndroidアプリからLチカを試してみます。Spark CoreのセットアップはAndroidアプリを使わずに、OSXとUSB-Serial接続して行います。なぜかAndroidアプリからWi-Fiへ接続できない時にUSB-Serial接続が必要になります。

## OSXとUSB-Serial接続する

AndroidなどのSpark CoreアプリからWi-Fi接続できない状態になった場合など、ホストマシンとSpark CoreをUSB-Serial接続をしてWi-Fiの設定をやり直す場合の手順です。以下のコミュニティサイトを参考にします。

* [App doesn’t connect, USB connection refused - SOLVED](https://community.spark.io/t/app-doesnt-connect-usb-connection-refused-solved/881)

### LEDが青色点滅状態であること

LEDが青色に点滅していて、Wi-Fi接続が待機中であることを確認します。シアンがゆっくり点滅している場合は、Wi-Fi接続中なので、MODEボタンを10秒押してSparkCoreメモリ上のWi-Fi接続情報をクリアします。

今回はホストマシンにMacBook Proを使います。Spark CoreをMacBook Proの右側のUSBポートにケーブルで接続します。lsでデバイスファイルを確認します。

### screenコマンドでシリアル接続

``` bash
$ ls /dev/tty.usb*
/dev/tty.usbmodem1421
```
左のUSBの場合は`tty.usbmodem1411`になります。

``` bahs
/dev/tty.usbmodem1411
```

ターミナルを開きscreenコマンドでSparkCoreとシリアル接続します。

``` bash
$ screen /dev/tty.usbmodem1421 9600
```

`i`キーを押すと、すでにSpark CloudにCoreが登録されている場合はIDが表示されます。

``` bash
Your core id is xxx
```

`w`キーを押すと、Wi-Fiの接続情報を入力できるようになります。今回の環境だと暗号化方式はWPA2です。

``` bash
SSID: xxx
Security 0=unsecured, 1=WEP, 2=WPA, 3=WPA2: 3
Password: xxx
Thanks! Wait about 7 seconds while I save those credentials...

Awesome. Now we'll connect!

If you see a pulsing cyan light, your Spark Core
has connected to the Cloud and is ready to go!

If your LED flashes red or you encounter any other problems,
visit https://www.spark.io/support to debug.

    Spark <3 you!
```

### Spark Cloudへの接続確認

LEDは緑が点滅してWi-Fiに接続します。シアンがすやすや点滅し始めるとCoreのSpark Cloudへの接続が完了した状態です。

OSXのscreenコマンドは、`~/.screenrc`でエスケープキーを`t`にしています。

``` bash
$ cat ~/.screenrc
escape ^Tt
```

`control + t + k`を押して、screenのウインドウを閉じます。

``` bash
Really kill this window [y/n]
```

## Tinkerアプリ

Androidの[Tnkerアプリ](https://play.google.com/store/apps/details?id=io.spark.core.android&hl=ja)と、Spark Coreにデフォルトでインストールされている[Tinkerファームウェア](http://docs.spark.io/tinker/#tinkering-with-tinker-the-tinker-firmware)を使います。

### Tinker設定のクリア

以前設定したTinkerの設定をクリアする場合はメニューから`Clear Tinker`を選択します。

### Tinker

Spark Coreアプリを起動してログインすると、Spark Cloudに登録したCoreが表示されます。


![d7-init.png](https://qiita-image-store.s3.amazonaws.com/0/43745/93d4dad2-eab1-e788-4ef0-f47308c8cb40.png)


右上のD7をタップした後、digitalWriteをタップします。

![d7-setting.png](https://qiita-image-store.s3.amazonaws.com/0/43745/d564c163-ec93-b14f-7b05-33a8b5a7b79c.png)


右上のD7が赤くなりました。

![d7-red.png](https://qiita-image-store.s3.amazonaws.com/0/43745/f67f5c81-1abd-a3e4-d746-cccfa9d5a956.png)

D7をタップしてHIGHにすると、Spark CoreのUSBポート右側のLEDが青く点灯します。もう一度D7をタップしてLOWにすると点灯が終了しす。

![d7-high.png](https://qiita-image-store.s3.amazonaws.com/0/43745/f129a376-7f91-8525-5091-de3126fb8df2.png)
EventBusのonEvent関数を使用中としてハイライトする

# 関数のハイライト

Android Studio上でコードをみた時に、利用されていない関数は下記の画像のように灰色に表示されてしまう。

![event_no_suppress.png](https://qiita-image-store.s3.amazonaws.com/0/15000/db91e853-3bae-1651-25d9-f4d556756832.png)

これは、EventBusがReflectionを利用して動的にonEvent〜関数を呼び出しているから。

なんとなく気持ち悪いので、次のように `@SuppressWarnings("unused")` をつけてあげるとハイライトされていい感じ。

![event_suppress.png](https://qiita-image-store.s3.amazonaws.com/0/15000/bf27c9b8-934b-e1b2-a66f-bde1f3b1cc1b.png)
CentOS6のSubversionを1.8にアップデート

```
cat <<_EOF > /etc/yum.repos.d/WandiscoSVN.repo
[WandiscoSVN]
name=Wandisco SVN Repo
baseurl=http://opensource.wandisco.com/centos/6/svn-1.8/RPMS/$basearch/
enabled=1
gpgcheck=0
_EOF
yum clean all
yum -y install subversion
```
コンフリクト発生！焦らず利用する4つのコマンド #git

## 目的

* コンフリクトが発生した時に焦って何をしたら良いのか迷わないためのメモ。
* コンフリクトが発生したら焦らず最低限次の4つのコマンドを利用して修正する。  
※ここでは普段良く利用するものに限定、方法は他にもある。

```console
git status
vi [conflict file]
git add [conflict file]
git commit -m 'fixed conflict'
```

## pullした時、コンフリクトしていることの確認

### 問題ない場合

```console
Auto-merging app/....php
```

### コンフリクトしている場合

```console
CONFLICT (content): Merge conflict in app/....php
```

## git status

* コンフリクトしているファイルを確認。
* 「Unmerged paths:」にあるファイル一覧がコンフリクトしている修正の必要なファイル。

```console
Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:      app/....php
```

## vi [conflict file]

* 「/<<<」でコンフリクト箇所を検索。
* 変更点を確認し修正後に保存。

```code
<<<<<<< HEAD
自分の環境の変更点
=======
マージを試みた他の環境での変更点
>>>>>>> [commit id]
```
※必ずしも自分の環境の変更点を優先しない。理由があって変更されていると思われるので内容を確認の上、修正を行う。

## git add [conflict file]

* コンフリクト修正の完了したファイルをadd。

## git commit -m 'fixed conflict'

* 全てのコンフリクト修正が完了したらcommit。
* 「-m」オプションでコメントを付けられる。

## その後

* pullしたりpush。

## 参考サイト

* http://www.backlog.jp/git-guide/
* http://git-scm.com/book/ja/v1
HTMLメールでiPhoneに送ると日付と時間がアンカーになってしまった時の対処法


# metaタグを入れてみる

```html
<meta name="format-detection" content="telephone=no,address=no,email=no,date=no">

```

標準メーラーだとダメでした。

# 特殊文字を入れる

```html
<p>3月12日 21:00</p>
```

だとしたら


```html
<p>3月&#8203;12日&#8203; 21&#8203;:&#8203;00</p>
```

このような形で```&#8203;```を入れてみる。

これでアンカーにならずにスタイルも効きます！
Scalazを用いずにsequenceっぽいことをしたい


例えばScalaで

- 複数のAPIサーバに
- それぞれ同時にリクエストを発行し
- 全てのレスポンスがきたらレスポンスを合成する

みたいな動作をさせたいとき、よくありますよね。
複数同時にアクセスするとき、最初

```scala

// NoXFetcher#fetch... () => Future[Either[FetchException, OkResponse]]
for {
  f1 <- new No1Fetcher(timeout).fetch
  f2 <- new No2Fetcher(timeout).fetch
  f3 <- new No3Fetcher(timeout).fetch
  f4 <- new No4Fetcher(timeout).fetch
} yield Seq(f1, f2, f3, f4)

```
みたいにかけば、どのAPIにアクセスして、それを合成しているかがわかるのでいいかなーって思ったのですが、こうやって書くと、どうやらそれぞれのAPIのレスポンスを待ち合わせてf1とかにバインドしてしまうみたいです(レスポンスを意図的に遅めて見ると遅延した時間ぶん各fetchが叩かれるのが遅かった)

ので、同時に叩かせてかつ一覧性を上げるために別の手段を用いたいと思います
幸い、ここではFetcherは全て同じ型をextendsしているので、全てのFetcherに対してfetchを発行すればいいだけです

```scala
val apiSeq: Seq[Future[Either[Exception, Response]]] =
      Seq(
        new No1Fetcher(timeout), 
        new No2Fetcher(timeout), 
        new No3Fetcher(timeout), 
        new No4Fetcher(timeout)
      ).map(_.fetch)
```

これでSeqの中を全てFutureにしました。しかし今は複数のFutureを持っています。これを一つのFutureで、各レスポンスをSeqにして持ちたい。つまり `Future[Seq[Either[FetchException, OkResponse]]]`な型にしてやりたいです。FutureとSeqのポジションを逆転させたいということですね

こうしたい場合、皆さんご存知のようにScalazのsequenceを用いれば `apiSeq.sequence` みたいな操作で逆転できますが、ここでは諸事情によりScalazを入れられないということにします

ちなみにこの場合でforを使おうとすればこのようになります

```scala
for {
  e1 <- apiSeq(0)
  e2 <- apiSeq(1)
  e3 <- apiSeq(2)
  e4 <- apiSeq(3)
} yield Seq(e1, e2, e3. e4)
```

先ほどforを使ったのはAPIアクセスの一覧性を上げた上で一発で変換したいからでした。しかし今はSeqに既に入っているのでその取り出しをする必要があり、そうすると完全にマジックナンバーなSeqのapplyが発生し、ひどいコードになります。

この場合のもう少しましな方法としては、flatMapとfoldを組み合わせれば良いです

```scala
apiSeq.foldLeft(Future.Seq.empty[Either[FetchException, OkResponse]])((left, right) => right.flatMap(e => left.map(_ :+ e)))
```

こちらのほうが、呼び出しAPIが増えたり、別のところで同じようなことをした時、このメソッドを呼び出せばいいだけなので良さそうにも思えます

とはいえ、sequenceの下位互換の実装になりますし、実際型周りをちゃんとした上で便利に使いたいと思った場合は素直にscalazを使うことを検討した方が良さそうです

----
追記(2014/3/2 14:27)

[Futureにはそもそも、sequenceしてくれるメソッドが生えてます](http://www.scala-lang.org/api/current/index.html#scala.concurrent.Future%24@sequence%5BA,M%5BX%5D%3C:TraversableOnce%5BX%5D%5D%28in:M%5Bscala.concurrent.Future%5BA%5D%5D%29%28implicitcbf:scala.collection.generic.CanBuildFrom%5BM%5Bscala.concurrent.Future%5BA%5D%5D,A,M%5BA%5D%5D,implicitexecutor:scala.concurrent.ExecutionContext%29:scala.concurrent.Future%5BM%5BA%5D%5D)ので、それを呼び出すのがこの場合のベストプラクティスっぽいです ( @gakuzzzz さん感謝！ )

定義

```scala
sequence[A, M[X] <: TraversableOnce[X]](in: M[Future[A]])(implicit cbf: CanBuildFrom[M[Future[A]], A, M[A]], executor: ExecutionContext): Future[M[A]]
```

つまりこの場合こうすればOKですね

```scala
Future.sequence(apiSeq)
```

objectの方のFutureに生えてるのがどことなく気持ち悪いですが、これで出来ます
Hubot で cron を動かしながら Slack に発言するとき(v3)

以下のようなスクリプトを組んだとして

```coffeescript:cron_task.coffee
cronJob = require('cron').CronJob

module.export = (robot) ->
  task1 = new cronJob('00 00 00 * * 1-5', () ->
    # 発言したい
```

robot しか無いので、robot.send で発言させます。
この時

```coffeescript:cron_task.coffee
cronJob = require('cron').CronJob

module.export = (robot) ->
  task1 = new cronJob('00 00 00 * * 1-5', () ->
    envelope = room: "#channel"
    robot.send envelope, "ほげら"
```

とかすると、

```

[Mon Mar 02 2015 00:00:00 GMT+0000 (UTC)] ERROR TypeError: Cannot call method 'send' of undefined
  at SlackBot.send (/path/to/hubot/node_modules/hubot-slack/src/slack.coffee:181:16, <js>:216:33)
  at Robot.send (/path/to/hubot/node_modules/hubot/src/robot.coffee:395:19, <js>:365:42)
  at Object.cronJob.onTick (/path/to/hubot/scripts/cron_task.coffee:8:7, <js>:15:15)
  at Object.CronJob._callback (/path/to/hubot/node_modules/cron/lib/cron.js:343:26)
  at [object Object].callbackWrapper [as _onTimeout] (/path/to/hubot/node_modules/cron/lib/cron.js:405:14)
  at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
```

とか言われます。一件 robot が存在しなくて send 呼んじゃったっぽく見えますが、hubot-slack v3 からチャンネルの指定の仕方が変更され、以下のようにしないと動きません。

```coffeescript:cron_task.coffee

cronJob = require('cron').CronJob

module.export = (robot) ->
  task1 = new cronJob('00 00 00 * * 1-5', () ->
    envelope = room: "channel"
    robot.send envelope, "ほげら"
```

チャンネル名のシャープは取りましょう。
DynamoDBLocalとAWS SDK for PHP2でごにょごにょする1 - 接続

[DynamoDB Localを使ってみる](http://qiita.com/duke-gonorego/items/a41e0d7ae7ff3ec6ec08)にてとりあえず動作確認はできたので、
次はPHPを使って色々と触ってみようと思います。

まずはAWS SDK for PHP2を用意します。

#### 環境
---
 * VirtualBox 4.3
 * ubuntu 14.04
 * PHP 5.5.9-1ubuntu4.5 (cli)

#### PHP ComposerでAWS SDK for PHP2をインストールする
---
```json:composer.json
$ cd ~
$ vim composer.json
-----
{
    "require": {
        "guzzle/guzzle": "3.9.*",
        "aws/aws-sdk-php": "2.6.*"
    }
}
-----
$ curl -sS https://getcomposer.org/installer | php
$ php composer.phar install
```

#### 接続クラスを作ってみる
---

```php:DynamoDB.class.php
<?php
require_once "../vendor/autoload.php";
use Aws\Common\Enum\Region;
use Aws\DynamoDb\DynamoDbClient;
class DynamoDB
{
    public static function conn(){
        return DynamoDBClient::factory(array(
            'key' => 'aws_key',
            'secret' => 'aws_secret_key',
            'region' => Region::TOKYO,
            'base_url' => 'http://localhost:8000'
        ));
    }
}
```

※「require_once」で取得したAWS SDK for PHP2のライブラリを指定します
※「base_url」にはDynamoDB Localを起動したときのポートを指定します。
※「key」「secret」は本来発行された値を利用しますが、Localの場合は上記でも構わないようです

#### DynamoDB Localに接続してみよう
---

```php:DescribeTable.class.php
<?php
require_once 'DynamoDB.class.php';
class DescribeTable{
    private $dynamo;
    public function __construct() {
        $this->dynamo = DynamoDB::conn();
    }

    public function execute() {
        $param = array(
            'TableName' => 'test'
        );
        try {
            $result = $this->dynamo->describeTable($param);
        } catch (DynamoDbException $e) {
            print $e;
        }
    }
}
$describeTable = new DescribeTable;
$describeTable->execute();
```

```実行
$ php DescribeTable.class.php
PHP Fatal error:  Uncaught Aws\DynamoDb\Exception\ResourceNotFoundException: AWS Error Code: ResourceNotFoundException, Status Code: 400, AWS Request ID: d4227200-37d7-4960-88fb-ac1275f3f5c9, AWS Error Type: client, AWS Error Message: Cannot do operations on a non-existent table …
```

まだテーブルを作成していないので「test」というテーブルは無い(non-existent table)
と表示されます。

どうやら接続は問題無さそうです。
次はテーブルを作成してみます。
IntelliJ IDEA 14.0.3 EAPにphpプラグインが対応

プレリリース大好きなので各種エディタなどは毎度最新版EAPを入れているのですが、IntelliJ IDEA 14.0.3 EAPは昨年来phpプラグインが更新されずプラグインが無効状態でした。
3/1リリースだったのかプラグイン側もアップデートして使えるようになっています。

14.0.3 EAPは、TypeScriptコンパイラがつき、プロジェクトパネルもTypeScriptなどのコンパイルが必要な言語でファイルがごちゃごちゃしすぎるのを整理して表示してくれる機能がついているので、お持ちの方は試してみるといいと思います。
![新しいプロジェクトパネルの折りたたみと展開表示](https://qiita-image-store.s3.amazonaws.com/0/10363/1c3ecda5-3b88-2f3b-0b28-1544bcd08efb.png)

IntelliJ IDEAのEAPはクラッシュした時もまず本体は落ちないので比較的試しやすいプレ版ではないかと。

phpに関しては、IntelliJ IDEA主導ではなく WebStorm主導のプラグインなのですかね。開発中のものなので、また無効な時期も来ると思いますが、次のEAPリリースまでは使えると思います。
Bootstrapでbadgeに色がつかない

## 現象

* Bootstrap3系で`<span class="badge badge-success">hoge</span>`としても色がつかなかった

## 原因

* 3系からは`default`以外の色は廃止された
* 参考: http://matome.naver.jp/odai/2137510540117012201

## 対策

* `label`で代用
* 自分で定義

```css
.badge-red{
  background-color: red;
}
```
ispartaが動かないときの緊急対処方法

追記: [isparta@2.2.0](https://github.com/douglasduteil/isparta/releases/tag/2.2.0) で修正されました

いつからかははっきりしないのですが、ES6 に対応したカバレッジ計測ツール [isparta@2.1.0](https://github.com/douglasduteil/isparta/releases/tag/v2.1.0) でコードの変換に失敗してレポートが生成されない場合があります。

```
> babel-node node_modules/.bin/isparta cover --report text --report html --report lcov node_modules/.bin/_mocha

Transformation error; return original code
[TypeError: Cannot read property 'transform' of undefined]

...

No coverage information was collected, exit without writing coverage information
```

この問題の issue は [babel](https://github.com/babel/babel) にあがっていて、モジュールのインポート方法が変わったことにあります。

- [Using ES6 module in 'src/babel/api/node.js' makes 'isparta' broken](https://github.com/babel/babel/issues/908)

isparta の方にプルリクエストが来ているのですが、まだマージされていません（というかCIでエラーになってる）

- [fix to babel/babel#908](https://github.com/douglasduteil/isparta/pull/23)

まあ、修正されるのは時間の問題だろうとして、とりあえず今すぐカバレッジレポートを作りたい場合の対処方法です。

1. 好きなエディタで `node_modules/isparta/lib/instrumenter.js` を開く
2. [19行目](https://github.com/douglasduteil/isparta/blob/master/lib/instrumenter.js#L19)を以下のように修正

```diff
- var babel = _interopRequire(require("babel-core"));
+ var babel = require("babel-core");
```
Brightcove NGP(新プレイヤー)のプラグイン作成方法

# プラグインとは
NGPではプラグインを開発することによってプレイヤーの機能を拡張することができる。
プラグインとしてプレイヤーに読み込ませられるファイルはJavaScript/CSSの2種類。

プラグインを使えば下記のようなことを実現できる。

* 最初の10秒間、プレイヤー上にオーバーレイで特定のテキストを表示させる。
* 再生ボタンが押されるたびに何かする。

ちなみに動画広告も専用の広告配信プラグインを使用して配信したりする。

# プラグイン例
ソースの一例。

```js:myPlugin.js（JavaScriptプラグイン）
// プラグイン名を適当に付ける。パラメータを配列形式で受け取る（パラメータは無しでもOK）。
videojs.plugin('myPlugin', function(param) {
    console.log(param);
    var player = this;

    // プレイヤーの再生ボタンが押されたとき
    player.on("play", function(){
        console.log("再生ボタンが押されました。");
    });

    // 動画が最後まで再生されたとき
    player.on("ended", function(){
        console.log("動画の再生が完了しました。");
    });
});
```

取得できるプレイヤーイベント等は公式ドキュメントを参照。
:link: [Brightcove Player API](http://docs.brightcove.com/en/video-cloud/brightcove-player/reference/api/vjs.Player.html)

# プレイヤー側にプラグイン読み込み・パラメータ設定
## 通常の場合
プレイヤー管理画面のプラグイン設定欄にプラグインファイルのURLとプラグイン名を入力。
プラグインに渡すパラメータが、そのプレイヤーを使用して配信している動画全てで同じでよければここの設定欄に入力できる。

## ページ毎に異なるプラグインを読み込ませたり、別々のパラメータをプラグインに渡したい場合
※[インページ方式](http://qiita.com/naga1460/items/c339ea5d256922307063#%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%BC%E3%83%89)で埋め込んでいる場合のみ可能

動画埋め込み先ページに下記のようにプラグイン読み込み・パラメータ指定スクリプトを記述する。

```js:
<script src="myPlugin.jsのURL"></script>
<script type="text/javascript">
    videojs('インページvideoタグのID').myPlugin({
        "url"  : location.href
    });
</script>
```

# 参考
プラグイン開発の公式ドキュメント
・http://docs.brightcove.com/en/video-cloud/player-management/guides/plugin-dev-quick-start.html
・http://docs.brightcove.com/en/video-cloud/player-management/getting-started/player-mgmt-quick-start.html#customizePlayer
Brightcove NGP(新プレイヤー)の動画埋め込みコード比較

※NGP(Next Generation Player):
Brightcove(動画配信プラットフォーム)の最新プレイヤー。
読み込みが速い。

# 基本
プレイヤー管理画面で発行されるタグを貼り付ける。
発行されるタグにはiframe/インページの2種類ある。
※パフォーマンスには違いはないらしい。

# iframeコード（基本的にはこちら推奨）
```html
<iframe width='XXX' height='XXX' src='//players.brightcove.net/[アカウントID]/[プレイヤーID]_default/index.html?videoId=[ビデオID]' allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>
```

## メリット
* iframeなので埋め込みページにあるJavaScript/CSSとの衝突がなく、扱いやすい。  
* 確実にifrmaeタグで指定した大きさでプレーヤが描画される。  

## デメリット
* 埋め込みページからプラグインにパラメータを渡す公式的な仕組みは用意されていないので、プラグインでページ固有の値を受け取って処理をする、ということが困難。  
（プレイヤー共通のパラメータであれば管理画面から設定可能）  
※プラグインとは→[Brightcove NGP(新プレイヤー)のプラグイン作成方法](http://qiita.com/naga1460/items/863d659ded16404ddfaa)

# インページコード
```html
<video
 id="allPlayer"
 width="XXX" 
 height="XXX" 
 data-account="[アカウントID]"
 data-player="[プレイヤーID]"
 data-embed="default"
 data-video-id="[ビデオID]"  
 class="video-js" controls
></video>
<script src="//players.brightcove.net/[アカウントID]/[プレイヤーID]_default/index.min.js"></script>
```

## メリット
* 埋め込みページからプラグインにパラメータを渡せる。

## デメリット
* 基本的には自動レスポンシブらしいが、iframeと異なり表示するページのJavaScript/CSSの影響を受けるので、意図しない表示や動作になる可能性がある。

# どっちを使うか
* プラグインでページ固有の値を使わないならiframe、使うならインページ。
* 使う場合でも値が数種類に限定されるのであればプレイヤーをその分作成してiframeで埋め込み。

# 参考
http://docs.brightcove.com/en/video-cloud/brightcove-player/guides/iframe-vs-embed.html
64ビット CPU の遊び方

#はじめに

最近の PC やサーバ用 CPU は特別なものを除けば x64 とか AMD64 とか呼ばれる 64ビット CPU が主流です。しかし、スクリプト言語や Java などを使っている限り、そのことを実感できません。実際に実感するためには、やはりアセンブラが一番です。

ということでアセンブラを使って64ビット CPU で遊んでみました。試した環境としては、AWS で稼働している Ubuntu 14.04LTS です。具体的にはこんな感じです。

* Single core Intel Xeon CPU E5-2670 v2
* Host: ip-172-??-??-130 Kernel: 3.13.0-36-generic x86_64 (64 bit)

#アセンブラとは

アセンブラとは正確にはアセンブリー言語とか言います。CPU は機械語だけしか解釈しませんが、命令がその機械語に１対１に対応するような言語です。言い直せば、機械語をシンボルを使って記述する言語みたいな感じです。

Linux の C コンパイラ (gcc) には as というアセンブラが付いてきますが、ここでは nasm というアセンブラを使っています。理由は、けっこうしっかりしたマニュアル (英語ですが) が付いているのと、記述方法が as よりシンプルなためです。

##nasm のインストール

nasm のインストールですが、Ubuntu では apt-get で簡単にインストールできます。もし、gcc が入ってない場合は、gcc もインストールしておく必要があります。

`$ sudo apt-get install nasm`

予備知識

アセンブラは機械語と１対１に対応しています。したがって、アセンブラ (アセンブリー言語) を知っていても、CPU の構成とか機械語を知らないとプログラムは作れません。ここでそこまで書いていたら長くなってしまいますし、本題に入るまでに時間がかかってしまうので、それについては読者が知っているものとします。

 
#それでは Hello World から

アセンブラは機械語と１対１ですから、他の言語だと１行ですむようなプログラムもこんなに長くなります。


```hello.asm
section  .data                  ; データセクションの定義
message  db 'Hello, World', 0x0a
length   equ $ -message         ; 文字列の長さ
section  .text
global   _start                 ; エントリーポイント

_start:
mov     rcx, message            ; 文字列の先頭アドレス
mov     rdx, length             ; 文字列の長さ
mov     rax, 4                  ; 出力(sys_write)
mov     rbx, 1                  ; ファイルハンドル(1 = 標準出力)
int     0x80                    ; システムコール
mov     rax, 1                  ; sys_exit
mov     rbx, 0                  ; 終了ステータスコード
int     0x80                    ; システムコール
```

下がその実行例です。

```
ubuntu@ip-172-??-??-130:~/workspace/nasm$ bin/hello
Hello, World
ubuntu@ip-172-??-??-130:~/workspace/nasm$
```

ここでメッセージを表示する部分は最初の int 0x80 です。これは何かというと、ソフトウェア割り込み命令ですね。0x80 番の割り込みを行うと rax で指定した番号に対応する OS で用意されているエントリーポイントへ飛んでいくというものです。

最後にも int 0x80 がありますが、こちらはプログラムを終了する (OS に制御を返す) ためのシステムコールです。ところで rax とか rbx とかは 64bit 汎用レジスタと呼ばれるもので、CPU 内部の演算に使用するための一時記憶用高速メモリみたいなものです。mov は move 命令というもので即値データやレジスタのデータなどを他のレジスタにコピーします。

CPU の命令や構造ですが、こちらがわかりやすそうです。

[Introduction to x64 Assembly](https://software.intel.com/en-us/articles/introduction-to-x64-assembly)


ビルド方法

このプログラムをアセンブル＋リンクするには下のようにします。この例で、ソースファイル (.asm) は src/ に、中間ファイル (.o) は obj/ に、実行ファイルは bin/ に置くものとします。

```
nasm -f elf64 -o obj/$1.o src/$1.asm
ld -s -o bin/$1 obj/$1.o
```

##Linux System Calls

Linux のシステムコールですが、下のサイトに詳細が出ています。全部で 338 種類もあるようです。

[System Calls](http://syscalls.kernelgrok.com/)

#簡単な足し算

次に簡単な足し算をしてみます。今度は、8ビットレジスタ al を使っています。システムコールも 64bit レジスタでなく本来の 32bit レジスタを使っています。また、前の例 (Hello World) ではリンカに直接 ld を使っていましたが、今度は gcc から間接的に使うようにしています。そのため、エントリーポイントの名前は C プログラムと同じ main に変えました。


[長いので続く..](http://bonk.red/articles/Misc/nasm_x64.html)
Embulk(エンバルク) データベースプラグイン覚書

**embulk-output-jdbc 3.0移行にまだ対応できておらず、一部の情報が古いです。**


# 接続できるデータベース

| RDBMS      | プラグイン              |動作 | 備考        |
|------------|------------------------|------|------------|
| PostgreSQL | embulk-output-postgres |      |            |
| MySQL      | embulk-output-mysql    |      |            |
| MariaDB    | embulk-output-mysql   |未確認|            |
| Redshift   | embulk-output-redshit  |      |            |
| Oracle     | embulk-output-oracle   |||
| SQLite     | embulk-output-jdbc     |未確認|            |
| SQL Server | embulk-output-jdbc?    |未確認|            |
| DB2        |                        |未確認|要プラグイン |

※ 未確認とは、ネット上で動作したという記事をみておらず動作が確認できていないことを表します。

* Oracle
  * [Outputの問題](https://twitter.com/frsyuki/status/571462704860307456)
  * [embulk-output-oracle](https://github.com/embulk/embulk-output-jdbc/pull/13)を開発中
  * [Inputは接続できた模様](https://twitter.com/grimrose/status/572351909194940416)
  * [embulk-output-oracleを高速化したので使い方についてまとめる](http://hito4-t.hatenablog.com/entry/2015/04/07/215837)
* SQLite3
  * SQLite3はBIGINT4に未対応のため組み込みのデータベースプラグインでは出力ができません。[ログ](https://gist.github.com/hiroyuki-sato/01026212009af027a0e2)
  * 代わりに[embulk-output-sqlite3](https://rubygems.org/gems/embulk-output-sqlite3)が利用できます。

## モード

二つのモードが実装済みです。またtruncate_insertモードの導入が検討されていいます。

* insertモード: 読み込んだデータをテーブルに追記していきます。
* replaceモード: 読み込んだデータでテーブルを丸ごと置き換えます。
* truncate_insertモード、既存のエントリは削除して読み込んだデータに追記します。(テーブルをドロップしない) (未実装)

### insertモードの動作

* インサート先のテーブルがなかったらテーブルを作成します。
* テンポラリテーブルに読み込んだレコードを挿入します。
* インサートの処理はタスクの数だけ並列で行われます。

インサートモードを利用するときはrunのオプションに-oをつけて最後に読み込んだファイルを記憶させると便利です。

### replaceモードの動作

* テンポラリテーブルを作成します。
* テンポラリテーブルに読み込んだレコードを挿入します。
* インサートの処理はタスクの数だけ並列で行われます。
* インサート先のテーブルがあった場合テーブルをドロップします。
* テンポラリテーブルの名前をインサート先のテーブルに変更します。

## 今後追記予定

* Embulkの型とRDBMSのカラムの対応表
* 現状INTは未サポート等
Slack API でユーザ・チャンネルの名前がリンクされないときの対処法 (あるいは takosan を試した件)

# ikachan for Slack こと takosan を試した

Slack API を通じて簡単に Slack にメッセージを送信できる [takosan](https://github.com/kentaro/takosan) が便利そうだったので試してみました。

* [Slack用のIkachanを作った](http://blog.kentarok.org/entry/2015/02/25/234518)

用途としては、例えば実行に時間のかかるコマンドを実行して、終わったら自分宛てに mention を飛ばさせる、みたいな感じです。

takosan は Heroku ボタンに対応しているので、サクッと Heroku にアップして試してみたところ以下のようになりました。

![brfore.png](https://qiita-image-store.s3.amazonaws.com/0/208/1cc19945-2165-3d50-e2a8-d5d80c28638d.png)

ユーザ名やチャンネル名がリンクになっていません。
また、Recent Mentions にも表示されず、通知も行われませんでした。

これでは当初想定した使い方ができない、と思ってなんとかできないか調べてみました。

# 対処法: `link_names=1` を指定する

調べたところ、takosan の内部では Slack Web API の [chat.postMessage](https://api.slack.com/methods/chat.postMessage) というメソッドが使われていることがわかりました。
そして Arguments として `link_names=1` を指定することで解決できそうだったので、早速 takosan に[パッチ](https://github.com/kentaro/takosan/pull/3)をあてて試してみました。

`link_names` はドキュメント上以下のようになっています。

> Find and link channel names and usernames.

![after.png](https://qiita-image-store.s3.amazonaws.com/0/208/bb201397-f06b-6c48-08e5-76f8f6b63d00.png)

うまくリンクされるようになりました！
また、Recent Mentions への表示や、通知も意図した通りに行われるようになりました。

# おまけ: 通知の設定を見直そう

今回のような用途で takosan (またはその他の bot) を使う場合、通知の設定を以下のようにしておくことをお勧めします。

![setting.png](https://qiita-image-store.s3.amazonaws.com/0/208/2d24121e-9065-f278-c748-cc54bd0e0146.png)

詳しくは以前に私が書いた以下の記事にて。

* [Slack を入れたらまず行うべきだと思う設定](http://qiita.com/yuya_takeyama/items/8ddafb574162aa69604b)
[ffmpeg]複数の動画ファイルを連結する

ffmpegで短い時間の動画を連結してまとめる方法を紹介します。
ここでは、同じ機種で撮影した動画をまとめることを想定していますので、各々のファイルで形式が異なる場合はこの方法は使えません。

また、劣化防止と時間短縮のため、再エンコードをしない方法をとっていますが、記録状態などによってエラーが発生したり再生できないファイルになるかもしれません。

ここでは、撮影開始から一時停止までの1シーン(数秒～数分程度)毎に作成される短い動画をまとめて、ファイル単位で再生する時に扱いやすくすることを目的としています。1ファイルがGB単位になるような大きい動画を結合することは想定していませんので、この方法では上手くいかないかもしれません

## AVCHD形式のビデオカメラで記録したMTSファイルを連結する

ビデオカメラで録画/一時停止した場面で1ファイルとなるので、これらのファイルをまとめます。
<pre>
/usr/bin/ffmpeg -i "concat:00409.MTS|00410.MTS|00411.MTS|" -c copy -y "/srv/cache/converted/2015-03-02_080638/00411.MTS"
</pre>

ファイルのコピーを行うだけですので、短時間で完了します。

撮影時刻などのメタデータは失われるか、異常な内容になるかもしれません。

## ドライブレコーダで記録したMOVファイルを連結する

ドライブレコーダでは音声がpcmで記録されているため、aacに変換してからtsフォーマットに格納します

1. フォーマットを変更する
<pre>
ffmpeg -i FILE150215-122245.MOV -map 0 -bsf:v h264_mp4toannexb -c:v copy -c:a libfaac -ar 32000 -ac 2 -b:a 96k -strict experimental FILE150215-122245.ts
</pre>
※ h264_mp4toannexb はH.264のビットストリームをMPEG2 TSフォーマットに変更する際に必要なオプションです
https://www.ffmpeg.org/ffmpeg-bitstream-filters.html#h264_005fmp4toannexb

2. 複数のtsファイルをまとめる
<pre>
/usr/bin/ffmpeg -i "concat:FILE150215-122245.ts|FILE150215-122545.ts|...(いくつかのファイル)...|" -c copy "FILE150215-122545.ts" 
</pre>

## 参考
https://trac.ffmpeg.org/wiki/Concatenate
ボックス化とボックス解除

ボックス化は値型を参照型objectのメンバにして参照型として扱えるようにすること
ボックス化解除はボックス化で生まれた参照型objectのメンバのコピーを取り出すこと

値型を参照型で扱う必要がある場合にコンパイラによって行われる

どちらの処理も負荷が高いので避けた方がいいらしい
Ruboty で ruby を実行する

朝から BestGems を眺めていたら、自分が先週作った ruboty プラグインが （[`ruboty-` で絞り込んだ中で](http://bestgems.org/search?q=ruboty-)）下から3番目だったという事実を知ったので宣伝させてください...

# 作ったもの

* [mizoR/ruboty-tryruby](https://github.com/mizoR/ruboty-tryruby)
* [ruboty-tryruby | RubyGems.org | your community gem host](https://rubygems.org/gems/ruboty-tryruby)

# なにができるの?

ruboty が ruby のコードを評価できるようになります。
`ruby|rb|irb` のキーワードに続けて rubyのコードを渡すと、実行結果を返してくれます。

実行イメージは下記の感じです。

```irc
ryutaro [2:40 PM] ruboty: ruby (["hello world"] * 3).join(' * ')
ruboty  [2:41 PM] => "hello world * hello world * hello world"
ryutaro [2:41 PM] ruboty: ruby %w(boo foo hoge fuga piyo).sample
ruboty  [2:41 PM] => "hoge"
ryutaro [2:41 PM] ruboty: ruby (1..15).map {|i| Hash.new{|h,k| h[k] = (k<2) ? k : h[k-1] + h[k-2]}[i]}
ruboty  [2:41 PM] => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]
```

# どうやってやってるの?

[hubot-scripts/ruby.coffee at master · github/hubot-scripts](https://github.com/github/hubot-scripts/blob/master/src/scripts/ruby.coffee) と同様、[Try Ruby](http://tryruby.org/levels/1/challenges/0) の API を叩いているだけです。

なので、一部のメソッドが使えない・バージョンがコントロールできないなどの制限もありますが、チャットで実行する分には十分だと思いますし、安全に使えます。

# さいごに

ruboty を運用しているチームには Ruby が好きな人が多いと思いますので、少し幸せになれるのではないでしょうか。是非お試しください。

以上、宣伝でした。
Dynmap,クライアント側プレイヤー位置情報出力テスト【2】

#概要
[前回](http://qiita.com/atmn/items/dcf07b853da6045933b7)のつづき。
Dynmapを導入しているサーバーからjavascriptを用いてデータを取得する。
今回はJSONデータを直接読み込む。
便宜上dynmapのあるwebページを {dynmap} と表記する。また、取得先のワールド名を{world}と表記する。
このワールド名は{dynmap}/up/configurationで列挙されているものを使えばよい。

#手法
どこでもいいので以下のjsファイルを保存。

``` custom.js
var _dynmap = '{dynmap} ';
var _worldName = '{world}';

function test() {
	var me = this;
	me.init();
}
test.prototype = {
	lasttimestamp:0,
	init : function(){
		var me = this;
		me.update();
	},
	update : function(){
		var me = this;
		setTimeout( function(){ me.update(); } , 500 );
		$.getJSON( _dynmap + '/up/world/'  + _worldName + '/' + me.lasttimestamp,function(update){
			me.lasttimestamp=update.timestamp;
			console.log(update.timestamp);
			console.log(update);
			}
		);
		return;
	}
}


var a = new test();
```
これでコンソールに変更通知のJSONが送られてくる。

内容は

``` return.json
{
    "confighash": -82987328, 
    "currentcount": 2, 
    "hasStorm": false, 
    "isThundering": false, 
    "players": [
        {
            "account": "player1", 
            "armor": 8, 
            "health": 20, 
            "name": "player1", 
            "sort": 0, 
            "type": "player", 
            "world": "world", 
            "x": -1156.0, 
            "y": 20.0, 
            "z": 1526.0
        }, 
        {
            "account": "wanwan", 
            "armor": 2, 
            "health": 20, 
            "name": "wanwan", 
            "sort": 0, 
            "type": "player", 
            "world": "world", 
            "x": -708.0, 
            "y": 58.0, 
            "z": 400.0
        }
    ], 
    "servertime": 20112, 
    "timestamp": 1425229751386, 
    "updates": [
        {
            "name": "flat/0_-1/21_-1.png", 
            "timestamp": 1425229739013, 
            "type": "tile"
        }, 
        {
            "name": "t/-1_-1/-29_-4.png", 
            "timestamp": 1425229740117, 
            "type": "tile"
        }
    ]
}
```

のようになっている。
これで、取得時のtimestamp、timestamp時のプレイヤーデータ群、更新されたマップ群が取得できた。

#注意
・このコードが正しいかどうかはわかりません。

・これはdynmapのソースコードを私的使用のために改変したものです。
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」WorldViewについて

# WorldViewについて

enforceでゲームを作成する場合、画面のサイズは「**environ.coffee**」で設定したサイズになります。
このサイズの外には一切スプライトを描画出来ません（生成することは出来ますが表示されません）。
しかし、「**WorldView**」を使うことによって、より広いエリアを「**environ.coffee**」で設定したサイズの窓から覗いているような形にすることが出来ます。

例えば、「**environ.coffee**」で、「**480x800**」でスクリーンサイズを指定したゲームがあるとします。
この場合、デフォルトでWorldViewは「**(240, 400)**」となります。
そこで、ゲームの仮想エリアとして「**1080x1920**」と仮定すると下図のようになっていることになります。

![figure01.png](https://qiita-image-store.s3.amazonaws.com/0/53543/03c4ee84-c61e-8fbe-4900-26cc89fe76d7.png)

ゲーム全体のエリアの左上の濃いグレーの部分「**480x800**」が表示されている事になります。
WorldViewの機能は「**画面の中心を仮想エリアのどの座標にするか**」を指定します。
この場合、仮想エリアの「**1080x1920**」という領域についてはシステム側では保持しないので、ゲーム側で処理する必要があります。
しかしこのままでは画面外（480x800の外）にオブジェクトを生成しても画面に表示されることはありません。
ここで、オブジェクトを生成する時にオプション、

```coffeescript
    worldview: true
```
を指定すると、指定した座標は画面上の「**480x800**」に対する座標ではなく、WorldViewでの座標になります。
WorldViewが(240, 400)のままであれば座標値(100, 100)に生成したオブジェクトは、画面上の(100, 100)の位置に表示されます。
しかし、ここで「**setWorldView(290, 450)**」を実行すると、座標値(100, 100)に生成したオブジェクトは、画面上では(50, 50)の位置に表示されます。

![worldview_explain.png](https://qiita-image-store.s3.amazonaws.com/0/53543/0a74447d-98e7-901b-a4d8-1d55d3a05156.png)

「**setWorldView(cx, cy)**」は画面の中心に設定するWorldViewでの座標を指定します。
引数「**cx, cy**」は画面の中心を、仮想エリアのどこになるかを指定します。
さらに、表示したオブジェクトを動かさずにWorldViewの値を変更すると、オブジェクトの表示位置はWorldViewの値に応じて変化します。
ゲームなどで、WorldViewを自機のx座標、y座標にし固定すると、ラリーXやボスコニアンのようなゲームエリア全体を窓から覗いたようなゲームになります。



---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
lambdaの短縮表記

# はじめに
　Gaucheのような[lambdaの短縮表記](http://practical-scheme.net/gauche/man/gauche-refj_24.html)を実装をしようと思い,詰まったところをメモしておきます.またその際に[深町さんの記事](http://e-arrows.sakura.ne.jp/2010/09/using-clojure-like-lambda-on-common-lisp.html)を参考にしました.また深町さんの記事内にあるコードの多くを,コピペしました.ご了承ください.

# 経緯
　[m2ymさんのプレゼン資料](http://www.slideshare.net/m2ym/common-lisp-9838434)でCLでの**lambda**の長さ(また冗長さ)について書かれているのを見て,気になるようになりました.普段コードを書くときはEmacsを使っているので,入力するときはauto-completeの補完を使用することにより特に気になることはないのですが,後でコードを見直す際**lambda**が画面の多くを占めているのはやはり気になります(Emacsにはlambdaをλに変換して表示する[elisp](http://rubikitch.com/tag/emacs-lambda-%CE%BB-%E8%A1%A8%E7%A4%BA/)はあります).
　個人的には**lambda**という綴りが好きなので多くなっても問題はないですが,可読性は低くなるような気もします(関係ありませんがCLの**defun**という綴りも好きです).それで色々な記事を見るとGaucheでは**lambda**の短縮表記を用意していることを知り,CLで実装してみようと思いました.

# エラー
　単純に下のように実装すると上手くいきません.

```cl:error.lisp
(defmacro ^ ((&rest parameter) &body body)
  `(lambda ,parameter ,@body))

((^(x y) (+ x y)) 1 2)

;; Execution of a form compiled with errors.
;; Form:
;;   ((^ (X Y)
;;    (+ X Y))
;;  1 2)
;; Compile-time error:
;;   illegal function call
;;    [Condition of type SB-INT:COMPILED-PROGRAM-ERROR]
```

　このエラーを見ておそらくリードマクロを使って読み込み時にマクロ展開をする必要があるのではないか?と推測しました.ですがまともにリードマクロを書いたことがないかつ理解もできていないので,しばらくこの疑問を放置してしまっていました.その時に深町さんの記事を見て,実装方法を知りました.

# 実装
　リードマクロについて理解できていないので,ほぼコードをコピペするのみとなっています.また表面的にしか理解していないので誤ったコードの使い方をしている場合もあります.申し訳ありません.とりあえずコードを下に示します.

```cl:code.lisp
(let ((r (copy-readtable nil)))
  (defun read-symbol (stream)
    (let ((*readtable* r))
      (read-preserving-whitespace stream))))

(defun symbol-reader-macro-reader (stream char)
  (unread-char char stream)
  (let* ((s (read-symbol stream))
         (f (get s 'symbol-reader-macro)))
      (if f (funcall f stream s) s)))

(set-macro-character #\^ 'symbol-reader-macro-reader t)

(setf (get '^ 'symbol-reader-macro)
	  #'(lambda (stream symbol)
		  (declare (ignore stream symbol))
		  'cl:lambda))
```

　先程エラーが出たコードを実行してみます.

```cl:result.lisp
((^(x y) (+ x y)) 1 2)
;; => 3 (2 bits, #x3, #o3, #b11)
```

　上手く実行できてます.

# おわりに
　Lispは奥が深いです.最近は哲学の勉強ばかりしていて更新をさぼっていましたが,また少しずつ興味がある内容について書いていこうと思います.
　個人的な意見ですが哲学の勉強をすればするほど,何事にも無気力になっていくように感じました.今回勉強を再開しLispとプログラミングの楽しさを再確認し,やる気も出てきたと思います.なのでしばらくはLispとプログラミングの勉強に集中しモチベーションを高めていこうと思います.
Nimで標準入出力

##はじめに
[Nim(Nimrod)](http://nim-lang.org/)という言語の標準入出力の覚書。

##実行環境
- Nim version 0.10.3
- OSX Yosemite 10.10.2

##標準入出力
```nim
from strutils import split, parseInt
from math import sum

let
  inputStr = readLine(stdin)  # 一行入力(string)
  inputStrSeq = readLine(stdin).split(':')  # ':'でsplit(seq[string])
  inputIntSeq = readLine(stdin).split().map(parseInt)  # 空白でsplitしてintに変換(seq[int])

echo("inputStr : ", inputStr)  # 引数を連結して出力
echo("inputStrSeq : ", inputStrSeq)
echo("sum of inputIntSeq : ", sum(inputIntSeq))
```

##動作確認

```txt:sample.txt
hoge fuga
foo:bar:baz
1 1 2 3 5 8
```

```
$ cat sample.txt | nim c -r stdio.nim
inputStr : hoge fuga
inputStrSeq : @[foo, bar, baz]
sum of inputIntSeq : 20
```

##備考
- readLineやechoはビルトイン関数([Module system](http://nim-lang.org/system.html)のprocedure)
- [公式のチュートリアル](http://nim-lang.org/tut1.html)ではechoに渡す引数(intなど)を明示的に`$`でstringに変換しているが、勝手に処理されるので必要ない
- seq[type]とはSequence型(可変長配列)で`@[a1,…,an]`という様に表記できる

##参考
- [Nim Manual](http://nim-lang.org/manual.html)
- [Nim Tutorial (Part I)](http://nim-lang.org/tut1.html)
- [Module system](http://nim-lang.org/system.html)
nodebrewのインストールとnodeのセットアップ

# 概要
* nodebrewのインストール方法とnodeのセットアップ方法の備忘録です。

# nodebrewインストール方法
## ワンライナーのcurlインストール方法
```
$ curl -L git.io/nodebrew | perl - setup
```

## ダウンロードインストール
```
$ wget git.io/nodebrew
$ perl nodebrew setup
```

## PATHの追加
```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

## PATHの読み込み
```
$ source ~/.bashrc
```

## 確認
```
nodebrew help
```

# nodeの設定
## インストールバージョンを確認
```
nodebrew ls-remote
```

## nodeのインストール
バイナリーの方がすぐインストールが可能
```
nodebrew install-binary v0.12.0
```

## 使用するnodeの設定
```
nodebrew use v0.12.0
```

## 設定されているnodeの確認
```
nodebrew ls
```
BrowserSync 使い始めメモ（Windows7）

# BrowserSync 使い始めメモ

BrowserSync を Windows で使ってみるメモです。
公式ページ以上のことは書いていません。
http://www.browsersync.io/

## 前提

* Node.js と npm はインストール済みであること
* 静的ページで使う
* ルートに index.html があり、cssフォルダに各 css ファイルがある。
* Visual Studio が入っていること → http://www.visualstudio.com/
* Visual Studio 2013 Update 4. で Repair しておくとよりよい
→ http://www.microsoft.com/ja-jp/download/details.aspx?id=44921

## インストールして使ってみる

* ターミナルで `npm install -g browser-sync --msvs_version=2013`
* インストールされるのでしばしまつ
* ルートにしたいフォルダに移動
* `browser-sync start --server --files "css/*.css , *.html"`
* しばしまつと・・・勝手にブラウザが開く
* css/*.css を修正してみると・・・動く！動くよ！楽しい。

## 動かない、インストールできないなど、不具合があったら

上記は 2015/2/28 の情報です。
常に情報が変わるようなので下記で確認が必要。
http://www.browsersync.io/
http://www.browsersync.io/docs/