OmniAICreator/Qiita-1.07M huggingface dataset:
TextureImporterから元画像のサイズを取得する方法について

TextureImporterクラスの公開APIの中には元画像のサイズ取得に相応すると思われる機能が存在しません。

 [TextureImporter](https://docs.unity3d.com/ja/current/ScriptReference/TextureImporter.html)

そこで、何とか取得できないかと探してみた所、それっぽい機能を見つけたのでメモ。

--------------------------------------------------------------

どうやらTextureImporterにはinternalアクセスレベルで下記のサイズ取得関数が実装されている模様。

```csharp
internal void GetWidthAndHeight(ref int width, ref int height);
```
 
こちらをリフレクションを用いて呼び出すことで取得できます。

下記のフォーラムでも同様の話題が上がっていたので、呼び出し方を参考にしつつ実装したテストコードを下記に掲載します。
→[Getting original size of texture asset in pixels](https://forum.unity3d.com/threads/getting-original-size-of-texture-asset-in-pixels.165295/?_ga=1.244982732.81013254.1460132827)

※内部実装のためにバージョンアップの影響で動作しなくなる可能性がある点についてはご留意下さい。

```csharp
using UnityEngine;
using UnityEditor;
using System.Reflection;

public class Test
{
    /// <summary>
    /// 選択しているAssetのテクスチャサイズをログ出力
    /// </summary>
    [MenuItem("Test/GetTextureSize")]
    static void GetTextureSize()
    {
        var objs = Selection.objects;
        foreach (var obj in objs)
        {
            var path = AssetDatabase.GetAssetPath(obj);
            var importer = TextureImporter.GetAtPath(path) as TextureImporter;

            if (importer == null) { continue; }
            object[] args = new object[2] { 0, 0 };
            var method = typeof(TextureImporter).GetMethod("GetWidthAndHeight", BindingFlags.NonPublic | BindingFlags.Instance);
            method.Invoke(importer, args);

            Debug.Log( "width : " + (int)args[0] + " height : " + (int)args[1]);
        }
    }
}
```
3分間シンボリックリンク

<h3>【内容】<br>
シンボリックリンクとそのコマンドについて簡単に振り返る記事です。
</h3>

<br>

1. ざっくりと比較して、違いをつかむ！
-

|　　　名称|　　　　　　　　　分類|　元ファイルとリンクのinodeの関係|特徴|参照方法|
|:-:|:-:|:-:|:-:|:-:|
|リンク|ハードリンク|同じ|同じファイルシステム内でのみ作成可| inodeで参照する
||シンボリックリンク|異なる|異なるファイルシステム間でも作成可|　作成時のパスで参照する|

*inodeが分からなかったら、ファイルシステムと一般的なファイルの参照方法について調べましょう!

<br>

2.シンボリックリンク関係のコマンド
-

```ruby:シンボリックリンク作成
ln -s TARGET LINK_NAME
```

>① -s オプションはsymbolicって意味です。
>シンボリックリンクを作りますよーって意思表示しましょう。
>また、ディレクトリに対しては -n オプションで対応可能です。
>
>② -s オプションを付けない場合は、ハードリンク作成になります。
　

<br>

```ruby:シンボリックリンク削除
unlink LINK_NAME
```
>① Linuxではunlinkコマンドが用意されています。
>専用に用意されている意図を含めて、unlinkコマンドを使います。
>
>② 裏側で呼んでいるシステムコールがちょっと違ってて、
>unlinkコマンドがunlink関数
>rmコマンドがunlinkat関数
>を呼び出しています。
>
>詳しくは man 2 unlink,  man 2 unlinkatで！

<br>

```ruby:シンボリックリンク張替え
ln -sf TARGET LINK_NAME
```

>① -f オプション(forceオプション)で削除と作成を同時にやってくれます。
>毎度 unlinkで削除して、ln -sで再作成するよりもラクです。
>作成時と同じく、ディレクトリに対しては -n オプションで対応可能です。

<br>

```ruby:シンボリックリンク確認
readlink -e TARGET_NAME 

file TARGET_NAME 
```
>① シンボリックリンクが期待通りに作成されたことを確認します。
> -e オプションを使いましょう。
> このオプションはリンク元のファイルが存在するかチェックします。
>
>② straceで ln -s のシステムコールを追ってみると、
>シンボリック作成時にリンク元のファイルの存在をチェックせずに、
>symlink関数を使ってリンクを作成しています。
>
>つまり、ln -s した時点ではリンク元の存在に関わらずに
>シンボリックを作成するため、元ファイルを辿れないリンクを作成することも可能です。
>仕事としては、間違えてしまう箇所になりますね。


<br>

3.まとめ
-
まとめとして、存在し無いファイルに対してシンボリックリンクを作成した場合を見ていくよ!

<br>

```ruby:存在し無いファイルに対してシンボリックリンクを作成した場合

#　わざと存在しないファイルに対してシンボリックリンクを作成
[user@server]$ ls -la /var/hoge
ls: cannot access /var/hoge: そのようなファイルやディレクトリはありません

[user@server]$ ln -s /var/hoge hoge-link
[user@server]$ echo $?
0



# 確認コマンドとして、良い例と駄目な例でそれぞれ確認してみます。 


#不適切な確認その1
[user@server]$ ls -la hoge-link 
lrwxrwxrwx. 1 root root 9 12月 19 05:33 2016 hoge-link -> /var/hoge

/ リンク元が存在してないにも関わらず、ぱっとみリンク元があるように見えてします。 /


#不適切な確認その2
[user@server]$ readlink hoge-link 
/var/hoge

/ リンク元が存在してないのも関わらず、ぱっとみリンク元があるように見えてします。
  readlinkって名前に対して色眼鏡を外しましょう。　/


#確認その1
[user@server]$ file  hoge-link 
hoge-link: broken symbolic link to `/var/hoge`

/ "broken symbolic" と出力されます。
　fileコマンドの本来の用途とは別になりますが、
　このコマンドを使った確認は初心者に対しても意外と視覚的にわかりやすいと思います! /


#確認その2
[user@server]$ readlink -e hoge-link 

/リンク元ファイルが存在しないため、何も表示されません。これは期待通りの結果です。
　返値で1が返ってくるので、シェルスクリプトで分岐させたいときはfileコマンドより、
　readlink -e でチェックしたほうがきれいかもですね。　/


[user@server]$ file hoge-link 
hoge-link: broken symbolic link to `/var/hoge`
[user@server]$ echo $?
0

[user@server]$ readlink -e hoge-link 
[user@server]$ echo $?
1


```


以上、3分間シンボリックリンクでした！


<br>
Riot.jsでモーダルウィンドウ

[Riot.js Advent Calendar 2016](http://qiita.com/advent-calendar/2016/riotjs)見ていたら何か作りたくなったのでモーダルウィンドウを作ってみました。

#ソース
https://github.com/nak1114/modal-riot
######使用例
https://nak1114.github.io/modal-riot/

#使い方
カスタムタグ内に書いたHTMLがそのままモーダルウィンドウの内容になります。
`this.close`でモーダルウィンドウを閉じるので必ず一つ以上書く必要があります。

```html:index.html
    <nak-modal id='modal-1'>
        <p>CONTENTS hogehoge</p>
        <button onclick={this.close}>Close</button>
    </nak-modal>
```

モーダルウィンドウを開くアクションは`open`です。
以下ではボタンを押すと発火するようにしてあります。

```javascript:index.html
    var mods = riot.mount('nak-modal');
    var btn=document.getElementById('open-modal-1');
    btn.addEventListener('click',function(){mods[0].open();});
```

#問題点
######mountするときに一瞬モーダル内が描画される。
これ、`before-mount`でdisplay:noneしてもダメなので、`nak-modal`自体に`style='display:none'`と書かなきゃいけないけど、カッコ悪い。

######riot.jsライブラリのテスト手法のベストプラクティスがわからない。
どこかにテスト手法に言及した記事無いですか。軽く探しても見つからなかった。

#最後に
モーダルウィンドウはHTML,script,cssが連携しているのでコンポーネント化の恩恵が大きいですが、ライブラリにするにはcssをSPAの方向性に合わせて上書きする必要があるなどいろいろ課題がありそうです。
矩形選択で効率アップ

WithOne AdventCalendar 21日目の記事です。

みなさんは矩形選択をご存じでしょうか？
知らない人は、まず「矩形」とは何ぞやというところでしょうか。
読み方は「くけい」、意味は「長方形」です。

つまり「矩形選択」は長方形に選択するということです。

知らないという人も、実はあなたが使っているツールにも矩形選択機能がついているはずです。

それでは、矩形選択の便利な使い方を紹介していきます。

## とりあえず使おう

![giphy.gif](https://qiita-image-store.s3.amazonaws.com/0/72683/507463de-37a8-a414-ba73-cea2764e6778.gif)

Altキーを押しながらドラッグしてみてください。
Altキーが矩形選択のトリガーです。
四角く選択できます。
それを切り取ったり張り付けたりすると、いつもと違う不思議なことが起こります。

## リストにする
![giphy.gif](https://qiita-image-store.s3.amazonaws.com/0/72683/112f3a65-e5bd-85ec-60b6-d8edbd8199da.gif)

メモを取っている最中はとりあえず箇条書きにした記載をリスト化したい時があります。
そんな時は行の先頭にカーソルを置いて、Altキー＋下を押します。
そして「・」を押し、Enterを押します。

また、Altキーを押しながら十字キーを押しても矩形選択ができます。

## DBテーブルのプレフィックスを変更したい

![giphy.gif](https://qiita-image-store.s3.amazonaws.com/0/72683/68edc775-52a0-a174-9572-6f500fe7ecfd.gif)


DBのプレフィックスを変更したい場合、矩形選択を使うと楽です。
変更したい部分を選択し、選択状態のまま変更後の文字列を入力します。
変更前の文字列が残っているのでDeleteキーで削除します。

また、4文字から3文字に変えてしまったので罫線の位置がずれてしまいました。
こんなときも矩形選択で半角スペースが足りない行を選択し、半角スペースを2回押すと罫線が揃います。

## 時間部分だけ抽出

![giphy.gif](https://qiita-image-store.s3.amazonaws.com/0/72683/6f9b5d27-e687-299e-dd23-df4d3005b65c.gif)

縦軸が揃っているものをコピペしたいときは矩形選択をおすすめします。
最後は内輪ネタですが、
うちの会社では文字列の時間部分をExcelに移す必要がある機会が数回あります。

すべて手入力で打つのはもっての外、1つずつコピペしていると10回コピペしなければいけません。
こんなときは矩形選択です。

## まとめ
仕事をする上で効率を上げることは重要です。
手入力して入力ミスする人を見かけますが、コピペを使えば効率は1段階アップです。

さらに矩形選択を使えば、効率はもう1段階アップするはずです。

まずはお試しを！
KUSANAGIの構成に悩む

この記事は、[KUSANAGI Advent Calendar 2016](http://qiita.com/advent-calendar/2016/kusanagi)の18日目の記事です。

はじめまして、18日目担当のスズムシです。

# 自己紹介
企業向け「基幹業務システム」を主に開発しています。
ConoHa VPSリセールパートナーと言う事もあり、Web制作会社様より依頼があれば「KUSANAGI for ConoHa」の環境を提供していたりします。

# 気にすべきは「最大瞬間風速」
皆さんはサイトの維持管理で何処に一番重点を置くでしょう？
私の場合、「最大瞬間風速」を重視しています。「最大瞬間風速」とは、通常時のPV以上にアクセスが集中した状態の事です。

「最大瞬間風速」に堪えれないとWebサイトの意味が無いのです。

# 「最大瞬間風速」に備える
サイトのPVを月間で考える方もおられますが、月間PVは「サイトの人気度」を図る尺度として十分でしょうが、「性能」を図る尺度としては不十分だと考えています。

以前、「最大瞬間風速」で秒間300PVが数時間続くというポータルサイトのDBチューニングを担当していたので、「最大瞬間風速」の怖さは身に染みて理解しています。

よく見る事例として、「メディアに取り上げられて、アクセス過多で閲覧不能に陥る」がありますね。せっかくのビジネスチャンスを「サイトが見れない」という恥で上塗りする事になってしまっては意味はありません。
ただ、通常の秒間PV数から、どれだけ「最大瞬間風速」を想定するかを予測するのは難しいのも事実…

想定しえない「最大瞬間風速への備え」としてもKUSANAGIはとても有効的だと思います。

# KUSANAGIの構成に悩む
従来のWord Pressでは「最大瞬間風速」への備えとして「スケールアップしやすい構成」でサーバーを組む必要があります。

ロードバランサーの下にWebサーバーがいて、その下にDBサーバーがいる構成ですね。
雑に書くとこんな感じｗ
<img width="563" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/100025/a5260264-6e5d-2da3-c325-7ba5050e6429.png">

アクセス集中が想定される（アクセス集中が発生した）タイミングでWebサーバーをロードバランサーの下に増やして行きます。Webサーバーを物理的に増やして負荷を分散させるという考え方です。
<img width="563" alt="無題2.png" src="https://qiita-image-store.s3.amazonaws.com/0/100025/4e53a444-3314-e379-97fa-359bc3c9377e.png">


ここで一つ疑問が浮かびます。

KUSANAGIでもこの環境にするか・・・？

KUSANAGIは1台のサーバーに「Webサーバー」と「DBサーバー」が相乗りした状態、この状態で秒間1,000PVを処理するという物凄い仕組みです。

そんな物凄いKUSANAGIも、従来の様にDB外だし構成にして「スケールアップ」に備えるべきだろうか？

悩みますねぇ・・・


# KUSANAGIのDBを外に出す理由
そもそもKUSANAGIに「スケールアップ」という概念は必要なのか？

おそらく、必要ありませんｗ

少なくとも、KUSANAGI for ConoHaでは「スケールアップ」という概念はいらないでしょう。
メモリやSSDはコンパネから増やせるし、そもそも保存したイメージから上位プランで再構築すれば良いだけの事ですからね、「スケールアップを意識した従来の構成」で組む必要はありません。


ただし、運用面から見れば「DBを外に出す理由」がいくつか上げられます。

※KUSANAGIでのDBを外に出す方法は[KUSANAGI for ConoHaのDBサーバ変更](http://qiita.com/rinri_suzu/items/0a268d30089c01596c3f)をご参考ください。


・セキュリティの強化
Webサーバーは常に攻撃に晒されているので、DBを外に出し「DMZ化（プライベートネットワーク）」として攻撃から遠ざけるのはセキュリティ面では重要です。
ConoHa DBサーバーではプライベートネットワークが提供されているので、DMZ化が安易に行えます。

・バックアップの存在
これは最近気づいた事で、[ConoHa Advent Calendar2016の「運用可愛い」](http://qiita.com/rinri_suzu/items/a5c3b8f412834eab05f9)でも書きましたが、ConoHa DBサーバーの有料バックアップが「日1回」に変更されています。
KUSANAGIのDBをConoHa DBサーバーに出して、月300円を払えば、日次でバックアップを自動で取ってくれる。
維持管理において、日のバックアップが存在する意味はとても大きいと思います。

様々なホスティングサービスで展開しているKUSANAGIですが、運用面から採用を考えてみるのも良いかもしれません！

# KUSANAGIでの運用例
[Orite米原](http://orite.net/)という「滋賀県米原市のふるさと納税、特産品」を紹介したサイトがあります。
以前はレンサバで稼働していましたが、アクセス数増加に伴う速度遅延が問題になり、「KUSANAGI for ConoHa」に移行され稼働しています。

2016年11月11日、テレビ東京の「男子ご飯」という30分番組で[Orite米原](http://orite.net/)で取り扱う[山椒ソーセージ](http://orite.net/producers/ibukiham/sanshosausage/)が取り上げられ、放送中30分の間に約7,000PV（秒間約3.9PV）を記録しましたが、当然KUSANAGIは問題なく普通に乗り越えています。

秒間約3.9PVなんて、KUSANAGIにとっては何でもない数値ですからね・・・

すばらしい！！

# 最後に・・・
高速で重宝しているKUSANAGIですが、採用するにあたり面倒な事が一つ。

「今のレンサバをKUSANAGIに置き換えたらどれぐらい早くなるか、検証して資料にまとめて！」

というお願いが稀に来るんです。

レベルが全然違いすぎましてね、資料を作るのが辛い、とても辛い！

「すんげー早い！」でまとめたいくらい・・・

いや、本当にｗ
Notification的にRxSwiftをクラス間の通知に使う

MVVM + RxSwiftを案件で使いはじめて良いなと思うことは、直感的ではないあの `delegate` や、手続きの多い `NotificationCenter` をほとんど使わずにクラス間の状態を連携できることだと思ってます。

```Swift
// viewModelのテキストの状態をviewに伝播する
viewModel.title
  .bindTo(self.titleLabel)
  .addDisposableTo(bag)
```
直感的で分かりやすい。

ただ、場合によってはviewModelの一個一個のプロパティを、データバインディングしなくても、済むケースはあると思います。
例えば、自分が今関わっている案件は `UITableVIew` をRxで書いておらず標準のUIKitを使っています。
もともとtableViewには `reloadData()` という便利なメソッドがあるので、それを使えばOKなケースなどです。

## PublishSubjectを通知に使う
そういったデータバインディングではなく、ただ **2クラス間のイベントの伝播** だけしたい場合、PublishSubjectを通知に使うと便利です。

たとえばviewModelが、API経由でデータのfetchを完了したことをviewに通知したいとき

### NotificationCenter

```swift
// 送信側(viewModel)
let nc = NotificationCenter.default
nc.post(name: Notification.Name(rawValue: "fetchNotification"), object: nil)

// 受信側(view)
nc.addObserver(self, selector: #selector(self.setup), name: Notification.Name(rawValue: "fetchNotification"), object: nil)
```

となるかと思いますが、文字列がキーになっているので
**受信側(view)からするとどこから送信されているのかが不明**です。

### PublishSubjectだとこう書けます

```swift
// 送信側(viewModel)
let fetchCompleteSubject = PublishSubject<Void>()

// 受信側(view)
viewModel.fetchCompleteSubject
    .asObservable()
    .subscribe(onNext: { [weak self] _ in
        self?.table.reloadData()
    })
    .addDisposableTo(bag)
```

補完が効くのがまず嬉しいのと、cmd + クリックで宣言元をたどれば
どこで通知が送信されているのか辿れるのが良いです。


## 疎結合になる
例えばview上のログインボタンを押したタイミングでviewModelがログイン処理を行う場合、ただviewModelのメソッドを呼び出すと、下記のコードになりますが

```swift
self.loginButton.rx.tap
    .subscribe(onNext: { [weak self] _ in
        self?.viewModel.login()
    })
    .addDisposableTo(bag)
```

viewがviewModelで何をしているのか参照しているので、

* viewModelの `loginメソッド` をprivateにできない
* loginメソッドの構成を変更した場合などviewModelの変更にviewが影響を受ける

副作用があります。


これをPublishSubjectを使うとこうなります。

```swift
// view
self.loginButton.rx.tap
  .bindTo(viewModel.loginButtonDidTap)
  .addDisposableTo(bag)
  
// viewModel
let loginButtonDidTap = PublishSubject<Void>()

loginButtonDidTap
	.asObservable()
	.
	.
```

viewはボタンが押されたことを通知するだけ
になるので、疎結合になり上記のような懸念が減ります。


PublishSubjectを使うだけでも、RxSwiftにはかなりのメリットがあるので、
今後もRxを案件で利用していきたいです。

## 参考記事
[RxTodo](https://github.com/devxoul/RxTodo/
)
※ RxSwiftのアンチパターンがREADMEにまとめられており、かなり参考になります。
Rails 配列のバリデーション

#Railsで配列のバリデーションを実装

カスタムバリデーションで実装する。
`validate :メソッド`で実装可能
*ポイント　:を忘れないように*

 ```XXX.rb
validate  :tag_list_tag_validation

   def tag_list_tag_validation
     tag_validation = tag_list #validatesの時と違って、:tag_listとしないところを注意
     tag_validation.split(",")
     if tag_validation.length < 1
       errors.add(:tag_list, "タグを入力してください")
     end
     if tag_validation.length < 2
       errors.add(:tag_list, "タグは２個以上入力してください")
     end
     if tag_validation.length >5
       errors.add(:tag_list, "タグは５個までです")
     end
   end
```
##個人的に
rubyのsplitメソッドでパラメータから送られてきた`,区切りの文字列`を配列化するにあたり、一度、パラメータを変数に入れてから、`.split`としないと、配列化できないところで、ハマった。

##補足

validatesと、共存可能

例

```XX.rb
validates :tag_list,presence :true
validate  :tag_list_tag_validation

   def tag_list_tag_validation
     tag_validation = tag_list #validatesの時と違って、:tag_listとしないところを注意
     tag_validation.split(",")
     if tag_validation.length < 1
       errors.add(:tag_list, "タグを入力してください")
     end
     if tag_validation.length < 2
       errors.add(:tag_list, "タグは２個以上入力してください")
     end
     if tag_validation.length >5
       errors.add(:tag_list, "タグは５個までです")
     end
   end
```

##最後に

あんまりこの手の情報がなかったので、役に立てば.......
クラウドソーシングを用いたコーパスの作成

# クラウドソーシングを用いてデータ収集をする方法

## はじめに

被験者が必要な実験（正解ラベルの作成、精度の評価など）を行う際、

1. 頑張って知り合いを集める ＝＞ 2. urlを送る => 3. 謝金を払う

というプロセスを踏むと、どうしてもサンプル数に限界があり、またデータの内容が偏ってしまう（学生の比率がどうしても多くなってしまうため）

そこで、クラウドソーシングを用いて、アンケート集めることで、時間短縮+大量のサンプルの収集が可能になる。

## 参考文献

クラウドソーシングなんて使って大丈夫なの？精度は保たれるの？という問題はあるが、それ自体に関する研究も多々行なわれている。

* [クラウドソーシングと機械学習](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwjmh_LV2vzOAhVEp5QKHQHCAa8QFggeMAA&url=http%3A%2F%2Fwww.geocities.co.jp%2FTechnopolis%2F5893%2Fpublication%2FJSAI_crowds.pdf&usg=AFQjCNFyA41lSlhBfj8QSNGmOoWW8aMnYg&sig2=hkgsHr7y6HrfuSzz4Loumg&cad=rja)
* [心理学研究におけるクラウドソーシングの利用](http://ci.nii.ac.jp/naid/120005705192)
* [成果報酬によるクラウドワーカーの制御](https://kaigi.org/jsai/webprogram/2014/paper-522.html)
* [クラウドソーシングとヒューマンコンピューテーション](http://www.ai-gakkai.or.jp/my-bookmark_vol30-no1/)

自身の考えとしては、精度に関しては、クラウドソーシングであろうが、学生実験であろうが変わらないと思うし、

研究倫理的にも、（大学の管理局に問い合わせたところ）問題ないらしい。（ただし、アンケートに含めるべき必要な文面は存在する）

## 手順

クラウドソーシングを用いてアンケート作成するための手順として、

1. アンケートを作成
2. クラウドソーシングを利用したURLの公開
3. クラウドソーシングを経由した謝金の支払い

というステップを踏む必要がある。

### 1. アンケートの作成

[Qualtrics](https://www.qualtrics.com/)というサービスを用いた。

Qualtricsはアンケートの作成と集計を行ってくれるウェブサービス。

参照元：http://tasukuigarashi.com/qualtrics/

上記のサイトで、詳しく使い方をまとめてくれている。

無料アカウントだと、同時に集計できるのは１つのアンケートのみ、質問数は２０問と制限されているが、

有料アカウントだとこの制限がなくなる（ただし年間３万円ほどかかる・・・）

大切なポイントは

* はじめに、研究の主旨を説明し、同意を求める。
* アンケートの最後に、集めたデータの保護に関することを説明する。

の２点。
プライベートに関わる内容であればあるほど、この２点での説明が充実している必要がある。

### 2. クラウドソーシングを利用したURLの公開について

[ランサーズ](http://www.lancers.jp/)を利用した。

ランサーズでは、プロジェクト方式、コンペ方式、タスク方式で仕事を設定することができるが、アンケートを行うなら、タスク方式での登録となる。

重要な点として、いかにして、アンケートに答えてもらったことを確認するのかという点だが、

自身は、

1. アンケートの最初でユーザーIDを入力してもらう
2. パスワードを乱数で発生
3. アンケートの最後でそのパスワードを表示
4. ランサーズ上でそのパスワードを入力してもらう

というプロセスを踏むことにした（これが果たして最適かはわからんが、他のタスクでもこのようなプロセスにしていた。）

ランサーズが使いやすい点は、

* アンケートに答えてもらう人の制限をすることができる（本人確認書を提出済みなど）
* 一部のユーザーをBANすることができる

の２点である。

この機能により、アンケートの質を保つことができる。

### 3. クラウドソーシングを経由した謝金の支払いについて

学生実験と比較して、高くつきすぎるのではないかという懸念があるが、そうでもない。

安くするのはどうかと思うが、こちらで料金の設定をすることはできるし、

懸念としては、振り込み手数料がかかることくらい？（一回で５００円）

## 結論

気になる精度だが、どのユーザーもかなり丁寧に作業してくれる。（むしろ学生よりもちゃんとやってくれるのではないかというくらい）

ただサンプルとしては、主婦の人が多いかな？という点はある。

もし被験者層を限りたいなら、工夫が必要かも・・・

そして何より、早い！！

学生実験で、頑張って人を集めて、期間を２週間に限ってやってもらうという計１ヶ月かかるタスクが、

ほんの１日（量にもよるが）で完了する！！

時間が限られている中で、しかもトライアンドエラーが必要な場合は、なおさらありがたい。

というわけで、これからもどんどん使っていこう！！という結論で。
Random Forest (2)

# scikit-learn + RandomForestの性能評価 part2

## はじめに

前回は均質なデータに対する性能評価だったので、今回はバラツキのあるデータに対して学習を行った。

使用したデータは前回と同じくmnist

前回はそれぞれの文字に対して2000サンプルずつ抽出したが、

今回は0から順に,1100,1300,1500,1700,1900,2100,2300,2500,2700,2900サンプルずつ抽出を行った。

テストデータは同じく10000の均質なデータ。

変化させる変数は

- 木の数
- 探索の深さ
- featureの数

の３種類。

## 実験

### 木の数

まず、木の数について、10、100、1000、10000の４種類に変化させる。

結果は下の図
![trees.png](https://qiita-image-store.s3.amazonaws.com/0/155619/28a635ad-99ec-5722-dbfe-87876f1fc245.png)

前回の一番精度がいい値が0965?くらいだったことから見ても、精度は若干下がったが、傾向は同じ

1000くらいあったら十分かなという感じ

### 探索の深さ

次に深さの探索について、

これは前回同様2~20まで変化させて学習。

木の数は1000、featureの数はsqrt(features)

結果は下の図

![depth.png](https://qiita-image-store.s3.amazonaws.com/0/155619/bc79bb3d-fa0d-b69c-2887-b40bc782300b.png)

これも前回と同じ、精度もほぼ変わらない、深くまで探索しても過学習は起こしていない。

### featureの数

最後にfeatures

10から55まで変化

木の数は1000、depthはmaxで固定

![feature.png](https://qiita-image-store.s3.amazonaws.com/0/155619/30b8ff4e-02f6-dc8a-e5f0-6641dd1d5b63.png)

sqrtの時が28なので、それよりも少なめの方が今回は精度がいい？

ただ、0.001のオーダーの違いなので、２０以上だったら大差ないとも言えるかも。

### 比較実験

最後に比較のためにSVMでやった結果

RBFカーネルでC=1.0, gamma=1/784

* one-versus-one: 0.932
* one-versus-all: 0.920

やはり、RamdomForestの方が精度がいいが、

SVMは前回よりも精度が上がった・・・？

ランダムにサンプリングしていることを考慮すればあり得ることだが、

RandomForestの方は0.05ほど精度が下がったことを考えると、

もしかしてSVMの方がデータのばらつきに強い・・・？

MNISTは精度が高すぎるからあまり評価できない・・・
Lazy Field LoadingとConstant Score Query(Scaling Lucene and Solrより)

[Solr Advent Calendar 2016](http://qiita.com/advent-calendar/2016/solr) の13日目です。


アドカレ用に何かネタが無いかなと漁っていたらLucidWorksさんのブログにこんな記事がありました。

[11 Common Mistakes in Search](https://lucidworks.com/blog/2016/12/06/11-common-mistakes-in-search/)

この記事に[Scaling Lucene and Solr](https://lucidworks.com/blog/2009/09/02/scaling-lucene-and-solr/)が引用されていました。
内容はパフォーマンスチューニングのベストプラクティスを紹介しますというものだったので、その中から個人的に気になったものを紹介します。
記事自体は2009年とかなり古いですが、引用元の記事は今月(2016年12月)投稿されたものですし、まだ通用しそうなものを紹介します。

# enableLazyFieldLoading
SolrにはDocument CacheというStoredされているフィールドをメモリに格納しておき、インデックスを直接見ないようにするキャッシュがあります。
しかし、必ずしもStoredされているフィールドを全てメモリに置く必要は無いため、flで指定されたものだけを格納するenableLazyFieldLoadingという設定があります。
この機能の効果は主に2つでメモリの節約とキャッシュ生成のコストを削減できることです。
前者に関してはそのままですが、個人的には後者が恩恵が大きいケースが結構あるのではと思っています。
検索エンジンを組み込んだシステム開発において、システムの簡略化のためにAPIへの問い合わせを極力少なくしたいので、出来る限り検索エンジンに表示用データを持たせたいことがあります。
(このようなシステム設計自体が良いのか悪いのか、微妙な気もしますが・・・)
そのようなケースでは必然的にstored=trueのフィールドが増えるため、enableLazyFieldLoadingでキャッシュ生成のコストを抑えることで、検索時のqtimeを改善できそうだなと思いました。
ただし、[SolrでのdocValuesとstoredの使い分け](http://qiita.com/takaishi/items/6f08325c2eb3922bf166)でも言及されている通り、Solr-6.3系以降はstored=trueの使い道は今後少なくなっていくのでは？とあるので、この機能がdocValues(もしくはstoredAsDocValues)=trueのフィールドに対してどうなるかが気になるところです。


# Constant Score Query
ドキュメントへのスコア計算は通常BM25(もしくはTF-IDF)で計算されますが、それをクエリブーストで固定する機能です。
この機能のメリットはスコア計算の式をスキップできるところにあります。
インデックスが大きく、クエリにヒットするドキュメント数が多いケースでは検索のパフォーマンス改善が期待できそうです。
なお、Luceneのレイヤーではクエリブーストとインデックスブーストしか受け付けなくなるBooleanSimilarityが導入されています。
詳しくは @ouava さんが 11日目に[BooleanSimilarity所感](http://qiita.com/ouava/items/38ca883431b0cd8f3553)で紹介しています。


# まとめ
個人的にまだ試したことの無いパフォーマンスチューニング(特にqtimeを改善する点で)をメモ的な意味合いも込めて紹介しました。
enableLazyFieldLoadingに関してはsolrconfigに設定を書くだけの手軽さもあるので、そのうち試したいなという印象です。


# その他、参考にした資料
https://wiki.apache.org/solr/SolrCaching#documentCache
https://issues.apache.org/jira/browse/SOLR-7218
msys2のpassでクリップボードコピーする

pass -cしても、xclipなかったので、うまい事コピーできなかったので、以下のようにソースを変更。

```bash
clip() {
	# This base64 business is because bash cannot store binary data in a shell
	# variable. Specifically, it cannot store nulls nor (non-trivally) store
	# trailing new lines.
	local sleep_argv0="password store sleep on display $DISPLAY"
	pkill -f "^$sleep_argv0" 2>/dev/null && sleep 0.5
	local before="$(cat /dev/clipboard | base64)"
	echo -n "$1" > /dev/clipboard || die "Error: Could not copy data to the clipboard"
	(
		( exec -a "$sleep_argv0" sleep "$CLIP_TIME" )
		local now="$(cat /dev/clipboard | base64)"
		[[ $now != $(echo -n "$1" | base64) ]] && before="$now"

		# It might be nice to programatically check to see if klipper exists,
		# as well as checking for other common clipboard managers. But for now,
		# this works fine -- if qdbus isn't there or if klipper isn't running,
		# this essentially becomes a no-op.
		#
		# Clipboard managers frequently write their history out in plaintext,
		# so we axe it here:
		qdbus org.kde.klipper /klipper org.kde.klipper.klipper.clearClipboardHistory &>/dev/null

		echo "$before" | base64 -d > /dev/clipboard
	) 2>/dev/null & disown
	echo "Copied $2 to clipboard. Will clear in $CLIP_TIME seconds."
}
```
うまくいった。

---
P.S. pbcopy/pbpasteは以下のような　感じ。

```bash
function pbcopy(){
	cat -> /dev/clipboard
}
function pbpaste(){
	cat /dev/clipboard
}
```
---
(2022/4/6追記)
https://gist.github.com/imiric/4ddd7b669c2ac6642c53d7a4bff070e6
https://neos21.net/blog/2021/01/24-02.html
ベイズモデリング　〜２群の差の推定〜

# ２群の差の推定

## はじめに

ベイズモデリングの練習第１弾

いろいろあって時間がなかったが、やっとベイズモデリングに関する練習ができた。

第１回はベイズ統計の２群の差について

参考図書は

「初めての統計データ分析」(https://www.asakura.co.jp/books/isbn/978-4-254-12214-5/)

です。

使用したデータは有名な「iris」

さらにその中でも「pedal.length」(ガクの長さ？）を用いました。

ベイズモデリングするためのソフトにはstan + python (pystan)を使ってます。

## ベイズ統計を用いた２群の差について

頻度主義の統計として有名なt検定、それをベイズモデリングで行うのが今回の目的です。

観測データをx1、x2とすると、これらは

```text
x1 ~ normal(mu1, sigma1)
x2 ~ normal(mu2, sigma2)
```

というふうに生成される。

観測値（x1, x2）から推定された母平均、mu1, mu2を比較することで、

それらに差が存在する確率を議論することが可能になる。

## 実験

まず、元データについて、ヒストグラムと推定したmuとsigmaで正規分布を書いたplotが下の図
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/155619/d62e743c-f8ae-5c51-9d6c-6a434ccc203b.png)

versicolor種とvirginica種についてそれぞれ５０データずつ、

確かにplotしただけで、それぞれに差がありそうだとわかる。

次に推定したmu_versicolor, mu_virginicaのプロット
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/155619/d8f6424e-6269-f3f9-6e58-bde0fa7389e1.png)

濃い色と薄色があるのは、10サンプルからの推定（薄い方）と30サンプルからの推定（濃い方）の２種類を行ったから。

薄い方が広く分布していることからも、観測数が多い方が、精度の高い推定ができることがわかる。

最後にmu_versicolor - mu_viginicaの10サンプル版、30サンプル版のプロット

![image3.png](https://qiita-image-store.s3.amazonaws.com/0/155619/718694a3-d7dc-4065-7154-9e0520142858.png)

青が１０サンプル、緑が３０サンプル

このヒストグラムを要約することで（EAPを求める）

ガクの大きさが〜〜cm以上大きい確率を評価することができる。

やはりサンプル数が多い方が、尖度の高いヒストグラムが得られている。

30サンプルの場合、ほとんどの確率で1.0~1.5の差があると評価できる。

## 結論

今回はベイズ統計を用いた２値の差を評価したが、なかなか使えそう。

p値だけでなく、どれだけ離れてる確率が~~%と出せるところが良い。

また、データの少なさに対する信頼度の低さも同時に評価できていいですね。

自身の修論にも使いたいな〜〜〜
Random Forest

# scikit-learn + RandomForestの性能評価

## はじめに

普段はSVMを使うことが多いが、学習器の勉強をせねばとRandom Forestで実験を行った。

参考資料は
http://d.hatena.ne.jp/shakezo/20121221/1356089207
と
統計的機械学習の基礎(http://www.kyoritsu-pub.co.jp/bookdetail/9784320123625)

### Random Forestについて

テストデータをブートストラップサンプリングにより複数作成して、複数作成する。

最終的に各決定木の多数決によって、クラスの分類を行う。

決定木を回帰木にしたら数値予測もできる。

バギングとの違いは、RandomForestでは目的変数のサンプリングも同時に行うということ

### なぜ精度が良いのか？

汎化誤差 = バイアス + バリアンス + ノイズ

であるとき、

決定木のような学習木はバリアンスが高くなる（少しでもデータが異なると予測結果が大幅に異なる）弱学習木である。

このような学習木をたくさん作成することでバリアンスを下げてやろうというのが、戦略。

ハイパーパラメータには、主に

num_trees: いくつ決定木を作成するか

max_depth: どの深さの決定木を作成するか

num_features: 目的変数のサンプリング時に、いくつの目的変数をサンプリングするか

である。

本には、random_forestは過学習しないのでmax_depthに依存しないや、num_featuresはsqrt(features)がいいなど書いてあったが、本当か？ということで実験を行った。

## 実験条件

データにはmnistを使用した。

ただ元のデータ量だと多い気がしたので、各数字2000ずつサンプリングを行った。

テストデータはそのままの10000件

## 実験

### num_trees

まずはnum_treesを10, 100, 1000, 10000に変更した時、

max_depthは最後まで、

num_featuresはsqrt(features)に固定

![random_trees.png](https://qiita-image-store.s3.amazonaws.com/0/155619/dbf89ab9-220f-e6c2-4401-b658548b2c0c.png)

やはり少なすぎると精度が低い様子、でも多すぎても意味がないかな、1000ぐらいが適当そう

### depth

次にdepthを変化させた場合、

2, 4, 6, 8, 10, 12, 14, 16, 18, 20の１０種類

num_treesは1000に、max_featuresはsqrt(features)に固定

![random_depth.png](https://qiita-image-store.s3.amazonaws.com/0/155619/ab87121c-9457-5640-87d3-46f419feda87.png)

確かに、深く探索しても過学習を起こしてなさそう、深くまで探索しても大丈夫

### num_features

num_featuresを10, 15, 20, 25, 30, 35, 40, 45, 50, 55に変化させた時、

num_treesは1000、depthはmaxまで

![random_features.png](https://qiita-image-store.s3.amazonaws.com/0/155619/a050e8e0-87e4-dd64-00d5-051c59f18671.png)

35、40くらいがピーク？赤線はデフォルトのsprtの時、

デフォルトよりもちょっと多めが今回はよかった？

### 実行時間

最後に実行時間について

num_trees=1000
max_depth = max
max_features = 40
n_jobs = 6

のCPUのみで実験

３回の平均が28.8秒

### 比較手法

ベンチマークとしてSVMでもMNISTの分類を行いました。

rbfカーネルでC=1.0, gamma=1/784

グリッドサーチはなし

one-vs-oneとone-vs-restの２種類で

注意点としては、データは０−１で正規化したということ（正規化しないとうまく学習できなかった、なんで？）

|  | F-value | Time |
|-----------:|:------------:|:------------:|
|one_versus_one|0.930|1 min 39 s|
|one_versus_rest|0.922| - |

スパースで、クラス間のサンプル数の偏りがない場合は、RandomForestの方が精度良いし、早い！！

疑問として、one-vs-restの方が遅かったんだけど、なんで？パッケージの問題？

## 結論

RandomForestを使ってみた印象、やはり早い！！

いつもSVMばっかり使っているからか、尋常じゃなく早く感じる・・・

あとパラメータが少ないのも魅力、num_treesとmax_featuresくらいで大丈夫？？

次はboostingかな・・・
Cannot use the following dyno types in the same app: Free and Hobby と言われたら

Heroku の Deploy Button から Deploy を実行したところ、このようなエラーが起きて失敗した。

>Cannot use the following dyno types in the same app: Free and Hobby

要は dyno のタイプを Free と Hobby 混ぜるな、ということだろうけど、app.json はこんな感じだった。

```json
{
  ...
  "formation": {
    "web": {
      "quantity": 0
    },
    "worker": {
      "quantity": 1,
      "size": "hobby"
    }
  }
}
```

別に混ぜてるつもりはなかったけど、web の方で type を省略したのがいけなかったのかも、と思って以下のように修正。

```json
{
  ...
  "formation": {
    "web": {
      "quantity": 0,
      "size": "hobby"
    },
    "worker": {
      "quantity": 1,
      "size": "hobby"
    }
  }
}
```

これで再実行すると問題なくデプロイが完了した
Google Apps Script × LINE Notifyで指定住所のGoogleMaps画像をLINEに送る

#概要 
住所または緯度経度を指定することで地図画像を生成し、LINEにメッセージとして送信した際のメモです。

# 地図画像生成
Google Static Maps API を使用して地図画像を取得します。

```javascript
function sendMapsImage() {
  // アドレスの指定
  var address = '東京都千代田区丸の内１丁目９−１'  // 東京駅
  var latitude = 35.6817879  // 東京駅 緯度
  var longitude = 139.7645727  // 東京駅 経度
  
  // StaticMap の基本設定
  var map = Maps.newStaticMap()
    .setSize(600, 600)  // 画像サイズの指定 (Max: 600x600)
    .setLanguage('ja')  // 言語の設定
    .setMobile(true)  // モバイル端末向けの地図
    .setMapType(Maps.StaticMap.Type.HYBRID)  // 航空写真＋通常
  
  // StaticMap上にマーカーを設置
  map.addMarker(address) // 住所を指定する場合
  // map.addMarker(latitude, longitude)  // 緯度経度を指定する場合 
  
  // Blobとして画像を取得
  var mapBlob = map.getBlob()
  
  // StaticMap へのパスを取得
  var mapUrl = map.getMapUrl()
  
  // Line に送信
  sendHttpPostImage(mapUrl, mapBlob)
}
```

Google Static Map についてその他の仕様はGoogleのReferenceがわかりやすいです。
[参考: Class StaticMap  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/reference/maps/static-map)

地図の種類(Maps.StaticMap.Type)については以下に記載があります。
[参考: Enum Type  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/reference/maps/type)


# Lineに送信
以下の記事を参考にさせていただきました。
[参考: Google App ScriptからLINE NotifyでLINEにメッセージを送る - Qiita](http://qiita.com/tadaken3/items/5f916a12587e42ece814)

以降、上記リンク先を参考にトークンが取得できていることとして話を進めます。
上記リンク先記事のメッセージ送信部分を、画像送信のために変更します。

```javascript
function sendHttpPostImage(message, blob){
  var token = [access_token];
  var formData = {
   'message' : message,
   'imageFile': blob  // 地図画像を添付
  }
  var options =
   {
     "method"  : "post",
     "payload" : formData,  // message, imageFile を formData としてPost
     "headers" : {"Authorization" : "Bearer "+ token}
   };

   UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}
```

以上で完了です。
sendMapsImage()を実行することでLineに画像が届きます。

![LINE画面](https://qiita-image-store.s3.amazonaws.com/0/43136/ed6d9f61-8e45-6612-cf53-8658134ad644.png)


Lineに画像のみを送信することはできず、messageは必須のようです。
また、1時間に可能な画像のアップロード数には制限があるため注意が必要なようです。

[参考: コマンドラインから LINE にメッセージを送れる LINE Notify « LINE Engineers' Blog](http://developers.linecorp.com/blog/ja/?p=3784)
[参考: Class UrlFetchApp  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetchurl-params)

# 補足
Line Engineers' Blog の例では `imageFullsize=URL` を使用して画像の送信をしていますが、GoogleStaticMapのURLを指定すると、{"status":400,"message":"imageFullsize: may not be url"} となってしまい、有効なURLとは認識してくれない模様です。
信号処理やるならD言語

# はじめに

大学で無線通信の信号処理に関する研究をしていまして，
今年1年間でD言語で無線機のシミュレータを開発しました．

今回は，シミュレータを開発するにあたって，すごく便利だったD言語の機能だったり，知見を共有できたらなと思います．


# Range

信号処理は，

+ ソース: 信号の源（正弦波，ランダムなビット列，白色雑音）
+ シンク: 信号の出力先（信号のスペクトルの描画）
+ 処理ブロック: 信号処理ブロック（アンプ，ミキサ，フィルタ）

というような基本的な3つの要素で構成できます．

ソースや処理ブロックはInputRangeで簡単に記述でき，シンクはOutputRangeで表現できます．

Rangeのわかりやすい説明やその他の応用については，同じく今年のD言語 Advent Calendarでumariderさんとlempijiさんの記事があります．

+ [D言語で今始めるRange: umarider](http://qiita.com/umarider/items/e0936c6afdcdf4522cc7)
+ [OutputRangeの定義と使い方: lempiji](http://qiita.com/lempiji/items/2070719fee944e64b457)
+ [D言語で今楽しむRange: umarider](http://qiita.com/umarider/items/dd47534bdc5ee06cb295)
+ [OutputRangeの利用と応用(OutputRangeからReactive Extensionsへ至る道): lempiji](http://qiita.com/lempiji/items/4ed693186af9461c7a7d)

Rangeを利用することによって，標準ライブラリで提供されている機能をそのまま利用することができます．

たとえば，信号を定数倍するだけのアンプであれば`std.algorithm.map`を使えばいいですし，
信号をあるサンプル数だけ進めるのであれば`std.range.popFrontN`や`std.range.drop`を使えば簡単です．

終わりのない無限の長さを持つ信号も表現でき，`std.range.take`でその長さを制限することもできます．

また，UFCSによって信号処理の流れが非常にわかりやすくなります．

~~~~d
immutable real freq = 1e6,          // sin波の周波数1MHz
               ts = 1.0/(20e6),     // サンプリング周波数 20MHz
               amp = 2.0;           // 増幅率

// sin波の生成, InfiniteRange
auto sinsig = sequence!"n * a[0]"(2 * PI * freq * ts)
             .map!(a => sin(a) * amp);
~~~~~


# FFT

無線通信の信号処理では，いたるところにFFTが出現します．
たとえば，WiFiなどの無線通信で使われているOFDMという変調方式は，FFTを用いて信号を生成しています．
D言語では標準ライブラリの`std.numeric`というモジュールにFFTが用意されています！！
もちろん，Rangeインターフェイスに対応しています．


# Traits(Concepts)

正式名称は良くわかりませんが，D言語ではよく次のように`isXXXX`というテンプレートを定義して，型の分類を行います．

たとえば，Rangeにも`isInputRange`だったり`isForwardRange`などがあります．

無線通信の信号処理では，変復調器のように，インターフェイスが決まっているものがあります．
例の変復調器では，`modulate`や`demodulate`というメンバ関数だったりを要求する`isModulator`を定義しています．

~~~~d
enum bool isModulator(T) = is(typeof((T mod){
    // 変調器への入力の型，ubyte(ビット列), Complex!floatなど
    alias IType = T.InputElementType;

    // 変調器からの出力の型，Complex!floatなど
    alias OType = T.OutputElementType;

    IType[] inputs;
    OType[] outputs;
    outputs = mod.modulate(inputs);     // IType -> OType
    inputs = mod.demodulate(outputs);   // OType -> IType
}));
~~~~~


# std.parallelism

複数のパラメータでのシミュレーションを並列して実行したくなったときに，D言語であれば標準ライブラリの`std.parallelism`モジュールを使えば簡単に並列化できます．
たとえば，送信電力を10mW(10dBm)から100mW(20dBm)まで掃引してシミュレーションしたい時，並列化は次のように行えます．

~~~~d
import std.parallelism : parallel;

// 内部が並列実行される
foreach(power; iota(10, 22, 2).parallel)
{
    runSimulator(power);
}
~~~~~


# 単体テスト

最初の方に述べた通り，無線通信信号処理では，ブロック単位でプログラムが独立します．

そのため，必然的にモジュール間や関数間で高い直交性を持ったプログラムとなり，単体テストによる各関数のテストが容易です．

D言語では，次のようにいろいろな場所に単体テストを書くことができます．

もし，パッケージマネージャのDUBを使っていれば，`dub test`だけで単体テストを走らせることができます．

~~~~d
// 増幅器
auto amplified(R, F)(R input, F amp)
{
    return input.map!(a => a * amp);
}

unittest
{
    assert(iota(3).amplified(2).equal([0, 2, 4]));
}
~~~~~


# C言語のライブラリが簡単に使える

無線通信の信号処理といえど，よく行列やベクトルの計算(固有値問題とか)が出現します．
そういうときに，BLASやLAPACKを触れるとすごく便利です．
D言語では，C言語のライブラリを簡単に使うことができるので，BLASやLAPACKも使えます．

また，私の在籍する大学には，小規模ながらクラスタ計算機が設置されており，MPIを用いて超並列計算もできます．
各ノードはIntelのXeonを搭載しているので，D言語も環境を構築すれば動かすことができます．
そこで，実際にOpenMPIを用いたライブラリも作成しました -> [TUT-HPCLIB4D](https://github.com/k3kaimu/TUT-HPCLIB4D)．


# まとめ

信号処理するならD言語しかない！！
ベイズフィッティング

# ベイズ線形回帰の精度の検証

## はじめに

PRMLでベイズ線形回帰の勉強をした。

普通の線形回帰だと複雑なパラメータを選ぶと過学習する

正則化項を入れるとパラメータの調整が大変・・・

そこでベイズ線形回帰！！

モデルを複雑にしても過学習しないらしい・・・

本当か？？

そこで実験！！

## 実験条件

理想曲線（緑）：sin関数、ノイズを加えてサンプリング

ベイズ線形回帰（赤）：alpha=0.005、beta=10.0

線形回帰（青）

線形回帰+L2正則化：λ=0.001

基底関数は[1, x, x^2, x^3]と[1, x, x^2, …, x^20]の２パターン（M=3とM=20）

コードは下記にあげています。
https://github.com/kenchin110100/machine_learning/blob/master/sampleBAYES.py

## 結果

### 基底関数M=3

まずは基底関数M=3、データサンプル数10で
<img width="555" alt="m3sample10.png" src="https://qiita-image-store.s3.amazonaws.com/0/155619/cac6bcc6-aa88-4d3b-5424-47ee385c36b4.png">

次にサンプル数100で
<img width="550" alt="m3sample100.png" src="https://qiita-image-store.s3.amazonaws.com/0/155619/5d14b2e3-9289-68e2-2ad4-0390f9ca954a.png">

基底関数M=3だとどれもあまり違いは・・・

### 基底関数M=20

基底関数M=20にしてモデルを複雑にすると・・・

まずはサンプル数10
<img width="552" alt="m20sample10.png" src="https://qiita-image-store.s3.amazonaws.com/0/155619/93d119d4-f57c-a120-57cb-81024de9fd22.png">

次にサンプル数100
<img width="550" alt="m20sample100.png" src="https://qiita-image-store.s3.amazonaws.com/0/155619/4665cb08-94a7-258f-0fbb-1e4284f02aba.png">

おお〜〜（正則化もなかなか・・・）

## 結論

確かに複雑なモデルに適用すると違いが瞭然！！

L2正則化だとパラメータを工夫しなければいけないことを考えれば、

ベイズさまさまですね。
ArrayクラスとArrayCollectionの違い

プログラミング言語ActionScript3.0で使用されているArrayクラスとArrayCollectionクラス
の違いがぴんときていなかったので、整理してみた。

Arrayクラスは配列のような特徴をもっていて、ArrayCollectionクラスは、以下のような定義。

「ArrayCollection クラスは、ICollectionView または IList インターフェイスのメソッドとプロパティを使用して、アクセスおよび操作できるコレクションとして配列を公開するラッパークラスです。 」

初見だと何いっているか分からないですが、どうやらArrayCollectionは、データの表示に使用するメソッドやプロパティを駆使して配列Arrayの変更を加えることなくデータを表示できるクラス
ということらしい。

例えば、都道府県の情報47個のデータがあったとして、それを名前順や、位置が北からの順、などに並べ替えたい場合、「都道府県の情報47個のデータ」= Arrayを、ArrayCollectionクラスにして(= new ArrayCOllection(Array))扱うことで、Array自体の情報を更新することなく表示を変えれます。

情報として扱いやすいからArray情報をラッパーしてArrayCollectionクラスにして、
as3が操作しているという理解。
Google ChromeでUserAgentを変更する

# この記事について
Google Chromeに備わった機能を使ってUserAgentを偽装する方法を2種類紹介します。
特定のOSだったら○○する、特定の機種だったら☓☓するといった処理の動作確認に便利です。

※Google Chrome 55（2016/12/18現在最新版）で確認した内容になります。

# その１：デバイスエミュレータ機能を使う
## 概要
デバイスエミュレータ機能を使うと、UserAgentの偽装はもちろん、ページの表示領域の再現等もできます。
動作確認の内容が「iPhoneで見た時〜」「Androidで見た時〜」ぐらいの粒度ならこちらの方法で事足ります。

## 手順
#### １. Developer Toolsを開く
Windowsなら「F12」、Macなら「Control + Option + I」でDeveloper Toolsを開きます。
開くとこんな感じの画面が出現します。
<img width="502" alt="Developer Tools" src="https://qiita-image-store.s3.amazonaws.com/0/116289/5d121d45-852d-f5bc-2fd8-7607beaf5a6e.png">

#### ２. device toolbarを開く
Developer Toolsの左上にあるスマートフォンのアイコンをクリックします。
クリックするとウェブページの表示が変わり、device toolbarを出現します。
![toggle device toolbar](https://qiita-image-store.s3.amazonaws.com/0/116289/3bba9ee4-d37a-51cd-d84f-38538fc78fad.png)

#### ３. エミュレートしたいデバイスを選択する
device toolbarからエミュレートしたいデバイスを選択します。これで設定完了です。
![emulate device](https://qiita-image-store.s3.amazonaws.com/0/116289/53ed6362-7211-2050-73e9-56f7324d2dd2.png)

#### 4. ページを読み込む
目的のページを開いたり、再読込などを行い設定を反映させます。

# その２：Network conditionsからUserAgentをカスタマイズする
## 概要
Network conditionsからGoogle Chromeが用意してくれた多数のUserAgentに設定したり、
任意のUserAgentを入力して適用することができます。
デバイスエミュレータ機能よりもより細かい粒度の動作確認で見たいときはコッチの方法がオススメ。
例：「特定の機種で見た時〜」「特定のアプリのUserAgentで見た時〜」「Googlebotが巡回してきた時〜」

## 手順
#### １. Developer Toolsを開く
Windowsなら「F12」、Macなら「Control + Option + I」でDeveloper Toolsを開きます。
開くとこんな感じの画面が出てきます。
<img width="502" alt="Developer Tools" src="https://qiita-image-store.s3.amazonaws.com/0/116289/5d121d45-852d-f5bc-2fd8-7607beaf5a6e.png">

#### ２. More ToolsからNetwork conditionsを開く
Developer Toolsの左上にある「︙」のアイコンをクリックし、出てきたメニューから
「More Tools」 > 「Network conditions」と選択していきます。
選択するとDeveloper ToolsにNetwork conditionsの画面が追加されます。
![more tools](https://qiita-image-store.s3.amazonaws.com/0/116289/2f3c4997-d22e-dc0c-25a4-59b349908d7c.png)

#### ３. select automaticallyのチェックを外す
Network conditionsの画面からselect automaticallyのチェックを外します。
すると、その下のセレクトボックスやテキストボックスの表示が濃くなり編集できるようになります。
![select automatically](https://qiita-image-store.s3.amazonaws.com/0/116289/4c5e12d8-ba50-3b8d-7bf0-9e14a0cc5000.png)

#### 4. 好きなUserAgentに変える
セレクトボックスをクリックして、用意されている物から好きなUserAgentを設定することができます。
用意されたUserAgentは多く、主要ブラウザは一通り存在します。Googlebotといった特殊なUserAgentもあります。
また、任意のUserAgentにしたい場合はテキストボックスから直接UserAgentを編集することができます。
![select useragent](https://qiita-image-store.s3.amazonaws.com/0/116289/497f0e95-163c-d169-80b1-e2a36a7b8437.png)

#### ５. ページを読み込む
目的のページを開いたり、再読込などを行い設定を反映させます。
Modeling Users’ Dynamic Preference for Personalized Recommendation

個人の好みの変化を予測して、レコメンドに生かすロジック

2015, IJCAI, Xin Liuの論文
http://ijcai.org/Proceedings/15/Papers/254.pdf

既存のrecency model: 過去の好みに対して、重み付けをして最近の好みを追加していく

* これだと、重みを定数として渡す必要があるので、季節性、時代性が反映されにくい

既存のCF model: 個人の嗜好をモデリングできない、大切な情報が含まれているのに

提案手法：ガウシアンプロセスを組み込んで時間変化する好みを反映させる

* 得られるテキストデータからLDAによってトピックを抽出して、それを個人の好みとする。（従来の手法と比較して、予想もしない特徴ベクトルが抽出できる可能性がある）

各時間tのトピック分散を時系列のデータとして、ガウシアンプロセスで未来の趣向を予測する、予測した趣向をもとに、シャノン距離によってitemとの距離を測定する

シャノン距離：KLダイバージェンスに対称性をもたせたもの、確率分布の差異を測るときに使う
<img width="445" alt="topic_recommend1.png" src="https://qiita-image-store.s3.amazonaws.com/0/155619/12e8b596-135a-a0a9-b6ec-fe9f8e0ae67a.png">

LDAとGPを組み合わせたモデルは、密なデータに対して有効だが、疎なデータに対しては有効ではないので、工夫を加える。

* profileのaverageを設ける
* ユーザーベースの協調フィルタリングを組み合わせる（MF: Matrix Factorization、次元圧縮の手法の1つ、NMFと同じ計算アルゴリズム??）

### 計算手法
1. item vとwordの行列を作成し、LDAを行う。
2. userごとにpreferenceを時系列に並べる、t1にv1、t2にv2、t3にv3を使ったのなら、v1, v2, v3 ・・・となる、この行列からGPによりt + 1時間のpreferenceを予測する。
3. 予測したpreferenceとアイテムの相関を取り、リコメンデーションを行う

<img width="541" alt="topic_recommend2.png" src="https://qiita-image-store.s3.amazonaws.com/0/155619/7396ef93-4d4b-fc12-4167-21b7a38d0758.png">
milkcocoaで作るリアルタイムオセロ

## リアルタイムなオセロ、題してオセロ２

初めまして。[Lucky Brothers & co.](http://lucky-brothers.co.jp)という会社で代表をやっております田島と申します。

今年は、milkcocoaを使ってリアルタイムなオセロを作ってみたのでご紹介させていただきます。
リアルタイムなオセロと言ってもまだピンと来ないと思うので具体的に説明すると、

**ターン制を排除したオセロ**

ということです。
通常のオセロだと、プレイヤー同士が交互に石を打っていくのが基本ですが、今回のリアルタイムオセロ（※以降:オセロ２）だと、 **相手のターンを待たずにどんどん石を置いていくことができる** というルールなんです。
つまり、頭の回転を早くして早い者勝ちでどんどん石を置いていったほうが有利ということですね。
なんとなくわかってきましたでしょうか。

しかし、ただ石を早い者勝ちで置けるだけだと、適当なマスにどんどん置くだけになってしまってつまらないので、 **ルール上、石を置けないマス（=相手を挟めないマス）に間違って置こうとすると、数秒間のペナルティタイムが課せられる** というルールを設けました。

## 早速お試しプレイ
…と、ここまで細かく話してもさすがについてこれないですよね。
それでは、百聞は一見にしかずということで早速やっていただきましょう。


![スクリーンショット-2016-12-18-19.26.12.jpg](https://qiita-image-store.s3.amazonaws.com/0/43677/cc66365e-f0f1-f2f4-9e83-005ded12ea8f.jpeg "スクリーンショット-2016-12-18-19.26.12.jpg")


https://gonshi.github.io/othello_2/

^ こちらがURLです。まずはコンピュータ相手に1人プレイで楽しむことができます。あなたの石は白ですね。Let's Fight!

いかがでしたでしょうか？
なんとなく、オセロ２のルールをわかってきましたか？


ところが、今のところまだmilkcocoaの恩恵を受けられていないので、ここからが本題です。


## 対戦版をプレイ

なんとこのオセロ２、２人対戦で楽しむこともできるのです。

[こちらのURL](https://gonshi.github.io/othello_2/?match)にアクセスしてみてください。

![スクリーンショット-2016-12-18-19.28.53.jpg](https://qiita-image-store.s3.amazonaws.com/0/43677/d458bdef-dcdd-c7a3-963c-c9e5866d2b72.jpeg "スクリーンショット-2016-12-18-19.28.53.jpg")

上記のような画面が表示されるので、対戦相手の方のスマートフォンでQRコードを読み込んで下さい。
読み込みが完了すると、対戦スタートです！


これ、結構盛り上がるので是非周りの人を誘って遊んでみて下さい。
周りの人が忙しそうな場合は、プレイの様子の動画を観て楽しんで下さい。

[![DemoDay](http://i.ytimg.com/vi/8zozf3z1ij0/sddefault.jpg)](https://youtu.be/8zozf3z1ij0?t=8m41s)


## 技術的に気をつけたところ
ソースコードは[コチラ](https://github.com/gonshi/othello_2/tree/gh-pages/_build/src)から見ることができます。
言わずもがな、通信対戦のところにmilkcocoaを使っていますね。
気をつけた点としては、２人同時に同じマスをタップしたときにも競合が置きないように実装したところです。
具体的には、 **自分の置いた石も即座には盤面上に反映せず、一度milkcocoaに送信してレスポンスが返ってきた時点で反映させる** ようにしました。
つまり、milkcocoaに対して置いたマスの情報を早く届けた方が、マスの獲得権を得られるような実装になっています。

## アプリ化しました！
そしてそして、このオセロ２、リバーシ２という表記にてiOS/Androidともにアプリ化しました！

![ogp.jpg](https://qiita-image-store.s3.amazonaws.com/0/43677/a5c209cc-db85-47e1-ae38-f969233ea5ea.jpeg "ogp.jpg")

http://reversi2.lucky-brothers.co.jp/

上記のURLからダウンロードページへ飛ぶことができます。
残念ながらまだ2人プレイは未実装で、1人プレイ専用なのですが（milkcocoaをcocos-2dに適用するのは難しかった‥）、1人プレイでも楽しめるように更なるルールチューニングを加えたので是非遊んでみて下さい！
ランキング機能もあるので、上位目指してください！

## おまけ
[でかい盤面ver.](https://gonshi.github.io/othello_2/?large) もあります。従来のオセロとは遠くかけ離れた、カオスな楽しみ方ができます。
GLnemo2のインストール on Ubuntu 16.04.1

# GLnemo2

Qtを用いてFITS形式の画像を表示するビューアーが2種類ほどありますが、その内の1つがGLnemo2です。

## インストール

<https://projets.lam.fr/projects/glnemo2/wiki/Download#Ubuntu-1604>

上記URLからdebファイルをダウンロードし、事前に`dpk -I`などで依存関係を確認します。

```text
 新形式 debian パッケージ、バージョン 2.0。
 サイズ 1164708 バイト: コントロールアーカイブ = 570 バイト。
     669 バイト、   10 行      control              
     113 バイト、    2 行      md5sums              
 Package: glnemo2
 Version: 1.10.0-1.ubuntu16.04
 Section: devel
 Priority: optional
 Architecture: amd64
 Depends: libc6 (>= 2.14), libccfits0v5, libgcc1 (>= 1:3.0), libgl1-mesa-glx | libgl1, libglu1-mesa | libglu1, libgomp1 (>= 4.2.1), libhdf5-10, libhdf5-cpp-11 (>= 1.8.15-patch1), libqt5core5a (>= 5.5.0), libqt5gui5 (>= 5.0.2) | libqt5gui5-gles (>= 5.0.2), libqt5network5 (>= 5.0.2), libqt5opengl5 (>= 5.0.2) | libqt5opengl5-gles (>= 5.0.2), libqt5printsupport5 (>= 5.0.2), libqt5widgets5 (>= 5.0.2), libstdc++6 (>= 5.2), zlib1g (>= 1:1.1.4)
 Installed-Size: 3309
 Maintainer: Jean-Charles LAMBERT
 Description: An interactive 3D visualization program for N-body snaphots
```

開発系のものは既に入れてあったので、特別に入れる必要があったのが`libhdf5-cpp-11`と`libccfits0v5`ぐらいでした。

```bash
sudo apt install libhdf5-cpp-11 libccfits0v5
sudo dpk -i ./glnemo2-1.10.0.ubuntu16.04.x86_64.deb
```

Qt5は既に入れていた気がするので、もしかしたら`libqt5core`あたりが必要かもしれません。

[Hubble Legacy Archive]で取ってきたFITS画像を適当に表示したのが以下の画像です。

![Screenshot from 2016-12-18 19-26-09.png](https://qiita-image-store.s3.amazonaws.com/0/26144/97ecb01d-6197-41b5-b647-c4b68f0d7f10.png)

## 参照

* [FITS Image Viewer Page](http://fits.gsfc.nasa.gov/fits_viewer.html)
* [GLnemo2](https://projets.lam.fr/projects/glnemo2)
* [Hubble Legacy Archive]

[Hubble Legacy Archive]: https://hla.stsci.edu/
herokuでpython+django+scikit-learn+mecab (2)

前回に引き続き、herokuでpythonアプリを作るためのメモ
今回は開発する上で引っかかったエラーを中心にまとめる。

参照元：
https://gist.github.com/konitter/5370904
http://voluntas.hatenablog.com/entry/20110919/1316426034
http://qiita.com/nakazye/items/48651e39f07da82fe79e

### herokuのインストール
heroku本体は，

```shell-session
$ sudo gem install heroku
```
でインストールできるが，早速エラーが・・・

```
Operation not permitted - /usr/bin/…/
```
インストール先のフォルダに権限がないらしい、インストールフォルダを変更することで解決

```shell-session
$ sudo gem install -n /usr/local/bin heroku
```
（参照元：http://qiita.com/AcaiBowl/items/4bb4708de03e6ee14a4a）

### virtualenv

開発用のフォルダの作成

```shell-session
$ mkdir heroku-django
$ cd heroku-django
```

作成したフォルダ内で、virtualenvを展開。herokuではvirtualenvで開発することが推奨！！（必要なライブラリを最小限にするため）

```shell-session
$ virtualenv --no-site-packages .
$ source bin/activate
```

### 必要なパッケージのインストール

```shell-session
$ pip install django
$ env ARCHFLAGS="-arch i386 -arch x86_64" bin/pip install psycopg2
$ pip install gunicorn
```

* django: python用のMVCフレームワーク
* psycopg: pythonからpostgreSQLを使うためのパッケージ、herokuのデータベースはpostgreなため、これが必要
* gunicorn: よくわかってないが、Apache + mod_wsgiみたいなもの？？

heroku_djangoディレクトリで、インストールしたライブラリをrequirements.txtに記録

```shell-session
$ pip freeze > requirements.txt
```

### Procfileの作成
Procfileをheroku_djangoディレクトリ上に作成（gunicornをheroku上で使用するために必要）
ここがなかなか動かなくてつまづいたが

```text:Procfile
web: gunicorn --pythonpath './mysite' mysite.wsgi --log-file -
```
の１行でおっけー。
ポイントはpythonpathを指定すること

ここからは通常のdjnago開発と同様
http://eiry.bitbucket.org/
にわかりやすくまとめられている。

.gitignoreファイルをheroku_djangoディレクトリに作成
（いらないファイルをpushしないため）

```text:.gitignore
bin/
include/
lib/
*.pyc
```

### デプロイ
デプロイする時，

```shell-session
$ git push heroku master
```
エラー発生
```Error while running '$ python mysite/manage.py collectstatic --noinput'.```
heroku上でstaticフォルダが作成できないよというエラー、setting.pyに以下の３行を追加することで解決

```python:setting.py
PROJECT_DIR  = os.path.dirname(__file__)
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = os.path.join(PROJECT_DIR, 'static')
```
staticフォルダはディレクトリフォルダのすぐ下に作ってくださいねという命令

### 動作チェック
デプロイする前に

```shell-session
$ python manage.py runserver
```
もしくは，

```shell-session
$ foreman start
```
でアプリが動くか確認しましょう。

### bootstrap
bootstrapを使用する時の注意
runserverではうまく表示されるが、foreman startではうまくcss読み込めないエラー
http://stackoverflow.com/questions/16170030/django-serves-static-files-with-runserver-but-not-with-foreman
がピンポイント。

```shell-session
$ pip install whitenoise
```
が必要。
POSTとGETの違い

##### GETとPOSTの違いと使い分けがいまいちぴんとこなかったので、整理してみた。

##### GET
- クライアントから送信されるデータはリクエストURLの後に付与して送信する。
(URLには字数制限があるので、クライアントから送信できるデータは制限される。)
- データの取得のみできる。

##### POST
- クライアントから送信されるデータはメッセージボディに格納される。
- データの更新、削除、新規登録などができる。
- パスワードなどの公開したくない情報

じゃあ全部POSTメソッドで対応したらいいと思ったのだが、なぜだろうか？
公開されても良い情報をサーバー側に渡して、かつ、さくっと情報取得したい場合はGETのほうがいいということだろうか？HTTPのバージョンの名残だろうか？
ex) ネット検索、画像取得、サイト表示
herokuでpython+django+scikit-learn+mecab(1)

herokuでpythonのscikit-learn+mecabを使うときの方法。

herokuにはRubyでmecabを扱うためのheroku-buildpack-mecabは用意されているが、python用のものはない。そこでheroku-buildpack-linuxbrewを使ってmecabをbrew installする。

また、heroku-buildpack-pythonではscipyやscikit-learnなど、cコンパイラが必要なlibraryはインストールできない。代わりにheroku-buildpack-condaでpythonの代わりにminicondaをインストールすることでこれらのpackageがinstallされる。

これら複数のbuildpackを扱うために、heroku-buildpack-multiでappを作成する必要がある。

まずheroku用のローカルレポジトリ内で

```shell-session
$ git init
$ heroku create --buildpack https://github.com/heroku/heroku-buildpack-multi
```

でアプリを作成する。

次にローカルレポジトリ内に .buildpacksを作成して

```text:.buildpacks
https://github.com/kennethreitz/conda-buildpack.git
https://github.com/sunny4381/heroku-buildpack-linuxbrew.git
```

と記述して保存。
buildpack-multiはこのファイル内に記載されているbuildpackをインストールしてくれる。

同ディレクトリ内に .cellar を作成して

```text:.cellar
mecab
mecab-ipadic
```

と記述して保存。
buildpack-linuxbrewはこのファイル内に記載されているアプリケーションをインストールしてくれる。

pip、condaでインストールしたいライブラリはそれぞれ
requirements.txt、conda-requirements.txt に記載すると勝手にインストールしてくれる。

```shell-session
$ pip freeze > requirements.txt
```
または

```shell-session
$ conda list > requirements.txt
```

**注意点として、mecab-pythonはpipではinstallできないことである**(もしかしてpipのversionを上げればいける？？）
```sh: 1: mecab-config: not found```というエラーが発生

そこでmecab-pythonはheroku上で手動でインストールする（かなりの力技・・・）
その準備として、ローカルレポジトリ内で

```shell-session
$ curl -O https://mecab.googlecode.com/files/mecab-python-0.996.tar.gz
$ tar zxfv mecab-python-0.996.tar.gz
$ rm https://mecab.googlecode.com/files/mecab-python-0.996.tar.gz
```
mecab-pythonを展開する。

またmecab-python-0.996内のsetpu.pyの```'mecab-config'```を```'/app/.linuxbrew/bin/mecab-config'```に変更する。（参照元：http://qiita.com/saicologic/items/ab70e14f7e2ec2ee0b4d）

これらのことが終了したのちに、bashでデプロイする。

```shell-session
$ heroku config:add LD_LIBRARY_PATH=/app/.linuxbrew/lib
$ heroku config:set MECAB_PATH=/app/.linuxbrew/lib/libmecab.so
$ git add .
$ git commit -m 'initial'
$ git push heroku master
```

デプロイ後に、heroku上でmecab-python を手動でインストールする。

```shell-session
$ heroku run bash
~/ cd mecab-python-0.996
~/ python setup.py build
~/ python setup.py install
```
でOK.。最後に同じくheroku上でpythonを起動して import MeCabできるか確認。

これでheroku上でpython + scikit-learn + mecabを使うことができるが、ファイルサイズがめちゃくちゃ重くなる・・・

無料の300Mだとかなり厳しい気が・・・
（参照元：http://qiita.com/shouta-dev/items/cd538a77f2b729333025）
JavaScriptでObjectのDeep copy (←嘘)

JavaScriptでObjectのDeep copyする時は
Object.assignを使う(←嘘)

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

IE11とか、変な条件でなければだいたい使えるみたい

http://kangax.github.io/compat-table/es6/#test-Object_static_methods_Object.assign

---

と思ったら、指摘を頂いて確認してみたところ、
一階層目しか値コピーできていない事がわかった。

この場合はいい

```[JavaScript]
let a = {x: 1, y: 2};
let b = Object.assign({}, a);

b.y = 3;

console.log(a); // {x: 1, y: 2}
console.log(b); // {x: 1, y: 3}
```

この場合はだめ

```[JavaScript]
let a = {x: 1, y: {Y: 2}};
let b = Object.assign({}, a);

b.y.Y = 3;

console.log(a); // {x: 1, y: {Y: 3}}
console.log(b); // {x: 1, y: {Y: 3}}
```
Javaでprivate static finalなフィールドを動的に変更する


# 概要
Javaでは通常外部からアクセスすることのできないprivateフィールドの値を変更する手段として、リフレクションを利用してsetAccessible(true)する方法が広く知られています。

この方法を応用してfinalなフィールドを動的に変更する方法をご紹介します。

# サンプルコード

```java:Main.java
public class Main {

    public static void main(String[] args) throws Exception {

        TargetClass clazz = new TargetClass();
        System.out.println("更新前: " + clazz.getTargetField());                    // 更新前: 1

        Field targetField = clazz.getClass().getDeclaredField("TARGET_FIELD");     // 更新対象アクセス用のFieldオブジェクトを取得する。
        Field modifiersField = Field.class.getDeclaredField("modifiers");          // Fieldクラスはmodifiersでアクセス対象のフィールドのアクセス判定を行っているのでこれを更新する。
        modifiersField.setAccessible(true);                                        // modifiers自体もprivateなのでアクセス可能にする。
        modifiersField.setInt(targetField,
                targetField.getModifiers() & ~Modifier.PRIVATE & ~Modifier.FINAL); // 更新対象アクセス用のFieldオブジェクトのmodifiersからprivateとfinalを外す。
        targetField.set(null, 1000);                                               // 値更新: 1 -> 1000

        System.out.println("       ＿人人人人人＿");                                  //        ＿人人人人人＿
        System.out.println("更新後: ＞　 " + clazz.getTargetField() + " 　＜");       // 更新後: ＞　 1000 　＜
        System.out.println("       ￣Y^Y^Y^Y￣");                                     //       ￣Y^Y^Y^Y￣

    }
}
```


```java:TargetClass.java
public class TargetClass {

    private static final Integer TARGET_FIELD = 1;

    public Integer getTargetField() {
        return TARGET_FIELD;
    }

}
```

# 補足
SecurityManagerが有効になっている環境では上記の方法を使用してもprivate static finalなフィールドを動的に変更することはできません。
また、コンパイル時の最適化によってインライン化している場合は、上記の方法でも値を変更することはできません。(この場合はエラーにもなりません。)


# 参考

http://stackoverflow.com/questions/3301635/change-private-static-final-field-using-java-reflection