OmniAICreator/Qiita-1.07M huggingface dataset:
JodaTimeのDays,Hours,Minutes,Secondsなどの時間の単位がわかる型を使おう

返却日のリマインダーを何日前にする、バッチ処理の実行間隔などを下記のような設定ファイルに書いて、その数値をintのstaticフィールドで保持するのはよくあります。

```lang:sample.properties
# バッチの実行間隔(minutes)
batch.interval=3

# 返却日のリマインダーをするタイミング(days)
reminder.before.return=7
```

```

Properties prop = ...;

public static final int INTERVAL = Integer.parseInt(prop.getProperty("batch.interval", "3"));

public static final int REMINDER = Integer.parseInt(prop.getProperty("reminder.before.return", "7"))

```

これでも良いのですが、ものによっては分か秒かわからない or 忘れてしまったので、宣言しているところのコメントを見て確認することもしばしば。

これを時間の単位が分かる型にすれば、変数を呼び出すための情報だけで必要なことが全部わかると思い、jodatimeにいい感じのものが用意されているのを見つけました。

```
private static final int _INTERVAL = Integer.parseInt(prop.getProperty("batch.interval", "3"));

public static final Minutes INTERVAL = Minutes.minutes(_INTERVAL); 
```

Propertiesが型つきで取得とれないのが、そもそも面倒ですが・・・
ただ、typesafeのconfigなど、型つきでとれるものでも、intで受け取れるくらいなので、そこから上記の型の変数をつくるとやりやすいです。
僕も松江Ruby会議06で出された問題を(チカラ技で)解いてみた　(;´Д`)

元記事
↓
[僕も松江Ruby会議06で出された問題を解いてみた]
(http://qiita.com/jnchito/items/ae6525c0e9e84d058e06)

無理矢理な回答です　(;´Д`)
print_csvが特にキモい　(;´Д`)

```ookiri.csv
name,ruby,php,python,perl
一郎,100,40,70,80
二郎,60,90,80,10
三郎,90,60,60,60
四郎,80,70,70,80
```
```rb
require 'csv'

class Ookiri
  attr_reader :ookiri, :lang, :lang_array, :attendances, :attendances_num, :lang_num, :switch

  def initialize(args={})
    @ookiri = CSV.table('ookiri.csv', headers:true, converters: :numeric, header_converters: :symbol)
    @lang = args[:lang] || ""
    @lang_array = ookiri.headers[1..-1]
    @lang_num = lang_array.length.to_f
    @attendances = ookiri[:name]
    @attendances_num = attendances.length - 1
    @switch = args[:switch] || ""
  end

  def print_csv
    if switch == "average"
      puts "average"
      hash_printer(average_hash)
    end
    if switch == "score"
      puts lang
      hash_printer(make_hash)
    end
  end

  def hash_printer(hash)
    sort_hash(hash).each{|k, v|  puts "#{k}, #{v}"}
    puts "-------------------------------"
  end


  def average_hash
    Hash[attendances.zip(score_total)]
  end

  def score_total
    (0..attendances_num).to_a.map{|num| get_average(num)}
  end

  def sort_hash(hash)
    hash.sort_by{|k, v| -v}.to_h
  end

  def score_by_language(num)
    lang_array.map{|lan| ookiri[num][lan]}
  end

  def get_average(num)
    score_by_language(num).inject{|k, v| k + v} / lang_num
  end

  def make_hash
    Hash[attendances.zip(ookiri[:"#{lang}"])]
  end
end
```

```rb
Ookiri.new(lang: "ruby", switch: "score").print_csv
Ookiri.new(lang: "python", switch: "score").print_csv
Ookiri.new(lang: "perl", switch: "score").print_csv
Ookiri.new(lang: "php", switch: "score").print_csv

Ookiri.new(switch: "average").print_csv
```

列や行が追加されたり削除されても多分大丈夫｡
line monitor > 消費電流の確認(151205) > Wi-Fi > PLANEXのGW-USNANO2A > 通常0.5W程度

```txt:動作確認
Raspberry Pi2 + raspbian
WiFi > PLANEXのGW-USNANO2A
```

CHARGER Doctorにて消費電流の計測。

- GW-USNANO2A
  - 5.01V
  - 0.10A

5.01V * 0.10A = 0.5W 程度。

最大1.3Wという仕様らしいが、通信が多い時にそんなくらいあるのかもしれない。

CHARGER Doctorはそれなりに計測できているということなのだろうか。
RPi > Wi-Fi設定 > raspbianなら右上のメニューで設定する

```txt:動作確認
Raspberry Pi2 + raspbian
```

http://qiita.com/kota65535/items/3d02c7c518761476c84a
を参考にPLANEXのGW-USNANO2A（消費電力 最大1.3W）を購入した。

色々webを見ていると、設定ファイルを書き換えて、という記載があるが、下記のyoutubeでの設定が一番簡単だった。

https://www.youtube.com/watch?v=7cQrNl0QVFA

- raspbianを起動
- 右上のWiFiのアクセスポイントを選択
- パスワードを入力

以上の設定をした後は、再起動後も自動的にそのWi-Fiで接続するようになった。

Wi-Fi接続時はwlan0というもので接続するようになる。

7セグメントIPアドレス表示スクリプトもwlan0対応しておいた。
[v0.6 @ github](https://github.com/yasokada/python-151127-7segLed_IPadrDisplay/releases/tag/v0.6)
rbenvでバージョンがうまく切り替わらなかった時にやったこと

Macでrbenvを使用して最新の安定版のrubyを入れて使おうとしたけどなかなかバージョンが切り替わらなかった時があったのでメモ。
ちなみにHomebrewでrbenvとruby-buildをインストールしています。

# 状況
rbenvで最新の安定版のrubyをインストールしてglobal設定
`rbenv global 2.2.3`

一見設定できてそう

```
$ rbenv versions
  system
* 2.2.3
```

でもruby -vで確認すると

```
$ ruby -v
ruby 2.0.0p645
```

ちゃんと設定できてません。

# 切り替えられるまでにやったこと

## rbenv init
```
$ rbenv init
```

すると以下のようなメッセージが出現。

```
# Load rbenv automatically by adding
# the following to ~/.bash_profile:

eval "$(rbenv init -)"
```

試しに~/.bash_profileを見ると中身が空っぽだったので、
`eval "$(rbenv init -)"`
を追加してみる。変化なし。
もう一度initを実行しても同様です。

## rbenv local --unset
ディレクトリ固有のRubyバージョンを指定しているわけではないものの、一応ローカルのバージョン設定を破棄してみる。

```
$ rbenv local --unset
$ rbenv rehash
```

当たり前ですが変化なし。

## 解決策

簡潔に言うとPATHの設定がちゃんとできてませんでした。
どこのrubyが呼ばれているかを確認してみます。

```
$ which ruby
/usr/bin/ruby
```

となっており、rbenvのrubyを使う時に設定されているべき
`/Users/ユーザ名/.rbenv/shims/ruby`
ではありませんでした。

実際、PATHを確認してみると、

`$ echo $PATH`

で出力されたものの中に/Users/ユーザ名/.rbenv/shimsはありませんでした。

.bash_profileの中身自体は先ほどinitをごにょごにょしていた時に設定しているのでそれを反映させます。

```
$ source ~/.bash_profile
```

これによりwhich ruby, echo $PATHの結果が期待通りになり、

```
$ ruby -v
ruby 2.2.3p173
```

ちゃんと設定できました。

# 参考記事
http://easyramble.com/rbenv-ruby-version-trouble.html
extensionを追加してもっと快適なJupyter環境を構築する


Jupyterはすごい便利なんですが、この機能があったらなーと思うことがあります。

そんなときにはextensionです。

JupyterにはNotebook extensionsとかいうのがあって、機能の拡張ができるようになっています。

公式サイトにもextensionsがあるということは[ちょこっと](http://jupyter.readthedocs.org/en/latest/migrating.html#notebook-extensions)載ってるんですが、いくつか使用してみると結構便利。

Jupyterは使っているけどextensionは使っていないというひとに是非試して欲しいです。

# Jupyter notebook extensions
Jupyterに機能を追加するextensionを集めたレポジトリがGitHub上に公開されています。

https://github.com/ipython-contrib/IPython-notebook-extensions

このレポジトリを利用すると、ブラウザからextensionのactivate/deactivateの切り替えが可能で便利です。

IPythonの公式デベロッパーチームとは関係ないグループで開発されているようです。

## インストール
```bash
pip install pyyaml
git clone https://github.com/ipython-contrib/IPython-notebook-extensions
cd IPython-notebook-extensions
sudo python setup.py install
```

## コンフィグレーション画面
インストールが完了したらコンフィグレーション画面を開き、気に入ったextensionを有効にしましょう。

コンフィグレーション画面はJupyter notebookを実行してブラウザから`localhost:8888/nbextensions/`にアクセスすると開くことが出来ます。

![nbextensions.png](https://qiita-image-store.s3.amazonaws.com/0/99572/0f7cdaf1-2149-dad7-fa06-411533e8c5b5.png "nbextensions.png")


# jupyter-vim-binding extension
普段vimを使っている人にとってvimのキーバインドが使えないとストレスを感じます。

そういう人のためにjupyter-vim-bindingというextensionがあります。


さきほどのレポジトリには入っていませんが、以下のレポジトリから単独で入れることが出来ます。デモ画像もGitHubの方にあります。

https://github.com/lambdalisue/jupyter-vim-binding

直接インストールする方法とさきほどのIPython-notebook-extensionsに組み込んでインストールする方法があります。

今回は後者でインストールします。

```bash
cd $(jupyter --data-dir)/nbextensions/usability
git clone https://github.com/lambdalisue/jupyter-vim-binding.git vim_binding
chmod -R go-w vim_binding
```

インストールしたら`localhost:8888/nbextensions/`から有効にしましょう。

もともとのキーボードショートカットで使用できなくものもあるので注意してください。

# お気に入りのextension
## NbExtensions menu item
Editメニューに`localhost:8888/nbextensions/`を開くボタンを追加します。

とりあえずこれを有効にしましょう。

## Code Font Size
コードのフォントサイズを大きく/小さくすることができるボタンをツールバーに追加します。

## Codefolding
セル内のコードを折りたたむことが出来ます。

## Comment/Uncomment Hotkey
コメント/アンコメントを行うショートカットを追加します。

## Drag and Drop
画像をドラッグ・アンド・ドロップすると画像をノートに挿入します。

画像はノートブックと同じ階層のディレクトリにコピーされ、それを参照する形での挿入となります。

youtubeにデモ動画があります。

http://youtu.be/buAL1bTZ73c

## Equation Auto Numbering
数式に式番号を入れます。式番号の表示/非表示ボタンも追加されます。

## Table of Content
こんな感じでコンテンツテーブルが表示されます。

![Kobito.By9WPC.png](https://qiita-image-store.s3.amazonaws.com/0/99572/b607d8ce-eeb3-95ad-12b4-d441ba1b6867.png "Kobito.By9WPC.png")


## zenmode
メニューバーとかが邪魔なときに使います。
DjangoとCeleryでクローラを書きながら考えた由無し事

業務でもクローラを見ることが多いのですが、今回は新しくクローラ作るならとりあえずDjango+Celery使うだろうなぁということで、個人でサンプル書いて見つつ思ったところをつらつらと書いてみようと思います。

## クローラの基本的な処理段階
クローラといっても人によって微妙に定義が違う状態で会話する事が多いのでとりあえず今回の対象は、

- 一定の条件に従ってWebページのリンクを収集する
- 各リンク内のページ内容をスクレイピングする
- スクレイピングした後の処理については、今回は対象外とする

という前提でお話します。

## 今回のサンプルの構成
[y-matsuwitter/django_sample_crawler](https://github.com/y-matsuwitter/django_crawler_sample)

今回サンプル書く上での構成ですが、

- Python 3.4.3
- Django 1.9
- Celery 3.1.19
- lxml 3.5.0
- requests 2.8.1

を利用し、下記を実施するものを作成しました。

- 複数サーバにスケール可能
- githubのtrendingなrepositoryをクロールする
- クロール条件をあとから追加可能
- 一定以上のペースでGithubにアクセスをかけない
- リトライのしやすさ

## Celeryによる各処理の分散実行
クローラを長期間運用していると、クローラの処理の一部のみが肥大化し遅くなることがあります。
例えば、コンテンツの抽出部でCPUをほぼ使い果たしてしまうなど。
この時にこの処理のみ分離する、といった対応を入れねばなりませんが、こうした分散運用を簡単にするには最初からMessageQueue系のシステムに乗っかっておく必要があるかと思います。
今回はこのレイヤの処理にCeleryを用いております。
今回のgithub trendingの取得の内部の処理としては、

![スクリーンショット 2015-12-05 22.01.44.png](https://qiita-image-store.s3.amazonaws.com/0/182/874898d1-2eaa-3317-d22a-3a9d9fdad256.png)

の順序で実行しています。
各過程を別々なceleryのtaskとして扱っており、workerの設定を調整すれば、処理ごとに別のサーバクラスタを割り当てられます。
ちなみに、今回の適当なクローラに対しては大仰な感じの分割ですが、各処理をtaskとして別々に指定することで、とあるタスクが失敗した際にretry対応が楽になります。例えば、trendingページのダウンロードをしたものの、パース段階でルールに不備があり止まってしまった場合、対象のtaskのみ修正して、再度そのtaskのみ流せば回復しますし、またそのレイヤでタスクが詰まっててもそこのレイヤを簡単にリソース追加することが出来ます。

### periodic taskによるCronの代替
Celeryにはperiodic taskという仕組みがあり、定期実行するタスクをperiodic_taskとして指定することもできます。今回は一番基本にある各ルールのクローラを動作させる部分をscheduleで指定しています。

```py3
from celery.schedules import crontab


CELERYBEAT_SCHEDULE = {
    'run_all_crawler_schedule': {
        'task': 'crawler.tasks.run_all_crawler',
        'schedule': crontab(minute='*/2'),
    },
}
```

ちなみに二分ごとに実行になってるのはデバッグで適当に書いていただけなのでもし本当に運用する場合はもう少し間隔は空けます。

## rate_limit
サイトを細かくスクレイピングする場合、htmlの取得処理で対象サイトに負荷をかけかねません。
celeryにはrate_limitという仕組みがあり、taskごとにどれくらいの頻度で実行するか指定することができます。

```py3
@celery_app.task(rate_limit="60/m")
def fetch_trending(crawler_id):
    pass
```

上記で1分に60回以上の動作をしないよう制約をかけることが出来ます。

## Djangoと組み合わせるメリット
Celeryだけでも十分普通のクローラは作成できるのですが、長期間の運用ではルールやサイトの追加がどんどん膨らんでいくので、こうしたルールの追加などをDBに入れつつ、状況をWeb側の管理画面で確認するなど考慮するとDjangoとの組み合わせが便利になってきます。
今回は非常にシンプルなものなので、クローラのルールはtrendingの取得ルール程度のものになりますが、こうした情報をdjango adminで設定することができます。

あとからルールを追加する場合に、おそらく最も問題になるのはスクレイピングのルール周りで、これはxpathやcss selectorをルールとして保存するような方法で対応できるかと思います。
[Scrapy](http://scrapy.org/)の仕組みを参考にするのもいいかもしれません。


## 最後に
比較的大きめな規模のクローラを運用する知見があまりネット上にないような気もするので、この辺の知見を共有する勉強会とかしたいですね。
sshpassでssh/scpの対話型のパスワード入力を自動化する

[Linuxの対話がめんどくさい?そんな時こそ自動化だ！-expect編- - Qiita](http://qiita.com/ine1127/items/cd6bc91174635016db9b)

対話型のシェルを自動化する際は基本的には上の記事のように `expect` で頑張らないといけないが、
`ssh` と `scp` に関しては `sshpass` を利用すれば簡単に自動化が可能。
(セキュリティに関する是非とか公開鍵使用したほうが良いとかは今回は省略する)

[sshpass(1) - Linux man page](http://linux.die.net/man/1/sshpass)

# イントール
ubuntuならaptでインストールできる。(MacのHomeBrewの場合は警告が出るらしい)

```bash
sudo apt-get -y install sshpass
```

# 使用例
```bash
# パスワードを指定
sshpass -p 'password' ssh -o StrictHostKeyChecking=no user@host 'command'
sshpass -p 'password' scp -o StrictHostKeyChecking=no localfile user@host:/path/to/copy

# パスワードの記載されているファイルを指定
sshpass -f passwordFile ssh -o StrictHostKeyChecking=no user@host 'command'
sshpass -f passwordFile scp -o StrictHostKeyChecking=no localfile user@host:/path/to/copy
```

`-o StrictHostKeyChecking=no` を指定しないと初回接続時に接続先ホストの確認メッセージがでるため失敗する場合がある

# 参考
[Linuxの対話がめんどくさい?そんな時こそ自動化だ！-expect編- - Qiita](http://qiita.com/ine1127/items/cd6bc91174635016db9b)
[sshにパスワードで自動ログインするならexpectよりもsshpassを使おう | PCと遊ぶ日々の記録](http://calcurio.com/wordpress/?p=1768)
[sshpass をインストールするには - らくがきちょう](http://sig9.hatenablog.com/entry/2015/03/10/233527)
[sshコマンドでパスワードをオプションとして入力出来るようにする『sshpass』 | 俺的備忘録 〜なんかいろいろ〜](http://orebibou.com/2015/01/ssh%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%81%97%E3%81%A6%E5%85%A5%E5%8A%9B%E5%87%BA%E6%9D%A5/)
iOSアプリリリース自動化ツールfastlaneの導入方法【El Capitan用】

**１、Command Line Toolsを最新にする**

```bash:filename
xcode-select --install
```

Xcodeはとりあえず入れておいてください

**２、fastlaneをインストールする**

```bash:filename
sudo gem install -n /usr/local/bin fastlane --verbose
```

El Capitanからrootlessというものでパスを指定しなければ以下のエラーになります。
ERROR:  While executing gem ... (Errno::EPERM)
Operation not permitted - /usr/bin/xcodeproj

El Capitan以前に人は、
-n /usr/local/bin
の部分は必要ないと思います

詳しくは　http://qiita.com/AcaiBowl/items/4bb4708de03e6ee14a4a

**３、iTunesConnectに自分のアプリを作成します**

![スクリーンショット 2015-12-05 19.16.14.png](https://qiita-image-store.s3.amazonaws.com/0/43135/6e8146cd-86dc-2a78-e5a7-a078e3be7d71.png)



**４、fastlaneを使用する**

```bash:filename
cd [あなたのプロジェクトファイル]
sudo fastlane init
```

これもEl Capitanの問題でしょうか？
sudoを入れないと、怒られました

必要に応じて、はいといいえで答えます
http://dev.classmethod.jp/smartphone/initial_setup_fastlane/
ここら辺が参考になります

fastlane
├── Appfile
├── Deliverfile
├── Fastfile
├── Snapfile
├── SnapshotHelper.swift
├── actions
├── metadata
│   ├── copyright.txt
│   ├── ja
│   │   ├── description.txt
│   │   ├── keywords.txt
│   │   ├── marketing_url.txt
│   │   ├── name.txt
│   │   ├── privacy_url.txt
│   │   ├── release_notes.txt
│   │   └── support_url.txt
│   ├── primary_category.txt
│   ├── primary_first_sub_category.txt
│   ├── primary_second_sub_category.txt
│   ├── secondary_category.txt
│   ├── secondary_first_sub_category.txt
│   └── secondary_second_sub_category.txt
└── screenshots
    └── README.txt

こんな感じのフォルダが作成されます

**５、各OSでの起動テストをする**

```bash:filename
fastlane test
```

初期テンプレートがあるので、これを実行するだけで、シュミレーターが自動で立ち上がって実行テストが行えます
（すごい）

**６、他の機能**
Snapfileなどでデバイスの種類とか言語設定とかを追加できます。
devices([
  "iPhone 6",
  "iPhone 6 Plus",
])
languages([
  "ja"
])

Fastfileを書き換えれば色々なことができます

**起動テスト**
lane :test do
  scan(scheme: "Scheme")
end

**ipa書き出し**
lane :build do
  gym(scheme: "Scheme")
end
![スクリーンショット 2015-12-05 21.16.46.png](https://qiita-image-store.s3.amazonaws.com/0/43135/d825d23c-2126-8428-b941-7488c3fd7cf4.png)
（すごい）

**スクリーンショット撮影**
プロジェクトに先ほど自動生成で作られている SnapshotHelper.swift を追加します。
![スクリーンショット 2015-12-05 21.30.53.png](https://qiita-image-store.s3.amazonaws.com/0/43135/5b624e93-e876-9d38-eb4c-00e6a714a12b.png)

```swift:filename
import XCTest

class FASTLANETESTUITests: XCTestCase {
        
    override func setUp() {
        super.setUp()
        
        continueAfterFailure = false
        
        let app = XCUIApplication()
        setLanguage(app)
        app.launch()
    }
    
    override func tearDown()
    {
        super.tearDown()
    }
    
    func testExample()
    {
        snapshot("image_name")
    }
}
```

コンソールで

```bash:filename
snapshot
```
と入力すれば、起動画面のスクリーンショットを各画面で撮影して行ってくれます。
（すごい）

![スクリーンショット 2015-12-05 22.12.55.png](https://qiita-image-store.s3.amazonaws.com/0/43135/de6489df-1416-a122-66b8-d3783bf245c8.png)


権限の問題が出る場合がありますが、フォルダの権限を変更すれば治ります。

```bash:filename
snapshot --stop_after_first_error
```
エラーが出たらそこで止めることもできます

詳しくはこっちに書いてあります
https://github.com/fastlane/snapshot

UIAutomationというものを使って画面フローを撮影することもできるようですが、それを紹介するのは別記事で書きます
Deep Q-Networkの概要

# はじめに
本日はDeep Q-Network（通称、DQN）について、既に結構詳しく説明した記事とかもあるようなので、エッセンスだけを抑えた簡単な概要を書こうと思います。
DQNとは、Deep learningとReinforcement learningを”うまく”組み合わせて、センサーの入力などの高次元の入力に既存の強化学習を適用させる技術です。
作者も論文内で幾度も強調している通り、単にそれらを組み合わせただけでなく、工夫して組み合わせてより高い精度を実現したことが、DQNの一つの重要な点だと思います。

# DQNの特徴

## Experience replay
（殆どの）Deep learningアルゴリズムはi.i.d.、つまり学習データに相関がないことを想定していますが、Reinforcement lerningでは問題の性質上temporalに偏ったデータになりがちです。そこで過去のデータを十分な数保存し（replay memoryと呼んでいる）、そこからrandom sampleすることで、擬似的にデータの偏りをなくしています。

## 各アクションをニューラルネットワークの出力層に持つ
Q値の計算において、状態とアクションを入力とし一つのscalar値を返す通常の方法とは異なり、状態のみを入力とし、出力層において各アクションごとの出力を持つようにしています。
これにより、一回のニューラルネットワークのforward passにより、全アクションの出力が得られるため、アクション数によってリニアに計算量が増えません。

## 高い汎用性
DQNは論文ではAtariのゲームに応用し、多くのゲームにおいて優れた人間のプレイヤーより良いスコアを出していますが、特筆すべきはスペースインベーダーやブロックくずしなど全く別種の学習とコントロールを必要とされるゲームでも、全く同じネットワーク・ハイパーパラメータを使用している点だと思います。つまり、一人の人間が練習すればテニスもできれば、水泳もできるように、特定の用途の問題にカスタマイズされた学習機ではなく同一の学習機で（まだまだ単純な問題とは言え）別種の問題を学習している汎用性の高さは驚くべきで、今後さらに様々な問題に機械学習が応用されていなく中で、汎用性を高めるという方向性はいよいよ高くなっていくと思います。

# 原論文
[Playing Atari with Deep Reinforcement Learning](https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf)
[Human-level control through deep reinforcement learning (Nature)](http://www.nature.com/nature/journal/v518/n7540/full/nature14236.html)
Unityで常に開くプロジェクトを選択するようにする

自分の場合、接続先のサーバや開発プラットフォームを切り替えるのがめんどくさいのでたくさんのプロジェクトをPCに配置しています。
そのときどこのプロジェクトを開いているかよくわからなくなるので、開くときに毎回訪ねるようにします。

Prefence...で下記のチェックボックスをONにすると常に開くプロジェクトを指定したからUnityを起動します。
![AlwaysPrefence.png](https://qiita-image-store.s3.amazonaws.com/0/17192/409d1e89-ff79-9007-7225-169a3e15689e.png)

なお、Unity4系の話で、Unity5系ではデフォルトでなっているようです。
TensorFlowをTitan未満のGPUで使うには

# TensorFlowが対応しているGPU
TensorFlow は、公式には "NVidia Compute Capability" が3.5以上のGPUにのみ対応しています。つまり基本的にはTitan以上のGPUにしか対応していません。この事は https://www.tensorflow.org/get_started/os_setup.html#installation-for-linux の "Optional: Install CUDA (GPUs on Linux)" にて以下のように説明されています。

> TensorFlow GPU support requires having a GPU card with NVidia Compute Capability >= 3.5. Supported cards include but are not limited to:
> 
> - NVidia Titan
> - NVidia Titan X
> - NVidia K20
> - NVidia K40

したがって、例えば現在(12.7.2015)配布されているGPU向けのTensorFlowのバイナリを用いてインストールを行った場合、たとえばGTX 960などの対応外のGPUを用いるとエラーが発生してしまいます。

しかし、同ページの "Enabling Cuda 3.0" にて説明されている "unofficial settings" を用いることで、 "NVidia Compute Capability" が3.0のGPU向けにTensorFlowをインストールすることができます。

##注意点
注意点として、 "unofficial" とあるだけに、互換性の無いライブラリが多くあり、大部分がテスト・サポートされていないようです。これは、インストール時（「手順」のステップ2）にて出る次のような注意で確認できます。

> WARNING: You are configuring unofficial settings in TensorFlow. Because some
> external libraries are not backward compatible, these settings are largely
> untested and unsupported.


# 手順
実際にインストールするには以下の手順に従います。

公式サイト ( https://www.tensorflow.org/versions/master/get_started/os_setup.html )に従い以下の手順でソースからビルドします：

1. "Installing from sources" の "Configure the installation" の手前までを実行
2. "Enabling Cuda 3.0" に従って `./configure` 時に<b>「非公式設定」</b> ("unofficial settings") を有効にする
    - 上記と同一の内容が https://github.com/tensorflow/tensorflow/issues/25#issuecomment-156234658 に詳しい。
3. "Create the pip package and install" に従ってpip wheelを作成し、TensorFlowをインストール
    - （この手順はpyenv, virtualenv等仮想環境にインストールしたい場合行う。システムのpythonにTensorFlowをインストールする場合、pip packageは作らず "Build your target with GPU support" の通りに従う。）

筆者は、この設定でGeforce GTX 960, Ubuntu 15.04 にて動作確認をしました。（動作確認は https://github.com/woodrush/neural-art-tf を実行して行いました。）
C++のlambdaをObjective-Cのblockに渡して呼び出す。

# 背景
C++で書いたlambdaを、Objective-Cで書かれたクラスのインスタンスメソッドに渡し、呼び出したい場面があったので書いてみた。

例として、「hello world.」を合わせて２つの言語で実装してみた。
# 実装例
```cpp:main.cpp
#include <iostream>
#include "objectC.h"
int main(int argc, const char * argv[]) {
    objectC* obj = new objectC();
    obj->say([](){
        std::cout << "world." << std::end;
    });
    return 0;
}
```
みんな大好きmain部分。
objectCのインスタンスを作って、sayにlambdaを渡してるだけです。

```cpp:objectC.h
#include <iostream>
class objectC {
public:
    void say(const std::function<void()>& func);
};
```
普通過ぎて特に書く事ナシ

```objc++:objectC.mm
#include "objectC.h"
#import <Foundation/Foundation.h>

@interface object : NSObject
- (void)say:(void (^)()) block;
@end

@implementation object
- (void)say:(void (^)()) block {
    NSLog(@"hello");
    block();
}
@end

void objectC::say(const std::function<void()>& func) {
    auto test = [[object alloc] init];
    [test say:^(){
        func();
    }];
}
```

.mmの拡張子ならば、Objective-CとC++が混合して実装出来る(.mや.cppだとダメ)

コードはシンプルで、C++で書かれたsayで受け取ったlambdaを
そのままObjective-Cで書かれたクラスのインスタンスメソッドの引数に投げてるだけ。

# 実行すると？
```log:Console
2015-12-05 21:05:19.084 objectivec[58931:27858894] hello
world.
Program ended with exit code: 0
```

# 一言
とてつもなく限定的で、コードが凄く見づらい。
crystalのシャローコピー、ディープコピーについて

ブログからの転記です。

slack上での[crystal-jaコミュニティ](http://crystal.pine.moe/)で、いろんな議論（大体私からは不明点を聞くだけ）してるのですが、 ちょっとcyrstalで気になってたのが、シャローコピー、ディープコピーはどうするのか、というもの。

例えば、以下のコードはrubyだと

```rb

class ClassA
  attr_accessor :a
end

clsa = ClassA.new
clsa.a = 1
clsb = clsa.clone
clsb.a = 2
p clsb.a #=> 1
p clsa.a #=> 2
```

となります。 では、crystalではどうなるかというと

```rb

(同上)
p clsb.a #=> 2
p clsa.a #=> 2
```

となってしまいます。（attr_accessorはpropertyで読み替え）

どうもcyrstalでのやり方では、

https://github.com/manastech/crystal/blob/b3b1223108806f31fdb29cca6110a5d11d82f504/src/object.cr#L173-L179

や

https://github.com/manastech/crystal/blob/0f4e5866db1d559fdb3c833e8de8a1f96ab7c957/src/array.cr#L604-L622

を見る限りだと、「子クラスで override して使う前提」みたいです。 (@pine613さんの見立てでは) なので、ディープコピーの各クラスの実装例だと、以下のような感じになります。(同@pine613さんのコード)

```crystal
class ClassA
  property :a

  def self.new 
    i = self.new 
    yield i
    i 
  end
     
  def clone 
    ClassA.new { |i|
      i.a = self.a
    }
  end
end 
```

因みにですが、crystalではStructクラスも用意されています。

classクラスとの違いは

http://ja.crystal-lang.org/docs/syntax_and_semantics/structs.html

を見ると

- 構造体に対して new を実行するとヒープではなくスタック領域が割り当てられる
- クラスが参照渡しであるのに対して、構造体は値渡しである
- 構造体は暗黙的に Struct を継承し、Struct は Value を継承している。一方クラスは Reference を継承する

とあります。オブジェクト間で値をやり取りするようなことがあるなら、こっちを使うべき、という設計みたいですね。

[@makenowjust](https://github.com/MakeNowJust)さん曰く

「それと、 `record` マクロを使って定義した構造体には `clone` メソッドが定義されてます」
とのことで、実際に調べてみると以下のようになっています。

https://github.com/manastech/crystal/blob/0f4e5866db1d559fdb3c833e8de8a1f96ab7c957/src/macros.cr#L29-L42

上記情報に従って書き直すと

```cr
struct ClassA
  property :a
end
​
record ClassA
​
classA = ClassA.new
classA.a = 1
​
classB = classA.clone
classB.a = 2

p classA.a #=> 1
p classB.a #=> 2
```

となり期待する動作になりました。
min-plus半環 in PowerShell

[コンピュータは「掛け算は足し算とする」を理解できるか - 檜山正幸のキマイラ飼育記](http://d.hatena.ne.jp/m-hiyama/20151202/1449016930) で解説されている min-plus半環をPowerShellで実現してみようと。

といっても、キモはほとんどC#ですが。

```ps1:sample.ps1
Add-Type -ReferencedAssemblies Microsoft.CSharp -TypeDefinition @"
	using System;

	public class MinPlus<T> where T : IComparable<T>
	{
		private bool isInfinity = false;
		private T val;

		public MinPlus(T val) 
		{
			this.isInfinity = false;
			this.val = val;
		}

		private MinPlus()
		{
			this.isInfinity = true;
			this.val = default(T);
		}

		public override string ToString()
		{
			return (this.isInfinity ? "∞" : this.val.ToString());
		}

		public static implicit operator MinPlus<T>(T x)
		{
			return new MinPlus<T>(x);
		}

		public static MinPlus<T> operator +(MinPlus<T> x, MinPlus<T> y)
		{
			if (x.isInfinity)
				return y;
			if (y.isInfinity)
				return x;
			return (x.val.CompareTo(y.val) < 0 ? x : y);
		}

		public static MinPlus<T> operator *(MinPlus<T> x, MinPlus<T> y)
		{
			if (x.isInfinity)
				return x;
			if (y.isInfinity)
				return y;
			dynamic xv = x.val;
			dynamic yv = y.val;
			return xv + yv;
		}

		public static readonly MinPlus<T> Infinity = new MinPlus<T>();
	}
"@ -Language CSharp
```

実際に計算してみた結果は次の通り。
（sample.ps1を C:\sample\ps に BOMつきUTF-8 で保存しています。）

```ps1
PS C:\sample\ps> .\sample.ps1
PS C:\sample\ps> (1 -as [MinPlus[double]]) + 1
1
PS C:\sample\ps> 2 + (3 -as [MinPlus[double]])
2
PS C:\sample\ps> 2 * (3 -as [MinPlus[double]])
5
PS C:\sample\ps> 2 * (0 -as [MinPlus[double]])
2
PS C:\sample\ps> 3 + [MinPlus[double]]::Infinity
3
PS C:\sample\ps> 3 * [MinPlus[double]]::Infinity
∞
```

C#だと＋や×といった演算が定義されていることについての型制約が書けないのでその点が残念ではありますね。
D言語くんを自作ゲームで使うメリット

[D言語くん Advent Calendar 2015](http://qiita.com/advent-calendar/2015/d-man) 5日目の記事です。

D言語というプログラミング言語のマスコットとして生まれたD言語くん。
今や世界的に有名な存在となった。

そんなD言語くんを自作ゲームで登場させたことで得られた
メリットについていくつか紹介しよう。

#シンプルなので誰でも作れる
近年のゲーム制作環境の充実もあり、ゲームを自作する敷居はかなり低くなった。
だがしかし、それでもゲームを完成まで持っていくのは至難の業と言われている。

まずグラフィックス素材を用意しなければいけない。
自分で作ったり、他人に作ってもらったりしなければいけない。
絵が描けない者（筆者も含む）には中々大変な作業である。

D言語くんのデザインはシンプルイズベスト。
Dという文字に手足を生やして目ん玉を付いているだけである。
ドット絵、イラスト、3Dモデルと即座に素材を作れてしまうのだ。

[#D言語くん版深夜の真剣お絵描き60秒一本勝負](https://twitter.com/search?q=%23D言語くん版深夜の真剣お絵描き60秒一本勝負)

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">ボーンを入れて、例のポーズ取らせて出来上がり！&#10;<a href="https://twitter.com/hashtag/D?src=hash">#D</a> 言語 <a href="http://t.co/8aTkaIMbbt">pic.twitter.com/8aTkaIMbbt</a></p>&mdash; ｲ五 (@igo_fifth) <a href="https://twitter.com/igo_fifth/status/413167874757246976">2013, 12月 18</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

#奇跡のキャラデザである
近ごろD言語くんがキャラデザ事故などと言う指摘が見られるが
次の投票結果を見てほしい。
<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">【投票】D言語のマスコットは...</p>&mdash; うえした (@ueshita) <a href="https://twitter.com/ueshita/status/664783099272630273">2015, 11月 12</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
D言語くんが奇跡のキャラデザであることは、民主主義における投票によって証明された。

#手足がある
手足がある、ということは様々なゲームジャンルのプレイヤーキャラになれるということを意味している。
アクションでもSTGでもRPGでもなんでも来いだ。
もちろん敵キャラとしても活躍してくれるだろう。

#爆散させても良心が痛まない
基本的に~~ムカツク外見をしているので粗末に扱っても~~心が痛くならない。
ザコキャラとして大量に登場させて無双してもいいし、
ボスキャラとして登場させて大爆散させても大丈夫だ。

![d2.gif](http://nsplus.dojin.com/ueshita/dman_bakusan.gif)

#D言語とか関係なく活躍できる
本当はD言語で書かれたプログラム上で暴れさせてこそD言語くんが輝くというものだが、
D言語くんのポテンシャルはD言語だけに留まらないのだ。

以下、例を紹介しよう。

- [【ニコニコ動画】このＤ言語はあなたに会うために生まれてきました](http://www.nicovideo.jp/watch/sm3372002) ※RPGツクール製
だいぶ昔にRPGツクールで作られた伝説のゲームである。

- [D-jumper](http://unitygameuploader.jpn.org/game/2025.html) ※Unity製
D言語くんがアイキャンフライするゲームである。

- [Flappy D-man](http://nsplus.dojin.com/ueshita/FlappyDman/FlappyDman.html) ※Unity製
筆者作のゲーム。一時期流行ったFlappy Birdのクローンでテキトウに作られている。

もちろんD言語でD言語くんを降誕させている猛者もいるので、
D言語くんを極めたいという猛者がいるならこちらを参照されたい。

- [D言語でDXライブラリを使ってD言語くんを降臨させる](http://qiita.com/yasei_no_otoko/items/e717ef09dce98330cde5)

#公表すればD言語くんガチ勢に捕捉される
TwitterにはD言語くんクラスタ~~という危険集団~~がおり、D言語くんの普及に日夜研鑽している。
D言語くんに関するツイートは @d_man_bot によって速やかに彼らのクラスタで拡散されるだろう。

@d_man_bot
「D言語くん」「D言語 マスコット」等のワードに反応するBotである。
捕捉されると間違いなくD言語くんクラスタ入りである。

#使いすぎに注意
筆者はあまりにD言語くんが便利なので自作ゲームに多用してしまい、
尊敬するゲーム制作者の方に今後の使用を禁止された。

便利だからと言って頼りすぎるのは良くない。何事にも限度があるのだ。
小学生の頃に半田付けしたくらいの自分が、自作キーボードはどうやって作ればいいのかを調査した

# 前置き
社会人になってから欲しいと思っていたメカニカルキーボードを、入社７年目に初めて購入しました。ヤフオクで買い漁ったところ、１つがチャタリングを起こしたため、半田付けを行い修理した。

修理の過程で感じたこことは、キーボードの仕組みって結構単純なんじゃないか？と思ったこと。[^kmt]
確かにキーボードって昔からあるし、ぐぐってみるとそこそこ自作をされている方もいるらしい。

小学生の頃に半田付けくらいしかしていない工業高校情報学科出身の自分がどこまでチャレンジできるのか調べてみた。

# 手段
##Arduino（アルドゥイーノ）
オープンソースのマイコンとのこと。Ardiunoシリーズはたくさんの種類が出ているようで、幾つかの機種ではUSBのHID[^1]のライブラリがあり、かなりお手軽にキーコードをPCに送れるようだ。例えば、「Keyboard.press('n')」と書くことでnキーを押したよ」というように定義できる。 

特にArduino Leonardo(アルドゥイーノ レオナルド)とういう機種は、[USB HIDに対応する関数](https://www.arduino.cc/en/Reference/MouseKeyboard)というものを持っていて、かつ、PCとの通信（マイコンもPCに繋いでデータを書き込めるらしい！）もUSB経由でできるとのこと。

##ASOOVU USB
「自作キーボード＆ASOOVU　USB」でググると具体的な記録(とってもありがたい)が出てくる。
参考のソースを見る限り、Arduinoとはちがう仕組みでHIDのパケット(?)を送出できるようだ。(もっとネイティブな感じでやってるみたい。直接このパケットを送れ！と設定しているように見えます)

[ASOOVU USB](http://a-desk.jp/modules/forum_hobby/index.php?cat_id=7)
[USB公式ページのPDF](http://www.usb.org/developers/hidpage/Hut1_12v2.pdf)

##適当なキーボードを壊してそのマイコンを使う(未確認)
結局のところ、キーボードのキー押下時のショートを検知して、キー押下を認識するだけなので既存のキーボードのマトリクスを解析して、キーコントローラとスイッチを半田付けしてみたらうまく動く気がする。

#結論
アマゾンで安く購入できるArduinoLeonardoを購入し、チャレンジしてみることにした。

###その他
追跡調査するキーワードは
- ATmega32u4(マイコン)

[^kmt]: [キーボードマトリクス](http://pcbheaven.com/wikipages/How_Key_Matrices_Works/) 
[^1]: HumanIntarfaceDevice。デバイスマネージャでよく見るやつだ。
[^2]: ArdiunoMicroもHIDに対応しているらしい。Leonardoはエントリーモデル機種らしく
Windowsでコマンドが使えるかバッチ内で確認する

社内のチームでgradleを使いたいと思ったが、前提としてJavaが入っている必要がある。
課題として、作成したバッチが各自の環境で使えるのか（＝javaコマンドが使えるか）手作業でチェックしてもらうにも手間がかかるのをどうにかしたい。

そこで、Windowsに標準のコマンドを利用して最低限javaが使えるかを確認する方法をワンライン調べる方法がこちら。

```
where java || echo javaが使えないお
```

または

```
where java && echo javaが使えなるぜ！
```

whereコマンドは、Windows Vista/Windows Server 2008以降で標準で使えるコマンドなので、よほど古いWindowsを使ってない限り使えるコマンドとみていいと思う。

参考：whereコマンドでファイルを探す - atmarkit
http://www.atmarkit.co.jp/fwin2k/win2ktips/1151where/where.html

whereコマンドは該当のファイルがPATH環境変数で指定されているフォルダ群から見つかるか探索してくれ、見つかればプロセスの戻り値（ERRORLEVEL）として0を返し、見つからなければ1を返す。

この戻り値をパイプ記号x2「||」で失敗時に次のコマンドを実行するようにつなぐことで分岐処理として使えます。

実際のところ、これだけでは何も役に立たないし手間なのでバッチ化するとこんな感じ。

```
@echo off

rem コマンドチェック
where java 2> nul > nul || goto :notfound

echo javaコマンドが実行できるぜ！
java -version
goto :end

:notfound
echo javaコマンドが実行できない環境なのさ！
echo Javaのインストール方法：
echo   １．かくかく
echo   ２．しかじか
goto :end

:end
pause
```

例ではjavaでしたが、whereコマンドで探索できるファイル（exeに限らない）なら何にでも応用が効きます。
[小ネタ] Pythonでは、 i+=1 よりも i = i+1の方が微妙に早い、というお話

タイトル通りです。
もともと重い処理じゃないので、多分、これを知ったところで遅いプログラムがどうこうなるわけじゃないと思いますが、意外だったので小ネタとして。

```py:コード
from __future__ import print_function
import timeit

print("i+=1\t", timeit.timeit("while i<1000000: i+=1", setup="i=0"))
print("i=i+1\t", timeit.timeit("while i<1000000: i=i+1", setup="i=0"))

print("a[0]+=1\t", timeit.timeit("while a[0]<1000000: a[0]+=1", setup="a=[0]"))
print("a[0]=a[0]+1\t", timeit.timeit("while a[0]<1000000: a[0]=a[0]+1", setup="a=[0]"))
```

```text:Python2.7.8実行結果
i+=1     0.0610518455505
i=i+1    0.0599188804626
a[0]+=1  0.108623981476
a[0]=a[0]+1      0.108937978745
```

```text:Python3.4.1実行結果
i+=1     0.08549419100017985
i=i+1    0.07950809699832462
a[0]+=1  0.14678418899711687
a[0]=a[0]+1      0.1382706459990004
```

Python3の方が遅いのね。知らなかった。
それはともかく。ごくわずかとはいえ、`i+=1`よりも`i=i+1`の方が早いことが分かる。

詳しく調べたわけではないが、原因はおそらく、こうだ。
`i+=1`の形式で代入の足し算を行うと、Pythonインタプリタは、まず`i.__iadd__`を探そうとする。そして、それがなかった場合に`i.__add__`を探す。
`i=i+1`の形式の足し算だと、Pythonインタプリタは初めから`i.__add__`を探す。
で、Python2, Python3とも、`int.__iadd__`は無いわけだ。
そのため、`int.__iadd__`を探して失敗する分だけ、`i+=1`の処理には無駄がある。
だから`i=i+1`形式の方が早いのだろう。

とはいえ、配列参照を2回しなければならない`a[0]=a[0]+1`よりは、`a[0]+=1`の方が早いだろう、と思ったのだが。
よくよく考えてみれば、メソッドの検索をするよりは、配列の0番目を余計に参照する方が早そうだ。
Qiita投稿まとめ

自分の投稿をまとめただけです。

# C++でOpenBabelを使う
[OpenBabelをc++からいじってみる](http://qiita.com/yanagi3150/items/d83fa3f25210e6a5c4af)
[OBBondのIs関数群](http://qiita.com/yanagi3150/items/43f8a2f0038f1afdc031)
[OBMolからAtomを一つ削除してみる](http://qiita.com/yanagi3150/items/0682ee6b9836cd42e5f5)
[OpenBabel/C++で構造式(png, svg)を描く](http://qiita.com/yanagi3150/items/6b1a6d0e6b37e60b4d8c)

# luigiでパイプライン構築(python)
#### luigiで機械学習
[luigiでパラメータチューニング](http://qiita.com/yanagi3150/items/66f3681b5356edac645a)
[luigiでパラメータチューニング（２）](http://qiita.com/yanagi3150/items/66aebf8abfe6460e1d1a)
#### その他
[luigiのon-memoryでのデータ受け渡しの非効率さについて](http://qiita.com/yanagi3150/items/6dd88af31ad55d98bb33)
[luigiはjobを細切れにしすぎてはいけない？](http://qiita.com/yanagi3150/items/15b2928b5018b197ab45)

# pythonでchemoinformatics 
[pythonでmol2ファイルを分割する](http://qiita.com/yanagi3150/items/00a95dcbcdf8aa70baf3)
[化合物の2次元構造から体積を算出する](http://qiita.com/yanagi3150/items/1b2a73c8e81970878eb0)

# その他
[RECRUIT Challenge @ kaggle](http://qiita.com/yanagi3150/items/b175888609115d0d95ef)
[3D-CNNを実行可能なCaffeをまっさらなUbuntu 14.04にインストールする]
(http://qiita.com/yanagi3150/items/a44a270d4c6bd3fad5fa)
ReactNativeでNSLibraryDirectoryに配置したjsbundleを利用して画像を読み込む

今の時点でこの情報が役に立つ人はあまりいない気もしますが、とりあえず。

ReactNativeの通常のプロセスでビルドをするとApplication bundleの直下に`main.jsbundle`がcopyされ、Imageなどから参照される画像はここを起点とした相対パスとして解釈されて読み込まれます。

別な場所に置いたjsbundleを使ってRCTRootViewを初期化した場合、ImageのsourceのURLはそのjsbundleが設置されている場所を起点とした相対パスとして解釈されるため、通常プロセスでAssetsを読み込んでくれる`RCTXCAssetImageLoader`は読み込んでくれません。

そこで、ReactNativeのImageLoaderの仕組みに則って独自に以下の様なImageLoaderコンポーネントを作成することで、NSLibraryDirectory以下に配置されたjsbundleが、あたかもApplication Bundle直下に配置されたかのようにassets URLを書き換える事で、通常のビルドでbundleされたjsbundleであるかのように画像を読み込む事ができます。

```objc
#import <libkern/OSAtomic.h>
#import "RCTBridge.h"
#import "RCTUtils.h"
#import "../../node_modules/react-native/Libraries/Image/RCTImageLoader.h"

@interface LibraryAssetsImageLoader : NSObject <RCTImageURLLoader> @end

@implementation LibraryAssetsImageLoader

RCT_EXPORT_MODULE()

+ (NSString*)libraryDirectory
{
  static NSString *dir = nil;
  if(dir == nil){
    dir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
                                                  NSUserDomainMask, YES) firstObject];
  }
  return dir;
}

