OmniAICreator/Qiita-1.07M huggingface dataset:
Lravel 5.4 で Zizaco/entrust 5.2.x-dev を使っている時、 Query Log が大量だったら config/cache.php に ttl を設定した方が良い

Laravel に限った話でもないけど、 Lravel 5.4 で https://github.com/Zizaco/entrust/ の 5.2.x-dev を使っている時、 Query Log が大量だったら config/cache.php に ttl を設定した方が良いかも知れない。(というか、多分設定すべき。)

## Zizaco/entrust

Zizaco/entrust を使うと、以下のように Permission を有するユーザーかどうかなど、確認できて便利。

```php
if (Auth::user()->can('some-permission')) {
    // the user has some permission
} else {
    // the user has not some permission
}
```

## 何が問題か

前提: 現時点(2017-08-16) の Zizaco/entrust 5.2.x-dev で確認している

例えば、上記のような if 文を一覧表示中で使ったりすると、当然だが QueryLog が大量に出る。

```php
foreach ($items as $item) {
    echo '<p>'.Auth::user()->name.' can '.(Auth::user()->can('some-entity-read')).' access to '.$item->name.'</p>';
}
```

例えば、 `count($items);// 500` だったりすると、500回以下のような sql が発行される。

```sql
select `roles`.*, `role_user`.`user_id` as `pivot_user_id`, `role_user`.`role_id` as `pivot_role_id` from `roles` inner join `role_user` on `roles`.`id` = `role_user`.`role_id` where `role_user`.`user_id` = '1'
```

大変。

## どうするべきか

以下を付け加える。(60 の部分は任意値)

```config/cache.php
// snip
    'ttl' => 60,
// snip
```

https://github.com/Zizaco/entrust/blob/5.2/src/Entrust/Traits/EntrustRoleTrait.php#L21

ここを見ると、以下のようになってる。

```php
        return Cache::tags(Config::get('entrust.permission_role_table'))->remember($cacheKey, Config::get('cache.ttl'), function () {
            return $this->perms()->get();
        });
```

なお
 https://github.com/Zizaco/entrust/commit/2a73bc28a096c51a8351b8d4b3954327d56db61b これで修正されるっぽい。
.NET Core プロジェクトで「'Update-Database' is not recognized」が出るときの対処

.NET Core プロジェクトでデータベースを更新するために Package Manager Console を開いて Update-Database を実行することはたぶん一般的（？）だと思うのですが、（たぶんこれは僕の開発環境固有の問題っぽいのですが）ある時からこれが実行できなくなってしまいました。

ちなみに環境情報を記しておくと Windows 10 Home, Visual Studio Community 2017 Version 15.3.0, .NET Core SDK 2.0 です。

## 'Update-Database' is not recognized
Update-Database がこんな具合に実行できません。

```
PM> Update-Database
Update-Database : The term 'Update-Database' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, 
verify that the path is correct and try again.
At line:1 char:1
+ Update-Database
+ ~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Update-Database:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
```

## （暫定）対処
試行錯誤した結果見つけた暫定対処としては、Package Manager Console でのカレントディレクトリをプロジェクトディレクトリに手動で設定してあげると良いみたいです（しかしこれ毎回やるのは明らかに間違っている気がするのであくまでも暫定対処です）。

```
PM> pwd
C:\Projects\WebApplication1   ← これはソリューションのディレクトリなので

PM> cd WebApplication1   ← さらにプロジェクトのディレクトリに進んでから
PM> Update-Database   ← 目的のコマンドを実行する
```

## 他環境での挙動
Package Manager Console でのカレントディレクトリが必ずプロジェクトディレクトリになっていないと Update-Database が実行できないか、というと、他の環境（クリーンに構築してみた環境）ではカレントディレクトリがソリューションディレクトリの状態でも Update-Database は実行できていたりしました。

ちょっと問題の原因が特定できかねていますが、暫定の対処をメモとして残しておきます。
pythonで特定の日時までプログラムを停止する方法

# pythonで特定の日時までプログラムを停止する方法
例えば、2020年のハロウィーンまでプログラムを停止させて、ハロウィーンになったらプログラムを再開させる方法

```python
import datetime
import time

HALLOWEEN2020 = datetime.datetime(2020, 10, 31, 0, 0, 0)
while datetime.datetime.now() < HALLOWEEN2020:
    time.sleep(1)

print('halloweenだよ！')
```

time.sleepを使用することで、一秒ごとに時間を調べるようにしている。
一秒間隔で調べれば十分だから、cpuを無駄にしなくなる。。。という意味らしい。

**参照：『退屈なことはPythonにやらせよう――ノンプログラマーにもできる自動化処理プログラミング』**
rbenv で Ruby 2.4.1 が表示されないときの対応メモ

既に rbenv を導入されている環境における Ruby 2.4.1 のインストール方法です。

Mac 環境で Homebrew を使っているのですが、何度 `brew update` しても、 `rbenv install --list` に `2.4.1` が載らないので、直接リポジトリーをアップデートしました。

さてさて具体的な手順を。

まずは、インストール可能なバージョンの中に `2.4.1` が存在するか確認。

```bash
$ rbenv install -l | grep 2.4.1
```

ruby-build のローカルリポジトリーに移動して、直接アップデート。

```bash
$ cd ~/.rbenv/plugins/ruby-build/
$ git pull origin master
```

確認してみると、 `2.4.1` が見つかった。

```bash
$ rbenv install -l | grep 2.4.1
  2.4.1
  rbx-2.4.1
```

インストール。

```bash
$ rbenv install 2.4.1
ruby-build: use openssl from homebrew
Downloading ruby-2.4.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.bz2
Installing ruby-2.4.1...
ruby-build: use readline from homebrew
Installed ruby-2.4.1 to /Users/XXXXX/.rbenv/versions/2.4.1
```

`2.4.1` への切り替えと確認。

```bash
$ rbenv global 2.4.1
$ rbenv global
2.4.1
```

シンボリックリンクの貼り替え。

```bash
$ rbenv rehash
$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin14]
```

( ´∀｀)bｸﾞｯ!
laravel 5.4 + vue 2.x で hot reload する方法

#laravel 5.4 + vue 2.x で hot reload
いつのまにやら、package.jsonのscriptsに hot ってのがあるので、
*「npm run hot すればホットリロードできるやん
　npm run watch 使って、いじるたびにブラウザリロードなんてせんでええんやん」*
って喜び勇んだらうまく行きませんでした。
~~なんか惜しいところまで書いてあるんだけどこれだ！って解決がバシっと書いてあるところがあんまりない気がする~~

あれこれやってたらうまくいったので解決法をば。

## そもそもnpm run hot って？
vue-cli でいうところの　npm run dev とほとんど一緒みたいです。
portは8080決め打ち、　localhost:8080/ 直下はプロジェクトの public/ を読み込むみたいです。
逆にいうとこやつはphpをよしなにやってくれません。

また、laravel はデフォルトで　index.php しか　publicの下においてありませんので、
http://localhost:8080/ とかにアクセスしてもただ寂しく下記のような表示になるだけです。

>Cannot GET /

一応ここで、index.htmlとかをpublic以下においてやって、laravel-mixでvueのコンポーネントをrequireしているjsをコンパイルしたものを読み込んでやれば、ホットリロードが有効になります。

**PHPのBladeで書き換えている箇所は見ることができませんが。**

## laravelで使える　mix() を使おう

bladeの中で、下記のように、ｍix()の中にhotリロードさせたいコンパイル後のjsファイルを指定すると、php artisan serve中はlocalhost:8080　からのパスに書き換えてくれます。
（apache なんかから呼び出す時はそのまま本来のパスになるみたい。）

`<script src="{{mix('js/vue.js')}}"></script>`

なお、当然のことながら、mix()を使うようになって以降は、
php artisan serve するときは、 npm run hotもしておかないと
mixで呼び出している箇所のファイルが　not foundになってしまうので気をつけてください。

これで、laravelでvueするとき hot reload できるようになりました。


