OmniAICreator/Qiita-1.07M huggingface dataset:
React v0.13から使えるようになったES6のclass構文でmixinを使う

#React v0.13からES6のclass構文で書けるようになった
以前はReact.createClassを使ったReact独自の方法でClassを表現していたのですが、v0.13からはES6の構文で書けるようになりました。  
###Before (React.createClassを使用)
```js

var HelloWorld = React.createClass {
  render() {
    return <div>Hello World!</div>;
  }
}
```
###After (class, extends React.Componentを使用)
```js

class HelloWorld extends React.Component {
  render() {
    return <div>Hello World!</div>;
  }
}
```

##class構文ではMixinが使えない・・・
ES6のClass構文でReact Componentを作るとmixinが使えないのです。

###LinkedStateMixinの例
React公式サイトから引用
https://facebook.github.io/react/docs/two-way-binding-helpers.html


```js
var WithLink = React.createClass({
  mixins: [React.addons.LinkedStateMixin],
  getInitialState: function() {
    return {message: 'Hello!'};
  },
  render: function() {
    return <input type="text" valueLink={this.linkState('message')} />;
  }
});
```


ここで使われているLinkedStateMixinはvalueの変更をonChangeを拾ってsetStateしたりせずに自動で反映してくれるものです。

React用のライブラリでも現状はMixinの使用を前提としているものがあったりするのでMixinが使えないのは何かと不便です。

Mixinを使いたい場合はReact.createClassを使って書きましょうということになっているのですが、できることならclassを使って書きたいです。

ということで調べて見たら、class構文でもmixinを簡単に導入できる"react-mixin"というライブラリを見つけました。
https://github.com/brigand/react-mixin

react-mixinをimportして`ReactMixin(Signup.prototype, React.addons.LinkedStateMixin);`というように使います。
###LinkedStateMixin with react-mixinの例
```js
import React from 'react/addons';
import ReactMixin from 'react-mixin';
import AuthService from '../services/AuthService';

export default class Signup extends React.Component {

  constructor() {
    this.state = {
      email: '',
      password: '',
      nickname: ''
    };
  }

  signup(e) {
    e.preventDefault();
    AuthService.signup(this.state);
  }

  render() {
    return (
      <div className="login jumbotron center-block">
        <h1>Signup</h1>
        <form role="form">
          <div className="form-group">
            <label htmlFor="nickname">Nickname</label>
            <input type="text" valueLink={this.linkState('nickname')} className="form-control" id="nickname" ref="nickname" placeholder="Nickname" />
          </div>
        <div className="form-group">
          <label htmlFor="username">Email</label>
          <input type="text" valueLink={this.linkState('email')} className="form-control" id="email" placeholder="Email" />
        </div>
        <div className="form-group">
          <label htmlFor="password">Password</label>
          <input type="password" valueLink={this.linkState('password')} className="form-control" id="password" ref="password" placeholder="Password" />
        </div>
        <button type="submit" className="btn btn-default" onClick={this.signup.bind(this)}>Submit</button>
      </form>
    </div>
    );
  }
}

ReactMixin(Signup.prototype, React.addons.LinkedStateMixin);
```
Error: Cannot find module '../build/Debug/iconv.node'

## 現象

基本node.jsはnvmで管理してるんですが新しいバージョンに上げて念のためにプロジェクトのnpmモジュールもupdateしていざ実行となったら

```bash
Error: Cannot find module '../build/Debug/iconv.node'

```
なるメッセージが・・・

## 解決方法
node_modules/iconvに行って

```bash
node-gyp configure
node-gyp build

```

iconv周りは何かしら変更入ったら一回は確認したほうがよさそうですね
Raspberry PiでPythonのRPi.GPIOを使ってLチカする

