OmniAICreator/Qiita-1.07M huggingface dataset:
Unityをさわってみる会レポート

[第三回Unityをさわってみる会]
(http://twipla.jp/events/159258)
に参加してきました
※詳細は上記URLを参照してください


会の流れとしては・・・
- ぅぃにゃん、ROBAによるこのUnityがすごい
- Unityさわってみるアワー
といった内容をお酒片手にハンズオン形式で学ぶイベントです。

#Unityのここがすごい

##**ぅぃにゃんの語るUnityのすごさ**
###すぐできるのですごい！
　めんどくさいこと抜きですぐ作れる！

###アセットストアがすごい！　※アセット:Unityの素材
　アセットストアが充実してるので素材はたっぷりある！　　

　_アセットの一例_
　　- (TRPGで使ってるような)動くダイス
　　- できあがったゲーム

**Unityすごい**

###すぐ公開できる
PCゲームやスマホゲーム向けにすぐ公開
なんとスペランカーもunity

##**ROBAさんの語るUnityのすごさ**
**話題になったカスタムメイド3D2もunityでつくられている！**
**あんなHゲーやこんなHゲーも最近はunity！**
　
**oculus riftを使うとさらにすごい！！！**
　※[このUnityがエロいまとめ](http://togetter.com/li/848457) 参照

**Unityすごい**

#ここからはハンズオンの覚書

ハンズオンしながらメモした内容を羅列していますのでざっくりとしています。
(最後にある実際に作成したサンプルを見て補完してください・・・)

##hierarchy -> Assetsにドラッグするだけでプレハブ化(インスタンスを抽象化するイメージ）できる

"プレハブ化"という単語は初耳だったのですが、ぅぃにゃんさんが言ってた「インスタンスを抽象化するイメージです」というのでしっくりきたとともに**Unityすごい**と思いました

**Unityすごい**

##オブジェクト(Sphere)を跳ねさせる
Materialを追加してSphere ColliderのMaterialに追加
追加したMaterialのBouncinessを変更(Max 1)

##跳ねるオブジェクト(Sphere)に軌跡をつける
Assets->Add Compnent->Trail renderer

##軌跡を綺麗に
ShaderからParticles/Addtiveを選択し色を変える
軌跡をつけたいObjectのTrail RendererにあるMaterialsに追加

**Unityすごい**


##スクリプトで動作させてみる
メインカメラからAdd Componentを選びC#scriptを選択する。
(JavaScriptでもいいが、用意されてるメソッド数がC#の方が充実しているらしい)
先ほどのメインカメラのScriptに下記ファイルを追加して
Blockで対象となるオブジェクトを選ぶ

```NewScript.cs

using UnityEngine;
using System.Collections;

public class NewScript : MonoBehaviour {
	
	
	public GameObject block;
	// Use this for initialization
	void Start () 
	{
		
	}
	
	// Update is called once per frame
	void Update () 
	{
		if(Input.GetMouseButton(0))
		{
			GameObject instance = (GameObject)Instantiate(block); 
		}
	}
}
```
これによりクリックでオブジェクトが追加される

**Unityすごい**


##っていうかこんなコード書かなくてもゲームが作れる
プレイメーカーと言われるツールを使うことにより、フローチャートだけで(何もコード書かずに)動かせる

**Unityすごい**

##ブラウザで遊べるように
UnityのFileからBuild Settingを選択
Platformからweb playerを選択してswitch platformをクリック
あとはRunするだけ！

**Unityすごい**

##MMDを使うには？
MMD4Mechenimをインストールしてあげればいい


#感想
あまり勉強会というものに参加したことなかった自分なのでよくある勉強会との比較はできないのですが、お酒片手ということもあって和気藹々と楽しんでUnityのすごさを理解できた。

こういう勉強会としては少人数だったけど、1500円(ワンドリンク付き)でここまで楽しめたので大満足。(行く前はすごい緊張してた)

またここから少し踏み込んだイベントも計画されているようなので機会があれば積極的に参加していきたい。

このモチベーションを忘れず暇があればUnityを触るようにしよう・・・

#追記

青果物リンク貼り忘れてた
[作ったもの](http://snack-tsuru3.sakura.ne.jp/unity_game/ui_nyan.html)
※chromeでは再生できません

**Unityすごい**
armhfクロスコンパイル環境を作る

同じネタでブログを書いてからほぼ２年が経過しているので、手順とか微妙に変わっていた。

# 環境

- Mac OS X Yosemite(10.10.5)
- VirtualBox 4.3.30
- Vagrant 1.7.2

# 手順

1. 適当なboxを追加（今回はdebian-jessie)し、起動・ログイン　

```
https://github.com/holms/vagrant-jessie-box/releases/download/Jessie-v0.1/Debian-jessie-amd64-netboot.box
```

2. /etc/apt/sources.list.d/crosstools.listに以下を登録する

```
deb http://emdebian.org/tools/debian/ jessie main
```

3. archive keyをインストールする

```
$ curl http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | sudo apt-key add -
```

4. crossbuild-essential-armhfをインストールする

```
$ sudo dpkg --add-architecture armhf
$ sudo apt-get update
$ sudo apt-get install crossbuild-essential-armhf
```

5. 適当なソースをコンパイルしてみる

```
$ arm-linux-gnueabihf-gcc-4.9 hello.c
$ file a.out
a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=a80116c58215afc0ae1709c213d40e630b2914bb, not stripped
```

6.動かしてみる場合はqemuが必要

```
$ sudo apt-get install qemu-user-static
$ qemu-arm-static ./a.out
hello world
```

# 参考URL

https://wiki.debian.org/CrossToolchains#In_jessie_.28Debian_8.29
POH6+ 「え、妻が松江？」松江Ruby会議07協賛 回文作成プログラミングコンテスト

[六村リオ](http://qiita.com/rana_kualu/items/cbd237a865125b4cd9bf) / [霧島京子](http://qiita.com/rana_kualu/items/e6467151c88d69670fbb) / [緑川つばめ](http://qiita.com/rana_kualu/items/535144055c73f5694153) / [島根ルミ](http://qiita.com/rana_kualu/items/cc79813f9555e01330a2) / [島根ルミ149](http://qiita.com/items/0e9b48b4361ee567c7e6/) / [島根ルミ121](http://qiita.com/items/9de54445c2ed7c444d99/) / [共通解](http://qiita.com/items/04721cdd925166156aab/)


[回文を求める問題](https://paiza.jp/poh/joshibato/matsue-ruby/)。
Ruby会議とか華麗にスルーしてPHPでの回答です。

「すべての単語は同じ長さ」より、「abcd」「cb」「a」のような左右非対称区切りを考える必要は無い。
従って複雑な組み合わせを全て試したりする必要はなく、反転すると同じになる単語を探してペアにしていけばよい。

2単語をペアにできる条件は、
・単独で左右対称
・単独で左右対称ではなく、そのままでは等しくないが、50音順にすると等しい

さらに、
・単独で左右対称で、ペアになってないものは中央に入る

いまいち微妙にすっきりしない条件ですね。

```php
<?php
	// インプット
	$f = file('php://stdin', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
	// 1行目は不要
	unset($f[0]);
	
	// 初期化
	$list = [];
	$pair = [];
	
	foreach($f as $v){
		// ペアになれるなら$pairに持ってく、なれなければ$listに
		$v=($c=($v<=>$r=strrev($v))+1)===2?$r:$v;
		if($list[$v][2-$c]>0){
			$pair[$v]++;
			$list[$v][2-$c]--;
		}else{
			$list[$v][$c]++;
		}
	}
	
	// 前半
	ksort($pair);
	$str = '';
	foreach($pair as $k=>$v){
		$str .= str_repeat($k, $v);
	}
	
	// 中央の文字があれば
	$c = '';
	foreach($list as $k=>$v){
		if($v[1]){
			$c = $k;
			break;
		}
	}
	
	// 出力
	echo $str . $c . strrev($str);
```

さくっとできた。

`PHP Parse error:  syntax error, unexpected '>' in /workspace/Main.php`

あふん。

```php
<?php
	// インプット
	$f = file('php://stdin', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
	// 1行目は不要
	unset($f[0]);
	
	// 初期化
	$list = [];
	$pair = [];
	
	foreach($f as $v){
		
		// <=>を展開しただけ
		$r = strrev($v);
		if($v < $r){
			$c = 2;
		}elseif($v > $r){
			$v = $r;
			$c = 0;
		}else{
			$c = 1;
		}
		
		// ペアになれるなら$pairに持ってく、なれなければ$listに
		if($list[$v][2-$c]>0){
			$pair[$v]++;
			$list[$v][2-$c]--;
		}else{
			$list[$v][$c]++;
		}
	}
	
	// 前半
	ksort($pair);
	$str = '';
	foreach($pair as $k=>$v){
		$str .= str_repeat($k, $v);
	}
	
	// 中央の文字があれば
	$c = '';
	foreach($list as $k=>$v){
		if($v[1]){
			$c = $k;
			break;
		}
	}
	
	// 出力
	echo $str . $c . strrev($str);
```

https://paiza.jp/poh/joshibato/matsue-ruby/result/c6559412
100点、830byteでした。
バイト数が出てるってことはgolfれって意味だよなあ。

これで全問題100点になりました。
めでたし。

よく見たら$listをソートしてないので、
```
cdc
aba
```
みたいな入力が来たら間違うんだけど正解したからまあいいや。
unity > Panel上にlinerendererで線を描く実装

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

linerendererで線を描く実装は以前行った。
線の描画をPanel上にしたい。

### Hierarchy

実行時には以下の階層になるようにしている。

![Main_unity_-_150906-sineGraph_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/b3793789-66e9-6f32-3d55-4c2fac925d5f.jpeg)



### code

[v0.1 @ github](https://github.com/yasokada/unity-150906-sineGraph/releases/tag/v0.1)

drawの主な処理は以下の通り。

```csharp
	void drawBottomLeftToTopRight(){
		Vector2 pointPos;

		RectTransform panelRect = panel.GetComponent<RectTransform> ();
		float width = panelRect.rect.width;
		float height = panelRect.rect.height;
		
		RectTransform canvasRect = myCanvas.GetComponent<RectTransform> ();

		// Bottom Left
		pointPos = panel.transform.position;
		pointPos.x -= width * 0.5f * canvasRect.localScale.x;
		pointPos.y -= height * 0.5f * canvasRect.localScale.y;
		my2DPoint.Add (pointPos);

		// Top Right
		pointPos = panel.transform.position;
		pointPos.x += width * 0.5f * canvasRect.localScale.x;
		pointPos.y += height * 0.5f * canvasRect.localScale.y;
		my2DPoint.Add (pointPos);
		
		drawGraph ();
	}
```

### 結果

若干はみ出ている気がするが、Panel上に線が描けている。

![Main_unity_-_150906-sineGraph_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/ea8e8f69-3a00-10cb-f681-76a60954c766.jpeg)


### 苦労した点

linerendererは（おそらく)World座標での描画。
一方で、PanelはScreen座標なのだろう。

このあたりの座標変換を色々探して試したが、うまくいかなかった。

結局、各値をDebugプリントして、この組み合わせだろう(canvasのscaleに気づいた）というものを見つけて実装できた。

間違っているかもしれないが。



### v0.2
[v0.2 @ github](https://github.com/yasokada/unity-150906-sineGraph/releases/tag/v0.2)

とりあえずおなじみのsine, cosineグラフを描画してみた。

![Main_unity_-_150906-sineGraph_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/0996924a-e3c4-9bbe-61ae-6a67cb91ce4f.jpeg)

わざとPanelの上下位置をずらしているが、中身の描画は成功している。

線がつながっているのに気づいた。このあたりは今後の改善点である。


### v0.3
[v0.3 @ github](https://github.com/yasokada/unity-150906-sineGraph/releases/tag/v0.3)

一筆書き状態を解消した。

また、右側のcosineグラフをアニメーションに変更した。
Update()で描画更新している。

![Main_unity_-_150906-sineGraph_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/671f3d44-c188-8321-4042-3c0a6a0275b5.jpeg)

<hr>
(2015/09/07 追記)

Canvas.Scaleが2Dプロジェクトと3Dプロジェクトで異なるようだ。
上記の処理を3Dプロジェクトで実行しようとすると、Scaleが大きすぎるのでグラフがPanelサイズに収まらない。

http://qiita.com/7of9/items/b0fb5d809ac5cdb0a6d9

<hr>
(2015/09/07 追記)

新規プロジェクトで上記グラフ描画を実装する時は以下をしないとグラフが表示されません。

> Canvas > Canvas > Render Moderを Screen Space - Cameraにしてから、Render Cameraに Main Camera を関連付ける (下図)

![Main_unity_-_150907-2dproj_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/19cc6fac-0b75-15ea-d30a-1ff2199ab947.jpeg)


### v0.4

clearGraph()において、LineGroup(描画線)以外のchild[]も消してしまっていたのを修正した。

[v0.4 @ github](https://github.com/yasokada/unity-150906-sineGraph/releases/tag/v0.4)

### v0.5
Panel + graph のHideに対応
http://qiita.com/7of9/items/9c71d76270725b0f90cf
PositiveSSLで中間証明書の扱い

送信されてくるzipの中に複数の証明書が含まれているのだけれど、これらを結合して扱うらしい（ApacheだったりAWSだと中間証明書ファイルは一つ指定させられると思うので、複数をくっつけて一つにする感じ？）。ザックリですけどこんなかんじで。
間違ってたら何処からかツッコミが来てくれることを祈っていたり。

```:terminal
cat COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > PositiveSSL.ca-bundle
```

こちらを参考にしました。多謝。
https://www.devside.net/wamp-server/installing-comodo-positivessl-certificate-bundled-with-root-and-intermediate-ca-certificates-on-apache
CakePHP2の日付や時間のセレクトボックスにseparatorを指定する

![screenshot001.png](https://qiita-image-store.s3.amazonaws.com/0/72204/38c0315f-097e-149f-2a1f-1c69622816d9.png)
みたいな感じで表示したいとき（ボックス間の年月日のこと）

#やるべきこと
1. FormHelperの編集
2. Viewの実際に表示するとこにSeparatorオプションの指定


##FormHelperの編集

lib/Cake/View/Helper/FormHelper.phpの下らへん（僕の場合は2602行目）に

`$opt = implode($separator, $selects);`

ってのがある。
それをコメントアウトして、以下を挿入

		$opt = '';
		if (is_array($separator)) {
		    $i = 0;
		    foreach($selects as $select) {
		        $opt .= $select . $separator[$i];
		        $i++;
		    }
		} else {
		    $opt = implode($separator, $selects);
		}


##Viewの実際表示するとこにSeparatorオプションの指定
こんな感じ(見た目良くするために関係ないこと書いてるけど無視してください※bootstrap使ってます)

```
echo $this->Form->input('hogehoge',array('label'=>false,'placeholder'=>'取得日','dateFormat'=>'YMD','monthNames'=>false,'separator' => array(' 年 ', ' 月 ', ' 日 '),'class'=>'form-control','style'=>'width:70px'))
```

すると、こんな感じの表示になります

![screenshot001.png](https://qiita-image-store.s3.amazonaws.com/0/72204/4b129e9e-6117-0fc8-f527-29fc1e0a0b0e.png)
Heroku基本


###Procfile

 Heroku上で実行するコマンドの一覧。
 webに関するものは"web:"と記述
 
###Herokuに送信
 $ git push heroku master
 
  herokuに送信
 
###データベースを使えるようにするには
  $heroku addons:add heroku-postgresql
  
###Herokuで上でrake dbは
$heroku run rake db:migrate

###Herokuの情報は
$Heroku apps:info

###Heroku上のプロセス確認

$ heroku ps

###heroku上のログをみる。
$ heroku logs

$ heroku logs -tail

でリアルタイムのログ


###Heroku上の自分のサイトがメンテナンスモードになる。

$heroku maintenance:on

offにして、自分のアプリケーションを動かすときは

$heroku maintenance:off

###Heroku上のコンソールを使うには

$heroku run bash

###Heroku上でRails のコンソールを使うには

$heroku run rails c

###環境変数
.envファイル
はローカルでの環境変数をせってい
.gitignoreに入れておこう。

###ローカルでリモートの環境変数を使う

$forman start

Procfileを読み込んで port5000で起動。

ローカルのデプロイ。
linuxコマンドメモ（dig）

※記載内容はメモとして作成しているため、修正が必要な部分があるかもしれません。


####**digコマンド メモ**

指定したホストに対する情報をDNSサーバへ問い合わせを行い、結果を表示する。

**書式**
<pre>$　dig　[@DNSサーバ]　URL(host・FQDN) [クエリタイプ]</pre>



**サンプルコマンド**
<pre>$ dig docokanodareka.jp mx</pre>


**応答メッセージメモ**
HEADER　　　status:NOERROR　→　正常な応答
flags　　　　&nbsp;&nbsp;&nbsp;&nbsp;AUTHORITY:0,  ADDITTIONAL:0　→　権威サーバへ問い合わせしない
　　　　　　　&nbsp;ANSWER: 0　→　権威を持たない


AUTHORITY SECTION
権威を持たない場合の回答例）
docokanodareka.jp　　　86400　　　IN　　　NS　　　docokanons.jp.

権威を持つ場合の回答例）
docokanodareka.jp　　　86400　　　IN　　　MX　　　docokanoms.jp.
Circuit Breakerを使ってActorの遅延に対処する

### メッセージの遅延の伝播
Actor ModelのActorはmailboxに届けられたメッセージを自分のスレッドで一つずつ処理するので、何らかの障害が起こって処理の遅延が発生した時に処理の遅延が後続のメッセージの処理にも伝播します。

例えば、ある処理が平均50msの処理時間がかかるときに、メッセージの送り手(Producer)が50ms以上の間隔でメッセージを送り続けたりすると、レイテンシはどんどん大きくなってしまいます。このとき、producerが40msの間隔でメッセージを送り続けると、1秒後には250msの遅延が発生します。

### Circuit Breaker
Circuit Breakerはメッセージの送信側の方で想定よりも応答に時間がかかっている処理を失敗とみなして、メッセージの送信を遮断します。Back Pressureを行う場合にはメッセージの受け手で許容量を送り手に伝える仕組みが必要ですが、Circuit Breakerを使う場合にはメッセージの受け手の方でそうした制御をする必要はありません。
ただし、負荷を分散するためにスレッドの数やノードの数を調整したり、遮断したメッセージの回復処理を行う「場合には別途そのような仕組みを作りこむ必要があります。

#### Circuit Breakerの状態
Circuit Breakerは3つの状態を遷移し、メッセージの送信を制御します。

- Close  
  メッセージを送信可能な状態 
- Open  
 メッセージの送信を遮断している状態。Open時にメッセージを送信しようとするとCircuitBreakerOpenExceptionがスローされる。
- Half-Open  
 メッセージの送信を一時的に再開している状態。Half-Open状態のときにメッセージの送信に成功すると(所定時間内に処理が終わると)Close状態に戻る。失敗した場合はOpen状態になる。

### サンプルプログラム
一定時間ごとにProducerがメッセージを送り続け、Workerがそのメッセージを処理します。
Workerは単一ではProducerがメッセージを送り続ける頻度よりも処理能力が低いので、処理遅延が発生します。遅延が一定のしきいを超えるとスレッド数を増やして処理能力を増やすようにします。

Circuit Breakerは以下のように初期化します。

```
  // workerのrouter。
  private val worker = context.actorOf(Worker.routerProps, "worker")

　// workerの数を増減させるActor
  private val resizer = context.actorOf(PoolResizer.props(worker.path))

  
  val breaker = new CircuitBreaker(
    context.system.scheduler,
    maxFailures = 5, // この回数を超えた失敗があった場合にはOpen状態になる。
    callTimeout = 150.milliseconds, // 失敗とみなす処理時間のしきい値。レイテンシを150 milli sec以下に抑えたい
    resetTimeout = 50.milliseconds // Open状態になってからHalf-Openになるまでの時間。
    )(context.dispatcher)
    .onOpen({
      log.info("circuit breaker opened.")
      resizer ! PoolResizer.Up // workerの数を増やす
    })
    .onClose({
      log.info("circuit breaker closed.")
      resizer ! PoolResizer.Down // workerの数を減らす
    })
    .onHalfOpen(log.info("circuit breaker half-opened."))

```

Circuit Breakerから処理を呼び出すときは以下のようにask patternと組み合わせてメッセージを呼び出します。
Circuit Breakerによって遮断されたメッセージを回復する必要がある場合はFutureのエラーハンドラを使って回復処理を書きます。

```
  def receive = {
    case m: Worker.Work =>
      receiveCount += 1
      log.info("receive count=" + receiveCount)
      implicit val dispatcher = context.system.dispatchers.lookup("master-future-dispatcher")
      
      // Circuit Breakerを使ってメッセージを
      val future = breaker.withCircuitBreaker {
        val future = worker ? m
        pipe(future) to counter// 結果を数える。
        future
      }
      future.onFailure {
        case ce: CircuitBreakerOpenException =>
          producer ! Producer.Retry(m) // 失敗したメッセージをリカバリ処理に乗せる。
        case t: Throwable =>
          log.warning(t.toString())
      }
  }
```

動作するプログラムは[こちら](https://github.com/jkugiya/reactive-design-patterns/tree/master/src/main/scala/ch1p2/cb)においています。
サンプルのプログラムではworkerの数をリサイズする仕組みを自作していますが、Akkaの標準APIに[Resizer](http://doc.akka.io/docs/akka/snapshot/scala/routing.html#Dynamically_Resizable_Pool)というものが用意されており、workerを増減させるくらいの調整だったらこちらを使った方がよさそうです。
zsh から bash 用の補完スクリプトをつかって nvm の補完候補を出す

# 要約

nvm には bash 用の補完スクリプトしか用意されていないが zsh に **「bash 用の補完スクリプトを解釈するステキ機能」** が備わっているため、それを利用して zsh で nvm の補完候補を出すことができる。

`.zshrc` に

```sh:.zshrc
[[ -r $NVM_DIR/bash_completion ]] && . $NVM_DIR/bash_completion
```

と書いておけば zsh でも nvm の補完候補が出るようになる。

# 詳細

zsh から Node の version manager である [nvm](https://github.com/creationix/nvm) を使うときに補完候補を出せないかなと思って調べていたら [bash 用の補完スクリプト](https://github.com/creationix/nvm/blob/master/bash_completion#L84) が用意されていることがわかった。

zsh 用に移植しようかと思ってソースコードを読んでいると

```sh:bash_completion
# complete is a bash builtin, but recent versions of ZSH come with a function
# called bashcompinit that will create a complete in ZSH. If the user is in
# ZSH, load and run bashcompinit before calling the complete function.
if [[ -n ${ZSH_VERSION-} ]]; then
	autoload -U +X bashcompinit && bashcompinit
fi
```

という記述を発見。なんでも最近（数年前から）の zsh には bash 用の補完スクリプトを解釈する機能が備わっているらしい。

その機能を有効にするためには `autoload -U +X bashcompinit && bashcompinit` とすればよいらしく nvm の bash 用補完スクリプト `bash_completion` は、上で抜粋した部分で勝手にコレを呼んでくれている。

というわけで我々は bash と同じく `.zshrc` で

```sh:.zshrc
[[ -r $NVM_DIR/bash_completion ]] && . $NVM_DIR/bash_completion
```

とすればよい。素晴らしい。

`nvm alias default` と打って TAB を打ち込んだ時にバージョン一覧が表示されなかったりと、かゆいところに手が届かない感じもあるけれど、ないよりははるかにマシ。
iOS / OS Xのインターナショナライズとローカリゼーション

# はじめに
iOS / OS Xアプリケーション開発において、適切にインターナショナライズ（i18n）されたアプリケーションのローカライズ（l10n）を支援するツールがいくつか存在する。Appleが提供しているツールには、`genstrings`、`ibtool`、`AppleGlot`がある。（サードバーティ製も存在するがここでは割愛。）

# genstrings
* ソースコード（.c、または.m）から翻訳が必要な文字列を抽出し、`.strings`ファイルに出力する。
* `NSLocalizedString("key", comment)`、または`CFCopyLocalizedString("key", comment)`から適切な文字テーブルエントリを生成し、`Localizable.strings`に出力する。
* 出力ファイル名やバンドル変更する場合、`NSLocalizedStringFromTable()`、`CFCopyLocalizedStringFromTable()`、`NSLocalizedStringFromTableInBundle()`、`NSLocalizedStringWithDefaultValue()`を利用する。
* マクロなどで隠された`NSLocalizedString()`は文字テーブルエントリの対象に含まれない。
* 以下の例では、拡張子が`.m`のファイルから翻訳が必要な文字列を抽出し、`en.lproj`に`Localizable.strings`という名前で保存する。

    ```shell-session
    $ genstrings -o en.lproj *.m
    ```

* 多くのオプションがあり、かなり便利に使える。詳細は`man genstrings`を参照のこと。

# ibtool
* `genstrings`コマンドとは異なり、Interface Builderにより作成されたNIB / XIB / Storyboardファイルが対象となる。
* `ibtool`自体は`.strings`ファイルを出力するためだけのコマンドではない。（コンパイルから検証まで行う。）
* IBはローカライズ時に自動的に翻訳ファイル（`.strings`）を作成するが、その後でUIを変更した場合に翻訳ファイルを自動的に更新しない。このため、以下のコマンドで文字テーブルエントリファイルを作成し、`FileMerge.app`などを使ってマージを行う。（慣れると簡単。）

    ```shell-session
    $ ibtool --generate-strings-file path/to/Main.strings Main.storyboard
    ```

# [AppleGlot](https://developer.apple.com/jp/internationalization/)
* iOS / OS Xアプリケーション開発者向けのApple純正のローカリゼーションツール。
* ローカリゼーション用語集で、一般的な文字列の翻訳を行うことができる。
* 差分開発にも対応（リリースごとの差分のみを翻訳すればよい）。
* `appleglot`コマンドによる操作も可能。
* [AppleGlot およびローカリゼーション用語集](https://developer.apple.com/downloads/index.action?name=localization)よりダウンロードできる。
* AppleGlotの詳細については、AppleGlot DMGファイルの『Apple Glot 4 User's Guide 』を参照のこと。

# 追記
[mono0926](http://qiita.com/mono0926)様より、Xcode 6からXLIFFによる国際化フローがサポートされているとのご指摘がありました。

* [Xcode 6で導入されたXLIFFによる国際化フローの使いドコロ - Qiita](http://qiita.com/mono0926/items/ceda2500fe60e26e1c7c)

Appleリファレンスは以下の通りです。

* [Internationalization and Localization Guide: Localizing Your App](https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/LocalizingYourApp/LocalizingYourApp.html)
* [インターナショナライゼーションとローカリゼーションのガイド](https://developer.apple.com/jp/documentation/BPInternational.pdf)
dockerをビルド環境として使う

dockerコンテナにコンパイラなどを入れ、更にそのコンテナにビルド対象のソースコードをマウントすることで、docker自体をビルド環境として使うことができる。

例えばC#のビルドであれば、monoのコンテナ（monoは.NETのオープンソース実装。monoのmsbuildはxbuildになる）を使って、PATHの通ったところに以下の様なシェルスクリプトを置けば、ビルドコマンドに早変わりする。

```bash:/usr/local/bin/xbuild
#!/bin/sh
eval "$(docker-machine env default)"
docker run -it --rm -v `pwd`:/src --workdir=/src --entrypoint=xbuild mono $*
```

このスクリプトの前提は以下のとおり。

* ```docker-machine env default```が構築済みであること
* カレントディレクトリをdockerデーモンも参照できる状態にあること
   * WindowsとMacの場合、```docker-machine create -d virtualbox default```で作成すると、それが実現される。

ポイントは以下のとおり。

* カレントディレクトリをそのままマウントする。
* ```--workdir```で、カレントディレクトリを指定する。
* ```--entrypoint=xbuild```で、ビルドコマンドを指定しておく。
* 最後に```$*```を付けることで、このシェルスクリプトの引数を、そのまま```--entrypoint```で指定したビルドコマンドの引数にする。
* -it --rmを付けることで、実行後のコンテナはすぐに削除される。

すると、以下のようにビルドができる。

```
$ xbuild ./TargetSolution.sln
```

コンテナ内で使うと、一切他のツールの依存関係を気にせず使えるので、dockerは正義だなと思う。
そのうち、ビルド環境になるコンテナだけを集めたパッケージマネージャが登場するんじゃないかな。
関数の戻り値しだいで記述は簡単になる。

メンテナンスをしやすいようにリファクタリングする上で、関数の設計についての個人的な考えを述べます。

####**出力値は戻り値としてreturnで返す**
例：ポインタ渡しで値を返すのではなく戻り値として返す関数を使うと記述が簡単にできる。

```cpp:ex_cvFormat.cpp
#include <opencv2/opencv.hpp>
#include <stdio.h>
int main(int argc, char* argv[]){
	cv::Mat mat = cv::Mat::ones(cv::Size(100, 100), CV_8UC3);

	char a[] = "dir1";//単純化のため、既にdir1を作ってあるとします。
	char b[] = "file.png";
	char b2[] = "file2.png";

	char c[1024];
	sprintf(c, "%s\\%s", a, b);
	cv::imwrite(c, mat);

	cv::imwrite(cv::format("%s\\%s", a, b2), mat);
}
	
```
OpenCVを例にとり、画像をファイルに保存する例を書いてみた。
１つは、sprintf()を使って出力先のファイル名を作る例、
もう一つは、cv::format()関数を使って出力先のファイル名を作る例です。
cv::format()の使い方は次のページをご覧ください。
[OpenCV-CookBook その他の機能]
(http://opencv.jp/cookbook/opencv_utility.html)

値を返す関数を複数使って１行に書いても、使い慣れた関数である限りは
可読性を損なわず、シンプルに記述できる。


####**付記：**
　MATLAB, Octave, Pythonなどの処理系が使いやすい理由の一つは、関数の戻り値に豊富なデータ構造を取れる点です。
　a = func1(b);
と書いたときには、データの依存性は、bからaを生成していることに疑問の余地はありません。
しかし、C/C++系の言語で
func1(a,b);
と書いたときに、
・2つとも入力
・aが入力、bは出力
・aは出力、bが入力
・ａ，ｂともに出力の可能性があります。
しかも、悪いことには、入力として参照された後に、値を改変されて
出力値として返ってくる@param[in,out]の可能性があります。
これらが、使いなれない関数では、関数の理解性を損ねるのです。
r = veryLongFunc(a, b, c, d);
と書かれたソースで

```cpp:
/**
* @brief 長くてうんざりするような処理
*/
int veryLongFunc(char* a, char* b, char* c, char*d){
//とてもうんざりする長い記述
int c=someUnfamiliarFunc(a, b);
......
}
```
などとなったときに、
どの引数が入力で、どの変数が出力なのかを知る方法がないのです。

　a = func1(b);
のような簡潔性はなくなってしまいます。

ですから、主張したいのは、「ポインタ渡しで値を返すのではなく戻り値として返す関数を使う」ことです。そのことによってソースコードの可読性は向上します。
・std::vector<>
・std::string
・cv::Mat型
などは、関数の戻り値に使って良いのではないかと考えている範囲です。

####**付記：それでも、ポインタ渡し、参照渡しで値を戻したい人に**
・職場のコーディングスタイルのために、関数の戻り値に、上記の型が使えない場合、参照渡しを勧めます。
・const属性が可能な引数には、const属性をつけます。
　最近のVisual Studioは十分賢く、const属性が無理な引数につけてコンパイルとするとエラーを生じます。そうすると、その関数のcall treeのどこかでその引数の値が改変され戻ってくる可能性があることがわかります。
・Doxygen用のドキュメンテーションコメントに

```cpp:
/**
* @brief 長くてうんざりするような処理
*@param[in] a 説明
*@param[in] b 説明
*@param[out] c 説明
*@param[out] d 説明
*/
int veryLongFunc(const char* a, const char* b, char* c, char*d){
```

などと書くことも有用です。
UTF-8 width bom or UTF-8 without bom interconversion

UTF-8:  with BOM
UTF-8N: without BOM

Let's use nkf.
http://www.atmarkit.co.jp/ait/articles/1301/25/news092.html

Download to your local directory , set path to `nkfwin\vc2005\win32(98,Me,NT,2000,XP,Vista,7)Windows-31J`

Create sample file with note pad++ by using encoding UTF-8.
``

Open comand prompt,execute commmand
`nkf32.exe -w test.txt > test2.txt`
Nginx+pm2(fork)をやってみる。(CentOS7.1+express4)

先日の環境を元に、NodeJSアプリの負荷分散管理アプリケーションのpm2を入れて、Nginxから分散をしてみようと思います。

先日の環境に関しては以下のURLを。
[Windows10にVagrant入れて、CentOS7.1入れた話](http://qiita.com/fagai/items/05d5dbd41f19e21db939)
[CentOS7.1にNginx+NodeJS(nvm)環境の導入(Vagrant環境下)](http://qiita.com/fagai/items/f615c9e45c8c24743aae)

## 環境

一応現状の環境について書いておきます。

* Vagrant 1.7.4
* CentOS 7.1
* Nginx 1.8.0
* NodeJS 0.12.7
* Express 4

## pm2のインストール

```
$ npm install -g pm2
```

## 動かすための準備

この前のプロジェクトに移動して、process.jsonを作ります。

```
$ cd hoge
$ vi process.json
```

```json:process.json
{
  "name": "hoge-app",
  "script": "bin/www",
  "watch": "../",
  "exec_mode": "fork",
  "instances": 2,
  "env": {
    "NODE_DEBUG" : "http,net"
  }
}
```

今回、express4の雛形で作ったので、process.jsonの指定が少し面倒でした。
インスタンス数は0(CPU数に依存)でも良いのですが、今回はプロセス数を指定しておきます。

また、このままpm2をstartさせるとportが同じになってしまうので修正します。

```
$ vi bin/www
```

```
var port = normalizePort(process.env.PORT || '3000');
↓
var port = normalizePort((process.env.PORT || 6001) + parseInt(process.env.NODE_APP_INSTANCE || 0));
```

## 起動

これで、あとは起動しましょう。

```
$ pm2 start process.json
```

ポートが使われているか確認する。

```
$ netstat -anp | grep "node"
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp6       0      0 :::6001                 :::*                    LISTEN      21018/node /home/va
tcp6       0      0 :::6002                 :::*                    LISTEN      21019/node /home/va
...
```

問題なく起動していますね。良かった。

## nginxの設定を修正

では、nginxのnode.confを触ります。node.confは前回の記事で作ってます。

```
$ sudo vi /etc/nginx/conf.d/node.conf
```

```
upstream io_nodes {
-  ip_hash; # クライアントは同じサーバーに接されることを保証
+  # ip_hash; # クライアントは同じサーバーに接されることを保証
  server 127.0.0.1:6001;
+  server 127.0.0.1:6002;
}
```

あえてip_hashは消しておきます。(確認をしたいので)

nginxをリロード。

```
sudo nginx -s reload
```

あとはブラウザでリロードなりして、pm2のlogを追います。

```
$ pm2 logs
```

追ってみるとわかりますが、hoge-app-0とhoge-app-1にアクセスしていることがわかりますね。
これでロードバランサの機能が動いていることが確認できました！

## 最後に

実際に稼働させる際は、ip_hashのコメントアウトは外しておきましょう。

ではではー。
Windows版のDocker Toolboxをバージョンアップした後に仮想マシンが起動しない状況と原因について

# 概要

Windows版のDocker Toolboxを1.8.1bから1.8.1cへバージョンアップした後に、docker仮想マシンが起動しない状況と原因についてまとめました。

**環境**

* Windows7 (64bit)
* Docker Toolbox 1.8.1b
 * Git for Windows 1.9.5
 * VirtualBox 5.0.2

## 状況

Docker Tookbox 1.8.1cがリリースされていたので1.8.1bからバージョンアップを行いました。
バージョンアップの方法として、Git for Windows 1.9.5とVirtualBox 5.0.2はそのままにしてDocker ClientとDocker Machine、Kitematic(Alpha)のみを対象にしたのですが、バージョンアップが終わってDocker Quickstart Terminalアイコンをクリックしたところ、以下のメッセージが出て仮想マシンが立ち上がりませんでした。

```text
Either VirtualBox or Docker Machine are not installed. Please re-run the Toolbox Installer and try again.
エラー: 指定されたレジストリ キーまたは値が見つかりませんでした
```

このエラーは、Docker Toolboxのインストールディレクトリにある`start.sh`で出力されているもので、レジストリからVirtualboxのインストールディレクトリを取得する箇所で発生していました。(下記はstart.shの該当箇所を抜粋したものです)

```sh:start.sh
...省略...

VBOXMANAGE=/$(reg query HKEY_LOCAL_MACHINE\\SOFTWARE\\Oracle\\VirtualBox //v InstallDir | grep InstallDir | awk '{print substr($0, index($0,$3))}' | sed 's/\\/\//g' | sed 's/://')VBoxManage.exe

...省略...

if [ ! -f $DOCKER_MACHINE ] || [ ! -f "${VBOXMANAGE}" ]; then
  echo "Either VirtualBox or Docker Machine are not installed. Please re-run the Toolbox Installer and try again."
  exit 1
fi

...省略...
```

## 原因

端的にいうとGit for Windowsが32bit版、VirtualBoxが64bit版であったことが原因でした。
レジストリーは32bitと64bitで分かれているそうでVirtualBoxがレジストリーに見つからなかったのは32bitで実行されるstart.shが32bit用のレジストリーを参照するためのようです。

> [64 ビット バージョンの Windows でシステム レジストリを表示する方法] (https://support.microsoft.com/ja-jp/kb/305097)
>
> 64 ビット バージョンの Windows のレジストリは、32 ビット キーと 64 ビット キーに分かれています。32 ビット キーの多くには、対応する 64 ビット キーと同じ名前が付いています (逆の場合も同様です)。

## 対応

64bit版のGit for Windows 2.5.1をインストールして対応しました。
ちなみに、Docker Toolbox 1.8.1cより、同梱されるGit for Windowsのバージョンが2.5 (64bit)に変わっていました。

[toolbox releases] (https://github.com/docker/toolbox/releases)
Excel VBAでセルの値をコピーしてみた


最近、手順書などをExcelで作成することが多く、
いちいちセルの情報を選択してコピーするのがめんどうなのでVBAで作業効率化に挑戦！

ということで、
今回は `Copyメソッド` と `DataObject（クリップボード）` を使った場合の
２パターンで作ってみた。

----
## 0. 作業環境
今回、作業した環境は下記のとおり。
【OS】：OS X Yosemite（ver.10.10.4）
【Excel】：Office for Mac 2011
【テキストエディタ】：mi



## 1. コード
センスがないので酷いコード(*_*)

````コード①
' Copyメソッドを使用したコピー
Sub test01()

    Dim s As String
    
    With Range("A1")
        .Select
        .Copy
    End With
        
End Sub
````


````コード②
' DataObject（クリップボード）を使用したコピー
Sub test02()

    Dim s As String
    s = Range("A1").Value
    
    
    Dim mydo As New DataObject
    mydo.SetText s
    mydo.PutInClipboard
    
End Sub
````


今度は実際にいろいろなケースで動作検証させてみよう！
おわり。
AWSコマンド打ったら [Errno 2] No such file or directory

# もらったサーバでAWSコマンドを打ったらエラーになった

いろいろインストールとか面倒だったので、インストール済みのAMIをもらってサーバ構築をしたんですが、AWSコマンドを確認しようと
> aws ec2 describe-instances

って打ったら
> [Errno 2] No such file or directory

ってそっと出力されて処理が終了してしまった。

# 原因はなんだろう。。。

エラーを見ただけじゃ原因がイマイチ分からない。
とりあえずSecurity group、Network ACL、Route Table、IAM周りを確認（あ、、、IAM権限ついてない）

修正したけど状況変わらず。。。

もしや、AWS CLIが古い、、、のか？

## AWS CLIのバージョンをあげようとしてみた。
とりあえずpipを打ってみる。
```pip install awscli
```
結果、以下を連発
``InsecurePlatformWarning: A true SSLContext object is not available.
``
からの、以下。
```  Could not find a version that satisfies the requirement awscli (from versions: )
  No matching distribution found for awscli
```

んー、、、SSL系のエラーか？

## SSL周りがどうやらあやしい

いろいろ調べてみると認証局の証明書が古いかも。
ってことで、新しい証明書をとってこよう。
```wget http://curl.haxx.se/ca/cacert.pem
```

古い証明書を退避して置換え。
```cp -rp cacert.pem /etc/pki/tls/ca-bundle.crt
```

## 結果
うまくいきました。
どうやら認証局の証明書が古かった模様。
同じエラーの人がいたら参考にして下さい。
「tail -f」ワイルドカードで複数指定すると捗る！！

# 前置き

以前に、[開発時にログを見るならtailよりもless！！ - Qiita](http://qiita.com/yusabana/items/b5cc2a706be8c031043e) という記事を書いて、`less` はいいよということで紹介しましたが、、、
ワイルドカードが使える **tail** コマンドは、まだまだ捨てられませんでした。。w

# 

以下の様なログがあるとして。

* /var/log/nginx/hoge_access.log
* /var/log/nginx/fuga_access.log

tailコマンドでワイルドカード指定するといい感じでまとめてログをtailしてくれます。。。

**`tail -f /var/log/nginx/*_access.log`**

または以下のようにするとすべてのログを対象にも出来る
**`tail -f /var/log/nginx/*.log`**

ワイルドカードを使え場ということで、当たり前っちゃ当たり前ですが、
`rails` や `resque` など複数のログをまとめて出力しつつテストするときはだいぶ便利です。

具体的には以下の様な出力となります。

```出力結果(IP部分などは?でマスクしています)
==> hoge_access.log <==
127.0.0.1 - - [22/Jul/2015:05:44:07 +0000] "GET /index.php HTTP/1.1" 200 67794 "-" "curl/7.40.0" "-" "-"
127.0.0.1 - - [22/Jul/2015:05:44:08 +0000] "GET /index.php HTTP/1.1" 200 67794 "-" "curl/7.40.0" "-" "-"

==> fuga_access.log <==
127.0.0.1 - - [22/Jul/2015:05:44:15 +0000] "GET /index.php HTTP/1.1" 200 67777 "-" "curl/7.40.0" "-" "-"

==> hoge_access.log <==
??.??.??.?? - - [22/Jul/2015:05:44:21 +0000] "GET /healthcheck.html HTTP/1.1" 404 336 "-" "ELB-HealthChecker/1.0" "-" "-"
??.??.??.?? - - [22/Jul/2015:05:44:25 +0000] "GET /healthcheck.html HTTP/1.1" 404 336 "-" "ELB-HealthChecker/1.0" "-" "-"
```

`==> hoge_access.log <==`　の部分で各ログファイルの境目となっています。

`tail` はまだまだ捨てられないでした。。
iOS版Chromeでiframe deep linkingが禁止された件

# 何が変わったか？
iOS版のChrome(45.0.2454.68)から, `<iframe src="twitter://">`のようにiframeタグでカスタムURLスキームを指定することが出来なくなった。
[chromiumプロジェクト内の該当Issue](https://code.google.com/p/chromium/issues/detail?id=348640)

以前は, iframeタグにカスタムURLスキームを指定することで, そのURLスキームに対応しているアプリをインストールしているユーザのみアプリを起動し, その他のユーザはそのままウェブサイトを利用してもらう, という場合分けを行うことができた。

# 解決方法
## ブラウザを介さずにOSレベルで対応する
### iOS
iOS9以降は[Universal Links](https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12)を利用することで, 特定のURLを開く際にブラウザの代わりにアプリを開くことをOSレベルで登録することができる。
ただし、この方法はiOS8以前では使用できない。

### Android
[Intent filter](http://developer.android.com/guide/components/intents-filters.html)を使うことで, 特定のURLを開く際にブラウザに加えて, 自分のアプリを起動選択肢に加える事ができる。

## ブラウザ上でユーザの明示的なアクションを要求する
iframeタグからユーザの操作無しにカスタムURLスキームを叩く代わりに, 「アプリを起動する」のような明示的なアプリ起動リンクを埋め込み, ユーザがアプリ起動を選択できるようにする。
(iOS8以前ではこの対応がベスト？)

# 参考
* [Issue 348640: Ignore external protocol requests from frames without user action](https://code.google.com/p/chromium/issues/detail?id=348640)
* [Issue 528019: Regression of iframe deep linking](https://code.google.com/p/chromium/issues/detail?id=528019)
* [Support Universal Links](https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12)
* [Intents and Intent Filters](http://developer.android.com/guide/components/intents-filters.html)
[Elixir]Pipe演算子とパターンマッチを組み合わせる

#Goal
Pipe演算子とパターンマッチを組み合わせて、実行できる関数を制限する。

#Dev-Environment
OS: Windows8.1
Erlang: Eshell V6.4, OTP-Version 17.5
Elixir: v1.0.5

#Wait a minute
Pipe演算子と関数のマッチング機能を使ったTips。
マクロの記事と言うには微妙だが・・・微妙に使ってますからね。

と言っても、参考文献に記載している、記事内ソースコードのコピペですが。

#Index
Pipe operators and pattern match
|> Example code
|> Let's run!

##Example code
サンプルを作成します。

####Example

```ex
defmodule PipeSample do
  @status [
    # state: {action, next_state}
    running: {:run, :running},
    running: {:restart, :restart},
    running: {:stop, :stopped},
    restart: {:resume, :running}
  ]

  for {state, {action, next_state}} <- @status do
    def unquote(action)(unquote(state)), do: unquote(next_state)
  end

  def init, do: :running
end
```

####Description
特定の引数を受け取らないとマッチしない関数を展開しています。
そのため、パイプでつないでいる、前の関数を制限している形になります。

実行結果を見れば分かりやすいと思います。

##Let's run!
実行して結果を見てみます。

####Result:

```iex
iex> import PipeSample
nil
```

初期化の関数だけ呼ぶ。

```iex
iex> init
:running
```

初期化して停止させる。

```iex
iex> init |> stop
:stopped
```

不正な処理の流れ。

```iex
iex> init |> run |> resume
** (FunctionClauseError) no function clause matching in PipeSample.resume/1
    05_pipe_sample.ex:11: PipeSample.resume(:running)
```

色々組み合わせてみる。

```iex
iex> init |> run |> restart |> resume |> run |> stop
:stopped
```

#Speaking to oneself
これだけです。
まぁ、もしかしたらどこかで使えるかもしれないし、使えないかもしれない。

#Bibliography
[The Erlangelist - UNDERSTANDING ELIXIR MACROS, PART 1 - BASICS](http://www.theerlangelist.com/2014/06/understanding-elixir-macros-part-1.html)
JavaでBattleLineの対戦フレームワークを作ってみた

# BattleLineとは
2人対戦用のボードゲームです。
https://boardgamegeek.com/boardgame/760/battle-line
http://www.amazon.co.jp/GMT-%E3%83%90%E3%83%88%E3%83%AB%E3%83%A9%E3%82%A4%E3%83%B3/dp/B000VQOI10

アプリも出ていたりします。
https://itunes.apple.com/jp/app/reiner-knizias-battleline/id406165160?mt=8

# 経緯
実は少し前に作り始めたプログラムだったのですが、
放置していたGithubアカウントとQiitaアカウントを何とかしたいなということで今回アップロードしました。

# やったこと
* BattleLineというボードゲームをJavaに移植した
* GUIで操作できるようにした
* 通信対戦を実装した
* AIを簡単に実装できるようにした

# リポジトリ
https://github.com/oxsoft/battleline
とりあえず遊びたい人は、
https://github.com/oxsoft/battleline/releases

![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/92361/e90d0f9a-46bc-e8da-ec56-2410035cc370.png)

# AI開発方法
README.mdにも書いていますが、ここにも書いておきます。

AIはcom.oxsoft.battleline.ai以下で開発します．
AIはクラスを作り，AriticialIntelligenceを継承して実装して下さい．
com.oxsoft.battleline.ai以下にAriticialIntelligenceを継承したクラスを実装すると，自動的にプログラムがAIとして認識します．
AriticialIntelligenceの各関数は，現在のゲームの状態をGameStateContainer型として受け取り，GameStateInput型のインスタンスinputの関数を呼び出すことにより，ゲームをプレイします．
必ず何らかのinputの関数を実行し，成功(trueが返ってくる)しなければなりません．成功していない場合は，そのゲームは失格となります．

* action
 * カードを置く（input.putCard），パスをする（input.passTurn）などを行います．
 * パスはカードを置く場所がない，または手札が全て戦術カードの時のみ行うことができます．
* draw
 * 部隊カードを引く(input.drawTroop)，戦術カードを引く(input.drawTactics)，カードを引かずにターンを終了する（input.endTurnWithoutDraw）などを行います．
 * どちらの山札も無い時のみ，カードを引かずにターンを終了することができます．
* returnCard
 * 偵察を使い，カードを引いた時に，カードを山札に戻します（input.returnCards）．
* resolveFlags（オプショナル）
 * フラッグを取るこの関数が，actionの前後で呼ばれます．
 * 何も実装しないと，全てのフラッグについて，取ることができれば取ります．
* win（オプショナル）
 * ゲームに勝利したときに呼ばれます．（機械学習用）
* lose（オプショナル）
 * ゲームに敗北したときに呼ばれます．（機械学習用）

TheFool.javaがサンプルとなっていますのでぜひ一度ご覧ください．

# さいごに
誰か強いAIを開発してください。
Electron で Pushbullet OAuth & API

ElectronでPushBulletのOAuth認証を行います。

##参考ページ
- [Electron. oAuth authentication with GitHub](http://iamemmanouil.com/blog/electron-oauth-with-github/)
- [Pushbullet API](https://docs.pushbullet.com/#pushes)

##OAuth認証を行う
```
function getAccessToken() {
        const clientId = "YOUR_APPS_CLIENT_ID";

        // 認証ページを開くためのウィンドウ
        let BrowserWindow = require('remote').require('browser-window');
        let loginWindow = new BrowserWindow({
            width: 800,
            height: 600,
            'node-integration': false
        });

　　　　　// 認証後にリダイレクトするURL。ウィンドウは閉じるのでなんでもいい気がする
        // URLエンコードしないと無効なパラメータ扱いされた
        let redirect = "https%3A%2F%2Fwww.pushbullet.com%2Flogin-success";

　　　　　// 認証画面のURLを組み立てて、
        let url = `https://www.pushbullet.com/authorize?client_id=${clientId}&redirect_uri=${redirect}&response_type=token&scope=everything`;

　　　　　// 別ウィンドウで開く
        loginWindow.loadUrl(url);
        loginWindow.show();

　　　　　// 認証画面で認証が行われたら
        loginWindow.webContents.on('will-navigate', function(event, url) {
　　　　　　　// urlにaccesstokenが付随しているので取り出す
            var raw_code = /access_token=([^&]*)/.exec(url) || null,
                accessToken = (raw_code && raw_code.length > 1) ? raw_code[1] : null,
                error = /\?error=(.+)$/.exec(url);
            if (accessToken || error) {
                loginWindow.close();
            }
            window.localStorage.setItem('pb_token', accessToken);
            return accessToken;
        });
    }
```

## Pushbullet APIを使用する
Node.jsのPushbullet API moduleを使うと楽。
[node-pushbullet-api](https://github.com/alexwhitman/node-pushbullet-api)

```
    let accessToken = getAccessToken();
    let PushBullet  = require('pushbullet');
    let pusher      = new PushBullet(accessToken);

    // Push履歴を取得する場合
    pusher.history({}, (err,res) => {
        this.pushHistory = res.pushes;
    })
```

## 思ったこと
　　ClientSecret使わなかったけどええのん？
SwiftでMonoidにトライしてみた

元の資料は[市ヶ谷Geek★Night #3](http://ichigayageek.connpass.com/event/18810/)で発表されていた「ループで遊ぼう」です。  
Swift2.0でやりました。

----

# 前提
```Product``` ・ ```Item``` ・ ```Code``` の構造体かクラスを作る。 ```Product``` が ```name``` を持っていれば何でもいい

```swift
struct Product {
    let id: Int
    let name: String
}

struct Item {
}

struct Code {
}
```

```Product``` から ```Item```を、 ```String``` と ```Item``` から ```Code``` の配列を作る関数を用意しておく。これも作れさえすればなんでもいい

```swift
func ItemMake(product: Product) -> Item {
    return Item()
}
func CodesMake(name: String, item: Item) -> [Code] {
    return [Code()]
}
```

そして今回のお題に使うもとになる ```Product``` を適当に配列で用意して準備完了

```swift
let products = [
    Product(id: 0, name: "ぜろ"),
    Product(id: 1, name: "いち"),
    Product(id: 2, name: "に")
]
```

# 本題
## for文あり

きもい

```swift
var allItemsBuf = [Item]()
var allCodesBuf = [Code]()

for product in products {
    let item = ItemMake(product)
    allItemsBuf.append(item)
    allCodesBuf += CodesMake(product.name, item: item)
}

let allItems = allItemsBuf
let allCodes = allCodesBuf
```

## map

このくらいだったら標準のやつですぐにやれて良い。

```swift
let allItems = products.map(ItemMake)
let allCodes = products.flatMap{ p in
    CodesMake(p.name, item: ItemMake(p))
}
```

## Monoid
### Monoidの準備

```swift
struct Monoid<T> {
    let op: (T, T) -> T
    let zero: T
}

let sum = Monoid<Int>(op: +, zero: 0)
func concatMake<T>(type: T.Type) -> Monoid<Array<T>> {
    return Monoid<Array<T>>(op: +, zero: [])
}

func foldMap<T,U>(array: [T], mb: Monoid<U>)(f: T -> U) -> U {
    return array.reduce(mb.zero){ a, b in
        mb.op(a, f(b))
    }
}
```

```concat``` については ```sum``` と同様 ```let concat = ...``` みたいにやりたかったけど、そうすると ```Array<T>``` の ```T``` を指定できなくなったので誤魔化した。もう少し調べたらやり方出てくるのかな?

元のScalaの資料では ```foldMap``` の ```mb: Monoid<U>``` を ```implicit``` で省略させる話が出てるけどSwiftでのやり方がよくわからないのでナシ。 ```protocol Monoid``` 作れば ```mb``` がなくても ```zero``` や ```op``` を呼び出せるけどそうすると後で出てくるtuple版の書き方がよくわからなくなる…。

### Monoid(まだ無駄が残る版)

```swift
let allItems = foldMap(products, mb: concatMake(Item))(f: {p in [ItemMake(p)]})
let allCodes = foldMap(products, mb: concatMake(Code))(f: {p in CodesMake(p.name, item: ItemMake(p))})
```

### Monoid(tuple使用版)

```swift
func tuple2<T,U>(ma: Monoid<T>, mb: Monoid<U>) -> Monoid<(T,U)> {
    return Monoid<(T,U)>(
        op: {(x: (T,U), y: (T,U)) -> (T,U) in
            (ma.op(x.0, y.0), mb.op(x.1, y.1))
        },
        zero: (ma.zero, mb.zero)
    )
}

let (allItems, allCodes) = foldMap(products, mb: tuple2(concatMake(Item), mb: concatMake(Code)))(f: {p in
            let item = ItemMake(p)
            return ([item], CodesMake(p.name, item: item))
        }
    )
```

Swiftだとtupleが0はじまりでfoldLeftがreduceでもうよくわからない

----

以上です。  
```mb``` を省略する手段と ```Monoid<T>``` ・ ```Monoid<Array<T>>``` をどうにかしたかったです。難しいです。
[Sass(SCSS)]position:absolute;をレスポンシブに対応させるためのMixin


## 仕様と表示例

以下のような画像があったとします。

![サンプル画像](https://qiita-image-store.s3.amazonaws.com/0/62022/c3d7675a-4584-a28d-995e-3a1b9787385f.png)

背景の地図とピンの画像がそれぞれ別の画像で、レスポンシブルに対応させたい、つまり画面の幅が増減してもピンの位置は崩したくない、という場合に使えるMixinです。

![スマートフォンでの表示サンプル](https://qiita-image-store.s3.amazonaws.com/0/62022/99feb4fc-8422-09e1-5dc0-57914f860222.png)

Mixinを使うまでもなくmarginなどパーセント指定を使えば実現できます。
ただデザインデータからコーディングする際、上から何px、左から何pxとpx値で確認すると思います。
それを毎回%に計算し直すのが面倒だったので、いっそのことMixinにしてみました。

ピン画像にクリックイベントなどを施す場合でも、これならデバイスのウィンドウサイズを気にすることなく施すことができます。

## コード

### HTML
 
 ```html
 <div class="wrap">
	<p class="item-1"><img src="images/item-1.png" alt="ピン1"></p>
	<p class="item-2"><img src="images/item-2.png" alt="ピン2"></p>
	<p class="item-3"><img src="images/item-3.png" alt="ピン3"></p>

	<div class="background"><img src="images/map.png" alt="背景の地図"></div>
</div>
 ```
 
### Sass(SCSS)
 
 ```scss
 // Media Queriesのためのmixin
// 使い慣れているものでいいので、こちらを使う必要はありません。
@mixin media($media-type) {
	@if $media-type == mobile {
		@media only screen and (max-width: 768px) {
			@content;
		}
	}
}

// ベースとなる横幅
$bace-width:600;

// ベースとなる縦幅
$bace-height:215; 

// 縦÷横
$h-pers:$bace-height / $bace-width;

// position指定のためのmixin
@mixin pos($left,$top) {
	left : ($left / $bace-width) * 100%;
	top: 0;
	margin-top:($top / $bace-height) * 100% * $h-pers;
}

// 包括する要素
.wrap {
	position: relative;
	width:$bace-width + px;
	height:$bace-height + px;

	// モバイルサイズの設定
	@include media(mobile) {
		width:100%;
	}

	// position指定する要素の基本設定
    // z-indexは背景の地図画像より重なり順序を上にするために入れています
	p {
		position: absolute;
		z-index:2;
	}
}

// 位置を指定する要素
// ベースの縦横ピクセル数を基準にします。
// @include pos(左からのピクセル数,上からのピクセル数);
.item-1 {
	@include pos(130,65);
}

.item-2 {
	@include pos(250,130);
}

.item-3 {
	@include pos(465,90);
}

// 背景にしている画像
// .wrap(包括要素)の背景にしても良いのですが、heightを設定しないといけないのでレスポンシブルなページだと面倒です。
.background {
	position: absolute;
	top: 0;
	left: 0;
	z-index:1;
	width:100%;

	img {
		display: block;
		max-width:100%;
		height:auto;
	}
}
 ```
 
### アウトプットされたCSS
 
 ```css
 .wrap {
	position: relative;
	width: 600px;
	height: 215px;
}

@media only screen and (max-width: 768px) {
	.wrap {
		width: 100%;
	}
}

.wrap p {
	position: absolute;
	z-index: 2;
}

.item-1 {
	left: 21.66667%;
	top: 0;
	margin-top: 10.83333%;
}

.item-2 {
	left: 41.66667%;
	top: 0;
	margin-top: 21.66667%;
}

.item-3 {
	left: 77.5%;
	top: 0;
	margin-top: 15.0%;
}

.background {
	position: absolute;
	top: 0;
	left: 0;
	z-index: 1;
	width: 100%;
}

.background img {
	display: block;
	max-width: 100%;
	height: auto;
}
 ```
 
以上です。

position:absolute; といいつつ、上からの位置指定はmarginを使っています。すみません。
positionだと包括要素(div class="wrap")のheight値に対して上から何％の位置と指定しなければなりませんが、今回の例ですとheightを絶対値で指定できないので、margin-topを使いました。
margin-topならwidth値を基準に％値が設定できるので、width:100%;を指定しているモバイルサイズでも意図した位置に設定できます。
レスポンシブルな場合にはmarginの方が使いやすいかと思います。
WordpressプラグインのBroken Link Checkerで検知したリンク切れ記事を削除する

リンク切れチェックの[Broken Link Checker](https://ja.wordpress.org/plugins/broken-link-checker/)、リンク切れチェックした後に極端な例として削除しちゃっていいやって時のRubyスクリプト

```rb:
require 'mysql2'
require 'rubypress'

wp = Rubypress::Client.new(
  host: ENV['WP_HOST'],
  username: ENV['WP_USERNAME'],
  password: ENV['WP_PASSWORD'],
  path: ENV['WP_PATH'],
  retry_timeouts: true,
)

client = Mysql2::Client.new(
  host: ENV['WP_DB_HOST'],
  username: ENV['WP_DB_USERNAME'],
  password: ENV['WP_DB_PASSWORD'],
  database: ENV['WP_DB_DATABASE']
)

query = %q{
select instances.container_id from wp_blc_links AS links
LEFT JOIN wp_blc_instances AS instances
ON (links.link_id = instances.link_id)
where links.http_code='404'
}
results = client.query(query)
post_ids = results.map{|row| row.values }.flatten.uniq

puts "delete post_ids #{post_ids}"

p post_ids.map{|post_id| wp.deletePost(post_id: post_id) }
```

対象の記事idが取得出来ればあとは良い感じに編集とかしちゃえば良いのだと思う
ステータスバーがTableViewに被らないようにする方法 Storyboard編

## やること
1. Constrain to margins のチェックを外す
2. ステータスバー分の20　上部にマージンをとる

### 解決したい事象
StoryBoardのViewにtableViewを置くと
一番上のセルやセクションがステータスバーに被ってしまいます。
![iOS Simulator-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/91606/741fd9a8-034b-e103-d0f9-6a1de35e0cf1.jpeg)

### 解決方法
Autolayoutで上にステータスバー分20スペースを取ります。
画像右下の「Add 4 Constraints」を押し忘れないよう注意してください。
![スクリーンショット 2015-09-06 12.48.27.jpg](https://qiita-image-store.s3.amazonaws.com/0/91606/41849bc6-d740-56dc-f5d1-f0e01c6f6b9d.jpeg)

### 設定後の画面
ステータスバーの分下にさがるので、表示が被らなくなります。
![iOS Simulator-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/91606/c62b2e14-40d6-bbdf-5bda-aa11bb4f6595.jpeg)
俺のリストア手順 Mac, Win

手順を残しておくといざというときにリストアしやすい。

# リストア前作業

- リカバリメディアの作成

## バックアップ

自動でバックアップは取っているが、2重バックアップの意味も含めて、必要なファイルだけUSBメモリなどに待避しておく。

### ソフトウェアのデータ
- ブラウザのブックマーク保存
- Filezilla設定エクスポート
- Thunderbirdのプロファイル保存

### 開発系ファイルのバックアップ
- /Users/:username/Dev
- /Users/:username/Repos
- /Users/:username/.ssh


### その他一般的なファイルのバックアップ
- 書類
- 写真
- 音楽

# リストア後作業

## ソフトウェアのインストール
- Norton
- Chrome
  - AutoPagerize, Web Developer Tool, Restlet client, Validity, Wappalyzer, Similar Web, Google翻訳, Awesome Screenshot
- Google日本語入力
- Box sync
- FireFox
- Thunderbird
- LibreOffice
- Skype
- VSCode
- FileZilla
- MySQL Workbench
- VirtualBox
- Android studio
- SourceTree
- Spotify
- MPC-HC, VLC
- Slack
- Kindle
- Docker

### Macなら
- Xcode
- Command Line Developer Tools
- HomeBrew
  - mysql56, anyenv, rbenv, phpenv, composer, direnv
- Karabiner-Elements
    - Karabiner-Elementsの[設定](https://qiita.com/studio15/items/15881fcf55b6f08edd5f)

### サブスクリプション系

- Photoshop

## Macの場合いろいろ設定

### 環境設定

- TimeMachine
- Finderで拡張子を表示、ライブラリを表示、サイドバーにいろいろ表示
- ファイヤーウォールをオン
- 時計の日付表示
- 画面がロックされているときに以下のメッセージを表示の設定
- キーボードのFunctionキーを逆に切り替え。
- コンピュータ名の変更
- 電源アダプタならスリープしない
- ControlもCaps LockもControlに
- マウスを左手用に主副の入れ替え
- Night Shift
- トラックパッドのアプリケーションexposeを有効

### ソフトウェアの設定

- Adoobe CCの自動起動と自動アップデートは切る
thefuckのインストール方法

何かと便利です。[thefuck](https://github.com/nvbn/thefuck)。
ターミナルでコマンドを打ち間違えた時に「クソッ！」と言うだけで窓が怖がって正しい(であろう)コマンドを提示してくれるこのコマンドラインアプリ。最近外国人のゲーム実況を見てると結構な頻度で fuckin' とか言ってて面白いです。

なお、インストール後は、`.bashrc`や`.bash_profile`や`.zshrc`などに以下を追加してください。

```bash
alias fuck='eval "$(thefuck --alias)"'
```

#pipでインストールする場合#

```bash
sudo pip install thefuck
```

でインストールできます。この場合はroot権限が必要なため、パスワードを入力する必要があります。

#brewでインストールする場合#

```bash
brew update
brew install thefuck
```

でも出来ました。

#apt-getでインストールする場合#

```bash
sudo apt-get update
sudo apt-get install python-pip
sudo pip install psutil thefuck
```

でできます。

#実際の挙動#

![2.gif](https://qiita-image-store.s3.amazonaws.com/0/74946/c48c7a2d-b340-efce-eee3-124f33c76f7d.gif)
Mac・bashで動かしてます。

いい感じです。
RubyMineでDBを見る

## 設定
どいういうわけかデフォルトで用意されてたやつは
赤い波線が出てで設定をいじってもうまくつながらない。

そこで、
![Screen Shot 2015-09-06 at 11.39.25.png](https://qiita-image-store.s3.amazonaws.com/0/27895/c1801c60-e8c4-aa09-dada-bbca326d9b8d.png)

こんな感じで「＋」ボタンから`Data Source` > `PostgreSQL`から設定。

まだつながらない。

よく見ると設定の下のほうに、
ドライバーがないよみたいなメッセージが出てたので、クリックしたらドライバーが入ったようで、ついに見れました。

## 見方
マイグレーションで作ったテーブルは、
DB名.publicのとこにある。
（テーブルが多いので、検索でしぼれるとより見やすいのだが...）
【LINQ】複数キーワードでAND検索・OR検索をする方法

###検索窓に入力された複数のキーワードで、データテーブルを絞りこみたい。

```csharp:キーワードをスペース区切りごとに別けます
//SeihinKeywordにスペース区切りのキーワードが入っています。
if (SeihinKeyword != null) {
   SeihinKeyword = SeihinKeyword.Replace('　', ' ');
   SeihinKeywordList = SeihinKeyword.Split(' ');
}
```

###LINQを使ってテーブルからデータをとりあえず持ってきます

```csharp
DataconectDataContext Data = new DataconectDataContext();

var seihinData = from a in Data.Table
                 select a;
```

###AND検索

```csharp
//キーワードが一つ以上あったら
if (SeihinKeywordList.Count() > 0) {
   foreach (string Word in SeihinKeywordList) {
            seihinData = seihinData.Where(a => (a.SeihinName).Contains(Word));
   }
}
return seihinData; 
```
単純にキーワードの数だけWhereを使って絞り込みをしています。

###OR検索

```csharp
//キーワードが一つ以上あったら
if (SeihinKeywordList.Count() > 0) { 
    var Data = seihinData.Take(0);
    foreach (string Word in SeihinKeywordList) {
            Data = Data.Union(seihinData.Where(a =>(a.SeihinName).Contains(Word));
    }
    seihinData = Data;
}

return seihinData; 
```
AND検索と違って絞り込んだ結果を、さらに絞り込むことは出来ないので、
Dataという空の型にwhereで絞った値を次々にUnionさせていき、最後にseihinDataに結果を入れます。

うーん、もっと良い方法がある気もします。
arduinoでユニポーラ・ステップ・モーター

オークションで手に入れた、ユニポーラ・ステップ・モーターをarduino unoにつないで見ました。
##写真
![MVC-017S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/c6f56086-434b-c178-3e96-3b8c94258aa6.jpeg)

##回路図
![ui.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/bd96da17-76e4-faac-7b89-4bb67ae3f2d2.png)


##サンプルコード
```
#include <Stepper.h>

const int stepsPerRevolution = 200;
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
void setup() 
{
	myStepper.setSpeed(60);
}
void loop() 
{
	myStepper.step(stepsPerRevolution);
	delay(500);
	myStepper.step(-stepsPerRevolution);
	delay(500);
}

```