OmniAICreator/Qiita-1.07M huggingface dataset:
ansibleでパッケージインストールする_02(apt サンプル集)

今日のお題：ansibleを用いてパッケージをインストールする際にオプションを設定する

#### 実行環境
- virtual box
- ubuntu16.04

#### 前提条件

- サーバ側にansibleのインストールを行っていること。 ※[ここでやりました。](http://qiita.com/azuki19770922/items/b10672d95ba4dac82b97)
- クライアント側の設定とサーバ間のSSH設定を行う ※[ここでやりました。](http://qiita.com/azuki19770922/items/c00b9cc04c85e2834e7e)
- 本手順はサーバ/クライアント側すべて一般ユーザで実施します。この手順ではクライアント側のsudoersの設定で一般ユーザ側でsudoのnopass設定をしています。

#### 目的
パッケージを1つインストールする方法は判ったが、実際使用する際には複数のパッケージをインストールしたり、要らないパッケージを消したり複数目的がある。
ここではそのうち必要になるだろうと思われるやり方を残していきたい。

#### ToDo
- 複数パッケージインストール
- パッケージアンインストール
- apt-get update

#### サンプルソース

・複数パッケージインストール

```yaml:install_multiple_package
- hosts: all
  tasks:
    - name: install multi packages
      apt: name={{item}}
      with_items:
          - cowsay
          - cmatrix
```

・パッケージアンインストール

```yaml:remove_package
remove_package.yml
- hosts: all
  tasks:
    - name: remove cowsay package
      apt:
        name: cowsay
        state: absent
```

・apt-get_update

```yaml:run_apt-get_update
- hosts: all
  tasks:
    - name: run apt-get update
      apt:
        update_cache: yes
```


#### 参考リンク
- [公式ドキュメント(apt ModulePage)] (http://docs.ansible.com/ansible/apt_module.html)

- [公式ドキュメント(Loop playbookPage)] (http://docs.ansible.com/ansible/playbooks_loops.html)
Windows(10) で mod_wsgi(4.5.7)をビルドする

# Windows で mod_wsgi(4.5.7)をビルドする
windows用mod_wsgiは[ここ](http://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi)で配布されていますが、
`mod_wsgi‑4.4.23+ap24vc14‑cp35‑cp35m‑win_amd64.whl`というちょっと古いものです。
またpython3.5.2で作られているわけではないので、動かすと毎回エラーログに
warningとしてpython3.5.1じゃなくてpython3.5.2です的なメッセージが表示されます。

問題なく動くので良いと言えば良いのですが、ログに余分なメッセージを表示させたくないので自前でビルドしてみました。

## 準備
### ソースの入手
[githubのmod_wsgi配布サイト](https://github.com/GrahamDumpleton/mod_wsgi/releases)から4.5.7のzipファイルをダウンロードして解凍します。
`c:\mod_wsgi-4.5.7`に解凍されたことを前提に進めます。

### apache
apacheは[apache lounge](http://www.apachelounge.com/download/)より、httpd-2.4.23-win64-VC14.zipをダウンロードし、解凍します。
`c:\Apache24`に解凍されたことを前提に進めます。
httpd-2.4.23-win64-VC14 というディレクトリの中にApache24というディレクトリができると思いますが、それを Cドライブに移動させます。

### python
pythonは[python オフィシャルサイト](https://www.python.org/downloads/release/python-352/)よりWindows x86-64 executable installerをダウンロードし、インストールします。
インストール先は`c:\pytnon3`ということを前提に進めます。

### Visual Studio 2015
[Visual Studio Community Edition](https://www.visualstudio.com/ja-jp/products/visual-studio-community-vs.aspx)をダウンロードしてインストールしましょう。

## 修正

### ソースコードの修正

[48bbfd5の修正](https://github.com/GrahamDumpleton/mod_wsgi/commit/48bbfd5827e2caec396c74619fdf7840711c2ee5)でWindowsではそのままビルドすることができなくなってしまいましたので、
`c:\mod_wsgi-4.5.7\src\mod_wsgi.c`の一部を修正します。
3783-3792行があるとビルドできないので、

```
#if defined(MOD_WSGI_WITH_DAEMONS)
    if (wsgi_daemon_process) {
        if (wsgi_startup_shutdown_time == 0) {
            if (wsgi_startup_timeout > 0) {
                apr_thread_mutex_lock(wsgi_monitor_lock);
                wsgi_startup_shutdown_time = apr_time_now();
                wsgi_startup_shutdown_time += wsgi_startup_timeout;
                apr_thread_mutex_unlock(wsgi_monitor_lock);
            }
        }
    }
#endif
```
のように該当行を囲みます。
おなじく4066行に

```
wsgi_startup_shutdown_time = -1;
```
という内容があるので、これも

```
#if defined(MOD_WSGI_WITH_DAEMONS)
wsgi_startup_shutdown_time = -1;
#endif
```
のように該当行を囲みます。

### ビルドスクリプトの修正(作成)
`c:\mod_wsgi-4.5.7\win32\`にビルドスクリプトが置いてあります。
`ap24py34-win64-VC10.mk`を修正し`ap24py35-win64-VC14.mk` を作ります。

```
APACHE_ROOTDIR = C:\Apache24

PYTHON_ROOTDIR = C:\python3
PYTHON_VERSION = 35

include common-VC10.mk
```
という内容で`ap24py35-win64-VC14.mk`として保存します。

## ビルド

スタートメニューの全てのプログラムから
Visual Studio 2015 > VS2015 x64 Native Tools コマンド プロンプト
を実行しましょう
そして
`cd /d c:\mod_wsgi-4.5.7\win32\`とビルドスクリプトのあるディレクトリに移動します。
あとは
`nmake -f ap24py35-win64-VC14.mk`を実行し、眺めていると

```
/OUT:mod_wsgi.so
mod_wsgi.obj
wsgi_apache.obj
wsgi_buckets.obj
wsgi_convert.obj
wsgi_daemon.obj
wsgi_interp.obj
wsgi_logger.obj
wsgi_memory.obj
wsgi_metrics.obj
wsgi_restrict.obj
wsgi_server.obj
wsgi_stream.obj
wsgi_thread.obj
wsgi_validate.obj
   ライブラリ mod_wsgi.lib とオブジェクト mod_wsgi.exp を作成中
```
のようなメッセージがでて、終了します。
`c:\mod_wsgi-4.5.7\win32\` の中に mod_wsgi.soが出来上がっているでしょう。

## インストール
mod_wsgi.soを`c:\Apache24\modules`の中に移動し、
`c:\Apache24\conf\httpd.conf`の`LoadModule`が並んでいる最後に

```
LoadModule wsgi_module modules/mod_wsgi.so
```
という行を追加しましょう。
これでapacheを動かしてみて問題なく動けば大丈夫かと思います。


## その他
上記ソースコードの修正は、pull req が取り込まれたので次期バージョンでは不要になる見込みです。
[自分用] Spring BootでVaadinなサイトを作ったやり方まとめ


#目的
[Vaadin](https://vaadin.com)を使ってJavaだけでいい感じのUIを作りたかった


#はじめに
https://start.spring.io
でいい感じのプロジェクトを生成してくれるので、DependenciesにVaadinを入れてGenerate Projectするだけでok

一応Spring BootでVaadinがどういう感じなのかのチュートリアル的なサンプルは [ここ](http://spring.io/guides/gs/crud-with-vaadin/)にある

#お役立ちサイト
##https://demo.vaadin.com/valo-theme/
どんな感じのUIのパーツがあるのかを一覧で見れる

##http://demo.vaadin.com/sampler/
各パーツの実装サンプルがあり、各パーツのパラメータをその場で変更してどういう効果があるのかを確認できる

##https://vaadin.com/directory
アドオンでよりリッチにすることができる


#Hello World
```java:VaadinUI.java
@SpringUI
@Theme(ValoTheme.THEME_NAME)
public class VaadinUI extends UI {
    @Override
    protected void init(VaadinRequest request) {
        VerticalLayout verticalLayout = new VerticalLayout();
        verticalLayout.addComponent(makeButton());
        setContent(verticalLayout);
    }

    private Button makeButton() {
        Button button = new Button("Click Me", FontAwesome.APPLE);
        button.addClickListener((Button.ClickListener) event -> {
            Notification.show("Hello World!!");
        });
        return button;
    }
}
```
不思議なレンタルサーバーgegahost.net

私は、ブログを公開するために[gegahost.net](http://gegahost.net)を使っています。今はもう、完全新規の受付が停止されているようです。けれども、ここに特徴を残していきたいと思います。
##メリット

* 転送量無制限
* データベース周りが無制限(容量と数)
* 保存容量が実質無制限
* ドメイン取り放題(サブドメイン型限定)
* 独自ドメインならCloudFlareの設定をサーバー側で可能
* 豊富な自動インストールスクリプト
* PHP7.0とPHP5.6に対応
* Nginxで動いているみたい
* Wordpressインストール時に、テーマやマルチサイト機能の選択肢あり

##デメリット

* ロンドンサーバーなので対アジアのpingが悪い
* SSH接続不可
* 15MB/1ファイルの制限あり(オンラインファイルマネージャーとかFTPとか関らず)
* htdocsが公開ディレクトリだが、初回登録ドメインのみルートディレクトリにある
* XSS周りの制限ががっちり(外から内の制限あり)
* .tkドメイン非対応
* FTPアカウントは一つのみ
* node.jsには非対応

##まとめ
普通にブログを運営する程度なら、十分です。在外邦人向けのサイトとかなら、適当ではないでしょうか。

##追記(2017/03/25)
3/14にドメインが失効したため、完全にサービスが停止されました。予告もなかったので、ただいま大慌てで、運用していたサイト達を別サーバーで復旧中です。
Vimで検索した時のハイライトがウザい

`/` で検索したときの、あの黄色い奴がウザい。

# とりあえず黄色を消す
```vim
:nohl
```
no highlight の略だと思われる。
ググると `:noh` ばかり出てくるが `:nohl` の方が覚えやすいと思う。`:nohlsearch` がフルスペル。どこで切ってもいいらしい。

# 編集中にハイライトしないようにする
```vim
:se nohls
```
no highlight search の略と思われる。
`:set nohlsearch` の省略形。もちろん `:set nohls` でもおｋ。

戻すときは `:se hls` または `:set hlsearch` など。

# <kbd>ESC</kbd> キーを押したら消えるようにする
```vim
cat << "_EOF_" >> ~/.vimrc
nnoremap <ESC><ESC> :nohl<CR>
_EOF_
```
<kbd>ESC</kbd> キーを2回押すとハイライトが消えるようになる設定例。
次を検索するとハイライトは復活する。

# ハイライト表示を切り替えられるようにする
```vim
cat << "_EOF_" >> ~/.vimrc
set hlsearch!
nnoremap <F3> :set hlsearch!<CR>
_EOF_
```
<kbd>F3</kbd> キーを押すとハイライト表示するかどうかを切り替えられる設定例。

# 二度とハイライトしないようにする
```vim
cat << "_EOF_" >> ~/.vimrc
set nohlsearch
_EOF_
```
黄色い奴など金輪際見たくない、とかいう人はこんな設定。あまりいないと思うけど。

# シリーズ Vim
* [Vimで文字コードを指定する](http://qiita.com/bezeklik/items/2c9925f9c07762559471)
* [Vimで改行コードを変更する](http://qiita.com/bezeklik/items/aca37ffb127821311d6b)
* [Vimで検索した時のハイライトがウザい](http://qiita.com/bezeklik/items/33ba5b4ef9bd356cbec5)
RDSへのpsqlコマンドでの接続

# 0. ローカル端末での作業

## 0.1. 変数の設定

```bash:変数の設定
FILE_SSH_KEY='<キーペアの秘密鍵ファイルのパス>'
EC2_PUBLIC_IP='<EC2インスタンスのIPアドレス>'
```

# 0.2. .pgpassの転送

```bash:コマンド(Local):
scp -i ${FILE_SSH_KEY} ~/.pgpass ec2-user@${EC2_PUBLIC_IP}:
```
```text:結果(例):
.pgpass                                       100%  111     0.1KB/s   00:00    
```

# 1. EC2へのログイン

```bash:コマンド:
ssh -i ${FILE_SSH_KEY} ec2-user@${EC2_PUBLIC_IP}
```

# 2. 変数の設定

```bash:変数の設定(例):
RDS_INSTANCE_ENDPOINT=<RDSのエンドポイント>
RDS_USER_NAME='pgadmin'
RDS_DB_NAME="handson$(date +%Y%m%d)"
```

# 3. 接続

```bash:コマンド:
psql \
        --host=${RDS_INSTANCE_ENDPOINT} \
        --username=${RDS_USER_NAME} \
        --dbname=${RDS_DB_NAME}
```

```text:結果:
      psql (9.5.5, server 9.5.4)
      SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
      Type "help" for help.

      handson20161113=>
```

# 3. DBコマンドのテスト実行

DBコマンドのテスト実行をしてみます。

```sql:SQL:
select version();
```

```text:結果(例):

                                                       version
      ----------------------------------------------------------------------------------------------------------
        PostgreSQL 9.5.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-16), 64-bit
       (1 row)
```


# 4. DBへの接続を切断

DBへの接続を切断します。

```bash:コマンド:
\q
```

# 完了
【募集】自作gitクライアントのテスト用に適したgitリポジトリを探しています 

gitクライアントを自作中です。コミットグラフ（樹形図）を描画する機能があるのですが、複雑で混乱した美しくないコミットグラフになっているgitリポジトリで、正しく樹形図が描画できるかテストしたいと思っています。ブランチの階層が深かったり、コミットの親子関係が込み入っていたり、できるだけ見苦しいgitリポジトリをご存じでしたら紹介してほしいです。コミットグラフ（ログ）が目的ですので、プロジェクトの種類やサイズは問いません。

※単純な樹形図の例
![git.png](https://qiita-image-store.s3.amazonaws.com/0/61222/b05629b4-3663-035c-92e3-14b803c62da7.png)

---
（追記 2016-11-15）

教えていただいた「celery」、なかなか良いですね（笑）
結構面白いことになっています。こんなもん、綺麗に描画できるわけねーだろ（怒）、って思います。
![graph.png](https://qiita-image-store.s3.amazonaws.com/0/61222/7c6d71ab-c8b4-942b-11ec-b57da56e310e.png)

↓ こんなにブランチ深くないはずなんだけど、正しいんだろうか...？

![branches.png](https://qiita-image-store.s3.amazonaws.com/0/61222/0d6806c2-bb23-1591-2e73-0497e7f2e344.png)

↓ SourceTreeが誤動作するレベル

![sourcetree.png](https://qiita-image-store.s3.amazonaws.com/0/61222/28f8b3c4-d609-a82d-b481-06cdca6bbc9a.png)
ES2016 async/await キャンセル可能な非同期関数を実装する方法

stack overflow にいいやり方が載っていたので紹介します。
出典：[Abort ecmascript7 async function](http://stackoverflow.com/questions/32897385/abort-ecmascript7-async-function)

## デモを書いてみました

まずはこちらを見てください。何がやりたいかがわかりやすくなっているかと思います。
[<i class="fa fa-jsfiddle"></i> jsfiddle で動きを見る:CancellationToken](https://jsfiddle.net/sukobuto/o2ans8zt/)

async/await にはキャンセル処理を実装するための仕組みがありませんが、 async/await の元ネタである .NET framework に [CancellationToken 構造体](https://msdn.microsoft.com/ja-jp/library/system.threading.cancellationtoken(v=vs.110).aspx) というものがあります。

これを JS に持ち込むことで、キャンセル可能な async 関数を実装することができます。

## CancellationToken クラス

```js:CancellationToken(ES2016実装)
class CancellationToken {

  isCancellationRequested = false;

  constructor(parentToken = null) {
    this.cancellationPromise = new Promise(resolve => {
      this.cancel = e => {
        this.isCancellationRequested = true;
        if (e) {
          resolve(e);
        } else {
          var err = new Error("cancelled");
          err.cancelled = true;
          resolve(err);
        }
      }
    });
    if (parentToken && parentToken instanceof CancellationToken) {
      parentToken.register(this.cancel);
    }
  }

  register(callback) {
    this.cancellationPromise.then(callback);
  }

  createDependentToken() {
    return new CancellationToken(this);
  }

}
```

## 使い方

キャンセルできるようにしたい async 関数の引数に CancellationToken を受け取るようにします。

```js
// キャンセル可能な非同期関数
function delayAsync(duration, cancellationToken = null) {
  return new Promise((resolve, reject) => {
    setTimeout(resolve, duration);
    if (cancellationToken) {
      cancellationToken.register(reject);
    }
  });
}
```

この関数に渡したトークンを使ってキャンセルすることができます。

```js
// トークンを新しく作る
var ct = new CancellationToken();
// 1秒後にキャンセルされるようにする
delayAsync(1000)
    .then(ct.cancel);
// 2秒かかる処理をする
delayAsync(2000, ct)
    .then(() => console.log("ok"))
    .catch(e => console.log(e.cancelled ? "cancelled" : "some other err"));
```

async/await スタイルでも同じようにキャンセルできます。

```js
async function Go(cancellationToken)
{
  try{
    await delayAsync(2000, cancellationToken)
    console.log("ok")
  }catch(e){
    console.log(e.cancelled ? "cancelled" : "some other err")
  }
}
var ct = new CancellationToken();
delayAsync(1000).then(ct.cancel);
Go(ct)
```
CASEを使って行列を置き換える方法



# やりたいこと

| prefecture  | date  | temperature  |
|:-:|:-:|:-:|
| 東京都  | 2016-11-01  | 10  |
| 東京都  | 2016-11-02  | 11  |
| 東京都  | 2016-11-03  | 10  |
| 東京都  | 2016-11-04  | 9  |
| 大阪府  | 2016-11-01  | 12  |
| 大阪府  | 2016-11-02  | 11  |
| 大阪府  | 2016-11-03  | 10  |
| 大阪府  | 2016-11-04  | 10  |

みたいなデータがあったときに

| prefecture  | 2016-11-01  | 2016-11-02  | 2016-11-03  | 2016-11-04  | 
|:-:|:-:|:-:|:-:|:-:|
| 東京都  | 10  | 11  | 10 | 9 |
| 大阪府  | 12  | 11  | 10 | 10 |

このような形にしたいケースがあると思います(グラフ化、集計 etc...)。
これをSQLのみを使ってうまく実現する方法を紹介します。

# やり方

まず、テーブルを作ってみます。

```sql
CREATE TABLE `temperatures` (
 `prefecture` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `date` date NOT NULL,
 `temperature` int(11) NOT NULL,
 PRIMARY KEY (`prefecture`,`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
```

データを入れます。

```sql
INSERT INTO temperatures VALUES
("東京都", "2016-11-01", 10),
("東京都", "2016-11-02", 11),
("東京都", "2016-11-03", 10),
("東京都", "2016-11-04", 9),
("大阪府", "2016-11-01", 12),
("大阪府", "2016-11-02", 11),
("大阪府", "2016-11-03", 10),
("大阪府", "2016-11-04", 10)
```

ここから日付ごとのフィールドを作って、値を該当するtemperatureにしていく必要があります。
CASEを使ってその形を作ります。

```sql
SELECT prefecture, 
CASE WHEN `date` = '2016-11-01' THEN temperature ELSE NULL END AS '2016-11-01',
CASE WHEN `date` = '2016-11-02' THEN temperature ELSE NULL END AS '2016-11-02',
CASE WHEN `date` = '2016-11-03' THEN temperature ELSE NULL END AS '2016-11-03',
CASE WHEN `date` = '2016-11-04' THEN temperature ELSE NULL END AS '2016-11-04'
FROM `temperatures`
```

取得結果が以下のようになります。

| prefecture  | 2016-11-01  | 2016-11-02  | 2016-11-03  | 2016-11-04  |
|:-:|:-:|:-:|:-:|:-:|
| 大阪府  | 12 | NULL  | NULL  | NULL  |
| 大阪府  | NULL | 11  | NULL  | NULL  |
| 大阪府  | NULL | NULL | 10 | NULL |
| 大阪府  | NULL | NULL | NULL | 10 |
| 東京都  | 10  | NULL  | NULL  | NULL  |
| 東京都  | NULL  | 11  | NULL  | NULL  |
| 東京都  | NULL  | NULL  | 10  | NULL  |
| 東京都  | NULL  | NULL  | NULL  | 9  |

あとはこの結果を利用してprefectureごとにまとめてあげればOKです。

```sql
SELECT t1.prefecture,
SUM(t1.`2016-11-01`) AS '2016-11-01',
SUM(t1.`2016-11-02`) AS '2016-11-02',
SUM(t1.`2016-11-03`) AS '2016-11-03',
SUM(t1.`2016-11-04`) AS '2016-11-04'
FROM (
SELECT prefecture, 
CASE WHEN `date` = '2016-11-01' THEN temperature ELSE NULL END AS '2016-11-01',
CASE WHEN `date` = '2016-11-02' THEN temperature ELSE NULL END AS '2016-11-02',
CASE WHEN `date` = '2016-11-03' THEN temperature ELSE NULL END AS '2016-11-03',
CASE WHEN `date` = '2016-11-04' THEN temperature ELSE NULL END AS '2016-11-04'
FROM `temperatures`
)t1 GROUP BY prefecture
```

| prefecture  | 2016-11-01  | 2016-11-02  | 2016-11-03  | 2016-11-04  | 
|:-:|:-:|:-:|:-:|:-:|
| 東京都  | 10  | 11  | 10 | 9 |
| 大阪府  | 12  | 11  | 10 | 10 |

これで目的のデータを無事に取得することができました。

## 補足
* 今回はprefecture, dateでuniqueにしてあるのでシンプルな形式になっていますが、
集計対象がuniqueになってない場合でもCASE組むところで集計関数を使って欲しいデータを出すことも可能です。
* CASEが膨大になる場合は作るの大変なので、SQLの生成を自動化できるようプログラム組んであげるといいと思います。ループ回すだけなのですぐ作れます。
* 日毎のデータを今回はターゲットにしていますが、"A(prefecture)-B(date)の組み合わせに紐づくC(temperature)というデータ構造"であれば同じことができるので他にも応用できると思います。

## まとめ

データ抽出周りは日次のタスクになってしまうことも多く、見直してみるとかなり時間を使ってしまっていることもあるので、手間かかってるなと感じたらまず上記の方法を用いて簡易化すると改善に繋がります(もちろん最終的には人の手が全くかからないように自動化する方がいいです。)。
python実行ファイル変換モジュール比較２

[python実行ファイル変換モジュール比較](http://qiita.com/nabehide/items/3b1b2b22674e9b76b20c)の続き
いろいろな環境で試しています（更新中）

いまのところ、PyQt4を使ったGUI実行ファイルだと、zipで圧縮して20MBくらいのサイズが限界


# 環境１
* python 2.7.12
* numpy : 1.11.2
* matplotlib : 1.5.1
* PyQt : 4.11.4

||py2exe|PyInstaller|cx_Freeze|
|:-:|:-:|:-:|:-:|
|version|0.6.9|3.3.dev0+483c819|4.3.4|
|file size[MB]|43.5|81.5|44.7|
|execution time[sec]|15|49|8|
|startup time[sec]|1|5|1|

# 環境２
numpyのバージョンを下げて[MKL](https://ja.wikipedia.org/wiki/Intel_Math_Kernel_Library)との依存をなくした環境
* python 2.7.12
* numpy 1.9.3
* matplotlib 1.4.3
* PyQt 4.11.4

||py2exe|PyInstaller|cx_Freeze|
|:-:|:-:|:-:|:-:|
|version|0.6.9|3.2|4.3.4|
|file size[MB]|41.9|66.5|43.8|
|execution time[sec]|15|43|7|
|startup time[sec]|1|3|1|
Windows + Apache + mod_wsgi + サービスで djangoなアプリケーションを実行する。

Windows(10 64bit) + Apache(2.4) + Python 3.5.2 + mod_wsgi(4.5.7) な環境でdjangoアプリケーションをサービスとして実行した際にうまくいかないことがあったのでメモ。

#### うまくいく場合
コンソールからhttpdを直接実行
#### うまくいかない場合
サービスとしてhttpdを実行

* mod_wsgi読み込みエラーがでる。
* apacheのエラーログを見ると  
```
Fatal Python error: Py_Initialize: unable to load the file system codec
ImportError: No module named 'encodings'
```  
みたいなのが出ている

### やったこと
環境変数 PYTHONPATH を(全ユーザに)設定する。
`c:\python3\Lib`
とかそういう感じ。
【Android】LinearLayoutで画像とテキストを縦に並べてボタンっぽくする

## 概要
LinearLayoutで画像とテキストを縦に並べてボタンっぽいものを作ります。

## 完成イメージ
タップ前:![my_button.png](https://qiita-image-store.s3.amazonaws.com/0/123122/ebc79740-ed33-7f1b-9910-e715af569f57.png) 、タップ後:![my_button_pressed.png](https://qiita-image-store.s3.amazonaws.com/0/123122/66879eff-3085-8e97-5684-fd60c1b378bd.png)

## XML
ボタンのXML

```xml:my_button.xml
<LinearLayout
	android:id="@+id/my_button"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content"
	android:layout_alignParentLeft="true"
	android:layout_centerVertical="true"
	android:background="@drawable/button_background"
	android:gravity="center"
	android:orientation="vertical"
	android:paddingBottom="5dp"
	android:paddingLeft="9dp"
	android:paddingRight="9dp"
	android:paddingTop="5dp">

	<ImageView
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:src="@drawable/plus_symbol" />

	<TextView
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:text="追加"
		android:textColor="@android:color/white"
		android:textSize="12sp"
		android:textStyle="bold" />
</LinearLayout>
```

ボタンの背景のXML

```xml:button_background.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/button_background_normal"
        android:state_pressed="false"
        android:state_selected="false" />
    <item
        android:drawable="@drawable/button_background_pressed"
        android:state_pressed="true"
        android:state_selected="false" />
    <item
        android:drawable="@drawable/button_background_normal"
        android:state_pressed="false"
        android:state_selected="true" />
    <item
        android:drawable="@drawable/button_background_pressed"
        android:state_pressed="true"
        android:state_selected="true" />
</selector>
```

タップ前のXML

```xml:button_background_normal.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="FF9AA2BF" />
    <corners android:radius="2dp" />
    <stroke
        android:width="1dp"
        android:color="FF9AA2BF" />
</shape>
```

タップ後のXML

```xml:button_background_pressed.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="FF6E7280" />
    <corners android:radius="2dp" />
    <stroke
        android:width="1dp"
        android:color="FF6E7280" />
</shape>
```

## ＋画像
`app/src/main/res/drawable/plus_smybol.png`
![plus_symbol.png](https://qiita-image-store.s3.amazonaws.com/0/123122/23a39f6c-b890-e9c4-2855-b41dcd9bb896.png)
（↑白い+記号の画像です）
R > error > object of type 'closure' is not subsettable > オブジェクト名の入力間違い

```動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1 
```

R機能マップ 
http://qiita.com/7of9/items/0f911bcb95d3a8bbd703


データの確認のためRStudioを使用していた。

```
> setwd("D:/Test/0_sampleData")
> xtable<-read.table("sample01.csv", sep=",")
```

ここまで問題なし。

以下を実行時にエラーが出た。

```
> xcol<-table[c(seq(7,246,2))]
```

> Error in table[c(seq(7, 246, 2))] : 
>  object of type 'closure' is not subsettable

read.table()で読込んだのは`xtable`で、`xcol`に代入しようとしていたのは`table`という間違いをしていた。以下のようにxtableにしたらエラーがなくなった。

```
> xcol<-xtable[c(seq(7,246,2))]
```

エラーメッセージを読んだだけでは何が「not subsettable」なのか分からなかった。
エラーメッセージを元に対応方法を探す前に、コマンドの打ち間違いの確認をすべきだろう。
AutoLayoutとAutoresizingを併用してUILabelを載せた時に、ラベルのフォントサイズが変わらずハマった時の対処法

状況説明が難しいのですが、AutoLayout と AutoResizingを併用してUILabelを表示した時に、RectのsizeはAutoResizeされるものの、フォントサイズが調整されず、storyboardのインスペクターの値を調整しまくっても修正できずハマったので共有します。

図ならわかるかな。

こんな状況です。
ラベルのフォントサイズが端末によって違っているのが分かりますか？
![sizes.png](https://qiita-image-store.s3.amazonaws.com/0/45467/8b5fb9e9-16f0-9c17-a8f3-0d89eb177ff1.png)  
ラベルと黄色いビューは濃いグレーのビューの上にaddSubviewされています。

濃いグレーのビューはconstraintを使って、端末が変わっても縦横比同じで画面中央に配置されるようにしています。  


---  
ググっていたら、「ラベルのAutoshrinkをminimumFontSizeに変えればいいよ」みたいなアドバイスがあったので以下のようにやってみましたがダメ。
<img width="468" alt="スクリーンショット 2016-11-13 13.30.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/854a103b-c488-acc9-9a87-0538571d21c9.png">  

---
さて、困ったぞと思った時に出会ったのがこちらのリンクの最後の回答
[Resize a UILabel so it looks the same on iPhone and iPad](http://stackoverflow.com/questions/27571352/resize-a-uilabel-so-it-looks-the-same-on-iphone-and-ipad)

<img width="776" alt="スクリーンショット 2016-11-13 13.49.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/70b41c13-daab-1fa4-3642-62c08a3e921b.png">


これを参考にしながら、ラベルを@IBOutletでプロパティにして、コードで調整したら直りました。

```
import UIKit

class ViewController: UIViewController {
    
    // storyboardでラベルを@IBOutlet化
    @IBOutlet weak var myLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // フォントサイズを指定
        let size = UIScreen.main.bounds.size
        let adjustValue : CGFloat = 20.0  // ここの値を変更してサイズを調整してください
        let font = UIFont.systemFont(ofSize: size.height/adjustValue)

        myLabel.font = font
    }
}
```

はいこの通り直りました。
![sizes2.png](https://qiita-image-store.s3.amazonaws.com/0/45467/84f9834c-bf27-3cd6-5b9a-852d4fff9660.png)  

ちょっと状況がややこしいのですが、誰か同じような状況になっている人に役立てば幸いです。
gvmでv1.4がinstallできない時の対処方法

ちょっとハマったのでメモ

gvmを使ってversion管理をしようとしたところ、golang v1.5以上は
golang v1.4がインストールされていないとビルドが通らないとのこと
gvmを使う際に多くのサイトでは下記のように記述されています

```
gvm install go1.4
gvm use go1.4
gvm install go1.5
```

がしかし手元の環境では以下のようなコンパイルエラーが発生して最初の
インストールでこけてしまいました(2016/11/13現在)

```
# Building C bootstrap tool.
cmd/dist

# Building compilers and Go bootstrap tool for host, darwin/amd64.
lib9
libbio
liblink
cmd/cc
cmd/gc
cmd/6l
cmd/6a
cmd/6c
~/.gvm/gos/go1.4/src/cmd/6c/txt.c:995:28: error: shifting a negative signed value is undefined [-Werror,-Wshift-negative-value]
~/.gvm/gos/go1.4/src/cmd/6c/txt.c:1045:28: error: shifting a negative signed value is undefined [-Werror,-Wshift-negative-value]
go tool dist: FAILED: clang -Wall -Wstrict-prototypes -Wextra -Wunused -Wno-sign-compare -Wno-missing-braces -Wno-parentheses -Wno-unknown-pragmas -Wno-switch -Wno-comment -Wno-missing-field-initializers -Werror -fno-common -ggdb -pipe -Wuninitialized -O2 -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -mmacosx-version-min=10.6 -c -m64 -I ~/.gvm/gos/go1.4/include -I ~/.gvm/gos/go1.4/src/cmd/6c -o ~/.gvm/gos/go1.4/pkg/obj/cmd/6c/txt.o ~/.gvm/gos/go1.4/src/cmd/6c/txt.c
```

で、緊急回避的に下記の通りコマンド実行して解決

```
gvm install go1.4　-B
gvm use go1.4
gvm install go1.5
```

v1.4をソースでなくてバイナリインストールしてとりあえずコンパイルエラーを回避
それからあとのバージョンをインストール
とりあえず後続のバージョンではコンパイルエラーなくインストールできました

[参考](https://github.com/moovweb/gvm/pull/176/files)
Railsチュートアリル「第8章 ログイン、ログアウト」の「セッション」でクッキーが消えない

Railsチュートアリルの「第8章 ログイン、ログアウト」の8.1〜8.3を実施しているのですが、8.3が終了後した時点で、ログインをしログイン中にブラウザを閉じ、その後再びブラウザーを立ち上げるとなぜかログイン状態が保持されています。

クッキーを確認すると、ブラウザーを閉じた後もsessionのクッキーが残っています。更にログイン後に普通にログアウトボタンを押してログアウトしてもそのクッキーが残っている状態です。

コードはチュートリアル通りになっているはずなのですが、何か原因等お分かりになりますでしょうか？

また、クッキーをchromeのデベロッパーツールから削除をして再びルートにアクセスすると削除したクッキーが復元されています。

chromeのクッキーの設定は「ローカルへのデータ設定を許可する」と「ブラウザを終了するまでローカルデータを保存する」の2種類試してみましたが両方共同じ事象になります。
[AWS] boto3のSessionでアクセス権を切り替える

# 事前準備
IAMで、default, dev, prodユーザーを作成します。
devには、AmazonS3FullAccessのポリシーをアタッチし、S3へのアクセスを許可します。
S3に、bucket1, bucket2, bucket3を用意します。

# credentialsファイルを利用
+ credentialsファイル  
    `~/.aws/credentials` or `C:\Users\USER_NAME\.aws\credentials`
    
    ```
    [default]
    aws_access_key_id = DEFAULT_ID
    aws_secret_access_key = SECRET_KEY1
     
    [dev]
    aws_access_key_id = DEV_ID
    aws_secret_access_key = SECRET_KEY2
     
    [prod]
    aws_access_key_id = PROD_ID
    aws_secret_access_key = SECRET_KEY3
    ```
    
+ Pythonプログラム
    
    ```
    import boto3.session
    
    dev_sess = boto3.session.Session(profile_name='dev')
    s3 = dev_sess.resource('s3')
    for bucket in s3.buckets.all():
        print(bucket.name)
    ```
    ※ profile_nameのデフォルトは、profile_name='default'です。

# アクセスＩＤ、シークレットキーを直接指定
+ Pythonプログラム
    
    ```
    import boto3.session
    
    dev_sess = boto3.session.Session(
                                aws_access_key_id='DEV_ID',
                                aws_secret_access_key='SECRET_KEY2')
    s3 = dev_sess.resource('s3')
    for bucket in s3.buckets.all():
        print(bucket.name)
    ```
    ※ ＩＤ/パスワードがプログラムに埋め込まれています。実運用では避けましょう。

# 実行結果
+ 'dev'を指定

```
bucket1
bucket2
bucket3
```

+ 'prod'を指定

```
ClientError: An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
```

+ 'foo'を指定

```
ProfileNotFound: The config profile (foo) could not be found
```
githubとかbitbucketとか色々公開鍵を使いまわしたいとき

## はじめに

bitbucketとか、色んな所でsshの公開鍵を共有してるんですが、
今回githubの公開鍵を追加して、いざ`ssh -T git@github.com`で疎通確認したら

```
Permission denied (publickey).
```

が発生したので、もう二度と同じ過ちを侵さない為に備忘録的に書いておく。

各種公開鍵を作った場合、configファイルを修正し、sshdの再起動を行う必要がある。

### step1. 公開鍵登録

```
$ ssh-keygen -t rsa

適当に鍵作ります。
私は、id_rsa_for_githubという名前で作りました
```

### step2. 公開鍵をgithubに登録する

```
$ cat ~/.ssh/id_rsa_for_github.pub
```

[githubの設定ページ](https://github.com/settings/ssh)から登録しておきます。

### step3. configファイルを修正

```
$ vi ~/.ssh/config

--- 下記を追記して保存
Host github.com
  User git
  HostName github.com
  IdentityFile ~/.ssh/id_rsa_for_github
  IdentitiesOnly yes
```

### step4. sshdの再起動

```
$ sudo service sshd restart
```

### step5. githubの疎通確認

```
$ Hi [github account name]! You've successfully authenticated, but GitHub does not provide shell access.
```

これでOKです。
Rails3からRails5への移行メモ

無謀にもシステムを Rails3 から Rails5 に移行完了した時のメモです。
アップデートは辞めて、新規作成でコードを確認しながら移行しました。

#ReadyForRailsで対応の確認
ここで、Rails5に移行可能かどうかと修正範囲を図る。
載っていないものは、githubで直接対応を調べる。
[http://www.ready4rails.net/](http://www.ready4rails.net)

#全体の流れ
- Gemfileの修正
- db/migrateを新規Railsへコピー
- モデルのコピーと変更
- config/routesのコピーと変更
- controllerの新規作成とactionのコピーと変更
- Viewのパーシャルの変更
- 設定ファイルの変更
- minitestへの書き換え
- 最後にturbolinks5の有効化

##Gemfileの修正
いらなくなったものが多いので、行づつ確認しながらのほうがいい。

##db/migrateのコピー
migrateの廃止内容は変わっていない。

##モデルのコピーと変更
###cancanをcancancanに変更
認可にcancanを使っていたので、対応版に変更、コードに変更なし。
###モデルからattr_accessibleの削除
モデル責務から開放する。
Rails3を使っていると、バリデーションとパラメーターのホワイトリストがごっちゃになって混乱しやすいので辞める。
###モデルのベースクラス名の変更
ActiveRecordからApplicationRecordに変更する。
###正規表現の¥^ $から¥A¥zに変更
セキュリティ上、変更すべき。
### Scopeのラムダを変更
ラムダのみ許容するようになった。
http://qiita.com/tbpgr/items/0b621854900c132d8a42
### conditionsの削除
conditionsは廃止が多いので、whereとメソッドチェインの組み合わせに変更する。
## StrongParametersの導入
コントローラーは、scaffold_controllerを使って新規作成して変更する方がいい。
コントローラーは、大きく変更されるので、今後も舵きりに専念させるほうがいい。

## Viewのパーシャルの変更
パーシャルレンダリングをcollectionを使うように変更する。
[N+1 partial renderingの項目](http://blog.toshimaru.net/roppongirb-speeding-up-rails/)

## rspecからminitestへ移行
今後の恩恵を受けるためにも移行しきってしまったほうがいい。

## 設定ファイルの変更
secret_key_baseの設定変更
行を確認しながら修正する。

#最後にturbolinks5の有効化
おそらくturbolinksを初期処理で無効化しているでしょう。
(Turbolinks3を趣味を超えて導入しているところを私は見たことがない。)
turbolink5はモバイルにも対応していて、使ってみたところ邪魔もしなかった。
TableViewでTop/Bottomに移動させる (Swift3.0)

#Purpose
Personal Note

#Development Environment
- OS X El Captain 10.11.2
- Xcode Version 8.0

#Language
Swift 3.0

# Source Code
```swift:Top
self.tableView.contentOffset = CGPoint(x: 0, y: -(self.tableView.contentInset.top))
```
```swift:Bottom
self.tableView.contentOffset = CGPoint(x: 0, y: self.tableView.contentSize.height - self.tableView.frame.size.height)
```
Deep Learning? > Link > KDD2016 >Knowledge Discovery and Data Mining

Youtubeで偶然見つけたKDD2016というconferenceの情報。


KDD2016 (Knowledge Discovery and Data Mining)
https://www.youtube.com/channel/UCPsUUDUlcTJuP-fRa7z85aQ

色々見るところは多いが、2分間で研究紹介している再生リストが気になる。アイデアの種として面白い。
[KDD 2016 Short Video Presentations](https://www.youtube.com/playlist?list=PLvM6T5w9YQBIar40dKbcGh6qgwNygF7wg)

上記のビデオ(162本)を全部目を通すにはそこそこ時間がかかる。

関連論文は以下から取れるようだ。
http://www.kdd.org/kdd2016/program/accepted-papers

気になったものの一例として

- [ノイズが混じった状態でのクラス分類](https://www.youtube.com/watch?v=pXQuz7poFY4&index=83&list=PL_MJualihC5A3REXN1CnuIlImC_o9YqnH)
  - http://www.kdd.org/kdd2016/subtopic/view/skinny-dip-clustering-in-a-sea-of-noise
  - 論文のページからYoutubeにもつながるようだ

サイトは以下。
http://www.kdd.org/kdd2016/

こういう情報は自分がやろうとしていることとどれくらい関連性があるかは不明。
paperを読んでも実装できるかどうかという部分も検討課題。
結果は良いが、「それどう実装するの？」という再現が難しい論文はある。

### 気になったもの

以下、内容についてはほとんど理解できていないが、キーワードに興味を引かれただけ。

- Infinite Ensemble for Image Clustering
  - http://www.kdd.org/kdd2016/subtopic/view/infinite-ensemble-for-image-clustering
  - 1:50頃のEnsemble clusteringというキーワードが気になった
 
- Deep Visual-Semantic Hashing for Cross-Modal Retrieval
  - http://www.kdd.org/kdd2016/subtopic/view/deep-visual-semantic-hashing-for-cross-modal-retrieval
  - 2:05頃のVisual EmbeddingとSemantic EmbeddingをVisual Semantic Fusionするという部分が気になった

- AnyDBC: An Efficient Anytime Density-based Clustering Algorithm for Very Large Complex Datasets
  - http://www.kdd.org/kdd2016/subtopic/view/anydbc-an-efficient-anytime-density-based-clustering-algorithm-for-very-lar
  - DBSCAN関連 (まだ学習してないが、キーワードだけ時々見かける)
  
- Matrix Computations and Optimization in Apache Spark
  - http://www.kdd.org/kdd2016/subtopic/view/matrix-computations-and-optimization-in-apache-spark
  - Matrixの計算をDistributed環境で計算できるようにVectorにして計算すると言っている
  - (そんなことが本当にできるのだろうか？)
  - (分散処理の対象がCPUなのかGPUなのか気になる)
  - (Streaming Multiprocessorに対してこの計算ができると大規模なMatrix計算ができるようになるのだろうか?) 

- Accelerated Stochastic Block Coordinate Descent with Optimal Sampling
  - http://www.kdd.org/kdd2016/subtopic/view/accelerated-stochastic-block-coordinate-descent-with-optimal-sampling
  - Gradient computationについて
  - Stochastic Block Coordinate DescentとBatchの比較
  - 通常のStochastic Block Coordinate DescentだとSublinear Convergence
  - 提案手法ではLinear Convergence

- Distributing the Stochastic Gradient Sampler for Large-Scale LDA
  - http://www.kdd.org/kdd2016/subtopic/view/distributing- the-stochastic-gradient-sampler-for-large-scale-lda
  - Latent Dirichlet Allocation (LDA)
  - Distributed samplingとstochastic methodの合成
    - Distributed Stochastic Gradient Langevin Dynamic (DSGLD)
    - 効率は良くない
    - EM algorithmを提案
UniRxでカウントアプリ


![CountAppliRx.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/8fdcc0a1-98f4-fb23-efd3-62315a686078.gif "CountAppliRx.gif")

># 使ったこと

## ReactiveProperty
値(ここでは数値)を持ちつつ，イベントを発行することができる．

ここでは，_contReactivePropertyの値が変わると，
Subscriveで登録されていたイベントが呼ばれる．

## Button.OnClickAsObservable
クリックを検知できる．

## Where
if文の役割

## MV(R)P
ModelとViewとPresenterで構成される．

ここでは，PresenterにそれぞれのView(ボタン)の役割を集中させている．

># スクリプト

```CountModel.cs
using UnityEngine;
using System.Collections;
using UniRx;
using UnityEngine.UI;

public class CountModel : MonoBehaviour {

	// カメラ
	[SerializeField]
	private Camera _camera;

	// カウント表示用テキスト
	[SerializeField]
	private Text _text;

	// カウントの値を持つ & イベントを発行
	private ReactiveProperty<int> _countReactiveProperty = new ReactiveProperty<int> (0);

	// イベントを購読できるようにする．
	public ReactiveProperty<int> CountReactiveProperty{
		get{ return _countReactiveProperty; }
	}

	void Start(){
		// カウントをテキストにつっこむイベント	
       _countReactiveProperty.SubscribeToText(_text);

		// 背景色を変えるイベント
		_countReactiveProperty
			.Where (count => (count / 10) <= 0)
			.Subscribe (_=>_camera.backgroundColor = Color.red);

		_countReactiveProperty
			.Where (count => (count / 10) == 1)
			.Subscribe (_=>_camera.backgroundColor = Color.green);

		_countReactiveProperty
			.Where (count => (count / 10) >= 2)
			.Subscribe (_=>_camera.backgroundColor = Color.blue);
	}
}
```


```CountPresenter.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UniRx;

public class CountPresenter: MonoBehaviour {

	// プラスボタン
	[SerializeField]
	private Button _plusButton;

	// マイナスボタン
	[SerializeField]
	private Button _minusButton;

	void Start () {
		var model = this.GetComponent<CountModel> ();

		// プラスボタンを押した時のイベント
		// カウントに1足す
		_plusButton.OnClickAsObservable ().Subscribe (_=>model.CountReactiveProperty.Value += 1);


		// マイナスボタンを押した時のイベント
		// 0より大きければ，カウントから1引く
		_minusButton.OnClickAsObservable ()
			.Where(_=> model.CountReactiveProperty.Value > 0)
			.Subscribe (_=> model.CountReactiveProperty.Value -= 1);
	}
}
```
Visual Studio Code, window zoom out設定

settings.jsonに`window.zoomLevel`を追加し、値を設定しながらWindowの表示サイズを調整

**自分はこんな感じ**

```
{
    "editor.fontSize": 11,
    "window.zoomLevel": -1
}
```

**経緯**
デフォルトのwindow表示は少し大きい気がするので、いつも`Control + -`で小さくしていた。
C++ builder > bcb6からの移行 > ファイル'INDY60.LIB'が見つかりません

```txt:動作環境
C++ Builder XE4
```

C++ Builder 6のプロジェクトをXE4で見れる程度にする。
完全移行は難しいだろうから、途中でやめるかもしれない。
移行作業は自分が3年前(2013年6月)に調べた情報に基づく。間違いがある可能性もある。

## Indy60.LIB

> [ilink32 エラー] Fatal: ファイル 'INDY60.LIB' を開けません

Indy (Internet Direct)関連のエラー。

XE4で確認したものはIndy10のようだ。

INDY60.LIBがどこに設定されているか。

`プロジェクト -> オプション -> パッケージ > 実行時パッケージ `
にある「実行時パッケージインポートライブラリ」に`Indy60.bpi`がある。これを消してみる。

これだけでは`ファイル'INDY60.LIB'が見つかりません`エラーは消えなかった。

## その場しのぎの対処

Sublime Textにてプロジェクトフォルダ全体に対して「Indy60」で検索した。.bprファイルやその他のファイルにてIndy60.libやIndy60.bpiなどのIndy60関連の記述を消した。

このあたりは、本来、XE4対応Indyに置き換える必要があるだろう。
ゲームでAIをトレーニングするジム「OpenAI Gym」の環境構築手順 on Mac OS X

[OpenAI Gym](https://gym.openai.com/) は、ゲームで人工知能を開発・評価するためのプラットフォームです。

- [「AI用トレーニングジム」を、OpenAIがオープン｜WIRED.jp](http://wired.jp/2016/05/02/openai-gym-train-atari-games/)


環境構築はほとんど手順通りに `pip install` やら `brew install` するだけでできて、

パックマンとか、

![pacman.gif](https://qiita-image-store.s3.amazonaws.com/0/3180/8c235a00-cd55-41a2-a605-a4a2e9b0240f.gif)


スペースインベーダーとか、

![invaders.gif](https://qiita-image-store.s3.amazonaws.com/0/3180/aacf6f96-de37-50e0-903d-b78f53bd4020.gif)



こういうのをとりあえずお試しとしてランダムに動かしてみるだけなら**5行ぐらいのコードでできてしまう**ので、強化学習とか全然わからないけどとりあえず試してみる、というのも最初の一歩目にいいかもしれません。


以下、僕が **macOS Sierra** で行った環境構築手順です。


##OpenAI Gymのインストール

インストール手順はREADMEの [こちら](https://github.com/openai/gym#installation) に書いてあります。

```
git clone https://github.com/openai/gym.git
cd gym
pip install -e .
```

さらに、依存ライブラリ等の諸々をフルインストールします。

```
$ brew install cmake boost boost-python sdl2 swig wget
```

###atari環境のインストール

atariのゲームが扱えるよう追加インストールします。

```
$ pip install 'gym[atari]'
```

##動作確認

[公式ドキュメント](https://gym.openai.com/docs) に簡単なサンプルが載っています。

```python:cartpole.py
import gym
env = gym.make('CartPole-v0')
env.reset()
for _ in range(1000):
    env.render()
    env.step(env.action_space.sample())
```

実行してみると、

```
$ python cartpole.py
```

こういうゲームが実行されます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/3180/cc7cb86a-b66b-1245-54a7-7ea8ebcd3cf1.jpeg" width="400">


##いろんなゲームを起動してみる

###スペースインベーダー

コード

```python:invaders.py
import gym
env = gym.make('SpaceInvaders-v0')
env.reset()
for _ in range(1000):
    env.render()
    env.step(env.action_space.sample())
```

実行

```
$ python invaders.py
```

![invaders.gif](https://qiita-image-store.s3.amazonaws.com/0/3180/aacf6f96-de37-50e0-903d-b78f53bd4020.gif)


###パックマン

コード

```python:pacman.py
import gym
env = gym.make('MsPacman-v0')
env.reset()
for _ in range(1000):
    env.render()
    env.step(env.action_space.sample())
```

実行

```
$ python pacman.py
```

![pacman.gif](https://qiita-image-store.s3.amazonaws.com/0/3180/8c235a00-cd55-41a2-a605-a4a2e9b0240f.gif)


##おわりに

今回は環境構築と、簡単な動作確認を行ってみました。肝心の強化学習にはまだ1ミリも踏み込んでいないので、また別記事で書きたいと思います。


参考記事：

- [icoxfog417/techcircle_openai_handson: Tech-Circle OpenAI Handson Repository](https://github.com/icoxfog417/techcircle_openai_handson)
- [Pythonではじめる OpenAI Gymトレーニング](http://www.slideshare.net/takahirokubo7792/python-openai-gym)
Windows上でsippを動かす②(SIPpインストール)

#環境
windows7
cygwin

cygwinのインストールについては

[Windows上でsippを動かす①(Cygwinインストール)](http://qiita.com/hakofugu/items/ed5b11f22aea6e0097c5)
を参照。



#準備
下記URLよりsippをダウンロード。
https://github.com/SIPp/sipp/releases
ここでは
sipp-3.5.1.tar.gzを使用して解説する

#インストール
7-zipなどを使用し、先程ダウンロードした
sipp-3.5.1.tar.gzを解凍する。

解凍してできたフォルダを
c:\cygwin64\usr\local（32bitOSならcygwin）配下に配置する

cygwinを起動し、
cdコマンドで移動し、ビルドする

```
cd /usr/local/sipp-3.5.1
./build.sh
```

正常に完了すると以下のようになる。
![WS000016.JPG](https://qiita-image-store.s3.amazonaws.com/0/127302/6413a7fe-8547-246f-571b-0340705cf29f.jpeg)



エラーが出た場合はパッケージが不足している可能性がある。
　[Windows上でsippを動かす①(Cygwinインストール)](http://qiita.com/hakofugu/items/ed5b11f22aea6e0097c5)
を確認すること

#sippでpcapを使用する場合(参考)
pcapを使用する場合はパッケージ・ライブラリの追加後
sippの再ビルドが必要となる。
./build.sh --with-pcap
のようにオプションをつけてビルドすること。
詳細はsipp-3.5.1フォルダ内のREADME.mdを参照すること
Windows上でsippを動かす①(Cygwinインストール)

#Cygwinのダウンロード
下記URLより
https://www.cygwin.com/
setup-x86.exe　または
setup-x86_64.exe 　をダウンロード。

#Cygwinのインストール
基本はそのまま「次へ」を押せばOK.

パッケージ選択画面で日本国内のサーバを選択（末尾がjp）
![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/127302/eec505e7-1283-b320-ae7a-70452a6f120f.jpeg)


パッケージ選択画面で以下のパッケージをインストールする。
とりあえず動かすだけならC++とcursesのみでOK

```
make
C++ Compiler
curses or ncurses library
For TLS support: OpenSSL >= 0.9.8
For pcap play support: libpcap and libnet
For SCTP support: lksctp-tools
For distributed pauses: Gnu Scientific Libraries
```

具体的には下記パッケージをインストールする

```
Devel
└gcc-g++:GNU COmpiler Collection(C++)
└automake:Wrapper scripts for automake and aclocal
└automake 1.9:(1.9)a tool for generating GNU-compliant Makefiles
└make: The GNU version of the 'make' utility
└(64bitOSなら)mingw64-x86_64-ncurses: ncurses for Win64 toolchain
└(32bitOSなら)mingw64-i686-ncurses: ncurses for Win32 toolchain
└autoconf: Wrapper scripts for autoconf commands
└autoconf2.5: Current version of the automatic configure script

Libs
└libncurses-devel: Terminal display library
└libncursesw 10: Terminal display library

Base
└ncurses: Terminal display utilities
```

下図のようにSearch部分に探したいパッケージを入力すると対象パッケージを絞れる
「New」列のSkipをクリックし、インストールしたいバージョンを選択する
![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/127302/dc5b3cfb-958d-a1c4-ab33-2432f0b31f9a.jpeg)

あとは次へを押し、指示に従って進めればOK。

[Windows上でsippを動かす②(SIPpインストール)](http://qiita.com/hakofugu/items/a53338e3c8884b2ed2a3)に続く
Powershellからexeを起動する時、引数の"-hoge"をpowershellに解析されないようにする方法

例えば`hoge -a`とpsで入力されて、-aのパラメーターはpsに余計な事をせずにそのままhogeに渡してほしい。
そんな時は
`hoge --% -a`と入力。--%がマジックワードの「解析停止シンボル」と言う。

about_Escape_Characters https://technet.microsoft.com/ja-jp/library/hh847755.aspx
S3上のオブジェクトをダウンロードせずに結合したい

# 概要

そもそもそのような使い方は想定されていないので制限があるけど、要件がマッチするなら便利かもしれない。

- Multipart Upload (Copy) を利用することで、S3側で複数のオブジェクトを1つのオブジェクトに結合が可能。ローカルへのダウンロード、アップロードを行わずに実施できる。
- ただし、マルチアップロードの制限に準ずるため、各オブジェクトは 5 MB 以上である必要がある。 (末尾のオブジェクトは5MB未満もOK)



# ざっくり手順

1. マルチパートアップロードの初期化  
```aws s3api create-multipart-upload --bucket <dest_bucket> --key <dest_key>```
2. パーツのコピー  
```aws s3api upload-part-copy --bucket <dest_bucket> --copy-source <src_bucket>/<src_key> --key <dest_key> --part-number 1 --upload-id <upload_id>```
3. マルチパートアップロード完了  
```
aws s3api complete-multipart-upload --bucket --key <dest_key> --upload-id <upload_id> --multipart-upload "Parts=[{ETag=ETag1,PartNumber=1},{ETag=ETag2,PartNumber=2}]"
```

# 詳細

## マルチパートアップロード初期化

作成先のキーを指定して、UploadId を取得します。

```
aws s3api create-multipart-upload --bucket <dest_bucket> --key <dest_key>

{
    "Bucket": "<dest_bucket>",
    "UploadId": "pc7Gsw_6jFitDrTeqcmB...kLJnG77fkrQgpVqJAI9nEaiSjg--",
    "Key": "<dest_key>"
}
```

## パーツのコピー

結合対象のオブジェクトをコピーしていきます。
`--copy-source` でコピー元を指定します。
`ETag` が返却されるのでメモします。

```
aws s3api upload-part-copy --bucket <dest_bucket> --copy-source <src_bucket>/<src_key> --key <dest_key> --part-number 1 --upload-id <upload_id>

{
    "CopyPartResult": {
        "LastModified": "2016-11-13T01:45:08.000Z",
        "ETag": "\"ec8bb3b24d5b0f1b5bdf8c8f0f541ee6\""
    }
}

aws s3api upload-part-copy --bucket <dest_bucket> --copy-source <src_bucket>/<src_key> --key <dest_key> --part-number 2 --upload-id <upload_id>

{
    "CopyPartResult": {
        "LastModified": "2016-11-13T01:45:14.000Z",
        "ETag": "\"25e317773f308e446cc84c503a6d1f85\""
    }
}
```

ここではオブジェクトのコピーする位置も指定可能です。本来5GBを超えるオブジェクトをコピーするために利用されるので、この場合は当然ながら5GB以下のレンジを指定してマルチパートとしていきます。


## マルチパートアップロード完了

`--multipart-upload` には、全てのパーツを `PartNumber` と `ETag` を指定して列挙する必要があります。

```
aws s3api complete-multipart-upload --bucket <desy_key> --key <dest_key> --upload-id <upload_id> --multipart-upload "Parts=[{ETag=ec8bb3b24d5b0f1b5bdf8c8f0f541ee6,PartNumber=1},{ETag=25e317773f308e446cc84c503a6d1f85,PartNumber=2}]"
{
    "ETag": "\"4998c056afc65f55ea2ccf3a4714b5e5-2\"",
    "Location": "https://<dest_bucket>/<dest_key>",
    "Bucket": "<dest_bucket>",
    "Key": "<dest_key>"
}
```
Jupyter+AnsibleをBash on Ubuntu on Windowsにインストール

今お仕事させていただいている国立情報学研究所では [Literate Computing for Reproducible Infrastructure](http://www.slideshare.net/nobu758/jupyter-notebook-63167604)と銘打って、[仮想環境の整備をするNotebook](https://github.com/NII-cloud-operation/Literate-computing-Basics)とか[Hadoopクラスタを構築するNotebook](https://github.com/NII-cloud-operation/Literate-computing-Hadoop)とかを公開しているわけですが、最初のとっかかりとしてJupyterとAnsibleがインストールされた環境を用意するところがちょっと考えどころになります。

Macを使っておられる方はいずれもpipでさっくり入るわけですが、Windowsだと色々悩みどころが出てきます。
まあ、インフラ系ツールを積極的に使うんならLinuxとかMacとか使えよという話はあるわけですが、今回はその悩みどころを我らがニューカマーBash on Ubuntu on Windows(以下BoW)で何とかしてみることにします。

# BoWに取り組む前に・・・

個人的感想ではありますが、BoWはまだまだ発展途上感は否めないので、それなりに苦労する覚悟が必要そうという感じです。他にも、WindowsでJupyterを触るやり方はいくつかあるかなと・・・

## Anacondaを使う？

Jupyterからデータサイエンス分野のツールを使うのであれば、[Anaconda](https://www.continuum.io/anaconda-overview)が最も楽なんじゃないかと思います。

AnacondaはWindows向けのインストーラも用意されていて、Anacondaをインストールした後 `conda install jupyter` とかすればさっくりjupyter.exeがインストールされます。あとは`jupyter notebook`とか実行するとちゃんと動きます。便利。

ただ、悩みどころがAnsibleで、[Windows Support](http://docs.ansible.com/ansible/intro_windows.html) での記述の通り、ansibleのクライアントとしてはLinuxマシンのみが想定されていて(操作ターゲットとしてはWindowsもいけるわけですが)、Windows上でansibleをクライアントとして使うには結局BoWとかCygwinとかが必要になります。

> 参考: [Using Ansible through Windows 10's Subsystem for Linux](http://www.jeffgeerling.com/blog/2016/using-ansible-through-windows-10s-subsystem-linux)

## Dockerを使う？

WindowsでのDockerもHyper-V統合されたりして結構こなれてきたと個人的には思っています。

やり方の概観は、[ローカル環境でJupyter Notebookを動かすときの俺的ベストプラクティス](http://qiita.com/yacchin1205/items/efaa498ca68e7c169015)を参照してください。最新はもっと楽になっていると思います。(編集しなきゃ・・・)

# BoWでJupyter+Ansibleを動かす

で、本題。BoWでJupyterとAnsibleを動かしてみることにします。

BoWでJupyterを動かそうとした場合、**2016/11/13現在**、Insider Previewのリリース プレビュー版では(たぶんリリース版も)、WSL(Windows Subsystem for Linux)のシステムコール実装の問題でZeroMQが正常に動作しません。

この問題を回避するため、Issue [Cannot connect to jupyter/ipython instance](https://github.com/Microsoft/BashOnWindows/issues/185) で紹介されているパッチをあてたバージョンのZeroMQを利用する必要があります。手順としては以下のイメージ。

1. Bash on Ubuntu on Windowsをインストールする

    > 参考: [Bash on Ubuntu on Windowsをインストールしてみよう！](http://qiita.com/Aruneko/items/c79810b0b015bebf30bb)

2. BoW上でJupyterをインストールする
    以下のコマンドを実行すればOK。

    ```
    $ sudo apt-get update
    $ sudo add-apt-repository ppa:aseering/wsl
    $ sudo apt-get update
    $ sudo apt-get install python-pip python-zmq libzmq3
    $ sudo pip install jupyter
    ```

3. BoW上でAnsibleをインストールする

    ```
    $ sudo pip install ansible
    ```

4. Jupyter Notebookを実行する

    ```
    $ jupyter notebook --no-browser
    ```

    とかすればOK。
    Notebookのディレクトリやポート番号などの設定は`jupyter notebook --generate-config` して、生成されたconfigファイルを変更すればよい。

という感じ。これで、ブラウザから `http://localhost:8888` でNotebookを開いて、NotebookからAnsibleを実行できるようになります。

ポイントは、`add-apt-repository ppa:aseering/wsl` した後に `sudo apt-get install python-zmq libzmq3` すること。この手順によりBoW対応のパッチがあたったバージョンのlibzmq3と、それを使う形でコンパイルされたPython用のZMQモジュールをインストールすることができます。

aptからでなくpipなどでpyzmqを個別にインストールしていたりすると、バンドル版の(パッチがあたっていない)ZMQが動いたりするので要注意。どうにも動かない場合は`lxrun /uninstall /full`した後に`lxrun /install`してBoWをいったん再インストールして再現性をみるのがよいかもしれません。


これで、BoWを介しているとは言え比較的素直にWindows上でもjupyterとansibleが使えるようになります。具体的に各Notebookの使い方を解説していきたいところなんですが、それはまた別の機会に。
Rubyでゼロパディングの数値文字列を扱うときのメモ

# なにがあったか
8桁のゼロパディングされた10進数の数字文字列について、値が本当に数値かどうかをチェックしたかった。数値かどうかの判定は`Integer()`に文字列を投げて例外がでるかどうかでチェックする[方法がある](http://taro-tnk.hatenablog.com/entry/2012/12/17/001552)ようなので、やってみた。

```
$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
```

```rb
def integer_string?(str)
  Integer(str)
  true
rescue ArgumentError
  false
end

integer_string?("00004820") #=> false
```

`true` になることを期待していたが、数値ではないと判定されてしまった。


# なぜそうなった？
`"00004820"` は8進数として認識されていたからだった。
調べていくとなるほど当然の挙動であったが、普段あまり10進数以外を扱わないので、最初は面食らってしまった。

```rb
Integer("00000010") #=> 8
Integer("00000008") #=> ArgumentError、8進数で表現できない
```

Ruby実装を追っていくと、どうもこの辺で文字列から基数を判断している様子？
https://github.com/ruby/ruby/blob/ruby_2_3/bignum.c#L4013
実装全部をおいかけたわけではないが、次のような理解をした。

```rb
# 文字列の先頭が0の場合は接頭辞として扱われ、2文字目で基数が決定される
Integer("0x10") #=> 16 (16進数)
Integer("0b10") #=> 2 (2進数)
Integer("0o10") #=> 8 (8進数)
Integer("0d10") #=> 10 (10進数)

# 先頭が0で特定の接頭辞がとして判断できなければ、8進数として扱う
Integer("010") #=> 8 (8進数)

# 文字列の先頭が0じゃなければ10進数として扱う
Integer("123") #=> 123 (10進数)
```


# こうすればいい
ちゃんと基数を設定してあげると良さそう。
でも代わりに接頭辞表現を受け付けなくなったりするので、使い所によるかも。

```rb
def decimal_integer_string?(str)
  Integer(str, 10)
  true
rescue ArgumentError
  false
end

decimal_integer_string?("00004820") #=> true
decimal_integer_string?("0000482a") #=> false *不要な文字が混じっている
decimal_integer_string?("0x01") #=> false *この表記は受け付けなくなるので注意
integer_string?("0x01") #=> true *基数を指定しなければtrue扱い
```


感想: 難しいし奥深いなぁ（小並感)

## 参考
- [文字列が数値かどうか判定するStringハック - nemomemo](http://d.hatena.ne.jp/EnnuimaZ/20130505/1367740166)
- [Ruby Recipe38 数値を表す文字列か調べる - たなかたろーのにっき](http://taro-tnk.hatenablog.com/entry/2012/12/17/001552)
- [Ruby の String#to_i と組み込み関数の Integer() は違う](http://www.metareal.org/2007/10/06/ruby-to-i-and-integer-function/)
- [基数の違う数値の計算 - 名もないテクノ手](http://d.hatena.ne.jp/seuzo/20090220/1235095836)
- [Rubyメモ2 - にっちとだじゃれ](http://mfham.hatenablog.com/entry/2016/09/26/025540)
C++ builder > bcb6からの移行 > AnsiStringからUnicodeStringへの対応切り替え

```txt:動作環境
C++ Builder XE4
```

C++ Builder 6のプロジェクトをXE4で見れる程度にする。
完全移行は難しいだろうから、途中でやめるかもしれない。
移行作業は自分が3年前(2013年6月)に調べた情報に基づく。間違いがある可能性もある。

### AnsiStringからUnicodeStringへの切り替え

> [bcc32 エラー] Table.cpp(87): E2342 パラメータ 'format' は const char * 型として定義されているので wchar_t * は渡せない

bcb6ではAnsiStringで`.c_str()`で得る変数はchar_t型。一方でXE4はUnicodeStringが基本で`.c_str()`で得る変数はwchar_t型。

このあたりは適宜対応することになる。


### 一時しのぎの対応

```
Str_hoge.c_str()
```

を以下のようにする。

```
AnsiString(Str_hoge).c_str()
```

<font color=red>ただしこれにより、実際にやるとりする文字列に異常が発生しないかは要確認</font>。

今回は、全体の処理の流れを抑えるための移植なので、そこまで厳密にはしない。

細かい部分までするとすれば、bcb6側のIDEでテストを追加しておいて、そのテストが壊れないかをチェックしながらXE4移行にする。
C++ builder > bcb6からの移行 > TeeChart > ->YValues->Count()

```txt:動作環境
C++ Builder XE4
```

C++ Builder 6のプロジェクトをXE4で見れる程度にする。
完全移行は難しいだろうから、途中でやめるかもしれない。
移行作業は自分が3年前(2013年6月)に調べた情報に基づく。間違いがある可能性もある。

## `TeeChart > ->YValues->Count()`

```txt:bcb6
bool check = (bool)(DataSeries_L->YValues->Count() > 0);
```
> [bcc32 エラー] Graph.cpp(75): E2314 関数でないものを呼び出している

```txt:XE4
bool bfLight = (bool)(DataSeries_L->YValues->Count > 0);
```

Count()というメソッドからCountというプロパティへの変更。
C++ builder > bcb6からの移行 > #include <Chart.hpp>

```txt:動作環境
C++ Builder XE4
```

C++ Builder 6のプロジェクトをXE4で見れる程度にする。
完全移行は難しいだろうから、途中でやめるかもしれない。
移行作業は自分が3年前(2013年6月)に調べた情報に基づく。間違いがある可能性もある。

### `#include <Chart.hpp>`

TeeChart関連。

```txt:bcb6
#include <Chart.hpp>
#include <ExtCtrls.hpp>
#include <TeEngine.hpp>
#include <TeeProcs.hpp>
```

> [bcc32 エラー] Graph.h(10): E2209 インクルード ファイル 'Chart.hpp' を開けません
[bcc32 エラー] Graph.h(12): E2209 インクルード ファイル 'Series.hpp' を開けません
[bcc32 エラー] Graph.h(13): E2209 インクルード ファイル 'TeEngine.hpp' を開けません
[bcc32 エラー] Graph.h(14): E2209 インクルード ファイル 'TeeProcs.hpp' を開けません

### XE4対応

```txt:XE4
#include <VCLTee.Chart.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <VCLTee.TeEngine.hpp>
#include <VCLTee.TeeProcs.hpp>
```
C++ builder > bcb6からの移行 > #include <vcl\...hpp>

```txt:動作環境
C++ Builder XE4
```

C++ Builder 6のプロジェクトをXE4で見れる程度にする。
完全移行は難しいだろうから、途中でやめるかもしれない。
移行作業は自分が3年前(2013年6月)に調べた情報に基づく。間違いがある可能性もある。

### `#inlcude <vcl\ExtCtrls.hpp>`

```txt:bcb6
#include <vcl\ExtCtrls.hpp>
#include <vcl\Buttons.hpp>
#include <vcl\StdCtrls.hpp>
#include <vcl\Controls.hpp>
#include <vcl\Forms.hpp>
#include <vcl\Graphics.hpp>
#include <vcl\Classes.hpp>
#include <vcl\SysUtils.hpp>
#include <vcl\Windows.hpp>
#include <vcl\System.hpp>
```

```txt:XE4
#include <ExtCtrls.hpp>
#include <Buttons.hpp>
#include <StdCtrls.hpp>
#include <Controls.hpp>
#include <Forms.hpp>
#include <Graphics.hpp>
#include <Classes.hpp>
#include <SysUtils.hpp>
#include <Windows.hpp>
#include <System.hpp>
```
C++ builder > bcb6からの移行 > InheritsFrom()

```txt:動作環境
C++ Builder XE4
```

C++ Builder 6のプロジェクトをXE4で見れる程度にする。
完全移行は難しいだろうから、途中でやめるかもしれない。

### InheritsFrom()

```txt:bcb6
if (InheritsFrom(Components[i]->ClassType(), classes[clsIdx].aClass)) {
     break;
}
```

> [bcc32 エラー] option.cpp(99): E2227 _fastcall TObject::InheritsFrom(TMetaClass *) の呼び出しに余分なパラメータがある

### XE4対応

以下のようにした。

```txt:XE4
if (Components[i]->ClassType()->InheritsFrom(classes[clsIdx].aClass)) {
     break;
}
```