OmniAICreator/Qiita-1.07M huggingface dataset:
bot をローカルのMacに常駐させた。

[direct](https://direct4b.com/ja/) 向けに[前回作った bot (daab)](http://qiita.com/myuj/items/95852079ea7929e86dcb) は、個人的で実験的なもので、業務時間にローカルの Mac で動いてくれたら十分なので、Mac に常駐させることにした。


LaunchAgents で動かすことにしたので、
```~/Library/LaunchAgents/mybot.plist``` を追加

```xml:mybot.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>mybot</string>
  <key>ProgramArguments</key>
  <array>
      <string>/usr/local/bin/daab</string>
      <string>run</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>WorkingDirectory</key>
  <string>/Users/some-user/some-dir/mybot</string>
  <key>EnvironmentVariables</key>
  <dict>
    <key>PATH</key>
    <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
  </dict>
</dict>
</plist>
```

各プロパティの意味は、次のページを参照
https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man5/launchd.plist.5.html

デバッグログ出力のためにログレベルを変更すべく
```/Users/some-user/some-dir/mybot/.env``` に次の行を追加

```text:.env
HUBOT_LOG_LEVEL=debug
```

起動・終了を確認するために、ログファイルを tail -f しながら…

```shell-session
$ tail -f /Users/some-user/some-dir/mybot/hubot.log
```

起動を確認

```shell-session
$ launchctl load ~/Library/LaunchAgents/mybot.plist
```

終了を確認

```shell-session
$ launchctl unload ~/Library/LaunchAgents/mybot.plist
```

いずれも、それらしいログがでていることを確認
Minecraft 1.8.9 Forge API を使った Mod開発「BioFertilizer サンプルソース」

# 環境

* Mac OS X Yosemite
* Java 1.8.0_25
* Eclipse Mars.1 Release (4.5.1)

## ソース

```java

package in.webya.Chrowa3Sample;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.world.World;
import net.minecraft.item.ItemDye;

public class Chrowa3Fertilizer extends Item {
	
	public Chrowa3Fertilizer(){
		super();
        setCreativeTab(CreativeTabs.tabMaterials);
        setUnlocalizedName("BioFertilizer");
        setMaxStackSize(64);
	}
    @Override
    public String getItemStackDisplayName(ItemStack itemstack){
        return "BioFertilizer";
    }
    
    @Override
    public boolean onItemUse(ItemStack stack, EntityPlayer playerIn, World worldIn, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ)
    {
    	int blockId = Block.getIdFromBlock(worldIn.getBlockState(pos).getBlock());
    	if(blockId == 2 || blockId == 6)
    	{
			ItemDye.applyBonemeal(stack, worldIn, pos, playerIn);
			ItemDye.spawnBonemealParticles(worldIn, pos.add(0,1,0), 15);
			return true;
    	}
    	return false;
    }
}
```

onItemUse() では、ItemDye.applyBonemeal() を呼ぶことで「肥料」として機能します。しかし、blockId で対象を「草ブロック」と「オークの苗木」に絞っています。

また、ItemDye.spawnBonemealParticles() で肥料を撒いた後のパーティクルを表示します。
うるう日爆弾 [SimpleDateFormat]

先日のうるう日に関するバグについてメモ

# ❐事例　:　SimpleDateFormat クラスにて日付をParseした際に予期せぬ日付が返却

サンプルソース

```java:java

public class DateUruuYear {

	public static void main(String args[]){
		// うるう年テスト
		//----------------------------------------------------
		SimpleDateFormat fmt = new SimpleDateFormat("MM/dd");

		try{
			fmt.setLenient(false);
			Date dt = fmt.parse("02/29");
			System.out.println(dt.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


```
# □概要

上記のコードの場合、
parseする際に"yyyy"の指定がないと、デフォルトの1970年が入る動きになるみたい。
1970年はうるう年じゃないので"1970/2/29"なんて日付は存在しないので、
日付変換でparseエラーになるというのが想定されます。
しかし、

**"1970/03/01"の日付で正常終了して日付が流れてしまった。**

というのが今回の落とし穴。。

ちゃんとsetLenient(false)しているのにと、思ったところです。

そもそも "MM/dd"のみでDate変換していることが良くないのですが、

日付チェックしていればParseExceptionが発生して落ちるところが落ちなかったことが
影響を与えたましたと。


## □原因
調査した結果、

**Java1.4環境だと、setLenient(false)効かない**

とのことがわかりました。
自分で立証したわけではないので断言出来ないのですが、
少し調査してみると、確かにバージョンの部分は非互換であるそうです。


>SimpleDateFormat returns incorrect date on jdk1.4
http://stackoverflow.com/questions/2385588/simpledateformat-returns-incorrect-date-on-jdk1-4
●回答
Only a gues, there is a bug for java 1.4, for ignoring the setLenient(false) setting.
Java 1.5 does not have this bug and since there are no 20 months in a year fails to parse your input and returns null instead.


(このページでは2500年が返却されるって記載があるけど、そうなのかな。。)


## □検証
Java1.4をアーカイブから自端末に入れてみようと思ってインストールしてみようかとおもったけど、
Eclipse(Merse)がjre認識してくれなかったので時間の関係上検証出来ずにクローズすることにしました。。
(Win10 64bitとかでは使えないのかな。深追いできずです。)
情報少なくてすみません。。


自分も地雷を埋め込むことのないように気をつけます。
PHPでStartsWith/EndsWith

大昔に書いて今でも多用しているPHP版`startsWith`と`endsWith`を投稿しときます。
毎回`strpos`を書くのもイケてないので、私はこんな感じで実装しています。

## startsWithを書いてみる

```php:strposをラップする形でstartsWith
function startsWith($haystack, $needle) {
    return (strpos($haystack, $needle) === 0);
}
```

## endsWithを書いてみる

同様にEndsWithも書きたいところですが…
strrposを使わずに書いた場合。

```php:endsWith
function endsWith($haystack, $needle) {
    return (strlen($haystack) > strlen($needle)) ? (substr($haystack, -strlen($needle)) == $needle) : false;
}
```

我ながらなんて分かりづらい書き方しているんだ…とちょっと暗い気持ちになりました…。
`needle`よりも`haystack`の方が文字数が大きければ、`haystack`の後ろから`needle`の文字数分抜き出して文字列の比較をし、一致すれば`TRUE`、それ以外は`FALSE`


※個人で使っている関数は`strlen`を`mb_strlen`にしてマルチバイトにも対応するようにしています。
ですが、自分の環境で`mb_strlen`を`strlen`にしてもちゃんと動く模様…。

> ※追記　2016/03/02
> UTF8で文字を扱う環境であれば`strlen`でも問題なく使えるというコメントを頂きました。


### strrpos を見てみる。
> [PHP: strrpos](http://php.net/manual/ja/function.strrpos.php)
>
> (PHP 4, PHP 5, PHP 7)
> strrpos — 文字列中に、ある部分文字列が最後に現れる場所を探す
> 
> 説明
> 
> ```PHP:strrpos
int strrpos ( string $haystack , string $needle [, int $offset = 0 ] )
> ```
> 文字列 `haystack` の中で、`needle` が最後に現れる位置を探します。

strrposの戻り値の値は先頭から見た位置なので`endsWith`として使うには一工夫が必要になりますね。

### strrposを使って書いてみる

```php:endsWith(strrposを使用)
function endsWith($haystack, $needle) {
  return (strrpos($haystack, $needle) === strlen($haystack) - strlen($needle));
}
```

さっきの`substr`を使ったやり方よりもだいぶすっきりしました。


```php:確認用に簡単なテストをしてみる
function endsWith($haystack, $needle) {
  return (strrpos($haystack, $needle) === strlen($haystack) - strlen($needle));
}

foreach(array("e", "ge", "oge", "hoge", "hog", "hogehoge") as $needle) {
    echo endsWith("hoge", $needle) ? "TRUE" : "FALSE";
    echo "\n";
}
```

```php:結果
TRUE
TRUE
TRUE
TRUE
FALSE
FALSE
```

想定した動きになりましたね！


### 試しにマルチバイト文字も入れてみる

```php:
function endsWith($haystack, $needle) {
  return (strrpos($haystack, $needle) == strlen($haystack) - strlen($needle));
}

foreach(array("e", "ge", "げge", "eげge", "geげge", "hog", "hogeげge") as $needle) {
    echo endsWith("hogeげge", $needle) ? "TRUE" : "FALSE";
    echo "\n";
}
```

```php:結果
TRUE
TRUE
TRUE
TRUE
TRUE
FALSE
TRUE
```

~~なんか納得しないけど~~ 期待した結果になりました！

~~マルチバイト文字関連はちょっと気になるので、後日調べて追記しますね！~~
GS105EのファームウェアアップデートをMacOSX上で行う

GS105EというL2スイッチのファームウェアアップデートをしようと思ったら、管理画面でtftpdのIPアドレスとファイルパスを聞かれた。スイッチ側がtftpdで待ち受けるパターンは見たことがあったが、自分がtftpdを立てるパターンは初見だったので、備忘録として。

```
$ sudo launchctl load -w /System/Library/LaunchDaemons/tftp.plist
$ sudo cp $HOME/Downloads/GS105Ev2_V1.4.0.6/GS105Ev2_V1.4.0.6.bin /private/tftpboot/
```

準備完了。WebインターフェースからMacBook AirのIPアドレスとファームウェアのファイル名「GS105Ev2_V1.4.0.6.bin」を入力。無事新ファームで再起動した。

# 参考URL

- [TFTP サーバを起動する - えこ日記](http://d.hatena.ne.jp/eco31/20091028/1256687253)
7日目 => デザインパターン（オブザーバパターン）（1）

# はじめに
オブザーバパターン、ページ数多い...!

# 説明
## オブザーバパターン
状態変化が起こった時にオブザーバに自動的に通知。

```js
//////////////////////////////////////////////////////////////////////////////
// オブザーバーリスト
//////////////////////////////////////////////////////////////////////////////
// オブザーバーリストの作成
function ObserverList(){
  this.observerList = [];
}

// オブザーバーの追加
ObserverList.prototype.Add = function(obj){
  return this.observerList.push(obj);
}
// オブザーバーリストを初期化
ObserverList.prototype.Empty = function(){
  this.observerList = [];
}
// オブザーバーリストの件数
ObserverList.prototype.Count = function(){
  return this.observerList.length;
}
// 指定したオブザーバーの取得
ObserverList.prototype.Get = function(index){
  if(index > -1 && index < this.observerList.length){
    return this.observerList[index];
  }
}
// オブザーバーを最初または最後に追加
ObserverList.prototype.Insert = function(obj, index){
  var pointer = -1;

  if(index === 0){
    // 配列の最初に追加
    this.observerList.unshift(obj);
    pointer = index;
  }else if(index === this.observerList.length){
    this.observerList.push(obj);
    pointer = index;
  }

  return pointer;
}
// 指定オブザーバーの位置を返却
ObserverList.prototype.IndexOf = function(obj, startIndex){
  var i = startIndex,
      pointer = -1;

  while (i < this.observerList.length) {
    if(this.observerList[i] === obj){
      pointer = i;
    }
    i++;
  }

  return pointer;
}
// オブザーバーの最初または最後を除去
ObserverList.prototype.RemoveIndexAt = function(index){
  if(index === 0){
    // 配列から最初の要素を取り除く
    this.observerList.shift();
  }else if(index === this.observerList.length - 1){
    // 配列から最後の要素を取り除く
    this.observerList.pop();
  }
}

// オブジェクトの拡張
function extend(obj, extension){
  for(var key in obj){
    extension[key] = obj[key];
  }
}

//////////////////////////////////////////////////////////////////////////////
// サブジェクト
//////////////////////////////////////////////////////////////////////////////
// サブジェクト作成
function Subject(){
  this.observers = new ObserverList();
}

// オブザーバーの追加
Subject.prototype.AddObserver = function(observer){
  this.observers.Add(observer);
}
// オブザーバーの除去
Subject.prototype.RemoveObserver = function(observer){
  this.observers.RemoveIndexAt(this.observers.IndexOf(observer, 0));
}
// 通知
Subject.prototype.Notify = function(context){
  var observerCount = this.observers.Count();
  for(var i = 0; i < observerCount; i++){
    this.observers.Get(i).Update(context);
  }
}

//////////////////////////////////////////////////////////////////////////////
// オブザーバー
//////////////////////////////////////////////////////////////////////////////
function Observer(){
  this.Update = function(context){
    console.log("更新通知: " + context);
  }
}


// 動作テスト
var subject = new Subject();
var obs1 = new Observer();
var obs2 = new Observer();
var obs3 = new Observer();

subject.AddObserver(obs1);
subject.AddObserver(obs2);
subject.AddObserver(obs3);

subject.Notify("何かしらのメッセージ");
// 更新通知: 何かしらのメッセージ
// 更新通知: 何かしらのメッセージ
// 更新通知: 何かしらのメッセージ
```

# おわりに
なんだかこの単元長くて、頭がこんがらがってきた。
どうにか頑張ろう。

# 参考
* JavaScriptデザインパターン
MuninでMySQLを監視するときにワンライナーでプラグインを全て有効化する

muninでMySQLを監視する際にnode側で設定する事。

conf

```conf:/etc/munin/plugin-conf.d/munin-node
[mysql*]
env.mysqlopts -u munin --password=password
```

ユーザ作成

```SQL
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'munin'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT ON mysql.* TO 'munin'@'localhost';
FLUSH PRIVILEGES;
```

プラグインの配置とサービス再起動

```bash
$ /usr/share/munin/plugins/mysql_ suggest | sudo xargs -i ln -s /usr/share/munin/plugins/mysql_ /etc/munin/plugins/mysql_{}
$ sudo service munin-node restart # CentOS 6.x
$ sudo systemctl restart munin-node.service # CentOS 7.x
```

node側からの確認

```bash
$  /usr/sbin/munin-run mysql_queries
```

監視側からの確認

```bash
$ telnet muninhost.examplele.com munin # 4949
fetch mysql_queries # これで値が返ればOK
```

MySQLの接続確認

```bash
mysql -h localhost -u munin -ppassword -e 'SHOW FULL PROCESSLIST\G'
```

# mysql_について
mysql_を別名でリンクすると色んな値が取れる。

```bash
$ yum install -y perl-Cache-Cache perl-DBD-MySQL
$ cd /etc/munin/plugins/
$ /usr/share/munin/plugins/mysql_ suggest | sudo xargs -i ln -s /usr/share/munin/plugins/mysql_ /etc/munin/plugins/mysql_{}
```

## 補足
`/usr/share/munin/plugins/mysql_ suggest`
でどんな値がとれるか確認できる。上の例では全てを取るようになる。

> 参考: https://www.atage.jp/archives/1707/



iwaim@github さんから指摘をいただきました、ありがとうございます！

> /usr/share/munin/plugins/mysql_ など「_」で終わるファイル名のプラグインはワイルドカードプラグインと呼ばれているプラグインで、1つのファイルで複数のグラフを出力することができます。具体的な使い方としては、別の名称でリンクを作成することによって、どのようなグラフを表示するのかを制御することができます。


```bash
/usr/share/munin/plugins/mysql_ suggest
Missing dependency Cache::Cache at /usr/share/munin/plugins/mysql_ line 728.
```
が出たら `perl-Cache-Cache perl-DBD-MySQL` のインストール。

# 参考
mysql_ - Munin plugin to display misc MySQL server status | munin
http://gallery.munin-monitoring.org/distro/plugins/node.d/mysql_.html
旅行に行ったけどデジカメの日付が１年ずれていた

ので、[jhead](http://www.sentex.net/~mwandel/jhead/)を使ってExifを編集した。

```
jhead -ds2016 filename
```

一括処理。

```
find . -name "*.JPG" | xargs -I{} jhead -ds2016 {}
```
あるbranchのあるファイルに関するcommitだけを全部cherry-pickしたい

# 今日

hogebranch の a.txt に関する commit だけを全部 cherry-pick したくなるということが起きた

# 結論

こうやったけど、

```console
$ a=(`git log --pretty=format:%h hogebranch -- a.txt`)
$ for ((i=${#a[@]}-1; i>=0; i--)); do git cherry-pick ${a[$i]}; done
```

あとでリバースっていうオプションがあることに気づいたので、これで同じことができたし、

```console
$ for a in `git log --reverse --pretty=format:%h hogebranch -- a.txt`; do git cherry-pick $a; done
```

さらにいま cherry-pick が複数のコミットハッシュを引数に取れることがわかったので、これがオススメ

```console
$ git cherry-pick `git log --reverse --pretty=format:%h hogebranch -- a.txt`
```

ちなみに、上記の a.txt の部分は何らかのディレクトリ名にも置き換え可能で、
ある fugadirectory 以下の変更を全部 cherry-pick したくなったときにも便利
WebRTC Android向けネイティブビルド手順

自分の環境でうまくいっただけのメモ書き
説明等は全て省いてコマンドのみ列挙

#想定環境
OS : Ubuntu 14.04
ビルドターゲット : Androidのみ

#ビルド手順
```
#rootで作業
$ sudo su
#必要なものインストール
$ apt-get update
$ apt-get upgrade
$ apt-get install -y libnss3-dev libasound2-dev libpulse-dev libjpeg62-dev libxv-dev libgtk2.0-dev libexpat1-dev lib32z1 zlib1g lib32stdc++6 lib32z1-dev $ ant git subversion openjdk-7-jdk g++
#パス通す
$ export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
#作業用ディレクトリ作る
$ mkdir webrtc  
$ cd webrtc

#下記ビルド用コマンド群  
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git  
$ export PATH=`pwd`/depot_tools:"$PATH"  
$ export GYP_DEFINES="OS=android"  
$ fetch webrtc_android  
$ gclient sync  
$ ./src/build/install-build-deps.sh  
$ export WEBRTC_RELEASE=true  
$ export GYP_DEFINES="build_with_libjingle=1 build_with_chromium=0 libjingle_java=1 enable_android_opensl=0 $GYP_DEFINES"  
#↓これ変わりました。追記参照
$ gclient runhooks  

#ビルドコマンド  
$ ninja -C out/Release AppRTCDemo
```
out/Release/AppRTCDemo/libs/armeabi-v7a/libjingle_peerconnection_so.so
out/Release/gen/libjingle_peerconnection_java/libjingle_peerconnection_java.jar
とか使う

最初の一回目を想定しているのでfetchやapt-getとかも入ってますがこれは一回だけでいいです。
次回からはgclient syncコマンドで続きから始めてくれます

##2016/11/08 追記

いつからか把握してできてないですがGYPがdeprecatedになりました。
その影響でgclient runhooksはやらず、GNコマンドになります
https://webrtc.org/native-code/android/

OS : Ubuntu 14.04 or 16.04

```
#これ使わない×
$ gclient runhooks 

#これ使う○
$ gn gen out/Default --args='target_os="android" target_cpu="arm"'

```

その際自分の環境では下記エラーが出たので、解決法を記載

```
Current dir: /path/src/out/Default/
Command: python -- /path/android/webrtc/src/build/android/gyp/aar.py --input-file ../../third_party/android_tools/sdk/extras/google/m2repository/com/google/android/gms/play-services-basement/9.8.0/play-services-basement-9.8.0.aar --list
Returned 1.
stderr:

Traceback (most recent call last):
  File "/path/android/webrtc/src/build/android/gyp/aar.py", line 109, in <module>
    sys.exit(main())
  File "/path/android/webrtc/src/build/android/gyp/aar.py", line 80, in main
    with zipfile.ZipFile(aar_file) as z:
  File "/usr/lib/python2.7/zipfile.py", line 756, in __init__
    self.fp = open(file, modeDict[mode])
IOError: [Errno 2] No such file or directory: '../../third_party/android_tools/sdk/extras/google/m2repository/com/google/android/gms/play-services-basement/9.8.0/play-services-basement-9.8.0.aar'

See //third_party/android_tools/BUILD.gn:150:1: whence it was called.
android_aar_prebuilt("google_play_services_basement_java") {
^-----------------------------------------------------------
See //webrtc/system_wrappers/BUILD.gn:158:7: which caused the file to be included.
      "//third_party/android_tools:cpu_features",
      ^-----------------------------------------
Build AppRTCMobile in Release (arch: x86_64)
Running ninja
ninja: Entering directory `out/Default'
ninja: error: loading 'build.ninja': No such file or directory
```
GooglePlayServiceがインストールできてないので下記でインストールする
``/path/src/third_party/android_tools/sdk/tools/android sdk``
下の方のExtrasにある「Google Repository」をインストール
参考:http://dev.classmethod.jp/smartphone/android/android-studio-support-repository/

以上
Tech-Circle #13 Zabbixハンズオン手順

# Lesson1

[Lesson1の手順](http://qiita.com/_BSmile_/items/081e3d7fa50c8883ea8b)

# Lesson2 LLDを使った自動化ハンズオン

後半のZabbix LLDを使った自動化ハンズオンの手順になります。
手入力が面倒なところはこの記事からコピペで登録してスムーズに進めて下さい。


## ハンズオン資料

後日掲載します。

## Step0. Zabbixダッシュボードにアクセス

事前に配布しているURLにアクセスしログイン。

url: http://IP:port/zabbix
Username: Admin
Password: techcircle13

## Step1. AWS監視用のホストを登録

[設定]→[ホスト]から以下を新規登録

* ホスト名: 任意
* テンプレート: Template AWS
* ホストグループ: AWS ※新規グループ作成欄
* マクロ:
    * {$KEY} => API Keyを設定
    * {$SECRET} => Secret Keyを設定

※上記のテンプレートはzawsというAWS API連携コマンドをベースにしたテンプレート
※https://github.com/ike-dai/zaws

## Step2. ホストやアイテムが自動登録されるか確認

[設定]→[ホスト]でホストの一覧に追加されたか確認

[監視データ]→[最新データ]で監視が実行されていることを確認

## Step3. 追加のカスタムメトリクスに対する監視自動設定

講師がカスタムメトリクスを登録
しばらく後に[監視データ]→[最新データ]の画面を確認し、追加されていることをチェック

***確認方法***

* [監視データ]→[最新データ] 
    * フィルタのホストを「EC2_instance01」に設定し確認
    * ホスト: EC2_instance01
    * アプリケーション: TechCircle
    * アイテム名: TechCircleCustom


## Step4. 監視のスケジュール実行を試す

[設定]→[ホスト]から自動登録されているEC2インスタンス用のホストのアイテムをクリック

「cloudwatch stats monitor(EC2)」を編集

定期設定の欄に「h20m45s0」の形式で現在時刻の少し先の時刻を設定。

## Step5. Step4で指定した時刻に監視処理が実行されているか確認

[監視データ]→[最新データ]から該当のcloudwatch stats monitor(EC2)の処理が該当時間に実行されているか確認

## 【Advanced】Step6. Macro contextの設定

### 1.「Template AWS EC2」に以下のトリガープロトタイプを設定

* [ディスカバリルール] CloudWatch discovery (EC2)
* [トリガープロトタイプ]
    * 名前: test trigger ({#METRIC.NAME})
    * 条件式:{Template AWS EC2:cloudwatch.metric[{#METRIC.NAME}].last()}>{$LIMIT:"{#METRIC.NAME}"}

### 2. ホスト「AWS account」のマクロに以下を登録

* {$LIMIT} => 0
* {$LIMIT:"CPUUtilization"} => 5

## 【Advanced】Step7. Windows Service LLDを試す

### 1.[設定]→[ホスト]からホスト登録

* ホスト名: windows-server
* ホストグループ: AWS
* エージェントインタフェース:Windowsサーバのインタフェース設定

### 2.ディスカバリルール登録

* 名前: Windows service discovery
* タイプ: Zabbixエージェント
* キー: service.discovery

### 3. アイテムプロトタイプ登録

* 名前: Windows service info [{#SERVICE.NAME}]
* タイプ: Zabbixエージェント
* キー: service.info[{#SERVICE.NAME}]
* 値のマッピング: Windows service state

以上。
Rails アプリケーションを Docker を使って開発する、ほとんどの人が通る（であろう）道


本記事は、A server is already running の対処です。これについては記事もたくさん存在していますし何も新しいことはありません。
ただ、Rails × Docker で開発する人より多くの人に見てもらえることを目的として書きました。
Rails の A server is already running と聞いて「ああ、あれのことか」と思った方は本記事は読み飛ばしてください。

## docker-compose.yml

```yml
db:
  image: postgres
web:
  build: .
  # コンテナ立ち上げ時に開発用サーバを起動
  command: bundle exec rails s -p 3000 -b '0.0.0.0'
  volumes:
    - .:/myapp
  ports:
    - "3000:3000"
  links:
    - db
```

# A server is already running.

コンテナを立ち上げますが、失敗しています。  

```bash
$ docker-compose up -d
$ docker-compose ps
        Name                       Command               State     Ports
--------------------------------------------------------------------------
railsprojectdocker_db_1    /docker-entrypoint.sh postgres   Up       5432/tcp
railsprojectdocker_web_1   bundle exec rails s -p 300 ...   Exit 1
```

以下のコマンドでログを確認します。

```bash
$ docker-compose logs
~
web_1 | => Booting WEBrick
web_1 | => Rails 4.2.4 application starting in development on http://0.0.0.0:3000
web_1 | => Run `rails server -h` for more startup options
web_1 | => Ctrl-C to shutdown server
web_1 | A server is already running. Check /myapp/rails-app/tmp/pids/server.pid.
web_1 | Exiting
```

# 問題と対処

Rails に付随しているWEBサーバが正常に終了していない。
`docker-compose kill` や 何かの拍子でコンテナが終了すると起きてしまいます。

## server.pid に pid の情報が保持されたまま終了

pid は、開発用WEBサーバを起動するときに tmp/pids/server.pidに書き込まれ、終了するときに削除されます。
server.pid に pid が書かれていると開発用WEBサーバが起動中（プロセスがある）と判断されてしまいます。

## pid の情報を削除

server.pid に書かれた pidを削除する、もしくはserver.pidを削除します。
server.pid を削除しても、`rails server`を実行した時に自動で作成されます。

```bash
$ rm railsproject-ui/tmp/pids/server.pid
Jekyllで２重ニョロカッコ(double curly braces)をエスケープする


`{{ prop }}`などのようなデータを受け取る想定のmastacheテンプレートなどをjekyllでそのままコンパイルすると変数と勘違いされて空の出力をしてしまい、まるごと消えてしまう。

下記のように`{% raw %}`を使うと回避できる。

```
{% raw %}
{{ prop }}
{% endraw %}
```

via: http://stackoverflow.com/questions/24102498/escaping-double-curly-braces-inside-a-markdown-code-block-in-jekyll
メモ: git mergetool

## 参考

* [Git での diff, マージに meld を使う - わからん](http://d.hatena.ne.jp/kitokitoki/20121102/p1)

## 設定

```diff:~/.gitconfig
+ [diff]
+ 	tool = meld
```

* mergeが必要になったら以下コマンド

```bash:
git mergetool
```

meldが起動。

```bash:
git commit
```
mbed BLE なペリファラルをセントラルからLチカさせる


mbed BLE なペリファラルをセントラルからLチカさせたい。

ペリファラルのコードとしては BLE_LED というサンプルコードが公開されてる。

- https://developer.mbed.org/teams/Bluetooth-Low-Energy/code/BLE_LED/

このコードでは LEDService というサービスを提供している。UUID は野良 Service で本来は良くないけど 16bit UUID の 0xA000 (サービス)と 0xA001(キャラクタリティクス、read & write) で構成してる。で、このキャラクタリティクスに書き込まれたに書かれた数値を mbed の DigitalOut (LED2) にそのまま書き込んでいるだけなので、こいつをセントラルから書き込めば OK。

セントラル側は noble に慣れるため noble を素で書いてみた。

アドバタイズメントから提供している UUIDs を取得し、LEDService (0xA000) があればそのペリファラルに接続し、キャラクタリティクスに値を書き込んでる。

```javascript
var noble = require('noble');

var LED_SERVICE_UUID = 'a000';
var LED_STATE_CHARACTERISTIC_UUID = 'a001';

noble.on('stateChange', function(state) {
  if (state === 'poweredOn') {
    noble.startScanning();
  } else {
    noble.stopScanning();
  }
});

noble.on('discover', peripheral => {
  var advertisement = peripheral.advertisement;
  if (advertisement.serviceUuids.find(uuid => uuid.toLowerCase() === LED_SERVICE_UUID)) {
    console.log('found LED service');
    noble.stopScanning();

    peripheral.connect(function(error) {
      peripheral.discoverSomeServicesAndCharacteristics([LED_SERVICE_UUID], [LED_STATE_CHARACTERISTIC_UUID],
      function(error, services, characteristics) {
        var characteristic = characteristics[0];
        var value = 0;
        var toggleLED = function() {
          var buffer = new Buffer(1);
          value = (value == 0 ? 1 : 0);
          buffer.writeUInt8(value, 0);
          console.log('toggle', value);
          characteristic.write(buffer, true, () => setTimeout(toggleLED, 1000));
        };
        toggleLED();
      });
    });
  }
});

```

これでLチカできた。noble-device でサービスを抽象化するとこんな感じ。

```js
var NobleDevice = require('noble-device');

var LED_SERVICE_UUID = 'a000';
var LED_STATE_CHARACTERISTIC_UUID = 'a001';

function LedService() {}

LedService.prototype.writeLedState = function(data, callback) {
  this.writeUInt8Characteristic(LED_SERVICE_UUID, LED_STATE_CHARACTERISTIC_UUID, data, callback);
};

var LedDevice = function(device) { NobleDevice.call(this, device) };
NobleDevice.Util.inherits(LedDevice, NobleDevice);
NobleDevice.Util.mixin(LedDevice, LedService);

LedDevice.is = function(device) {
  return device.advertisement.serviceUuids.find(uuid => uuid.toLowerCase() === LED_SERVICE_UUID);
};

LedDevice.discover(function(device) {
  device.connectAndSetup(function(callback) {
    var value = 0;
    var toggleLED = function() {
      value = (value == 0 ? 1 : 0);
      console.log('toggle', value);
      device.writeLedState(value, () => setTimeout(toggleLED, 1000));
    };
    toggleLED();
  });
});
```

uint8 や uint16 への変換コミの function が用意されてるのは便利だなー。
Chatwork API - PHPでのラッパーライブラリ的な

**（2017/05 ※API v2に対応しました。）**

# はじめに
バージョン管理だとかパッケージ管理とはあまり触れ合えていないクソエンジニアが、自分のための、ラッパーライブラリ的なやつを書いた報告です。
ラッパーとして書いたので、特定のケースよりも諸々チャットワークでシステムに繋ぎたい時にとりあえず使いはじめるのに向いています。

# 取り急ぎ、ファイルをお送りさせて頂きます。
https://github.com/git6/php-chatwork-api
(バージョン管理なんて、1人でやってるとCtrl+Sくらい気軽。)

# 悩んだポイント
前提として、とにかくプレビュー版といいながら
既にある程度機能的なこのAPI(エンドポイント)の構造をこねくり回したくない。

## 1. まとめるか、まとめないか
同じ対象の、リスト取得と単体取得で分けるか悩みましたが
結局、まとめて単体を指定するIDを渡した場合に単体を取ってくるようにしました。
自分では理解しているけど他の人が使う場合
理解の妨げにならないか、作った後でも不安になっている要素。
（元々エンドポイントは分かれている）

## 2. エラーの対応をどこまでするか
これも前提から派生する話では有るが、あんまり試してないけども
向こう側でエラーメッセージも出してくれるわけだし
こちら側で判断してライブラリ内からエラーを返すよりも
予めバリデーションなりした値を投げる前提＆投げっぱなしで向こうで判断して貰う方が綺麗かなって思った（小並感）

# まとめ
クソみたいな現場で使うのに向いてるので、ぜひ最新の現場がやってこない方々に使って欲しいです。
もしこのコードで古いバージョンのPHPで動かないとかあれば、ぜひ対応したいです。
（バージョン上げられない現場とかにぜひ使って欲しい）
Composerとかで使う物は別の方が書かれてますのでそちらをどうぞ。

あと、個人的にはメール通知の代わりに使うケースが多いです。

ちなみに、このコードで一番注意とか欲しいのはクラスの書き方です。
ご指摘待ってます。
Rails5 で `find(ids)` の戻り値が、渡した id の順番で返ってくるようになった


そのまんまの話。

rails4 と rails5 で同じ DB に接続しています。

```irb:rails4
> DailyReport.find(10, 4, 2, 7).map(&:id)
  DailyReport Load (0.4ms)  SELECT "daily_reports".* FROM "daily_reports" WHERE "daily_reports"."id" IN (10, 4, 2, 7)
=> [2, 4, 7, 10]
```

```irb:rails5
> DailyReport.find(10, 4, 2, 7).map(&:id)
  DailyReport Load (0.5ms)  SELECT "daily_reports".* FROM "daily_reports" WHERE "daily_reports"."id" IN (10, 4, 2, 7)
=> [10, 4, 2, 7]
```

地味に便利かもしれない。

ちなみに、引数に重複があっても戻り値は重複しないので、もし重複があると引数と戻り値の個数が合わなくなります。
これは rails4 から変わってません。
重複させて find するとかあまりないとは思うけれども。

```irb:rails4
> DailyReport.find(10, 4, 2, 7, 2, 11).map(&:id)
  DailyReport Load (0.6ms)  SELECT "daily_reports".* FROM "daily_reports" WHERE "daily_reports"."id" IN (10, 4, 2, 7, 11)
=> [2, 4, 7, 10, 11]
```

```irb:rails5
> DailyReport.find(10, 4, 2, 7, 2, 11).map(&:id)
  DailyReport Load (0.4ms)  SELECT "daily_reports".* FROM "daily_reports" WHERE "daily_reports"."id" IN (10, 4, 2, 7, 11)
=> [10, 4, 2, 7, 11]
```

`.find` なので、存在しない id が含まれていると `ActiveRecord::RecordNotFound` 例外になるのも変わりません。
(ここが変わると困ってしまいますが)

```irb:rails4
> DailyReport.find(1, 999999)
  DailyReport Load (0.2ms)  SELECT "daily_reports".* FROM "daily_reports" WHERE "daily_reports"."id" IN (1, 999999)
ActiveRecord::RecordNotFound: Couldn't find all DailyReports with 'id': (1, 999999) (found 1 results, but was looking for 2)
```

```irb:rails5
irb(main):001:0> DailyReport.find(1, 999999)
  DailyReport Load (0.1ms)  SELECT "daily_reports".* FROM "daily_reports" WHERE "daily_reports"."id" IN (1, 999999)
ActiveRecord::RecordNotFound: Couldn't find all DailyReports with 'id': (1, 999999) (found 1 results, but was looking for 2)
```
Markdownで表形式を作りやすくする方法

Excelみたいなかんじで表を編集できたらなぁーって思ってました。
以下アドオンを使えば、スプレッドシートで可能でした。

[MarkdownTableMaker](https://chrome.google.com/webstore/detail/markdowntablemaker/cofkbgfmijanlcdooemafafokhhaeold?utm_source=permalink)


一方通行（Excel→Markdownのみ）ですが、簡単に書けました！

追記:
esa.ioをお使いであれば、 https://docs.esa.io/posts/205 をお使いになられるのも良いかと思います。
Python3で形態素解析エンジンMeCabを使えるようにする(2016年3月版)

##概要

形態素解析エンジンの「MeCab」をMac上のpyenvで入れたPython3から使えるようにします。

基本的に、既にあるまとめ記事の内容そのままですが、GitHubの公式リポジトリにパッチが当たって、元記事では手動でパッチを当てていた作業が、~~Pythonのバインディングコードを1行修正するだけで良い状態になっていました。~~（_2016/3/2 改訂_）全て不要になりました。


元記事の情報を総合しただけですが、何度かインストールをリトライしたので、手順を残しておきます。


公式サイト http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html
リポジトリ https://github.com/taku910/mecab

元記事
- [MeCabをPython3上から使えるようにする](http://qiita.com/namoshika/items/37e1351f7ffefd505eec)
- [Python3でMeCab](http://anond.hatelabo.jp/20121113070853)
- [MeCabをPython3から使う(続報)](http://shogo82148.github.io/blog/2015/12/20/mecab-in-python3-final/)（パッチをプルリクされた方の記事）

##インストール

###MeCab (和布蕪)インストール

```bash
git clone https://github.com/taku910/mecab.git
cd mecab/mecab
./configure  --enable-utf8-only
make
make check
sudo make install
```

インストールが終わるとmecabが配置されます。

```bash
/usr/local/etc/mecabrc
/usr/local/bin/mecab
/usr/local/bin/mecab-config
```

~~コンソールからmecabを起動し、続けて日本語を入れると形態解析結果が表示されるようになります。~~
_2016/3/2追記 初版ではここでmecabコマンドを使っている説明を書いていましたが、辞書をインストールしてからでないと使えませんでした。_




###辞書のインストール

~~公式サイトから「IPA 辞書」をダウンロードします。~~
~~http://taku910.github.io/mecab/#install~~
~~http://taku910.github.io/mecab/#download~~

```bash
tar zxfv mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure --with-charset=utf8
make
sudo make install

_2016/3/2追記その２ ここも飛ばしてください。
ダウンロードしなくてもgitプロジェクトに含まれていました。 
```

```bash
cd ../mecab-ipadic
./configure --with-charset=utf8
make
sudo make install

_2016/3/2追記その２ こっちが最新
```


この時点でコンソールからmecabを起動し、続けて日本語を入れると形態解析結果が表示されるようになります。

```bash
$ mecab
MeCab はフリーソフトウェアです
MeCab	名詞,固有名詞,組織,*,*,*,*
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
フリー	名詞,一般,*,*,*,*,フリー,フリー,フリー
ソフトウェア	名詞,一般,*,*,*,*,ソフトウェア,ソフトウェア,ソフトウェア
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
EOS
```

###Python3バインディングのインストール

_2016/3/2追記 初版より簡単な方法がありました。しばらく読み飛ばして下さい。_

~~続けて、MeCabをPythonから使用する準備をします。先ほどgit cloneしたディレクトリに各種言語のバインディングが準備されているのでpythonディレクトリまで移動します。~~

```bash
cd [MeCabのgitクローンしたディレクトリ]
cd mecab/mecab/python

#2016/3/2追記 ここは、飛ばしてください
```

~~ここで、setup.pyのコードを1行修正が必要です。returnの前のタブを消さないように気をつけて下さい。~~


~~本記事「[Python3でMeCab](http://anond.hatelabo.jp/20121113070853)」~~

```python
vi setup.py

def cmd2(str):
    return string.split (cmd1(str))

を以下に変更

def cmd2(str):
    return cmd1(str).split()

#2016/3/2追記 ここも、飛ばしてください
```

~~修正が終わったら、インストールします。~~

```bash
python setup.py build
sudo python setup.py install

#2016/3/2追記 ここも、飛ばしてください
```

_2016/3/2追記_
_もっと簡単な手順がありました。下記記事で書かれている通り、pipコマンドでPython3から使えるようになります。_

- [Python3でmecabを使う](http://qiita.com/piruty_joy/items/5ae2c2ba660796112207)

```bash
pip install mecab-python3
```


##使ってみる

公式サイトの[Pythonサンプル](http://mecab.googlecode.com/svn/trunk/mecab/doc/bindings.html)を実行してみます。オリジナルは、Python2用のコードなので、printだけ変えてます。


```python
import sys
import MeCab
m = MeCab.Tagger ("-Ochasen")
print(m.parse ("今日もしないとね"))
```

実行結果

```bash
今日	キョウ	今日	名詞-副詞可能		
も	モ	も	助詞-係助詞		
し	シ	する	動詞-自立	サ変・スル	未然形
ない	ナイ	ない	助動詞	特殊・ナイ	基本形
と	ト	と	助詞-接続助詞		
ね	ネ	ね	助詞-終助詞		
EOS
```

手順がどこか間違ってたら教えて下さい。
Outlookでメールのヘッダを参照する

今日、メールフォルダーを開いたら、こんなウレシイお知らせがありました。
>
Title: 【重要】日本管財機構より大切なお知らせ【重要】
【重要】マイナンバーに関わる大切なお知らせの為、必ず最後までお読み頂けます様お願い申し上げます。
※個人情報保護法に基づき、第三者による貴方様の氏名・住所・電話番号・マイナンバー等の閲覧を防ぐ為、本電子文書へは非公開と致します。
【本人限定：内容証明電子承認文書】
貴方様がご使用されております電気通信端末機器及びインターネットプロバイダを通じ、会員登録状態となっている従量課金制有料サイトの登録確認についてご通知致しました。
(以下中略)
～～お問い合せ先～～
【日本管財機構】
・対応部署：第２管理部
・管理番号：T033XX　※左記管理番号をお電話にてお伝え下さい。
・直通番号：XX-XXXX-XXXX
・営業時間：10：00～19：00 ※土日祝は対応出来ません。

要約すると、すぐに連絡しないと民事訴訟するぞ、という内容です。マイナンバーと何の関係があるのかさっぱりわかりませんけど。

さっそく、メールのヘッダで送信元を調べてみると発信IPはGMO CLOUDのサーバーで、「お名前.com」でドメインネームを昨日取得していて、whois情報から、gmailのアドレスと名前、住所、電話番号、FAX番号を確認しました。本当かどうか知りませんが、日本管財機構という組織の管理者の方は、博多駅前にあるビルの貸し会議室に在住のようです。住所と電話番号は、検索すると過去にいろいろな詐欺事件で使われていた様子。ヘッダを読んで、いったい、どんな人がこのメール送っているんだろうと想像するとワクワクしますね。

昔のメールソフトでは、ヘッダが当たり前に表示されていましたし、1X年前は、会社のメールサーバーの保守をしていたこともあり、来るメールは常にヘッダを確認していました。最近になって、会社で使っているOutlookだとメールヘッダの参照がかなり面倒です。

Outlook2013でメールヘッダを参照するには、メッセージを別ウィンドウで開き、[ファイル]メニューの[プロパティ]を開きます。
![mail_header.png](https://qiita-image-store.s3.amazonaws.com/0/112013/196c0fd8-7aad-dc30-fc69-44c3a885939c.png)

これだとプロパティを開くまでに3クリックと面倒くさいので、ショートカットで開く方法を探してみました。クイックアクセスツールバーという領域にカスタム設定で、「メッセージオプション...」を追加すると、1クリックでプロパティ画面を開けます。
![shortcut.png](https://qiita-image-store.s3.amazonaws.com/0/112013/4353c7ae-735b-790f-29ac-bccc04009fd5.png)
OutlookのTipsということで。
Facebookの360 videoに360 Video Metadata Toolが使えた話

# ことのあらまし
去年からこのニュースに気づかず過ごしていました。
http://newsroom.fb.com/news/2015/09/introducing-360-video-on-facebook/

自分は実写動画より、CGでパノラマを作りたいので、試してみようと思いました。


# MetadataはGoogleの360 Video Metadata Toolと互換性があった

早速始めてみたところ、
https://ja-jp.facebook.com/help/875960339177773
のページで、Youtubeと同様にMetadataが必要らしく、FacebookにはこのMetadataについての詳細がありませんでしたが、
ためしに360 Video Metadata Toolを使ってMetadataの埋め込みをしたところ、まったく問題なくFacebook側のwebページで認識してくれました。

# 作り方(for Unity)
* コンテンツを用意(今回はUnityちゃんのコンテンツを利用)
* パノラマ動画作成アセットを使う(自ツール:[SphericalImageCam](https://www.assetstore.unity3d.com/jp/#!/content/21979)、他にも[360 VR Camera Capture Rig](https://www.assetstore.unity3d.com/jp/#!/content/53264)とかあるようだけど、使ったことがない)
* 動画で録画(Nvidia ShadowPlayを仕様)
* 書き出した動画をGoogleの[360 Video Metadata Tool](https://support.google.com/youtube/answer/6178631?hl=ja)を使ってメタデータを埋め込む
* 動画をFacebookにアップロード

# アップロード例

[![例へのリンク](https://scontent.xx.fbcdn.net/hvthumb-xpf1/v/t15.0-10/s480x480/12672575_1986275328263313_361522391_n.jpg?oh=0ee361475d77cbb60c607b39dbd49f2e&oe=574A6009)](https://www.facebook.com/tatsuro.matsubara.5/posts/1986277628263083)

サムネイルが見れない場合：
https://www.facebook.com/tatsuro.matsubara.5/posts/1986277628263083
the Imaging Source 社製USBカメラをLinux対応にする


# はじめに
やり方は全て[https://github.com/TheImagingSource/tiscamera/wiki]()に書いてあるが，全て英語ということもあり，ここにメモする．
なお，2016年3月現在，カメラをUVCモードにすると，カメラからPCに送られてくるデータはbayerデータというもので，そのまま見てもモノクロに見え，場合によっては歪んで見える（らしい）．
このデータをカラーに直すには，ソフトウェア側で変換処理が必要になる（ここの部分はここでは記述しない）．
また，これが原因で，OpenCVでは直接キャプチャできなくなる．

# 使用機材
* the Imaging Source社製のUSB2.0カメラ　DFM 22BUC03-ML
* Ubuntu 12


# UVC対応カメラへの変更
ここの工程は，[https://github.com/TheImagingSource/tiscamera/wiki/Getting-Started-with-USB-2.0-CMOS-Cameras]()にある通りに行う．
ここでは，ファームウェアをUVC対応のものにアップデートして，カメラをUVCモードにする．

まず初めに以下のコマンドを順番に実行して，ファームウェアのアップデートに必要なソフトを入手する．

```bash
git clone https://github.com/TheImagingSource/tiscamera.git
cd tiscamera/tools/euvccam-fw
make
```

カメラをPCに接続して，
```
sudo ./euvccam-fw -p
```

を実行してカメラのプロパティが得られれば，ここまでは良い．
なお，得られたプロパティのFlagsが0になっていれば，それはまだカメラがUVCモードになっていないという意味である．

次にカメラのファームウェアをアップデートする．

```bash
sudo ./euvccam-fw -u ../../data/firmware/usb2/dmk22uc03_163_uvc.euv
```

ここで選択するファームウェアは，カメラの型が異なる場合は，それに合わせる．
なお，このファームウェアの名前は，
（カメラ型番）_（ファームウェアバージョン）.euvc
となっているものと思われる（正直よくわからないが，間違えたファームウェアを選択すると，自動でソフトウェアが拒否するらしい）．

ファームウェアのアップデートが終わると，元々のファームウェアがbackupディレクトリにバックアップされるので，これは大切に持っておくこと！
紛失すると，二度とWindowsに戻れなくなります．
ファームウェアを戻すには，

```bash
sudo ./euvccam-fw -u backups/backup_*.euvc
```

を実行すればよい．なお，*は適宜正しい番号に変えること．

一度カメラをPCから取り外し，再びカメラを接続したら，

```bash

sudo ./euvccam-fw -m uvc
```

を実行して，カメラをUVCモードにする．

再びカメラをPCから取り外し，再びカメラを接続して，

```bash

sudo ./euvccam-fw -p
```

を実行して，Flagsが１に変わっていれば，無事カメラはUVCモードになった．

# カメラのチェック
カメラが無事UVC対応に変更できたかどうかを，ここで確認する．
Linux上でのカメラキャプチャにはqv4l2を使用する．

qv4l2のインストールは，

```bash
sudo apt-get install qv4l2
```

でできる．
あとは，カメラをPCに接続して，

```bash
qv4l2
```

をコマンドラインから実行するだけである．
これでカメラからの映像が得られれば良い．

# gstreamerモジュールについて
冒頭に紹介したthe Imaging Source社のGitHubには，Gstreamer moduleをインストールするように紹介しているが，私は，これらを全てインストールして，動作確認までできたが，gstreamer を用いた開発を行う予定はないため，無用だった．
よって，ここでは省略する．
git note


# Build git for old OS
- AWS codecodecommit require 2.x (Not support centos7/6 's it)
- GCP source require 2.0 up (Not support centos6)

So, i build the git.
http://stackoverflow.com/questions/4039416/installing-git-with-non-root-user-account

Install `/opt/git`
## gcloud for centos6
Old os image do not support latest gcloud, due to require python27 (but centos6 python = 26).
Install python27 via pyenv or any way and set env `CLOUDSDK_PYTHON` to python binary path (not directory).

You have to setup,
- gcloud (versions support `gcloud source` )
- python 2.7
- git > 2.0
- set env `CLOUDSDK_PYTHON`

Clone `gcloud source repos clone <repo-name> --project=<pj-id>`
# tag
List tags `git tag`
Get commit from tag `git show <tagname>`

# patch (monkey)
```
git clone <from up stream>
git fetch origin pull/<PR-ID>/head:<Local-BR>
git co -b <Local-Final-BR> refs/tags/<tag>
git merge <Local-BR>
git diff > hoge.patch
```

# github
## checking out pull requests locally
https://help.github.com/articles/checking-out-pull-requests-locally/

`git fetch origin pull/ID/head:BRANCHNAME`

`BRANCHNAME` is local. and `git checkout BRANCHNAME`

# magit inactive
## stash
subcommand = `z` 
- save `z`
- pop `p`
- apply `a` (keep stash)
- drop `k`

## branch
subcommand = `b`
- checkout `b`
- create & checkout `c`

remote branch to local
1. `F (fetch)` 
2. `b + c` 1st = remote-branch 2nd = local-branch

## log
`l` + `l`

## merge
```
C-c ^ m         smerge-keep-mine
C-c ^ n         smerge-next
C-c ^ o         smerge-keep-other
C-c ^ p         smerge-prev
```

keep-mine = BASE
keep-other = xxxx


# local repository
## List all branches contain remotes
`git branch -a`

## Erase remote branches already merged
`git fetch --prune`

## Copy remote-branch to local's it
`git checkout -b [local-branch-name] [remote]/[branch]`
or
`git checkout --track [remote]/[branch]`

## Delete local branch
`git branch -d [branch]`

## Delete remote branch
`git push [remote] :[branch]`
Means
`git push [remote] [nothing!]:[branch]`

```
git push origin master
equals
git push origin [(local-)master]:[(remote-)master]
```

# bare repository

## init
```
mkdir hoge.git
cd hoge.git
git init --bare
```

## Create via clone
`git clone --bare hoge.git githug@xxxxx:hoge.git`

## use post-receive
```bash:
cd hoge.git/hooks
vim post-receive
....
chmod +x post-receive

```
1台のmacで複数のgithubアカウントを使う場合の備忘録

githubを使っていて、１台のmacで個人用のgithubと会社用のgithubを使い分ける場合のポイント


* ポイント１
以下のような設定ファイルを作る。（xxxには、個人と会社用で適宜命名）
id_rsaファイル増えるので~/.ssh/以下にgithubフォルダを作った。

vi ~/.ssh/config

```
Host github-xxx
    HostName        github.com
    IdentityFile    ~/.ssh/github/xxx_rsa
    User            git
Host github-xxx
    HostName        github.com
    IdentityFile    ~/.ssh/github/xxx_rsa
    User            git
```

* ポイント２
以下のようにgithub-xxxを指定する。

git remote add origin github-xxx:githubUserName/repository
dotinstall を見て

# はじめに
dotinstall見ていて、構成を図で説明している以下のような場面がありますが↓

![スクリーンショット 2015-08-14 10.40.48.png](https://qiita-image-store.s3.amazonaws.com/0/56251/d2851cb7-e6ef-0ea5-ee5b-19c387d8ea86.png)

個人でちょろっとした説明に使う用に＾＾；

似たようなしっかりしたサービスは以下のサイトもあります。
http://blog.mb.cloud.nifty.com/?p=2869

今回のちょろっとしたHTMLソースは以下
``` javascript:sample

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>draggable</title>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
	<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.0/jquery-ui.min.js"></script>
</head>
<body>
	<style type="text/css">
	body {
		display: table;
		border-collapse: separate;
		border-spacing: 10px 0;
		background: #99ccff;
	}
	div{
		display: table-cell;
		vertical-align: middle;
		text-align: center;
		width: 100px;
		height: 100px;
		background: coral;
		border-radius: 10px;
	}
	div.text{
		background: none;
	}
	</style>
	<div>サーバー1</div>
	<div>サーバー2</div>
	<div class="text">ファイル</div>

	<script type="text/javascript">
	$(function() {
		$('div').draggable();
	});
	</script>
</body>
</html>
```
An error occurred while installing rmagick (2.15.4




bundle install するとよくでるこいつら

```
An error occurred while installing rmagick (2.15.4), and Bundler cannot continue.
Make sure that `gem install rmagick -v '2.15.4'` succeeds before bundling.

```

sudo yum -y install ImageMagick ImageMagick-devel


```
Bundle complete! 33 Gemfile dependencies, 105 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
```

だいたいこういうのは
`なんちゃらdevel`をいれればOK
xargsでunix文化に触れてみる

unix文化的には小さな働きをする複数のコマンドをつなぎ合わせて成果を出すわけですが、そんな時に大活躍するのがxargs

manを見てみると

```man
NAME
     xargs -- construct argument list(s) and execute utility

SYNOPSIS
     xargs [-0opt] [-E eofstr] [-I replstr [-R replacements]] [-J replstr] [-L number] [-n number [-x]] [-P maxprocs]
           [-s size] [utility [argument ...]]

DESCRIPTION
     The xargs utility reads space, tab, newline and end-of-file delimited strings from the standard input and executes
     utility with the strings as arguments.

     Any arguments specified on the command line are given to utility upon each invocation, followed by some number of the
     arguments read from the standard input of xargs.  The utility is repeatedly executed until standard input is
     exhausted.
```


ようは
**引数のリストを受け取って、コマンドに渡して処理させる**
です。


ある条件に該当するファイルを消したい場合

```sh
find ./ -name "*.bak" | xargs rm -f
```



以下でもいいんですが、経験上めちゃくちゃ時間がかかります。ファイル一個づつ消すためですね。

```sh
find ./ -name "*.bak" -exec rm {} \;
```


応用範囲は無限です。
ぜひこの機会に使ってみてください。
Jenkins 2.0 alpha をためす

Jenkins 2.0 alpha が公開されたため、早速試してみました。
http://jenkins-ci.org/blog/2016/02/29/jenkins2-alphas/

# 環境

- Jenkins 2.0 alpha 2
- Java 1.8.0_66

```
$ java -version
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)
```

# セットアップ

ダウンロードして、実行します。
なお、[ダウンロードページ](http://jenkins-ci.org/2.0/) (2016-03-01 時点) はところどころリンク切れを起こしているので、ここで正しいリンク先を列挙しておきます。

| パッケージ      | ダウンロード URL | 
|----------------|-----------------|
| war            | http://mirrors.jenkins-ci.org/war-rc/2.0/jenkins.war |
| Windows        | http://mirrors.jenkins-ci.org/windows-rc/jenkins-2.0.zip |
| Ubuntu/Debian  | http://pkg.jenkins-ci.org/debian-rc/binary/jenkins_2.0_all.deb |
| Red Hat/Fedora | http://pkg.jenkins-ci.org/redhat-rc/jenkins-2.0-1.1.noarch.rpm |
| Mac OS X       | http://mirrors.jenkins-ci.org/osx-rc/jenkins-2.0.pkg |
| openSUSE       | http://pkg.jenkins-ci.org/opensuse-rc/jenkins-2.0-1.2.noarch.rpm |

war ファイルですが、`java -jar` コマンドで起動できます。

```
wget http://mirrors.jenkins-ci.org/war-rc/2.0/jenkins.war
java -jar jenkins.war
```

これまでの Jnekins 同様、8080 ポートで起動します。

```
$ java -jar jenkins.war
Running from: /opt/lib/jenkins/jenkins.war
webroot: $user.home/.jenkins
Mar 01, 2016 5:20:49 PM org.eclipse.jetty.util.log.JavaUtilLog info
INFO: Logging initialized @437ms
Mar 01, 2016 5:20:49 PM winstone.Logger logInternal
INFO: Beginning extraction from war file
Mar 01, 2016 5:20:49 PM org.eclipse.jetty.util.log.JavaUtilLog warn
WARNING: Empty contextPath
Mar 01, 2016 5:20:49 PM org.eclipse.jetty.util.log.JavaUtilLog info
INFO: jetty-9.2.z-SNAPSHOT
Mar 01, 2016 5:20:49 PM org.eclipse.jetty.util.log.JavaUtilLog info
INFO: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet

...
```

# 動作確認

見慣れたとおり、以下の URL で公開されます。
http://localhost:8080/

<img width="959" alt="1_スクリーンショット 2016-03-01 16.11.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/f236fc9f-2a43-1b83-6a99-7c295a48c632.png">

初回アクセス時には、インストールする Plugin の選択を求められます。
[Start with recommended plugins] を選び、おすすめの Plugin 構成ではじめてみます。

<img width="959" alt="2_スクリーンショット 2016-03-01 16.11.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/01394744-150a-eeff-74d4-e8078bf25096.png">

Plugin のインストールがはじまりました。
完了するまでしばらく待ちます。

<img width="1010" alt="3_スクリーンショット 2016-03-01 16.20.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/e1fbf663-9c73-a246-b61c-9a35e8dbb024.png">

セットアップが完了しました。
いつもどおりの Jenkins ですね！

2.0 とはいったい。。。
RealsenseSDKとWEBカメラの顔認識結果をUnityで利用する

# はじめに
LeapMotionを買ってキャラクターの腕を動かせた
↓
顔もFaceRigみたいにキャラクターに反映させたい
↓
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">眠い <a href="https://t.co/sbYmHbjMpS">pic.twitter.com/sbYmHbjMpS</a></p>&mdash; アキヒロ (@akihiro01051) <a href="https://twitter.com/akihiro01051/status/703998000297676800">2016年2月28日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

普通のWEBカメラを用いてUnity上のキャラクターに顔の動きを反映させます．
Unityでは一部有料のアセット(FinalIK)を利用していますが，顔を認識させるだけなら必要ありません．
今回はRealsenseSDKからの顔認識情報をUnityにもってくるまでの紹介をします．

# 準備
## 使用ツール
- WEBカメラ
- Unity 5.3.1
- VisualStudio2015
- [Intel Realsense SDK R4](https://software.intel.com/en-us/intel-realsense-sdk)
- ([FinalIK($90)](https://www.assetstore.unity3d.com/jp/#!/content/14290))

## RealsenseSDK
Intelによる音声認識，顔認識，3Dスキャンなどを提供しているSDKです．
Realsenseカメラを接続しないと利用できない機能もあるが一部機能は通常のカメラで動作します．
今回は顔認識機能を利用．

## プラグインの作成
SampleにあるC#のFaceTrackingでは通常のWEBカメラは利用できませんでした．
C++のデモでは利用可能だったので，C++のdllプラグインを作成してUnityと連携させます．
通常のカメラでは顔の位置と大きさ(Detection)，顔の特徴点(Landmark)，表情の一部(Expression)を取得可能．
今回はキャラクターに反映させる情報として，顔の位置と回転と表情を取得．
顔の位置はDetectionから取得し，顔の回転に関してはLandmarkから自力で計算させています．

ソース[GitHub](https://github.com/akihiro0105/RealsenseSDK_FaceTracking_dll)

# Unityとの連携
作成したdllをUnityの/Plugins/x86 or x86_64フォルダにそれぞれ移動し，dllの情報を取得するコードを作成します．

プラグインとサンプルのコードを同梱したファイルを以下に置いておきます．
[unitypackage](https://www.dropbox.com/s/7tt35lnk26ufm2x/RealsenseSDK_FaceTracking.unitypackage?dl=0)

## 動作デモ
とりあえず箱になりきる．
![unity_demo.png](https://qiita-image-store.s3.amazonaws.com/0/86283/0b0c310d-b07c-f056-c50a-8a8ae04673fb.png)

unitypackageをUnityにインポートしたらFaceTrackingフォルダにsampleがあります．
実行前にカメラデバイスの下図の赤ラインのデバイス番号を設定しておく必要があります．
Realsense R200,F200などdepthセンサを内蔵している場合にはデバイス名がcolorのものを選択してください．
![unity_demo2.png](https://qiita-image-store.s3.amazonaws.com/0/86283/b71cf16e-5120-34be-e931-a1470211b2bc.png)

次回 : [RealsenseSDKとWEBカメラでキャラクターになりきる](http://qiita.com/akihiro01051/items/ace3a2bfd655c764caf3)
AndroidStudioでデバッグモード中にBitmapを画像で確認する方法


## やりかた
デバッグモードにしてBitmapの取得が終わった後などにVariablesから下記の場所をクリックするだけ！
![DynamicDrawableSpan_java_-_couples-android_-____dev_eure_android_couples-android__-_Android_Studio_2_0_Beta_4.png](https://qiita-image-store.s3.amazonaws.com/0/9143/a0339036-8a38-ec97-e788-22153c05eec8.png "DynamicDrawableSpan_java_-_couples-android_-____dev_eure_android_couples-android__-_Android_Studio_2_0_Beta_4.png")

どんな画像なのかすぐに分かる！
![スクリーンショット 2016-03-01 17.55.19.png](https://qiita-image-store.s3.amazonaws.com/0/9143/f8e5999b-353a-b06e-90fd-3df456d90ecc.png "スクリーンショット 2016-03-01 17.55.19.png")

## 環境
僕の環境です。
![スクリーンショット 2016-03-01 17.37.14.png](https://qiita-image-store.s3.amazonaws.com/0/9143/079d17af-3a4a-942e-0b66-7bc7b70aa462.png "スクリーンショット 2016-03-01 17.37.14.png")
(実はだいぶ前からできたらしい AndroidToolsProjectSite[Android Studio 0.8.7 Released](http://tools.android.com/recent/androidstudio087released))
Console.WriteLineとDebug.Printの違い

###Console.WriteLine  

現在の行終端記号を標準出力ストリームに書き込みます。
 → 「出力」ウインドウの「デバッグ」

###Debug.Print 

Listeners コレクションのトレース リスナーにメッセージを書き込み、続けて行終端記号を書き込みます。
→ 「イミディエイト」ウインドウ
経営者の僕が日本のエンジニアが生き残る為に必要だと思うこと

先にお話すると、完全に僕的な理論なんで参考までに見てもらえればと思います！

## ◆日本の現状として
現状として、日本には1000兆円の借金があります。
それに伴い、何故日本という国がそれだけの借金があるのに破綻していないかと言うと、銀行から国債を発行しながら借金をしているからです。

つまり、銀行に預けている国民の貯金で借金を賄っている為、日本内で借金を埋められている現状があるので日本国としては赤字になっていません。

ただし、国民が銀行に預けている総資産が1400兆と言われていて、借金が1000兆なので、残400兆円しか賄えません。
※時間にするとあと15年ぐらいでお金が足りなくなります
参考（日本借金時計）：http://www.takarabe-hrj.co.jp/clockabout.html

そーなると、日本国として赤字になるので紙幣の価値（信頼）が無くなりハイパーインフレが起こると言われています。
※IMFに加盟している現状があるので、破綻する前に対策される説もありますが国民の生活は圧迫されると予測されます
参考（国際通貨基金）：http://www.imf.org/external/japanese/

世界的に見たときに、スラム街が無い国というのは日本ぐらいなもので、仮に日本が国家破綻したとしても世界的にみたら普通の話ではあります。

## ◆予測される未来として
とは言え、日本と言う国が破綻してみんながホームレスになると言う事はないでしょうが、日本の紙幣価値が下がると日本の労働力が世界的に見て安くなるので、労働力として外資の企業に日本の企業がM＆Aされる未来が予測されます。

そーなったら、安い賃金で労働力として生活の為に働く連鎖から抜けられなくなります。
また、少子高齢化で年金制度が崩壊しているので、外国人の受け入れが促進されてくると思われますが、外国から出稼ぎにきた人たちは安い賃金でも頑張って働いてくれるので、労働条件は外国人と同じラインで働かないといけなくなるでしょう。

## ◆今後の対策として
その為に、日本でしか出来ない職業では生き残りにくい事になると思われます。

だからこそ、エンジニア（技術）が生き残る方法論の一つになってくるのはないでしょうか？

我々の世代（20代）は義務教育でプログラムを勉強できなかった残念な世代です。そんな僕たちでも生き残る術を身につけるとしたら技術を勉強できる環境があることだと僕は考えています。

また、技術は日進月歩で日々進化していきます。COBOLが最先端だった時期もあれば、flash職人が話題になった時期もあります。
一つの環境に身ををおいて、会社が求めるスキルを執行していくスタイルだと、運が良くなければ生き残れません。

今後エンジニアに大切なのは、SESのように時代にあった技術にスキルレベルに応じて触れて働ける環境、そして技術を手札の一つとして用途に合わせて言語を切り替えられるベースの概念理解と、柔軟性です。
※よく勘違いする人がいますが、SESは派遣ではありません。大手のクライアント先ではセキュリティの兼ね合いとリスクヘッジの為に開発現場を社内にして、責任追及をできる環境を作るために会社間の契約をします（フリーランスでは責任追及しにくいため）

ブランドを大切にする日本企業では、実際に出来るスキルよりも、どれだけ大手で働いてきたキャリアを大切にする企業ばかりだと思います。
※投資家は最新の技術より経験を信頼するからです（良い大学に入ったら良い企業に行ける理由は、勉強したことを活かせるって話ではなく、学歴を培った努力が信頼に代わり『勉強する術が身についてる』と判断して雇用しているからです）

何が言いたいかっていうと、自分的に仕事が出来るって思えることよりも、日本社会がどーなっていて、周りにどー判断されてるのか？そしてどんな振る舞い方をすれば勝てるかを考えられた方が絶対勝てるよ！って話です。

## ◆おまけ
技術者として生きていく事は素晴らしい事です。大学院を出てコンピューターサイエンスを身につけて、外資系企業とかで実力で生き残ってくって思わなくても、社会と上手に付き合えば十分生き残れます。

とは言え、日本の紙幣（円）で持っておくのは微妙だと思われます。貯金が無くても積立とかで海外（安定している国）の保険商品とか（外貨）に変換して、将来的な資産を作っておくのがいいでしょう！
※僕の会社では従業員にもそんな福利厚生を考えています

最後に、どんな人生を歩んでいくかは自由ですが、幸せになることよりも不幸せにならない事が最も大切であり、社会で生き残るってのは最低限クリアしないといけないラインだと思います。
仕事というのは辞められない部活みたいなもんなんで、レギュラーになれなかったじゃ洒落にもならないっすｗ頑張っていきましょう！

株式会社Gizumo
副社長 高橋将一
http://gizumo-inc.jp/
rspecでredshiftのテストデータを作る

rspecでredshiftのデータを使ったテストをするときに、テストデータの作成方法をメモしておきます。
より良い方法があれば、教えて下さい！

今回はredshiftにデータがすでにあったので、それを参考に作る
redshift
`unload ('select * from table_name) to 's3://xxx-spec/table_name/' credentials 'aws_access_key_id=xxxxx;aws_secret_access_key=xxxx';
`

テストデータとして使えそうなデータをピックアップ&追記
bash
`aws s3 cp s3://xxx-spec/table_name/ . --recursive
vi 0000_part_00
aws s3 cp 0000_part_00 s3://xxx-spec/table_name/
`

```lang:redshift.rb
require 'rails_helper'

class Redshift < ActiveRecord::Base
  config_redshift = YAML.load(ERB.new(File.read('config/redshift.yml')).result)[Rails.env]
  establish_connection(config_redshift)

  def self.query(sql)
    self.connection.execute(sql)
  end
end
```

```lang:hoge_rspec.rb
require 'rails_helper'

RSpec.describe Hoge do
  describe "#test" do
    before :all do
      @user = FactoryGirl.create(:user)
      @user.create_redshift # schema作成
      Redshift.query("copy test_table_name from 's3://xxx-spec/table_name/' credentials 'aws_access_key_id=#{ENV[AWS_ACCESS_KEY_ID]};aws_secret_access_key=#{ENV[AWS_SECRET_ACCESS_KEY]}'") # データ投入
    end
  end
end
```

現在のプロジェクトではredshiftのテーブル毎にModelを作ってないが、Modelを作ったらFactoryGirlとか使えるかもと思っています。
Rubyで文字列を分割してN番目をnil安全に取得する


例えば、`岸辺　露伴`という名前の文字列を渡されて、これを姓名に分割するとします。

この文字列は **ルール** として、姓名の間に全角スペースが入るものとします。

何も考えずにやると、

```ruby
name = '岸辺　露伴'
last, first = name.split('　')[0], name.split('　')[1]
=> ["岸辺", "露伴"]
```

とかやっちゃいます。
でもこのルールが守られていない汚れデータが入ってくると、

```ruby
name = 'ファニー・バレンタイン'
last, first = name.split('　')[0], name.split('　')[1]
=> ["ファニー・バレンタイン", nil]
```
nilっちゃったよ。

まぁ汚れたデータのほうが悪いんですが、こういうパターンも安全に倒したいなと思ったので、以下のようにしました。

```ruby
class String
	def split_get(pattern, index, limit = -1)
		self.split(pattern, limit)[index].presence || ''
	end
end
```

`presence`を使わないなら

```ruby
class String
	def split_get(pattern, index, limit = -1)
		str = self.split(pattern, limit)[index]
		str.nil? ? '' : str
	end
end
```

これなら

```ruby
name = 'ファニー・バレンタイン'
last, first = name.split_get('　', 0), name.split_get('　', 1)
=> ["ファニー・バレンタイン", ""]
```

nilじゃなく空文字で帰ってくるので、`NoMethodError`とかならない。

瑣末なことだけど、こういうオプションもあったほうが便利だよね、ということで。。

# 追記
コメントで[Array#fetch](http://docs.ruby-lang.org/ja/search/class:Array/query:fetch/version:2.3.0/)を教えてもらいました。

やっぱり車輪は作る前から存在しているもんだね