OmniAICreator/Qiita-1.07M huggingface dataset:
PostgreSQL TIMESTAMP 2038年問題 安心

http://qiita.com/amymd/items/f92e5b7a6f4ab88ae62a

| 着眼点 | 性質 |
|:-:|:-:|
| 型名  | timestamp [ (p) ] [ without time zone ]  |
| 格納サイズ  |  8 バイト   |
| 説明  |  日付と時刻両方（時間帯なし）  |
| 最遠の過去  | *4713 BC*   |
| 最遠の未来  | *294276 AD*  |
| 精度  |  1μ秒、14桁   |

3000年問題も安心でうｓ
hubot をインストールするときの手順まとめ(Linux編) とcurl error(77)対策

## 0 手順概要
1 nvmインストール
2 nvmでnodejsインストール
3 npm のバージョンを最新にする
4 npmでyoemanと generator-hubotをインストール 
5 slackアダプターでhubot起動(おまけ)


##1 nvmインストール

- hubotを使うにはnodejsとnpmが必要。nodejsとnpmインストールするためにはnodejsのバージョン管理ツールnvmが必要。
- nodejsを直接インストールもできるようだがめんどくさい。
- たぶん、centos6系だとnvmのソースをダウンロードするときに以下のようなcurlのエラーがでるので対処が必要です

```bash
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.4/install.sh | bash
curl: (77) Problem with the SSL CA cert (path? access rights?)
```

- なので事前に次のようにssl証明書の設定を変更します(root権限で)

```bash
su -
mkdir /usr/src/ca-certificates && cd /usr/src/ca-certificates
wget http://mirror.centos.org/centos/6/os/x86_64/Packages/ca-certificates-2015.2.6-65.0.1.el6_7.noarch.rpm
rpm2cpio ca-certificates-2015.2.6-65.0.1.el6_7.noarch.rpm | cpio -idmv
cp -pi ./etc/pki/tls/certs/ca-bundle.* /etc/pki/tls/certs/
cp: overwrite '/etc/pki/tls/certs/ca-bundle.crt'? y
cp: overwrite '/etc/pki/tls/certs/ca-bundle.trust.crt'? y

```

- `ca-certificates-2015.2.6-65.0.1.el6_7.noarch.rpm`のバージョンは適宜変わるので自分で確認すること
- あらためてnvmインストール

```bash
exit # user権限に戻る この例ではvagrantユーザ
cd # homeに戻っていることを確認。念のため。
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.4/install.sh | bash  #バージョンは現時点の情報
export NVM_DIR="/home/vagrant/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm
source ~/.bashrc
nvm --version
0.31.4
```

##2 nvmでnodejsインストール

```bash
nvm ls-remote
         # ずらーっと出ます
         v4.4.0   (LTS: Argon)
         v4.4.1   (LTS: Argon)
         v4.4.2   (LTS: Argon)
         v4.4.3   (LTS: Argon)
         v4.4.4   (LTS: Argon)
         v4.4.5   (LTS: Argon)
         v4.4.6   (LTS: Argon)
         v4.4.7   (Latest LTS: Argon)
         v5.0.0
         v5.1.0
         v5.1.1
         v5.2.0
         # ずらーっと出ます
nvm install 4.4.7
Now using node v4.4.7 (npm v2.15.8)
Creating default alias: default -> 4.4.7 (-> v4.4.7)
# 安定板の最新バージョン4.4.7をインストールするとnpmも一緒にインストールされるがバージョンが古い。
```

##3 npm のバージョンを最新にする

```bash
npm install -g npm
npm -v
3.10.5
```

##4 npmでyoemanと generator-hubotをインストール

```bash
npm install -g yo generator-hubot
```

##5 slackアダプターでhubot起動

```bash
mkdir hubot # 任意の名前
cd hubot
yo hubot  #hubot 作成　
# adapterでslackを選ぶ
# hubot起動
HUBOT_SLACK_TOKEN=xxxxxx  bin/hubot --adapter slack

```
- トークンはslackのHubot設定ページから取得できる。ここでは詳細は割愛します。
GruntからS3にファイルアップロード

# 概要
　gruntでローカルのリソースをS3にアップロードする方法
　個人的な利用シーンとしては、モバイルアプリのビルド後に検証用に都度S3にアップロードするが、毎回手動でS3にアップロードするのはさすがにダルいので、その作業をスマートにするためにgruntでアップロードさせるようにしました

# 環境準備
　node.jsおよびgruntが導入済みという前提とさせて頂きます
　未導入の方は以下の記事をご参照ください