----
そもそもLaravelでVueやりたいときに見るチュートリアルはこちら
[Laravel 5.4 + Vue 2.1 でSPAアプリケーション作成チュートリアル](http://qiita.com/acro5piano/items/f33381fc60408abe9865)
OpenAI GymのCartPole-v0をDQNで解く

OpenAI GymのCartPole-v0をKeras-RLのサンプルDQN[^3]で解こうとしてみました．

https://gym.openai.com/envs/CartPole-v0

- DQN版[^1]とDuel-DQN版[^2]があり，DQNAgentのコンストラクタから設定可能

![cartpole.gif](https://qiita-image-store.s3.amazonaws.com/0/107399/b0e9e1d0-b47c-5751-5a62-0e31b87820c1.gif)


## コード

#### DQN版

```python
import numpy as np
import gym
from gym import wrappers
from keras.layers import Flatten, Dense, Input
from keras.models import Model
from rl.agents.dqn import DQNAgent
from rl.policy import BoltzmannQPolicy
from rl.memory import SequentialMemory

def build_model(input_dim, output_dim):
    x_input = Input(shape=(1, input_dim))
    x = Flatten()(x_input)
    x = Dense(16, activation="relu")(x)
    x = Dense(16, activation="relu")(x)
    x = Dense(16, activation="relu")(x)
    x = Dense(output_dim, activation="linear")(x)
    return Model(inputs=x_input, outputs=x)

def run():
    env = gym.make("CartPole-v0")
    env = wrappers.Monitor(env, '/tmp/cartpole-v0-dqn', force=True)
    model = build_model(env.observation_space.shape[0], env.action_space.n)
    memory = SequentialMemory(limit=50000, window_length=1)
    policy = BoltzmannQPolicy()
    dqn = DQNAgent(model=model, nb_actions=env.action_space.n, memory=memory, policy=policy,)
    dqn.compile("adam", metrics=["mae"])
    dqn.fit(env, nb_steps=50000, visualize=False, verbose=2)

if __name__ == "__main__":
    run()
```

#### Duel-DQN版

```python
import numpy as np
import gym
from gym import wrappers
from keras.layers import Flatten, Dense, Input
from keras.models import Model
from rl.agents.dqn import DQNAgent
from rl.policy import BoltzmannQPolicy
from rl.memory import SequentialMemory

def build_model(input_dim, output_dim):
    x_input = Input(shape=(1, input_dim))
    x = Flatten()(x_input)
    x = Dense(16, activation="relu")(x)
    x = Dense(16, activation="relu")(x)
    x = Dense(16, activation="relu")(x)
    x = Dense(output_dim, activation="linear")(x)
    return Model(inputs=x_input, outputs=x)

def run():
    env = gym.make("CartPole-v0")
    env = wrappers.Monitor(env, '/tmp/cartpole-v0-duel-dqn', force=True)
    model = build_model(env.observation_space.shape[0], env.action_space.n)
    memory = SequentialMemory(limit=50000, window_length=1)
    policy = BoltzmannQPolicy()
    dqn = DQNAgent(model=model, nb_actions=env.action_space.n, memory=memory, policy=policy, enable_dueling_network=True, dueling_type="avg")
    dqn.compile("adam", metrics=["mae"])
    dqn.fit(env, nb_steps=50000, visualize=False, verbose=2)

if __name__ == "__main__":
    run()
```

## スコア

- 50,000ステップほど試してみましたが，両方とも解けずじまいでした．
- コンストラクタ時のパラメータを設定すれば解けるかもしれないが， `Keras==2.0.6` だと，まともに動かなくなっている模様．

```
DQN: 32.98 ± 2.91
Duel-DQN: 42.46 ± 3.83
```

## References

[^1]: Mnih, [Playing Atari with Deep Reinforcement Learning](https://arxiv.org/pdf/1312.5602.pdf), 2013.
[^2]: Wang, [Dueling Network Architectures for Deep Reinforcement Learning](https://arxiv.org/pdf/1511.06581.pdf), 2016.
[^3]: Plappert, [Keras-RL](https://github.com/matthiasplappert/keras-rl), 2016.
Node Expressフレームワークの最小RESTサービスへcurlでパラメータを渡す検証



Node.js の Expressフレームワークを利用して、最小のRESTサーバーを書いて、curl でデータの受け渡しを確認した。


## 検証に利用したプログラムの解説

~~~lang:nodejs
     1	#!/usr/bin/env node
     2	
     3	var express = require('express');
     4	var app = express();
     5	var debug = require('debug')('app');
     6	var port = parseInt(process.env.PORT || '3000');
     7	
     8	var bodyParser = require('body-parser');
     9	app.use(bodyParser.json());
    10	app.use(bodyParser.urlencoded({ extended: false }));
    11	
    12	// 動作確認用
    13	app.get('/', function(req, res) {
    14	    res.send('hello world');
    15	});
    16	
    17	// POST application/x-www-form-urlencoded で受け取るケース
    18	app.post('/param', function(req, res) {
    19	    console.log("body = ", req.body);
    20	    console.log("name = ", req.body.name);
    21	    console.log("year = ", req.body.year);
    22	    res.send('OK');
    23	});
    24	
    25	// テキスト形式のJSONで受け取るケース
    26	app.post('/json', function(req, res) {
    27	    console.log("body = ", req.body);
    28	    json = JSON.parse(req.body.json);
    29	    console.log("name = ", json.name);
    30	    console.log("year = ",  json.year);
    31	    res.send('OK');
    32	});
    33	
    34	// イベント待機 
    35	app.listen(port);
~~~

### 3〜6行目
Expressフレームワークの初期化、ポート番号の取得


### 8〜10行目
POSTのデータをパースするためのミドルウェア設定です。 コンテントタイプ application/x-www-form-urlencoded　のデータをパースして、結果をreqへセットする。

### 12〜14行目
HTTP GET / にアクセスがあると、コールバックするコードで、応答は'hello world'を返す。


### 17〜23行目
HTTP POST /param にアクセスがあると、コールバックするコードで、ミドルウェアによりパースされたPOSTデータが、reqへセットされてくる。 POSTデータに、nameやyearの値があれば表示する。

Curlリクエストの方法は、下記の「application/x-www-form-urlencodedで受け取るケース」を参照してください。


### 25〜32行目
HTTP POST /json にアクセスがあると、コールバックするコードで、前述の/paramと同様に動作する。 この部分では、POSTされたJSONのテキスト形式をデータをパースして、取り込みます。クライアントのプログラムで持っている変数データを、一括でテキストのJSON形式変換できるので、便利な受け渡し方法です。

Curlのリクセスは、下記の「テキスト形式のJSONで受け取るケース」を参照してください。


### 34〜35行目

サーバーの実行、イベント待機




## GETでの動作確認

~~~
$ curl http://localhost:3000/
hello world
~~~




## application/x-www-form-urlencodedで受け取るケース

### リクエスト

~~~
$ curl http://localhost:3000/param -d "name=Maho Takara" -d "year=2017"  -X POST
OK
~~~

### サーバー側の実行結果 
~~~
$ node app.js
body =  { name: 'Maho Takara', year: '2017' }
name =  Maho Takara
year =  2017
~~~


## テキスト形式のJSONで受け取るケース
### リクエスト

~~~
curl http://localhost:3000/json -d 'json={"name": "Maho Takara", "year": "2017"}'  -X POST
OK
~~~

### サーバー側の実行結果 

~~~
$ node app.js
body =  { json: '{"name": "Maho Takara", "year": "2017"}' }
name =  Maho Takara
year =  2017
~~~
SSH経由で、docker 内のUbuntuのXアプリを表示


基本的に、 http://qiita.com/aoksh/items/1a386ee87594e67784c4 の通りです。
が、Ubuntu のイメージでは、`--env DISPLAY=$DISPLAY` としてもうまく、DISPLAYが伝わりませんでした。
なので、以下のように DISPLAY を指定しました。

```
$ ssh -Y XXX.XXX.XXX.XXX
$ docker run --rm -i -t --net host -v $HOME/.Xauthority:/root/.Xauthority:rw ubuntu bash -c "DISPLAY=$DISPLAY xterm"
```
AngularJS初心者がハマりがちなこと

AngularJS 1系初心者です。
既存のJSPソースをAngularで置き換え中です。
技術書は軽く流し読みしかしていないので常識だったら申し訳ないです。
#ng-repeatで回数を指定する

```js
listSize=$scope.items.listSize;
$rootScope.range = function(listSize) {
	var arr = [];
	for (var i=0; i<listSize; ++i) arr.push(i);
	return arr;
};
```

listSizeに回数を指定します。
参考リンク：[AngularJS tips - ng-repeat で配列ではなく数値で for ループする方法](http://phiary.me/angularjs-ng-repeat-for-loop-with-numbers/)

# ng-repeatの罠
ng-repeatを使う場合、ループ内ではinで指定した変数しか参照できません。

```html
<tr ng-repeat="i in range(items.listSize-1)">
  <td>{{i+1}}</td>
  <td ng-if="$parent.items.obpTop10[i].rank == 1" bgcolor="#FC9898">{{$parent.items.obpTop10[i].name}}/{{$parent.items.obpTop10[i].obp | number:4}}</td>
  <td ng-if="$parent.items.obpTop10[i].rank != 1">{{$parent.items.obpTop10[i].name}}/{{$parent.items.obpTop10[i].obp | number:4}}</td>
  <td ng-if="$parent.items.twobaseTop10[i].rank == 1" bgcolor="#FC9898">{{$parent.items.twobaseTop10[i].name}}/{{$parent.items.twobaseTop10[i].twobase}}本</td>
  <td ng-if="$parent.items.twobaseTop10[i].rank != 1">{{$parent.items.twobaseTop10[i].name}}/{{$parent.items.twobaseTop10[i].twobase}}本</td>
  <td ng-if="$parent.items.slgTop10[i].rank == 1" bgcolor="#FC9898">{{$parent.items.slgTop10[i].name}}/{{$parent.items.slgTop10[i].slg | number:4}}</td>
  <td ng-if="$parent.items.slgTop10[i].rank != 1">{{$parent.items.slgTop10[i].name}}/{{$parent.items.slgTop10[i].slg | number:4}}</td>
  <td ng-if="$parent.items.fourBallTop10[i].rank == 1" bgcolor="#FC9898">{{$parent.items.fourBallTop10[i].name}}/{{$parent.items.fourBallTop10[i].fourBall}}個</td>			
```

**$scope**などの中身を参照する場合は**$parent**で親のスコープを参照する必要があります。
[AngularJS でループ外のスコープにアクセスする](http://www.serendip.ws/archives/6261)
”AngularJS ループ外”→"ng-repeat スコープ"などでググってたどり着きました。
**i**はインデックス(添え字)です。
前述した回数指定を行ってループさせながらインデックスで配列にアクセスする方法です。
Redis を触ってみる

プロジェクトで同僚が使い始めて、私は初めてだったのでトラブルシュートがてら触ってみた。

# インストール方法

Azure で Redis をインストールするにはいくつかの方法がある。ポータルからが一番簡単

<img width="1254" alt="Redis01.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/d6a94167-fe9d-ca1c-c8d8-581dae81a248.png">

1. Access keys から、プライマリ・セカンダリキーと、接続文字列が取得できる。
2. コンソールを web 上で開くことができる

# 各種クライアント

サーバーに接続するための様々なクライアントが用意されている。

## Azure Portal

さきの 2. をクリックすると、ポータル上でくれりを投げることができる。

![Redis02.png](https://qiita-image-store.s3.amazonaws.com/0/3470/19167114-49e4-1831-8e24-6d3047cc2cf4.png)

## redis-cli 

Windows、Mac, Linux 向けにクライアントが用意されている。私が、Bash on Windows で接続確認した方法は下記の通り。


```
$ sudo apt-get install redis-tools
```

これであっさり redis-cli がインストールされましたが、一つ問題があります。サーバーは、デフォルトでTLS のアクセスしかredis-cli を使うときは、素のhttp でアクセスするようになっています。その時は、Windows 側で [stunnel download](https://www.stunnel.org/downloads.html) を使うとよい。これは、TLSのエンクリプションラッパーだ。動作イメージを見てみよう。stunnelをダウンロードしてインストールする。
インストールして、 `Stunnel GUL Start` を探して実行してみよう。いくつかの項目をいれなくてはならない。あと、設定の変更が必要だ。

![Redis03.png](https://qiita-image-store.s3.amazonaws.com/0/3470/343db788-becb-c56a-e03d-e5f9f4fad82b.png)

手順どおり、実施してみる。設定ファイルの一番したに下記のを追加。

```
[redis-cli]
client = yes
accept = 127.0.0.1:6380
connect = YOURE_REDIS_NAME.redis.cache.windows.net:6380
``
これで、クライアントからのメッセージをここに送ることによって、TSLにラップして送信してくれる。
じゃあ、実際に、redis-cli から動作させてみよ
```
$ redis-cli -p 6380 -a YOUR_PRIMARY_PASSWORD 127.0.0.1:6380> ping
PONG
```

stunnelがあれば楽勝ですね。

## .NET 

さて、.NET でもプログラムが書ける。


```csharp
using StackExchange.Redis;
using System;

namespace RedisSample
{
  class Program
  {
    static void Main(string[] args)
    {
        IDatabase cache = Connection.GetDatabase();
        cache.StringSet("key1", "value");
        cache.StringSet("key2", 25)
        
        string key1 = cache.StringGet("key1")
        int key2 = (int)cache.StringGet("key2")
        Console.WriteLine($"key1:{key1} key2: {key2}");   
        Console.ReadLine();    
    }

  private static Lazy<ConnectionWultiplexer lazyConenction = new Lazy<ConnectionMultiplexer> (() =>
    return ConnectionMultiplexer.Connect("YOUR ENDPOINT HERE");

     public static ConnectionMultiplexer Connection
       get 
       {
          return lazyConnection.Value;
       }
    }
  }
}
```

とっても簡単で解説もいらないぐらい。

実行すると予想通りの例

```
key1: value key2: 25
```
ちゃんとアクセスできました。

  
Enjoy coding


    * [How to Use Azure Redis Cache](https://docs.microsoft.com/en-us/azure/redis-cache/cache-dotnet-how-to-use-azure-redis-cache)
grepでバックスラッシュを含む行を検索したい


`grep`でバックスラッシュ(`\`)を検索する機会があったのですが、意外にも「はまった」のでメモとして対応策を残しておきたいと思います。

まず文字列の囲み文字/リテラルとしてダブルクオート(`"`)を利用する場合は`\\\\`を利用します。わかりにくいですが、__バックスラッシュを4つ重ねて初めてバックスラッシュひとつになります。__つまり`\a`という文字を検索したい場合は`\\\\a`とする必要があります。

```bash
cat ${some_file} | grep "\\\\"    # バックスラッシュを含む行を抽出する
cat ${some_file} | grep "\\\\a"  # \aを含む行を抽出する
```

次にシングルクオート(`'`)を利用する場合は`\\`が正解です。ダブルクオートによるリテラル文字列とは違い、__バックスラッシュはふたつしか重ねる必要がありません。__つまり`\a`であれば`\\a`と書けば`grep`で検索することができます。

```bash
cat ${some_file} | grep '\\'     # バックスラッシュを含む行を抽出する
cat ${some_file} | grep '\\a'  # \aを含む行を抽出する
```
UIReferenceLibraryViewController について

今回はUIReferenceLibraryViewControllerと言う死ぬほどマイナーなクラスについて記述しておきます。

主に自分用のメモです。

## UIReferenceLibraryViewController とは ##

iOS標準の辞書にアクセスするためのViewControllerで、iOS5から使用できます。
Qiitaで検索するとたった2つの記事しかヒットしません。この記事がおそらく３つ目です。
Appleもほとんど手をつけてないのか、関数が増えたことも無いようです。

このコントローラの関数はたった一つで、dictionaryHasDefinition になります。
この関数は、OSにインストールされている辞書にその文字が登録されているかをBoolで返してくれます。

使い方：
init　するときにtermにStringで値を渡すことで辞書が生成されます。

```swift:libsample.swift
//open class func dictionaryHasDefinition(forTerm term: String) -> Bool
let text = "test"

//もし辞書に登録されているなら、libVCを生成して遷移する
if (UIReferenceLibraryViewController.dictionaryHasDefinition(forTerm: text)) {
     let libVC = UIReferenceLibraryViewController.init(term: text)
     self.present(libVC, animated: true, completion: nil)
}
```

大体こんな感じに表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78088/29d8bf4c-d1fc-46dd-0954-a766caf16f85.png)

こちらの記事に記載されているとおり、生成したViewControllerのviewをaddSubViewすることでアプリのUIの一部として使用できます。

http://qiita.com/T_Fuchi/items/36886997618598003d7c

また、文字が該当する辞書の数によって表示が変わるようで、1つの場合は、上記のように縦長に表示されますが、2つ以上の場合は、リストが表示されます。

本当はAmazonのkindleのように、文字を選択したら辞書をパパッと出したかったのですが、どうやらAmazonは自前で実装されていらっしゃるようです。

なんか、良いAPIやサービスがあったら教えてください。
astah APIをjjsを使って楽に呼び出す

# つまり astah を起動せずに JavaScriptで 楽々 astahAPI

## astahAPI と JavaScript
UMLツールのastahにはAPIが昔から提供されており、UMLモデルからデータを読み出すことができます。(Professional版やUML版なら、書き込むことも可能。)
これによって、Javaのプログラムを作成することでちょっとしたコード生成などできます。
astah API : http://astah.change-vision.com/ja/astah-api.html

また、プラグインを使用するとJavaScriptでAPIを使用して手軽にできるようになっています。
astah script plugin : http://astah.change-vision.com/ja/feature/script-plugin.html

## astah を起動せずに JavaScript から APIって使用できないの？
ある時(2年前ぐらい)、作成した複数のastahファイルからデータを抜き出したいのだけれども、いちいちastahを起動してプラグインを実行するのも面倒だなぁと思っていました。チェンジビジョンのastahサポートへ問い合わせをしたところ、とても使い勝手の良い回答をいただきました。（動作保証はないとのことでしたが、快適に動作しています）
それは、Javaに付属のjjsを使用するという方法。
jjsとは → https://docs.oracle.com/javase/jp/8/docs/technotes/tools/unix/jjs.html

## 環境
OS : Windows (おそらく、MacでもLinuxでも可能だと思います)
astah : Community or Professional
java JDK : jjsが付属の8.0以上

## 用意するファイル
astah APIを使用するJavaScript と 次の2ファイル を用意します。

``` openProject.js
var AstahAPI = Java.type("com.change_vision.jude.api.inf.AstahAPI");
var astah = AstahAPI.getAstahAPI().getProjectAccessor();

var projectPath = arguments[0];
astah.open(projectPath, true, false, true);
```

``` closeProject.js
astah.close();
```

## jjsへの引数の与え方

```
jjs.exe -cp astah-api.jar;astah-community.jar openProject.js hoge.js closeProject.js -- fuga.asta
```
こんな感じでjjsの引数に与えることで、fuga.astaに対してhoge.jsを実行できます。

## 実行例

しかしながら、JAVA_HOMEとかjjsの場所とかastahのライブラリも必要なので、自分の場合、以下のようなbatを作成しています。
astahのライブラリは、ローカルフォルダへコピーしてます。(もっと良い方法があるのかも)


- cmdを起動したときに１回実行するbat 

``` initial.bat
@rem ここの環境変数を各自の環境に合わせて書き換えてください。
set JAVA_HOME="C:\Program Files (x86)\Java\jre1.8.0_131"
set ASTAH_HOME="C:\Program Files\astah-community"
@rem set ASTAH_HOME="C:\Program Files\astah-professional" ←Professional版の場合

echo Now, setting
xcopy %ASTAH_HOME%\lib .\lib /D /I
copy %ASTAH_HOME%\astah-api.jar .\ /Y
copy %ASTAH_HOME%\astah-community.jar .\ /Y
@rem copy %ASTAH_HOME%\astah-pro.jar .\ /Y  ←Professional版の場合
EXIT /B
```

- たとえば、クラス一覧を出力するjs

``` list_Classes.js
with(new JavaImporter(com.change_vision.jude.api.inf.model)) {
  classes = astah.findElements(IClass.class);
  for(var i in classes) {
    
    if(classes[i] instanceof IUseCase) {
    } else {
      print(classes[i].getFullName("::"));
    }
  }
}
```

- list_Classes.js を実行するbat

``` print_Classes.bat
@echo off
%JAVA_HOME%\bin\jjs.exe -cp astah-api.jar;astah-community.jar ^
openProject.js list_Classes.js closeProject.js -- %1
```

上記を用意しておいて、次のように実行すると複数のastahファイルのクラス名を簡単にテキストに出力できます。

```
print_Classes.bat sample1.asta > classes.txt
print_Classes.bat sample2.asta >> classes.txt
print_Classes.bat sample3.asta >> classes.txt
:
:
```

## 謝辞
問い合わせた際に回答いただいたチェンジビジョンのサポートの方、及び、快く内容を公開してもよいと承諾くださった営業の方、ありがとうございました！
Apacheのmod_rewriteでアクセス制御


# 免責事項

自分向け備忘録。
今時Apache httpdかよ、時代はNginxだろとか言わない。

# 目的
Apacheのmod_rewriteを使って特定IPアドレスからのアクセスをブロックする

# 前提条件
ApacheのフロントにAWSのELBなどのロードバランサが存在すること。

# 概要
ELB経由のアクセスになるので、HTTPリクエストヘッダの
X-Forwarded-Forヘッダの値を条件として書き換えを行うする。

※ REMOTE_ADDRにはELBのアドレスが入るので目的が達成できない。


# 設定例

```text:記述例
 RewriteEngine on
 RewriteCond %{HTTP:X-Forwarded-For} ^111\.111\.111\.111$ [OR]
 RewriteCond %{HTTP:X-Forwarded-For} ^222\.222\.222\.222$ [OR]
 RewriteCond %{HTTP:X-Forwarded-For} ^123\.123\.123\.123$ [OR]
 RewriteCond %{HTTP:X-Forwarded-For} ^234\.234\.234\.234$
 RewriteRule ^.* - [F,L]
```

## やろうとしていること

RewriteCondで設定している4つのIPアドレスからのアクセスは403 Forbiddenで返す。

## 記述内容をざっくり説明

- RewriteEngine onでmod_rewriteによる書き換え処理を開始。
- RewriteCondで書き換え対象か否かの条件を指定。
	- 今回はHTTPリクエストヘッダに含まれるX-Forwarded-Forの値で判定している。(値はダミー)
- [OR]でRewriteCondをつなぐことで複数の条件(RewriteCond)のうちのいずれかが満たされればRewriteRuleを適用する。([OR]がない場合は暗黙的にAND扱いになる)
- RewriteRuleの記述について
	- RewriteRuleでは、正規表現(^.*)がリクエストパスに指定されており、あらゆるパスに対して書き換え処理を行う。
	- - でパスの書き換えは行わないの意味。
	- [F, L]のフラグ指定に合わせてレスポンスを返す。
		- Fは403 Forbiddenでアクセス拒否していることを表す。
		- Lで以降のRewrite処理を終了し、レスポンスを返す。
LaravelのtimezoneをデフォルトのUTCからJST(日本標準時)へ変更する

PHPフレームワークのLaravelでは、default timezoneがUTCになっています。
設定を変えずにそのまま運用してしまうとアプリケーションが扱う日時がおかしくなってしまいます（ログに吐かれる日時や、DB Recordのcreated_at/updated_atなどが9時間前ずれてしまう、など)。


# timezoneの変更方法

`config/app.php`　に設定ファイルがあるじゃろ？

これを
( ＾ω＾) 
⊃)　 (⊂ 

```
/*
|--------------------------------------------------------------------------
| Application Timezone
|--------------------------------------------------------------------------
|
| Here you may specify the default timezone for your application, which
| will be used by the PHP date and date-time functions. We have gone
| ahead and set this to a sensible default for you out of the box.
|
*/

'timezone' => 'UTC',
```

こうじゃ
( ＾ω＾) 
≡⊃⊂≡ 

```
/*
|--------------------------------------------------------------------------
| Application Timezone
|--------------------------------------------------------------------------
|
| Here you may specify the default timezone for your application, which
| will be used by the PHP date and date-time functions. We have gone
| ahead and set this to a sensible default for you out of the box.
|
*/

'timezone' => 'Asia/Tokyo',
```


# 動作確認

## before

```
$ php artisan tinker
Psy Shell v0.8.11 (PHP 7.1.5 — cli) by Justin Hileman
>>> echo Carbon\Carbon::now();
2017-08-15 12:44:55⏎
```

## after

```
$ php artisan tinker
Psy Shell v0.8.11 (PHP 7.1.5 — cli) by Justin Hileman
>>> echo Carbon\Carbon::now();
2017-08-15 21:44:09⏎
```
gradleでnpmとかyarnのプロジェクトもまとめてビルドする

JavaやJVM言語で開発するとき、mavenやgradleを使ってビルドしています。最近はmavenからgradleを利用するケースが多いですね。一方でフロントエンド側の開発はnpmやyarnを使ってビルドします。その上で、gulpとかwebpackとか…。

npmやyarnでのビルドをgradleに統合するには、[gradle-node-plugin](https://github.com/srs/gradle-node-plugin)があります。gulpを使えば、かなり細かく統合できますが、npmやyarnでビルドツールを構築していれば、お手軽に統合できます。

## build.grade

プラグインを設定するだけでnpmやyarnのコマンドを叩けます。
build.gradleは最低限、次のように記述するだけで動きます。

```groovy
buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }

    dependencies {
        classpath "com.moowork.gradle:gradle-node-plugin:1.2.0"
    }
}


plugins {
    id "com.moowork.node" version "1.2.0"
}

apply plugin: 'com.moowork.node'
```

## 実行

npmを使う場合です。yarnの場合はnpmと書いているところをyarnに読み替えてください。

### npm install

```shell-session
gradle npm_install
```

### npm build
```shell-session
gradle npm_build
```

### npm run build
```shell-session
gradle npm_run_build
```

### npm start
```shell-session
gradle npm_start
```

## gradle buildとの統合

npmコマンドのラッパとしてだけでなく、javaのコードのビルド前にnpmのビルドを自動で走らせたりできます。build.gradleに次のように書きます。

```groovy
classes dependsOn npm_build
```

## おわり

とても簡単にgradleと統合できます。コマンド一発ですべてビルドできていいですね。
closest()メソッドを使ってデリゲートイベントを実現する

# はじめに
初めまして。
以前ははてなブログ（[http://kde.hateblo.jp/](http://kde.hateblo.jp/)）の方に技術ネタを書いていたのですが、こちらの方がフィードバック等もらえて勉強になるのではと思い、今回初めて投稿させて頂きます。
読みにくいところ等あるかと思いますが、お気づきの点等あればお気軽にご指摘いただけると幸いです。

# 今回の元ネタ
2か月ほど前に私自身がteratailに質問した「[ネイティブのJSでデリゲートイベントを実装して子要素の情報を取得したいです](https://teratail.com/questions/79357)」で返答頂いた、closest()メソッドについてです。
（当時ご回答頂いた方々、改めてありがとうございました）

## closest()とは
> Element.closest()メソッドは、パラメータで指定されたセレクタに一致する、現在の要素（または現在の要素自体）の最も近い祖先を返します。そのような祖先がない場合、nullを返します。
（[Element.closest() - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/Element/closest)より）

### 構文
``` javascript
const elem = element.closest(selector);
```
- 引数には'a:hover'や':not(div)'など、document.querySelector(selector)と同じようにセレクタを指定できます。
    - セレクタが有効な文字列ではない場合はシンタックスエラーとなります。
- 戻り値は、elementの最も近い祖先要素です。マッチしない場合は`null`が返ります。

### 対応ブラウザ
**IEには対応していません。**
IEに対応するためには[MDNで紹介されているポリフィル](https://developer.mozilla.org/ja/docs/Web/API/Element/closest#Polyfill)を使用すると良いと思います。
（IE9以上、IE8以上の2つ用意されています）


## 実際の使用例
先述のtetatailの内容を実装してみたいと思います（一部HTMLは簡略化してあります）。

[デモページはこちら](https://codepen.io/KDE_SPACE/pen/QMObQM/)

```html:html
<div id="container">
	<ul>
		<li id="item1"><a href="#1">item</a></li>
		<li id="item2"><a href="#2">item</a></li>
		<li id="item3"><a href="#3">item</a></li>
		<li id="item4"><a href="#4">item</a></li>
		<li id="item5"><a href="#5">item</a></li>
	</ul>
	<button>add</button>
</div>
```
```javascript:javascript
'use strict';

const container = document.getElementById('container');
const list = container.getElementsByTagName('ul')[0];
const items = list.children;
let itemCount = items.length;
const btn = container.getElementsByTagName('button')[0];

/**
 * 値の取得
 */
const getValue = () => {
	const result = {
		id: '',
		href: ''
	}	

	list.addEventListener('click', (e) => {
		const target = e.target;
		if (target.nodeName !== 'A') { return; }
		const li = target.closest('li');
		result.id = li.id;
		result.href = target.getAttribute('href');
		console.log(result);
	});
}

/**
 * list要素の追加
 */
const addItem = () => {
	btn.addEventListener('click', () => {
		const li = document.createElement('li');
		itemCount += 1;
		li.id = `item${itemCount}`;
		li.innerHTML = `<a href="#${itemCount}">item</item></li>`;
		list.appendChild(li);
	});
}

getValue();
addItem();
```

## 使ってみての感想
祖先要素を参照する方法としてはwhileでparentNodeを辿っていく方法が定番なのかと思いますが、closest()を使えばより簡潔でわかりやすく書けることが実感できました。
対応ブラウザに気を付けながら積極的に使っていきたいメソッドです。
None (Material) の怪

## 概要

夏の風物詩、というわけではないですが、
Unityのエディタ上のCanvas>Imageに画像を反映しようと色々と試していたところ、
謎現象に遭遇したので、個人的備忘録も兼ねたメモ。

## 再現流れ

1. まっさらなシーンを用意する。

2. 適当な画像をResoursesフォルダ直下にimportし、画像名をtest_imgへ変更する。

3. Hierarchy > Create > UI > Image をクリックし、Hierarchy上に Canvas > Image が作成されるのを確認する。
	![スクリーンショット 2017-08-15 3.00.33.png](https://qiita-image-store.s3.amazonaws.com/0/74924/fb4e840b-811e-d544-9cc6-06b9f1718f5e.png)
　
4. 上記Imageか、新たにGameObject等を作成し、そこに下記ScriptをAttachする。

	```ChangeImg.cs
	using UnityEngine;
	using UnityEngine.UI;

	public class ChangeImg : MonoBehaviour
	{
		void Start ()
		{
			Texture texture = Resources.Load("test_img") as Texture;
			Image img = GameObject.Find("Image").GetComponent<Image>();
			img.material.mainTexture = texture;
		}
	}
	```
	![スクリーンショット 2017-08-15 3.19.53.png](https://qiita-image-store.s3.amazonaws.com/0/74924/69597513-8f96-3533-cbc5-0df5d7302834.png)
　

5. ここで、実行ボタンをクリックし、実行終了ボタンを押すと...
（お分かりいただけただろうか？）

なんと、Inspector上では None (Material) と表示されているにも関わらず、Gameでは先ほどTextureとして指定した画像が描画されています！

「透明の何か」だった None の代わりに、上記で読み込んだ画像が利用されるようになります。
None は「透明の何か」で良かったのですが、、と不便になってしまいます。



## 対策

Unityのエディタ自体を再起動すると、元の None が描画される状態へ戻ります。

結論として、
Unityのエディタ上のCanvas>Imageに画像を反映する方法は
以下にたどり着きました。

```ChangeImg.cs
using UnityEngine;
using UnityEngine.UI;

public class ChangeImg : MonoBehaviour
{
	void Start ()
	{
		Sprite sprite = Resources.Load("test_img", typeof(Sprite)) as Sprite;
		GameObject.Find("Image").GetComponent<Image>().sprite = sprite;
	}
}
```
これで、 None がいつもの None になりました。

一体なんだったのでしょうか。
謎は深まるばかりです。

（おそらく、メモリに乗ったものを None としているとか？）
そもそも、Sprite画像を扱うにも関わらず、Textureとして利用していたのもミスですが。
CentOS7 で cron を設定する方法

しばらく勉強でCentOS6を使っていたのですが、最近になってCentOS7にしてみたところ、cronの設定の段階で躓いてしまったので、自分の覚え書きとして書き留めておきたいと思います。

##cronie-noanacronのインストール
CentOS7はデフォルトでcronie-anacronがインストールされているのでcronie-noanacronをインストールします。
インストールする際はパッケージの依存関係があるため、順番に気をつけてください。

```linux:CentOS7
# yum install cronie-noanacron
# yum remove cronie-anacron
```

インストールが完了したら`crontab -e` でcronを設定していけます。

ただ、私が現在詰まっている点としては、cronで設定したechoの実行が`/var/spool/mail/root`の配下に出力されてしまいます。
`/var/log/cron`にもechoの出力が確認できたので、cronは正しく起動していると思うのですが、コンソール上に表示されないのが違和感があります。
何かわかりましたらまた随時編集していきたいと思います。
背景の一部だけ色をつけたい場合のCSSスタイルシートの書き方


ブロック全体に背景色を付けるのではなく、ブロックの一部にだけ色をつけたい、という状況があったので、方法を考えてみた。

目的:
こんな感じで、青い背景を灰色のブロックの全体ではなく、左側だけに表示したい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30677/de642059-9e96-662a-cee8-62cbec853d03.png)

## 2017/08/16追記
@oreoさんから紹介していただきましたが以下の方法で簡単に実現できました。

CSSの線形グラデーション(linear-gradient)
https://codepen.io/oreo/pen/jLabE

##  手っ取り早く動作確認したい方はこちら
https://codepen.io/umeneri/pen/GvMeqE


## やりかた

例えば、以下の図のようにブロックの左側に色をつけたい場合の指定方法。

containerというクラスの中に、background-blueという青の背景色を担当する要素とcontentsというメインのブロックがある。

背景担当のbackground-blueはabsoluteにしてcontentsと重なるようにすると、実現できる。


```html:html
<div class="container">
  <div class="background-blue">
  </div>
  <div class="contents">
    <div>左より文字</div>
    <p>メイン コンテンツ</p>
  </div>
</div>
```

```css:css
.container {
  position: relative;
  width: 200px;
  height: 300px;
  background: #dddddd;
}

.background-blue {
  position: absolute;
  top: 0;
  bottom: 0;
  width: 100px;
  background: #999;
}

.contents {
  position: relative;
}
```
railsでコマンドをミスった際の回復方法

Railsはコマンドで色々いっきに生成してくれるのが強みですがうっかりコマンド間違えると色々なファイルが生成されて消すのが大変になってしまいます。ミスした場合はファイルを一つ一つ修正するのではなく、下記の方法で戻しましょう。

# generate

```ruby:rei
  $ rails generate controller StaticPages home help
  $ rails destroy  controller StaticPages home help
```
generateはdestroyで

# rails db:migrate

```ruby:rei
rails db:migrate
rails db:rollback
```

```ruby:rei
rails db:migrate
rails db:migrate VERSION=0
```

rails db:migrate VERSION=0でversionを戻すことで回復させる方法もある。
Watson SpeechToTextでBoxにある音声ファイルをテキスト化してみる(Ⅰ. 概要)

#課題
会議の議事録を作成するために、会議中に録音した音声ファイルをもう一度聞きながら文字起こしする作業ってありませんか？私の会社では、英語の会議だと特にこの作業が発生し、議事録を書いて送るのも結構な手間になってしまいます。
ということで、この作業をWatson Speech To Textを使って、文字起こしの作業を自動化することにチャレンジしたいと思います！！

#環境
- Heroku
    - プログラム本体を動かすWebサーバーとして使います。
    - プログラムは何でも良いのですが、今回はNode.jsで作ります。
- box
    - 会議を録音した音声ファイルとテキスト化したファイルを保存する場所として利用します。
- Watson Speech To Text
    - Microsoft Bing Speech APIとかでも同じことできると思いますが、今回はWatsonを使いました。
- 開発環境
    - MacBook Air (macOS Sierra)
    - Terminal
    - Atom

#完成イメージ
完成イメージは、Boxに配置している音声ファイルを選択し、右クリックメニューから「日本語テキスト化」をクリックすると、テキスト化されたファイルがBoxに保存されるイメージです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/135983/68a3e68b-63d9-47d7-d4fe-0735ab645ca8.png)

#構成イメージ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135983/2fb9e394-9740-74ba-59ed-0eb87264c4da.png)

#続き
次に、必要な環境を用意していきたいと思います。
>[Watson SpeechToTextでBoxにある音声ファイルをテキスト化してみる(Ⅱ.環境構築)](http://qiita.com/tokotan/items/d8198af88d24cb72c0b4)
Let'Encrypt&Certbotを導入する

## はじめに
少しつまずいたので個人的にメモします。

## 前提条件
- OSはCentOS6系
- WEBサーバはapache、起動しておくこと
- gitインストール済
- DNSによるAレコード設定が完了していること

## 手順
- ホームディレクトリへ移動

```:command
$ cd ~
```
- gitからcertbotをダウンロード 
 
```:command
$ git clone https://github.com/certbot/certbot`
```
- ダウンロードしたフォルダ内でテスト実行

```:command
$ cd certbot
$ sudo ./certbot-auto –debug
```
- 証明書発行

```:command
$ sudo ./certbot-auto certonly --webroot -w /path/to/Documentroot -d example.com -m example@example.com --renew-by-default --agree-tos --debug
```
`-w`はドキュメントルート。
`-d`はFQDN。
`-m`は通知用メールアドレス。
`--renew-by-default`はSSL/TLS サーバ証明書が既に存在する場合には、残りの有効期間にかかわらず、証明書を更新。
`--debug`はエラー時のtracebackを表示。
注）Basic認証を掛けている場合ドキュメントルート配下の.well-know配下に.htaccessを追加する

```:.htaccess
Satisfy any
order allow,deny  
allow from all  
```
- apache再起動

```:command
$ sudo service httpd restart
```
- 自動更新のためcron設定  
毎月１日1時に更新

```:crontab
0 1 1 * * root /home/user/certbot/certbot-auto renew –force-renew && service httpd reload
```
## 参考
https://www.cresco.co.jp/blog/entry/1488/
crontabに関して

##環境
Ubuntu 14.04

#crontab
設定した時間にコマンドを実行してくれる!!!!
なにこれ便利!!

#オプション

| オプション               |               | 
|:------------------------|:------------------|
| -u [ユーザ名]            |  指定したユーザのファイルを操作できる|
| -r                      |  ファイルの削除|
| -e                      |  ファイルの編集|
| -l                      |  ファイルを標準出力|

特に削除コマンドは要注意!!
削除しますか?と言った警告も出ずに実行すると全て削除されます。
~~キーボードでeとrが横にあるのは陰謀...~~


#書き方

```ruby:edit
* * * * * [実行コマンド]
```

設定の項目は左から分、時、日、月、曜日となっている。
いくつか例を挙げる。

```ruby:example
0,10,20,30,40,50 * * * * ruby hello.rb
*/10  *  *  *  * ruby hello.rb
```

上と下は同じ動作をする。
毎時10分おきにhello.rbが自動的に実行される。

```ruby:example
0 0 1 1 * new_year.rb
```

と記述すると1月1日に実行される。
VSCode+Python拡張機能＋Minicondaでプロジェクト毎に開発環境を設定する方法

# 目的
* プロジェクト毎に自動補完等のPython環境を切り替えたい

# 環境
* Windows 10
* VisualStudio Code 
* 拡張機能
    * donjayamanne.python

# 方法
1. プロジェクトの**.vscode**配下に**settings.json**を配置する。
1. [ユーザー設定]と同様の設定ファイルを書く。

```settings.json
{
    "python.pythonPath": "C:/Users/{user}/Miniconda3/envs/spam/python"    
}
```

# 備考
* [ユーザー設定]をオーバーライドする様子
Ruby on Rails with Grape: JSONシリアライザの比較

# 概要
携わっている案件で作成しているRailsアプリケーションでは、JSONシリアライザとしてRablを採用していました。しかしどうもRablが遅い。
そこで、さまざまなシリアライザを比較してみることにしました。

世間では"ActiveModel Serializerが圧倒的に早いぞ！"というのをよく見るが、だいたいの検証記事はひとつのモデルのインスタンスをそのままシリアライズするような場合。
関連するモデルの情報を含めたり、モデルの属性から算出する値を含めたりする場合の性能比較は見つかりません。

そこで、より現実に即した状況で性能を比較検討してみましたというものです。。

# 全選手入場！！
比較対象は次のよっつ。

- ActiveModel::Serializer
- Grape::Entity
- Jbuilder (個人的には一番書きやすくて好き)
- Rabl
 
バージョンはそれぞれ

- active_model_serializers: 0.10.6
- grape-entity: 0.6.1
- jbuilder: 2.7.0
- rabl: 0.13.1

また、Ruby, Railsなどは
Ruby2.4.1、Rail5.1.3、Grape1.0.0を使用。
 
# サンプルアプリケーション

## 構成
User, Article, Bookmarkの3つのモデルが存在する。
![IMG_20170809_151601.jpg](https://qiita-image-store.s3.amazonaws.com/0/133157/31f592bb-c47d-0a36-67b8-9400e396fa8f.jpeg)

## API
存在するAPIはユーザー情報を取得するAPIで、次のようなJSONを返す。
Userの属性と、そのUserに紐づくArticleの属性、そして各ArticleとUserに紐づくBookmarkが存在するかどうかを "is_bookmark" で表している。

```json
{
  "user": {
    "id": 1,
    "name": "user0",
    "articles": {
      "id": 1,
      "title": "title0",
      "content": "content0",
      "is_bookmarked": true"
    }
  }
}
```

## リポジトリ
https://github.com/k5trismegistus/grape-json-serializer-comparison

## 環境
実行環境は13インチのMacbook Pro。

# ベンチマーク

## 設定
事前にUserを100、Articleを1000(User 1あたり10)、Bookmarkを30000(User1あたり300)作成してある。
User IDに含まれる数からランダムに1000個の数字列を生成し、そのIDを使ってAPIリクエストを行う。
10000リクエストをさばくのにかかった秒数を計測した。

## 結果

|シリアライザ|時間|
|:-----------|---:|
|ActiveModel::Serializer|121|
|Grape::Entity|99|
|Jbuilder	 |138 |
|Rabl        |130 |

おおまかに Grape::Entity < ActiveModel::Serialiser < Jbuilder < Rabl (上記ではRablのほうがJbuilderより小さい数字になっているが、Jbuilderのほうが早いケースのほうが多い。外れ値を除けばよかった、、。)
という傾向が得られた。特にGrape::Entityはほかと比べて際立って早い場合が多く、Rablとの比較では20%近く早くなりそう。

早い早いと評判だったActiveModel::Serializerは言うほど早くないような。

### 備考
CPUを多用するベンチマークであるため、ベンチマーク実行中にCPU温度が高くなり周波数が下がるケースがみられた。その影響が出にくくなるよう、ベンチマーク実行中はPCを冷却台で冷やし、実行順を変えて平均をとった

# とはいえ

パフォーマンスをそこまで気にしないのであれば、jbuilderが圧倒的に書きやすいかなぁ…と個人的に思います。あくまで個人的な感想ですが、今回のサンプルAPIを作成した際に感じたとっつきやすさは

> jbuilder >> Rabl > Grape::Entity >>> ActiveModel::Serializer

という感じです。
negative sampling(ネガティブ　サンプリング)とは　word2vec編

#negative samplingとは？
こんにちは。
今回は、word2vecでよく使われるネガティブ　サンプリングについて解説したいと思います。
#negative samplingをする目的
通常word2vecの出力層のノードの数は辞書として登録している単語の数と同じくらいありますね。仮に50000個の出力ノードがあった場合、最小２乗誤差で誤差を求めた場合多大な時間が掛かりますね。その多大な時間を節約するためにnegative samplingを行います。
#negative samplingの動作
ネガティブサンプリングは、分かりやすく申すと出力層に対してドロップアウトのようなことを行なっています。大抵教師ラベルは一つだけ1のラベルがあり他の全てが0になります。（onehot encoding）その0のラベルに該当する出力ノードのうちいくつかは最小２乗誤差を求めるために使用せずに、除外します。（除外する割合は任意に決められます。）除外するノードをランダムで変えていくと、確率論ですが全ての出力ノードと教師ラベルから誤差を求めた場合と似たような出力を得ることができます。数式は割愛しますが、tensorflowの翻訳ページなどが分かりやすかったです。
Use ssh to login with clear password.

It's hard to use one command to login through ssh and clear password, but I think this is some better way.

```shell-session
# copy to clipboard
echo 'password' | pbcopy
ssh user@host
```

Save this as a shell file `some_host` and then:

```shell-session
some_host
Password:
```

After Password prompt is appeared, use CMD + v to input password.

This is need two steps, but is a simple way with complex password to login.
Pythonで日本企業の株価を取得してグラフにする

## jsmのインストール

```
$ pip install matplotlib pandas
$ pip install jsm
```

## スクリプトの作成

取得したい企業の番号に入れ替えてください。
今回は私の所属企業（古河電工 5801）でやってみます。

```python:get_stock_price.py
import datetime
import jsm

q = jsm.Quotes()

start_date = datetime.date(2012, 1, 1)
#end_date = datetime.date(2015, 12, 1)

c = jsm.QuotesCsv()
c.save_historical_prices('finance5801.csv', 5801, jsm.DAILY, start_date)
```

```python:plot_stock_price.py
import matplotlib.pyplot as plt
import pandas as pd

fig = plt.figure(figsize=(6,4))
name =['date', 'open', 'high', 'low', 'close', 'volume', 'adj_close']
df = pd.read_csv('finance5801.csv', names=name, parse_dates=['date'], index_col='date')
df.head()
df['adj_close'].plot()
plt.title("stock price (furukawa-electric)")
plt.tight_layout()
plt.show()
fig.savefig("stock_furukawa.png")
```

## 実行

```
$ python get_stock_price.py
$ python plot_stock_price.py
```

<img width="400" alt="stock_furukawa.png" src="https://qiita-image-store.s3.amazonaws.com/0/158680/752d3341-2af1-7e63-4aec-75d7cc7d9df9.png">
0814読書会議事録　吉川洋著「人口と日本経済」中公新書

#0814読書会議事録　吉川洋著「人口と日本経済」中公新書
参加者：土井　中里　茅野　福富　重村

#◇概観
##○「人口と日本経済」要旨
全４章。１章で人口問題に対する経済学の捉え方の歴史を俯瞰。２章で日本の人口問題と経済との関係性に言及。３章で平均寿命の伸長について触れる。４章で経済と人間の幸福について考察。
最大のメッセージは「経済成長には人口の増減は関係なく、イノベーションによって引き起こされる」ということ。以上の点を様々な実証データを用いて利用。経済成長とは労働生産性つまり一人あたりのGDPの伸びのこと。だから人口減の日本でも悲観せず、内部留保を投資に回し、イノベーションを模索すべきと主張。今後行うべき具体的なイノベーションや制度設計の内容についての言及はほぼない。

土井さん作成の読書会資料（http://qiita.com/masatodoi/private/97d885da53602d8c1cbe）をベースに自由にテーマを設定し意見を交換した。以下にその内容を記す。

#◇内容
##〇日本経済について
日本で経済成長やイノベーションが大事とされているが、GDPを引き上げるだけのインパクトのあるフロンティアは存在するのか。しないのではないか。
→日本企業の時価総額ランキングを見ると、上位はインフラ系金融系ばかりで純粋なIT企業が少ない。一方世界ではアップル、FBなどのIT企業が上位。IT関連の研究、市場進出の面で日本は出遅れている。人口減少もあり、
→そもそもIT企業とは何か。ソフトウェア（プログラム）を扱う企業。トヨタ・ソフトバンクなどは多少ITに投資しているがまだ不十分。日本のIT関連の研究、環境整備、市場整備はかなり遅れている。

##〇人材の流動性
働き方改革の流れに基づき、人材活用の流動化が労働生産性を向上させるために必要になる。企業にコンサルを行い、高齢者のうち元経営者など高度人材を派遣するマッチングサービスがある
→働き方改革に基づき大事な考え方。しかし現状は高度人財のみに対応した仕組み。その他の高齢者の扱いはどうする。
→その他の人の職能を細分化するのは困難かつ、経営者側も解決したい問題及び必要な職能を意識できていない。難しい問題である。
→職能給を導入すると、必要とされる人材とそうでない人が明確になり格差広がる。また労働者側も不断の自己研鑽を必要とされ、弱肉強食の厳しい社会へ。やはりベーシックインカムか？

##〇日本は経済成長すべきか
日本の少子高齢化、ITでの出遅れは決定的。国際社会で影響力を持てるよう再興することを考えるより、国民の幸福度を保ちつつ軟着陸（華麗なる衰退）の方法を探すべきでは。東洋的な分をわきまえた思想だ。
→現状のままでは国家収支赤字がやばい。いずれ破綻し円の信用がなくなる。すると資源食料の輸入が滞り国民生活が崩壊。
→円がだめになると他の通貨も影響が大きいため、国際金融機関が介入し助けてくれる？いずれ日本円は崩壊。ビットコイン買っとくべき。

##〇イノベーションについて
少子高齢化社会の中ではイノベーションで経済成長を促す必要があるが、イノベーションは多様性と流動性の中から生まれる。しかし、職能主義に基づく多様性や流動性は格差を生みだす。
→そこで公平な分配のためのベーシックインカムが必要となる。しかし、一人月５万で年６０万。1億2000万人かけて７２兆。社会保障支出が３５兆なので全然足りない？
→ブレグマンの議論（https://newspicks.com/news/2407237）が興味深い。

##〇情報統制について
マスコミなどによりかなり印象操作、情報統制がなされている。ユーチューバーの影響力がすごい！
→自分で様々な媒体から情報を取捨選択しつつ得ることが大事ではないか。テレビや新聞などだけではかなりバイアスがかかった状態で報道がなされている。選挙などにおいても簡単に人々はメディアに操られるのでは。
→トランプ大統領誕生においてはヒラリー寄りのメディアの報道より民衆の力が勝った。時と場合による？　（参考：https://newspicks.com/news/1888670）おすすめの情報収集はツイッター、FBなどのSNSを利用すること。本を読んで信頼に値すると判断した人物の発言をチェックすること。

〇移民の是非について
　労働力の維持を考えると移民は受け入れる必要性が高い。今後必ず議論にのぼる話題。人材の流動性も重要になってくる。
→スウェーデンでは「移民」が悪いのではなく、「悪いことをする移民」を憎んでいる。現在は人権意識等の教育で移民に対する人々の考えは問題化していないが、実際治安問題などは発生している。今後の経過によってはアメリカのようなナショナリズムが台頭するかも。
→カントリー・ネーション・ステートが重なる土地ではナショナリズムが顕在化しやすい。日本はかなり移民に抵抗があるのでは。また、必ず双方で格差が広がり、問題は発生する。
→教育や環境整備を通じていつか互いに受け入れあう日がくるのでは。最初は軋轢が生じるであろう。

##〇何のために生きるか
そもそも何を目指して我々は物事を考えているのか。自分の将来のキャリアのため、自分の快適な社会環境の獲得のため、理想の人間像を体現するため、周囲の人間に快さを得てもらうため？　
→周囲の人間の満足を考えると万人が快く暮らせる仕組み作りを優先。個人の価値観が自分中心に幸せを感じるか他人中心に幸せを感じるかで対立。

#◇まとめ
##〇次回に向けて
今後は対外的な発信もしたい。そこでFBでグループを作り、活動内容を発信する。その際、議事録、参加者の感想、写真等を共有し、ほかのメンバーの参加を募る。また、次回参考図書の選定はジャンルのみ全員で考察し、担当者が決定権を持つ。

現在考えているのは「金融」「貨幣価値」「ビットコイン」「経済」などについて。次回図書決定者は土井さん。

#◇感想
重村：自身は「日本経済をどう立て直すか、その際に必要な公平な再配分の制度設計はどのようなものか」について


会の目的：
本を選んだ理由：
問題意識を共有を
ebiten と go-box2d-lite を組み合わせてみる

2Dの物理エンジンとして [Box2D](http://box2d.org/) が有名ですが、その軽量版である Box2D-lite の Go言語版 [go-box2d-lite](https://github.com/neguse/go-box2d-lite) があったので、ebiten と組み合わせてみました。

## コード
go-box2d-lite のリポジトリに[使用例のコード](https://github.com/neguse/go-box2d-lite/blob/master/examples/main.go)がありますが、こちらは [go-sdl2](https://github.com/veandco/go-sdl2) を使用しています。
これを、そのまま ebiten を使うように書き換えてみます。

- 全体の差分は以下
	- https://github.com/zenwerk/ebiten-example/commit/141fd83be850e7a89b0be12204edc3c13480d31f


書き換えで一番難しいところは go-box2d-lite の組み込みより、サンプルで使われている[画面に線を描画するSDLのメソッド](https://github.com/neguse/go-box2d-lite/blob/master/examples/main.go#L507-L510)に対応するものが ebiten には無く、これをどうしようかと四苦八苦していたのですが、

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr"><a href="https://t.co/hjyEt7OipV">https://t.co/hjyEt7OipV</a> Added DrawLine and DrawRect. These are intended to be used for prototyping. Don&#39;t expect too much.</p>&mdash; Hajime Hoshi (星一) (@hajimehoshi) <a href="https://twitter.com/hajimehoshi/status/896759693258833920">August 13, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

とのことで、`ebitenutil.DrawLine` というメソッドが追加されたので簡単に書き換えることができました。

## 実行結果

![box2dlite.gif](https://qiita-image-store.s3.amazonaws.com/0/4428/bafec743-d1e9-e800-9781-bca266a10a80.gif "box2dlite.gif")

サンプルを書き換えただけですが、物理エンジンは色々と夢が広がっていいなーと思いました。

## 課題
- オリジナルのサンプルコードの描画の座標系が独特なので、素直なXY座標指定に書き直したい
- `ebitenutil.Drawline` はあくまでプロトタイプ用途のメソッドなので、これをそのまま本番稼働には使用しないほうが良さそう
	- そのため実際のゲームでは、使用する画像素材のXY座標と go-box2d-lite の Body や Joint 構造体のXY座標を上手く対応させる仕組みが必要になる
MoPubを使ってタイムラインに広告を表示

以前作成したTwitter Kitを使ってタイムライン表示を行うアプリに広告を表示する方法です。

以前の記事
[Twitter Kitを使ったタイムライン表示](http://qiita.com/kyam_lab/items/41a8dc0055c3a5d434f7)

このコードに追加していく前提で記載しています。

![timeline_with_mopub.png](https://qiita-image-store.s3.amazonaws.com/0/42311/731c9a6d-452c-4fab-b743-382851621863.png)

#大まかな流れ
1. MoPubにアプリを登録し、Ad Unit IDを取得
2. dependencyにtwitter-mopubを追加
3. TwitterMoPubAdapterを追加

#1.MoPubにアプリを登録し、Ad Unit IDを取得
MoPubでアカウントを作成し、アプリケーションの追加を行って下さい。
(既にアカウントを持っている場合はダッシュボードで追加してください)
この時、"Add Ad Unit"のFormatはNative(Custom layout)を指定してください。

![mopub_add_app_mini.png](https://qiita-image-store.s3.amazonaws.com/0/42311/7dd807c4-246c-f5ca-b83d-51d5c1baeeaa.png)

#2.dependencyにtwitter-mopubを追加

dependencyにmopubを追加します。
build.gradleに下記を追加してください。

```as:build.gradle(app)
compile('com.twitter.sdk.android:twitter-mopub:3.1.0@aar') {
      transitive = true;
}
```

メモ
上記のdependencyを追加しなくても広告が表示できたという報告もいただいています。
私の環境では追加しなければビルドできなかったので、追加しておくのが無難かと思います。

#3.TwitterMoPubAdapterを追加
TimeLineActivityを下記のように編集します。
1.で取得したAd Unit IDはここで使用します。

```java:TimeLineActivity
public class TimeLineActivity extends ListActivity {
    private MoPubAdAdapter moPubAdAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_time_line);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        final SearchTimeline searchTimeline = new SearchTimeline.Builder()
                .query("#猫")
                .build();
        final TweetTimelineListAdapter adapter = new TweetTimelineListAdapter.Builder(this)
                .setTimeline(searchTimeline)
                .build();

        moPubAdAdapter = new TwitterMoPubAdAdapter(this, adapter);
        final TwitterStaticNativeAdRenderer adRenderer = new TwitterStaticNativeAdRenderer();
        moPubAdAdapter.registerAdRenderer(adRenderer);
        moPubAdAdapter.loadAds("Ad Unit ID");

        setListAdapter(moPubAdAdapter);
    }

    @Override
    public void onDestroy(){
        moPubAdAdapter.destroy();
        super.onDestroy();
    }
}
```

これでタイムライン上に広告が表示されるようになります。

**要検証**
自分用のメモの意味も込めて。
一番上に表示される広告のみ、広告へとぶボタンをタップしても広告元へとべなかったため、原因を調査中です。


本記事のソースコードはGitHubにアップロードしてあります。
https://github.com/kyam3235/TwitterAppByTwitterKitWithMopub

#参考
[Monetize With MoPub](https://dev.twitter.com/twitterkit/android/monetize-with-mopub)
[React Native] 開発中のホットリロードをiOSとAndroidで同時に行う

# ご注意
※以下はReact Nativeの旧バージョンでの情報です。React Native最新版では使えないかもしれません。

# はじめに
React Native開発において、iOSとAndroidの２つのシミュレータで同時にHot Reloadingを実行させる手順のメモ。

## 環境
- React: 16.0.0-alpha.12
- React Native: 0.46.2
- NodeJS: 7.8.0 
- Xcode: 8.3.3
- Android Studio: 2.3.3


# 背景
React Nativeで、iOS・Android共通のコードでUIを開発している時、それぞれのシミュレータで同時にコードの反映結果を確認したい。
例えば、自分がViewについて行った変更について、Android (or iOS)のみレイアウトが崩れることがないかどうかを簡単に知りたい。

React NativeにはHot Realodingという便利な仕組みがある。ところが以下のコマンドを順番に実行しただけでは、それが両OSのシミュレータで同時に実行されない（片方では動く）。

```
$ react-native run-android
```

```
$ react-native run-ios
```

以下の手順で、両OSのシミュレータで同時にHot Reloadingを実行することが出来た。

# 手順
## Android
いつも通り、シミュレータを立ち上げ、以下のコマンドを実行する。
（ここで、packegerを実行するポートとして`8081`が使われる。）

```
$ react-native run-android
```

Androidのシミュレータにて、`cmd + m`で設定を呼び出す。`Enable Hot Reloading`を選択し、ホットリロードを有効にする。

## iOS

packegerを実行するポートとして、`8082`を使うことにする。
以下のように、iOSのプロジェクトファイルを書き換えておく。

```objc:AppDelegate.m
#if !(TARGET_IPHONE_SIMULATOR)
  jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#else
//  jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];
  jsCodeLocation = [NSURL URLWithString:@"http://localhost:8082/index.ios.bundle?platform=ios&dev=true"];
#endif

```

ポートを指定して、packagerを起動する。

```
$ react-native start --port=8082
```

Xcodeでシミュレータを選んで、`cmd + r`でRunする（ターミナルで`$ react-native run-ios`しても上手くいかず）。

iOSのシミュレータにて、`cmd + ctr + z`で設定を呼び出す。こちらもホットリロードを有効にする。


# 動作確認
React Nativeプロジェクトで適当なファイルの内容を変更し、ファイルを保存する。
iOSとAndroidそれぞれのシミュレータの画面で、"Hot Loading..."が表示され、即座に変更が反映されればOK。

# さいごに
iOSのコードを書き換えないといけないのが煩雑か。もっと簡単な方法があったら知りたいです。

# 参考
- [Introducing Hot Reloading](https://facebook.github.io/react-native/blog/2016/03/24/introducing-hot-reloading.html)
- [React IOS & Android simultaneous device development · ethercreative/react-native-tips Wiki](https://github.com/ethercreative/react-native-tips/wiki/React-IOS-&-Android-simultaneous-device-development)
- [iOS/Android simultaneously, live/hot reload... - React Discuss](https://discuss.reactjs.org/t/ios-android-simultaneously-live-hot-reload/4015)
- [react-native: hot-loading on two devices simultaneously in development - Stack Overflow](https://stackoverflow.com/questions/37368275/react-native-hot-loading-on-two-devices-simultaneously-in-development)
iOS 11 更新情報

Appleから提供されている情報をまとめておきます。

* [WWDCの動画](https://developer.apple.com/videos/wwdc2017/)
* [What's New in iOS](https://developer.apple.com/library/content/releasenotes/General/WhatsNewIniOS/Articles/iOS_11_0.html)
* [API Diff](https://developer.apple.com/documentation?changes=latest_minor)
Spring Bootで変数名にスネークケースを使ってはまったこと

以下の記事は下記の条件のものになります

```text:環境
Java：1.8
WebFramework：SpringBoot1.5.4
DB：MySQL
```

```text:テーブル
id int
name varchar
regist_date Date
```

Spring BootでfindAllを使ってDBからデータを取得する際のソート条件に`regist_date`を追加したところで下記のエラーが発生した。
```
No property regist found for type Entityのクラス名 with root cause
```


原因としては、Entityクラス内での変数名にスネークケースを使っていたことでした。
39行目のDELIMITERSに従って、259〜265行で`regist`と`date`に分割されてしまうことで
ソート時の条件指定でエラーが発生します。

```java:org.springframework.data.mapping.PropertyPath.java
39.	private static final String DELIMITERS = "_\\.";
40.	private static final String ALL_UPPERCASE = "[A-Z0-9._$]+";
41.	private static final Pattern SPLITTER = Pattern.compile("(?:[%s]?([%s]*?[^%s]+))".replaceAll("%s", DELIMITERS));

（省略）

253.	public static PropertyPath from(String source, TypeInformation<?> type) {
254.
255.		Assert.hasText(source, "Source must not be null or empty!");
256.		Assert.notNull(type, "TypeInformation must not be null or empty!");
257.
258.		List<String> iteratorSource = new ArrayList<String>();
259.		Matcher matcher = SPLITTER.matcher("_" + source);
260.
261.		while (matcher.find()) {
262.			iteratorSource.add(matcher.group(1));
263.		}
264.
265.		Iterator<String> parts = iteratorSource.iterator();
```

対策としては、スネークケースで書いていたところをキャメルケースに直したとなります。
エラーをみた時点でなんとなく察してはいたものの、

- 変数名をカラム名とあわせたい
- 原因がはっきりしていないのに方針を変更したくない

ということで調査しました。



あと、カラム名をキャメルケースにすれば変数名をあうのでは？
（SpringBootにおけるhibernateのNamingStrategyをEJB3NamingStrategyに変更する必要ありますが[未検証]）
という意見あるかもしれませんが、カラム名はスネークケースがいいのでこのままで


参考
[【追記修正】Spring Boot JPAでTableアノテーションを使ってテーブル名を指定する時の注意事項](http://mao-instantlife.hatenablog.com/entry/2015/07/29/JPAで？Tableアノテーションを使ってテーブル名を指)