- (BOOL)canLoadImageURL:(NSURL *)requestURL
{
  if(!requestURL.isFileURL) return NO;
  NSString *path = requestURL.path;
  return [path hasPrefix:[LibraryAssetsImageLoader libraryDirectory]];
}

- (RCTImageLoaderCancellationBlock)loadImageForURL:(NSURL *)imageURL
                                              size:(CGSize)size
                                             scale:(CGFloat)scale
                                        resizeMode:(UIViewContentMode)resizeMode
                                   progressHandler:(RCTImageLoaderProgressBlock)progressHandler
                                 completionHandler:(RCTImageLoaderCompletionBlock)completionHandler
{
  __block volatile uint32_t cancelled = 0;
  dispatch_async(dispatch_get_main_queue(), ^{
    
    if (cancelled) {
      return;
    }
    // convert assets in libdir to bundled assets.
    NSString *libdir = [LibraryAssetsImageLoader libraryDirectory];
    NSString *path = imageURL.path;
    path = [path substringFromIndex:libdir.length];
    path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:path];
    
    NSString *imageName = RCTBundlePathForURL([NSURL fileURLWithPath:path]);
    UIImage *image = [UIImage imageNamed:imageName];
    if (image) {
      if (progressHandler) {
        progressHandler(1, 1);
      }
      completionHandler(nil, image);
    } else {
      NSString *message = [NSString stringWithFormat:@"Could not find image named %@", imageName];
      completionHandler(RCTErrorWithMessage(message), nil);
    }
  });
  
  return ^{
    OSAtomicOr32Barrier(1, &cancelled);
  };
}
@end
```

これで何が嬉しいかというと、アプリのリリース後にjsbundleをダウンロードしてきて動的に更新できるようになるということですね。
Imageリソースをサーバーからダウンロードする形式にすれば問題なかったのですが、データ転送量とかを気にするとやっぱり最初からbundleしてある画像リソースはそのまま使いたいですしね。

動的にダウンロードしたjsをそのまま使っては危険ですので、jsbundle作成時に秘密鍵でサインして、アプリ側で公開鍵でvalidateするとかしましょう。
luigiでパラメータチューニング（２）

ニッチなことしか書いていない自分にしては反応が大きかった気がしたのでもう少し色々やってみた。という話です。

## 汎用タスクを作ろう

今回のコードはこちら。前回とやっていることは同じです。
https://github.com/keisuke-yanagisawa/study/blob/20151205/luigi/param_tuning.py

今回のテーマは、**汎用のタスクを作りたい**ということ。
いろんなタスクを作るわけですが、やっぱり汎用のものを作ると嬉しいのはどこでもいっしょ。そこで、

- パラメータチューニングの結果を集約し
- 最良値を出したパラメータだけをまとめてcsv形式で出力する

ということを汎用的にやってくれるタスクを作ってみました。

```py
class param_tuning(luigi.Task):
    tasks        = luigi.Parameter()              # luigi.Taskの1次元配列
    text_format  = luigi.Parameter()              # pythonの「変数名記述付きの」正規表現を渡す
    reduce_pivot = luigi.Parameter()              # どの変数を集約で利用するか
    reduce_rule  = luigi.Parameter(default="min") # 集約する関数を指定, min or max
    out_file     = luigi.Parameter()              # 出力ファイル名

    def requires(self):
        return self.tasks;
    def output(self):
        return luigi.LocalTarget(self.out_file)

    def run(self):

        # making pandas dataframe
        results = []
        for task in self.requires():
            with task.output().open() as taskfile:
                string = taskfile.read()
                groupdict = re.search(self.text_format, string).groupdict()
                results.append(groupdict)
        df = pd.DataFrame.from_dict(results);
        df[self.reduce_pivot] = convert2num(df[self.reduce_pivot])
        values = df[self.reduce_pivot]

        # Aggregation of parameter tuning results
        if self.reduce_rule == "min":
            best_val = min(values)
        elif self.reduce_rule == "max":
            best_val = max(values)
        else:
            print("reduce_rule must be min or max. your input is %s" % self.reduce_rule)
            exit(1);

        # Rearrangement of column order
        column_order = filter(lambda key: key != self.reduce_pivot, df.columns) + [self.reduce_pivot]
        df = df[column_order]

        # Outputting results as csv formatted data
        df[df[self.reduce_pivot] == best_val].to_csv(self.output().fn, index=False);
