OmniAICreator/Qiita-1.07M huggingface dataset:
Mac OS X の Vagrant provider 事情


Vagrant で Parallels が使えるのに今更ながら気付いたので、Mac OS X で動作する3つの provider について気になった点をメモ。なお性能比較はしていません。

#### VMware Fusion
* VM の kernel をアップデートすると VMware Tools を手動で更新する必要がある
* tcpdump するとハングして kill するしかなくなる (version 5 〜 7 で確認済み)
* vagrant-vmware-fusion plugin を VMware Fusion のバージョンアップ毎に買う必要がある

#### VirtualBox
* vagrant-vbguest plugin を入れておけば、VM 起動時に必要に応じて Guest Additions を自動更新してくれる
    * VM の kernel をアップデートしても面倒がない
* macvlan を使うと (そのままでは) 通信できない
    * 親のデバイスに対して tcpdump すると通信できるようになる (promiscuous mode になるから)
    * VirtualBox の仮想 NIC が自身の MAC アドレスのパケットしか通さないらしく、macvlan で勝手に追加した MAC アドレスのパケットがドロップされてしまうのが原因ぽい ([参考1](https://github.com/jpetazzo/pipework#virtualbox)、[参考2](http://serverfault.com/questions/414517/vagrant-virtualbox-host-only-multiple-node-networking-issue))
    * 深追いしてないが、参考に書かれている通り modifyvm を指定してみても動作しなかった

#### Parallels
* vagrant-parallels plugin は Parallels 主導で OSS で開発されている
* VM 起動時に必要に応じて Parallels Tools を自動更新してくれる
    * VM の kernel をアップデートしても面倒がない
* Headless mode がないので、VM 起動時に VM のウィンドウが表示される
	* VM のウィンドウを閉じても停止するわけではない
	* Parallels Desktop.app を Cmd+Q 等で閉じたら VM も終了してしまう
	* Parallels Desktop.app を起動せずに `vagrant up` すれば Headless で動作するが、その後アプリを起動すると起動中の VM のウィンドウが表示される
        * Yosemite の通知センター Widget はアプリが起動していないと使えない
PepperのタブレットにWebページを表示してみる

#はじめに
我が家に住んでいるPepper(名前は **ぺぱにゃん** です．家に来た日については [こちら](http://titech-ssr.blog.jp/archives/1013137064.html))に付いている**タブレット**に**Webページを表示する**ことができたので，その方法を紹介します．

# 方法
Pepperのタブレットはandroid(ドキュメント参照)で本体とは別のOSで動作しているようです．
なので，まずタブレットのWifiの設定をする必要があります．
以下のようなpythonのコードで設定します．

```py
# ALTabletService の API を使用する
tabletService = self.session().service("ALTabletService") 
# Wifiを有効化
tabletService.enableWifi()
# Wifiの設定．securityはwepかwpaかopen，keyは暗号鍵．
tabletService.configureWifi(security, ssid, key)
```

Wifiの設定後，タブレットのWebviewを表示し，表示したいWebページのURLを読み込みます．

```py
# Webviewをタブレットに表示する
tabletService.showWebview()
# 表示したいWebページのURLを読み込む
tabletService.loadUrl(url)
```

私はまだ使っていませんが，**getWifiStatus**メソッドを使って接続状態の確認を行った後にURLの読み込みを行ったほうが良いと思います．

# 結果
**ぺぱにゃん**に [http://rogiken.org/](http://rogiken.org/) のページを表示した結果は以下の通りです．
![pepanyan-rogiken.jpg](https://qiita-image-store.s3.amazonaws.com/0/18292/1211508b-cd2a-af0d-2f36-b3d149dff03c.jpeg)

ちゃんとタッチもできます．

# まとめ
Pepperアプリのプロジェクトのhtmlフォルダ内のhtmlはloadApplicationメソッドで表示できますが，
インターネット上のWebページはタブレットのWifiの設定をしてWebviewを表示してloadUrlメソッドで読み込む必要があります．

本体とは別にWifiの設定をしないといけないのは面倒ですが，これで色々とできることが増えそうですね．
Windowsでjuliusによる音声認識

- [Juliusの公式サイト](http://julius.sourceforge.jp/index.php) からWindows用バイナリのZipファイルを入手して展開する。
- なお、すぐに実行できるのは「julius最新版」でなく「ディクテーションキット」の方
- 展開して`run.bat`を実行すると`<<< please speak >>>`が表示された時点でPCに接続されているマイクからの入力待ちになる

思ったより認識精度が芳しくないので何か対策を考える
Dockerことはじめ for Mac OS X

**Docker**の概念や仕組みをググってなんとなく把握した後で、
実際触ってみました。

[この方の記事](http://blog.co-mit.com/post/24/Mac%E3%81%ABDocker%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F)をまとめた感じです。

ほとんど、ターミナルでのコマンド作業です。

# セットアップ

Macでは、**boot2docker**という仮想マシン上の
Dockerサーバーを操作してDockerコンテナを実行する形です。

### 必要な環境

・OS X (私はYosemiteです、DockerはSnowLeopard以降サポート)
・VirtualBox (本家サイトからパッケージをインストール)
・Homebrew （[こちらの手順](http://qiita.com/b4b4r07/items/6efebc2f3d1cbbd393fc)でインストールしました）

### インストール

boot2dockerだけでdockerも含まれるっぽい。

```
$ brew tap home-brew/binary
$ brew install docker boot2docker
```

バージョン確認して正常にインストールされたことを確認

```
$ docker version
$ boot2docker version
```

### 初期化と起動

VirtualBoxがインストールされていないと、エラーがでて先に進めません。
初期化のinitは１度だけ実行するだけ。

```
$ boot2docker init
$ boot2docker up
```

### 環境変数の設定

起動した時に表示される仮想環境への以下の設定値を、
.bash_profileなどに設定して読み込みます。
クライアントが仮想マシンに向いて連携するためですね。

```lang:私の環境の場合
export DOCKER_HOST=tcp://192.168.59.103:2376
export DOCKER_CERT_PATH=/Users/tetsuya_harada/.boot2docker/certs/boot2docker-vm
export DOCKER_TLS_VERIFY=1
```

# コンテナの操作

CentOS6で試していく。
参考までに、オフィシャルの[イメージ一覧](https://registry.hub.docker.com/search?page=1&q=library&f=official)。

### イメージの取得

pullしてローカルに保存。

```
$ docker pull centos:centos6
```

ローカルのイメージ確認。

```
$ docker images
```

### コンテナの各種コマンド

コンテナをcentos6-upという名前で起動、該当OSのbashも。
`-p 80:80`はホストOSとDockerコンテナーのポートマッピング。

```
$ docker run -t -i -p 80:80 --name centos6-up tetsuyanh/centos6-up /bin/bash
```

exitで、コンテナを停止。

```
# exit
```

前回作業した環境をそのまま再開できます。
アパッチとかのプロセスは再起動する必要あります。

```
$ bash
bash-3.2$ docker start -i centos6-up
```

コンテナの削除

```
$ docker rm centos6-up
```

# イメージの作成

LAMP環境を加えたカスタマイズをイメージにする。
コンテナ上で、yumでLAMPをインストール。

```
# yum update
# yum install httpd
# yum install php php-gd php-mysql php-intl php-xml php-xmlrpc php-soap php-pecl-apc php-odbc php-mbstring
# yum install mysql mysql-server
```

timezoneを日本にしておく（date.timezone = Asia/Tokyo）

```
# vi /etc/php.ini
# chkconfig httpd on
```

この環境をイメージとして保存

```
$ docker commit centos6-up myimage/centos6-lamp
```

`docker images`で、今作成したイメージを確認できる。

# 検証

コンテナーを起動して、アパッチ（HTTPD）を起動する。

```
$ bash
$ docker start -i centos6-up
# /etc/init.d/httpd start
```

簡単なPHPページを用意する。

```
# vi /var/www/html/info.php
```

```php
<?php
phpinfo();
?>
```

DOCKER_HOSTに指定した仮想サーバーでPHPページが見れることを確認。
http://192.168.59.103/info.php
Nancy.Linkerパッケージを試してみた

[ここ](http://blog.nancyfx.org/using-nancylinker-with-razor-views)で紹介されていた Nancy.Linker パッケージを試してみました。ビューにはRazorを使っています。

## これは何？

リンク先としてルート名を渡すと、それに見合った相対パスや絶対パスを出力してくれるクラスを含むパッケージ。

## 使い方

### パッケージのインストール

Nugetでインストールするだけ

```
install-package Nancy.Linker
```

### モジュールクラス作成

コンストラクタでIResourceLinker型値を受け取るようにします。

あとは、ビューモデルにIResourceLinker型とNancyContext型のプロパティを持たせる必要があります。

これについては、重複がひどいことになるのが気持ち悪い。。(そもそもビューモデルに渡す内容か？)

```csharp
using Nancy.Linker;
...

public class MainModule : NancyModule
{
    public MainModule(IResourceLinker linker) : base() 
    {
        //ルート名, パス
        Get["root", "/"] = _ =>
            Negotiate
                .WithModel(new { Linker = linker, Context = this.Context })
                .WithView("index");

        Get["top", "/top"] = _ =>
            Negotiate
                .WithModel(new { Linker = linker, Context = this.Context })
                .WithView("index");

        Get["bar", "/bar"] = _ =>
            Negotiate
                .WithModel(new { Linker = linker, Context = this.Context })
                .WithView("bar");

        Get["hogetop", "/hoge/top"] = _ =>
            Negotiate
                .WithModel(new{Linker = linker, Context = this.Context})
                .WithView("hoge");
    }
}
```

### ビュー(index.cshtml)

```html
@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic>

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title></title>
</head>
<body>
    <ul>
        <!-- BuildRelativeUri()の第二引数がルート名 -->
        <li><a href=@Model.Linker.BuildRelativeUri(Model.Context, "hogetop")>Hoge Link</a></li>
        <li><a href=@Model.Linker.BuildRelativeUri(Model.Context, "bar")>Bar Link</a></li>
    </ul>
</body>
</html>
```

### ビュー(hoge.cshtml)

```html
@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic>

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>ほげ</title>
</head>
<body>
    <div>
        <p>Hoge!!!</p>
        <!-- BuildRelativeUri()の第二引数がルート名 -->
        <a href=@Model.Linker.BuildRelativeUri(Model.Context, "top")>Goto Top</a>
    </div>
</body>
</html>
```

### ビュー(bar.cshtml)

```html
@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic>

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>BarPage</title>
</head>
<body>
    <div>
        <p>Bar!!!</p>
        <!-- BuildRelativeUri()の第二引数がルート名 -->
        <a href=@Model.Linker.BuildRelativeUri(Model.Context, "top")>Goto Top</a>
    </div>
</body>
</html>
```
電話番号や名前を扱う時virtualFieldsが使えそう

080-0000-0000 をDBのtel1,tel2,tel3フィールドに分けて登録したり
田中　太郎　をDBname1,name2フィールドに分けて登録してる時は


    public $virtualFields = array(
        'full_name' => 'CONCAT(User.name1,User.name2)',
        'full_tel' => 'CONCAT(User.tel1,User.tel2,User.tel3)',
    );

がよさそう。
ユーザー情報一覧表ページにて、

    $this->Paginator->sort('full_name', '名前順に並び替える')

を使ってユーザーを名前順や電話番号順に並び替える時に使いました。
$this->Paginator->sort('name1', '名前順に並び替える') だと、下の名前まで入れて並び替えできないので。
ライセンス 簡易まとめ



ライセンスについて自分用に簡単にまとめました。

簡易なまとめであり情報が不足していますのでご了承ください。
詳細は[ライセンスの選択を恐れる必要はありません](http://qiita.com/tadsan/items/99d816e78ca429093b75)が詳しいです。
（参考にさせていただきました。）

| ライセンス名        | ライセンスと著作権の表示 | 商用利用 | 変更点を示すこと | ソースコードの開示 | 別のライセンスを課すこと |
|:----|:----:|:----:|:----:|:----:|:----:|
| MIT License       | 要 | 可 | - | - | 可 |
| BSD License       | 要 | 可 | - | - | 可 |
| Apache License v2 | 要 | 可 | 要 | - | 可 |
| GPL v2/v3         | 要 | 可 | 要 | 要 | 不可 |
| LGPL v3           | 要 | 可 | 要 | 要 | 可 |
Go で外部コマンドをユニットテストする

[envjson](https://github.com/yuya-takeyama/envjson) というコマンドを作る上で得られた知見として、外部コマンドをユニットテストする方法について紹介します。

テスティングフレームワークとしてはとりあえず標準の `testing` を使っていますが、これは他の何でもいいと思います。
(私自身はこれ以外のフレームワークはまだ使ったことがないんですが)

## TL;DR

`os/exec` の `exec.Command()` でコマンドを実行し、標準入出力として `bytes.Buffer` を差し込んでおくことでテストが可能。

## `exec.Cmd()`

標準ライブラリ `"os/exec"` に含まれる `exec.Command()` 関数は外部コマンドを実行するための関数です。
より正確には、`exec.Command()` 関数で `exec.Cmd` 構造体を返し、`Run()` メソッドを実行することで外部コマンドが実行されます。

実行する前に `exec.Cmd` 構造体が持つプロパティをいろいろと差し替えることで、コマンドの入出力を差し替えることが可能です。

### テスト対象のコマンド

パイプから入力を受け取り、フィルタするいかにも UNIX 的なコマンドラインツールのことを考えます。

例えば、標準入力を受け取って、それを 2 回出力する `double` コマンドについて考えてみます。

```go:main.go
package main

import (
	"io/ioutil"
	"os"
)

func main() {
	buf, err := ioutil.ReadAll(os.Stdin)
	if err != nil {
		panic(err)
	}

	os.Stdout.Write(buf)
	os.Stdout.Write(buf)
}
```

今回はこれをテストするコードを用意します。
なお、今回は外部コマンドを直接実行することでテストするので、あらかじめ `go build` して `double` を executable としてコンパイルしておく必要があります。

```
$ go build -o double
$ echo foo | ./double
foo
foo
```

このように、標準入力として受け取った foo という文字列を 2 回出力しています。

### 標準入出力を差し替える

`exec.Cmd` 構造体は `Stdio`, `Stdout`, `Stderr` というプロパティを持っており、それらにストリームを渡すことで、標準入出力を差し替えて実行することができます。

以下は標準入力として `"foo\n"` を渡し、標準出力として実行元プロセスの標準出力を渡しています。

```go:main_test.go
package main

import (
	"bytes"
	"os"
	"os/exec"
	"testing"
)

func TestDouble(t *testing.T) {
	cmd := exec.Command("./double")
	cmd.Stdin = bytes.NewBufferString("foo\n")
	cmd.Stdout = os.Stdout

	err := cmd.Run()
	if err != nil {
		t.Fatal("failed to execute ./double\n")
	}
}
```

ここで `go test` を実行すると以下のような出力が得られます。

```
$ go test
foo
foo
PASS
ok  	github.com/yuya-takeyama/double	0.054s
```

文字列 `"foo\n"` を `./double` に渡すことでそれが 2 回、標準出力に出力されました。

ここで標準入力には `bytes.Buffer` 構造体を使用しています。
これは Ruby や Python における `StringIO` オブジェクトのようなもので、ファイルのスタブとして使うのに便利です。
詳しくは [I/O を伴うテストには bytes.Buffer が便利](http://qiita.com/yuya_takeyama/items/c4211fa77488cb6915ec) を参照してください。

### 外部コマンドの出力をテストする

これをさらに一歩進めれば、「標準入力として `"foo\n"` を渡せば標準出力に `"foo\nfoo\n"` が出力される」といったユニットテストができます。

```go:main_test.go
package main

import (
	"bytes"
	"os/exec"
	"testing"
)

func TestDouble(t *testing.T) {
	cmd := exec.Command("./double")
	cmd.Stdin = bytes.NewBufferString("foo\n")
	stdout := new(bytes.Buffer)
	cmd.Stdout = stdout

	err := cmd.Run()
	if err != nil {
		t.Fatal("failed to execute ./double\n")
	}

	if stdout.String() != "foo\nfoo\n" {
		t.Fatal("not matched")
	}
}
```

変数 `stdout` に空の `bytes.Buffer` 構造体をセットしています。
`cmd.Run()` によってコマンドを実行すると、その出力は `stdout` 変数に書き込まれることになります。

コマンドの実行後、`bytes.Buffer` の `String()` メソッドで中身を取り出し、期待される出力と比較することでテストを行っています。

`bytes.Buffer` は内部的には `[]byte` でデータを保持しますが、このように `string` として取り出すことができます。
`Bytes()` メソッドで `[]byte` を受け取ることもできるので、必要に応じて使い分けると良いでしょう。
MKMapViewでタップした位置に円を描く（Swift 4対応）

すでに地図（MKMapView）は配置済みであることを想定しています。

## UITapGestureRecognizer登録

地図がタップされたことを検出するために `UITapGestureRecognizer` を登録します。

コードで登録することもできますが、今回はStoryBoardを使いました。「Tap Gesture Recognizer」を `MKMapView` にドラッグします。

![スクリーンショット 2014-11-15 22.27.55.png](https://qiita-image-store.s3.amazonaws.com/0/8292/c0fd2c6b-6b68-0a57-2340-cda4ae3ac9c6.png)


「Sent Actions」にタップ時に実行されるメソッド名をセットしておきます。


![スクリーンショット 2014-11-15 22.37.43.png](https://qiita-image-store.s3.amazonaws.com/0/8292/71fa767c-4288-8fda-7ec3-8921cf5faaa2.png)


今回は `mapViewDidTap` というメソッドを用意しました。

```objc
- (IBAction)mapViewDidTap:(UITapGestureRecognizer *)sender
{
    if (sender.state == UIGestureRecognizerStateEnded)
    {
        // タップした位置を緯度経度に変換してサークルを表示
        CGPoint tapPoint = [sender locationInView:self.view];
        CLLocationCoordinate2D center = [self.mapView convertPoint:tapPoint
                                              toCoordinateFromView:self.mapView];
        MKCircle *circle = [MKCircle circleWithCenterCoordinate:center
                                                         radius:100]; // 半径100m
        [self.mapView addOverlay:circle];
    }
}
```

Swift

```swift
@IBAction func mapViewDidTap(sender: UITapGestureRecognizer) {
    if sender.state == UIGestureRecognizerState.ended {
        let tapPoint = sender.location(in: view)
        let center = mapView.convert(tapPoint, toCoordinateFrom: mapView)
        let circle = MKCircle(center: center, radius: 100)
        mapView.add(circle)
    }
}
```

タップされた画面上の座標を `locationInView` で取得し、それを `convertPoint` で緯度経度に変換しているのがポイントです。

その緯度経度を元に `MKCircle` で円を作り、`addOverlay` で地図に円を表示します。

## 円の色などを設定

円が表示される際に次のデリゲートが呼ばれるので、この中で円の色などを指定します。（MKMapViewのdelegateを指定しないと呼ばれません）

```objc
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView
            rendererForOverlay:(id <MKOverlay>)overlay
{
    if ([overlay isKindOfClass:[MKCircle class]])
    {
        MKCircleRenderer *renderer =
        [[MKCircleRenderer alloc] initWithCircle:(MKCircle *)overlay];
        renderer.strokeColor = [UIColor redColor]; // 外側の線の色
        renderer.fillColor = [[UIColor redColor] colorWithAlphaComponent:0.4]; // 内側を塗りつぶす色
        renderer.lineWidth = 1; // 外側の線の太さ

        return renderer;
    }

    return nil;
}
```

Swift

```swift
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    let circleRenderer : MKCircleRenderer = MKCircleRenderer(overlay: overlay);
    circleRenderer.strokeColor = UIColor.red
    circleRenderer.fillColor = UIColor(red: 0.0, green: 0.0, blue: 0.7, alpha: 0.5)
    circleRenderer.lineWidth = 1.0
    return circleRenderer
}
```

## 実行結果

![FullSizeRender 2.jpg](https://qiita-image-store.s3.amazonaws.com/0/8292/4736a541-5359-d2e3-6539-7ff453eccb2b.jpeg)
OSXでのStorybordの使い方


XCode6 では、iOS と同様、OSX でも Storybord がデフォルトで採用されるようになった。

ヒレガス本のサンプルを Swift で写経するのが、ちょっと行き詰っている（Storybord を利用した場合の、Documentbased Application　の作成方法がさっぱり判らない）ので、気分転換に、そもそも Storybord はどうやって使うのかと、YouTube に公開されている OSX での Storybord を用いたアプリケーション開発の簡単なチュートルアルを勉強として写経してみた。

[Using Storyboards for OS X - YouTube](http://www.youtube.com/watch?v=Q5bLEwewO7M)

ビデオでは、XCode6 のβ版を利用しており、追加した ViewController の init メソッドを修正しているが、現在配布されている XCode6.1 では修正する必要がなかった。それ以外は特に問題なく、ビデオの指示に従うだけで良かった。

ビデオを見ると一目瞭然だが、Storybord を利用した画面遷移の方法は、

1. Storybord 上に View を追加する。
2. 追加した View に対応する NSViewController の派生クラスを作成し、追加した View の Identity Inspector の Custom Class セクションの　Class 欄に作成した NSViewController の派生クラスを指定する。
3. 画面遷移の契機となるコントロールから対象となる View まで Control キーを押下しながらドラッグし、セグウェイで接続する。
    この時、画面遷移のスタイルとして、Show（モーダレスダイアログ）, Modal（モーダルダイアログ）, Sheet（シートダイアログ）, Popover（ポップアップウィンドウ）, Custom を選択することができる。

で行うことができる。

View 間での値の受け渡しは、今回のチュートリアルでは NSViewController に用意された representedObject プロパティを介して行っている。親となる ViewController のセグウェイでの画面遷移直前にコールされる prepareForSegue メソッドで、子となる ViewController の representedObject に値をセット、子となる ViewController ではオブジェクトがメモリにロード後にコールされる viewWillAppear メソッドで値を受けっている。最初、このチュートリアルを見て、prepareForSegue メソッド内で遷移先の ViewController の参照を取得しているのだから、直接アウトレットにアクセスすれば良いんじゃね？と思って試してみたが、この時点ではまだ View との接続が完了しておらず、アウトレット経由で View 上のコントロールにアクセスすることはできなかった。

遷移した View を閉じるのは、ViewController のメソッド dismissController に自分自身を引数に渡して呼び出せば良いようだ。（セグウェイのスタイルで Show を選択した場合は、この方法ではうまくいかない。）

[サンプルソース](https://github.com/hugo-sb/story)


```swift:ViewController.swift
import Cocoa

class ViewController: NSViewController {

	// NSColorWellへのアウトレット
    @IBOutlet weak var well: NSColorWell!
    
    // セグウェイでの画面遷移の直前に呼ばれる
    override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) {
        // SecondControllerのインスタンスを取得する
        let subController = segue.destinationController as SecondController
        // NSColorWellで指定されたNSColorをSecondControllerへ引き渡す
        subController.representedObject = well.color
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }
}
```

```swift:SecondController
import Cocoa

class SecondController: NSViewController {

	// NSBoxへのアウトレット
    @IBOutlet weak var box: NSBox!
    
    // ボタンクリックに対するアクション
    @IBAction func dismiss(sender: AnyObject) {
        self.dismissController(self)
    }
    
    // ViewControllerがメモリにロードされた後に呼び出される
    override func viewWillAppear() {
        // ViewController::prepareForSegueで設定したNSColorを取り出す
        let  color = self.representedObject as NSColor
        // NSBoxのfillColor属性に設定する
        box.fillColor = color
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do view setup here.
    }
}
```
Markdown(GFM)のリンク記法が覚えられないあなたへの処方箋


GFM (Github Flavored Markdown) のリンク記法、すらすら書けますか？

リンク記法というのは、こういうやつです。
```
[Google](http://google.com)
```

これがなかなか覚えられなくて悩んでたのですが、画期的な記憶方法を思いつきました。

# 覚え方: JavaScriptのメソッド呼び出しだと考える

```js
var o = {}
o["google"] = function(url){ return url; }
```

このoオブジェクトのfuncメソッドを呼び出すにはこう書けますよね。

```js
o["google"]("http://google.com")
```

どうですか？
Markdownのリンク記法に似てませんか？？
テスト用のSSL証明書を作成する

## 目的
SSLを使った各種テストをするときに、テスト用のSSL証明書があると便利なんで、作成手順をまとめました。
CA局をたてて、いろんなドメインの証明書をつくることができるのが目的です。CA局をつくって、それから、いろんなドメインの証明書を発行します。

## 準備
1.CentOS 6.5 など （openssl がはいっていれば、なんでもいいです。）
2.openssl

参考 http://qiita.com/mako10z/items/ef15372d4cf4621a674e

## 作成手順(CA局)
作業には、root 権限が必要です。
openssl の設定ファイル (CentOS では、/etc/pki/tls/openssl.cnf)は、コンパイル時に
決め打ちのようです。環境変数で、別の設定ファイルを見に行ったりできるかもしれませんが、
よくわからないので、既定のopenssl の設定ファイルに変更をかけます。
※ コードは、シェルスクリプトにすれば動くように書いてあります。ディレクトリをBにしてあります。

### CA局ディレクトリ作成
まず、CA局を入れるディレクトリを作成します。（ディレクトリ名は任意です。）
とりあえず、/etc/pki/hogeCA にしました。

>mkdir  /etc/pki/hogeCA
>mkdir  /etc/pki/hogeCA/private
>mkdir  /etc/pki/hogeCA/newcerts


### openssl.cnf 変更
/etc/pki/tls/openssl.cnf を2箇所変更します。
※　OSによって、openssl.cnf 設定ファイル名や置かれている場所は異なります。

##### CA局ディレクトリの指定

>[ CA_default ]
>dir             = /etc/pki/hogeCA    

##### POLICY の指定

いろんなドメインに対して証明書を発行できるCA局にします。
policy は、policy_match になっていますが、policy_anything　に変更です。
これで、どんなドメイン(SSL用語では、common name）でも対応できます。 

>policy          = policy_anything

#### CA局作成
##### 初期値設定

>echo "01" > /etc/pki/hogeCA/serial
>touch /etc/pki/hogeCA/index.txt

##### 3年間程度有効なCA局（-days 1825　の部分がその指定）つくります。
```
B="/etc/pki/hogeCA"
openssl  req -new -x509 -newkey rsa:2048 \
-out $B/cacert.pem -keyout \
$B/private/cakey.pem -days 1825
```
いろいろ設定を聞かれますが。とりあえず、下記のように答えておきました。
policy がanything とゆるいので適当でいいです。
パスワードも適当にどうぞ

>Country Name (2 letter code) [XX]:JP
>State or Province Name (full name) []:Tokyo
>Locality Name (eg, city) [Default City]:chiyodaku
>Organization Name (eg, company) [Default Company Ltd]:hoge 
>Organizational Unit Name (eg, section) []:
>Common Name (eg, your name or your server's hostname) []:hoge.com

##### 確認
設定がきちんとできているかを確認できます。
```
B="/etc/pki/hogeCA"
openssl x509 -in $B/cacert.pem -text
```
##### ブラウザ用のCA局証明書
ブラウザに取り込んでオレオレ証明書でも、エラーがでないようにするためのCA局証明書を
つくります。hogecert.der がそれです。
```
B="/etc/pki/hogeCA"
openssl x509 -inform PEM -outform DER -in $B/cacert.pem -out $B/hogecert.der
```
hogecert.der　はバイナリファイルです。
取り込みは、ブラウザごとにことなります。
WEB 上に一時的にあげて、
.htaccess で、AddType application/x-x509-ca-cert der　を設定して
ダウンロードするのがインストールでは便利でしょう。


### 証明書発行

#### 秘密鍵とCSR（証明書要求） を一緒につくる

password は適当にいれてあとで抜きます。設定は省略可能なのですが、common name　（ドメイン名）
は設定しましょう。

```
B="/etc/pki/hogeCA"
openssl req -new -keyout $B/hoge_key.pem -out $B/hoge_csr.pem
```

作業上面倒なので、秘密鍵からパスワードを除く
```
B="/etc/pki/hogeCA"
openssl rsa -in $B/hoge_key.pem -out $B/hoge_key.pem
```
#### CSRから証明書をつくる
```
B="/etc/pki/hogeCA"
openssl ca -out $B/hoge_cert.pem -infiles  $B/hoge_csr.pem
```

証明書を確認する
```
B="/etc/pki/hogeCA"
openssl x509 -in $B/hoge_cert.pem -text
```
#### web で設定する。
あとは、hoge_key.pem と hoge_cert.pem を、apache のSSL設定の中で
次のように設定します。

SSLCertificateFile /etc/pki/hogeCA/hoge_cert.pem
SSLCertificateKeyFile /etc/pki/hogeCA/hoge_key.pem








ローカルホストのファイルが開けない

助けてほしい

・環境
mac
vim

・やりたいこと
ローカルホストでtest.htmlを開きたい

・やったこと
MAMPを起動し、google chromeのアドレスバーに
　localhost/users/fumitan/documents/test.html
を打ち込んだが、開けない。また、
　http://localhost/users/fumitan/documents/test.html
で試しても開けない。

・ほかには
/applications/MAMP/htdocs/　直下にある他で作ったお試しphpファイルは開けているので、サーバーは開放できているはず。
ちなみにtest.htmlの内容は以下の通り。qiitaに書くにあたって、なぜか<!-- -->でコメントアウトできないので、<を外して無理矢理書いている。test.htmlには全てにきちんと<をつけている。

```html

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
</body>
</html>

```
UIImageのsizeを取得する方法注意点


#目的:
SwiftでUIImageのsizeを取得する際の注意点をまとめる。
objective-cのサンプルを真似してSwiftに書き直すとはまる部分があるので簡単にまとめておきます。
#内容:
拡大縮小や加工等をする場合にUIImageのサイズを取得しますが、そのときXcodeの補完機能を信じてコードを作成するといろいろとはまったので、そのはまった箇所をメモしておきます。
#設定:
Image画像は別途準備します。その画像をUIImage(named:xxx)で読み込んでpropertyを作成しておきます。

```swift:test.swift
let mainImage = UIImage(named: "Image1")
```

UIImageのサイズを取得するにはXcodeの補完機能を使い以下のような方法で取得できます

```swift:test.swift
let width = self.mainImage?.size.width
let height = self.mainImage?.size.height
```

ここまでは問題ないです。
表示するために別途準備していたImageViewにmainViewを入れます。このような感じです。

```swift:test.swift
self.imageView.image = mainImage
```

#はまるポイント:
私がしたかったのはimageViewをピンチアウトで拡大縮小したかったのでimageViewにScrollViewを付加しています。別途最大スケール等はしておきます。ピンチアウト時にimageViewのサイズを再計算する際にはまりました。
imageViewサイズを取得するのにXcodeの補完、及び先に示したUIImageの流れで

```swift:test.swift
var imageSize = self.imageView.image?.size
imageSize.width *= self.scrollView.zoomScale
```

としてしまいそうですが、これでは動きません・・・。
なぜなら計算をして自分自身の値を利用しそのが自分自身に値をいれるので暗黙的にunwrappeしてあげないといけません。正しくは以下となります。

```swift:test.swift
var imageSize = self.imageView.image!.size
imageSize.width *= self.scrollView.zoomScale
```

補完機能は便利ですが頼っていると痛い目に遭います・・・。
Objective-Cなら何も考えずできたので自由度が高かったですす。
覚えておくと便利！Python標準ライブラリ10選


>Pythonで，知っておくとちょっと便利になる組み込み関数や標準ライブラリを紹介してみようと思います！ そこそこメジャーなものからニッチなものまでいろいろありますが，知らないものはぜひチェックしてみて下さい．

## 組み込み関数

### allとany
>all( )は引数の要素が全てTrueならばTrue，any( )は引数の要素のいずれか1つでもTrueならTrueを返す．

```py
In [1]: all(_ % 2 == 0 for _ in [1, 2, 3]) # 全て偶数 or not
Out[1]: False

In [2]: any(_ % 2 == 0 for _ in [1, 2, 3]) # いずれか1つでも偶数 or not
Out[2]: True
```

### divmod
>商と余りを1度に求めてくれる．

```py
In [1]: 10 // 3, 10 % 3 # 商と余りを求める
Out[1]: (3, 1)

In [2]: divmod(10, 3) # 上記と全く同じ
Out[2]: (3, 1)
```

## collections

### Counter.most_common
>iterable内で出現頻度が高い順にソートしてくれる．文中で1番使われている単語とか一瞬で求まる．

```py
In [1]: from collections import Counter

In [2]: Counter(['a', 'b', 'c', 'a', 'b', 'a']).most_common()
Out[2]: [('a', 3), ('b', 2), ('c', 1)]
```

### namedtuple
>バリューオブジェクトを作成する．複数の属性を持たせたい時に便利．

```py
In [1]: from collections import namedtuple

In [2]: Doc = namedtuple('Doc', 'tf idf')

In [3]: doc = Doc(tf=0.1, idf=0.01)

In [4]: doc.tf, doc.idf
Out[4]: (0.1, 0.01)
```

### OrderedDict
>通常のdictは挿入した順番を維持しないが，OrderedDictは維持してくれる．

```py
In [1]: from collections import OrderedDict

In [2]: d = OrderedDict((('a', 1), ('b', 2), ('c', 3))) # OrderedDict(a=1, b=2, c=3) だと維持されないので注意

In [3]: d['d'] = 4 # 最後に追加される

In [4]: for k, v in d.iteritems(): print k, v # 挿入した順にprint
a 1
b 2
c 3
d 4
```

## math

### fsum
>iterable内の値の総和を桁落ちせずに求めてくれる．

```py
In [1]: import math

In [2]: sum([.1] * 10) # 桁落ちしてしまう
Out[2]: 0.9999999999999999

In [3]: math.fsum([.1] * 10)
Out[3]: 1.0
```

### log10
>常用対数の時は log(x, 10) でなく log10(x) を用いる方が高精度．

```py
In [1]: import math

In [2]: math.log(5, 10)
Out[2]: 0.6989700043360187

In [3]: math.log10(5) # 上記と同じだがこちらの方が高精度
Out[3]: 0.6989700043360189
```

## fileinput

>複数のファイルを1度にまとめて処理することができる．ファイルを指定しなければ標準入力を読み込む．

```text:abc.txt
a b c
```

```text:def.txt
d e f
```

```py:fileinput.py
import fileinput
for l in fileinput.input():
  print l 
```

```
$ python fileinput.py abc.txt def.txt # 複数のファイルを1度に読み込む
a b c
d e f
$ cat abc.txt | python fileinput.py # 標準入力
a b c
```

## ConfigParser

>configファイルを読み込み，いい感じにパースしてくれる．

```text:.gitconfig(一部)
[user]
name = Hoge
email = hoge@example.com
[color]
ui = auto
diff = auto
status = auto
interactive = auto
branch = auto
grep = auto
```

```py:configparser.py
import ConfigParser
cfg = ConfigParser.SafeConfigParser()
cfg.read('.gitconfig')

for sec in cfg.sections():
    print '[{}]'.format(sec)
    for opt in cfg.options(sec):
      print '{} : {}'.format(opt, cfg.get(sec, opt))
```

```
$ python configparser.py
[user]
name : Hoge
email : hoge@example.com
[color]
ui : auto
diff : auto
status : auto
interactive : auto
branch : auto
grep : auto
```


## shlex.split
>字句解析をし，いい感じに分割してくれる．str.splitと違い，引用符で囲まれた部分を1つにしてくれる．

```py
In [1]: import shlex

In [2]: '''he said 'you are beautiful!' '''.split() # ' '内が分割される
Out[2]: ['he', 'said', "'you", 'are', "beautiful!'"]

In [3]: shlex.split('''he said 'you are beautiful!' ''') # ' '内がまとまる！
Out[3]: ['he', 'said', 'you are beautiful!']
```
Railsのテストで初期データ投入をしてくれるFixtureのつかいかた


[Ruby on Rails Guides - A Guide to Testing Rails Applications][1]のFixturesの項の覚書

コード例も基本Rails Guidesのものです

## 基本

FixtureはYAMLで記述する
DBへのFixturesのデータ投入はテスト実行前に行われる

以下、記述例

```users.yml
david:
  name: David Heinemeier Hansson
  birthday: 1979-10-15
  profession: Systems development
 
steve:
  name: Steve Ross Kellock
  birthday: 1974-09-27
  profession: guy with keyboard
```

## モデルの関連(Model Associations)

例えば`has_many :articles`, `belongs_to :category`の場合、
以下のように書くことでモデルの関連を定義することが可能

``` yaml:fixtures/categories.yml
about:
  name: About
```

```yaml:fixtures/articles.yml
one:
  category: about # Model名: fixture定義名
```

## ERB

RailsのFixturesではERBを埋め込むことができる。
ERBはRailsにFixtureがloadされた時に実行される。

例として、以下のように書くと1000件のユーザーが作成される。

```
<% 1000.times do |n| %>
user_<%= n %>:
  username: <%= "user#{n}" %>
  email: <%= "user#{n}@example.com" %>
<% end %>
```

## テスト実行時の挙動

- Fixtureに関係するDBのtableのデータを取り除く
- Fixtureを読み込む
- Fixture定義データを変数に格納する（以下を参照）

## Fixture定義データをActiveRecordオブジェクトとして利用

Fixtureは以下のように書くことでテスト中にActiveRecordのオブジェクトとして用いることができる。

```
# 以下のように記述する
# <fixtureファイル名>(:<定義名>)

# this will return the User object for the fixture named david
users(:david)
 
# this will return the property for david called id
users(:david).id
 
# one can also access methods available on the User class
email(david.girlfriend.email, david.location_tonight)
```

## 参考
[Ruby on Rails Guides][1]
[有頂天Ruby - 私がMinitestとRailsのFixturesにハマった7つの理由][2]

[1]: http://guides.rubyonrails.org/testing.html
[2]: http://nilp.hatenablog.com/entry/2014/06/01/165448
rails new 時のエラーの対処法

rails new myapp

で以下のようなエラーが発生。

Can't initialize a new Rails application within the directory of another, please change to a non-Rails directory first.
Type 'rails' for help.

原因は、誤ってこの親ディレクトリでrails newしてしまった事が原因。

対処法としては、誤って作成されたRails関連のファイル・フォルダを削除する。

具体的には以下。
app
bin
config
db
lib
log
public
test
tmp
vendor
config.ru
Gemfile
Gemfile.lock
Rakefile
README.rdoc

参考にしたページ
・https://www.ruby-forum.com/topic/1780147
Swift で 2回 Unwrap が必要なケースについて調べた


**検証環境：Xcode6.1, Swift1.1**

---

例えば以下の様な Objective-C のコードを

```Objective-C
[[[UIApplication sharedApplication] delegate] window].rootViewController
```

Swift で書き直そうとした場合、まずはこんな感じに書くと思う。

```Swift
UIApplication.sharedApplication().delegate?.window?.rootViewController
```

しかしこれだとコンパイルエラーになる。

![スクリーンショット 2014-11-15 16.46.51.png](https://qiita-image-store.s3.amazonaws.com/0/4497/0f1a75cb-2762-4d93-f061-373b29ba50eb.png "スクリーンショット 2014-11-15 16.46.51.png")

そしてどういうことか、`window?` に更に Unwrap を行うことでコンパイルが通るようになる。

```Swift
UIApplication.sharedApplication().delegate?.window??.rootViewController
```

この意味が全くわからなかったので調べたところ StackOverFlow に検証エントリーを見つけたので、まずはこちらを見て頂くと良いと思う。

http://stackoverflow.com/questions/26201456/unwrap-uiwindow-twice-from-appdelegate-in-swift

## 検証コード

先に挙げた記事のコードを引用させていただく。

```Swift
import Foundation

@objc protocol MyApplicationDelegate {
    optional var myWindow: MyWindow? { get set }
}

class MyWindow : NSObject {
    var rootViewController: Int?
    init(number: Int) {
        rootViewController = number
    }
}

class MyAppDelegate: MyApplicationDelegate {
    var myWindow: MyWindow?
    init() {
        myWindow = MyWindow(number: 5)
    }
}

class MyApplication: NSObject {
    var myDelegate: MyApplicationDelegate
    override init() {
        myDelegate = MyAppDelegate()
    }
}

let myApplication = MyApplication()
println(myApplication.myDelegate.myWindow??.rootViewController)
```

### １つ目のポイントは protocol の定義

```Swift
    optional var myWindow: MyWindow? { get set }
```

MyWindow の optional 型プロパティ自体を `optional` 扱いで定義している。

### 2つ目のポイントは MyApplication の定義

```Swift
    var myDelegate: MyApplicationDelegate
```

`myDelegate` の型を `MyApplicationDelegate` で定義している。

### `MyApplication` を使わない方が自分的に分かりやすかったので、以下の様なコードでも検証してみた。

```Swift
var delegateA :MyApplicationDelegate
delegateA = MyAppDelegate()

// Unwrap が2回必要
delegateA.myWindow??.rootViewController

if let delegateB = delegateA as? MyAppDelegate {
    // Unwrap 1回で良い 
    delegateB.myWindow?.rootViewController
}
```

## 結論

継承している protocol の型でクラスを保持している場合、その protocol に `optional` で実装定義されているものが実装されている保証が無い。そのため、optional実装定義されているものに対して Unwrap が必要になる様だ。

さらにその `optional` 実装定義されたものの型が optional型だった場合は当然 Unwrap しないといけない。

上記の様なケースの場合、 `2回 Unwarp が必要になる` と理解しました。

間違いなどありましたらコメント頂けると幸いです。
Macでldd,straceなどを叩いてcommand not foundプギャーってなるときの対策

.zshrcでaliasを定義しておくとよいでしょう。

```zsh:.zshrc
# OSXで使えないコマンドのときにヒントを表示する
if [[ $(uname) = "Darwin" ]]; then
    alias ldd="echo ldd is not on OSX. use otool -L."
    alias strace="echo strace is not on OSX. use dtruss"
fi
```

# なぜldd="otool -L"としないのか？

```
alias ldd="otool -L"
alias strace="dtruss"
```

これをやってしまうといつまでたってもOSXのコマンドを覚えないので、
新品のMacとか他人のMacを操作するときとかに困るからです。
bazzarのインストール

homebrewを使ってインストールしました。

環境
OS:MacOSX 10.9.5

■（ない方は）homebrewをインストール（参考　http://brew.sh ）

```bash
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

■以下のコマンドでインストール

```bash
$ brew install bzr
```

■以下のコマンドで確認する

```bash
$ bzr --version
```
MavenでJava8のプロジェクトを作る

pl.org.miki:java8-quickstart-archetypeを使う

```shell-session
$ mvn archetype:generate -DinteractiveMode=false \
                         -DarchetypeGroupId=pl.org.miki \
                         -DarchetypeArtifactId=java8-quickstart-archetype \
                         -DgroupId=com.example \
                         -DartifactId=hello \
                         -Dversion=1.0-SNAPSHOT \
                         -Dpackage=com.example \
                         -Dpackaging=jar
```

maven-quickstart-archetypeと違ってApp.javaとAppTest.javaは生成されない

```shell-session
$ tree
.
├── pom.xml
└── src
    ├── main
    │   └── java
    │       └── com
    │           └── example
    └── test
        └── java
            └── com
                └── example

9 directories, 1 file
```

pom.xmlは以下のようになっている

```xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.example</groupId>
	<artifactId>hello</artifactId>
	<version>1.0-SNAPSHOT</version>
	<packaging>jar</packaging>

 
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>1.8</java.version>
	</properties>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>${java.version}</source>
					<target>${java.version}</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.11</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>
```

maven-compiler-pluginによって-source 1.8がコンパイラに渡され、
ラムダ式などが書けるようになった。
/usr/localと/opt/localの違いについて

## /usr/local
* UNIXにサードパーティのソフトウェアをインストールするための場所 
* MacPorts使わない場合はここに入れとけばいいのかな？

## /opt/local
* MacPortsでインストールしたものはここに入る

[参考 FAQ – MacPorts](https://trac.macports.org/wiki/FAQ#defaultprefix)
Macをメンテナンスする


僕がやってるMacのメンテナンス方法をまとめてみました
どれも最低限の説明なので、興味ある人は各自調べてみてください
あと、実際にやる時はバックアップを取ってからをオススメします。何があるかわからないので

著者の環境
MacBook Pro Retina, Mid 2012
OSX Yosemite

## パーミッション修正

1. ディスクユーティリティー（`/Applications/Utilities/Disk Utility.app`）」を開く
2. 修正したいディスクを選択し、「ディスクのアクセス権を修復」ボタンをクリック

## ディレクトリ修復、フォントキャッシュ削除

セーフブートする
詳しくは[公式][1]を参照

[公式][1]によると以下の効果が得られます

- 起動ディスクを検証して、必要に応じてディレクトリの問題の修復を試みます。
- OS X 10.4 以降では、「/ライブラリ/Caches/com.apple.ATS/uid/」に保存されているフォントキャッシュがゴミ箱に移動されます (ここで「uid」はユーザ ID 番号です)。

やり方は、「Mac起動時に起動音が聞こえたらすぐshiftボタンを押し、Appleロゴが出るまで押し続ける」だけ

[1]: http://support.apple.com/ja-jp/HT1564

## キャッシュ削除

僕は[DriveGenius](http://www.igeekinc.com/products/drivegenius3.html)というアプリを使用しています。
ただ、このアプリは有料なので、無料でやりたい人は以下のディレクトリの中身を消してください。

（パスの表現がわからない人は「unix path」とかで検索してください）

```
~/Library/Caches
/Library/Caches
```

このディレクトリをまるっと消すのは流石に危ないので、ディレクトリ内の必要ないキャッシュファイルを逐次消していくのがいいでしょう

## アプリ削除

不要なアプリは容量とって重くなるだけなので削除

消し方は、僕は[AppCleaner](http://www.freemacsoft.net/appcleaner/)を使ってます
アプリを直接消しても設定ファイルなどが残ってしまうのですが、このアプリを使えばアプリに関連するものすべてまとめて消せます

## Spotlight再構築

Spotlight検索がうまくいかないときに有効
あと、内部的な検索にSpotlightの索引が使われていたりするので、Spotlightを使わない人にも案外重要

1. 「システム環境設定 > Spotlight」を開く
2. プライバシータグを開く
3. 除外対象に「Macintosh HD」を選択
4. 3で除外した「Macintosh HD」を除外対象から削除する

索引構築は結構時間かかります。進度を見たいときは画面右上のSpotlightボタンを押して、なにがしか文字を入力すると「索引を作成中...」というのが表示されて確認できると思います。

## フォント検証

1. Font Book(`/Applications/Font Book.app`)を開く
2. 「すべてのフォント」項目を選択する
3. すべてのフォントを選択状態にする。（「cmd + a」で全選択）
4. メニューバーの中から「ファイル>フォントを検証」を選択
5. 検証完了したら、表示を「警告およびエラー」にして、全選択・削除。パスワードを求められるので入力する（間違って正常なフォントまで消してしまわないように注意）

## Wifi修復

Wifiが突然切れるような状態の時は以下を試す
個人的「これだけやればOK！」がないので、リンク先に丸投げします

[Having Wi-Fi problems on OS X Yosemite? Here's a possible fix!](http://www.imore.com/having-yosemite-wi-fi-problems-heres-possible-fix)
[Fix Wi-Fi Problems in OS X Yosemite](http://osxdaily.com/2014/10/25/fix-wi-fi-problems-os-x-yosemite/)

## PRAMリセット

まず、PRAMとはなにか？

> PRAM(Parameter Random-Access Memory)と呼ばれる、コンピュータの少容量のメモリでは、OS X がすばやくアクセスできる場所に特定の設定が保存されます。保存される特定の設定は、Mac の種類、および Mac に接続されている装置の種類によって決まります。この設定には、指定起動ディスク、表示解像度、スピーカーの音量、その他の情報が含まれます。

やり方は、起動時に「Option、Command(⌘)、P、R」を同時押しすること。

詳しくは[公式](http://support.apple.com/kb/PH14222?viewlocale=ja_JP)参照

## 参考

以下も参考になります
[【保存版】Macが起動しない時に自分でできる7つの対処法 | 男子ハック]( http://www.danshihack.com/2015/02/02/junp/mac-boot-maintenance.html)
GitHub cloneのgitbucketをFreeBSDにインストールしたときのメモ

GitHubいいよね！というのは分かるけど、業務で使おうとすると

* 業務のセンシティブな内容(製品のソースコードやChefレシピに書かれたサーバの構成とか)を他所のサーバに置くことに抵抗があるけど、プライベートリポジトリ作るにはお金がかかる
* 勉強でちょっと試したいだけなので、アカウントはまだとりたくない

といったことで使うのに躊躇するいケースもあるかと思います。

ということで、ローカルにインストールして使えるGitHub cloneの[gitbucket](https://github.com/takezoe/gitbucket)を使ってみることにしました。また、個人的な趣味からFreeBSD(10.0)でのインストールにチャレンジ。

#とりあえずjavaとtomcat7を入れる
何も考えずに

```console
sudo pkg install tomcat7
```

servlet3.0必須なんでtomcat7で。これでopenjdk7も入ります。

ついでにこのタイミングでtomcat動くかも確認しておきましょう。
/etc/rc.confに1行追加。

```console
tomcat7_enable="YES"
```

それから、WEBページ経由でtomcatにアプリケーションをデプロイできるようにユーザも設定しときましょう。
例としてユーザ名tomcat、パスワードtompassの場合。/usr/local/apache-tomcat-7.0/conf/tomcat-users.xmlを編集。

```console
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="tomcat"/>
  <user username="tomcat" password="tompass" roles="manager-gui"/>
</tomcat-users>
```

起動。

```console
sudo /usr/local/etc/rc.d/tomcat7 start
```
適当なブラウザから[ローカルホストのtomcat](localhost:8080)にアクセスしてみましょう。
localhostでなくて、マシンに設定したIPアドレスでもOK。

![tomcat.jpg](https://qiita-image-store.s3.amazonaws.com/0/59415/03d87963-9af2-e374-25a3-4a8ced9570f8.jpeg)


こんな感じで表示されたらOK。

#gitbucket取ってくる

git cloneとかでもいいけど、とりあえず[リリースページ](https://github.com/takezoe/gitbucket/releases)からwarファイルを取得。

先ほどアクセスしたtomcatのページの「Manage App」ボタンを押す。IDとパスワード求められるので、先ほど設定したtomcat/tompassでログイン。
あとはwarファイルの設置で先ほどダウンロードしたgitbucket.warを指定して「配備」を押したら完了。

#起動しない!

はい、多分この通りにやると**gitbucket起動しません**。
何故かというと、gitbucketは起動時にレポジトリを「起動ユーザのホーム直下に作った.gitbucketディレクトリ」または「環境変数GITBUCKET_HOMEで指定されたディレクトリ」に作成しようとするからです。

FreeBSDだとtomcatの起動ユーザはwww、そのディレクトリは/nonexistent。そりゃ書き込めるわけない。
ユーザwwwのホームディレクトリを変えてもいいですが、ここはGITBUCKET_HOMEで指定してやりましょう。

#設定追加
起動スクリプトである/usr/local/etc/rc.d/tomcat7を見ると、どうも${_tomcat_catalina_base}/bin/setenv.shまたは/usr/local/apache-tomcat-7.0/bin/setenv.shというファイルを実行した上で起動してくれるようなので、こいつに書いてやりましょう。
新規ファイルとして/usr/local/apache-tomcat-7.0/bin/setenv.shに以下の内容を記載します。

```console
#!/bin/sh
export GITBUCKET_HOME=/home/gitbucket
````

もちろん、書き込み可能なディレクトリも作っておきます。

```console
sudo mkdir /home/gitbucket
sudo chown www:www /home/gitbucket
```

で、再起動。restartでもいいかもだけど念のためにstop→start。

```console
sudo /usr/local/etc/rc.d/tomcat7 stop
sudo /usr/local/etc/rc.d/tomcat7 start
```

[tomcatのアプリケーションマネージャ](http://localhost:8080/manager/html)から確認するか、実際に[gitbucket](http://localhost:8080/gitbucket/)にアクセスして起動してればめでたしめでたし。

#まとめ

* GitHubクローンのgitbucket入れてみましょう
* tomcat7に配備するだけだから動かすのは楽ちん。
* ただし、レポジトリデータ等の保存先ディレクトリの設定は気をつけようね。ログにも出ないよ
php5-fpmのphp5-mcryptを設定する  (Ubuntu 14.04)

**Nginxとphp-fpmを正確にインストールしたことが必須です。** 

## php5-mcryptをインストール
`apt-get install php5-mcrypt`

### シンボリックリンクを作成
`ln -s /etc/php5/conf.d/mcrypt.ini /etc/php5/mods-available/mcrypt.ini`

### 有効にする
`php5enmod mcrypt`

### php-fpmを再起動
`service php5-fpm restart`

### Nginxを再起動
`service nginx restart`


**終わり!**
Windows-31Jに変換する時の例外を防止するためのString拡張

## String拡張
```rb
class String
  def sjisable
    str = self
    #変換テーブル上の文字を下の文字に置換する
    from_chr = "\u{301C 2212 00A2 00A3 00AC 2013 2014 2016 203E 00A0 00F8 203A}"
    to_chr   = "\u{FF5E FF0D FFE0 FFE1 FFE2 FF0D 2015 2225 FFE3 0020 03A6 3009}"
    str.tr!(from_chr, to_chr)
    #変換テーブルから漏れた不正文字は?に変換し、さらにUTF8に戻すことで今後例外を出さないようにする
    str = str.encode("Windows-31J","UTF-8",:invalid => :replace,:undef=>:replace).encode("UTF-8","Windows-31J")
  end
end
```
##テスト
```rb
#変換テーブル上の文字が置換されていることを確認
from_chr = "\u{301C 2212 00A2 00A3 00AC 2013 2014 2016 203E 00A0 00F8 203A}"
p from_chr    
p from_chr.sjisable

#Shift_JISにもWindows-31Jにもない文字は諦めて？にする
p "ä".sjisable

# Windows拡張領域は保持されていることを確認
p "①②③髙島屋".sjisable
```
## 実行結果
![スクリーンショット 2014-11-15 13.16.58.png](https://qiita-image-store.s3.amazonaws.com/0/53489/1b603d49-b86a-7820-1786-7e6187757d26.png)

## これどんないいことがあるの？
Rubyの内部コードはもはやUTF8。だけど、最終的にはエクセル向けにシフトJISのCSVを出力することもある。だけど、内部コードから出力時にエンコード変換をすると、対応する文字が見つからなくて、例外がでちゃう。例外はヤなので、多少は文字を置き換え（もしくは全く変換できないものは？に置換）してでも、処理を通したいということはある。

## 解説
Rubyでは、シフトJIS系のエンコード名には以下の種類がある。
* Shift_JIS
* Windows-31J
* SJIS(これはWindows-31Jのエイリアス）
* CP932（これはWindows-31Jのエイリアス）
SJISとCP932はエイリアスなので、実際はShift_JISとWindows-31Jの二つであると思っていい。
例えば、～という文字は、Shift_JISでもWindows31Jでも、コードとしては、「8160」が割り当てられえている。
* 8160をShift_JISとしてUNICODEに変換すると301C（波ダッシュ）
* 8160をWindows31JとしてUNICODEに変換するとFF5E（全角チルダ）
UNICODEは扱える文字が多いから、UNICODEで保持する間は被害が少ない。辛いのは、UNICODEからShift_JISやWindows-31Jに変換するとき。Windows-31Jは波ダッシュのことは知らないし、Shift_JISは全角チルダのことなんて知らない。シフトJIS系のテキストが求められる時ってWindowsが多いので、どっちに合わせるって言えば、Windows-31Jに合わせるケースが多い。

## 保守
from_chrとto_chrの文字を増やしていけば、変換する文字は増やせる。trメソッドは、文字単位で置換してくれるので便利ですね。～とかはありがちなんだけど、øとかは、Shift_JISにもWinndows-31Jにも存在しないので、「近しい文字」に置換するテーブルは業務ルールで足していけばいいんじゃないですかね。
ポップアップブロックを回避する技(モダンブラウザ非推奨)

画面遷移はあまりしたくない。なので、Ajaxの通信後、ログインはポップアップを利用して。。とか、やりたい場合が出てくる。

最近のブラウザはポップアップブロックが多い。

特に、スマホではデフォルトの設定でポップアップブロックがONになっていることがほとんど。さらに、PCブラウザはエラーをブロックを出してくれる事があるが、スマホではポップアップが反応せず、エラーも出ず、何も起こらない。最悪な状態だ。

ポップアップブロックを回避するパターンを探し求めた。

### ポップアップブロックのパターン例
 
```js:popup_block

$(function() {
  window.open('xx');  // ブロック
  $('#hoge').on('click', function() {
    window.open('xx');  // ブロックされない
    $.ajax({
      url: 'xx',
      success: function(data) {
        window.open('xx');  // ブロック
      }
    });
  });
});

```

お分かりだろうか？

なんと、JS からウィンドウを開く際、 ユーザーからの操作に関係がない場合はブロックし、 ユーザーからの操作に関係がある場合はブロックされません。

### ブロックされないパターン

* onclickなどのユーザーが意図した行動

### ブロックされるパターン
* onload イベント
* Ajax

### Ajaxでの回避策
しかし、私がやりたいのはAjax後のポップアップだ。

```js:popup_block_block

$(function() {
  window.open('xx');  // ブロック
  $('#hoge').on('click', function() {
    window.open('xx');  // ブロックされない
    $.ajax({
      url: 'xx',
      async: false, // 非同期ではなく同期通信にする
      success: function(data) {
        window.open('xx');  // ブロックされない
      }
    });
  });
});

```

お分かりだろうか？

Ajax の A に当たる Asynchronous を false にしてしまおう。これにより、同期通信となり、ユーザーが意図した行動として認識されます。

### え？それ、Ajaxじゃなくね？
[Sjax](http://d.hatena.ne.jp/keyword/sjax) (Synchronous JavaScript + XML)です。

＿人人人人＿
＞　Sjax　＜
￣Y^Y^Y^Y￣

### モダンブラウザじゃ使えない？
貴重なコメントを頂きました。

> hikaru_oao  
メインスレッドでの同期XHRは非推奨になりました。
モダンブラウザで試すと警告が出ます。
互換性のために暫くは有効ですが、新規で使っていくべきでないと思います。

その為、1クリックでの回避策は今のところありません。  
Ajaxイベント発火後に、オーバーレイなどでボタンを出してそこから、もう1クリックさせる感じですかね。。スマートじゃない。


### 参考サイト様
[Ajaxでポップアップブロックを回避する方法](http://lazesoftware.com/blog/14/0106/)
Androidで特殊なアップデート方法をした後にホームボタンが効かなくなった場合の対処法

自分用メモ書きです。  
Androidのバージョンアップを`fastboot flash system`とかで行うとたまにホームボタンが効かなくなったりするのですが、その対処法をいつも忘れてしまうので書いておきます。

##【症状】
* ホームボタンが効かない
* 最近のアプリも出ない
* クイック設定パネルが出ない

##【原因】
SetupWizardを一度も起動していない(ことになる)為

##【対処法】
1. PCでadb接続出来る場合
`adb shell am start -n com.google.android.setupwizard/.SetupWizardTestActivity`
を実行してSetupWizardを端末で終わらせる  
  
2. Android単体しかない場合
任意のショートカットを作成するアプリで
アプリ名: com.google.android.setupwizard
アクティビティ名: com.google.android.setupwizard.SetupWizardTestActivity
のショートカットを作成し実行する

です。ただSetupWizardを出すだけのアプリを作ったので一応置いておきます。これを起動するだけで上の方法を実行しなくても大丈夫です。
「野良アプリはちょっと…」というのであれば、上の方法で起動してください。
https://www.dropbox.com/s/3cs9p0259w1glrl/RunSetupWizard.apk
Instant Hotspot使ってみた

インターネット共有が簡単に出来る。
久々にiPhoneを引っぱり出して試してみた。

# ポイント

## iphone
  * `インターネット共有`を`OFF`
  * Bluetooth, Wifiを`ON`
  * テザリングオプションに加入しておくこと

## mac
  * 10.10が入っていること
  * 2012年モデル以降であること
  * wifiマークからiPhoneを選択

## iCloud
  * iphone, mac両方共 同じiCloudにログイン済みであること
  * macのwifiマークにiPhoneが表示されるまでに初回15分くらいかかるので辛抱強くまつ。

# 参考

[iOS 8 および OS X Yosemite での連係機能の使い方に関するサポート情報 - Apple サポート](http://support.apple.com/ja-jp/TS5458)
<? extends ...>や<? super ...>って何？代入編

## はじめに

\<? extends E>や\<? super E>が使われているクラスにどのような値が代入できるのか考えよう。
手っ取り早く結論を知りたい人は[図解](#%E5%9B%B3%E8%A7%A3)を見てください。

## 準備

2つのクラスA,Bがある。クラスBはクラスAのサブクラスであるとする:

```java
class A {}
class B extends A {}
```
## \<? extends E>

\<? extends E> はE型のすべてのサブクラスを表している。だから、\<? extends A>が表すクラスは\<? extends B>が表すクラスをすべて含んでいることがわかる。この性質があるので、以下の代入関係が成り立つ：

```java
List<? extends A> listA;
List<? extends B> listB;

listA = listB; //OK
listB = listA; //コンパイルエラー
```

\<? extends B>はクラスAを含んでいないので、listBにlistAを代入することはできない。代入できてしまうとキャストが必要になり、型安全でなくなってしまう。

また、\<? extends E>はE型自身を含むので、以下の代入関係も成り立つ：

```java
List<? extends A> list1;
List<A> list2;

list1 = list2; //OK
list2 = list1; //コンパイルエラー
```
## \<? super E>

\<? super E> はE型のすべてのスーパークラスを表している。だから、\<? super E>が表すクラスは\<? super A>が表すクラスをすべて含んでいることがわかる。この性質があるので、以下の代入関係が成り立つ：

```java
List<? super A> listA;
List<? super B> listB;

listA = listB; //コンパイルエラー
listB = listA; //OK
```

\<? extends E>の場合と比較すると、継承関係と代入関係が逆になっていることに注意しよう。

また、\<? super E>はE型自身を含むので、以下の代入関係も成り立つ：

```java
List<? super A> list1;
List<A> list2;

list1 = list2; //OK
list2 = list1; //コンパイルエラー
```
## \<?>

\<?> はすべてのクラスを表している。つまり、\<? extends E>や \<? super E>なども含めて、すべてのクラスを代入することができる。

```java
List<?> list1;
List<? extends A> list2 = null;
List<? super A> list3 = null;
List<A> list4 = null;

list1 = list2; //OK
list1 = list3; //OK
list1 = list4; //OK
```

## \<? extends Object>

\<? extends Object>は、Objectのサブクラスを表しているので、\<?>と同じくすべてのクラスを表している。よって、\<? extends E>とは異なり、\<? super E>を代入することができる。

```java
List<? extends Object> list1;
List<? extends A> list2 = null;
List<? super A> list3 = null;
List<A> list4 = null;
List<?> list5 = null;

list1 = list2; //OK
list1 = list3; //OK
list1 = list4; //OK
list1 = list5; //OK
```
## 図解

ここまでの代入関係を図にしてみると、以下のようになる。
矢印は、矢印の元が矢印の先に代入できることを表す。
直接１本の矢印でつながっていなくても、複数の矢印でつながっていれば代入できる。

![ジェネリクスの継承関係.png](https://qiita-image-store.s3.amazonaws.com/0/42728/08ea2877-4bc0-076e-2093-7fb611f06259.png)

## 参考
Java Language Specification 4.5.1. Type Arguments of Parameterized Types
https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.5.1
iOSメモ - tableviewとunwindSegueについて


まずデモから
http://g.recordit.co/z1qKMnhtXm.gif

NavigationVCにrapしたfirstVCとsecondVCでcellに新しくデータを追加するデモです

### 1.firstVCにはBar Button Itemを入れるのであって、Buttonを入れようね（あとでsecondVCにpushで繋いでも動きません

![スクリーンショット 2014-11-15 9.52.57.png](https://qiita-image-store.s3.amazonaws.com/0/14262/25b25f2c-46e6-c12b-d710-9207ad731fa6.png "スクリーンショット 2014-11-15 9.52.57.png")


### 2.textFieldの定義は、SecondVC.mに書くのではなくSecondVC.hに書こう
	@property (nonatomic, weak) IBOutlet UITextField *textField;

mに書いちゃうとbackToList内でsvc.textField.textって書くとエラー出るよね、辛い
また、hに@propertyではなく、

        @interface SecondViewController : UIViewController{
            IBOutlet UITextField *textField;
        }
        @end
のように書いても、svc.textField.textって書くとエラー出るよね、辛い
### 3.firstVCに以下を追加する

	#pragma mark - firstVCのtableが乗る所に書く、firstVCからExitにて紐付いている
	- (IBAction)backToList:(UIStoryboardSegue *)unwindSegue
	{
	if ([[unwindSegue identifier] isEqualToString:@"EditDoneSegue"]) {
        SecondViewController *svc = unwindSegue.sourceViewController;
        NSIndexPath *indexPathToInsert = [NSIndexPath indexPathForRow:0 inSection:0];
        [nameArray insertObject:svc.textField.text atIndex:indexPathToInsert.row];
        [table insertRowsAtIndexPaths:@[indexPathToInsert] withRowAnimation:UITableViewRowAnimationFade];
    	}
	}

（シンタックスハイライトちゃんと動かない、辛い）

### 4.ButtonからExitにcontrolを押して繋げる
そうすると、firstVCで定義したbackToListメソッドを繋ぐかどうか聞かれます

閉じた時に、backToListが動くってことですね

http://g.recordit.co/3t9Uy1MGLB.gif

先ほど作ったUnwind segueにidentifierをつけます

![スクリーンショット 2014-11-15 9.00.01.png](https://qiita-image-store.s3.amazonaws.com/0/14262/06b1a856-2bdf-33ca-7b0d-46d348f020af.png "スクリーンショット 2014-11-15 9.00.01.png")

これで親から子の値渡しの代替が出来ます
[メモ書き] PostgreSQL(ポスグレ)でダンプと展開

## Q. PostgreSQLでダンプと注入したいんだけど


## A. `pg_dump` ダンプして `psql -f`で注入

ダンプはコレ

> pg_dump your_db_name > ./db_dump.sql

注入はコレ

> psql -d your_new_db_name -f db_dump.sql 

* 注入する先のDBは（今回の例で言うと`your_new_db_name`）は作りたてホカホカにしとく必要があります.

##### 作りたてホカホカとは

以下psqlコンソール

> drop database your_new_db_name;

> create database your_new_db_name;

(userオプションとかはよしなに）
wp-cliをWindowsで実行できるようにする

vccwを使い始めて、vagrant起こさなくてもwp scaffoldを使いたいと思い始めました。
wp-cliはphpの.pharファイルとして配布されておりphpがインストールされていてUnix風シェル環境(MSYSやCygwin)が使えれば、Windowsでも動かすことができます。

## 前提

* MSYSあるいはCygwinがインストール済みであること。  
WindowsでGitやminttyを使っている環境なら大丈夫です。
* php5.3.2以上へのパスが通って、phpコマンドが動作する環境であること
* ローカルあるいはネットワーク上にMySQLサーバがあること(wp-cliの動作にはWordPressを実行できる環境が必要なため)

当方は、Wampインストール済み環境で実行しました。

# 手順

以下はおおむね、http://wp-cli.org/ のInstalling (And Upgrading)の項を見ながら進めます。

## wp-cli.pharのダウンロードとphp wp-cli.pharの動作確認

wp-cli.pharを適当な場所へダウンロードしてくる。

例）https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar


次に、MinGWなどから

```php wp-cli.phar --info```

を実行して以下のような表示がされればOK。

> PHP binary:     c:\wamp\bin\php\php5.4.12\php.exe
> PHP version:    5.4.12
> php.ini used:   C:\wamp\bin\php\php5.4.12\php.ini
> WP-CLI root dir:        phar://wp-cli.phar
> WP-CLI global config:
> WP-CLI project config:
> WP-CLI version: 0.17.0

## bashの設定ファイルへ以下を追記
```lang:~/.bashrc
alias wp='php /c/"wp-cli.pharを配置したディレクトリ"/wp-cli.phar'
```
保存してターミナルから
```soruce ~/.bashrc```

## wp --infoの動作確認

```php wp-cli.phar --info```と同じ結果になればOK

### .bashrcに書いたaliasが使えないようであれば

MINGWやcmd.exeからの`sh --login`で.bashrcが動いていないようなときは、
~/.bash_profileファイルを作成して、

```lang:~/.bash_profile
[ -f "$HOME/.bashrc" ] && source "$HOME/.bashrc"
```
を書いておくと幸せになれる。

参考URL: http://d.hatena.ne.jp/m-hiyama/20100415/1271293216

## データベースサーバの確認など

wp-config.phpに書かれたサーバ情報を使用する為、新規インストールの場合はDBやユーザーを作成しておく

あとは、WordPressをインストールしたいディレクトリへ移動して`wp core install`したり、
すでにWordpressをインストールしてあるディレクトリから`wp scaffold`等が使えるようになります。
ffmpeg でnフレーム毎にフレームを画像で抽出する方法 ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

:movie_camera: 動画ライフを楽しんでますか？こんにちはでス :heart_eyes: 動画に超便利なffmpegを使ってnフレーム毎に画像を抽出する方法を紹介します。

今回はネタとして2つの方法を紹介 :smiley: 

 - ワンラインで書けるけど超遅い:scream:方法
 - サクサク軽い方法 :car: 

# ワンラインで書けるけど超遅い:scream:方法

```
ffmpeg -i input.mp4 -filter:v "select=not(mod(n\,1800)),setpts=N/(30*TB)" -qscale:v 2 -y thumbnail-%03d.png
```

input.mp4 は30fpsの動画です

1800フレーム毎に1枚画像を抽出します。でも、本当に遅い:scream:です。

# サクサク軽い方法 :car: 

1枚ずつ別のコマンドで出した方が速いです

```
ffmpeg -ss 30 -i input.mp4 -r 1 -vframes 1 -f image2 thumbnail-001.png
ffmpeg -ss 90 -i input.mp4 -r 1 -vframes 1 -f image2 thumbnail-002.png
ffmpeg -ss 150 -i input.mp4 -r 1 -vframes 1 -f image2 thumbnail-003.png
```

こんな感じ :beer: