OmniAICreator/Qiita-1.07M huggingface dataset:
PythonからMeCab（とCaboCha）を使うまで


## 環境
Mac OS 10.9.4
Python 2.7

## Cabochaのインストール
CaboChaを使うのにはMeCabが必要

### CRF++のインストール
執筆時での最新版は 0.58
http://crfpp.googlecode.com/svn/trunk/doc/index.html#download

解凍して

```bash
$ cd CRF++-0.58
$ ./configure
$ make
$ make install

$ cd python
$ sudo python setup.py install
```

### MeCabのインストール

執筆時での最新版は 0.996
https://code.google.com/p/mecab/

Downloadsから

 - mecab-0.996.tar.gz（mecab本体）
 - mecab-python-0.996.tar.gz
 - mecab-ipadic-2.7.0-20070801（辞書らしい）

をダウンロード，解凍．

```bash
$ cd mecab-0.996
$ ./configure
$ make
$ sudo make install

$ cd ..
$ cd mecab-python-0.996
$ sudo python setup.py install

$ cd ..
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure
$ make
$ sudo make install
```


```Python.h: そのようなファイルやディレクトリはありません```
とか言われた場合は
```sudo apt-get install python2.7-dev```

動かしてみる

```bash
$ mecab
坂本ですが
坂本?	????,????,*,*,*,*,*
??	̾??,??ͭ̾??,?ȿ?,*,*,*,*
??が	????,????,*,*,*,*,*
EOS

```

文字化けしている．辞書の文字コードがデフォルトだとutf-8じゃないらしい．

mecab-ipadicのディレクトリに移動して，UTF-8にでコンフィグしなおしてみる．
make cleanしてからconfigureしなおすようにする

```bash
$ make clean
$ ./configure --with-charset=utf8
$ make 
$ sudo make install
```

Ubuntuとかで
```libmecab.so.2: cannot open shared object file: No such file or directory```
とか言われたら、
```sudo ldconfig ```
とすればいいっぽい

使ってみる．

```bash
$ mecab
坂本ですが
坂本	名詞,固有名詞,人名,姓,*,*,坂本,サカモト,サカモト
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
が	助詞,接続助詞,*,*,*,*,が,ガ,ガ
EOS
```

直った．


ちなみに，mecabの設定はmecabrcに書いてある．

```bash
$ sudo find / -name "mecabrc"
/usr/local/etc/mecabrc
$ sudo emacs /usr/local/etc/mecabrc
```

デフォルトだとこんな感じになっていた

```mecabrc
;
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
dicdir =  /usr/local/lib/mecab/dic/ipadic

; userdic = /home/foo/bar/user.dic

; output-format-type = wakati
; input-buffer-size = 8192

; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n
```

dicdirってのが辞書データのディレクトリらしい．

### CaboCha のインストール
執筆時の最新版は 0.68
https://code.google.com/p/cabocha/

Downloadsからcabocha-0.68.tar.bz2をダウンロード，解凍して

```bash
$ cd cabocha-0.68
$ ./configure
$ make
$ sudo make install

$ cd pythin
$ sudo python setup.py install
```

## MeCabで形態素解析してみる

### pythonでの動作確認

``` python
import MeCab
mt = MeCab.Tagger("-Ochasen")
print mt.parse("坂本ですが")
```

```output
坂本	サカモト	坂本	名詞-固有名詞-人名-姓		
です	デス	です	助動詞	特殊・デス	基本形
が	ガ	が	助詞-接続助詞		
EOS
```

### 品詞とか見る

なんか文字コードとかかなり気をつけないと行けないようでめんどうである．

```python
# coding: utf-8
import MeCab

mt = MeCab.Tagger("mecabrc")
res = mt.parseToNode("坂本ですが")

while res:
	print res.surface
	print res.feature
	res = res.next
```

```output

BOS/EOS,*,*,*,*,*,*,*,*
坂本
名詞,固有名詞,人名,姓,*,*,坂本,サカモト,サカモト
です
助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
が
助詞,接続助詞,*,*,*,*,が,ガ,ガ

BOS/EOS,*,*,*,*,*,*,*,*
```

res.featureを","でsplitしてる実装が多かったけどそうるすしかないのかしら．まあ問題なさそうなのでそうしてみる．

```python
# coding: utf-8
import MeCab

mt = MeCab.Tagger("mecabrc")
res = mt.parseToNode("坂本ですが")

while res:
	print res.surface
	arr = res.feature.split(",")
	print "品詞: " + arr[0]
	res = res.next
```

```output

品詞: BOS/EOS
坂本
品詞: 名詞
です
品詞: 助動詞
が
品詞: 助詞

品詞: BOS/EOS
```

res.next じゃなくて res = res.next ってしないと当然無限ループする。Javaとか使ってるとハマる。

## CaboChaを使ってみる

のを使ってみたらまた書きます．
Kinoma Create: pin-explorer


