OmniAICreator/Qiita-1.07M huggingface dataset:
Action Extensionメモ＆サンプル

Action Extensionはアプリから任意のデータを受け取り、処理を行い、結果を戻すことができる汎用的なエクステンションです。

![action_extension.jpg](https://qiita-image-store.s3.amazonaws.com/0/25727/4d42754e-c125-de3c-1dab-cca3811947e5.jpeg)

URLをWebViewで開き、全体のスクリーンショットをカメラロールに保存するサンプルを作成しました。
https://github.com/imk2o/Try-AppExtensions

## 処理の流れ

* ビューコントローラがインスタンス化される
* アプリより渡されたアイテムを取得し、任意の処理を行う
    * UIViewController#extensionContext
    * NSExtensionContext#inputItems
* リクエストを完了する
    * NSExtensionContext#completeRequestReturningItems(_:completionHandler:)
    * NSExtensionContext#cancelRequestWithError(_:)

### Info.plistの設定

`Info.plist`の`NSExtensionActivationRule`に、受入可能なデータタイプの設定を行います。

> デフォルトでは全てを受け入れる`TRUEPREDICATE`が設定されているが、リジェクトされる可能性があるため適宜設定すること。

* NSExtensionActivationSupportsAttachmentsWithMaxCount: 
* NSExtensionActivationSupportsAttachmentsWithMinCount
* NSExtensionActivationSupportsFileWithMaxCount: 受入可能なファイル数
* NSExtensionActivationSupportsImageWithMaxCount: 受入可能な画像数
* NSExtensionActivationSupportsMovieWithMaxCount: 受入可能な動画数
* NSExtensionActivationSupportsText: テキストは受入可能か？(Boolean)
* NSExtensionActivationSupportsWebURLWithMaxCount: 受入可能なURL数
* NSExtensionActivationSupportsWebPageWithMaxCount: 受入可能なWebページ数

### アプリより渡されたアイテムの取得

アプリより渡されたアイテムは`extensionContext.inputItems`に格納されています。受入可能な型として値を取り出します。

```swift
    override func viewDidLoad() {
        super.viewDidLoad()

        // 1つのアイテムを抽出(Info.plistの設定により制限されている)
        guard
            let item = self.extensionContext?.inputItems.first as? NSExtensionItem,
            let itemProvider = item.attachments?.first as? NSItemProvider
        else {
            return
        }

        // アイテムからURLを抽出
        if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeURL as String) {
            itemProvider.loadItemForTypeIdentifier(kUTTypeURL as String, options: nil) { [weak self] (item, error) in
                if let error = error {
                    self?.extensionContext?.cancelRequestWithError(error)
                } else if let URL = item as? NSURL {
                    dispatch_async(dispatch_get_main_queue()) {
                        self?.loadURL(URL)
                    }
                }
            }
        }
    }
```

### リクエストの完了

処理が成功した場合は`NSExtensionContext#completeRequestReturningItems(_:completionHandler:)`を呼び出します。このとき、アプリ側に処理したNSExtensionItemを返すこともできます。処理に失敗した場合は`NSExtensionContext#cancelRequestWithError(_:)`を呼び出します。

サンプルコードではWebページのキャプチャを行い、その画像の保存完了時に各ハンドラを呼び出しています。

```swift
    func image(image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeMutablePointer<Void>) {
        if let error = error {
            self.extensionContext?.cancelRequestWithError(error)
        } else {
            self.extensionContext?.completeRequestReturningItems(nil, completionHandler: nil)
        }
    }
```

## 参考

http://dev.classmethod.jp/references/ios-8-action-extension/
http://hack.sonix.asia/archives/936
Today Extensionメモ＆サンプル

Today Extensionは通知センター内に表示するウィジェットを提供するエクステンションです。

![today_extension.jpg](https://qiita-image-store.s3.amazonaws.com/0/25727/2a199299-711d-06c6-8c5e-30c365078476.jpeg)

iPhoneのモーションセンサが計測した歩数を表示するサンプルを作成しました。
https://github.com/imk2o/Try-AppExtensions

## 処理の流れ

* ビューコントローラがインスタンス化される
* ウィジェットのマージンを求める
    * NCWidgetProviding#widgetMarginInsetsForProposedMarginInsets(_:)
* データを取得し、ウィジェットを更新する
    * NCWidgetProviding#widgetPerformUpdateWithCompletionHandler(_:)
* ユーザアクションに応じ、アプリを起動する
    * NSExtensionContext#openURL(_:completionHandler:)

### widgetPerformUpdateWithCompletionHandler(_:)

データ取得等を行い、ウィジェットの更新を行うロジックを実装します。
更新完了時は必ず、以下のいずれかの値とともに`completionHandler`を呼び出す必要があります。

* NCUpdateResult.Failed: エラーが発生した
* NCUpdateResult.NoData: 更新を行わなかった
* NCUpdateResult.NewData: 更新を行った

```swift
    func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)) {
        guard CMPedometer.isStepCountingAvailable() else {
            completionHandler(.Failed)
            return
        }

        // 今日の00:00から現時刻までの歩数を求め、これを表示する
        let now = NSDate()
        let calendar = NSCalendar.currentCalendar()
        let dateComponents = calendar.components([NSCalendarUnit.Year, NSCalendarUnit.Month, NSCalendarUnit.Day], fromDate: now)
        let startDate = calendar.dateFromComponents(dateComponents)

        self.pedometer.queryPedometerDataFromDate(startDate!, toDate: now) { (data, error) in
            if let _ = error {
                completionHandler(.Failed)
            } else if let steps = data?.numberOfSteps {
                self.stepsLabel.text = "\(steps) steps"
                completionHandler(.NewData)
            } else {
                completionHandler(.NoData)
            }
        }
    }
```

### widgetMarginInsetsForProposedMarginInsets(_:) (optional)

通常は通知センター内に一定のマージンを取った内側にウィジェットが表示されますが、このマージンを調整することができます。

### アプリの起動

アプリへの導線を追加する場合は、`UIViewController#extensionContext`の`openURL()`を利用します。

```swift
    @IBAction func viewDidTap(sender: AnyObject) {
        // URLスキームでアプリを起動
        if let appURL = NSURL(string: "myapp://") {
            self.extensionContext?.openURL(appURL, completionHandler: nil)
        }
    }
```

## メモ

「高負荷な処理を行ってはいけない」や「横スクロールできてはいけない」等、いくつかのガイドラインに従い実装する必要があります。

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/AppExtensions.html

## 参考

https://www.gaprot.jp/pickup/ios8/today-extension
http://sonson.jp/blog/2014/09/18/Widget/
LaravelでElixirを使うときのエラー

# エラー

Elixirを実行するときに以下のようなErrorが出る。

`Babel Compilation Failed!: Couldn't find preset "es2015" relative to directory "C:\\xampp\\htdocs\\laravel_template\\resources\\assets\\js"`

presetのes2015がないってだけなのでそれを入れる。
その後、実行すると同じようにprestのreactがないと言われる。

# 対策
`gulp`や`gulp watch`で実行する前に以下のモジュールを入れなければならない。

```Windows
npm i babel-preset-es2015 -D --no-bin-links
npm i babel-preset-react -D --no-bin-links
```

```それ以外
npm i babel-preset-es2015 -D
npm i babel-preset-react -D
```
Macでも動いた　Pepper SDK for Android Studio

# Macで動いた!?

+ AndroidStudioのPreferences - Plugins - Browse repositories...

![1.png](https://qiita-image-store.s3.amazonaws.com/0/119864/f6fdd20b-ce85-a1e7-7d40-1da025499e90.png)

ツールバーにロボットアイコンが追加される

![2.png](https://qiita-image-store.s3.amazonaws.com/0/119864/6dd87a42-db55-05b3-dab6-dad78502822b.png)

+ Robot SDK Manager

![スクリーンショット 2016-05-29 8.30.45.png](https://qiita-image-store.s3.amazonaws.com/0/119864/724ad449-1ed6-33e3-bc13-422ca777ba94.png)


+ File - New - Robot Application...

![3.png](https://qiita-image-store.s3.amazonaws.com/0/119864/fd9f064a-bb5f-0f95-b0a1-965841dd6cef.png)

+ いざ、Hello World

        import com.aldebaran.qi.Future;
        import com.aldebaran.qi.sdk.object.interaction.Say;
        (略)
        Say say = new Say(this);
        Future<Void> run = say.run("Hello world!");

+ ロボアプリ実行

![6.png](https://qiita-image-store.s3.amazonaws.com/0/119864/782b55ad-23ad-c03a-8238-33af727b043f.png)

+ しゃべった！

![5.png](https://qiita-image-store.s3.amazonaws.com/0/119864/c5bdc98b-cd1e-93e0-9e03-d9a0a8947ee4.png)
Arduino > Serial.print() > 少数桁の指定 > Serial.println(1.23456, 4)

http://qiita.com/7of9/items/09272fcfb56bd479c679
で持った疑問。

少数をSerial.print()で出力した時に少数桁が2桁になっている。

https://www.arduino.cc/en/Serial/Print
を見ると

```
Serial.print(1.23456) gives "1.23"
```

```
Serial.println(1.23456, 4) gives "1.2346"
```
技術英語 > out of which / out of who > was populated by 228.422 people out of who 116.888 were Greeks 

@ LOE > January 11, 2013
http://loe.org/shows/shows.html?programID=13-P13-00002
> 65 billion dollars ..., <font color=red>out of which,</font> almost 60 billion were ...

これが人になると out of who なのだろうと推測したらそのようだった。

http://www.sfeva.gr/80449DD4.en.aspx
> was populated by 228.422 people <font color=red>out of who</font> 116.888 were Greeks
Python3: Understanding Sieve of Eratosthenes

#Terms used in general
##def of prime numbers

まずは素数の簡単な理解から（より正確な定義はwikiなどを）

- 1より大きい
- その数と1でしか割り切れない

という２つの定義を使って処理を行っていく。

##Sieve of Eratosthenes

より効率的に素数を出すことの出来るアルゴリズム。一言で説明するとn番目までの数字上で（上で定義した共通点を元に）共通の仲間を除外していく。除外されていない数字全てが素数。（簡略化されたmachine learning的な。。。）より具体的な説明は<a href="https://www.youtube.com/watch?v=V08g_lkKj6Q" target="_">以下</a>と<a href="https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes" target="_">wiki</a>を参考に。

#implementation in Python

一番最初に考えていたのはdictionaryをベースに毎回membership判定を行なうgeneratorなり関数を作る。

```
def prime_gen():
    "self-explanatory prime generator"
    D = {}
    q = 2
    while True:
        if q not in D:
            yield q
            D[q*q] = [q]
        else:
            for p in D[q]:
                D.setdefault(p + q, []).append(p)
            del D[q]
        q += 1

def nth(iterable, n, default = None):
    "Returns the nth item or a default value"
    return next(islice(iterable, n, None), default)
```

こちらのタイプは先に何番目までの素数が欲しいのかを予め決めておき、その数字にたどり着くまでひたすら処理を行い続けるタイプのgenerator。`limit`の数分だけ`True val`を用意しておきfor loopで引っかかった数字を少しずつ`False`に変えていく。よってyieldされるのはTrueとされているvalのリスト内のポジションが値として返ってくる。

```
def primes_sieve2(limit):
    a = [True] * limit                          # Initialize the primality list
    a[0] = a[1] = False

    for (i, is_prime) in enumerate(a):
        if is_prime:
            yield i
            for n in range(i*i, limit, i):     # Mark factors non-prime
                a[n] = False

```
具体的な例を兼ねて説明すると;
例えば`prime_nums = primes_sieve2(100)`。
1. 100個のTrue valが入ったリストが作られ最初の2のbooleanがFalseに変換。（最初の0と1は素数ではないので）
2. for loopとenumerateを使って整理。iが実際の数字でis_primeは文字通り素数かそうでないかのフラッグとしての役割を果たしている。もしis_prime = Trueならばその数字が出力される。
3. yieldした後はgeneratorの法則に従ってyield下にあるfor loopから処理が始まる。ここでは上で軽く触れた「n番目までの数字上で（上で定義した共通点を元に）共通の仲間を除外していく」という作業を行っている。iをlimitにぶつかるまでひたすらスケールしていきその度にその数字のis_prime valをFalseへと変えていく。
4. その処理を終える毎にval whose is_prime = Trueがyieldされていく。
こちらのimplementationは個人的に感動した。無駄なvalが何一つなく綺麗に再利用されていく様が見える。

sievesに関しては実に様々な処理方法がありそれぞれ処理速度が変わってくるので一番効率的な関数は別途探せば出てくると思われる。基本的な違いはいつどこでどの処理をするかが違うだけであって基本的なアルゴリズムの構造は変わらない。その辺に関しては[この記事](http://mattyjwilliams.blogspot.com/2011/10/sieve-of-eratosthenes-in-python.html)がjump startになるかもしれない。sieveのoptimizationに関しては[こちら](http://codereview.stackexchange.com/questions/42420/sieve-of-eratosthenes-python)

#参考にしたリンク

- [Prime Numbers - Sieve of Eratosthenes](https://www.youtube.com/watch?v=V08g_lkKj6Q)
- [Simple Prime Generator in Python](http://stackoverflow.com/questions/567222/simple-prime-generator-in-python)
- [Sieve of Eratosthenes - Finding Primes Python](http://stackoverflow.com/questions/3939660/sieve-of-eratosthenes-finding-primes-python)
Excelで佐々木希を描く with python

#【環境】
　windows8.1
　Excel 2013
　python2.7
　opencv3

#【概要】
　佐々木希の写真から色の情報を取得して、Excelのセルに塗りつぶします。

#【フォルダ構成】
　|---sasaki_excel
　　　　　　|---sasaki_excel.py
　　　　　　|---sasaki_nozomi.jpg（佐々木希の画像）
　　　　　　|---sasaki_nozomi.xlsx（描画用のエクセル）

　こちらの画像を使用しました。
　![sasaki_nozomi.jpg](https://qiita-image-store.s3.amazonaws.com/0/121997/4ba4cc47-c164-1c12-5a12-3e3b55756873.jpeg)


#【プログラム】
```py:sasaki_excel.py
# -*- coding:utf-8 -*-

import cv2
from openpyxl import load_workbook
from openpyxl.styles import PatternFill

# 画像読み込み
image = cv2.imread("sasaki_nozomi.jpg")

# エクセルファイル読み込み
wb = load_workbook(filename='sasaki_nozomi.xlsx')
# アクティブなシートを取り出す
ws = wb.active

# アスキーコードを使ってアルファベットのリスト作成
# col_name = ['A','B',...,'Z']
col_name = [chr(i) for i in range(65,65+26)]

# エクセルの列名リスト作成
i = 0
for j in xrange(26, len(image[0])):
    # アルファベットの連結
    col_name.append(col_name[i] + col_name[j % 26])
    if (j + 1) % 26 == 0:
        i += 1
    if len(col_name) == len(image[0]):
        break

    

for gyo in xrange(len(image)):
    for retu in xrange(len(image[gyo])):
        for rgb in xrange(len(image[gyo][retu])):
            
            # 赤、緑、青の値を16進数へ変換
            # 16進数にすると'0x**'と変換されるため後ろ2文字を取り出す
            red = hex(image[gyo][retu][0])[2:4]
            # 例えば'0xc'と変換される16進数もあるため、0を連結
            if len(red) == 1:
                red = '0' + red
            green = hex(image[gyo][retu][1])[2:4]
            if len(green) == 1:
                green = '0' + green
            blue = hex(image[gyo][retu][2])[2:4]
            if len(blue) == 1:
                blue = '0' + blue
            
            # 列と行の幅を変更
            ws.column_dimensions[col_name[retu]].width = 0.3
            ws.row_dimensions[retu].height = 1.5
            
            # 塗りつぶすセル名を取得
            cell_name = col_name[retu] + str(gyo + 1)
            # セル名をセット
            cell = ws[cell_name]
            # 16進数の数字を文字連結
            color = str(blue) + str(green) + str(red)
            # 塗りつぶし
            cell.fill = PatternFill(patternType='solid', fgColor=color)

# エクセルファイル保存
wb.save('sasaki_nozomi.xlsx')
```
#【結果】
<img width="529" alt="sasaki_nozomi.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/aa1abd17-dc3a-1033-00c4-53604bc935aa.png">




決して画像を貼りつけたわけではありませんよ（笑）
~~セルの幅は手動で調整しました。~~
[2016.5.29 追記]
セルの幅の調節を手動ではなくプログラムに組み込みました。

このプログラムの応用としては2枚の画像に対してセルの色を比較して、間違い探しをすることができます。

#【参考サイト】
　[PythonからExcelファイルをいじるopenpyxl](http://pepper.is.sci.toho-u.ac.jp/index.php?%A5%CE%A1%BC%A5%C8%2FPython%A4%AB%A4%E9Excel%A5%D5%A5%A1%A5%A4%A5%EB%A4%F2%A4%A4%A4%B8%A4%EBopenpyxl)
　[アスキーコード表](http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html)

#【他言語版】
　[Node.js版はこちら](http://qiita.com/Algebra_nobu/items/33781129460eb0338b1b)
　[Ruby版はこちら](http://qiita.com/Algebra_nobu/items/6d740ac3b58825431202)
VirtualBoxを使用したAndroidエミュレーターをmitmproxyに通す方法

さっき知ったのでメモのために書いておきます。
AndyやGenymotionなどをmitmproxyに通す方法です。
#通す方法
AndyとGenymotionでしか試していないため、おそらくこれに限らないです。

##Genymotionの場合
~~まず、私の環境でしか試してないためあまり大きく言えないのですが、初期の状態だと「Wi-Fi」→「WiredSSID」のところで「ネットワークを変更」ができないようです。~~
**追記2016/05/29**
もう一度１からデバイスを作ってみたところ、ネットワークを変更はすぐに現れました。
もし誰か他にも同じ事例の方がいたら先に再起動をお試しください。

以下は念のために残しておきますが、必要ないかもしれません。
>[こちらのStackoverflow](http://stackoverflow.com/questions/17831990/how-do-you-install-google-frameworks-play-accounts-etc-on-a-genymotion-virt)のチェックマークのついた回答の**ARM Translation Installer v1.1**と、エミュレートしているAndroidOSのバージョンに対応している**Google Apps**を落とし、**ARM Translation Installer v1.1**、**Google Apps**の順番でインストールしてください。
詳しい説明については省かせていただきます。

各デバイス起動前の設定内にあるNetworkタブでの設定がうまくいってないようでしたが、こちらのミスであることも十分考えられるので、もしかしたらそっちで設定したほうがいいかもしれません。

##共通の設定
まず、Androidの**設定**を開きます。
<img width="96" alt="スクリーンショット 2016-05-29 02.57.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/92994/67d86341-dd74-11f1-2bdc-aa22ab94c58f.png">

次に、**Wi-Fi**を開きます。
<img width="411" alt="スクリーンショット 2016-05-29 02.59.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/92994/07356db1-95ca-bad6-9ebd-f8956670d913.png">

**WiredSSID**をロングタップします。
<img width="382" alt="スクリーンショット 2016-05-29 03.00.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/92994/9718b20d-1108-2728-d21b-9204ee57b81e.png">

**ネットワークを変更**をタップし、**詳細設定項目**にチェックを入れ、**プロキシ**を**手動**にし、プロキシのホスト名を**10.0.3.2**、ポートはホストのOSでmitmproxyが待ち受けているポートを指定し、保存をタップします。
<img width="392" alt="スクリーンショット 2016-05-29 03.00.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/92994/7701e830-7be9-e2d9-f7d3-3afcce0badd4.png">

この設定の後は、通常のmitmproxyの設定通りに[mitm.it](http://mitm.it/)に接続し、証明書をインストールしてください。
<img width="415" alt="スクリーンショット 2016-05-29 03.01.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/92994/f994fc69-042e-c200-a354-1fb5ce9bc5a7.png">

#10.0.3.2とは
10.0.3.2は、多分VirtualBoxが割り当てたホストOSのlocalhostを示すIPです。
もしホストOSで立ち上げている何かにAndroidエミュから接続したい場合は、10.0.3.2:ポート番号というようにすることで接続することができます。

ちなみに、ホストOSからゲストOSに接続したい場合は、
1. Virtual Box マネージャーを立ち上げ、
2. エミュレートしている端末の設定を開き、
3. ネットワークタブのアダプター２タブを開き、
4. 割り当てをNATにし、ポートフォワーディングのボタンから
5. ゲストポートとホストポートをそれぞれ設定し終わりです。
[Powershell5.0]Get-Locationの出力がうまくされないときの対処方法

どのバージョンからこうなったのかは不明ですが、Powershell5.0でGet-Locationの出力を表示させた場合の挙動がなにやらおかしかったので。

#発生例
```ps1:test.ps1
Get-Location
Write-Output "hoge"
Write-Host "foo"

Read-Host -Prompt "Read-Host"
```
上記のスクリプトファイルを R:\test 配下で実行したとき、期待するのは下記のような結果となることですが、

```ps1:期待する出力
Path   
----   
R:\test
hoge
foo
Read-Host: 
```

実際には下記のように順番が入れ替わって出力されます。


```ps1:実際の出力
foo
Read-Host: 
Path   
----   
R:\test
hoge
```

Read-Hostのプロンプトの後、Enterを叩いてから表示がされる形になるので、モノによってはかなりわけのわからないことに。

また、下記のように一旦変数に格納して、それを表示させた場合でも同様です。

```ps1:
$location = Get-Location
$location
```



*新しいバージョンでだけ発生する問題のようです。
"powershell -Version 2.0"と指定してPowershellを起動し実行した場合は期待通り出力がされます。
ちなみに$PWDを参照した場合も同じ事になるので、PathInfo型の処理がおかしいのかも。*


#対処方法
`Get-Location`の出力を表示させる場合は`Get-Location | Format-Table`のように`Format-*`にパイプしてやります。

```ps1:test.ps1
Get-Location | Format-Table
Write-Output "hoge"
Write-Host "foo"

Read-Host -Prompt "Read-Host"
```

```ps1:出力結果
Path   
----   
R:\test


hoge
foo
Read-Host: 
```

これで一応想定通りの順番で出力がされます。
*しかしなぜこれでうまくいくのかわからない*
SQLite3 JDBC: setDateStringFormat は get には有効だが set はさにあらず

今回は[SQLite JDBC Driver 3.8.11.2](http://mvnrepository.com/artifact/org.xerial/sqlite-jdbc/3.8.11.2)のお話です。

SQLite3には日付型（datetime型）がありませんので、文字列型（text型）で代用するのが一般的です。例えば2010年1月1日12時34分56秒は ``2010-01-01 12:34:56``という文字列で表現するわけです。しかし、Javaプログラムから使う場合、``String s = rs.getString("date");``とかで文字列を取り出してそこからJava側でDateに変換処理するのは面倒ですし、他のDBとの互換性等に鑑みても、やっぱり``rs.getTimestamp("date");``と書きたいところですよね。しかし、それは可能なんでしょうか。
結論を言うと、中途半端に可能です。

#SQLiteConfigクラスを利用する
``SQLiteConfig.setDateStringFormat()``というメソッドがあるのです。いい感じでしょ！こんなふうに使います。

```java
SQLiteConfig config = new SQLiteConfig();
config.setDateStringFormat("yyyy-MM-dd HH:mm:ss.SSS");
Connection conn = DriverManager.getConnection("jdbc:sqlite::memory:", config.toProperties());
```

秒の小数点以下部分が不要なら、``.SSS``を取り除いて``config.setDateStringFormat("yyyy-MM-dd HH:mm:ss");``としてもよいでしょう。

問題は、ここで指定したフォーマットが __getには適用されるがsetには適用されない__ ということです。

# getの場合
getの場合から見てみましょう。こんな感じです。

```java
ResultSet rs = stmt.executeQuery("SELECT * FROM tablewithdate");
while (rs.next()) {
	Date d = rs.getTimestamp("date");
	System.out.println(d);
}
```

結果は。。。

```
2010-01-01 12:34:56.0
```

こんな感じに出てきます。おお、いいじゃないですか。

# setの場合
問題はsetの場合です。

```java
long d = new Date().getTime(); // 現在日時

PreparedStatement ps = conn.prepareStatement("INSERT INTO tablewithdate VALUES (?)");
ps.setTimestamp(1, new Timestamp(d));
ps.executeUpdate();
```

うまく行きそうな気がしますよね。ところが実際のdate列を見ると。。。

```
1464452912370
```

Javaの日付時刻表現「1970年1月1日00:00:00 UTC からのミリ秒数」がそのまま文字列と化してINSERTされてしまうようです。がっかりですね。

# setの場合その２：これなら動く
エレガントに行くのはあきらめて、日付の文字列化に``java.text.SimpleDateFormat``を使います。

```java
long d = new Date().getTime(); // 現在日時

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
PreparedStatement ps = conn.prepareStatement("INSERT INTO tablewithdate values (?)");
ps.setString(1, df.format(new Date(d)));
ps.executeUpdate();
```

これなら通ります。なお、このサンプルはタイムゾーンを考慮しておりませんので、そのあたりは読者様にて別途格段のご配慮をお願いします（汗）。

# 考察
これはバグなんでしょうか。これが仕様なんでしょうか。
わかりませんが、注意して使うべき箇所であるようです。気に入らなければ、setDate, setTime, setTimestamp をオーバーライドするラッパーを作ってもいいかもしれません。
なお、繰り返になりますが、今回検証したバージョンは[SQLite JDBC Driver 3.8.11.2](http://mvnrepository.com/artifact/org.xerial/sqlite-jdbc/3.8.11.2) (Oct 03, 2015) です。

#リファレンス

SQLite JDBC Driver
https://github.com/xerial/sqlite-jdbc
eclipse + 自己ビルドopencv の環境構築

苦労したので備忘録で残す

0) opencvをcmakeの指定でCMAKE_INSTALL_PREFIX=/usr/local/opencvとしてインストール
1) 環境変数PKG_CONFIG_PATHに/usr/local/opencv/lib/pkgconfigを加える。
2) elicpseでC++プロジェクトを作成。(Project type は Hello World C++ project、Toolchainsは Linux GCC)
3) プロジェクトのプロパティGCC C++ Compiler -> Miscelleneousから"-ggdb \`pkg-config --cflags opencv\`"をOther flagsに追記してOKを押す(バッククオートを含む)
4) プロジェクトのプロパティGCC C++ Linker -> Miscelleneousから"\`pkg-config --libs opencv\`"をLinker flagsに入れてOKを押す(バッククオートを含む)
5) プロジェクトのプロパティGCC C++ LinkerのExpert settings Command line patternで${FLAGS}の順番を最後に変更

環境 ubuntu 14.04.4 LTS x86_64 + eclipse 4.5.2
KotlinMomentを使ってkotlinで日付を楽して扱う

# [KotlinMoment](https://github.com/mattak/KotlinMoment)とは
kotlinで面倒臭い日付処理を楽にしてくれるライブラリ

# 導入方法
`build.gradle`のdependenciesに追記

```groovy
dependencies {
    ....

    // KotlinMoment
    compile 'me.mattak:moment:0.0.4'
}
```

# 基本的な使い方
## 現在時刻の出力
```kotlin
val moment = Moment() // 引数に何も指定しなければ現在の日付が入る
Log.d("debug", "${moment}") // => 2016-05-29 01:15:01 GMT+09:00
```

## 指定した日付の出力
```kotlin
// Calenderでまず日付を指定する必要がある
val calendar = Calendar.getInstance()
calendar.set(2016, 4, 29, 0, 0, 0) //　月部分は 0~11で指定する必要がある
val timeZone = TimeZone.getDefault()
val locale = Locale.JAPAN

var moment = Moment(calendar.time, timeZone, locale)
Log.d("debug", "${moment}") // => 2016-05-29 00:00:00 GMT+09:00
```

## フォーマットを指定した出力
```kotlin
val format = moment.format("yyyy年MM月dd日 HH時mm分ss秒　タイムゾーン：ZZZZ")
Log.d("debug", "${format}") // => 2016年05月29日 01時15分01秒　タイムゾーン：GMT+09:00
```

## 単位ごとの出力
```kotlin
// 年
val year = moment.year
// 月
val month = moment.month // こっちは1~12の値で出力される仕様になっているので少し気持ち悪い
// 日
val day = moment.day
// 時
val hour = moment.hour
// 分
val minute = moment.minute
// 秒
val second = moment.second
// ミリ秒
val milliSecond = moment.millisecond
// 曜日
val weekdayName = moment.weekdayName
```

## 日付の加算/減算
```kotlin
// TimeUnitでどの単位に対して加算/減算するか指定できる
Log.d("debug", "${moment}") // => 2016-05-29 00:00:00 GMT+09:00
Log.d("debug", "${moment.add(1, TimeUnit.DAYS)}") // => 2016-05-30 00:00:00 GMT+09:00
Log.d("debug", "${moment1.subtract(1, TimeUnit.DAYS)}") // => 2016-05-28 00:00:00 GMT+09:00
```

## 日付の比較
```kotlin
val timeZone = TimeZone.getDefault()
val locale = Locale.JAPAN

val calendar = Calendar.getInstance()
calendar.set(2016, 4, 29, 0, 0, 0)
val date1 = calendar.time
calendar.set(2016, 4, 30, 0, 0, 0)
val date2 = calendar.time

val moment1 = Moment(date1, timeZone, locale)
val moment2 = Moment(date2, timeZone, locale)

if (moment1.compareTo(moment2) == 0) {
    // moment1とmoment2は同じ日付　(ミリ秒単位で)

} else if (moment1.compareTo(moment2) > 0) {
    // moment1はmoment2より進んでいる

} else if (moment1.compareTo(moment2) < 0) {
    // moment1はmoment2より遅れている (今回の例で言えばここに入る)

}
```

# おわりに
今回紹介したのは基本的な部分で、
他にも幾つか便利な機能があるようなので是非お試しあれ
PHAssetCollectionType早見表

# はじめに

iOS8から追加されたPhotos Frameworkについて、PHAssetCollectionType、PHAssetCollectionSubtypeの早見表をまとめます。

# 概要
 - Photos FrameworkではPHAssetCollectionType、さらにPHAssetCollectionSubtypeを指定して写真・動画のコレクションを取得します。
 - 例えば、カメラロール内の写真・動画を取得する場合、 以下のように指定します。
   1. PHAssetCollectionTypeに**PHAssetCollectionTypeSmartAlbum**を指定
   2. PHAssetCollectionSubtypeに**PHAssetCollectionSubtypeSmartAlbumUserLibrary**を指定

**カメラロールのコレクションを取得するサンプル**

```objc:Objective-C
 PHFetchResult *result = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum
                                                                   subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary
                                                                   options:nil];
```

```swift:Swift
let result = PHAssetCollection.fetchAssetCollections(with: .smartAlbum,
                                                     subtype: .any,
                                                     options: nil)
````

# PHAssetCollectionType

| PHAssetCollectionType           | 説明 | 対応OS |
|:--------------------------------|:------------------------------------------------------|:----------------|
| PHAssetCollectionTypeAlbum      | ユーザーが作成したアルバムとiTunes同期したアルバム（SubTypeでフィルタ）| iOS8以降 |   
| PHAssetCollectionTypeSmartAlbum | システムが作成したアルバム（SubTypeでフィルタ） | iOS8以降 |
| PHAssetCollectionTypeMoment     | 写真アプリ内のモーメント(日付と場所でフィルタ) | iOS8以降　|

# PHAssetCollectionSubtype

|PHAssetCollectionSubtype|説明|対応OS|
|:--|:--|:--|
|PHAssetCollectionSubtypeAlbumRegular |ユーザーが作成したアルバム| iOS8以降|
|PHAssetCollectionSubtypeAlbumSyncedEvent |iPhotoで同期したイベント|iOS8以降|
|PHAssetCollectionSubtypeAlbumSyncedFaces |iPhotoで同期した顔認識グループ|iOS8以降|
|PHAssetCollectionSubtypeAlbumSyncedAlbum  |iPhotoで同期したアルバム|  iOS8以降|
|PHAssetCollectionSubtypeAlbumImported |カメラや外部ストレージからインポートしたアルバム|  iOS8以降|     
|PHAssetCollectionSubtypeAlbumMyPhotoStream   |個人のiCloudフォトストリーム|iOS8以降|    
|PHAssetCollectionSubtypeAlbumCloudShared   |共有のiCloudフォトストリーム|iOS8以降|    
|PHAssetCollectionSubtypeSmartAlbumGeneric  |iPhotoから同期されたスマートアルバム| iOS8以降|   
|PHAssetCollectionSubtypeSmartAlbumPanoramas  | パノラマ写真|iOS8以降|  
|PHAssetCollectionSubtypeSmartAlbumVideos   | ビデオ | iOS8以降|
|PHAssetCollectionSubtypeSmartAlbumFavorites    | お気に入り|iOS8以降|
|PHAssetCollectionSubtypeSmartAlbumTimelapses  | タイムラプス |iOS8以降|
|PHAssetCollectionSubtypeSmartAlbumAllHidden  | 非表示にされた写真 |iOS8以降|
|PHAssetCollectionSubtypeSmartAlbumRecentlyAdded  |最近追加した項目 |iOS8以降|
|PHAssetCollectionSubtypeSmartAlbumBursts    | バースト写真 |iOS8以降|
|PHAssetCollectionSubtypeSmartAlbumSlomoVideos  | スローモーション動画|iOS8以降|
|PHAssetCollectionSubtypeSmartAlbumUserLibrary  | カメラロール |iOS8以降|
|PHAssetCollectionSubtypeSmartAlbumSelfPortraits  |セルフィー（自分撮り） |**iOS9以降**|
|PHAssetCollectionSubtypeSmartAlbumScreenshots  | スクリーンショット |**iOS9以降**|
|PHAssetCollectionSubtypeAny | すべて|iOS8以降|

# 公式ドキュメント
 - [Photos Framework Reference - PHAssetCollection Class Reference](https://developer.apple.com/library/ios/documentation/Photos/Reference/PHAssetCollection_Class/#//apple_ref/c/tdef/PHAssetCollectionType)
Golang+ginでフォームからPOSTされた情報を取得する話

メモ書き的な

``` server.go

func init() {
	loadTemplates()
}

func main() {

	server = gin.Default()
	
	server.Static("/public/css/", "./public/css")
	server.Static("/public/js/", "./public/js/")
	server.Static("/public/fonts/", "./public/fonts/")
	server.Static("/public/img/", "./public/img/")

	//様々なルーティングの省略

	server.POST("/signuped", SignupedRoute)

	server.Run(":3000")
}


func loadTemplates(){
	baseTemplate := "templates/layout/_base.html"
	templates = make(map[string]*template.Template)
	
	templates["signuped"] = template.Must(template.ParseFiles(baseTemplate, "templates/account/signuped.html",))
	
}


func SignupedRoute(g *gin.Context) {
	g.Request.ParseForm()
	fmt.Println(g.Request.Form["id"])

}
```

この状態で

``` signupHTML.html
<form  method="POST" action="./signuped">
        <h2 class="form-signin-heading">会員登録</h2>
        ユーザ名(20字以内)
        <input name="id" type="text" >        
        メールアドレス
        <input name="name" type="text" >

        <button class="btn btn-lg btn-primary btn-block" type="submit">Sign up</button>
    </form>

```
と定義したHTMLからsignupedに対してPOSTをすると
とりあえず、name="id"に入力した値が標準出力される。
Android初学者がパッケージ構成を考えた

Androidを本格的にやり始めて1ヶ月弱の初心者がAndroidBestPracticeやDroidKaigiの公式アプリのパッケージ構成や経験などを混ぜあわせて、Android Studioのパッケージ構成を考えましたのでメモ代わりに残します。

学び始めの方は、{アプリ名}/直下にすべてのファイルをぶち込んでいましたが、どんどん増えるにつれ手に負えなくなっていきました。

そこで他の人はどうやってるんだろうと思いつつGoogleのandroid-architectureみたり、Android Best Practiceなんか見たけどどれもバラバラで、結局は自分が好きなように構成しつつ、他人が見てもある程度分かる構成であれば良いんじゃね？という考えに至りました。

でこんな感じに

├─pojo
├─network
├─database
├─models
├─services
├─utils
├─fragments
└─views
　　├─adapter
　　├─notification
　　├─toolbar
　　└─widgets

上から順に、pojoはデータ受け渡しやJackson/Gsonなどで使うpojoを入れるパッケージ

networkはインターネットを使った通信。APIの呼び出しやネットワーク通信で使用するクラスを入れるパッケージ。

databaseはデータベース操作用のクラスを入れるパッケージ。

modelはMVCでいうM部分に当たる。

serviceはアプリがバックグラウンドになっている時に実行するクラスを入れるパッケージ。

utilsはmodelに入れるまでもない汎用的に使うクラスをいれるパッケージ。

fragmentは文字どうりFragmentを格納するパッケージ。

viewsの中には複数あり、ほとんど文字道理の名前です

adapterは文字どうり、Adapterを格納するパッケージ。

notificationも文字道理通知のクラスを入れるパッケージ。

toolbarは、上のアプリのタイトルが表示される部分(以前はActionBarと呼ばれていたらしい)に関するクラスを入れるパッケージ。

widgetは、ホームスクリーンに表示される部分の処理があるクラスを入れるパッケージ。




自分ののかでベースとなるパッケージ構成を決めるとだいぶ開発が楽になるので、Android開発を始めた初学者の方々は、パッケージ構成を考えてテンプレ化することをおすすめします。


あ、もちろん書いてる自分も初学者なのでマサカリ投擲お願いします。
リモートからmacのpostgresを接続するための設定

### pg_hba.conf 設定

接続できるIPアドレス範囲を追加
コマンド
`vi /usr/local/var/postgres/pg_hba.conf`
 
行追加
`host all all 192.168.1.0/24 trust` (CIDR address)

### postgresql.conf 設定
他のホストより接続可能へ変更
コマンド
`vi /usr/local/var/postgres/postgresql.conf`

行のコメントアウトを外し、修正
`listen_addresses='localhost'`

### DB再起動
普通は下記のコマンドです：
`pg_ctl  -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start`

が、macの自動起動ツールの影響で、うまく行けません。
`launchctl `コマンドを使って再起動必要があります：

`launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist `
`launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist `

参照
- 
[How Do I Enable remote access to PostgreSQL database server](http://www.cyberciti.biz/tips/postgres-allow-remote-access-tcp-connection.html)
Windows10環境でのAnaconda設定いろいろ


#Anacondaのインストール
公式サイトの[ここ](https://www.continuum.io/downloads)からダウンロードしてインストールするだけ。ダウンロードに時間がかかったり、失敗することもあるので注意。

#パッケージのアップデート
[ここ](http://oyamazemi.wiki.fc2.com/wiki/Anaconda%20%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88)が参考になります。
`conda update --all`でまとめてアップデート可能。
※注意※　`conda update --all`で入るバージョンと、例えば、`conda update numpy`などと、個別にパッケージをアップデートするとき、の最新バージョンは違っているのですね。依存関係とかなにかいろいろあるのでしょうか。個別に最新パッケージにしたところ、エラーに遭遇したりしているので、`conda update --all`で入るバージョンに留めるのが、無難なのかもしれません。

allすればconda自体もアップデートされます。

#パッケージの検索
通常のサーチ
`conda search -f （パッケージ名）`
とか

anaconda cloud（だれかがアップデートしたパッケージ）を検索する場合
`anaconda search -t conda （パッケージ名）`

よく使うコマンドについては、[チートシート(PDF)](http://know.continuum.io/rs/387-XNW-688/images/conda-cheatsheet.pdf)があります。チートシートがあればほかはいらない？
JFR（Java Flight Recorder）でJavaプログラムのプロファイルを取得する

Java Flight Recorderを使うことで、JVM、およびJavaアプリケーションのsleep、wait、ロック・コンテンション、I/O、GC、メソッドプロファイルといったイベント情報を収集することができます。Java 7 Update 40以降で標準搭載されています。
![JFR.png](https://qiita-image-store.s3.amazonaws.com/0/123138/7ee8d349-2705-7442-8b2c-6e55c8f90006.png)


詳細は、
https://docs.oracle.com/javase/jp/7/technotes/guides/jfr/toc.html

#JFRプロファイルの収集
JFRは商用の機能なので、-XX:+UnlockCommercialFeatures オプションも指定する必要があります。
`-XX:+UnlockCommercialFeatures -XX:+FlightRecorder`

##方法1. JAVA_TOOL_OPTIONSの設定
次の例は、60 秒の間にJavaアプリケーションが実行される場合、JFRの記録を開始し、それをmyRecording.jfr という名前のファイルに保存する方法を示しています。

```bash
set JAVA_TOOL_OPTIONS "-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=/tmp/myRecording.jfr"
```

##方法2. jcmd診断ツールによる起動
・JFRを有効にする：
`jcmd <プロセスID> VM.unlock_commercial_features`
・JFRの起動開始： 
 `jcmd <プロセスID> JFR.start duration=<監視時間（秒）> filename=<レコードファイル>`

実行例：

```bash
$ jcmd 9560 VM.unlock_commercial_features
$ jcmd 9560 JFR.start duration=60s filename=/tmp/myRecording.jfr
```

##方法3. javaコマンドのオプションに指定
次の例は、MyApp アプリケーションを実行し、すぐに 60 秒間の記録を開始し、それをmyRecording.jfr という名前のファイルに保存する方法を示しています。

```bash
$ java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=/tmp/myRecording.jfr MyApp
```

#JMC（Java Mission Control）で結果の確認
`%JAVA_HOME%\bin\jmc.exe`からJMC クライアントを起動し、JFRファイルを開くことで収集した結果をGUI上で確認できます。
![2016-05-31_094523.png](https://qiita-image-store.s3.amazonaws.com/0/123138/22c02369-595a-8da9-3095-d299d641415c.png)
カメラ画像を上下左右反転・引き延ばして表示する

最近はVR/AR界隈が特に盛り上がっていますが（自分の中で）、
VR/ARで使えそうな、出力画像を加工するシェーダーを作りました。
画像の上下左右反転、引き延ばし、曲面補正が可能です。
レースゲームのバックミラーなんかにも使えるんじゃないかと思います。

![スクリーンショット 2016-05-29 0.23.42.png](https://qiita-image-store.s3.amazonaws.com/0/59911/fdb69ae1-c62b-7055-070b-eaa0d596ba84.png)


```CorrectARCameraShader.shader
Shader "Unlit/CorrectARCameraShader"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "black" {}
		[Toggle] _FlipX("X Flip", Float) = 0
		[Toggle] _FlipY("Y Flip", Float) = 0
		_Brightness ("Brightness", Range (0, 2)) = 1
		_Strech ("Strech", Vector)=(1,1,0,0)
	}
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		LOD 100

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			struct v2f
			{
				float2 uv : TEXCOORD0;
				UNITY_FOG_COORDS(1)
				float4 vertex : SV_POSITION;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			float _FlipX;
			float _FlipY;
			float _Brightness;
			float4 _Strech;
			
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				if(_FlipX>0) o.uv.x = 1-o.uv.x;
				if(_FlipY>0) o.uv.y = 1-o.uv.y;
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				float2 duv = i.uv + float2(sin(i.uv.x*3.1416*2)*_Strech.z,sin(i.uv.y*3.1416*2)*_Strech.w);
				float2 stuv = 0.5+(duv-0.5)/_Strech.xy;
				// sample the texture
				fixed4 col = tex2D(_MainTex, stuv.xy);
				col.rgb *= _Brightness;
				return col;
			}
			ENDCG
		}
	}
}
```

Stretch はx/yが拡大率、z/wが曲面補正になっています。

実際に使用する際には、上記シェーダーを適用したマテリアルを作成し、
カメラに下記スクリプトをアタッチします

```CorrectARCamera.cs
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
[RequireComponent (typeof(Camera))]
public class CorrectARCamera : MonoBehaviour {
	public Material mat;

	void OnRenderImage(RenderTexture src, RenderTexture dest) {
		Graphics.Blit(src, dest, mat);
	}
}
```

![スクリーンショット 2016-05-28 23.49.43.png](https://qiita-image-store.s3.amazonaws.com/0/59911/89d74ff0-04b5-85c3-ec52-5fa786b83019.png)

![スクリーンショット 2016-05-28 23.45.04.png](https://qiita-image-store.s3.amazonaws.com/0/59911/1fcf6d8c-3756-caba-e04b-bd1eb9e39c7e.png)

それでは良いARライフを！

[関連]
[Fisheye shader](https://qiita.com/ELIXIR/items/f6e8ccf2d0b685c25709)
Scalaにおけるカリー化と型推論

Scalaにおいて型推論を利用する際にカリー化が利用されることを知ったので、まとめておきます。

## 型推論について
型推論とは静的型付け言語における言語機能であり、明示的に型を記述しなくてもコンパイラが自動的に型を決定してくれる機能です。  

```scala
val x = 100  // 型Intを指定しなくても、代入される値からコンパイラが変数xの型を自動で決定する
```

動的型付けとの違いに関しては、[動的型付けと型推論の違い](http://yng.hatenablog.jp/?entry=6653812171398572936)に書いたので参照してみてください。

## カリー化について
> カリー化 (currying, カリー化された=curried) とは、複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること（あるいはその関数のこと）である。
[カリー化 - Wikipedia](https://ja.wikipedia.org/wiki/カリー化)

カリー化とは複数の引数をとる関数があった場合に、その関数を**部分的に引数を受け取ることが出来る関数に変換すること**です。  
誤解される表現として部分適用という言葉がありますが、これはカリー化された関数の一部に引数を渡すことで部分的に引数が適用された関数を生成することです。
そのため部分適用を行う前段階がカリー化ということになります。

```scala
val add = (a:Int, b: Int) => a+b // カリー化されていない関数

val curriedAdd = (a:Int) => (b:Int) => a+b // カリー化された関数

val addOne = curriedAdd(1) // カリー化された関数に対して部分適用をすることで、新たな関数を生成

println( addOne(2) ) // 3が出力される
```

## カリー化による型推論
下記のようなカリー化されていない関数に対して関数fを無名関数として渡す場合は、引数の型を指定する必要があります。

```scala
def dropWhile[A](l: List[A], f: A => Boolean): List[A]

val list: List[Int] = List(1, 2, 3, 4, 5)
val result = dropWhile(list, (x: Int) => x < 4))
```

もし引数の型を指定せずに実行した場合は、`missing parameter type`というエラーが発生します。

```scala
val list: List[Int] = List(1,2,3,4,5)
val result = dropWhile(list, x => x < 4))
```

dropWhileの第1引数`list`はList[Int]であるので、第2引数`x`の型がIntであることは明らかです。そのため無名関数fの`x`の型を示すのは、少し不自然に感じます。
この問題を解決するには、dropWhileが引数を部分的に受け取るようにする（**カリー化**）ことで、Scalaは`x`の型を推論できるようになります。

```scala
def dropWhile[A](l: List[A])(f: A => Boolean): List[A]  // dropWhileをカリー化する

val list: List[Int] = List(1, 2, 3, 4, 5)
val result = dropWhile(list)(x => x < 4)  // 型推論が可能となり、型の指定が必要なくなる
```

カリー化されたdropWhileの呼び出しでは、最初にdropWhile(list)が関数fを引数として受け取る関数を返します。この関数は最初に渡された引数`list`の型List[Int]により、型パラメーターAがIntとして解釈されます。
そのため無名関数fを引数として渡す際に`x`の型をコンパイラが推論可能となり型を省略して記述することが可能となります。

## 他の関数型言語について
上記のカリー化と型推論の話はScalaにおける話であり、関数型言語共通の話では無いようです。

> Haskell や OCaml といった他の関数型言語では、完全な推論が提供されるため、型アノテーションが必要になるケースはほぼ存在しない。
> 
> Scala関数型デザイン＆プログラミング ―Scalazコントリビューターによる関数型徹底ガイド

## 参考文献
Scala関数型デザイン＆プログラミング ―Scalazコントリビューターによる関数型徹底ガイド
http://book.impress.co.jp/books/1114101091
play2.5.3 + slick 3.1 skelton app

https://github.com/rikima/SlickSample2

- play2.5.3でmysqlをdb, ormにslickを使ったweb appのスケルトン app
- 最初に自前daoでevolution経由で tableを作成
- その後、 code generatorで生成したTables.scalaを利用

```build.sbt
import AssemblyKeys._ //一番最初の行に書く

assemblySettings

name:= """SlickSample2"""

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.11.7"

libraryDependencies ++= Seq(
  //jdbc,
  cache,
  ws,
  "org.scalatestplus.play" %% "scalatestplus-play" % "1.5.1" % Test
)

resolvers += "scalaz-bintray" at "http://dl.bintray.com/scalaz/releases"

libraryDependencies += "com.typesafe.play" % "play-slick_2.11" % "2.0.2"
libraryDependencies += "com.typesafe.play" % "play-slick-evolutions_2.11" % "2.0.2"
libraryDependencies += "org.webjars" % "webjars-play_2.11" % "2.5.0-2"
libraryDependencies += "com.typesafe.slick" % "slick-codegen_2.11" % "3.1.1"
```

- slick関係をdepに指定
- mysql jdbc driverは./libに配置
- slick-codegenを使うために depに指定
- assemblyを生成用の設定を追加


```SchemaGenerator.scala
import java.io.File

import org.junit.Test

class SchemaGenerator {

  @Test
  def testCodeGenerate() {
    val cur = new File(".")
    println(cur.getAbsolutePath)

    val slickDriver = "slick.driver.MySQLDriver"
    val jdbcDriver = "com.mysql.jdbc.Driver"
    val url = "jdbc:mysql://localhost/slick_sample2"
    val outputFolder = "./app"
    val user = "root"
    val password = ""
    val pkg = "models"

    slick.codegen.SourceCodeGenerator.main(
      Array(slickDriver, jdbcDriver, url, outputFolder, pkg, user, password)
    )
  }
}
```

- 既存のtable用のscala codeをgenerateする例
- dbにあるtable用のscala object, classを自動生成してくれる
- main関数をjunitで呼び出して生成している。
- intelli jの"."は .idea/modules以下になる。
2chmateでしたらば掲示板のdatをjaneからインポートする方法

2chのdatをインポートする方法と同じ手順じゃ駄目。2chmateのバージョンは0.8.9.6 2016-04-11 版。

http://jbbs.shitaraba.net/bbs/read.cgi/internet/20196/1462718832/ というスレのインポートをする時を例にする。

まずdatのファイル名は`jbbs.livedoor.jp%2Finternet%2F20196_1462718832.dat`となる。ホストが決め打ちになってるらしく、jbbs.shitaraba.netではなくjbbs.livedoor.jpで書く点に注意

sqliteのファイルのレコードのname属性も`jbbs.livedoor.jp%2Finternet%2F20196`と書く。

そしてdatの中身も書き換える必要がある

```text
openJane
名無しさん<>sage<>2016/03/05(土) 02:59:09<>body<>スレタイ
名無しさん<>sage<>2016/03/06(日) 05:06:39<>body<>

2chMate
1<>名無しさん<>sage<>2016/03/05(土) 02:59:09<>body<>スレタイ<>
2<>名無しさん<>sage<>2016/03/06(日) 05:06:39<>body<><>
```

一行づつ`<>`で囲って、囲った後から行の頭に行番号を入れる。

最後に、ファイルの文字コードはeuc-jpにする。jane系はsjisになってるはず。

これで無事したらばのdatをJaneXenoから2chMateに移植出来ました。

改行コードはJaneもMateもLFっぽい。プログラム的にやるとCRLFになる事もあるから注意
何が分からないのか分からないという思考停止 あるいは教える側の教わる側に対する立ち位置

新卒でも同期でも中途でも何でも良いが、誰かに物を教えるときに、教える側は絶対に「君が何が分からないのか、私には分からない」とは言ってはならないというお話。

この言葉は言ってしまった側が思っている以上に受け取り側である教わる側の心を深く傷つけると思います。

この言葉を発する裏には、実は教える側の立場の勘違いがあると言えます。本来、教える側は教わる側の分からないことを明確化し、分かることへの手助けをする存在です。

しかし「君が何を分かっていないのか、私には分からない」と発するとき、この立場を忘れ、「Aが分からないのですが」の質問に対して「Aを実現するにはBが必要です」と答える正論返答マンになっている可能性があります(もちろん、正論返答マンが正しい状態もあります)。

「君が何が分からないのか、私には分からない」と言われたとき、どんな気持ちになるのか、私の実体験を交えて紹介します。

## 実体験

大学の実験の授業にて、FPGAを使ってある回路を実装していました。ただ私はどうても課題として与えられた回路を実装することができず、少し居残りをしていました。

ちょうどその時、実装の終わった友人も付き合ってくれて、教わりながら課題を解いていました。彼は非常に良い人で、頭の悪い私に理解をさせようと色々と教えてくれるのですが、残念ながら私はその話が理解できず、手が止まってしまいました。

そんな私を見た彼が一言「お前が何が分からないのか、俺には分からない」と。

結局、その日は煮詰まってしまって帰宅。後日、別の本を読んだりしてどうにかレポートは提出しました。

レポートは提出したものの、頑張って教えようとしてくれた彼の期待に沿えないと思った私は、自己嫌悪に陥ってプチ引きこもり状態に。教えてくれようとした人に見放されるくらい自分はダメなんだなと思って、学校がイヤになりました。

## どうするべきだったのか

上記の実体験は学生でお互いに未熟だった頃のことですし、彼も純粋に善意で付き合ってくれただけなので、今どうこう言う物ではありません。

しかし、今、あるいは今後私が人に物を教える立場となったとき、私と同じように自己嫌悪に陥ってもらいたくは無いものです。そこで、どうするべきだったのかを考えてみます。

そもそも、仕事においても物を教えるとは何でしょうか。教える側が教わる側に期待をすることは、「自分で考えて、課題を解決できるようになる」ではないでしょうか。

つまり、教える側の仕事は課題Aに対して解決方法Bを提示することではなく、教わる側が解決方法Bを発見し、今後も課題Aに似たA'やA''、またはぜんぜん違う課題Zを解決できるように導くことです。

そのためにはどうすればいいでしょうか。先ほどの私の実体験を例に考えてみます。

「FPGAを使ってある論理回路を実装しなさい」と言う課題が与えられたとき、理解しなければならないことは

 - 実現したい論理回路の振る舞いがどういう物なのか
 - 論理回路を実装するために利用できるゲートがどういう物であるのか
 - ゲート組み合わせることのできるFPGAがどういう物なのか

と言ったところでしょうか。当時の私は多分、「実現したい論理回路」がどういう物なのか分かっていなかったし、更に「ゲートがどういう物なのか」もまた分かっていなかったのだと思います。

こういった課題に対して更に解決しなければならない課題を明確化し、1つずつ解決していく必要があります。そして、教える側は課題を発見するための手助けをしてあげるべきです。

## 教わる側も教える側も

「君が何が分からないのか、私には分からない」と思った時、教わる側も「自分が何が分からないのか、分からない」状態に陥っています。

教える側はできるだけこの言葉を使わないようにするべきです。教わる側の人はこの言葉を受け取ると、「見放された」とか「愛想をつかされてしまった」と感じてしまう恐れがあります。

教わる側は自分が何が分かっていないのかをはっきりとすることに努めましょう。そして残念なことに「君が何が分からないのか、私には分からない」と言ってくる人はこの世界に沢山います。あまり気にしないように、なんて軽い言葉ですが、とりあえず「あ、今、自分が何が分かってないのか分かってない状態に陥ってるかもしれない！」と思うためのトリガーにしておくことができるようになると良いのかもしれないです。

## まとめ

教える側の仕事は課題Aに対して解決策Bを提示することではありません。教わる側が解決策Bを発見できるように導くことが仕事です。

そして「君が何が分からないのか、私には分からない」はこの仕事を放棄した発言でもあり、教わる側の心を傷つけます。
NSObjectにRuby, Underscoreライクなtapのextension実装


こちらの記事

Viewの初期化を末尾closureで与えて見やすくするためのextension
http://qiita.com/gamako/items/c83d4eeacda6c11a77ef

で教えてもらったライブラリDollar( https://github.com/ankurp/Dollar )の `$.tap(function)`というメソッド。

オブジェクトを引数にとれるfunctionを与えると、functionを実行して、そのオブジェクトを返してくれます。
初期化スコープの他にも、メソッドチェインに処理を挟みたいときに強力そうです。

元はunderscore.jsやLo-Dash由来だそうですが、どうやらさらに祖先はRubyのようです。
（さらにオリジナルがいるのかはわからず、、、）


Dollarライブラリは、すべて`$`クラスのクラスメソッドとして実装するポリシーの
ようなのですが、extensionで実装されたほうが便利そうなので、実装を考えてみました。

extensionはこちら



```swift
protocol Tappable : class {
}

extension Tappable where Self : NSObject {
    
    func tap(@noescape function: (Self) -> ()) -> Self {
        function(self)
        return self
    }
}

extension NSObject : Tappable {}
extension UIView : Tappable {}

```

使い方

UIViewの初期化時に使えます

```swift
let textLabel = UILabel().tap {
    $0.text = "タイトル"
}

```

ただし、NSObject系にしか使えませんので、他のクラスに使用したい場合は`extension NSObject : Tappable {}`を書いてもらう必要があります。

また、iOSターゲットだと、viewのtapメソッドというのは紛らわしいネーミングではあります。
【PowerShell】自作のコマンドレットをPowerShellで使用できるようにするまでの流れ

1. PowerShellを立ち上げ、`$Env:PSModulePath`と入力して実行する。
2. `;`区切りで複数のパスが表示される。どこに自作コマンドレットを置くかを決める。無難なのはC:\Users\XXXX\Documents\WindowsPowerShell\Modules（XXXXはユーザー名）あたり。
3. C:\Users\XXXX\Documents\WindowsPowerShell\Modulesフォルダが存在しなければ作成する。
4. ModulesフォルダにYYYYフォルダを作成する。
5. 自作コマンドレットを記述した.psm1ファイルを、YYYY.psm1という名前でYYYYフォルダに保存する。重要なのは、フォルダ名と拡張子を取り除いたファイル名を一致させること。
6. 立ち上げているPowerShellで`Remove-Module *`を実行する。

上記手順を踏むことで、YYYY.psm1に記述された自作コマンドレットが使用できるようになる。
bashでMySQL操作を行う #エクスペクト・パトローナム編

![](http://images.ciatr.jp/2015/05/74fc357ed34092835eb6531bddac0ce2.jpg)
引用: dailynewsagency.com

# 概要
- やりたいこと
    - 下記の内容を自動化したい
        - 複数のDBに対してSQLクエリを発行
            - 実行結果の標準出力

# アプローチ
- bashでMySQLコマンドを実行し、終了ステータスコードを取得
    - 終了ステータスコードが０以外はそこで終了
    - 終了ステータスコードが０の場合は処理続行

# 結果
- エクスペクト・パトローナム！！

```bash
#!/bin/bash

command=(
"mysql -u 'user' '-ppassword' -h 'rds-host01.com' 'database01' < 'sample.sql'"
"mysql -u 'user' '-ppassword' -h 'rds-host02.com' 'database02' < 'sample.sql'"
"mysql -u 'user' '-ppassword' -h 'rds-host01.com' 'database03' < 'sample.sql'"
"mysql -u 'user' '-ppassword' -h 'rds-host02.com' 'database04' < 'sample.sql'"
"mysql -u 'user' '-ppassword' -h 'rds-host01.com' 'database05' < 'sample.sql'"
)

for i in "${command[@]}"
do
  eval ${i}
  rc=$?
  if [ $rc -ne 0 ]; then
    echo "error =======> ######## $i ###########"
    exit 1
  fi
done

echo ""
echo "##########  success  ##########"
echo ""
```
ExcelからPythonを実行する



xlwingsを使って今度はExcel-VBAからPythonを実行して、python上でExcelファイルを操作してみる。

VBAでいいじゃんという話もあるだろうが、VBA書きたくないんだから仕方ないじゃないw

xlwingsの使い方は[Python(Xlwings)を使ってExcelを操作してみる](http://qiita.com/katzhide/items/8e37f4077950f7d6e7e2)に書いたので良かったら参照。

ちなみに環境はMacですが、Windowsでもxlwingsは動きます。

## 公式ドキュメント

[VBA: Calling Python from Excel](http://docs.xlwings.org/en/stable/vba.html#vba)


## 手順

### 概要

* 実行したいpythonスクリプトを用意
* pythonを呼ぶマクロを登録
* xlswings vba moduleをexcleファイルにインポート
* 実行

### 実行したいpythonスクリプトを用意

なんでもいいけど、Excelファイルに適当に値を設定するスクリプトを用意してみる。

```py
from xlwings import Workbook, Range

def myfunction():
    wb = Workbook.caller()
    Range('A1').value = "Call Python!"

```

### pythonを呼ぶマクロを登録

Excelファイルを新規作成して、Alt + F11でエディタ開いて、マクロを登録

```vba
Sub SampleCall()
    RunPython ("import myproject;myproject.myfunction()")
End Sub

```
ここの`myproject`がpythonのスクリプト名。

`myfunction`が実行したい関数。

### xlswings vba moduleをExcelファイルにインポート
`xlwings.bas`というVBAモジュールをファイルにインポートする必要がある。

`xlwings.bas`はインストールしたxlwignsディレクトリに入っている。

パスを調べたい場合、Python Consoleで簡単に調べられる

```py
import xlwings
xlwings.__path__
```

### 実行
適当なオブジェクトに作成したマクロ`SampleCall()`を登録して、実行すれば完了。


## エラーが出た場合
Macの場合、xlswings vba moduleでは`.bash_profile`を読み込みんでpythonのパスを設定するみたい。

bash使っている人なら設定されているだろうから問題ないだろうけど、自分みたいにzsh使っている場合は`.bash_profile`を用意していないので以下のようなエラーが出る。

```
importError: No module named xlwings
```

bash_profileを作るか、zshrcを読み込むように`xlwings.bas`を書き換えてあげる。
書き換える場合は、下の`.bash_profile`を`.zshrc`に書き換えるだけでいい。

```vba
    'Check if .bash_profile is existing and source it
    Res = system("source ~/.bash_profile")
    If Res = 0 Then
        Res = system("source ~/.bash_profile;" & RunCommand & """" & WORKBOOK_FULLNAME & """ ""from_xl""" & " " & Chr(34) & ToPosixPath(Application.Path) & "/" & Application.Name & Chr(34) & ">" & Chr(34) & LOG_FILE & Chr(34) & " 2>&1 &")
    Else
        Res = system(RunCommand & """" & WORKBOOK_FULLNAME & """ ""from_xl""" & " " & Chr(34) & ToPosixPath(Application.Path) & "/" & Application.Name & Chr(34) & ">" & Chr(34) & LOG_FILE & Chr(34) & " 2>&1 &")
    End If
```

## Tips

いちいち`xlwings.bas`をインポートするのがめんどくさい場合は
コンソールで以下のコマンドを実行すれば、インポート済みのExcelファイルと呼び出されるpythonスクリプトを生成してくれる。

```sh
xlwings quickstart myproject
```
ここまでのまとめ [TensorFlowでDeep Learning(10]

([目次はこちら](http://qiita.com/kumonkumon/items/6fd05963df92e9eec8c0))

#ここまでのまとめ
[TensorFlowでDeep Neural Networks (1)〜(9)](http://qiita.com/kumonkumon/items/6fd05963df92e9eec8c0) で、
ロジスティック回帰 → 多項ロジスティック回帰 → 多層パーセプトロン → 固定フィルタ畳み込みニューラルネットワーク → 畳み込みニューラルネットワーク
と、発展させてきました。

Convolutional Neural Networks / Deep Learningってよく聞くので、気になって最初からそれ自身を調べ始めるといろいろな数学的な事前知識がないと理解が進まない壁に直面しますが、結局は、各所でよく見る、

![neuron](https://qiita-image-store.s3.amazonaws.com/0/127038/7dd15806-160d-29c1-8671-d65ed86ea66a.png)

```math
y = f\Biggl(\sum_{i=1}^n w_i x_i + b \Biggr)
```

を理解して、上記ステップを踏めばそれなりに理解できるわけです。

実装面では、ニューラルネットワークの最適化を自分で実装するなんてことは、まずやらなくていいので、非常に敷居は低いと思います。今回は、TensorFlowを使いましたが、Caffeなどを使っても実装難易度的には、ほぼ同じような感じかと思います。こういったライブラリのおかげで、簡単にニューラルネットワークのモデルをいじって試せるのは本当に良い世の中だと思います。

また、実行環境についてもAWSやGCPのおかげで非常に楽に試せます。私は、EC2(AWS)のc4.2xlarge(vCPU: 8, Mem: 15GB) 〜 c4.8xlarge(vCPU: 32, Mem: 60GB)を使っていますが、スポットインスタンスだと、c4.2xlargeの場合で、10円/hourくらいで使えたりします。（たまに跳ね上がりますが。。）私は未だにMacBookPro late 2011なんですが、AWSがあるのであまり困りません。

ちなみに、まともにCNNをやるなら、GPUは必須だと思います。c4.2xlargeでやっていたものをg2.2xlargeで試すと、7倍くらい早くなりました。人手で決めるパラメータもわりとあるので、試行錯誤やるには処理速度が早いに越したことないですから。

ってことで、[次回の記事](http://qiita.com/kumonkumon/items/57bd2a7eb0aa0b17fcd7)では、インスタンス別の速度比較してみようかと思います。
Haskell Servant 入門 (Loggerの導入)

# Logging for Haskell Servant with wai-logger

## 概要
Servantのチュートリアルと同じ設定(デフォルト)ではWebリクエストに対するレスポンスのログが一切表示されません。これでは動作テストをしようにも問題が特定できず困ってしまいます。Loggerを適切に設定すればリクエストに対するログを標準出力やファイルに吐き出すことができます。

以下、ServantにLoggerを導入する方法の1つを紹介します。
本記事のソースコードは以下のリポジトリにおいてあります。
https://github.com/algas/haskell-servant-cookbook

## 標準出力にログを吐く

前回の記事(ログ出力なし)では、サーバを起動するために `run` 関数 (Network.Wai.Handler.Warp) を使いました。

```hs
-- run :: Port -> Application -> IO ()
run 8080 app
```

今回(ログ出力あり)は `runSettings` (Network.Wai.Handler.Warp) を `withStdoutLogger` (Network.Wai.Logger) とともに使用しています。

```hs
-- withStdoutLogger :: (ApacheLogger -> IO a) -> IO a
-- setLogger :: (Request -> Status -> Maybe Integer -> IO ()) -> Settings -> Settings
-- type ApacheLogger = Request -> Status -> Maybe Integer -> IO ()
-- runSettings :: Settings -> Application -> IO ()
main = do
    withStdoutLogger $ \aplogger -> do
        let settings = setPort 8080 $ setLogger aplogger defaultSettings
        runSettings settings app
```

## 動作確認

```bash
$ stack exec logger
127.0.0.1 - - [25/May/2016:16:20:01 +0900] "GET / HTTP/1.1" 200 - "" "curl/7.43.0"
```

```bash
$ curl http://localhost:8080
```

curl などのクライアントからサーバにアクセスすると、
標準出力にリクエストのログが吐かれていることが確認できます。

## ソースコード
```hs:logger/Main.hs
{-# LANGUAGE DataKinds         #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators     #-}
module Main where

import           Data.Text                (Text)
import           Network.Wai
import           Network.Wai.Handler.Warp
import           Network.Wai.Logger       (withStdoutLogger)
import           Servant
import           Servant.API

type SimpleAPI  = Get '[PlainText] Text

simpleApi :: Proxy SimpleAPI
simpleApi = Proxy

server :: Server SimpleAPI
server = return "Simple"

app :: Application
app = serve simpleApi server

main :: IO ()
main = do
    withStdoutLogger $ \aplogger -> do
        let settings = setPort 8080 $ setLogger aplogger defaultSettings
        runSettings settings app
```
```hs:haskell-servant-cookbook.cabal
executable logger
  hs-source-dirs:      logger
  main-is:             Main.hs
  ghc-options:         -threaded -rtsopts -with-rtsopts=-N
  build-depends:       base
                     , text
                     , aeson
                     , wai
                     , wai-logger
                     , warp
                     , servant
                     , servant-server
                     , haskell-servant-cookbook
  default-language:    Haskell2010
```

## 参考記事

http://www.parsonsmatt.org/2015/05/02/scotty_and_persistent.html
http://qiita.com/lotz/items/c357a41d4432942d8054