```

集約関係は色々コーディングが面倒になり、pandasに任せました。
やっていることは非常に簡単で、

1. 一つ一つのパラメータでの計算を``requires()``で実行し
1. 結果をすべてpandas dataframeに集計
1. 最も良い値を集約部分で求め
1. (csvの最後に集約で用いた値がくるように編集して)
1. 最も良い値になっているものだけを(場合によっては複数個)出力する

という仕組みです。

inputはちょっとややこしいですね。tasksやreduce系, outputと基本的にはわかると思うのですが、汎用にするために正規表現をぶち込むようなインターフェースにしたらなんかキモくなりました。

## 使い方
githubに上げているコード自体の利用方法は、

```py
python param_tuning.py main_task --local-scheduler
```

とかやってくれれば動く気がします。

また、この汎用タスクの利用方法に関してですが、別途「パラメータでの計算を行うタスク」「main関数となるタスク」を用意します。

mainタスクに記述する正規表現が多分一番の難点でして（私が正規表現使ってなさすぎ）、それについて説明。
今回の計算実行タスク``task_param_eval``は``cost,gamma,error``という一行のcsv形式のファイルを出力するようになっているので、以下のように指定します。

```py
s = "[-+]?\d*\.\d+|\d+" ## float or int expression
text_format  = "(?P<cost>"+s+"),(?P<gamma>"+s+"),(?P<error>"+s+")"
```

``?P<name>``とすることで、名前を指定することができます。これは出力csvのheaderやpivotの名前として利用するので、ちゃんと指定してください。

## 終わりに
私、コーディングしている割には絶望的にモジュール化が下手な人間なのですが、こういう強制力が働くと「仕方なく」切ったりすることができてすごく良いと思っています。今回は、そのモジュール化によって得られる恩恵の1つである汎用物品の作成をしてみました。
…コーディングがそもそもへたっぴなのはご指導ご鞭撻頂戴できれば幸いです。

#### 参考資料
数字を正規表現で発見する方法に関しては以下のstack overflowから拝借。
http://stackoverflow.com/questions/4703390/how-to-extract-a-floating-number-from-a-string-in-python
水温コントロール①水温計をつくる

#目的

水温のコントロールのために、まず水温を測れるようにします。
水温がコントロールできると、アクアリウムや低温調理、発酵ができるね！
普通の温度センサーをシールして水中で使います。

#使うもの

LM355(2個で150円くらい)
Arduino Leonald
2KΩ抵抗
ブレッドボード
熱収縮チューブ
配線
半田ごて

#準備

水中で使えるようにシールします。

out/GNDに配線をはんだします。まちがえて３本に付けた。
各はんだ部分に絶縁用に熱収縮チューブをつけ、はんだごての根元で先っぽをなぞり熱収縮させます。

![20151205174408.jpg](https://qiita-image-store.s3.amazonaws.com/0/39559/4ac663f7-fcbe-1a06-fc0b-c23633843f40.jpeg)

全体を熱収縮チューブに入れ、はんだごての根元で先っぽをなぞり、シーリングします。
配線の色で配線がどっちがどっちかわかるようにしておこう。


#配線

文字の面を手前にして、一番右がGND、真ん中がOUT。
下記画像を参考。
[http://www.learningaboutelectronics.com/Articles/LM335-temperature-sensor-circuit.php:title]

下記3つを配線
1. GND(Arduino) <--> GND(センサー)
2. AnalogRead 0<-->OUT(センサー)
3. 5V(Arduino) <--> 2KΩ <--> OUT(センサー)

リンク先の画像の通り。
[http://spacetinkerer.blogspot.jp/2011/03/build-thermometer-using-lm335-sensor.html:title]




この通り

#プログラム

````c++
int outputPin= 0;//OUTをつないだアナログピンの番号

voltage pin to high
void setup()
{
Serial.begin(9600);
}


void loop()//摂氏にする
{
int rawvoltage= analogRead(outputPin);
float Temp = ((rawvoltage/1024.0) * 5000)/10 - 273.15;
Serial.println(Temp);
Serial.println("℃");


delay(3000);
}　
````
【Qt Creator】Alt+Enterを使おう！

[QtAdventCalender](http://qiita.com/advent-calendar/2015/qt "QtAdventCalender")5日目の記事です。

私は気に入ったIDEを使い込むのが趣味なので、今回はQtCreatorについていろいろ紹介します。
1記事でまとまらないのでカレンダーが空いてたらいろいろ書きます！

#Alt+Enterでできること
QtCreator上でAlt+Enterとすると状況に応じてさまざまなアクションを行えます。
便利なので活用しましょう！

## 宣言から定義を追加する

ヘッダファイルに宣言を書いたあと、実装ファイルに定義を追加できます。
非常に便利。

便利度 ★★★
![2015-05-20_11h19_14.png](https://qiita-image-store.s3.amazonaws.com/0/22327/cf180356-2fd9-737c-e1d5-7d876e0af158.png)


ちなみに逆もできます。
実装を書いてからヘッダに追加。
スロットの場合とかに楽かも。
![2015-05-20_11h25_32.png](https://qiita-image-store.s3.amazonaws.com/0/22327/a232c99a-4c74-eb35-3f88-1da4321d1ab8.png)

## Setter/Getterを追加
変数Xに対するSetXとGetXを追加できます。
これも非常に便利。

便利度 ★★★
![2015-12-05_19h07_57.png](https://qiita-image-store.s3.amazonaws.com/0/22327/9f42cffc-fd7b-420b-4be5-6c15b333f189.png)
(でもときどき命名規則が…)

## インクルードを追加
クラス名からインクルードを自動検索して追加してくれます。
自作クラスでも有効ですが、例えばqDebug()に対しては残念ながら無効です。クラス名じゃないので。
やはり非常に便利。

便利度 ★★★
![2015-05-20_11h20_27.png](https://qiita-image-store.s3.amazonaws.com/0/22327/9aeec357-3361-51f2-a707-639eca597b1c.png)

## 継承した関数を追加
継承した関数はいちいち書かなくても細かく指定して作成してくれます。
状況によってはかなり役に立ちます。

便利度 ★★

![2015-12-05_19h18_45.png](https://qiita-image-store.s3.amazonaws.com/0/22327/b4df7af6-e54c-4973-ca9b-a944522fd019.png)![2015-12-05_19h18_29.png](https://qiita-image-store.s3.amazonaws.com/0/22327/7fd7abbc-9182-57f2-2f6f-1bed3791c781.png)

## 実装の移動
ヘッダに書いた実装をcpp側に移動できます。
cpp開くのが面倒でヘッダに書いたときとか、簡単な実装だからヘッダに書いたけど複雑化してきたってときには便利。
逆にインライン化したくなったとかでcppからヘッダに移すのもOKです。

便利度 ★★
![2015-12-05_19h29_49.png](https://qiita-image-store.s3.amazonaws.com/0/22327/a4ae4887-1205-5d6f-d4ee-6bee0c21a0d6.png)

##その他いろいろ
###16進数などの変換
書いてる部分によっては良く使う。
![2015-05-20_11h28_54.png](https://qiita-image-store.s3.amazonaws.com/0/22327/3f5c8a87-ae43-4228-5fa0-f2f8d7000442.png)

###1行ifを括弧付きに直す
普通はコードフォーマットとかで全自動するはず。
![2015-05-20_11h26_40.png](https://qiita-image-store.s3.amazonaws.com/0/22327/2806b56c-7aff-c194-d787-93a848d5a0b3.png)

###引数として抽出する
![2015-05-20_11h27_21.png](https://qiita-image-store.s3.amazonaws.com/0/22327/4530d12f-2602-f826-e600-eabafd7009c2.png)
↓ 実行結果
![2015-05-20_11h27_30.png](https://qiita-image-store.s3.amazonaws.com/0/22327/996b999a-02f4-dc06-5cda-3dc0ddfc2d9e.png)

###引数の順番を入れ替える
![2015-05-20_11h23_39.png](https://qiita-image-store.s3.amazonaws.com/0/22327/8da7a97d-2c34-91ae-93da-cc1502af1b0c.png)

###ポインタの宣言に変更する
でも使ってる場所の.を->になおしてくれないのでいまいち。
![2015-05-20_11h23_16.png](https://qiita-image-store.s3.amazonaws.com/0/22327/1220cf0f-4fdf-6739-32f5-583f9a9b620c.png)

その他いっぱいあります。
バージョンアップごとにじわじわと便利になっていて、不満があった場所が最新版で直っていることに気づくと嬉しいです。
3.3くらいでまとめた文章を元に3.6RC1で実験しつつ補間しました。

QtAdventCalender2015次回はtaura_noさんの画面レイアウトについての記事になります。

##参考
公式のリファクタリング機能マニュアル(英語)
http://doc.qt.io/qtcreator/creator-editor-refactoring.html
レキシカルスコープ/ダイナミックスコープとは？



そもそも、スコープには二種類ある。

1. レキシカルスコープ
2. ダイナミックスコープ

それぞれは、変数の参照の仕様のことであり、Ruby、Java、Javascript、python等多くのメジャーな言語でレキシカルスコープが採用されています。


# レキシカルスコープの例
非常に単純です。以下のコードを見て下さい。

```ruby 

