OmniAICreator/Qiita-1.07M huggingface dataset:
ACCESS はどうやって構築するか（個人用）

　今から書くのは個人的にACCESSのDBをどう構築するするかというメモ書きなので、法人用ではないです。
　何が違うかというと、「テーブルの設計は行き当たりばったり」必要性に応じて追加するという考え方だからです。
　Windows 10になってACCESSの必要性は高まりました。エクスプローラーのファイル管理がぬるぬるして激重いからです。
　すると、ファイルをACCESSに書き込むVBSを書いて、テーブルを作る、という発想がわいてきます。
　これだと多少ACCESSが死んでもファイル自体がなくならない限り元データは永遠にあるので、何度もトライアンドエラーができます。
　1．テーブルの設定をエクスポート、インポートできるようにする
　２．クエリーもインポートエクスポートできるようにする。
　※これは比較的簡単ですね。SQLでやりましょう。
　3.これらを含めたバックアップシステムを作る。
　この３が一番重要で、すべてのアクセスはまずマクロを有効にし、参照設定を可能な限りONにして、Module1とModule2を作り、Module2にバックアップシステムも書き込みます。
　なので、
　3-1 オブジェクトの一覧
  3-2 フォーム、レポート、クエリーというオブジェクト事態のエクスポート
　3-3 フォームやリポートは各オブジェクト（ラベルとか）の設定もエクスポートできたらいいな。
　3-4 マクロもエクスポートできたらいいな
　3-5 Moduleもエクスポートできたらいいな
  3-6 EXCELのインポート、エクスポートの設定も知りたいな
　3-7 最適化もできたらいいな。
というわけで、まず何よりアクセスのデータベースを作成する場合、すべてのマクロを有効にして参照設定に次のものを何も考えずに設定します。
VBA
Access
---ここまではデフォルト
stdole
DAO
AMovie
ADODB
ADOR
ADOX
VBScript_RegExp_55
MSXML2
Microsoft_JScript
WSHControllerLibrary
Scripting
Scriptlet
Shell32
SpeechLib
Accessibility
VBIDE
Excel
MSHTML
IMAPI2
IMAPI2FS
SHDocVw
Office
MSScriptControl
System_Drawing
System_EnterpriseServices
Word
では、参照設定をどのようにエクスポートするか
[オフィス田中](http://officetanaka.net/excel/vba/tips/tips100.htm)
はEXCEL用です。参照設定をするのはEXCELもACCESSも同じですが、
CurrentProject.References
と思うと実は違い
**Access.References**
となるのがポイントです
また後でマクロに登録するSubプロシージャは作った時点でマクロ用のユーザー定義関数を作ります。（そうしないと動かない）
だからACCESSとEXCELのVBAの最大の違いは
**対になるSubとFunctionプロシージャがある**
ということでしょう。
```VB:Export_RefSetting
'このVBAはあとで使いますので必ずModule2などメイン以外のModuleを作ってそこにいれてください。
’Declrare部に宣言する定数
Const sBkFolder As String = "BackUpFolder"

Function Macro_Export_RefSetting()
’マクロ用関数Macro_サブプロシージャ名
Call Export_RefSetting
End Function
Sub Export_RefSetting()
    Dim DB As Database: Set DB = CurrentDb
    Dim buf As String
    Dim VBP As VBProject
    Dim Refs As Access.References
    Dim Ref As Access.Reference
    Dim strFile As String
    Dim objFol As Object
    Dim strCurrentProjectName As String
    Dim strFolder As String
    'MDBが混在している場合（今はないと思うけど）MDBファイルは、.accdbを.MDBに変更してください
    strCurrentProjectName = Replace(CurrentProject.Name, ".accdb", "", 1, -1, vbTextCompare)
    'カレントのデータベースのあるフォルダに新たにバックアップ用のフォルダを作成する
    strFolder = CurrentProject.Path & "\" & strCurrentProjectName & sBkFolder
    If Dir(strFolder, vbDirectory) = "" Then
        MkDir strFolder
    End If
    strFile = strFolder & "\" & "RefSetAnsi.csv" 'できるCSVファイルは必ずANSI(Shif-Jis)を明示
    If Dir(strFile) <> "" Then
    Kill strFile
    End If
    Open strFile For Output As #1
    Print #1, "ref.Name" & "," & "Ref.FullPath" & "," & "ref.IsBroken" & "," & "ref.Kind" & "," & "ref.Guid"
    On Error Resume Next
    For Each Ref In Access.References
        buf = ""
        buf = buf & Ref.Name ' & "," & Ref.FullPath & "," & Ref.IsBroken & "," & Ref.Kind & "," & Ref.Guid
        Debug.Print buf
        Print #1, buf
    Next Ref
    Close #1
    Debug.Print strFile 'イミディエイトウィンドウにできたファイルを表示、それをコピーし WIN+R キーでペーストして開く
End Sub
```
Laravel5.3 で Gmail を利用してメール送信する方法

##環境
- CentOS 7
- PHP 7
- Laravel 5.3

## Mailable クラス作成
`php artisan make:mail RegisterShipped`

## Mailable クラス編集
上述のコマンドを打つと、`app/Mail/RegisterShipped.php`というクラスが生成される。
以下のように編集する。

```app/Mail/RegisterShipped.php
namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class RegisterShipped extends Mailable
{
    use Queueable, SerializesModels;

    public $sendData;

    public function __construct($sendData)
    {
        $this->sendData = $sendData;
    }

    public function build()
    {
        return $this->subject('タイトルサンプル')
            ->text('emails.templates.registers_mail');
    }
}
```

###解説
`->text`のようにしておけば、後述のテンプレート(`registers_mail.blade.php`)の中身を、改行なども含めて記述したまま出力される。
逆に`->text`ではなく`->view`を使用するとHTMLとして出力されるので、改行する際は`<br>`などを記述しないといけない。

##コントローラー編集

```app/Http/Controllers/RegistersController.php
namespace App\Http\Controllers;

use App\Mail\RegisterShipped;
use Mail;

class RegistersController extends Controller
{
    public function apply()
    {

        $sendData = [
            'register_token' => 'register_token',
        ];

        Mail::to(`test_to@gmail.com`)->send(new RegisterShipped($sendData));
    }
}
```

##メール本文（View）作成
```resources/views/emails/templates/registers_mail.blade.php
会員登録の申請をしていただき、ありがとうございます。
以下のURLから本登録に進んでください。

https://hoge.jp/registers/{{ $sendData['register_token'] }}
```


## .env 編集
- `.env`ファイルに以下の内容を追記する
 
```.env
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USERNAME=hoge@gmail.com
MAIL_PASSWORD=password
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=hoge@gmail.com
MAIL_FROM_NAME=hoge@gmail.com
```

##注意点
Gmail のSMTPを利用して送信し過ぎると、
![スクリーンショット 2016-11-01 18.38.06.png](https://qiita-image-store.s3.amazonaws.com/0/57002/b1dbede8-1b26-bae7-5add-80a087b40326.png "スクリーンショット 2016-11-01 18.38.06.png")
のように Gmail にBANされて一時的に送信できなくなるので注意。


##運用上の疑問

###サービスごとに`Mail`配下にクラスを作成していくのか
今回のように`RegisterShipped`というクラス名にすると、登録（Register）時のメール送信にしか使えない。
なので、
- `OrderShipped`
- `InfoShipped`
...
のようにメールを送信する度にクラスを作成することになる。
もし汎用的にする場合は`BuildShipped`のようにして、Controller から`subject`や`template`の情報を受け取る必要がある。
そもそも`〇〇Shipped`という名前で良いのか？
チュートリアルが`OrderShipped`だったから合わせて作ったけど。。
PL/SQLで大量データ移行する際のメモ

PL/SQLで大量データ移行する際のメモ

数十万～数億件のデータ移行でバルクFETCHからのINSERTが有効です。
（ダイレクトパスINSERTはまたの機会に)
BULK FETCH から INSERT / UPDATE をなるべく簡単に書く方法をすっかり忘れていたのでメモメモ。

これを忘れてしまい検索に手間取ったUPDATEの書式。「ROW=」のところがミソ。
これを使うとレコード毎UPDATEできて便利。

```SQL:BULK_UPDATE

UPDATE <テーブル名>
   SET ROW = <レコード型コレクション>
 WHERE <主キー>;

 ```

INSERTもこんな感じで簡単に書ける。
 
```SQL:BULK_INSERT
INSERT INTO <テーブル名> VALUE <レコード型コレクション>;

```

BULK FETCH からの INSERT / UPDATE を行うとこんな感じになる
1万件をガバッ　と読んで、　変更データをコレクションにため込み 一気に UPDATE/INSERT して効率を高めます。
（便宜上、中でSELECT文を入れていますが UPDATEも例に入れたかったので^^;)