以前Raspberry PiでNode.jsの[Johnny-Five](http://qiita.com/masato/items/55847fd24b77f1b19222)を使ったLチカのサンプルを書きました。今回はPythonの[RPi.GPIO](https://pypi.python.org/pypi/RPi.GPIO)パッケージをインストールしてLチカしてみます。


## RPi.GPIO 

[RPi.GPIO](https://pypi.python.org/pypi/RPi.GPIO)パッケージはRaspberry PiのGPIOを操作するときに使います。pipやapt-getからインストールできます。

pipの場合

``` bash
$ sudo pip install rpi.gpio
```

apt-getの場合

``` bash
$ sudo apt-get install python-rpi.gpio
```

### GPIO.BOARDとGPIO.BCM

RPi.GPIOのサンプルを見ているとGPIOのピン番号を指定する方法が2種類あります。何が違うのか調べていると[What is the difference between BOARD and BCM for GPIO pin numbering?](http://raspberrypi.stackexchange.com/questions/12966/what-is-the-difference-between-board-and-bcm-for-gpio-pin-numbering)に説明がありました。

* GPIO.BOARD: PIN番号
* GPIO.BCM: GPIO番号

今回LEDのアノードを配線する`PIN 11`は、Raspberry Pi Model Bの場合`GPIO 17`になります。GPIO番号はモデルごと違う場合があるので、PIN番号で指定するGPIO.BOARDを使った方がよいみたいです。


### This channel is already in use

RPi.GPIOのプログラムを実行すると`This channel is already in use`の警告がでる場合があります。これは以前`GPIO.setup()`を実行してポートのセットアップをした後、クリアしていないときに発生します。

```bash
$ sudo python led-blink.py
led-blink.py:8: RuntimeWarning: This channel is already in use, continuing anyway.  Use GPIO.setwarnings(False) to disable warnings.
  GPIO.setup(PIN,GPIO.OUT)
```

プログラムの最後にポートのクリアを行います。

``` python
GPIO.cleanup()
```

## ブレッドボード配線

抵抗器は1K(茶黒赤金)を用意しました。LEDを配線します。

![raspi-led.png](https://qiita-image-store.s3.amazonaws.com/0/43745/65139cd9-28af-45c3-c72c-c7ed226f7b7b.png)

## サンプルプログラム

```python:~/python_apps/led-blink.py
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time

COUNT = 3
PIN = 11
GPIO.setmode(GPIO.BOARD)
GPIO.setup(PIN,GPIO.OUT)

for _ in xrange(COUNT):
    GPIO.output(PIN,True)
    time.sleep(1.0)
    GPIO.output(PIN,False)
    time.sleep(1.0)

GPIO.cleanup()
```

GPIOを操作する場合はroot権限が必要になります。プログラムを実行すると3回、1秒間隔でLチカします。

``` bash
$ sudo python led-blink.py
```
intel 8080 アセンブラ　16bit除算

# de / hl = hl, de % hl = de
```
cmpbd:
    mov a, e
    sub c
    mov a, d
    sbb b
    ret    
rdel:
    mov a, e
    ral
    mov e, a
    mov a, d
    ral
    mov d, a
    ora e
    ret    
deneg:
    mov a, d
    cma
    mov d, a
    mov a, e
    cma
    mov e, a
    inx d
    ret
bcneg:
    mov a, b
    cma
    mov b, a
    mov a, c
    cma
    mov c, a
    inx b
    ret    
div16:
    mov b, h
    mov c, l
    mov a, d
    xra b
    push psw
    mov a, d
    ora a
    cm deneg
    mov a, b
    ora a
    cm bcneg
    mvi a, 16
    push psw
    xchg
    lxi d, 0
div1:
    dad h
    call rdel
    jz div2
    call cmpbd
    jm div2
    mov a, l
    ori 1
    mov l, a
    mov a, e
    sub c
    mov e, a
    mov a, d
    sbb b
    mov d, a
div2:
    pop psw
    dcr a
    jz div3
    push psw
    jmp div1
div3:
    pop psw
    rp
    call deneg
    xchg
    call deneg
    xchg
    ret 
```
#補足
バイナリーを十進で表示するのに必要だから最初は除算。
[今すぐ実行](http://jsdo.it/ohisama1/gfOk)
JavaScriptでURLパラメーターを取得し配列に格納しておく

# 備忘録
JavaScriptでURLパラメーターを取得し配列に格納しておく記述。

JSライブラリ依存せずに使用。

## 記述

```js:URLパラメーターを取得し配列に格納
var arg = new Object;
var pair=location.search.substring(1).split('&');
for(var i=0;pair[i];i++) {
	var kv = pair[i].split('=');
	arg[kv[0]]=kv[1];
}
```

## 解説


```js:コメントアウトで解説
//変数argはオブジェクトですよ
var arg = new Object;

// 変数pairにURLの?の後ろを&で区切ったものを配列にして代入
var pair=location.search.substring(1).split('&');
    // location.search.substring(1)は、URLから最初の1文字 (?記号) を除いた文字列を取得する
    // .split('&')は&で区切り配列に分割する


// for文でrairがある限りループさせる
for(var i=0;pair[i];i++) {

　　// 変数kvにpairを=で区切り配列に分割する
	var kv = pair[i].split('=');// kvはkey-value

　　// 最初に定義したオブジェクトargに連想配列として格納
	arg[kv[0]]=kv[1];  // kv[0]がkey,kv[1]がvalue

}
```

## 使い方

任意のJSに`URLパラメーターを取得し配列に格納`の記述する。

urlが`http://exmple.com?hoge1=apple&hoge2=orange`だったら


```js:アラートで出力
alert(arg.hoge1);
alert(arg.hoge2);
```

```js:コンソールに出力
console.log(arg.hoge1);
console.log(arg.hoge2);
```

で使える。
phpbrew環境でphalcon2.0をインストールしてみる on OSXYosemite

つい最近2.0が正式リリースされましたね。
僕は2.0BETAから使っていたのですが、zephirのインストールが必須じゃなくなっていて驚きました。

インストール自体も思っていた以上に簡単だったので紹介しようと思います。

## インストール方法
基本的には[phalcon公式サイト](http://phalconphp.com/ja/download)の通りで大丈夫だと思います。
Homebrewからでのインストールは試していませんが、Gitからのコンパイルインストールでは成功しています。

***公式サイトより***
> $ git clone --depth=1 git://github.com/phalcon/cphalcon.git
$ cd cphalcon/build
$ ./install

無事ビルドが完了した場合、出力の最後に

```
Build complete.
Don't forget to run 'make test'.

Installing shared extensions:     ~/.phpbrew/php/php-5.6.6/lib/php/extensions/no-debug-non-zts-20131226/
Installing header files:          ~/.phpbrew/php/php-5.6.6/include/php/
```

と表示されますので、***shared extensions***の方のパスをコピー。
エクステンション用のiniファイルは以下のコマンドで現在インストール中の一覧が表示されます。

```
$ phpbrew list-ini

Loaded ini files:
 - ~/.phpbrew/php/php-5.6.6/var/db/opcache.ini
 - ~/.phpbrew/php/php-5.6.6/var/db/pdo_sqlite.ini
 - ~/.phpbrew/php/php-5.6.6/var/db/sqlite3.ini
 - ~/.phpbrew/php/php-5.6.6/var/db/xdebug.ini
```

そこに***phalcon.ini***ファイルを作成しましょう。

```
$ vi ~/.phpbrew/php/php-5.6.6/var/db/phalcon.ini

extension=***[shared extensionsでコピーしたパス]***/phalcon.so
```

以上で、phalcon拡張のインストールは完了です。
キチンとphp拡張として読み込まれているかは
```
php -m | grep phalcon
```
で確認が出来ます。

よいphalcon生活を！

### 追記：2015-05-22
```
phpbrew ext install https://github.com/phalcon/cphalcon
```
でもインストールが可能なのですが、何故か32bitバージョンがインストールされる・・・
見てみた所、```./build/gccarch.c```のコンパイルが上手く行ってないみたい？

直接```gcc gccarch.c -o gccarch```とすると上手くコンパイル出来、実行すると```1```が返ってくるんですが。
何か特別な引数があるんでしょうか。
InDesign・InDesignServerのJavaScript処理系にログファイル書き出し機能を実装する

ExtendScriptのJS処理系には `console.log()` が存在しない。ExtendScriptToolkitへのコンソール出力には `$.writeln()` が使えるが、InDesignServerの標準出力へ出力するには `alert()` を使う必要がある。手癖でつい`console.log()`と打ちたくなってしまう。

通常版のInDesignでスクリプトの開発をしてからサーバ版へ持っていくことが多いため、出力部分の関数が違うのは地味に面倒だ(通常版で一々`alert()`すると使えたものではない)。また、動作を監視するためにログを取りたいが、InDesignServerにはログの書き出し機能がついていない。

そこで、ログファイル書き出し機能を付けた `console.log()`をオレオレ実装した。ファイル先頭のフラグをいじるだけで、通常版InDesignとサーバ版InDesign用の挙動を切り替えることができる。
(CoffeeScriptで開発しているので、適宜読み替えてください。)

## console.log の実装

```coffeescript

# サーバモード
serverMode = true
# サイレントモード
silentMode = false

console = {}
console.log = (msg) ->
  if !serverMode and !silentMode
    # 開発用の挙動
    $.writeln msg
  else if serverMode and !silentMode
    # サーバ用の挙動
    alert msg
  if serverMode
    # ログファイルの保存先を作成してキャッシュ
    @logfile = @logfile || new File '/path/to/logfile.txt'
    # 追記モードでログファイルを開いて閉じる
    @logfile.open 'a'
    @logfile.writeln msg
    @logfile.close()
 ```
## 使い方

```coffeescript
console.log  "\n\n\n===#{new Date()}========================================================"
console.log "API version: #{app.scriptPreferences.version}"
console.log "InDesign version: #{app.version}"
console.log "OS: #{$.os}"
console.log "Locale: #{$.locale}\n\n"
```

ExtendScriptのグローバルな機能しか使用していない為、InDesign以外の他のソフトでも動作するかもしれない。
Imagickでサムネイル画像を生成する

色んなサイズの画像を、指定した大きさ＆比率的にはみ出る部分は切り落とすサムネイル画像を生成するには、cropThumbnailImageを使うと簡単にできます。

![cropThumbnailImage.png](https://qiita-image-store.s3.amazonaws.com/0/75498/d0b20480-b9c5-86f7-526f-d5f315a383ce.png)

が、縦長の画像は、人物の画像だったりすると、顔が切れるという残念な結果になるので、『縦長の画像は上部が重要』という仮説のもと、縦長画像は上の方を切り取るようにします。

![cropThumbnailImageP.png](https://qiita-image-store.s3.amazonaws.com/0/75498/b46c5d28-0d0d-ca8e-24db-e20f54efa7bd.png)

```php
$im = new Imagick(realpath($file_path));
$size = $im->getImageGeometry();
if ($size['width'] < $size['height']) {
    // 縦長なので上部を正方形に切る
    $im->cropImage($size['width'], $size['width'], 0, 0);
}
$im->cropThumbnailImage($thumbnail_width, $thumbnail_height);
$im->writeImage($thumbnail_path);
```

東京タワーとか高層ビルとかの縦長画像でも、真ん中切り取るより上の方切り取るほうがいいと思うので、簡単だし、まぁ良さそうかな。

ちなみにImageMagickは相対パスだとうまく読み込まなかったりするので、`realpath()`を使っています。
ただし`realpath()`は存在するファイルやディレクトリに対してしか使えないので、新しく作成する画像のパスに対して`$im->writeImage(realpath($thumbnail_path))`とかやるとダメです。
その場合は`$im->writeImage(realpath($thumbnail_dir) . '/new_file.jpg')`とかにする必要があります。
回帰テストの失敗を音声合成で通知

## 背景

Jenkins で回している回帰テストの結果（失敗）をタイムリーに知りたい。
これまでもメールや社内 SNS に通知を流していましたが、他の情報に埋もれがち。
ということで、合成音での通知の仕掛けをつくってみました。

## 構成

こんな感じです。

![音声合成通知.png](https://qiita-image-store.s3.amazonaws.com/0/15769/0855abc2-c596-c54f-b48d-bcf908aa7c53.png)


## 音声合成の事前準備

MacOSX Lion からは、say コマンドで合成音を生成することができます。

```terminal
$ say "Hello World!"
```

デフォルトだと英語話者ですが、日本語話者 (Kyoko) モデルをインストールすることで、
日本語の合成音も発話させることができます。

### 日本語音声インストール

リンゴマーク → システム環境設定 → スピーチ → テキスト読み上げ → カスタマイズ から
日本語の "Kyoko" チェックボックスをクリックして OK。

これで日本語音声のモデルがインストールされます。
試してみましょう。

```
$ say -v Kyoko 今日も一日がんばるぞい
```

日本語の音声が出てきました！
これでテスト結果を喋ってもらえばよさそうです。

## 回帰テストの結果取得

Jenkins でキックするシェルの中で成功/失敗の判定をしてもよいのですが、開発用の Jenkins サーバから自分の Mac に対してリクエストは受けたくありません。ということで、最新結果を定期的に取得するような構成にしました。

最新のテスト結果は JSON や XML などで取得できるので、それをパースしてあげましょう。

今回は cheerio-httpcli を試してみたかったので無駄にスクレイピングして結果を取得しています。
良い子はマネしないでください。

```JavaScript 
var client = require('cheerio-httpcli');
var fs = require('fs');

client.fetch('対象のURL', { q: 'node.js' }, function (err, $, res) {

  // ナンバーの取得
  var breadCrumbs = $('ul#breadcrumbs li.item a.model-link').text();
  var buildNum = breadCrumbs.replace(/^.+\#/,"");

  // テスト結果文字列の取得
  var resultCountText = $('td#main-panel div div').text();
  var result = resultCountText.replace(/^\s+/,'').split("\n");

  for (var i=0, len=result.length; i<len; i++) {
  	result[i] = result[i].replace(/^\s+/g,'');
  }

  // 数値を取り出す
  var testCaseNum = result[2].replace('個のテスト','');
  var failedCaseNum = result[0].replace('個の失敗','');

  // 成功していた場合
  if ("0" === failedCaseNum) {
  	console.log("0");
  	return;
  }

  // 失敗した場合はテキストに出力
  var outputText = 'ほげほげテストのナンバー' + buildNum + 'で、' + testCaseNum + '件のテストケース中' + failedCaseNum + '件が失敗しています。確認お願いします。';
  fs.writeFileSync('sample.txt', outputText, encoding='utf8');
  console.log("1");
});
```

```bash
status=`node check.js`

if [ $status = 1 ]; then 
	say -v kyoko < sample.txt
	sleep 5
else 
	echo "ほげほげの回帰テストは差分がないか成功しています。"
fi 

```
これで、失敗があった場合に合成音が再生されるようになります。

cron に登録するもよし、while でぶん回すもよし。

## 結果

自席の周辺にミーティングスペースがあるので、人が集まっている時間に突然、機械音でアラートがあると「なんだなんだ？」と注意を引けるようになりました。

また、全然違う作業をしていても回帰テストの失敗が音として聞こえるので、とりあえず何かが起きていることは自分プラスαには分かります。

費用対効果としては悪くないかな、と思います。
AjaxCheckBoxの入力値取得結果一覧

# はじめに
*org.apache.wicket.ajax.markup.html.form.AjaxCheckbox*の入力値を取得する方法は複数ある。それぞれの方法での取得結果を備忘録としてまとめた。

# 使用したコード

```java
AjaxCheckBox groupselector = new AjaxCheckBox("groupselector",new Model<Boolean>()) {
			
	private static final long serialVersionUID = -1892999458510654835L;

	@Override
	protected void onUpdate(AjaxRequestTarget arg0) {
		System.out.println("--------入力結果の色々な取得方法--------");
	
		System.out.println("getInput():\t" + getInput());
		System.out.println("getConvertedInput():\t" + getConvertedInput());
		System.out.println("getValue():\t" + getValue());
		System.out.println("getDefaultModelObject():\t" + getDefaultModelObject());
		System.out.println("getModelValue():\t" + getModelValue());
				
	}
};
add(groupselector);

```

# 結果

| メソッド名| 選択時 | 解除時 |
|:-----------|------------:|:------------:|
| getInput|"on"|null|
| getConvertedInput|true|false|
| getValue|true|false|
| getDefaultModelObject|true|false|
| getModelValue|true|false|



# 終わりに
**getInput()** だけは　**on/null** となる。
Perl 5.16.3+Net::LDAP 0.65でBad File Descriptor

Strawberry Perl 5.16.3とNet::LDAP 0.65で、Bad File Descriptorが発生した。IO::Socket::IP（この時点で0.37版）をインストールしたところ、解消した。

# 詳細

## エラー

該当部のコードは下記の`search`行。

    my $ldap = Net::LDAP->new("$ldap_serv:$ldap_port") or die "$@";
    my $mesg = $ldap->search(base => $ldap_base, filter => 'mail=tsukamoto@example.com');

以下のエラーになった。

    Bad file descriptor at xxxxxx.pl line xx, <DATA> line xxx.

## 対応

以下の2モジュールを更新したところ、エラーが解消された。

* IO::Socket::IP
* Net::LDAP（perl-ldap）

最初に、Net::LDAPが旧い可能性を考えて更新したところ、0.65版がインストールされ、エラーは変わりなかった。次に以下の2件を参考にIO::Socket::IPを更新したところ、0.37版がインストールされ、エラーが解消された。

* [Net::LDAP fails with latest ActiveState Perl, can be worked round byrenoving INET6.pm - nntp.perl.org](http://www.nntp.perl.org/group/perl.ldap/2014/04/msg3756.html)<br/>Bad File Descriptorが発生し、`IO\Socket\INET6.pm`をリネームした（機能しなくした）ら解消したとの投稿。
* [Re: Net::LDAP fails with latest ActiveState Perl, can be worked round by renoving INET6.pm - nntp.perl.org](http://www.nntp.perl.org/group/perl.ldap/2014/04/msg3761.html)<br/>それはIPv6サポートを無効化する作業だけど、代わりにNet::LDAPの最新版とIO::Socket::IPを入れてみたらどうか、という投稿。

# 参考

* [Net::LDAP fails with latest ActiveState Perl, can be worked round byrenoving INET6.pm - nntp.perl.org](http://www.nntp.perl.org/group/perl.ldap/2014/04/msg3756.html)
* [Re: Net::LDAP fails with latest ActiveState Perl, can be worked round by renoving INET6.pm - nntp.perl.org](http://www.nntp.perl.org/group/perl.ldap/2014/04/msg3761.html)
Amazon Linux(に限りませんがRPM系)のbashをSYSLOG_HISTORYに対応させる


# 背景

bashのSYSLOG_HISTORYを導入し、作業の記録をsyslogへ残しておきたいために実施します。
作業ミスなどを遡るなど、大いに有用です。

# 準備
## 環境の構築

コンパイルをするために必要なパッケージを導入します。(sudo)

```
sudo yum -y install rpm-build texinfo bison ncurses-devel autoconf gettext gcc make
```

## ソースコードの入手

Amazon Linuxではget_reference_sourceでソースパッケージを取得します。CentOSなどでは `yum downloader --source` などかな。

```shell-session:
get_reference_source -p bash
```

## ソースコードの展開

作業用ユーザにてソースコードを展開します。特に指定をしていない場合、~ 以下に rpmbuild/ というディレクトリが作成されてソースコードが展開されます。

```shell-session:
$ rpm -ivh /usr/src/srpm/debug/bash-4.1.2-15.24.amzn1.src.rpm
$ tree -d rpmbuild/
rpmbuild/
├── SOURCES
└── SPECS
```

## パッチの適用

以下のパッチを適用します。makeの末尾に `-DSYSLOG_HISTORY` が追加されています。他の部分は変更の必要がありませんので、この部分のみの対応となります。

```diff:
--- /home/ec2-user/rpmbuild/SPECS/bash.spec.old	2015-04-24 00:15:48.649314922 +0000
+++ /home/ec2-user/rpmbuild/SPECS/bash.spec	2015-04-24 00:16:43.845303142 +0000
@@ -165,7 +165,7 @@
 
 # For -fwrapv option see https://www.securecoding.cert.org/confluence/display/seccode/INT32-C.+Ensure+that+operations+on+signed+integers+do+not+result+in+overflow
 # Bash needs to be fixed.
-make "CFLAGS=$CFLAGS -fwrapv" "CPPFLAGS=-D_GNU_SOURCE -DRECYCLES_PIDS `getconf LFS_CFLAGS`"
+make "CFLAGS=$CFLAGS -fwrapv" "CPPFLAGS=-D_GNU_SOURCE -DRECYCLES_PIDS `getconf LFS_CFLAGS` -DSYSLOG_HISTORY"
 %check
 make check
```

# 構築
## rpmbuildによる構築

```shell-session:
LANG=C rpmbuild -ba ~/rpmbuild/SPECS/bash.spec
```
インスタンスサイズにもよりますが、しばらくするとパッケージが作成されます。

# 導入

作成されたパッケージを導入します。(sudo)

```shell-session:
sudo rpm -Uvh rpmbuild/RPMS/x86_64/bash-*.rpm --force
```

# おまけ

今後のyum updateでSYSLOG_HISTORYなしのbashで更新されないようにyum.confでbashの更新を除外対象にします。
もし脆弱性などで対処が必要な場合は自動ではできなくなるので手動で実施することになります。その際には改めてパッケージ作成から行うことで対応できます。

```shell-session:
sudo -s
echo 'exclude=bash*' >> /etc/yum.conf
exit
```
規約などの文書管理はGitHubのwikiでやろう

弊社は規約などをwordなどの文書で貰うんですが、
規約まるごと渡されるので、それをHTMLに変更するのが凄くめんどい、タグ打ち地獄。

何か楽な管理方法ないかなー、と思ってたらGitHubのwikiがよさげだった。

###手順
・ファイルを作る

![スクリーンショット 2015-04-24 9.22.52.png](https://qiita-image-store.s3.amazonaws.com/0/18932/3103e0b6-e4a8-999f-9a0b-a69933e1c824.png)


・ファイルが変更される

![スクリーンショット 2015-04-24 9.24.46.png](https://qiita-image-store.s3.amazonaws.com/0/18932/d26ee674-2b7d-66cb-a76d-73636f537df3.png)


・タイトルしたの`revisions`ってところをクリック


![スクリーンショット 2015-04-24 9.26.43.png](https://qiita-image-store.s3.amazonaws.com/0/18932/26e30a42-abc5-b0a1-1a0b-b923b613de32.png)


・差分を確認したい変更を選択して、`Compare Revisions`をクリック

![スクリーンショット 2015-04-24 9.31.26.png](https://qiita-image-store.s3.amazonaws.com/0/18932/768116a0-6d5b-c56c-89e5-a01e7cb1d4eb.png)


・差分が見れる！

![スクリーンショット 2015-04-24 9.32.21.png](https://qiita-image-store.s3.amazonaws.com/0/18932/52111972-ceca-0123-62e0-9a6b37e7ae98.png)
ubuntu15.04でMariaDBに接続が出来ずハマった件

ubuntu 15.04

```bash:
apt install mariadb-server
systemctl start mysqld
```

```
mysql -uroot -p
```

それっぽいパスワード指定するも接続できない。

```bash:
mysqld_safe --skip-grant-tables &
mysql -uroot mysql
update user set password=PASSWORD("pass") where User='root';
flush privileges;
```

```bash:
mysql -uroot -ppass
```

だめだ。

## 解決方法（仮）

```bash:
apt remove mariadb-server
rm -rf /var/lib/mysql
apt install mysql-server
```

これでとりあえずmysqldが使えるようになったが、
mariadb-server をどうしても使いたい場合は別途調査が必要。
技術英語 > 微妙に干渉する > interfere with each other in subtle ways

@ Readable code No.4095
> Requirements often interfere with each other in subtle ways.

<hr>
いくつかのものを組み合わせた時にうまく動かない、干渉する時に使いそう。


思いつき関連キーワード
- atomic
- 直交性
- リエントラント
- XXXセーフ (例: スレッドセーフ)
これぞアプリのストア評価の秘密！【前編：知る】評価が下がる原因まとめ

※FlexFirmでは現在、アプリの運用に関するアンケートを実施しています。
ご協力いただけましたら幸いです。
　[アンケート（Googleフォームに遷移します）](http://bit.ly/1Lh0zfV)

#__「どんな問題がアプリの評価を下げるの？」__
（※今回はAndroidのPlayストアに対して調査を行いましたが、同じことがiOSのApp Storeに対しても言えると思います。）

ストアの評価でよくこういう感じのコメントを見かけます。
＝＝＝
　★☆☆☆☆「こんなアプリもういらない！」
＝＝＝
この問題にどう対応したら良いのでしょうか？
![arere_blog1.png](https://qiita-image-store.s3.amazonaws.com/0/32732/2bed636d-bbb0-91fb-06db-9934ee73e331.png)




こんにちはー！
クラウドソーシングテスト[「あれれサーチ」](http://arere.applihelp.com/lp/first005/?qi1)の運営を行っています。
「何を提供したら皆さんにつかってもらえるのか」
日々悶々と考えています。
考えるだけでなくヒアリングもよく行いますが、課題解決を形にするのはなかなか難しいものですね。


さて突然ですが、どんな問題がストアの評価を下げるのか気になりました。
__『ストアの評価が「低い」原因まとめ』__
みたいなのがきっとあるだろーとおもって探してみました。

ありませんでした。はい。
（有料ではある？のかも）

###__というわけでまとめました！！__###
分けたほうが分かりやすいと思ったので【前編】と【後編】の2回でお伝えしたいと思います。

このまとめがあれば
__・何がアプリの低評価につながるか分かる　→何から修正すればいいのかすぐにわかる__
__・修正する優先順位が分かる　→いままでチームで検討していた時間が格段に減る__
てなること間違いなしです！
ぜひ皆さん使ってくれるとうれしいですm(_ _)m



##ストアの評価が「低い」原因まとめ

###__調査対象__###
・売上TOP上位5アプリ
・無料TOP上位17アプリ（ゲーム除く）
　（共に2015/4/5現在）
　数にして約300コメントを対象に調査。


__●売上TOPアプリの低評価とコメントの関係__
![有料TOPコメント.PNG](https://qiita-image-store.s3.amazonaws.com/0/32732/ab094b6f-c83e-fd90-e57b-c2ea1104c4b9.png)

売上TOPアプリに対する低評価は、課金アイテムやルールに対するものなど、そのアプリだけに関係する内容が大半。
なので、ある程度で集計をやめました。
代わりに無料TOPの低評価コメントを集中的に分析しました。


__無料TOPアプリ（ゲーム除く）の低評価とコメントの関係__
（※情報は一部掲載。全情報は[『ダウンロードページ』](http://arere.applihelp.com/lp/whitepapers/?qi1)に置いてます。ご自由にどうぞ）
![無料TOPコメント2.PNG](https://qiita-image-store.s3.amazonaws.com/0/32732/b2f9e9d3-85da-dae2-99e0-0f5dada8e44d.png)

__↑この内容は、有料や課金アプリ、無料アプリ問わず当てはまる内容ばかりでした。__
（※緊急度や、評価される頻度は【後編】に書きます）

##ストアの評価が与える効果とは？
ストアの評価なんて気にする必要あるの？
そもそも、ストアの評価が低くても、課金率にもDL数にも影響がないのなら__ストア評価なんか低いままでいい__ですよね。

なので、ストアの評価が与える効果について調べました。
結論としては__評価4以上を目標にする__のが良いと思います。
以下、ストア評価に関する情報を紹介。

###__●Googleが評価と収益性の関係に言及__
先日4/9に　[Google Developer Summit Tokyo 2015](https://events.withgoogle.com/gdstokyo-201501/)　が開催されました。
私たちも参加してきました。

そこで発表された内容
__「★2つと★3つの間で収益性に9倍の差、
　★3つと★4つの間で4倍の差」__
（※★2と★4では36倍差ですね！）

のちに[「ここ」](http://googledevjp.blogspot.jp/)に資料公開とのこと。
私たちも直接聞きましたが、GDSTokyo2015参加者のツイートが[togetter](http://togetter.com/li/806050?page=6)にまとめられています。


収益性はアプリによって違うのでこの値を真に受けるのはナンセンスですが、
課金金額に大きく影響するのは間違いないでしょう。
（Googleさん、この辺のデータをちゃんとまとめて公開してほしい）

###__●評価とダウンロード率の関係をまとめた記事__
「アプリマーケティング研究所」に掲載された[Nagisa社の講演記事](http://appmarketinglabo.net/nagisa-aso/)では、アプリの評価とダウンロード率の関係がリアルな数字とともに公開されています。
この記事によると
__「★4.5と★2ではダウンロード率が30％変わる」__
大きいですね！

###__●ランキングの高いアプリは評価も高いのか？__
私たちも有料TOPと、ゲーム以外の無料TOPアプリ各20の評価を調べてみました。

__有料TOP 20のアプリのうち__
評価4以上は14コ（7割）
評価3.5以上は20コ__（10割）__

![TOPアプリストア評価_有料.PNG](https://qiita-image-store.s3.amazonaws.com/0/32732/b80efb19-160a-87cf-de5d-9cc8241c7f51.png)

__無料TOP 20のアプリ（ゲーム以外）のうち__
評価4以上は12コ（6割）
評価3.5以上は18コ（8割）

![TOPアプリストア評価_無料.PNG](https://qiita-image-store.s3.amazonaws.com/0/32732/139261d3-ebde-f6d3-f4a1-83f3f3778370.png)


ランキングの高いアプリは__評価3.5以上は当たりまえ__にとってきていますね。
ということで、目標としては__評価4以上を目指す__のが良いのではないでしょうか。


いかがだったでしょうか？
皆さんのお役にたつ情報になっていればうれしいです。

（よければ[【後編：対策】評価を下げない施策 ](http://qiita.com/flexfirm/items/3c8e1efcc76d02860503)もどうぞ(o^∇^o)ﾉ）

---

※FlexFirmでは現在、アプリの運用に関するアンケートを実施しています。
ご協力いただけましたら幸いです。
　[アンケート（Googleフォームに遷移します）](http://bit.ly/1Lh0zfV)
secureCoding > 初期化中のみ動的メモリ割当てを行う

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> 安全性が極めて重要なシステムの中にも、動的メモリ割り当てを利用するシステムはあるが、それは初期化の段階に限られ、運用段階では利用しない。たとえば、航空機を制御するソフトウェアは、期待の初期化中に動的にメモリを割り当てることはあるかもしれないが、飛行中に行うことはないだろう。

<hr>

関連するキーワードとして
- メモリプール
- メモリパラシュート
などか。
secureCoding > #define __STDC_WANT_LIB_EXT2__ (1)

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

例2-7 getline()を使用したstdinからの読み込み
において`__STDC_WANT_LIB_EXT2__`が定義されていた。

<hr>
`__STDC_WANT_LIB_EXT2__`についてgoogle検索してみたが、関連情報はほとんど見つからなかった。
secureCoding > C11 > set_constraint_handler_s() | ignore_handler_s()

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら
> この例では、set_constraint_handler_s()の呼び出しを追加し、ignore_handler_s()関数を実行時制約ハンドラとして設定している。ignore_handler_s()関数が実行時制約ハンドラとして設定された場合、実行時制約違反を起こしたすべてのライブラリ関数は呼び出し元へリターンする。呼び出し元はライブラリ関数の仕様に基づいて、実行時制約違反が起こったかどうかを調べることができる。

<hr>
[set_constraint_handler_s](http://en.cppreference.com/w/c/error/set_constraint_handler_s)
[ignore_handler_s](http://en.cppreference.com/w/c/error/ignore_handler_s)
secureCoding > C11附属書K > __STDC_LIB_EXT1__マクロを定義することが期待されている

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら
> C11附属書Kの規定を実装している処理系では、__STDC_LIB_EXT1__マクロを定義することが期待されている。

<hr>
[SO](http://stackoverflow.com/questions/16623076/undefined-reference-to-strcpy-s-cant-compile)

> __STDC_LIB_EXT1__ The integer constant 200509L, intended to indicate conformance to this Technical Report.
...
> An implementation that defines __STDC_LIB_EXT1__ shall conform to the specifications in this annex.380)
> 380) Implementations that do not define __STDC_LIB_EXT1__ are not required to conform to these specifications.
secureCoding > C11附属書K境界チェックインタフェース > strcpy_s()など

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> C11附属書K「境界チェックインタフェース」は、既存関数をより安全に置き換えることを主眼として、設計された。
> ...
> strcpy_s(), strcat_s(), strncpy_s(), strncat()

<hr>
[STR07-C. 境界チェックインタフェースを使用し、文字列操作を行う既存のコードの脅威を緩和する](https://www.jpcert.or.jp/sc-rules/c-str07-c.html)

[The C Standard, Annex K > the bounds-checking interfaces](https://www.securecoding.cert.org/confluence/display/c/STR07-C.+Use+the+bounds-checking+interfaces+for+string+manipulation;jsessionid=DB2AB9BA327DE5D84604ED8536EF155C)
p5.jsでCoffeeScriptを自動コンパイルさせると楽しい、が・・

クリエイティブコーディングといえばCoffeeScriptなんじゃね？ということで、CoffeeScriptの自動コンパイル環境（コピー→コンパイル）を作ってみましたが(p5との相性？的に)色々手こずったのでメモ。

まずは、してない人はnode.jsをインストールしましょう。

次にnpmよりCoffeeScriptをインストールします。

```
sudo npm install -g coffee-script
```

###大まかな流れ
1 .「myScript.coffee」でcoffeeのコーディングをする
2 .「myScript.coffee」にウォッチャーをつける（後述）
3 . coffeeを保存するたびに「myScript.js」が生成される(htmlからはmyScript.jsをインクルードしておく)
4 . 楽しい

##自動コンパイル時の注意点
編集しているmyScript.coffeeファイルにウォッチャーをつけることで、保存したタイミングで逐次コンパイルしてくれます。
**この時に注意！「-b」＝bare（まっさらな）オプションをつけましょう。これつけないとコード全体がクローズされてp5.jsが動きません。**これが伝えたくてこの記事を書いたようなもんです。

```
coffee --watch --compile -b ./myScript.coffee
```


そうするとmyScript.jsというファイルがmyScript.coffeeを保存するたびに自動生成されます。これをhtmlからインクルードすれば楽しいです。


##クリエイティブコーディング感（）
こんなすっきりしますよ、と。

```coffeescript:myScript.coffee

obj = undefined

MovingObj = (x, y) ->
  @pos = createVector(x, y)
  @vel = createVector(1, 1)
  @acc = createVector(1, 0)

  @move = ->
    @vel.add @acc
    @pos.add @vel
    @acc.mult 0
    return

  @draw = ->
    ellipse @pos.x, @pos.y, 30, 30

  return

setup = ->
  createCanvas 600, 400
  smooth()
  obj = new MovingObj()
  return

draw = ->
  background 205
  obj.move()
  obj.draw()
  return

```

自動コンパイル後。thisとか@で表すとすっきり。

```js:myScript.js
// Generated by CoffeeScript 1.9.2
var MovingObj, draw, obj, setup;

obj = void 0;

MovingObj = function(x, y) {
  this.pos = createVector(x, y);
  this.vel = createVector(1, 1);
  this.acc = createVector(1, 0);
  this.move = function() {
    this.vel.add(this.acc);
    this.pos.add(this.vel);
    this.acc.mult(0);
  };
  this.draw = function() {
    return ellipse(this.pos.x, this.pos.y, 30, 30);
  };
};

setup = function() {
  createCanvas(600, 400);
  smooth();
  obj = new MovingObj();
};

draw = function() {
  background(205);
  obj.move();
  obj.draw();
};

```

おしまい。
Vagrant chef/centos-6.5 に MySQL 5.5 を突っ込む

## もし既に MySQL が入っているようだったら消しておく

```bash
$ sudo yum -y remove mysql*

```

## 次に必要ファイルを取りに行く

```bash

$ sudo yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
```

## リポジトリファイルの編集

```bash

$ sudo vi /etc/yum.repos.d/mysql-community.repo
```

このファイルはこんな感じに

```
[mysql-connectors-community]
name=MySQL Connectors Community
baseurl=http://repo.mysql.com/yum/mysql-connectors-community/el/6/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

[mysql-tools-community]
name=MySQL Tools Community
baseurl=http://repo.mysql.com/yum/mysql-tools-community/el/6/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

# Enable to use MySQL 5.5
[mysql55-community]
name=MySQL 5.5 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.5-community/el/6/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

# Enable to use MySQL 5.6
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/
enabled=1
gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

# Note: MySQL 5.7 is currently in development. For use at your own risk.
# Please read with sub pages: https://dev.mysql.com/doc/relnotes/mysql/5.7/en/
[mysql57-community-dmr]
name=MySQL 5.7 Community Server Development Milestone Release
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/6/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
```

このコの Enable to use MySQL 5.5 だの Enable to use MySQL 5.6 の enabled の部分を 5.5の enabled=1 に 5.6の enabled=0にする。

もし、面倒だったら次のコマンドを実行したら一発！(もっとウマい書き方があるんだろうけど)

```bash

$ sudo sed -i -e "19c enabled=1" /etc/yum.repos.d/mysql-community.repo
$ sudo sed -i -e "27c enabled=0" /etc/yum.repos.d/mysql-community.repo

```


これで、最後に

```bash

$ sudo yum -y install mysql mysql-devel mysql-server mysql-utilities
```

もし、5.6を入れたかったら、mysql-community.repo を弄らなければおｋ
Vagrant chef/centos-6.5 に PHP 5.4 を突っ込む

## CentOS 6.5 でインストールされている PHPは 5.3 系

「インストールされている」というと語弊があるのだけど、入っているのは 5.3系だよ。yum を update して yum -y install php でも 5.3 が入っちゃう
　
Vagrant での環境に於いて Box chef/centos-6.5 ではデフォルトでは PHP が入っていないのでアンインストールの必要がないのだけど、もし 5.3 系が入っているようだったら以下のコマンドでアンインストール

```bash
$ sudo yum erase php*
```

で、お目当ての PHP 5.4をインストールするには rpm を使うよ


## とりあえず rpm についてざっくり説明

以下、すごくわかりやすい記事

[引用：初心者の頃に知っておきたかった rpm と yum の違いと使い分け](http://blog.inouetakuya.info/entry/20111006/1317900802)

> rpm と yum は別々のものではない。yum は内部で rpm を呼び出して、rpm よりもさらに高度な機能を提供しているもの
> yum のほうが rpm よりも高機能なので、yum が使える場面では yum を使ったほうが便利。rpm は yum が使えない場面で使う


ってことで、rpm で必要なファイルを取ってくる。

```bash
$ sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo rpm -Uvh http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/x86_64/ius-release-1.0-11.ius.el6.noarch.rpm
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

```

これが終わったら php 5.4 をやっとこさインストールできるよ

``` bash
$ sudo yum -y install php54 php54-devel suphp54-mysql suphp54-mcrypt suphp54-gd suphp54-pear suphp54-pecl-apc suphp54-mbstring suphp54-imap
```

もし、5.5 が欲しかったら 5.4 を 5.5 にすりゃあいい


```bash

$ sudo yum -y install php55

```
Log::MinimalでPerlのログ出力してみた


## インストール方法
<pre>
>$ cpanm install Log::Minimal
</pre>


## ログレベル

|レベル    |対象者       |内容|
|:--------|:-----------|:--|
|debug    |開発者       |開発中のデバッグ用出力。商用環境では出力しない。|
|info     |開発者       |開発者が運用中に調査等で参照する情報。不具合を見つけるための手がかりに使用。|
|warn     |運用者/開発者 |運用中に発生したシステムに関する問題。直ちには問題がない状態。|
|critical |運用者/開発者 |サービスが継続できない障害。原因究明の情報|。

## 表示例
``` perl:log.test.pl
use Log::Minimal;

# デバッグを出力する場合：1
$ENV{LM_DEBUG} = 1;

debugf( 'デバッグレベル出力される.' ); # $ENV{LM_DEBUG} がtrueの場合出力される
infof( 'インフォレベルが出力される.' );
warnf( 'ワーニングレベルが出力される.' );
critf( 'クリティカルレベルが出力される.' );

# フルスタックトレースをする場合
debugff( 'デバッグレベル出力される.' ); # $ENV{LM_DEBUG} がtrueの場合出力される
infoff( 'インフォレベルが出力される.' );
warnff( 'ワーニングレベルが出力される.' );
critff( 'クリティカルレベルが出力される.' );	

# パラメータを設定する場合
debugf( 'This is %s', 'debug log.' ); # $ENV{LM_DEBUG} がtrueの場合出力される
infof( 'This is %s', 'information log.' );
warnf( 'This is %s', 'warning log.' );
critf( 'This is %s', 'critical log.	' );

```

#### 実行結果
<pre>
2015-04-24T00:11:32 [DEBUG] デバッグレベル出力される. at log.test.pl line 6
2015-04-24T00:11:32 [INFO] インフォレベルが出力される. at log.test.pl line 7
2015-04-24T00:11:32 [WARN] ワーニングレベルが出力される. at log.test.pl line 8
2015-04-24T00:11:32 [CRITICAL] クリティカルレベルが出力される. at log.test.pl line 9
2015-04-24T00:11:32 [DEBUG] デバッグレベル出力される. at log.test.pl line 12
2015-04-24T00:11:32 [INFO] インフォレベルが出力される. at log.test.pl line 13
2015-04-24T00:11:32 [WARN] ワーニングレベルが出力される. at log.test.pl line 14
2015-04-24T00:11:32 [CRITICAL] クリティカルレベルが出力される. at log.test.pl line 15
2015-04-24T00:11:32 [DEBUG] This is debug log. at log.test.pl line 18
2015-04-24T00:11:32 [INFO] This is information log. at log.test.pl line 19
2015-04-24T00:11:32 [WARN] This is warning log. at log.test.pl line 20
2015-04-24T00:11:32 [CRITICAL] This is critical log.   at log.test.pl line 21
</pre>

### シリアライズ
``` perl:log.test.pl
use Log::Minimal;

my $info = {
	id   => 100,
	name => 'user_name',
	mail => 'mail_address'
};
local $Log::Minimal::AUTODUMP = 1;
infof( 'info:%s', $info );
```
#### 実行結果
<pre>
2015-04-21T23:59:59 [INFO] info:{'id' => 100,'mail' => 'mail_address','name' => 'user_name'} at log.test.pl line 9
</pre>

### ログフォーマットの変更
```perl:log.formatter.pm
package Log::Minimal;

$Log::Minimal::PRINT = sub {
	my ( $time, $type, $message, $trace, $raw_message ) = @_;
	print "$time ", ( $FORMAT->{$type}||"[$type] - " ), " $message at $trace\n";
};

1;

```

```perl:log.test.pl
use Log::Minimal;

require './log.formatter.pm';

infof( "フォーマット変更したよ" );

};
```
#### 実行結果
<pre>
2015-04-24T00:06:01 [INFO] -  フォーマット変更したよ at test.log2.pl line 5
</pre>

### ログ出力先の変更
```perl:output.pm
package Log::Minimal;

my $fh;

open ( $fh, '>>', 'application.log' );
local $SIG{ HUP } = sub {
	undef $fh;
	open ( $fh, '>>', 'application.log' );
};

$Log::Minimal::PRINT = sub {
	my ( $time, $type, $message, $trace, $raw_message ) = @_;
	print $fh "$time ", ( $FORMAT->{$type}||"[$type] - " ), " $message at $trace\n";
};

1;
```

```perl:test.pl
use Log::Minimal;

require './output.pm';

infof("出力先変更");
```
```log:application.log
2015-04-24T00:30:47 [INFO] -  出力先変更 at test.pl line 5
```
進捗率を表示するための ruby-progressbar gem を試す #ruby

## :gem: 概要
進捗率を表示するための ruby-progressbar gem を試しました

## <i class="fa fa-cloud-download" style="font-size:1em;"></i> インストール

~~~bash
$ gem install ruby-progressbar
~~~

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル1
デフォルトで実行

### サンプルコード

~~~ruby
require "ruby-progressbar"

pb = ProgressBar.create
10.times do
  pb.increment
  sleep 0.1
end
pb.finish
~~~

* 出力確認

![sample1.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/25540536-47f8-0b90-743d-ca2541a41dd3.gif)

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル2
様々なオプションを利用。
オプションの仕様は [公式 Wiki](https://github.com/jfelchner/ruby-progressbar/wiki) 参照

### サンプルコード

~~~ruby
require "ruby-progressbar"

pb = ProgressBar.create(
  :title => "(^_^)",
  :starting_at => 100,
  :progress_mark => '>',
  :remainder_mark => '#',
  :format => '%t: S%BE :%t',
  :total => 200,
  :length => 50
)

10.times do
  pb.progress += 10
  sleep 0.1
end
pb.finish
~~~

* 出力確認

![sample2.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/35e31c59-bdaa-b6ca-25f6-33dfa2deb379.gif)

## :books: 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [ruby-progressbar GitHub](https://github.com/jfelchner/ruby-progressbar)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [ruby-progressbar RubyGems](https://rubygems.org/gems/ruby-progressbar)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [ruby-progressbar wiki](https://github.com/jfelchner/ruby-progressbar/wiki)
Do Express Checkout Payment 呼び出し時のエラーについて

カード決済エラー（エラーコード10486）発生時の挙動をテストをするために、Sandboxで10486を意図的に出すテストアカウントを作成することは可能でしょうか。（Balanceをゼロにしたバイヤーアカウントだと決済が通ってしまう）
vim 折り返された行への移動

**vimで以下のように自動で折り返された時の上下の移動メモ**

![memo.jpg](https://qiita-image-store.s3.amazonaws.com/0/66506/ebda25c0-3b99-ad8f-f174-8652f393fb04.jpeg)

1.カーソル行から上へ。
gk

2.カーソル行から下へ。
gj
【cat】Linux コマンド

#cat [option] filename
ファイル内容を表示。

##option
`-a`
すべての制御文字を表示。

`-b`
空行に行番号を表示しない。

`-E`
行末に「＄」を表示。

`-n`
行番号を表示。

普段はoption無しで使ってますが、まあoptionを覚えなくても問題は無さそう...。
ちなみにcat（カット）は連結することを意味する「catenate」の略だそうです。※wiki参照。
cat(キャット)って呼んでたよw
DBSCANアルゴリズム（データクラスタリング）

こんにちは。
[DBSCAN](http://en.wikipedia.org/wiki/DBSCAN)アルゴリズムとは[^1]、データクラスタリングの一種で、近傍探索（[例](http://qiita.com/kkdd/items/c0fadee57b03f9f08d22)）と[素集合データ構造](https://ja.wikipedia.org/wiki/素集合データ構造)法との組み合わせに基づいています。

自分でも、scikit-learnのソース[^2]を読み、ほぼ引き写しで DBSCANアルゴリズム（depth-first型とbreadth-first型の二種）を書いてみました。

念のためscikit-learnによる結果と一致するかを検算しました。

```console
$ ./dbscan.py
True : depth-first
True : breadth-first
```

```dbscan.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function
import numpy as np
import sklearn.cluster
from scipy import spatial

def dbscandepth(neigh, minp):
    ilabel = 0
    labels = [-1 for _ in neigh]  # initialized as noise
    for i in range(len(neigh)):
        if labels[i] >= 0 or len(neigh[i]) < minp:  # visited or noise
            continue
        candid = [i]
        while len(candid) > 0:
            i = candid.pop()
            if len(neigh[i]) >= minp:  # core only
                for j in neigh[i]:
                    if labels[j] < 0:
                        candid.append(j)
                        labels[j] = ilabel
        ilabel += 1
    return labels

def dbscanbreadth(neigh, minp):
    def expandcandid(candid):
        candid = filter(lambda j: len(neigh[j]) >= minp, candid)  # core only
        if candid != []:
            candid = [neigh[j] for j in candid]
            candid = list(set.union(*map(set, candid)))
            candid = filter(lambda j: labels[j] < 0, candid)
        return candid
    ilabel = 0
    labels = [-1 for _ in neigh]  # initialized as noise
    for i, candid in enumerate(neigh):
        if labels[i] >= 0 or len(candid) < minp:  # visited or noise
            continue
        while len(candid) > 0:
            candid = expandcandid(candid)
            for j in candid:
                labels[j] = ilabel
        ilabel += 1
    return labels

def main():
    minp = 4
    radius = 0.1
    points = np.random.uniform(size=(100,2))
    labels_sklearn = list(sklearn.cluster.DBSCAN(radius, minp).fit(points).labels_  # scikit-learn

    tree = spatial.cKDTree(points)
    neigh = [tree.query_ball_point(p, radius) for p in points]  # 近傍探索

    labels = dbscandepth(neigh, minp)
    print(labels == labels_sklearn, ": depth first")
    labels = dbscanbreadth(neigh, minp)
    print(labels == labels_sklearn, ": breadth first")
    return 0

if __name__ == '__main__':
    main()
```

-------
[^1]: ここにも記事があります："[DBSCAN Blues](http://cjauvin.blogspot.ca/2014/06/dbscan-blues.html)"
[^2]: ソースは [_dbscan_inner.pyx](https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/cluster/_dbscan_inner.pyx) と [dbscan_.py](https://github.com/scikit-learn/scikit-learn/blob/21e63aaf01404f4eb3e7ae54ef9f71e8bb905f6b/sklearn/cluster/dbscan_.py)
Passenger の再起動コマンドがいつの間にか変わっていた件について

## <i class="fa fa-lightbulb-o fa-fw"></i>発端

僕が仕事で Rails アプリケーションを動かす際によくお世話になっている [Phusion Passenger](https://www.phusionpassenger.com/) (with Nginx) 。

最近、新しい Rails アプリケーションのために Capistrano でのデプロイ設定を行っていた時のこと。
Capistrano ([Capistrano::Passenger](https://github.com/capistrano/passenger/)) が Passenger を再起動する際に実行するコマンドが
見知らぬものに変わっていることに気づきました。

### 従来

```
$ touch tmp/restart.txt
```

### 現在

```
$ passenger-config restart-app
```

今までは `restart.txt` という空のテキストファイルを touch して再起動していたのに、
いつの間にか別の方法に変わってる！

## <i class="fa fa-history fa-fw"></i>経緯

いつから `passenger-config restart-app` というコマンドが使われるようになったのか。
それを調べるため [CHANGELOG](https://github.com/phusion/passenger/blob/master/CHANGELOG) の内容を追ってみました。
すると、Release 5.0.0 beta 1 の欄に以下の記述がありました。

> Touching restart.txt will no longer restart your app immediately. This is because, for performance reasons, the stat throttle rate now defaults to 10. You can still get back the old behavior by setting `PassengerStatThrottleRate 0` (Apache) or `passenger_stat_throttle_rate 0` (Nginx), but this is not encouraged. Instead, we encourage you to use the `passenger-config restart-app` tool to initiate restarts, which has immediate effect.

これをざっくり訳したのが以下です。

* 現バージョンでは restart.txt を touch してもアプリケーションは即座に再起動されない。
* これはパフォーマンス上の理由から passenger_stat_throttle_rate (Apache の場合は PassengerStatThrottleRate) のデフォルト値が 10 になったため。
* passenger_stat_throttle_rate を 0 に設定すると、`touch restart.txt` 後に即座に再起動されるという従来と同じ挙動になるが、推奨しない。
 * `passenger_stat_throttle_rate` は Passenger がファイルシステムを確認する間隔を設定するための項目。
 * この値が 0 の場合はリクエスト毎に restart.txt がチェックされる。
* アプリケーションを即座に再起動したい場合は代わりに `passenger-config restart-app` を使うことを推奨する。

なるほど、今後は Passenger を再起動したい場合は `passenger-config restart-app` コマンドを利用したほうがよさそうですね。
Linux 環境変数有効範囲

##`HOGE=aiueo`
このプロセス内で有効

##`export HOGE=aiueo`
このプロセスと子プロセスで有効
`HOGE=aiueo; export HOGE`
と同じ。

##`HOGE=aiueo command`
`command`実行中のみ有効
`command`の前にセミコロンがないことに注意
Serverspecをrspecコマンドで実行する

通常Serverspecは`$ rake spec`で実行する
一方、`rspec`コマンドで実行するとエラーになる

次の方法で`rspec`コマンドで実行できるようにできる
（もし、すでに一般的な対応方法があったら教えてほしい）

### 通常はrspecコマンドでエラーになる

`$ rake spec`で実行した後の出力の`Failed examples:`にrspecコマンドが表示される
その通りにrspecコマンドで実行すると以下のようなエラーになる

```
$ rspec ./spec/www.example.com/some_spec.rb:33
```
```
  1) Port "80" should be listening
     Failure/Error: it { should be_listening }
     TypeError:
       no implicit conversion of nil into String
```

または

```
/Users/user/.rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/net-ssh-2.9.2/lib/net/ssh/transport/session.rb:70:in `initialize': no implicit conversion of nil into String (TypeError)
```

## rspecコマンドで実行できるようにする設定

### シングルホストの場合

後述する複数ホストの場合のように、`RSpec.configure`でhostを設定しようと最初試したが、そもそもシングルホストの場合はフォルダからhostを取得する必要がない

なので、`dotenv`を使う方法が良い

```rb:Gemfile
gem 'dotenv'
```

```rb:spec/spec_helper.rb
require 'dotenv'
Dotenv.load
```

```text:.env
TARGET_HOST=www.example.com
```

実行結果

```
$ rspec

...
Failed examples:

rspec ./spec/www.example.com/sample_spec.rb:5 # Service "httpd" should be enabled
```

### 複数ホストの場合

想定している構成は`spec`以下にホスト名でディレクトリを切って複数管理しているケース（例. `spec/www.example.com/some_spec.rb` ）

```rb:spec_helper.rb
RSpec.configure do |c|
  c.add_setting :host_taken_from_path

  c.before do |example|
    if c.host.nil?
      c.host = example.metadata[:file_path].gsub('./spec/', '').split('/').first
      c.ssh_options = Net::SSH::Config.for(c.host)
      c.host_taken_from_path = true
    end
  end

  c.after do
    if c.host_taken_from_path
      c.host = c.ssh_options = nil
      c.host_taken_from_path = false
    end
  end
end
```

rspec実行


```
$ rspec ./spec/www.example.com/some_spec.rb:33

Port "80"
  should be listening

Finished in 4.77 seconds (files took 1.46 seconds to load)
1 example, 0 failures
```

### 制約

`RSpec.configure`でhostを設定する場合、次のような`os`の条件などが使えない(hostが空の時点でsshが走ってエラーになる)

```
describe service('httpd'), :if => os[:family] == 'redhat' do
```

### 留意点

`RSpec.configure`でhostを設定する場合、留意点としては失敗時に`On host 'www.example.com'`のログが出力されない
[ソース serverspec.rb](https://github.com/serverspec/serverspec/blob/master/lib/serverspec.rb)

`host_taken_from_path`と`after`のブロックを書かなければ出力されるようになるが、`ssh_options`をクリアしないことによって、以下のようにssh_options内の`:send_env`がおかしなことになる

```
{:auth_methods=>["none", "publickey", "password", "keyboard-interactive"], :host_name=>"XXX.XXX.XXX.XXX", :user=>"hoge", :keys=>["/Users/hoge/.ssh/id_rsa"], :send_env=>[/^LANG$/, /^LC_.*$/, "LANG", "LANG", "LANG", "LANG", "LANG", "LANG", "LANG", "LANG", "LANG", "LANG", "LANG", "LANG", "LANG", "LANG", "LANG", "LANG", "LANG", "LANG"]}
```

### 環境

- rbenv + Ruby 2.1.4
- serverspec (2.14.1), specinfra (2.30.0)
- セットアップは`UN*X`, `SSH`
- ホストの設定 `~/.ssh/config`
- `set :request_pty, true`
- 適当なsudoの設定

### その他

そもそものFailed examplesの部分の出力を変更することもできるかも

```
Failed examples:

rspec ./spec/www.example.com/some_spec.rb:33 # Port "80" should be listening
```
↓

```
rake spec SPEC=spec/www.example.com/some_spec.rb:33
```
初心者プログラマが初心者におすすめする初心者向けIT本

未経験でIT企業に新卒入社して１年。
いままで読んできて脱初心者へのステップアップに役立ったと思える本を紹介します。
（まだ初心者だけどね）

##プログラミング関連
####[プログラムはこうして作られる―プログラマの頭の中をのぞいてみよう](http://www.amazon.co.jp/プログラムはこうして作られる―プログラマの頭の中をのぞいてみよう-平山-尚/dp/479803925X)
私にとっての神本である。

初心者向けのプログラミング本によくある「if文はこうやって使います。for文はこうやって使います。以下略。」という教科書的な説明はない。
テ◯リスのようなゲームを作り上げることを通してプログラミングの楽しさとかエッセンスを教えてくれる本。

[出版社サイト](http://www.shuwasystem.co.jp/support/7980html/3925.html)でChapter0が立ち読みできるので気になったら読んでみると良いかも。

####[なぜ、あなたはJavaでオブジェクト指向開発ができないのか―Javaの壁を克服する実践トレーニング](http://www.amazon.co.jp/なぜ、あなたはJavaでオブジェクト指向開発ができないのか―Javaの壁を克服する実践トレーニング-小森裕介/dp/477412222X)

オブジェクト指向って利点も使い方もよくわかんねえ！という方に。
####[JavaScript本格入門　～モダンスタイルによる基礎からAjax・ｊQueryまで](http://www.amazon.co.jp/JavaScript本格入門%E3%80%80～モダンスタイルによる基礎からAjax・ｊQueryまで-山田-祥寛/dp/4774144665/ref=sr_1_1?s=books&ie=UTF8&qid=1429797702&sr=1-1&keywords=javascript本格)

JavaScript学習の取っ掛かりとしてとてもよかったです。なんか分かった気になる。Javascriptが好きになる。

##SQL・DB
３冊とも同じ著者の本。
基本情報試験ではSQL関連の問題をすべてスルーした私でもわかりやすかった。

####[ゼロからはじめるデータベース操作](http://www.amazon.co.jp/CD付-SQL-ゼロからはじめるデータベース操作-プログラミング学習シリーズ-ミック/dp/4798118818/ref=sr_1_3?s=books&ie=UTF8&qid=1429798156&sr=1-3&keywords=達人%E3%80%80SQL)

####[達人に学ぶ SQL徹底指南書](http://www.amazon.co.jp/達人に学ぶ-SQL徹底指南書-CodeZine-BOOKS-ミック/dp/4798115169/ref=sr_1_1?s=books&ie=UTF8&qid=1429798156&sr=1-1&keywords=達人%E3%80%80SQL)

####[達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ](http://www.amazon.co.jp/達人に学ぶDB設計-徹底指南書-初級者で終わりたくないあなたへ-ミック/dp/4798124702/ref=sr_1_2?s=books&ie=UTF8&qid=1429798156&sr=1-2&keywords=達人%E3%80%80SQL)

初級者で終わりたくないあなたへ...!

##その他IT本
####[「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか](http://www.amazon.co.jp/「プロになるためのWeb技術入門」-――なぜ、あなたはWebシステムを開発できないのか-小森-裕介/dp/4774142352/ref=sr_1_1?s=books&ie=UTF8&qid=1429798572&sr=1-1&keywords=プロになるためのweb技術)

上の方に書いた「なぜ、あなたはJavaで〜」と同じ著者。Webアプリ開発に携わるなら、ぜひ。

####[リーダブルコード](http://www.amazon.co.jp/リーダブルコード-―より良いコードを書くためのシンプルで実践的なテクニック-Theory-practice-Boswell/dp/4873115655/ref=sr_1_1?s=books&ie=UTF8&qid=1429798822&sr=1-1&keywords=リーダブルコード)
もはや説明不要か。
初心者じゃなくなっても繰り返し読みたい。かっこいいコード書けるようになりたい。


何かいい本に出会ったらまた追記しよう。
SQLとRDMMSとは

##RDBMS
-特徴
・２次元テーブルで表現
・表のデータの関連付けによる巨大なデータベース
・オンライントランザクション処理

-オープンソースのRDBMS
・PostgreSQL
・MySQL
・Firebirdなど


##SQLの機能
データ操作はもちろん、表の作成やユーザー権限の操作もできる


###制御機能
1.データベース定義言語(DDL)
データを格納する表を作成するときなどに使う言語

```
オブジェクトの作成:CREATE
オブジェクトの削除:DROP
ユーザー権限を付与:GRANT
ユーザー権限の削除:REVOKE

```





2.データベース操作(DML)

```
データを操作
データ検索:SELECT
テーブルに追加:INSERT
データを更新:UPDATE
データの削除:DELETE
```

3.トランザクション管理
回復や同時実行のための最小端子として保障される一連の処理の操作

####　　　　　start → 処理１ → 処理２ → end
特性４つ(ACID)

```
 A:原始性(Atomicity)
 -すべての処理は、有効になるか無効になるかの２択
 
 C:一貫性(Consistency)
 -実行前と実行後のデータの整合性を持つ
 
 I:隔離性(Isolation)
 -トランザクションA,トランザクションBが同時に行われる場合、
  Aが変更完了した後、Bが実行可能になる。
  
  D:持続性(Durability)
  -トランザクションで実行されるデータは、終了まで変化しない。
  
```

1.トランザクション開始の宣言:BEGIN TRAN
-処理の確定or取り消しまでに発行されるDML文を扱う
2.処理の確定 :COMMITE
3.処理の取り消し :ROLLBACK
-データ更新処理を検知する必要があるため、複数のDML文が発行される。
このときのエラー検知には、TRA~CATCH文を利用

```
BEGIN TRY
　　BEGIN TRANSACTION　　　　#トランザクションの開始

　　　　（DML文の発行）

　　COMMIT TRANSACTION　　　 #トランザクションを確定
END TRY

BEGIN CATCH　　　　　　　　　　#例外処理
　　ROLLBACK TRANSACTION　　 #トランザクションを取り消し
END CATCH
```

###コミット
  -トランザクションによるデータの変更処理が正常に終了した場合に、
  その変更処理を有効な結果と確定し、データに反映すること
  
  
####処理→処理→処理→COMMIT

  
###ロールバック
  トランザクションによるデータの変更処理の途中でなんらかの障害が発生した場合に、それまでの変更処理を無効にし、実行される前の状態に戻すこと
####  start→処理→処理-✖️-処理
##### 　　　　　　　　　　			   ↓
####　　　　　　　　  				  start
###排他制御
-トランザクション実行中に、トランザクションが対象としているデータをロックすることで、
データの整合性を確保する仕組み
-トランザクション完了時にロックを解除し、データへのアクセスを可能にする
###ロック 
トランザクションの特性の一つ隔離性
*共有ロック
-SELECT文によるデータの参照時のロック
-他のトランザクションからデータの参照は可能にするが、変更は不能とする
*排他ロック
-INSERT文、UPDATE文、DELETE文時のロック
-他のトランザクションからデータの参照も変更も不能とする
 
##サブクエリ
 -SQL文の中に埋め込み、データ抽出条件として利用
 -WHERE句やJOIN句の内側に記述するクエリのことを言う
 -複数のクエリを組み合わせて、１つのクエリが生成した出力で、
  他のクエリの出力を制御することができる。
ex)

```
WHERE句 
  SELECT 受注番号 FROM 受注表
         WHERE 商品コード IN
         (SELECT 商品コード FROM 商品表
          WHERE 単価 = 400);
```
```
HAVING句 
  SELECT 顧客コード,COUNT(DISTINCT 受注番号) FROM 受注表
         GROUP BY 顧客コード
         HAVING 受注個数 <
         (SELECT MIN(受注個数) FROM 受注表
          WHERE 顧客コード = '002');
```