OmniAICreator/Qiita-1.07M huggingface dataset:
cocos2d-jsでRenderTextureでSpriteの数を減らす

##Spriteは少ないほうが良い
よくゲームエンジンのパフォーマンス比較でスプライトを増やしてFPSを計測していることからも分かるように、スプライトが増えればその分計算が増えるのでパフォーマンスは落ちる。つまり、古い端末でも十分滑らかに動くことを意図するならスプライト数は減らすに限る。特にWebブラウザ上で動くことを想定しているcocos2d-jsでは重要になる。

##cc.RenderTexture
例えばアクションゲームの背景がオブジェクトの組み合わせで表現されるとき、ステージごとに背景を替えたい場合、パフォーマンス的には予め合成された画像を持っておくのが有利だが、容量的には不利だ。
これを解決する一つの方法が、```RenderTexture```である。

> cc.RenderTexture()
cc.RenderTexture is a generic rendering target. To render things into it,
simply construct a render target, call begin on it, call visit on any cocos
scenes or objects to render them, and call end. For convenience, render texture
adds a sprite as it's display child with the results, so you can simply add
the render texture to your scene and treat it like any other CocosNode.
There are also functions for saving the render texture to disk in PNG or JPG format.

[cc.RenderTexture | JsDoc Reference](http://www.cocos2d-x.org/reference/html5-js/V3.7/symbols/cc.RenderTexture.html)

ざっくり言えばスプライトを組み合わせた大きな画像を内部的に作ってしまうようなもの。

##使い方

1. cc.RenderTextureをサイズ指定して作成
2. これからRenderTextureに焼き付ける事を```begin```で宣言する
3. 焼き付けたいSpriteを配置する
4. Spriteのメソッド```retain```を呼んで焼きこむSpriteであることを宣言する
4. Spriteのメソッド```visit```を呼んで焼き付ける
5. Spriteのメソッド```release```を呼んで解放する
6. 3から6を焼き付けたいSpriteの分だけ繰り返す
7. RenderTextureへの焼き付けが終わった事を```end```で宣言する

retainとかreleaseとかはC++版のcocos2dやってないとわかりづらいと思う。

```js
var rt = cc.RenderTexture.create(320,240);
rt.begin();
var sprite;
for(var i=0;i<10;i++){
	sprite = cc.Sprite.create('res/object-'+i+'.png');
	sprite.retain();
	sprite.setPosition(0,i*sprite.width);
	sprite.visit();
	sprite.release();
}
rt.end();
var rtSprite = cc.Sprite.createWithTexture(rt.sprite.texture); // 別にそのままrt使っても良いが
```
だいたいこんな感じになる。が、これだと上手く動かない時がある。というかモダンな環境では多分上手く動かない。スプライトが逆さまに移っているし、順序もおかしい筈。

##WebGLだと上下が逆さま
これは```ccConfig```で設定した```renderMode```が2、または0でWebGLが有効な場合に起こる。どうしてかというと、CANVASテクスチャはDOMと同じく左上が基点なのだが、WebGLでは上下反転しているからだ。だから、どちらにも対応しようとした場合は```renderMode```がCANVASなのかWebGLなのかで処理を分けなければならない。

##WebGL/Canvas両対応版

```js
var rt = cc.RenderTexture.create(320,240);
rt.begin();
var sprite;
for(var i=0;i<10;i++){
	sprite = cc.Sprite.create('res/object-'+i+'.png');
	sprite.retain();
	if (cc._renderType === cc._RENDER_TYPE_WEBGL) { // renderTypeで処理を分ける
		sprite.setScale(1,-1); // 上下反転
		sprite.setPosition(0,rt.height - i*sprite.width); // 上下逆から配置
	}else if(cc._renderType === cc._RENDER_TYPE_CANVAS){
		sprite.setPosition(0,i*sprite.width);
	}
	sprite.visit();
	sprite.release();
}
rt.end();
var rtSprite = cc.Sprite.createWithTexture(rt.sprite.texture); // 別にそのままrt使っても良いが
```
go-redis/redis のクライアントが PubSub で共用できることを確認した

RedisでPubSubをする場合に https://github.com/go-redis/redis を使ってみることにした。このライブラリのクライアントを、SubscribeとPublishで共用できるのかどうか、コードを読んで確認してみた。

結論だけ言えば、共用できる。

## Redisの制約

Redisのドキュメントによれば、Subscribeしているコネクションが発行してよいのは以下のコマンドに限られる。

- SUBSCRIBE
- PSUBSCRIBE
- UNSUBSCRIBE
- PUNSUBSCRIBE
- PING
- QUIT

See: http://redis.io/topics/pubsub

> A client subscribed to one or more channels should not issue commands, although it can subscribe and unsubscribe to and from other channels. The replies to subscription and unsubscription operations are sent in the form of messages, so that the client can just read a coherent stream of messages where the first element indicates the type of message. The commands that are allowed in the context of a subscribed client are SUBSCRIBE, PSUBSCRIBE, UNSUBSCRIBE, PUNSUBSCRIBE, PING and QUIT.

Subscribeでメッセージを待ち受けている時に、他のコマンドのレスポンスが受信されるとマズイことになるので、これは当然の仕様である。

## コードを読む

### 概要

このライブラリには`Client`というstructがあり、それを経由して各種のコマンドを送信する。`Client`は内部にコネクションプールがあり、そのプール内のコネクションが実際のネットワークの送受信を行っている。

### Subscribe

`Client#Subscribe`でSubscribeを開始する。Subscribeは`PubSub`オブジェクトを生成し、Subscribeでのメッセージ受信はこれを経由して行うことになる。

このとき、`PubSub`オブジェクトは`Client`のコネクションプールを共用するようにしているが、`stickyConnPool`というstructでラップしている。

```go
return &PubSub{
	baseClient: &baseClient{
		opt:      c.opt,
		connPool: newStickyConnPool(c.connPool, false),
	},
}
```

Subscribeを開始したコネクションがプールに戻され **ない** のであれば、`Client`で他のコマンドを発行できる。

### コネクションのGet

Subscribeのコマンドを送信する場合は、コネクションプールからコネクションを`Get`して行うことになる。`stickyConnPool`の`Get`は以下のようになっている。

```go
if p.cn != nil {
	cn = p.cn
	return
}

cn, isNew, err = p.pool.Get()
if err != nil {
	return
}
p.cn = cn
return
```

すでに利用開始しているコネクション`p.cn`がある場合は、それを返すようになっている。初回の呼び出しでは大もとのコネクションプールから`Get`し、それを`p.cn`に入れて覚えておくようにしている。

Subscribe、メッセージの受信、Pingなどの`PubSub`オブジェクト経由のコマンドは、上記のように、Subscribe開始時のコネクションを使い回すようになっている。

### Put

メッセージの受信待ちに以下のようなコードがある。

```go
cn, _, err := c.conn()
cmd := NewSliceCmd()
err = cmd.readReply(cn)
c.putConn(cn, err)
```

`c.conn()`でSubscribe中のコネクションが取得され、コネクションからデータが受信されるのを待っているというコードだが、受信後に`c.putConn()`でコネクションを戻すかのようにも見える。

`putConn`の内部ではコネクションプールの`Put`が呼び出される。`stickyConnPool`の`Put`は以下のようになっている。

```go
if p.cn != cn {
	panic("p.cn != cn")
}
return nil
```

というわけで、利用中のコネクションをプールに戻すことはせず、何もしていない(ライブラリのバグを検出するためのアサーションのためのチェックがあるだけ)。

### いつプールに戻すのか？

戻さない。Subscribeを開始したコネクションは、それが終了してもコネクションプールには戻らないようになっている。

メッセージ受信中にネットワークのエラーが発生した場合、ライブラリ内部では新しい接続を行ってSubscribeを再開する。また`PubSub#Close`でもコネクションを破棄して、プールには戻さないようになっていた。


## まとめ

Subscribeを開始したコネクションはプールに戻らない。`Client`はプールに他のコネクションを持っているので、同じ`Client`オブジェクトを使って、Publishやその他のコマンドを発行しても問題ない。
JSLinuxでslコマンドを動かす。

#JSLinuxって何？
JSLinuxとはJavaScriptで動くLinux、つまりブラウザ上で動くLinuxです。
JSLinuxはネタ的な存在であまり実用性はありませんが、割とよくできており、なんとgccが付属されています。
ただ、パッケージの管理は出来ないので入れたいプログラムは自前でソースコードを入手し、コンパイルする必要があります。

下はJSLinuxの画面です。
![image](https://qiita-image-store.s3.amazonaws.com/0/108558/9672603b-286d-7b9c-9544-bbaaddaeeba8.png)

#slコマンドって何？
slコマンドは、Unix系のOSでは有名なジョークプログラムの1つです。元々はlsコマンドの打ち間違いによる、間違ったコマンドの検索を阻止するためにダミープログラムを用意したとのことです。
けれどslコマンドを打つと、ターミナル上を蒸気機関車(SL)が横切るアニメーションが表示されます。

#JSLinux + slコマンド = ?
この2つを組み合わせて、なにかの役に立つかというと何も役には立ちません。けれど、意味が無いことに意味があると思います（多分）。

#JSLinux上でslコマンドのコンパイル
まず、http://bellard.org/jslinux/ に行き、ブラウザ上にJSLinuxを立ち上げます。
次に、slコマンド用のディレクトリを作成し、そこを作業ディレクトリにしましょう。

```
mkdir ~/sl
cd ~/sl
```

次に、slコマンドのソースコードを入手します。入手先は、豊田氏がGitHub上に公開している物になります。https://github.com/mtoyoda/sl 
ただ、JSLinuxは外部ネットワークに接続できないようなので、ソースコードをコピペします。

ソースコードのコピペは、JSLinuxのCLI画面の右側にあるテキストボックスにソースコードをペーストすることで、JSLinuxがテキストボックスのテキストデータを参照できるようになります。

JSLinux上でテキストボックスのテキストを保存するコマンドは次のようになります。

```
cat /dev/clipboard > sl.c
```

後は、同じ容量で必要なソースコードとMakefileを用意した後、コンパイルをします。

```
make sl
```

コンパイルに割と時間はかかるので、コーヒーでも淹れて気長に待ちましょう。

#slコマンドを実行
最後にslコマンドを実行します。

```
./sl
```

最初の実行時に時間はかかりますが、下のように表示されれば完了です。
![image](https://qiita-image-store.s3.amazonaws.com/0/108558/293ef5d3-d1a7-12b3-bb47-355a1a58e546.png)

#まとめ
JavaScriptで動くLinuxと聞いた時は、大したことは出来ないと思っていましたが、gccコマンドがあると気づいた時に、これはコンパイルすれば何でもできると思って、試してみました。
実行速度の問題上あまり早く走りませんが、どうしてもブラウザ上にslを走らせたい方はどうぞ試してみてください。
NASがアンマウントしたらDropboxをKillする

```shell-session:
#!/usr/bin/env zsh
MOUNT_CHECK=`df | grep /Volumes/Data$  | wc -l`
if [[ $MOUNT_CHECK -eq 0 ]]; then
  #statements
  killall Dropbox
  mkdir /Volumes/Data
  mount_afp afp://[User]:[Pass]@192.168.1.1/Data /Volumes/Data
  open -a dropbox.app
fi
```
Active Directory, Office365用Powershellコマンド チートシート


自分用メモ。よく使うオプションとセットで記録。随時更新。

# Active Directory
## ユーザー関連
### New-ADUser
```Command
New-ADUser -Name "Name" -Path "Path" -UserPrincipalName "Email" -EmailAddress "Email" -AccountPassword (ConvertTo-SecureString "Password" -AsPlainText -force) -DisplayName "Name" -Surname "SurName" -GivenName "GivenName" -Enabled $true -ChangePasswordAtLogon $false
```
こんなCsvを用意すると

```sample.csv
Name,Path,Email,Password,SurName,GivenName,SamAccountName
Taro Suzuki,"CN=Users,DC=corp,DC=sample,DC=com",taro.suzuki@example.com,P@ssw0rd,Suzuki,Taro,taro.suzuki
```
バッチ作成出来る

```
Import-Csv sample.csv | ForEach-Object {New-ADUser -Name $_.Name -Path $_.Path -UserPrincipalName $_.Email -EmailAddress $_.Email -AccountPassword (ConvertTo-SecureString $_.Password -AsPlainText -force) -DisplayName $_.Name -Surname $_.SurName -GivenName $_.GivenName -Enabled $true -ChangePasswordAtLogon $false}
```

### Get-ADUser
example.comの人を取得する

```
Get-ADUser -Filter {EmailAddress -like "*@example.com"}
```
全プロパティ取得

```
Get-ADUser -Filter {EmailAddress -like "*@example.com"} -Properties *
```

### Set-ADUser

```
Under editing...
```

### New-ADGroup

```
New-ADGroup -Name "Name" -GroupGategory Security -GroupScope Global -OtherAttributes @{Mail="test@example.com"}
```

### Get-ADGroup

```
Get-ADGroup "group_name" -Properties *
```

# Office365
## 使う前に
```
Connect-MsolService
```
## Set-MsolUser
ユーザーのロケーション設定 (sample.csvでバッチ処理)

```
Import-Csv sample.csv | ForEach-Object {Set-MsolUser -UserPrincipalName $_.Email -UsageLocation JP}
```
## Set-MsolUserLicense
ライセンスの付与

```
Import-Csv sample.csv | ForEach-Object {Set-MsolUserLicense -UserPrincipalName $_.Email -AddLicense "sample:SMB_BUSINESS_ESSENTIALS"}
```
## Set-MsolUserPassword
パスワードリセット

```
Import-Csv sample.csv | ForEach-Object {Set-MsolUserPassword -UserPrincipalName $_.Email -NewPassword xxxxx}
```


# その他 PowerShell系コマンド
2016-01-09 Vivado > Link > editionの比較

Vivadoにあるいくつかのeditionの比較

http://www.xilinx.com/products/design-tools/vivado/vivado-webpack.html

- Vivado HL Design Edition
- Vivado HL System Edition
- Vivado Lab Edition
- Vivado HL WebPACK (Device Limited)
- Free 30-day Evaluation

Zybo用に購入したものはDesign Editionとなっている。
http://akizukidenshi.com/catalog/g/gS-09426/
[SourceTree 1.6+]コミットメッセージ中の番号をBTS (Redmine, trac, ...) にリンクさせる

# 概要

参考：[SourceTreeのコミットログに書いてあるRedmineのチケット番号をクリックできるようにする - Qiita](http://qiita.com/tmy/items/db21981c6820ce08129d)

最近の SourceTree で上記の手順をそのままなぞると、
> ![URL の確認](https://qiita-image-store.s3.amazonaws.com/0/88949/2e146450-4ffe-9b80-bdf2-247750126a31.png)

このような警告が出る。無視しても動作しない。
どうやら SourceTree の仕様変更があったようである。置換先の表現が、 HTML を直接書く方式からただ単に URL を与える方式に変更されている。

# 前提
SourceTree 1.6 以降。手許では SourceTree 1.7.0.32509 で動作確認した。

BTS は URL 中にチケット番号が現れるものだったら何でもよい。当方は Redmine で確認した（参考： Redmine の URL フォーマットは `http://<ROOT>/issues/<TICKET#>` ）。

# 設定方法
1. 設定したいリポジトリを開く
2. 「リポジトリ」 > 「リポジトリ設定」 > 「詳細」タブ
3. 「コミットメッセージ中のリンク」の「追加」
4. 次のように設定。リンク先 URL は各自の環境に合わせて調整（ここでは Redmine を想定している）
   - 置換タイプ：その他
   - 正規表現： `#(\d+)`
   - リンク先URL： `http://redmine.hogefuga.com/issues/$1`


# 備考
正規表現が読める方には釈迦に説法だが、念のため。上記の表現では、次のように動作する。

- `#` で始まる、 1桁以上の数字に符合する
- その数字の部分だけを、 `http://redmine.hogefuga.com/issues/$1` の `$1` の位置にセットしてハイパーリンクにする

上記の通り、この設定はリポジトリごと存在する。「複数のリポジトリを一つの BTS と連携させている」ような場合でも都度設定が必要。
裏返せば、リポジトリごとに Redmine や trac を使い分けている場合でも問題なく使えるということである。
casperJSでFlickrから画像をスクレイピングする

サンプルとしてFlickrから
ネコという単語を入力してその検索結果の画像のスクリーンショットを保存するスクリプトです



```js:imageFlickr.js
//For CasperJS SOURCE
var casper = require('casper').create();

//casperを開始する
casper.start();

//Flickrを開く
casper.open("https://www.flickr.com/");

//検索するワード
var word = "ネコ";

//フォームにワードを入力する
casper.then(function(){
  this.fill("form",{text:word},true);
});

//スクリーンショットを撮影する
casper.viewport(1280,1024).then(function(){
  casper.captureSelector('imgcat.png',"#search-unified-content[role='main']");
});

//実行開始する
casper.run();

```

```こんな感じで実行.
casperjs imageFlickr.js
```

#でもこれじゃあ不便だよね？
コマンドライン引数を受け取れるようにした方が絶対いい！


```js:imageFlickr2.js
//For CasperJS SOURCE
var casper = require('casper').create();

//コマンドライン引数を受け取る
var word = casper.cli.args;

//casperを開始する
casper.start();

//google画像検索を開く
casper.open("https://www.flickr.com/");

//フォームにワードを入力する
casper.then(function(){
  this.fill("form",{text:word[0]},true);
});

//スクリーンショットを撮影する
casper.viewport(1280,1024).then(function(){
  casper.captureSelector('imgcat.png',"#search-unified-content[role='main']");
});

//実行開始する
casper.run();

```

```これで引数を受け取れるようになる.
var word = casper.cli.args;
```

```こんな感じで実行.
casperjs imageFlickr2.js ネコちゃん(第一引数)
```

#シェルでもできたほうがいいよね？

```imageFlickr.sh
#!bin/sh
casperjs googleimage.js $1
//画像を開く
open imgcat.png
```

```こんな感じで実行.
sh imageFlickr.sh ネコちゃん
```

![imgcat.png](https://qiita-image-store.s3.amazonaws.com/0/33329/c26a5f48-8341-47a7-b4ee-d36e3e6fc1eb.png)

#最後に簡単な説明として
**casperJSはphantomJSを操作する為のjavascriptです。**
**phantomJSは見えないブラウザだと思ってください。**

研究の画像収集の短縮になど使ってください。( ^ω^ )

Flickrから画像をダウンロードするのはすなおにAPIを使った方が早そうなので省きます。

大学のページをスクレイピングして解析したくて調べていたら、casperjsに出会いました。作業がは捗りそうです。
Unity5.3からUnit Tests Runnerが組み込みになった

# はじめに

　Unity5.3から以前はUnity Test Toolsの一部だった、Unit Tests RunnerがUnity組み込みになりました。

　この投稿では、関連情報の紹介と簡単な使い方を説明します。

　v1.5.7未満のUnity Test Toolsを使っていたUnityのプロジェクトを、Unity 5.3にアップグレードした場合、コンパイルエラーになります。Unity Test Toolsをv1.5.7かそれより新しいものに更新してください。

# Unity5.3以前

　Unity5.3以前は、Unity Technologies社が提供する[Unity Test Tools](https://www.assetstore.unity3d.com/jp/#!/content/13802)を利用すればユニットテストを行えました。このアセットの内部にはNUnitのDLLが含まれていました。ちなみにこのAssetはユニットテスト関連以外にもIntegration Test Runnerなども含まれています。

　bitbucketは[こちら](https://bitbucket.org/Unity-Technologies/unitytesttools/src/5b5482a50d16?at=stable)。

# Unity 5.3で変更

　Unity 5.3からUnit Test RunnerがUnity組み込みになりました。ユニットテストのみであれば、わざわざUnit Test Toolsをプロジェクト内にインポートする必要も無くなりました。

　またそれに伴いUnity Test Toolsのリリースノートを見ると、v1.5.7よりNUnitのDLLなど、Unit Testsに関わるものは無くなったようです。

　Unityの公式ドキュメント、「[Editor Test Runner](http://docs.unity3d.com/Manual/testing-editortestsrunner.html)」によると、内部で使っているNUnitのバージョンはv2.6.4のようですね。

　バッチモードでのテスト実行もできるようです。

　また以前と同様、Testクラスは`Editor`フォルダ以下に入れるようです。

# 簡単な使い方

## Testクラスの生成

 メニュー(Unityエディタ) Assets > Create > Editor Test C# Script

## MonoDevelop上ででテスト実行

 メニュー(MonoDevelop) Run > Run Unit Tests

## テストコードの編集

 [NUnit Quick Start](http://www.nunit.org/index.php?p=quickStart&r=2.6.4)をどうぞ

## Unityエディタ上でテスト実行

 Window > Editor Tests Runner でTestRunnerのウィンドウが表示されてRun Allボタンをクリック

# 以前Unity Test Toolsを使っていたプロジェクト

　Unity 5.3からUnit Test RunnerがUnity組み込みになり、UnityはNUnitを含むようになりました。

　また、v1.5.7未満のUnity Test ToolsはNUnitのDLLを含んでいました。

　かつてv1.5.7未満のUnity Test Toolsを使っていたUnityのプロジェクトを、Unity 5.3にアップグレードした場合、NUnitが重複しコンパイルエラーになります。Unity Test Toolsをv1.5.7かそれより新しいものに更新すればOKです。(一度Unity Test Toolsを全部消すのがおすすめ。)

　Unity 5.3とUnity Test Toolsでは、Unit Test Runnerのウィンドウの表示方法が異なる点に注意です。

# さいごに

　一ヶ月以上、私は気づかなかったこの機能。テラシュールブログさんの「[【Unity】Unity 5.3で個人的に気になった機能まとめ](http://tsubakit1.hateblo.jp/entry/2015/12/09/000000)」にはなかったですが、[Keigo Ando](http://www.slideshare.net/keigoando?utm_campaign=profiletracking&utm_medium=sssite&utm_source=ssslideview)さんの「[Unity5.3の機能まとめ](http://www.slideshare.net/keigoando/unity53#37)」というスライドや公式ブログ「[UNITY 5.3: 新機能とさらなるプラットフォーム](http://blogs.unity3d.com/jp/2015/12/08/unity-5-3-all-new-features-and-more-platforms/)」には記載がありましたね。

　この変更、自分は結構嬉しいです。サンプルプロジェクトやコードスニペットを試す際、わざわざUnity Test Toolsをインポートせずとも、気軽にNUnitを使えるようになったからです。

　JSON、IAP、マルチシーンエデティングなど、たくさんあるUnity 5.3の新機能、しっかり把握したいですね。

　[サンプルプロジェクト](https://github.com/RyotaMurohoshi/unity_snippets)
Swiftはじめたい...その３ 配列型


# 今日は配列型を試してみます。
+ やっぱりろくにドキュメントも見ないでググったネタをxcodeで試しながらすすめます。

# 配列型

## 配列型の使い方あれこれ

+ 最大最小が最初からあるの便利ですね。

```:swift
// 配列の定義
var arr = [1, 2, 3]
print(arr)

// 個別に設定
arr[0]=4
print(arr)

// 空配列にする
arr=[]
print(arr)

// 設定しなおし
arr=[10,9,8,7]
print(arr)

// 後ろに追加
arr.append(20)
print(arr)

// 前に追加
arr.insert(100, atIndex: 3)
print(arr)

// 配列の情報いろいろ
print(arr.count) // 件数
print(arr.startIndex) // 最初の呼び番号
print(arr.endIndex) // 最後の呼び番号
print(arr.first!) // 最初の要素
print(arr.last!) // 最後の要素
print(arr.maxElement()!) // 最大の要素 いいね！
print(arr.minElement()!) // 最小の要素 いいね！

// 配列の操作
print(arr.sort()) // ソート
print(arr.sort( { $0 > $1 } )) // ソートの中身指定
print(arr.sort( > )) // ソートの中身指定 簡単！
```

```shell:実行結果です
[1, 2, 3]
[4, 2, 3]
[]
[10, 9, 8, 7]
[10, 9, 8, 7, 20]
[10, 9, 8, 100, 7, 20]
6
0
6
10
20
100
7
[7, 8, 9, 10, 20, 100]
[100, 20, 10, 9, 8, 7]
[100, 20, 10, 9, 8, 7]
```

+ このレベルであれば素直に理解できますね。
+ ソートの中身がめんどいと興醒めしますが、perlの``sort {$b <=> $a } @arr``よりも簡単な``arr.sort( > )``ってのはいいですね。

## split と join や map に filter 、etc...  

+ 頻繁に使う配列の操作も試してみます。

### split

+ 文字列を分割します。

```swift:split
let dat = "abc bbb ccc"
let list = split(dat, { $0 == " " })
print(list)
```

+ あれ？エラーが出ちゃいました。

```shell
Playground execution failed:〜:error: missing argument for parameter 'isSeparator' in call
let list = split(dat, { $0 == " " })
```

+ これだと動きましたがめんどくさくないですか？？

```swift:split
let dat = "abc bbb ccc"
let list = dat.characters.split{ $0 == " " }.map{String($0)}
print(list) // ["abc", "bbb", "ccc"]
```

+ こっちのほうがフツーに使える感じ。

```swift:componentsSeparatedByString
let dat = "abc bbb ccc"
let list = dat.componentsSeparatedByString(" ")
print(list) // ["abc", "bbb", "ccc"]
```

### join

```swift:joinWithSeparator
let dat = "abc bbb ccc"
let list = dat.componentsSeparatedByString(" ")
print(list.joinWithSeparator("-->")) // abc-->bbb-->ccc
```

+ ま、そのままですね。

### map

```swift:map
let dat = "abc bbb ccc"
let list = dat.componentsSeparatedByString(" ")
print(list.map{ "<" + $0 + ">" }); // ["<abc>", "<bbb>", "<ccc>"]
```

+ これもヨユーですね！

### filter

+ filterってのもありました。perlのgrepと同じかな？

```swift:filter
var arr = [1, 2, 3 ,4 ,5]
print(arr.filter{ $0 > 2 }) // [3, 4, 5]
```

### reduce

+ はやりのmap reduceのreduceです。

```swift:reduce
var arr = [1, 2, 3, 4 ,5]
print(arr.reduce(0, combine: {( ret_val,inp_val) -> Int in ret_val + inp_val })) // 15
```

### split -> map -> filter -> reduce 

+ まとめてやってみます。

```swift:つなげられます
print(
    "-2 -1 0 1 2 3 4 5"			// 文字列を
        .componentsSeparatedByString(" ") //空白で配列に分割して（まだ文字列）
            .map{ Int($0)! } // 整数にそれぞれ変換して
                .filter{ $0 > 0 } // 正の値のみ抽出して [1 ,2 ,3 ,4 ,5]
                    .reduce(0, combine: {(r,i) -> Int in r + i }) // 合計を取ります。15
) 
```


## まとめ

+ 他の言語使ってる人でも素直に使えるんじゃないでしょうか。
+ splitがエラーになるのがよくわかりません。
+ 配列操作のクロージャでいろいろ省略してかけるのはいいですね。

# 今日はここまで

+ 配列と辞書型を一緒に試そうと思っていましたが、配列だけでお腹いっぱいなので今日はここまでにします。
+ 次回は辞書型を試したいと思います。
RedHat(CentOS) 7 で NetworkManager(nmtui) を使って IPアドレスを修正する方法

RedHat(CentOS) 7からIPアドレスはコマンドで設定する必要があります。

nmコマンドも良いのですが、UIがあるとちょこっと直すには便利なので、nmtuiを使ってみましょう。

# 1. 起動
```lang:shell
$ sudo nmtui
```

# 2. 編集開始
![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/15176/6b812655-ff2f-3823-1e2d-032a2f0abeb3.png)

# 3. 編集NIC選択
![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/15176/e34b325e-6693-cb54-51ab-e655b5646baf.png)

# 4. 編集画面
![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/15176/120b0a36-9f51-e36e-ce31-769436dd0e74.png)

# 5. 編集終了
![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/15176/301b830d-1fcd-e1cf-b27f-93876288c7ae.png)

# 6. 編集終了後
IPアドレスの変更を適用するには、networkを再起動します。

```lang:shell
$ service network restart
```

TUIのカーソルの動かし方は、TABキーもしくは、矢印キーで動きます。

CentOS7をインストール後、NetworkManager(nmtui)で固定IPをふる方法 - Qiita
http://qiita.com/kure/items/c12f01789c902012c230
gitへ新規コミット後、メインクラスがロードできなくなる

#目的
コミット後に発生するクラスパスエラーを解決する

#事象
spring-bootにて作成されたプロジェクトを、ローカルのgit上でソース管理するためにコミットした際、

```
エラー: メイン・クラスcom.example.Mvp_mitsumorigittestが見つからなかったかロードできませんでした
```
というエラーメッセージが表示される。

#環境
IDE STS
Java8
バージョン管理 git
spring-boot

#原因
![スクリーンショット 2016-01-09 13.02.10.png](https://qiita-image-store.s3.amazonaws.com/0/57455/869655e9-0f0f-b4e2-1aaf-54ee3d4af363.png)
gitリポジトリへコミットした際、
エクリプスのキャッシュが更新されず、元々のパスが維持されているため、
新しいファイルが参照されていない。

対策としては
このキャッシュを削除する。エクリプス再起動でキャッシュはクリアされる。

#手順

エクリプスを再起動する。
![スクリーンショット 2016-01-09 13.11.35.png](https://qiita-image-store.s3.amazonaws.com/0/57455/9dc4531b-1a95-abe0-5bdc-c5da40518fa2.png)

解消した。


#参考
Eclipseでライブラリへのパスが更新されないエラーの対策メモ
http://did2memo.net/2012/09/14/eclipse-workspace-path-cache-error/
cronでRVMのRubyが動かない時、まずやること

# 
普通に手でruby ナントカって叩いたら動くのにcrontabに書いて動かしたら「そんなgemねぇぞ」みたいなエラーが出てくる。
正確には「あれ？動いてないぞ？」と思ってmail見たらそういうエラーがごっそり溜まってる。

```
/usr/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- twitter (LoadError)
```
こういうエラー。

これは、自分で動かすときとcronにやってもらうときでは$PATHとかの環境が違って、なんかRVMのgemのパス？が通ってないことが原因らしい。

# 2秒で解決
ググるとcrontabに$PATHを追加するとか、それ用のシェルスクリプト書くとかいろいろ出てくるけど、そんなこともあろうかとRVMがそういうのやってくれるコマンドを作ってくれてる。ありがとう！！！

なので、とりあえず最初にこれを試してダメだったらいろいろ試すとよさそう。
`$ rvm cron setup`
これを打ち込むとrvmがcrontabにもろもろゴニョッと追加してくれて、次から動く。はず。

# 懸念事項
RVMが今使ってるrubyのバージョンでゴニョッと追加するだけっぽいので、スクリプトごとにバージョン変えたいとか、そういう器用なことはできない。がんばりましょう。

# 参考
- [osx - Gem not found in Ruby cron job in RVM env - Stack Overflow](http://stackoverflow.com/questions/20954298/gem-not-found-in-ruby-cron-job-in-rvm-env)
- [怒涛のめもめもリンク集 | rvmの環境でのRubyスクリプトのcron実行](http://mechsys.tec.u-ryukyu.ac.jp/~oshiro/SiteList/2015/04/23/2934)
Spring BootのSpring SecurityでBasic認証のID・パスワードを変更する

ちょっとだけハマったのでメモ。

Spring Bootでは以下の依存関係を追加するだけでSpring Securityを利用出来て、デフォルトでBasic認証がかかるようになる。

```pom.xml
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>
```

この時のデフォルトIDは「user」、パスワードは以下のようにSpring Boot起動時のコンソールにはかれているので、それをコピって利用すればOK。

```抜粋.
Using default security password: 2ea51f3a-36a6-473c-951d-6b73d9ee6b50
```

で、このIDとパスワードを変更する時は、application.ymlもしくはapplication.propertiesに以下のような設定を入れる(以下のnagaokaとしているところを任意のIDとパスワードに変更)。

```application.yml
security:
  user:
    name: nagaoka
    password: nagaoka
```

```application.properties
security.user.name=nagaoka
security.user.password=nagaoka
```

ちなみに、このように変更するとコンソールにはデフォルトパスワードは出力されなくなる。
ただし、以下のようにIDのみ変更を入れた場合はデフォルトパスワードが利用されるのでコンソールに出力される。

```application.yml
security:
  user:
    name: nagaoka
```

```application.properties
security.user.name=nagaoka
```

参考にしたサイト
http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-security
※公式サイト
プログラムいらず！vimで手動スクレイピング

Webページからちょっとデータ抜き出したいときありますよね。
1回だけしか行わず、わざわざプログラム組むほどでもないならVimでやるのがおすすめです。


# 例：はてぶのページからリンクを取得する

vimを開いて4コマンドでリンクを抜き出します。
しかもエディタ上なのでその後の加工や連続スクレイピングなどもスムーズに行えます。

```
# 最初の行以外はどのサイトでも共通的に使えるはず
:e http://b.hatena.ne.jp/ctop/it
:%s/></>\r</g | filetype indent on | setf xml | normal gg=G
:%v/<a/d
:%s/^.*href="\([^"]*\)"[^>]*.*$/\1/

# 完全URLにしたいなら
:%s/^\//http:\/\/b.hatena.ne.jp\//
```

↓結果
![vim2.gif](https://qiita-image-store.s3.amazonaws.com/0/40141/10e7a1ae-451d-137e-a16d-aa77137f8357.gif)


# 解説

## データ取得

```
# フォーマット
:e <url>

# 例:はてぶのページ取得
:e http://b.hatena.ne.jp/ctop/it
```

## HTML整形

```
:%s/></>\r</g | filetype indent on | setf xml | normal gg=G
```

## フィルタリング

```
# フォーマット：指定したパターンにマッチしない行を削除
:%v/<パターン>/d

# 例:aタグを含まない行を削除
:%v/<a/d
```

## データの整形

```
# フォーマット
:%s/<置換前パターン>/<置換後パターン>/gc

# 例：hrefの中身だけを抽出（それ以外の部分は削除）
:%s/^.*href="\([^"]*\)"[^>]*.*$/\1/gc

# 例２：相対URLを絶対URLに置換
:%s/^\//http:\/\/b.hatena.ne.jp\//
```

# おまけ

取得したURLを元にして再度スクレイピングしたいなら以下を実行

```
# ヤンク
yy
# ヤンクしたURLをペーストして新しいタブで開く
:tab new <url>

# あとは上の項目を繰り返し実施するだけ
```
El Capitanで Rails5 betaでRails app作ろうとしたら、gem eventmachineのインストールで怒られた件。。

# 各環境

- Mac El Capitan
- ruby version 2.2.3
- rails version 5.0.0.beta1

## やったこと

Rubyのバージョン指定
Gemfile生成・編集

```
$ echo 2.2.3 > .ruby-version
$ bundle init
$ vi Gemfile
```

```Gemfile
source "https://rubygems.org"

gem 'rails', '5.0.0.beta1', github: 'rails/rails'
```

### bundle install --path vendor/bundle

怒られる・・
ここのエラーメッセージコピーし忘れたんだけど、

[Ruby2.2.0にupdateしてbundle installしたらAn error occurred while installing eventmachine (1.0.3)とか言われた - Qiita](http://qiita.com/yuki3738/items/c6c81edcd25c56800f14)

で発生してたのと同じような状況だったので。。

```
$ bundle update
```

してみた。

```
Installing eventmachine 1.0.8 with native extensions
...
In file included from binder.cpp:20:
./project.h:116:10: fatal error: 'openssl/ssl.h' file not found
#include <openssl/ssl.h>
         ^
1 error generated.
make: *** [binder.o] Error 1

make failed, exit code 2
```

；；
何かさらにエラーが・・・

解決策：[ERROR: Failed to build gem native extension · Issue #643 · eventmachine/eventmachine](https://github.com/eventmachine/eventmachine/issues/643)

めっちゃテキトーにまとめると、

> El Capitan には OpenSSL headers がもう含まれていないので、brewでインストール＆リンクしてね。

とのこと。

```
$ brew install openssl
$ brew link openssl --force
```

してから、もう一度 ```bundle update``` したらOK.


試してみたかったのはコレ
[Rails 5: Action Cable demo - YouTube](https://www.youtube.com/watch?v=n0WUjGkDFS0)
シェルスクリプトで黒魔術もどき（その２）終了時の共通処理

# 以下の投稿、根本的な間違いがあったのであとで直します。（shと思ってたものが、実はbashだったとは、、）

# 目的
シェルスクリプトを書いていて終了処理を共通化したいことがあります。
オープンしたリソースを閉じたり、一時ファイルを削除したり、exitの前に一つずつ書くのは結構面倒です。そんなときにはtrapを使用しましょう。（小ネタですが、実用度は高いですね。）
## コード
```lang:trap_sample.sh
#!/bin/sh
end(){echo end !!;}
trap end exit
echo main !!
```
## 実行結果
```
[sample@hostname ~]$ ./trap_sample.sh
main !!
end !!
[sample@hostname ~]$
```
## 説明
trapを使用すれば各種シグナルが発生した場合に関数を呼び出すことが可能です。
この例ではexitシグナル発生時にend関数を呼び出す設定をしています。これを使用すれば長くなりがちな異常時処理を簡潔に書けるようになるのではないでしょうか。
ただし、一点注意が必要なのは各シグナルに対してのtrap設定は１個までしか持つことができないので、複雑な終了処理を実装するには工夫してやる必要があります。

# 応用
trapの応用例として、関数のスタックを表示する例を考えました。
シェルスクリプトが異常終了した場合に「どこで落ちたかわからない。」みたいなことがあると困るのでtrapとFUNCNAMEを組み合わせてスタックを表示します。

## コード
```lang:trace_on_exit.sh
#!/bin/sh
trace()
{
  local rc=$?
  echo -n [Stack Info] 1>&2
  echo ${FUNCNAME[@]}|awk 'BEGIN{OFS=" <-"}{$1="exit";print }' 1>&2
  exit $rc
}
trap trace exit

sub1(){ sub2;}
sub2(){ sub3;}
sub3(){ echo exit!!; exit 1;}
sub1
```
## 実行結果
```
[sample@hostname ~]$ ./trace_on_exit.sh
exit!!
[Stack Info]exit <-sub3 <-sub2 <-sub1 <-main
[sample@hostname ~]$
```
## 説明
FUNCNAMEは配列型の環境変数で、第一要素には現在実行中の関数名、第二要素にはそれを呼び出した関数名、第三要素には、、、、といった具合にスタック情報が入っています。
ここではtrap関数と組み合わせることで終了時にスタック情報を出力しています。

（BASH_SOURCE、BASH_LINENOを使用してソース名や実行行数まで出力できそうなのですが、trapの場合は特殊なのかうまくいかず、、。とりあえず関数名だけの出力で良しとします。）
CocosStudioで作ったSpriteやボタンを再帰的に取得する

##ビルトイン関数では子Nodeしか探せない
cocos2d-jsでゲームを作るとき、UIはCocosStduioで作るとカンタンだ。
しかしCocosStduioで配置した```Sprite```やボタンを操作したいなら、外からそれらを取得しなければならない。
例えば配置したボタンに対し、Advanced→method→clickで関数名を書いた所で、そのボタンに関数を実装するのは外からやらねばならない。
この時、ボタンを取得するには```getChildByTag```や```getChildByName```を使うのだが、名前から分かる通りこれらは子供しか探せない。
これだと、CocosStudioで複数の```node```や```layer```を組み合わせて```scene```を作って```ccs.load```で```scene```を読み込んだとき、目的のボタンを探しだすのが面倒くさい。
cocos2dの構造は```scene```を頂点とした木構造でDOMみたいなものなのだから、```querySelector```とまでは言わずともせめて```getElementById```的な物くらいはあってもいいのだが、どうやら見当たらないので実装しておくと便利だ。
##子Nodeだけでなく子孫Nodeまで探索するfindNodeByName
```js:findNodeByName.js
cc.Node.prototype.findNodeByName = function (name) {
    var result = this.getChildByName(name);
    if (!result) {
        var i, imax = this.childrenCount;
        for (i = 0; i < imax; i++) {
            var child = this.children[i];
            result = child.findNodeByName(name);
            if (result) {
                break;
            }
        }
    }
    return result;
}
```
```ts:findNodeByName.ts
(<cc.Node> cc.Node.prototype).findNodeByName = function(name):cc.Node{
    var result = this.getChildByName(name);
    if(!result){
        var i,imax=this.childrenCount;
        for(i=0;i<imax;i++){
            var child = this.children[i];
            result = child.findNodeByName(name);
            if(result){
                break;
            }
        }
    }
    return result;
}
```

CocosStudio上で```Sprite```やボタンを作成するとデフォルトで名前がつくが、これが一意でないと目当てのものとは違ったものが返ってくることがあるので注意。

##使用例
```js
var layerObj = ccs.load(res.json_layer);
var layer = layerObj.node;
var button_1 = layer.findNodeByName('Button1');
button_1.addClickEventListener(function(){
    // クリックした時の処理
});
```
Rubyの配列をSlim経由でJavascriptの配列にする方法


railsで使うテンプレートエンジンをerbからslimに移行しようと色々試していてはまったので。

Rubyの配列をhtmlタグとして出力せず、Javascriptに変数として渡してフロントでページを組み立てたいときなど。


## やりたいこと

この手のRuby配列を

``` ruby:hoge_controller.rb
	@test = ["大谷", "吉川", "メンドーサ"]
```

javascriptでこうなるように出したい

``` javascript:front.html
	var test = ["大谷", "吉川", "メンドーサ"];
```
	
	
## 失敗例1
まずは何も考えずにそのまま出してみる

```slim:front.html.slim
javascript:
	var test = #{@test}
```

結果

```javascipt:result
var test = [&quot;大谷&quot;, &quot;吉川&quot;, &quot;メンドーサ&quot;];
```

クォートがあれされたままなので当然jsでエラーが出る

## 失敗例2
eachを使って頑張ってみる

```slim.front.html.slim
javascript:
	var test = #{@test.each do |t| "'" + t + "'" end }
```

結果

```javascript:result
var test = [&quot;大谷&quot;, &quot;吉川&quot;, &quot;メンドーサ&quot;];
```

何も変わってない＼(^o^)／

## 成功例
結論から言うと、Ruby側で加工してから出してあげれば解決します。

``` ruby:hoge_controller.rb
	@test = ["大谷", "吉川", "メンドーサ"]
	@test_j = @test.to_json.html_safe
```

```slim:front.html.slim
javascript:
	var test = #{@test_j};
```

結果

```javascript:result
var test = ["大谷", "吉川", "メンドーサ"];
```

***できた！！***


そもそもJSを動的に生成するのってどうなのって話も出るかもしれませんが、
なんだかんだ結構やることがあるのでやり方が見つかってよかったです。
Railsは超初心者なんですが、Slimいいですねほんと。

## 追記
コメント欄でご指摘いただきました.

\#{}を#{{}}にするとエスケープされなくなるそうです。

こちらの方がずっと良いですね。


```
javascript:
    var test = #{{@test.to_json}};

```


## 参考リンク
[http://stackoverflow.com/questions/7561430/use-ruby-array-for-a-javascript-array-in-erb-escaping-quotes](http://stackoverflow.com/questions/7561430/use-ruby-array-for-a-javascript-array-in-erb-escaping-quotes)
現在のページを小窓で開くブックマークレット

小窓は，ブラウザで広告が勝手に開かれる時などに，タブ欄などが無くなってシンプルに表示されているアレです．
表示面積が広くなるのでKindle Cloudで本を読むとき、動画を見るときなど威力を発揮します．

※広さの比較でこのくらい
![小窓で開く_サイズ比較.png](https://qiita-image-store.s3.amazonaws.com/0/84845/1b003354-8c50-3a99-c962-778bb6befa3a.png)



## 使い方
①ブックマークのURLに以下のスクリプトを登録．

```js:bookmarklet
javascript:void(window.open(location.href,'','width=560,height=440'));
```

②小窓で開きたいページで上記ブックマークを実行．
上画像の右ウィンドウのように、ブックマークバーに入れておくと便利です．
Homebrewでインストールしまくったあいつらの正体を知りに行く

## 結論

```brew-list-v.sh
brew list | grep -v '^lib' | while read line; do
  echo -n ${line}$'\t'
  brew info $line | grep -P '^https?://' | head -n1
done | column -t -s $'\t' > brew-list.txt
```

```brew-list.txt
atk                        https://library.gnome.org/devel/atk/
autoconf                   https://www.gnu.org/software/autoconf
automake                   https://www.gnu.org/software/automake/
autotrace                  http://autotrace.sourceforge.net
awscli                     https://aws.amazon.com/cli/
:
```

そこそこ便利。

## 背景

[Homebrew](http://brew.sh/index_ja.html)は、OSX界じゃあデファクトスタンダードといった趣です。

ただ、最近 [zplug](http://qiita.com/b4b4r07/items/cd326cd31e01955b788b) でzsh上にplugin commandとして放り込んだほうが良いものも多々あるなァ、`brew`で何インストールしたっけな、と`brew list`したら絶望的な気持ちになりました。

<img width="450" alt="brew_list.png" src="https://qiita-image-store.s3.amazonaws.com/0/31053/1e470b2d-bbcd-18a7-4fb1-5dfe4133ccce.png">
あらあらまぁまぁ。

最初は「見覚えあるなァ、こいつ」と思ったものにアタリを付けて、検索して調べて・・・とやってましたが、正直__やってられません__。

`brew info [formula]` とすれば、各インストールの詳細も見れます。

が、
<img width="480" alt="brew_info.png" src="https://qiita-image-store.s3.amazonaws.com/0/31053/1dc5e60f-1a2a-c67c-76d9-d218d9b471d0.png">
詳細ったって・・・なァ・・・。

こういう時こそ軽めのシェル芸だな、と思ったので飛び出しましたるのが冒頭のシェルです。

[fzf](http://qiita.com/b4b4r07/items/9e1bbffb1be70b6ce033) なり、 [peco](https://github.com/peco/peco) なりと組み合わせてもいいかも。

```brew-list-openurl.sh
brew list | grep -v '^lib' | while read line; do
  echo -n ${line}$'\t'
  brew info $line | grep -P '^https?://' | head -n1
done |
  column -t -s $'\t' |
  fzf |
  awk '{print $2} |
  xargs -n1 --no-run-if-empty open
```

うーん、brewの整理、頑張ろ。

## 追記 2016-02-17

よくよく見たら、`brew`には`home`というサブコマンドがあったのですね

```brew-list-openurl.sh
brew list |
  fzf |
  xargs -n1 --no-run-if-empty brew home
```
git worktreeを使ってみる

`git worktree` を使うと、一つのローカルリポジトリで作業ツリーを複数同時に持てる。
このコマンドは Git 2.5.0 から導入されている。
[Git - git-worktree Documentation](https://git-scm.com/docs/git-worktree)

既存のブランチを新たな作業ツリーとしてチェックアウトしたい場合、

```sh
git worktree add 生成する作業ツリーのパス ブランチ名
```

とする。例えば、feat-a ブランチで作業中に develop ブランチをチェックアウトして同時に利用したい場合は以下のようにすればよい

```sh
% pwd
/Users/yoichi/testrepo
% git branch
  develop
* feat-a
  master
% git worktree add ~/testrepo_develop develop
Preparing /Users/yoichi/testrepo_develop (identifier testrepo_develop)
HEAD is now at b5fb78b commit in develop
% cd ~/testrepo_develop
% git branch
* develop
  feat-a
  master
```

引数で指定したパス ~/testrepo_develop に、もう一つの引数で指定した develop ブランチがチェックアウトされた。

worktree で作成した作業ツリーは通常の作業ツリーと同様に利用することができる。例えばそこで更に作業ツリーを作成することも可能である。

```sh
% pwd
/Users/yoichi/testrepo_develop
% git worktree add ~/testrepo_master master
Preparing /Users/yoichi/testrepo_master (identifier testrepo_master)
HEAD is now at fcd0b60 commit in master
```

`git worktree` で生成された作業ツリーには、.git/ ディレクトリの変わりに .git ファイルが存在し、チェックアウト元リポジトリ内のディレクトリのパスが記載されている。

```sh
% cat .git
gitdir: /Users/yoichi/testrepo/.git/worktrees/testrepo_master
```

そのディレクトリの内容は以下のようになっている。

```sh
% cd /Users/yoichi/testrepo/.git/worktrees/testrepo_master
% ls
COMMIT_EDITMSG  ORIG_HEAD       gitdir          logs/
HEAD            commondir       index
% cat commondir
../..
% cat gitdir
/Users/yoichi/testrepo_master/.git
% ls logs
HEAD
```

* commondir には通常のリポジトリへの相対パスが記載されている。
* gitdir は作業ツリー側の .git ファイルのパスが記載されている。
* logs/ には HEAD の reflog が記録されている。
 * ブランチの reflog は通常のリポジトリ側 (上の例だと ../../logs/refs/heads/ 以下) に記録されている。

`git worktree list` で作業ツリーの一覧を取れる (Git 2.7.0 で対応されたとのこと)

```sh
% git worktree list
/Users/yoichi/testrepo          b5fb78b [feat-a]
/Users/yoichi/testrepo_develop  5b74214 [develop]
/Users/yoichi/testrepo_master   fcd0b60 [hoge]
```

既に作業ツリーが存在しているブランチをチェックアウトしようとするとエラーになる

```sh
% pwd
/Users/yoichi/testrepo
% git checkout develop
fatal: 'develop' is already checked out at '/Users/yoichi/testrepo_develop'
```

同じブランチをチェックアウトしている作業ツリー上で `git checkout` で別のブランチをチェックアウトして同じブランチがチェックアウトされていない状態にするか、もしくは、作業ツリーを消した上で `git worktree prune` すると、そのブランチをチェックアウトできるようになる。後者をやってみる:

```sh
% pwd
/Users/yoichi/testrepo
% rm -rf ~/testrepo_develop
% git checkout develop
fatal: 'develop' is already checked out at '/Users/yoichi/testrepo_develop'
% git worktree prune
% git worktree list
/Users/yoichi/testrepo         b5fb78b [feat-a]
/Users/yoichi/testrepo_master  fcd0b60 [master]
% git checkout develop
Switched to branch 'develop'
```

## まとめ

`git worktree` を知るまでは複数のブランチのファイルを同時に参照したい場合に

1. ローカルでブランチ切り替えて、同時に参照したいファイルを個別にコピー
2. リモートから複数クローンしてくる
3. ローカルでクローン

とかしていたが、1. は事故の元だし 2.,3. はローカルに複数のリポジトリのコピーができてややこしかった。
`git worktree` を知ったのでこれからは使ってみようと思っているが、要らなくなった時に `rm -rf` するところで間違ってローカルリポジトリ本体を消しちゃうと怖いなと思ってる。

(追記) 要らなくなったワークツリーに対して `git worktree remove ワークツリーのパス` でワークツリーのファイル削除と、ローカルリポジトリ上の管理情報の削除を一緒にやれる。ワークツリーじゃないパスを指定すると弾いてくれるし、こちらを使ったほうが事故りにくいですね。
Mac OS X El Capitanで3本指ドラッグを使う

<p>どうも、ちゃちゃまる(<a href="http://twitter.com/chachmaru">@chachmaru</a>)です。</p>

<p>Mac OS X　El Capitanから何故かデフォルトで3本指ドラッグができなくなりましたよね。なんでだろう。</p>

<h2>3本指ドラッグとは</h2>

<p>僕がMacが好きな理由の一つは、Trackpadがめちゃくちゃ使えるから。結構効率的だったりします。</p>

<p>今回の3本指ドラッグは、名前のとおり指3本でTrackpadを操作するとドラッグ機能が利用できる機能です。Trackpadを力入れてクリックしたくない人も多いと思うので（僕もその一人です）かなり使えます。</p>

<h2>設定できる</h2>

<p><code>System Preference &gt; Accessibility &gt; Mouse &amp; Trackpad &gt; Trackpad Options &gt; Enable Dragging &gt; three finger drag</code></p>

<p>で設定できます。</p>

<figure><img src="https://www.evernote.com/l/AkXzUQTDXVFEMpPGAe8H_1GpTO-l80b664wB/image.png"/></figure>

<figure><img src="https://www.evernote.com/l/AkVu0y1qUfFH4pGd-hTb7zlmag0Ki7jicvYB/image.png"/></figure>

<figure><img src="https://www.evernote.com/l/AkUFsbwXIMRD56mWzabOUtOc_uSpinaXQH4B/image.png"/></figure>

<p>ではまた。</p>
scikit-learnの決定木/ランダムフォレストのルールからPythonコードを生成

## はじめに
Pythonで機械学習といえばscikit-learnですが、scikit-learnを使うにはnumpyやscipyといった大きめのライブラリを入れる必要があります。でも、プログラムでほんのちょこっとだけ機械学習のモデルを使って分類したいって場合だと、わざわざそういう重いもの入れたくないなーと思うときがあります。scikit-learnで学習したものをnumpy, scipy, scikit-learnなしに使って分類処理ができたらなーって。

そこで今回はscikit-learnの決定木 (DecisionTreeClassifier) やRandom forest (RandomForestClassifier) からif-then形式のコードを生成するものを紹介します。

## コード
- https://github.com/ikegami-yukino/misc/blob/master/machinelearning/dt2code.py

特徴量のデータを入れるとクラス番号を返す関数のコードを作ります。
このコードでは各分岐点ごとにサンプル数が付記されているので、どこが重要かわかるようになってます。
ちなみにこれは[stackoverflowにあったコード](http://stackoverflow.com/questions/20224526/how-to-extract-the-decision-rules-from-scikit-learn-decision-tree)を参考に書きました。

irisのデータを学習した決定木からはこんな感じのコードが生成されます。

```py
def f(sepal_length=0, sepal_width=0, petal_length=0, petal_width=0):
    """
    0 -> setosa
    1 -> versicolor
    2 -> virginica
    """
    if petal_width <= 0.800000011921:  # samples=150
        return 0  # samples=50
    else:
        if petal_width <= 1.75:  # samples=100
            if petal_length <= 4.94999980927:  # samples=54
                if petal_width <= 1.65000009537:  # samples=48
                    return 1  # samples=47
                else:
                    return 2  # samples=1
            else:
                if petal_width <= 1.54999995232:  # samples=6
                    return 2  # samples=3
                else:
                    if petal_length <= 5.44999980927:  # samples=3
                        return 1  # samples=2
                    else:
                        return 2  # samples=1
        else:
            if petal_length <= 4.85000038147:  # samples=46
                if sepal_length <= 5.94999980927:  # samples=3
                    return 1  # samples=1
                else:
                    return 2  # samples=2
            else:
                return 2  # samples=43
```

### 参考用ノートブック
- [決定木の場合](https://gist.github.com/ikegami-yukino/02d171304e01d8039470)
- [ランダムフォレストの場合](https://gist.github.com/ikegami-yukino/01fc6121a46e390b4e1b)

ランダムフォレストの場合は、複数の木からコード生成したり多数決処理を書いたりする必要があるので、ちょっと手間がかかります。

## おわりに
scikit-learnの決定木やランダムフォレストのルールから分類用Pythonコードを生成するものを紹介しました。これによっていちいちscikit-learnなどのライブラリからモデルを読み込まずに直接分類処理ができるようになります。そのため、numpy, scipy, scikit-learnのインストールが不要になります。また、普通のPythonコードなのでちょこっとルールをいじりたいというときに変更が容易なのもメリットかと思います。

ただし、コード生成に限った話ではありませんが、特徴量が多い場合だと決定木の中身を出力をすると大変複雑なことになりがちなので使い方には気を付けましょう。
技術英語 > 時系列グラフ > Time series graph

自分がよく扱う「時系列グラフ」の英語は何か調べた。
googleにて「時系列グラフ」「英語」で検索。

> Time series graph

関数名のプリフィックスで今のところTimeGraphを使っている。TimeSeriesGraphにすると正確というのが分かったが、関数名が長くなるので当面TimeGraphのまま。

githubでTimeGraphで検索すると7000件ほどのCodeがひっかかる。
githubでTimeSeriesGraphで検索すると280件ほどのCodeだった。
httpsのサーバー認証

#### 概要
curlでhttps通信したときに、そういえばhttps通信ってどういう仕組みだったっけー忘れたーと思ったのでいろいろ思い出してみたので簡単にめもめも。

#### 登場人物
* 認証局(CA)
* サーバー
* クライアント

#### いろいろ用語
* SSL
  - 米ネットスケープ社が開発
* TLS
  - SSLが普及しだした時にIETFがSSLを元にしてTLSとして標準仕様にする
  - SSLが先に普及したので、TLSのことをSSLと表記したりSSL/TLSと併記したりする
* サーバー証明書
  - 証明書データを`CAの秘密鍵でハッシュ化された署名`が含まれている
  - サーバーの`公開鍵`が含まれている。
* 認証局(CA)
  - 電子商取引事業者などに、暗号通信などで必要となるデジタル証明書を発行する機関
* CA証明書
  - ブラウザには最初っから入っている。CAの公開鍵が含まれている
* クライアント
  - 主にブラウザなど
  - ブラウザには主要な認証局の証明書(公開鍵)が登録されている。

#### 通信の流れ
* サーバー準備
  - サーバーはCAに申請してサーバーの公開鍵が含まれたサーバー証明書を作成してもらう。
* サーバー認証
  - クライアントから通信くると上で作成したサーバー証明書をクライアントに送付
  - クライアントではサーバー証明書に含まれる署名からCA証明書の公開鍵でハッシュ値を抽出してサーバー証明書データのハッシュ値と比較する。値が同じであれば信頼のあるCAから生成されたサーバー証明書であり、そこで発行されたサーバー証明書は正当なものだと判断できサーバー証明書に含まれている`サーバーの公開鍵`の信頼性が担保される。
* 通信内容の暗号化
  - 公開鍵と秘密鍵から生成したお互いしか知り得ない`共通鍵`で通信
* 完全性の確認
  - [電子証明書](http://esac.jipdec.or.jp/intro/shikumi.html)のような仕組みで改ざんがないかチェックする

#### おわり
最初だけ`公開鍵`と`秘密鍵`(公開鍵暗号)を使用して通信自体は`共通鍵`(共通鍵暗号)で行う。なぜかというと、公開鍵暗号のほうが負荷が大きいので。公開鍵暗号は認証などの場面でしか使用されない。
PHP で全角・半角入り混じった文字列を指定した文字数で html タグを除去して取得する

1 byte とか 2 byte とかではなく、読んで時の如く、指定した文字数でキッチリカッチリ文字列をカット、HTML タグを除去した文字列を取得します。第二引数で 55 と指定した場合、キッチリカッチリ 55 文字でカットされます。

例えば、ブログの概要の表示とかで使用するイメージです

```
/**
 * Trims text to a certain number of words.
 * The $num_words argument will apply to the number of individual characters.
 *
 * @param string $string    Text to trim.
 * @param int    $num_words Number of words. Default 55.
 * @param string $more      Optional. What to append if $string needs to be trimmed. Default '&hellip;'.
 *
 * @return string Trimmed text.
 */
function trim_words( $string = '', $num_words = 55, $more = null ) {
	$string = strip_tags( html_entity_decode( $string ) );
	$result = $string;

	if ( ! empty( $string ) ) {
		$string   = preg_split( '//u', $string, - 1, PREG_SPLIT_NO_EMPTY );
		$original = $string;
		$string   = array_slice( $string, 0, $num_words );

		if ( count( $original ) > $num_words ) {
			if ( null === $more ) {
				$more = '&hellip;';
			}

			array_push( $string, $more );
		}

		$result = implode( '', $string );
	}

	return $result;
}
```
Windows 検証環境 TIPS


検証目的でWindowsクライアントを構築し、テスト用の負荷などを生成した場合、Windows Updateなどで再起動がかかり、負荷生成のトラフィックが止まってしまうことがあります。

「自動ログオン設定」でWindowsの起動時に特定ユーザでログインさせるようにし、「スタートアップに登録」したスクリプトから負荷生成を行うようにすると、ほぼメンテナンスフリーで負荷を生成し続けることが可能となります。

# 自動ログオン設定

Windows 7の場合

1) [Win]+R
2) 「control userpasswords2」[Enter]
※複数形です。
![2016-01-09 (2).png](https://qiita-image-store.s3.amazonaws.com/0/63179/9cac76b4-2530-21a5-521e-cf44395bc583.png)
3) 「ユーザーがこのコンピューターを使うには、ユーザー名とパスワードの入力が必要」のチェックを外します。
※もちろん、重要情報の入っているPCで行わないように。
なお、詳しく追ってませんがAdministrators権限ユーザが複数登録されているPCではチェックボックスが表示されないようです。

参照
* https://channel9.msdn.com/Blogs/coolstuff/Tip-Auto-Login-Your-Windows-7-User-Account

# スタートアップに登録

1) スタートメニューから「すべてのプログラム」>「スタートアップ」を右クリックし、「エクスプローラー(E)」を選択する。
2) 開いたフォルダに検証用のスクリプトへのショートカットを登録する。
【パズル１】ほとんどのエンジニアには解けるが、下位10％のダメなエンジニアにだけ解けないパズル?

#パズルができた訳
今シンガポールのスタートアップでエンジニアをしているのだが、半年ほど前にソフトウェアエンジニア向けの求人募集ページに簡単なプログラミング系のパズルを出して、それが解けた人だけ応募できる仕組みにしよう、という話になった。

その時期は求人を拡大募集していたのだが、あまりにハズレな人が多かった。私もいくつか面談をしたのだが「CV（履歴書）には高いスキルって書いてるけど、言ってることがなんでこんなに変なの？」と感じてしまう応募者が多かった。これは私だけの意見でなく、他のエンジニア達からも不満が続出した。つまり履歴書のスクリーニングが効いてないということだ。日本よりも海外の方が履歴書を誇張する率が高い気がする。そこで考えたのが求人募集ページにエンジニア向けのパズルを出す、という発想。

#パズルのコンセプト
言ってはみたもののどんなパズルにしようかと考えると案外難しい。
パズルの条件は以下の３つ。

- 簡単なパズルにすること。あくまでダメなエンジニアだけを門前払いするのが目的だから、変に凝った問題を出していいエンジニアを取り逃す原因にしてはいけない。
- 全てのウェブ系エンジニアに適用できるパズルにすること。応募するエンジニアがフロントエンドでもバックエンドでもウェブアプリに携わるエンジニアであれば誰でも解けるパズル。プログラミング言語を問わないパズル。
- Googleで答えが検索できない問題にすること。ググったらすぐに答えがでてきたり、あまりに簡単スギて会社の品位を下げてしまわないようにすること。

これらの条件を全て満たすパズルをあれこれ考えて、自分としてはなかなかいいアイデアが浮かんだな、と思っていた。Ruby, Objective-C, Java, どんなエンジニアであっても共通するウェブ系の知識と勘が問われて、かつ基本さえできていれば解ける問題だ。ところがアイデアができた途端に中止になってしまった。いい人がたくさん見つかって人員が満たされたので求人自体が打ち切られたのだ。せっかく考えたパズルのアイデアがお蔵入りになってしまっていた。

#公開にいたる
「今から考えてもあれ結構いいパズルだったなー」と思い返すことが多かったので、自分で作って公開することにした。
パズルが解けたら名前とコメントを入れられる仕組みなので、感想いただければ幸いです。

#ダメなエンジニアにだけ解けないパズル
パズルはPlease call my APIs.（私のAPIを呼んで）のメッセージと「RESTful」とヒントがあるだけ。
<img width="366" alt="20151130122305.png" src="https://qiita-image-store.s3.amazonaws.com/0/108761/36b5979f-0e60-5439-2bb6-a73692149105.png">


render.comの無料プランにデプロイした。だいたい眠っているので最初の一発目のアクセスは目を覚ましてもらう時間が５−６秒ある。しばしお待ちください。
　
　
【下位10％のダメなエンジニアにだけ解けないパズル】
https://challenge-your-limits.onrender.com/


もうちょっとヒントとしてはターミナルからcurlコマンド使ってURLの後ろに「なんやら/なんやら」ってつけて叩けばいろいろ出る。バックエンドもフロントエンドのエンジニアもRESTfulに関わったことがあればcurlで叩いて動作を調べることがあると思う。それをそのままパズルにしたまで。

```ruby:clue
$ curl https://challenge-your-limits.onrender.com/something/something
```
RubyMine8 のメモリの割り当てを変更する


OS は EL Capitan で RubyMine のバージョンは 8.0.3 です.

RubyMine を本格的に使っていると動作がカクカクしてきたので, [RubyMine の起動前にするべきこと](http://qiita.com/ruzia/items/2edd8d45c16ac2c70dd7#rubymine-%E3%81%AE%E8%B5%B7%E5%8B%95%E5%89%8D%E3%81%AB%E3%81%99%E3%82%8B%E3%81%B9%E3%81%8D%E3%81%93%E3%81%A8) にあるメモリの割り当てを変更してみました.

上のリンクからは微妙にパスやファイル名が変わっていたので, メモとして残しておきます.

パスとファイル名

```
/Applications/RubyMine.app/Contents/bin/rubymine.vmoptions
```
中身

```rubymine.vmoptions
-Xms128m
-Xmx512m
-XX:MaxPermSize=250m
-XX:+UseCompressedOops
```
以下の場所にコピーする

```
$ cp rubymine.vmoptions ~/Library/Preferences/RubyMine80/rubymine.vmoptions
```
良しなに書き換える

```
$ vim ~/Library/Preferences/RubyMine80/rubymine.vmoptions
```
```rubymine.vmoptions
-Xms1024m
-Xmx2048m
-XX:MaxPermSize=250m
-XX:+UseCompressedOops
```
公式ページ [Tuning RubyMine](https://www.jetbrains.com/ruby/help/tuning-rubymine.html) にも書いてあるので, 参考までに.

その他関連
[RubyMine にメモリをたくさん割り当てる](http://qiita.com/nappa/items/b4a6f026f0f69a3522de)
[RubyMine の起動前にするべきこと](http://qiita.com/ruzia/items/2edd8d45c16ac2c70dd7#rubymine-%E3%81%AE%E8%B5%B7%E5%8B%95%E5%89%8D%E3%81%AB%E3%81%99%E3%82%8B%E3%81%B9%E3%81%8D%E3%81%93%E3%81%A8)
D3D11CreateDeviceでのエラー[ DirectX アプリケーションが、存在しないか一致しない SDK コンポーネントに依存する操作を要求しました。]

Windows10でのDirectX11を使用していたら2015の12月ごろから急にD3D11CreateDeviceで「DirectX アプリケーションが、存在しないか一致しない SDK コンポーネントに依存する操作を要求しました。」のエラーが出るようになってしまった。

どうやら、Windowsアップデートによるものらしいが、Windows10のオプション機能の追加でグラフィックスツールを設定しないとだめなようだ。

![settings_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/37694/8acf74a5-f770-2ceb-0fb6-c1eb4108d097.jpeg)


![settings_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/37694/2abcbf96-c2dd-5f8d-a52e-491e9893b78c.jpeg)

設定したあとはエラーはでなくなりました。
Dojo1.8+のグリッドはイベントリスナーとの相性が悪い。 なので、時間差攻撃で無理からフォーカスしてやる。

（DOJO1.9ですが、多分、レガシーでもconnect使えば大丈夫です。）
#Dojo の　グリッドはイベントリスナーとの相性が悪い。なので、時間差攻撃で無理からフォーカスしてやる。。。
#

ご存知のように、Data Grid, Enhanced Grid などはすでにイベントに関するマネジャーが存在するが、なかなか思うようにうごいてくれない。
書き込みが行われるときに使うのは、大体以下のイベントが主流なんじゃないかな。上から順に呼び出されます。
その時に、できればdojox.grid._Eventsを確認して欲しい。

>
onStartEdit: function(inCell, inRowIndex){
セルに内容を書き込む時にかならず最初に呼び出される。
inCell: オブジェクト
--　グリッドのコラムにあるプロパティーを含むセルのオブジェクト。
inRowIndex: Integer
--　現在のグリッドの行のインデックス
},

>

>
onApplyCellEdit: function(inValue, inRowIndex, inFieldIndex){
実際にセルに内容を書き込む時に呼び出される。
inValue: String
--　現在のセルエディターに登録されている値。
inRowIndex: Integer
--　現在のグリッドの行のインデックス
inFieldIndex: String
--　すばらしい！グリッドのデータストアのインデックスがここにある！とういことは、ItemFileWriteStoreなどの『コラッ』系のメモリーオブジェクトにもつかえる！その場合は_arrayOfAllItemsや、_itemsByIdentityなどを使おう。
この場合、値がここで変更するたびに

```
if (inFieldIndex === "target"){
      yourobject.fetchItemByIdentity({
      　　　identity : inRowIndex, 
      　　　onItem : function (item) {
      　　　yourobject.setValues(item, inFieldIndex, inValue);
      　　　tabledata.items = yourobject._arrayOfAllItems;
     　　　 yourgrid.render();
　　　});
}
```

>
として"target"フィールドの変更をメモリーに書き込んでやってください。
tabledataは変更後のバックアップ。この状態だったらそのままItemFileWriteStoreに書き換えてやれるんで。。。と思ったんですが、この部分はちゃんと使えてないみたいですね。バラすのであれば、配列で十分だったかもです。でも、上のようにバックアップは簡単なんですねぇ。問題は最下部のメモリの更新です。memoryをつかってみたんですが、なぜかうまくいきませんでした。。。とほほ。。。
本当は、yourobject._arrayOfAllItems = tabledata.items こうしたかったんだよぉ～。

>
ところで、この場合、面倒でも下記の記述が必要になってきます。おかしいなぁ。。。DOJO指南書にはもっと簡単なように書いてあったと思ったけど、これしか上手くいかなかった。今度もうちょいつめてみたいと思います。とりあえず、今はフォーカスにフォーカスして。

```
var tabledata = { identifier:'id', items:[] };
var vYourData = [];

yourobject.save();
yourobject.close();
yourobject.clearOnClose = true;
vYourData = []; /*　ここまでして、やっとオブジェクトのデータを変更できます。　*/
for (var i=0;i<tabledata.items.length;i++){
   var vTarget = tabledata.items[i].target;
   var vTarget_2 = tabledata.items[i].target_2;
   vYourData.push({id:i,target:value1, target_2:value2});
}
yourobject.data = {identifier:'id',items:vYourData};
yourobject.save();
yourobject.close();
yourgrid.render();	
```

ってな具合です。。。
。。。そこでっ！！！（やっと本題に入れる）

タブなんかで次のセル(target_2)に入って出て、そして自動的にもう一行足して、その新しい行のフィールドのtargetにフォーカスして書き込み可にして。。。っえっ？できないっ！！！
。。。そうなんです。。。これなんです。
###『Dojo の　グリッドはイベントリスナーとの相性が悪い』###

さぁ、ここで、時間差攻撃をしかけましょう！！！
フォーカスが必要な場合、もちろん、思ったようにオブジェクトがグリッドと連携して新しい行が作れない場合も、今回このちょっとした邪道ともいえる方法で乗り切ってみました。

```
window.setTimeout(function() {
　　　yourgrid.selection.setSelected(yourgrid.selection.selectedIndex, false); /* ここで一度現在行のフォーカスが外れます。必要あるときにどうぞ。 */
　　　yourgrid.focus.setFocusIndex(お好きなrowIndex, お好きなcell); /* セルのプロパティーにはすでにコラムのプロパティーも入っているのでフォーカスを直接してくれます。 */
　　　yourgrid.edit.setEditCell(現在フォーカスしてるcell, お好きなrowIndex);  /* ここで、書き込みモードのテキストウィジットをアクティブにしてくれます。 */
　　/* これでもいいかな？ */
　　　yourgrid.edit.setEditCell(yourgrid.focus.cell, お好きなrowIndex);  /* ここで、書き込みモードのテキストウィジットをアクティブにしてくれます。 */
　　/* ************************ */
},30);
```
},
>
onApplyEdit: function(inRowIndex){
実際にセルに内容が承認された時に呼び出される。
inRowIndex: Integer
--　現在のグリッドの行のインデックス
}

とにかく、グリッドはイベントリスナーと相性が悪いです。
このsetTimeoutを使ったとしても、どうしても長くほっとくと、javascript errorがでたりなんかもします。
単純なものであれば、dGridを使ったほうがよいかも。

読んでいただいてありがとうございました。