OmniAICreator/Qiita-1.07M huggingface dataset:
CakePHP3でDBのテーブルを作成・更新したりする

CakePHP2で`schema update`とかやってたやつは、migrationsという仕組みになったようです。
[Cookbook 3.x - Migrations](http://book.cakephp.org/3.0/en/migrations.html)

最初にすでにあるDBからmigrationsファイルを作るには、
```bin/cake bake migration_snapshot Initial```
を実行すると、config/Migrations/の下に『日時_initial.php』というファイルができます。
(『Initial』の部分は何でも良さげ。phinxlogというテーブルができていて、これでバージョン管理してるぽい？)

別のサーバーとかで
```bin/cake migrations migrate```
を実行すると、上記でできたファイルを元にテーブルが作成されます。

カラムの追加とか変更とかをする場合は、新しいファイルを作成してそこに変更を書くみたい。まだやってないけど…。

```bin/cake bake migration AddPriceToProducts price:decimal```
とかbakeすると、productsテーブルにdecimal型のpriceカラムを追加するファイルを作ってくれるようです。
変更するたびにファイルが増えていくってことかな…。
rollbackもできるみたいなので、そのためかも。

→[その後書いた続き](http://qiita.com/ran/items/bdd2cf2f12fee0934ad3)
Atomでフォントを複数指定してコードも日本語も綺麗にするメモ

最近Atom使い始めた身なのですがどうやらAtomはフォントを複数設定することができるみたいですね。大した内容じゃないですが指定方法でちょっとメモしておきたいことがありました。

# フォントの指定方法
`Ctrl + ,`で出てくるSettingsのFont Familyという欄で指定します。
使いたいフォント名を`"`で囲う。

例：「Source Code Pro」を使いたいとき
![font1.png](https://qiita-image-store.s3.amazonaws.com/0/69692/eeb09eef-22ec-d1c4-4d58-79f27f73318c.png)

これで指定したフォントが適用されるんですが、フォントに含まれない文字については何か変な感じになりますね
![font5.png](https://qiita-image-store.s3.amazonaws.com/0/69692/ac068ec5-9d3b-e84b-153c-07c8ef7d1011.png)


# フォントを複数指定する
`,`で区切って後ろに続けてあげればいいみたいですね。（もしかすると不要かも…）

例：「メイリオ」も使いたいとき
![font2.png](https://qiita-image-store.s3.amazonaws.com/0/69692/0f71d851-e513-f275-7988-d5454f8b1665.png)

こうすると多分いい感じになってるはずです。

# 注意点的な
どうやら指定する順番が大事みたいですね。
試しに`"Source Code Pro","Meiryo"`から`"Meiryo","Source Code Pro"`としてみると…

![font3.png](https://qiita-image-store.s3.amazonaws.com/0/69692/a14025ed-f274-6e91-034b-94b26e53f2e2.png)
↓
![font4.png](https://qiita-image-store.s3.amazonaws.com/0/69692/e970d4cb-8f4f-10b8-1495-02ea46ed50e7.png)

(⌒-⌒; )


# おまけ
これがメモしたかったことなのですが、`"Noto Sans Japanese"`で指定しようとしたらうまく行きませんでした。
→（インストールしたのはNotoではなかった…？）`"Source Han Sans"`
結果：失敗 ( ᕦ ｡ ᕤ)

正解は`"源ノ角ゴシック JP"`でした。コントロールパネルから辿って確認したらこの名前だったのでこれで通ってたみたいです。
`"Source Code Pro","源ノ角ゴシック JP"`と指定して漢字も綺麗になりました。
![font6.png](https://qiita-image-store.s3.amazonaws.com/0/69692/24223ec7-c248-31f5-d5d1-374eca817d6c.png)

フォントの合成とかせずともSource Code Proと日本語フォントが同時に使えたので有難いです。本当はファイルの種類ごとにフォントを変えられたりコメントの部分にだけ適用したりとか出来るのかもしれませんが、如何せんにわかなので分かりません…。ご存じの方がいらっしゃったら是非教えて欲しいです。
ProfilerとFrame Debugger触ってみた

Unity5で解禁になった元Pro版機能の1つ、[Profiler](http://docs.unity3d.com/ja/current/Manual/ProfilerWindow.html)使ってみました！
あとUnity5で追加になった[Frame Debugger](http://docs.unity3d.com/ja/current/Manual/FrameDebugger.html)も。

#Profilerの使い方
メニューの[Window]-[Pfofiler]でProfilerウィンドウが出ます。
Recordボタン押下済みならこれで実行するとプロファイリングできます。
![01.gif](https://qiita-image-store.s3.amazonaws.com/0/15028/cb6ca2fe-96d7-95cd-92f9-4e7a8a45b430.gif)
ちなみにUnity5から画面下のTimeLine表示が追加になったらしい。
**※　上手く表示されない場合は、ProfilerウィンドウのClearボタン押下すると表示されます**

Deep Profileボタン押下すると全てのスクリプトコードがプロファイリング可能
（オーバーヘッド高）
![02.png](https://qiita-image-store.s3.amazonaws.com/0/15028/168b8be2-b7de-088e-5789-a7fba43aac53.png)
ウィンドウの下半分については、上半分で選択したProfiler内容によって変わります。
以下のような感じになります。


##CPUを選択した場合
どの処理がどのぐらいCPU使っているのか追えるし、Fileter検索もUnity5から追加になった
![03.png](https://qiita-image-store.s3.amazonaws.com/0/15028/f8700399-c0c0-2b27-cdd8-09ac22724ca2.png)

##Memoryを選択した場合
DetailedとTake Sample:Editorボタン押下するとメモリ使用量が見れます。
下の画像はテクスチャの使用量を見てるところです。
また選択したテクスチャはProjectウィンドウでもハイライトされます。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/15028/28d64cf8-2be1-f42a-ad0d-66f0b3c8b675.png)
ちなみにDetailedの場合、Task Sample:Editorボタン押下時のダンプ結果になります。
何かDestoroyした後の結果をみる場合は、再度Task Sample:Editorを押下する必要があります。
DetailedでなくSimpleの場合は、リアルタイムの結果が表示されます。
**※　上手く表示されない場合は、ProfilerウィンドウのClearボタン押下すると表示されます**

** 2016/01/31追記 **
Destory後にテクスチャなどが解放されない場合は、Resources.UnloadUnusedAssets()するといいです！
参考：[Unityにおけるメモリ管理](http://sssslide.com/speakerdeck.com/cygames/unityniokerumemoriguan-li-1)


あと、Profiler Editorボタン押下しておくと実行していなくてもプロファイリングできます。
![05.gif](https://qiita-image-store.s3.amazonaws.com/0/15028/2516bea3-bea9-d24f-4f0f-886e5ab565f2.gif)

その横のActive Profilerボタンは、iOSとの負荷チェックで使うとかなり便利そうです
　→　[UnityのプロファイラーをiOS端末につないで負荷をチェックする](http://takashicompany.hatenablog.com/entry/2014/07/10/085305)

#Frame Debuggerの使い方
メニューの[Window]-[Frame Debugger]でFrame Debuggerウィンドウが出ます。
Frame Debuggerは使い方も簡単でどういう風にレンダリングされているか見れます。
![06.gif](https://qiita-image-store.s3.amazonaws.com/0/15028/9d7e7653-b906-4fbe-ffc3-87db1dd7f50b.gif)

ProfilerのProfile Editor押下しておくと、描画の際にどのぐらいメモリ食うか視覚的に見えて良さげです♪
![07.gif](https://qiita-image-store.s3.amazonaws.com/0/15028/e3268832-87c3-8b07-abe3-3682ad02cf7f.gif)

参考記事：
・[Unity 5 Proの新機能FrameDebuggerでグラフィックパフォーマンスを改善する](http://qiita.com/yasei_no_otoko/items/1573a8a4944f5e5142fa)
ios7でDocumentにあるUIImageが表示されないのでハマった

```switf
self.imageView.image = UIImage(named: imgPath)
```
これでもios8では表示されるんだけど、pathの場合はcontentsOfFileにしなければいけなかった。
↓

```switf
self.imageView.image = UIImage(contentsOfFile: imgPath)
```

ただそれだけです。
[Swift]値付きのenum値同士がイコールかどうかを判定する方法


* Xcode6.3 + Swift 1.2 + Playground

## 値付きでなければ何も気にせずとも判定可能

```swift:
import UIKit

enum Fruits {
    case Apple
    case Orange
}

let a = Fruits.Apple
let b = Fruits.Orange

println(a == b) // "false"
println(a == .Apple) // "true"
```

## 値付きだとコンパイルエラーとなる

```swift:
enum ServerResponse {
    case Result(String, String)
    case Error(String)
}

let a = ServerResponse.Result("6:00 am", "8:09 pm")
let b = ServerResponse.Error("Out of cheese.")

println(a == b)
```

```text:エラー
error: binary operator '==' cannot be applied to two ServerResponse operands
println(a == b)
        ^
```

## 解決方法（一例）

==演算子を書けばOK。

```swift:
import UIKit

enum ServerResponse: Equatable {
    case Result(String, String)
    case Error(String)
}

func ==(a: ServerResponse, b: ServerResponse) -> Bool {
    switch (a, b) {
    case let (.Result(a0, a1), .Result(b0, b1)):
        return a0 == b0 && a1 == b1
    case let (.Error(a0), .Error(b0)):
        return a0 == b0
    default:
        return false
    }
}

let a = ServerResponse.Result("6:00 am", "8:09 pm")
let b = ServerResponse.Error("Out of cheese.")

println(a == b) // "false"
println(a == .Result("6:00 am", "hoge")) // "false"
println(a == .Result("6:00 am", "8:09 pm")) // "true"

```

ただ、毎回書くのは面倒くさいですね。

## 参考

* [How to test equality of Swift enums with associated values](http://stackoverflow.com/questions/24339807/how-to-test-equality-of-swift-enums-with-associated-values)
MySQLでレコードに登録された文字列を置換する

MySQLでレコードに登録してある文字列を置換したい時に便利な関数。


## 文字列置換関数

```
REPLACE(str,from_str,to_str)
```
strに含まれる文字列from_strをすべて文字列to_strに置換した文字列を返す関数。



## 使い方

以下のようにすれば、user_dataテーブルのID８のimage_pathカラムの文字列を変更する事ができる。

```sql:
UPDATE user_data SET image_path=REPLACE(image_path, "/img/", "/") WHERE id=8;
```



以下のように変更される。


```:Before
/img/path/hoge.jpg
```

```:After
/path/hoge.jpg
```
Unity 4系と5系を共存させる場合、CacheServer は5系のソレを入れれば良いよっていうお話。

## CacheServer って？

画像とか音声とかを Unity が各プラットフォーム向けに変換しているんだけれども、それの変換結果をストレージしてくれるサーバのコト。

コレがないと、例えば App Store と Google Play に配信しているタイトルなんかをビルドするときに、毎回 Importing Assets... が走って絶望すること請け合いです。

一般的な使い方は知らないけど、ウチではエンジニアが各自のローカルマシンにインストールして使っている。

[ここ](http://unity3d.com/jp/unity/collaboration) からダウンロードできるっすよ。

## 前振り

Unity 5 登場！ってコトで、既存タイトルをリリースしている人なんかは、Unity 4 系 (4.6.x とか) と共存させてインストールしているケースもあるんじゃないかと。

例えば、自分は `/Applications/Unity4/Unity.app` と `/Applications/Unity5/Unity.app` みたいな感じにしてます。

んで、そこで「あ、CacheServer も入れなきゃじゃん！」ってなって、DL ページに行って、「ダウンロード」ボタンの辺りを見てみたら「Working on Unity 4.x? Download Cache Server for Unity 4 [here](http://download.unity3d.com/download_unity/CacheServer-4.6.3.zip).」なる記述が。

「ってコトは、Unity 4 系と 5 系で別々のキャッシュサーバ必要なの！？」

「………ディスクサイズがヤバいっ！！！」

ってな感じで青ざめていました。

## 本題

青ざめつつ、5 系の CacheServer を起動してみたら、下記のようなエラーが。

```
Cache Server directory /path/to/CacheServer/cache
Cache Server size 5669663186
Cache Server max cache size 53687091200
Cache Server directory /path/to/CacheServer/cache5.0
Cache Server size 0
Cache Server max cache size 161061273600
Port 8125 is already in use...
Unable to start Legacy Cache Server
```

「お！？これは…？」

そう、実は 5 系の CacheServer は LegacyCacheServer.js なる 4 系の CacheServer も内包していたのです！

ありがとう！！

## ちなみに

まだ試してないけど、4 系時代に作った Cache もそのまま利用できるっぽいので、普通に unzip したスクリプトとかを元々の 4 系の CacheServer に上書きしてあげれば OK なんじゃないかな？
FacebookのLike Boxが2015/6/23に使えなくなるので

覚え書き＆初投稿。
FacebookのLike Boxが2015/6/23に使用できなくなるとのこと。

公式情報
https://developers.facebook.com/docs/plugins/like-box-for-pages

うちのクライアントにもWebページにLike Boxを埋め込んでいるサイトがいくつかあるので、ちょこちょこ対応を進めています。

以下をウィジェットを表示する場所に記載する
`
<!-- Facebookの新しいWidget -->
<div class="fb-page" data-href="FacebookページのURL" data-width="500" data-height="400" data-hide-cover="false" data-show-facepile="false" data-show-posts="true"></div>
`

以下をソースのどこかに記載する
`
<!-- Facebook Page Plugin -->
<div id="fb-root"></div>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/ja_JP/sdk.js#xfbml=1&version=v2.3&appId=619285134752311";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
`

問題は幅の上限が500pxになってしまうこと。
今までみたいにレスポンシブなサイトで幅いっぱいに表示したりできないでレイアウトの変更が必要になるようです。

ただし、280px～500pxの間であれば幅は自動的に合わせてくれるみたいですね。
npm@2.7.6でgithubのプライベートリポジトリからnpm installすると認証でエラーになる


* npm installで認証エラーがでるので

```shell
$ npm -v
2.7.6

$ npm i git+https://<token>@github.com/<username>/<reponame>.git
npm ERR! git fetch -a origin (ssh://git@github.com/<username>/<reponame>.git) Permission denied (publickey).
npm ERR! git fetch -a origin (ssh://git@github.com/<username>/<reponame>.git) fatal: Could not read from remote repository.
npm ERR! git fetch -a origin (ssh://git@github.com/<username>/<reponame>.git)
npm ERR! git fetch -a origin (ssh://git@github.com/<username>/<reponame>.git) Please make sure you have the correct access rights
...
```

* npm@2.7.3に戻した

```shell
$ npm install -g npm@2.7.3
/usr/bin/npm -> /usr/lib/node_modules/npm/bin/npm-cli.js
npm@2.7.3 /usr/lib/node_modules/npm
$ npm -v
2.7.3
$ npm i git+https://<token>@github.com/<username>/<reponame>.git
```
partial with layout の微妙な挙動

ほとんど同じなんだけど、ちょっと違うpartialがある時に、partialにlayoutを適用するとDRYに書けたりする。

自分の場合は、メインメニューにおいて、ほとんど全てのメニューは一つのpartialでまかなえるのだが、通知メニューにのみ、未読の数字をバッジのようにつけたかった。partialに変数を渡してif分などで出し分けるということもできそうだが、読みずらくなりそうなので、layoutを使うことにした。

ただ、細かい挙動に関してあまりドキュメントが無いのでハマった。content_forで渡すセクションが二つあったが、なかなかその例がなかった。
試行錯誤過程については、ややこしいので、とばしてもらっても構いません。

##試行錯誤過程

通知メニュー以外のメニューでは通常通りにpartialをrenderしています。(slimで書いてます）


```rb
= render "shared/main_nav__item", path: root_path, label: "Home"

```
通知メニューでまず最初にやってみたのが、上で使ったpartialをlayoutととして使い、

```rb
= render layout: "shared/main_nav__item", path: notifications_path, label: "Notifications"
  content_for :unread_count_active, "unread"
  content_for :unread_count_num, "10"
```

のように、renderしたい内容をその場でブロックで渡してみることです。ただ、これはlayout側から`yield`や`content_for`で取り出すことができませんでした。

どうやら、このようにblockで渡した場合は名前付きのcontent_forは使えないようです。


```rb
= render layout: "shared/main_nav__item", path: notifications_path, label: "Notifications"
 span= "10"
```

試しに名前無しで渡してみたら取り出すことができました。ただ、自分の場合は、二つのセクションを渡したかったので、これでは足りません。


次にpartialのファイルを作って、先ほどblockで内容を書き込みます。

```
content_for :unread_count_active, "unread"
content_for :unread_count_num, "10"
```
それをrenderします。

```rb
= render partial: "shared/unread_count",layout: "shared/main_nav__item",
  locals: {\
    path:   notifications_path,
    label:  "Notifications",
  }

```
この場合、変数はlocalsにいれる必要があるのに注意が必要です。

これを試した結果、不思議なことがおこります。

未読の数字が通知メニューの右隣のメニューの上に表示されてしまいました。partial側をcontent_forからprovideに換えても同じです。

そして、layout側の`yeild`を`content_for`に置き換えてみると、通知メニューと右隣のメニュー両方に未読の数字が表示されてしまいました。この二つ未読数が表示される現象は[rwz/nestive](https://github.com/rwz/nestive)というサードパーティのレイアウトシステムを使っても発生しました。どうやら、yieldやcontent_forでは呼び出しても中身が消えないような作りになっていて、同じpartialを複数回呼び出すとおかしな挙動になるようです。

また、試しに、二つのセクションで分けて名前をつけて渡していたのを、片方だけにして名前無しで渡すとどうなるかやってみました。そうするとひどい画面になりました。通知メニュー以外の全てのメニュー内に、application layoutでyieldされる内容が出力されてしまいました。また、名前ありでyieldしている部分には名前無しで渡されるている部分が出力されてしまっていて、html的にもぐちゃぐちゃになりました。

どうやら、viewの名前空間とpartialで使われる名前空間は同じようで、通知メニュー以外はviewでセットされる内容を出してしまっているようです。
また、この現象はpartialを指定せずにblockでrender内容を名前無しで渡しても発生しました。ただ、名前ありでyieldしている部分は想定通り何も出力しませんでした。

##こうしたら動いた

partial側で、contetn_forを名前ありで使ってlayoutに渡したい内容をセットします。

```rb
content_for :unread_count_active, "unread"
content_for :unread_count_num, "10"
```

application_helperに以下のメソッドを作ります。

```
def yield_content!(content_key)
  view_flow.content.delete(content_key)
end
```

layout側でyieldではなく、yield_content!を使います。

```
= yield_content! :unread_count
```

こんな感じで。


これでpartialでlayoutに二つのセクションを渡すことができました。

##参考
[Partial, Layout, Template rendering problems](http://stackoverflow.com/questions/13106580/partial-layout-template-rendering-problems)
【Swift】Arrayに検索機能を追加する


**Swift**の **Array** にオブジェクトのインデックス番号or *nil* を返す検索用のメソッドを追加してみました。

```swift:ArrayExtension.swift
import Foundation

extension Array {
	
	func find(includeElement: T -> Bool) -> Int? {
		for (index, element) in enumerate(self) {
			if includeElement(element) {
				return index
			}
		}
		return nil
	}
}
```

引数の`includeElement`は`Closuer`なので、`Array`の中に入っているクラスを受け取って、`Bool`を返せばなんでも大丈夫です。

以下、サンプルです。

```swift:Playground.swift
class Person {
    var firstName: String
    var lastName: String
    
    init(firstName: String, lastName: String) {
        self.firstName = firstName
        self.lastName = lastName
    }
}

var hoge = Person(firstName: "hoge", lastName: "hoge")
var fuga = Person(firstName: "fuga", lastName: "fuga")
var hogeFuga = Person(firstName: "hoge", lastName: "fuga")

var persons:[Person] = [hoge, fuga, hogeFuga]

if let hogeIndex = persons.find({ $0 == hoge }) {
    println(hogeIndex)
}
```

-----

**2015/4/20 追記**

@satoshiaさん、@koherさんより配列の要素が重複した場合のことを考えた処理をお教えいただいたので、記載させていただきます！
御二方、改めてありがとうございました！

@satoshiaさんより...

要素が重複している場合を考えて、 **要素のindex番号とその要素を配列にして返すメソッド** をお教えいただきました！

```swift
extension Array {
    func findAll(includeElement: T -> Bool) -> [(Int, T)] {
        let seq = zip(0..<self.count, self)
        return Swift.filter(seq) { includeElement($0.1) }
    }
}
```

@koherさんより

こちらはもっとシンプルに書かれています！

```swift
extension Array {
    func find(includeElement: T -> Bool) -> Int? {
        return Swift.filter(enumerate(self)) { includeElement($0.1) }.first.map { $0.0 }
    }
}
```


以上です。
トラブルシューティング: coreos-vagrant の NFS mountに失敗した件

```
NFS is reporting that your exports file is invalid. Vagrant does
this check before making any changes to the file. Please correct
the issues below and execute "vagrant reload":

exports:8: /Users/k12u conflicts with existing export /Users/k12u/src/
```

`/etc/exports` に不要な設定が残っていたため。
Gitlabでpush -fするとNo such projectと出る

Gitlabでpush origin master -fとかすると、以下のようにNo such projectと出てpushできない現象に何度か遭遇しています。

```
$ git push origin --all -f
Counting objects: 1, done.
Writing objects: 100% (1/1), 504 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
remote: GitLab: No such project
To example@gitlab.example.com:example/example.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'example@gitlab.example.com:example/example.git'
```

``git push origin :master``でmasterを削除しようとしても同様に弾かれるのでちょっと困ってました。

根本的な解決はできていないのですが、対症療法的ですが以下のようにするとなんとかなります。

0. 適当な別ブランチ（devとか）をmaster HEADから作ってpushしておく
0. ウェブインターフェースからdefault branchを一旦devにする
0. ウェブインターフェースからmasterを削除する
0. ``git push origin master``すると新しくブランチを作り直せる
0. default buranchをmasterに戻す

とりあえずこれでしばらく凌げます。
が、何か根本的に間違ってるのは間違いないので、誰かご存知のかた教えてください・・・。
FT232RLのUSB-TTLシリアル変換モジュールをESP826とRaspberry Piと使う



これまで[PL2303HXを搭載](http://www.amazon.co.jp/dp/B00L8SP7U6)したUSB-TTLシリアル変換ケーブルを使っていました。電源供給が5V固定だったので3.3Vのモジュールを接続する場合はロジックレベルコンバータをはさんだり、Arduinoから3.3Vの電源を取ったりと配線が煩雑になってきました。正規品のFT232RLを搭載した[3.3/5.0V切り換えスイッチ付き](http://www.aitendo.com/product/10149)モジュールを安価に購入できたので配線してみます。


## ESP8266

ブレッドボード配線図です。常に電源をONにする場合はCH_PDとVCCをはんだ付けしてしまえばブレッドボードも不要になります。

![FT232RL-ESP8366.png](https://qiita-image-store.s3.amazonaws.com/0/43745/7295fe1f-7a38-951b-3248-9bb1ac7e61ea.png)


* RXD (ESP8266) -> TXD (FT232RL)
* TXD (ESP8266) -> RXD (FT232RL)
* CH_PD (ESP8266) -> VCC (FT232RL)
* VCC (ESP8266) -> VCC (FT232RL)
* GND (ESP8266) -> GND (FT232RL)


ESP8266へはCoolTermから接続します。Options画面でシリアルポートとボーレートを設定します。ポートのxxxのところはデバイスのシリアル番号です。

* Port: usbserial-xxxxxxxx
* Baudrate: 9600


## Raspberry Pi

配線図です。Raspberry Piへの電源供給はFT232RLからでなく別途microUSBから行います。


![FT232RL-RasPi.png](https://qiita-image-store.s3.amazonaws.com/0/43745/3e51bdcc-a886-228c-48d9-e1a66cf7d572.png)


* GND (Raspberry Pi) -> GND (FT232RL)
* RXD (Raspberry Pi) -> TXD (FT232RL)
* TXD (Raspberry Pi) -> RXD (FT232RL)

Raspberry Piの場合はLinuxのシェルを使うためOSXのターミナルからscreenで接続します。

``` bash
$ screen /dev/tty.usbserial-xxxxxxxx 115200
```
【iOS】UILabelにPaddingをつける


## Swift3で書き直しました

[【iOS】UILabelにPaddingをつける（Swift3対応） - Qiita](http://qiita.com/ryokosuge/items/eb64ed8e6d718378f770)

上記の記事で**Swift3**用に書き直したソースコードを書いたので、そちらをご参考ください。

## 過去記事

**UILabel**に日本語フォントを設定している状態で英字を表示すると *g* とか *q* とか *p* など下に伸びる文字が切れて表示されることがあったのでそれの対応として **UILabel**に **Padding**を設定しました。

```swift:PaddingLabel.swift
class PaddingLabel: UILabel {

	// paddingの値
	let padding = UIEdgeInsets(top: 4, left: 4, bottom: 4, right: 4)
	
	override func drawTextInRect(rect: CGRect) {
		let newRect = UIEdgeInsetsInsetRect(rect, padding)
		super.drawTextInRect(newRect)
	}
	
	override func intrinsicContentSize() -> CGSize {
		var intrinsicContentSize = super.intrinsicContentSize()
		intrinsicContentSize.height += padding.top + padding.bottom
		intrinsicContentSize.width += padding.left + padding.right
		return intrinsicContentSize
	}
}
```

## ちょっと解説

`override`しているメソッドについて少しだけ解説してみます。

### drawTextInRect(rect: CGRect)

これは文字列を描画するメソッドです。

引数として渡される`rect: CGRect`が描画する位置は高さ、幅になります。

それを`UIEdgeInsetsInsetRect(rect: CGRect, insets: UIEdgeInsets)`で描画範囲を広げています。

### intrinsicContentSize() -> CGSize

これはUILabelがもともと持っているサイズになります。

**AutoLayout**ではこれがとっても重要になってきます。

`intrinsicContentSize()`で適切なサイズを返さないとpaddingを設定してもそれが適用されず、表示されないというオチになります。

## 終わりに

今後使えるかと思ったのでメモがてらに書きました。
JavaScriptで非推奨プロパティを示す

プロパティの名前変えたから今後は新しい方を使って欲しい。でも古いプロパティにアクセスしているコードがあるからそことの互換性は保ちたい。
みたいなときに使える良い例がthree.jsのコードで見つけたので紹介。

```js
THREE.StereoEffect = function(renderer) {

  // API

  var scope = this;

  this.eyeSeparation = 3;
  this.focalLength = 15; // Distance to the non-parallax or projection plane

  Object.defineProperties(this, {
    separation: {
      get: function() {
        return scope.eyeSeparation;
      },
      set: function(value) {
        console.warn('THREE.StereoEffect: .separation is now .eyeSeparation.');
        scope.eyeSeparation = value;
      }
    },
    targetDistance: {
      get: function() {
        return scope.focalLength;
      },
      set: function(value) {
        console.warn('THREE.StereoEffect: .targetDistance is now .focalLength.');
        scope.focalLength = value;
      }
    }
  });

  // ...以下略
```

利用するときには

```js
var effect = new THREE.StereoEffect(renderer);
```

このとき `effect` のプロパティを読み取ると

```js
console.log( effect.eyeSeparation ); // => 3
console.log( effect.focalLength);    // => 15
console.log( effect.separation);     // => 3 (THREE.StereoEffect: .separation is now .eyeSeparation.)
console.log( effect.targetDistance); // => 15 (THREE.StereoEffect: .targetDistance is now .focalLength.)
```

`effect.separation` と `effect.targetDistance` にアクセスするとコンソールに警告が出るので、使う側から非推奨プロパティだということがわかる。
`effect.separation` と `effect.targetDistance` は実際にはそれぞれ `effect.eyeSeparation` と `effect.focalLength` に値を格納しているため、変数の領域は一つで済んでいる。

Object.definePropertiesについては良いまとめがあったので一読すべし。
http://constellation.hatenablog.com/entry/20101205/1291564928
ウィジェットからActivityを起動した場合にActivityスタックをクリアしたい

#1 前提
Activity A, B...などがアプリに存在。
WidgetタップでActivity Wを起動。

#2 やりたいこと
A→ホームボタン→ウィジェットタップ→W→戻るボタン→ホーム画面

#3 最初の設定

```java:appWidgetProvider.java(NGver.)
Intent intent = new Intent(context, ActicityW.class);
PendingIntent pi = new PendingIntent(...);
```

#4 その時の挙動

A→ホームボタン→ウィジェットタップ→W→戻るボタン→A

まあ、ある意味当然。

#5 Activity W起動用のIntentのフラグをいろいろいじった

```java:appWidgetProvider.java(OKver.)
Intent intent = new Intent(context, ActicityW.class);
intent.setFlags(intent.FLAG_ACTIVITY_NEW_TASK|intent.FLAG_ACTIVITY_MULTIPLE_TASK);
```

(1)A→ホームボタン→ウィジェットタップ→W→戻るボタン→ホーム画面
(2)A→B→ホームボタン→ウィジェットタップ→W→戻るボタン→ホーム画面

でけた！
(2)のあと、アプリアイコンをタップすると、Bが起動されたので、元のActivityスタックに戻れる。
ちなみに、Wからホームボタンをタップすると、以下のようになった。

(3)A→B→ホームボタン→ウィジェットタップ→W→ホームボタン→ホーム画面
→アプリアイコンタップ→W

ふむふむ。
さらにそこから戻るボタンを押すと、ホーム画面に戻った。
んでアプリアイコンタップすると、Bが起動。
ちょっとこの辺は仕様によりそう。

#6 別バージョン

```java:appWidgetProvider.java(OKver.2)
Intent intent = new Intent(context, ActicityW.class);
intent.setFlags(intent.FLAG_ACTIVITY_CLEAR_TASK);
```

FLAG_ACTIVITY_CLEAR_TASKは、API11以降で追加された模様。
これで起動したところ、Activityスタックが削除されてるような挙動。
これでいいじゃん？？

これだと、最初に起動していたActivity AやBには、Wを起動した後には戻れず、アプリアイコンタップ時は必ず起動画面が表示される。
こっちのほうがシンプルかな？
履歴にWが残り続けるのがどうかなというところか・・・

#7 結論

A→D→ホームボタン→W→B→C

こんな感じでウロウロした後、戻るボタンで全部戻って、アプリアイコンをタップしたとき、5の方法だといきなりDが表示されると混乱するかもしれない。
なので、今回は6を採用することにした。
【俺メモ】Excelで文字列になっている数字を一発で数値に戻す方法

エクセルで書式が文字列になっているセルに数字が入力されていた場合、
書式を標準や数値にしても左詰めのまんまやろ？

もしかして、F2→Enterの繰り返しをカタカタやってんのとちゃうやろな？

そんなときはこれ一発で解決や。

# １．数値に戻したいセルを選択
マウスドラッグでも、Ctrl + Shift + 矢印でもええから変更したい所を選択や

# ２．セルの書式を標準（数値）に変更
リボン（メニュー）でも書式ダイアログでもええからまず、書式を標準（数値）に変更や

# ３．区切り位置変更で解決
メニューの「データ」の中にある「区切り位置」からダイアログを表示や、
そのあとすぐにダイアログの完了ボタンをおすとええで。
Kaldiに関する処理を日本語のドキュメントでまとめてみた（デコーディング編）6

#前回

１：http://qiita.com/GushiSnow/items/cc1440e0a8ea199e78c5

２：http://qiita.com/GushiSnow/items/a24cad7231de341738ee

３：http://qiita.com/GushiSnow/items/e099baf9d1c2e72cb3d1

４：http://qiita.com/GushiSnow/items/d431a5c49dc4206def2d

５：http://qiita.com/GushiSnow/items/8e1c25b1d2eda8c1f2c3

#デコーディング

音声認識の作業もデコーディングまで終われば評価を測ることが出来る。
ただし精度を上げるには他の作業も当然必要。

試しに動かすだけならここまでで問題ない。

##デコーディングに必要なデータがあるか精査

```shell-session
if [ -z "$model" ]; then # if --model <mdl> was not specified on the command lin
e...
  if [ -z $iter ]; then model=$srcdir/final.mdl; 
  else model=$srcdir/$iter.mdl; fi
fi

for f in $sdata/1/feats.scp $sdata/1/cmvn.scp $model $graphdir/HCLG.fst; do
  [ ! -f $f ] && echo "decode.sh: no such file $f" && exit 1;
done

```

##特徴量のタイプを指定

```shell-session
case $feat_type in
  delta) feats="ark,s,cs:apply-cmvn $cmvn_opts --utt2spk=ark:$sdata/JOB/utt2spk scp:$sdata/JOB/cmvn.scp scp:$sdata/JOB/feats.scp ark:- | add-deltas $delta_opts ark:- ark:- |";;
  lda) feats="ark,s,cs:apply-cmvn $cmvn_opts --utt2spk=ark:$sdata/JOB/utt2spk scp:$sdata/JOB/cmvn.scp scp:$sdata/JOB/feats.scp ark:- | splice-feats $splice_opts ark:- ark:- | transform-feats $srcdir/final.mat ark:- ark:- |";;
  *) echo "Invalid feature type $feat_type" && exit 1;
esac
```

##話者に応じた特徴量を抽出するfMLLRを適用

```shell-session
if [ ! -z "$transform_dir" ]; then # add transforms to features...
  echo "Using fMLLR transforms from $transform_dir"
  [ ! -f $transform_dir/trans.1 ] && echo "Expected $transform_dir/trans.1 to exist."
  [ ! -s $transform_dir/num_jobs ] && \
    echo "$0: expected $transform_dir/num_jobs to contain the number of jobs." && exit 1;
  nj_orig=$(cat $transform_dir/num_jobs)
  if [ $nj -ne $nj_orig ]; then
    # Copy the transforms into an archive with an index.
    echo "$0: num-jobs for transforms mismatches, so copying them."
    for n in $(seq $nj_orig); do cat $transform_dir/trans.$n; done | \
       copy-feats ark:- ark,scp:$dir/trans.ark,$dir/trans.scp || exit 1;
    feats="$feats transform-feats --utt2spk=ark:$sdata/JOB/utt2spk scp:$dir/trans.scp ark:- ark:- |"
  else
    # number of jobs matches with alignment dir.
    feats="$feats transform-feats --utt2spk=ark:$sdata/JOB/utt2spk ark:$transform_dir/trans.JOB ark:- ark:- |"
  fi

```
##GMMからラティスを作成

```shell-session
    gmm-latgen-faster$thread_string --max-active=$max_active --beam=$beam --lattice-beam=$lattice_beam \
    --acoustic-scale=$acwt --allow-partial=true --word-symbol-table=$graphdir/words.txt \
    $model $graphdir/HCLG.fst "$feats" "ark:|gzip -c > $dir/lat.JOB.gz" || exit 1;
```

##WER SERを計算

WER:単語誤り率
SER:文章誤り率

```shell-session
if ! $skip_scoring ; then
  [ ! -x local/score.sh ] && \
    echo "Not scoring because local/score.sh does not exist or not executable." && exit 1;
  local/score.sh --cmd "$cmd" $scoring_opts $data $graphdir $dir
fi
```

出力されたWER SERは下記のフォルダにある。

```shell-session
kaldi-trunk/exp/mono/decode/
```
Kaldiに関する処理を日本語のドキュメントでまとめてみた（グラフ作成編）5

#前回

１：http://qiita.com/GushiSnow/items/cc1440e0a8ea199e78c5

２：http://qiita.com/GushiSnow/items/a24cad7231de341738ee

３：http://qiita.com/GushiSnow/items/e099baf9d1c2e72cb3d1

４：http://qiita.com/GushiSnow/items/d431a5c49dc4206def2d

#グラフ作成

##デコーディング前の作業でグラフ作成作業がある。

下記のオプションで指定可能

```shell-session
"--mono"       #モノフォン   
"--quinphone"  #クインフォン
"--reverse"    #逆順
"--transition-scale" #スケール変換
"--self-loop-scale"  #自己学習の回数スケール
```

##LGのグラフ（言語モデルと音素のモデルの結合）を作成

LGのグラフ（言語モデルと音素のモデルの結合）を作成
epsilonsの除去と決定
FST after encodingの最小化

```shell-session
fsttablecompose $lang/L_disambig.fst $lang/G.fst |

fstdeterminizestar --use-log=true|

fstminimizeencoded | fstarcsort --sort_type=ilabel > $lang/tmp/LG.fst
```

##CLGのグラフを作成

文脈依存のLGグラフを作成
それぞれの経路に対してソート

```shell-session
fstcomposecontext --context-size=$N --central-position=$P --read-disambig-syms=$lang/phones/disambig.int --write-disambig-syms=$lang/tmp/disambig_ilabels_${N}_${P}.int $lang/tmp/ilabels_${N}_${P} < $lang/tmp/LG.fst|

fstarcsort --sort_type=ilabel > $clg
  
fstisstochastic $clg  || echo "[info]: CLG not stochastic."
```
文脈、単語、音素に加えてHMMの要素も加えたHCLGを作成する。

```shell-session
if [[ ! -s $dir/Ha.fst || $dir/Ha.fst -ot $model  \
    || $dir/Ha.fst -ot $lang/tmp/ilabels_${N}_${P} ]]; then
  if $reverse; then
    make-h-transducer --reverse=true --push_weights=true \
      --disambig-syms-out=$dir/disambig_tid.int \
      --transition-scale=$tscale $lang/tmp/ilabels_${N}_${P} $tree $model \
      > $dir/Ha.fst  || exit 1;
  else
    make-h-transducer --disambig-syms-out=$dir/disambig_tid.int \
      --transition-scale=$tscale $lang/tmp/ilabels_${N}_${P} $tree $model \
       > $dir/Ha.fst  || exit 1;
  fi
fi

if [[ ! -s $dir/HCLGa.fst || $dir/HCLGa.fst -ot $dir/Ha.fst || \
      $dir/HCLGa.fst -ot $clg ]]; then
  fsttablecompose $dir/Ha.fst $clg | fstdeterminizestar --use-log=true \
    | fstrmsymbols $dir/disambig_tid.int | fstrmepslocal | \
     fstminimizeencoded > $dir/HCLGa.fst || exit 1;
  fstisstochastic $dir/HCLGa.fst || echo "HCLGa is not stochastic"
fi

```
【超俺メモ】マウス厳禁！！エクセルショートカット一覧

ここに書かれているショートカットの数値はテンキーではなく
メインのキーボードのほうやさかい、注意な。

(4/17)追記
俺的使用頻度を追加したから参考してや。

# ブック・シート操作
| ショートカット| 内容 | 俺的使用頻度 |
|:------------|:------------|:------------|
|Ctrl + N|新規ブックを作成|★★☆☆☆|
|Ctrl + W<br>Ctrl + F4|ブックを閉じる|★★★☆☆|
|Ctrl + S|ブックを保存|★★★★★★★★★|
|Ctrl + Tab|ブックを切替|★★★★☆|
|Ctrl + PageUp|前のシートに移動|★★★★★|
|Ctrl + PageDown|後のシートに移動|★★★★★|
|Shift + F9|現在のシートのセルを再計算|☆☆☆☆☆|
|Ctrl + Alt + F9|全てのシートのセルを再計算|☆☆☆☆☆|
|Shift + F11|シートを挿入|★☆☆☆☆|
|シートをCtrl + ドラッグ|シートを複製|★★☆☆☆|
|F12|ブックを別名で保存|★★★☆☆|
|Ctrl + F2|印刷プレビュー|★★★★☆|
|Ctrl + F5|ブックのウィンドウを元に戻す|☆☆☆☆☆|
|Ctrl + F9|ブックのウィンドウを最小化|☆☆☆☆☆|
|Ctrl + F10|ブックのウィンドウを最大化|☆☆☆☆☆|

# メニュー関連
| ショートカット| 内容 | 俺的使用頻度 |
|:------------|:------------|:------------|
|Ctrl + F1|リボンの表示・非表示|★★☆☆☆|
|Shift + F10|セルの右クリックメニュー表示|★★★☆☆|
|Ctrl + Shift + U|数式(文字入力)テキストボックス拡大・縮小|★☆☆☆☆|


# セル・列・行の操作
| ショートカット| 内容 | 俺的使用頻度 |
|:------------|:------------|:------------|
|Ctrl + 9|行を隠す|★★☆☆☆|
|Ctrl + Shift + 9|選択範囲の行を再表示|★★☆☆☆|
|Ctrl + 0|列を隠す|★★☆☆☆|
|Ctrl + Shift + 0|選択範囲の列を再表示|★★☆☆☆|
|Ctrl + Shift + @|セルの数式・値の表示切替|★☆☆☆☆|

# 移動
| ショートカット| 内容 | 俺的使用頻度 |
|:------------|:------------|:------------|
|Ctrl + F|検索ダイアログを表示|★★★★★|
|Ctrl + H|置換ダイアログを表示|★★★★★|
|F5<br>Ctrl + G|ジャンプダイアログを表示|★★☆☆☆|
|Ctrl + HOME|シートの一番左上に移動（ただし分割の開始まで）|★★★★★|
|Ctrl + END|シートの一番右下に移動（ただし入力箇所付近まで）|★★★★★|
|Alt + PageUp|一画面分、左へスクロール|★★☆☆☆|
|Alt + PageDown|一画面分、右へスクロール|★★☆☆☆|
|Ctrl + 矢印|文字が続くところまで移動<br>or 空白が続くところまで移動|★★★★★|

# 選択
| ショートカット| 内容 | 俺的使用頻度 |
|:------------|:------------|:------------|
|Ctrl + A|すべてのセルを選択|★★★★★|
|Ctrl + Space|現在の列を選択|★★★☆☆|
|Shift + Space|現在の行を選択|★★★☆☆|
|Ctrl + Shfit + 矢印|文字が続くところまで選択<br>or 空白が続くところまで選択|★★★★☆|
|Ctrl + Shfit + :|入力が連続しているセルを矩形で選択|★☆☆☆☆|

# 入力
| ショートカット| 内容 | 俺的使用頻度 |
|:------------|:------------|:------------|
|F2|セルの編集開始|★★★★★|
|F4|ひとつ前の動作を繰り返し|★★★★★|
|Ctrl + K|ハイパーリンクを挿入|★☆☆☆☆|
|Ctrl + ;|現在日付を入力|★★★★★|
|Ctrl + :|現在時刻を入力|★★★★★|
|Ctrl + D|上のセルをコピー|★★☆☆☆|
|Ctrl + R|左のセルをコピー|★★☆☆☆|
|Ctrl + Shift + 2|上のセルの値を入力|★★☆☆☆|
|Ctrl + Shift + 7|上のセルの数式を入力|★★☆☆☆|
|Ctrl + Shift + ;|セルの挿入ダイアログを表示|★★★★☆|
|Ctrl + Atl + V|形式を選択して貼り付けダイアログ表示|★★★★☆|
|Alt + Shift + =|SUM関数の呼び出し|★☆☆☆☆|


# セルの書式
| ショートカット| 内容 | 俺的使用頻度 |
|:------------|:------------|:------------|
|Ctrl + 1|セルの書式ダイアログ表示|★★★★★|
|Ctrl + 2<br>Ctrl + B|セルの文字を太字と標準に切替|★★★☆☆|
|Ctrl + 3<br>Ctrl + I|セルの文字を斜体と標準に切替|★★★☆☆|
|Ctrl + 4<br>Ctrl + U|セルの文字を下線ありとなしに切替|★★★☆☆|
|Ctrl + 5|セルの文字を取り消し線ありとなしに切替|★★★☆☆|
|Ctrl + Shift + 6|セルの外枠を設定|★★☆☆☆|
|Ctrl + Shift + \|セルの外枠を削除|★☆☆☆☆|
|Ctrl + ^|セルの表示形式を指数(少数2桁)に設定|★★☆☆☆|
|Ctrl + @|セルの表示形式を時間(hh:mm)に設定|★★★☆☆|
|Ctrl + Shift + ^|セルの表示形式を標準に設定|★★★☆☆|
|Ctrl + Shift + 3|セルの表示形式を日付(yyyy/mm/dd)に設定|★★★☆☆|
|Ctrl + Shift + 4|セルの表示形式を通貨(￥付)に設定|★★☆☆☆|
|Ctrl + Shift + 5|セルの表示形式をパーセントに設定|★★☆☆☆|

# オートシェイプ、オブジェクト関連
| ショートカット| 内容 | 俺的使用頻度 |
|:------------|:------------|:------------|
|Ctrl + 6|オブジェクトの表示／非表示を切り替え|★☆☆☆☆|

Excelはたまに落ちるからCtrl + S はしょっちゅう押すんやで。
PHP7調査(18)内部的なソートアルゴリズムの再実装

PHP7から、内部的なソートアルゴリズムが変更されました。これはsort系のPHP関数だけでなく、その他PHPの内部処理でも利用されています。

この変更により最悪時の性能はかなり改善されたと思われますが、現在の実装が最適かどうかは今後の検証が必要だと感じています。

# 新旧の実装

PHP5までのソート実装は教科書的とも言えるクイックソートでした。クイックソートは平均的には最速レベルのソートではあるものの、最悪時の性能が非常に悪くなることでも有名です。

PHP7のソート実装でもクイックソートが用いられていますが、以前の実装とは次のような点が異なっています。

* pivot選択の際、これまで1点決め打ちだったのを3点または5点から選ぶように
* 要素数が少なくなってからは挿入ソートに切り替え

1つめの工夫により、最悪ケースに近づく可能性が以前より下がったと考えられます。2つめの工夫により性能も上がりそうです。

# 性能

次のように、100万要素の配列`$array1`と`$array2`をPHP5.6とPHP7でソートしてみました。

```php
<?php
$array1 = $array2 = array();
define("SIZE", 1000000);
for ($i = 0; $i < SIZE; $i++) {
    $array1[$i] = SIZE-$i;
    switch ($i % 4) {
        case 0:
            $array2[$i] = SIZE-$i;
            break;
        case 1:
            $array2[$i] = SIZE+$i;
            break;
        case 2:
            $array2[$i] = 2*SIZE-$i;
            break;
        case 3:
            $array2[$i] = $i;
            break;
    }
}
$start = microtime(true);
sort($array1);
$time = microtime(true) - $start;
echo $time."s\n";

$start = microtime(true);
sort($array2);
$time = microtime(true) - $start;
echo $time."s\n";
```

|         | PHP 5.6.3 | PHP 7.0.0-dev |
|--------:|----------:|--------------:|
| `$array1` | 0.426 sec |     0.523 sec |
| `$array2` | 27.4 sec  |     0.599 sec |

`$array1`のように綺麗な並び順の場合はPHP5の方が有利だという結果になりました。もしかすると、PHP7の新実装は細かい改善の余地があるのかもしれません。

一方で、多少意地悪な配列を食わせるとPHP5はひどく性能が悪くなることもわかりますが、PHP7の方は安定していそうな結果になりました。

#実装箇所

それぞれの実装を読んでみたい方のために実装箇所も紹介しておきます。

PHP5のソート関数は[Zend/zend_qsort.c](https://github.com/php/php-src/blob/PHP-5.6.8/Zend/zend_qsort.c)の`zend_qsort()`、またPHP7で実装されたソート関数は[Zend/zend_sort.c]
(https://github.com/php/php-src/blob/master/Zend/zend_sort.c)の`zend_sort()`です。

#さらなる最適化

ググってみると最近のナウなソートアルゴリズムとしてイントロソートなどがあるようで、PHP7の実装は今更感があるのかなと思いました。

アルゴリズムなら任せろ！という方がいらしたら、PHP7開発中の今のうちに改善提案を出してみてはいかがでしょうか。よろしくお願いします。

#参照

* [[PHP-DEV] Faster zend sorting implementation](https://www.mail-archive.com/internals@lists.php.net/msg72522.html)
* [イントロソート - Wikipedia](http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%88%E3%83%AD%E3%82%BD%E3%83%BC%E3%83%88)
Macで動画ファイルからさくっと音声ファイルだけをぱくる方法

#はじめに

Mac OS version mavericks

MacのFinderを使って動画ファイルのみをエンコードできるらしい。

![スクリーンショット 2015-04-16 10.40.34.png](https://qiita-image-store.s3.amazonaws.com/0/25895/cc89038e-b7cb-6949-2185-4f9825fc9446.png)

#iTunesで対応できそうなコーデックのファイルで試してみた。

Finderで、あれてきなクリックの「選択したビデオファイルをエンコード」 and

メディアをエンコード設定：オーディオのみで、m4aが作成されます。
![スクリーンショット 2015-04-16 10.47.44.png](https://qiita-image-store.s3.amazonaws.com/0/25895/aa4b9c71-2cae-7a93-ee47-e3ece705d0a4.png)

ぶーーん。
![スクリーンショット 2015-04-16 10.58.24.png](https://qiita-image-store.s3.amazonaws.com/0/25895/bef3fbfa-17e2-3a9e-2efe-a6a4681ed603.png)


ダブルクリックで、iTunesが起動し、いつものパクリでいけます。
![スクリーンショット 2015-04-16 11.00.32.png](https://qiita-image-store.s3.amazonaws.com/0/25895/0b991a26-6a27-7afc-f8bb-caeff3b9744e.png)

じぶんは、MP3エンコードに設定しています。
![スクリーンショット 2015-04-16 11.04.57.png](https://qiita-image-store.s3.amazonaws.com/0/25895/629b3a00-0779-1db1-ddef-fdc486dbf510.png)

#end of line
Xcode6.3でIneligible Devicesと表示されて実機ビルドが出来ない時の対処法

Xcode6.3で実機ビルドをしようとすると`Ineligible Devices` と表示されてデバイスが選択出来ない現象が発生します。

以下のように`Test device` という名前のデバイスが選択できません…
![スクリーンショット 2015-04-16 10.52.04.png](https://qiita-image-store.s3.amazonaws.com/0/35782/21e1ffd9-cc89-cd12-b7e6-df460a3b41c1.png)

そういう時は以下の手順で実機ビルドが出来るようになります！

Product -> Destination を選択しそこに表示されている対象のデバイスを選択！
これで実機ビルドができるようになります。

こんな感じです。
![スクリーンショット 2015-04-16 11.06.49.png](https://qiita-image-store.s3.amazonaws.com/0/35782/4ea45787-e0ce-b5bc-3028-b66b3f4130d3.png)


これでデバイスを選択した状態になり実機ビルドができます。

![スクリーンショット 2015-04-16 10.58.48.png](https://qiita-image-store.s3.amazonaws.com/0/35782/d7f73cd3-b65e-18de-e85a-c2560f2727c8.png)

以上です！
MySQLでGROUP BYとORDER BYを同時に使うと動かない

```sql
SELECT name FROM items GROUP BY name ORDER BY number;
```
これ、itemsテーブルからnumber順にユニークなnameを取ってきてくれるんだと思っていたのですが、飛んだ間違いでした。

どうもGROUP BYしてからORDER BYしているらしい・・・。
しかし、WHERE句に色々付け足してみたりするとまた順番が変わったりする。
調べてみてもどうにもならないっぽい

# ~~解決策１. サブクエリーを使う~~
~~SELECT DISTINCT name FROM (SELECT name FROM items ORDER BY number) AS sub~~


# 解決策２. サーバー側で頑張る

```sql
SELECT name FROM items ORDER BY number DESC;
```
ここまで取得して、返ってきたリストをサーバー側ユニークにする処理をする。

rubyだったら

```rb
sql = "SELECT name FROM items ORDER BY number DESC"
res = ActiveRecord::Base.connection.select(sql)
names = res.values
names.uniq
```
Raspberry Pi を BUFFALO の USB wifi で ad-hoc 通信する設定


#はじめに
AP なしでネットワークを構築できる Ad-hoc 通信は用途によってはとても便利です。メッシュネットというか MANET といったほうがいいのか、その設定の準備として Raspberry Pi で BUFFALO の USB WIFI ドングル WLI-UC-GN や WLI-UC-GNM でアドホック通信をしようとしてはまりました
つきましては、自分への備忘録としてここにメモを残させて頂きますとともに、僭越ながらもしどなたかのお役に立つ事がありましたらそれに勝る幸せはございません

#結論
多くのドキュメントで ad-hoc 接続のための /etc/network/interface の設定として以下が紹介されています

+ （当たり前だけど他とぶつからない）固定 IP アドレス (static)
+ wireless-mode ad-hoc 
+ ad-hoc 通信をする全ての機器で ESSID を合わせる

WLI-UC-GN や WLI-UC-GNM ではこれで接続ができなかった（ping がとおらない）のではまりました

[参考URL 1.](http://buffalo.jp/php/lqa.php?id=BUF196)によるとBUFFALO の wifi ドングルで ad-hoc 通信をするためには更に

+ チャンネルを明示的に合わせる
+ 104ビットの WEP を合わせる

WEP は open, 40ビット、64ビット、104ビットと試行錯誤した結果、104ビットの鍵を指定してやっと ping が通りました。ああよかった。

#設定のサンプル
例えば、３台の Raspberry Pi に以下の IP アドレスをつかって ad-hoc 通信をするとして

+ 192.168.12.1
+ 192.168.12.3
+ 192.168.12.5

192.168.12.1 の interfaces を以下のようにし、残りの２台にも同様（address だけ違う）にして、ad-hoc通信が可能です

```BASH:/etc/network/interfaces
auto wlan0
iface wlan0 inet static 
address 192.168.12.1 
netmask 255.255.255.0 
wireless-channel 1 
wireless-mode ad-hoc 
wireless-essid pi 
wireless-key 01234567890123456789012345
```

#ところで
ところで、ad-hoc 通信は機器間の 1対1 の通信と説明されているのをよくみかけるのですが、別に 1対1 である必要はなく、複数台での構成が可能です。

例えば、下図のように 3台の RPi で 192.168.12.x の ad-hoc ネットワークを作ることが可能です。さらに 12.3 には２つの wlan を用意し、二つめを別のネットワークに接続させてコンソールにする事も可能です

![スクリーンショット 2015-04-16 10.31.40.png](https://qiita-image-store.s3.amazonaws.com/0/46544/955e89db-4804-af40-895f-33745fa24377.png "スクリーンショット 2015-04-16 10.31.40.png")

この時、複数機器間の同時通信も可能でした。ただし、転送速度は落ちました。下の表は 12.5 から 12.1 への bulk 転送の速度が、他の bulk転送の影響を受けるか測ってみた結果です。

![スクリーンショット 2015-04-16 10.31.53.png](https://qiita-image-store.s3.amazonaws.com/0/46544/8a971267-7c0e-1735-2fc9-62a8a7b658e3.png "スクリーンショット 2015-04-16 10.31.53.png")

#future works
ad-hoc 通信ができましたので [olsr によるメッシュネットを構築](http://qiita.com/UedaTakeyuki/items/b0de614fbe93ce0e1aa7)してみます。raspbian では olsrd は apt-get でインストールできます。Mac も brew でインストールできます。Windows は簡単にはインストールできないみたいです。レガシーOS は嫌ですね

#参考URL
1. [BUFFALO のQA](http://buffalo.jp/php/lqa.php?id=BUF196)  もの凄く古いドキュメントですが、BUFFALO の Wifi ドングルを ad-hoc で使う設定について書いてあるドキュメントをこれ意外に見つけることができませんでした
gitでタグを付ける

gitでタグをつけて管理する方法。

### 1. ローカルでタグ付ける

```
git tag v_1.0.0
```

### 2. リモートに反映させる

```
git push origin v_1.0.0
```

#### 番外編: ローカルでつけたタグを全てリモートに反映させる

```
git push origin --tags
```

#### 番外編2: 過去のコミットにタグを付ける

```
git log --pretty=oneline

hogehoge1 dev
fugafuga1 pre
fufufufu1 prod

git tag pre_v1.0.0 fugafuga1
```

#### 番外編3: リモートのタグを消す

```
git tag -d [タグの名前]
git push origin :[タグの名前]
```

ブランチを消す時と同じやり方だった
ApexでSalesforceのアプリケーションメニューを取得する

# ApexでSalesforceのアプリケーションメニューを取得する

Salesforceの右上メニューのアプリケーション一覧を取得したくて、REST APIで取得したら問題が起きたので、Apexで実現した。

## だめな例

よくこのように書いてあるが、これだとだめ。
参考：[apex - How to Get App Name - Salesforce Stack Exchange](http://salesforce.stackexchange.com/questions/19247/how-to-get-app-name)


```sql
SELECT Id, Name, Label FROM AppMenuItem WHERE Type = 'TabSet'
```

- REST API
    - システム管理者以外だと何も取得できない。
- Apex
    - `with sharing`をつけても権限にかかわらず何でも取得できてしまう。
    - 「サンプルコンソール」のような謎なアプリケーションも取得できてしまう。

## 正解

正解は以下のようにする。

```java
    @RemoteAction
    global static List<AppMenuItem> getAppMenuItems(){
        String loginUserId = UserInfo.getUserId();
        List<SetupEntityAccess> entities = [
            SELECT SetupEntityId
            FROM SetupEntityAccess
            WHERE ParentId
            IN (select PermissionSetId from PermissionSetAssignment where AssigneeId = :loginUserId)
            AND SetupEntityType = 'TabSet'
        ];
        List<Id> entityIds = new List<Id>();
        for(SetupEntityAccess entity : entities) {
            entityIds.add(entity.SetupEntityId);
        }

        List<AppMenuItem> menus = [
            SELECT Id, Name, Label, NamespacePrefix
            FROM AppMenuItem
            WHERE ApplicationId  IN :entityIds
            ORDER BY SortOrder ASC
        ];
        return menus;
    }
```

これでプロファイルであるアプリケーションを参照不可にすればちゃんと結果から除かれる。
「サンプルコーンソール」のような謎のアプリケーションも含まれなくなる。

参考：[soql - Appmenuitem & SetupEntityAccess relation for creating app launcher for connected apps - Salesforce Stack Exchange](http://salesforce.stackexchange.com/questions/65199/appmenuitem-setupentityaccess-relation-for-creating-app-launcher-for-connected)
IMAPでメール本文を表示するときの注意


IMAPでメールを取得するにはFETCHコマンドを使用しますが、FETCHでメール本文を取得すると、何もしないと未読フラグが解除されてしまいます。未読のまま取得するには、FETCHコマンドのPEEKオプションを追加します。

[失敗例] 1番のメールの本文を取得

```
tag1 FETCH 1 BODY[TEXT]
...
tag2 FETCH 1 FLAGS
tag2 1 FETCH (FLAGS (\Seen))   <- 既読になってしまう
```

[修正例] 未読フラグを維持したまま、1番のメールの本文を取得

```
tag1 FETCH 1 BODY.PEEK[TEXT] <- ".PEEK" を追加
...
tag2 FETCH 1 FLAGS
tag2 1 FETCH (FLAGS ())
```

javamailの場合は、IMAPMessage#setPeekメソッドを使用します。

```java
Message message = folder.getMessageByUID(uid);
if (message instanceof IMAPMessage) {
	((IMAPMessage) message).setPeek(true);
}

```
iOS Simulatorのシステムログを確認する

iOS実機のシステムログは[iOS Console](http://lemonjar.com/iosconsole/)で簡単に確認できるが、iOS Consoleではシミュレータのログは確認できないらしい。ということでシミュレータのログをターミナルで表示してみる。

まずデバイスコードを調べる。ターミナルで
```
$ instruments -s devices
```

を実行する。すると下記のような結果が得られる。

```
Resizable iPad (8.1 Simulator) [032E0AF3-9943-41BF-BE07-6EBBAD29C292]
Resizable iPad (8.3 Simulator) [89E067A1-E066-4010-A8DA-4AB126321BD3]
Resizable iPhone (8.1 Simulator) [255FC585-6339-4822-A3BD-A4AD7F995353]
Resizable iPhone (8.3 Simulator) [F1925327-7810-4AC4-AB80-2336FE2ECCF9]
iPad 2 (7.1 Simulator) [278E9982-C4B7-403D-8135-F0293732D9B4]
iPad 2 (8.1 Simulator) [8E69F598-598A-48CB-869F-0B3A13D3187A]
iPad 2 (8.3 Simulator) [16678101-7A50-4C4E-912F-37C8598C17B7]
iPad Air (7.1 Simulator) [7EF8022A-2639-46BB-9D5E-DA35D7663F94]
iPad Air (8.1 Simulator) [4B2593CD-AB66-4CC6-B809-23D23F0B0662]
iPad Air (8.3 Simulator) [01FAB7AF-EE51-4030-8B2D-133CC84CB1AB]
iPad Retina (7.1 Simulator) [60B9AE25-9D7B-414D-80F4-84C78F3763B6]
iPad Retina (8.1 Simulator) [D5F24867-8030-4169-8230-CB152307B002]
iPad Retina (8.3 Simulator) [C5C4EA3D-26D1-4352-821F-F6F4F48BCD32]
iPhone 4s (7.1 Simulator) [DFA7624D-DDAA-42AA-9194-2ECDC64F30EE]
iPhone 4s (8.1 Simulator) [076A2837-ABFA-46F6-A73E-39E5BD64AFFE]
iPhone 4s (8.3 Simulator) [FF5F53D8-E26A-49A2-9EFD-CD1307A0CB7E]
iPhone 5 (7.1 Simulator) [8608D11B-795E-4CDF-ACDD-3183902DFA86]
iPhone 5 (8.1 Simulator) [1CB9AA79-0F70-495F-A61F-7373CA8C995C]
iPhone 5 (8.3 Simulator) [8C74777F-2388-4118-BC7C-F5AEBC9D4E55]
iPhone 5s (7.1 Simulator) [ED896B1E-8471-48BC-8841-C1551C2014C1]
iPhone 5s (8.1 Simulator) [D896BBDB-70BD-4270-927A-45F6C79DC28E]
iPhone 5s (8.3 Simulator) [9767F389-F5B1-4B9D-B476-4A5A26B46149]
iPhone 6 (8.1 Simulator) [CF9BE10F-10C9-43D5-8FD1-584A40C1C585]
iPhone 6 (8.3 Simulator) [690BBFDC-F913-46D7-B5C6-54291653076E]
iPhone 6 Plus (8.1 Simulator) [C2D24805-9803-40F5-B67C-62CE907E1D48]
iPhone 6 Plus (8.3 Simulator) [4A625DCE-E996-43E5-88ED-022DB6FC7305]
```

この場合一番下のiPhone 6 Plus iOS 8.3シミュレータであれば`4A625DCE-E996-43E5-88ED-022DB6FC7305`が私の環境でのデバイスコードである。

ログファイルのパスは`~/Library/Logs/CoreSimulator/<DEVICE_CODE>/system.log`である。なのでiPhone 6 Plus iOS 8.3シミュレータであればターミナルで
```
$ tail -f ~/Library/Logs/CoreSimulator/4A625DCE-E996-43E5-88ED-022DB6FC7305/system.log
```

と実行することで、ログを確認することができる。デバイスコードは各環境で違うのでそれぞれ置き換えて実行する。
OpenStreetMap Core Value Draft翻訳


これは、2015年3月のOSMF本家理事会合で議論された "OpenStreetMapの核となる価値" の翻訳です。
このコアバリューは現在ドラフトの状態であり、OSMFメーリングリストで公開議論が行われている最中です。
今後の議論によって、適宜修正が加えられる可能性があります。

議論は主に、以下のスレッドで行われています。

* [[Osmf-talk] Board requests mapper feedback: Draft Core Values](https://lists.openstreetmap.org/pipermail/osmf-talk/2015-April/003323.html)


OSM Core Values / OSMのコアバリュー
===============

> Explanatory note: This is a discussion document arising out of the OSMF Board 2015 Face-to-Face meeting. Board members have attempted to describe, from our respective points of view, a set of core values that we think might enjoy broad agreement from mappers. We do not intend to hastily imply any mapper consensus around these values nor do we intend to impose them onto the community. But we hope that you will give us feedback with the goal of arriving at a set of values that all mappers will be happy to get behind.

解説: これは2015年に行われたOSMF理事対面会合の内容を基にした、議論用のドキュメントです。理事はそれぞれの観点から、多くのマッパーたちが合意するOSMの "コア・バリュー" を描くことを試みています。私たちは、これらのバリューをすぐさま、すべてのマッパーやコミュニティに要求するものではありません。私たちは、みなさんからのフィードバックをもとにこれらのバリューを明確にし、すべてのマッパーが楽しく活動できるよう、支援したいと考えています。


> Best Map: We want to make the best map data set of the world. 

最良の地図: 私たちは、世界で最良の地図を作りたい

> Free to all: OSM Data is available under a Free and Open licence to everybody. 

すべてのひとに自由を: OSMデータは、自由でオープンなライセンスのもと、すべてのひとが利用することができる

> Importance of Community: OSM is powered by its Community. Engage positively with the Community, be a good and respectful neighbour and assume good intent. 

コミュニティの重要性: OSMは、そのコミュニティによって成り立つ。コミュニティに寄り添い、敬意をもって接するよき隣人のごとく、互いに信頼を醸成する


> Anybody can edit: OSM works because of the power of the crowd and our goal is to enable everybody in the world to contribute. Everybody is free to edit the map and applications are encouraged to help their users improve the map. 

誰もが編集できる: OSMは、それを編集する多くの人びとの活動によって"形成"されており、世界中の誰もが活動に参加できるようにすることが私たちの目標である。地図は誰もが編集することができ、利用者が地図の改善を行い易くするためにアプリケーションが存在する


> Widely used: We want OSM data to be used as widely as possible. 
広範な利用: 私たちは、OSMデータが可能な限り広く利用されることを望む


> Ground Truth: OSM favours objective “Ground Truth” over all other sources. 

現地優先: OSMは、あらゆる情報源のなかで "現地情報を優先/Ground Truth" する

> Extensibility: OSM wants you to map the things you care about and will ensure that you have the freedom to do so. This safeguards the accessibility of our map to diverse users with differing needs.

拡張性: OSMは、あなたが関心をもつ物事が地図に書き込める場であり、なおかつ、それが許される場でありたいと考える。この方針により、多様なユーザがそれぞれ異なる方法で私たちの地図を利用することが妨げられないよう保護するものである
jsoup selectorで複数クラスが割り当てられている要素を取得

例えば下記のfooだけを取得したい場合

    <td class="hoge1">hoge</td>
    <td class="hoge1 hoge2">foo</td>

Elements elem = document.select("td.hoge1");
ではどちらの要素も取得してしまう
なのでfooだけを取得したい場合は
Elements elem = document.select("td.hoge1.hoge2");
という風にクラスをすべて書くとfooの要素だけ取得できる



そんなにむつかしいことではないが、メモメモ
(参考：http://jsoup.org/apidocs/org/jsoup/select/Selector.html)
自分用メモ > tail -f *logで複数ファイルのtail

[Qiitaの投稿](http://qiita.com/yusabana/items/b5cc2a706be8c031043e)のtukiyo3さんのコメントが便利なので抜き出しておく。

>tukiyo3さん
>複数ファイルを tail -f *log する場合はtailですね。
WordPressをAWS上で簡単にスケールアウトする方法


# 追記：2015/05/01

WordPress HTTPSと、Nephila clavata (絡新婦)を使って、複数ドメイン+S3メディアで運用すると、正常にS3にアップロード出来ないことがありました。原因はまだ深堀りできてないです。そこで、別のプラグインでS3にアップロードするようにしてみました。

## 使うプラグイン

- ~~[Nephila clavata (絡新婦)](https://wordpress.org/plugins/nephila-clavata/)~~
- [Amazon Web Services](https://wordpress.org/plugins/amazon-web-services/)
- [Amazon S3 and CloudFront](https://wordpress.org/plugins/amazon-s3-and-cloudfront/)
- [WordPress HTTPS](https://wordpress.org/plugins/wordpress-https/)

Nephila clavata (絡新婦)の代わりに、Amazon S3 and CloudFrontを使用します。設定方法なんかは、あまり変わりません。

## Amazon S3 and CloudFrontの注意点

Nephila clavata (絡新婦)と同様に、メディアを自身のサーバとS3にアップロードしてくれるという点では同じですが、Amazon S3 and CloudFrontは既存のファイルに関してはなにもしてくれません。Pro版でそういった機能が使えるよーみたいのは書いてありましたが。なので、すでに動いてしまっているサービスの場合、手動でS3へのアップロードと、DBのデータ修正をする必要があります。

S3へのアップロードは、単純に`wp-content/uploads`ディレクトリをアップロードするだけです。

DBのデータ修正というのは、このメディアファイルはS3にあるよーというのをAmazon S3 and CloudFrontプラグインに教える必要があるためです。形式は以下のとおり。

- テーブル : wp_postmeta

| post_id | meta_key | meta_value |
|:-----------|------------|------------|
| wp_posts.ID|amazonS3_info|serializeデータ|

コードで書くならこんな感じです。

```php
$data = (
	'bucket' => 'bucket-name', // S3バケット名
	'key' => 'wp-content/uploads/ファイル名',
	'region' => 'ap-northeast-1', // 東京
);

sprintf(
	'insert matome_postmeta (post_id, meta_key, meta_value) values (%d, "%s", "%s"); ',
		$post_id,
		'amazonS3_info',
		serialize($data));
```

これで、今のところ上手くスケールアウトしつつメディアはS3で単一という構成ができています。

追記終わり。


WordPress便利ですよね。カスタマイズしていくと、色々大変ですが。そんな便利なWordPressですが、うっかりすると大変重く、死ぬことがあります。キャッシュさせるとか方法は昔から色いろあるんですが、インフラレベルで、対応できたほうが良かろうもんということで、WordPressをスケールアウトさせてみました。

# 目指した最小構成

![wordpress.png](https://qiita-image-store.s3.amazonaws.com/0/2152/1b5807c9-26e5-9de0-5a98-96ac517cacec.png "wordpress.png")

AWSのELB + EC2 + RDS + S3です。管理画面だけ別ドメインとしてサーバを切り出しています。これには理由があります。すでに稼働しているWordPressをスケールアウトさせるには、すでにアップロードされている画像の処理に困ってしまうためです。

まっさらな状態でスタートする場合は、管理画面を特に分けずともいけるかもしれません。ただ、分けておくと便利なこともあるので、この構成をお勧めします。

RDSに関しては、単純にインスタンス作ってデータベースの接続情報を入力するだけなので簡単ですね。ElasticCacheのmemcachedを使って、フロントのキャッシングをさせたりするのも良いですね。

## 使うプラグイン

- [Nephila clavata (絡新婦)](https://wordpress.org/plugins/nephila-clavata/)
- [WordPress HTTPS](https://wordpress.org/plugins/wordpress-https/)

この2つのプラグインを使用します。

### Nephila clavata (絡新婦)

もうネーミングが良いですね。このプラグインは、画像などのメディアファイルをAWS S3にアップロードしてくれるやつです。S3にアップロードするプラグインは、他にもありますが、ひと味違います。

- 既存の画像もS3にアップしてくれる
- S3と今までどおりサーバ上、両方に保存する
- プラグインを無効にした場合、サーバ上の方に切り替わる

これによって、途中からS3に切り替えた場合でも対応できます。ただし、既存の画像をS3にアップするのは、ユーザがページを閲覧した時`the_content` `wp_get_attachment_url`のフィルターフックを使って行っているので、予めS3にファイルをアップロードさせておいたほうが、負荷は少なくなるでしょう。

設定の仕方も、AWSのAccess Keyやバケット名を入力するだけなので簡単です。

### WordPress HTTPS

WordPressは、`wp_options`テーブルに保存されている`option_name=siteurl`なURLが絶対的な権力を握っているため（嘘）、Apacheなどで別ドメインを割り当てて管理画面にアクセスすると、本来のURLにリダイレクトして戻されてしまします。本当に面倒ですね。

そこで、WordPress HTTPSプラグインを使って、管理画面に別ドメインを割り当てることにします。

設定方法も簡単で、プラグインを有効にした後、HTTPSの設定から別ドメインを入力するだけです。

![スクリーンショット 2015-04-16 8.50.14.png](https://qiita-image-store.s3.amazonaws.com/0/2152/01ea19b3-5bc5-4deb-2e8e-73e7ca734904.png "スクリーンショット 2015-04-16 8.50.14.png")
REPマクロをクラス化してみた

# REPマクロとは

競技プログラミングで使われるらしい？

```cpp
#define REP(i,n) for (int i=0;i<(n);i++)
```

こんなマクロを定義しておいて

```cpp
REP(i, 5) {
	REP(j, 10) {
		std::cout << i << ", " << j << std::endl;
	}
}
```
みたいに使うっぽい
はぇ～って感じだ（小並感）
# クラス化してみる
（何となく試してみただけで実用性は）ないです

```cpp

class repeat {
public:
	// コンストラクタでループする
	repeat(size_t count, std::function<void()> lambda) {
		size_t index = get().size();
		// カウンタを追加
		get().push_back(0);
		// count 回 lambda を実行
		for (; get()[index] < count; get()[index]++) {
			lambda();
		}
		// カウンタを削除
		get().pop_back();
	}
	// ループ回数を取得する
	static size_t count(size_t index) {
		return (index >= get().size()) ? 0 : get()[index];
	}
	// get()[index] = count(index)
	static std::vector<size_t> &get() {
		static std::vector<size_t> count;
		return count;
	}

};
```
このクラスを使って

```cpp

repeat(5, [] {
	repeat(10, [] {
		std::cout << repeat::count(0) << ", " << repeat::count(1) << std::endl;
	});
});

```
みたいに使う

# 結論
短く書かなくていいならふつうに for した方がいい（震え声）