```SQL:BULK_FETCH_SAMPLE
CREATE OR REPLACE PROCEDURE BULK_FETCH AS 

    BULK_SIZE CONSTANT BINARY_INTEGER := 10000;  
 
    CURSOR curEMP(p_dept_id VARCHAR2) IS
        SELECT EMP_ID, DEPT_ID, EMP_NAME
          FROM EMP
         WHERE DEPT_ID = p_dept_id
         ORDER BY EMP_ID ASC;
    
    TYPE typCurEmp IS TABLE OF curEMP%ROWTYPE ;
    TYPE typEmp2 IS TABLE OF emp2%ROWTYPE ;
 
    rdEmp typCurEmp;
    insEmp typEmp2 := typEmp2();
    updEmp typEmp2 := typEmp2();
    num number(10);
    
BEGIN

    OPEN curEMP('1000');

    LOOP
    
        FETCH curEMP BULK COLLECT INTO rdEmp LIMIT BULK_SIZE;
        EXIT WHEN rdEmp.COUNT = 0;
    
        insEmp.delete;
        updEmp.delete;
    
        FOR i in 1..rdEmp.COUNT LOOP
    
            SELECT count(1) 
              INTO num
              FROM emp2
             WHERE emp_id = rdEmp(i).emp_id; 
       
            IF num > 0 THEN
                updEmp.EXTEND;
                updEmp(updEmp.COUNT).emp_id := rdEmp(i).emp_id;
                updEmp(updEmp.COUNT).dept_id := rdEmp(i).dept_id;
                updEmp(updEmp.COUNT).emp_name := rdEmp(i).emp_name;
            ELSE
                insEmp.EXTEND;
                insEmp(insEmp.COUNT).emp_id := rdEmp(i).emp_id;
                insEmp(insEmp.COUNT).dept_id := rdEmp(i).dept_id;
                insEmp(insEmp.COUNT).emp_name := rdEmp(i).emp_name;
            END IF;
        END LOOP;

        FORALL i in 1..insEmp.COUNT 
            INSERT INTO emp2 values insEmp(i);
        
        FORALL i in  1..updEmp.COUNT
            UPDATE emp2 SET ROW = updEmp(i) Where emp_id = updEmp(i).emp_id;
        
        COMMIT;

    END LOOP;
    CLOSE curEMP;

END BULK_FETCH;
```

これで大量データの移行データも楽ちんチン！
Bluemix：簡易ETLサービスDataConnect（データのロード対象にローカルマシン上のファイルもサポートされました）

最近、データのロードの対象がまた増えました。
MySQLとかHadoop系のラインナップも増えましたが、ローカルマシン上のファイル（デスクトップにあるファイルとか）もサポートされました。

たとえば、dashDBとかであれば、過去記事（以下リンク）にも書きましたが、**クラウドサービスのひとつとして「デスクトップのファイルをアップロード」とかが備わっていますが、そういうのが備わっていないDBも往々にしてあるわけですので、まあ使い道はある**かなと思います。
http://qiita.com/azzeten/items/d10fa47d115093cffef8

## どこからアップロードできる？

###アップロード方法
DBをSourceやTargetにするときとちょっと違うやり方です。
通常であれば「Create Connection」から入るのですが、ローカルマシン上のファイルを使うときは、**いきなりRefine&Copyからスタートです。**
Filesを選択します。

ロードするときは画面の一番下にドラッグ＆ドロップです
もしくは、「＋」マークをクリックするとウィンドウが現れるのでそこからファイルを選択します。

