OmniAICreator/Qiita-1.07M huggingface dataset:
iOS9でのFacebookログイン

iOS9でFacebookログインの実装方法のまとめです。
今回は画面にFacebookのログインボタンを表示する方法です。

## Facebook　Developerへの登録とSDKのダウンロード
[Facebook　Developer](https://developers.facebook.com/)でアプリを登録し、SDKをダウンロード。

## info.plistの登録
Facebook　Developerで登録したFacebookAppID、FacebookDisplayNameをinfo.plistに追加する。
またLSApplicationQueriesSchemesを以下のように設定する。

![スクリーンショット 2016-04-26 23.21.36.png](https://qiita-image-store.s3.amazonaws.com/0/44140/7697008e-547c-d494-5533-f3defea58f54.png "スクリーンショット 2016-04-26 23.21.36.png")

## framework追加

Facebook　DeveloperからダウンロードしたSDKから以下のframeworkをプロジェクトに追加する。

* FBSDKCoreKit.framework
* FBSDKLoginKit.framework

## ViewControllerの実装
FBSDKLoginButtonDelegateを実装したViewControllerを以下のように実装する。

```ViewController.swift
import UIKit
import FBSDKCoreKit
import FBSDKLoginKit

class ViewController: UIViewController, FBSDKLoginButtonDelegate {
    func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {
        print("Logged In Success")
        if (error != nil) {
            print(error.debugDescription)
        } else if (!result.isCancelled) {
            // ログイン成功
        }
    }
    
    func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) {
        // ログアウトに必要な処理を実装
    }
    
    override func viewDidAppear(animated: Bool) {
        if (FBSDKAccessToken.currentAccessToken() == nil) {
            // トークンがない場合は未ログインなので、ログインボタンを表示
            print("Not Logged In")
            let loginView : FBSDKLoginButton = FBSDKLoginButton()
            self.view.addSubview(loginView)
            loginView.center = self.view.center
            loginView.readPermissions = ["public_profile", "email", "user_friends"]
            loginView.delegate = self
        }
    }


}
```

## 実行時の画面
### 未ログイン時

![Simulator Screen Shot 2016.04.26 23.27.19.png](https://qiita-image-store.s3.amazonaws.com/0/44140/dd7ce1b1-3d53-c8a2-ac11-5ae4e0ead571.png "Simulator Screen Shot 2016.04.26 23.27.19.png")

### ログイン後

![Simulator Screen Shot 2016.04.26 23.30.06.png](https://qiita-image-store.s3.amazonaws.com/0/44140/589d4d57-ffcf-e051-af17-2b9a1f600dea.png "Simulator Screen Shot 2016.04.26 23.30.06.png")
async/await を使った非同期ラムダ式を変数に代入する方法

async/await を使った非同期ラムダ式を変数に代入したくなった時に
ラムダ式を代入するための変数の型がわからなくなったので、覚書として残しておきます。

# 引数なし、戻り値なし
async/await を用いた**「戻り値なしの非同期関数」**は、戻り値が **Task** で必要があるので、
この時の非同期ラムダ式の型は **Func\<Task\>** となります。

```csharp
using System.Threading.Tasks;

Func<Task> AsyncFunc = async () =>
{
    await Task.Delay(1);
};

```
# 引数あり(int)、戻り値なし
引数に **int** が追加されただけなので、
この場合の非同期ラムダ式の型は **Func\<int, Task\>** となります。

```csharp
using System.Threading.Tasks;

Func<int, Task> AsyncFunc2 = async (int time) =>
{
    await Task.Delay(time);
};
```

# 引数なし、戻り値あり(bool)
async/await を用いた**「戻り値ありの非同期関数」**は、戻り値が **Task\<【戻り値の型】\>** で必要があるので、
この場合の非同期ラムダ式の型は **Func\<Task\<bool\>\>** となります。

```csharp:
using System.Threading.Tasks;

Func<Task<bool>> AsyncFunc3 = async () =>
{
    await Task.Delay(1);
    return true;
};
```


# 引数あり(int)、戻り値あり(bool)
引数に **int** が追加されただけなので、
この場合の非同期ラムダ式の型は **Func\<int, Task\<bool\>\>** となります。

```csharp:
using System.Threading.Tasks;

Func<int, Task<bool>> AsyncFunc4 = async (int time) =>
{
    await Task.Delay(time);
    return true;
};
```
RubygemでWARN: Clearing out unresolved specs.が出た時の対応

#このエラーって何？
「同一のgemが複数バージョンでインストールされていて、システムでどれを選ぶか決めきれないよ」という警告。

#解決策
システムで決めきれるようにすれば良い

方法は2つ
1. 旧バージョンのgemを削除し、選択肢を1つにする
2. 具体的なバージョンを指定する

1はやや乱暴ですが、使えるのならこちらが良いと思います。
几帳面な方や1が（権限的に）使えない方は2を使いましょう。


#1.旧バージョンのgemを削除し、選択肢を1つにする
`gem cleanup`
これだけで良いです。
場合によっては`sudo gem cleanup`かもしれません。

#2.具体的なバージョンを指定する
- 古いバージョンのgemを消すといろいろまずい
- `gem cleanup`をするにはsudoを行う権限が必要なのに、システム上権限を持っていない（持てない）
等の場合はこちらの方法にしましょう。

###step1:  何がエラーになっているかを確認する
例えば`gem cleanup`をした際に権限が無いとこんなエラーが返ってきます。

```bash
$ gem cleanup
Cleaning up installed gems...
Attempting to uninstall json-1.7.7
Unable to uninstall json-1.7.7:
	Gem::InstallError: json is not installed in GEM_HOME, try:
	gem uninstall -i /opt/rh/ruby200/root/usr/share/gems json
```

で、ここでtryと言われているコードを実行しても権限なくてダメです。
（そもそもsudoを行う権限は持っていません）

```bash
$ gem uninstall -i /opt/rh/ruby200/root/usr/share/gems json
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /opt/rh/ruby200/root/usr/share/gems directory.
```

###step2: gemのバージョンを確認する

```bash
$ gem list -a | grep json。
json (1.8.3, 1.7.7)
```

新版の1.8.3と旧版の1.7.7が混在していることがわかります。
※gem cleanupでは`Attempting to uninstall json-1.7.7`の記述があるため、この旧版の1.7.7を削除しようとしたようです。

###step3: 新しいバージョンをgemファイルに追記する

```ruby:Gemfile
gem 'json', '1.8.3'
```

これで解決！
.NET MVC(C#)からjavascriptやnodejsを実行して戻り値を取得する

[Edge.js](https://github.com/tjanczuk/edge#how-to-call-nodejs-from-c)はnode.jsとC#やpythonなどを混在してプログラミングしちゃおうみたいなそんなやつみたいです。

今回はC#からnode.jsを実行したかったので使ってみました。
.NET MVCでAPIを書いている想定です。

NuGetでインストールしましょう。

``` nuget

Install-Package Edge.js
```

## C#のクラスからjavascriptファイルを呼び出してみる

形態素解析してみたかったんですが、NMecabに辞書機能がないっぽいので、rakutenma.jsを使ってみました。

``` Controllers/HogeController.cs

using EdgeJs;
public class HogeController :ApiController
{
    public async Task<string> Get()
    {
        var arg = "test";
        var result = await Edge.Func(this.JsSource("rakutenma_tokenize.js"))(arg);
        return result.ToString();
    }
    public string JsSource(string path)
    {
        var rootPath = System.Web.HttpContext.Current.Server.MapPath("/");
        return "return function (data, callback) {" + File.ReadAllText($"{rootPath}/Scripts/{path}") + "}";
    }
}
```

``` Scripts/rakutenma_tokenize.js
callback(null, 'Node.js ' + process.version + ' welcomes ' + data);
```

以下のような文字列が返る
> Node.js v5.9.1 welcomes test

## npm から取得したrakutenma.jsを使う

[rakutenma.js](https://github.com/rakuten-nlp/rakutenma)

~~packagesフォルダがあるところで~~
wwwroot直下で
`npm install rakutenma --save`
します。
(node_modulesをどこに置くべきなのかわかりませんが、deploy時にも一緒にアップロードする必要がありそうでしたので、ここにしたら動きました)

Scripts/rakutenma_tokenize.js を書き換えます。

``` Scripts/rakutenma_tokenize.js
var RakutenMA = require('rakutenma');
/* __dirname は bin/edge だった */
var model = require('../../node_modules/rakutenma/model_ja.json');
var rma = new RakutenMA(model, 1024, 0.007812);
rma.featset = RakutenMA.default_featset_ja;
rma.hash_func = RakutenMA.create_hash_func(15);

var message = rma.tokenize('彼は新しい仕事できっと成功するだろう。');


callback(null, 'result = ' + JSON.stringify(message));
```

以下のような文字列が返る
> result = [["彼","D"],["は","P-rj"],["新しい","A-c"],["仕事","N-nc"],["で","P-k"],["きっと","F"],["成功","N-nc"],["する","V-dp"],["だろう","X"],["。","M-p"]]

なんか動いてるっぽい感じです!!やった

追記

同じことやってる人いた!!用途までかぶっているとは
http://tamafuyou.hatenablog.com/entry/2016/04/10/045238
位置情報を取得できない場合に確認する点(備忘録)

#備忘録です
Androidアプリ開発の初心者は開発機として、simカード無しの端末を利用する場合が多いと思います。
(iPhoneユーザは特にそうだと思う)
上記のような環境で位置情報の取得にチャレンジしている人で、
bluetoothでテザリングをしてるのにもかかわらず位置情報が取得出来ない！
ってなってる人が見てくれると嬉しいです笑

#結論
wifiをONにして位置情報の取得を実施してみてください。
位置情報の取得が可能になる可能性があります。
位置情報の取得間隔が短いことも要因の1つかもしれませんが深く調査はしません。
こんなことで結構はまってしまったので、参考になれば幸いです。

wifiの基本的なお話はこういうサイト見るといいかもしれませんね。
http://www.dreamhive.co.jp/201410/2688
Catalyst等のコンフィグのACLを表形式に表示して検索する（Excel不要）

# やりたいこと
ルーターやL3スイッチに大量のACLが設定されていて、
ひょんなことから、表形式に表示、検索したくなったときのやり方です。
Excelがない環境でもPowerShellさえあればできます。

# コード
```ps1
# ACLをヒアドキュメントとして定義
$acl=@"
access-list 101 permit tcp host 10.1.1.2 host 172.16.1.1 eq telnet        
access-list 101 permit tcp host 10.1.1.2 host 172.16.1.1 eq ftp 
access-list 101 permit udp host 10.1.1.2 host 172.16.1.1 eq syslog        
access-list 101 permit udp host 10.1.1.2 host 172.16.1.1 eq tftp        
access-list 101 permit udp host 10.1.1.2 host 172.16.1.1 eq ntp
"@

# グリッドビューに表示  (1..10)の10はACLをスペース区切りしたときの項目数
$acl | ConvertFrom-Csv -Delimiter " "-Header @(1..10) | Out-GridView
```

ACLをファイルに保存した場合は

```ps1
Get-Content "acl.txt" | ConvertFrom-Csv -Delimiter " "-Header @(1..10) | Out-GridView
```

# 表示
このように表示されます
![Image1.png](https://qiita-image-store.s3.amazonaws.com/0/113577/07a872dc-10b1-579e-a141-38a2bfea2b2a.png)


# 検索もできる
検索もできます
![Image2.png](https://qiita-image-store.s3.amazonaws.com/0/113577/5b110359-24af-01ad-549a-880cd9a22419.png)
Android版Chromeみたいなボタン付きメニュー

![chrome.png](https://qiita-image-store.s3.amazonaws.com/0/422/cb52f43c-2d11-7d9a-a651-49b07ab671cd.png)
Android版Chromeのようなリストアイテムの上部にボタンが並んだメニューを、PopupWindowとしてActivity/Fragmentの上に重ねて表示します

今回はViewを細かく触らずAdapterを使って済ませたかったので、[ListPopupWindow](http://developer.android.com/intl/ja/reference/android/widget/ListPopupWindow.html)にヘッダーとしてボタンを表示し、リストとしてメニュー内容（新しいタブ、新しいシークレットタブ…）を表示します
[PopupWindow](http://developer.android.com/intl/ja/reference/android/widget/PopupWindow.html)でやるなら多分PopupWindow::setContentViewでできると思います


ListPopupWindow::setAdapterでListViewと同じようにアダプターを渡すと、リスト表示したPopupWindowが表示されます
ListPopupWindowはListViewのようにHeaderViewを追加することができないので、一度HeaderViewつきのListViewを用意してから、ListViewのアダプターをListPopupWindowに設定します

``` ListPopupWindow
ListPopupWindow popupWindow = new ListPopupWindow(this);

ListView listView = new ListView(this);
listView.addHeaderView(createHeader(popupWindow.getListView()));
listView.setAdapter(createListAdapter(this));

HeaderViewListAdapter adapter = (HeaderViewListAdapter) listView.getAdapter();
popupWindow.setAdapter(adapter);
popupWindow.show();
```

するとChromeメニューのように、ヘッダーつきのリスト表示PopupWindowが表示されます
![chromenu.png](https://qiita-image-store.s3.amazonaws.com/0/422/b3f97e79-c42f-85bd-23f3-db74f1ebfe13.png)

あとはHeaderView内にImageButtonを表示してクリックイベントを紐付ければChromeアプリのメニューのように動かせます
ソース:https://github.com/gyamoto/ChroMenu
docker-engine install からのhello world 

docker-engineをインストールする手順

##0. 準備するもの

- vagrant
- Virtual Box
- teratermとかmacのterminalとかで仮想OSにログインしておく

##1. install
debianでもcentosでもやることは同じ

https://docs.docker.com/engine/installation/
この公式ページの手順を見る。
centos向け or debian向けのチュートリアルを見る。
(centosは7以上じゃないとダメっぽい。)
`https://get.docker.com` のスクリプトを使えと指示される。
以下はcentos7の例です。

```bash
##prepare centos7 with vagrant
vagrant init centos/7; vagrant up --provider virtualbox
##prepare ssh config
vi ~/.ssh/config
## 適当にログインする時のホスト名とかを設定する。ここでは仮に'vm001'とした。
ssh vm001
[vagrant@localhost ~]$  ##ログインした。
## install docker-engine
sudo yum update
sudo su
curl -fsSL https://get.docker.com/ | sh
service docker start  ##start docker
docker version        ##confirm version
Client:
 Version:      1.11.0
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   4dc5990
 Built:        Wed Apr 13 18:40:36 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.11.0
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   4dc5990
 Built:        Wed Apr 13 18:40:36 2016
 OS/Arch:      linux/amd64
```
できた。あっという間だ。

##2. hello world

docker hub からhello world用imageをpullしてきてそれをrunしてcontainerにする。
dockerの公式チュートリアルを見ながらやってみた。

```bash
docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
03f4658f8b78: Pull complete 
a3ed95caeb02: Pull complete 
Digest: sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca36966a7
Status: Downloaded newer image for hello-world:latest

Hello from Docker.
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com

For more examples and ideas, visit:
 https://docs.docker.com/userguide/
```


```bash

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
7ab0159e11b3        hello-world         "/hello"            39 seconds ago      Exited (0) 39 seconds ago                       nostalgic_elion

docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              690ed74de00f        6 months ago        960 B
```

imageからコンテナが立ち上がる。素敵だ。
JRuby 9.0.x でうまく動かないbit_length

[直前の投稿](http://qiita.com/jkr_2255/items/8e29dce1999f3f6b69ad)で取り上げた`Integer#bit_length`ですが、JRubyではうまく使えないという事実が判明してしまいました。

# 存在しない`Bignum#bit_length`
まずは、`bit_length`を使ったコードを動かそうとしたところ、値によっては動くのですが、大きくしていくとすぐに動かなくなります。

そこで理由を調べていくと、なんとJRubyでは`#bit_length`が**`Fixnum`にしかない**という事実が判明しました。

すぐに[GitHubでIssueを立てた](https://github.com/jruby/jruby/issues/3827)のですが、JRubyではJavaの`BigInteger`を使っていて、これが`Bignum#bit_length`と同じ値を返す`.bitLength()`メソッドを持っているので、Rubyレベルで補ってもとりあえずは対応できます。

```rb
require 'java'

unless Bignum.method_defined?(:bit_length)
  class Bignum
    def bit_length
      to_java.bitLength
    end
  end
end
```

# 負の数に使えない`Fixnum#bit_length`
上のを調べる過程で、JRubyのJavaソースも読んでいたのですが、`Fixnum#bit_length`の実装が[こんなふうになっていました](https://github.com/jruby/jruby/blob/master/core/src/main/java/org/jruby/RubyFixnum.java#L1194)。

```java:core/src/main/java/org/jruby/RubyFixnum.java
    @JRubyMethod
    public IRubyObject bit_length(ThreadContext context) {
        return context.runtime.newFixnum(64 - Long.numberOfLeadingZeros(value));
    }
```

考えてみれば、Javaの`Long`は64ビットで、負になれば先頭の符号ビットが立つので、負の数に対して`Long.numberOfLeadingZeros`は常に0です。ということで、`Fixnum#bit_length`は、負の数について**常に64を返してしまう**実装となっていました。これまた[Issueとしています](https://github.com/jruby/jruby/issues/3829)。

不便だし、Polyfill用にGemを作ろうかなあ……
RailsでGeocoderを結果をキャッシュしながら使う

# 目的

+ 緯度経度情報を扱う必要があり、簡易に住所を緯度経度変換したい
+ 緯度経度を元に地図検索を実装していくが、中心地点の定義は郵便番号や地名等でピンポイントで指定したい
+ 緯度経度の検索結果はキャッシュしたいけど、有効期限も設定しておきたい
    + google のAPI利用上限に引っかかるかもしれないのでキャッシュしたい

# やったこと

## Gemfile

```rb
gem 'geocoder'
```

## config/initializers/geocoder.rb

+ いつもは大体`redis` に突っ込んじゃうんだけど、`redis` が使えなかった  
+ なので、ファイルキャッシュを使用し、有効期限の設定をすることにした

```rb
Geocoder.configure(
  language: :ja, 
  cache:        ActiveSupport::Cache::FileStore.new([Rails.root, 'tmp', 'geocoder'].join('/'), { expires_in: 30.days }), 
  cache_prefix: 'geocoder:',
)
```

# 基本的な使い方

+ ```Geocode.search('東京都')``` などを記載すると自動的に結果がキャッシュされます
+ ２回目以降、キャッシュ有効期限内であればそちらから取ってくるのでプログラム側で特にキャッシュを意識する必要はないです

# 補足

+ gem ファイルのgithub
  + https://github.com/alexreisner/geocoder
postgresqlでの暗黙キャストを試す

# この記事の話題
暗黙の型変換を定義してその挙動を確認しました。
postgresql 9.3でためしてます。

# 具体的な問題

テーブルを作る

``` sql
create table hoge( 
  id numeric (3, 0)
  , valid numeric(1,0)
); 
```

insertを発行する(psqlで実施)

``` insert
postgres=# insert into hoge values (1, true);
ERROR:  列"valid"は型numericですが、式は型booleanでした
行 1: insert into hoge values (1, true);
                                  ^
HINT:  式を書き換えるかキャストしなければなりません
```

numericに対してbooleanは指定できない。
この記事では上記のSQLがうまく動かすとことその周辺まで書きます。

# 暗黙の型変換を定義

暗黙の型変換を定義することで、異なる型のCASTを定義することでInsertを可能にします。
具体的には以下の手順。

1.型変換をfunctionを定義

例：integerをboolに変換する関数b2nを定義

```
CREATE FUNCTION b2n(bool) RETURNS numeric(1) AS
'select
  case
    when $1 IS TRUE
    then CAST(1 AS NUMERIC(1))
    else CAST(0 AS NUMERIC(1))
    end;'
LANGUAGE SQL;
```

2.castにfunctionを設定

integerをboolにするCASTを暗黙的に設定。（AS ASSIGNMENTは後述）

```
create cast(bool as numeric) WITH FUNCTION b2n(bool) AS ASSIGNMENT;
```
# 再実施

暗黙の型変換を定義して再実施するとInsertに成功する。

```
postgres=# insert into hoge values (1, true);
INSERT 0 1
postgres=# select * from hoge;
 id | valid
----+-------
  1 |     1
(1 行)
```

Insertできました、めでたい。

#コンテキスト
postgresqlでの暗黙キャストには2種類コンテキストがある。
上記の例ではASSIGNMENTを設定した。

## 代入コンテキスト（ASSIGNMENT）
代入時に利用されるように指定する。デフォルト値（INSERTとかUPDATEとか）
## 任意のコンテキスト（IMPLICIT）
あらゆる文脈で呼ばれる（式とか）

# コンテキストの設定による挙動の違い

コンテキストの設定による挙動の違いの例を記載します。

先ほどのboolをnumericに変換するキャストをASSIGNMENTを指定していた場合

``` ASSIGNMENTでの例
postgres=# select 1+true;
ERROR:  演算子が存在しません: integer + boolean
行 1: select 1+true;
              ^
HINT:  指定名称、指定引数型に合う演算子がありません。明示的な型キャストが必要か
もしれません
```
trueに対してキャストは実施されないためこのようにエラーになります。

boolをnumericに変換するキャストをIMPLICITで指定していた場合

```
postgres=# select 1+true;
 ?column?
----------
        2
(1 行)
```
暗黙的に式の中でboolに対してcastが実施されて結果が出力されます。

# 暗黙キャストの削除

ここまで試したことをなかったことにします。

（１）castを削除

```
drop cast(bool as numeric);
```

（２）型変換のfunctionを削除

```
drop function b2n(bool);
```

# まとめ
既存のSQLを変えられないなど困った制約に対してこういうごまかしがききそうです。

ただ、性能面の劣化などはあるので計画的に使っていきましょう。

#参考
[Postgresql CREATE CAST](https://www.postgresql.jp/document/9.5/html/sql-createcast.html)
[Xcode] Resource Bundle の作成

# 環境

ver. Xcode7.3
Date 2016/4/26

# 自作SDKで参照するCoreDataModelファイル(.xcdatamodeld)が 参照できない :scream: 

ボトルネックとなったメソッド👇

```objc
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@".xcdatamodeldファイル名" withExtension:@"momd"];
```

戻り値がnilを返されてしまた

そこで参照するファイルを.bundleファイルで作成

# Resource Bundle作成

新規プロジェクトから OS X -> Framework&Library -> Bundleを選択し新規に作成する

![スクリーンショット 2016-04-26 20.47.43.png](https://qiita-image-store.s3.amazonaws.com/0/100514/4bae33ee-7c9b-7823-9847-6a0938e7511c.png)

ここで打ち込むProduct Nameに.bundle拡張子がついたものが実際のResourceBundleとして作成される

![スクリーンショット 2016-04-26 20.49.35.png](https://qiita-image-store.s3.amazonaws.com/0/100514/8a6042fa-0cae-c2d4-7422-86ec29ef6bd0.png)

# リソースを追加

作成されたプロジェクト内にResrorceBundleに含めたいファイルを追加する

![スクリーンショット 2016-04-26 20.57.58.png](https://qiita-image-store.s3.amazonaws.com/0/100514/b53a476f-60ad-edac-921e-23fe4b93e98e.png)

# プロジェクト設定を編集

プロジェクトがOSXで作成した為、(2015/4/26現在iOSプロジェクトはない)SDK設定がOSXのままになっているので変更が必要

TARGETS -> Build Settings -> Architectures -> BaseSDKをiOSに変更
変更すると依存関係がある設定は全てiOSように自動的に変更されます

変更前
![スクリーンショット 2016-04-26 21.00.50.png](https://qiita-image-store.s3.amazonaws.com/0/100514/740af3ca-a760-49c1-f9c2-fb9c4b1b16be.png)

変更後
![スクリーンショット 2016-04-26 21.04.09.png](https://qiita-image-store.s3.amazonaws.com/0/100514/10d8647d-539c-5103-5eac-afce3a34448c.png)


# .bundleファイルの出力先を変更

TARGETS -> Build Settings -> Build Locations -> Perconfiguration Build Products Pathを変更

デフォルトでは
```
$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
```
となっているのを

```
Products
```

に変更し、.xcodeprojがある直下に実態としてのProductsフォルダを作成

ビルドすると、作成したフォルダに.bundleが作成されます。

<img width="666" alt="スクリーンショット 2016-04-26 21.15.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/100514/ab17e1ca-4edb-728a-c085-9aae6ec1ca3a.png">


# 作成した.bundleからResourceを参照する

組み込みアプリ側のTARGETS -> Build Phases -> Copy Bundle Resourcesから追加します

細かく記述すると

```objc
NSString *path = [[NSBundle mainBundle] pathForResource:@"KazuTeraResource" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:path];
NSURL *modelURL = [bundle URLForResource:@"TestModel" withExtension:@"momd"];
```

これで無事URLが取得できました:smile:
Swift の guard は正しく使いましょう

## 概要

guardの使い方を整理していた時に[http://radex.io/swift/guard/](http://radex.io/swift/guard/) の記事を見つけてしまったので超訳しつつリビルドしてみました。

## はじめに

Swiftのguard構文は`エラーが発生したら終了`や`この値は来てほしくない`,などのguard節として利用と、`アンラップした変数を以降の処理でも使いたい` などの場面で使われるのが一般的かと思います。

実際の案件でのコードレビューを見てみると、ifで良い場面でguardを使ったり、guardを使うことで逆にわかりにくくなったりするケースがありました。リファレンスに書かれている使い方をもう一度明確にするために利用方法を整理してみます。

##  一般的な使い方

### アンラップした変数をスコープ外で利用する

変数をアンラップしてguardブロック以降のスコープでも利用する

```swift
guard let url = NSURL(string: coverPath) else { // NSURL.init?(string URLString: String)
    abort()
}

if imageManager.cachedImageExistsForURL(url) { 
    省略...
```

### 早期リターンとしての利用

**メソッド開始直後に条件を満たしていなければ早期にリターンする**

```swift
private func deleteDownloadTask() {
    guard let realm = self.realm() else {
        return
    }

    try! realm.write {
	// realmを使ったなんらかの処理
    }
}
```

**複数条件の判定** 

カンマで区切って複数条件をチェックしつつアンラップできます。
長い処理の中での中断を判定する処理としてもguardは有効利用できます。

[※Xcode12からは面倒だった複数行のインテントが揃うようになったとのことです](https://qiita.com/shira-shun/items/5363bdb3f1d7424f7329#guard-let%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%B3%E3%83%88%E3%81%8C%E6%8F%83%E3%81%86%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F)

```swift
func onUpdateSubscriptionLevel(notification: NSNotification) {
    if self.isTopmost(true) {
        guard let channel = self.viewModel.channel,
              let episodes = self.viewModel.episodes else {
            return
        }

        // 何らかの処理

        guard let subscribe = notification.parameter().data as? Subscribe else {
            return
        }

        // 何らかの処理
    }
}
```

**アサーションとしての利用**

※単純なチェックならassertでもいいと思います。

```swift
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    guard let story = self.viewModel.stories?[indexPath.row] else {
        abort()
    }

    // 何らかの処理
}
```

## NGな使い方

**どちらかを返すようなメソッドの中で利用する**

```swift
func isLogin() -> Bool {
    guard let _ =  SettingService.sharedInstance.currentUserId else {
        return false
    }
    return true
}

// 判定結果を返せばいいので != で良い。 

func isLogin() -> Bool {
    return SettingService.sharedInstance.currentUserId != nil
}
```

**Rubyのunlessの様に利用する**

Rubyには条件式が偽の場合の処理を記述する「unless」という構文があります。

Swiftのguardは名前の通りguard節としての利用方法が正しい使い方ですので、unlessのように使うと可読性が悪くなります。

```swift
// 悪い例
guard SettingService.sharedInstance.isUserLogined(userId) == true else {
    // ユーザーIDをセットする処理
}

// 改善例
// guard 構文内にロジックを書くのは分かりにくいので if を利用する
if !SettingService.sharedInstance.isUserLogined(userId) {
    // ユーザーIDをセットする処理
}

```

## まとめ
guardはアンラップ 兼 guard節として利用しましょう

## 参考
[Swift_Programming_Language Statements](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Statements.html)
NEologd Casual Talks | #neologd 

#NEologd Casual Talks | #neologd 

遅いですが、下記のイベントに参加したので、備忘録として、記録したことを公開させて頂きます。

http://connpass.com/event/29841/

#NEologd が2016年末までにやること
@overlast 	 	

> NEologd の今後の予定と、完成してたら新しい機能や、何か実験が終わっていたらその結果、集まっていたら使用事例をご紹介します

##まとめ

下記の問題

1:Unidicで直す

2:キーワード抽出

3:GEOapi

###カラム拡張で対応

オプション

--expand-colum(辞書の拡張)

git リポジトリにupしたカラム拡張を共有できる。

###定量的な評価

文書分類タスクで確認

IPA辞書、UniDicのベスト結果を上回る
文書分類では副作用がない

###予定

動詞エントリの拡張

略語エントリの追加

新語の追加（コミット可能）

#知識を紡ぐための言語処理と、そのための言語資源

@conditional 	 	

> 言語データの意味理解のためには、形態素解析や「辞書に対するマッチング」を超えた言語処理が必要であることは論をまちません。今回は、一歩進んだ固有表現解析のための、「エンティティリンキング」というタスクを紹介します。また、我々が構築している固有表現に関する構造化された言語資源をいくつか紹介します。

http://www.slideshare.net/koji_matsuda/ss-61363395

##まとめ

![Screen Shot 2016-04-26 at 20.32.05.jpg](https://qiita-image-store.s3.amazonaws.com/0/10496/7a7c4665-f138-e13e-c1fa-548e48447e28.jpeg)

乾研究室

![Screen Shot 2016-04-26 at 20.33.45.jpg](https://qiita-image-store.s3.amazonaws.com/0/10496/06fc5dd1-2e66-8218-c32c-ef279e32cf08.jpeg)

知識

言語理解には「知識」を持たせる

Twitter,Wikipedia

Wikipedia,FreeBase

• リソースの配布元 • 日本語 Wikification コーパス – 
http://www.cl.ecei.tohoku.ac.jp/jawikify/ 

• 場所参照表現タグ付きコーパス
 – http://www.cl.ecei.tohoku.ac.jp/~matsuda/LRE_corpus/

• 日本語 Wikipedia Entity ベクトル
 – http://www.cl.ecei.tohoku.ac.jp/~m-suzuki/jawiki_vector/ 

• 英語
 - https://github.com/idio/wiki2vec

• 拡張固有表現 + Wikipedia データ 
– http://www.languagecraft.com/enew/ 

#ファッションを扱うサービスのために、Elasticsearchのユーザー辞書とシノニム辞書を作った話
@sinamon129 	 	

> 自然言語処理とは無縁のアプリケーションエンジニアが、ファッションフリマアプリの商品検索改善のために、Elasticsearchのユーザー辞書とシノニム辞書を作った話をします。あまり世の中にユーザー辞書・シノニム辞書を作った知見が公開されない中で実サービスの要件に合わせてどう辞書を作っていったかの話をできればと思います。

##まとめ

ユーザー
表記揺れ、略称、絵文字、タイトル、商品説明、状態、形状、セールスポイント、表記間違い

マスタはそのまま

###最初

Recallが高い状態（uniGram）

F値が高い状態が理想

uniGramよりヒット率が低くならないようにするためにNeologdに

###今後

inquisitorのプラグインは確認

上位概念＋辞書の単語を登録

検索時の揺れはキーワードサジェストで対応

作業コストが低い方法＋資源としての正しさ

検索ログを見ている（上から何000件）

使用していて、気付いたら意見もらう

サービス内の活性化（1ページ目で検索結果が出ない場合はないと思っている）

検索からの購買に繋がった

https://speakerdeck.com/sinamon129/hurirufalsekiwatojian-suo-falsejing-du-gai-shan

#NEologdをどう使うと便利なのか ークエリ拡張 or 検索ソート順における活用
@Quasi_quant2010 	 	

> 旧来の言語資源だけでなく、Webからクロールした大量文書データ等を基に抽出される固有表現コーパスとしてNeologdが商用で利用されており、継続的にWebから取得される事が日々の変化を補足する点で重要な知見となっている。さらに、検索サービスを広告商品として使用する企業にとって、ユーザーが日々検索クエリを生み出していることもあり、固有表現を保守運用する事は難しい。他方、検索クエリと広告のマッチングにおいてクエリ拡張が重要となることは周知の事実である。そこで、クエリ拡張を行う際、NEologdをどう使うと便利なのかを考察する。

http://www.slideshare.net/Quasi_quant2010/neologd

##まとめ

クエリSuggestにおける前処理エラー補正
Suggestにおける複合語を補正

クエリ拡張
１：サジェストしたクエリ拡張
２：クエリ拡張モデルを使用
３：Neologdで補正（複合語の場合はくっつける）

固有表現だと一致するものが少ない→クエリ拡張とNbestそのあとで補間はNeologd

固有表現の方が良い情報を提示しやすい

#前処理用Pythonモジュールneologdnの紹介

@_yukinoi 	 	

> テキストの前処理の大切さと、その前処理を行うneologdnについて軽くお話しします

##テキストの前処理

文字コードの違い

テキストを一定のルールに基づいて整える。

半角カナを全角カナにする。

neologdn(Neologdの前処理用Pythonモジュール)

```
pip install neologdn
```

前処理用のライブラリ

http://www.slideshare.net/yukinoi/pythonneologdn
Learning Rails 7 (Create show page)


```bash
vi app/views/users/index.html.erb
```

We will change this line for creating link for show

```ruby:index.html.erb
<li><%= link_to user.name, user_path(user.id) %>:<%= user.approved%></li>
```

current index.html.erb

```ruby:index.html.erb
<h1>Users</h1>
 
<ul>
  <% @users.each do |user| %>
    <li><%= link_to user.name, user_path(user.id) %>:<%= user.approved%></li>
  <% end %>
</ul>
```

When you create file like index, show and so on, you always need to check this command.

```bash
rake routes
```

![スクリーンショット 2016-04-26 18.57.13.png](https://qiita-image-store.s3.amazonaws.com/0/39073/bc1651b1-7196-6f66-86e9-fa31138bbf53.png "スクリーンショット 2016-04-26 18.57.13.png")


|Prefix | Verb | URI | Controller#Action| Explanation |   
|:-----------|:------------|:------------|:------------|:------------|
|users|GET|/users|users#index|users_path is that users controller and index action|
|user|GET|/users/:id|users#show|user_path is users controller and show action|

```bash
vi app/controllers/users_controller.rb
```

Add these lines

```ruby:users_controller.rb
def show
  @user = User.find params[:id]
end
```

current users_controller.rb

```ruby:users_controller.rb
class UsersController < ApplicationController
  def index
    @users = User.all
  end
 
  def show
    @user = User.find params[:id]
  end
end
```

```bash
vi app/views/users/show.html.erb
```

```ruby:show.html.erb
<h1>Users Show</h1>
 
<%= @user.name %>:<%= @user.approved %>
<br />
```

You can check it from browser

```bash
rails s
```

![スクリーンショット 2016-04-26 19.11.18.png](https://qiita-image-store.s3.amazonaws.com/0/39073/d42007f6-10a4-ba64-f4d4-479a79a55c66.png "スクリーンショット 2016-04-26 19.11.18.png")


![スクリーンショット 2016-04-26 19.11.25.png](https://qiita-image-store.s3.amazonaws.com/0/39073/3d0c9627-1df2-dfa8-2091-4c2d521d1d4e.png "スクリーンショット 2016-04-26 19.11.25.png")
c++ builder / TThread > TThread終了時にポインタをNULLにする > OnTerminate ()処理でexternポインタにNULLをセットする

```txt:動作確認
C++ Builder XE4
```

TThreadでインスタンシエートした処理が何かの理由で終了した時、そのポインタ(例: TThread* ThrPtr)はNULLにならない。
そのため、ThrPtrを保持する処理からはThrPtrが終了してしまっているかはわからない。

検索したところ、NULLを設定する方法を提案している例が見つかった。

http://stackoverflow.com/questions/15820858/terminating-thread-variable-and-setting-it-to-null

answered Apr 4 '13 at 20:34 by Remy Lebeau
によるコードが参考になる。

- `extern TMyThread *MyThread;`をTMyThread のヘッダーで宣言しておく

- OnTerminate ()処理にて`MyThread = NULL;`を実行する

<hr>
extern宣言すると、コードの依存性が生まれる。

OnTerminate()にてインスタンス作成元のSetterを呼ぶようにしてフラグ
Learning Rails 6 (Edit common layout)


[前回はこちら](https://qiita.com/joji/items/309853fb7c659fcbdeed)

```bash
vi app/views/layouts/application.html.erb
```

Add this line

```bash
<h1>Learning Rails Project</h1>
```

```ruby:application.html.erb
<!DOCTYPE html>
<html>
<head>
  <title>Learning</title>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
  <%= csrf_meta_tags %>
</head>
<body>
 
<h1>Learning Rails Project</h1>
<%= yield %>
 
</body>
</html>
```

Edit css

```bash
vi app/assets/stylesheets/application.css
```

Add this line

```
body { background: #eee; }
```

```bash
vi app/views/layouts/application.html.erb
```

We will add lint to Jump root path.

```add link
<%= link_to "Home", root_path %>
```

current application.html.erbx

```ruby:application.html.erb
<!DOCTYPE html>
<html>
<head>
  <title>Learning</title>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
  <%= csrf_meta_tags %>
</head>
<body>
 
<h1>Learning Rails Project</h1>
 
<%= yield %>
 
<%= link_to "Home", root_path %>
 
</body>
</html>
```

![スクリーンショット 2016-04-26 18.51.30.png](https://qiita-image-store.s3.amazonaws.com/0/39073/3860be09-c569-4e12-8f72-e2b593166182.png "スクリーンショット 2016-04-26 18.51.30.png")
Learning Rails 5 (Create Controller)


[前回はこちら](https://qiita.com/joji/items/da2b1f1d71eb8ffaa1b4)

create controller

```bash
rails g controller Users
```

Add this line for setting up URL

```bash
resources :users
```

![スクリーンショット 2016-04-26 18.28.30.png](https://qiita-image-store.s3.amazonaws.com/0/39073/b7b83a84-372a-8130-734a-de87acb684a5.png "スクリーンショット 2016-04-26 18.28.30.png")


```bash
vi app/controllers/users_controller.rb
```

```ruby:users_controller.rb
class UsersController < ApplicationController
  def index
    @users = User.all
  end
end
```

```bash
vi app/views/users/index.html.erb
```

```ruby:index.html.erb
<h1>Users</h1>

<ul>
  <% @users.each do |user| %>
    <li><%= user.name %>:<%= user.approved %></li>
  <% end %>
</ul>
```

```bash
rails s
```

You can see users from here. http://192.168.43.200:3000/users

![スクリーンショット 2016-04-26 18.33.52.png](https://qiita-image-store.s3.amazonaws.com/0/39073/13028a7b-9cc4-6d20-b51e-6195c4588d14.png "スクリーンショット 2016-04-26 18.33.52.png")

Setting root PATH

```bash
vi config/routes.rb
```

Add this line

```bash
root 'users#index'
```

You can see users from here. http://192.168.43.200:3000
We don't need /users anymore.
声に出して読みたい Java ライブラリ -UnmodifiableCollection-

# はじめに
**Java では final の配列の要素は可変**です。私が何を言っているかわからない方は下記のコードを実行してみてください。

```java:finalのArrayは不変じゃない
public class Main {

    private static final String[] STRINGS = {"Tomato", "Orange", "Apple"};

    public static void main(final String[] args) {
        STRINGS[2] = "Cabbage";
        System.out.println(Arrays.toString(STRINGS));
    }
}
```

上記のコードを実行した際の出力は下記の通りです。

```:結果
[Tomato, Orange, Cabbage]
```

大変です！ Apple が Cabbage に置き換わってしまいました。

# では、固定の要素集合を提供するには？
『Effective Java』(日本語版第2版p70)にも書いてある通り、「**変更できない要素の集合**」を定義したいなら下記の方法を使いましょう。

## Collections#unmodifiableList
引数で渡された List と同じ要素を持つ、変更不可の List を返すメソッドです。下記の例では Arrays#asList で一時的な List を作り、それを引数にして Collections#unmodifiableList を呼び出し、変更不可の List を取得しています。

```java
private static final List<String> STRINGS
    = Collections.unmodifiableList(Arrays.asList("Tomato", "Orange", "Apple"));
```

実装は[こちらのリンク](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/Collections.java#1054)をご参照ください。

ちなみに、Arrays#asList で生成される List は add と remove ができませんが、 set は可能です。

# UnmodifiableCollection のよくないところ
ここから本題です。せっかく unmodifiableList を取得しても、Listの実装である以上は要素変更のメソッド(add/remove/set)が存在していますので、下記のコードは正常にコンパイル可能です。

```java
STRINGS.set(2, "Cabbage");
```

が、実行すると下記の通り UnsupportedOperationException となります。

```java:怒りのUnsupportedOperationException
Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.Collections$UnmodifiableList.set(Unknown Source)
	at jp.toastkid.Main.main(Main.java:13)
```

うーん……継承を使って実装する以上は仕方ないという感じですかね……しかし、実行時に例外を出されてプログラムを止められるよりは、コーディング中にコンパイルエラーを出してくれた方がいいと私は思います。

# そこで
可能なら Eclipse Collections の ImmutableCollection を使ってみるとよいでしょう。元から add/remove/set が実装されていないので、間違って実行する以前にコンパイルエラーとなります。

## 例
下記の例では3つの要素を持つ ImmutableList のインスタンスを生成します。そのインスタンスに対し set メソッドを呼び出そうとしますが、そのようなメソッドは ImmutableList には実装されていないため、コンパイルが通りません。

```java:ImmutableListの使用例
import org.eclipse.collections.api.list.ImmutableList;
import org.eclipse.collections.impl.factory.Lists;

......

    private static final ImmutableList<String> STRINGS 
        = Lists.immutable.of("Tomato", "Orange", "Apple");

    public static void main(final String[] args) {
        STRINGS.set(2, "Cabbage"); // ここでコンパイルエラー
        System.out.println(STRINGS);
    }
```

変更不可の状態を保てなくはなりますが、toList() メソッドで java.util.List への変換も可能です。

# 参考
1. [java.util.Collections](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Collections.html)
2. [java.util.Arrays](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Arrays.html)
3. [org.eclipse.collections.api.collection.ImmutableCollection](https://www.eclipse.org/collections/javadoc/7.0.0/org/eclipse/collections/api/collection/ImmutableCollection.html)
4. [GS Collections 使い方メモ](http://qiita.com/opengl-8080/items/a13773e0653800e23323)……GS Collections は Eclipse Collections の旧称です。
Django モデルのテーブル名とカラム名を同時に変更の手順

## Django モデルのテーブル名とカラム名を同時に変更の手順

## 変更前
```
class AAA(models.Model):
    name = models.CharField()
    
    class Meta:
        db_table = 'aaa'

class BBB(models.Model):
    name = models.CharField()
    aaa = models.ForeignKey(AAA)
    
```


## 変更後
```
class CCC(models.Model):
    name = models.CharField()

    class Meta:
        db_table = 'ccc'

class FooTwo(models.Model):
    name = models.CharField()
    ccc = models.ForeignKey(CCC)
```


## 修正手順

(1). models.py修正

```
class CCC(models.Model): <- AAAをCCCに修正
    name = models.CharField()

    class Meta:
        db_table = 'ccc' <- aaaをcccに修正

class FooTwo(models.Model):
    name = models.CharField()
    aaa = models.ForeignKey(CCC)　<- ForeignKey(AAA)をForeignKey(CCC)に修正
```

(2). schemammigration後migrationファイルを以下に修正

```
    def forwards(self, orm):
        db.rename_table('aaa', 'ccc')

    def backwards(self, orm):
        pass
```
(3). migrate
 - テーブル名が変更されたかを確認する AAA -> CCC
 
(4). models.py修正 

```
class CCC(models.Model):
    name = models.CharField()

    class Meta:
        db_table = 'ccc'

class FooTwo(models.Model):
    name = models.CharField()
    ccc = models.ForeignKey(CCC)　<- aaaをcccに修正
```


(5). schemammigration後migrationファイルを以下に修正

```
    def forwards(self, orm):
        db.rename_column('ccc', 'aaa', 'ccc')

    def backwards(self, orm):
        pass
```

(6). migrate
 - カラム名が変更されたかを確認する aaa -> ccc
cakephp 2 primaryKeyをオリジナルにした場合のmodel->deleteの動作について

cakePHPで、
primary keyを original_idとしている場合、

deleteで失敗します。

なので、ModelでprimaryKeyを指定すればいいんだろって思うけれどもところがどっこい。

modelにおいて、
public $primaryKey = "original_id"
とすればよいと、どこを見ても書いてあるのですが、
実際には、

public $displayField = "original_id"
これも書かないといけません。

なぜかって、cakePHPがdeleteの前に、fetchAllをしていたからでした。
そこでdisplayFieldの値が欲しいわけです。
もちろんうまくいくケースがあります。
それはマニュアルにある通り、displayFieldを指定しない場合はデフォルトとして、[id]を参照するからです。さらに[id]が無い場合は、[name]と[title]も見に行くみたいです。それらもなければ、エラーです。残念ながら。

cakePHPは便利な分、デフォルトで設定されているところがあるので、困ったもんですね。

ちなみに、Stack Overflowでも投稿がありますが、最終的には「doesn't work」で、deleteAllにすれば？ってことになってます。もちろん、displayField指定しないでdeleteAllで解決できますが気持ち悪いですよね。

http://stackoverflow.com/questions/17994040/delete-function-not-working-cakephp


こっちでもうすこし詳しく書こうかと思ってます。まずはメモ程度に。(-_-;)http://staff.qualias.jp
AutoLayoutの原因不明のバグ

※iOS7の端末(iPhone5c)で発生。iOS8の端末(iPhone6 plus)では発生せず。

#AutoLayoutでAspectRatioを使用した際に発生
詳細は不明だが、AspectRatioを使用した際に、iOS7の端末で強制終了してしまう場合がある模様。
内部的なレイアウト位置・サイズの計算で浮動小数誤差が累積することで発生する場合があると言われている。
(StackOverflow：http://stackoverflow.com/questions/17688370/autolayout-removefromsuperview-removeconstraints-throws-exception-and-crashes)

既に存在したQiitaの記事では、以下の方法が紹介されていた。
(Qiita：http://qiita.com/musclemikiya/items/0f550e35c1eafca2ebcf)

- 16:9の比率を若干ずらして対応する
- aspect ratioとheightを両方指定する

その他にも、

- レイアウトエディタ上で定義順を変更
- height・widthを割合で指定する(Propotional Height/Width)ような場合は、小数点以下の桁数は１桁/2桁程度に抑える。または、可能な限り「Reverse First And Second Item」を使用して関係を逆転し、設定値を整数にする

した場合にも症状が改善する場合があった。
今更な記事ではあるが、iOS7のサポートを継続する際に必要とすることがあるかもしれないので備忘録として残す。
WerckerでQuay.ioのPrivate Repositoryを使用する

この記事は[AndroidのCI環境をCircleCIからWerckerにした話](https://speakerdeck.com/horie1024/androidfalsecihuan-jing-wocirclecikarawerckernisitahua)に関連した投稿です。

# 概要

wercker.ymlのboxに[Quay.io](https://quay.io/)(キーio)でホストしたrepositoryを指定する方法についてのメモです。

Quay.ioは、セキュアなDocker private repositoryのホストサービスになります。Dockerのホスティングサービスは複数ありますが、社内の他プロジェクトで利用実績のあるQuay.ioを使用します。

# wercker.ymlの例

以下はAndroidプロジェクトをビルドするwercker.ymlです。boxにはDockerHubのPublic Repositoryに登録したimageを使用しています。このboxで指定しているRepositoryをQuay.ioでホストした物に変更します。

```yaml:wercker.yml
box: horie1024/wercker-android-build:0.1
build:
  steps:
    - script:
        name: execute unit test
        code: |
          ./gradlew testDebug
    - script:
        name: execute assembleRelease
        code: |
          ./gradlew assembleRelease
```

# wercker.ymlのboxセクションでPrivate Repositoryを指定する
wercker.ymlのboxセクションでPrivate Repositoryを指定する方法は、[こちら](http://devcenter.wercker.com/docs/containers/private-containers.html)のドキュメントが参考になります。そして、Quay.ioではyamlは以下のようになります。

idにはRepository名、username、passwordについては、WerckerのWeb UIで入力した環境変数を参照するようにします。

```yaml
build:
  box:
    id: quay.io/knuth/golang
    username: $USERNAME
    password: $PASSWORD
    tag: beta
    registry: quay.io
  steps:
    - script:
      name: echo
      code: echo "hello world!"
```

ドキュメントとは異なりますが、以下のようにyamlを書いても問題ありませんでした。個人的にはこちらの方がわかりやすい気がします。

```yaml
box:
  id: quay.io/knuth/golang
  username: $USERNAME
  password: $PASSWORD
  tag: beta
  registry: quay.io
build:
  steps:
    - script:
      name: echo
      code: echo "hello world!"
```

また、DockerHubのPrivate Repositoryの場合以下のようなyamlになります。DockerHubの場合`registry`の指定は不要です。

```yaml
build:
  box:
    id: guido/python
    username: $USERNAME
    password: $PASSWORD
    tag: latest
  steps:
    - script:
      name: echo
```

# Werckerの環境変数に登録するusernameとpasswordを用意する

WerckerでPrivate Repositoryを使用するためには、usernameとpasswordが必要になるため、Quay.ioのRobot Accountsを作成し、そのusernameとpasswordをWerckerのWeb UIから登録します。

## Robot Accountsの作成
Quay.ioにログインすると以下のような画面が開くので、左側のメニューから「Robot Accounts」を選択します。そして、右上の「Create Robot Account」をクリックしRobot名を入力してEnterを押します。これでRobot Accountが作成されます。

![quay1.png](https://qiita-image-store.s3.amazonaws.com/0/43438/6ab7635b-eaa9-a7d4-8a63-24d8fe00888b.png "quay1.png")

## Robotのusernameとpasswordの取得

Robot Account Nameをクリックするとusernameとpasswordが表示されます。

![quay2.png](https://qiita-image-store.s3.amazonaws.com/0/43438/d87aac79-4123-6923-e2c2-f235bf9a4bd0.png "quay2.png")

## Werckerへの登録

Werckerのドキュメントを参考に入力すればOKです。
http://devcenter.wercker.com/docs/environment-variables/creating-env-vars.html
prometheusのexporterのcollectd-exporterをdockerでちょろっと動かしてみる

[collectd](https://collectd.org/)を利用すると、システムのメトリクス情報を収集できるらしいです。
かつ、[前回の投稿](http://qiita.com/letusfly85/items/cca776ddef8c4175722d)でさわってみたprometheusにも簡単に連携できる、とのことです。

[prometheusのexporter群](https://prometheus.io/docs/instrumenting/exporters/)に触りながら覚えていこうと思います。

1. dockerでprometheus自体を動かす
2. 適当にexporterに触ってみる
3. alertをいじってみる
4. 公式docを見直す。[BestPractice](https://prometheus.io/docs/practices/naming/)のページを見てみる。

くらいのノリでやっていこうと思います。

### 1. collectd-exportのdockerコンテナを起動する

```bash
docker pull prom/collectd-exporter

docker run -d -p 9103:9103 prom/collectd-exporter
```


### 2. prometheus.ymlを用意する

```prometheus.yml
global:
  scrape_interval: 15s # By default, scrape targets every 15 seconds.
  evaluation_interval: 15s # By default, scrape targets every 15 seconds.
  # scrape_timeout is set to the global default (10s).

  # Attach these extra labels to all time-series collected by this Prometheus instance.
  #labels:
    #monitor: 'panamax-monitor'

rule_files:
  - '/etc/prometheus/alert.rules'

# A scrape configuration containing exactly one endpoint to scrape:
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.

  # Panamax
  - job_name: 'panamax'
    scrape_interval: 5s

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s
    scrape_timeout:  3s

    target_groups:
      - targets: ['${collectd-exporterを動かしたIPなど}:8080','${collectd-exporterを動かしたIP}:9103']
        labels:
          group: 'development'
```

targetsの配列に、9103のポートのエンドポイントを追加してあげます。

### prometheusのコンテナの（再）起動

前述の`prometheus.yml`をdokcerのvolumeオプションなどでうまいこと外だししていればコンテナの再起動をするだけで設定反映されて、targetsに追加されたエンドポイントのメトリクス収集が始まるみたいです。

便利ですねー。

### UIでGraphを確認する

なんとはなしに取得できているように見えます。

![Screenshot from 2016-04-26 18-46-12.png](https://qiita-image-store.s3.amazonaws.com/0/49547/ff915a6d-7fda-6574-68ae-c11a53c7b2d0.png)


### 感想

* コンテナのメトリクスなのか本体のメトリクスなのか確認したいところです。
* 他のexporterも試してみようと思います。とくにk8sとmesosでしょうか。
* 類似製品との共通点と相違点を見ていく必要がありそうです。

---

本日は以上となります。
Laravelのインストールと設定


今まではすでに作られたLaravelの一部をごにょごにょしてましたが、
今回初めていちからLaravelをつくってみることにしたので覚書。

- [Laravel公式サイト](https://laravel.com/ "Laravel公式サイト") Doucumentation/Installationのところ
- Laravelリファレンス（インプレス社）

を参考に。 

##Composerのインストール
すでに入っていたのでスキップ。
入っていない人は[公式サイト](https://getcomposer.org/ "公式サイト")からインストールしてください。

##Laravelのインストール

###まずはインストーラー

- **Laravel Installer**
- Composer Create-Project

の２種類の方法があるそうですが、私は前者を使用することに。  

```
composer global require "laravel/installer"
```

でLaravel Installerのインストールが完了。

###いよいよLaravelつくっちゃおう

`~/.composer/vendor/bin` ディレクトリへ実行パスを通して

```
laravel new {プロジェクト名} 
```

すれば **{プロジェクト名}** という名のLaravelができます。やったー

##環境設定について

環境についてのファイルは全て `config` ディレクトリ内にあります。
少し構造を見てみます。

###アクセス権の設定

`storage` ディレクトリと`bootstrap/cache` ディレクトリの書き込みを可能にしておかなきゃLaravelは動かない。
すでに書き込み可能になってるので基本的に気にしなくていい。

###キーの作成

暗号化の際に使われる32桁のランダムな文字列です。
セキュリティ的に必要ですが、新しいLaravelのプロジェクトをつくったらすでにできたキーはできてる模様。
ばしょは `.env` ファイルのAPP_KEYにかかれてます。

ちなみに自分で作るとしても `artisan` コマンドで簡単につくれる。

```
php artisan key:generate
```

こうすると `.env` ファイルのAPP_KEYのところに作ったやつが入る。
（ちゃんと作ったプロジェクトディレクトリ内に移動してコマンド打とうね）

あと `.env` ファイルがない場合は `.env.example` をコピーしてつくればよし。

###その他の設定

ほぼ何もせんでもよし。
`config/app.php` ファイルには `timezone` や `local` も載ってるみたいなのでみるといいかも。
koa-routerで特定のパスだけmiddlewareを設定する

koaで特定のパスだけbodyをパースしたいときは、koa-routerの`use`にパスとmiddlewareとしてkoa-bodyparserを渡す。

```js
// koa: 2.0.0, koa-router: 7.0.1, koa-bodyparser: 3.0.0
import Koa from 'koa'
import Router from 'koa-router'
import bodyParser from 'koa-bodyparser'

const route = new Router()

let users = [
  { name: 'bob', age: 20 },
  { name: 'tom', age: 40 }
]

route.get('/', (ctx, next) => {
  ctx.body = users
})

route.post('/add', bodyParser(), (ctx, next) => {
  const { name, age } = ctx.request.body
  users.push({ name, age })

  ctx.status = 200
})


const app = new Koa()
app
  .use(route.routes())
  .listen(3000)
```
URL変更時にFacebookシェア数をリセットしない

# 動機
サイトリニューアルなどによってどうしてもURLが変わる（変えたい）ことありますよね？
その時、Facebook の シェア数 などはURLに結び付いているのでゼロにリセットされてしまいます。でも、せっかくためた シェア数 です。残したいですよね？

リダイレクトすればいい、og:urlを指定すればいい、など色々いわれますが、なかなかうまくいかず。いろいろなパターンを試して、結局うまくいったのでメモ残します。[^1]

[^1]: 2016年4月時点の方法です。Facebook はよく更新されるのでいつまで使えるかわかりません。

# けっきょくどうすればいいか？
結論だけ。

- ``旧URL`` から ``新URL`` へ ``リダイレクト`` を設定する
- ``og:url`` には ``旧URL`` をいれる
- ``canonical url`` にも ``旧URL`` をいれる　``<link rel=”canonical” href="旧URL" >``
- URLに日本語が含まれている場合には、 ``og:url`` も ``canonical url`` もエンコードしたURLをいれる
- キャッシュが残っている可能性が大きいので、Facebook debugger で ``scrape`` をしてキャッシュを更新する

以上。
うまくいかなかったら、Facebook debugger でがんばってエラーを見る。
CentOS6にremiリポジトリからPHP7をインストールするときはremi-php70をつける

PHP7のインストールはすんなりと通るが、
XML関係の関数が見当たらず、下記のエラーが出てしまう状態に。

```
Call to undefined function xml_parser_create() 〜
```

libxml2やphp-xmlをyumからインストールしても直らず…。
しかし、phpinfo()をよく見てみると、xml関連のライブラリが読み込まれておらず、
別のバージョン（？）のものがインストールされていたもよう。

どうやらリポジトリ指定のオプション（enablerepo）に、
`remi`だけでなく`remi-php70`もつけないといけないみたいだった。

最終的に下記のような形でインストール。

```
$ yum install php php-common php-cli php-mbstring php-mcrypt php-xml php-xmlrpc php-pdo php-mysqlnd --enablerepo=remi,remi-php70
```

30分くらい悩んだ。
NavigationDrawer開閉時のハンバーガーボタンのアニメーションを無効にする方法


## 概要
ActionBarDrawerToggleを使用してNavigationDrawerを実装すると開閉時にハンバーガーボタンにアニメーションが付いてしまいますが、NavigationDrawerをToolbarに被せていると、このアニメーションがビミョーな感じになってしまいます。
今回はこのビミョーな感じになってしまう開閉時アニメーションを無効にする方法を紹介します。

![before.gif](https://qiita-image-store.s3.amazonaws.com/0/40539/5e3f5efe-6bd6-85fd-5440-1fd6b4bc178d.gif "before.gif")

## 方法
以下のように、```onDrawerSlide``` の第二引数に ```0``` を渡してあげるだけ。

```SampleActivity.java
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
    actionBarDrawerToggle.onDrawerSlide(drawerView, 0);
}
```

これでアニメーションを無効にすることができます。

![after.gif](https://qiita-image-store.s3.amazonaws.com/0/40539/8f813f6c-c27a-c41b-9b54-abf29b28e047.gif "after.gif")

## 補足
```ActionBarDrawerToggle#onDrawerOpened``` の内部でハンバーガーボタンを矢印に変える処理が入っています。

```ActionBarDrawerToggle.java
@Override
public void onDrawerOpened(View drawerView) {
    mSlider.setPosition(1); // これでハンバーガーボタンを矢印に変えています
    if (mDrawerIndicatorEnabled) {
        setActionBarDescription(mCloseDrawerContentDescRes);
    }
}
```

NavigationDrawerをToolbarに被せない場合は ```onDrawerOpened``` にも処理を書いてあげる必要があります。

```SampleActivity.java
@Override
public void onDrawerOpened(View drawerView) {
    drawerToggle.onDrawerOpened(drawerLayout);
    actionBarDrawerToggle.onDrawerSlide(drawerView, 0);
}
```
【rails】とりあえず入れている便利なgem19個まとめ(2016年05月04日更新)

最近、Railsプロジェクトでとりあえず入れているgem20個まとめております（随時更新中です）
自分のメモ用なので特に目新しいものはないですが…笑

何か、おすすめがあればぜひ教えてください

## gem 'devise'
簡単ログイン実装のgem（冷静になると複雑）
http://qiita.com/Salinger/items/873e3c667462746ae707

## gem 'slim-rails'
slimの記法を使うためのgem
http://ruby-rails.hatenadiary.com/entry/20140929/1411997071

## gem 'draper'
decorator使うためのgem
http://morizyun.github.io/blog/draper-ruby-gem-code-clear/

## gem 'rubocop'
rubyらしいコードを書くためのgem
http://qiita.com/yaotti/items/4f69a145a22f9c8f8333

##gem 'awesome_print', require: 'ap'
ログ情報が見やすくなるgem
http://ruby-rails.hatenadiary.com/entry/20141028/1414505988

## gem 'better_errors'
めっちゃ見やすいエラー画面
http://morizyun.github.io/blog/better-error-gem-rails-ruby-rack/

##gem 'rails-i18n'
翻訳シート的なgem
http://ruby-rails.hatenadiary.com/entry/20150226/1424937175

## gem 'seed-fu', '~> 2.3'
初期データをrake db:seedよりも上手に入れてくれるgem
http://qiita.com/ko2ic/items/be96e450a33d631e0059

## gem 'carrierwave' & gem 'rmagick'
画像系の処理
http://www.workabroad.jp/tech/1118

## gem 'remotipart'
ajax送信用のgem（:remote => trueだけでajax送信してくれるようになる）
http://nanofi.hatenablog.com/entry/20111226/1324851176
（ちょい古い記事）

## gem 'dotenv-rails'
環境変数を管理してくれるdotfileの管理gem
http://qiita.com/closer/items/f8d8ba00ae86d7051764

## gem 'rspec-rails', '~> 3.0.0'
RSPECを使うためのgem
http://morizyun.github.io/blog/rspec3-beginner-bdd-tdd-test-first/
  
## gem 'factory_girl_rails'
テストデータをいれるgem
http://qiita.com/muran001/items/436fd07eba1db18ed622

## gem 'letter_opener_web'
WEBから開発中のメールがめっちゃ簡単に見れるようになるgem
http://k-shogo.github.io/article/2013/11/06/rails-letter-opener/

## gem 'pry-rails' & gem 'pry-byebug'
binding.pryを使うためのdebug用gem
http://ruby-rails.hatenadiary.com/entry/20141024/1414160189

## gem 'hirb' & gem 'hirb-unicode'
pry中にModelデータを綺麗に整形して吐き出してくれるgem
http://ruby-rails.hatenadiary.com/entry/20141024/1414160189

## gem 'annotate'
Modelの上部にSchemeを書き出してくれるgem
http://qiita.com/satton_maroyaka/items/8aa7441f21bc5ac763db


# コピペ用

```rb
gem 'devise'
gem 'slim-rails'
gem 'draper'
gem 'rubocop'
gem 'better_errors'
gem 'rails-i18n'
gem 'seed-fu', '~> 2.3'
gem 'carrierwave'
gem 'rmagick'
gem 'remotipart'
gem 'dotenv-rails'
gem 'annotate'

group :development, :test do
  gem 'rspec-rails', '~> 3.0.0'
  gem 'factory_girl_rails'
  gem 'awesome_print', require: 'ap'
  gem 'pry-rails'
  gem 'pry-byebug'
  gem 'hirb'
  gem 'hirb-unicode'
end

group :development do
  gem 'letter_opener_web'
end
```

### デフォルトに入ってる奴は基本的に載せていませんが、アプリ内では使用しています。
ActiveModelを用いたフォームで配列やハッシュを扱う方法

検索フォームなど、モデルに基づかないフォームを作る時に、ActiveModelを使ってフォームを作りたかったが、配列やハッシュをフォームで扱う時に若干詰まったのでメモ。

結論から言うと、スマートな方法ではないので、諦めた方が良さそう。
良さげな方法があったら教えてください。

例えば、レベルがmin〜maxの間のUserを検索するフォームを作りたいという場合で、levelをハッシュでやりとりしたい場合。
関係ない部分は諸々大分省略してるので脳内補完してください。

```rb:Form
class UserSearchForm
  include ActiveModel::Model
  attr_accessor :name, :level

  validates :name, length: { in: 6..20 }
end
```

```erb:View
<%= form_for(@user_search_form, url: search_user_url)
  <%= f.text_field :name %>
  <%= f.number_field :level, name: "user_search_form[level[min]]", value: @user_search_form.level.try(:fetch, :min, nil) %>
  <%= f.number_field :level, name: "user_search_form[level[max]]", value: @user_search_form.try(:fetch, :max, nil) %>
  <%= f.submit "検索" %>
<% end %>
```

```rb:Controller
class UsersController < ApplicationController
  def search
    @user_search_form = UserSearchForm.new(params[:user_search_form])
    @results = User.order(:id)

    @results = @results.where("name LIKE ?", @user_search_form.name) if @user_search_form.name.present?
    if @user_search_form.level.present?
      @results = @results.where("level >= #{@user_search_form.level[:min]}") if @user_search_form.level[:min].present?
      @results = @results.where("level <= #{@user_search_form.level[:max]}") if @user_search_form.level[:max].present?
    end
  end
end
```

Viewのフォームでname属性を指定しているところがミソ。
これでControllerに値が渡る時に`params[:user_search_form]`内に`level`がハッシュとして入る。
でも、valueをよしなにしてくれなかったりで、そもそもActiveModelを使う利点が薄れてしまっているのでかなり微妙。
今回の例なら、わざわざハッシュにしなくても`attr_accessor`に`:level_min`と`:level_max`を定義して使えば良さそう。

## 参考リンク
[ActiveModelを使ってDBと関係ないFormを作成する](http://tanihiro.hatenablog.com/entry/2014/01/09/193720)
[stackoverflow - Rails: form_for with field for Hash](http://stackoverflow.com/questions/17606638/rails-form-for-with-field-for-hash)
[hashに対してtryする](http://nyaahara.hatenablog.com/entry/2015/02/01/002540)