var =  '私はトップレベル'

def a_method
  return var 
end

def b_method
  var = '私はオブジェクトの中身'
  return var
end

a_method 
#-> '私はトップレベル'

```

Ruby等を書いていると当たり前ですが、a_methodからb_methodのvarを参照することは出来ません。
これが　```レキシカルスコープ``` です...!!!
しかし、世の中には関数を評価した時に変数のスコープが決定する言語があるらしいです。
それらをダイナミックスコープと呼ぶらしいですが、例えばLispとかEmacs等はそれらのスコープを採用しているらしいです。




# ダイナミックスコープの例　

これはRubyではありません。Rubyっぽいダイナミックスコープを採用しているDynamicRubyです。(そんなものはありませんが、造語です。)

```ruby

def a_method
  p var
end


def b_method
  var = '私はBです。'
  a_method
end

def c_method
  a_method
end

b_method
#-> '私はBです。'

c_method
#-> undefined variable 'var'  
```

となるでしょう。
つまり、関数を定義した時にスコープが決定するのではなく、 ***関数を評価するときにスコープが決定します。***


# ダイナミックスコープのメリット

言語を実装することが簡単らしいですw
Lisp やEmacs等が何故採用したのか？に対してそうやって書いてあるらしいです。笑
iPhoneにインストールされているProvisioning Profileが多すぎるとAdHocでビルドしたバイナリの初回起動に時間がかかる

この投稿は、[モバイルファクトリー Advent Calendar 2015](http://qiita.com/advent-calendar/2015/mobilefactory)の5日目のものです。

## 症状

このような症状に悩まされていました。この時の端末はiPhone4sで、iOS9でした。

- USBで繋いで端末にアプリを入れた場合は普通に起動する
- AdHocでビルドしたアプリをDeployGateなりFabricのBetaなりでインストールした場合、20秒で強制的にクラッシュする[^1]
- 2回クラッシュした後、3回目はすんなり起動する
- 1度起動できると、アプリを終了せせて再度起動するときもすんなり起動する
- 端末を再起動する、もしくはアプリを削除してインストールし直した後は3回目でないと起動しない


## 調査

端末のログを確認したところ、このような出力が山のように出ていました。

```
securityd[83] <Error>:  secTaskDiagnoseEntitlements MISSING keychain entitlements: no stored taskRef found
securityd[83] <Error>:  secTaskDiagnoseEntitlements MISSING keychain entitlements: no stored taskRef found
amfid[199] <Error>:  SecTrustEvaluate  [leaf IssuerCommonName SubjectCommonName]
```

ググったところ[このAppleのフォーラム](https://forums.developer.apple.com/thread/20193)が見つかり、この質問主さんも似たような症状のようでした。

結果的に、上記のエラーは直接的な問題ではないようで、端末にインストールされているProvisioning Profileが異常に多いことが原因でした。Xcodeで確認[^2]したところ、想像以上に多くのProvisioning Profileがインストールされていました。この端末では200個以上は入っていました。同じアプリについてのProvisioning Profileでも、有効期限違いでいくつも入っていたり、社内共有の端末だったため多量のアプリのものが入っていたりで、肥大化してしまっていたようです。

問題となったアプリのProvisioning Profileの名前がアルファベット順で比較的後ろの方に位置していたという状況からの予想ですが、初回起動時はアプリを起動する段階でProvisioning Profileを1つずつ線形探索で探索しつつ有効なものがあるのか確認しているような気がします。2回目以降の起動速度が問題ないのは、初回にて有効なProvisioning Profileをどこかで記憶しているからだと予想しています。


## 解決策

不要なProvisioning Profileを削除する。

予想起動時間47秒(20秒クラッシュx2 + 3回目の起動時間)だった端末において、今回問題となったアプリ以外全てのProvisioning Profileを削除したところ、7秒で起動するようになりました。


## 終わりに

明日は、@karupaneruraさんによる「MySQLかPerlかSwiftかGoのはなし」です。個人的にはGoの話が来ると予想しています。


## 参考

- https://forums.developer.apple.com/thread/20193


[^1]: iOSの仕様で、アプリの起動に20秒以上の時間がかかると強制終了させられます。
[^2]: ちなみに、端末にインストールされているProvisioning Profileの一覧はXcodeのDevicesにて確認することができるのですが、そのインタフェースが非常にわかりにくいです。Devicesを開き、端末を右クリックすると表示することができます。
気を付けて！！Bashとzshの微妙な違い

[Shell Script Advent Calendar 2015]("http://qiita.com/advent-calendar/2015/shell-script")　5日目の記事です。




##モノローグ
「Bash凄い！zshもっと凄い！！どうせ使うなら凄い方がいい」、という安直な考えで、普段zshを使ってます。当然スクリプトを書いたりしてるのですが、どうせ書くならBashでもzshでも使える方がいいですよね♩
基本的にBashで動けばzshでも同じように動くんですが、注意しなければならない2つのことを紹介します。



##チルダ置換編
シェルではコマンドや引数がチルダ(~)で始まる場合、置換が行われます。
例えば、チルダの後の文字列がユーザー名である場合、そのユーザーのログインディレクトリに置換されます。

```console
$ echo ~root
/root
$ echo "~root"
~root
```
チルダに続く文字列がコマンド置換の場合も、チルダ置換が行われます。

```console
$ "echo ~`echo root`"
root/
```

ここまでは両シェル共通です。

###変数置換
チルダに続く文字列が変数の場合、Bashではチルダ置換は行われませんが、zshでは置換されます。

```console
//bashの場合
$ bash -c 'echo ~$USER'
~root
//zshの場合
$ zsh -c 'echo ~$USER'
/root
```

チルダに続く文字列がクォートされている場合も、Bashでは置換は行われませんが、zshでは置換されます。

```console
//bashの場合
$ bash -c 'echo ~"root"'
~root
$ bash -c 'echo "r""oot"'
~root