今日、[Kinoma Create の facebook](https://www.facebook.com/kinoma)を覗いたら、[pin-explorer](http://kinoma.com/develop/docs/pin-explorer/) というのが、紹介されていました。

１月２０日にアップデートが来ると言っているが、今のところきていないみたい。[先月のアップデート](http://forum.kinoma.com/discussion/123/kinoma-software-update-december-16-2014)と同じ模様。
 
Kinoma Software: 6.1.326 
Firmware (OS): 1.1

先日、アナログの値を覗けて喜んでおりましたが、アナログ値だけでなく、デジタル値やI2Cもなんのプログラムも必要なく簡単にテストできる代物のようです。

というわけで、画面はこんな感じ。Analog値の様子の観測がきれいな感じでできたり、

![kobito.1421747875.329337.png](https://qiita-image-store.s3.amazonaws.com/0/60968/3935f109-0258-2648-59ca-fed533182891.png "kobito.1421747875.329337.png")


プログラムなしで、I2Cデバイスともお話できちゃうようです。
![kobito.1421748024.770537.png](https://qiita-image-store.s3.amazonaws.com/0/60968/1facea49-537d-3f8c-c761-a757554c2518.png "kobito.1421748024.770537.png")

http://kinoma.com/develop/docs/pin-explorer/  より引用すると。

```Text:英語引用
Makers sometimes turn to hardware test tools like an oscilloscope, a signal generator, or a volt-meter, or Linux command line tools to check their wiring and explore components. Pin Explorer provides many of the same capabilities in a unique visual application built into Kinoma Create.
```

```Text:勝手に日本語訳
メーカーズは、オシロスコープのようなハードウェアのテストツールや、シグナルジェネレータ、電圧計器、そして Linuxコマンドを切り替えて、配線やコンポーネントをチェックしてきました。Pin Explorerは、これらと同様の機能の多くを Kinema Create 上に構築されたユニークなビジュアルアプリケーションで提供するものです。
```

これは素晴らしい！
これはもう IoTのオシロスコープといえるものではないでしょうか？
ヘイ！ブラザー！！！　俺は、まさしくこういうのを待っていたんだぜ！

##追伸：
スイッチサイエンスさんでも紹介されておりました。
http://mag.switch-science.com/2015/01/22/kinoma_create_pin_explorer/
macsbugさんのところでも紹介されています。
https://macsbug.wordpress.com/2015/01/22/kinoma-studio-ver-1-3-33-3-pin-exploler/
VagrantにTeratermマクロで接続する

Windowsで `vagrant ssh` をしたいとき、cygwinやmingwなどを使いますが昔馴染みのTeratermでVagrantマシンに接続したい場合もあるかと思います。（ログをとりたいなど。）
そんなときに使えるTeratermマクロを紹介します。

まずは `vagrant up` でvagrantを起動したあと、sshの情報を取得します。

```
> vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile e:/vagrant/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
```

`Port`と`IdentityFile`をメモしておきます。
特にVagrant 1.7からは`IdentityFile`の場所が変わりました。

以下がTeratermマクロです。

```vagrant.ttl
; Vagrant macro

; this file path
getdir dir

; teraterm.iniの絶対パスを指定します。ここではマクロファイルと同じフォルダに置いています。
inifile=dir
strconcat inifile '/teraterm.ini'

; portを指定します。上で取得したPortの値に書き換えます。
port=2222

; private keyを指定します。上で取得したIdentityFileの値に書き換えます。
keyfile='e:/vagrant/.vagrant/machines/default/virtualbox/private_key'

sprintf2 constr 'localhost:%d /F=%s /ssh /2 /auth=publickey /user=vagrant /keyfile=%s' port inifile keyfile

connect constr
```

以上です。
ttlファイルにTeratermマクロが関連付けられているとダブルクリックでTeratermが起動し、Vagrantマシンに接続されます。
go-modeでerrをハイライトしておくと捗る

以下を参考にした
http://yuroyoro.hatenablog.com/entry/2014/08/12/144157

highlight-regexpを使って以下のような感じで。
errは文字列でマッチするとerrorsとかも対象になってしまうので、単語でマッチさせましょう。

```elisp
(add-hook 'go-mode-hook (lambda ()
			  (highlight-regexp "\\<err\\>" 'hi-red-b)))

```

なかなか良い。

![test_go.png](https://qiita-image-store.s3.amazonaws.com/0/44152/b812fcbf-305f-53e6-445a-71779695c197.png)
自然数の分割を辞書式順序ですべて書き出す関数を書いてみた

初めての投稿です．Markdown記法も初めて使います．Rubyの上達のためにQiitaを始めました．よろしくお願いします．

$7=3+2+1+1$という7の分割を`[3,2,1,1]`という配列で表現することにする．
このとき，自然数$n$の分割を(配列の配列として)辞書式順序ですべて書き出す関数を書いてみた．

```ruby:split.rb
def split(n)
	result=[[n]]
	return result if n==1
	(1..n-1).each do |i|
		y=[]
		z=split(i).delete_if{|x| x.max>n-i}
		z.each do |x|
			y.push(x.insert(0,n-i))
		end
		y.each do |j|
			result.push(j)
		end
	end
	return result
end

p split(6)
 #=>[[6], [5, 1], [4, 2], [4, 1, 1], [3, 3], [3, 2, 1], [3, 1, 1, 1], [2, 2, 2], [2, 2, 1, 1], [2, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]]
```
配列として出力したので，`split(n).length`とすることで$n$の分割数がわかる．ただし，分割をすべて求めるという経路をたどっているため，分割数を求めるプログラムとしては遅いと思われる．
git+gulp+jsbeautifier

## やりたいこと
* node.jsで開発時にgitのリモートリポジトリにpushする前にgulp経由でJS Beautifierをしている
* ファイルが多くなってくると時間がかかる(大体1分〜2分)
* 修正したファイルはせいぜい2,3ファイルなので、それだけbeautifyしたい

## やりかた
* gulp-jsbeautifierとgulp-gitで、commitする前のファイルにJS Beautifierを実行する
* この方法だとcommit -> js beautifier -> rebase -> pushという方法ができない

```gulpfile.js
var gulp = require('gulp');
var prettify = require('gulp-jsbeautifier');
var log = require('gulp-print');
var git = require('gulp-git');

gulp.task('default', function() {
  console.log('run task');
});

gulp.task('jsbeautify', function() {
  // lib以下にコードが入っている
  git.exec({
    args: 'diff --name-only HEAD ./lib/*.js ./lib/**/*.js'
  }, function(err, stdout) {
    if (err) throw err;
    console.log(stdout);

    var files = stdout.split('\n');
    files.pop();
    jsbeautify(files);
  });
});

function jsbeautify(files) {
  if (files.length === 0) {
    console.log('no beautify file');
    return;
  }
  gulp.src(files, {
      base: './lib'
    })
    .pipe(log())
    .pipe(prettify({
      mode: 'VERIFY_AND_WRITE',
      config: '.jsbeautify'
    }))
    .pipe(gulp.dest('lib'));
}
```

## 結論
JenkinsとかのCIサーバにJS Beautifier -> test -> commit/push させたほうがいい。人がやるときは、最低限綺麗にしておけばいいんじゃないかなと思った
[android]appcompatをeclipseのプロジェクトに追加する方法


## 概要
appcompatをEclipseのプロジェクトに追加する方法の説明．

## 手順
1. EclipseでFile → New → Projectを選択
2. Android → Android Project from Existing Codeを選択して[Next]をクリック
3. Import Projectsのwindowが開くので，[Browse...]をクリック
4. android sdkがあるディレクトリを選択し，さらにextras/android/support/v7/appcompatを選択して[OK]
5. Import Projectsの[Finish]をクリックして選択完了
6. Package Explorerにappcompatが追加されていることを確認
7. EclipseでProject → Clean でcleanしてauto buildを走らせたら完了

## 利用方法
新規にAndroid Projectを立ち上げた時にLibraryとして利用できる

* Libraryに追加する方法
	1. Package Explorerで該当のフォルダを右クリック → Properties
	2. Androidを選択
	3. Libraryで[Add]をクリックしappcompatを追加
	4. [Apply] → [OK]で追加完了

* Java Build Pathに追加する方法
	1. Package Explorerで該当のフォルダを右クリック → Properties
	2. Java Build Pathを選択
	3. Projectsを選択
	4. [Add]でappcompatを選択し[OK]で追加完了
emacs で PHP CodeSniffer を使う (Windows)

## 概要

「emacs で PHP_CodeSniffer を使って CakePHP のコーディング規約の逐次チェックをする方法」なんていくらでも載ってるだろうと思ったら、意外と日本語の情報が少なかったのでメモします。

Windows 7 での設定方法を書きますが、後半の emacs 周りの設定は他の OS でも同じだと思います。

## 手順
### PHP のインストール

それすらまだだったので、そこから書きます。

1. http://windows.php.net/download/ から zip をダウンロード
  * 安定してそうなので VC11 x86 Thread Safe 版を落とした
1. zip ファイルを好きな場所に解凍
  * 参考サイトの例にならってCドライブ直下に展開 & `C:\php` にリネームした
1. 環境変数 `PATH` に今配置したフォルダのパスを追加
1. 同フォルダ内にある `php.ini-development` を `php.ini` にリネームしてコピー
  * `php.ini-development` は php の設定ファイルの開発環境向けスケルトン

以上が正しくできていれば、コマンドプロンプトで `% php -v` が実行できるはずです。

### pear のインストール

ruby でいう gem みたいなものを使えるようにします。

1. 先の php インストールフォルダ内に pear フォルダを作る
1. http://pear.php.net/go-pear.phar を pear フォルダにダウンロード
1. コマンドプロンプトで pear フォルダに移動し、先のファイルを php で実行
    * `% php go.pear.phar`
    * 全部デフォルトのまま or YES を選択
1. 出力結果に書いてある通りに pearPEAR_ENV.reg をダブルクリック

以上が正しくできていれば、コマンドプロンプトで pear フォルダから `% pear -V` が実行できるはずです。

### PHP_CodeSniffer と CakePHP のコーディングルールのインストール

* pear フォルダで以下を実行：

```
% pear channel-discover pear.cakephp.org
% pear install cakephp/CakePHP_CodeSniffer
```

この作業で PHP_CodeSniffer と CakePHP のコーディング規約 (Standard) が同時に入ります。むしろこうしないと PHP_CodeSniffer のバージョンが合わなくて詰みます。

以上が正しくできていれば、コマンドプロンプトで pear フォルダから `% phpcs -i` が実行できるはずです。使用できるルールとして CakePHP が含まれているはずです。

###  flymake-phpcs のインストール

emacs に flymake-phpcs をインストールします。package.el が入っていれば、 `M-x package-list-packages` を実行して、リストから flymake-phpcs を選べば簡単にインストールできます。詳しい方法やそれ以外のインストール方法はすいませんがググってください。

インストールできたら、 .emacs に以下の設定を追記します：

```el
(require 'flymake-phpcs)
(add-hook 'php-mode-hook 'flymake-phpcs-load)
(custom-set-variables
 '(flymake-phpcs-standard "CakePHP"))

(custom-set-variables
 '(flymake-phpcs-command "C:/php/pear/phpcs"))
```

php をCドライブ直下以外にインストールした人や、Windows 以外の人は適宜パスを修正してください。

以上で作業完了です。設定を再読み込みして php のコードを開いてみてください。適当に規約を破ると、そのあたりが赤っぽくなるはずです。動かない場合、もしかしたら別途 php-mode を入れる必要があるかもしれません。

## さらなる設定

[C++でプログラミングコンテストをする時用のflymakeの設定 - Qiita](http://qiita.com/awakia/items/5c97b02dcc3c7fd20279) を参考に、次のエラー箇所にジャンプするキーバインドを設定したり、ジャンプ時にエラーの原因をミニバッファに表示したりするととても便利です（C-e を上書きするのはさすがにキツいと思いますが・・・）。

## 参考

* [PHPインストールと初期設定(Windows)](http://www.phpbook.jp/install/)
* [PHP Code Snifferを使ってCakePHPのコーディング規約をチェックする](http://tech.basicinc.jp/CakePHP/2013/08/22/php_code_sniffer_cakephp/)
* [Windows版のPHPでPEARを使うためのメモ](http://sprint-life.hatenablog.com/entry/2014/02/24/150423)
[iOS]お手軽にノベルゲーム風UIを作成できるライブラリSRGNovelGameTextsの紹介


##SRGNovelGameTexts

以下のようなノベルゲーム風のUIをiOSでお手軽に実現できるライブラリを作ってみました。RPGでよくあるっぽい感じでテキストを出力したいときとか、ノベルゲーム的なアプリを作りたい場合に使うと役立つかもしれません。

![](https://dl.dropboxusercontent.com/u/461628/SRGNovelGameTextsPreview.gif)

##インストール
CocoaPodsを利用してる場合は下記でインストールできます。

```ruby:Podfile
pod 'SRGNovelGameTexts', '~> 0.0.2'
```

Podsを経由せず直接使いたい場合は、主導で以下のリポジトリのClassesディレクトリのファイルをプロジェクトに配置すれば動作するはずです。
https://github.com/kazu0620/SRGNovelGameTexts

##簡単な実装例
以下、シンプルな実装例。なお折り返し改行は、Viewの幅に応じて自動的に行われますので適宜調整くださいませ。

```objectivec:ViewController.m(Objective-Cの場合)
// テキスト出力用のViewを初期化
SRGNovelGameTexts *novelGameText = [SRGNovelGameTexts new];
novelGameText.frame = CGRectMake(0,0,100,100);
novelGameText.textColor = [UIColor blackColor];
[self.view addSubview:novelGameText];

// 出力したいテキストをセット
[novelGameText setDisplayText:@"Hello Novel Texts View"];

// 演出を再生開始
[novelGameText startDisplayingText];
```

もちろんSwiftから利用することもできます。Swiftから利用する場合は、`Bridging-Header.h`から`SRGNovelGameTexts.h`を`import`だけしておけば利用できます。
上のObjective-Cの例をSwiftに置き換えると以下のようになります。

```objectivec:ViewController.m(Swiftの場合)
/* Swiftバージョン */
// テキスト出力用のViewを初期化
let novelGameText = SRGNovelGameTexts()
novelGameText.frame = CGRectMake(0,0,100,100);
novelGameText.textColor = UIColor.blackColor()
self.view.addSubview(novelGameText)
        
// 出力したいテキストをセット
novelGameText.setDisplayText("Hello Novel Texts View")
        
// 演出を再生開始
novelGameText.startDisplayingText()
```

##変更できる値
startDisplayingTextを実行前にSRGNovelGameTextsの下記プロパティを変更することにより、各種調整を行うことが出来ます。

| プロパティ名 | 設定できる項目            |
|------------|--------------------------------|
| textColor  | 出力される文字の色 |
| font   | 出力される文字のフォント   |
| letterSpacing  | 文字間のスペースの大さ |
| lineSpacing   | 行間のスペースの大きさ   |
| stringDisplaySpeed  | 文字表示後に次の文字が表示しはじめるまでの長さ |
| stringFadeInSpeed   | 文字が表示されるときのフェード演出の長さ   |

##終了後のコールバック
```objectivec:ViewController.m
novelGameText.onAllTextDisplayed = ^{
    // 次のテキストを表示する、画面を遷移させるなどの処理
};
```

##その他の公開メソッド

```objectivec:ViewController.m
[novelGameText displayAllText];
```
演出中でも全ての文字を強制的に出すメソッドです。
タップのイベント取って早送り的な感じで使うと良いです。

```objectivec:ViewController.m
[novelGameText cleanup];
```
出力してる文字を一度全て消すメソッドです。cleanupしたあとに再度テキストをSetしてstartDisplayingTextすることで次のテキストを再び表示することが出来ます。前述のコールバックと一緒に使うことで、複数のテキストの順番に表示する、なども実現出来ます。

-----------
以上、ライブラリのご紹介でした！良きUI作成ライフを！
raspbianのdate

RaspberryPi (Type-B) にraspbian入れてみたけどdateがUTCで表示される感じだったので

http://qiita.com/azusanakano/items/b39bd22504313884a7c3
タイムゾーン変更これでできました。

$ date
2015年  1月 20日 火曜日 15:22:26 UTC

↓
sudo cp /etc/localtime /etc/localtime.org
sudo cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

↓
$ date
2015年  1月 21日 水曜日 00:31:46 JST

オケオケオッケー！
ConoHaオブジェクトストレージでメタデータをつけたファイルをWEB公開した時の挙動

## オブジェクトにメタデータをつける

ConoHaオブジェクトストレージでオブジェクトとしてファイルを上げる際にファイルにメタデータをつけることができます。

そのため暗号化されたファイルをオブジェクトとして上げる場合、復号化キーのようなものをつけることができます。

メタデータはHTTPヘッダー「X-Object-Meta-{任意の名前}」に加える形で紐づけが可能です。

```
bundle exec ruby chino.rb -m FILE_CONTROL_KEY:1234567890ABCDEF -s ~/Grahics/wtest2/go.jpg -d /hogehoge
upload_url -> https://objectstore-r1nd1001.cnode.jp/v1/098203482342/hogehoge/go.jpg
{
"Content-Type"=>"image/jpeg", 
"X-Auth-Token"=>"d402844f5bdd46a0aee716caaf623150", 
"X-Object-Meta-FILE_CONTROL_KEY"=>"1234567890ABCDEF"
}
http_status -> 201

```

上記でオブジェクトには「FILE_CONTROL_KEY="1234567890ABCDEF"」
という情報が紐づけられます。
ファイルを"1234567890ABCDEF"というキーで暗号化していた場合、このメタデータから復号化することが可能です。

通常のトークン経由のアクセスであればこの仕様で問題ありません。

しかし、このオブジェクトをWEB公開モードでWEB公開していた場合、このメタデータは果たして一般公開されるのでしょうか？

## オブジェクトをWEB公開したときメタデータは公開されてしまうのか？

```
$ curl -v https://objectstore-r1nd1001.cnode.jp/v1/98394824/go.jpg -O 
> GET objectstore-r1nd1001.cnode.jp/v1/98394824/go.jpg HTTP/1.1
> User-Agent: curl/7.37.1
> Host: objectstore-r1nd1001.cnode.jp
> Accept: */*
> 
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0< HTTP/1.1 200 OK
< Date: Tue, 20 Jan 2015 14:36:16 GMT
< Content-Type: image/jpeg
< Content-Length: 551367
< Connection: keep-alive
< Accept-Ranges: bytes
< Last-Modified: Tue, 20 Jan 2015 14:29:34 GMT
< Etag: 9876d66107098fef488e86225d941999
< X-Timestamp: 1421764173.86525
< X-Object-Meta-File-Control-Key: 1234567890ABCDEF
< X-Trans-Id: tx080a6f5fcaa14cd094614-0054be67e0
< 

```

・・としっかり、X-Object-Meta-File-Control-Keyの値が返却されるようになっていました。


## 解決策

オブジェクトに紐づけるメタデータをそのファイル自体の機密情報（たとえばファイル復号化キーや、ファイル削除を許可するキー）とする場合は、そのメタデータ自体を暗号化してひもづけるという手段で解決できます。
そうすることでHTTPヘッダーにその情報が流れても第三者がそのデータを復元することは困難な状態となります。
仮想IPを付けたいそんな時

仮想IPを付ける

    ip addr add <付けたいIP>/<プレフィックス長> brd <ブロードキャストアドレス> dev eth0

send_arp する

    send_arp <付けたいIP> <そのIPのMACアドレス> <伝えたい相手IP> ff:ff:ff:ff:ff:ff <デバイス名:eth0>

ff:ff:ff:ff:ff:ff は 255.255.255.255 みたいな感じで MAC アドレスのブロードキャストアドレス．
伝えたい相手 IP を持つ機器の MAC アドレスが何であっても send_arp を受けてくれるらしい．
send_arp は一定時間空けて複数回打つとよいらしい．
CでRedisにアクセスする

#概要
Redisの公式から出ているCのドライバを使って
Redisにアクセスするサンプルを作りましたので、そのソースと手順などを共有したいと思います。

#環境構築
CentOSを想定しています。

```bash
yum update -y
yum install -y git gcc wget vim
# yumからインストール可能にする
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm
yum --enablerepo=remi,epel install -y redis
# ライブラリのインストール
git clone https://github.com/redis/hiredis.git
cd hiredis
make
make install
```

##データベースの設定
テスト用のデータを入れます。

```bash
service redis start  # redisサーバ起動
redis-cli            # redisクライアント起動
# データ投入
set 1 aaa
set 2 bbb
set 3 ccc
exit                 # 終了
```

#Redisへアクセス
```c:redis.c
#include <stdio.h>
#include <stdlib.h>
#include <hiredis.h>

int main(void){
  redisContext *conn = NULL;
  redisReply *resp   = NULL;
  int loop           = 0;
  
  // 接続
  conn = redisConnect( "127.0.0.1" ,  // 接続先redisサーバ
                       6379           // ポート番号
         );
  if( ( NULL != conn ) && conn->err ){
    // error
    printf("error : %s\n" , conn->errstr );
    redisFree( conn );
    exit(-1);
  }else if( NULL == conn ){
    exit(-1);
  }
  
  // Valueの取得
  for( loop=1 ; loop < 4 ; loop++ ){
    resp = (redisReply *) redisCommand( conn ,          // コネクション
                                        "GET %d" , loop // コマンド
                                      );
    if( NULL == resp ){
      // error
      redisFree( conn );
      exit(-1);
    }
    if( REDIS_REPLY_ERROR == resp->type ){
      // error
      redisFree( conn );
      freeReplyObject( resp );
      exit(-1);
    }
    printf( "%d : %s\n" , loop , resp->str );
    freeReplyObject( resp );
  }
  
  // 後片づけ
  redisFree( conn );
  return 0;
}
```

##コンパイル、実行

```bash
gcc -Wall -o redis redis.c -lhiredis -L/usr/local/lib -I/usr/local/include/hiredis
```

このまま実行したい所だが私の環境ではライブラリが見つからない主旨のエラーが
出てしまったので対処します。

```bash
vi /etc/ld.so.conf.d/redis.conf/redis.conf  # 新規作成
# ファイル内容
/usr/local/lib  # 追記

ldconfig        # 設定反映
```

実行

```bash
./redis
1 : aaa
2 : bbb
3 : ccc
```
音声信号処理ライブラリ Essentia をMacにインストール

簡単なEssentiaの紹介とMacにインストールするときにハマったこと

# Essentia
http://essentia.upf.edu/

EssentiaはC++実装された音声信号や音楽としての情報の解析や処理を行うことが出来る総合的なライブラリです。
pythonのバインディングもあって触るのはそんなに難しくないです。
[Github](https://github.com/MTG/essentia)でソースも公開されています。

安定版のダウンロードは[こちら](https://github.com/MTG/essentia/releases)からできます


# インストール
https://github.com/MTG/homebrew-essentia

home brew で入ります。
手順は上記URLにありますが、以下でいけます。

```
brew tap MTG/essentia
brew install essentia --HEAD
```

# まとめ
音声処理が出来るEssentiaをMacにインストールするには homebrewが使えます。
便利になったなぁ！
yeomanでAngularJSを使用した時のエラー


## grunt serveを試みるも
以下の様なエラーが発生し、少し焦る。。。

```
・・・
Running "concurrent:server" (concurrent) task
    Warning: Running "compass:server" (compass) task
    Warning: You need to have Ruby and Compass installed and in your system PATH for this task to work. More info: https://github.com/gruntjs/grunt-contrib-compass Use --force to continue.
    
    Aborted due to warnings.
・・・
```

## 調べてみると
compassを導入することで解決するみたい。

```shell-session
$ gem install compass
```

上記コマンドから、compassをインストールしたのち、再び`grunt serve`を実行すると、正常に実行できましたっ！
Unityの2D座標系


いつも忘れるので図にした（間違ってるかも...；

![Unity2D座標系.png](https://qiita-image-store.s3.amazonaws.com/0/8219/b28e7d4a-5e13-8ae1-0d02-731791e02803.png "Unity2D座標系.png")
svn diff と diffstat で、変更,更新を考慮したSLOCを考える

新規アプリは単純に wc -l で行数(ステップ数)を数えれば良いですが、変更がある場合、単純にdiffを取得すると 差分は2行として数えられます。

で、diffstatのファイル毎出力の追加分と、削除分の多い方を合計すればよい気がします。
なんとなく...

```
$ svn diff -r 1144:1140 https://example.com/repos/xing/trunk | diffstat -f 4                                 
 lib/Xing/Model/Summary/HExportStream.pm |    9     3     6     0 +++------
 lib/Xing/Model/Summary/HJuchuu.pm       |   16     8     8     0 ++++++++--------
 tmpl/HSummary/SummaryList.html          |   12     6     6     0 ++++++------
 3 files changed, 17 insertions(+), 20 deletions(-)
```
1行目は、追加:3行 + 削除:6行 = 合計:9行　を表しています
ios 課金認証レシートの空in_appについて

```
{
   "status":0,
   "environment":"Production",
   "receipt":{
      "receipt_type":"Production",
      "adam_id":842291255,
      "bundle_id":"xxxxxxxxxxx",
      "application_version":"1",
      "download_id":85005636092973,
      "request_date":"2014-04-17 13:58:48 Etc/GMT",
      "request_date_ms":"1397743128187",
      "request_date_pst":"2014-04-17 06:58:48 America/Los_Angeles",
      "original_purchase_date":"2014-04-17 13:45:01 Etc/GMT",
      "original_purchase_date_ms":"1397742301000",
      "original_purchase_date_pst":"2014-04-17 06:45:01 America/Los_Angeles",
      "original_application_version":"1",
      "in_app":[

      ]
   }
}
```
iOS課金の認証時、こんレシートと合ったら、レシート自体は、OKですが、in_appが空なので、課金が発生していません。なので、in_appが空の場合、NGです。

下記は、apple　developerへの問い合わせと回答です。同じ悩みにあった方、ご参考ください。

*問い合わせ*

>
In my production environment, I get many receipt with empty in_app field like this from "https://buy.itunes.apple.com/verifyReceipt".
I want to know if it's ok to deal the empty in_app as an invalid purchase receipt.

>
I found the same question at here.
https://devforums.apple.com/message/959729#959729

>
Look forwarding with your answer.
Thank you.

*回答*
>
I’m responding to your questions regarding you finding that the validation of the universal app receipt shows that the in app array is empty - you asked - 
"I want to know if it's ok to deal this as an invalid purchase receipt.”
Response - first let me clarify, the validation of the receipt shows that this is a valid receipt - however, the fact that the in_app array is empty, indicates that the StoreKit has not recorded a transaction. If your app receives such a receipt upon a “successful” transaction, then before the application acknowledges the transaction (by calling finishTransaction), the app can indicate to the user that there appears to have been a problem with the receipt and ask to refresh the receipt. Upon agreement - the app can make the SKReceiptRefreshRequest method - wait for the response and check the receipt. 

>
If the universal app receipt continues to have an empty in_App array, no purchase has been processed by the StoreKit. Several responders to the developer forum posting you mentioned suggested that the app may have been running on a jailbroken device. That would be the only explanation I can think of at this time to cause this behavior. 

>
A different way to answer your question - I would not provide content until there is an item in the in_app array. However make sure to give the user a chance to refresh the receipt in the case that there was a network glitch.
Thunderbirdで返信すると引用文が消えてしまう問題（仕様です）

Thunderbirdで返信すると，これまであった引用文がなぜか消えてしまう，という問題に長らく悩まされていましたが，ようやく解決しました．

# 問題の所在

Hogeraさんから，以下のようなメールを受領したとします．

```
こんにちは．
さようなら．

-- 
Hogera Hogera <hoge@ra.jp>

> おはようございます．
> こんばんは．
> 
> ---- 
> Abra Cadabra <abra@ca.dab.ra>
```

それに対して，Abraさんは以下のようなメールで返信します．返信元のメールも全部引用したいと思っています．

```
きょう．
あした．
あさって．

---- 
Abra Cadabra <abra@ca.dab.ra>
```

しかし，Thunderbirdで返信すると，あるところから先が消えます．以下のように．

```
きょう．
あした．
あさって．

---- 
Abra Cadabra <abra@ca.dab.ra>

> こんにちは．
> さようなら．
> 
```

# 問題の原因は何か

この問題のポイントは2点です．

1. 引用文よりも前に署名を配置している．
2. 署名の先頭が'-- '（ダッシュ ダッシュ スペース）になっている．

Thunderbirdでは，この'-- 'を署名の先頭と見なして，それ以降の部分を引用する必要はないものとして，削除します．仕様です．

（参考：[解決済み] 署名のsig-dashの扱い）
http://forums.mozillazine.jp/viewtopic.php?t=7994

署名を（引用文も含めて）一番最後に配置すると，上記の「仕様」は期待通りの機能を果たしてくれるのですが，引用文よりも前に署名を配置する人が現れた瞬間に，そこから後ろの引用文が消えてなくなります．仕様です．

# どうすれば対処するか

'-- '以降が消えてしまうことが問題ですので，以下のように対処するのが良いでしょう．

1. 署名を（引用文も含めて）一番最後に配置する．
2. もしくは署名から'-- 'を取り除く．
3. 署名に'-- 'があって，引用文よりも前にある場合には，手動で引用したい部分をドラッグしてから返信する．
NTP vs Chrony速度測定

#Chronyとは
CentOS7でデフォルトのNTPとして利用されます。

```bash
### Chrony(NTP)の状況確認：
$ ntpq -q
　　⬇
$ chronyc sources
# もしくは
$ chronyc tracking
```

#速度測定

||<b>delay</b>|<b>offset</b>|<b>備考</b>|
|:-----------:|:------------:|:------------:|:------------|
|ntp|1.611 msec|1.702 msec|NTPサーバに接続する時間がおよそ1.611msec遅延<br>NTPサーバの時間より1.702msec遅れてることになります|
|chrony|0.001701 seconds|-0.000501043 sec|NTPサーバに接続する時間がおよそ1.701msec遅延<br>NTPサーバの時間より0.501msec進んでいることになります<br>なんという正確さ。。 |

```bash
### 測定方法
$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp1.jst.mfeed. 172.29.1.100     2 u    1   64    1    1.611    1.702   0.000
 ntp2.jst.mfeed. 172.29.2.50      2 u    -   64    1    1.809    2.605   0.000
 ntp3.jst.mfeed. .INIT.          16 u    -   64    0    0.000    0.000   0.000
 
$ chronyc tracking
Reference ID    : 210.173.160.27 (ntp1.jst.mfeed.ad.jp)
Stratum         : 3
Ref time (UTC)  : Thu Oct  9 07:50:02 2014
System time     : 0.000076833 seconds slow of NTP time
Last offset     : -0.000501043 seconds
RMS offset      : 0.000501043 seconds
Frequency       : 0.175 ppm fast
Residual freq   : 0.005 ppm
Skew            : 3.201 ppm
Root delay      : 0.001701 seconds
Root dispersion : 0.012275 seconds
Update interval : 65.2 seconds
Leap status     : Normal
```

#結果
chrony速い！正確！
windows用リソース情報取得バッチ

windows端末で走らせるとリソース情報を出力するバッチです。

XP は Pcinfo というソフトを使用していたのですが、VISTA以降では動かなかったのでバッチを作りました。
もっといい方法があるかと思いますが、とりあえずこれで対応しています。

http://web.loft-net.co.jp/lofttecs/bat_get_windows_resource/

最後の処理にメッセージボックスを出すためだけにWSHを使用しております。
CentOS6.5 ➡ Centos7にアップグレード

```bash
### 念のため、chkconfig --listを取っておきましょう！
$ yum update -y
$ reboot

$ vim /etc/yum.repos.d/CentOS-Base.repo
### 下記を追加
[upg]
name=CentOS-$releasever - Upgrade Tool
baseurl=http://dev.centos.org/centos/6/upg/x86_64/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
 
$ yum install -y openscap pcre-devel libxml2-devel libxslt-devel m2crypto python-simplejson
$ yum install -y mod_wsgi redhat-upgrade-tool preupgrade-assistant-contents

### 一覧を確認し、対象にアップグレード
$ preupg --list
$ preupg -s CentOS6_7
Do you want to continue? y/n  ###y
 
$ rpm --import http://ftp.plusline.de/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7
### ⬆を行わないと、下記のように怒られる
### Downloading failed:The GPG keys listed for the "CentOS-7.0 - Base" repository are already installed but they are not correct for this package. 
 
$ redhat-upgrade-tool-cli --network 7.0 --instrepo http://mirror.centos.org/centos/7/os/x86_64/ --force
Continue with the upgrade [Y/N]?  ### y
```
[WebGL] Three.jsで影を表示する



意外と設定がめんどくさいのでメモとして残しておきます。

ちなみに、実際に[動作するデモ](http://jsdo.it/edo_m18/hMQY)をjsdo.itに上げてあります。

## 影の有効化

```js:enabled-shadow
///////////////////////////////////////////////////////////////////////
// 各種、shadowのレンダリングに必要な設定を有効化

// ライトの影表示を有効化
light.castShadow = true;

// Boxの影を有効化
box.castShadow = true;

// 地面の影を受ける設定を有効化
plane.receiveShadow = true;

// レンダラーの影レンダリングを有効化
renderer.shadowMapEnabled = true;
```

### ライトとレンダラの影設定は必須

影をレンダリングするには、いくつかのオブジェクトの設定を有効化する必要があります。
まず必要なのがライトとレンダラの設定です。

`light.castShadow = true`と`renderer.shadowMapEnabled = true`の部分ですね。
このふたつは、オブジェクトがどうであれ設定が必要です。

### 影をレンダリングしたいオブジェクトの影を有効化

次に必要なのがオブジェクトごとの設定です。
ここで注意しないといけないのが、「影を落とす」ことと「影を受ける」ことは別物、ということです。
なのでそれぞれ`anObject.castShadow`（影を落とす）と`anObject.receiveShadow`（影を受ける）を個別に設定する必要があります。

つまり、影を落とすが影を受けない、というようなことも設定可能、ということです。


## コード全文

とりあえず動くコードを全文載せておきます。
ちなみに以下のコードはThree.jsのr70で動作確認しています。
が、基本的な考え方はどのバージョンでも同じです。

```js:shadow-on-threejs
(function () {
    'use strict';
    
    // カメラ作成
    var camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000);
    camera.position.set(100, 150, 300);

    // シーンを作成
    var scene = new THREE.Scene();

    // ライトを作成
    var light = new THREE.DirectionalLight(0x999999);
    light.position.set(100, 100, 100);


    // Boxを作成
    var box = new THREE.Mesh(
        new THREE.BoxGeometry(50, 50, 50),
        new THREE.MeshLambertMaterial({
            color: 0xaa0000
        })
    );
    
    // 地面用のPlaneを作成
    var plane = new THREE.Mesh(
        new THREE.PlaneGeometry(1000, 1000, 10, 10),
        new THREE.MeshLambertMaterial({
            color: 0xdddddd
        })
    );
    plane.position.y = -150;
    plane.rotation.x = -Math.PI / 2;

    // レンダラーを作成
    var renderer = new THREE.WebGLRenderer({
        antialias: true
    });

    renderer.setClearColor(0xffffff);
    renderer.setSize(window.innerWidth, window.innerHeight);
    
    // 各種オブジェクトをシーンに追加
    scene.add(light);
    scene.add(box);
    scene.add(plane);
    camera.lookAt(box.position);


    ///////////////////////////////////////////////////////////////////////
    // 各種、shadowのレンダリングに必要な設定を有効化

    // ライトの影表示を有効化
    light.castShadow = true;

    // Boxの影を有効化
    box.castShadow = true;

    // 地面の影を受ける設定を有効化
    plane.receiveShadow = true;
    
    // レンダラーの影レンダリングを有効化
    renderer.shadowMapEnabled = true;
    
    ////////////////////////////////////////////////////////////////////////
    
    document.body.appendChild(renderer.domElement);
    renderer.render(scene, camera);
}());
```
Typetalk x Node x Client Credential

書きかけのメモ

```coffeescript

#!/usr/local/bin/coffee

deferred = require 'deferred'
request  = require 'request'

reqDfd = (data) -> 
    dfd = deferred();

    request.post data, (error, response, body) ->
        dfd.resolve body

    return dfd.promise()


reqDfd {
    url: 'https://typetalk.in/oauth2/access_token',
    method: 'POST',
    form : {
        'client_id': 'xxxxxxxxxx',
        'client_secret': 'xxxxxxxxxx',
        'grant_type': 'client_credentials',
        'scope': 'topic.post,topic.read'
    },
    json: true
}
.then (body) -> 
    return reqDfd {
        url: 'https://typetalk.in/api/v1/topics/xxxxxxxxxx',
        method: 'POST'
        form: {
            'message': 'test'
        },
        headers: {
            'Authorization':'Bearer ' + body.access_token
        },
        json: true
    }
.done (body) -> 
    console.log body
```
ちょっと高度な正規表現を Ruby で試してみました

概要
----

最近の正規表現 (PCRE) はいろいろ拡張されていて、以前では考えられなかったほど高機能になっています ・・・ 

ということを最近になって知ったので、近年(?)導入された新しい機能を中心に、いろいろ試した結果をメモしました。

Ruby 1.9.3 と Ruby 2.1.5 を使いましたが、試した範囲では、両者に違いはないようでした。

このあたりの拡張仕様は、呼び出し元の言語やバージョンによっても実装レベルや細かい仕様が異なるため、以下はあくまで Ruby の場合、他の言語 (C#, Java Script, php, ...) でも似たようなことができることも、できないこともある、という方向でご理解ください。

目次
----

* フリーフォーマット / /x による正規表現の分かち書き
    * 文字クラスの中の # や空白はエスケープの必要がない 

* 名前付きグループ (?&lt;name&gt; )
    * MatchData へのインデックスは Symbol でも良い
    * 名前付きグループによるキャプチャを通常通り数値で参照することも可能
    * 名前無しグループはキャプチャしなくなる
    * 正規表現中では名前付きグループを数値で後方参照できない
    * 名前付きキャプチャの例
    * 同じ名前が複数回現れるときは最後のキャプチャを返す
    * 複雑な文字列を要素に分解 

* 相対的な後方参照 \k&lt;-n&gt;
    * 正規表現を結合するときに便利
    * MatchData へも負のインデックスを与えられる 

* 正規表現自体を後方参照 \g&lt;-n&gt;
    * サブルーチンのように使えます
    * 正規表現が複数回呼ばれたときの内部キャプチャ
    * 正規表現の再帰呼び出し 

* 条件付き正規表現 (?(n) )
    * 代替案 

本文はこちらです
----

 http://dora.bk.tsukuba.ac.jp/~takeuchi/index.php?%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%2Fruby%2F%C0%B5%B5%AC%C9%BD%B8%BD
composer実行時のUncaught exceptionエラー


いつも通り以下でcomposer入れて〜

```bash
curl -s https://getcomposer.org/installer | php
```

応答

```
#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: /Users/mymac/Sites/composer.phar
Use it: php composer.phar
```

ちゃんと入ったっぽいのにいざ実行してみると

```bash
php composer.phar
```

以下のエラー。

```
PHP Fatal error:  Uncaught exception 'PharException' with message 'phar "/Users/mymac/Sites/composer.phar" has a broken signature' in /Users/mymac/Sites/composer.phar:22
Stack trace:
#0 /Users/mymac/Sites/composer.phar(22): Phar::mapPhar('composer.phar')
#1 {main}
  thrown in /Users/mymac/Sites/composer.phar on line 22

Fatal error: Uncaught exception 'PharException' with message 'phar "/Users/mymac/Sites/composer.phar" has a broken signature' in /Users/mymac/Sites/composer.phar on line 22

PharException: phar "/Users/mymac/Sites/vcomposer.phar" has a broken signature in /Users/mymac/Sites/composer.phar on line 22

Call Stack:
    0.0006     228272   1. {main}() /Users/mymac/Sites/composer.phar:0
    0.0006     228368   2. Phar::mapPhar() /Users/mymac/Sites/composer.phar:22
```


原因は分かりません。
もう一回、

```bash
curl -s https://getcomposer.org/installer | php
```


からやり直すと治ります。
ファイルが壊れてたのかも。
iOS7で実行するとdescriptionForLayoutAttribute_layoutItem_coefficientエラーで落ちる


メインをiOS8でテスト、開発してて、さあ、iOS7でもと思った矢先実行すると、、

	'Unable to create description in descriptionForLayoutAttribute_layoutItem_coefficient. Something is nil'

というエラーが発生し、アプリが起動しないのでいろいろ調べてみた。Missingとかの警告は全てなおしてもだめ。一度リセットするという方法もあったけど、たくさんのItemがあるのでまたやり直すのは面倒ということでできるだけ壊さないように無駄な設定を削除して行ってみる。

そこで、ネットで調べてみると、Autolayoutで"First Baseline Alignment"を消すと直った人がいるようなのでやってみと、、、

起動した！
というわけで、同じようなエラーが出たら試してみてください。
MySQLでどんなクエリが流れているか知りたい

MySQL でどんなクエリが流れているか知りたい時には General Query Log が便利です．

  * [MySQL :: MySQL 5.5 Reference Manual :: 5.2.3 The General Query Log](http://dev.mysql.com/doc/refman/5.5/en/query-log.html)

使い方

    > show variables like 'general_log%';
    > SET GLOBAL general_log = 'ON';

`general_log_file` のファイル名でどんどん書かれていきます．
sshログインに失敗してもパケットステータスはESTABLISHEDになる

勘違いしてた
-------------

どうも攻撃をうけているようだったので、`/var/log/secure`をみたところ
sshにアタックして失敗していることを確認しました。

`last`コマンドで確認しても、不正ログインされた形跡はなかったので安心しましたが
`netstat -a | grep ssh`をすると、sshアタックをしていたIPアドレスの
ssh通信がESTABLISHEDになっていました。

これを見て、最初はsshを乗っ取られたと思いました。

**しかしこれは勘違いでした** :sweat: 

`lastb`コマンドは失敗したログインの情報を見るコマンドですが、これを見ると
`a`とか`b`とか、`test`とか、ありがちないろんなユーザでsshログインを試みて
いました。

いわゆるブルートフォースアタックというやつですが、僕のつくったユーザ名は
辞書にのっているようなものではないので、ブルートフォースアタックでやぶられる
はずがないなぁと思い、試しに、*hydra*というツールで実験的にsshブルートフォースアタックを
かけてみました。

すると、すべてログインに失敗しましたが、`netstat -a | grep ssh`で確認すると
ssh通信はESTABLISHEDになっていました。

まだまだわかってないなぁと反省しました。。。 :sweat: 

hydra検証内容
-------------

* user辞書を作成

```bash
$ cat user_list_10.txt
administrator
anonymous
corporatename
yamada
email
guest
root
testuser
uniqueid
user
```

* password辞書を作成

```bash
$ cat pass_list_10.txt
1234
address
adminpass
password
rootpass
qwerty
testtest
zipcode
abcde
pass1
```

* hydraをインストールし、実行

```bash
$ hydra -l user_list_10.txt -P pass_list_10.txt 攻撃対象hostのアドレス ssh
```

* 攻撃対象host上で確認

```bash
$ netstat -a |grep ssh
```
iPhoneのSMS(ショートメール)をqmailで受信できない

**今更qmail?** な意見はごもっともですが、仕様として決められちゃってる以上しょうがないという事でqmailを使っている訳で。
そんな中、後述の条件でsmsアプリからメールを送信すると、受信されない・qmail側にログさえ残らないという症状が起きた。
色々調べた結果、後述のような事が判った次第。

# 発生条件
+ softbank契約のiPhone
+ iPhoneのsmsアカウントからインターネットへメールを送信する
+ メール受信するドメインのメールサーバがqmail

# 何が悪いのか
smtpセッション中にcr, lfの改行コードを間違えて送るせいでqmailが反応しない。
なので、qmailのsmtpdにメールが届く前に改行コードを修復するツール(fixcrio)を使用する

# 対応方法
下記の様に、**/var/qmail/service/init.smtpd** を書き換える

```bash:/var/qmail/service/init.smtpd
/usr/local/bin/fixcrio /var/qmail/bin/qmail-smtpd /home/vpopmail/bin/vchkpw /bin/true 2>&1 | /var/qmail/bin/splogger qmail-smtpd &
```

スクリプトの最終行の先頭に、fixcrioを呼び出す処理を書くだけ。
R をインストールすると brew doctor に怒られるのを回避する


R for Mac OS X をインストールすると /usr/local/ に知らないものが入っていると Homebrew に怒られる。

```bash
$ brew doctor
...

Warning: Unbrewed dylibs were found in /usr/local/lib.
...

Unexpected dylibs:
    /usr/local/lib/libtcl8.5.dylib
    /usr/local/lib/libtcl8.6.dylib
    /usr/local/lib/libtk8.5.dylib
    /usr/local/lib/libtk8.6.dylib
```

警告が邪魔だからといって、ライブラリを削除したり移動したりすると当然 R で問題がでる。

```R
> install.packages("ggplot2")
--- Please select a CRAN mirror for use in this session ---
Error: .onLoad failed in loadNamespace() for 'tcltk', details:
  call: fun(libname, pkgname)
  error: Tcl/Tk libraries are missing: install the Tcl/Tk component from the R installer
```

（このエラーに会った人は R for MacOS X を再インストールすれば治ります。）

実は brew doctor は /usr/local/lib/ にどんなディレクトリやシンボリックリンクがあっても気にしないみたいなので、警告されたファイルをどこかに移動して、シンボリックリンクを /usr/local/lib にはれば警告は回避できる。

```bash
$ cd /usr/local/lib
$ ln -s <somewhere>/libtcl*.dylib .
$ ln -s <somewhere>/libtk*.dylib .
```

これ以外のヘッダファイルなんかは無くても問題ない。/usr/lib に Tcl/Tk はちゃんと入っているので、R以外のアプリケーションが R のインストールした Tcl/Tk を必要とすることはないと思う。

おしまい。

もっと正統的な回避策としては Homebrew でRをインストールしても良いらしい。私は試してない。
CakePHPでDebugモードとProductionモードを環境変数で切り替える


# CakePHPのConfig

app/Config/core.phpで以下のように切り替え設定をする。

```
if (env('WEB_APP_ENV') === 'production') {
	Configure::write('debug', 0);
} else {
	Configure::write('debug', 2);
}
```

# Apacheの設定

以下のように設定する。

```
SetEnv WEB_APP_ENV production
```

例えば、/etc/httpd/conf.d配下にアプリ用の設定ファイルfoo.confがあって、次のような内容のときはこんな感じ。

設定前

```
Alias /foo /var/www/foo/app/webroot

<Location /foo>
    Order deny,allow
    Deny from all
    Allow from all
</Location>
```

設定後

```
Alias /foo /var/www/foo/app/webroot

<Location /foo>
    Order deny,allow
    Deny from all
    Allow from all
    SetEnv WEB_APP_ENV production
</Location>
```
PHPでmbstringがなくて怒られるときの対処


# mbstringのインストール

```
 yum install php-mbstring
```

# php.iniの設定

以下をコメント解除 or 追加

```
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.encoding_translation = On
```

# apache再起動

```
service httpd restart
```
JavaScript で if ( a = b ) 

##ソース
```js:

// if ( a ==  b ) {} ←これでもないし
// if ( a === b ) {} ←これでもないよ

var a = 1;
var b = 2;

if ( a = b ) 
    alert(true);
else 
    alert(false);

alert('a:' + a + '\n' + 'b:' + b );

```

（[デモ](http://jsfiddle.net/tgenstake/pog6os1u/)）

##結果
![alert1.png](https://qiita-image-store.s3.amazonaws.com/0/45865/0220362e-787f-1ec1-a6d1-369aa6e33fdd.png)
![alert.png](https://qiita-image-store.s3.amazonaws.com/0/45865/ea5eb26b-02fb-eae7-99f8-6707738bfb70.png)


##こういうこと
```js:
if ( a = b ) {}
```
↓これと同じ

```js:
a = b;
if ( a ) {}

```



aにbが代入されてから評価されるんだネ☆彡
C言語と一緒だヨ☆彡


…先輩、まぎらわしいんでやめてください（ ´д`）
Office365を契約する時に気を付ける事

会社の情報共有ツールとして Office365 を導入した。
中小規模の企業においてMIS的な立場で仕事されている方は、請求書の処理に関わる事もあるかと思います。
その場合、以下の点に注意です。

+ Microsoftからの請求書は、郵送されてこない
+ Office365の契約は、月初は避けたほうが良い

何れも改善要求は出していますが、あれだけ大きい組織ですから改善まで時間はかかると思います。

# Microsoftからの請求書は郵送されてこない
Microsoftから郵送で請求書が届けられたりはしません。
まぁ最近はそういった形は当たり前になりつつありますが、Office365の場合は別なトラップも有ります。
請求書が発行されたことをメールで通知されるのですが、そのメールのSubject:が、「明細書の準備が出来ました」の様な請求書が届いたことを認識できないメールとなっており、メール文面にも「請求書」という文字は有りません。
自分でこのメールをトリガにして、管理画面の課金情報を確認し、請求書をPDFでダウンロードしなければいけません。
私の場合、完全にそのトラップにはまり、3か月分まとめて支払え請求が来た時はびっくりしました(勿論使っている分なので支払いましたけど…)。
その上、次に記載する様なトラップもあるので、面倒この上ありません。

# Office365の契約は、月初は避けたほうが良い
Office365は契約日を元に請求書を発行します(契約日の翌日が基本の様です)。
Office365の請求書を元に支払いの手続きを社内で実施すると思いますが、その実行は通常月末とか翌月末になるでしょう。
この支払実施から請求書発行までの期間が短くなるケースが面倒なのです。
Office365の支払い確認は、米国本社を経由する為か、5営業日かかるとの事で、それまではシステムに支払い済みのステータスが上がりません。
その為、翌月分の請求書の発行日には、前月分未払の形で請求書が上がってくる可能性が多くなります。
支払い済みの確認を行ってもらって請求書を再発行してもらう事は出来ないそうです。
Service Requestを出すと、事情を説明したメールがMicrosoftサポートから送られてくるので、それを添付して支払依頼を経理に出す事になりますが、自動で毎月送られてくるわけではないので、毎回請求書に前月分の支払いが反映されているかを確認しなければなりません。
といった事から、「Office365の契約を月初に行うのは避けたほうが良い」という話になります。
Swift備忘録　 乱数を取得する関数

Swiftで乱数を取得する関数は以下の３つ

　　rand
　　arc4random
　　arc4random_uniform

arc4randomとarc4random_uniformの関係は、以下のようになっており、
arc4random_uniformはモジュロバイアスの影響は受けません。
　　
　　arc4random()  %  upper_bound
　　arc4random_uniform(upper_bound)

７桁までの乱数を取得したい場合は、arc4random_uniform(10000000)とすると
0〜9999999までの乱数を取得することができます
【作業効率化】PHPの関数の返り値を変数に格納せず、直接配列として使う方法

今回は知っておくと嬉しいPHPの小ネタ。

PHPは関数の返り値が配列の場合

```
$tmp = $this->getResult();
$result['id'] = $tmp['id'];
```

上記のように、一度変数に格納してから値を使う必要がありました。
ただこれだと、関数の返り値を受け取る一時的な配列が必要で命名を仕方なく$tmpとかにしている人も多いかと思います。

ただ、実はPHP5.4以上からは関数の返り値を直接配列として扱うことが可能です。

この機能を使うと、上のコードは以下のように書き換えられます。

```
$result['id'] = $this->getResult()['id'];
```

かなりスマートになりましたね。

配列でデータを扱うことの多いPHPでは、これはかなり嬉しいです。

ぜひ使ってみてください。
【Android】Timerを使うのやめた！

皆さん、Androidしてますか？


Androidで定期実行をしたいとき、Timerを使用するってのが頭にありますよね。
でもTimerを作ったりなんだりで結構めんどくさかったりします。
そんなとき、Handlerの出番です！！！

```java:
    Handler _handler = new Handler();
```

まず、クラス変数としてこういう風に宣言します。
これで、メインスレッドでの実行が確定です！

```java:

    _handler.postDelayed(new Runnable() {
            @Override
            public void run() {

                someFunction();

                _handler.postDelayed(this, DELAY);

            }
    }, DELAY);

```

必要なところにこんな感じで書いてあげれば、Timerのできあがり！！！

キャンセルしたいときはどうするかって？

```java:

_handler.removeCallbacksAndMessages(null);

```

こうします！


おためしあれ〜！
Handlerを好きなタイミング（スレッド）で作りたい場合はコンストラクタなどで作ればOK！
自分のアプリでカスタムキーボードを使われないように制限する

ごくまれにやりたいケースがあると思います。
UIApplicationDelegateの実装、例えばAppDelegateで以下の実装することで可能のようです。

```
- (BOOL)application:(UIApplication *)application shouldAllowExtensionPointIdentifier:(NSString *)extensionPointIdentifier {
    if([extensionPointIdentifier isEqualToString: UIApplicationKeyboardExtensionPointIdentifier]) {
        return NO;
    }
    return YES;
}
```
Capybaraのfindのwaitオプション

Capybara::Query
------

Capybara 2.2以降は、findとかhave_*とかで、タイムアウトの時間を指定できる

~~~ruby
find("#foo", wait: 4)
~~~

using_wait_time つかってもいいけど。

参考
------

http://stackoverflow.com/questions/14346314/multiple-capybara-wait-times
MySQLで6桁までの小数点を丸めずに扱うならDouble型かDecimal型を使うべき理由

## 目的

丸め誤差を発生させずに、入力された10進数の小数部をMySQLに格納したい。
データの桁数を揃えること無くそのまま保管して、入出力の同一性テストにパスしたい。

## 結論

当初は入出力の結果が同じだったFloat型を勧めておりましたが、検証して下さった方による[フォローアップ記事](https://hnw.hatenablog.com/entry/20171221)で、 「DOUBLE型の場合は、SELECTで取り出した10進表現と内部的な表現とが1:1対応しているが、Float型はそうではない」ことが分かりました。
言い換えると、Float型をwhere句でfloat型のカラムを指定すると、selectで見える値とは異なる値で保管されるので要注意ということです。

その結果を踏まえて、下記の通り結論を改めます。

1. 入力したデータの小数部の桁数を揃えること無くそのまま保管する事を優先するならば、**varcharが安全**です
2. 与えられた小数を内部的には1000分率で扱うなどして、MySQL上では**整数として格納する**のがオススメ
2. WHERE句で扱うならDecimal型を用いて、入出力の同一性テストは1000倍にした整数で比較するよう調整してパスさせる


この後、それぞれの型で、どのように数値が変換されるのか、まとめていきます。


## 結果

全てのカラムに同じ値を入力した場合、型によってどのような値に変化するかをまとめたものです。
varcharというのが、実際に入力したそのままの値です。

| id | varchar      | int    | float   | float_decimal     | double            | decimal           |
|----|--------------|--------|---------|-------------------|-------------------|-------------------|
| 1  | 1            | 1      | 1       | 1.0000000000      | 1.0000000000      | 1.0000000000      |
| 2  | 1.1          | 1      | 1.1     | 1.1000000238      | 1.1000000000      | 1.1000000000      |
| 3  | 1.00         | 1      | 1       | 1.0000000000      | 1.0000000000      | 1.0000000000      |
| 4  | 1.001        | 1      | 1.001   | 1.0010000467      | 1.0010000000      | 1.0010000000      |
| 5  | 1.009        | 1      | 1.009   | 1.0089999437      | 1.0090000000      | 1.0090000000      |
| 6  | 1.1212121212 | 1      | 1.12121 | 1.1212121248      | 1.1212121212      | 1.1212121212      |
| 7  | 121212.12121 | 121212 | 121212  | 121212.1250000000 | 121212.1212100000 | 121212.1212100000 |

float型は小数部を含んで6桁までであれば、入力した値そのままに保存出来ます。
簡単に用途をまとめると、こんな感じでしょうか。

* 小数点以下桁数を揃えて正確に扱うならば、demical型またはdouble型を使う （例:緯度経度情報）
* 小数部を含んで6桁まで入力された通りに保存する用途であれば、float型を使う
* そのまま保存したい場合には、varchar型を使う

double型とdemical型との違いは次のページがとても詳しいです。
緯度経度情報などdemicalの方が望ましいのですが、double型の方がパフォーマンスは良いです。

> Decimal’s declaration and functioning is similar to Double. But there is one big difference between floating point values and decimal (numeric) values. We use DECIMAL data type to store exact numeric values, where we do not want precision but exact and accurate values. A Decimal type can store a Maximum of 65 Digits, with 30 digits after decimal point.
http://code.rohitink.com/2013/06/12/mysql-integer-float-decimal-data-types-differences/

## テストテーブル

```sql
CREATE TABLE `number` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `varchar` varchar(255) DEFAULT NULL,
  `int` int(11) DEFAULT NULL,
  `float` float DEFAULT NULL,
  `float_decimal` float(20,10) DEFAULT NULL,
  `double` double(20,10) DEFAULT NULL,
  `decimal` decimal(20,10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
```

## 補足

次の型はDOUBLE型のエイリアスのため、挙動は同一です。

* DOUBLE PRECISION
* REAL

次の型はDECIMAL型のエイリアスのため、挙動は同一です。

* DEC
* NUMERIC
* FIXED

## 併せて読みたい

* [MySQL :: MySQL 5.6 Reference Manual :: 11.7 Data Type Storage Requirements](http://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html#idm140588399049552)
Jenkins不便メモ

# はじめに

本内容は個人的メモである

# 概要

+ 不便な事
+ Plugin等を駆使しつつも解決出来ない事

# Jenkins歴

+ 2012.09.21～

# Jenkins構成背景

+ Jenkinsクラスタ
    + Jenkins Master-Slave構成
    + Slaveノードは40程度
+ 登録Jobs
    + 137 (2015/01/20現在)

# 不便な事

## `label`を動的に変更出来ない

+ パラメタ付きbuildのように動的設定出来ない
+ 試しにlabelに対してパラメタ設定しても反映されなかった

## Multi-Master構成を組めない

+ Masterが複数台あるとして、元締めMasterが子分Masterのジョブ呼べない

## Remote API実装がイマイチ

+ ジョブ生成程度までしか出来ない
+ ジョブの状態を取得出来ない
    + キューに登録された所までは分かる
    + しかし、それ以降の実行・完了は判断出来ない


## Pluginバージョンを固定出来ない

+ プラグイン検索ののちにプラグインをインストール出来る
    + 常に最新版
    + 狙ったバージョンをインストール出来ない
Couchbase on Docker - Part4: CoreOS自動アップデート後のRebalance

CoreOSクラスタ上に構築したCouchbase Serverクラスタをしばらく放置していたらいくつかunitsが死んでいました。CoreOSのreboot-strategyはデフォルトのbest-effortです。CoreOSの再起動後に起動に失敗しているfleet unitsがありました。


## fleet unitsの確認

fleetctlのバージョンは0.8.3です。

``` bash
$ fleetctl version
fleetctl version 0.8.3
```

fleetctlコマンドでunitsをリストします。Couchbase Serverは3ノード中2ノードがactiveなので、動作はしている状態です。

``` bash
$ fleetctl list-units
UNIT						MACHINE			ACTIVE		SUB
couchbase_bootstrap_node.service		f0f5fcc4.../10.3.0.47	active		running
couchbase_bootstrap_node_announce.service	f0f5fcc4.../10.3.0.47	active		running
couchbase_node.1.service			33bf6324.../10.3.0.7	inactive	dead
couchbase_node.2.service			461b77ab.../10.3.0.193	active		running
sync_gw_announce@1.service			33bf6324.../10.3.0.7	inactive	dead
sync_gw_node@1.service				33bf6324.../10.3.0.7	inactive	dead
```

## CorOSのバージョンを確認

現在のCoreOSクラスタの構成は以下の通りです。

``` bash
$ fleetctl list-machines
MACHINE		IP		METADATA
33bf6324...	10.3.0.7	-
461b77ab...	10.3.0.193	-
80e8c0f2...	10.3.0.210	-
f0f5fcc4...	10.3.0.47	-
```

最初CoreOSのバージョンは`494.5.0`をインストールしていましたが`522.4.0`に自動アップデートされています。

``` bash
$ fleetctl ssh 33bf6324 'cat /etc/os-release | grep VERSION_ID'
VERSION_ID=522.4.0
$ fleetctl ssh 461b77ab 'cat /etc/os-release | grep VERSION_ID'
VERSION_ID=522.5.0
$ fleetctl ssh 80e8c0f2 'cat /etc/os-release | grep VERSION_ID'
VERSION_ID=522.4.0
$ fleetctl ssh f0f5fcc4 'cat /etc/os-release | grep VERSION_ID'
VERSION_ID=522.4.0
```

## 停止しているunitsの再起動

dead状態になっているfleet unitsをloadしてlaunchさせます。

``` bash
$ fleetctl stop couchbase_node.1.service
Unit couchbase_node.1.service loaded on 33bf6324.../10.3.0.7
$ fleetctl start couchbase_node.1.service
Unit couchbase_node.1.service launched on 33bf6324.../10.3.0.7
$ fleetctl stop sync_gw_node@1.service
Unit sync_gw_node@1.service loaded on 33bf6324.../10.3.0.7
$ fleetctl start sync_gw_node@1.service
Unit sync_gw_node@1.service launched on 33bf6324.../10.3.0.7
$ fleetctl stop sync_gw_announce@1.service
Unit sync_gw_announce@1.service loaded on 33bf6324.../10.3.0.7
c$ fleetctl start sync_gw_announce@1.service
Unit sync_gw_announce@1.service launched on 33bf6324.../10.3.0.7
```

すべてのunitsが正常に動作しました。

```
$ fleetctl list-units
UNIT						MACHINE			ACTIVE	SUB
couchbase_bootstrap_node.service		f0f5fcc4.../10.3.0.47	active	running
couchbase_bootstrap_node_announce.service	f0f5fcc4.../10.3.0.47	active	running
couchbase_node.1.service			33bf6324.../10.3.0.7	active	running
couchbase_node.2.service			461b77ab.../10.3.0.193	active	running
sync_gw_announce@1.service			33bf6324.../10.3.0.7	active	running
sync_gw_node@1.service				33bf6324.../10.3.0.7	active	running
```

## Server NodesのRebalance

Couchbase管理Webコンソールにログインして、Server NodesタブからRebalanceボタンをクリックします。Couchbaseは画面から簡単にクラスタのノード管理ができます。

![couchbase-console-rebalance.png](https://qiita-image-store.s3.amazonaws.com/0/43745/0f881b86-55dd-a204-7875-6f6b9da6f43c.png)
RaspberryPiに話しかけてみた

#概要

※作者はPythonに関しては初心者なので、簡単な紹介が目的です。また初投稿なので宜しくお願いします。

[Jasper](http://jasperproject.github.io/)とはPythonで書かれた、
プリンストン大学の学生二人が書いたオープンソースの音声操作アプリケーションです。
去年から開発が行われ始めたためか、まだcontributingが少ないので、
Python書ける方はぜひ。

対応しているSTT（音声→テキスト）・TTS（テキスト→音声）エンジンが多々あるため、
かなり遊びがいがあります。現在はAPI経由のTwitterやEvernoteとのやりとりが可能です。

例えば（全て和訳しています）：
あなた「ジャスパー！」
ジャスパー「ピピッ」
あなた「ツイートして」
ジャスパー「何をツイートしますか？」「ピピッ」
あなた「明日晴れると良いな」
ジャスパー「ツイートします」


要するにPiで動く某お尻です。

#導入手順
1. [公式ドキュメント](http://jasperproject.github.io/documentation/installation/)を開く
2. 書いている通りに、ひたすらapt-get等を叩いて依存ファイルを取得（問題があったのでのちに追記）
3. 認識されたテキストがログとして流れるのを眺めつつ、熱心に英語で話しかけてみる


#導入時の注意点
作者はMethod3（Rasbian導入済み）を利用して導入しましたが、
いくつか問題が起きました。

まずどのMethodを踏んでも避けられない[PocketSphinx](http://cmusphinx.sourceforge.net/)の導入にあたり、
かなりの依存ファイルがあるのですが、そのうちOpenFSTのビルドがかなり掛かります。
数時間かかります。辛抱強く待ちましょう。

またどうもドキュメントに記載のあるOpenFSTのバージョン（1.3.3）だと
特定できない原因（すみません）でコケるので、
1.4.1で挑戦しましたがこれは大丈夫でした。

そして`python populate.py`でJasperに個人情報を諸々「覚えさせる」わけですが、
住所（location）を最寄りの大型の市名で指定する際、"Tokyo"等と打っても認識しません。
どうやらアメリカの市しか対応していないらしく、作者は使ってません。


#STT編
作者はどうもデフォルトのPocketSphinxでご認識が多いため、
Google SpeechのAPIを利用しています。
セットアップの仕方はドキュメントに書いてあるのでだいぶ割愛しますが、
https://developers.google.com/
からAPI_KEYを取得し、profile.ymlに書き込んでください。
※ただし一日１００回(?)制限があるので検証の際は要注意

#雑感

日本語に対応しているSSTがあれば日本でも盛り上がると思うのですが・・・。

にしてもこんな小さなマシンで音声認識でいろいろ動かせるのは楽しいですね。

作者はWindowsにCygwinを導入し、
自分で書いたmoduleを通してWindowsにSSHし、
ソファからPCのSteamのゲームを起動したりという遊びをしています。

追記(2015年1月27日)

現在エアコンの制御を試してみてます。成功したら、写真を用いて記事を書きたいと思います。