　[Grunt導入方法](http://qiita.com/shuntaro_tamura/items/6cf755d408eaad8572ad)

### grunt-awsのインストール（AWS接続用のプラグインの導入）

　詳細：[grunt-aws](https://github.com/jpillora/grunt-aws)

```
npm install --save-dev grunt-aws
```

# AWS認証用のjsonファイルの作成

　S3にAPI接続するためには**アクセスキーID**と**シークレットアクセスキー**が必要になります
　それらをもとに下記のjsonファイルを作成します
　取得方法は[こちら](https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSGettingStartedGuide/AWSCredentials.html)をご覧ください

　※IAMでユーザ作成直後にシークレットアクセスキーを控えていない場合は、
　　アクセスキーを再作成することで新たにシークレットアクセスキーを取得することができます
　　IAMで新規ユーザを作成した場合は、S3に適切なロールを適用していることが必要になります


```json:aws-credentials.json
{
    "accessKeyId": "aaaaaaaaaaaaaaa",
    "secretAccessKey":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
}
```

# gruntfile.jsの作成

　grunt実行するための設定ファイルの作成
　以下はサンプルの一例です
　サンプル以外にもパラメータがありますので、
　詳細は[こちら](https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSGettingStartedGuide/AWSCredentials.html)をご覧ください

```js:gruntfile.js
module.exports = function(grunt) {

    grunt.initConfig({
        aws: grunt.file.readJSON("aws-credentials.json"),    //上記のaws-credential.jsonを読み込む
        s3: {
            options: {
                accessKeyId: "<%= aws.accessKeyId %>",           //読み込んだaws-credentials.jsonのaccessKeyId値
                secretAccessKey: "<%= aws.secretAccessKey %>",   //読み込んだaws-credentials.jsonのsecretAccessKey値
                bucket: "バケット名",
                region: "ap-northeast-1",        //Tokyoであれば、そのままでOK
                //その他のregionは  http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
                cache: false,                    //アップロード対象のファイルに変更がなくてもアップロードする場合はfalse
                access: "public-read",           //アップロード後のアクセス権限を読み取り公開
                gzip: false                      //アップロード対象によってファイル(apk)が破損することがあるので、falseにしました
            },
            upload: {
                files: [{
                    cwd: "bin/",                 //ローカルのbinフォルダ配下
                    src: "**/*.html",            //binフォルダ配下のすべてのhtmlファイルを対象とする（ワイルドカードを使用可能）
                    dest: "public/"              //アップロード先のS3のバケット配下のディレクトリ
                },{
                    cwd: "dev/",                 //複数対象の場合は{cwd: "", src: "", dest: ""}を繰り返す
                    src: "**/*.js",
                    dest: "public/"
                }]
            }
        }
    });

    grunt.loadNpmTasks('grunt-aws');            //pluginの読み込み

    grunt.registerTask('upload-s3', ['s3']);    //gruntタスクに登録するタスク名は適当につけてOK

};
```

# gruntタスクの実行

```
 grunt upload-s3
```

# その他

　個人的にアップロード作業の簡素化を手軽に始められたのがgruntだったのでやってみましたが、もし、その他にGoodなアイデアがありましたら、ご教授頂ければ幸いです。ゆくゆくはJenkinsでビルドして、S3にアップロードさせるような一連のフローを作りたいです

以上
ファイルのパスなどのファイル名だけを検索する正規表現

例えば「AAA\BBB\match」の最後の区切り文字である「\」以降の文字列を検索したい場合は以下の様な正規表現で可能。

```text:正規表現
([^\\]+?)?$
```

実際に検索する文字列例を以下に表す。

```:検索文字列例1
AAA\BBB\match
```

```:検索文字列例2
AAA\BBB\CCC\
```

```:検索文字列例3
AAA\match
```

```:検索文字列例4
match
```

上記の正規表現で検索文字列例を検索すると「match」という部分が抽出できる。

注意としては2番目の検索文字列例2は最後に区切り文字があるため「CCC」が検索に引っかからない。
区切り文字が「/」の場合は正規表現の「\\」の部分を「/」にかえる。

```text:区切り文字スラッシュ正規表現
([^/]+?)?$
```

正規表現は「最後から検索してそれが見つかったらそれ以降を抽出、その文字列以前を抽出」みたいなことがまだ自由にできないのでもう少し勉強したいところ。何かおすすめの本とかサイトがあれば教えてください。
CentOS6でswiftclient

swiftclient3.0からはpython2.6をサポートしなくなりました。
（これまでも使うたびにwarningが表示）
そこで、まずはpython2.7をCentOS6に導入します。


できるだけ楽にpython2.7を導入するために下記のレポジトリを使います。

[The Software Collections ( SCL ) Repository](https://wiki.centos.org/AdditionalResources/Repositories/SCL)

```
yum install centos-release-scl
```

python2.7をインストールしてみます。

```
yum install python27
```

SCLでは、既存環境を汚さないように別のディレクトリにパッケージがインストールされます。
```
 /opt/rh/python27/
```

導入したパッケージを使う場合には環境変数を合わせることが必要です。
```
source /opt/rh/python27/enable
```
上記のenableファイルの中身はこんな感じです。

```
export PATH=/opt/rh/python27/root/usr/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/opt/rh/python27/root/usr/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export MANPATH=/opt/rh/python27/root/usr/share/man:${MANPATH}
# For systemtap
export XDG_DATA_DIRS=/opt/rh/python27/root/usr/share:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}
# For pkg-config
export PKG_CONFIG_PATH=/opt/rh/python27/root/usr/lib64/pkgconfig${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}
```

下記で新たにbashを動かすこともできます。

```
scl enable python27 bash
```

この環境でswiftclientをインストールします。
(swiftclientに必要なパッケージのインストール、またはアップデート)

```
pip install pip setuptools python-keystoneclient python-swiftclient --upgrade
```

無事swiftclient3.0が導入できました！

```
$ swift --version
python-swiftclient 3.0.0
```
PostgreSQLで強制的にデータベースを削除する

PostgreSQLのデータベースを削除しようとした時に、
`dropdb: database removal failed: ERROR:  database "hoge_db" is being accessed by other users`
他のユーザーがdetabaseにアクセスしてるから、そのデータベースは消せないよというエラー。

いろいろ試してみて削除できなかったので、半ば強制的に消す方法を書いておきます。

    psql -l //データベース名を確認
    psql postgres //postgreSQLにログイン
    \du //ユーザーと権限を確認
    
    ps aux | grep 消したいDB名 // 消したいDB名のプロセスID（数字）を確認
    sudo kill プロセスID
    //以下例
    sudo kill 45912
    dropdb -U postgres(もしくは消す権限のもったユーザー) 消したいDB名

* * *
強制削除処理の流れを再度ざっと書いておきます。
・postgreSQLで管理しているデータベース名を確認
・postgreSQLにpostgresユーザーでログイン
・ログイン後に`\du` コマンドでユーザーとユーザーの持つ権限を確認
・`\q`postgreSQLからログアウト
・`ps aux | grep 消したいDB名`でプロセスIDを確認
・`sudo kill プロセスID`でプロセスを削除
・`dropdb -U postgres 消したいDB名`で削除が出来ます。
もしこれで出来なかった場合は、`postgres`の部分を`\du`コマンドで確認した全ての権限を持っているユーザーに変更してみて下さい。
環境変数を検索して一括で unset するワンライナー

環境変数名を検索して一括で unset：
```
unset `env | grep -iE foo.*= | sed -e s/=.*//g`
```

環境変数の値を検索して一括で unset：
```
unset `env | grep -iE =.*foo | sed -e s/=.*//g`
```

# 説明
上記のワンライナーで、名前や値に foo （大文字小文字は不問）が入っている環境変数を unset できます。

# 応用
|したいこと|方法|
|:--|:--|
|大文字小文字が一致するように検索するには|grep の i オプションをなくします|
|名前と値両方を検索するには|grep の部分を `grep -i foo` とします|
【2038年問題】TIMESTAMP型の最大値は2038-01-09 03:14:07(UTC)【気をつけろ】

## TIMESTAMP型の最大値を知った

とあるDBの日時カラムに対して、試しに「2500年」と遠い未来の日時を設定しようとすると、MySQLのエラーが出て反映されない、という問題がありました。

原因を調査したところ、MySQLの日時の型のひとつであるTIMESTAMPでは、最大値が**2038-01-09 03:14:07（UTC）**であることがわかりました。
9999-99-99...が最大ではなく、まさか上限があったとは……！ :fearful:

この仕様により、2038年を過ぎるとさまざまなシステムが動作不良になるのではないかと言われているのが、**2038年問題**だそうです。
https://ja.wikipedia.org/wiki/2038年問題


## なぜ【2038年】なのか
なぜこの最大値がキリの良い時間ではないのかというと、その理由もWikipediaに書かれていました。

> 伝統的な実装ではtime_tをintとし、そのintは符号つき32ビットであった。このため最大値は (2^31 − 1) = 2,147,483,647 となり、取り扱えるのは2,147,483,647秒（≒ 68年）までに限られていた。これを前提として作成されたプログラムは、協定世界時における1970年1月1日0時0分0秒（日本標準時では1970年1月1日9時0分0秒）から2,147,483,647秒を経過した、2038年1月19日3時14分7秒（日本標準時では2038年1月19日12時14分7秒、閏秒は考慮していない）を過ぎると、この値がオーバーフローし、負と扱われる[2]ため、時刻を正しく扱えていることを前提としたコードがあれば、誤作動する。

符号付き32ビットだったため、このような中途半端な期間になっているそうです。
TIMESTAMPは2038年に爆発する時限爆弾 :bomb: だったんですね…おそろしい…。

~~ということで、特に問題が無ければTIMESTAMPではなくDATETIMEを使うようにしましょう！~~ 
~~（DATETIMEの範囲は'1000-01-01 00:00:00' から '9999-12-31 23:59:59'）~~

＊追記＊
コメントでご指摘いただきましたが、DATETIME型はタイムゾーンの影響を受けないという問題があるそうです。
http://qiita.com/yuba/items/7852a29d63d6279c6f6e

TIMESTAMP型を使い続けて、MySQLが対応してくれるの待つか、
もし今すぐにでも2038年以降の設定を使うのであれば、PostgreSQLに乗り換えるのが良さそうです！
http://qiita.com/jTakasuRyuji/items/5e50e8f298613f99c870#_reference-89d14067d7440fe8eebb
ReactReduxの役割を整理

## はじめに
[こちら](http://redux.js.org/docs/basics/UsageWithReact.html)に記載があるように、

> From the very beginning, we need to stress that Redux has no relation to React. You can write Redux apps with React, Angular, Ember, jQuery, or vanilla JavaScript.

ReactとReduxはそれぞれ独立している。ただ、組み合わせて使うことは一般的であるため、[ReactRedux](https://github.com/reactjs/react-redux)というReduxをReactにバインドさせるためのライブラリがある。そしてこのライブラリは、`connect`と`Provider`というAPIを提供している。

## ReactReduxの使用前後のコードを比較する
まずは、使用前後のコードを並べる。

### connect
これが

```js:ReactReduxを使わずにコンテナコンポーネントを作る
class VisibleTodoList extends Component {
  componentDidMount () {
    const { store } = this.context;
    this.unsubscribe = store.subscribe(() => 
      this.forceUpdate()
    );
  }
  
  componentWillUnmount() {
    this.unsubscribe();
  }

  render () {
    const props = this.props;
    const { store } = this.context;
    const state = store.getState();
    
    return (
      <TodoList
        todos={
          getVisibleTodos(
            state.todos,
            state.visibilityFilter
          )  
        }
        onTodoClick={id =>
          dispatch({
            type: TOGGLE_TODO,
            id
          })
        }
      />
    )
  }
}
VisibleTodoList.contextTypes = {
  store: React.PropTypes.object
}
```

こうなる

```js:ReactReduxを使ってコンテナコンポーネントを作る
/*
 *  VisibleTodoList
 */

const mapStateToProps = (state) => {
  return {
    todos: getVisibleTodos(
      state.todos,
      state.visibilityFilter
    )  
  };
};

const mapDispatchToProps = (dispatch) => {
  return {
    onTodoClick: (id) =>{
      dispatch({
        type: TOGGLE_TODO,
        id
      });      
    } 
  };
};

const { connect } = ReactRedux;
const VisibleTodoList = connect(
  mapStateToProps,
  mapDispatchToProps
)(TodoList);
```

### Provider

これが

```js
const { createStore } = Redux;

class Provider extends Component {
  getChildContext () {
    return {
      store: this.props.store
    }

  render () {
    return this.props.children
  }
}

Provider.childContextTypes = {
  store: React.PropTypes.object
}

ReactDOM.render(
  <Provider
    store={createStore(todoApp)}
  >
    <TodoApp />
  </Provider>, 
  document.getElementById('app')
);
```

こうなる

```js
const { Provider } = ReactRedux;
const { createStore } = Redux;


ReactDOM.render(
  <Provider
    store={createStore(todoApp)}
  >
    <TodoApp />
  </Provider>, 
  document.getElementById('app')
);
```

## 何がどうなったか
Reduxのルールに則って、コンポーネントを作るときに書かなくてはならないボイラープレートが減った。

### 1. ライフサイクルメソッドがなくなる
コンテナコンポーネント（この例では`VisibleTodoList`）をルートとして、`store`の更新のたびに`render`処理を発火させたい。そのため、コンポネーントをマウントしたタイミングで`store.subscribe()`でコールバック関数を登録し、アンマウント時には`store.unsbscribe()`する必要があったがそれがなくなった。

### 2. 暗黙的な`store`の引き渡しのための記述がなくなる
プレゼンテーショナルコンポーネントに`Props`を延々引き渡すのは野暮ったいので、`Context`を使って暗黙的に引き渡すようにしたい。そのためには、`store`を`this.context`から取得することと、そのコンポーネントの`contextTypes`を設定する必要があったがそれを意識しなくなった。また、`Props`を渡す親のコンポーネントに対する記述（この例では`<Provider>`）はごそっと実装しなくて良くなった。

## 終わりに
Reactを使うときに何が何でもこのAPIを使う必要はない。ただコンテナコンポーネントを作るときに必ず書くことになるコード片の総量が減り、より本質的な部分だけに集中できるようになる。
MSC-MOD20 > SD初期化 > カードがない時の応答が!11ではなく応答がない

```txt:動作確認
ESP8266 (気圧計で使用したユニバーサル基板: I2Cを4.7kでプルアップ)
SDモジュール: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
Analog Discovery 2 (以下AD2)
```

http://qiita.com/7of9/items/cf075be6433178952eb6
の続き。

MSC-MOD20の癖を見つける。

SDカードがない時のSD初期化処理の戻り値がどうもおかしい。
取説では以下の記載があるが、実際には`!11`が戻らない。

> `!11` (マイクロSDカードが正しく装着されていない場合に戻ります。）

AD2で波形を見た。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ecc2c71f-6d92-ba44-9e4f-6486b10c9cfb.png)

Iコマンドに対して応答がない。

日本語取説は古いバージョンの情報に基づいているのかもしれない。
英語取説を参照する方がいいかもしれない。

あるいは0x00を受けた後にもさらに数文字読まないといけないのだろうか？
0x00はNo Data Tokenなので、そうではない気もする。
[XCode][iOS] sqliteのファイルパスを簡単に探すためのスクリプト(Scala版)

[この記事](http://qiita.com/eidera/items/94492f278d22d6aebe95)のrubyスクリプトを、Scalaの勉強もかねてScalaでも書いてみた。

build.sbtなど含めて[ここ](https://github.com/eidera/get-xcode-appli-path)に置いた。

```
  https://github.com/eidera/get-xcode-appli-path
```

ファイル検索にglobを使いたくて、better.filesという外部ライブラリを使っている。

自前で作るのに比べてかなり労力が減った。ライブラリ作者に感謝。

```scala:GetXcodeAppliPath.scala
import better.files._
import java.io.{File => JFile}
import scala.xml.{Node, XML}

// This class hold all device information of defined by device_set.plist
class DeviceHolder {
  var device = Map[String, Seq[String]]()

  def push(id: String, os: String, model: String): Unit = {
    device += (id) -> Seq(os, model)
  }

  def get(id: String): String = {
    toString(device(id))
  }

  def getIds(): Iterable[String] = {
    device.keys
  }

  private def toString(value: Seq[String]): String = {
    value(0) + " " + value(1)
  }
}

class DeviceSetPlistReader(filename: String) {
  val holder = new DeviceHolder

  def execute: DeviceHolder = {
    val osList = (XML.loadFile(filename) \ "dict" \ "dict").head \ "_"

    var osName = ""
    osList.foreach { os =>
      os.label match {
        case "key" => osName = trimming(os.text)
        case "dict" => readDeviceId(os, osName)
        case _ => // nop
      }
    }

    holder
  }

  private[this] def trimming(text: String): String = {
    text.split('.').last
  }

  private[this] def readDeviceId(os: Node, osName: String): Unit = {
    /**
     * Ex.
     *   <key>com.apple.CoreSimulator.SimDeviceType.Resizable-iPad</key>
     *   <string>DEVICE_ID1</string>
     *   <key>com.apple.CoreSimulator.SimDeviceType.Resizable-iPhone</key>
     *   <string>DEVICE_ID2</string>
     */
    var model = ""
    val modelList = os \ "_"
    modelList.foreach { element =>
      element.label match {
        case "key" => model = trimming(element.text)
        case "string" => holder.push(element.text, osName, model)
        case _ => // nop
      }
    }
  }
}

object Main {
  def main(args: Array[String]): Unit = {
    val homeDir = System.getProperty("user.home")

    val deviceSetPlist = homeDir + "/Library/Developer/CoreSimulator/Devices/device_set.plist"
    val sqliteTargetDir = homeDir + "/Library/Developer/CoreSimulator/Devices"
    val sqliteList = "**/data/Containers/Data/Application/**/Documents/*.sqlite"

    val reader = new DeviceSetPlistReader(deviceSetPlist)
    val holder = reader.execute

    var files = File(sqliteTargetDir).glob(sqliteList)
    files.foreach { file =>
      val filePath = file.pathAsString
      val dirs = filePath.split('/')
      val deviceId = dirs(dirs.length - 8) // Device ID is in the 8th from behind.
      val applicationName = dirs(dirs.length-1).replaceAll(".sqlite$", "")
      printf("%s\n  %s\n    %s\n", applicationName, holder.get(deviceId), filePath)
    }
  }
}
```
Rubyのmapやselectでもeach_with_indexみたいにindexを使いたいときはEnumerator#with_index

## Rubyで便利なEnumerable module.

eachが定義されているクラスであればincludeできるこのmoduleですが、Array Hashなどが最初からincludeしており、そのおかげでeach_with_index, min, max, select, map, all?/any?, sort ... などといったrubyでは欠かせないメソッド群が使用できるようになります。

## Enumerableなクラスのインスタンス(Enumerator)はEnumerator#with_indexが使える
さて、このように様々なメソッドがあるEnumerableですが、時たま使いたくなるのはeach_with_indexの**with_index**の部分。

要素ごとにリストの中での位置を何らかの方法で取得するのもいいんですが、mapやselectのときでも最初からindex使えるといいのになーと思って調べていたら**Enumerator#with_index**なる便利なものがあるやんけ。

```rb
[100, 200, 300].map.with_index { |num, index| [num, index] }
#=>  [[100, 0], [200, 1], [300, 2]]

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
  .select.with_index { |num, index|( num % (index + 1)).zero? }
#=> [1, 5, 144]
```

ここでのミソは、Enumerableのメソッドの内幾つかのメソッドが**ブロックをとらないときにEnumeratorを返す**ところであり、以下のメソッド群がそれに当たります。

- map / colect
- flat_map / collect_concat
- cycle
- find / detect
- drop_while
- each_cons
- each_entry
- each_slice
- each_with_index
- each_with_object
- find_all / select
- find_index
- group_by
- max_by / min_by / minmax_by
- partition
- reject
- reverse_each
- slice_before
- sort_by
- take_while


これは便利！

## 参照: Ruby リファレンスマニュアル
http://docs.ruby-lang.org/ja/2.3.0/class/Enumerable.html#I_COLLECT

もう一回丁寧に読む事にする。
ddコマンドのbsサイズ

ddコマンドを使って、イメージファイルをsdcardとかに書き込む際に、bsオプションを使ってバッファリングサイズを調整すると、早くなります。
(参考：[dd コマンドの bs の値の意味を詳しく教えてください。](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14114681214#a263974273))

いくつにするのがいいのか、というのを、いつも忘れてしまうので、調べるスクリプトを貼っておきます。
元のソースコードは [server fault - How to determine the best byte size for the dd command](http://serverfault.com/a/148121)より。

```shell-session
#!/bin/bash
#
#create a file to work with
#
echo "creating a file to work with"
dd if=/dev/zero of=/var/tmp/infile count=1175000

for bs in  16m 32m 64m 128m 256m 512m

do
        echo "---------------------------------------"
        echo "Testing block size  = $bs"
        dd if=/var/tmp/infile of=/var/tmp/outfile bs=$bs
        echo ""
done
rm /var/tmp/infile /var/tmp/outfile
```

私のMac Miniではこんな感じでした。いつも`bs=32m`で指定していましたが、`bs=16m`のが早いわけですね。

```
$> ./test_dd_bs.sh 

creating a file to work with
1175000+0 records in
1175000+0 records out
601600000 bytes transferred in 3.716253 secs (161883487 bytes/sec)
---------------------------------------
Testing block size  = 16m
35+1 records in
35+1 records out
601600000 bytes transferred in 1.312157 secs (458481751 bytes/sec)

---------------------------------------
Testing block size  = 32m
17+1 records in
17+1 records out
601600000 bytes transferred in 1.512825 secs (397666614 bytes/sec)

---------------------------------------
Testing block size  = 64m
8+1 records in
8+1 records out
601600000 bytes transferred in 1.472201 secs (408639823 bytes/sec)

---------------------------------------
Testing block size  = 128m
4+1 records in
4+1 records out
601600000 bytes transferred in 1.510589 secs (398255218 bytes/sec)

---------------------------------------
Testing block size  = 256m
2+1 records in
2+1 records out
601600000 bytes transferred in 1.574169 secs (382169855 bytes/sec)

---------------------------------------
Testing block size  = 512m
1+1 records in
1+1 records out
601600000 bytes transferred in 1.684105 secs (357222349 bytes/sec)
```
Crystalで作ったプロジェクトのbump upをするツール「vup」を作った

Crystalで作ったプロジェクトのbumpupをするツール「vup」を作りました。

## <i class='fa fa-history'></i>経緯
Crystal でプロジェクトを作るとバージョンを2箇所設定する必要があります。

* %project%/src/hoge/version.cr
* %project%/shard.yml

です。

Rubyの場合、 gemspec からのversion参照は

```ruby
Gem::Specification.new do |spec|
  spec.name          = 'eto'
  spec.version       = Eto::VERSION
  :
```

のように、 version.rb の内容を参照しているため
version 変更が必要なファイルは version.rb のみです。
内部DSLのメリットですね。

Crystalでバージョンアップする時に2ファイルを手メンテするのが
億劫になってきたのでツールを作りました。

## <i class="fa fa-wrench" style="font-size:1em;"></i> vup
vup という Crystal 製のツールを作りました。

* [tbpgr/vup - GitHub](https://github.com/tbpgr/vup)
* [tbpgr/homebrew-vup - GitHub](https://github.com/tbpgr/homebrew-vup)

brew package としてインストール可能にしてあります。

### <i class="fa fa-download" style="font-size:1em;"></i> Install
```bash
$ brew tap tbpgr/vup
$ brew install vup
$ vup -v
0.1.0
```

### <i class="fa fa-flask" style="font-size:1em;"></i> Demo
### version up (patch)
```bash
$ cat shard.yml
name: hoge
version: 0.1.2
$ cat ./src/hoge/version.cr
module Hoge
  VERSION = "0.1.2"
end

$ vup --patch

$ cat shard.yml
name: hoge
version: 0.1.3
$ cat ./src/hoge/version.cr
module Hoge
  VERSION = "0.1.3"
end
```
### version up (minor)
```bash
$ cat shard.yml
name: hoge
version: 0.1.2
$ cat ./src/hoge/version.cr
module Hoge
  VERSION = "0.1.2"
end

$ vup --minor

$ cat shard.yml
name: hoge
version: 0.2.0
$ cat ./src/hoge/version.cr
module Hoge
  VERSION = "0.2.0"
end
```

### version up (major)
```bash
$ cat shard.yml
name: hoge
version: 0.1.2
$ cat ./src/hoge/version.cr
module Hoge
  VERSION = "0.1.2"
end

$ vup --major

$ cat shard.yml
name: hoge
version: 1.0.0
$ cat ./src/hoge/version.cr
module Hoge
  VERSION = "1.0.0"
end
```
はじめてのChromecastアプリ開発

言ってしまうと https://developers.google.com/cast/ に書いてあるとおりのことをやってるだけです。。

# デバイス登録する
デバイス登録は今回使用するChromecastを開発用として使うための必要な作業です。
つまり、デバイス登録することにより公開前のアプリケーションをCastすることができるようになります。

- GoogleのキャストSDKの開発者コンソールからログインします（アカウント登録に5ドル程度かかります）
- デバイス->ADD NEW DEVICE を選択します
- 「Serial Number」にChromecastに記載されたSerial Numberを入力します

その後デバイス登録完了まで、約15分かかります。STATUS が「Ready For Testing」になれば完了です。
Chromecastを再起動してください。

# ChromeブラウザからCastするための拡張機能を追加
Google Cast app or Chrome extension.を拡張機能として追加してください

# Castするソースを設置します
https://developers.google.com/cast/docs/downloads から今回使用するソースコードを取得します

## Senderのソースコードを取得する
```
$ git clone https://github.com/googlecast/CastReferencePlayer
```
SenderはWEBで公開されている環境であればどこでも構いません。

```
http://yourdomain.com/chromecast_test/sender/CastVideos-chrome/index.html
```
でアクセスできるようにしました。

## Reciverのソースコードを取得する
```
$ git clone https://github.com/googlecast/CastReferencePlayer
```
ReciverはHTTPS通信が必要です。

```
https://yourdomain.com/chromecast_test/receiver/CastHelloVideoPlayer/receiver.html
```
でアクセスできるようにしました。

# アプリケーション登録する
デバイス登録と同様にGoogleのキャストSDKの開発者コンソールからログインします

- Applications -> ADD NEW APPLICATION を選択します
- アプリケーションのタイプを選択します
    - Remote Display Receiver
        - UIを変更することができないので、まずは再生確認を という場合はコチラを選択する
    - Styled Media Receiver
        - 標準のスタイルからロゴ、スタイルのみを変更する場合はコチラを選択する
        - StypeのURIを指定することができます
    - Custom Receiver
        - UIを自由に設定できるReceiverです。通常はコチラですね。
- Custom Receiver を選択し、Receiver Application URLに先ほど設置したReciverのURLを指定します

これでCastテストを行なう環境は整いました。
あとはSenderのURLからアクセスしてCastを行ってみてください。
Gitbook v3.2.0 だと serve=>watch がうまくいかなかった＠windows


# Gitbook 触ってみました（いまさら）

環境は Windows10

```bash
$ node -v
6.2.0
$ npm -v
3.10.1
```

な感じです。タイトル通りでうまくいかなかった。

## serveするがwatchでリビルドしない

serve してからファイル更新すると、

```bash
Stopping server

Error: EPERM: operation not permitted, mkdir 'C:\Users\xxxxx\xxxxx\_book'
```

コマンドプロンプトを管理者権限で起動などいろいろしてみたがダメ。

解決策：v3系だと上手くいかないので、`gitbook fetch 2.6.7` してから、`gitbook serve --gitbook=2.6.7` する。


## styles-sass プラグインが古い

https://github.com/GitbookIO/plugin-styles-sass/issues/5

にある通り。

`node-sass` ビルドできなくて使えない。nodeのバージョン、4系にしたらうまくビルドした。そしてこのプラグイン、watchでビルドとかしてくれないのを知り白目になる。
Pythonでunittestを実行する（初心者用）

## はじめに
Pythonを初めて使ったときに、unittestを使うまでに苦戦したので、スムーズに使えるための記事です。
しかもPythonの基本を理解していないと使い始めるのも難しいためまとめました。
※動作確認はPython2.7で行いました。

上手く実行できるディレクトリ構成は以下。

``` tree
.
├─sample.py
└─tests
  ├─__init__.py
  └─test_sample.py
```

## サンプルソース
``` sample.py
def add(x, y):
    return x + y
```

``` test_sample.py
import unittest
import sample

class TestSample(unittest.TestCase):
    def test_add(self):
        self.assertEqual(sample.add(1, 2), 3)

if __name__ == "__main__":
    unittest.main()
```

## テストの実行方法
python -m unittest tests.test_sample
とunittestのスクリプトで実行する

## 学んだこと
上記の方法で上手くテストが実行できるのですが、以下の点を学びました。

```__init__.py``` って何？と思いましたが、このファイルがあるディレクトリはpythonのパッケージとして扱われるようです。そのためsample.pyがあるディレクトリから実行コマンドで、「tests.test_sample」の「tests.」でパッケージを指定して実行できるようです。

※Python2.7では```__init__.py```がないとパッケージと認識してくれなかったので必要なのですが、Python3.5ではなくてもパッケージと認識されるため不要です。

またtest_sample.pyでimportをしているのですが、importの検索パスは、色々ありますが、実行パスがその一つ。sample.pyがあるディレクトリから実行することで「import sample」でimportできるようです。

## 実験
学んだことを実感するために以下の実験を行っています。

python tests\test_sample.py
で実行してみる。

``` error
Traceback (most recent call last):
  File "tests\test_sample.py", line 2, in <module>
    import sample
ImportError: No module named sample
```

sample moduleが見つからないとのエラー。実行パスは、testsディレクトになっているようで、その一つ上の階層にいるsampleは見つからないようです。

しかしtest_sample.pyをsample.pyのディレクトリと同じ階層に置いて、
python test_sample.py
を実行すると正しく動きます。
python -m unittest test_sample
こちらでも正しく動きます。

ディレクトリ構成をもとに戻してから、```__init__.py``` ファイルを削除して
python -m unittest tests.test_sample
を実行すると
ImportError: No module named tests
のエラー。パッケージとして認識されないようです。

最後に、testsディレクトリに移動して、
python test_sample.py
を実行すると
ImportError: No module named sample
のエラー。
python -m unittest test_sample
でも同じエラーです。つまり実行ディレクトリにsampleがないからimportできないことになります。

## 感想
pythonでunittestを使おうとしただけなのに、パッケージの指定の仕方やimportできるディレクトリの考え方など学ぶことがとてもたくさんありました。簡単にできなかったことから学びが多かったです。これで今後のpythonのプログラミングもスムーズに行ける気がします。

## 合わせて読みたい
[Pythonのunittestでまとめてテストを実行する方法](http://qiita.com/takus69/items/56f227eea342bd2c95d7)
parent()・parents()・closest()の違い

ある要素の上の階層にある要素を取得するメソッドの違いを説明します。

## メソッドの概要
- `parent([selector])` : 1個上の階層の要素を取得
- `closest(selector)` : セレクタに合致する、直近の階層の要素を取得
- `parents([selector])`　: 上の階層の全ての要素を取得

## 実行してみる
ChromeDeveloperToolsなどにコピペして実際に指定してみてくださいね

``` html
<html>
<head>
  <script type="text/javascript" src="http://code.jquery.com/jquery-3.1.0.min.js"></script>
</head>
<body>
  <div id="parent-a">
    <h1>見出し</h1>
    <div id="parent-b">
      <div id="parent-c">
        <div id="child"></div>
      </div>
    </div>
  </div>
</body>
</html>

```

``` javascript
$('#child').parent(); 
  -> [<div id="parent-c">..</div>]

$('#child').closest('#parent-c'); 
  -> [<div id="parent-c">..</div>]

$('#child').parents(); 
  -> [<div id="parent-c">..</div>, <div id="parent-b">..</div>, <div id="parent-a">..</div>, <body>..</body>, ..]
```

## parent()とclosest()の違い
- `parent()` : 1個上の階層の要素しか取得できない
    - 上の例だと、`$('#child')`からは、`parent-c`しか取れない
- `closest()` : 1個上とは限らず、条件に合致する最も近い階層の要素を取得できる
    - 上の例だと、`$('#child').closest('parent-b')`などで、親の親要素である`parent-b`を取ることもできる
CentOS7.2をXenServer6.5へインストールする際にブラックアウトしてしまう時の対処

グラフィカルインストールをする際に、GUIがブラックアウトして固まってしまう事象が発生した。

CDブート直後、[Tab]キーを入力する
ブートオプションに以下を追加する
`modprobe.blacklist=bochs_drm`

参考）CentOS 7-1503 Installer gives blank screen
https://discussions.citrix.com/topic/364226-centos-7-1503-installer-gives-blank-screen/
開発支援環境

＜目次＞
1：eclipse
2：SonarQube
3：Jenkins
4：Gradle
5：Maven
6：Spock
7：TFS
8：visual studio
9：GitBucket
10：Redmine
11：Junit
12：Selenium
13：Flyway
14：nexus


<font size="6">
<br>



【eclipse（エクリプス）】
■機能
・自動的にコンパイルを実行
・コーディング支援（コードテンプレート）
・インポート文を自動追加


■特徴
・IBMによって開発された統合開発環境
・オープンソースであり、主にJAVA言語で開発される
→eclipse自体もjavaで作られている
<br>


【SonarQube(ソナーキューブ)】
■機能
・書かれたソースコードに静的解析チェックを実行してWEBで閲覧が可能
・プログラムの複雑度をチェックすることが出来る


■特徴
・プログラムの重複箇所をweb実行により確認可能
・プログラムの重複度をチェックするこよにより品質管理に繋がる
・対応言語：Java,Android,C,C++,C#,PHPなど
・日本語の情報が不十分で問題に直ぐに対応できない
<br>


【Jenkins（ジェンキンス）】
■機能
・継続的インテグレーションツール
→ビルドやテストを頻繁に繰り返し行うことにより、早期に問題を発見することでバグを防ぐことが出来る

・外部で起動するジョブの実行を監視
※ジョブとはコンピュータが行なう作業（一連のプログラムの流れ）

■特徴
・Javaで書かれたWEBベースのソフトウェア
→インストール後に解説されるwebサイトから管理の設定や変更を行うことが出来る

<br>

【Gradle(ガーディル)】
■機能
・Mavenのリポジトリを利用
※リポジトリ（ファイル状態を記録する場所）
・Java VM（仮想マシン）上で動作する
・動的スクリプト言語（Groovy）を記述することが出来る

■特徴
・JAVA環境におけるビルドシステム
・主にAndroidのビルドシステムとして採用されていることが多い
　→Android Studioではデフォルトのビルド
・メインはJAVAであるが、C,C++,Objective-Cのサポートもある
・ビルドの実行は遅めである
<br>

【Maven（メイヴェン）】
■機能
・ビルドツールとして使用
→実行可能ファイルを作成

・プロジェクトの依存するライブラリの管理
・プロジェクト情報の配信（テストレポートなど）
・プロジェクトの作成からコンパイル、テスト、パッケージング、配備などのプロジェクトのライフサイクルに含まれる各タスクの支援。

■特徴
・チーム開発に便利
→開発者のパソコンにmavenをインストールしておけばコマンドを一度、実行するだけでソースコードを用意して貰える

<br>

【Spock(スポック)】
■機能
・テストを実行することが出来る
・表形式でテストデータを入力することが可能

■特徴
・javaとgroovyのテスト用フレームワーク
・DSLを使った簡潔で分かりやすい記述
・他の開発支援環境とも連携できる

<br>

【TFS(ティーエフエス)】Team Foundation Server の略
■機能
・バッグログ管理（顧客からの要求など）
・タスク管理（作業項目の進捗など）
・バグ管理（バグを共有出来る）

■特徴
・ソフトウェア開発の支援をするものである。
→動作にはwindows serverとIISが必要

<br>

【visual studio(ビジュアルスタジオ）】
■機能
・ビルド
・デバッグ実行
・ローカルウインドウ、ウォッチウィンドウ
→変数の中の値表示
・出力ウインドウ
→メッセージ表示（警告/エラー)
・プリプロセッサ処理
→ コンパイルを行なう前に事前に処理をする

■特徴
・webアプリケーションを開発する為の統合開発環境
・単体のプログラム言語だけではなく、幅広い言語に対応
・windowsのアプリケーション開発に使用される

<br>

【GitBucket（ギットバケット）】
■機能
・ソフトウェア開発プロジェクトのための情報共有サービス
・コミット時のコメント機能

■特徴
・git hubのクローン
リポジトリビューア、イシュー、Wiki、リポジトリのフォークやプルリクエストなどの基本的機能はgithubと同じように利用することが出来る
・オープンソースソフトウェア
→誰でも使用可能

・個人で開発されたもののため、サポートサービスが存在しない

<br>
【Redmine（レッドマイン）】
■機能
・プロジェクト管理が行なえる
→タスク管理、進捗管理、情報共有

■特徴
・web型のアプリケーションで複数人が同時にアクセスできるので、開発者同士が離れていても一緒に作業を進めることができる
・システム開発をしていく上で、バグ管理、作業確認、顧客からの問い合わせに対する回答などを記録することが出来る
・設置したサーバーの記録を取り、いつでも見ることを可能とする

<br>
【Junit（ジェイユニット）】
■機能
・単体テストの自動化が可能
→仕事を効率的に行なえる

■特徴
・一度、テストコードを作成すると直ぐにテストが出来るが、仕様変更する度にテストコードを作らなければならない欠点がある
・javaプログラムの単体テストを行なうためのツール
・独自のテストコードによるテストの必要性がない

<br>

【Selenium（セレニウム）】
■機能
・WebのUIテストを自動化が可能
・ブラウザに表示される動作について、想定した動作が出来ているか確認すること出来る。

■特徴
・自動化のためのテストコードの作成は比較的容易
・ブラウザを選ばずに実行可能
→既存のブラウザなら殆ど使用できる

<br>

【Flyway（フライウェイ）】
■機能
・データベースの状態管理が可能
・適用したパッチがテスト環境に反映されているか分かる

■特徴
・データベース管理がメインであるが、データベース環境も構築することが出来る

<br>


【nexus（ネクサス）】
■機能
Webブラウザ上からmavenのリポジトリ管理が可能
※リポジトリ（ファイル状態を記録する場所）

■特徴
・開発環境の一部として別にリポジトリをしたい場合にnexusを使用することでプライベートなリポジトリを立てることが出来る



</font>
Spring AOPを使ってみる

関数の開始と終了をログに出力する処理をAOPでやってみようと思い、Spring AOPを試してみました。
「Spring徹底入門」によるとSpring AOPを利用するために以下ライブラリが必要とのこと。

```pom.xml
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjweaver</artifactId>
</dependency>
```

上記説明を最初みたとき、「バージョンは不要？」と思ったけど、必要でした。
まあ、バージョンは日々変わるから\<version\>表記を省いたのでしょう。

で以下のバージョンを指定
※Spring MVCプロジェクト作成したとき、spring-contextはデフォルトで設定されているのでspring-aopとaspectjweaverを追加

```pom.xml
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>4.3.1.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-aop</artifactId>
	<version>4.3.1.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjweaver</artifactId>
	<version>1.8.9</version>
</dependency>
```

Aspectクラスを実装

```MethodAspect.java
package jp.co.spring.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MethodAspect {

	private static final Logger logger = LoggerFactory.getLogger(MethodAspect.class);

	@Before("execution(* *..*Controller.*(..))")
	public void startLog(JoinPoint jp) {
		logger.info("========start: " + jp.getSignature() + " ==========");
	}

}
```

servlet-context.xmlにAOP使用設定を追加
\<aop\>タグを使用するのでxmlns:aop="http://www.springframework.org/schema/aop" とxsi:schemaLocationの設定も要修正

```servlet-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

<!-- 中略 -->

<aop:aspectj-autoproxy />
```

これでTomcat起動して動作確認と思ったら何度やってもTomcatが起動しません。。

「重大: A child container failed during start」て出てなんだこれは～と思っていろいろ試してたらaspectjweaverのバージョンが1.8.9だとダメみたいでした。(原因は不明)

というわけでaspectjweaverのバージョンを一つ下げて1.8.8で試したら動きました。

```pom.xml
<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjweaver</artifactId>
	<version>1.8.8</version>
</dependency>
```
GEB 字形的数論(TNT)チートシート

# TNT チートシート

## 命題計算

### 原子

```
P Q R
P` Q` R`
P`` Q`` R``
……
```

### 構成規則

もし `x` と `y` が論理式ならば、次の4つもやはり論理式である。

```
~x
<x ∧ y>
<x ∨ y>
<x ⊃ y>
```

### 推論規則

* 結合規則
  * もし `x` と `y` が定理であれば、`<x ∧ y>` もどちらも定理である。
* 分離規則
  * もし `<x ∧ y>` が定理であれば、`x` と `y` もどちらも定理である。
* 切断規則
  * もし `x` と `<x ⊃ y>` が定理であれば、xとyもどちらも定理である。
* 二重波線規則
  * 記号列 `~~`は自由に削除・挿入してよい。(ただし結果が論理式になる場合に限る)
* 対偶規則
  * `<x ⊃ y>` と `<~y ⊃ ~x>` とはとりかえてよい。
* ド・モルガンの規則
  * `<~y ∧ ~x>` と `~<x ∨ y>` とはとりかえてよい。
* スイッチャルーの規則
  * `<x ∨ y>` と `<~x ⊃ y>` とはとりかえてよい。

### 空想規則

```
[         // 空想に入る
  P       // 前提
  ~~P     // 結果
]         // 空想からの脱出
<P ⊃ ~~P> // 結論 Pならば~~P
```

空想の中で、ひとつ高いレベルの「現実」の定理を持ち込んで使用することができる。

# 字形的数論

## 項

### 数詞

```
O       // ゼロ
S O     // 1
S S O   // 2
S S S O // 3
……
```

### 変数

```
a b c d e
a` b` c` d` e`
a`` b`` c`` d`` e``
```

### 加算・乗算

```
(SO+SO)
(SSO+SO)
((SSO+SO)+SSO)
(SSO+(SO+SSO))
```

```
(SO・SO)
(SSO・SO)
((SSO・SO)・SSO)
(SSO・(SO・SSO))
```

## 論理式

### 原子

もし `s` と `t` が項であれば、 `s=t` は原子である。

```
SO=O
(SSO+SSO)=SSSSO
S(b+c)=((c・d)・e)
```

変数を含む場合、その変数は自由である。

### 否定

論理式の前に `~` をつけたものも論理式である。

```
~SO=O
~(SSO+SSO)=SSSSO
~b=SO
~<O=O ⊃ SO=O>
```

### 複合

もし `x` と `y` が論理式で、一方で自由な変数が他方で束縛されているようなことがなければ、次の列はどれも論理式である。

```
<x ∧ y>
<x ∨ y>
<x ⊃ y>
```

## 限定記号

もし `u` が変数で、`x` が論理式で `x` の中に `u` が自由変数として含まれていれば、次の列はどちらも論理式である。

```
∃u:x
∀u:x
```

```
(b+SO)=SSO    // 自由変数を含む開いた論理式
∃b:(b+SO)=SSO // 存在記号 (b+SO)=SSOとなるbが存在する
∀b:(b+SO)=SSO // 全称記号 全てのbについて(b+SO)=SSOとなる
```

## 公理

```
∀a:~Sa=O
∀a:(a+O)=a
∀a:∀b:(a+Sb)=S(a+b)
∀a:(a・O)=O
∀a:∀b:(a・Sb)=((a・b)+a)
```

## 特殊化規則

`x` が 変数 `u` を含むと仮定する。

もし `∀u:x` が定理ならば、 `x` も定理であり、また `x` の中のすべての `u` をある同一の項で置き換えて得られる列もやはり定理である。

(**制限** `u` に置き換わる項は、 `x` の中の束縛変数を含んでいてはいけない)

## 一般化規則

`x` を定理とし、 `x` の中に自由変数 `u` が含まれているとする。

そのとき `∀u:x` も定理である。

(**制限** 空想の中で、その空想の前提の中に自由変数として現れている変数については、一般化は許されない)

## 交換規則

`u` が変数であるとき、列 `∀u:~` と `~∃u:` とは、どの定理のどの部分においても置き換えてよい。

## 存在規則

ある項(自由変数を含んでいてもよい)が、ある定理の中に1回以上現れているとする。そのときのその項のどれか(またはいくつか、または全部)を一つの変数で置き換え、そして対応する存在記号をその前に置くことができる。

ただしその変数は、定理の他の場所で使われていないものに限られる。

## 等号規則

* 対称性 もし `r=s` が定理ならば、 `s=r` も定理である。
* 推移性 もし `r=s` と `s=t` が定理ならば、 `r=t` も定理である。

## 後続規則

* S入れ もし `r=t` が定理ならば、 `Sr=St` も定理である。
* S取り もし `Sr=St` が定理ならば、 `r=t` も定理である。

## 帰納規則

`u` をある変数、 `X{u}` をある論理式で、自由変数 `u` を含むものとする。

`X{Sa/a}` は、全ての自由変数 `a` を `Sa` で置き換えて得られる列を表す。

もし `∀u:<X{u} ⊃ X{Su/u}>` と `X{O/u}` が両方とも定理であれば、 `∀u:X{u}` も定理である。


# 出典

『ゲーデル、エッシャー、バッハ - あるいは不思議の環』(ダグラス・ホフスタッター著、野崎昭弘、はやしはじめ、柳瀬尚紀 訳)

http://www.amazon.co.jp/dp/4826901259
ポケモンGo CP計算式

```math
\begin{aligned}
CP = \frac{(a+a_{iv})(\sqrt{d+d_{iv}})(\sqrt{h+h_{iv}})c^{2}} {10} \\
\end{aligned} 
```
```math
a:攻撃力の基礎個体値 \\
a_{iv}:攻撃力の個体値(0-15) \\
d:防御力の基礎個体値 \\
d_{iv}:防御力の個体値(0-15) \\
h:HPの基礎個体値 \\
h_{iv}:HPの個体値(0-15) \\
c:CP補正値
```

ポケモンのレベル関して、

```math
PL_{max} = TL+1.5
```

```math
TL:トレーナーレベル
```


基礎個体値は下記サイトが参考になります。
[CPの元となるポケモン別の基礎個体値一覧](https://gamy.jp/pokemongo/pokemongo-base-status)


CP補正値は下記サイトが参考になります（Multiplication des CP par montée de niveauの箇所）。
[Niveau de votre Pokémon](http://www.pokemontrash.com/pokemon-go/niveau-pokemon-poussieres/)


例えば、このようなモンスターだった場合

|名前|攻撃力の<br>個体値|防御力の<br>個体値|HPの<br>個体値|レベル|
| :--: | :--: | :--: | :--: | :--: |
|イーブイ|10|8|12|20|

各パラメータは下記になります。

```math
a=114 \\
a_{iv}=10 \\
d=128 \\
d_{iv}=8 \\
h=110 \\
h_{iv}=12 \\
c=0.5974
```

よってCPは、

```math
\begin{aligned}
CP &= \frac{(a+a_{iv})(\sqrt{d+d_{iv}})(\sqrt{h+h_{iv}})c^{2}} {10} \\
   &= \frac{(114+10)(\sqrt{128+8})(\sqrt{110+12})0.5974^{2}} {10} \\
   &= 570（小数点以下切り捨て）
\end{aligned} 
```

本来強さを調べるには、「CP」から「各個体値」を算出する必要があるので、逆算しなければいけません。
ただし、確認できるパラメータが「CP」「HP」「レベル」だけなので、
解が１つにならないため、10-15のような範囲での算出をしているようです。
【Swift】好きなタイミングで画面遷移（コードで画面遷移）する方法

## 背景
ボタンを押してから画面遷移はストーリーボードを利用すれば簡単にできる。しかし、何かしらの処理を行ってから画面遷移とか、自分の場合だと「tableViewを横スワイプしてDeleteとEditが出てくるときの、Editを押した時に画面遷移したい」ときは、ストーリーボードではできない。ボタン見えてないし。そういった場合の解決策の話。

## 遷移方法

https://akira-watson.com/iphone/tableview_3.html
このサイトがめちゃくちゃ参考になりました。

1. ストーリーボード上で、遷移元のView（A）の上の一番左のアイコンを右クリックして、manualの＋記号を引っ張って、遷移先のView（B）と繋げる。
 - これをすることによって、AからBへ遷移することが明示されているが、いつ遷移するかは手動で決めることが可能になる。上記サイトではmodalを選択しているが、自分はNavigation Barを引き継いでほしかったので、showを選択して問題なく動作した。
2. 1．でできたSegue（画面遷移の矢印）をクリックし、Identifierに名前をつける。例えば、gotoEditだとする。
3. 遷移したいタイミングで以下の呼び出せば遷移可能。

```swift
performSegueWithIdentifier("gotoEdit",sender: nil)
```

またひとつ勉強になりました。
【Swift】tableViewのセクションヘッダの背景色や文字色を変更する方法

## 所感
tableViewのセクションの色を変えたいと思い、かなり探したのですがなかなか見つからなくて困ってました。やはり、英語のキーワードのみで検索するほうが出てくる気がしますね。
http://stackoverflow.com/questions/25900577/how-to-set-a-color-in-a-titleforheaderinsection-swift
上記URLを参考にしてセクションの設定を変更しました。

## 変更方法

```swift
var sections = [String]() // セクション名を格納しておく

//この関数内でセクションの設定を行う
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let label : UILabel = UILabel()
        label.backgroundColor = UIColor.grayColor()
        label.textColor = UIColor.whiteColor()
        if(section == 0){
            label.text = sections[section]
        } else if (section == 1){
            label.text = sections[section]
        }
        return label
}
```

自分の場合は、illustratorなどで色の感じを見てからアプリを作っていたりするので、カラーコードで設定できたほうが嬉しかったりします。調べてみるとドンピシャのもの発見。
http://swift-salaryman.com/uicolorutil.php
こちらを参考にするといい感じに出来ました。
【Swift】Admobの取得をviewDidLoad()に置いてると「this application is modifying the auto layout engine...」と出る件の対処法

## 背景
以前Admobを導入してみた記事を書きました。
http://seiya-orz.hatenablog.com/entry/2015/12/04/220806:

テスト運用していると、たまにWebThreadからExceptionを受け取って、アプリが止まることがありました。そのエラーの内容は「This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes. This will cause an exception in a future release.」リリースした時にも起こるかもよ、とか言われてます。

このエラーは、要するに、バックグラウンドスレッドからレイアウトいじっちゃダメですよ、という話。

ただ、自分で書いている部分にレイアウトをいじっている部分は見当たらなく、なんとなくAdmobのせいなのではないか、と思い始めました。とくに、bannerViewに広告を挿しこんでいるのはバックグラウンドな感じがしましたし。

ということで調べてみると、たぶんこの記事が該当します。
https://groups.google.com/forum/?hl=ja#!category-topic/google-admob-ads-sdk/ios/_Pk6b8uQ7cg

## 解決方法

```swift
dispatch_async(dispatch_get_main_queue(), {
   //広告部分
   self.bannerView.adSize = kGADAdSizeSmartBannerPortrait
   self.bannerView.adUnitID = self.AdMobID  // テスト用ID
   self.bannerView.rootViewController = self
   let admobRequest:GADRequest = GADRequest()
   if self.AdMobTest {
      if self.SimulatorTest {
          admobRequest.testDevices = [kGADSimulatorID]
      } else {
          admobRequest.testDevices = [self.TEST_DEVICE_ID]
      }
   }
   self.bannerView.loadRequest(admobRequest)
})
```

このdispatch_async()内に広告取得にあたるコードを書き込むことで解決できるようです。今のところExceptionは発生していません。

Admobの公式に書いといてほしかった。もしかしたら書いてるのか？

おわり。
Swift×Eurekaで簡単に設定画面を作る

## 背景
私が作ったアプリに設定画面を追加したくなり、色々探してみて簡単に作れたので備忘録として残します。
https://itunes.apple.com/jp/app/dunda/id1072574796?l=en&mt=8

## 設定画面を作る方法案
とりあえずぐぐってみると、便利そうなライブラリは下記2つくらいでした。
https://github.com/xmartlabs/Eureka
https://github.com/escoz/QuickDialog

QuickDialogはSwiftで実装している記事がなかなか見つからなかったのと、全然更新されていなかったのでEurekaを使うことに。

## 導入
GitHubのReadMeの下の方にInstallationがあるのでそこ参考にすればいけるかと。

## 設定画面を作る
まず、Storyboardで設定画面のViewを作成します。適当にSettingsViewControllerとかにしました。対応するSwiftファイルを作成し、下記のようにコードを書きました。

```swift
import Foundation
import Eureka


class SettingsViewController : FormViewController{
    
    let userDefault = NSUserDefaults.standardUserDefaults()
    let itunesURL:String = "itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=xxxx"

    override func viewDidLoad() {
        super.viewDidLoad()
        
        form +++ Section("通知時刻の設定")
        <<< TimeRow(){
            $0.title = "通知時刻"
            if let temp:AnyObject = self.userDefault.objectForKey("Time") {
                $0.value = temp as? NSDate
            }
            
            }.onChange{row in
                self.userDefault.setValue(row.value, forKey: "Time")
        }
        
        form +++ Section()
            <<< LabelRow("Review"){
                $0.title = "AppStoreで評価する"
                }.onCellSelection(){row in
                    self.userDefault.setBool(true, forKey: "Review")
                    let url = NSURL(string:self.itunesURL)
                    let app:UIApplication = UIApplication.sharedApplication()
                    app.openURL(url!)
        }
    }
}
```

どんな動きをするかは、コードを見ればわかると思いますが、実際触ってみたい方はアプリをインストールしてみてください。どんなアプリかは下記参照。
http://seiya-orz.hatenablog.com/entry/2016/01/17/202834

入力された値は「row.value」に格納されます。ただ、型がわからなかったのでどう扱えばよいか苦しみました。そんなときは「row.value.dynamicType」をprintすればどんな型で格納されているかわかるので、デバッグしてみてください。


詳しい書き方はGitHub見るか、下記サイトを見ればなんとかなると思います。
http://blog.personal-factory.com/2015/12/29/eureka-tutorial/

おわり。
Rspecでメソッドに引数として与えられたブロックをスタブに実行させる。


#### 概要

単体テストを記述するときは、他モジュールのメソッドをスタブとして表現し、テスト対象メソッドのロジックのみをテストできるようにしなくてはいけない。
テスト対象のメソッドが、他モジュールのメソッドに渡されたブロックの中で実行されている時、
他モジュールのメソッドをスタブにしつつ、そのスタブに渡されたブロックの中でテスト対象のメソッドを実行する方法について記す。

---

#### 解決策

スタブを宣言する際に、その末尾にブロックを付与し、その呼び出しを付与してやれば良い。

---

#### 例

例えば下記のようなメソッドにおいて、`test_target`をテストしたいとする。


```rb:test_target
def example_method(argument)
  other_module_object.stubed_method do
    test_target_method(argument)
  end
end
```

この時、`other_module_object`の`stubed_method`はブロックを引数に取るメソッドである。
テスト対象のメソッドは`test_target_method`なので、`stubed_method`に渡されたブロックが実行されなければテスト対象のコードを実行できない。

この時、`stubed_method`に対する記述を下記のようにしてやることで、`stubed_method`に渡されたブロックを実行させることができる。

```rb:test_code
allow(other_module_object).to receive(:stubed_method) { |&dummy_block| dummy_block.call }
```



参考
http://rspec.info/documentation/3.5/rspec-mocks/#Arbitrary_Handling
インスタンスメソッド内でのself変数の扱い



インスタンスメソッド内で、メソッドのレシーバ自身を参照するには、特別なselfという変数を使う。以下の例では、helloメソッドをhello2メソッドから呼び出している。

```Ruby
class HelloWorld
  def initialize(myname='Ruby')
    @name = myname
  end

  def hello
    puts "Hello ,world. I am #{@name}."
  end

  def hello2
    self.hello #インスタンスメソッドのhelloが呼ばれる
  end

end

bob = HelloWorld.new('Bob')
bob.hello  #=> Hello ,world. I am Bob.
bob.hello2 #=> Hello ,world. I am Bob.
```
IntelliJ IDEA＋GradleでLombokを使う


Eclipse＋Mavenでは、Lombokを使ったことがあるが、IntelliJ IDEA＋Gradleでは少し手順が違ったのでメモ。

## 環境

JDK 1.8.0u102
IntelliJ IDEA CE 2016.2
Gradle 2.13
Lombok 1.16.10

## IDEでLombokを使えるようにする

Eclipseの場合は、jarファイルをダウンロードして、LombokのインストーラからEclipseを選択する。
IntelliJ IDEA の場合は、プラグインでインストールする。

Preferences - Plugins で Lombok を検索してインストールすればOK。

## Gradleの設定

build.gradle の dependencies に以下を追加する。

```
compileOnly 'org.projectlombok:lombok:1.16.10'
```

参照：[lombokの設定](https://projectlombok.org/mavenrepo/)

## Enable annotation processing にチェックを入れる

上記の設定までだと、ソースの補完などはしてくれるが、コンパイルエラーが発生する。
そのため、コンパイル時にアノテーション処理するようにする必要がある。

Preferences - Build, Execution, Deployment – Compiler – Annotation Processors を開き
Enable annotation processing をチェックする。

![lombok1.png](https://qiita-image-store.s3.amazonaws.com/0/35098/aba5cb4f-bbdc-e2d8-c8f0-67a5273e7696.png "lombok1.png")

参照：[IntelliJ IDEA 14.1, Lombok plugin, Gradle で cannot find symbol](https://hirooka.pro/?p=8074)

## Lombokの使い方

Lombokの使い方の詳細は以下を参考にしてください。
参照：[Lombok 使い方メモ](http://qiita.com/opengl-8080/items/671ffd4bf84fe5e32557)
git でマージ済みのリモートブランチを確認・一括削除するコマンドを作ってみた

git でマージ済みのリモートブランチを確認したりまとめて削除したいことがしばしばあるので、git のサブコマンド風に作ってみた。

以下の内容を /usr/local/bin/git-merged-remote-branch として保存して実行権限を与えておく。

```bash:/usr/local/bin/git-merged-remote-branch
#!/bin/bash

usage() {
    echo "usage: git merged-remote-branch <remote>"
    echo "  Show and remove merged remote branched."
    echo
    echo "options"
    echo "  -h, --help    show help"
    echo "  -D, --delete  remove remote branch"
    echo
    exit 1
}

REMOTE=origin

for OPT in $*
do
    case $OPT in
        '-h'|'--help' )
            usage
            exit 1
            ;;
        '-D'|'--delete' )
            FLAG_DELETE=1
            ;;
        *)
            if [[ ! -z "$1" ]] && [[ ! "$1" =~ ^-+ ]]; then
                REMOTE=$1
            else
                usage
                exit 1
            fi
    esac
    shift