//zshの場合
$ zsh -c 'echo ~"root"'
/root
$ zsh -c 'echo ~"r""oot"'
/root
```

チルダに続く文字列がエスケープされているときも同様に、Bashでは置換されずzshでは置換されます。

```console
//Bashの場合
$ bash -c 'echo ~\r\o\o\t'
~root

//zshの場合
$ zsh -c 'echo ~\r\o\o\t'
/root
```

####存在しないユーザー指定した場合
存在しないユーザーをチルダ置換すると、Bashではチルダがそのまま残るのですが、zshではエラーになります。

```console
//Bashの場合
$ bash -c 'echo ~ghost'
~ghost

//zshの場合
$ zsh -c 'echo ~ghost'
zsh:1: no such user or named directory: ghost
```

##配列編
Bashの配列は他のプログラミング言語と同様に0から始まるのですが、zshは何故だか分かりませんが1から始まります。よく使うであろう配列の仕様が違うのは困りますねぇ。
・Bashの場合

```console
$ arr=(a b c)
$ for i in {0..3}; do
$ echo "\$arr[$i] = ${arr[$i]}"
$ done;

$arr[0] = a
$arr[1] = b
$arr[2] = c
$arr[3] =
```

・zshの場合

```console
$ arr=(a b c)
$ for i in {0...3}; do
$ echo "$arr[$i] = ${arr[$i]}"
$ done;