![スクリーンショット 2016-11-03 20.40.23.png](https://qiita-image-store.s3.amazonaws.com/0/119378/b349a6dc-b97a-bd6d-ec42-ca3674a80386.png)



###その他気をつけるポイント
ただデータが入ってるだけのCSVでは、列名がCOLUMN1とか適当な名前になるので、編集する必要があります。**refine dataから、change schema、さらに列名をそれっぽくつけて、NEXT**でウィザードを進めます。
![スクリーンショット 2016-11-03 20.47.15.png](https://qiita-image-store.s3.amazonaws.com/0/119378/b9bf0a7c-6014-8f3f-24cc-2f567205c41d.png)
Windows10 でタスクバーにスタートメニューを表示する

1. 準備
[コントロールパネル]-[エクスプローラーのオプション]
[表示]タブで、
◎隠しファイル、隠しフォルダー、および隠しドライブを表示する

2. 設定
タスクバーを右クリックし、
[ツールバー]-[新規ツールバー]
C:\ProgramData\Microsoft\Windows\ まで辿り、[スタート メニュー]を選択し、
「フォルダーの選択」を押下する。

3. 結果
すると、ツールバーに
[スタート メニュー >>] が出現します。

以上
Go手習い１：デカルト積（直積）

##背景
今回はデカルト積（直積）を書いてみる。
複数個の配列（正確にはスライス）からそれぞれ一つの要素を取り出して全ての組合せを作成する。
##実装１：後ろから前に結果を作る。
再帰関数で実装する。最後の配列までたどり着いたら一旦{nil}で返し、一階層ずつ戻りながら後ろから逆順に結果を作成する。
例えば、{{1, 2, 3}, {4, 5}, {6, 7}}の直積はこんな感じで結果にたどりつく。
{nil}
=> {{6},{7}}
=> {{4,6},{4,7},{5,6},{5,7}}
=> {{1,4,6},{1,4,7},{1,5,6},{1,5,7},{2,4,6},{2,4,7},{2,5,6},{2,5,7},{3,4,6},{3,4,7},{3,5,6},{3,5,7}}

```go:cartesian.go
package main

import "fmt"

func cartesian(list [][]interface{}) [][]interface{} {
        return cartesianHelper(0, list)
}

func cartesianHelper(n int, list [][]interface{}) [][]interface{} {
        var result [][]interface{}

        if n == len(list) {
                result = [][]interface{}{nil}
        } else {
                for _, e := range list[n] {
                        for _, r := range cartesianHelper(n+1, list) {
                                s := []interface{}{e}
                                s = append(s, r...)
                                result = append(result, s)
                        }
                }
        }
        return result
}

func main() {
        var list [][]interface{}
        var result [][]interface{}

        list = [][]interface{}{{1, 2, 3}, {4, 5}, {6, 7}}
        result = cartesian(list)
        fmt.Println("list:", list)
        fmt.Println("result:", result)

        list = [][]interface{}{{"xxx", "yyy"}, {"aaa", "bbb"}}
        result = cartesian(list)
        fmt.Println("list:", list)
        fmt.Println("result:", result)
}
```
###わからないこと
- 結果を作成するところで ```s = append(s, r...)``` は後ろにスライスをコピーするので遅そう。

##実装２：前から後ろに結果を作る。
同じく再帰関数だが、今度は前から順に結果を作りながら後ろに渡す。最後までたどり着いたらそれが結果となる。
例えば、{{1, 2, 3}, {4, 5}, {6, 7}}の直積はこんな感じで結果にたどりつく。
{nil}
=> {{1},{2},{3}}
=> {{1,4},{1,5},{2,4},{2,5},{3,4},{3,5}}
=> {{1,4,6},{1,4,7},{1,5,6},{1,5,7},{2,4,6},{2,4,7},{2,5,6},{2,5,7},{3,4,6},{3,4,7},{3,5,6},{3,5,7}}
結果を貯め込んで引数として再帰的に渡す必要がある。このためヘルパー関数でかぶせる。

```go:cartesian2.go
package main

import "fmt"

func cartesian(list [][]interface{}) [][]interface{} {
        return (cartesianHelper(list, [][]interface{}{nil}))
}

func cartesianHelper(list [][]interface{}, result [][]interface{}) [][]interface{} {
        if 0 == len(list) {
                return result
        }
        var s [][]interface{}
        for _, r := range result {
                for _, e := range list[0] {
                        s = append(s, append(r, e))
                }
        }
        return cartesianHelper(list[1:], s)
}

func main() {
        var list [][]interface{}
        var result [][]interface{}

        list = [][]interface{}{{1, 2, 3}, {4, 5}, {6, 7}}
        result = cartesian(list)
        fmt.Println("list:", list)
        fmt.Println("result:", result)

        list = [][]interface{}{{"xxx", "yyy"}, {"aaa", "bbb"}}
        result = cartesian(list)
        fmt.Println("list:", list)
        fmt.Println("result:", result)
}
```

###わからないこと
- 末尾再帰は動作時にgotoになるのか？
JQueryで子要素を取得するメソッド


**findメソッド**

**findメソッド**は、すべての子孫要素(自分よりも下の階層の要素すべて）の中から、指定したセレクタを持つ要素を取得したいときに用いる。

下図の例では、`<div id="wrapper">`から`</div>`の中にあるすべての`<a>要素`を取得することができる。 

```
<div di="wrapper">
	<a href="#">リンク１</a>
	<p>
		<a href="#">リンク2</a>
	</p>
</div>
```
リンク１、２両方にcssが適用される。

```
$('#wrapper').find('a').css('color','red');
```

**childrenメソッド**

**childrenメソッド**は、指定したセレクタが持つ子要素（一階層だけ下）の中から指定したセレクタに合致した要素を取得したいときに用いる。

下の例では`<div id="wrapper">`の子要素は`<a>タグ`と`<p>タグ`が一つずつなので、`<a>タグ`が一つ取得される。 


```
<div di="wrapper">
	<a href="#">リンク１</a>
	<p>
		<a href="#">リンク2</a>
	</p>
</div>
```
リンク１のみにcssが適用される。

```
$('#wrapper').children('a').css('color','red');
```
Redmine情報オレオレまとめ

# [概要]
## Redmineとは
オープンソースで利用できるプロジェクト管理ソフトで、タスク管理、進捗管理、情報共有がWeb上で使える。

## 特徴
 - オープンソースで提供されている

## 依存関係
 - 

## 公式リンク
 - http://www.redmine.org/
 
# [知っておくべきこと]

# [目次]
 - Redmine構築
  - [Centos7にNginx + UnicornでRedmine3.3構築方法](http://qiita.com/sabakan7/items/d20e81b9395a654f6e55)
  - [Centos7にNginx + Unicornで構築したRedmine3.3の初期設定](http://qiita.com/sabakan7/items/c6a2f4bf92f604321b11)
 - プラグイン
  - [Centos7にNginx + Unicornで構築したRedmine3.3にredmine_knowledgebaseをインストールする](http://qiita.com/sabakan7/items/e16cae860c2cc5eaeefe)
  - [Centos7にNginx + Unicornで構築したRedmine3.3をLet's EncryptでSSL化対応](http://qiita.com/sabakan7/items/ee0ba72bed560311eb1d)
  - [Centos7にNginx + Unicornで構築したRedmine3.3にredmine_agileをインストールする](http://qiita.com/sabakan7/items/522f7517db82fb79e2e5)
 - カスタマイズ
  - [Centos7にNginx + Unicornで構築したRedmine3.3のテーマを変更する](http://qiita.com/sabakan7/items/d5adb448e9a3ca6b4377)
機械学習勉強メモ3: SVM

サポートベクターマシン
-
サポートベクターマシン（英: support vector machine, SVM）は、教師あり学習を用いるパターン認識モデルの一つである。分類や回帰へ適用できる。1963年に Vladimir N. Vapnik, Alexey Ya. Chervonenkis が線形サポートベクターマシンを発表し[1]、1992年に Bernhard E. Boser, Isabelle M. Guyon, Vladimir N. Vapnik が非線形へと拡張した。
サポートベクターマシンは、現在知られている手法の中でも認識性能が優れた学習モデルの一つである。サポートベクターマシンが優れた認識性能を発揮することができる理由は、未学習データに対して高い識別性能を得るための工夫があるためである。
![image](https://qiita-image-store.s3.amazonaws.com/0/138880/9efe4e9d-d1dc-9c1a-177e-ccceff09b81c.png)

出典:https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%83%99%E3%82%AF%E3%82%BF%E3%83%BC%E3%83%9E%E3%82%B7%E3%83%B3

```
from sklearn import svm

X = [[2, 0], [1, 1], [2,3]]
y = [0, 0, 1]
clf = svm.SVC(kernel = 'linear')
clf.fit(X, y)  

print clf

# get support vectors
print clf.support_vectors_

# get indices of support vectors
print clf.support_ 

# get number of support vectors for each class
print clf.n_support_ 

# データ予測
print(clf.predict([[2, 0], [3, 0]]))
```
計算手順:
![image](https://qiita-image-store.s3.amazonaws.com/0/138880/0346a1fc-c893-7bb7-14ed-fc5b81ea4085.png)
Reduxのreducerはオブジェクトで書こーず！！

オブジェクトでキーマッチすればswitchより全然無駄がないはず。
でもどこを見てもみんなswitchでしか書かれていない。。。
ふ、不安なので、ここは仲間を増やしていこう！

ということで、こちら投稿してみました。
何かswitchで書かいたほうが良い理由などあれば教えてください！

以下、サンプル

```js
import Immutable  from 'immutable';
import * as types from '../const/actionTypes';

// 初期stateの設定
const defaultState = {
    hoge  : false,
    fuga  : true,
    error : false,
};
const initialState = Immutable.Map(defaultState);

// 共通のエラー処理
const setError = (state) => (
    state.set('error', true)
);

// 今までswitchに入っていた処理をオブジェクトに入れたところ
const reducers = {

    [types.SET_HOGE] : (state, action) => (
        state.set('hoge', action.hoge)
    ),

    [types.SET_ALL_FLAG_FALSE] : (state) => (
        state.withMutations(m => (
            m
                .set('hoge', false)
                .set('fuga', false)
        ))
    ),

    [types.RESET] : () => initialState,

    // fall through で書いていたところは一度関数で書いて当てる
    [types.PIYO_ERROR] : setError,
    [types.PICO_ERROR] : setError,

};

// reducer本体
export default (state = initialState, action) => {
    if (reducers[action.type]) {
        return reducers[action.type](state, action);
    }
    return state;
};
```
Yiと7時間ずっと向き合い続けた僕が出したYiの設定方法

# Yiと7時間ずっと向き合い続けた僕が出したYiの設定方法
　今日は、yi-editorが参照する**設定**、Vimでいう.vimrcである`yi.hs`をgitから落とした最新版のYiで使おうとしてて気づいたら7時間ずっと作業してました。

今日の成果（この記事の結論）はここにあります。

- [aiya000/dotfiles - .config/yi](https://github.com/aiya000/dotfiles/tree/31bb324e74d0c8716e4f0154b89cd8adbfd4317b/.config/yi)

- - -

# About
　[このIssue](https://github.com/yi-editor/yi/issues/931)が解決したので、喜んで最新版Yiをビルドし、`yi.hs`を使ってもらおうとすると以下の災害に見舞われたので

- Yiを起動しても`yi.hs`を読み込まない

色々考えましたが、結論は「**yi.hsを使わないで、static形式の設定をする**」ということでした。

なおこの記事での方法を使えば（`yi.hs`を使わないので）以下の記事の方法は不要になります。

- [Yiエディタの設定ファイル(yi.hs)でhaskell-stackを使う - Qiita](http://qiita.com/aiya000/items/4d6493d1ef3098907a23)


# static形式とdynamic形式の設定とは
　[Yiのリポジトリ](https://github.com/yi-editor/yi)へアクセスし、Yiの設定方法すると[example-configs](https://github.com/yi-editor/yi/tree/master/example-configs)を参照せよ…
ということらしいので、example-configsを見てみます。

すると、いくつかの設定のうち

- yi-\*-dynamic
- yi-\*-static

というものに大分できるのがわかるかと思います。

## static
　`yi.hs`を使わず、設定を含めつつ**Yi全体**をビルドしてしまう方式のようです。
以下の特徴があります。

- `yi.hs`の代わりに`Main.hs`を書く
    - `Main.hs`からYiの各モジュールを使って、`main`（Yiのエントリーポイント）から自分で書く
- `package.yaml`というファイルが必要になる
    - `stack.yaml`は、これから自動的に出力される
- **公式がこの方法を紹介していないっぽい**

超大胆。

## dynamic
　`yi.hs`を使う形式です。

- `yi.hs`のみをコンパイルするので、ビルド時間が全然早い
    - staticでのビルドでも、一度フルビルドした後は差分ビルドが走るので大問題はない

普通。


# 結論
　謎の災害に見舞われたらstatic形式でYiを設定しよう。
[Rust] 文字列のフォーマット指定（println! / format!）


# TL;DR
Rustの`println!`のフォーマット指定についての記事です。

長い記事でもありませんが、以下のソースを見れば大体わかります。
https://gist.github.com/YusukeHosonuma/6ee32ade9ac88cbc9fbd6b494154c5a0

# はじめに
最近「Rustはいいぞ！」という声を聞いたり、Swiftが影響を受けた言語がRustだったりと、気になったので勉強し始めました。

Rustで標準出力は`println!`マクロで行うのですが、フォーマット指定がC言語などの`printf`とは異なります。

以下のあたりのドキュメントに詳しく書かれているのですが、自分でコードを書いていて迷ったりすることもあったのでまとめてみました。（網羅はしていません）

https://doc.rust-lang.org/std/fmt/index.html

# 基本
- `println!`で標準出力
- `{}`がプレースホルダ
- `format!`でフォーマット後の文字列を取得（指定方法は同じ）
- どちらもマクロで実装されている
  - なので実行時のオーバーヘッドが（C言語のprintfよりは）少ない（はず）
  - ただコンパイルエラーメッセージがわかりづらいことがある

```rust
println!("Hello world!");
println!("Hello {}!", "world");

let s = format!("Hello, {} !!", "Rust"); // s = "Hello, Rust !!"
```

# プレースホルダ
- `{}` が基本で引数が順に埋められる
- `{n}` で n番目（0始まり）の引数で置き換える
- `{name}` で `name="value"` と指定した引数で置き換えられる

```rust
println!("{} | {} | {1} | {three} | {four}",
         "One",
         "Two",
         three="three",
         four=4);
// => One | Two | Two | three | 4
```

# 揃え（Align）
- `:` の後に条件を指定
- `<n` が n桁で左寄せ
- `>n` が n桁で右寄せ
- `^n` が n桁で中央寄せ
- `>0n` または `<0n` で「0埋め」

```rust
println!("{0: <8} | {1: >8} | {2: ^8} | {3: <08} | {4: >08} | {hundred: >08}",
         "Left",
         "Right",
         "Center",
         42,
         999,
         hundred=100);
// => Left     |    Right |  Center  | 42000000 | 00000999 | 00000100
```

# 基数 / 小数点
- `b`がバイナリ表現
- `o`が8進数
- `x`が16進数（`X`で大文字出力）
- `e`が指数表現（`E`で大文字出力）

```rust
println!("{:b}", 1234);  // => 10011010010
println!("{:o}", 1234);  // => 2322
println!("{:x}", 1234);  // => 4d2
println!("{:X}", 1234);  // => 4D2
println!("{:e}", 12.34); // => 1.234e1
println!("{:E}", 12.34); // => 1.234E1
```

# fmt::Display / fmt::Debug
- `{}` では `fmt::Display` の実装が使われ
- `{:?}` では `fmt::Debug` の実装が使われる

```rust
// 構造体の宣言
struct Point {
    x: i32,
    y: i32,
}

// fmt::Display トレイトの実装
impl fmt::Display for Point {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
       write!(f, "({}, {})", self.x, self.y)
    }
}

// fmt::Debug トレイトの実装
impl fmt::Debug for Point {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "Point(x: {}, y: {})", self.x, self.y)
    }
}

let p = Point { x: 1, y: 2 };
println!("{}", p);    // => (1, 2)
println!("{:?} ", p); // => Point(x: 1, y: 2)
```

# 終わり
Rustはいいぞ！
開発中に今まで使えていたライブラリがいきなり使えなくなった時の対処

チーム開発の際に起こったエラーへの対処メモです。

# 状況
- 発生事象
    - <FONT color=red>さっきまで使えていたJavaのライブラリが使えなくなった</FONT>
  
- 状況
    - DevOps Servicesを利用してチームで開発している
    - 開発ツールはEclipse
    - 言語はJava
    
- **原因**
    - <FONT color=red>**保留中の変更を受諾した時にJavaのビルドパスが書き換わってしまった**</FONT>


# 対処法
 - 作業中のプロジェクトで、右クリック > [ビルドパス] > [ビルドパスの構成]を選択。
 - ライブラリータブの中で「アンバインド」になっているものを除去
 - （欠落）がついているものも除去
 - [ライブラリーの追加] > [サーバーランタイム]を選択し、元々使っていたランタイムを追加




![Picture1.png](https://qiita-image-store.s3.amazonaws.com/0/145054/a7508f0f-97a4-21a6-9d6b-5ca74ec00747.png)


　　　　　　　　　　　　　**はい！　　　　もと通り！**

# Tips
- 自分の作業成果をチームのワークスペースに提出する（デリバーする）際には、<FONT color=red>**不要な設定ファイルは入れない！**</FONT>
- さっきまで使えていたライブラリがいきなり使えなくなった時は<FONT color=red>**ビルドパスをチェック！**</FONT>
ACCESS 2010バイオメトリクス（指紋認証）の回避困難なバグ

#[Access 2010 のナビゲーション ウィンドウからテーブルを開くと Access 2010 が "応答なし" の状態になる場合がある] (https://support.microsoft.com/ja-jp/kb/2472711#top)


[パソコンカレッジ　スタッフのひとりごとパソコンスクールのスタッフが、初心者から上級者まで役立つ情報をお伝えします。 Access2010 テーブルやクエリが開けない](http://blog.goo.ne.jp/pc_college/c/f44667fe8f4d39b4eede9581e7e990e8)
このブログによるとヒューレットパッカード製であれば指紋認証がなくてもDLLが動いているため、上記のエラーが出る。
このバグ、なにがすごいかというと
##対応方法が事実上ない
ことにつきる
この現象は、コンピューターを購入時点で、以下のサービスがインストールされていて、これらのサービスが有効になっている場合に発生する場合があります。•サービス名 : バイオメトリック認証サービス
•サービス名 : DP HOST
たしかに個人のPCなら上記のパソコンカレッジのようにmsconfigできることができるが、そもそも会社で使うことが多いACCESSではそんな設定はシスアドしかいじれない。しかも指紋認証サービスを使っていればセキュリティに直結している。つまりマイクロソフトでは対応できないのである。

MS公式も
##回避策
この現象を回避するには、お使いのコンピューターのメーカーへお問い合わせください。 
注 : 該当のサービスをむやみに停止するとコンピューターが起動できなくなる場合があります。サービスを停止する場合は、お使いのコンピューターのメーカーへ相談してください。 

文字通り匙を投げている状態。
しかもこれ
文書番号:2472711 - 最終更新日: 10/04/2016 14:56:00 - リビジョン: 4.0
上記のブログは2011年なのに、この原稿を書く時点でMSの公式は最終更新日から1か月しかたっていないのである。つまりこのバグはマイクロソフトでは対応不可能なバグだと言える。
Rust で CSV を加工して Regex 生成に気をつけようと思った話

# 発端

Ruby で CSV ファイルを処理することがよくあるのだが，大きな CSV だとけっこう処理時間がかかる。
そこで，全角英数字の半角化，半角片仮名類の全角化，末尾スペースの削除のような，どんなプロジェクトでも共通に使うような基本処理だけ Rust で書いて，前処理としてかませたらどうかと考えた。

# 作譜

Rust はド素人なんだが，[regex](https://crates.io/crates/regex) クレートや [csv](https://crates.io/crates/csv) クレートなどを使ってどうにか CSV 変換プログラムを書き上げた。

コンパイラーの激しいツッコミが却って私を楽にしてくれた感じもする。

試行錯誤を繰り返すと，あちこちに不要コードが散在しがちだけど，コンパイラーがいちいち「この変数，この関数使ってねえだろ！」とか言ってくるので，「はいはいはいはい（ハイは四回まで），消せばいいんでしょ！」とやっていったところ，カオスにならずに済んだような気がする。

# 試行

200列，3000行，10MB 程度の CSV ファイルを処理させてみたところ，90 秒ほどかかった。
うーん，Rust でもそんなにかかるのかあ。（もちろん `--release` で動かしてますョ）

小手先の高速化を試みたけど，たいして改善しない。

# 疑惑

ふと正規表現を使って置換を実行する部分が気になった。

それは例えばこんなふうな感じ：

```rs
Regex::new(r"[０-９ａ-ｚＡ-Ｚ]").unwrap().replace_all(src, ...)
```

「`...`」の部分は文字列変換のクロージャーだ。

実際には，`Regex::new` して `unwrap` するのが面倒なので，以下のような関数

```rs
fn regex(re_str: &str) -> Regex {
    Regex::new(re_str).unwrap()
}
```

を用意しておいて，

```rs
regex(r"[０-９ａ-ｚＡ-Ｚ]").replace_all(src, ...)
```

って書いてるんだけど，本質は同じこと。

で，これってさ，置換をやるたびに毎回 `Regex` を作ってるってことだよね？

ちょっと効率悪くね？

セル値ごとにやってるわけだから，何十万回も同じ Regex を作ってるわけだ？

しかもセルあたり 3 種類の置換を実行しているから，百何十万回も無駄な処理を？

# 改善

そこで，Regex は最初に 1 回だけ作るように変えてみた。

そして，まずはビルド

```bash
cargo build --release
```

して。


そして実行

```bash
cargo run --release
```

だ。

えっと，あれ？　Enter キー押した途端に終わっちゃったぞ？
あっそうか，なんか修正ミスして処理が働いてないんだな。

いや？　ちゃんと変換されてるみたいだが？

マジかよ。90 秒かかってた処理が瞬きくらいになっちまったじゃねえか。

もっとも，今回の CSV では，実際に変換が起こる箇所（半角片仮名など）はわずかしか無い。変換箇所が多数あればもっと時間がかかるのかもしれない。

# 教訓

ループ内で Regex を作るべからず。

# 参考

あらかじめ Regex を作っておくのはいいのだけど，今回の場合，何かの関数内で生成するのではなく，プログラム全体の定数みたいな形で定義しておきたかった。

定数としては `const` があり，それとは別に「グローバル変数」として `static` がある。

ところが，Regex は `const` にも `static` にもできない。つまり，

```rs
static re: Regex = Regex::new(r"[０-９ａ-ｚＡ-Ｚ]").unwrap;
```

みたいなことはできない。
（よく分からないけど，`const` も `static` もコンパイル時に値が確定しなくてはならなくて，`Regex::new` みたいなメソッド呼び出しは認められないということかな？）

どうすりゃいいのさ？と思ったら次のありがたい記事が。

[Rustのstatic変数とthread local - Qiita](http://qiita.com/tatsuya6502/items/bed3702517b36afbdbca)

おかげで実現しましたデス。

だいたいこんな感じで書いた。（ネーミングがイマイチだけど）

```rs
mod str_const {
    use regex::Regex;

    lazy_static! {
        pub static ref RE1: Regex = {
            Regex::new(r"[０-９ａ-ｚＡ-Ｚ]")
        };
    }
}
```

`lazy_static!` マクロがポイントね。

こうしておくと，`str_const::RE1` で呼び出せる。


# 蛇足

Ruby で CSV を扱う場合，その名もずばり [csv](https://docs.ruby-lang.org/ja/2.3.0/library/csv.html) という標準添付ライブラリーを使う。

なかなか使いやすいのだが，一つ妙な癖がある。

```csv
foo,,""
```

という CSV 行は

```rb
["foo", "", ""]
```

にはならずに

```rb
["foo", nil, ""]
```

になるのだ。つまり，ダブルクオートで囲まれていない空セルは空文字列ではなく `nil` になる。（凶悪ぅ）

そのため，すべてのセル値にわざわざ `.to_s` をかまして文字列化するという無駄な処理を書く羽目になる。

そこで，あらかじめすべてのセルをダブルクオートで囲む前処理を Rust でやらせれば，ついでに全角／半角変換とかもやらせれば，Ruby 側で楽かつ時短になるかも，というのが一番最初の動機であった。

ただ，いま測ったら Ruby で 1000 万回の `to_s` が 1 秒程度なので，実行時間では大したロスではないようだ。全角／半角変換の類は Rust 化で速くなるかもしれないが，計測はしていない（あとで試す）。

Rust の csv クレートでは，CSV 書き出しのときに

* 必要なセルだけダブルクオートで囲む（デフォルト）
* すべてのセルをダブルクオートで囲む
* ダブルクオートで囲まない（ダブルクオートが必要なセルがあると死ぬ）

が選べるようになっている。[csv::Writer](http://burntsushi.net/rustdoc/csv/struct.Writer.html) の [quote_style](http://burntsushi.net/rustdoc/csv/struct.Writer.html#method.quote_style) のメソッドで指定する。

本当は，CSV ファイルのサイズを抑え，パース時間を抑えるため，必要なセルと空セルのみダブルクオートで囲ませたかったのだが，そういうオプションは無かった。
golangパフォーマンス3: mapとGC

テスト環境 go version go1.7.3 windows/amd64

デフォルトの容量
-
golangのmap容量を拡張時に元データコッピーと再ハッシュが行うため
mapを作成時に容量を設定するほうがいいです。

```
package main

import "testing"

func test(m map[int]int) {
	for i := 0; i < 10000; i++ {
		m[i] = i
	}
}

func BenchmarkMap(b *testing.B) {
	for i := 0; i < b.N; i++ {
		b.StopTimer()
		m := make(map[int]int)
		b.StartTimer()

		test(m)
	}
}

func BenchmarkCapMap(b *testing.B) {
	for i := 0; i < b.N; i++ {
		b.StopTimer()
		m := make(map[int]int, 10000)
		b.StartTimer()

		test(m)
	}
}

```

テスト結果:
![image](https://qiita-image-store.s3.amazonaws.com/0/138880/2b180af0-6f44-c83f-9d3b-5cae547ec602.png)

value vs pointer
-
```
package main

import (
	"runtime"
	"time"
)

const capacity = 500000

var d interface{}

func value() interface{} {
	m := make(map[int]int, capacity)

	for i := 0; i < capacity; i++ {
		m[i] = i
	}

	return m
}

func pointer() interface{} {
	m := make(map[int]*int, capacity)

	for i := 0; i < capacity; i++ {
		v := i
		m[i] = &v
	}

	return m
}

func main() {
	//GC走る時間のはmao key/valueほうがmap key/pointerにより早い
	//でも大valueは多き(struct対象など)場合はkey/pointerが進めです
	d = value() // d = pointer()

	for i := 0; i < 20; i++ {
		runtime.GC()
		time.Sleep(time.Second)
	}
}

```
テスト結果:(GCの時間を比べてください)
value関数を利用する場合:
![image](https://qiita-image-store.s3.amazonaws.com/0/138880/243e11ee-f430-3b80-1e20-aa9baef16fa2.png)
pointer関数を利用する場合:
![image](https://qiita-image-store.s3.amazonaws.com/0/138880/55dc6775-73f0-ebe2-9e85-d9834103adac.png)

mapとメモリ空間
-
```
package main

import (
	"runtime/debug"
	"time"
)

const capacity = 1000000

var dict = make(map[int][100]byte, capacity)

func test() {
	//データ追加
	for i := 0; i < capacity; i++ {
		dict[i] = [100]byte{}
	}

	//データ削除 (メモリ解放しません)
	for k := range dict {
		delete(dict, k)
	}

	dict = nil //メモリ空間解放
}

func main() {
	test()

	for i := 0; i < 20; i++ {
		debug.FreeOSMemory()
		time.Sleep(time.Second)
	}
}
```
テスト結果:
dict = nilをしない場合
![image](https://qiita-image-store.s3.amazonaws.com/0/138880/c2497276-22e5-d3b0-2d98-1d9135d97d96.png)

dict = nilする場合
![image](https://qiita-image-store.s3.amazonaws.com/0/138880/71359d8d-85e1-f50b-bdad-337946b7a45e.png)
UnityでセーブデータをSerialize保存する 〜現状〜

[Unityでセーブデータを暗号化してSerialize保存](http://qiita.com/tempura/items/a9b63ce8a32def6a69b1)
[Unityでセーブデータを暗号化してSerialize保存 ～その2～](http://qiita.com/tempura/items/84143f36160a66519c5e#_reference-337b852f2c48890db39f)
[Unityでセーブデータを暗号化してSerialize保存 ～その3～](http://qiita.com/tempura/items/ad154d1269882ceda0f4#_reference-51e2e9420e8de3b53eaa)

UnityでのSerialize保存の現状をまとめとく。

# オススメ
<font color=blue>**ZeroFormatter > ScriptableObject > JsonUtility > Easy Save > FlatBuffers > MessagePack > その他**</color>

正確に全て比較したわけじゃないので実際なんとも言えないのだけど、個人的なオススメ順。

# [MessagePack](https://github.com/msgpack/msgpack-cli)
C#のMessagePackライブラリはいろいろあるけど、表題のものが一番更新頻度が高い。実際に使ったことがあるのだけど、自分が試した時は動作が不安定だった印象(まだIL2CPPにも対応されてなかった)。ただ自分が試した時から1年くらい経過してIL2CPPに対応されたりバージョンアップを繰り返したりで今なら安定性向上してるかも。
バイナリなんで速いは速いと思うんだけど、ちょっと以前の経験から敬遠気味。

# [FlatBuffers](http://qiita.com/akerusoft/items/8c10f8a40fee722e6d1b)
大手でも採用されてるバイナリシリアライザー。まだ試したことはないのだけど、なかなかすごそう。ただ若干導入が億劫なイメージ(UniRxの人もアプリケーションの層で実用に使うのは無理って言ってるし・・・)。

# [Easy Save](https://assetstore.unity.com/packages/tools/input-management/easy-save-the-complete-save-load-asset-768)
有料Asset。Jsonもバイナリも暗号化も可能で、セーブ可能なデータ型も豊富。評価高いしドキュメントも丁寧だし、めっちゃ優秀なAssetだと思う。

# [ScriptableObject](https://docs.unity3d.com/ja/current/Manual/class-ScriptableObject.html)/[JsonUtility](https://docs.unity3d.com/ja/current/ScriptReference/JsonUtility.html)
Unity管理、ネイティブで処理されるのでかなり速い。Unityとの相性抜群(作業効率UP)。ScriptableObjectだったらUnity上でデータ操作出来るし、AssetBundle化もしやすいし、なんだかんだUnityの恩恵を得られるのがでかい。

# [ZeroFormatter](https://github.com/neuecc/ZeroFormatter/)
UniRxの作者の人が作った**無限大高速シリアライザー**。詳しくは[こちら](http://neue.cc/2016/11/08_542.html)を確認してもらいたいが、概念はFlatBuffersと同じ思想で、Unityで使いやすいように作られてるよう。まだ試してないが、これはUnityのシリアライザーの歴史を変えるかもしれない・・・。

# 最後に
もちろん用途にもよるとは思う。Jsonだったら中身がテキストなんでデバッグしやすいとか、バイナリだったらパッと見わかり難いから暗号化しなくてもいいとか。

自分の場合は以下。

**ユーザデータ -> サーバ管理**
**ゲームデータ -> ScriptableObject**
**それ以外　　 -> PlayerPrefs**

不正はサーバで防ぐものなのでユーザデータは全てサーバ。
見られても構わないものはほとんどScriptableObject。
それ以外のちょっとしたセーブデータはPlayerPrefs。

ScriptableObjectが一番使いやすい。

- 速い
- Unity上でデータ操作出来る
- 外部データ化しやすい(AssetBundle)
- 暗号化気にしなくていい(パッと見わかり難い)
- Unity管理(お任せ)

　
ZeroFormatter、今度さっそく試しみよう(´・ω・`)
NFSサーバクライアント環境の構築メモ

# CentOS7サーバとubuntu15.04クライアント間NFS構築
基本的にserverworldを参考にしたが、iptablesでつまづいたのでメモ

## サーバ側(CentOS7)
[偉大なるserverworld](https://www.server-world.info/query?os=CentOS_7&p=nfs&f=1)
ここで、firewallではなくiptablesを用いていたため、こちらの[記事](https://gist.github.com/yosukeyoshida/8051512)を参考に設定した。



``` console:/etc/sysconfig/iptables

#iptables設定
#下記を追記
  -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 2049 -j ACCEPT
  -A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 2049 -j ACCEPT
  -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 111 -j ACCEPT
  -A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 111 -j ACCEPT
  -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 892 -j ACCEPT
  -A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 892 -j ACCEPT

```


## クライアント側(Ubuntu15.04)
[Ubuntu16.04のページ](https://www.server-world.info/query?os=Ubuntu_16.04&p=nfs&f=2)の通りで設定できた。
すぐタイムアウトするファイルをなんとかダウンロードする

# 起こったこと
+ [IntelliJのScalaプラグイン](https://plugins.jetbrains.com/plugin/?id=1347)をインストールしようと思ったら失敗した
+ タイムアウトしてるっぽい

# したいこと
+ IntelliJのScalaプラグインをインストールしたい（切実）

# 試したこと
## 手動でインストール
+ [ここ](https://plugins.jetbrains.com/plugin/?id=1347)からダウンロード
+ 一見上手く行くように見えるが数百KB分くらいしかダウンロードされておらずダメ（タイムアウトしてるっぽい）

## ミラーリポジトリを探す
+ なさそう（ちゃんと探してないけど）

## バイナリを直接探す
+ なさそう（ちゃんと探してないけど）
+ なんか中華のはあった

## curlでレジュームし続ける
+ これを試します
+ 手でやると違憲っぽい（人権ない）のでなんとかします

# はうつー
リターンコードと`while`でなんとかなるっしょと思ったら`until`っていうのがあるんですね。
こんな感じで

```bash
until \
	curl -C - -o file.zip https://nin-i/no/file.zip; do
	sleep
done
```

# 結果
あと19時間かかる（マジかよ）らしいので終わったら更新します（多分）
（ファイルハッシュくれ…）
JQueryで変数を使う


同じjQueryオブジェクトを複数回使用する時は変数にする。
JavaScriptと同じく、jQueryで変数宣言には`var`を用いる。

変数には文字列や数値、jQueryオブジェクトなどを
格納することができるが、jQueryオブジェクトを格納する時は、
わかりやすいように **変数の頭に$を付ける**のが慣例となってる。

例えば、
変数を使わない場合

繰り返し同じ$('div')を使っている

```
$('div').css('color','red')
$('div').html('JQuery');
$('div').fadeOut();
```

変数を使用すると


```
var $div = $('div');

 $div.css('color','red')
 $div.html('JQuery');
 $div.fadeOut();
``` 

コードが見やすくなる上、 **jQueryの処理が高速化される。**
JavaScriptの関数の引数が想定していない値ならデフォルト値を強制する（つっこみ待ち）

こういう関数を書いていて、あれっ、となりました。

```javascript
var example = function( current, value ){
    changed = Number(current) + Number(value);
    // changedで何かする
}

$('a.js-example').click(function(){
    var current = docCookies.getItem('current');
    var value = $(this).data('value');
    example( current, value );
    return false;
});
```

「js-example」クラスが付いているリンクをクリックすると、cookieに保存されていた値とdata-value属性の値を数値として加算するのですが（用途は適当にお察しください）、この場合以下の状況だとエラーになってしまうなあと思いました。

1. cookieが保存されていない（null）
2. cookieに入っている値が数値ではない（NaN）
3. data-value属性がない（undefined）
4. data-value属性に入っている値が数値ではない（NaN）

いろいろ調べて、結局それぞれについて型レベルでチェックしなければダメなようだ…ということで以下のようにチェック関数を書きました。
undefined, null, NaNであれば強制的に第二引数の数値に変換します。

チェックした限りでは問題ありませんでしたが、引数が配列やオブジェクトだったときのことは考えていないです。

```javascript:function_default_value.js
var default_value = function( val, default_val, nan_check ){
    var return_val = val == undefined ? default_val : val;
    return_val = val === null ? default_val : val;
    if( nan_check === 1 ) {
        return_val = isNaN(val) ? default_val : val;
    }
    return return_val;
};

var example = function( cur, val ){
    var current = default_value( cur, 0, 1 );
    var value = default_value( val, 0, 1 );
    changed = Number(current) + Number(value);
    // changedで何かする
}

$('a.js-example').click(function(){
    var current = docCookies.getItem('current');
    var value = $(this).data('value');
    example( current, value );
    return false;
});
```
PhantomJS は 302 を success 扱いするが、 301 は fail

言いたいことはタイトルが全てで、 PhantomJS は 302 リダイレクトを success として扱うが、 301 は fail 扱いする。

なので Poltergeist で 301 のページに `visit` すると `Capybara::Poltergeist::StatusFailError` になるが、その時のエラーは

![image](https://qiita-image-store.s3.amazonaws.com/0/153/e24eced3-b547-5113-9c19-37e38e46f549.png)

みたいな感じで、パッとみた限り何が問題なのか分からないので注意が必要。

---

PhantomJS のオプションなどでこの振る舞いを変える方法があったら教えて欲しいです :pray: （help には少なくともそれっぽいのは無かった）
【簡単】Visual StudioでJSONのデシリアライズ用のクラスの作り方

## 動作環境
- Windows 10 Professional　64bit
- Visual Studio 2015 Community

## 作り方
1. JSON形式のテキストを「ctrl+c」でコピーする。
2. csファイルを開く。
3. メニューの「編集 -> 形式を選択して貼り付け -> Paste JSON As Classes」を選択する
4. JSONの構造に沿ったクラスが作成されるので、適宜名称、型を編集して完成！！
「フォルダが空」の表示されたUSBメモリを復元する方法

<strong>USBメモリは「フォルダが空」と表示された</strong>

いつも通りUSBメモリを使おうとしたら、「フォルダが空」と表示されました。プロパティでデータ容量を確認したところ、データはあるみたいでした。自分としてはUSBメモリのデータを削除した記憶はないので、データはあるけどUSBのデータを読み込むところが壊れているからデータを表示できないのかな？と考えているんですが…私はパソコンの事はよくわからないので、USBメモリの中身を復元できますか。
上記の例がよく見えますよね。では、自分で復元できる方法を紹介します。

<strong>USBメモリに対応した無料復元ソフト</strong>

<a href="https://jp.easeus.com/data-recovery-software/drw-free.html">EaseUS Data Recovery Wizard Free</a>は、USBメモリからあらゆるデータ損失の問題を解決できる専門なフリーソフトです。フォーマット、削除、アクセスできないUSBメモリの中のフォルダを救出できます。USBメモリをはじめ、HDD、外付けHDD、メモリカード、デジカメなどの記憶メディアから紛失またはほかの原因不明のデータ損失に対応できます。今すぐこの[データ復元ソフト](https://jp.easeus.com/data-recovery-software/drw-free.html)をダウンロードして、失われたデータを復元してみましょう。クリック操作で2つのステップで復元できます。

ステップ1.紛失したファイルの場所を選択して、「スキャン」ボタンをクリックします。
![qi.png](https://qiita-image-store.s3.amazonaws.com/0/124905/7524affc-47f3-fe8d-20cf-18a8ceb167e6.png)
ステップ2.ソフトが自動的にスキャンします。スキャンが完了したら、復旧可能なファイルをプレビューできます。必要なファイルにチェックを付け、「リカバリー」ボタンをクリックして、復旧できます。

USBメモリのほか、[SDカード復元](https://jp.easeus.com/storage-media-recovery/recover-deleted-sd-card-data.html)、[外付けHDD復旧](https://jp.easeus.com/storage-media-recovery/free-recover-external-hard-drive.html)にも対応できます。
Mac | 覚えにくい！ Command / Control / Option / Shift キーを記号の由来で覚えよう

こいつら、ほんと直感的に覚えられない。
由来で覚えてみよう。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/407c07a1-d11b-f27d-b375-0fb78e0f34ff.png)


# ⌘ Command

その昔、MacではCommandキーは「Appleキー」という名前で、Macの様々なメニューを開くためのものだった。
だがMacのメニューにあまりにも多くのAppleロゴが表示されるため、スティーブジョブスはそれを「馬鹿らしい」と考えて、キーの用途もロゴも変更することになったのだ。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/365e5f17-f1d8-cf96-6e4e-e117ba90e9ec.png)


そしてMacというOSに依存しない、恒久的な「コマンドキーのシンボル」を創造しようとした。

新しいCommandマークの元となったのはスウェーデンの城だ。
ここには昔、兵士たちが駐屯していた。

だから「兵士たちにCommand(命令)する」とイメージすると覚えやすいだろう。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/71210564-b61e-91d3-6950-97a3fb373b71.png)

ちなみにデザインしたのはAppleのリンゴのロゴをデザインしたのと同じ人。

# ⌃ Control

あまり情報が出てこなかったため定かではないが、キャレット ( `^` ) は ASCII でのコントロールキャラクターを示す記法に使われるため、これが由来ではないかと思われる。

きっとあなたにも、ターミナルで `Ctrl+C` を押すと、`^C` がたくさん表示された経験があるだろう。これを思い出してみよう。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/8aa71eb9-3fa7-e680-1873-752c009ee84b.png)


# ⌥ Option

由来は明らかになっていないようだ。

- 「SPDTスイッチ(A/Bの状態を切り替えるもの)」を表現している。
- 「線路の分岐部分」を表現している。

という説がある。どちらにしても「切替」を表現していそうだ。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/5060c684-215a-2db4-4daa-cdae189e064d.png)

# ⇧ Shift

特に情報源なし。

Shiftを押しながら英字を打つと、文章が大文字（Upper Case）になるだろう。
このマークはその役目とおり、上向きの矢印になっている。

「大文字にするから上矢印」と考えると覚えやすいだろう。

# 備考

- 間違い、新情報などあればお知らせください。

# 参考

- http://www.folklore.org/StoryView.py?project=Macintosh&story=Swedish_Campground.txt
- http://www.tested.com/tech/mac-os/461757-origin-apple-command-icon/
- https://www.quora.com/Computer-Keyboards-What-is-the-origin-of-the-Macs-option-key-symbol-%E2%8C%A5
- https://en.wikipedia.org/wiki/Caret_notation
- https://en.wikipedia.org/wiki/Control_key








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Unityでマイクアイコンが大量表示されたときの対処法：GEForce Experienceのオーバーレイを切る

#ある日突如として現れる謎のアイコン
![micandloopicononunity.png](https://qiita-image-store.s3.amazonaws.com/0/71326/5ace6ad1-3803-b055-f26e-14a290fe53c3.png)

↓マイクと更新ぽいアイコン
![micandloopicon.png](https://qiita-image-store.s3.amazonaws.com/0/71326/fd80ca81-41e5-9155-38f2-0fac642150b0.png)
Sceneやインスペクタ他全てに表示されてクリックも出来ず気持ち悪い。

##調査
日本語情報あまりなかったけど、英語("unity mic icon")で検索したら出てきた。

Strange Microphone icon in viewports? - Unity Answers
http://answers.unity3d.com/questions/1248198/strange-microphone-icon-in-viewports.html

```
Looks like the nVidia Shadowplay icons. 
Check your GEForce Experience settings 
and see whether you've got desktop capture overlay enabled 
or something like that.
```

##原因
![micandloopicongennin.png](https://qiita-image-store.s3.amazonaws.com/0/71326/c840416e-a9dc-1bd3-8ee8-fc62c8ad9208.png)

原因は"GEForce Experience"のオーバーレイ表示機能です。

##対処法
![shadowplay-off_small.png](https://qiita-image-store.s3.amazonaws.com/0/71326/5d86e6ba-117a-b7c1-a6e7-cf7d10446bf4.png)

###テキストで消し方解説
1. GEForce Experienceを開く。
2. 右上の三角形ぽい（「最高のゲームモーメントをシェアする」とかポップアップする）アイコンをクリック。
3. 右下の歯車アイコンから設定を開く。
4. 「オーバーレイ」を開く。
5. 「ステータスインジケータ」でオフを選択する。
6. 戻る→完了→右上バツ印で終了

#応用
FPS表示機能もあるようなので、むしろそっちを表示させるのもいいかもしれない。
ただし、インスペクタ他全てに表示されてしまうけど。
Nodebrew + WebStormの設定


ノードインタプリタのパス
`/Users/hoge/.nodebrew/current/lib/node_modules`

npm install -gで入れたモジュール群は
`/Users/hoge/.nodebrew/current/lib/node_modules`
ここになります。

yeomanパッケージはここ
`/Users/hoge/.nodebrew/current/lib/node_modules/yo`
とあるサービスをPHPで作ってみた時の話

せっかくなので書き残してみた程度の記事です。ご了承ください。

## 何を作ったのか
サマーウォーズファンなら何度も見た事があるであろうこのシーンを、Twitterのタイムラインから取得したツイートで再現するものを作ってみました。

![CvsmLE5VIAAIkVp.jpg](https://qiita-image-store.s3.amazonaws.com/0/71322/64858f3b-5f58-b1d1-7f7f-10fbf4e9ae48.jpeg)

 Github [https://github.com/come25136/OZtter](https://github.com/come25136/OZtter)
~~Raspberry Pi b+ で試用公開しています [https://oztter.f5.si](https://oztter.f5.si)~~
~~OZtterをホスティングしている方が「URL載せていいよー」と言ったので [https://oztter.riku6460.space/normal/](https://oztter.riku6460.space/normal/)~~

[追記] OZtter2作りました
GitHub [https://github.com/momizicode/oztter2](https://github.com/momizicode/oztter2)
こちらはNode.jsで作り直してます ~~[https://oztter2.momizi.work](https://oztter2.momizi.work)~~

[更に追記]
TwitterがUser Streams APIを廃止したので**動きません**

[また追記]
Mastodon版作りました
[https://bl.ocks.org/come25136/raw/ef1e8c41ac87cc70a7b873539691782e/](https://bl.ocks.org/come25136/raw/ef1e8c41ac87cc70a7b873539691782e/)


## なぜ作ったのか
~~暇だったから~~
サマーウォーズの世界観を味わってみたかったから。

## PHPで何をどう実装したのか
サーバーからクライアントへのデータ受け渡し方法はSSE(Server-Sent Events)を採用しました。

### なぜWebSocketではなくSSEを採用したのか
クライアントからサーバーへデータを送る必要がなかったから。
~~PHPでWebSocketが扱いにくいとか決してそういう訳ではない~~

#### Nginx側のバッファ処理でハマった
```php
header("X-Accel-Buffering: no");
```
この一行で解決しました。

### Twitter OAuth認証はどうしたの？
@mpyw 氏作の [cowitter](https://github.com/mpyw/cowitter) を使わせて頂きました。

### サーバー側ではどのような処理をしているのか
Twitter Streaming API で取得したユーザータイムラインをSSEを使ってクライアントへリレーしているだけです。
[https://github.com/come25136/OZtter/blob/master/push.php](https://github.com/come25136/OZtter/blob/master/push.php)

#### なぜサーバーが必要なのか
Twitter API Key が漏れる心配がないからです。

完全に心配がないとは言い切れませんが、クライアントのみでTwitter Streaming APIを使用した場合、JavaScriptに直接API Keyを埋め込む必要があるので、API Keyが漏れる可能性が高くなります。というか漏れます。

## サーバー側の負荷について
負荷は**同時クライアント接続数に比例**します。

**が、**今回は**コネクションが常に繋がっている状態**なので、普通の負荷と思って考えると予想を超えます。

Raspberry Piにとっては地獄ですね (；´∀｀)

## 最後に
**PHPはいいぞ**

とか言うと他の言語を使っている人に~~怒られる~~戦争を仕掛けられるので、あまり大声では言えませんが(笑)

## [追記]この記事を書いてから1年経ったので一言
最近はJS触りながらロリコン発言しています。
確率的勾配法あれこれまとめ

Kerasで選択できる最適化アルゴリズムそれぞれの違いと使い所がいまいちわからんかったので調べてみた。

<a href="http://cs229.stanford.edu/proj2015/054_report.pdf">"Incorporating Nesterov Momentum into Adam"</a>がアルゴリズムを整理してくれているので理解しやすかった。

とりあえずざっくりと俯瞰した感じだと、いかに効率良く傾斜を降下していくかという課題を解決するっていう大枠からはみ出るものはない。そんで、構築しているモデルの種類やサイズによってベストなアルゴリズムは変わってくるので、突き詰めるのであれば要実験。ただ、上記論文は、NadamかRSMProp使っときゃいいんじゃないっすか、みたいなこと言ってる。なんにしろ2000年代後半以降で進化が進んでいる分野であり、今後もアップデートがあるだろうから追っていきたい。


####SGD
まずはオーソドックスな勾配法。

```math
g_t ← \nabla_{\theta_1} f(\theta_{t-1}) \\
\theta_t ← \theta_{t-1} - \eta g_t  
```

後述するMomentum法や、NAGもKerasの中ではSGDメソッドの中でサポートされている。


####Mpomentum
勾配に加えてMomentumベクトル$ \mu $を加えてパラメータを更新する。

```math
g_t ← \nabla_{\theta_1} f(\theta_{t-1}) \\
m_t ← m_{t-1} + g_t \\
\theta_t ← \theta_{t-1} - \eta g_t  
```


####Nesterov's accelerated gradient(NAG)
Momuentum法に対して、勾配計算の段階ですでにMomentumを考慮することで、現在のパラメータ$ \theta $ではなく、次のパラメーターの推定値について計算することで効率よく予測するアルゴリズム。

```math
g_t ← \nabla_{\theta_1} f(\theta_{t-1} - \eta \mu m_{t-1}) \\
m_t ← m_{t-1} + g_t \\
\theta_t ← \theta_{t-1} - \eta g_t 
```


####AdaGrad
それぞれ個別のパラメータ$ \theta_i $に対して異なる学習率を適用するアルゴリズム。
学習率の補正にそれまでのパラメータ$ \theta_i $の勾配の二乗和を用いるのでL2ノルムベースのアルゴリズムと分類される。

```math
g_t ← \nabla_{\theta_1} f(\theta_{t-1}) \\\\
n_t ← n_{t-1} + g^2_t \\
\theta_t ← \theta_{t-1} - \eta \frac{g_t}{\sqrt{n_t}+\epsilon} 
```

ここで$n_t$はさきのそれぞれのパラメータの勾配の二乗和のタイムステップ$t$までのベクトル


####RSMProp
これもL2ノルムベース。前述の$n$に対して、勾配の二乗の減衰平均$E[g^2]_t$を用いる。AdaGradで大きくなりすぎる$n$ことが問題だったがこれで解消。

```math
g_t ← \nabla_{\theta_1} f(\theta_{t-1}) \\
n_t ← \nu n_{t-1} + (1-\nu)g^2_t \\
\theta_t ← \theta_{t-1} - \eta \frac{g_t}{\sqrt{n_t}+\epsilon} 
```

####Adam
Momentum法とRMSPropを組み合わせたもの。
勾配の1乗と勾配の2乗、両方使えばいいじゃん的な。

```math
g_t ← \nabla_{\theta_1} f(\theta_{t-1}) \\

m_t ← \mu m_{t-1} + (1-\mu)g_t \\
\hat m_t ← \frac{m_t}{1-\mu^t} \\

n_t ← \nu n_{t-1} + (1-\nu)g^2_t \\
\hat n_t ← \frac{n_t}{1-\nu ^t} \\


\theta_t ← \theta_{t-1} - \eta \frac{g_t}{\sqrt{\hat n_t}+\epsilon} 
```

####AdaMax
AdamのL2ノルムを拡張し無限にするとよりシンプルなアルゴリズムとなる、らしい。

```math
g_t ← \nabla_{\theta_1} f(\theta_{t-1}) \\

m_t ← \mu m_{t-1} + (1-\mu)g_t \\
\hat m_t ← \frac{m_t}{1-\mu^t} \\

n_t ←　max(\mu n_{t-1}, |g_t|) \\

\theta_t ← \theta_{t-1} - \eta \frac{g_t}{\sqrt{n_t}+\epsilon} 
```

####Nadam
Adamと違ってNAGとRMSPropを組み合わせたもの。

```math
g_t ← \nabla_{\theta_1} f(\theta_{t-1}) \\
\hat g_t ← \frac{g_t}{1-\prod_{i=1}^{t} \mu_i}\\


m_t ← \mu m_{t-1} + (1-\mu)g_t \\
\hat m_t ← \frac{m_t}{1-\prod_{i=1}^{t} \mu_i} \\

n_t ← \nu n_{t-1} + (1-\nu)g^2_t \\
\hat n_t ← \frac{n_t}{1-\nu ^t} \\

\bar \mu_t ← (1- \mu_t)\hat g_t + \mu_{t+1} \hat \mu_t \\

\theta_t ← \theta_{t-1} - \eta \frac{\bar \mu_t}{\sqrt{\hat n_t}+\epsilon} 

```

####参考
[ンライン機械学習 (機械学習プロフェッショナルシリーズ)](https://www.amazon.co.jp/exec/obidos/ASIN/406152903X/hatena-blog-22/)
[勾配降下法の最適化アルゴリズムを概観する | コンピュータサイエンス | POSTD](http://postd.cc/optimizing-gradient-descent)
[勾配降下法の最適化アルゴリズム](http://www.slideshare.net/nishio/ss-66840545)
Powershellでα画像を合成する方法

Powershellでベース画像にα画像を合成(MIX)する方法です。
ありそうで無かったので。

```
Add-Type -AssemblyName System.Drawing

# 画像ファイルの読み込み
#ベースファイルの読み込み
$image = New-Object System.Drawing.Bitmap("base.png")
$gra = [System.Drawing.Graphics]::FromImage($image)

#MIXした画像の読み込み
$image2 = New-Object System.Drawing.Bitmap("mix.png")

#サムネイル用のキャンバス作成
#画像サイズをベースに合わせて拡縮
$image2s = New-Object System.Drawing.Bitmap([int]($image.Width), [int]($image.Height))
$gra2 = [System.Drawing.Graphics]::FromImage($image2s)
$gra2.DrawImage($image2, (New-Object System.Drawing.Rectangle(0 ,0, $image.Width,$image.Height)))

#開放
$gra2.Dispose()
$image2.Dispose()
$image2s.Dispose()

#MIX処理（ベースに上からDrawする）
#画像サイズを合わせたので、左上を合わせているが、必要に応じて場所は調整。
$gra.DrawImage($image2s, (New-Object System.Drawing.Rectangle(0 ,0, $image.Width, $image.Height)))

#セーブ
$image.Save($dst, [System.Drawing.Imaging.ImageFormat]::Png)

#開放
$gra.Dispose()
$image.Dispose()

```
MIXする画像はαありのPNGで、透過処理等が済んでいる前提です。
当方の環境では、MIXしたい画像はαありのPNGで流通しているため、それ前提になっています。

αが無い画像に関しては、MakeTransparent等の処理が別途必要になると思います。

P.S. 
昔は、ImageMagickとか必要だったのに、今だと.netがあれば
Powershellでもここまでできるんだなと感心しました。
サードパーティライブラリ等をインストールしづらい環境では重宝しています。
adb shellのコマンドをアプリ内から実行する

### この記事は

abd shellでコマンドを打ってその結果を扱う、ということをアプリ内でやりたく、その関係の処理について調べたので簡単にまとめました。

### 単にコマンドを実行する

```java
try {
    // $ adb shell input touchscreen tap 100 100
    new ProcessBuilder("input", "touchscreen", "tap", "100", "100").start();
} catch (IOException ignored) {}
```

- `new ProcessBuilder("input touchscreen tap 100 100").start();`とすると、`input touchscreen tap 100 100`というコマンドが実行されたとみなされ、例外が発生した。

### 出力を扱う

```java
try {
    // $ adb shell pm list package
    execAdbCommand("pm", "list", "package");
} catch (IOException ignored) {}

/**
 * adb shellのコマンドを実行し、その結果をログに出す
 * @param command 実行するコマンド
 * @throws IOException
 */
public void execAdbCommand(String... command) throws IOException {
    Process process = new ProcessBuilder(command).start();
    BufferedReader bufferedReader
            = new BufferedReader(new InputStreamReader(process.getInputStream()));

    String line;
    while ((line = bufferedReader.readLine()) != null) {
        Log.i(TAG, line);
    }
}
```

### logcatのログを扱ってみる

- 自アプリのlogしか扱えなかった...(Android 4.1以降はできないよう)。
- try−catchはもっと小さいスコープでやる方がいいのでしょうが、今回は見やすさ優先して全体囲んでいます。

```java
/**
 * logcatの出力を集め、再度logcatで出力する
 * @param time ログを集める時間(ミリ秒)
 */
public void outputLogcat(final long time) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                // logcatをクリアしておく
                new ProcessBuilder("logcat", "-c").start();

                Thread.sleep(time);

                Process process = new ProcessBuilder("logcat", "-d").start();
                BufferedReader bufferReader
                        = new BufferedReader(new InputStreamReader(process.getInputStream()));

                // 読み込んだログをすぐ出力すると、その出力したログをまた読み込んでしまうので、
                // 一旦全部保存する
                List<String> logs = new ArrayList<>();
                String line;
                while ((line = bufferReader.readLine()) != null) {
                    logs.add(line);
                }

                for (String log : logs) {
                    Log.i(TAG, log);
                }
            } catch (IOException | InterruptedException ignored) {}
        }
    }).start();
}
```

### 課題
やりたかったことは、`adb shell getevent -lt /dev/input/event1`の出力(タッチイベント情報)を得ることでしたが、自アプリの情報でないためなのか、取得できませんでした。
引き続き調査します。
Spring MVCのインデックス付き配列パラメータには上限値がある

Spring MVCでは、リクエストパラメータをJava Bean（＝フォームオブジェクト）にバインディングしてControllerのメソッドで受け取ることができ、リストや配列のプロパティについては、インデックス付き配列パラメータ（例：`ids[0]`）を使用して値を設定する位置を明示的に指定することができます。

# デフォルトの上限値

インデックス付き配列パラメータのデフォルトの上限値は256です。

以下に示すJava Beanにバインディングするとすれば・・・

```java
public class SearchQuery {
    private List<String> ids;
    // ...
}
```

`ids[0]`〜`ids[255]`までが有効なパラメータで、`ids[256]`は無効なパラメータとして扱われます。

> **Warning:**
>
> 仕組み上は`int`の最大値(`2147483647`)まで増やすことができますが、無闇に数を増やすと`OutOfMemoryError`の発生リスクが増えるので注意しましょう。

# 上限値の変更

上限値は、`org.springframework.web.bind.WebDataBinder`の`setAutoGrowCollectionLimit`メソッドを呼び出すことで変更することができます。具体的には、`@InitBinder`メソッドを使用します。

```java:上限値を256から512にする場合の設定例
@InitBinder
public void configureWebDataBinder(WebDataBinder binder){
    binder.setAutoGrowCollectionLimit(512);
}
```

アプリケーション全体で上限値を変更したい場合は、`@ControllerAdvice`を付与してクラスで上記メソッドを実装するのがよいでしょう。

> **Warning:**
>
> `setAutoGrowCollectionLimit`メソッドを呼び出す前に、`registerCustomEditor`や`addCustomFormatter`メソッドなどを呼び出してしまうと上限値の変更が無視される（無効なメソッド呼び出しになる）ので注意してください。なお、Spring 4.3.4までは無効なメソッド呼び出しを行ってもエラーになりませんが、2016/12/20リリース予定のSpring 4.3.5からはエラーになってくれます！！（[SPR-14888](https://jira.spring.io/browse/SPR-14888)）。

# 上限値を超えた時の動作

上限値を超えるインデックス付きパラメータが指定された場合は、無効なパラメータとして扱われ、デフォルトの動作ではシステムエラー（500: Internal Server Error）になります。

> **Note:**
>
> この動作は個人的にはバグなのでは？と思っており、クライアントエラー（400: Bad Request）として扱ってほしい！！というIssue（[SPR-14874](https://jira.spring.io/browse/SPR-14874)）を作成してみました。

# エラーレスポンスのカスタマイズ

デフォルトの動作だと、上限値を超えるとシステムエラーになってしまいます。このケースは、クライアントからのリクエスト内容が間違っているのが原因なので、クライアントエラーとして扱いたいはずです。
上限値を超えると`org.springframework.beans.InvalidPropertyException`が発生するため、`@ExceptionHandler`メソッドでこの例外をハンドリングすればエラーレスポンスをカスタマイズすることができます。

```java:上限値を超えた時のエラーレスポンスのカスタマイズ例
@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public String handleInvalidPropertyException(InvalidPropertyException e) {
    logger.warn("detected an invalid request.", e);
    return "Bad Request !!";
}
```

> **Warning:**
>
> `InvalidPropertyException`は、上限値を超えた時以外にも発生する例外なので、作成するアプリケーションによっては、細かく例外ハンドリングする必要がでてくるかもしれません。

# まとめ

おそらく、ほとんどのアプリケーションでデフォルト値(`256`)がそのまま使えると思います。
以外に見落としがちなのが・・・インデックス付き配列パラメータを使う場合のエラーハンドリングだと思います。どうするのがベストプラクティスなのかはまだわかっていませんが、デフォルトだとシステムエラー扱いになってしまうことは意識しておくべきでしょう。