OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonの勉強 Part.2 開発環境作成（jupyter）編

# はじめに

前回の記事[Pythonの勉強 Part.1 環境作成編](http://qiita.com/village/items/479f150a2b415db78fc0)で、開発環境は整いました。
ですけど、サーバーはLinuxなので、ソースコードを書いたりするには、viとかを使う必要があります。
今時ではない（？）と思いますので、リモートからコードを書いたり、管理したり、デバッグしたり、
できるようにしたいと思います。

# jupyterとは？

[jupyter](http://jupyter.org/)というものがあります。
もともと、Pythonはインタプリタですが、コマンドラインでしか実行できません。
それを、IDE（ブラウザー)でコードを書いたり、実行したりできます。
コメントはMarkdownに対応していますので、いろいろ拡張性はありそうです。


# jupyterをインストール

```
# pip install -U jupyter
```

簡単ですね。


# jupyterにログインするパスワードを作成

jupyterにログインするときにパスワードが必要になります。
下記のコマンドでsha1ハッシュコードを生成します。

```
# python -c "import IPython;print(IPython.lib.passwd())"
Enter password:(ここにパスワードを入力)
Verify password:（同じパスワードを入力）

sha1:<数字>:<英数字>
```

sha1:....と表示された文字列をコピーします。


# jupyterの環境作成

まずは、jupyter用の作業ディレクトリーを作っておくといいと思います。
なくてもいいですが。

次に、jupyterの環境作成を行います。

```
# jupyter notebook --generate-config
```

実行すると、ログインユーザーのディレクトリーに```.jupyter```ディレクトリーが作成されます。

そこに作成された```jupyter_notebook_config.py```ファイルを修正します。

```
# cd .jupyter/
# vi jupyter_notebook_config.py
```

ソースコードの最後に以下の内容を書き込み保存します。

```
c = get_config()
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888
c.NotebookApp.password = u'sha1:<数字の文字列>:<英数字の文字列>'
```

c.NotebookApp.portは、任意のポートを設定します。ここでは8888を設定しています。
c.NotebookApp.passwordは、先ほど作成したパスワードのハッシュコードを入力します。

最後に、jupyter用の作業ディレクトリーに移動して以下のコマンドを実行します。

```
# cd ~/
# nohup jupyter notebook > /dev/null 2>&1 &
```

このようにすれば、ターミナルを閉じてもjupyterは実行されています。

# 注意事項

ポートが空いていないとアクセスできません。

1) ```# iptables -L``` で該当のポートが空いていることを確認
2) 空いていないときは、

```
# iptables -I INPUT 6 -p tcp -m tcp --dport 8888 -j ACCEPT
# service iptables save
# service iptables restart
```

3) AWSの場合は、コンソール上でポート開ける必要があります。

ネットワーク&セキュリティ -> セキュリティグループから
インバウンドタブを選択して、編集ボタンをクリックして、
ルールを追加します。
そこで、ポートを開けます。
下記の例では、”カスタムルール” - ”プロトコル(TCP)” - ’ポート範囲(8888)’としています。

