OmniAICreator/Qiita-1.07M huggingface dataset:
Universal Windows Platform Bridge for iOSを現地でビルドしてみた

## Universal Windows Platform Bridge for iOSを現地でビルドしてみた ##

![](http://quickpress.blob.core.windows.net/kzmx/2015/05/20150428_215620975_iOS-e1430857437281.jpg)

キーノートで話題になったiOS対応について、現地からの報告ってことで、まとめは [ブチ雑記](https://buchizo.wordpress.com/2015/04/30/build-day-1-keynote/)の方がとってもよくまとまっているので、そっちでも見てください。

##  Project island wood ##

![](http://quickpress.blob.core.windows.net/kzmx/2015/05/20150430_092545000_iOS.jpg)

[https://projectipreviewsignup.windows.com/](Project islandwoodのサイト)

見てのとおり、**iOS向けに作られたアプリをWindows Universal Appにしてしまうもの**と思ってもらえればOKです。
具体的には、iOS SDKと互換性があるブリッジライブラリそのものを提供してしまえって発想ですね。

現在はプレビューが可能ですので、興味がある方は申し込んで、是非改善要望などしてもらえるといいかと思います。

## 互換性の程度や完成度 ##

![](http://quickpress.blob.core.windows.net/kzmx/2015/05/20150501_180816519_iOS-e1430857551806.jpg)

実際にブースで触らせてもらいましたが、面白いくらいに普通に動いていました。

Objective-Cで開発されたXCodeのプロジェクトを固めたものを、Windows環境へもってきて、展開後、VisualStudioにインポートします。
あとはそのまま、ビルドするだけ。
特に何もしていませんし、現時点ではちょっとマクロで回避しているところがありましたが、この辺りはいずれ改善されるでしょう。

## 実際に動作させてみた感じ ##

![](http://quickpress.blob.core.windows.net/kzmx/2015/05/20150501_181119872_iOS-e1430857504291.jpg)

動いている様子は見てのとおりです。
いわゆる、TABBarアプリケーションで、UIScrollViewとUIImageをグリッドに並べる感じのアプリケーションです。さすがにしばらく書いてないので、オブジェクト名を忘れ気味・・・。

また、各サムネイル画像をタップすると画面が遷移して、フルスクリーンのUIImageが表示される感じになります。

ビルドするとWindows 10を入れたPCにアプリとして、普通に動作しました。よほど、特殊な事をしていない一般的なiOSアプリであれば、ほぼ動くと思われます。

### ブレークポイントを仕込んでみた ###

![](http://quickpress.blob.core.windows.net/kzmx/2015/05/20150501_181320095_iOS-e1430857477219.jpg)

試しにviewDidLoadでブレークポイントを仕込み、ステップ実行もデバッグもバッチリでした、現時点では変数の一覧表示などやイミディエイトウィンドウは、今からなんだわって会話していました。

既にある程度Intelisenseが動いているような挙動をしており、今後プロトコルやデリゲートメソッドなども便利に補完してくれる感じになるだろうと思っています。今後に期待したいですね。
docker-machine + azure

dockerが話題なようですがよく知らないのでメモしておきます。このメモでは、docker-machineとazureを使ってdockerホストを操作した記録を残します。



dockerホストをいじるツールには、boot2dockerというものがあるそうなのですが、代わりに（？）docker-machineというのを使いました。これは、boot2dockerでほぼ必ず利用するVirtualBox以外にもazureやVmwareを選べるからです。


# docker-machine + azure
docker-machineとは、dockerホストを作成するツールです。
コマンド一つで簡単にdockerホストを作成できてしまいます。
(2015-5-6現在ではベータ版だそうです。)

azure上に仮想マシンを作成して、それをdockerホストとして利用できるようなので試してみました。
手元のPCにVirtualBoxを持たなくてもいいってことなんですかね。

# 作成してみる
## Azureサブスクリプション関連
サブスクリプションIDの確認とcertファイルを用意を行います。

今日はMacから操作したい気分なので、[Azure クロス プラットフォーム コマンドラインツール](http://azure.microsoft.com/ja-jp/documentation/articles/xplat-cli/)を使いました。

```bash
$ azure account list # サブスクリプションIDの確認
$ azure account cert export # certファイルの作成
```

## dockerマシン作成
docker-machineのコマンドを用います。これはbrewから事前にインストールしておきました。

```bash
# 各引数は下記に説明します
$ docker-machine create -d azure --azure-subscription-id=“サブスクリプションID” --azure-subscription-cert=生成されたcertファイル.pem --azure-location "Japan East" dockerホスト名
```
* driverとしてazureを選択。
* サブスクリプションIDとサブスクリプションのcertを指定。
* 追加オプションとしてJapan Eastを選択。
* 最後に、dockerホスト名を指定。

dockerホスト名はazure上のコンピュータ名になるので、ダブらないように気をつけます。

## 作成後の確認
作成されたdockerホストが表示されていれば、成功です。

```bash
$ azure vm list
$ docker-machine ls
```

# 何か動かしてみる
dockerホスト内にnginxのコンテナを作って動かしてみようと思います。

```bash
$ eval "$(docker-machine env dockerホスト名)"
$ docker run -d -P --name web nginx
$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                                           NAMES
e35a71b72047        nginx:latest        "nginx -g 'daemon of   8 seconds ago       Up 7 seconds        0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp   web
$ docker port web
443/tcp -> 0.0.0.0:32768
80/tcp -> 0.0.0.0:32769
```

webを立ち上げたのでブラウザから確認したのですが、表示できませんでした。
ポート80やポート443へアクセスするには、32768と32769が必要なようです。それには、azureのエンドポイント設定が必要そうです。。コンテナを設置してデタラメに決まるポート番号のために毎回設定しなければならないのでしょうか。。

とりあえず、、dockerホスト内から確認して満足しておきます😓。

```bash
$ docker-machine ssh
$ w3m http://localhost:32769
$ exit
```

ちゃんとwebが動いていて、ページが表示されました。

# さいごに、止めて消す
不要となったdockerホストを停止して削除します。

```bash
$ docker-machine ls # Runningのステータスになっている
$ docker-machine stop dockerホスト名 # 止める
$ docker-machine ls # Stoppedのステータスになった
$ azure vm list # StoppedVMのステータスになった
```

ちゃんと停止しました。

```bash
$ docker-machine rm dockerホスト名 # 消す
$ azure vm list # 一覧に含まれないことを確認
```

ちゃんと削除されました。

# 参考
* [Azure ポータルでの Docker VM 拡張機能の使用](http://azure.microsoft.com/ja-jp/documentation/articles/virtual-machines-docker-with-portal/)
* [Docker Machine](https://docs.docker.com/machine/#microsoft-azure)
* [Mac OS X](https://docs.docker.com/installation/mac/)
  ←boot2dockerの説明ですが、webコンテナの作成など参考にしました。
Ansibleでntp設定するとき、ntp role は benno joy の ntp role ではなく、resmo の ntp role を使う方が良い。

Ansibleでntp設定しようと思って Ansible Galaxy から適当な role を探したところ、benno joy の ntp role が堅そうだったので入れてみた。Ansible stuffと書いてあったし。

一応ちゃんと動いたんだけど、ntpq -pがうまく動かない。。

理由は ntp.conf の restrict に IPv6 の localhost (::1) が入っていなかったから。

benno joy ntp role の issue では今年の1月に指摘が上がってたが、放置されているみたい。対策としては、Playbookの設定で restrict を入れれば良いだけではあるものの、面倒なので違う role を探した。

いまのところ resmo の ntp role を使っていて、とりあえず大丈夫そう。
ドキュメントもうちょっと欲しいけどねぇ。
rails_wardenをcontroller以外から呼び出す

## 概要

Railsで認証を行う場合、代表的なものとしてDeviseやWardenといったgemが存在する。

- Devise
    - 登録、セッション管理のバックエンドだけではなくmodelやviewも用意されているフルスタックなgem
- Warden
    - セッション管理のみを行う非常にシンプルなgem

APIサーバを作る場合など、viewが必要無い場合Deviseは機能が過剰である。
そういう場合はWardenを使ったほうが必要十分で良いと思う。

Wardenでは、Rails用にrails_wardenというgemが用意されている。
rails_wardenでは、wardenの認証をcontrollerから呼び出せるようにmoduleがmixinされている。

controllerをで普通に実装する場合は非常に便利であるが、json_rpcサーバーを作る場合など、別の場所で認証したい場合、自分で使えるように設定する必要がある。

色々と試行錯誤した結果、後述のように設定することで使えるようになった。

## 基本設定

githubに書かれている設定を行う
https://github.com/hassox/rails_warden

## controller以外で認証する設定

app/processorを作り、processorから認証を行う場合、ベースクラスで以下のように設定する。

```rb
class ApplicationProessor

    # 関連moduleをmixinする
    include Warden::Mixins::Common
    include RailsWarden::Mixins::HelperMethods
    include RailsWarden::Mixins::ControllerOnlyMethods

    # controllerからenvを渡してattr_accessorにセットする
    attr_accessor :env

    def initialize(env)
        self.env = env
    end
```

以上の設定で、controllerと同様にwardenを呼び出す事ができる
多くの賢い人がビットコインを学ばず後悔するというよくある話

以下に移行しました<br><a href="http://block-chain.jp/tech/lets-learn-bitcoin/" title="多くの賢い人がビットコインを学ばず後悔するというよくある話">多くの賢い人がビットコインを学ばず後悔するというよくある話</a>
UniRxのシンプルなサンプル その8(ObservableWWW.Get ダウンロード)

[UniRxのシンプルなサンプルの取扱説明書](http://qiita.com/Marimoiro/items/b0c66c6c22cf58bde049)
[前(完了の通知)]
(http://qiita.com/Marimoiro/items/31cad556e1675c557be3)
[次(TimerとInterval 一定時間後に実行)](http://qiita.com/Marimoiro/items/a72b60315c797c19a27c)

# ファイルをダウンロードする #
そろそろ使えるTipsをお届けしたいので今回はHTMLをダウンロードしてみます。
ファイルのダウンロードとかもうそれこそ明らかにRxの得意分野ですからね。

ついでに進行状況もとっちゃいます。
今回少し長いです。

## 前準備 ##
そろそろ特別な状況でない限りSSなしです。
WWWというGameObjectにWWWSample.csというスクリプトを貼り付けておきます。

## ダウンロード ##
WWWのダウンロード周りを担ってくれるのがObservableWWW.Getメソッドです。
今回はとりあえず一つのファイルをとってきます。

完了したらゲームオブジェクトを青にして
デバッグログにタイトルを表示します。

ついでにDLの進行状況も取得しちゃいます。

ソースコードは以下のとおり

```csharp:WWWSample.cs
using UnityEngine;
using System.Collections;
using UniRx;
using UniRx.Triggers;
using System;

public class WWWSample : MonoBehaviour {

	// Use this for initialization
    void Start()
    {
        //DLの進行度をプッシュしてくれるObservable
        ScheduledNotifier<float> progress = new ScheduledNotifier<float>();
        var watcher = progress.Subscribe(prog => Debug.Log(prog));//進行度の表示
        
        //ダウンロード
        var getter = ObservableWWW.Get("https://example.com/", null, progress)
            .Subscribe(body =>
        {
            //完了したら青に
            GetComponent<SpriteRenderer>().color = Color.blue;
            //タイトルを表示
            Debug.Log(body.Split(new[] { "<title>", "</title>" }, StringSplitOptions.None)[1]);

        });

        //gameObjectが削除されたらどちらも削除
        this.OnDestroyAsObservable().Subscribe(_ => {
            watcher.Dispose();
            getter.Dispose();
        });

    }
}
```

まず
ObservableWWW.Get("https://example.com/", null, progress)
は
ObservableWWW.Get(string url, Hash headers = null, IProgress<float> progress = null)
で定義されています。
urlはまんまurlです。
headersもヘッダです。
progressが後で説明する進行状況を教えてくれるすごい人です。
でDL完了したらSubscribe内に値がプッシュされます。
なのでSubscribeで青色にしてDebug.Logでタイトルを(雑なやり方で)取得して表示しています。

もう一方の
ScheduledNotifier<float> progress = new ScheduledNotifier<float>();
がGetの第三引数ですがこれもIObservableになっています。
これにGetは進行状況をプッシュしてくれます。
なのでその値をそのまま出力しています。



最後にthis.OnDestroyAsObservable()はDestroyされたら呼び出されます。
後片付けです。

## 実行結果 ##
というわけでDL完了です！

![スクリーンショット 2015-05-06 01.37.59.png](https://qiita-image-store.s3.amazonaws.com/0/77177/cf52cf5d-5113-5b80-93d2-7bf17fdb49c4.png)

## その他のメソッド ##
ObservableWWWには取得したWWWをそのまま返してくれるGetWWWとかpostでリクエスト投げてくれるPostメソッドとかもあります。
XcodeのiOS simulatorでTread 1:signal SIGABRTが出てアプリが立ち上がらない時

#Thread 1:signal SIGABRTが出てアプリが起動できない
以下の画像のエラーです。
![きーた０.png](https://qiita-image-store.s3.amazonaws.com/0/77619/641f1e56-0627-cd8f-8b73-b9d9fb5ec953.png)

#コードとUI部品がうまく繋がっていない！
UI部品をctrl+ドラッグでコードにドラッグした後に変数名を変更しませんでしたか？
もしかしたらそれが原因です。

#ViewControllerの接続を確認する
ViewControllerを右クリックしましょう。
![きーた１.png](https://qiita-image-store.s3.amazonaws.com/0/77619/f6f3940a-abfe-ee42-8828-1fd1688d0444.png)

この黄色の三角マークがあればビンゴです！
![きーた２.png](https://qiita-image-store.s3.amazonaws.com/0/77619/422da8c1-a669-daf8-1f60-afae47470c53.png)

#修正する
考えたくなければ部品を消して最初から作りなおしましょう。
というのもなにかもったいないです。せっかくのエラーなので味わって吸収しましょう！

####1.Outlet接続を切る
　前画像の矢印先のxボタンを押すことでこの接続を切れます。
　画像内でのhogeというオブジェクトはある部品とつながっていました。
　実際にはhogeという変数名はhogeModifiedに変更されたため、
　コード内にhogeが存在せず注意マークが出ていたのでした。

####2.接続をつくる
　このままではhogeModifiedメソッドは何の部品ともつながっていないのでつなげましょう。
　同じポップアップからhogeModifiedを見つけます。(画像内ではすぐ下)
　この行の右の◯マークから実際の部品までドラッグして完了です。
　部品からコードにctrlドラッグしたみたいで簡単ですね！

####3.ビルドアンドランで確認
　無事アプリが起動すると思います。
lagerがモジュールにない関数が呼び出せる理由


さて、lagerとは、Erlangの代表的なロギングツールです。

https://github.com/basho/lager

詳しい使い方やらは、ググれば一杯出てきます。

http://voluntas.hatenablog.com/entry/20120226/1330183973

# Lager:warning関数が無い!

さて、このロギングライブラリ、たとえば、

```erlang
lager:warning("Some message with a term: ~p", [Term]).
```

とかで、ログを出力できるのですが、**lager:warningがlagerモジュールとして定義されてません**。

https://github.com/basho/lager/blob/master/src/lager.erl を見れば、lagerで、エクスポートされている関数は、

```erlang
%% API
-export([start/0,
        log/3, log/4,
        md/0, md/1,
        trace/2, trace/3, trace_file/2, trace_file/3, trace_file/4, trace_console/1, trace_console/2,
        clear_all_traces/0, stop_trace/1, stop_trace/3, status/0,
        get_loglevel/1, set_loglevel/2, set_loglevel/3, get_loglevels/0,
        update_loglevel_config/0, posix_error/1,
        safe_format/3, safe_format_chop/3, dispatch_log/5, dispatch_log/9, 
        do_log/9, pr/2]).
```

てな感じで、ログ出力の、debug, info, notice, warning, error, critical, alert, emergencyの**関数がエクスポートされてない**のです。


# どうして呼び出せるのか?

さて、とすれば、lager:infoやらlager:errorやら呼び出すことができないはずです。けれども実際には、呼び出せます。というか、呼び出せないと、ロギングツールとして使えません。

## コンパイル時に構文木を組み変える

では、どうやって、呼び出しているか仕組みを言いますと、**lagerの呼び出しの意味になるように、コンパイル時に適切に構文木を組み変えているからです**。

つまり、**メタプログラミング**しているというわけです。

## parse_transform

さて、lagerを使う時、コンパイルオプションに、

```erlang
{parse_transform, lager_transform}
```

という設定をします。このparse_transformという設定が、erlangをメタプログラミングをするための必要な準備です。

この設定で、**lager_transform:parse_transform/2という関数がコンパイル時に呼び出され、構文木を受け取り、新しい構文木を返し、それによって、別の意味を作ることが可能**なわけです。

さて、このparse_transformの話題おもしろいのですが、ちょっと簡単に書ききれないので、**後日別の記事に纒めます**。 

##  lager_transform:parse_transform

さて、ここまで来れば、どうして、lagerモジュールに無い関数が呼び出されているかが、分かります。**lager:infoやlager:errorなどの、ログを出力する関数がコンパイル時に、lagerのライブラリの関数を使った構文に書き換えている**わけです。なので、実際には、lager:info等の関数が存在するわけでは無く、適切な構文に変換しているだけなのです。
AWS SDK for Ruby V2でS3にアクセスする

AWS SDK for Ruby V2でS3に接続しようと調べていると、V1とV2の情報がごっちゃになったり接続方法が色々あったりでちょっとはまったのでまとめておく。

## Gemfile

以下のようにversion指定で`aws-sdk`をインストールする。

```rb
    gem 'aws-sdk', '~>2'
```

ドキュメント通りなのだが、ちょっと前までは`aws-sdk-core`を入れるように書かれていた気がするのでここでちょっとはまった。
これで`aws-sdk-core`と`aws-sdk-resources`がインストールされる。

## S3にアクセスする

オブジェクトにアクセスする場合、`Aws::S3::Client`で接続する方法と`Aws::S3::Object`を用いる方法がある。

### Aws::S3::Clientを用いる場合

credentialを元にclientを生成する。

```rb
s3 = Aws::S3::Client.new(
    access_key_id: 'xxxxxxxxxx',
    secret_access_key: 'xxxxxxxxxx',
    region: 'xxxxx'
)
```

clientからオブジェクトにアクセスする。

```rb
s3.get_object(bucket: 'xxx', key: 'xxx')
```

これでS3からobjectを取得できる。

ただし、ここで取得したオブジェクトは`Aws::S3::Object`ではなく`Aws::PageableResponse`になっており、`Aws::S3::Object`でしか用意されていないメソッドは使用できない。

今回は、`presigned_url`を取得したかったので非常に困った。
そのため後述する`Aws::S3::Object`を用いて接続する方法で行った。

※ `Aws::PageableResponse`から`Aws::S3::Object`を取得する方法があれば教えて下さい。


### Aws::S3::Objectを用いる場合

`Aws.config`を設定する

```rb
Aws.config = {
    access_key_id: 'xxxxxxxxxx',
    secret_access_key: 'xxxxxxxxxx',
    region: 'xxxxx'
}
```

`Aws::S3::Object`を生成する

```rb
obj = Aws::S3::Object.new(bucket, key)
```

データを取得する場合、`get`を用いて取得する

```rb
obj.get
```

今回は、`presigned_url`を取得したかったので以下のように取得すれば良い

```rb
obj.presigned_url(:get, expires_in: 3600)
```
Raspberry Pi 2 + ELECOM WDC-150SU2M

Raspberry Pi 2 で ELECOM WDC-150SU2M を認識させる方法です。

Raspberry Pi で WDC-150SU2M を認識させるのは面倒で、その方法として http://qiita.com/kompiro/items/da6ae0ca16a7705f21a0 があるのですが、これでは認識してくれなかったので、この記事のコメントに書いてあった URL (https://www.raspberrypi.org/forums/viewtopic.php?p=462982) の通りにやったところ、ちゃんと認識しました。

まずは Raspberry Pi をインストール後、有線LANにつないで起動し、

```bash
sudo rpi-update
```

します。

`uname -a` すると 2015-05-06 の時点では `3.18.12-v7+ #782` だったので、[上の URL](https://www.raspberrypi.org/forums/viewtopic.php?p=462982) から対応するファイル名を探してダウンロードし、インストールします。

```bash
wget https://dl.dropboxusercontent.com/u/80256631/8188eu-v7-20150428.tar.gz
tar xf 8188eu-v7-20150428.tar.gz
./install.sh
```

再起動してくださいとでるので再起動します。

これで認識するようになっているはずです。

```bash
$ lsusb
...
Bus 001 Device 005: ID 056e:4008 Elecom Co., Ltd
...
$ ifconfig
...
wlan0   ...
...
```

あとはいろいろな記事で説明されているように `sudo sh -c "wpa_passphrase SSID PASS >> /etc/wpa_supplicant/wpa_supplicant.conf"` したり、`/etc/network/interfaces` を編集したりするだけです。


### 追記 (2015-05-06)

その後なぜか認識しないようになっていて、調べるとなぜか `3.18.7-v7+ #755` に下がっていた…よくわからない。

`sudo rpi-update` すると `3.18.12-v7+ #783` になり、もう一度インストールしなおしても動かず。

原因は `/lib/modules/3.18.12-v7+/kernel/drivers/net/wireless/8188eu.ko` がなぜか0バイトのファイルになっていたことで、`install.sh` を見て手動で `sudo install -p -m 644 8188eu.ko /lib/modules/3.18.12-v7+/kernel/drivers/net/wireless` を実行して再起動してみるとちゃんと認識するようになりました。
httpdの再起動がうまくいかない時の対応

httpdを再起動をした際に、うまくapacheが起動できずに
/etc/httpd/logs/error_logに
Unable to open logs
と書かれている場合の一つの対応方法

/etc/init.d/httpdに
ulimit -n 65536
を追加
参考
http://kb.odin.com/en/113974

ただし、error_logに他のエラーが出ていた場合は、
そのエラーを優先する。
多分なにもないときの対応です。
スプレッドシートを公開せずにCSVを得る


データ管理をスプレッドシートで行っていたときに CSVを一括でダウンロードしたくなったのでそのメモ。

##使用したツール
* googlecl
* xlsx2csv


##手順
* googleclをインストール
http://code.google.com/p/googlecl/downloads/list

```
tar xvz ./googlecl-0.9.14.tar.gz
cd ./googlecl-0.9.14
sudo python setup.py install
```

* ダウンロード先のデータを確認

```
google docs list | awk -F, '{print $1}'
```
google docs list は CSV形式で出力されるそうなので , 区切りで取得したい情報を抽出しています。
また、最初の実行時にはgoogleアカウントのログインとトークンの設定を行う必要があります。


* 確認したファイル名を指定しダウンロード

```
google docs get hogehoge ./hogehoge.xlsx
```

* xlsx2csvをインストール
https://github.com/dilshod/xlsx2csv

```
sudo easy_install xlsx2csv
```

* csvへ変換

```
xlsx2csv ./hogehoge.xlsx ./hogehoge.csv
```

Excelのシートが複数あるときは -s オプションを使用することでシートを指定することができます。

##所感
公開設定をしてダウンロードする方法は結構乗っていたのですが、あまり外部に公開したくないデータを扱っていることもありますので、非公開のまま取得する方法ないかなーと思い、いろいろと試してみました。

これで、CSV取得して組み込むまでの手間が多少はぶけるぞい！

##参考サイト
http://code.google.com/p/googlecl/
http://qiita.com/ynakase/items/e91da987a7b066cada28
http://shower.human.waseda.ac.jp/~asaitaku/toolsManual/python/xlsx2csv.html
Pythonで関数型プログラミング Project Euler 3

[Problem 3 - Project Euler](https://projecteuler.net/problem=3)
> # [「最大の素因数」](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%203)

> 13195 の素因数は 5, 7, 13, 29 である.

> 600851475143 の素因数のうち最大のものを求めよ.

# 解法
2から始めて小さい順に因数を探していって、因数が見つかるたびにその値で割っていくということを再帰的に繰り返して最大の素因数を見つけます。
引数として受け取った整数を割り切れるという条件に一致する最初の要素を見つけるところで関数型の手法を利用します。

# 最初の要素を見つける関数
関数型言語には指定した条件に一致する最初の要素を見つける関数が用意されているのが普通じゃないかと思います。

| 言語			| 関数名		|
|---			|---		|
| F#			| find		|
| Scala			| find		|
| C# (LINQ)	| First		|
| Java 8		| -			|

Pythonには同じような関数がないので既存の関数を組み合わせて作る必要があります。
filter関数で条件に合うものだけを返すイテレータを生成し、そのイテレータをnext関数に渡すことで最初の要素を得ることができます。

```python3
def find(condition, iterable):
    return next(filter(condition, iterable), None)
```
上の関数定義でconditionは条件を判定する関数、iterableはリストなどのオブジェクト、最後のNoneは要素がなかった時に返す値です。

# 解答例

```python3:Python_3.x
# -*- coding: UTF-8 -*-
from math import sqrt


def find(pred, iterable):
    '''条件に一致する最初の要素を探す。一致する要素がなければNoneを返す。'''
    return next(filter(pred, iterable), None)


def getMaxPrimeFactor(n):
    '''最大の素因数を求める。'''
    #️ 2〜√nの範囲で最小の因数を探す。
    limit = int(sqrt(n))
    smallestFactor = find(lambda i: n % i == 0, range(2, limit + 1))
    if smallestFactor is None:
        # 因数が見つからなかった場合はnを返す。
        return n
    else:
        #️ 因数が見つかった場合はnを因数で割った値で再帰呼び出し。
        return getMaxPrimeFactor(n // smallestFactor)


answer = getMaxPrimeFactor(600851475143)
print(answer)
```

Python 2.xで実行するとエラーとなるのでfilter関数をitertoolsモジュールのifilter関数に入れ替えると正しく実行できます。


```python:Python_2.x
# -*- coding: UTF-8 -*-
from math import sqrt
from itertools import ifilter


def find(pred, iterable):
    '''条件に一致する最初の要素を探す。一致する要素がなければNoneを返す。'''
    return next(ifilter(pred, iterable), None)


def getMaxPrimeFactor(n):
    '''最大の素因数を求める。'''
    #️ 2〜√nの範囲で最小の因数を探す。
    limit = int(sqrt(n))
    smallestFactor = find(lambda i: n % i == 0, range(2, limit + 1))
    if smallestFactor is None:
        # 因数が見つからなかった場合はnを返す。
        return n
    else:
        #️ 因数が見つかった場合はnを因数で割った値で再帰呼び出し。
        return getMaxPrimeFactor(n // smallestFactor)


answer = getMaxPrimeFactor(600851475143)
print(answer)
```
Composerのcreate-projectが何をやっているのか調べてみた

フレームワークの新規プロジェクトを作成するときに、`composer create-project`を叩くのがお作法っぽいのですが、裏側で何がどうなっているのか見えなくて気持ち悪かったので調べてみました。

# 結論

対象パッケージをgit cloneしてからcomposer intsallするのとほぼ同じである。


```
git clone https://github.com/foo/bar
cd bar
composer install
```

一応下記のように公式ドキュメントにも書いてあるのですが、ちょっとわかりづいらいですね。


## create-project

You can use Composer to create new projects from an existing package. **This is the equivalent of doing a git clone/svn checkout followed by a composer install** of the vendors.

https://getcomposer.org/doc/03-cli.md#create-project



## 実際の挙動を追って調べてみた

[Ethna](https://github.com/ethna/ethna) を例にとってみました。
新規プロジェクトを作る場合、下記コマンドを叩くようにREADMEに書いてあります。

```
composer create-project ethna/ethna-project -s dev Hoge
```

まずオプションの`-s`ですが、これは`--stability`の略で"Minimum-stability allowed"のことだそうです。

`-s`の代わりにバージョンを直接指定してもよいみたいなので、下記のように書くこともできます。
```
composer create-project ethna/ethna-project Hoge dev-master
```

さてそれぞれの引数の意味はなんでしょうか。

composerのヘルプを見てみると、

```
create-project vendor/project target-directory [version]
```

と書いてあります。
つまり「`ethna/ethna-project`というパッケージの`master`バージョンを使って`Hoge`ディレクトリにプロジェクトを作成しなさい」という意味に読めそうです。

実際に実行してみると、わらわらとパッケージのダウンロードが(composer installっぽい)行われて、最後にプロジェクト作成コマンドが実行されました。

## `create-project`と同じことを手作業で再現する

「`create-project`はgit cloneしてcomposer installするのと同じである」と公式ドキュメントに書かれていたので、ほんまかいなと思って実際にやってみました。

```
git clone https://github.com/ethna/ethna-project.git
cd ethna-project
composer install
```

結果、`create-project`したときとほぼ同じ結果になりました。
これでモヤモヤしてたのがすっきりしました。
はじめてのMEANスタック #2


expressを使ってハローワールドまで出来たので、その続き。

#はじめてのMONGODB

mongoDBはインストール済みとして進めます。

```
$mongod --dbpath ./data/
```
としてmongodbを起動します。
パスは前回作成したdb用のパスを指定しています。
ターミナルでは

```
waiting for connections on port 27017
```
というメッセージが出ています。
もう１つターミナルを開いて、プロジェクトのディレクトリ（例題通りならnodetest)に移動して「mongo」としてリターンキーを押すと対話モードになります。
このとき、先ほどのmongodbを起動したターミナル上では

```
connection accepted from 127.0.0.1:52980 #1 (1 connection now open)
```
と出ていれば成功です。
で、対話モードのターミナルに戻ってテーブルを作成します。

```
> use nodetest
switched to db nodetest1
> db.usercollection.insert({ "username" : "testuser1","email" : "testuser1@testdomain.com" })
WriteResult({ "nInserted" : 1 })
> db.usercollection.find().pretty()
{
	"_id" : ObjectId("5548d1d79986e3d765e7ed6c"),
	"username" : "testuser1",
	"email" : "testuser1@testdomain.com"
}
```
insetでデータを登録して、findで登録できたことを確認しています。

```
> newstuff = [{ "username" : "testuser2", "email" : "testuser2@testdomain.com" }, { "username" : "testuser3", "email" : "testuser3@testdomain.com" }]
[
	{
		"username" : "testuser2",
		"email" : "testuser2@testdomain.com"
	},
	{
		"username" : "testuser3",
		"email" : "testuser3@testdomain.com"
	}
]
> db.usercollection.insert(newstuff)
BulkWriteResult({
	"writeErrors" : [ ],
	"writeConcernErrors" : [ ],
	"nInserted" : 2,
	"nUpserted" : 0,
	"nMatched" : 0,
	"nModified" : 0,
	"nRemoved" : 0,
	"upserted" : [ ]
})
```
こんなふうにまとめて登録することも出来ます。

#mongoに接続
DBはとりあえず準備できたのでexpress側から接続する部分を作ります。

```app.js
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

// 追加
var mongo = require('mongodb');
var monk = require('monk');
var db = monk('localhost:27017/nodetest');
```
「追加」というコメントの下３行を追加しました。
さらにルーティング設定の前にもコードを追加します。

```app.js
//DBアクセス用
app.use(function(req, res, next) {
  req.db = db;
  next();
});

app.use('/', routes);
app.use('/users', users);
```
monkオブジェクトをrequestのdbプロパティにセットします。
これでDBへの接続はOK。

#DBからデータを取得する
接続できたら次はデータを取ってきます。
それ用のページを１つ用意しましょう。

```route/index.js
/* GET Userlist page. */
router.get('/userlist', function(req, res) {
	var db = req.db;
	var collection = db.get('usercollection');
	collection.find({}, {}, function(e, docs) {
		res.render('userlist', {
			"userlist" : docs
		});
	});
});
```
前回、ハローワールド用のルーティングを追加しているので、その下辺りに上記コードを追加します。
この辺がたぶんMonkらしい部分なんでしょう。Mongooseも知らないので何とも言えませんが。。
"〜/userlist"でアクセスするとuserlist.jadeというテンプレートで描画しますよ、ということを記述しています。
尚、dbから取ってきたデータが「docs」で、これを"userlist"という名前でテンプレートからアクセスできるように指定しています。

次にviewsディレクトリの下にuserlist.jadeというファイルを新規作成して以下のように編集します。

```views/userlist.jade
extends layout

block content
	h1.
		User List
	ul
		each user, i in userlist
			li
				a(href="mailto:#{user.email}")= user.username
```
DBから取ったデータ(userlist)の１項目ずつからメアドと名前を取って表示しています。
ここまで出来たらnpm startして
http://localhost:3000/userlist
にアクセスしてみます。
先ほどDBに登録したtestuser1〜3が表示されていれば成功です。


###インデックス
[はじめてのMEANスタック #1](http://qiita.com/kukimo/items/673a093c9297673bd494)
Mac OS X で npm install 時に権限まわりでエラーが出たときの解決方法

環境: MacOSX Yosemite 10.10.3

```
npm install gulp
```
で以下のエラー

```
npm WARN package.json blogtest@1.0.0 No description
npm WARN package.json blogtest@1.0.0 No repository field.
npm WARN package.json blogtest@1.0.0 No README data
npm WARN locking Error: EACCES, open '/Users/username/.npm/_locks/gulp-9990ecbe64c4571f.lock'
npm WARN locking     at Error (native)
npm WARN locking  /Users/username/.npm/_locks/gulp-9990ecbe64c4571f.lock failed { [Error: EACCES, open '/Users/username/.npm/_locks/gulp-9990ecbe64c4571f.lock']
npm WARN locking   errno: -13,
npm WARN locking   code: 'EACCES',
npm WARN locking   path: '/Users/username/.npm/_locks/gulp-9990ecbe64c4571f.lock' }
npm ERR! Darwin 14.3.0
npm ERR! argv "node" "/usr/local/bin/npm" "install" "gulp"
npm ERR! node v0.12.2
npm ERR! npm  v2.7.5

npm ERR! Attempt to unlock /Users/username/work/practice/20150505/blogtest/node_modules/gulp, which hasn't been locked
npm ERR!
npm ERR! If you need help, you may report this error at:
npm ERR!     <https://github.com/npm/npm/issues>

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/username/work/practice/20150505/blogtest/npm-debug.log
```

/Users/username/.npm/_locks 以下の権限がrootになっているのでエラーになっている模様

```
sudo chown -R `whoami` ~/.npm/_locks/
```

で権限変更するとうまくいく
Sublimetext2でCompassビルドできないので、rvmからrbenvへ乗換えた。

これを書いたのは2014/12/9ですが、今のところ(2015/5/4)この設定でも動いています。

##ことのはじまり
事の始まりは、sublimetext2でcompassが使えなかったこと。
ビルドしようとすると"compass not found."　となってしまっていた。
先生に相談したところ、どうもrvmを使ってrubyのバージョンを管理していると不都合が多いらしい。
どうしても解決できないので、rubyの管理をrvmからrbenvに替えることにした。

##参考URL
- [RVMからrbenvへの移行（OS X 10.8.x）](https://gist.github.com/gaspanik/9284658)
- [Mac の Ruby 管理を rvm から rbenv に乗り換え](http://easyramble.com/change-ruby-manager-from-rvm-to-rbenv.html)

##1. rvmからrbenvへ乗り換える
###1.1. rvmのアンインストール
ターミナルで以下を実行。

```shell-session
$ rvm seppuku
```
で、消す。

```shell-session
$ ls -la
```
で、残り滓を探す。

```shell-session
$ rm -rf .rvm
```
で、完膚なきまで消す。

###1.2. $PATHを確認する
```shell-session
$ echo $PATH
```
で、チェック。
一応保存しておく。
パスが残っていたものがあったので、

```shell-session
$ export -n $PATH
```
で、消す。
その後、

```shell-session
$ export PATH='/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin:/usr/X11/bin' 
```

で必要なものだけ書きだす。

###1.3. bash_profileに書いてあるrvm用の設定を消す。
vimを使うなら

```shell-session
$ vi ~/.bash_profile 
```
sublimetextを使うなら

```shell-session
$ subl ~/.bash_profile
```
で内容をチェック。
rvm用の設定部分を削除。
これでrvmとは後腐れなくさよならできたはずだ。

###1.4. rbenvとかのインストール(homebrewインスト済)
homebrewはインスト済として、

```shell-session
$ brew doctor
```
```shell-session
$ brew install rbenv ruby-build rbenv-gem-rehash
```

###1.5. bash_profileの設定
```shell-session
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```
```shell-session
$ source ~/.bash_profile
```
これで、rbenvが使えるようになる。

##2. rbenvでrubyをインストール、設定など
###2.1. rubyをインストール
```shell-session
$ rbenv install --list
```
で、インストールできるrubyをチェック。

```shell-session
$ rbenv install 2.2.0
```
で、インストール。


###2.2. rbenvで使うrubyを設定
```shell-session
$ rbenv global 2.2.0
```
で、使うrubyを2.2.0に設定する。

```shell-session
$ rbenv rehash
```
で、パスを通して使えるようにする。

```shell-session
$ ruby -v
```
で確認。

```shell-session
$ which ruby
/Users/watashitawashi/.rbenv/shims/ruby
```
でも確認。

##3. Compassの導入
###3.1. gemで必要なgemsをインストール
```shell-session
　　$ gem install sass compass
```
sass, compassを導入。

```shell-session
$ gem list
```
で確認。
終わり。

##4. sublimetext2の設定
早速設定。

まずは、sublimetext2で、command + shift + P。
list package→compassと行き、Compass.sublime-buildを開く

内容を以下のようにする。

```json
{
"osx":{"path": "/usr/local/bin:/Users/nawano/.rbenv/shims:$PATH"},
"cmd": "sh '${packages}/Compass/build.sh' '${file_path}' '${project_path:${folder}}'",
"working_dir": "$packages/Compass",
"selector": "source.sass, source.scss",
"shell": "true",
"windows":{"cmd": "build.cmd \"${file_path}\" \"${project_path:${folder}}\""}
}
```

ビルドできた。動いた。
よかったよかった。
おわり。
rubyのprint / puts / p の違い


```ruby:test.rb
print 'hello (print)' # 改行なしで出力
puts 'hello(put)' # 改行ありで出力
p 'hello(p)' # デバッグ用出力（データ形式がわかる）
```

```bash
$ ruby test.rb 
hello (print)hello(put)
"hello(p)"
```
macからvagrantを使いcentos,ubuntu起動手順　メモ

## vagrant-php
~ やDesktop上にいるとき
cd vagrant-phpで移動。

virtualboxを起動しておく
vagrant up

vagtrant ssh


## vagarant-ruby
~ やDesktop上にいるとき
cd vagrant-rubyで移動。

virtualbox起動させておく
vagrant up 
vagrant ssh

## centosにはyum、ubuntuはapt-get、Macはbrew(これはインストールを手助けするもの)
使い分けられるように



##　src vagrant-ruby　でvagrant-rubyへ移動
【Capistrano3】rails r を実行するときに環境変数を指定する

こんなことをしようと思いまして

```rb
task :create_job do
  on roles(:app) do
    within release_path do
      with rails_env: fetch(:rails_env) do
        execute :bundle, :exec, "rails r create_job.do"
      end
    end
  end
end
```

こうやって実行してるのに

```
cap production deploy
```

なぜか実行時の環境変数が`development`になってしまう！
なんで！
そのスクリプト内でRails.envするとdevelopment。でも、capistranoでのタスク実行時には`RAILS_ENV=production`という指定がついてるのに、、、

## 解決
`rails r -e #{fetch(:rails_env)} create_job.do`

とした。

なんでこれがおっけーでRAILS_ENV指定がダメなのかわからんぬ。
cocoapodsのバージョン管理のやり方


iOSアプリを複数人で開発するときに、メンバーのcocoapodsのバージョンが合わずに困ったことがあったので、
bundlerを使ってバージョンを合わせました
というメモです
CIで別の端末でjenkinsも使っていたので、そいつもバージョン揃ってハッピーになれた :sushi: 

# bundler導入

```bash
bundle init
vim Gemfile # cocoapodsだけ書いとく
mkdir bundle
bundle install --path bundle
```

これで `./bundle/` 以下にgemがインストールされる

# .gitignore設定

```diff
# .gitignore
+/bundle
```

```bash
touch bundle/.keep
git add -f bundle/.keep
```

これで、`./bundle/`以下はignoreされるけど、
ディレクトリは残しておきたいので、`.keep`ファイルだけaddしとく

`Gemfile.lock`はignoreしません
このファイルでcocoapodsのバージョンをロックしているため

`.bundle/config`も生成されるけど、これもignoreしない
このファイルでbundle install先のディレクトリを指定してるため

このファイルがあれば、他のメンバーは bundle install するだけで、
オプションなしで自動的にローカルのbundle以下にインストールされる

人によってインストール先変えたいとかの要望あれば、逆にignoreする運用を考える

# pod install

```bash
bundle exec pod install
```

bundle exec コマンドを使うと、ローカルインストールしたgemを使うように指定できる

導入以降、pod コマンドはすべて bundle exec をつける必要あり

# jenkins

jenkinsはシェルスクリプトを書いて対応した
jobのはじめの方だったかな?で以下のようなスクリプト追加

```bash
bundle install
bundle exec pod repo update
rm -rf Pods
bundle exec pod install
```

`pod repo update`は別になくても良い気がする
`rm -rf Pods`も毎回やるのはエコじゃないけど、やらないとビルド失敗したしたことが過去にあったので、こうしたような気がする



# やって良かったよ

これを導入する前は、メンバーの誰かがcocoapodsを更新する度に、
他のメンバーは手元でビルドが通らなくなる状態でした

特にCIのjenkinsが面倒で、わざわざ別の端末にログインしてcocoapodsを更新する必要があった

また、jenkinsでいくつかのiOSプロジェクトのビルドをしていた場合、
すべてのプロジェクトでcocoapodsのバージョンが揃ってないといけなかったので、面倒だった
下手すると他チームとかに迷惑かかったりする
ローカルに閉じて安心だお :anguished: 


ってか逆にこうじゃない運用をやっているところあるのだろうか
これ以外で困らずにやれるやり方あったら知りたい :beer:
[メモ書き] GoをUbuntuにホストする [nginx, gvm, Martini, httprouter, redigo]

# バージョン

go: 1.4.2
ubuntu: 14.04


# 参考資料
https://www.digitalocean.com/community/tutorials/how-to-use-martini-to-serve-go-applications-behind-an-nginx-server-on-ubuntu

# サーバーの最初の諸々

は各自で

# goをgvmで入れる
    sudo apt-get install curl git mercurial make binutils bison gcc


    bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)


    source /home/deploy/.gvm/scripts/gvm


    gvm install go1.4.2
    gvm use go1.4.2 --default


# go用のディレクトを作ってGOPATHを通す
    cd ~
    mkdir -p go/{bin,pkg,src}


    echo "export GOPATH=$HOME/go" >> ~/.bashrc
    echo "export PATH=\$PATH:\$GOPATH/bin" >> ~/.bashrc


# ブツをclone
    cd ~/go/src

    git clone https://github.com/gogotanaka/goImpClickCounter

    go get ...

# Build

    go build -o $GOPATH/bin/[app name] [app name].go

# とりあえずRun

    [app name] &
Carrierwaveで非同期処理・アップロードする

Railsでファイルのアップロード実装が簡単に行える[CarrierWave](https://github.com/carrierwaveuploader/carrierwave)で、MiniMagickによるリサイズ処理や、AWSのS3へのアップロードを遅延実行する設定について。

専用のGemがあった。各種ワーカーにも対応しているよう。しかし、現在のサービスで使用している`Que`に対応していないので、
`sucker_punch`を入れてワーカーに使用した。

- [lardawge/carrierwave_backgrounder](https://github.com/lardawge/carrierwave_backgrounder)


#### インストール

- `gem 'carrierwave_backgrounder'`
- `rails g carrierwave_backgrounder:install`

sucker_punchの場合以下のように編集する。

```ruby
CarrierWave::Backgrounder.configure do |c|
  #c.backend :delayed_job, queue: :carrierwave
  # c.backend :resque, queue: :carrierwave
  # c.backend :sidekiq, queue: :carrierwave
  # c.backend :girl_friday, queue: :carrierwave
   c.backend :sucker_punch, queue: :carrierwave
  # c.backend :qu, queue: :carrierwave
  # c.backend :qc
end
```

#### モデルに遅延処理の記述

```ruby
class Post < AR::B  
  mount_uploader :image, ImageUploader
  process_in_background :image # プロセス処理の遅延実行
  store_in_background :image # アップロード処理の遅延実行 
・・・
```
##### process_in_background

特に何もしなくても遅延処理される。けれど、名前の付け替えをしている場合は注意が必要（後述）。
また、store_in_backgroundがオフならprocess前の元画像ファイルが一時的にアップロードされる。

##### store_in_background

上記の例であれば、`image_tmp`という列を追加する必要がある。
けれど、strong_parameterに`remove_image`を追加すると処理が行われなくなるという問題がある。（2015/5時点）
多分以下のIssue

- [Use `enqueue_#{column}_background_job?` to process in foreground #186](https://github.com/lardawge/carrierwave_backgrounder/pull/186)

#### アップロードしたファイルの名前を付け替えている場合

- [How to: Create random and unique filenames for all versioned files](https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Create-random-and-unique-filenames-for-all-versioned-files)

PRがあったようだけど、ワーカーへの対応絡みでスルーされたみたい。

- [Save a changed filename #157](https://github.com/lardawge/carrierwave_backgrounder/pull/157)

対応方法のようなISSUEがあったけど理解できなかった。

- [Unique filenames on upload #42](https://github.com/lardawge/carrierwave_backgrounder/issues/42)

以下のように対処

```ruby
  def filename
    "#{create_filename}.#{file.extension}" if original_filename.present?
  end

  protected
    def create_filename
      if model.changed?
        var = :"@#{mounted_as}_secure_token"
        model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.urlsafe_base64)
      else
        model.send(mounted_as).file.filename.split('.')[0]
      end
    end

```

#### メモ

- process_in_backgroundのみを使うならファイルサイズ制限をかける
WindowsのRails(ExecJs)でTypeError

ExecJsとcoffee-script-sourceの仕様が変わったことにより、TypeErrorが出るようになっているようだ。
※ runtimes.rbを編集してもinvalid byte sequence in UTF-8という別のエラーになる
ExecJsの2系とcoffee-script-sourceの1.9の組み合わせがだめみたい。
以下で一時的に対処可能。

```ruby:Gemfile
gem 'execjs', '~> 1.4.0'
gem 'coffee-script-source', '~> 1.8.0'
```

## 参考

* Windows 7 の Rails で ExecJS が TypeError を吐くようになった
http://qiita.com/scivola/items/ec7625118fcf6de5203a

* Windows 8 で ExecJS::RuntimeError が出たときは
http://www.oiax.jp/rails3book/execjs-runtime-error-on-windows8.html
node-postgresモジュールでSQLインジェクション対策

# 概要
ネット上のNode.js(Express)でPostgreSQL使うサンプルは、SQLインジェクションを考慮していないものが多く、注意が必要です。
例えばフォームに入力された値をそのままDBにINSERTしたり、さらにそれをherokuで公開させたりしています。
このような状態で公開すると、第三者が簡単にSQLインジェクションを行いDBを破壊される可能性があります。知っていればできる対策なので、きちんと行いましょう。

# 対策
SQL文へのパラメータの渡し方にプレースホルダーを使いましょう。

## 対策してない場合
まず未対策のコードだとどうなるんでしょうか。

``` lang:インジェクション未対策のコード
var queryString= client.query("insert into mydata (name, mail, memo) " +
                              "values ('" + name_str + "','" + mail_str + "','" + memo_str + "');");
    
```

フォームからはname_str, mail_str, memo_strがテキストエリアに入力されて渡されると仮定します。このあと、queryStringを使用してDBにクエリを発行します。
さてこのとき、name_strに以下の文字列を入力するとどうなるでしょう？

``` lang:変数name_strに渡される文字列
','','');INSERT INTO mydata (name, mail, memo) values ('injection', 'injection', 'injection');--
```

これを変数に代入して作られるSQL文を見てみます。

``` lang:発行されるSQL文
insert into mydata (name, mail, memo) values ('','','');INSERT INTO mydata (name, mail, memo) values ('injection', 'injection', 'injection');--,'','');
```

空のデータのINSERTが成功すると、開発者の意図しないSQLが流されてしまいます。
この例ではINSERTですが、権限があればDROPだとかCREATEとかだってできちゃいます。

## 対策する
SQLに渡されるパラメータをプレースホルダを使って書きます。

``` lang:インジェクション対策したコード
var queryString= client.query("insert into mydata (name, mail, memo) " +
                              "values ('$1, $2, $3');"
                              ,[name_str, mail_str, memo_str]);
```

values内の`$1`,`$2`,`$3`がプレースホルダです。
こうすることでname_strにSQLとして解釈可能なものが入れらても、発行した際にエラーとなり、インジェクションを防ぐことができます。

# まとめ
SQLインジェクションは、対策を怠ると開発側が責任を負わされるケースがあります。知っていれば対策できることなので、しっかり対策しましょう。
FactoryGirlのtransientとtraitを活用する

FactoryGirlでテストデータを定義する時に、transientとtraitを活用すると色々捗るという話。

transientは実際に作成するデータと直接関係無い新しいattributeを定義する機能。
そこで定義されたものは実際のmodelにはセットされないしattributes_forでも出力されません。
何のために使うかというと作成時に挙動を変更するためのフラグや追加データとして利用するのが一般的です。

traitは属性の定義を一纏めにして名前を付けられる機能です。
parentを指定したfactoryの継承とは違い、traitは単体ではfactoryとして機能しません。
あるfactoryの特定の状態に名前を付けて、付け外しできるようにする、というのが主な使い方になります。
例えば、あるfactoryをある時はadminある時は非adminで作りたい時等に有効です。

個人的には継承を使うよりtraitを使う方がテストデータの作成には便利なケースが多いのではないかと思います。
継承は親の属性が全て入ってしまうので、パターンの組み合わせが複雑になってくると調整が難しくなります。
一方で、一つの実体と見做して問題無いバリエーションの場合は継承の方が向いていると思います。
ちなみに、factoryは全てのfactoryの中で一意である必要がありますが、traitには名前空間が存在し、factory定義内で定義したtraitはそのfactoryでしか利用できません。
トップレベルで定義しておけば複数モデルで共有することもできます。polymorphic関連を作る時等に活用できると思います。


## 活用の具体例
transientの活用法についての具体例を示してみます。
transientは各attributeの値にも利用でき、callbackでも利用可能です。

```ruby
factory :user_account do
  transient do
    domain "example.com"
  end

  email { "hoge@#{domain}" }
  encrypted_password "abcdefg12345"

  trait :admin do
    admin true
  end

  trait :inactive do
    inactive true
  end

  trait :with_login_histories do
    transient do
      login_count 5
    end

    after(:create) do |user_account, evaluator|
      evaluator.login_count.times do
        user_account.login_histories.create!
      end
    end
  end
end
```

こんな感じで定義しておけば、ログイン履歴を任意の数だけ持つ`user_account`を作るのも簡単です。

```ruby
FactoryGirl.create(:user_account, :with_login_histories, login_count: 10)
```

という感じで呼び出せば10個の`login_histories`を作ってくれます。
何も指定が無ければ5つ作成され、traitの指定が無ければ何も作成されません。

もし1度ログインしていてadmin権限を持っているけどアカウントが無効化されている、といったテストデータが欲しい時は以下の様に書きます。

```ruby
FactoryGirl.create(:user_account, :admin, :inactive, :with_login_histories, login_count: 1)
```

この様にテストの状況次第で付け外しできる状態を定義したり、関連オブジェクトの作成状態を制御したい時にはtraitとtransientが有効です。

また、transientはDBスキーマ変更時にも役に立ちます。
元々は`User`というクラスが`email`と`encrypted_password`を持っていて、それを何かの事情で別モデルに分けなければいけなくなった時などの場合です。

元々は`User`クラスがその属性を持っていたため、各テストコードに以下の様なコードが沢山あるかもしれません。

```ruby
FactoryGirl.create(:user, email: "joker1007@example.com")
```

この場合、カラムを消すとテストが盛大にぶっ壊れます。
そこで、とりあえずの移行策としてtransientを利用することもできます。

```ruby
factory :user do
  name "joker1007"

  transient do
    email nil
    domain nil
    encrypted_password nil
    user_account_trait []
  end

  user_account do
    attributes = {
      email: email,
      encrypted_password: encrypted_password,
      domain: domain,
    }.reject do |_, v|
      v.nil?
    end

    FactoryGirl.create(:user_account, *user_account_trait, attributes)
  end

  trait :admin do
    transient do
      user_account_trait [:admin]
    end
  end
end
```


こんな感じで直接`User`に保存できない属性をtransientで定義しておき、それを移行先の`UserAccount`のfactoryに移譲します。
これにより、上記の古いままのテストデータ作成処理がそのまま動作するようになります。

また、関連先のtraitの呼び出しをtransient経由で制御する事もできます。
データの依存関係が複雑でfactoryを多段で呼び出して色々なデータを作らなければいけない時に、traitとそれを制御するためのtransientをセットしておく事で、細かくテストデータの作成処理を制御する事ができます。

実際の所、テストコードでは必要な最低限のテストデータだけ作るようにして、実装が変わったらちゃんと意図が分かるようにテストコードも直すべきだと思いますが、色々と大きくなってしまったアプリケーションだとそう簡単に行かないこともあります。歴史的経緯によって色々複雑に絡みあってたりしてそう簡単に弄れないとか……。
そういった場合にtransientを使ってfactoryの互換性を維持するテクニックは役に立つかもしれません。


実際に動作するサンプルコード全体はここに置いておきます。
https://gist.github.com/joker1007/328ecb38bee3801ab28f
Eclipseでlapackを用いたコード(C++)のコンパイル[Mac OS X ver. 10.10.3]

# 対象
EclipseでMac OS標準で装備されているlapackを用いたコード(C++)のコンパイル方法を知りたい方
ネットでの情報が少なかったため、メモを残す。

# Mac OSのバージョン

```bash
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.10.3
BuildVersion:	14D136
```
# Eclipseのバージョン

Version: Luna Service Release 2 (4.4.2)
「Eclipse」 -> 「Eclipseについて」で確認

# ヘッダファイルのシンボリックリンク作成
clapack.h等のヘッダファイルは以下のパスに格納されている。

```bash
$ ls -l /System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Versions/Current/Headers/
LinearAlgebra/    clapack.h         vBigNum.h         vDSP_translate.h  vecLib.h          vectorOps.h
cblas.h           vBasicOps.h       vDSP.h            vForce.h          vecLibTypes.h     vfp.h
```

Eclipseでビルドするため、以下のようにファイルのシンボリックリンクを作成する。

```bash
$ sudo ln -s /System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Versions/Current/Headers/* /usr/include/
```

# Eclipseでの設定

1. パッケージエクスプローラにあるビルド対象プロジェクトを右クリックし、「プロパティ」をクリックする。
2. C/C++ビルドの「設定」をクリックする。
3. 「ツール設定」タブの「MacOS X C++ Linker」->「その他」-> **リンカー・フラグ**に以下の文字列を設定する。
**-Wl,-framework -Wl,Accelerate**

![setting.png](https://qiita-image-store.s3.amazonaws.com/0/77669/81bbcdaf-c965-29db-a178-e890506de8cd.png)

以上で設定は完了です。

# コンパイル
ビルド対象プロジェクトを右クリックし、「プロジェクトのビルド」を選択する。

![build.png](https://qiita-image-store.s3.amazonaws.com/0/77669/23125de5-cfab-0ff5-e696-ef141642843d.png)

以上でコンパイルは完了です。

以下の実対称行列対角化のサンプルコードを例に試してみて下さい。

```cpp
#include <iostream>
#include <cmath>
#include <clapack.h>
using namespace std;

int main() {
	// 行列サイズ
	int M = 3;

	// 対角化する行列(固有ベクトルが格納される)
	double* A = new double[M * M];
	for (int i = 0; i < M; i++) {
		for (int j = 0; j < M; j++) {
			A[i * M + j] = 1.0;
		}
	}

	// 固有値
	double w[M];
	int info;
	int lwork = -1;
	double* work = new double[1];

	char* V = const_cast<char*> (((string)"V").c_str());
	char* U = const_cast<char*> (((string)"U").c_str());
	dsyev_(V, U, &M, A, &M, w, work, &lwork, &info);
	lwork = work[0];
	delete[] work;

	work = new double[lwork];
	dsyev_(V, U, &M, A, &M, w, work, &lwork, &info);
	delete[] work;

	if (info != 0) {
		cout << "error!" << endl;
		return EXIT_FAILURE;
	} else {
		cout << "eigen values:" << endl;
		for (int i = 0; i < M; i++) {
			printf("%f \t", w[i]);
		}
		cout << endl;

		cout << "eigen vector:" << endl;
		for (int i = 0; i < M; i++) {
			for (int j = 0; j < M; j++) {
				cout << A[i * M + j] << " \t";
			}
		}
	}
	delete[] A;
	return EXIT_SUCCESS;
}
```
セキュリティについて

PHPに限らずセキュリティについてまとめてみた。

##権限の範囲を最小に

ユーザーや管理者等の権限が及ぶ範囲を、最小に抑える。
権限の範囲外に出ることができないかを意識して、
例えば、違うユーザーの権限に入れないようになっているか？
管理者の権限は本当に最小なのか？など、考えて権限の振り分けを行う。

##２重３重の対策を

１つのセキュリティ対策を行って安心してしまうのは危険。
突破されることも考えて、２重３重と対策してくことでより安全なシステムになる。

##シンプルな対策を心がける

あまり複雑な対策をしてしまうと、逆に脆弱性につながることも有る。
なるべくシンプルに対策をして行くことを心がけるようにする。

##入力データは必ずバリデート

入力は、開発者が意図しない値が送られて来るため、100％汚染されていると思ってもいい。
開発者が意図した値になるようにバリデートして、汚染リスクがあるものは弾くようにすれば、
安全性は高まっていく。

また、入力値に汚染リスクがある場合に、補正してあげるという方法もあるが、補正した上で更にバリデートしないと、補正自体に不具合があった場合は何も意味ない。
更に付け加えて、ホワイトリストアプローチも行うべき。

にバリデートされた値と入力された値を、変数などを利用して区別したほうが、より理解しやすい。

`$param`と`$clear`などのように

##出力は必ずエスケープ

ユーザーの入力した値、DBからのデータなどを表示する際に、エスケープ及びエンコードをして本来の機能や役割を果たす形で出力をするようにしなければならない。

入力と同様に、エスケープ後のデータとエスケープ前のデータとで、変数などを使用して区別しておくほうがいい。
vtlの実装

#vtlでfizzbuzz
```
10 a=0
20 a=a+1
30 b=a/15
40 #=%=0*120
50 b=a/5
60 #=%=0*140
70 b=a/3
80 #=%=0*160
90 ?=a
100 #=a<100*20
110 #=200
120 ?="fizzbuzz "
130 #=100
140 ?="buzz "
150 #=100
160 ?="fizz "
170 #=100
```
#vtlの仕様
ダイレクトモードとエディトモードあり
行番号無しでダイレクトモード
変数は、aからz
+　- * /  で加減乗除
数値は、2バイト整数符号無し。行番号も同じく。
%は、剰余
= < > で論理式　、値は０と1を取る
代入しかない。
文は、左から順に評価される。2+5*6は、42となる。
＃は、プログラムカウンター
if文は、#=a<100*20　で　aが100より小さいなら、行20に飛ぶ
？は、プリント文。
エディトモード
　インサート　100 a=0
　デリート    100
　エディト    100 a=100
　リスト      0
\#=1で実行
#vtlをjavascriptで実装
[webで実行](http://jsdo.it/ohisama1/5z7R)
#vtlをavrで実装案
行番号は、1バイト
変数は、aからiまで
機械語サブルーチン呼び出しが必要
タイマー割り込みで、変数に入れとく。
bit演算を&,$,!,'で実現
sedコマンドの備忘録

## 特殊文字

```bash
.                  # 任意の一文字
*                  # 直前の文字が任意の個数続く文字列(0個も含む)
<space><space>*    # 連続するSPACEを表す 
<tab>              # TAB
.*                 # 任意の文字列
```


## 置換(Substitute)の基本 

```
s/regular expression/replacement/flags
```

```bash
sed -e "s/aaaa/bbbb/"	    # 置換 行で最初に出てきた'aaaa'を'bbbb'に置換
sed -e "s/aaaa/bbbb/g"	    # 入力の全行に渡って置換 (Global)
sed -e "s/^aaaa/bbbb/"	    # 行頭(^)に'aaaa'のもの
sed -e "s/aaaa\$/bbbb/"     # 行末($)に'aaaa'のもの。$は\でescape
sed -e "s/~/bbbb/"          # 行頭に'bbbb'を追加
sed -e "s/\$/bbbb/"         # 行末に'bbbb'を追加
sed -e "s/.*/abcd/"         # すべての行を'abcd'に置換
sed -e "s/aa.*bb//"         # aa*bbを削除
```

### デリミタ

置換では`/`(スラッシュ)がデリミタ(区切り文字)として使われることが多いが、実際はデリミタはどの文字でもよい。
`s` の次の文字がデリミタになる。

```bash
cat file | sed -e "s@old1@new1@g" -e "s/old2/new2/g"
cat file | sed -e "s@ol/d1@n/ew1@g" -e "s/old2/new2/g"	ol/d1 を n/ew1 に置換
```

### TAB, SPACE

```bash
sed -e 's/<tab>/<space>/g'                       # TABをSPACEに置換
sed -e "s/<space><space>*/<space>/g"             # 複数のスペースを<space>に置換。<space>*ではない
sed -e "s/[<tab><space>][<tab><space>]*/<space>/g"   # ホワイトスペースを<space>に置換
```

### 同時に複数の置換処理を実行

```bash
cat file | sed -e "s/old1/new1/g" -e "s/old2/new2/g"
```


## 行の削除

```bash
sed -e "/条件/d"

sed -e '1d' file                # 1行目を消去
sed -e '1,4d' file              # 1-4行目を消去
sed -e "/$d" file               # 最終行を消去
sed -e '$-3,$d' file            # 最後の4行を消去。$-3:最後から数えて3行目、すなわち最後から4行目
sed -e "/aaa/d"                 # aaaを含む行を削除 sはいらない
sed -e "/^[<space><tab>]*$/d"   # 空白行の削除
```

## 指定した行だけ表示 (`-n`オプション)

```bash
sed -n '1,4p' file
sed -n '$p' file
sed -n '2p'                # 指示した行だけを標準出力に
sed -n '2p' < file
sed -n "s/aaaa/bbbb/gp"    # テキストが置換された行だけを表示
```


## 文字列の一部分を取り出す

```bash
sed -e "s/aa.*\(.*\)b\(.*\)b/\1/"    # 1つ目の()で囲まれた部分を取り出す。()は\でescapeする
sed -e 's/aa.*(.*)b(.*)b/\2/'        # 2つ目の()で囲まれた部分を取り出す
```

```bash
$ id root
uid=0(root) gid=0(root) groups=0(root)
$ id root | sed -e 's/uid=\(.*\)(\(.*\)) gid=.*/\1/'
0
$ id root | sed -e 's/uid=\(.*\)(\(.*\)) gid=.*/\2/'
root
```


## キーワードによる行の指定

```bash
sed -e '2,$s/aaa/bbb/g' file         # 2行目から最終行まで処理する
sed -e '/aaaa/,/bbbb/d' file         # aaaaを含む行からbbbbを含む行までを削除
sed -n '/aaaa/,/bbbb/p' file         # aaaaを含む行からbbbbを含む行までを表示

sed -n '/^BEGIN$/,/^END$/p' file     # BEGINのみの行からENDのみの行までを表示する
sed -n '/^BEGIN$/,/^END$/!p' file    # BEGINのみの行からENDのみの行までを表示しない
sed -e '/^BEGIN$/,/^END$/d' file     # BEGINのみの行からENDのみの行までを削除
```
ピザで理解する分数の割り算の意味

分数の割り算って計算はみんなできるけど「意味はよくわかんない」、という人が意外といるんじゃないかと思っています（そうでない方はすみません・・・）この「分数の割り算の意味」についてちょっと書いてみようと思います。これがイメージできると数式を読むときに意味を理解しやすくなると思っています。

##1. 分数の割り算の操作##
この分数の割り算のオペレーション（分数を逆数にして掛け算にする）、

```math
a \div \frac{b}{c} = a \times \frac{c}{b} = \frac{ac}{b}
```
という計算自体は問題無いと思います。この計算の「意味」について次項から見ていきます。

##2. 割り算の概念##
ストレートに考えると割り算というのは、例えば$30\div5=6$の場合、30個を5分割すると6個ずつになるというイメージで捉えられます。
この考え方で、次に$30\div (1/5)=150$を当てはめてしまうと、30個を1/5分割すると150個ずつになる、という？？？な感じになっちゃいますね。

ちょっとアプローチを変えてみます。
同じ、$30\div5=6$ですが、30個あるなかから、5つを1セットと考えて何セットあるか、というと6セットあります。これも同じ$30\div5=6$という計算ですね。
この**「5つを1セットと考えて何セットあるか」**がキモです。これは**数え方の単位を切り替えている**、と考えることができます。

先ほどの計算に単位を添えてみると、

```math
30個 \div 5 (1セットあたり) = 6セット 
```
となり、30は「個」が単位だったのに6はセットに変わっています。数を数える単位を違うものに変えた、と解釈できます。

もう１つ、次に為替の例を。
1ドル=120円というレートだった時に、102,000円は何ドルか？という計算も割り算で行いますね。

```math
10,2000 円 \div 120 円/ドル = 850 ドル
```
これも通過の単位を円からドルに変える操作となっています。
102,000円はドルを単位にして、ドル何個分あるか？答えは850個、ということです。

##3. さて分数の割り算の意味は##
ほぼ核心については前項で出てきました。つまり**「割り算は単位の変換」**です。

では、早速ですが、ここにピザが１枚あるとします。

![pizza05-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/5c9a741f-ea26-9305-6c1e-51a7befb3eec.png)


はい、ピザですね、どこからどう見ても1枚のピザですねw

これを6等分します。
![pizza06-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/66f200cc-4324-a42a-0874-39bc8081d39a.png)

6等分しているので1切れ1/6の大きさです。

![pizza03-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/62f090fc-83ac-0a7e-ffdc-b77dd591c590.png)

この状況で

```math
1 \div \frac{1}{6}
```
を解釈してみます。

![pizza04-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/29336de6-1828-e593-7784-b65a37a26c18.png)

この1切れ(赤ワクで囲ったところ)を単位として考えるのです。
つまり、このピザのホール1枚は1/6に切り分けた1切れを単位として、何切れあるか？ということです。
それを計算式で表すと

```math
ピザ1枚 \div \frac{1}{6}(一切れの大きさ) = 6切れ
```

になります。
つまり、

![pizza08-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/456e95b0-7589-1b5d-2692-25bb545fe9c8.png)
単位が「枚」だったのを

![pizza09-compressor.png](https://qiita-image-store.s3.amazonaws.com/0/50670/4a8a1c14-3ac9-3e87-f8b4-e8818a652c81.png)
「切れ」に変えたので、ピザ1枚は6切れになった、ピザ1枚には6切れ含まれている、ということが

```math
1 \div \frac{1}{6} = 6
```
の意味だったということになります！:blush: 

##4. おわりに##

ということで、割り算の意味、特に分数の割り算の意味を説明してみました。分数の割り算とは

```math
1 \div \frac{1}{6} = \frac{1}{1/6}
```

になるので、つまり分母の意味ですね。で、分母の意味とは、この値で単位を変換せよ！ということと解釈できるのです。

この割り算の意味は単位の変換である、という概念を押さえておくと、統計学を勉強する上でも理解しやすいことがたくさん出てくると思います。例えば、正規分布の標準化で、

```math
X \sim N(\mu, \sigma) 
```
ならば

```math
\frac{(X-\mu)}{\sigma} \sim N(0,1)
```

というのが出てきますが、この分母に$\sigma$とでてくる意味は、$\sigma$ 1つ分だけ離れていると、それを単位として1としましょうということになっていることが、すっと頭に入ってくるかと思います。

**分母は単位の変換！**です。

ではでは。
ObjC to Swift : NSTimer


Objective-C

```Objective-C
@property (nonatomic, strong) NSTimer * timer;

- (void) repeatSomething
-{
    [self.timer invalidate];
	
    self.timer =
    [NSTimer scheduledTimerWithTimeInterval: 60.0
                                     target: self
                                   selector: @selector( doSomething: )
                                   userInfo: nil
                                    repeats: YES];
    [self.timer fire];
}

- (void) doSomething: (NSTimer *) aTimer
{
	// do some cool stuff
}
```

Swift (requires "@objc" before "func doSomething")

```Swift
var timer: NSTimer!

func repeatSomething()
{
    self.timer?.invalidate()
	
    self.timer =
    NSTimer.scheduledTimerWithTimeInterval( 60.0,
                                    target: self,
                                  selector: Selector( "doSomething:" ),
                                  userInfo: nil,
                                   repeats: true )
    self.timer.fire()
}

@objc func doSomething( aTimer: NSTimer )
{
	// do some cool stuff
}
```
ObjC to Swift : NSMutableArray to Swift Array


Objective-C

```Objective-C
NSMutableArray * array = [NSMutableArray array];

[array addObject: @"Objective-C"];
```

Swift

```Swift
var array = [String]()

array.append( "Swift" )		// add as an object

or

array += [ "Swift" ]		// add as a 1-element array
```