arr[0] =
arr[1] = a
arr[2] = b
arr[3] = c
```

###解決法
zshで配列を0番からに出来る``ksharrays``というオプションを使ってやれば、Bash同様に0番からになります。

##ひとこと
シェルは奥が深すぎて、しばらく初心者の域を脱せそうにないです｡ﾟ(ﾟ´Д｀ﾟ)ﾟ｡　

明日は[@akinomyoga]("http://qiita.com/akinomyoga")さんです！
JupyterにC++のノートのためのclingカーネルを追加する [Mac]


JupyterのC++カーネルであるclingを追加すれば、JupyterのノートブックでC++11の勉強ができると思いインストールしました。

# 環境
- Mac OS Yosemite 10.10.5
- gcc 5.2.0
- g++ 5.2.0

# brewによるgccのインストール
gccが古かったのでbrewで入れなおしました。

gccのバージョンは5.2.0です。

```bash
brew update
brew install gcc

g++ --version
g++ (Homebrew gcc 5.2.0) 5.2.0
Copyright (C) 2015 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.

gcc --version
gcc (Homebrew gcc 5.2.0) 5.2.0
Copyright (C) 2015 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.
```

# clingインストール
C++のインタプリタであるclingをインストールします。

clingはROOTというデータ解析フレームワークにおいて使用するためにCERNで開発されたインタプリタです。LLVMとclangをベースにしているようです。

インストール方法は[こちら](https://root.cern.ch/cling-build-instructions)。

以下のclone.shを利用すればインストール出来るとあったので実行したのですが上手く行きませんでした。

```bash
wget https://raw.githubusercontent.com/karies/cling-all-in-one/master/clone.sh
chmod +x clone.sh
./clone.sh 
```

しょうがないので自分でいれていきます。

まずはソースをクローンします。

```bash
git clone http://root.cern.ch/git/llvm.git src
cd src
git checkout cling-patches
cd tools
git clone http://root.cern.ch/git/cling.git
git clone http://root.cern.ch/git/clang.git
cd clang
git checkout cling-patches
```

続いてsrcと同じ階層にbuildディレクトリを作成し、インストールを行います。

私の環境ではCC・CXXでCコンパイラとC++コンパイラを指定しないと上手くいきませんでした。

インストールが完了したらPATHを設定しましょう。

```bash
cd ../../../
mkdir build
cd build
CC=gcc CXX=g++ ../src/configure --enable-optimized --prefix=/path/to/instal/dir
make
make install
export PATH=/path/to/instal/dir:$PATH
```

clingを実行して以下のように表示されたら正しくインストールされています。

```bash
$ cling