done

if [ "$FLAG_DELETE" ]; then
    echo delete merged branches on [$REMOTE]
    git branch -a --merged | grep -v master | grep remotes/$REMOTE/| sed -e "s% *remotes/$REMOTE/%%"| xargs -I% git push $REMOTE :%
else
    echo merged branches on [$REMOTE]
    git branch -a --merged | grep -v master | grep remotes/$REMOTE/| sed -e "s% *remotes/$REMOTE/%  %"
fi
```

使うときは

```bash
$ git merged-remote-branch
```

でマージ済みのリモートブランチを表示。
デフォルトでは *origin* をチェックするが、任意のリモートリポジトリを指定したい場合はリモート名を引数で指定する。

```bash
$ git merged-remote-branch myorigin
```

オプションに ```-D``` を指定すると、マージ済みのリモートブランチをまとめて消す。（オプションは前でも後ろでもOK）

```bash
$ git merged-remote-branch myorigin -D
```

---

（参考にさせていただいた情報）

* [Gitでリモートのマージ済みのブランチを一括削除する](http://qiita.com/fukayatsu/items/b1a5e1c0b98acaa6261d)
* [bash によるオプション解析](http://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb)
redux-saga用語

最近redux-sagaについて調べていたのだが、用語の理解が曖昧だったので公式ドキュメントの[Glossary](https://yelouafi.github.io/redux-saga/docs/Glossary.html)を雑に訳してみた。

## Effect
effectとはsaga middlewareによって実行される命令を含むプレーンなJavaScriptオブジェクトです。
redux-sagaライブラリが提供するファクトリ関数を使うことでeffectを生成できます。 例えば、`call(myfunc, 'arg1', 'arg2')`が返すeffectをyieldすることによって、middlewareに対して`myfunc('arg1', 'arg2')`を呼び出して結果をGeneratorに返すよう指示します。

## Task
taskはバックグランドで走るプロセスのようなもので、redux-sagaを使ったアプリケーションでは複数のtaskが並列に動作します。fork関数を使うと下記のようにtaskを生成できます。

```javascript
function* saga() {
  ...
  const task = yield fork(otherSaga, ...args)
  ...
}
```

## Blocking/Non-blocking call
Blocking callはSagaがeffectをyieldしてその結果を待ってから次の命令を再開すること、またNon-blockingはeffectをyieldしたあとすぐに処理を再開することを指します。
例

```javascript
function* saga() {
  yield take(ACTION)              // Blocking: actionが来るのを待つ
  yield call(ApiFn, ...args)      // Blocking: ApiFnが終わるのを待つ (ApiFnがPromiseを返す場合)
  yield call(otherSaga, ...args)  // Blocking: otherSagaが終わるのを待つ

  yield put(...)                   // Blocking: 非同期にdispatchする (Promise.thenを使用)

  const task = yield fork(otherSaga, ...args)  // Non-blocking: otherSagaの終了を待たない
  yield cancel(task)                           // Non-blocking: すぐに再開する
  // または
  yield join(task)                              // Blocking: taskが終わるのを待つ
}
```

## Watcher/Worker
独立したSagaを使って制御フローを組織化する方法を示します。
- The watcher: dispatchされたactionを監視して、actionごとにworkerをforkする
- The worker: actionを処理して終了する
例

```javascript
function* watcher() {
  while (true) {
    const action = yield take(ACTION)
    yield fork(worker, action.payload)
  }
}

