OmniAICreator/Qiita-1.07M huggingface dataset:
backlog API を使う②　～backlogの課題にコメントをする～

#1、環境
php4.5
windows7
#2、「課題コメントの追加」apiを使用する為に必要な情報

**公式サイト**
https://developer.nulab-inc.com/ja/docs/backlog/api/2/add-comment/

**メソッド**

```ruby:
POST
```

**URL**

```ruby:
/api/v2/issues/:issueIdOrKey/comments 
```



backlogの課題にコメントをする為に最低限必要な情報は、以下となります。

|パラメーター名 |内容|
|:-----------------|:------------------|
| apiKey             |APIキー（[backlog API を使う①](http://qiita.com/d2cdot-mmori/items/56c6abc1526fc2b13aef)参照）|
| issueIdOrKey        | コメントしたい課題番号 |
| content           | コメント内容 |


追加で以下も設定可能です。
次回以降使い方を書こうと思います。

|パラメーター名 |内容|
|:-----------------|:------------------|
|notifiedUserId[]|コメント登録の通知を受け取るユーザーID（[backlog API を使う③](http://qiita.com/d2cdot-mmori/items/d2697778b6765d994bd1)参照）|
|attachmentId[]|添付ファイルの送信APIが返すID（[backlog API を使う⑤](http://qiita.com/d2cdot-mmori/items/5dbc6664a6c11932da27)参照）|

#3、issueIdOrKeyとは何にあたるのか
課題番号のことです。

```ruby:例
HOGE-12
```
ブラウザのurl上では、以下のように見えている部分となります。

```ruby:例
https://xxx.backlog.jp/view/HOGE-12
```

#4、コード
```ruby:例
<?php
/**************************
* backlogの課題にコメントを送信する
***************************/
$issueIdOrKey = "HOGE-12"; // コメントしたい課題番号
$backlog_api_key = "作成したAPIキー";
$comment = "コメント";

$comment_url = "https://xxx.backlog.jp/api/v2/issues/".$issueIdOrKey."/comments?apiKey=".$backlog_api_key;
$params = array(
  'content' => $comment
);
$comment_url = $comment_url . "&".http_build_query($params, "", "&");
$comment_headers = array('Content-Type: application/x-www-form-urlencoded');
$context = array('http' => array(
  'method' => 'POST',
  'header' => $comment_headers,
  'ignore_errors' => true
));
$response = file_get_contents($comment_url, false, stream_context_create($context));

```
#5、レスポンス例
```ruby:成功時レスポンス例
{
  "id":1169932xxx,
  "content":"コメント",
  "changeLog":[],
  "createdUser":
    {
      "id":1073766xxx,
      "userId":"mori",
      "name":"バックログのユーザー名",
      "roleType":2,
      "lang":null,
      "mailAddress":"xxxx@xxxx.co.jp",
      "nulabAccount":null
    },
  "created":"2017-06-22T06:15:40Z",
  "updated":"2017-06-22T06:15:40Z",
  "stars":[],
  "notifications":[]
}
```

```ruby:失敗時レスポンス例
{
  "errors": [
    {
      "message": "Undefined resource. /api/v2/HOGE-12/comments",
      "code": 6,
      "moreInfo": ""
    }
  ]
}
```

成功すれば、バックログの課題にコメントが確認できると思います！

以上です。
backlog API を使う①　～APIキーの登録・認証方法～

#1、経緯
プログラムで実行した結果やエラー時にバックログにコメントできたらな・・・と思い、
backlog APIを調査してみました。

#2、APIキーの登録
backlog API を使用するには、APIキーの登録が必要です。
http://www.backlog.jp/help/usersguide/personal-settings/userguide2378.html

#3、API キーを付加して認証する
https://developer.nulab-inc.com/ja/docs/backlog/auth/
先ほど取得したAPI キーをパラメータ名 “apiKey” として付加することで認証が行えます。

```ruby:api例
https://xx.backlog.jp/api/v2/users/myself?apiKey="発行されたapiキー" 
```

意外と簡単！
外付けHDD(NTFS)をオートマウントしてバックアップをとる



CentOS7で、NTFS形式のHDDに、定期的に/data以下のバックアップをとりたい


### yum install

```
yum -y install rsync autofs ntfs-3g
```

### autofsの設定

/mnt/usbhdがマウントポイント
/dev/sdb1が外付けHDD

```
$ cat /etc/auto.master 
/mnt /etc/auto.home --timeout 60

$ cat /etc/auto.home 
usbhd     -fstype=ntfs-3g    :/dev/sdb1
```

/mnt/usbhdへのアクセスがあれば自動的に外付けHDDをntfs-3gを用いてマウントする
60秒間アクセスがなかった場合、自動でアンマウントする


### シェルスクリプトの作成

```backup.sh
ls /mnt/usbhd
rsync -auv --iconv=CP932,UTF-8 /data/* /mnt/usbhd/
```

lsコマンドでもcdコマンドでも、お好きなもので
今回文字コードの変換が必要だったため、iconvオプションを使っている
iconvオプションを使うと、更新されていないファイルも上書きしようとする
コピー元に*をつけると挙動が変わるそう
詳しくはわからないので、分かる方いらっしゃいましたらご教授ください


### crontab設定

毎日0時0分にバックアップを取るように設定

```
$ crontab -e
0 0 * * * sh backup.sh
```
Mathematicaの特性メモ

このタイミングで発覚するとかやめてほしい。

# 文字色など

- ファイル名に色を付けるとパスとして認識されない
- 四則演算子に背景色を付けると演算子として認識されず、前後の項がかけあわさる事がある

**できるだけ色変えはしないようにしましょう。**

# プロット

- PlotLabelがデータ領域にかぶって出力される場合は以下を試す
  - その上に出力されている内容を出力しない
  - ラスタライズする
- RegionPlotと他のグラフをShowで重ねると謎のメッシュが入る場合
  - 重ねる順番を変えられるならば、入れ替えてみる
  - `Overlay[{plot1,plot2,...}]` を試してみる
pythonでfreezegunを使って現在時刻を含む関数を単体テストする方法


こんにちはsekitakaです。

今日は`datetime.now()`を使用している関数をテストする方法を紹介します。

たとえば次のようなプログラム実行時の次の日を"YYYYMMDD"の文字列を返す関数を作って、その関数をテストしたいとします。

```python
def get_tomorrow():
    now_datetime = datetime.now()
    tomorrow_datetime = now_datetime + timedelta(days=+1)
    tomorrow = tomorrow_datetime.strftime("%Y%m%d")
    return tomorrow
```

# テスト方法
## 案1
まず簡単に以下のテストコードを書いてみました。しかし見て分かる通り、テストの実行を2017/6/22に行う場合のみ成功します。
これではCIで毎日テストを実施した時にエラーになってしまいます。

```python
class Test(TestCase):
    def test_get_tomorrow(self):
        self.assertEqual("20170623", get_tomorrow())
```

## 案2
次に考えたのは期待する値を動的に生成するものです。これならいつテストしてもテストをパスします。
しかし実はget_tomorrowと実質的に同じコードを書いており、テストになっていないような気もします。

```python
class Test(TestCase):
    def test_get_tomorrow(self):
        expect_tomorrow = (datetime.now() + timedelta(days=+1)).strftime("%Y%m%d")
        self.assertEqual(expect_tomorrow, get_tomorrow())
```

## 案3
そこで`datetime.now()`をMock化して、任意のdatetimeを返す状態にして`get_tomorrow`を実行すれば良いのではないかと考えました。そして書いたのが次のコードです。

```python
from mock import Mock
class Test(TestCase):
    def test_get_tomorrow(self):
        datetime.now = Mock(return_value=datetime(year=2017, month=1, day=1))
        self.assertEqual("20170102", get_tomorrow())
```

期待して実行したところ、ビルトインのdatetimeにattributeをセット出来ないらしく実行できませんでした。

```
TypeError: can't set attributes of built-in/extension type 'datetime.datetime'
```

## 案4(答え)
困っていたところ[freezegun](https://github.com/spulec/freezegun)というdatetimeモジュールをモック化するライブラリを発見しました。

```python
from freezegun import freeze_time
class Test(TestCase):
    @freeze_time("2017-01-01")
    def test_get_tomorrow_4(self):
        self.assertEqual("20170102", get_tomorrow())
```

`@freeze_time("2017-01-01")`の記述によって現在を2017/1/1に固定しています。
よって`get_tomorrow()`は常に`"20170102"`を返すことになり、いつテストを実行しても成功することになります。
freeze_timeする日を変更すれば年跨ぎやうるう年で正常にプログラムが動作するかなども確認できそうで便利ですね。


# まとめ
いかがでしたでしょうか。pythonの`datetime.now()`に依存する関数のテスト方法を紹介しました。
単体テストも一度実行して終わりでなく、CIを回すならいつ実行してもいいようにテストケースを作っておく必要があるのですね。
これからもテスト手法について学んでいきたいと思います。
jQueryUIのDraggableとDroppableで枠にぴっちりハマるBOXをつくる

jQueryUIのDraggableとDroppable、便利ですがDraggableとDroppableの大きさが同じ場合に
Snapオプションを指定してもぴっちりハマらない。
Revertオプションを指定してもカーソルがDroppable要素の中に入ってさえいれば、許可されてしまうので中途半端な位置に要素がDropされちゃうことがある。
[参考：jQueryUI公式のデモ](http://jqueryui.com/droppable/#revert)

![no.png](https://qiita-image-store.s3.amazonaws.com/0/173132/20e39b99-f549-192d-1c61-e4131991e1d0.png)
こういう状態を許したくない

---

以下のような記述でぴっちりするBOXを作れます。
###draggable側のオプション

```js
  $(".draggable").draggable({
    snap: ".snaptarget", /* ターゲットにスナップする */
    snapMode: "inner",   /* 内側にスナップする */
    revert: "invalid"    /* Droppableな要素以外にDragされた場合、元の位置に戻る */
  });
```


###droppable側のオプション

```js
$(".snaptarget").droppable({
    drop: function(event, ui) {
     var $srcObj = $(ui.draggable[0]);
     $srcObj.offset($(this).offset());
     return false;
    }
  });
```

###デモ
[CODEPEN](https://codepen.io/noixip/pen/qjqYVw)
Ruby on Rails エラーめも

# エラー

## ActionController::UnknownFormat in xxController#xx
<img width="1232" alt="スクリーンショット 2017-06-17 13.16.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/176100/b1abc70a-60a3-1ed8-b8f4-568264466735.png">

テンプレートがない。
今回はviews/orders下にindex.html.hamlがなかったのが原因。
該当する場所に適切な名前のビューを作れば解決。




## Syntax unexpected keyword_ensure, expecting end-of-input
<img width="1280" alt="スクリーンショット 2017-06-19 12.40.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/176100/65cd647b-8122-06f1-d159-cfd4517665c2.png">

railsの埋め込みに文法ミスあり。
フォームや繰り返し処理など、複数行にわたるもの。

原因：
```form_for```の```do |f|```忘れ。

## ActiveRecord::StatementInvalid in Devise::RegistrationsController#create

![image](https://qiita-image-store.s3.amazonaws.com/0/176100/d5c5ff9a-71dc-3e38-a6af-ac8f4efed62e.png)

"Field 'name' doesn't have a default value"とな。
アカウント新規登録画面で「アカウント作成」をクリックしたらエラー。URLは'/users'。
このURLは間違いだからここのリダイレクトは直さなあかんけど、それ以前のエラー(DB絡み)な気がする。

キター！！これだ原因。

原因：
deviseでは初期状態でサインアップ時にメールアドレスとパスワードのみを受け取るようにストロングパラメーターが設定してあるので、<b>追加したキーのパラメーターは許可されていません。</b>追加のパラメーターを許可したい場合は、```application_controller```において```before_action```に```configure_permitted_parameters```メソッドを設定します


```ruby:例：sign_upアクションに対してnicknameというパラメータを追加で許可する
  class ApplicationController < ActionController::Base
    # Prevent CSRF attacks by raising an exception.
    # For APIs, you may want to use :null_session instead.
    protect_from_forgery with: :exception
    before_action :configure_permitted_parameters, if: :devise_controller?

    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname])
    end
  end
```


## ActionController::InvalidAuthenticityToken
![image](https://qiita-image-store.s3.amazonaws.com/0/176100/045b1694-ac08-3d55-390f-29fa93b8380c.png)

なにこれ、初めて見た…
[Rails4のCSRF対策で「Can't verify CSRF token authenticity」エラー](http://qiita.com/chobi9999/items/2b59fdaf3dd8f2ed9268)が参考になります。
Railsは外部からのリクエストをはじくようにできてるらしい。

解決策

```ruby:
class ProductsController < ApplicationController
  protect_from_forgery except: :search # searchアクションを除外
  def index
  end

  def search
    @products = Product.where('name LIKE(?)', "%#{params[:keyword]}%")
    redirect_to 'index'
  end
end
```


## undefined method `pry'
![image](https://qiita-image-store.s3.amazonaws.com/0/176100/da8549ad-9933-f00a-6734-89be4b4745a7.png)

解決策
1. gem 'pry-rails' をインストール
2. サーバー再起動(忘れずに！)



## First argument in form cannot contain nil or be empty
![image](https://qiita-image-store.s3.amazonaws.com/0/176100/a0f576d1-1396-1909-a239-1a25de0d59f4.png)

原因
order_detailオブジェクトが生成されていないから、"nil"は引数に取れないよ〜って言われてる。

解決策
この画面を呼ぶアクションで、事前に```@order_detail = OrderDetail.new```など、空のオブジェクトを生成しておく。
【pyenv】ubuntu16.04でのpython環境の構築

## 背景
- tensorflowをubuntuで動かしてぇ！
- でも、python2系のコードを使ってる！！
- じゃあ、pyenvで複数バージョンを入れるっきゃねぇ！！！

で、『本記事に至る』

## pyenvのインストール

```bash
sudo git clone git://github.com/yyuu/pyenv.git ./pyenv
```

## [pyenv] PATHの設定
```
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
```

## pythonのインストール
```zsh
banaoh@ubuntu-dlw:~$ pyenv install 3.6.1

Downloading Python-3.6.1.tar.xz...
-> https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz
Installing Python-3.6.1...

BUILD FAILED (Ubuntu 16.04 using python-build 1.1.1-1-g734e40d)

Inspect or clean up the working tree at /tmp/python-build.20170621142635.19271
Results logged to /tmp/python-build.20170621142635.19271.log

Last 10 log lines:
    ensurepip._main()
  File "/tmp/python-build.20170621142635.19271/Python-3.6.1/Lib/ensurepip/__init__.py", line 189, in _main
    default_pip=args.default_pip,
  File "/tmp/python-build.20170621142635.19271/Python-3.6.1/Lib/ensurepip/__init__.py", line 102, in bootstrap
    _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
  File "/tmp/python-build.20170621142635.19271/Python-3.6.1/Lib/ensurepip/__init__.py", line 27, in _run_pip
    import pip
zipimport.ZipImportError: can't decompress data; zlib not available
Makefile:1064: recipe for target 'install' failed
make: *** [install] Error 1
```

- zlibがないと言われるのでインストール

```sh
sudo apt-get install zlib1g-dev
```

- もういっちょインストール

```zsh
banaoh@ubuntu-dlw:~$ pyenv install 3.6.1

Downloading Python-3.6.1.tar.xz...
-> https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz
Installing Python-3.6.1...
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems


BUILD FAILED (Ubuntu 16.04 using python-build 1.1.1-1-g734e40d)

Inspect or clean up the working tree at /tmp/python-build.20170621143006.3222
Results logged to /tmp/python-build.20170621143006.3222.log

Last 10 log lines:
                upgrade) ensurepip="--upgrade" ;; \
                install|*) ensurepip="" ;; \
        esac; \
         ./python -E -m ensurepip \
                $ensurepip --root=/ ; \
fi
Collecting setuptools
Collecting pip
Installing collected packages: setuptools, pip
Successfully installed pip-9.0.1 setuptools-28.8.0
```

- 『Missing the OpenSSL lib』ってエラーが出てるので、libsshをインストール

```sh
sudo apt-get install libssl-dev
```
- 『pyenv install 3.6.1』 動いた！！！

## pythonのバージョンの確認、バージョンの切り替え
```sh
banaoh@ubuntu-dlw:~$ python --version
Python 2.7.12

banaoh@ubuntu-dlw:~$ pyenv global 3.6.1
banaoh@ubuntu-dlw:~$ python --version
Python 3.6.1
```
スマホやデジカメで撮影した写真のファイル名を撮影日に変換する


写真の整理をしているときにスマフォやデジカメなどから写真を集めると
ファイル名が統一されていなかったりと気持ち悪いので、
ファイル名を撮影日にして管理したいと思い調べたときのメモ


JPEGの場合、jheadコマンドを利用して撮影日の取得とファイル名の置換を行えるっぽい

## Macにインストールする

```
brew install jhead
```

## ファイル名のメタデータを確認する

```
jhead ファイル名
```

## ファイル名を置換する

```
jhead -nf%Y-%m-%d-%H%M%S ファイル名
```

## フォルダ配下のファイル名を一斉置換する

```
find . -type f -name "*jpg" | xargs jhead -nf%Y-%m-%d-%H%M%S
```

## 参考

- [jhead コマンド 2014/05/10](https://hydrocul.github.io/wiki/commands/jhead.html)
Rで作るシェルピンスキーのギャスケット（三角形）

# 最新の更新
コードの美しさを犠牲に「三角形をくり抜いて作っていく」仕様の獲得と画像出力時の余分な目盛りなどの削除を行った。

```r:main
Sierpinski.gasket <- function(x=3) {    # x = depth
    plot(0,0,main="Sierpinski gasket",xlab=" ",ylab=" ",xaxt="n",yaxt="n")
    y <- c(0,1,-1,-1,1,-1)              # Set the position
    polygon(c(y[1],y[3],y[5]),c(y[2],y[4],y[6]),col="gray")
    if(x > 0) {
        Sierpinski.gasket.triangle(x-1,y)
    }
}
```

### 上記で使用している関数（サブルーチン）

```r:sub
Sierpinski.gasket.triangle <- function(x,y) {
    xy <- c((y[1]+y[3])/2,(y[2]+y[4])/2,(y[1]+y[5])/2,(y[2]+y[6])/2,(y[3]+y[5])/2,(y[4]+y[6])/2)
    polygon(c(xy[1],xy[3],xy[5]),c(xy[2],xy[4],xy[6]),col="white",border=F)
    if(x > 0) {
        Recall(x-1,c(y[1],y[2],xy[1],xy[2],xy[3],xy[4]))
        Recall(x-1,c(xy[1],xy[2],y[3],y[4],xy[5],xy[6]))
        Recall(x-1,c(xy[3],xy[4],xy[5],xy[6],y[5],y[6]))
    }
}
```
![Sierpinski gasket_triangle.png](https://qiita-image-store.s3.amazonaws.com/0/188393/fc4e4a07-ac67-efce-09ce-97c9166e52ff.png)

---

## 一つ前のバージョン
変数xは自然数のみ有効となり、描画する。
Wikipediaによると正確には「三角形をくり抜いて作っていく」もののようだが、
前回のプログラムは三角形の外線のみを描いている。

```r:main(old)
Sierpinski.gasket <- function(x){    # x = depth
    plot(10,10)                      # Make a drawing space
    y <- c(10,14,6,6,14,6)           # Set the position
    if(x>0){
        Sierpinski.gasket.triangle(x-1,y)
    }
}
```

#### 上記で使用している関数（サブルーチン）

```r:sub(old)
Sierpinski.gasket.triangle <- function(x,y){
    polygon(c(y[1],y[3],y[5]),c(y[2],y[4],y[6]))
    y1 <- c(y[1],y[2],(y[1]+y[3])/2,(y[2]+y[4])/2,(y[1]+y[5])/2,(y[2]+y[6])/2)
    y2 <- c((y[1]+y[3])/2,(y[2]+y[4])/2,y[3],y[4],(y[3]+y[5])/2,(y[4]+y[6])/2)
    y3 <- c((y[1]+y[5])/2,(y[2]+y[6])/2,(y[3]+y[5])/2,(y[4]+y[6])/2,y[5],y[6])
    if(x>0){
        Recall(x-1,y1)
        Recall(x-1,y2)
        Recall(x-1,y3)
    }
}
```
![Sierpinski_gasket_triangle.png](https://qiita-image-store.s3.amazonaws.com/0/188393/b1c5d0e1-e9c5-a55d-727f-5d007615c4a4.png)


深度の変更機能を維持したまま、もっと簡略に書けないものだろうか。
Pythonのクラス変数とインスタンス変数

Pythonでクラス変数を定義するには、クラス名の下に変数を宣言するよということになっている。公式ドキュメントでそのように書かれている。

https://docs.python.jp/3/tutorial/classes.html#class-and-instance-variables

```python:sample.py
   class Sample:
     name = 'name'
   
   s  = Sample()
   s2 = Sample()
   
   print(s.name) # 'name'
   print(s2.name) # 'name'
```

当たり前ですが、どちらも「name」と表示される。

でも、こんな感じでnameを変更した場合、クラス変数ではなくなってしまう。

```python:sample.py   
   s  = Sample()
   s2 = Sample()
   
   s.name = 'aaaa' 
   
   print(s.name) # 'aaaa'
   print(s2.name) # 'name'
```

これを実行すると、`s.name`はaaaaで`s2.name`はnameと表示される。全てのオブジェクトでシェアされるのであれば、s2.nameも`aaaa`に変わらなければならないはず。

答えとしては文字列はイミュータブルなので、オブジェクトを経由して参照すると自動的にインスタンス変数を作ってくれるということなんだろうか。

でも、`Sample.name`にしてみたら、どちらもaaaaに変わった。クラス変数としての特性を持っている。参照元がクラスなのかオブジェクトなのかで、空気読んで解釈しているのかな？

配列や辞書型はミュータブルなので、下記を実行すると変更が伝搬され、どちらのprintも`[1,2,3,4]`と表示される。同じものを指しているから当たり前。

```python:sample.py   
   class Sample:
     a_list = [1,2,3]
   
   s  = Sample()
   s2 = Sample()
   s.a_list.append(4)
   print(s.a_list)  # [1,2,3,4]
   print(s2.a_list) # [1,2,3,4]
```

## 強引にまとめると

イミュータブルはクラスの下に宣言しても自動的にインスタンス変数に切り替わってくれて、ミュータブルはクラス変数のままである、という話でいいのかなこれ。原則、共有するよ。でも、イミュータブルなデータはオブジェクトを経由してアクセスするとインスタンス変数になるよ。

こんな仕様なのかなぁ。
ActiveRecordのConnection管理


4.2.x 系で調査。5.x系でかわっているかもしれない（おえてない）

## こんな構成

```
ActiveRecord::Core <>--- ConnectionHandler <>--- ConnectonPool
       |
       | include
       v
ActiveRecord::Base 
```

## ConnectionHandler

コネクション全般を管理する
`ActiveRecord::Core` (Module)で定義されてる `connection_handler` メソッドを使うと取得可能

```ruby:ConnectionHandlerの取得
ActiveRecord::Base.connection_handler
```

おもな役割はコネクションプールの管理

* アプリケーションがもつコネクションプール全体の管理 (`active_connections?`, `clear_all_connections!`, `connection_pool_list`)
* 個々のコネクションプールの作成 (`establish_connection`)
* 個々のコネクションプールの切断 (`remove_connection`)

個々のコネクションプールは **オーナー** をもち、通常は `establish_connection`を呼んだクラスのselfである。
デフォルトのオーナーは ActiveRecord::Base　

## ConnectionPool

個々のコネクションプールは **オーナー** をもつ
ActiveRecord::BaseのコネクションPoolは、database.ymlにある、
Rails.envで定義された設定を使い接続する。

### モデルごとにコネクションプールを作成する
レシーバーがオーナーのコネクションプールを作成する
オーナーがかわることに注意

```ruby:establish_connection
class Hoge < ActiveRecord::Base
  establish_connection adapter: 'mysql2', host:'localhost', username: 'hgoe', password: 'hogehoge'
end
```

100クラスで `establish_connection` を呼ぶと、合計で101個のコネクションプールが作成される。
さらに接続数は101個のコネクションプールのプール数の合計値が上限である。
デフォルト値は 5 なので、最大接続数が505となる可能性がある。

さらに、unicornなどのアプリケーションサーバを使うと、Worker(プロセスxスレッド数)だけ接続される。

### 接続数を抑制する

通常は、デフォルトの接続以外にコネクションをわけたい場合は、抽象クラスを用意する

```ruby:
class SlaveConnectionModel < ActiveRecord::Base
  self.abstract_class = true
  establish_connection adapter: 'mysql2', host:'localhost', username: 'hgoe', password: 'hogehoge'
end

class Hoge < SlaveConnectionModel; end
class Foo < SlaveConnectionModel; end
```

参考

http://d.hatena.ne.jp/raugisu/20120429/1335725405
素人が「ディープラーニングをなんとなくわかっておくか〜」と思って2週間くらいでやったこと

# 概要

素人が急に「ディープラーニングをなんとなくわかっておくか〜（素人）」と思い立って２週間くらい勉強したことを忘れないうちにメモしておきます。なんとなくわかっておくというのは、

- ディープラーニングはどういう仕組みで、どういうことができるのか
- 実際にどういうコードを書けばいいのか
- 精度を上げていくためにどういう工夫をすればいいのか

がわかるというくらいの意味です。

私の前提知識は、Pythonは基本的な文法がわかる程度、数学は微積とか線形代数の基本的な概念や計算法ならなんとなく覚えている程度だったので、似たような感じの人には参考になりやすいかもしれません。下記で、やったMOOCと読んだ本を挙げますが、挙げた順番にやったというわけではなく、けっこう同時並行的に行なっていたような気がします。

# MOOC

### [Practical Deep Learning For Coders, Part 1](http://course.fast.ai/index.html)

CNNとRNNについて丁寧に教えてくれるMOOCです。講師の人の説明が非常にわかりやすいです。この授業でわかるようになることをおおまかに挙げると以下のようになると思います。

- CNN、RNNの考え方
- Kerasの使い方
- AWSでのGPUインスタンスの使い方
- 予測精度を挙げるための工夫のしどころ
- 機械学習のプロみたいな人が具体的にどんな感じで作業してるか

この授業のいいところは自分でディープラーニングのコードを書くことを強制されることです。講義でjupyter notebookが配布されてその簡単な説明があり、次回の講義までにそのnotebookを自分で一から書き直す＋そこそこ大変な課題をやっておくことが推奨されています。kaggleの実際の課題をもとにどうやったら精度が出るのかみたいな感じで話が進んでいくので、やる気が出やすいと思います。

# 本

### [Make Your Own Neural Network ](https://www.amazon.co.jp/Make-Your-Neural-Network-English-ebook/dp/B01EER4Z4G/ref=sr_1_1?ie=UTF8&qid=1498106572&sr=8-1&keywords=make+your+own+neural)

ディープラーニングの入門書と言うと下で挙げる「ゼロから作るDeep Learning」が有名だと思いますが、それよりもさらに素人向けの本です。難しい概念は出てこず、本当に一番単純なニューラルネットワークを実装してみるという感じで、最初に読む本としてかなりおすすめです。Kindle版が驚安なので、とりあえず買って損することはないと思います。

### [ゼロから作るDeep Learning](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585)

有名な本です。上のMOOCがどちらかというと応用寄りで、いきなりすごいことができるようになるのに対して、この本では基礎的な理論がわかるようになる感じです。フレームワークも使わず、本当にpythonでゼロからコードを書いていきます。

誤差逆伝搬法とか損失関数の最小化のアルゴリズムみたいな、フレームワークを使う上では概念と数式だけわかってれば大丈夫な要素技術を実際にコーディングすることで理解が深まります。実はこの本は２回読んで、１回目は途中で自分でコードを書くのに飽きて掲載されているコードを流し読み、２回目はそこそこ真面目に自分でコードを書く、という感じだったのですが、２回目の方が圧倒的に面白かったのでちゃんとコードを書いた方がいい気がします。

### [深層学習](https://www.amazon.co.jp/%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%B2%A1%E8%B0%B7-%E8%B2%B4%E4%B9%8B/dp/4061529021/ref=pd_sim_14_6?_encoding=UTF8&psc=1&refRID=1XBHPJN0GYA5TTC2TPR4)

有名な本２です。この本は読み物的な感じでとくに手を動かさずに読みました。ここまでで挙げた２つの教材に比べると前提知識のない素人に対する配慮が足りない感がありますが、知識がコンパクトにまとまっていて復習するのに良いと思います。

# Kaggle

### [Planet: Understanding the Amazon from Space](https://www.kaggle.com/c/planet-understanding-the-amazon-from-space)

やはり自分でコンペティションに出てみると、いろいろ必死に調べるので良いと思います。とりあえずこれまで学んだことを活かせそうなやつがあったのでやってみました。アマゾンの航空写真を与えられて、森とか川とか住居とかのラベルをつけていく課題です。最初はこれで100万円を得て豪遊する計画だったのですが、上位30%（当時）に入ったくらいで、プロみたいな人に勝てるビジョンがなさすぎたのとAWSの請求額が悲しみに包まれる感じになってきたので、現実に立ち帰って地道に生きていくことにしました。とにかく、何らかのコンペに出てみると理解の確認＋補強になるのと、素人でも真面目にやればまともな順位になる（ダントツの最下位とかにはならない）ことがわかって満足感があると思います。
AWS S3 Storage Inventory の出力をダウンロードする

# やりたいこと

AWS S3 には定期的にバケット内のファイル一覧を出力する Storage Inventory という機能がある。
この機能の出力は マニフェストファイル + データファイル(複数件) という構成になっている。
このままでは扱いが少々面倒なので、一つのファイルにまとめて出力させたい。

# コード

言語は Python 3。boto3が必要。

~~~python
# download_inventory.py
import sys
import json
import gzip
import shutil
import boto3

s3 = boto3.client('s3')

def download_inventory(manifest_bucket, manifest_prefix, outfile):
    checksum_key = manifest_prefix + '/manifest.checksum'
    manifest_key = manifest_prefix + '/manifest.json'

    print('Manifest: s3://{}/{}'.format(manifest_bucket, manifest_key))
    print('Manifest checksum: s3://{}/{}'.format(manifest_bucket, checksum_key))

    checksum_res = s3.get_object(
            Bucket=manifest_bucket,
            Key=checksum_key)
    checksum = checksum_res['Body'].read().decode('utf-8').strip()

    manifest_res = s3.get_object(
            Bucket=manifest_bucket,
            Key=manifest_key,
            IfMatch=checksum)
    manifest_body = manifest_res['Body'].read()

    manifest = json.loads(manifest_body.decode('utf-8'))
    outfile.write((manifest['fileSchema'] + '\n').encode('utf-8'))
    for entry in manifest['files']:
        destbucket = manifest['destinationBucket'].replace('arn:aws:s3:::', '', 1)
        print('Inventory: s3://{}/{}'.format(destbucket, entry['key']))
        inventory_res = s3.get_object(
                Bucket=destbucket,
                Key=entry['key'],
                IfMatch=entry['MD5checksum'])

        with gzip.open(inventory_res['Body']) as f:
            shutil.copyfileobj(f, outfile)

if __name__ == '__main__':
    if len(sys.argv) != 4:
        sys.exit('Usage: python download_inventory.py <output> <manifest bucket> <manifest prefix>')

    with open(sys.argv[1], 'wb') as outfile:
        download_inventory(sys.argv[2], sys.argv[3], outfile)
        print('Saved: ' + sys.argv[1])
~~~

# 使い方
~~~
python download_inventory.py 出力先ファイル名 バケット名 マニフェストファイルが存在するバケット名 マニフェストファイルのキープレフィックス
~~~

例: マニフェストファイルが s3://mybucket/someprefix/2017-06-22T00-02Z/manifest.json に存在する場合は次の通り。

~~~
python download_inventory.py output mybucket someprefix/2017-06-22T00-02Z
~~~

インベントリの内容は output に出力される。
Oracle Data Pumpにおける予期しない文字コード変換

# はじめに
  Oracle Data Pumpは論理バックアップおよび異なるバージョンやオペレーティング・システムのOracle Database間でデータを安全に転送できる優れたツールです。Oracle Database 10g以降の標準機能（圧縮機能や暗号化には別途追加ランセンスが必要）であり、従来の Export / Importユーティリティの機能を引き継いでいます。本資料では、Data Pumpユーティリティを使ったデータ移行時に予期せぬ文字コード変換が発生することを示しています。

# 文字コード（エンコード）の変換機能
Data Pumpはエンコードが異なるデータベース間で自動的に文字コードの変換を行います。変換処理はImport (impdp) 時に行われます。環境変数NLS_LANGには依存せず、自動的にインポート先のエンコードに変換されて格納されます。このためData Pumpにはエンコード関連を指定するパラメーターはありません。

# 問題となる文字
Microsoft Windows等で広く使われてきたShift_JISには様々な拡張が行われました。以下のような文字集合が拡張されています。

|文字集合|コードポイント|
|:---|:---|
|NEC特殊文字|8740 - 879C|
|NEC選定IBM拡張文字|ED40 - EEFC|
|IBM拡張文字|FA40 - FC4B|

上記のうち、例えば以下の文字は同一のグリフにもかかわらず、IBM拡張文字とNEC選定文字両方にコードが定義されています。

|文字|IBM拡張文字|NEC拡張文字|Unicode|
|:---|:---|:---|:---|
|Ⅰ|0xFA4A|0x8754|\u2160|
|Ⅱ|0xFA4B|0x8755|\u2161|
|Ⅲ|0xFA4C|0x8756|\u2162|
|Ⅳ|0xFA4D|0x8757|\u2163|
|Ⅴ|0xFA4E|0x8758|\u2164|
|Ⅵ|0xFA4F|0x8759|\u2165|
|Ⅶ|0xFA50|0x875A|\u2166|
|Ⅷ|0xFA51|0x875B|\u2167|
|Ⅸ|0xFA52|0x875C|\u2168|
|Ⅹ|0xFA53|0x875D|\u2169|
|ⅰ|0xFA40|0xEEEF|\u2170|
|ⅱ|0xFA41|0xEEF0|\u2171|
|ⅲ|0xFA42|0xEEF1|\u2172|
|ⅳ|0xFA43|0xEEF2|\u2173|
|ⅴ|0xFA44|0xEEF3|\u2174|
|ⅵ|0xFA45|0xEEF4|\u2175|
|ⅶ|0xFA46|0xEEF5|\u2176|
|ⅷ|0xFA47|0xEEF6|\u2177|
|ⅸ|0xFA48|0xEEF7|\u2178|
|ⅹ|0xFA49|0xEEF8|\u2179|
|№|0xFA59|0x8782|\u2116|
|㈱|0xFA58|0x878A|\u3231|
|﨑|0xFAB1|0xED95|\uFA11|
|髙|0xFBFC|0xEEE0|\u9AD9|

# 文字コードJA16SJISから文字コードJA16SJISTILDEに移行
 文字コードJA16SJISのデータベースと文字コードJA16SJISTILDEのデータベースを作成し、Data Pumpによるデータ移行を行います。この２つの文字コードは'～'の扱い以外は同一のコード体系を持っています。

## 両方の文字コードを格納
文字コードJA16SJISで作成されたデータベースに、NEC拡張文字とIBM拡張文字でラテン数字のⅠを格納します。見た目ではわかりませんが、DUMP関数で格納コードを確認すると正しく格納されています。

```
SQL> SELECT c1, DUMP(c1, 16) DMP FROM encode1 ;
C1                   DMP
-------------------- --------------------
Ⅰ                   Typ=1 Len=2: fa,4a      ← IBM拡張コード
Ⅰ                   Typ=1 Len=2: 87,54      ← NEC拡張コード
```

## Data Pumpでデータ移行
次に Data Pumpユーティリティを使って、エンコードJA16SJISのデータベースからエンコードJA16SJISTILDEのデータベースへデータの移行を行ってみます。

```
# Export
$ export ORACLE_SID=sjis1
$ expdp SCOTT/pass DIRECTORY=DATA_PUMP_DIR DUMPFILE=encode1.dmp TABLES=encode1

# Import
$ export ORACLE_SID=tilde1
$ impdp SCOTT/pass DIRECTORY=DATA_PUMP_DIR DUMPFILE=encode1.dmp TABLES=encode1
```

## 格納文字コードを確認
文字コードを確認します。

```
SQL> SELECT C1, DUMP(c1, 16) DMP FROM encode1 ;

C1                   DMP
-------------------- --------------------
Ⅰ                   Typ=1 Len=2: 87,54
Ⅰ                   Typ=1 Len=2: 87,54
```

上記のように、NEC拡張文字のコードに変更されて格納されていることがわかります。
JA16SJISとJA16SJISTILDEのようにほとんど同一の文字コードの場合でも、Data Pump による移行では文字コード変換が行われ、意図しない文字コード変換が起こる可能性があります。
JavaScriptで、switch case でラベルをカンマで連結したらだめ

# switch case カンマで複数ラベルつなげる

タイトル通り。だめです。

こんな風に書いても、エラーも出ない。
定数Bしか有効にならないみたいです。

```js
switch (変数) {
case 定数A, 定数B:
  break; 
default:
  break;
}
```

なにこれ。

下記のようにしましょう。

```js
switch (変数) {
case 定数A:
case 定数B:
  break; 
default:
  break;
}
```

# 他言語

swiftとかならOKらしい。
VBのSELECT CASE もOKらしい。


# 動作確認

下記の、test02(1) の部分で
テストが通過しません。
つまり、

```js
switch (value) {
case 1, 2:
```
はだめだってこと。

```HTML:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">

<script>

var check = function (a, b, message) {
  if (a === b) {
    return true;
  }
  if (typeof message === 'undefined') {
    message = '';
  } else {
    message = 'Test:' + message + '\n';
  }
  message = message +
      'A != B' + '\n' +
      'A = ' + a + '\n' +
      'B = ' + b;
  alert(message);
  return false;
};


var test01 = function (value) {
  switch (value) {
  case 1:
  case 2:
    return '1 or 2';
  default:
    return 'other';
  }
};

var test02 = function (value) {
  switch (value) {
  case 1, 2:
    return '1 or 2';
  default:
    return 'other';
  }
};

var main = function () {

  check('1 or 2', test01(1));
  check('1 or 2', test01(2));
  check('other', test01(3));

  check('1 or 2', test02(1), 'test02(1)');
  check('1 or 2', test02(2), 'test02(2)');
  check('other', test02(3));

  alert('test finish');
};

document.addEventListener("DOMContentLoaded",function(eve){
    main();
},false);

</script>

</head><body>

</body></html>

```

検索しても、switchの複数ラベルを記載しているページも少なく
複数ラベルカンマ接続禁止と書いているページがなかったので
サンプル作って動作確認したので、
投稿しておきました。
RecurrentNeuralNetworkで曲名から音楽のジャンル予測してみたヅラ

# 曲名からジャンルを予測
RNNの勉強したいけど、何を作ればいいかわからず、先輩に相談。

ワイ「先輩、TensorFlow使ってRNNの勉強したいんですけど、なんかいい題材ないすか？」
先輩「うるさい。忙しいから後にして。」
ワイ「…」

曲名から音楽のジャンルでも予測しよう。。。(´・ω・｀)

# 入力データセット
itunesの曲名リストにはジャンルという項目がある。
もしかしたらRockっぽい曲名とかPopっぽい曲名のパターンがあるのかもしれない。

itunesからデータを抜き出して、csvファイルに保存

```train_data.csv
Ho!,2
Deuces Are Wild,2
575,4
映画,4
KICKS!,2
Raise it all,4
なんでもないや (movie ver.),4
モラトリアム少女,4
You've Got To Hide Your Love Away,0
Ordinary,5
なんちって,4
刀狩りは突然に,4
Borderline,4
Timber,4
M.I.Y.A.,2
夏の日の1993,4
broken bone,4
```
こんな感じのデータセット。教師データ2259件、テストデータ565件。
右列の番号はジャンルに対応している。

```categories.csv
Classical,0
R&B,1
Alternative,2
Pop,3
Rock,4
Rap,5
Punk,6
Dance & House,7
```
こんな感じ。

# 実装してみた
[こちらが実際のコード](https://github.com/shohei-ojs/Recurrent-Neural-Network-Practice)

曲名なんて形態素解析してもいいことにならなそうなので、今回はCharacterRNNを採用
一文字ごとの時系列データをRNNに入力し、曲名のパターンを学習させる

```python:input_data.py
 def data2id(self, data):
    self.__create_dict()
    data = [train.lower().replace(' ', '') for train in data]
    return [[[self.char_dict[train[i]]] if len(train) > i else [0] for i in range(self.max_length)] for train in data]
  

  def __create_dict(self, data_dir ='../data/'):
    data = self.__create_batchs(data_dir)
    data += self.__create_batchs(data_dir, test=True)
    sings = [d[0] for d in data]
    word = ''.join(sings).lower().replace(' ','')
    word_uniq = list(set(word))
    self.char_dict = {k:i for i,k in enumerate(word_uniq)}
```
この部分で曲名を各文字ごとにIDを採番し、ネットワークにfeedさせられる形に変換

```python:main.py
def cell():
    return tf.contrib.rnn.BasicRNNCell(num_units=NODE_NUM, activation=tf.nn.tanh) #中間層のセル
cells = tf.contrib.rnn.MultiRNNCell([cell() for _ in range(NUM_LAYER)])
outputs, states = tf.nn.dynamic_rnn(cell=cells, inputs=x, dtype=tf.float32, time_major=False)
```
曲名は可変長なので、dynamic_rnnを利用。
中間層はユニット数128で2層重ねてます（超適当）、CellはBasicRNNにしました。

# 結果
そりゃもうね。。うん。。目も当てられない。
僕のitunesに入ってる楽曲がまずRockに偏っている。
しかも曲名からジャンルを当てるなんて人間でも結構難しいです。
なので、結果はだいたい予想つきますね？

```
[TRAIN] loss : 1.349962, accuracy : 0.656250
[TEST loss : 1.369359, accuracy : 0.571681
{'Classical': 0.0, 'R&B': 0.0, 'Alternative': 0.0, 'Pop': 0.0, 'Rock': 1.0, 'Rap': 0.0, 'Punk': 0.0, 'Dance & House': 0.0}
```
ある程度学習させてみました。
1,2行目はTrain,Testの損失と正解率、
3行目はテストデータに対する、実際のネットワークの予測結果の割合です。
はい、見事に全部Rockだと言い張ってます。
曲名とジャンルにほぼ相関がないので、全部Rockと言い張るのが結果的に損失が最小化されます。
（データがRockに偏ってるため。。）
もっといいデータセットがあればなあ。。

# 感想
RNN関連のAPIの使い方の練習になりました！！
なんか実装間違ってる気もしているので、皆様いろいろとご教授いただけると嬉しいです！！！
C/C++ で予約済み識別子をシンタックスハイライトする Vimプラグインつくった

[ブログ記事](http://secret-garden.hatenablog.com/entry/2015/08/17/000000)からの転載です。

他人の書いた C/C++ のコードを見ているとあまりにも予約済み識別子を無視してコードを書いているものが多いので、ついカッとなってつくった。

## プラグイン

* [osyo-manga/vim-cpp-syntax-reserved_identifiers](https://github.com/osyo-manga/vim-cpp-syntax-reserved_identifiers)

```vim
NeoBundle 'osyo-manga/vim-cpp-syntax-reserved_identifiers'
```

![](https://i.gyazo.com/8b66e8ad27e76e103da5ac25a4847ec4.png)

また、デフォルトでは `WarningMsg` のハイライトを使用します。  
任意のハイライト色にしたい場合は、

```vim
" ErrorMsg を任意のグループに置き換える
highlight link cReservedIdentifiers ErrorMsg
```

みたいな設定で変更できます。

## 『グローバルスコープを持ち、_ で始まる名前』のハイライトを無効にする

予約済み識別子の条件の一つに

* グローバルスコープを持ち、_ で始まる名前

というのがあるんですが Vim で『グローバルスコープ』という条件付けを行うのは無理なので単純に

* _ で始まる名前

をハイライトするようにしています。  
なので以下のようなコードもハイライトされます。  

![](https://i.gyazo.com/2eed6b47d5f612df258fcdb9474f2343.png)

こういうコードをハイライトしてほしくない場合は、予め

```vim
let g:c_no_reserved_identifiers_start_underbar_lower_case=1
```

と、いうような設定をしておくことで

* _ + 小文字で始まる名前

のハイライトを無効にできます。  
何気に syntax 系のプラグインをつくったのは初めてなので問題や要望があれば Issues までお願いします。

## [おまけ]

ちなみに当然ではありますが、予約済み識別子をガシガシ使ってる標準ライブラリのコードももちろんハイライトされます。


![](https://i.gyazo.com/c08f7bd98edcf29740b3729b0621a96d.png)

まぁこれはしょうがないか…。
API設計、仕様書作成のための Swagger メモ



API仕様書をサクッと作るための自分用メモ


## お試し

内容が漏れてもOKなら、以下でお試し可能

* [Swagger Editor](http://editor.swagger.io/#/)


## Swagger Editorの公式Dockerイメージ

ローカルでSwaggerエディタ使いたい場合

```
$ docker pull swaggerapi/swagger-editor
$ docker run -d -p 80:8080 swaggerapi/swagger-editor
```


## Swagger UIの公式Dockerイメージ

[swaggerapi/swagger-ui - Docker Hub](https://hub.docker.com/r/swaggerapi/swagger-ui/)


### 手順


```
docker pull swaggerapi/swagger-ui
docker run -p 8001:8080 swaggerapi/swagger-ui
```

http://localhost:8001/ にアクセスする

```
open http://localhost:8001
```


## yaml, jsonの各パラメータの意味

以下で検索
* [Swagger Specification](http://swagger.io/specification/)


## 参考

* [SwaggerエディターでREST APIの設計書を書いてみる | 株式会社INDETAIL - ブログ](https://www.indetail.co.jp/blog/161220/)
* [Dockerを使ってSwaggerの環境を整えてAPI Gatewayにインポートする ｜ Developers.IO](http://dev.classmethod.jp/cloud/docker-swagger-apigateway/)
* [SwaggerでRESTful APIの管理を楽にする - Qiita](http://qiita.com/disc99/items/37228f5d687ad2969aa2)
* [APIドキュメント標準化 現状確認 : エキサイト公式　エンジニアブログ](http://blog.excite.co.jp/exdev/25417365/)
* [swaggerapi/swagger-editor - Docker Hub](https://hub.docker.com/r/swaggerapi/swagger-editor/)

### ちょっと外れるが参考になる

* [Swaggerで始めるモデルファーストなAPI開発](https://www.slideshare.net/takurosasaki/swaggerapi)
* [Swaggerでのapi開発よもやま話](https://www.slideshare.net/KeisukeKonishi/swaggerapi-64300306?next_slideshow=1)
LaravelのRESTFulコントローラーで単数形のURLを使いたい

# 問題

RESTFulコントローラーでは、URLは下記のようになってほしい。

`api/v1/projects/1`

ただしLaravel5系ではこうなる。

`api/v1/project/1`

Laravelのドキュメントでは単数形と複数形が混ざっており、フレームワーク内でも統一が取れていない。

https://laravel.com/docs/5.1/controllers#restful-resource-controllers

Railsのように、

`Route::resource('projects', 'ProjectController')`

とすることで

| メソッド | URL | コントローラー |
|:-:|:-:|:-:|
| GET  | /projects  | ProjectController@index  |
| PUT  | /projects/{project}  |  ProjectController@update  |

などとなって欲しいが、

| メソッド | URL | コントローラー |
|:-:|:-:|:-:|
| GET  | /projects  | ProjectController@index  |
| PUT  | /projects/{projects}  |  ProjectController@update  |

となってしまう。

その結果、ルーティングの変数が複数形になり、Route Model Bindingをしようとすると

```php:app/Providers/RouteServiceProvider.php

public function boot(Router $router)
{
    parent::boot($router);

    $router->model('projects', 'App\Models\Project');
}
```

という奇妙なことになってしまう。

```ProjectController.php

public function update(Project $project)
{
    // 等価
    // $project = Project->findOrFail($project_id);
}
```

とできるのは便利なんだけど。


# 解決策

下記にすることで可能っぽい。

```php:routes/web.php
Route::singularResourceParameters();
Route::resource('projects','ProjectController');
```

5.2から加わったらしい。

# 所感

そもそも5.4ではRESTFulコントローラーにしただけで Route Model Binding が有効になるのでさっさとバージョンアップしろって話なのか。

でもドキュメントでも複数形と単数形の統一は取って欲しい・・・というか全部複数形にしてほしい。

# 参考

- https://github.com/laravel/framework/issues/12056
- https://github.com/laravel/framework/issues/11644
個人開発環境をvagrantで建てるべきか、dockerで建てるべきか

ローカルPCに個人開発環境を建てたいけど、母艦は汚したくないものです。

そうすると、だいたいの場合`vagrant(virtualbox)`か`docker`かの2択になると思います。
この使い分けにいつも迷うのでどうするべきかの指針を考えてみました。

**お断り: 以下は個人の見解であって、所属先の見解ではありません。**

# vagrant
## カーネルに依存する操作を行いたい場合
`docker`の場合、いじれるカーネルパラメータが限られています。
特定バージョンのカーネルの環境を用意する必要がある場合や、カーネルパラメータに特殊な設定が必要な環境では仮想マシンの方である必要があります。

## 内部で生成されたデータの保全を行いたい場合
`docker`の場合、ふとした操作（`docker kill`や`docker build`、`docker rm(i)`など）でデータコンテナの中身が消えてしまうことがあります。
仮想マシンのイメージであれば、内部に生成・保存したデータは確実に保存されます。

## 環境丸ごとを他者に配布したい場合
パッケージやその設定、データ投入済みの環境が丸ごと保存されますので、環境を他者に丸ごと渡すのが楽です。

## ansibleなどのプロビジョニングツールと連携したい場合
`ansible`、`chef`などのプロビジョニングツールとの連携がしやすいので、プロビジョニングツールを使いたい場合に適しています。

## ゲストOSにLinux以外を使う場合
`docker`だと不可能か、一般には難しいと思われます。

## ファイル共有に高速性を求める場合 （Macホストの場合）
`vagrant`にも`docker`にもホストOS側のファイルをマウントする仕組みがありますが、macホストの場合`docker`のファイル共有は非常に遅いです。
あまりにも遅いので`vagrant`に置き換えたら10倍くらい早くなったこともあります。

特にAPIサーバを立てる場合、大量のリクエストを発行しますので、開発サーバであったとしてもレイテンシーの低さが重要になります。
最近のdocker for macでは多少のチューニングは入ってるみたいですが、それでもまだ遅いです。

## 使用するコンポーネントが多数の場合
`docker`でいうところのコンテナが多数に渡ると、管理が複雑になります。
複雑さは`docker-compose` で解決できますが、起動が速いというメリットは失われます。（多数のコンテナを順次起動していく必要があるので。）

## バッチジョブを実行したい場合
`docker`は1コンテナ = 1プロセスが原則なので、cronで定期バッチを実行させる場合や、workerデーモンを待機させるときにそれらをどこに立てるかが問題になることがあります。
`supervisord`コンテナを立ててその配下に置くという手もありますが、コンテナであることのメリットは消えるでしょう。

# docker
## イメージサイズを抑えたい場合
`Alpine Linux`ベースのコンテナを選べば数10M 〜 数100Mに抑えることができます。
`vagrant`の場合イメージサイズは最低でも数Gレベルになります。

## メモリサイズを抑えたい場合
不要なプロセスが立ち上がらない分メモリ使用量を抑えることができます。

`vagrant`の場合仮想マシンに割り当てる数Gレベルのメモリが必要ですし、それら全てが常に使われるというわけではありません。
複数環境を立てるとその無駄は無視できないレベルになります。（特に、メモリに限りがあるラップトップでは。）

## 起動・停止を繰り返す場合
コンテナ数が少なければ起動・停止が一瞬で完了するので、何度も起動・停止を繰り返すCI・ユニットテストの実行環境に適しています。

## ホストOSにLinuxを使っている場合
Hypervisorのレイヤーが必要ないので、オーバヘッドが抑えられます。

## 使用するコンポーネントが少数の場合
`docker-compose`を使えば簡単にコンテナ間をつなぐことができます。

## 使い捨ての環境を作りたい場合
とりあえずお試しで使ってみたいコンポーネントがある時は`docker`コマンド一発で既存イメージをpullできますし、すぐに破棄できます。

## コンテナ内にデータを持つ必要が無い場合
万が一データを保存しても次回起動時に廃棄されるので、不要にデータを保存してしまうコードを発見・排除することができます。

## 環境構築のメタ情報をgitで管理したい場合
「環境構築のメタ情報」とは`Dockerfile`ファイルであったり、`docker-compose.yaml`ファイルのことです。基本的に小サイズのテキストファイルですのでgitで管理するのに適しています。

`vagrant`ではプロビジョニングツールと連携したとしても、最初のベースイメージは巨大バイナリファイルになるので、gitで管理するのは難しいと思います。（初期イメージだけは[Atlas](https://atlas.hashicorp.com)にホスティングするという手はありますが。）

以上になります。
ご意見や誤りの指摘があればコメント欄でお知らせください。
e-Gov設定メモ

#電子政府の総合窓口e-Gov［イーガブ］
総務の人から
「これ使うとなんか色々電子申請できるようになるらしいので設定お願いします＞＜　書面電子証明書っていうのは買いました」
とお願いされたんだけど、社内の環境がプロキシつかってるせいなのか、このシステムのつくりが悪いせいなのか、いろいろ大変だったのでメモ。
#うちの環境
環境が違うとまた違うかもしれないので置いておきますね。

| | |
|:-----------|:------------|
| OS | Windows 7 SP1(32bit)|
| ブラウザ | IE11 |
| インターネット環境 | FWとかプロキシとか色々間に挟まってます |

#手順
１. アップデートとかユーザーに任せられないのでJAVA入れたくないんだけど、入れないと動かないらしいのでJAVAのオフラインインストーラーをダウンロードしてきてインストール
　[全オペレーティング・システム用のJavaのダウンロード](https://java.com/ja/download/manual.jsp)

２. ユーザーアカウントをAdministratorsグループへ追加して再ログオン(念のため)
３. コントロールパネルからJAVAの設定(なんか前しないと動かなかった。「詳細」タブ)
　・「混合コード」の「検証を無効にする」を選択
　・「署名付きコード証明書失効チェックを実行」の「チェックしない」を選択
　・「TLS証明書失効チェックを実行」の「チェックしない」を選択
４. 以下コマンドであらかじめフォルダを作成。(作っておかないとエラーになる。GUIからじゃピリオド始まりのフォルダ作れない)

```
cd %USERPROFILE%\AppData\Local\Temp\Low
md .egovfc
``` 

５. IEを管理者として実行(念のため)
６. 信頼済みサイト登録
７. ポップアップブロック例外登録
８. [e-Gov電子申請用プログラムのインストール](https://shinsei.e-gov.go.jp/Shinsei/ApplyUseAgreement.jsp)。基本よく固まるので、ゆっくり待つ
９. 署名に使う証明書のインストール。一応OSとJAVA(コンパネから)の両方に
１０. システム利用。基本よく固まるので(ry なんかダイアログで聞いてきたらOKしとく
１１. ユーザーアカウントをAdministratorsグループから外す(よく忘れてあとから言いに行くことが多い)

しかしこれ、みんな使えてるのかね？(^q^)

#(2018/12追記)祝！アプリ化！
Microsoft .NET Framework 4.7.1以上で動くアプリになったようです。
.NET入れてインストーラーをカチカチで終わるので、ようやく面倒な手間から解放されます(TT)
http://www.e-gov.go.jp/shinsei/clientap/download.html
GitHubのアカウントを複数SSH接続する


よく忘れていっつもググるから自分用メモ。

# 公開キーの確認

```
$ cd ~/.ssh/
$ ls
```

id_rsa.pub、id_rsa、id_ed25519.pub、id_ed25519があったりする。

# 鍵を作成する

```
$ ssh-keygen -t ed25519 -f [file name] -C 'mail address'
# -C は設定しなくてもOK。しなかったらマシン名が設定される
# Passphraseは必要なら入力する
```

# 公開鍵をコピー

```
$ pbcopy < ~/.ssh/[file name].pub
```

# 公開鍵をGitHubに登録する

https://github.com/settings/ssh

にコピーした公開鍵を登録する。

# Hostを指定する

```
$ vim ~/.ssh/config
```

に以下のように記載。

```
Host itigoppo.github.com
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/github_itigoppo_ed25519
  TCPKeepAlive yes
  IdentitiesOnly yes
```

# 接続テスト

```
$ ssh -T itigoppo.github.com
```

# リポジトリにアクセスする

git@[host name]:[account name]/[repository name].git
の[host name]をconfigに設定したhostに変更する。

```
# 通常はこう
git@github.com:itigoppo/repository.git
↓
# 別のアカウントとしてSSH設定したやつはこう
git@itigoppo.github.com:itigoppo/repository.git
```
RHELでrcpのサーバを稼働

Red Hat Enterprise Linuxにrcpのためのサーバ(rshサーバ)を稼働させてみる。

```
# cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 6.2 (Santiago)
# getenforce
Disabled
# chkconfig --list rsh
rsh            	off
# chkconfig rsh on
# chkconfig --list rsh
rsh            	on
# ls -l /root/.rhosts
ls: cannot access /root/.rhosts: No such file or directory
# vi /root/.rhosts
# chmod go-rwx /root/.rhosts
# ls -l /root/.rhosts
-rw------- 1 root root 454 Jun 22 11:20 /root/.rhosts
# vi /etc/securetty
# ls -l /etc/securetty
-rw------- 1 root root 126 Jun 22 11:21 /etc/securetty
# tail -n1 /etc/securetty
rsh
# service xinetd restart
# cp -p /root/.rhosts ~alice/
# chown alice:alice ~alice/.rhosts
# hostname
lemming
```

xinetdを動かしたサーバlemmingに、試しにファイルdataをrcpしてみる。

```
$ which rcp
/usr/bin/rcp
$ rcp -p data lemming:./
```
結論: AngularJSはjQueryが利用可能な時、angular.elementをjQueryへのエイリアスとする


## はじめに
私は最近とあるプロジェクトにおいてAngularJS 1.5.11を使っていて、jQuery3系も読み込まれているが使わないようにしている
（いつか排除したいため）

## 問題
ここで以下のようなコードがある

```js
let target = angular.element.find(".classname");
```

今まで普通にこのようなコードを書いていたが、オンラインエディタで実行しようとしたら、結果がundefinedになってしまった

## 原因
調べてみると、AngularJS組み込みのjqLiteの`find()`メソッドはタグ名での検索のみ実装されているらしい

> find() - Limited to lookups by tag name

参照: https://docs.angularjs.org/api/ng/function/angular.element

### なぜ今まで動いていた？

> もし、jQueryが利用可能であれば、angular.elementはjQuery関数へのエイリアスになります。 そうでなければ、angular.elementは、"jQuery lite"または"jqLite"と呼ばれる、 Angular組み込みのjQueryのサブセットに委譲します。

参照: http://js.studio-kingdom.com/angularjs/ng_global_apis/angular_element

AngularJSはjQueryが利用可能な時、angular.elementをjQueryへのエイリアスにするということでした

## 結論

誰もjQueryからは逃げられない......

実際のところそんな躍起になってjQueryを排除することもないし、積極的に使っていけばいいんじゃないかという気持ちになった
Fatal Error: com.docker.osx.hyperkit.linux failed to start

Mac上のDockerが以下のエラーで動かなくなってしまった場合の対処方法。

私の場合はDockerの新しいバージョンをアップデートして再起動したら動かなくなってしまいました。

```
Fatal Error: com.docker.osx.hyperkit.linux failed to start
```

![Fatal Error: com.docker.osx.hyperkit.linux failed to start](https://qiita-image-store.s3.amazonaws.com/0/129712/d3405f13-5c58-7501-9150-37b5eafff0eb.png)

# Preferencesメニューを起動
Docker起動直後に上部にあるクジラアイコンメニューからPreferencesを選択します
![Docker Preferences](https://qiita-image-store.s3.amazonaws.com/0/129712/31bdba97-a55e-a353-4259-492c50af44a1.png)

# Preferencesメニュー起動後のダイアログ
Resetタブを選択します
![Preferences General Dialog](https://qiita-image-store.s3.amazonaws.com/0/129712/90fed306-deb2-53c6-05d1-6a47dea8b6a2.png)

# Resetタブ画面
「Reset to Factory defaults」ボタンを押下
![スクリーンショット 0029-06-22 11.03.23.png](https://qiita-image-store.s3.amazonaws.com/0/129712/21c0bd45-18e3-3e5a-4f93-98d392d0b680.png)

# リセット確認ダイアログ
「Reset Docker」ボタンを押下
![Reset to Factory defaults](https://qiita-image-store.s3.amazonaws.com/0/129712/40bef661-8a79-329a-799a-f13d4fda4bb9.png)

# リセット完了！
「Restart」ボタン押下でDockerを再起動します
![Reset Docker to factory defaults](https://qiita-image-store.s3.amazonaws.com/0/129712/2192aa8c-9868-f382-f181-4ce2a30419c9.png)

# Welcomeダイアログ
再起動後、初回起動時と同様にWelcomeダイアログが表示
![Welcome to Docker for Mac](https://qiita-image-store.s3.amazonaws.com/0/129712/5e533c97-901f-f344-acd3-897ca0201333.png)

# 初期設定完了後
初期設定完了後、無事にDockerが起動するようになりました
![Docker is running](https://qiita-image-store.s3.amazonaws.com/0/129712/471bcac4-a5a5-ecbe-8d19-74cd4788474c.png)
(初心者向け)TensorFlowをiPhoneで動かして画像認識してみる

Macbookで[TensorFlow](https://www.tensorflow.org/)でAIを使ってみよう、という企画です
TensorFlow 1.2を前提にします

#1. TensorFlowをiPhone(iOS）で動かしてみます
- [tensorflow/tensorflow/examples/ios/camera/](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/ios/camera)を参照します

#（工事中）
jsdoでkeras.js

#概要
jsdoでkeras.jsやってみた。

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/U/3/A/U3AR.jpg?t=1498096665)
#サンプルコード

```
var csv = document.getElementById("csv").value;
csv = csv.replace(/\n/, ",");
var data = [];
var lines = csv.split(",");
lines.forEach(function(line) {
    data.push(line);                
}); 
var model = new KerasJS.Model({
    filepaths: {
        model: '/assets/2/p/I/n/2pIny',
        weights: '/assets/8/w/D/q/8wDqW',
        metadata: '/assets/w/k/Y/C/wkYCL'
    }, gpu: false
});
model.ready().then(() => {
    let slice = data.slice(0, 128);
    let tmp_slice = [].concat.apply([], slice);
    let array_slice = new Float32Array(tmp_slice);
    var inputData = {
        'input': array_slice
    };
    model.predict(inputData).then(outputData => {
        document.getElementById("out").value = outputData['output'];                        
    }).catch(err => {
        alert(err);
    })
}).catch(err => {
    alert(err);
});

```

#成果物
http://jsdo.it/ohisama1/U3AR
Leaflet入門

# Leafletとは？

- JavaScriptのWeb地図ライブラリ
- 地図を表示してスムーズにズーム、スクロール
- OpenStreetMapや独自の地図に対応
- マーカーや図形を描画
- プラグイン多数

http://leafletjs.com/

# やってみよう

## git clone

```
git clone https://github.com/aoyama-val/maketile2.git
cd maketile2
```


## タイル化しないで一枚絵のまま表示する

`imageOverlay.html`を開いてみる。
これは元画像を一枚絵のまま表示している。
元画像のサイズが大きくなければこれで十分。
サイズが10MBとかになると重くなるので、タイル化した方がいい。


## タイル化しよう

### Dockerイメージをビルド

RubyとImageMagickを使いたいので、Dockerを使う。
それらが既にインストールされているなら、別にDockerを使わなくてもよい。

```
# maketile2ディレクトリにて
docker build -t ruby-imagemagick .
```

### コマンド一発でタイル化

`convert -crop 256x256`というコマンドで簡単にタイル化できる。

```
mkdir tile1
docker run --rm -v $PWD:/work -w /work ruby-imagemagick convert -crop 256x256 uqm_map_full.png "tile1/tile_%d.png"
```


### maketile2.rbを使う

maketile2.rbはタイル作成をより楽にするためのスクリプト：

- 元画像が256の倍数でない場合に周辺に透明余白を追加する
- 各ズームごとにタイルを作る
- テスト表示用のindex.htmlを生成

```
docker run --rm -v $PWD:/work -w /work ruby-imagemagick ruby maketile2.rb uqm_map_full.png

open index.html
```

# Leafletの仕組み

- ズーム
    - ズーム8のときタイル 1x1枚（256x256 px）
    - ズーム12のときタイル 16x16枚（4096x4096 px）
    - 1上がるごとに縦横とも2倍。よって全体のサイズは4倍になる
- 座標
    - 左上が (0, 0)
    - xが上、yが右（緯度, 経度がそうだから。GISでは普通）
- 今回は緯度経度ベースでない地図を`L.CRS.Simple`で表示したので上記の通りだが
    - 緯度経度ベースの世界地図（OpenStreetMapなど）の場合は違ってくる
    - ズーム0のとき1枚（256x256 px）
- Chrome Developerツールでdivの構造を見てみよう
    - imgタグを生成してタイルを読み込んでいるのが分かる
    - `leaflet-control-container`, `leaflet-tile-pane`, `leaflet-shadow-pane`, `leaflet-overlay-pane`, `leaflet-marker-pane`などのレイヤー構造が分かる
- 複数のタイルレイヤーを重ねることもできる
- タイル
    - 基本的に256x256だが、別のサイズも指定可能
    - 中心から周辺にかけてという順序で読み込まれる
    - ファイル名は規則的でなければならない
        - 左上が(0, 0)
        - xが右
        - ｙが下
editActionsForRowAtIndexPathでindexPath.rowが-1になる【未解決備忘録】

#環境
Xcode 8.3.3
iOS 10.3.2

#ソース
```

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
  id *currenData = [self.data objectAtIndex:indexPath.row];
  ** いろいろ判定 **
  return YES or return NO;
}

- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
{
  // ここでエラー
  // indexPath.rowが-1になってる
  id *currenData = [self.data objectAtIndex:indexPath.row];
}

とりあえず-1の場合は「閉じる」ボタンだけをスワイプメニューに表示するようにして
操作のやり直しができるようにしてる。

```

#追記（2017年8月15日）
Apple Developer Technical Supportにコードレベルの問い合わせ（サンプルも送る）をすると
「これバグなんじゃね？」
みたいな回答が返ってくる。マジかorz
そしてはBugReporterに送ってくれと言われたので、素直に送ってみた。
mitmproxy + curl で ssl通信のテスト

mitmproxy用のスクリプトのデバッグなんかで使えます

# 1. mitmproxyを起動した状態で, プロキシを指定してcurlで証明書をダウンロード
```
curl -x 127.0.0.1:8080 'http://mitm.it/cert/pem' > /tmp/mitm.pem
```

# 2. curlの--cacertオプションで 1.のpemを指定してリクエストを投げる
```
curl --cacert /tmp/mitm.pem -x 127.0.0.1:8080 'https://ja.wikipedia.org/wiki/HTTPS'
```
cargo metadataでプロジェクトの情報を取得する

# 概要

Rustを使った開発をしていて、パッケージ自体の情報を知りたくなることがたまにあります。
例えば、Makefile内でパッケージの情報を使う場合や、自動ドキュメンテーションを行う場合です。
Cargo.tomlを参照するという力技もありますが、`cargo metadata`を使うとCargo.tomlに書かれていない情報も含めて、簡単にそれを取得できます。
json形式で出力されるので、jqを使って容易に加工できます。

# 基本

```shell-session
$ cargo init --bin ferris
$ cd ferris
$ ls
Cargo.lock Cargo.toml src
$ cargo metadata --format-version=1
{"packages":[{"name":"ferris","version":"0.1.0","id":"ferris 0.1.0 (path+file:///path/to/ferris)","license":null,"license_file":null,"description":null,"source":null,"dependencies":[],"targets":[{"kind":["bin"],"crate_types":["bin"],"name":"ferris","src_path":"/path/to/ferris/src/main.rs"}],"features":{},"manifest_path":"/path/to/ferris/Cargo.toml"}],"workspace_members":["ferris 0.1.0 (path+file:///path/to/ferris)"],"resolve":{"nodes":[{"id":"ferris 0.1.0 (path+file:///path/to/ferris)","dependencies":[]}],"root":"ferris 0.1.0 (path+file:///path/to/ferris)"},"target_directory":"/path/to/ferris/target","version":1}
$ cargo metadata --format-version=1 | jq .packages[0].name
"ferris"
```

Cargo.tomlを書き換えると出力される結果も変わります。

```shell-session
$ cargo metadata --format-version=1 | jq '.packages | map(select( .name == "ferris" )) | .[0].dependencies'
[]
$ echo 'regex = "0.2.2"' >> Cargo.toml
$ cargo metadata --format-version=1 | jq '.packages | map(select( .name == "ferris" )) | .[0].dependencies'
    Updating registry `https://github.com/rust-lang/crates.io-index`
[
  {
    "name": "regex",
    "source": "registry+https://github.com/rust-lang/crates.io-index",
    "req": "^0.2.2",
    "kind": null,
    "optional": false,
    "uses_default_features": true,
    "features": [],
    "target": null
  }
]
```

## 依存パッケージの情報を含めない

先の例で、jqで検索処理を行なっていますが、これは`cargo metadata`が依存パッケージも含めて全てのメタデータを出力するためです。
`--no-deps`オプションをつけると、ルートパッケージの情報だけを出力します。
多くの場合はこのオプションをつけた時の情報で必要十分と思います。
先の例は`--no-deps` を使うと以下のように書けます(結果は変わりません)。

```shell-session
$ cargo metadata --format-version=1 --no-deps | jq .packages[0].dependencies
[
  {
    "name": "regex",
    "source": "registry+https://github.com/rust-lang/crates.io-index",
    "req": "^0.2.2",
    "kind": null,
    "optional": false,
    "uses_default_features": true,
    "features": [],
    "target": null
  }
]
```

# Makefileの中で使う

Makefileの中で`cargo metadata`を使ってみます。

```Makefile
.PHONY: version
version:
	@echo $(shell cargo metadata --format-version=1 --no-deps \
		| jq .packages[0].version)
```

実行してみます。

```shell-session
$ make version
0.1.0
```

# まとめ

- `cargo metadata`でプロジェクトの情報をjson形式で出力できます
- --no-depsをつけるとrootプロジェクトの情報だけを出力できます