****************** CLING ******************
* Type C++ code and press enter to run it *
*             Type .q to exit             *
*******************************************
[cling]$ 
```

# Jupyter kernelインストール

最後にJupyter用のclingカーネルをインストールします。

```bash
git clone https://github.com/minrk/clingkernel
cd clingkernel
sudo python setup.py install
jupyter kernelspec install --user cling
```

以下に使用した例を示しました。

![notebook.png](https://qiita-image-store.s3.amazonaws.com/0/99572/2e59a9fa-78bb-b4df-c6af-03f5a0434e0a.png "notebook.png")
Arch Linux + GPS18xLVC + ntpdでPPSが動かない

元々ntpdでStratum 1を運用していたのに、pacman -Syuしていたら、動かなくなりました。
GPS18xLVCとの接続等は、既存記事にお任せします。RS-232CのCD信号にPPS信号をつないで、`# ldattach PPS /dev/ttyS0`している前提です。

# 確認
PPSは動作しているでしょうか。/dev/pps1を[pps-tools](http://www.linuxpps.org/gitweb/?p=pps-tools;a=summary)で確認します。なお、自分の環境では、/dev/pps0はigbがPTP用に占有している模様。

```
$ sudo ./ppstest /dev/pps1
trying PPS source "/dev/pps1"
found PPS source "/dev/pps1"
ok, found 1 source(s), now start fetching data...
source 0 - assert 1449307365.000003704, sequence: 597116 - clear  1448717727.100462350, sequence: 7479
source 0 - assert 1449307366.000001027, sequence: 597117 - clear  1448717727.100462350, sequence: 7479
source 0 - assert 1449307367.000002126, sequence: 597118 - clear  1448717727.100462350, sequence: 7479
source 0 - assert 1449307368.000002811, sequence: 597119 - clear  1448717727.100462350, sequence: 7479
```
問題ないようです。

# 原因
pacmanで入れるntpdは、PPS readyでないようです。例えば[Type22のPPS refclock](https://www.eecis.udel.edu/~mills/ntp/html/drivers/driver22.html)を使う設定でjournalctlすると、`refclock_newpeer: clock type 22 invalid`といったエラーが出ます。

# 対策
とりあえず自分でコンパイルして、ntpdを上書きしました。
記載時の最新版ntp-4.2.8p4では、/usr/include/timepps.hがある状態でconfigureすれば、PPS readyとなるようです。
timepps.hは、[LinuxPPS](http://linuxpps.org/wiki/index.php/Main_Page)から入手して/usr/include/に設置。`configure; make`し、ntpd/ntpdを/usr/sbin/にinstall。

# 設定
詳細追えていませんが、Linux arch-rm 4.2.5-1-ARCHとntp-4.2.8p4の組み合わせ?では、flag3が1だと、PPSにならないようでした。flag3 0にして、clock disciplineは、一旦ntpdのものを使用。

```19200bpsのNMEAが/dev/gps0、PPSが/dev/gpspps0の場合の/etc/ntp.confの例
# NMEA driver
server 127.127.20.0 minpoll 4 maxpoll 4 mode 32 iburst prefer
fudge  127.127.20.0 flag1 1 flag2 0 flag3 0 time2 0.600
```

# 結果
```
$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
oGPS_NMEA(0)     .GPS.            0 l   12   16  377    0.000   -0.001   0.001
```
こうでなくっちゃね。

# 次
[LinuxPTP](http://linuxptp.sourceforge.net)!

# 謎
元々も自分でbuildしていたのかも?
【Ruby】引数ありrakeの作り方と、呼び出し方



## hoge.rake

```ruby 
task :hoge, [:fuga] => :environment do |t, args|
  p args[:fuga]
end
```

## ターミナル
   
   
```terminal
rake "mock:hoge['私はQiita']"
"私はQiita" 
```


```""``` でくくる必要があるのと、```[]```の中に第一引数、第二引数と入れていく。

他にも方法はあります!