![jupyter.png](https://qiita-image-store.s3.amazonaws.com/0/57930/1207c02e-2c28-918a-ad37-62af7d97b1fa.png)

# いざ、juptyerを起動

以下のアドレスをブラウザーで実行します。

```
http://グローバルIPアドレス（AWSの場合は、パブリックIP）:8888
```

以下の画面が表示されます。
先ほど設定したパスワードを入力してログインします。

![login.png](https://qiita-image-store.s3.amazonaws.com/0/57930/8d14b930-9983-34dd-7cdb-3d85fdcdfbab.png)

ログイン後に次のような画面が表示されればOKです。

![hello.png](https://qiita-image-store.s3.amazonaws.com/0/57930/8ba6c794-32ef-17b4-a214-5ecb527e8bd5.png)


# 新規ファイルを作成からHello World!まで

右上の"NEW"ボタンから作成します。
ディレクトリーなども作成できます。
Pythonのファイルを作成するため、"Python3"を選択します。

![new.png](https://qiita-image-store.s3.amazonaws.com/0/57930/de3a4a62-50dc-acb6-5416-932f89dbd2c2.png)

すると、つぎのような画面が表示されます。

![inter.png](https://qiita-image-store.s3.amazonaws.com/0/57930/f8a8b45e-7073-a796-2959-6bf904ee674c.png)

コマンドラインのように実行することができます。
試しによくあるHello World!を表示します。

![print.png](https://qiita-image-store.s3.amazonaws.com/0/57930/f0eec72a-135f-4765-c565-cff7f1f2b00b.png)

Cellメニューの下にある右矢印のボタンをクリックして実行します。

![run.png](https://qiita-image-store.s3.amazonaws.com/0/57930/5a7d1a5b-6677-07e9-5438-3702fd01c4ea.png)


すると、実行されました。

再度実行するときは、"In [1]:"をクリックして再度実行します。

保存は、お決まりの"File"メニューからできます。

# おわりに

一行ずつ実行したり、途中から再実行したりとデバッグがしやすい環境ですので、
作って損はないと思っています。
Wordpressと、ルートのindex.htmlを共存させる方法



Wordpressを設置するには、index.phpを置く必要がありますが、
設置ディレクトリ上にindex.htmlが既にある場合、サーバーの設定でHTML(index.html)が優先されてしまいます。
この場合、WPのindex.phpが動かないので、WPは動作しません。
ただ、トップページにindex.htmlを置きながら、WPのデザイン確認などしたい場合などあると思います。
そんな場合の解決法を考えてみました。




## 解決策1： WPのテーマ内からindex.htmlをロードする。

ルートのindex.htmlをindex_wp.htmlなどにリネームします。
その上で、WPテーマ内のindex.phpからindex_wp.htmlをロードします。

```index.php
<?php

$topurl = home_url( '/index_wp.html' );
$data = file_get_contents($topurl, false, $context);
echo $data;

```

こうすることで、トップページはindex.htmlのソースを読むという体裁を保ったまま、WPと共存させることができます。

ただし、読み込む順番が
アクセス→index.php読み込み→wpディレクトリの転送用テーマ読み込み→rootのindex_wp.htmlを読み込み
となってしまうため、表示速度に若干影響が出ます。


## 解決策2： サーバーの設定を変更  
サーバーのDirectoryIndexを変更し、ルートのindex.phpが先に読まれるようにした上で、index.phpに以下のコードを追加します。

```index.php
<?php 
if( $_SERVER['HTTP_HOST'] == 'example.com' ) {
   include 'index.html';
   exit();
}
```

影響範囲が少ない1.の方がスマートかもしれません。


参考
https://dogmap.jp/2009/10/20/view-index-html/
https://ja.wordpress.org/support/topic/%E8%A6%AA%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%ABindex-php%E3%82%92%E7%BD%AE%E3%81%8B%E3%81%AA%E3%81%84%E6%96%B9%E6%B3%95/
ショートカットを活用しよう - 8 - Shift + F10

# <kbd><kbd>Shift</kbd> + <kbd>F10</kbd></kbd> の効果
現在フォーカスがある場所のコンテキストメニューを表示させます。
まず、大抵の状況下で使えるはずです。
例えば、いまこの記事を書いている状況で押すと次が表示されました。
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/ec5e1df5-85e2-a27f-a1d8-d1cf575fa13f.png)
(一部Chrome拡張のメニューが出ていますが・・・)

多くのキーボードは右下の <kbd><kbd>Alt</kbd></kbd> と <kbd><kbd>Ctrl</kbd></kbd> の間にコンテキストメニューを表示させるボタンがあるかと思いますので、この操作は不要ですが、たまたま自分が今この記事を書いている環境のキーボード普段使用しないもので <kbd><kbd>FN</kbd></kbd> となっていて、独自の拡張機能を呼び出すキーボードのようです。
こうしたケースでは大いに利用する機会があるかと思います。

また、ちょっと別操作ですが、Excelで文字型のセルに数値を貼りつけたりすると次のような表示になるかと思います。
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/cc62ea6a-5073-a0cb-8eac-c465af8df2cd.png)
警告アイコンが表示されていて、警告に対してのリアクションを求めてきます。
このアイコンを展開させるショートカットは <kbd><kbd>Alt</kbd> + <kbd>Shift</kbd> + <kbd>F10</kbd></kbd> だったりします。
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/876ecd4a-0254-b04d-2d52-eda1d30b8b04.png)

このショートカットの紹介はうろ覚えだったのですが、今回主題としているキー操作と親和性のある操作のはずだったので、いくつかの組み合わせを試して動くことを確認しました。

ショートカット操作に慣れると、その操作によって呼ばれる機能と近い機能は同様に、似たような操作で行えるので、試してみるという手もあります。

以上

|前回|方針|次回|
|:--|:--:|--:|
|[<kbd><kbd>Win</kbd> + <kbd>L</kbd></kbd>](http://qiita.com/rrryutaro/items/276204bb9b6395976d7f)|[記事の方針](http://qiita.com/rrryutaro/items/74d60a6e31ff149c5710)|[<kbd><kbd>Ctrl</kbd> + <kbd>F10</kbd></kbd>](http://qiita.com/rrryutaro/items/fc1ba7ea4e10690e5583)|
ClipStudioPaint Pro アニメーションのフレームの増やし方

クリスタではアニメーションもサポートしています。
![鬼_棍棒振り.gif](https://qiita-image-store.s3.amazonaws.com/0/46088/7223f623-4053-746c-d192-49e20c8d14c2.gif)

今回初めてそれを使うにあたり、フレームの増やし方について調べたことをまとめました。
ClipStudioPaint Pro 64bit version 1.6.3 に基づいた記事です。

# フレームの上限の変更
アニメーションフォルダーを作成した後で、フレーム数を増やす方法です。
![2017-01-12_074800.png](https://qiita-image-store.s3.amazonaws.com/0/46088/d4ff017d-be01-048e-3065-b9332e83bc32.png)

タイムラインのウィンドウの青い四角形の右側をドラッグしてアニメーションのフレームの終了位置をずらします。
これで、アニメーションのフレーム数の上限を増やせます。

![2017-01-12_075150.png](https://qiita-image-store.s3.amazonaws.com/0/46088/926d32d1-3457-00c1-22f7-1e3a63fd7dbb.png)

メニューから【アニメーション」＞「タイムライン」＞「設定変更」で表示したダイアログの終了フレームを変更することと同じです。

# フレームにレイヤーを割り当てる
次にアニメーションフォルダのレイヤーをフレームに割り当てます。
![2017-01-12_091833.png](https://qiita-image-store.s3.amazonaws.com/0/46088/3db6b33e-b058-6ae4-5e5c-5e9b7cb86331.png)

タイムラインのウィンドウで割り当てたいフレームで右クリックをします。
そうするとアニメーションフォルダの中のレイヤーの名前のリストがポップアップ表示されます。
右クリックしたフレームに対応するレイヤーの名前を入力してください。
キーボードで入力しなくても、レイヤーの名前のリストから左クリックで選択できます。

一連の流れは、動画を参考にしてください。
https://youtu.be/ON9bTNlWG2s
Android Things - 周辺装置入出力(Peripheral I/O)の翻訳

# What's this?
https://developer.android.com/things/sdk/pio/index.html
このページの翻訳

# 周辺装置入出力(Peripheral I/O)
Android Thingsはセンサー、アクチュエーターとの通信の為、業界標準プロトコル、インターフェースを用いた周辺装置入出力APIを提供します

[汎用入出力用API](http://qiita.com/aoinakanishi/items/a65e894ba7ea6f131a1a) - モーションセンサー、近接センサー、レベルスイッチなど値をHIGHかLOWのどちらかで判定するシンプルなセンサーからの値の取得に利用します

[パルス幅変調(PWM)用API](http://qiita.com/aoinakanishi/items/01dd497797f9fc606c37) - 比例信号を用いて細かい制御を必要とするサーボモーター、DCモーター、ライトなどに利用します

シリアル通信用API - 同じローカルバスに接続された複数のスマートデバイスと大きなサイズのデータを転送するために利用します。

サポートしているプロトコルの特性

| プロトコル | 転送タイプ | リード線本数 | 周辺装置数 | 転送速度 |
|:-:|:-:|:-:|:-:|:-:|
| [I2C](https://developer.android.com/things/sdk/pio/i2c.html) | 同期 | 2本 | 最大127本 | 低速 |
| [SPI](https://developer.android.com/things/sdk/pio/spi.html) | 同期 | 4本以上 | 上限なし | 高速 |
| [UART](https://developer.android.com/things/sdk/pio/uart.html) | 非同期 | 2本か4本 | 1 | 中速 |
タッチじゃなくてHammer（コンパイラ）の話

jQueryでなんでもできるし
重かったらベロシティ使ったらいいじゃんって思う今日この頃、Hammerです。
https://hammerformac.com/
ええ、タッチの方じゃなくてな、これな。

このコンパイルアプリの便利なところは
一言で言うと、includeにつきる、nodeでテンプレートエンジンやら何やらとごちゃごちゃやんなくても、
プロジェクトフォルダをぶっこんだら、それだけでテンプレートエンジンになる。
当然SaapやCompassもコンパイルしてくれるしね。
あとReactのテンプレもあるみたい（使ってないけど）。

これがめちゃ便利で、ちょっとしたSPAとか作るのに至便です。

確かにたまに落ちるよ、Mac用しか無いので
Windowsの人とは共存できないけど、
<!-- @include _header.html -->
この一行で手軽にincludeできるのは素晴らしいし、サーバ立てなくても
ローカルでBuildフォルダに生成してくれるのは非常に簡単でいい！

時間ないけど、お金ある人はぜひ！
二年前から使ってたけど、廃れておらないということは
ある意味、手段としてスタンダードと言えるのかもしれない。

試用版もあるから、ぜひお試しを！
Railsの「その日の終わりの時刻」（end_of_day）で生成する時刻とMySQLに格納される値

## はじめに

このメモは、Railsのspecを書いていた時に、どうしてもテストが通らなくてハマった点について書いています。
内容としては表題の通りですが、かいつまんで言うと以下のような感じです。

**前提条件**

- DateTime型の列に、その月の最終日の値を設定する
- その月の最終日、かつ、できれば最終時刻を格納したい
- Railsの日付関数　end_of_day を使って最終時刻を出し、その値を格納する

**書いたテスト**

1. その日の最終日時を生成 ( Exp. a = Time.current.end_of_day )
2. 1の値をテーブルに格納, save ( Exp. xxxx.closed = a )
3. save後に1の値を含むインスタンスを取り出して、1の値 (Exp. expect(xxxx.closed).to eq a ) 

##単純にテストした結果

単純に比較したら、ミリ秒単位で差が生じてエラーになってしまいました....
こんなメッセージが。

```
expected: 2016-12-31 23:59:59.999999999 +0900
got: 2016-12-31 23:59:59.000000000 +0900
```

##失敗した理由

saveしてDBに格納される前は、精度は落ちません。
saveしてデータを取り出すと、ミリ秒分は0で埋まってしまいます。

知らなかった自分が悪いのですが、MySQLのDATETIME型はミリ秒省略されてしまうようで、例えば23:59:59.9999 の元データを生成したとしても、 23:59:59.000 で入るんですね...

今回、[DoRuby](https://doruby.jp)様の記事が大変参考になりました。ありがとうございました！

- [「MySQL DATETIME型のミリ秒の扱いについて」] (https://doruby.jp/users/ap_tg/entries/MySQL_DATETIME_) 
 - https://doruby.jp/users/ap_tg/entries/MySQL_DATETIME_

##とりあえずの対応

save前のデータもsave後に取り出したデータも、型はActiveSupport::TimeWithZoneで同じなのですが、精度が違っているため単純に eq ができませんでした。

結局、to_sで文字列に変換して比較をしています....

```
it '対象月のレコードのcloseは対象月の月末になる' do
  #
  # NOTE: MySQLのDatetimeはミリ秒が省略されるため、
　　　　# 23:59:99:99 -> 23:59:00:00に丸められてしまう    
  # 文字列で比較を実施
  expect(xxxx.closed.to_s).to eq target_month.end_of_month.end_of_day.to_s
end
```

## まとめという名の感想

今回はMySQLなので、このような状況になっています。他のDBに関しては試していないのですが、いろいろ差異はありそう。DBの際や制約もうっかりして気がつかないでいると、妙なところでハマるんですね。

Railsに限った話ではないですが、何か日付の最終時刻まで有効といった条件は、「その日のend_of_day」 ではなく 「翌日のbeginning_of_dayより小さい」という条件に設定したほうが安全そうだ...というのも納得した次第です。

恥ずかしながらのメモでした。

## 20170203 追記：

DB的な精度の関係でどうしても丸められてしまう場合、上記の例では to_s で対応してみましたが、ある範囲内での誤差を許容したテストを書きたい場合は、こんなものを利用します。

- minitestの場合: [assert_in_delta](http://apidock.com/ruby/Test/Unit/Assertions/assert_in_delta)
- rspecの場合: [be_within](https://www.relishapp.com/rspec/rspec-expectations/v/2-8/docs/built-in-matchers/be-within-matcher)

書き直してみると、こんな感じでしょうか。

```
it '対象月のレコードのcloseは対象月の月末になる' do
  #
  # NOTE: MySQLのDatetimeはミリ秒が省略されるため、
　　　　# 23:59:99:99 -> 23:59:00:00に丸められてしまう    
  # be_withinで誤差を許容して比較
  expect(xxxx.closed).to be_within(1.second).of(target_month.end_of_month.end_of_day)
end
```
CentOS5 CentOS6 でプロセスのswap使用量を確認する

# swap使用量 確認

CentOSで大量のSwapが発生していたので確認しようとしたが、5と6で確認方法が違ったのでメモ

## CentOS 5

```{bash}
$ grep Swap /proc/*/smaps | sort -k 2 -r | head
```

Swapでgrepした結果を、2番めのフィールド(Swapサイズ)をキーに降順ソートして、headで10件表示

```{bash:実行結果}
$ cat /etc/redhat-release 
CentOS release 5.5 (Final)
$ grep Swap /proc/*/smaps | sort -k 2 -r | head
/proc/15029/smaps:Swap:             18804 kB
/proc/6318/smaps:Swap:              3636 kB
/proc/28478/smaps:Swap:              3548 kB
/proc/15029/smaps:Swap:              2940 kB
/proc/28479/smaps:Swap:              2884 kB
/proc/28479/smaps:Swap:              2724 kB
/proc/28479/smaps:Swap:              1780 kB
/proc/3641/smaps:Swap:              1632 kB
/proc/28479/smaps:Swap:              1392 kB
/proc/28478/smaps:Swap:              1260 kB
```

PIDからプロセスを引く場合

```{bash}
$ ps aux | grep 6318
root      6318  0.0  0.0  80896   256 ?        Ss    2016   0:37 /usr/libexec/postfix/master
root     24953  0.0  0.1 103312   844 pts/0    D+   13:06   0:00 grep 6318
```

## CentOS 6

```{bash}
$ grep VmSwap /proc/*/status | sort -k 2 -r | head
```

```{bash:実行結果}
$ cat /etc/redhat-release 
CentOS release 6.8 (Final)
$ grep VmSwap /proc/*/status | sort -k 2 -r | head
/proc/7456/status:VmSwap:         411656 kB
/proc/8745/status:VmSwap:          25456 kB
/proc/1843/status:VmSwap:           6460 kB
/proc/1692/status:VmSwap:           5768 kB
/proc/4183/status:VmSwap:           3128 kB
/proc/31643/status:VmSwap:          1680 kB
/proc/31642/status:VmSwap:          1524 kB
/proc/4524/status:VmSwap:            828 kB
/proc/4143/status:VmSwap:            824 kB
/proc/4139/status:VmSwap:            812 kB
```
技術英語 > the computer's chip that [does all the calculating] / do all the calculation

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 364 / 12833)

> the computer's chip that <font color=red>**does all the calculating**</font>

do all the calculation なら何回も見たことがある。

google検索

- "do all the calculating"
   - 18,100件
- "do all the calculation"
   - 448,000件

Merriam-Webster

- https://www.merriam-webster.com/dictionary/calculating
  - adjective 
  - 1 :  making calculations


形容詞の名詞化
http://www.ravco.jp/cat/view.php?cat_id=5476

「the + 形容詞(calculating)」で名詞化して、「do all the + 名詞」という使い方なのかもしれない。
Doorkeeper を 使っていて ユーザーの削除があったときに、関連するデータベースのエントリを削除する

Doorkeeper : Doorkeeper is an OAuth 2 provider for Rails.
https://github.com/doorkeeper-gem/doorkeeper
OAuth2 対応 APIを自前で用意するときに使えるえらいgemです。

さて、これを使うとき、resource_owner と 自分たちが持つアプリケーションのユーザーと紐付けるわけですが、紐付いているため、ユーザーのdestroyをしようとすると、DBでエラーを吐きます。
なので、関連する、DBエントリを一緒に削除すると考えることにしましょう。

```user.rb
class User < ApplicationRecord
  # Relationship
  has_many :oauth_access_grants, class_name: 'Doorkeeper::AccessGrant', foreign_key: 'resource_owner_id', :dependent => :destroy
  has_many :oauth_access_tokens, class_name: 'Doorkeeper::AccessToken', foreign_key: 'resource_owner_id', :dependent => :destroy
  
end
```
Angular2でCache Busting機能を実装する方法

# Angular2でCache Busting機能を実装する方法

## 実装方法
下記のSample.htmlに実装しているSystem.locateプロパティに定義したメソッドでjsのURLをリクエストする際にURLパラメータを付ける処理が実行されます。

**注意点**
Sample.htmlの様にCache Bustingを実装するとnode_modulesフォルダ内のファイルに対してもCache Bustingが機能してしまうので、デプロイした際にnode_modulesフォルダ内のファイルを一度は読み込んでしまいます。

### Cache Bustingが有効なパターン
1. sample.component.ts(変更前)で実装されているimportで外部ファイルを読み込む際にもURLパラメータが付与されCache Bustingが機能します。
2. test.routing.tsのloadChildrenプロパティで遅延ロードしているsample.module.jsファイルのURIにはURLパラメータが付与されCache Bustingが機能します。

### Cache Bustingが無効なパターン(有効にするには)
sample.component.ts(変更前)にはtemplateUrlのhtmlファイルのURIにはパラメータが付与されずCache Bustingは機能しません。なのでsample.component.ts(変更後)ように実装する事でURLパラメータを付与してCache Bustingを機能させましょう。

## サンプルコード

```html:Sample.html
<head>
	<script src="../node_modules/systemjs/dist/system.src.js"></script>
</head>
<body>
<script>
	var version: string = '001';
	System.cacheBust = '?v=' + version;

	var systemLocate = System.locate;
	System.locate = function(load) {
	  return Promise.resolve(systemLocate.call(this, load)).then(function(address) {
	    return address + System.cacheBust;
	  });
	}

	window.CacheBusting = function(uri: string):string {
		return uri + System.cacheBust;
	}
</script>
</body>
```

```ts:sample.component.ts(変更前)
import { Component } from '@angular/core';

@Component({
  moduleId: module.id,
  selector: 'my-sample',
  templateUrl: 'sample.component.html'
})
export class SampleComponent {}
```

```ts:sample.component.ts(変更後)
import { Component } from '@angular/core';

@Component({
  moduleId: module.id,
  selector: 'my-sample',
  templateUrl: window.CacheBusting('sample.component.html')
})
export class SampleComponent {}
```

```ts:test.routing.ts
import { NgModule }             from '@angular/core';
import { RouterModule, Routes } from '@angular/router';

const testRoutes: Routes = [
  { path: 'Sample', loadChildren: './sample.module#SampleModule', }
];
@NgModule({
  imports: [
    RouterModule.forChild(testRoutes)
  ],
  exports: [
    RouterModule
  ]
})
export class TestRoutingModule {}
```
Androidライブラリのアップデート手順メモ

ライブラリのアップデート時手順をメモ。
以下のライブラリのアップデート
[ChatMessageView](https://github.com/bassaer/ChatMessageView)

### バージョン書き換え
1.2.1 から 1.2.2 へ書き換え

```build.gradle
uploadArchives {
    repositories {
        mavenDeployer {
            repository url: "file://${repo.absolutePath}"
            pom.version = '1.2.2'
            pom.groupId = 'jp.bassaer.chatmessageview'
            pom.artifactId = 'chatmessageview'
        }
    }
}
```

```README.md
dependencies {
    compile 'com.github.bassaer:chatmessageview:1.2.2'
}
```

### AARをビルド

```
$ ./gradlew assembleRelease
```

### Mavenリポジトリを配置

```
$ ./gradlew uploadArchives
```

### Bintrayにアップロード

```
$ ./gradlew build
$ ./gradlew bintrayUpload
```

Bintrayのレポジトリで指定のバージョンをPublish.

以上。

### 参考文献
- https://kazyx.blogspot.jp/2015/09/jcenter-upload.html
- http://techlife.cookpad.com/entry/2015/06/15/184248
Atlassian ConfluenceのビルドをDockerで行う

# 概要

Atlassian Confluence 5.10.5のソースコードをビルドし、WARファイルを作成するまでの手順をDokerで行う。

# 動機

前回[JIRA](http://qiita.com/mmorita44/items/4ebac05249e6399433f1)をビルドしたように、今回はConfulenceのビルドを行う。狙いは前回と同じく、手順のコード化と自動化、更にメンバーとの共有である。

#　手順

## ファイル構成

以下の様な構成となる。

```
.
├── confluence-5.10.5-source
├── docker-compose.yml
├── entrypoint.sh
└── third-party-libraries
    ├── mail.jar
    └── ojdbc7.jar
```

`confluence-5.10.5-source`はソースコードのディレクトリを示している。`third-party-libraries`はライセンス制約のある第三者ライブラリを示している。別途準備が必要になるが、それは下記で述べる。

`docker-compose.yml`と`entrypoint.sh`については[Github](https://github.com/mmorita44/atlassian-confluence-build)に上げてあるので、そこから参照なり取得なりして欲しい。


## ライセンス制約のある第三者ライブラリのダウンロード

ライセンス制約によりMavenより配布されていないライブラリは予めダウンロードする必要がある。[公式のページ](https://developer.atlassian.com/confdev/development-resources/building-confluence-from-source-code)に提示されたリンク先からダウンロードできる。

## Dockerの実行

docker-composeコマンドで行うこと。詳細については言及しない。


# 参照
- [Building Confluence From Source Code - Atlassian Developers](https://developer.atlassian.com/confdev/development-resources/building-confluence-from-source-code)
[メモ] Vagrantで、Jupyter Notebook

## 概要
- Jupyter Notebookを、Vagrantで、さくっと動かす。
- Python2でJupyterNotebookを動かして、Python3のカーネル追加。<br>(`Vagrantfile`をちょこっと書き換えれば、反対もできるよ)
- 作成したノートは、ホストの`notebook`フォルダの中にできる、ハズ。(VMの`/vagrant/notebook`)

## 環境
- Windows 7 64bit
    - Virtualbox 5.1.12r112440
    - Vagrant 1.9.1
    <br>=> [[メモ] Windowsで、Virtualbox+Vagrant(ヴェイグラント)環境](http://qiita.com/mt08/items/0ffa4059c112379c0c07)

## 手順

1. 適当なフォルダに、Vagrantfileを作成<br>- *'your_token_here'*のとこを編集する。(平文パスワード)<br>- aptキャッシュサーバがあれば、その辺も編集

    ```rb:Vagrantfile
	# Vagrantfile
	# - Replace 'your_token_here' with yours :-)

	VB_NAME="Jupyter Notebook"
	VM_MEMORY=1024
	VM_CORES=2

	Vagrant.configure("2") do |config|
		config.vm.box = "bento/ubuntu-16.04"
		config.vm.network "forwarded_port", guest: 8888, host: 8888
		config.vm.provider "virtualbox" do |vb|
			#   vb.gui = true
			vb.name = VB_NAME
			vb.memory = VM_MEMORY
			vb.cpus = VM_CORES
		end

		config.vm.provision "shell", inline: <<-SHELL
			#whoami # => root
			#echo 'Acquire::http::Proxy "http://apt_cache_server:3142";' | tee /etc/apt/apt.conf.d/02proxy
			#
			apt-get -q update -q
			#DEBIAN_FRONTEND=noninteractive apt-get -q -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade
			#
			# Jupyter on Python2
			apt-get -q install -q -y python-dev python-pip
			pip install --upgrade pip
			pip install --upgrade jupyter
			#
			# Python3 kernel
			apt-get -q install -q -y python3-dev python3-pip
			pip3 install --upgrade pip
			python3 -m pip install ipykernel
			python3 -m ipykernel install
			#
			mkdir -p /vagrant/notebook
			apt-get autoremove -y ; apt-get clean
		SHELL

		config.vm.provision "shell", privileged: false, inline: <<-SHELL
			#whoami # => vagrant 
			jupyter notebook --generate-config -y
			echo "c.NotebookApp.token = 'your_token_here'" >> $HOME/.jupyter/jupyter_notebook_config.py
		SHELL

		config.vm.provision "shell", privileged: false, run: "always", inline: <<-SHELL
			#whoami # => vagrant 
			jupyter notebook --notebook-dir=/vagrant/notebook --no-browser --ip=0.0.0.0 2>&1 &
		SHELL
	end
```
2. `vagrant up`<br>待つ
3. ブラウザを起動して、`http://localhost:8888/`にアクセス。<br>- tokenを聞かれたら、↑で設定したのを入れる。<br>- token設定は、`/home/vagrant/.jupyter/jupyter_notebook_config.py`の最後の行にあるハズ.


## その他

1. githubにおいた.

    ```bash:こぴぺ(自分用)
mkdir /c/Vagrant/Jupyter
cd /c/Vagrant/Jupyter
curl https://raw.githubusercontent.com/mt08xx/Vagrantfiles/master/Jupyter/Vagrantfile | sed -e 's/your_token_here/password/g' -e "s/#echo '/echo '/g" -e 's/apt-cache-server/linux64/g' > Vagrantfile
time vagrant up
```

2. 時間計測

    ```txt:SSD+aptキャッシュあり。
time vagrant up
.
.
.
real    16m30.540s
user    0m0.000s
sys     0m0.031s
```
Windows10 累積アップデート KB3201845 不具合 インターネットに接続できない

#修正方法

・**[スタート]**->**[コントロールパネル]**->**[ネットワークと共有センター]**->**[アダプターの設定の変更]**
![image](https://qiita-image-store.s3.amazonaws.com/0/102207/de79381f-3db4-f8c8-83a8-14f38cbe6892.png)

・:x:もしくは:warning:のマークのが付いているアダプターを右クリック->**[プロパティ]**
![image](https://qiita-image-store.s3.amazonaws.com/0/102207/54a3c5a6-6f9e-b1ee-4882-9488650d5e03.png)

・**[インターネット プロトコル バージョン 4 (TCP/IPv4)]** を選択して**[プロパティ]**ボタンをクリック。
![image](https://qiita-image-store.s3.amazonaws.com/0/102207/e1434fd7-e268-935d-933e-67c6b59f98ae.png)

・この画面のような設定になっていたら、**[IPアドレスを自動的に取得する(O)]**にチェックして**[OK]**ボタンを押して下さい。
※なぜかWindows Update がこの設定にしてしまっています。困りますね・・・

![image](https://qiita-image-store.s3.amazonaws.com/0/102207/133e276a-c07f-47d0-2d84-1770802ebe89.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/102207/b1447705-a514-f00b-e838-ac8d9bca3377.png)

・これで接続できるようになっているはずです。(IPアドレスを固定にしている方はおそらくこの不具合は出ていないかもしれませんが、一応見たほうが良いかもしれません）

これでダメならば、このあと**[スタート]**->**[電源]**->**[再起動（シャットダウンしない）]**で治るかもしれないとのこと。
![image](https://qiita-image-store.s3.amazonaws.com/0/102207/41314e21-7588-fa86-7f2a-9a50f5c2d551.png)
[参照元 Fix: Problems caused after installing Windows 10 Cumulative Update KB3201845](http://www.thewindowsclub.com/problems-installing-windows-10-cumulative-update-kb3201845)
Swift3 で生年月日から現在の年齢を取得する

## 年齢のみ

グレゴリオ暦の `Calendar` クラスを使います。

```
let calendar = Calendar(identifier: .gregorian)
let birthDate = DateComponents(calendar: calendar, year: 1983, month: 4, day: 15).date!
let now = DateComponents(calendar: calendar, year: 2017, month: 1, day: 12).date!
let age = calendar.dateComponents([.year], from: birthDate, to: now).year!

age // -> ３３
```

## 生まれてからの年と月と日数

赤ちゃんの年齢表記とかに使えそうですね。

```
let calendar = Calendar(identifier: .gregorian)
let birthDate = DateComponents(calendar: calendar, year: 2016, month: 1, day: 12).date!
let now = DateComponents(calendar: calendar, year: 2017, month: 1, day: 12).date!
let elapsedComps = calendar.dateComponents([.year, .month, .day], from: birthDate, to: now)

String(format: "生後%d年%dヶ月%d日", elapsedComps.year!, elapsedComps.month!, elapsedComps.day!) // -> 生後1年0ヶ月0日
```
js フェイクバイナリの変換

##お題
引数で与えられた数字0~4は0、5~9は1に変換して返す。

```js
function fakeBin(x){
//write your code.
}
```

##出力結果　例

```js
fakeBin('45385593107843568')// 01011110001100111
fakeBin('509321967506747')//101000111101101 
fakeBin('366058562030849490134388085')//011011110000101010000011011
```

##使ったもの
for文
if文

##考え方
・変換後の数字を入れる配列を用意する
・for文で引数の数字を順番に条件分岐で変換する
・用意した配列を返しておわり

##コード

```js
function fakeBin(str){
  var newStr = "";
  for(var i=0;i<str.length;i++){
    if(Number(str[i])>=5){
      newStr += "1"
    }
    else{
      newStr += "0";
    }
  }
  return newStr;
}
```

##例外処理
```js
'use strict';
function fakeBin(str){
  var newStr = "";
  if(isNaN(str) === false){
  for(var i=0;i<str.length;i++){
    if(Number(str[i])>=5){
      newStr += "1"
    }
    else{
      newStr += "0";
    }
  }
  return newStr;
 }else{
  throw "TypeError:"+ str + " is not a number.";
 }
}
fakeBin("a");
```

##ES6

```js
function fakeBin(x) {
    return x.split('').map(n => n < 5 ? 0 : 1).join('');
}
```

```js
const fakeBin=x=>[...x].map(n => n < 5 ? 0 : 1).join('');
```

###他にもコードが浮かんだ方、コメントお待ちしております
ゼニヤッタで学ぶローカル座標系

#　ローカル座標系とは
モデルやジョイントを基準とした座標系。

# ゼニヤッタ
Blizzard Entertainment 開発のアクションシューティングゲーム [Overwatch](https://playoverwatch.com/ja-jp/heroes/zenyatta/) のキャラクター。
オーブを駆使して戦うロボット僧侶。

# オーブ
オーブはゼニヤッタの体の周りを浮遊している。
オーブの位置・姿勢はゼニヤッタのローカル座標系で管理すると実装しやすい。

# デモ
https://keitanxkeitan.github.io/ZenyattaWebGL/
※読み込みに少し時間がかかります

![スクリーンショット 2017-01-12 1.19.36.png](https://qiita-image-store.s3.amazonaws.com/0/1004/70f8a7c0-5030-14fb-8cd1-7b5842be809e.png)

# 仕様
- オーブは同心円上に並ぶものとする
- 同心円の軸はゼニヤッタの +Y 方向とする
- 同心円の軸はゼニヤッタの X 軸回りでピッチ回転させることができる
- オーブを配置する位置は同心円の軸回りで回転させることができる
- 同心円の半径を変更することができる

# ソースコード
https://github.com/keitanxkeitan/Zenyatta
ブロックチェーンの概要をザクッとつかめるページ

自分の理解を深めて勉強会で発表するために調べたページをまとめました

## 仕組み

### 不正困難台帳の実現方法

5分でわかるブロックチェーン--
http://www.slideshare.net/cookle/5-58379474

わかりやすいブロックチェーン(blockchain)とは何か? の説明
http://qiita.com/hshimo/items/1881fba8957c2a6e17ca



## 技術的課題、社会応用への課題

ブロックチェーン技術の基本と応用の可能性
http://www.slideshare.net/ks91020/ss-58535780http://www.slideshare.net/ks91020/ss-58535780



## 技術的説明

Bitcoinを技術的に理解する
http://www.slideshare.net/kenjiurushima/20140602-bitcoin1-201406031222

技術者向け Ethereumの基礎知識 (イーサリアム、エセリウム)
http://qiita.com/hshimo/items/20abfc5942d4dd5d3e04


## 雑記的な

合っているか支持不支持は別として思想的にも揺れていて議論を呼んでいることがわかる（特にコメント欄）
BitCoinとBlockChainにまつわる誤解ーそんなことはできない
http://qiita.com/tatarou1986/items/9d994896795a4871dc37
インクリメント、デクリメント演算子のないPythonの話。

  
CとかJavaのコードと並行する形でPythonを書いているとインクリメントやデクリメントにi++やi--のように演算子を書きたくなってしまうことがついつい…。

しかし、やってみればわかることですがこれだとエラーが出てしまいます。

```python
>>> i=1  
>>> i++
SyntaxError: invalid syntax
```

"++"や"--"のような演算子がPythonには実装されていない理由に関しては諸説あるようですが、Pythonの生みの親であり[慈悲深き終身独裁者](http://www.artima.com/weblogs/viewpost.jsp?thread=235725)である元GoogleエンジニアのGuido van Rossum氏がPythonは"+"や"-"に複雑な意味を与えずに書き手にも読み手にも理解しやすいものにしたかったというのがあるそうです。

ちなみにですが、RubyやScalaといった言語にもこれらの演算子はないです。こちらも"ない"理由は様々なようですが…。

なにはともあれ前置と後置がきっかけで生まれるエラーを心配せずに済むので個人的にはありがたい仕様だと思っています。

Pythonでは次のように書けば問題ありません。

```python
>>> i+=1 # インクリメント  
>>> print(i)  
2  
>>> i-=1 # デクリメント  
>>> print(i)  
1  
```

またよく使うfor文に関しては

```python
>>> for(int i=0; i<10; i++)
```

ではなく

```python
>>> for i in range(0, 10)
```

と書けばいいわけです。

ちなみに普段見かけることはありませんが補数を利用すれば次のように書くこともできます。書こうと思えば…ですが。

```python
>>> i=-~1
>>> print(i)
2
```

おまけとして、文字のインクリメント(?)は次のように書けます。

```
>>> print(chr(ord('a')+1))
b
```

##　参考  

[LINUX 修験道-PYTHON のインクリメント！](https://linuxshugendo.wordpress.com/2014/02/28/python-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%AF%E3%83%AA%E3%83%A1%E3%83%B3%E3%83%88%EF%BC%81/)
[Why are there no ++ and --​ operators in Python?](http://stackoverflow.com/questions/3654830/why-are-there-no-and-operators-in-python)
[週末京都-文字のインクリメント](http://d.hatena.ne.jp/keybot/20091106/p1)
自動ログインの実装に見る、Cookieの取扱で注意すべき点

CakePHPのプロジェクトに自動ログインの機能を入れてみましたが、その際に使ったライブラリが、示唆に富むものでした。

# まず、Cookieとは
## ステートレスなHTTP
Webを支えているHTTPですが、HTTP/1.1までの基本構造としては[^1]、「1つのリクエストに対して1つのレスポンス」を行うという、**ステートレス**なプロトコルとなっています。

とはいえ、ログイン機能、ショッピングカートなど、Webサービスを提供する上では、状態管理が欠かせなくなってきます。そこで登場したのがCookieで[^2]、識別用の情報を**リクエストごとに**送信することで、ステートレスなHTTPで状態管理を実現しています。

## Cookieの属性
Cookieには、「キー」、「値」以外にもいくつか属性があります。

* `domain`属性…クッキーが有効になるドメインを指定します。`.example.co.jp`のように、サブドメインを一気に指定することもできます。
* `path`属性…クッキーが有効になるパスを指定します。
* `max-age`属性/`expires`属性…クッキーの有効期限を指定します（何も指定しなければ「ブラウザを閉じるまで」になります）
* `secure`属性…HTTPSにしかこのクッキーを送信しないようにします。
* `httponly`属性…JavaScriptの`document.cookie`でこのクッキーを読み取り不能とします。

# 自動ログインに必要なこと
長期間に渡ってログインを不要とするためにセッションの有効期間を伸ばしてしまえば、セッションキーが盗まれる**セッションハイジャック**のリスクも高まります。ということで、「自動ログイン」は以下のような挙動になります。

* セッション用のキーとは別に、長期間持たせるログイン用のCookieを用意する。
* 適切なタイミングでそのCookieをチェックして、あったらログイン処理を行ってセッションを展開する

考える要素としては、以下のようなものがあります。

* 発行したトークンの（サーバサイドでの）管理方法
* どのような形でブラウザにCookieとするか
* 自動ログイン用のCookieのチェック方法

# 実際の挙動
今回使ったのは、[Beskhue/CookieTokenAuth](https://github.com/Beskhue/CookieTokenAuth)というライブラリです。以下、どのような挙動か追いかけていきました。

## ログイン用クッキーの発行

まず、保存されるデータですが、[DB定義のSQL](https://github.com/Beskhue/CookieTokenAuth/blob/master/db.sql)にあるように、「ユーザーID」「トークンID（`series`）」「トークンのハッシュ値（`token`）」「有効期限」を記録しています。ここで、ユーザーID頼みにせずに別なキーを入れることで、1つのアカウントから複数の端末での自動ログインを可能としています。

### トークン値の意味について
自動ログイン用のキーとしてパスワードからハッシュを生成する方法では、ユーザーがパスワードを変えない限り同じキーが使われ続けるので、無効化する手立てがなくなってしまいます。別に自動ログイン専用のトークンを作ることで、期限切れでDB側を消せば無効化できるなど、セキュリティ的にも管理をやりやすくしています。

そして、『秘密の国のアリス』に「もしも、平文に人の命がかかっているなら、鍵にも人の命がかかっていることになるのです。」とあるのと同様に、「ログインできるトークン」は、「ログインに必要なユーザー名＋パスワード」とほぼ同等の価値を持ちます。幸い、このトークンは検証さえできればいいので、パスワード同様にハッシュ化して格納すればもとの値を取ることがほぼ不可能となります。

### 実際の発行
発行処理は`CookieTokenComponent#setCookie`（[ソース](https://github.com/Beskhue/CookieTokenAuth/blob/0.2.1/src/Controller/Component/CookieTokenComponent.php#L29)）で行っています。データベースに必要な値をセットして、Cookieを特定のパスだけ（後述）に限定した上で、さらに[CakePHPの機能でAES暗号化して](https://book.cakephp.org/3.0/ja/controllers/components/cookie.html)ユーザーに送信しています。secureやhttponlyは適宜設定が必要そうですが、こういうクッキーの場合は必要不可欠、とも言えます。

自動ログインのキーを送るのは、これを意識的に呼んだ場合に限られます。基本的には、ログインごとに1回、となるでしょう（トークンはハッシュ化しているので、再送はできません）。

## 自動ログインのチェック
自動ログイン対象かどうかのチェックは、`CookieTokenAuthenticate#authenticate`で行っています（[ソース](https://github.com/Beskhue/CookieTokenAuth/blob/0.2.1/src/Auth/CookieTokenAuthenticate.php)）。まず、セッションデータで「自動ログインのチェック済み」かどうかを確認して、すでにチェックが終了していれば何もしません。

チェックが必要となれば、いったん`/auth/cookie-token-auth`にリダイレクトさせます。先程行ったクッキーの設定で、ここでしか自動ログインのを受け取れないようになっている関係上そうなりますが、逆にここへ来なければクッキーを送信しないので、通信路の盗聴に対しても安全性を高めています。正しいクッキーが来ていればログインを行って、自動ログインのキーを更新して一件落着となります。


[^1]: HTTP/2ではサーバとクライアントの間でセッションを構築するようになります。
[^2]: もちろん、「URLに識別情報を埋め込む」という手段もなくはないのですが、ブックマークやリファラーなどで識別情報まで流出してしまう、第三者が同じURLにアクセスできるなどセキュリティ上よろしくないので、ほぼ使われません。
メモ：ニューロモーフィック・（チップ｜コンピューティング）

ニューロモーフィック・（チップ｜コンピューティング）について気になったのでメモ。

IoT機器自体がセンサー以上の役割を持って自律的に機能するには、微細化技術の限界・必要な計算量・バッテリー技術、等を考えると、「ニューロモーフィック」な技術の進歩が必要になるのかもしれない。10～20年後にはコンシューマーの手に降りてくるのか？


# 「ニューロモーフィック・チップ」とは？

引用：[IoT｛Internet of Things｝まとめ](http://iot-jp.com/iotsummary/iottech/%E6%8A%80%E8%A1%93%E4%B8%80%E8%88%AC/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%AD%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%83%BB%E3%83%81%E3%83%83%E3%83%97/.html) 

> ニューロモーフィック・チップ（Neuromorphic chip）とは、脳の構造を模したコンピューターチップで、インテル、クアルコムなど企業をはじめ、様々な企業・研究所で研究が進められています。

> ニューロンモデルを用いたコンピューティングは、既存のコンピュータ上でシミュレートするニューラルネットワーク(神経回路網)が浸透していますが、IBMが開発したのは、脳のニューロンとシナプスを物理的に模した構成のニューロシナプティック・コア、つまり、これまでソフトウエアとして実現されてきたものを半導体上の集積回路ハードウエアとして再現したもので、まさに「人工頭脳」の第一歩と呼べるものかもしれません。

概要を理解するのにお勧めの資料 [by OGAWA, Tadashi (@ogawa_tter) 2016年12月16日](https://twitter.com/ogawa_tter/status/809718463144947712)
PDF : ["Perspectives on Neuromorphic Computing", T. Hylton, Keynote, ORNL Neuromorphic Comp WS, Jun 29 2016](http://ornlcda.github.io/neuromorphic2016/presentations/Hylton-ORNLNeuromorphicComputingtalk-June2016.pdf)


# 最近の状況

Slide (PDF) : [Neuromorphic Computing ~ Beyond CMOS Emerging Computing Architecture ~ Basic Research Needs](https://science.energy.gov/~/media/ascr/ascac/pdf/meetings/201604/Pino_DOE_SC_ASCR_ASCAC_V3.pdf)


2015年10月に開催された Round Table のレポート。
スポンサーは北米の DOE = Department Of Energy の Office Of Science ASCR/BES。
> ASCR : Advanced Scientific Computer Research
> BES : Basic Energy Sciences

* Slide 4
    * 参加者一覧を見ると、どの企業・大学が興味を持っているかわかる。
* Slide 7
    * シナプスと機能等価なメモリスタ（Memistor）が重要な役割を担う
    * 2008年にHP研究所により開発された
    * 抵抗器（Reistor）、キャパシタ（Capacitor）、インダクタ（Inductor）に次ぐ新たな受動素子（第４の回路素子）
    * The memristor = the functional equivalent of a synapse
* Slide 8
    * Von Neumann と Neuromorphic の比較図
* Slide 13
    * 機械学習との関係についても触れている。
    * 複雑で構造化されていないデータの解析には（フォン・ノイマン型コンピューターを使った）現在の手法は不向きで、ニューロモーフィック・コンピューティングの適用により大きく加速できる可能性がある。
* Slide 15
    * 既存チップの比較
    * TrueNorth : 2015 IBM
    * SpiNNaker hybrid CPU/Neuron : University of Manchester and FACETS, University of Heidelberg
        * ARM コアをつなげて開発した？？[Low-Power Chips to Model a Billion Neurons](http://spectrum.ieee.org/computing/hardware/lowpower-chips-to-model-a-billion-neurons)

以上
char型バッファを引数にとるC関数をSwiftから呼ぶ

#たまにしか出会わないシチュエーションだからこそ書き残す。
Birdging-Headerを用意するのはObjective-CをSwiftから使う場合と同様。

**コメントにて指摘頂きました。サンプルコードを書き直しました。(2017/1/12)**
```
int getPath(char* buff, CFIndex maxPathSize);
```

こんなC言語の関数を呼び出す場合は以下のようにする。

```
var buffer = UnsafeMutablePointer<Int8>.allocate(capacity: Int(MAXPATHLEN))
getPath(buff, CFIndex(MAXPATHLEN))
let str = String(cString: buff)
print(str)
...
buffer.deallocate(capacity: Int(MAXPATHLEN))
```

#参考
http://stackoverflow.com/questions/30042494/swift-convert-string-to-unsafemutablepointerint8
ActiveRecordのValidationの:if, :unlessでprocまたはLambdaのどちらを使うべきか

※procとはProc.newで生成されるオブジェクトを指しています。

## 結論
結論から言うとどちらでもよい。
どちらを使うべきかというタイトルで、どちらでもよいという結論にしてしまって申し訳ないのですが、、、

## 始めに思っていたこと
procとLambdaの違いは`return`や`break`の挙動の違いと、引数の数の検証です。ここで`return`や`break`の挙動は関係ないと思ったので、引数の数の検証をしてくれるLambdaを使うのがよいと思いました。しかし、Lambdaを使ったときに引数を取っても取らなくてもエラーがでないので、なぜだという感じでした。

## ActiveRecordの処理
紐解くカギの[make_lambda](https://github.com/rails/rails/blob/v4.2.7.1/activesupport/lib/active_support/callbacks.rb#L429)では、引数の数に応じて処理が書かれて、`instance_exec`の引数としてproc, Lambdaが渡されてました。なので、procでもLambdaでもどちらでもよいということになります。

~~ちなみに、[Rails guides Active Record Validations](http://guides.rubyonrails.org/active_record_validations.html)では、Procを使えるとの記述があるのですが、Lambdaが使えるとの記述はないです。問題なく使えますが。~~Rails guidesではa Proc objectと書かれているので、Lambdaも含まれます。

## あとがき
[Client side validations](https://github.com/DavyJonesLocker/client_side_validations)を使うときに`:if`と`:unless`のオプションにLambdaを使えない不具合があったのですが、使えるようになりました。PRを送るために`ActiveRecorde`のコードを読んでみました。コードを読むと色々勉強になるね。一応、PRを送ったのだけど、僕のPRはクローズされてコミットがこのPRに取り込まれてたｗ [#686](https://github.com/DavyJonesLocker/client_side_validations/pull/686)
AccessのクエリをSQLで作っていく

## ★データを抽出する

#### テーブルの項目すべて
``` SQL
select  * from テーブル名;
```
#### テーブル項目すべてのうち、条件に合致するものだけ
``` SQL
select  * from テーブル名
where 条件;
```
*条件とは、フィールド名 > 1000 など

#### 一部のフィールドだけ
```SQL
select フィールド名, フィールド名 from テーブル名;
```
---
「OpenCV-Python チュートリアル文書」 のサイトが立ち上がっています

鳥取大学の方が以下のサイトを立ち上げていらっしゃるのに気づきました。
ドキュメントの広い範囲にわたって、和訳を作成されていらっしゃいます。
大感謝！

[OpenCV-Python チュートリアル文書のページへようこそ!]
(http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/index.html)
Rで顧客来店データをヒストグラムで分析

# はじめに
Rを使って顧客来店データを分析する方法を記録したいと思います。
データについては、あるサービス業の来店データとなります。
今回は年代を軸に性別ごとの来店数をヒストグラムで分析しようと思います。

# 対象データ
```data:service.csv
cancel,weekday,hour,attention,sex,age
0,2,18,0,2,10
0,5,12,0,1,10
0,4,17,0,2,10
0,0,10,0,1,10
0,4,17,0,2,10
1,0,17,0,1,10
-------
```
左から→キャンセルフラグ,曜日,時間,注意フラグ,性別,年代
となります。
（注意フラグは、一定のキャンセル数以上の場合に1が入ります）
こんな感じのcsvデータを利用します。

# 結果グラフ
![1.png](https://qiita-image-store.s3.amazonaws.com/0/156795/0244bdb0-031d-9e09-79fe-b1f65259a653.png)
縦軸：件数
横軸：年代
となっています。
また、
sex-1は男性で赤色
sex-2は女性で青色
となります。

# コード
```r:
# ggplotのインストール
install.packages("ggplot2")

# ggplotのロード
library(ggplot2)

# csvの読み込み（先頭行をヘッダに）
df <- read.csv("service.csv", header = TRUE)

# 型情報の確認
sapply(df, class)

# データの先頭部分の出力
head(df)

# データの概要の確認
summary(df)

# データを加工（それぞれ文字列型と数値型に変換）
df <- data.frame(
  attention = as.character(df$attention),
  hour = as.numeric(df$hour),
  weekday = as.numeric(df$weekday),
  sex = as.character(df$sex),
  age = as.numeric(df$age),
  cancel = as.character(df$cancel)
)

# グラフの生成（ヒストグラムを作成。年代をxにして、sexを塗り分ける）
ggplot(df, aes(x = age, fill = sex)) +
  geom_histogram() +
  theme_bw(16) +
  ylab("count") +
  scale_x_continuous(breaks=c(10, 20, 30, 40, 50, 60, 70, 80, 90))
```
※最後のscale_x_continuousでは、x軸の刻みを設定しています

# まとめ
今回はヒストグラムを使った業務データの分析をしてみました。
今後も同データをいろいろいじってみたいと思います。
Solr Re-Rankingの使い方

# 何
SolrのRe-Rankingという機能を知らなかったので調べる。

# 前提知識
- Solrはデフォルトで、スコア順に並ぶ。スコアの意味は、重要なドキュメント、検索ワードに適合しているドキュメントであることを式によって値にしたもの。

# Re-Rankingとは
- https://cwiki.apache.org/confluence/display/solr/Query+Re-Ranking
- 簡単なクエリ(A)のトップN件のスコアを別の複雑なクエリ(B)により再調整することで、トップN件の順位を変更する機能。
- トップN件以外の順位に変化はない。
- 複雑なBの適用をN件に限定できることがメリット。Nが小さいと再調整の対象外ドキュメントが増えるため、Bにヒットしても順位が上がらなくなる。Nをいくつにするかがトレードオフ。

# どのバージョンから使える？
- Solr4.9
- https://issues.apache.org/jira/browse/SOLR-6088

# 例)

## １) Re-Rankingなし 
- ※"search"は形態素フィールド

![スクリーンショット 2017-01-11 22.29.13.png](https://qiita-image-store.s3.amazonaws.com/0/151200/b78e5e23-ad26-84c0-59df-a4db203822c3.png)

## ２） Re-Ranking適用 

### Raw Query Parametersに以下を適用
```
rq={!rerank reRankQuery=$rqq reRankDocs=5 
reRankWeight=3}&rqq=(search:ヒロシマ OR search:ビーバー)
```
- トップ5件をre-rank
- ヒロシマ OR ビーバーにマッチすれば順位が上がるが、"町で大暴れ！ビーバー騒動記"は6位なので順位変動なし。


![スクリーンショット 2017-01-11 22.30.32.png](https://qiita-image-store.s3.amazonaws.com/0/151200/1217acbb-e1d4-f291-b6a7-5f87ce8d7cd1.png)
配列をオブジェクトに変換する（es2015 ver)

```js
const arr = [
  {
    id: 'cd',
    name: 'Clarice Dillard'
  }, {
    id: 'nb',
    name: 'Noel Bond'
  }, {
    id: 'sd',
    name: 'Sheree Dunn'
  }
];
```

という形のオブジェクトをメンバーにもつ配列を

```js
obj = {
  cd: {
    id: "cd",
    name: "Clarice Dillard"
  },
  nb: {
    id: "nb",
    name: "Noel Bond"
  },
  sd: {
    id: "sd",
    name: "Sheree Dunn"
  }
}
```

という感じのオブジェクトに変換したい、できるだけスッキリ書きたい、という話

## 例

```js
const obj = arr.reduce(
  (o, c) => Object.assign(o, {[c.id]: c}),
  {}
)
```

## Object Rest/Spread Propertiesを使ったver

もう少し短くかける

- [Object Rest/Spread Properties](https://github.com/sebmarkbage/ecmascript-rest-spread)
- [babel-plugin-transform-object-rest-spread](https://www.npmjs.com/package/babel-plugin-transform-object-rest-spread)とか、[babel-preset-stage-3](https://www.npmjs.com/package/babel-preset-stage-3)が入ってる環境

```js
const obj = arr.reduce(
  (o, c) => ({...o, [c.id]: c}),
  {}
)
```

## 再び配列に戻したいとき

`Object.keys()`、`Array.map()`でいまのとこやってる

```js
const arr2 = Object.keys(obj).map(k => obj[k])
```
Oracle Database の NLS_CALENDAR に "Japanese Imperial" を指定して元号を出す。

表題の通りとしか言いようが無いやな彡(ﾟ)(ﾟ)
Oracle Database の NLS_CALENDAR に ”Japanese Imperial"を指定すると、
日付データを元号に変換できるんやで。

```sql
$ export NLS_CALENDAR="Japanese Imperial";
$ sqlplus /nolog

SQL*Plus: Release 12.1.0.2.0 Production on Wed 1 11 22:20:04 0029

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

SQL> CONNECT xxxxxxxx/xxxxxxxx
Connected.
SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
---------------------------------------------
平成29年01月11日

SQL>
```

マ？彡(ﾟ)(ﾟ) こんな機能が……初めて知ったやで……彡(-)(-)
マニュアルは下記となります(｀･ω･)ゞ

* Oracle Databaseグローバリゼーション・サポート・ガイド 12cリリース1 (12.1)
B71319-05<BR>
A ロケール・データ<BR>
暦法<BR>
表A-17 サポートしている暦法<BR>
http://docs.oracle.com/cd/E57425_01/121/NLSPG/applocaledata.htm#CIAHCDDF
<BR>
 > Japanese Imperial(日本の元号暦)
GR-CITRUSに組み込むmrubyをビルドする方法 for macOS


[GR-CITRUSに組み込むmrubyをビルドする方法 for Windows](http://qiita.com/takjn/items/42fa8ad0c61a8840a9c2)のmacOS版です。

GR-CITRUSは、mrubyが気軽に使える小型ボードです。Chrome Appの「Rubic」を使うことでプログラムの作成から実行までスムーズに行うことができます。

GR-CITRUSのファームウェアの中にはmruby(libmruby.a)が組み込まれています。しかし、標準のファームウェアに組み込まれているmrubyには最低限のライブラリ(mrbgems)しか組み込まれていないため、ちょっと複雑なものを作ろうとしたときに困ることがあります。その場合、必要となるライブラリ(mrbgems)を組み込んだmruby(libmruby.a)のビルドと、それを組み込んだGR-CITRUSのファームウェアのビルドが必要となります。

この記事ではその手順を紹介します。

#必要なもの
この記事では、macOS High Sierraを使用しています。まず、mrubyを普通にビルドできる環境が必要です。私の環境にはRailsを動かすためにrubyやgitなど一式諸々が入ってしまっているため詳細が確認できません。すみません。

また、GR-CITRUSのファームウェアをビルドしたことがない方は、あらかじめ[GR-CITRUSのFirmwareをビルドする方法 for macOS](http://qiita.com/takjn/items/f25251f355fba49245b4)に従い、ビルド環境のセットアップとファームウェアのビルドができることの確認を行っておいてください。

#mrubyのソースコードの取得
コマンドプロンプトを起動して、githubのmrubyリポジトリからmasterブランチをクローンします。

```
git clone https://github.com/mruby/mruby
```

#GR-CITRUS用のbuild_config.rbの準備
mrubyのビルドを行うためには、`build_config.rb`ファイルを適切に設定する必要があります。GR-CITRUS用のbuild_configファイルは、GR-CITRUSのFirmwareのmrubyフォルダに含まれてます。

* [build_config.rb](https://github.com/wakayamarb/wrbb-v2lib-firm/blob/master/firmware_release/mruby/build_config.rb)

このファイルを取得するか、その内容をすべてコピー＆ペーストして、`mruby`フォルダ内にある`build_config.rb`ファイルの内容を置き換えてください。

#build_config.rbの修正
上記で取得した`build_config.rb`ファイルを自分の環境にあうように書き換えます。書き換えるのは、`BIN_PATH`の行です。

```text:build_config.rb
  BIN_PATH = "/Applications/IDE4GR.app/Contents/Java/hardware/tools/gcc-rx/rx-elf/rx-elf/bin/"
  LIB_PATH = "/Applications/IDE4GR.app/Contents/Java/hardware/tools/gcc-rx/rx-elf/rx-elf/rx-elf/lib"
```

ここで指定するパスは、rx-elf-gccコマンドがあるパスです。[GR-CITRUSのFirmwareをビルドする方法 for macOS](http://qiita.com/takjn/items/f25251f355fba49245b4)に従いビルド環境を構築した方は、IDE for GRをインストールしたパスとなります。

また、このファイル内でmrubyに組み込みたいライブラリ(mrbgems)を指定することができます。適宜、必要に応じて追加、削除などを行ってください。

#mrubyのビルド
ターミナルを起動し、上記で修正した`build_config.rb`があるフォルダに移動します。

```
$ cd mruby
```

mrubyのビルドを行います。

```
$ ruby ./minirake
```

ビルドが成功すると、以下のようなメッセージが出力されます。`build\RX630\lib`フォルダに出力された、`libmruby.a`ファイルが、GR-CITRUSのファームウェアに取り込むmruby（ライブラリ）です。

```
================================================
      Config Name: RX630
 Output Directory: build/RX630
    Included Gems:
             mruby-math - standard Math module
             mruby-numeric-ext - Numeric class extension
================================================
```

#GR-CITRUSのファームウェアのビルド
GR-CITRUSのファームウェアの`wrbb-v2lib-firm/firmware_release/wrbb_mruby`フォルダにある`libmruby.a`ファイルを、mrubyのビルドで出力された`libmruby.a`ファイルで上書きします。

```
cp build/RX630/lib/libmruby.a /{path_to}/wrbb-v2lib-firm/firmware_release/wrbb_mruby/libmruby.a
```
GR-CITRUSのファームウェアをビルドします。`firmware`フォルダに移動して、`make`コマンドを実行します。

```
cd /{path_to}/wrbb-v2lib-firm/firmware_release/

make
```

正常終了すると、makefileと同じフォルダにあるcitrus_sketch.binファイルが更新されているはずです。

ビルドしたファームウェアを書き込む場合は、GR-CITRUSのリセットボタンを押してUSBメモリとして認識させた後、citrus_sketch.binファイルをコピーしてください。
Swift3.0対応 CoreGraphicsでPieを描く

#はじめに
Swift3で、グラフなどを描く際に利用できるPieのサンプルを作成しました。
基本的なやり方なので、応用が効くと思います。
単純に円を描くだけなら以下のリンク先で紹介している方法でもできます。
[Qiita Swift3.0対応 CoreGraphicsで円を描く](http://qiita.com/Masataka-Dev/items/7a055d8462bb1335eaf0)

<img width="150" alt="Simulator Screen Shot 2017.01.11 21.09.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/159175/5f9f5f70-ff5f-3e46-d801-2472d5619f4a.png">

#Pieの描画
```swift:PieView.swift
private func drawPie(rect: CGRect) {
        // コンテキストを取得(1)
        guard let context = UIGraphicsGetCurrentContext() else {
            return
        }
        
        // 色の設定(2)
        context.setFillColor(self.fillColor.cgColor)
        
        // パイの中心位置
        let center = CGPoint(x: rect.width * 0.5, y: rect.height * 0.5)
        
        // パイの半径
        let radius = min(rect.width, rect.height) * 0.5
        
        // 開始と終了の角度をラジアンに変換(3)
        let startRadian = CGFloat((self.startAngle - 90) * .pi/180)
        let endRadian = CGFloat((self.endAngle - 90) * .pi/180)
        
        // パイの形を描画(4)
        context.move(to: center)
        context.addArc(center: center, radius: radius, startAngle: startRadian, endAngle: endRadian, clockwise: false)
        context.fillPath()
    }
```
####(1) コンテキストの取得
コンテキストを取得します。

####(2) 描画色の設定
塗りつぶしの色の設定には"setFillColor"を使用します。
引数にはCGColorを指定します。
サンプルではStoryboardで設定した色を引数に渡しています。

####(3) 開始と終了の角度をラジアンに変換
サンプルではStoryboardで描画の開始角度と終了角度を設定できるようにしています。
開始角度を0度、終了角度を300度にしています。
(4)で説明しますPieを描画するメソッドの引数には開始角度と終了角度のラジアンを渡すようになっていますので、ここで変換します。
-90度しているのは描画する方向を時計回りにするためです。

####(4) Pieの描画
"context.move(to: center)"で、Pieの中心に描画位置を移動します。
"context.addArc"の引数は左からPieの中心ポイント、半径、開始角度(ラジアン)、終了角度(ラジアン)で"clockwise"はtrueだと時計回りに、falseだと反時計回りに描画します。サンプルではfalseにしていますが、trueにすると上記の画像のPieの欠けた部分を描画します。
"context.fillPath()"で描画です。

このメソッド"drawPie"をUIViewの"draw"メソッドで実行すれば描画できます。

#サンプル
Githubにサンプルプロジェクトをあげました。
ご参考になればと思います。

[Github PieView](https://github.com/Masataka-Dev/PieView)
Ubuntuでapt-get upgradeしたとき/bootの空き領域がなくてエラーになる場合の対処方法

Ubuntu Server 16.04 LTSでapt-get upgradeしたら以下のようなエラーが出ました。

```bash
dpkg: アーカイブ /var/cache/apt/archives/linux-image-4.4.0-59-generic_4.4.0-59.80_amd64.deb
の処理中にエラーが発生しました (--unpack):
'./boot/vmlinuz-4.4.0-59-generic' の展開済みデータを '/boot/vmlinuz-4.4.0-59-generic.dpkg-new'
にコピーできません: 書き込みに失敗しました (デバイスに空き領域がありません)
```

dfコマンドで見てみると確かに/bootディレクトリがいっぱいに。

```bash
$ df -m
Filesystem                        1M-blocks  Used Available Use% Mounted on
(略)
tmpfs                                     5     0         5   0% /run/lock
tmpfs                                  1896     0      1896   0% /sys/fs/cgroup
/dev/sda1                               472   464         0 100% /boot
tmpfs                                   380     0       380   0% /run/user/1000
```

/bootの中身を見てみる。

```bash
$ ls /boot
System.map-4.4.0-21-generic  abi-4.4.0-21-generic  config-4.4.0-21-generic  grub                         vmlinuz-4.4.0-28-generic
System.map-4.4.0-28-generic  abi-4.4.0-28-generic  config-4.4.0-28-generic  initrd.img-4.4.0-21-generic  vmlinuz-4.4.0-31-generic
System.map-4.4.0-31-generic  abi-4.4.0-31-generic  config-4.4.0-31-generic  initrd.img-4.4.0-28-generic  vmlinuz-4.4.0-34-generic
System.map-4.4.0-34-generic  abi-4.4.0-34-generic  config-4.4.0-34-generic  initrd.img-4.4.0-31-generic  vmlinuz-4.4.0-36-generic
System.map-4.4.0-36-generic  abi-4.4.0-36-generic  config-4.4.0-36-generic  initrd.img-4.4.0-34-generic  vmlinuz-4.4.0-38-generic
System.map-4.4.0-38-generic  abi-4.4.0-38-generic  config-4.4.0-38-generic  initrd.img-4.4.0-36-generic  vmlinuz-4.4.0-42-generic
System.map-4.4.0-42-generic  abi-4.4.0-42-generic  config-4.4.0-42-generic  initrd.img-4.4.0-38-generic  vmlinuz-4.4.0-45-generic
System.map-4.4.0-45-generic  abi-4.4.0-45-generic  config-4.4.0-45-generic  initrd.img-4.4.0-42-generic  vmlinuz-4.4.0-47-generic
System.map-4.4.0-47-generic  abi-4.4.0-47-generic  config-4.4.0-47-generic  initrd.img-4.4.0-45-generic  vmlinuz-4.4.0-51-generic
System.map-4.4.0-51-generic  abi-4.4.0-51-generic  config-4.4.0-51-generic  initrd.img-4.4.0-47-generic  vmlinuz-4.4.0-53-generic
System.map-4.4.0-53-generic  abi-4.4.0-53-generic  config-4.4.0-53-generic  lost+found                   vmlinuz-4.4.0-57-generic
System.map-4.4.0-57-generic  abi-4.4.0-57-generic  config-4.4.0-57-generic  vmlinuz-4.4.0-21-generic
```

古いLinuxカーネルが残っているらしい。

いらないものは消す。最新3個くらいは残しておく。

```bash
$ sudo apt-get remove linux-image-4.4.0-2{1,8}-generic -y
$ sudo apt-get remove linux-image-4.4.0-3{1,4,6,8}-generic -y
$ sudo apt-get remove linux-image-4.4.0-4{2,5,7}-generic -y
```

最後にgrubを更新する。

```bash
$ sudo update-grub
```

# 参考
- [[Ubuntu]Ubuntu のアップデート・マネージャで再チェックをクリックするとエラーが表示される](http://d.hatena.ne.jp/PRiMENON/20100213/1266048075)
- [/BOOTがあふれてAPT-GET UPGRADEが失敗したでござる](http://www.cagylogic.com/archives/2012/11/04150426.php)
- [Ubuntuでbootを逼迫している古いLinuxカーネルを削除](https://horse-brain.blogspot.jp/2012/10/ubuntubootlinux.html)
Xcodeで一括インデント

Xcodeでpythonコードをいじっているのだが、一括インデントしたいと思って探した。
ここの通りにしたらできる。ありがとうございます！

[Xcode で複数行に一括してインデントを入れる](http://onno.jp/dev/2012/08/xcode.html)


''
右にインデント:  command + ]
左にインデント:  command + [
''
GR-CITRUSのFirmwareをビルドする方法 for macOS

[GR-CITRUSのFirmwareをビルドする方法 for Windows](http://qiita.com/takjn/items/4838dc0c3f879a0e3291)のmacOS版です。

[GR-CITRUS](http://gadget.renesas.com/ja/product/citrus.html)は、mrubyが気軽に使える小型ボードです。Chrome Appの「Rubic」を使うことでプログラムの作成から実行までスムーズに行うことができます。

標準のファームウェアでもそれなりに遊べますが、ちょっとしたものを作ろうとするとカスタマイズしてビルドしたくなることがあります。ビルドのためにはRXマイコンのクロスコンパイル環境を作る必要がありますが、macOS向けには[GNU Tools](https://gcc-renesas.com/ja/)が提供されていないため、簡単ではないようです。そこで、ここではmacOS版のIDE for GRを使ったもう少し簡単なビルド手順を紹介します。

#必要なもの
この記事ではmacOS High Sierraを使っています。

その他、gitなども必要です。私の環境には、Railsを動かすためにrubyやgitなど一式諸々が入ってしまっているため詳細が確認できません。すみません。

#IDE for GRのダウンロード
がじぇっとるねさすのWebサイトから[IDE for GR 1.00](http://gadget.renesas.com/ja/product/ide4gr.html)のMac用をダウンロードします。
zipファイルの中身を任意のフォルダに解凍し、IDE4GR.appをApplicationsへインストールしてください。

#環境設定
IDE for GRの中に、RXマイコン向けのコンパイラが入っています。ターミナルを開き、そこにPATHを通してください。私は`.bash_profile`に追加しました。

```text:.bash_profile
export PATH="/Applications/IDE4GR.app/Contents/Java/hardware/tools/gcc-rx/rx-elf/rx-elf/bin/:$PATH"
```

設定後、`rx-elf-gcc --version`を実行してエラーが表示されないことを確認してください。

```
$ rx-elf-gcc --version
rx-elf-gcc (GCC_1.19script_6.3.rx) 4.8-GNURX_v14.03
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

#GR-CITRUSのソースコードの取得
githubの[wakayamarb/wrbb-v2lib-firm](https://github.com/wakayamarb/wrbb-v2lib-firm)リポジトリからmasterブランチをクローンします。

```
$ git clone https://github.com/wakayamarb/wrbb-v2lib-firm
```

#makefileの修正
cloneしたソースコードの`firmware_release`フォルダにあるmakefileを自分の環境に合うように書き換えます。書き換えるのは`GNU_PATH:=`の一箇所だけです。IDE for GRへのパスに書き換えます。

```text:makefile
GNU_PATH := /Applications/IDE4GR.app/Contents/Java/hardware/tools/gcc-rx/rx-elf/rx-elf/
```

#make
上記で修正した`makefile`がある`firmware_release`フォルダに移動し、`make`コマンドを実行します。

```
$ cd firmware_release
$ make

(中略)

rx-elf-objcopy -O binary ./gr_build/citrus_sketch.x  citrus_sketch.bin
rx-elf-objcopy -O srec -I elf32-rx-be-ns ./gr_build/citrus_sketch.x  ./gr_build/citrus_sketch.mot

$
```

正常終了すると、`makefile`と同じフォルダにある`citrus_sketch.bin`ファイルが更新されているはずです。

ビルドしたファームウェアを書き込む場合は、GR-CITRUSのリセットボタンを押してUSBメモリとして認識させた後、`citrus_sketch.bin`ファイルをGR-CITRUSにコピーしてください。