OmniAICreator/Qiita-1.07M huggingface dataset:
配列の要素に応じた多次元の連想配列を用意する

#したいこと

    ['i', 'ro', 'ha']

を元に以下の連想配列に値を代入したい。
なお配列の要素は動的とする。

    hoge['i']['ro']['ha']

#１つの答え
文字列を作って eval で処理。

    var hoge = {'i':{'ro':{'ha':''}}};
    var val = 'ﾍ(-。-)ノ';
    var keys = '';
    var keysArray = ['i', 'ro', 'ha'];

    for(key in keysArray){
        keys += "['" + keysArray[key] + "']";
    }
    eval('hoge' + keys + ' = val');

    console.log(keys);
    console.log(hoge);
↓

    ['i']['ro']['ha']
    Object {i: Object}
      i: Object
        ro: Object
          ha: "ﾍ(-。-)ノ"


以下蛇足
##作ったもの

jQuery で、重なっている要素をクリックすると全部反応するのですが、その際、先祖方向に向かって順番に反応してくれるので、それを全部拾っていくと逆に場所を特定できます。
具体的に書くとこう。

こんな HTML で

    <div id="no1">
      001
      <div id="no2">
        002
        <div id="no3">
          003
        </div>
      </div>
    </div>

こんな javascript のとき

    $(document).on('click', 'div', function(){
      alert(this.id);
    });

003 の文字をクリックすると、
no3, no2, no1 の順番で alert の小窓がでます。
これをもとに以下のようにしたかったのです。

    hoge['no1']['no2']['no3'] = 'ほにゃらら';

で、最終的にできたもの。