function* worker(payload) {
  // ... 何らかの処理
}
```

## まとめ
少しだけ理解が深まったような... 更に曖昧になったような...
訳がかなり怪しいので間違っている点があれば指摘していただけるとありがたいです。
VagrantでRStudioServerをスリーコマンドで実装できるものを作ってあった


## 追記

以下コマンドでこのboxを使用できるようにしました！

```bash
$ vagrant box add nnsnodnb/trusty-rstudio-server
$ vagrant up
```

## 前提

Vagrantが実行できる環境であること

## インストール

```bash
$ git clone https://github.com/nnsnodnb/vagrant-trusty-rstudio-server.git
$ cd vagrant-trusty-rstudio-server
$ sh setup.sh
```

trustyを自動でDLしてVagrantも起動してRStudio Server類もインストールするようにしておいてます

http://192.168.33.10:8787 にアクセスする。
RStudioServerは `8787` ポートを使用するようになっています。
すでに他の仮想マシンで `192.168.33.10` を使っている場合は `Vagrantfile` の29行目を適当に変更する。

```ruby:Vagrantfile
config.vm.network "private_network", ip: "192.168.33.10"
```

## 別のローカルマシンからアクセスをする。

LAN内の別のマシンからアクセスする場合は `Vagrantfile` の34行目を自分の使用しているIPを固定を指定する．
ネットワーク部は他のマシンと同じでホスト部のみ唯一のものを振ってください。

```ruby:Vagrantfile
config.vm.network "public_network", ip: "192.168.0.150", bridge: "en1: Wi-Fi (AirPort)"
```

私の環境では192.168.0.0/24なのでこうなってます．

## リポジトリ

[nnsnodnb/vagrant-trusty-rstudio-server | GitHub](https://github.com/nnsnodnb/vagrant-trusty-rstudio-server)

何かあれば上記リポジトリまでPR等なんなりと！