[JSON可視化＆編集](http://webinko.com/json.html)
Googleスプレッドシートからデータを取り出すgemを作った


[google_spreadsheet_fetcher](https://github.com/taka0125/google_spreadsheet_fetcher)というgemを作ったのでメモ。

# 経緯

非エンジニアに作業をお願いしてその結果を取り込み時にGoogleスプレッドシートを経由する事が多いので作った。

- 日本語・英語の翻訳データを記載していって、i18n用のyamlファイルを作りたい
- プロフィールを一気に設定したい

とか。

# 使い方

## Google Cloud Platformでプロジェクトを作る

https://cloud.google.com/resource-manager/docs/creating-managing-projects

を見ながら作る。

## Google Drive APIをONにする

## 認証情報を作成

- OAuthクライアントID
- アプリケーションの種類は「その他」

<img width="854" alt="image1.png" src="https://qiita-image-store.s3.amazonaws.com/0/5465/b2ea0eb4-021b-70a0-65b0-85cd1943328d.png">

## シークレット情報をJSONでダウンロード

<img width="800" alt="image2.png" src="https://qiita-image-store.s3.amazonaws.com/0/5465/f15b5ab2-027b-f8ca-ecae-f7eb837b04a2.png">

## 後はコードを書く

```ruby
credential_store_file = Rails.root.join('config', 'credential-oauth2-supporter.json').to_s
sheet_key = 'YOUR_SHEET_KEY'

GoogleSpreadsheetFetcher.configure do |config|
  config.client_secrets_file_path = Rails.root.join('config', 'client_secrets_pokota_supporter.json').to_s
end

user_id = 'sample'
fetcher = GoogleSpreadsheetFetcher::Fetcher.new(credential_store_file, user_id, sheet_key)

fetcher.fetch_by_index(0)
fetcher.fetch_by_title('title')
fetcher.fetch_by_gid('gid')
```

- コードを実行すると初回だけ、ブラウザが立ち上がりOAuthの認証画面に行く
- 認証を済ますとコードが発行されるので、そのコードをコピペする
リバース・プロキシはどのようなリクエスト／レスポンスのときにキャッシュするか？

[メルカリでCDNのキャッシュに由来する情報流出](http://tech.mercari.com/entry/2017/06/22/204500)があった。CDNでキャッシュしているのはリバース・プロキシで、ちょっと前に[Goの練習を兼ねてリバース・プロキシを書いた](https://github.com/ichiban/jesi)ので解説してみる。

リバース・プロキシのキャッシュの挙動について考えるとき、以下の２点を切り離して考える必要がある：

- どのようなリクエスト／レスポンスのときにキャッシュするか？
- どのようなリクエストのときにキャッシュから返すか？

[メルカリのケース](http://tech.mercari.com/entry/2017/06/22/204500)では、そもそもキャッシュして欲しくない情報がキャッシュされ、かつそれがユーザへのレスポンスとして使われたという問題なので、ここでは前者の「どのようなリクエスト／レスポンスのときにキャッシュするか？」について考える。

リバース・プロキシはどのようなリクエスト／レスポンスのときにキャッシュするのか？
[RFC7234](https://tools.ietf.org/html/rfc7234#section-3)的には以下のすべての条件を満たすときにキャッシュするかもしれない。

- キャッシュ可能なメソッドある
- キャッシュ可能なステータスコードである
- **リクエスト**ヘッダの`Cache-Control`に`no-store`がない
- **レスポンス**ヘッダの`Cache-Control`に`no-store`や`private`がない
- **リクエスト**ヘッダに`Authorization`がない
- 以下のいずれかを満たす
  - **レスポンス**ヘッダに`Expires`がある、または
  - **レスポンス**ヘッダの`Cache-Control`に`max-age`がある、または
  - **レスポンス**ヘッダの`Cache-Control`に`s-maxage`がある、または
  - **レスポンス**ヘッダの`Cache-Control`においてCache Control Extensionsでキャッシュ可能だと指定されている、または
  - キャッシュ可能だと定義されているステータス・コード、または
  - **レスポンス**ヘッダの`Cache-Control`に`public`がある

[メルカリのケース](http://tech.mercari.com/entry/2017/06/22/204500)ではレスポンス・ヘッダに以下を指定していた。

```
Cache-Control: no-cache
Expires: Thu, 22 Jun 2017 08:58:21 GMT (アクセスの1秒前の時間)
```

上に書いたキャッシュの条件で、`Cache-Control: no-cache`は出てこない。[RFC7234](https://tools.ietf.org/html/rfc7234#section-5.2.1.4)では、`no-cache`はキャッシュされたレスポンスを使わないように指定するものだと書いてある。つまり、「どのようなリクエストのときにキャッシュから返すか？」の話だ。

意外なことに、古い日付の`Expires`があることはキャッシュされる原因になりうる。なぜなら、リバース・プロキシはアプリケーション・サーバ等の上流のサーバが反応しないときに、古い内容であると分かっていながらキャッシュからレスポンスを返すことがあるからだ。

では、どうすればキャッシュされなくなるか？上に書いたキャッシュの条件に当てはまらなくなればいい。具体的には**レスポンス**ヘッダに`Cache-Control: private`でよい。
Kerasでのシンプルなニューラルネットワークモデリング

以下の記事は自身がやってるブログを日本語化したもの。最近、kerasを触ることが多いので復習がてら  

[ブログ](http://marubon-ds.blogspot.jp/)

#概略
ディープラーニングの波が押し寄せているので、kerasの入門として、シンプルなニューラルネットワークのモデルを作成する。  

#なぜkerasなのか
日頃、ニューラルネットワークモデルの作成にはtensorflowを用いている。tensorflowでの記述はフルスクラッチに比べればはるかに完結ではあるし、記述からネットワークの形もわかりやすい。とはいえそれでも変数やplaceholderの設定など、いちいち記述するのは少々めんどうではあるし、行列計算の基本知識が前提となっているのも気になる。（行列計算についてはニューラルネットワークを扱うならマストの知識としたいところであるが。）  
kerasを使用すると、より簡潔な記述でネットワークを書くことができると聞いたので、実際に試してみる。  

#使用コード

```keras_try.py
from sklearn import datasets
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.utils import np_utils
import numpy as np

# prepare for data
iris = datasets.load_iris()

features = iris.data
targets = np_utils.to_categorical(iris.target)

# check data
print("explain variables\n{}".format(features[:10]))
print("explained variables\n{}".format(targets[:10]))

# split data into train and test
x_train, x_test, y_train, y_test = train_test_split(features, targets, train_size=0.7)

# set model
model = Sequential()
model.add(Dense(8, input_dim=4))
model.add(Activation('relu'))
model.add(Dense(3, input_dim=8))
model.add(Activation('softmax'))
model.compile(optimizer='SGD', loss='categorical_crossentropy', metrics=['accuracy'])

# train
model.fit(x_train, y_train, nb_epoch=50, batch_size=4)

# predict the labels of test data
pred = model.predict_proba(x_test)
pred_list = pd.Series([np.argmax(value) for value in pred])
true_list = pd.Series([np.argmax(value) for value in y_test])
print(pd.DataFrame({'predict': pred_list,
				   'True_category': true_list}))
```

#ポイント
###データ
今回使用したのはフィッシャーのirisデータ。モデルの目的は四つの説明変数から、被説明変数（カテゴリカル）を予測すること。  

```python
# prepare for data
iris = datasets.load_iris()

features = iris.data
targets = np_utils.to_categorical(iris.target)
```

sklearnは頻繁に使用されるフリーのデータセットを有しており、irisもそのうちの一つ。'np_utils.to_categorical()'は被説明変数をホットエンコーディングする（ダミー化する）。  

###モデリング

この部分で実際にモデルの記述を行う。  

```python
# set model
model = Sequential()
model.add(Dense(8, input_dim=4))
model.add(Activation('relu'))
model.add(Dense(3, input_dim=8))
model.add(Activation('softmax'))
model.compile(optimizer='SGD', loss='categorical_crossentropy', metrics=['accuracy'])
```

　Sequential()によって作成されたオブジェクトがadd()メソッドによってレイヤーを加えていく。活性化関数の指定もレイヤーの追加のように記述することができる。（引数として指定することも可能）  
Dense()の部分では引数に与える数字でそのレイヤーが持つノードの数を設定できる。最初のレイヤーではインプットとして受けるノードの数を指定する。  
Activationの部分では、重みと入力ノードの線形結合された値を適応させる活性化関数を指定している。  
まとめると、上記のモデルは以下の内容となる。  
* 入力層は四つのノードを持つ（データは四つの説明変数を有している）
* 隠れ層の数は一つで、ノード数は8
* 隠れ層のそれぞれのノードは入力層のノードの重みとの線形結合された値を受け取り、活性化関数を適応させる
* 出力層は3つのノードを持つ（分類先のユニーク値の数に対応）
* 出力層のそれぞれのノードは入力層のノードの重みとの線形結合された値を受け取り、活性化関数を適応させる

#まとめ
kerasを用いるとニューラルネットワークのコードは相当短く書ける。  
変数やplaceholderの面倒な設定を行わなくて良いのも楽で良い。
ubuntu 21.10 に mecab をインストール

```|bash
sudo apt install mecab
sudo apt install libmecab-dev
sudo apt install mecab-ipadic-utf8
```

この段階で動作確認

```text
$ mecab
特急はくたか
特急    名詞,一般,*,*,*,*,特急,トッキュウ,トッキュー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
く      動詞,自立,*,*,カ変・クル,体言接続特殊２,くる,ク,ク
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
か      助詞,副助詞／並立助詞／終助詞,*,*,*,*,か,カ,カ
EOS
```

neologd をインストール

```bash
git clone https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
sudo bin/install-mecab-ipadic-neologd
```

/etc/mecabrc を編集する

```text
dicdir = /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd
```

この段階で動作確認

```text
$ mecab
特急はくたか
特急    名詞,一般,*,*,*,*,特急,トッキュウ,トッキュー
はくたか        名詞,固有名詞,一般,*,*,*,はくたか,ハクタカ,ハクタカ
EOS
```

python3 で使えるようにする

```bash
sudo apt install swig
sudo apt install python3-pip
sudo pip3 install mecab-python3
```

サンプルのプログラム

```py3:mecab_sample.py
#! /usr/bin/python3
# -*- coding: utf-8 -*-
#
#	mecab_sample.py
#
#						Jun/02/2018
#
# ----------------------------------------------------------------------
import sys
import MeCab
#
mt = MeCab.Tagger("mecabrc")
str_in="特急はくたかで富山に向かいます。それから、金沢に行って、兼六園に行きます。"
res = mt.parseToNode(str_in)

while res:
#    print (res.surface)
    arr = res.feature.split(",")
    if (arr[1] == "固有名詞"):
        print(res.feature)
        print(arr[6])
    res = res.next
#
# ----------------------------------------------------------------------
```

実行結果

```text
$ ./mecab_sample.py 
名詞,固有名詞,一般,*,*,*,はくたか,ハクタカ,ハクタカ
はくたか
名詞,固有名詞,地域,一般,*,*,富山,トヤマ,トヤマ
富山
名詞,固有名詞,地域,一般,*,*,金沢,カナザワ,カナザワ
金沢
名詞,固有名詞,地域,一般,*,*,兼六園,ケンロクエン,ケンロクエン
兼六園
```

次の環境で確認しました。

```text
$ uname -a
Linux iwata 5.13.0-21-generic #21-Ubuntu SMP Tue Oct 19 08:59:28 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/os-release 
PRETTY_NAME="Ubuntu 21.10"
NAME="Ubuntu"
VERSION_ID="21.10"
VERSION="21.10 (Impish Indri)"
VERSION_CODENAME=impish
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=impish
```

次のエラーが出た場合

```text
------------------- ERROR DETAILS ------------------------
arguments: mecabrc
[ifs] no such file or directory: /usr/local/etc/mecabrc
----------------------------------------------------------
```

/usr/local/etc/mecabrc を作成します。

```text:/usr/local/etc/mecabrc
dicdir = /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd
```
Dockerのインストールディレクトリを指定する(Ubuntu16.04LTS)

現時点でのUbuntuでのベストソリューション。
CentOSなど別ディストリビューションではまた違う設定が必要そうなのでご注意を。


1./etc/docker/daemon.jsonを以下内容で作成してディレクトリを指定
 ※おそらく他の起動時オプションもここに設定すればOK

`
{
"graph": "/path/to/docker"
}
`

2.サービス再起動
`
sudo service docker restart
`

参考
https://forums.docker.com/t/how-do-i-change-the-docker-image-installation-directory/1169/21
[小ネタ]javascriptのclass constructorの戻り値はオブジェクトのとき上書きできる。

``` index.js
class Test{
    constructor(){
        this.a = 12;
        return {
            a: 5
        };
    }
}
class Test2{
    constructor(){
        this.a = 12;
        return true;
    }
}
const test = new Test();
console.log(test.a); // 5

const test = new Test2();
console.log(test); // Test2 { a: 12 }
```

この挙動は[仕様](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/new#Description)ではある。
が、少なくとも直感的ではない。
ただしこの挙動はコンストラクタ関数の挙動と全く同じだったりするので、構文糖という意味では一貫性を持っている。
・・・個人的には何かしらのエラー発してほしかった。それだけ。
pip installをオフライン環境で行う方法


たまにやる必要が出てくるので、備忘録。
オンライン環境可でのpip installはシンプルに

```
pip install パッケージ名
```

で完了。

オフラインへのインストールの場合は、いったんオンライン環境で
```pip install --download ダウンロード先 --no-binary :all: パッケージ名```
もしくは
```pip download -d ダウンロード先 --no-binary :all: パッケージ名```

でファイルをダウンロード。
オフライン環境の適当なディレクトリにコピーして、そこに移動。
pip installを行うという流れ。


##やってみる

今回はテストとして[openpyxl](https://openpyxl.readthedocs.io/en/default/)で行ってみる。
カレントディレクトリ以下にsrcフォルダを作成して

```pip install --download src --no-binary :all: openpyxl```
で、ダウンロードすると

```
DEPRECATION: pip install --download has been deprecated and will be removed in the future. Pip now has a download command that should be used instead.
Collecting openpyxl
  Using cached openpyxl-2.4.8.tar.gz
  Saved ./src/openpyxl-2.4.8.tar.gz
Collecting jdcal (from openpyxl)
  Using cached jdcal-1.3.tar.gz
  Saved ./src/jdcal-1.3.tar.gz
Collecting et_xmlfile (from openpyxl)
  Using cached et_xmlfile-1.0.1.tar.gz
  Saved ./src/et_xmlfile-1.0.1.tar.gz
Successfully downloaded openpyxl jdcal et-xmlfile
```

ダウンロードは成功するが
DEPRECATION: pip install --download has been deprecated and will be removed in the future. Pip now has a download command that should be used instead.
というメッセージ。
--downloadオプションは廃止される予定なので、downloadコマンド使ってね。ということなので、使えるか試してみる

```
pip download -d src --no-binary :all: openpyxl
```
で実行。ちなみに、カレントディレクトリ/srcはDL先としてデフォルトで設定されているので、指定しなくてもOK。他のフォルダ名になっている場合は指定が必要

```
Collecting src
  Using cached src-0.0.7.zip
  Saved ./src-0.0.7.zip
Collecting openpyxl
  Using cached openpyxl-2.4.8.tar.gz
  Saved ./openpyxl-2.4.8.tar.gz
Collecting jdcal (from openpyxl)
  Using cached jdcal-1.3.tar.gz
  Saved ./jdcal-1.3.tar.gz
Collecting et_xmlfile (from openpyxl)
  Using cached et_xmlfile-1.0.1.tar.gz
  Saved ./et_xmlfile-1.0.1.tar.gz
Successfully downloaded src openpyxl jdcal et-xmlfile
```

成功。

```
et_xmlfile-1.0.1.tar.gz
jdcal-1.3.tar.gz
openpyxl-2.4.8.tar.gz
```
の３つがDLできました。
これを、オフライン環境下の適当なフォルダにコピーして、そのディレクトリに移動。最後に、それぞれpip installを実行すればOK

```
pip intall et_xmlfile-1.0.1.tar.gz
pip intall jdcal-1.3.tar.gz
pip intall openpyxl-2.4.8.tar.gz
```

他のオプションは[ここ](https://pip.pypa.io/en/stable/reference/pip_download/#)に色々載っていますね。
backlog API を使う③　～backlogプロジェクトユーザー一覧の取得～

#1、環境
php4.5
windows7

#2、「プロジェクトユーザー一覧の取得」apiを使用する為に必要な情報

**公式サイト**
https://developer.nulab-inc.com/ja/docs/backlog/api/2/get-project-user-list/

**メソッド**

```ruby:
GET
```

**URL**

```ruby:
/api/v2/projects/:projectIdOrKey/users 
```


プロジェクトユーザー一覧を取得する為に必要な情報は、以下となります。

| パラメーター名     |   内容 |
|:-----------------|:------------------|
| apiKey|APIキー（[backlog API を使う①](http://qiita.com/d2cdot-mmori/items/56c6abc1526fc2b13aef)参照）|
| projectIdOrKey  |プロジェクトのID または プロジェクトキー |


#4、コード
```ruby:例
<?php
/*************************************
* バックログのプロジェクトユーザー一覧を取得する
**************************************/
$backlog_api_key = "作成したAPIキー";
$projectIdOrKey = "プロジェクトid";

$userlist_url = "https://decomarket.backlog.jp/api/v2/projects/".$projectIdOrKey."/users?apiKey=".$backlog_api_key;

$userlist_headers = array('Content-Type: application/x-www-form-urlencoded');
$context = array('http' => array(
  'method' => 'GET',
  'header' => $userlist_headers,
  'ignore_errors' => true
));
$response = file_get_contents($userlist_url, false, stream_context_create($context));
$array = json_decode($response, true);
```

#5、レスポンス例
```ruby:成功時レスポンス例
[
  {
    "id": 107376xxxx,
    "userId": null,
    "name": "ユーザー名",
    "roleType": 1,
    "lang": null,
    "mailAddress": "xxxxxxxx@xxxxx.co.jp",
    "nulabAccount": null
  },
  {
    "id": 107376xxxx,
    "userId": null,
    "name": "ユーザー名",
    "roleType": 1,
    "lang": null,
    "mailAddress": "xxxxxxxx@xxxxx.co.jp",
    "nulabAccount": null
  },
  {
    "id": 107378xxxx,
    "userId": null,
    "name": "ユーザー名",
    "roleType": 1,
    "lang": null,
    "mailAddress": "xxxxxxxx@xxxxx.co.jp",
    "nulabAccount": {
      "nulabId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "name": "xxxxxxxx",
      "uniqueId": "xxxxxxxx"
    }
  },
  {
  ...
  }
]
```

```ruby:失敗時レスポンス例
{
  "errors": [
    {
      "message": "No such project. (key:xxxx)",
      "code": 6,
      "moreInfo": ""
    }
  ]
}
```
これでユーザーの一覧が取得できました。
次回は指定したユーザにコメントの通知を行ってみたいと思います。

以上です。
[Rails5] 既に存在するモデルに外部キーを追加しフォームで編集できるようにする

#やりたいこと
Rails5.1.1

- ArticleモデルとCategoryモデルが既にある状態で、ArticleにCategoryをbelongs_toで紐付けたい。
- ArticleモデルのフォームでCategoryを選択できるようにしたい

#ArticleにCategoryへの外部キーを追加
###Articleモデルに外部キーカラムを追加
`category:references`と指定することで、自動的に`category_id`カラムを追加してくれる。
category_id:referencesとやってしまうと、category_id_idというカラム名になってしまうので注意。

```shell-session:
$ rails g migration add_category_to_article category:references
```


###migration実行
```shell-session:
$ rails db:migrate
```

###一対多の関係を追記
複数のArticleでひとつのCategoryを使うので、こう。

```rb:app/model/article.rb
class Article < ApplicationRecord
  belongs_to :category
end
```
```rb:app/model/category.rb
class Category < ApplicationRecord
  has_many :articles
end
```

###seeds.rbを使う場合
Articleを先に生成してしまうと、category_idがないよっていうエラーになるので注意。

```rb:db/seeds.rb
Category.create!(content: content)
Article.create!(title: title, category_id: 1)
```
```shell-session:
$ rails db:migrate:reset
$ rails db:seed
```


#フォームで編集できるようにする
※編集の場合
コントローラーは、普通に取得でOK

```rb:app/controllers/articles_controller.rb
def edit
  @article = Article.find(params[:id])
end
```

View側は今回セレクトボックスを使う引数は、
`articleに追加したcategory_id`、`フォームに表示したい要素群`、`valueの値`、`フォームに表示される文章`、`オプション`

```erb:app/views/form.html.erb
<%= f.collection_select(:category_id, Category.all, :id, :content, :prompt => true) %>
```
今回のオプション`:promt => true`は、未選択時「Please select」を出すもの。newアクションでもこのまま使える


#注意点

strong parametersにcategory_id追加を忘れないこと

```rb:app/controllers/articles_controller.rb
def article_params
  params.require(:article).permit(:title, :category_id)
end
```
[C/C++] 二つの変数を交換。

#C語の基本
##交換

二つの変数を交換する

```c:koukan.c

#include <stdio.h>
int main(void){

int nInput = 10;
int nResult = 20;
// init 必要。
int nTemp = 0;

nTemp = nInput;
nInput = nResult;
nResult = nTemp;

printf("%d, %d\n", nInput, nResult);

return 0;
}

```



##重要な部分

```c:koukan.c

nTemp = nInput;
nInput = nResult;
nResult = nTemp;

```

## Function
一般関数。

```c

void swap(int a, int b) {
	int temp = a;
	a = b;
	b = temp;
}
```

Pointer使う関数。

```c

void swap_p(int *pa, int *pb) {
	int temp = *pa;
	*pa = *pb;
	*pb = temp;
}


```

他のよい方法あればコメントお願いします。
DB2DBA: 無料のDB2 Developer Community Editionで個人用検証環境を作ろう

無料で利用できるDB2としてDB2 Express-Cと90日間限定の評価版が以前から提供されていましたが、2017年6月より新たにDB2 Developer Community Editionというエディションが登場しました。

# 背景
これまでの2つの無料エディションにはいくつかの制約が設けられていますが、それらのうち特に重要な制約は以下となります。

- DB2 Express-C
    - 大規模DB、エンタープライズ向けの機能が利用できない
        - pureScaleやBLUはともかく、オンライン再編やテーブル区分化すら制限されている

- 評価版
    - 利用期間が制限されている


そのため、開発者が大規模DB向けの機能をいつでも気軽に検証するということが難しい状況でした。開発者がほぼ全機能を利用可能なエディションとしてDeveloper Editionが有償で提供されていますが、ライセンス料はかなり高額です（本記事執筆時点で一年あたり$2,270以上）。

Oracleであれば、OTNライセンスで無料で全機能を利用できる状況をうらやましく思っていたものでした。

# Developer Community Editionの特徴
DB2 11.1のDeveloper Community Editionには以下の制約があるものの、Developer Editionと同様DB2のほぼ全機能を利用することが出来るようです。

- プロダクション環境での利用禁止[^1]
- CPUの4コア制限
- インスタンスメモリの16GB制限
- DBサイズの100GB制限
- サポートが受けられない
- レプリケーション関連機能とフェデレーションに関して一部制約あり[^2]

つまり、個人の開発環境や自宅でpureScaleやBLUの機能を試してみることも可能になるということです！夢が広がりますね。

DBの100GB制限はやや厳しい制約ですが、プロダクション環境での利用を防止するためにしょうがなかったというところでしょうか。なお、Express-CではDBサイズの上限が15TBであり、プロダクション環境での利用も可能です。

Developer Community Editionは以下のコンポーネントをバンドルしたプロダクトとなっていますが、DB2 Developer-Cのみのインストーラも提供されています。

- DB2 Developer-C
- Data Server Manager
- Data Studio Client


# 入手方法
以下のページのリンクよりダウンロード可能です。ダウンロードにはIBM IDが必要となります。

- [IBM Db2 downloads and trial]
(https://www.ibm.com/analytics/us/en/technology/db2/db2-trials.html)

利用可能なプラットフォームとして、最近のExpress-Cではサポート対象外となっていたMac OSも追加されています。

# インストール
Developer Community EditionのインストールにはDockerが必要となります。また、Windows 10ではHyper-Vも必要です。詳しくはインストーラのダウンロードページにあるIBM Db2 Developer Community Edition Get Started Guideを参照してください。

Developer-Cのみであれば、DockerなしでExpress-Cと同じようにインストールできます。

MacとWinでのインストールを書いてくれている方がいました。
## Mac
- [Db2 Developer Community Editionを "数クリック" で 導入してみた (1)](http://qiita.com/kirinchan/items/0ecd2ebf8f82c938e4b3)
- [Db2 Developer Community Editionを "数クリック" で 導入してみた (2)](http://qiita.com/kirinchan/items/5d0217c66af3c131e6b9)

## Win
- [Db2を数クリックでWindows 7に簡単インストール〜 Db2 Developer Community Edition](http://qiita.com/azzeten/items/ad8589b7b30f79df7125)


# 参考

- IBM Knowledge Center
    - DB2 11.1 for Linux, UNIX, and Windows
        - [Functionality in DB2 product editions and DB2 offerings](https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.licensing.doc/doc/r0053238.html)




[^1]: 正確な条件についてはライセンスを確認ください。

[^2]: 各エディションで利用可能な機能の差異に関する詳細な情報は、参考として記載しているKnowledge Centerのページにまとめられているのですが、本記事執筆時点ではDeveloper Community Edition/Developer-Cの記載はありませんでした。Developer Community Editionのライセンスには特に機能の制限に関する記載は書かれていませんでしたが、Developer-C個別のライセンスを確認したところ、これらの機能の利用に一部制約が設けられていることが記載されています。
ngrokの使い方（windows, mac）

## 概要
ngrokとは、localhostで動いているサーバーを、LANの外からアクセスできるようにできるツールです。
vagrantなどのローカル環境を一時的に外部に公開できるため、webhookなどの受信が必要なシステムでも、ローカルで動かすことが可能となります。

windows, mac両環境でのインストール手順です。


## 環境
- macOS Sierra 10.12.3 / Windows 7, 10
- ngrok 2.2.4
- Vagrant 1.9.0

## インストール
### windowsの場合
- ここからwindows版ダウンロード  
  - https://ngrok.com/
- ダウンロードしたngrok.zipを任意のフォルダに解凍

### macの場合
ホストOSで以下を実行してインストールする。

- ここでmac版のダウンロードURLを調べて、CURLでダウンロード  
  - https://ngrok.com/

```
[HostOS]$ curl -O https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-darwin-amd64.zip
[HostOS]$ unzip ngrok-stable-darwin-amd64.zip
```

## Vagrantfileを編集
ホストOSに対する8888ポートへのアクセスを、ゲストOSの80ポートに転送する。

Vagrantfile

```rb:Vagrantfile
config.vm.network :forwarded_port, host: 8888, guest: 80
```

Vagrantfile再起動

```
[HostOS]$ vagrant reload
```

## ngrokを起動
ngrokをダウンロードしたディレクトリに移動して、下記コマンドで起動。
windowsの場合はコマンドプロンプトなどで、macの場合はterminalなどで実行。

### windowsの場合

```
[HostOS]$ ngrok http 8888
```

### macの場合

```
[HostOS]$ ./ngrok http 8888
```


```
EXAMPLES:
    ngrok http 80                    # secure public URL for port 80 web server
ngrok by @inconshreveable                                                                                                                                           (Ctrl+C to quit)

Session Status                online
Version                       2.2.4
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://xxxxxxxx.ngrok.io -> localhost:8888
Forwarding                    https://xxxxxxxx.ngrok.io -> localhost:8888

Connections                   ttl     opn     rt1     rt5     p50     p90
                              6       0       0.05    0.02    23.33   25.98
```

これで、ブラウザからhttp://xxxxxxxx.ngrok.io へアクセスすると、vagrantの80番ポートにアクセスが可能となります。
また、ngrokのアドレスは、起動するたびに変わります。


以上
Bash on Ubuntu on Windows で MySQL のインストールに失敗した時のメモ

# 手順

```bash
##### インストール #####
sudo dpkg -i mysql-apt-config_0.8.6-1_all.deb
# MySQL Server と mysql-5.7 を選択
sudo apt update && upgrade
sudo apt install mysql-server
# root password 入力
```
```bash
##### エラー発生 #####
mysql -u root -p
Enter password:****
ERROR 2002 (HY000): Can't connect to local
MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

##### 対処手順 #####
cd /var/run/
sudo mkdir mysqld
sudo touch mysqld.sock

##### エラー #####
mysql -u root -p
Enter password:****
ERROR 2002 (HY000): Can't connect to local
MySQL server through socket '/var/run/mysqld/mysqld.sock' (13)
```

- 参考
[MySQLでmysqld.sockまわりでエラーがでた場合の対処法 - 海の響きを懐かしむ](http://mitsuba.hateblo.jp/entry/20110226/1298732743)
NYSOL(竹コマンド)が動かない場合の対処法

# mitemset.rb実行時にmcsvin.so (LoadError)が出たら注意
```shell-session
/home/hoge/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require': libruby-1.9.1.so.1.9: cannot open shared object file: No such file or directory - /home/hoge/lib/ruby/gems/2.4.0/gems/nysol-2.0.2-x86_64-linux/lib/nysol/mcsvin.so (LoadError)
	from /home/hoge/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /home/hoge/lib/ruby/gems/2.4.0/gems/nysol-2.0.2-x86_64-linux/lib/nysol/margs.rb:24:in `<module:MCMD>'
	from /home/hoge/lib/ruby/gems/2.4.0/gems/nysol-2.0.2-x86_64-linux/lib/nysol/margs.rb:21:in `<top (required)>'
	from /home/hoge/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /home/hoge/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /home/hoge/lib/ruby/gems/2.4.0/gems/nysol-2.0.2-x86_64-linux/lib/nysol/mcmd.rb:31:in `<top (required)>'
	from /home/hoge/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:133:in `require'
	from /home/hoge/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:133:in `rescue in require'
	from /home/hoge/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:40:in `require'
	from /home/hoge/lib/ruby/gems/2.4.0/gems/nysol-take-2.0.2-x86_64-linux/lib/nysol/traDB.rb:5:in `<top (required)>'
	from /home/hoge/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /home/hoge/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /home/hoge/lib/ruby/gems/2.4.0/gems/nysol-take-2.0.2-x86_64-linux/bin/mitemset.rb:6:in `<top (required)>'
	from /home/hoge/bin/mitemset.rb:23:in `load'
	from /home/hoge/bin/mitemset.rb:23:in `<main>'
```
# 原因
c++boostのバージョンが高すぎることです。
バージョン1.6.Xで幾つかのboostのライブラリでUblasの使用をやめています。
ところが、mcsvin.soで、Ublasを使用していることから、ロードエラーが発生しています。
※ソースをビルドする場合はビルドがコケます。

# 解決方法
1. boostのバージョンを落とす。  
   自分の環境では1.5.9まで動作確認しました。  
2. 対応されるまで竹コマンドは使わない。  
   MCMD群ではこの問題が発生していないので、竹コマンドだけの問題と思われます。  
   記憶にとどめるだけでもいいのかも。

ubuntu17ではlibboost-devのバージョンが1.62になっており、注意が必要です。
Xcodeでcocopad使い方

#CocoaPods設置
```:
$ sudo gem install cocoapods
$ pod setup
```

#テストプロジェクト生成
![スクリーンショット 2017-06-21 10.17.47.png](https://qiita-image-store.s3.amazonaws.com/0/108475/994992d9-c135-ea3f-3deb-42414fea06f4.png)

##cocopodsのinit実行
![スクリーンショット 2017-06-21 10.18.45.png](https://qiita-image-store.s3.amazonaws.com/0/108475/470e8d65-5c18-1e95-9820-5cb9cc20c452.png)

#ライブラリ検索及び設置
以下のサイトから必要なライブラリを検索
https://cocoapods.org
Alamofireを設置してみる。
＃＃Alamofireで検索
![スクリーンショット 2017-06-21 10.19.56.png](https://qiita-image-store.s3.amazonaws.com/0/108475/f7205cf4-2728-42ca-f6ee-ae3ed087ea99.png)

##podfile編集 
![スクリーンショット 2017-06-21 10.20.33.png](https://qiita-image-store.s3.amazonaws.com/0/108475/cd82f68f-ba15-3f6f-f630-a4496ee931c9.png)![スクリーンショット 2017-06-21 10.21.52.png](https://qiita-image-store.s3.amazonaws.com/0/108475/363c628b-eb9d-8060-ac37-fb29bef77db0.png)

##ライブラリ設置
![スクリーンショット 2017-06-21 10.22.35.png](https://qiita-image-store.s3.amazonaws.com/0/108475/47778f9e-db2c-afe5-0598-28e45b989112.png)

##「test.xcworkspace」でXcode実行
![スクリーンショット 2017-06-21 10.23.00.png](https://qiita-image-store.s3.amazonaws.com/0/108475/76f6d11f-a4e9-932b-c716-01213ccf4373.png)

##import追加
```ruby:qiita.rb
import Alamofire　　　　　//非同期
import Alamofire_Synchronous　　　//同期
```
Rubyのイディオム(||=)を紐解く

上級エンジニアの書く、クールなコードを紐解いてみた。


1行で済んでおるぞなんだこれは

```rb:
a ||= b || c
```

つまり

```rb:
if a
  a
else
  a = b || c
end
```

つまり

```rb:
if a
  a
else
  if b
    a = b
  else
    a = c
  end
end
```

ってこと！！

以下の式を日本語で解説すると、“aがnilまたはfalseの場合は、bを代入する”となる。
 
```rb:
a ||= b
```
【Android】Android StudioでTwitter4jを使う

# AndroidでTwitterを使う
AndroidでTwitterと連携する際のTwitterApiの環境構築の話

## ながながと導入を書いたけど
<pre>

dependencies {
    compile 'org.twitter4j:twitter4j-core:4.0.2'
}
</pre>
Twitter4jをつかうにはdependencyに追加することで使える
コーディング中、typoが多いのでAlfredの力を借りた話

コーディング中、新しい変数・関数を作る際に度々typoします。
ググってスペルチェックしている時間も無いので、Alfred Workflowsを活用して、
typoを減らしてきました。

## Workflowsの設定は簡単
dictionary Filter + Copy to Clipboard を組み合わせるだけ。
![スクリーンショット 2017-06-23 9.54.42.jpg](https://qiita-image-store.s3.amazonaws.com/0/110482/a28712cd-4903-6c5b-d887-f6889795fa5f.jpeg)

## 利用イメージ
こんな感じ。
自分の意図した単語を選択して、クリップボードにコピー。
![名称未設定.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/110482/1a80b9db-4548-1e03-1a76-aaaaff386b72.gif)
Unityのandroid実機ビルドでのエラー対応方法[Failed to re-package resources ~]

## 症状
[バージョン情報]
Unity:5.6.1f1 presonal
android studio:2.3.3

Unityでandroid実機確認をしようとしたところ下記のようにエラーが発生。

![スクリーンショット 2017-06-23 09.15.38.png](https://qiita-image-store.s3.amazonaws.com/0/107119/8f490fe0-e3a3-0acf-bee5-14c45827a4c0.png)

正直何を言っているか分からないのですが、下記記事を参考にして対処しました。
微妙にバージョンが変わっているので2017年6月22日時点の画面と対処方法を記載します。

参考記事
http://qiita.com/tamalign/items/ef61fd912f58511902af

## 対処方法

android studioを開き、
下記の画面でconfigure->SDK Manager

![スクリーンショット 2017-06-23 09.21.57.png](https://qiita-image-store.s3.amazonaws.com/0/107119/552e5527-a6a3-a22f-37d3-3e316a1179bf.png)

SDK Toolタブの右下の[Show Package Detail]にチェックを入れるとAndroid SDK Build-Tools 26の項目に細かいバージョンが出るので最新のものにチェックを外して、一つ前にチェックしてOKボタンを押します。

![スクリーンショット 2017-06-23 09.22.43.png](https://qiita-image-store.s3.amazonaws.com/0/107119/8b22b4b3-0dda-7a0e-f4f7-51a95255063b.png)

## 最後に

この手のエラーはきついですね。
SDKにUnityがついていけてないときに起こるものなのかと思っていますが
情報共有で乗り切りたいところです。
Goutteを利用したスクレイピング　メモ

##goutteを利用してwebスクレイピングをしてみた

goutte初心者なので、動作確認的なphpスクリプトを作成した。
最初のフォームを取得して、その後、ログインして取得したHTMLを画面に表示させます。URLはダミーです。

#スクレイプするhtml

```
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>管理ログイン「管理者用」</title>
</head>
<body>
<center>
ログイン認証
<table border="0" cellpadding="2" cellspacing="1" bgcolor="#FF6600" class="f12m">
<form method="post" action="auth.php">
  <tr>
    <td align="center" bgcolor="#FFFFFF">PASS</td>
    <td align="left" bgcolor="#FFFFFF"><input name="login_pass" type="text" value="" size="28"></td>
  </tr>
  <tr>
    <td colspan="2" align="center" bgcolor="#FFFFFF">
	  <input type="submit" value="ログイン">	</td>
    </tr>
<input name="login_id" type="hidden" value="admin_pass">
</form>
</table>
</center>
</body>
</html>
```


#スクレイプコード(php)

```
<?php
require_once 'goutte.phar';

use Goutte\Client;

// 1Goutteオブジェクトの生成
$client = new Client();

// UserAgentを"MyCrawler 1.0"に設定
$client->setHeader('User-Agent', 'MyCrawler 1.0');
// 
//テストURL管理画面（ＰＣ）

$jump_url = "http://test.com/p/admin/auth.php"; 
//echo "JUMP URL -> ".$jump_url."<br>";
$crawler = $client->request('GET',  $jump_url);
echo "URL GET STATUS=" . $client->getResponse()->getStatus();
echo $crawler->html();
// 最初のフォームを選択する　
$loginform = $crawler->filter('form')->form();
//ログインIDとパスワードを入力します
$loginform['login_id'] = 'xxxx';
$loginform['login_pass'] = 'xxxxx';
//ログインフォームにログイン
$crawler = $client->submit($loginform);
//echo "URL GET STATUS=" . $crawler->getValues();
echo $crawler->html();
//ログイン後のタイトル表示
echo $crawler->filter('title')->text();
// 「ここをクリック」をクリックしてリンク先に遷移
$client->click($crawler->selectLink('TOP')->link());

?>
```
お手軽簡単PHPで設定ファイルローダを作ってみた

# はじめに

- [前回](http://qiita.com/neriai/items/ba6e3126c33132907080)に続いて、勢いで設定ファイルローダを作ってみました。

# ソースコード

```php
<?php

namespace XXXX;
  
/**
 * コンフィグの基底クラスです
 */
class Config
{
 
    /**
     * @var string $directory 対象のディレクトリ
     */
    protected static $directory;
 
    /**
     * 対象のディレクトリを設定します
     *
     * @param string $directory ディレクトリ
     */
    public static function setConfigDirectory($directory)
    {
        self::$directory = $directory;
    }
 
    /**
     * 対象のディレクトリを返却します
     *
     * @return string ディレクトリ
     */
    public static function getConfigDirectory()
    {
        return rtrim(self::$directory, '/\\');
    }
 
    /**
     * 設定ファイル情報を返却します
     *
     * @param string $route ファイルルート
     * @return array $config[$key] 設定情報
     */
    public static function get($route)
    {
        $values = preg_split('/\./', $route, -1, PREG_SPLIT_NO_EMPTY);
　
        $key = array_pop($values);
        $file = array_pop($values) . '.php';
　
        $path = self::getConfigDirectory() . DIRECTORY_SEPARATOR . $file;
　
        $config = include($path);
 
        return $config[$key];
    }
}
```

# 使い方

## 設定ファイルの読み込み
```php
Config::setConfigDirectory(ROOT_DIR . '/config');
```

## 設定ファイルの取得

```php:app.php
return array(
    'search_url' => array(
        'pc' => 'http://hogehoge.com/',
        'sp' => 'http://mobile.hogehoge.com/'
    ),
);
```

```php
Config::get('app.search_url');
```


# 全ページリンク
- [お手軽簡単PHPでクラスオートローダを作ってみた](http://qiita.com/neriai/items/ba6e3126c33132907080)
- [お手軽簡単PHPで設定ファイルローダを作ってみた](http://qiita.com/neriai/items/1614e3c41def7bfa72cf)
- [お手軽簡単PHPでロガーを作ってみた](http://qiita.com/neriai/items/24a63bd66fd3563cacf7)
- [お手軽簡単PHPでバッチ用フレームワークを作ってみた](http://qiita.com/neriai/items/3fdc070f3b429e792a23)
AWS初心者が本を1冊やってみて学んだことメモ

AWSを使い始めて5日目。ググれどググれど大枠が見えないのでさっぱりわからない。
というわけで本を1冊ハンズオンでやってみました。
内容を忘れないようにメモしておきます。


# やった本

■[『Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版』 日経BP社](https://www.amazon.co.jp/dp/4822237443)

アプリ開発は勉強したけど、インフラはさっぱりわからない…そんな自分にぴったりでした。
インフラエンジニアの間では常識なのだろうな(TCP/IPとかHTTPメソッドとか)…ということも丁寧に繰り返し説明してくれています。


# 学んだこと

## IPアドレスとは
TCP/IP通信において、通信先を特定するのに使われるのがIPアドレス。ネットワーク上で互いに重複しない唯一無二の番号、いわゆる「住所」に相当する。

### パブリックIPアドレス
インターネットに接続する際に用いるIPアドレスのこと。グローバルIPアドレスとも言う。重複を避けるためICANNと言う団体が一括管理している。

### プライベートIPアドレス
インターネットで使われないIPアドレス。10.0.0.0 ~ 10.255.255.255など、範囲が決められている。誰にも申請することなく使える。社内LAN構築時や、自前でネットワークの実験をするときはこれを使う。

## ホスト
コンピュータやルーターなどのネットワーク機器など、IPアドレスをもつ通信機器の総称。


## VPC領域
VPC = Virtual Private Cloud
つまり、プライベートなネットワーク空間。
作成したユーザーが自由に扱うことができる空間で、他のユーザーからは全く見えない。
IPアドレスをCIDR表記する場合、その範囲は「CIDRブロック」と呼ばれる。
このCIDRブロックをさらに小さなCIDRブロックに細分化したものをサブネットと呼ぶ。

同書を元に作成した図。
![image](https://qiita-image-store.s3.amazonaws.com/0/176100/0f68f45b-0217-f4e0-bc22-1d10e88a5652.png)

パブリックサブネット：インターネットからアクセスできる
プライベートサブネット：インターネットからはアクセスできない
→セキュリティを高める時によく用いられるネットワーク構成


サブネットをインターネットに接続するには、「<b>インターネットゲートウェイ(Internet Gateway)</b>」を用いる。自分のネットワークにインターネット回線を引き込むイメージ。

### ルートテーブル
宛先IPアドレスの値がいくつのときに、どのネットワークに流すべきか、と言う設定。

「宛先アドレス」　「流すべきネットワークの入り口となるルーター」

という書式で設定。
宛先アドレス＝ディスティネーション(destination)
流すべきネットワーク先＝ネクストホップ(next hop)、ターゲット(target)


## TCP/IP
<b>ポート(Port)</b>：他のコンピュータと、データを送受信するためのデータの出入り口

ポートには、以下の2種類がある。
TCP(Transmission Control Protocol)：相手にデータが届いたことを保証する。
UDP(User Datagram Protocol)：確認せずに送信する(その代わりに高速)

## ファイアウォール
「通してよいデータだけを通して、それ以外を遮断する機能」の総称。
そのもっとも簡単な構造のものがパケットフィルタリング(Packet Filtering)。

### パケットフィルタリング
流れるパケットをみて、通過の可否を決める仕組み。パケットには、「IPアドレス」のほか「ポート番号」も含まれている。パケットフィルタリングは、「IPアドレス」と「ポート番号」など、パケットに付随する各種情報を見て、通過の可否を決める。
AWSでは、インスタンスに対して構成する「<b>セキュリティグループ</b>」がこの機能を担当する。

### インバウンドとアウトバウンド
インバウンド：外から、このインスタンスに接続する向き(例 誰かが接続しようとしているのを排除する)
アウトバウンド：このインスタンスから外に出て行く向き


## NAT
NAT=Network Address Translation
「プライベートサブネット→インターネット」の向きの通信だけを許可する。

例えば、DBサーバーはインターネットからは接続されたくない。しかし、サーバーのアップデートやソフトウェアのインストールのために、DBサーバーからインターネットへは接続できるようにしたい。そういうときは、DBサーバー(プライベートサブネット)→インターネットの一方向の通信のみを許可できる。



### curlコマンド
「HTTPやFTPで、ファイルをダウンロードしたりアップロードしたりするコマンド」。Amazon Linuxにはtelnetコマンドがインストールされていないため、代わりに<b>curlコマンド</b>を使う。
LSTMで夏目漱石ぽい文章の生成

# 概要

n 番煎じではあるが、なかなか面白い結果が得られたので共有。

[Deep Learningで遊ぶ(3): LSTM-RNNで夏目漱石っぽい文章の生成にトライしてみる](http://tjo.hatenablog.com/entry/2016/11/08/190000)

をなぞって実行してみただけである。深く感謝。

だた、上の記事だと漢字混じりの原文をそのまま処理しているのだが、文字種は少ないほうが学習が進みやすいのではないかと考えて、ここではぜんぶひらがなに変換した上で処理をしてみた。

# 環境
- Ubuntu 14.04
- GeForce GTX 1060 6GB
- Intel Core i7

# やったこと

[上の記事で共有してくれている夏目漱石のテキスト](https://github.com/ozt-ca/tjo.hatenablog.samples/blob/master/r_samples/public_lib/jp/souseki_all.txt)をダウンロード。`souseki_all.txt` という名前で保存。

```shell-session
$ cat souseki_all.txt | mecab -Oyomi | nkf -w --hiragana > souseki_all_hiragana.txt
```
とひらがな化。ただ、変換しきれない漢字やアルファベット等が混じっているので、ホワイトリストを作って、ひらがな・句読点・括弧・改行だけにする。

```python:preprocess.py
whitelist = "\n「」。、あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゐゆゑよらりるれろわをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽぁぃぅぇぉゃゅょっゎ"
whitelist = set(whitelist)
with open("souseki_all_hiragana.txt", "r") as f:
    for l in f:
        for c in l:
            if c in whitelist:
                print(c, end="")

```
結果を `souseki_all_hirgana2.txt` として保存。

あとは、[Keras の LSTM によるテキスト生成のサンプル](https://github.com/fchollet/keras/blob/master/examples/lstm_text_generation.py)をほぼそのまま使っただけである。

これらのコード、データおよび実行結果は、[Github](https://github.com/elm200/lstm_soseki/tree/master) に上げておいた。

# 実行結果

ランダムにピックアップされた
```
ええ、つまるところおかしいです」
「ははははじにいとにもはなしたかい」
「しけん
```
という本物のテキストの一部に続く文字を推測させると…

```
ええ、つまるところおかしいです」
「ははははじにいとにもはなしたかい」
「しけんさいのおんなのあたまをうごかさせるところで、それをおっとにいる。だいすけはおとこのきゅうしきたいとおもう。
「そうはないの」
「だっておもいだいにがいかんがいまでもある。たかぎにおかしいから、それがいつか、このあいだあいてにあることができないんです。それがとうぜんのかんたんなんだから、なにをかいしゃくしているんだから」
「そうだろう。それでごぜんをしているんです」
「いままでにいったいしょうめんからようでもあるんですか」
「なにもうごいていたが、このつうりです。いままでからおとこのちょうしであったから」
「いつものとおりだ」
「いくらいっているんだから」
「どうもよくわからない。なにでもあるまい」
「そうだろう」
「このするうちに、かれはこのあいにくいくらいらないものと、いちぶんかということがない。
「いんかいはかいかないのかね」
「いいえ、あなたのいるかわりまったくだけのおんなが、あなた
```
(Iteration 23 diversity 0.5)

うーん、漱石ぽいw 意味は不明だけど、文体はある程度似ているというのが面白い。

あともうひとつ。

```
うね」とあによめがゆった。
するとでんとうがまたぱっときえた。じぶんはきゅうにはらのうちでこうしょうしゃのうちにかんがえている。
「なにみったのだ」
「だって、そのつぎのまえに、あなたはしゃしんがかんがえているのだ」
なみに、なにかかったかれは、このしょうじょうを、こころもちでもないように、きょうこんにちのとくになっても、とおいないといういみは、ことばのふたりのまにかんがえるものは、そのしつへやへあるいている。
「そうですか」という。
「きみはいつまでもなんでもしません。わたしはよきしていたのです。そうでしょう」
「ふじおさん、どうしても、このそんなんかのまにはなしだした。それでもかんたんなひとのかおをして、かれのかんけいをだいじくしている。おんなはいちばんしょうせつかいのおっとのかおをみた。
「それでもよい」
「そうですか」というと、おのべはわざととうきょうへでた。
「ゆっくりもまだからかんがえないんですね」というと、きょうは、またいちめんまんじょうかんじょうのほう
```
(Iteration 36 diversity 0.5)

不思議なのは、会話の引用の括弧（「」）がちゃんと対になって現れていること。また閉じ括弧（」）の直後には必ず改行が来るのもきちんと学習できているのがすごい。

たぶん LSTM だけで意味のある自然言語の文章を生成するのは難しいのだろうけど、「直近現れた文字から次の文字を推測・生成する」というのは人間の脳の機能としてもあるのかもしれない。だから、「意味はわからないけど、それっぽい」という現象が起こるのではないだろうか・・・（まあ何の根拠もない推量ではあるが）。

# 参考

[mecabひらがな変換](https://gist.github.com/foo9/4ab9a1b98ac517c0d87c)
[KerasのLSTM model.predictを解読した話](http://qiita.com/Ginom/items/b3a4a6e8c2c534d3f350)
ReactNativeでpropTypesにstyleオブジェクトを指定する方法

ReactNative v４４以降では`ViewPropTypes.style`を使う

```js
import {ViewPropTypes} from 'react-native'

export default class MyClass extends Component {
  static propTypes = {
    style: ViewPropTypes.style
  }
}
```

これまでは `View.propTypes.style` が使えたがDeprecatedになった。
使うと下記の警告が表示される。

```
Warning: View.propTypes has been deprecated and will be removed in a future version of ReactNative. Use ViewPropTypes instead.
```

[関連リファレンス](https://facebook.github.io/react-native/releases/next/docs/viewproptypes.html#style)
windowsでTensorFlow その23

#概要
windowsでTensorFlowやってみた。
生tensorflowは、つらいので、1.2にして、Highlevel apiやってみた。
偶数分類やってみた。

#環境
windows 7 sp1 64bit
anaconda3
tensorflow1.2

#サンプルコード

バージョン確認

```
import tensorflow as tf

s = tf.constant('hello')
sess = tf.Session()

print (sess.run(s))
print (tf.VERSION)

print (s.eval(session = sess))
```


偶数分類

```
from sklearn import metrics, cross_validation
from tensorflow.contrib import learn
import numpy as np

def binary_encode(i):
	return np.array([i >> d & 1 for d in range(8)])

def even_odd_encode(i):
	if i % 2 == 0:
		return np.array([1])
	else:
		return np.array([0])

trX = np.array([binary_encode(i) for i in range(1, 256)])
trY = np.array([even_odd_encode(i) for i in range(1, 256)])
x_train, x_test, y_train, y_test = cross_validation.train_test_split(trX, trY, test_size = 0.2, random_state = 42)

classifier = learn.DNNClassifier(feature_columns = learn.infer_real_valued_columns_from_input(x_train), hidden_units = [10], n_classes = 2)
classifier.fit(x_train, y_train, steps = 100)
predictions = list(classifier.predict(x_test, as_iterable = True))
print ("Tests: {}\n".format(x_test))
print ("Predictions: {}\n".format(predictions))
score = metrics.accuracy_score(y_test, predictions)
print ('Accuracy: {0:f}'.format(score))
```
Cythonで使える配列バッファオブジェクト


Cython上で、PythonでもCでも使える配列バッファオブジェクトを使いたい。どうもCythonの`cython.view.array`なるものとCPythonの`array.array`なるものが存在するようだ。

# Cython array

``cython.view.array``を使う。

## 初期化

```python:cython
from cython.view cimport array # note that this is 'c'-import

arr = array(shape=(3,3,3), itemsize=sizeof(int), format='i')
```

Python floatの場合なら'd'でdoubleを使うことになるだろう。
メモリ内での配置として、numpyでのorderのように、cythonでは"mode"なるキーワードを使うことができる。

## C配列として取り出す(Memoryview)

対応するデータ型の配列に直接代入することで、Cの配列（あるいはポインタ）として扱うことができるようになる（実際にはarrayに対する「ビュー」がC配列に入ることになる）。

```python:cython
from cython.view cimport array

arr = array(shape=(3, 10), itemsize=sizeof(double), format='d')

cdef double[:,:] carr2d = arr  # 2D C-array view
cdef double[:]   carr1d = arr  # 1D C-array view
```

上のような明示的な代入だけでなく、関数の引数指定でも引き起こすことができる。

```python:cython
cpdef double process(double[:,:] view) nogil:
    ...

arr = array(shape=(3, 10), itemsize=sizeof(double), format='d')
process(arr)
```


# Python array

Pythonの文に```import array```が、Cythonの型情報として```from cpython cimport array```が必要。

[StackOverflow上のベンチマーク](https://stackoverflow.com/questions/18462785/what-is-the-recommended-way-of-allocating-memory-for-a-typed-memory-view)では「cython arrayよりも速い」とのことだが、実際どうなのかは知らない。

あと基本1次元配列しか扱えないようなので、Cython内で2次元アクセスしたい場合は面倒かもしれない。


## 初期化

今のところ、```numpy.empty()```っぽく動作させるには```clone()```を用いるしかなさげ。

```python:cython
from cpython cimport array as carray
import array

cdef carray.array template = array.array('d')
cdef carray.array buffer   = carray.clone(template, 1000, zero=False)
# このclone()関数は、cython側で定義してくれている
# 'zero'キーワードで、ゼロ初期化するかどうか指定
```

## C配列として取り出す

```data```メンバに```as_xxxs```あるいは```as_voidptr``なるフィールドが定義されており、これが配列/ポインタとして機能する。

```python:cython
from libc.stdio cimport printf

printf("%c", buffer.data.as_chars[0]) # 最初の要素を出力
```

このポインタへのアクセスは型チェックがないぶん危険だけれど、GILにとらわれないので速い。

いちおうmemoryview方式の代入もできる（けれど、GILが必要）。この場合、2次元以上のビューがつくれるのか不明。


# Python上で使いやすく変換する

## Python文字列への変換

byte型の1次元配列(ビュー)の場合、Python文字列に変換できる。

```python:cython
pystring = bytearr.tobytes().decode('utf8')
# エンコーディングは適切なものを指定
```


## NumPy ndarrayへの変換

```cython.view.array```も```array.array```もバッファオブジェクトとして使えるので、```numpy.asarray()```や```numpy.array()```で変換できる、らしい。


# まとめ

機能的にそこまで差があるわけではない。

+ 1次元になっても速さが欲しいなら```array.array```の方がよいだろう。
+ Cython内で多次元配列として使いたいなら```cython.view.array```の方がよいだろう。
WebGLアプリをFirebaseにアップして遊べるようにする

#環境
Unity5.6.2f1
Windows10

#概要
FirebaseHostingを使用してアップ、公開します。

#Firebaseコンソールにプロジェクトを追加
https://console.firebase.google.com/

・上記のurlにアクセス
・「プロジェクトの追加」を押し、プロジェクトを作成する
　・プロジェクト名と国を設定（例：TestWebGL, 日本）
　・testwebgl-42054となった

#Node.js、npm、firebase-toolsのインストール
http://nodejs.org/

・上記のurlにアクセス
・ボタンを押してダウンロード（例：v8.1.2Current）
・デフォルトの設定でインストール（そのまま）
・コマンドプロンプトを起動
　スタートメニュー>windowsシステムツールにある
・「npm install -g firebase-tools」とタイプし、リターン
　firebase-toolsがインストールされる

#Unityプロジェクトの作成
・Unityを起動し、プロジェクトを作成する（例：TestWebGL)
・「BuildSettings」でWebGLに「SwitchPlatform」する
・適当にシーンを１つ作り、保存（例：背景を赤くし、GUIのボタンを中央に配置）
・プロジェクトのフォルダをWindowsで開き、デプロイ（アップ）用のフォルダを作成する（例：firebase）

#Firebaseにログイン
・コマンドプロンプトを起動
・「firebase login」とタイプし、リターン
　ブラウザでアカウント選択後、認証確認メッセージが出るので、許可する
・別のアカウントでログインしたい場合は「firebase logout」してから再度ログインする

#デプロイ用フォルダの設定
・コマンドプロンプトを起動
・作成済みのデプロイ用のフォルダに移動する（例：firebase）
　cdコマンド（例：「cd C:\programs\unity\TestWebGL\firebase」）
・「firebase init」とタイプし、リターン
・「Are you ready to proceed? (Y/n)」はそのままリターン
・カーソルで「Hosting: Configure and deploy Firebase Hosting sites」に移動し、スペースキーを押す
　緑色の※印が付いた
・リターンを押す
・「Select a default Firebase project for this directory: (Use arrow keys)」と出るので作成済みのプロジェクトをカーソルで選択し、リターン（例：TestWebGL）
・「What do you want to use as your public directory? (public)」はそのままリターン
　publicになる
・「Configure as a single-page app (rewrite all urls to /index.html)? (y/N)」はそのままリターン
　Noになる

#WebGLのビルド
・Unityを起動し、プロジェクトを開く（例：TestWebGL)
・「BuildSettings」>「BuildAndRun」を押す
・作成済みのデプロイ用フォルダの中に出来ている「public」に移動し「フォルダ選択」を押す
　ビルドが終わるとブラウザで勝手にローカル起動する
　起動が確認出来たら閉じる

#Firebaseへデプロイする
・コマンドプロンプトを起動
・作成済みのデプロイ用のフォルダに移動する（例：firebase）
・「firebase deploy」とタイプし、リターン
　urlにアクセスし確認する（例：Hosting URL: https://testwebgl-42054.firebaseapp.com

#デプロイの確認
https://console.firebase.google.com/

・Firebaseコンソールから作成済みのプロジェクトへ移動する（例:TestWebGL）
・左側メニューから「Hosting」を選択し、ダッシュボードの「デプロイの履歴」を見る
ターミナルのvimでctrl + spaceの挙動を無効にする

使用環境
- Ubuntu 16.04 LTS
- byobu/tmux
- vim

私はasciiキーボードを将来使う予定なので、ctrl-space と ctrl-: で入力切り替えをしているんですが、ターミナル内のvimのinsert modeで ctrl-space入力すると入力した文字がペーストされたり、エラー（E20: No inserted text yet)が起こったりしたので、その解決法を書きます。

まずターミナルのvimではctrl + spaceでnullが入力されるらしく、その際に上に書いたような挙動になるようです。なのでinsert mode時にnullのmappingを無効にするために.vimrcに

`imap <Nul> <Nop>`

という行を追加すると解決しました。
splwow64が原因でマクロがメモリ不足で落ちたこと


かなりハマったので残しておきます。

#環境  
- OS：Windows 10 professional 64bit
- メモリ：16GB  
- ソフト：Excel 2010 ~~32bit~~ 64bitでした。。。


#現象
##やろうとしていたこと
Excelのマクロで「ファイルを開く→操作→保存→閉じる」をフォルダ配下のファイルに対してLoop実行

##起こったこと
ある程度実行するとWindowsのダイアログでメモリが不足しています、と表示されマクロが落ちる

#調査と対処
##対処その1：まず疑うは己の未熟さ
ということで、マクロでオブジェクトの開放をし忘れているんじゃないかと考え、使い終わったものは手当たりしだいに空にしていく
##結果その1
ハズレ。事象は変わらず。
##現象を再確認
メモリ不足とは、一体何が不足しているのか、タスクマネージャーから確認
→マクロ実行中にコミット済みメモリが際限なく増え続ける
##対処その2：外からメモリ解放させてみる
[Windows Server 2003 Resource Kit Tools](https://www.microsoft.com/en-us/download/details.aspx?id=17657)
とりあえずこれで試してみる。
##結果その2
効果なし
##対処その3：splwow64を終了してみる
[【Windows10 Creators】印刷時にコミット済みメモリが解放されずにどんどん増える。最終的にメモリ不足になり画面が真っ黒になる](https://social.msdn.microsoft.com/Forums/ja-JP/0f121eee-f8da-4deb-923d-6e931e016e6d/windows10-creators?forum=netfxgeneralja)
調べているとこんな記事にも遭遇。環境的には当たりだけど、印刷してない、けど印刷設定はいじってるな。。。とか思いつつ、タスクマネージャーからsplwow64を終了してみる。
##結果その3
コミット済み27GB→3GBまで減った。こいつが原因！

#根本対処
結論から言うとまだです。
使っているプリンタのドライバは削除しましたが、改善していません。
現状、ループをある程度に切って、都度プロセスを終了しています。
解決策を見つけたら追記します。& ご存知でしたらコメント下さい！

#2017/06/24追記
環境について思い違いがあってOfficeが64bitでした。64bitアプリケーションでsplwow64が呼ばれる事自体なんかおかしい気がしています。
対処としてはofficeを32bitにするか、最新版のOfficeにするかですね。
~~そもそも2010なんか使ってるんじゃないよって話で。~~
pyenvのインストール、使い方、pythonのバージョン切り替えできない時の対処法



最近pythonを利用する機会があって開発環境を整えようとしたのですが、バージョン管理の環境構築のためにpyenvを導入した時に相当手間取りました。ここではpyenvの導入の仕方と使い方の基礎、および個人的にぶつかったエラーへの対処を紹介しておきます。また、間違えている箇所は遠慮なくご指摘ください。

##利用した環境
利用した環境はOS:macOS Sierra(バージョン10.12.2)です。またvimを途中使用するところがあります。
シェル：bash

##pyenvとは
pythonのバージョンを簡単に切り替えることができるようにしてくれるツールです。２系列と３系列との切り替えに便利です。また、ディレクトリごとにpythonのバージョンを切り替えることができます。

##pyenvのインストール
ではまず、 pyenvをインストールしましょう。gitから持ってくる場合上のコマンドを、brewが使える場合は下のコマンドを利用してもできます。

```
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
$ brew install pyenv
```

##bash_profileの編集
次にpyenvのパスを通すためにbash_profileを編集します。

```bash
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
```
またはvimを使ってbash_profileに直書きしても構いません。

```
$ vim ~/.bash_profile
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```
最後にbash_profileの保存を適用します

```
$ source ~/.bash_profile
```
##pyenvでpythonをインストール
バージョン切り替えを体験するために２つほどバージョンが違うpythonをインストールしてましょう。インストールできるか確認をしたければ３つめのコマンドを利用すると一覧が確認できます。

```
$ pyenv install 2.7.10
$ pyenv install 3.5.0
$ pyenv install --list　 
```

##pyenvでバージョンを切り替えてみる
バージョンの切り替えをしてみます。localの場合は今いるディレクトリに、globalの場合は全体に反映されます。

```
$ pyenv local 2.7.10
$ pyenv global 3.5.0
```

ここできちんと変更が反映されているか確認するためpythonのバージョンを調べます。

```
$ python --version
Python 2.7.10
```
このように変更が反映されていれば問題ありません。
反映されていなければ下の記事をお試しください。

##pyenvでのpythonのバージョンがpython -vと違う時の対処法
例えばpyenvでバージョンを2.7.10に切り替えたはずなのに、pythonのバージョンを調べたら3.5.0だった...
なんてことがあるかもしれません。

```
$ pyenv versions
  system
* 2.7.10 
  3.5.0
$ python --version                                                                                             
Python 3.5.0
```
その場合、whichコマンドでパスを表示してみてください。

```
$ which python
/usr/bin
```
このようになっていたら、それはデフォルトでPCに入っているpythonを参照してきています。もしここでpyenvの方を参照するようにパスを変更したければ、以下のように編集してください。

```
$ vim /etc/paths
/usr/local/bin
/usr/bin
/bin
/usr/local/sbin
/usr/sbin
/sbin
```
これで、パスがusr/binよりも/usr/localを優先されるようになります。確認のためwhichコマンドをもう一度入力すると

```
$ which python
/usr/local/bin/pyenv
```
のようになるはずです。
最後にもう一度pyenvのpythonのバージョンがpythonのバージョンと一致するか確かめてみてください。


##参考リンク集
参考にさせていただいたリンクです。もっと詳しく知りたい方はぜひご活用ください。
 - [pyenv 利用のまとめ](http://qiita.com/m3y/items/45c7be319e401b24fca8)
 - [pyenvを使ってMacにPythonの環境を構築する](http://qiita.com/1000ch/items/93841f76ea52551b6a97)
 - [書き込み権限のないユーザでファイルを編集してしまったとき Can't open file for writing](http://jsapachehtml.hatenablog.com/entry/2014/11/23/124350)
データセンター持ちものリスト


DCで作業する場合に持っていったほうがいいものリスト
◯:必需 △:場合により 無印:あればいい

*文房具類
- ハサミ
- セロテープ
- カッター △ 開梱時など
- ノート ◯ 作業メモ
- ポストイット ◯ 一時的な貼付けメモ
- ボールペン ◯ メモ用
- テプラ △ 現場になくても予めつくってあればいい

*工具類
- ドライバー 実はあまり使わないかも
- ニッパ- ◯ 結束バンド切ったり
- 小型LEDライト ◯ ラック内に明かりが欲しいときがある

*ケーブルマネジメント
- 結束バンド ◯ ケーブルまとめ
- マジックテープ △ 結束バンドでもいい
- ケーブルタグ ◯ ケーブルの識別

*現場作業
- ノートPC ◯
- LANケーブル ◯ 作業用とラッキング予備品
- ACタップ ◯
- 軍手 ◯ 開梱、ラッキング作業ではつけたほうがいい
- 台車 △ 持ち込みの場合
- ゴミ袋、紙袋 ◯ ゴミはまとめる

*念のため。。。
- 絆創膏 ◯ たまに手を切ったりすることも
- ウェットティッシュ
CppUTest使用時、_GNU_SOURCE が利かなかった



# 発生条件
- CppUTestでメモリリークをチェックしたかったので強制インクルード`-include`を使ってヘッダファイルを指定していた。
- GNU非標準拡張の`pthread_tryjoin_np`を使用するため、ソースの先頭で`#define _GNU_SOURCE`と定義していた

# 現象

```
error: implicit declaration of function ‘pthread_tryjoin_np’
```
`pthread_tryjoin_np`が見つからないと言われる。
`#include <pthread.h>`よりも前に`_GNU_SOURCE`を定義してあるので使える筈なのに。

# 調査方法
- 試しに`#define _GNU_SOURCE`をやめてコンパイルオプション`-D_GNU_SOURCE`を与えたらビルドできた
- コンパイル時に`-E`オプションをつけて、プリコンパイル時点でソースがどんな風に見えているかを調べた

# 判明した原因
`_GNU_SOURCE`は、間接的にインクルードされる`features.h`よりも前に定義しておかなければ意味がない。
ソースの先頭で`_GNU_SOURCE`を定義していたが、`-include`で与えたヘッダの延長で`features.h`が読み込まれたため、`_GNU_SOURCE`が利かなくなっていた。

# 対処
コンパイルオプション`-D_GNU_SOURCE`をつけることにした。
Angular2で親クラスのコンストラクタを呼び出す方法

# こんな感じでsuperで呼びます
今回、これを使った理由としては、親クラスのメソッドのhttp:Httpモジュールを
使用しようとした際に、httpオブジェクトがありません。というような
エラーが多発しており、使いました！！

```
@Injectable()
export class ChildService extends ParentService{
  constructor (private http:Http, private customService:CustomService){
    super(http, customService);
  }
}
```