OmniAICreator/Qiita-1.07M huggingface dataset:
sseでuint32をfloatに変換

たまたまunsigned longをfloatに変換する必要があって、どうも標準関数はないようなので覚書として。

sseにはsigned long(= int32_t)をfloatに変換してくれる_mm_cvtepi32_ps()という関数があるのですが、これでは0xffffffffが-1.0fに変換されてしまいます。

やり方１はstackoverflowにあったヤツのアセンブラを関数に置き換えただけです。

手元の環境(corei5 ivybridge)では、やり方2の方が気持ち速くなりました。

```uint32tofloat.cpp
    // test data
    __m128i val = _mm_set_epi32(-1,0x10000,0xffffffff,0x7fffffff);

// val is treated as signed long.
// 0xffffffff becomes -1.0. ;(
    __m128 valf = _mm_cvtepi32_ps(val);
    __m256d vald = _mm256_cvtepi32_pd(val);

// uint32 -> float method1
    __m128i mask = _mm_set1_epi32(0xffffu);
    __m128i onep39 = _mm_set1_epi32(0x53000000);
    // low 16bits
    __m128i val_low = _mm_and_si128(val, mask);
    // 16bit int -> float
    __m128 vallf = _mm_cvtepi32_ps(val_low);

    // high 16bits
    __m128i val_high = _mm_srli_epi32(val, 16);
    val_high = _mm_or_si128(val_high, onep39);
    __m128 valhf = _mm_castsi128_ps(val_high);
    valhf = _mm_sub_ps(valhf, _mm_castsi128_ps(onep39));

    // lower part + higher part --> result
    __m128 result = _mm_add_ps(vallf, valhf);
// uint32 -> float method1

// uint32 -> float method2
    __m128i mask = _mm_set1_epi32(0xffffu);
    __m128 _0x10000 = _mm_set1_ps(0x10000);
    // low 16bits
    __m128i val_low = _mm_and_si128(val, mask);
    // 16bit int -> float
    __m128 vallf = _mm_cvtepi32_ps(val_low);

    // high 16bits
    __m128i val_high = _mm_srli_epi32(val, 16);
    // 16bit int -> float
    __m128 valhf = _mm_cvtepi32_ps(val_high);
    // multiply 65536
    valhf = _mm_mul_ps(valhf, _0x10000);

    // lower part + higher part --> result
    __m128 result = _mm_add_ps(vallf, valhf);
// uint32 -> float method2
```

# 参考
http://www.officedaytime.com/tips/simd.html
http://stackoverflow.com/questions/9151711/most-efficient-way-to-convert-vector-of-uint32-to-vector-of-float
Rubyで二次元配列をsortしたい

例えば以下の様な `["名前", コメント数]` という構造を持つ配列があって、その内側の配列の二番目の要素(この例では「コメント数」)でソートしたい。

```ruby
nogizaka = [
  ["秋元真夏", 4165],
  ["生田絵梨花", 3400],
  ["生駒里奈", 3305],
  ["伊藤万理華", 2746],
  ["北野日奈子", 0],
  ["佐々木琴子", 310],
  ["白石麻衣", 2235],
  ["寺田蘭世", 1860],
  ["中田花奈", 3859],
  ["中元日芽香", 4580],
  ["西野七瀬", 2409],
  ["橋本奈々未", 3581],
  ["深川麻衣", 5823],
  ["星野みなみ", 339],
  ["堀未央奈", 3035],
]
```

## ここでは降順の結果が得られるようなやり方を幾つか紹介

(1) sort （ブロックの中のaとbを逆にすることで降順になる）

```ruby
nogizaka.sort { |a, b| b[1] <=> a[1] }
```

(2) sort reverse

```ruby
nogizaka.sort { |a, b| a[1] <=> b[1] }.reverse
```

(3) sort_by reverse その1

```ruby
nogizaka.sort_by { |_, b| b }.reverse
```

(4) sort_by reverse その2

```ruby
nogizaka.sort_by(&:last).reverse
```

いずれも同じ結果が得られる。(コメント数で降順にソート)

	[
	  ["深川麻衣", 5823],
	  ["中元日芽香", 4580],
	  ["秋元真夏", 4165],
	  ["中田花奈", 3859],
	  ["橋本奈々未", 3581],
	  ["生田絵梨花", 3400],
	  ["生駒里奈", 3305],
	  ["堀未央奈", 3035],
	  ["伊藤万理華", 2746],
	  ["西野七瀬", 2409],
	  ["白石麻衣", 2235],
	  ["寺田蘭世", 1860],
	  ["星野みなみ", 339],
	  ["佐々木琴子", 310],
	  ["北野日奈子", 0]
	]


## ちなみに...
どれを使えばよいのかBenchmarkをとってみる

```ruby
require 'benchmark'

ary = []
1000.times {
  ary << ['hoge', rand(100)]
}

n = 1000

Benchmark.bm(25) do |x|
  x.report('sort') { n.times { ary.sort { |a, b| b[1] <=> a[1] }}}
  x.report('sort reverse') { n.times { ary.sort { |a, b| a[1] <=> b[1] }.reverse }}
  x.report('sort_by{|_,b|b} reverse') { n.times { ary.sort_by { |a, b| b }.reverse }}
  x.report('sort_by(&:last) reverse') { n.times { ary.sort_by(&:last).reverse }}
end

#=>
#                                 user     system      total        real
# sort                        0.800000   0.000000   0.800000 (  0.811129)
# sort reverse                0.800000   0.010000   0.810000 (  0.802099)
# sort_by{|_,b|b} reverse     0.450000   0.000000   0.450000 (  0.456646)
# sort_by(&:last) reverse     0.450000   0.010000   0.460000 (  0.454975)
```

## 結果

とりあえず `sort` より `sort_by` を使ったほうが良さそう。
sort_by ならどちらのやり方でも大差ないと思う。


参考
http://stackoverflow.com/questions/7033719/sorting-a-two-dimensional-array-by-second-value
セキュリティ脆弱性を修正した Go 1.4.3 がリリース

- [Go 1.4.3 is released (security fix) - Google グループ](https://groups.google.com/forum/#!topic/golang-announce/iSIyW4lM4hY)

というわけで [Go 言語]の [`net/http`] パッケージに脆弱性が発見された模様。

[`net/http`] パッケージを使っている製品は最新バージョンで再コンパイルすること。可能であれば 1.5 系を使うのが望ましい。諸事情で 1.5 系が使えない場合は，リリースされた 1.4.3 を使ってもよい。

## 影響度

“[access.redhat.com | CVE-2015-5739](https://access.redhat.com/security/cve/CVE-2015-5739)” より

> CVE-2015-5739 CVE-2015-5740 CVE-2015-5741 golang: HTTP request smuggling in net/http library

CVSS 基本値 6.8 (AV:N/AC:M/Au:N/C:P/I:P/A:P) （暫定値）

| 基本評価基準                            | 評価値            |
|----------------------------------------:|:------------------|
| 攻撃元区分（AV）                        | ネットワーク（N） |
| 攻撃条件の複雑さ（AC）                  | 中（M）           |
| 攻撃前の認証要否（Au）                  | 不要（N）         |
| 情報漏えいの可能性（機密性への影響, C） | 部分的（P）       |
| 情報改ざんの可能性（完全性への影響, I） | 部分的（P）       |
| 業務停止の可能性（可用性への影響, A）   | 部分的（P）       |

CVSS については[デモページ](http://www.baldanders.info/spiegel/archive/cvss/cvss2.html)を参照のこと。

## 参考

- [Go 言語に関するブックマーク - Qiita](http://qiita.com/spiegel-im-spiegel/items/98d49ac456485b007a15)

[Go 言語]: https://golang.org/ "The Go Programming Language"
[`net/http`]: https://golang.org/pkg/net/http/ "http - The Go Programming Language"
Proxy setting for command line tools etc...


## Proxy setting for command line tools etc...
プロキシ設定の方法が分からず調査した結果を少しづつ公開します．

## プロキシに関する環境変数
多くのコマンドは以下の表で紹介する環境変数を自動的に利用してくれるようです．

|Name|Description|Example|
|---|---|---|
|http_proxy or HTTP_PROXY|Proxy url for http|`http://proxy.example.com:80`|
|https_proxy or HTTPS_PROXY|Proxy url for https|`http://proxy.example.com:80`
|no_proxy|Domains bypassing proxy|`localhost`|

## コマンドごとの対応方法
コマンドごとに対応する方法も調査したので拙い例を公開します．

### gem
```bash
gem install -​-http-proxy 'http://proxy.example.com:80' <package>
```

[Gem Guides - gem install](http://guides.rubygems.org/command-reference/#gem-install)

## これからも調査する予定です
mochaでnpm testの各テストの実行時間を*ちょっと*見る

testにはmochaを使っていますが、mochaは実行に時間がかかる遅いテストがあると実行時間を表示してくれます。
通常の利用では十分便利なのですが、テストの数が増えてくると、遅くないテストについてももっと速度改善の余地が無いかどうか、実行時間を表示したくなる事があります。そんな時は、以下のように `npm test` にオプションを指定すればokです。

```shell-session
npm test -- --slow 0
```

`--slow 0`オプションを付けても、1msを切っているテストについては時間は表示されないようです。まあ十分速いので良いでしょう。
iBeacon Advertiser in Node.js


## iBeacon Advertiser in Node.js
iBeaconを受信するアプリを実装した際に動作を確認するため，iBeaconを発信する手段を調査した結果，余りにも簡単だったため公開します．

## advertise.js
```js:advertise.js
var Bleacon = require('bleacon');
// replace uuid
var uuid = 'ef5b1eff-7a78-4e1c-a63d-60b54c077561';
// 2 bytes assigned to major and minor [0 - 65535]
var major = 0;
var minor = 65535;

Bleacon.startScanning(uuid, major, minor);
```

### Prerequisites
[github - bleacon](https://www.npmjs.com/package/bleacon)を参考にすると，[github - noble](https://github.com/sandeepmistry/noble#prerequisites)と[github - bleno](https://github.com/sandeepmistry/bleno#prerequisites)が示す条件を満たせば動作するようです．

## 後で調査
### identifierは設定できないのか

## より詳しく知りたい方
記事を書いた後により丁寧に解説されている方がいたので紹介します．

- [たった6行!最も簡単にiBeaconの電波を「発信」する方法](http://qiita.com/Morikuma_Works/items/a0dd3cfcd1eef8dbd492)
N+1問題とは

Railsを扱っていると頻繁にN+1問題というものを聞く。

# N+1問題とは何か？
N+1問題とは、え！そんなにSQL発行されるんですか！？というやつである。

# N+1問題が潜む可能性があるのはどこか？
SQLの発行回数を抑えたいのは、常識の範囲であるので、レビューとか自分の書いてるコードとかで、どのようなときにN+1を注意すべきなのかというのが重要なところである。

## こうなってたら注意しよう
モデルで、`has_many`そして`belongs_to`を持っているものがあれば、N+1問題が発生する可能性がある。そうなっているモデルのコードをレビューもしくは扱うときは注意してコードを観察しよう。

HogeモデルとFooモデルがあるとして、

```
class Hoge < ActiveRecord::Base
  has_many :foos
```

```
class Foo < ActiveRecord::Base
  belongs_to :hoge
```

このように定義されているとする。

```
Hoge.all.each do |hoge|
  p hoge.foos
end
```

や

```
Foo.all.each do |foo|
  p foo.hoge
end
```

としてしまうと、`each`の中で紐付いたモデルを取りに行くためSQLが毎回発行されてしまう。


## includesとかで解決

```
Hoge.all.includes(:foos).each do |hoge|
  p hoge.foos
end
```

```
Foo.all.includes(:hoge).each do |foo|
  p foo.hoge
end
```

と書くと、N+1問題は起きなくなる。
具体的には、IN句でいっきに読み込んでくれる。

## 疑問
INって遅いイメージがあるので、基本使わないようにしてたイメージがるのだが、よいのだろうか....
サブクエリーを使うわけなじゃなくて、INに欲しいIDの値を直書きしているからよいのかな...
MacでVPNを簡単にON/OFFするのをJXAで書いてみた。

前までVPN接続の自動化とかAppleScriptで書いてたんだけど、AppleScriptって結局全然慣れなくて凄い書くのが苦痛だった。そしたらいつの間にかJavascriptで書けるようになってるから試してみたら超簡単になってて歓喜ｗｗ

例えばVPN接続とか↓こんな風に2行で終わりだしES6も普通に使えるっぽいし色々捗るわこれｗｗ

```js:vpn-on.js
#!/usr/bin/osascript
const se = Application('System Events');
se.connect(se.networkPreferences.services["VpnName"]);
```

今まで[こんなに冗長な感じ](http://stackoverflow.com/questions/28253710/i-have-a-script-to-automatically-connect-to-vpn-with-applescript-how-do-i-make)だったのにな。冗長っていうか頭に入ってこなかったのよねこの言語…。
AMD Opteron Abu-DhabiとLinuxのtransparent hugepage (THP) との相性問題

# 症状
HPCクラスターの計算ノードとして使っているAMD Opteronベースのマシンで、比較的メモリーを消費するソフトウェアを走らせていると、数時間後に一部のコアのloadが100%となり、一部のプロセスがフリーズする現象が起きた。解除にはリブートが必要で、非常にうっとうしいので対処法を調べてみた。

# 環境
- CPU: AMD Opteron Abu-Dhabi 6380 x4 (total 64-cores)
- RAM: 512Gbytes
- OS: Ubuntu 14.04 LTS (GNU/Linux 3.13.0-24-generic x86_64)

# 対処
```
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# echo never > /sys/kernel/mm/transparent_hugepage/defrag
```
これによりtransparent hugepage (THP)サポートを一時的に停止することができるらしい。実行した結果とりあえず問題は起きないようになった。これ以上の原因追及は行っていないが、上記環境とTHPサポートの相性はよろしくないようである。

# 参考資料
- [ablog: Transparent HugePages を無効化する](http://d.hatena.ne.jp/yohei-a/20140223/1393141633)
- [研究日誌。: Transparent Huge Page](http://blog.goo.ne.jp/u1low_cheap/e/72a7c5528858debe4e34df83430c480e)
WindowsのKobitoって限定投稿できないの！？


アップロードボタン押したらすぐ公開って。。。。

QiitaのｲﾝﾀﾌｪｰｽとてもGood
KobitoもとてもGood

だからWindowsでも限定投稿しまくりたい。。。

このままだとSimplenoteにいっちゃうよ！
Elastic Beanstalk を使っていると、セキュリティグループ設定から inbound SSH が外れてしまうことがある


# 結論

Elastic Beanstalk の構成設定(インスタンス設定)で、他の用途で使っている inbound SSH all 許可を設定したセキュリティグループを割り当ててはいけない.

![Kobito.9OZINk.png](https://qiita-image-store.s3.amazonaws.com/0/1329/c7123efe-2ca1-dbc1-fdaa-3c11368d059b.png "Kobito.9OZINk.png")


# 問題

EC2 オンプレのアプリケーション環境と、Elastic Beanstalk アプリケーション環境を並行して運用している状態において、EC2 インスタンスに設定してあるセキュリティグループの SSH inbound 設定がいつの間にか外れてしまうという事象にたびたび遭遇していた.

# 調査

## CloudTrail でアクティビティ履歴を追ってみる

アクティビティ履歴には `RevokeSecurityGroupIngress` として、セキュリティグループの設定が変更されたような記録が残っているが、 `ConsoleLogin` 前に実行されており、また、API 経由でのセキュリティグループ設定変更についても心当たりがない.

![Kobito.wSv8i6.png](https://qiita-image-store.s3.amazonaws.com/0/1329/b936d1ac-c230-a850-8e40-c0d5c0acb27a.png "Kobito.wSv8i6.png")

## eb ssh してみる

CloudTrail には Elastic Beanstalk を使っているプロジェクトの担当者名が残っていた ＆ `ConsoleLogin` 前にやりそうなこととすると `eb ssh` か？と思い、やってみたら、気になるメッセージが.

```
$ eb ssh
INFO: Attempting to open port 22.
INFO: SSH port 22 open.
:
INFO: Closed port 22 on ec2 instance security group.
```

## マニュアル読む

しっかりマニュアルに書いてあった.
`eb ssh` で `-o` オプションを指定していないと、 **セッションの終了時にセキュリティグループ設定を自動変更してくれている** らしい. 

http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb3-ssh.html

> 環境のセキュリティグループでポート 22 に関するルールが指定されていない場合、このコマンドは、0.0.0.0/0（すべての IP アドレス）からの受信トラフィックについてポート 22 を自動的に開きます。

(中略)

> -o または --keep_open
> SSH セッションの終了後に、EB CLI はポート 22 を閉じません。

# まとめ

Elastic Beanstalk でインスタンス設定するときは、わざわざ SSH open のセキュリティグループを割り当ててやる必要はない. むしろ、そのセキュリティグループが他の用途でも使われていると `eb ssh` のたびに変更されることになってハマることになる. (というか、マニュアル読みましょう、という話.)

# 参考

* [Elastic Beanstalk開発者ガイド](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/Welcome.html)
楽観的ロックと悲観的ロック

# 楽観的ロック
Railsだと、`lock_version`のやつ。

## ブラウザでの見え方
ブラウザでの見え方（まあ実装次第だけど、だいたいこんな感じで実装する）

AさんがHoge更新画面を開く。
BさんもHoge更新画面をAさんが開いている間に開く。

AさんがHogeを更新。
Bさんが少し遅れてHogeを更新。
Bさんに誰かが更新してしまっていることを伝えるメッセージを出す。

このように、更新のタイミングで、おやおや!とわかるのが
楽観的ロック。

## 参考
http://ruby-rails.hatenadiary.com/entry/20141209/1418123425



# 悲観的ロック
いわゆる`SELECT FOR UPDATE`のやつ。
トランザクションで実現。
誰も`SELECT FOR UPDATE`されたやつが解放されるまで何もできなくなる。

## 参考
http://ruby-rails.hatenadiary.com/entry/20141210/1418207618
http://atamoco.boy.jp/kogoto/work/oracle-rakkan-lock.php


# 楽観的ロックと悲観的ロックの使いどころ
ブラウザが絡むと、まずブラウザにデータを表示、そのあとで編集ボタンを押すでUPDATEとなるため、「データ表示」と「編集ボタン押す」の間で、トランザクションを維持するのが、難しい。よって概ね楽観的ロックが使われる。

## 参考
http://snjx.info/diary/snjx/041
【環境構築】プログラミング未経験者がローカル開発環境を構築するための基礎知識

# はじめに
開発環境を構築するためのチュートリアルやツールのまとめ記事はよくありますが、「なぜ」という視点からまとまっている資料がなかったので、作成してみます。
具体的な作業内容やツールの使い方は記載していません。
随時更新予定です。

# そもそもローカルとは
ローカルとは、インターネットなどのネットワーク越しに存在する環境ではないという意味です。
ざっくり言ってしまえば、個人のPC内部は基本的にローカルな環境です。
あなたが自分のPC内にあるエクセルやパワーポイントなどのファイルを操作するときは、ローカルで作業しているわけです。

# インターネット上にサービスを公開するために
この記事を読んでいる方は、WebサイトやSNSなどのアプリケーション開発に興味があるのだと思います。
インターネット上にそれらのサービスを公開し、ブラウザ経由で誰もがアクセスできるようにするためには、インターネットに接続されたコンピュータ、つまり**サーバー**が必要です。
サーバーはレンタルサーバーやVPS, クラウドなどいくつかの種類がありますが、多くの場合は**Linux**というOSにより動作しています。

しかし、私を含め多くの方はWindowsかMacいずれかのPCを使用しています。
これらはそれぞれWindows, OSXといったOSを搭載しています。
もちろんそういった環境で開発をすることはできますが、結局サービスを公開するにはLinuxで動作するサーバーに、プログラムが記述されたファイル群をアップロードしなければなりません。
そして、WindowsやOSX上で正しく動作したからといって、Linux上でも正しく動作するとは限りません。
そのため、開発する環境（自分のPC）と、公開する環境（サーバー）のOSを揃える必要があります。

# 仮想化ソフトウェア
ここで登場するのが、VirtualBox をはじめとする**仮想化ソフトウェア**です。
これを使用することで、自分のPC内に、コンピュータ（仮想マシン）を作成することができます。
つまり、WindowsやMacを使用している人でも、同一PC内にLinuxで動作するコンピュータを持つことができるのです。
このLinux上で開発をすることで、先ほどの"OSが異なる問題"が解決します。

# ターミナル
仮想化ソフトウェアで作成した仮想マシンに接続し、作業を行うために使用するのがターミナルです。
ターミナルとは、通信回線などを通じて他のコンピュータなどに接続し、もっぱら情報の入力や表示などを行なうソフトウェアの総称です。
具体的なソフトウェアとしてはインターネット上で配布されている **TeraTerm** や、Macに標準でインストールされている **Terminal** などがあります。
ターミナルを使用して仮想マシンにアクセスし、ファイルを作成し、プログラムを記述していくのです。

# Vagrant
仮想化ソフトウェアとターミナルがあれば、仮想マシン上での開発をすることができますが、それを手助けしてくれるのが **Vagrant** というソフトウェアです。
Vagrant をインストールすると、仮想化ソフトウェアでの仮想マシン作成や起動、アクセスといった作業を、非常に簡単なコマンド入力で実現することができます。
Vagrantでは仮想マシンに関する情報を **Vagrantfile** と呼ばれる設定ファイルに記述しており、これを参照して仮想マシンの構築を行います。
すなわち、Vagrantfile を共有することで、複数人で全く同じ環境の仮想マシンを構築することができ、チームでの開発にも役立ちます。

# 環境構築の際によく目にするツールをざっくりと
|名称  |概要  |備考  |
|---|---|---|
|Terminal  |コンピュータをコマンドで操作するためのツール  |Macにはデフォルトでインストールされている  |
|TeraTerm  |同上  |WindowsユーザーがTerminalの代わりに使用するケースが多い  |
|VirtualBox  |仮想マシンの作成や管理を行う  |  |
|Vagrant  |VirtualBoxを通じた仮想マシンの構築を便利にする  |  |
|Cyberduck  |仮想マシン上のファイルへのアクセスを容易にする  |  |
|Transmit4  |同上  |有料  |
※初心者にとって情報過多にならないよう説明を絞っています

# 参考情報
[ドットインストール/ローカル開発環境の構築 [Windows編]](http://dotinstall.com/lessons/basic_localdev_win)
[ドットインストール/ローカル開発環境の構築 [MacOS X編]](http://dotinstall.com/lessons/basic_localdev_mac)
Swift / PHP / JavaScript で UNIXタイムスタンプ を取得したい

PHP 経験者が Swift 初経験で困ったことシリーズ。

## 秒までの取得

### Swift

マイクロ秒数（Double 型）で取得できるので、整数型に変換。

```swift
let time:Int = Int(NSDate().timeIntervalSince1970)
```

### PHP

```php
$time = time();
```

### JavaScript

ミリ秒で取得できるので、整数に変換。

```js
var time = parseInt(Date.now() / 1000, 10);

// わかる人向け
var time = Date.now() / 1000 | 0;
```

ちなみに `Date.now()` はIE8以下では使えないので、考慮するなら。

```js
var time = parseInt(new Date().getTime() / 1000, 10);

// わかる人向け
var time = new Date() / 1000 | 0;
```
Chrome Extensionのevent pageでAPI通信をおこなう


Chrome Extensionを作成する際に、API通信を行いたい時はしばしばあると思います。
API通信などのModel的な部分は、event page（backgroundページのpersistentがfalseのもの）を使うのがいいらしいので、試してみました。
あるページ(path)に紐づく情報をAPIで取得するアプリケーションを想定しています。

## 1. 【失敗例】sendMessageとonMessageを使う

[公式ページ](https://developer.chrome.com/extensions/messaging)でbackgroundページとcontentScript間の通信はMessage Passingを使うよと書いてあるのでその通りにやってみました。

```:contentScript.js
chrome.runtime.sendMessage({path: "/1111"}, function(response) {
  console.log("receive");
  var datas = response.datas;
  console.log(datas);
});
```

```:background.js
chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    var path = request.path;
    $.ajax({
      type: "GET",
      url: "APIのurl",
      dataType: "json",
      data: {path: path},
      success: function(datas){
        console.log("send");
        sendResponse({datas: datas});
      }
    });
  }
);
```

すると、background.js```console.log("send")```は実行されるのに、cotentScript.jsの```console.log("receive")```は実行されません。
どうやら、API通信してる間に、contentScript.jsとbackground.js間の接続が切れてるらしいです。

## （成功例）postMessageとonConnectを使う

接続が切れるなら、接続時間の長いものを使えばいいじゃん！ということで、[公式ページのlong-lived connections](https://developer.chrome.com/extensions/messaging#connect)の章を参考に以下のように書き換えました。


```:contentScript.js
  var port = chrome.runtime.connect({name: "test"});
  port.postMessage({path: path});
  port.onMessage.addListener(function(response) {
    console.log("receive");
    var datas = response.datas;
    console.log(datas);
  });
```

```:background.js
chrome.runtime.onConnect.addListener(function(port){
  port.onMessage.addListener(function(request){
    var path = request.path;
    $.ajax({
      type: "GET",
      url: "APIのurl",
      dataType: "json",
      data: {path: path},
      success: function(datas){
        console.log("send");
        port.postMessage({datas: datas});
      }
    });
  });
});
```

無事、cotentScript.jsの```console.log("receive")```も実行されるようになりました
Vagrantコマンド一覧とかチートシートとか

Vagrantで使うコマンドなどをまとめてみました。（ ver 1.7.3 ）
上の方のものほどよく使うかと思います。

# VMイメージへのssh

| command |  |
| ------- | ---- |
| vagrant ssh | 指定したイメージへsshします |

# 起動などの操作関連

| command | |
| ------- | ---- |
| vagrant up | VMを起動します。初回起動時のみプロビジョニングが走ります。 | 
| vagrant halt | 起動しているVMを停止します。 |
| vagrant list | VMの状態を表示します。 |
| vagrant reload | ポートフォワーディングや共有フォルダの設定などを変更した場合に反映させます。 |
| vagrant destroy | VMのイメージを削除します。 |

# プロビジョニング関連

| command | |
| ------- | ---- |
| vagrant provision | VMを起動したままプロビジョニングのみ再度実行します。 |

# 主な起動遷移

<img src="https://cacoo.com/diagrams/1mpLaHZCXhj0jqwE-122CC.png">

# イメージ操作関連

| command | |
| ------- | ---- |
| vagrant box add | イメージを登録します。 |
| vagrant box list | 登録したイメージ一覧を表示します。 |
| vagrant package | 起動中のVMをイメージに出力します。 |
| vagrant box remove | 登録したイメージを削除します。 |
Python3.5のasync/awaitを使ってスクレイピング


前にこんな記事があったので。
http://postd.cc/fast-scraping-in-python-with-asyncio/
これをPython3.5の新しい構文でやってみる。

あ、もとの記事はhtmlをスクレイピングしてるけど、なんとなく似たような量のレスポンスが返ってくるURLへ同時にアクセスしたかったので、RSSにしてみました。あ全然スクレイピングじゃない。まあ、やってること一緒なので……

```py
import asyncio
import aiohttp
import feedparser
import time

async def print_first_title(url):
    response = await aiohttp.request('GET', url)
    body = await response.text()
    d = feedparser.parse(body)
    print(d.entries[0].title)

rss = [] # なんかRSSのURLの配列。Yahooニュースを10個くらいやりました

if __name__ == '__main__':
    start = time.time()
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait([print_first_title(url) for url in rss]))
    end = time.time()
    print("{0} ms".format((end - start) * 1000))
```

```py
390.4871940612793 ms
```

まあ、確かに読みやすくなった？ でもこれだけだと、デコレータと yield from でやってたやつになんかそれっぽい構文が出来たよっていう感じにしか見えない。今のところぼくもそれ以上のアレはないんだけど。これすごいの？

それよりも、もとの記事と同じく、通信の部分を非同期にするためにaiohttpっていうライブラリを使ってますけど、これすごい便利！ 知らなかった！！！

ねんのためコルーチン使わないやつと速度比較
  
```
import urllib.request
import feedparser
import time

def print_first_title(url):
    response = urllib.request.urlopen(url)
    body = response.read()
    d = feedparser.parse(body)
    print(d.entries[0].title)

rss = []

if __name__ == '__main__':
    start = time.time()
    [print_first_title(url) for url in rss]
    end = time.time()
    print("{0} ms".format((end - start) * 1000))
```

```
1424.4353771209717 ms
```

おそーい！  おしまい！
railsのActiveJobを使う

Railsでバッググラウンドジョブを利用するための仕組みが[Active Job](http://railsguides.jp/active_job_basics.html)です。Active Jobを使えば、HTTPのメインスレッドでは応答を即座に返して、バックグラウンドで重い処理を実行できます。

ということで、早速設定します。Active Jobは基本的なバックグラウンドジョブを実行するための枠組みを提供するだけです。実際のバックグラウンドジョブを実行するバックエンドは設定で指定できます。バックエンドは複数あるようですが、sidekiqが現状のデファクトのようです。sidekiqはrailsとは別のプロセスで動作して、redisを介してジョブのやり取りを行います。簡易的なメッセージキューですね。

他にも有名なバックエンドにResqueというものものあるようですが、こちらもredisを介してジョブの実行を行いますが、redisが1.xでしかテストしてないとプロジェクトのページに書かれていたり、redisに対しては一定時間ごとにポーリングしてジョブの存在チェックをしているようです。ちょっと古臭いです。

## インストール

redisとsidekiqをインストール・セットアップします。redisは、

```shell-session
$ brew install redis
```

で、インストールします。後は、

```shell-session
$ redis-server /usr/local/etc/redis.conf
```

でredisを起動します。

Rails側はGemfileに次の項目を追加して、インストールします

```
gem 'redis'
gem 'connection_pool'
gem 'sidekiq'
gem 'sinatra', require: false
```

## config関係

[前回の記事](http://qiita.com/salesone/items/73e65655bee2c31cbc5e)のように、redisの設定をします。

まずは、config/redis.ymlに次の記述をします

```yaml:config/redis.yml
default: &default
  host: localhost
  port: 6379

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default
  host: production-redis-server
```

次にsidekiqの設定を行うconfig/initializers/sidekiq.rbを次のようにします。


```rb:config/initializers/sidekiq.rb
# Load the redis.yml configuration file
redis_config = YAML.load_file(Rails.root + 'config/redis.yml')[Rails.env]

redis_conn = proc {
  Redis.new host: redis_config['host'], port: redis_config['port']
}
Sidekiq.configure_client do |config|
  config.redis = ConnectionPool.new(size: 5, &redis_conn)
end
Sidekiq.configure_server do |config|
  config.redis = ConnectionPool.new(size: 25, &redis_conn)
end
```
コネクションプールのサイズは決め打ちしていますが、redis.ymlで設定してもいいでしょう。

workerのファイルはapp/workersディレクトリに配置します。このディレクトリを自動で読み込むようにconfig/application.rbを設定します。
それと、バックエンドにsidekiqを使用するように設定します。

```rb:config/application.rb
config.autoload_paths << "#{config.root}/app/workers"
config.active_job.queue_adapter = :sidekiq
```


## 起動

設定が終わったら、railsと一緒にsidekiqを立ち上げます。

```shell-session
$ bundle exec sidekiq
```

オプションでログファイルを指定したり、デーモン化できます。productionで動かす時は-e productionをオプションに追加します。
workerは変更しても自動では再読み込みされないので、プロセスの再起動が必要です。

## workerの設定

ジョブはworkerで指定します。次のコードは標準出力に出力するworkerです。

```rb:app/workers/print_worker.rb
class PrintWoker
  include Sidekiq::Worker

  def perform(s)
    print s
  end
end
```

引数で与えられた文字列を出力するだけです。workerの中ではActive Recordなども普通に扱えます。

ではworkerを実行させるためのrails側のコードです。controllerなどに次のように記述します。

```rb
PrintWorker.perform_async "Hello, World"
```

これだけで非同期にworkerが実行されます。performを直接実行すると、メインスレッドの中でそのまま実行できます。引数には文字列や数字などのプリミティブなものだけしか扱えないので、注意が必要です。


これ以外にも、指定した時間にジョブを実行させることや、数分後に実行など、ジョブを実行させるタイミングも制御できます。

## ActionMailer

ActionMailerもActive Jobに対応しています。deliver_nowを実行していたものをdeliver_laterに変更するとバックグラウンドジョブとして非同期に実行されます。

sidekiqはデフォルトではdefaultのキューしか処理ません。メールキューを処理させるためには、次のコマンドで起動します。

```shell-session
$ bundle exec sidekiq -q default -q mailers
```
Xcode7にアップグレード後でビルドエラー"Command /bin/sh failed with exit code 23"

```
sent 29 bytes received 20 bytes 98.00 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files could not be transferred (code 23) at /SourceCache/rsync/rsync-45/rsync/main.c(992) [sender=2.6.9]
Command /bin/sh failed with exit code 23
```

Xcode7にアップグレード後、このようなエラーでビルドが出来ない現象について、いくつか調べたので、同じ症状の人はお試しください。

#Buildの削除
・Altを押しながらProduct→Clean Build Folderを選択
参照：http://stackoverflow.com/questions/32586144/upgraded-to-swift-2-and-cocoapods-38-2-now-getting-build-error-command-bin-s/32650097#32650097

or

・Clean Build Folderが出来ない場合、直接Buildフォルダを削除

これで解決出来ました。

#他に試したこと
Build削除前にいくつか行ったことも列挙しておきます。Build削除でもダメな人は試してください。
・Podsフォルダの削除、再インストール
・Cocoapodのアップグレード（sudo gem update cocoapods --pre）
Swift で日本語の曜日名を取得したい

日本語の曜日名を取得する方法を紹介します。

## 曜日の取得

Swift の場合、曜日は日曜始まりの 1 から 7 の数値で表現されます。

```swift
let date: NSDate = NSDate()
let cal: NSCalendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
let comp: NSDateComponents = cal.components(
    [NSCalendarUnit.Weekday],
    fromDate: date
)
let weekday: Int = comp.weekday
```

## 曜日名の取得

曜日名のラベルは、`NSDateFormatter` クラスの `shortWeekdaySymbols` もしくは `weekdaySymbols` プロパティから配列として取得することができます。
その配列の添字の 0 - 6 が日曜から始まる曜日に該当します。

そして、日本語で曜日名を取得する場合は、`NSDateFormatter` のローケルを設定するだけです。

```swift
let weekdaySymbolIndex: Int = weekday - 1
let formatter: NSDateFormatter = NSDateFormatter()

formatter.locale = NSLocale(localeIdentifier: "ja")

print(formatter.shortWeekdaySymbols[weekdaySymbolIndex]) // -> 日

print(formatter.weekdaySymbols[weekdaySymbolIndex]) // -> 日曜日

```
struct にアノテーションつけてたら go vet . すべき

TL;DR 
struct にアノテーションつけてたら go vet . すべき
go build, go install などは何もチェックしてくれない


下記のように間違ったフォーマットのアノテーションでも go build はなにも言ってくれないが

```go
type WhiteList struct {
	Id      int        `db:"pk" column:"id"`
	UserId  int        `db:"unique" column:"user_id"`
	Count   int        `default:0 column:"cnt"`
	EndFlag bool       `default:0 column:"end"`
	AddedAt *time.Time `column:"added_at"`
}
```

go vet 様なら

```shell-session
(master)$go vet .
database.go:21: struct field tag `default:0` not compatible with reflect.StructTag.Get: bad syntax for struct tag value
database.go:22: struct field tag `default:0` not compatible with reflect.StructTag.Get: bad syntax for struct tag value
```

正しくはこうだった

```go
type WhiteList struct {
	Id      int        `db:"pk" column:"id"`
	UserId  int        `db:"unique" column:"user_id"`
	Count   int        `default:"0" column:"cnt"`
	EndFlag bool       `default:"0" column:"end"`
	AddedAt *time.Time `column:"added_at"`
}
```

go の struct アノテーションはフォーマットが間違ってると `column:"cnt"` とかの合ってる部分もまるまる読み込んでくれないうえに実行時エラーも（当然）なく動くので、この場合 column は Count, EndFlag でつくられちゃってた。
c言語のインクリメント問題


１分あれば読み終わります


プログラミング言語の繰り返しでおなじみのインクリメントですが、
cのインクリメントには

i++

と

++i

があります

上からプレインクリメント、ポストインクリメントと呼びます


両方とも立派なインクリメントなのですが、

プレインクリメントは式が評価される前に

ポストインクリメントは式が評価された後に

インクリメントされます。

なので

```c
int main(void)
{
    int i[3] = { 0, 1, 2 }, j = 1;
    printf("%i\n", i[++j]);
    return 0;
}
#=> 2

int main(void)
{
    int i[3] = { 0, 1, 2 }, j = 1;
    printf("%i\n", i[j++]);
    return 0;
}
#=> 1
```

こうなるんですね。
carrierwave利用時にremote_image_urlがコールバック中で動作しないのを解消したい男たち


これを

```
def User < ActiveRecord::Base
  mount_uploader :image, ImageUploader

  before_save do
    self.remote_image_url = 'http://example.com/awesome.jpg'
  end
end
```

こうすると動作する。

```
def User < ActiveRecord::Base
  before_save do
    self.remote_image_url = 'http://example.com/awesome.jpg'
  end

  mount_uploader :image, ImageUploader
end
```
iBeacon Receiver in Swift 2.0


## iBeacon Receiver in Swift 2.0
iBeaconを利用したアプリを開発する際に色々と調査が必要で面倒だったので，最小限のiBeacon受信用の実装(ViewController.swift)を公開します．

## ViewController.swift
```swift:ViewController.swift
import UIKit
import CoreLocation

class FirstViewController: UIViewController, UIWebViewDelegate, CLLocationManagerDelegate {
    
    let manager: CLLocationManager = CLLocationManager()
    // replace uuid and identifier
    let region: CLBeaconRegion = CLBeaconRegion(proximityUUID: NSUUID(UUIDString: "ef5b1eff-7a78-4e1c-a63d-60b54c077561")!, identifier: "com.example")
    
    override func viewDidLoad() {
        super.viewDidLoad()
        manager.delegate = self
        // AlwaysAuthorization is required to receive iBeacon
        let status = CLLocationManager.authorizationStatus()
        if status != CLAuthorizationStatus.AuthorizedAlways {
        	manager.requestAlwaysAuthorization()
        }
    }
    
    // MARK: - CLLocationManagerDelegate
    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    	// checking authorization status for using user location to start or stop monitoring for region
        switch status {
        case CLAuthorizationStatus.AuthorizedAlways:
            print("didChangeAuthorizationStatus: startMonitoringForRegion")
            manager.startMonitoringForRegion(self.region)
        default:
            print("didChangeAuthorizationStatus: stopMonitoringForRegion")
            manager.stopMonitoringForRegion(self.region)
        }
    }
    
    func locationManager(manager: CLLocationManager, didDetermineState state: CLRegionState, forRegion region: CLRegion) {
    	// checking if you are inside or outside of designated regions to start or stop ranging beacons in the region 
        switch state {
        case CLRegionState.Inside:
            print("didDetermineState: startRangingBeaconsInRegion")
            manager.startRangingBeaconsInRegion(self.region)
        case CLRegionState.Outside, CLRegionState.Unknown:
            print("didDetermineState: stopRangingBeaconsInRegion")
            manager.stopRangingBeaconsInRegion(self.region)
        }
        
    }
    
    func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {
        // implement whatever you wanna do with recwived iBeacons like
        print(beacons)
    }
}
```

## 使い方
Single View Application でプロジェクトを立ち上げるとすぐにある，ViewController.swiftにこのコードをコピペすれば動くはずです．

## 後で調査
### didDetermineStateでどのCLBeaconRegionを用いればいいのか簡単に判別する方法
現在のDelegateから渡される引数のregionからは判別できないような気がする．

##P.S. #1
### 使い方
位置情報を利用するに当たり，利用目的をInfo.plistに登録する必要があります．
Key: `NSLocationAlwaysUsageDescription`
Type: `String`
Value: `Your usage description is here ...`

### Bug
アプリを起動した際に以下の条件が満たされていても，iPadはiBeacon受信を自動で開始しない．
 - 位置情報の利用が許可されている
 - Bluetoothがアクティブである
sedで特定の文字列を抽出


<pre>
[root@localhost ~]# /usr/lib64/nagios/plugins/check_icmp -H 192.168.0.1 > /tmp/a.txt
[root@localhost ~]# 
[root@localhost ~]# cat /tmp/a.txt
OK - 192.168.0.1: rta 0.410ms, lost 0%|rta=0.410ms;200.000;500.000;0; pl=0%;40;80;; rtmax=0.723ms;;;; rtmin=0.180ms;;;;
[root@localhost ~]# 
[root@localhost ~]# cat /tmp/a.txt | sed -r 's/.*rta=([0-9\.]+).*;/\1/'
0.410
[root@localhost ~]# cat /tmp/a.txt | sed -r 's/.*rtmax=([0-9\.]+).*;/\1/'
0.723
[root@localhost ~]# cat /tmp/a.txt | sed -r 's/.*rtmin=([0-9\.]+).*;/\1/'
0.180
[root@localhost ~]#
</pre>

この例では、Nagiosプラグインのcheck_icmpの実行結果から、
rta、rtmax、rtminの取得値を抽出している。
gemのインストールで`--no-document`を付けると77倍早い

* 普通にインストール → 309秒
* 付けてインストール → 4秒

*※効果には個人差があります。*

初回は他の関連gemもまとめてインストールされるのでなお時間がかかるはず。

```console
$ ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
$ gem -v
2.4.5.1
$ gem uninstall rails
Successfully uninstalled rails-4.2.4
$ time gem install rails 
Fetching: rails-4.2.4.gem (100%)
Successfully installed rails-4.2.4
Parsing documentation for rails-4.2.4
Installing ri documentation for rails-4.2.4
Done installing documentation for rails after 305 seconds
1 gem installed

real    5m8.654s
user    5m5.728s
sys     0m0.231s
$ time gem install rails --no-document
Fetching: rails-4.2.4.gem (100%)
Successfully installed rails-4.2.4
1 gem installed

real    0m3.791s
user    0m0.620s
sys     0m0.118s
```

かつての `--no-ri --no-rdoc` はこれに変わったんだとか。（知らなかった）

* [Ruby - gemrcの--no-riと--no-rdoc、deprecatedなoptionなのでみなおしたほうがいいかもですよ - Qiita](http://qiita.com/kei_q/items/d13235157fcfc435489d)
    * gem 1.8 (ruby 1.9)は、古い書き方じゃないといけないらしい
* 毎回書くのが面倒なら `.gemrc` で設定しとく（前述の記事参照）
[iOS] Swift DEBUG Flag

In the build settings, Add `-DDEBUG` to the `Other Swift Flags` in debug.

![Screen Shot 2015-09-24 at 10.01.23.png](https://qiita-image-store.s3.amazonaws.com/0/51455/160f6b28-beac-1d2f-f7e9-21a2a3beee78.png)

Then check in code like this:

```swift
#if DEBUG
    //Do something...
#endif
```
Promise Pegasus RAID 制御のコマンドライン

# 問題
- Promise Pegasus R6 の物理ディスクがオフラインになった。セクタ不良など、致命的ではない異常のためディスクがオフラインになることがある。停電などの異常終了後にディスク異常と判定されオフラインになる場合も。

# 対応
- GUIの `Promise Utility` では、こうした場合に打つ手がない（と思われる）。
- コマンドラインツール `promiseutil` を使えば、物理ディスクを強制的にオンラインにできる。

# 例
```
$ promiseutil
-------------------------------------------------------------
Promise Utility
Version: 3.18.0000.36 Build Date: Apr 21, 2014
-------------------------------------------------------------
 
List available RAID HBAs and Subsystems
===============================================================================
Type  #    Model         Alias                         WWN                 Seq
===============================================================================
hba   1  * Pegasus R6                                  2000-0001-xxxx-xxxx  1 
hba   2    Pegasus R6                                  2000-0001-xxxx-xxxx  1 
 
Totally 2 HBA(s) and 0 Subsystem(s)
 
-------------------------------------------------------------
The row with '*' sign refers the current working HBA/Subsystem path
To change the current HBA/Subsystem path, you may use the following command:
  
  spath -a chgpath -t hba|subsys -p <path #>.
 
Type help or ? to display all the available commands
-------------------------------------------------------------
 
cliib> spath -a chgpath -t hba -p 2
 
cliib> phydrv -a online -p 5
 
cliib> 
```

- `spath` ：複数のシステムが接続されている場合に、操作対象のシステムを選択する。
- `phydrv` ：物理ドライブの操作コマンド。オプション `-a online` は、`-p` で指定したパスにあるディスクを強制的にオンラインにする。オンラインにすると `Promise Utility` では、Status 欄に〔Forced Online〕と表示される。
技術英語 > a + 人 > ...という名の人 > a Mr. Coleman

引用: 冠詞マスター教本 by 石井隆之さん

> 「...という名の人」
> I met a Mr. Coleman at the party. (パーティでコールマンさんという人に会った)

<hr>

関連して思い出したのは1

> There's no person named Tanaka. (田中さんという人はおりません).

<hr>
関連して思い出したのは2

named after
http://qiita.com/7of9/items/2dc75f293593fd1bd5ec

<hr>
Elastic Beanstalk で Ruby のバージョンを上げる

# Ruby のバージョンを上げたかった

![image](https://qiita-image-store.s3.amazonaws.com/0/7823/475d2725-16f7-342c-e835-872c7f14bce8.png)

元々 Ruby 2.1 を指定し、作成した環境だったが、2.2 系にバージョンを上げたくなった。

マニュアルを読んだり StackOverflow で探したりしたが「コマンド一つでバージョンアップ！」とはいかないようだ。

選択肢はこのくらい。どれが一番良いのだろう。

- 1. カスタム AMI を作成し、切り替える（できれば避けたい）
- 2. 設定ファイル `.config` の中でバージョンを切り替える
- 3. 新たに環境を作成し、現環境とスワップする


# サポートデスクに聞いてみた

今回のケースでは「**3. 新たに環境を作成し、現環境とスワップする**」のが良いようだ。

やはり手軽に Ruby のバージョンを上げる方法は用意されていないみたい。残念。

「1. カスタム AMI を作成し、切り替える」は「別環境を構築して頂くのと比較してメリットがなく、デメリットが多いためお薦めできかねます。」とのこと。


# おまけ

## プラットフォームのバージョン≠Rubyのバージョン

![image](https://qiita-image-store.s3.amazonaws.com/0/7823/15da4be3-2f21-2994-968b-35cd0a5de732.png)

ダッシュボード上に「新しいバージョンが利用可能」と表示されている場合。
「変更」ボタンより、最新の AMI を利用することができるが Ruby のバージョン自体は変わらない。

![image](https://qiita-image-store.s3.amazonaws.com/0/7823/6640a84f-02ce-3678-02fe-e7c4e95883c5.png)

「アクション」→「最新のプラットフォームを使用したクローンの作成」メニューも同様。

セキュリティパッチを当てたいだけなのに、勝手に Ruby のバージョン上がっても困るしね。
分かるよ。選べても良いと思うけどね。色々難しいんだろうね。きっと。

この自動アップデート機能の恩恵を受けたいがために、カスタム AMI は使いたくなかった。


## 提供されている AMI には様々な Ruby のバージョンが同梱されている

`/opt/rubies/` 以下に。
今回は試していないけど symlink 張り替えるだけでイケるのかもしれない。

```bash
$ ls -al /opt/rubies/
total 24
drwxr-xr-x 6 root root 4096 Aug 31 09:13 .
drwxr-xr-x 6 root root 4096 Aug 31 09:15 ..
drwxr-xr-x 6 root root 4096 Nov 21  2014 ruby-1.9.3-p551
drwxr-xr-x 6 root root 4096 Nov 21  2014 ruby-2.0.0-p598
drwxr-xr-x 6 root root 4096 Nov 21  2014 ruby-2.1.5
drwxr-xr-x 6 root root 4096 Apr 16 03:07 ruby-2.2.2
lrwxrwxrwx 1 root root   22 Aug 31 09:13 ruby-current -> /opt/rubies/ruby-2.1.5
```
Ubuntuのターミナル透過

自分用メモ
1.端末の画面上で右クリック
2.プロファイルを選択し、プロファイルの設定をクリック
3.背景タグから背景を透明にするをチェック
4.お好みの透過度を設定し、閉じる

参考
http://www.miuxmiu.com/archives/2011/03/30/linux_ubuntu_debian_terminal_background_semitransparent_setting_method.html
AlertViewControllerをどこからでも呼べるようにラップしてみる

エラー表示やユーザーに確認を求める時など、アプリ内でAlertを表示する場面は多いかと思います。

つど、ViewControllerなどにAlertを表示するコードを何度も書くのも嫌なので、
AlertViewControllerを拡張して、基本的なAlertであればどこからでも簡単に表示できるようにしてみました。

ボタンを押した際のコールバックも取れるようになっています。

ついでに最前面のViewControllerを取得するためにUIViewControllerも拡張しています。

以下、コード。

UIAlertViewControllerの拡張

```
import UIKit

extension UIAlertController {
    
    class func oneButton(title: String, message: String, btnOk: String = "OK", handler: ((UIAlertAction!) -> Void)?) {
        let alert = self.init(title: title, message: message, preferredStyle: .Alert)
        let okAction = UIAlertAction(title: btnOk, style: .Default, handler: handler)
        
        alert.addAction(okAction)
        
        let viewController = UIViewController.getFrontViewController()
        viewController.presentViewController(alert, animated: true, completion: nil)
    }
    
    class func twoButton(title: String, message: String, btnOk: String = "OK", btnNo: String = "NO", handlerOk: ((UIAlertAction!) -> Void)?, handlerNo: ((UIAlertAction!) -> Void)?) {
        let alert = self.init(title: title, message: message, preferredStyle: .Alert)
        let okAction = UIAlertAction(title: btnOk, style: .Default, handler: handlerOk)
        let noAction = UIAlertAction(title: btnNo, style: .Cancel, handler: handlerNo)
        
        alert.addAction(okAction)
        alert.addAction(noAction)
        
        let viewController = UIViewController.getFrontViewController()
        viewController.presentViewController(alert, animated: true, completion: nil)
    }
    
}
```

UIViewControllerの拡張

```

import UIKit

extension UIViewController {
    
    //最前面のViewController取得
    class func getFrontViewController() -> UIViewController {
        var viewController = UIApplication.sharedApplication().keyWindow?.rootViewController
        while let vc = viewController?.presentedViewController {
            if !(vc is UINavigationController) {
                viewController = vc
            }
        }
        
        return viewController!
    }
}
```

使用例:

```
        //1ボタン
        UIAlertController.oneButton("title", message: "message", btnOk: "OK", handler: { (alert) in
            print("onBtnOk")
        })
　　　　　　　
　　　　　//2ボタン
        UIAlertController.twoButton("title", message: "message", btnOk: "Ok", btnNo: "No", handlerOk: { (alert) in
            print("onBtnOk")
        }, handlerNo: { (alert) in
            print("onBtnNo")
        })
```
FlyでES6/7時代のJavaScriptビルドシステムとやらを体験してみた

# Flyとは

https://github.com/flyjs/fly
Node.js製のビルドシステムです。
gulp, Gruntなどと同じような事ができます。基本的なビルドシステムとしての機能を提供し、サードパーティのライブラリをもりもり入れていくことでできることの幅を増やしていく。というところも同じような感じです。
ただ大きくgulp, GruntとことなっていることとしてはFlyの場合、**ES6のGenerator**を使って書いていくところです。
また、ES7で導入されるとされている**『async/await』**を使った記法も使えるようです。

# 早速適当な構成で試してみた

今回やってみたのは以下の様なこと

- src/にES6でコードを書いている
- src/に書いているコードをES5にコンパイルしてlib/に置く
- lib/に置かれたコードをbrowserifyでビルドしてbuild/に置きたい
- タスクが完了時に通知をしたい
- src/に置かれたファイルの変更を検知して自動的に↑の手順を実行させたい

まぁよくありそうなユースケースです。

## 必要なライブラリのインストール

```
npm install --save-dev fly
npm install --save-dev fly-notify
npm install --save-dev fly-browserify
npm install --save-dev fly-babel
```

タスクは『flyfile.js』という名前で書く

```js:flyfile.js

const paths = {
  // ES6で書かれたソースコードはここに置かれる
  src: ['src/**/*.js'],

  // ES6で書かれたソースコードはここにES5で出力される
  lib: ['lib/**/*.js'],

  // テストコードがはここに書かれている
  test: ['test/**/*.js'],

  dist: {
    lib:   'lib',
    build: 'build',
  }
}

/**
 * デフォルト(タスクを指定しなかった場合に実行されるタスク)
 * ES6で書かれたソースを監視して何か変更があった場合に自動的にビルドを行う
 */
export default function* () {
  yield this.watch(paths.src, ['build'])
}

/**
 * 本システムでのbuildと呼ばれる工程をすべて行う
 */
export function* build () {
  yield this.start(['to5', 'browserify'])
}

/**
 * ES6で書かれたコードをES5にコンパイルする
 */
export function* to5 () {
  yield this.clear(paths.dist.lib)
  yield this
    .source(paths.src)
    .babel({
      stage: 0, sourceMaps: true
    })
    .notify({
      title: 'Fly build',
      message: "done to5"
    })
    .target(paths.dist.lib)
}

/**
 * ES5のコードに対してBrowserifyでビルドする
 */
export function* browserify () {
  yield this.clear(paths.dist.build)
  yield this
    .source(paths.lib)
    .browse()
    .concat('app.js')
    .notify({
      title: 'Fly build',
      message: "done build"
    })
    .target(paths.dist.build)
}

```

## 実行してみる

```
# 適当にタスクを指定して実行
./node_modules/.bin/fly to5

# デフォルトのタスクを実行
./node_modules/.bin/fly

# 定義されているタスク一覧
./node_modules/.bin/fly --list

# タスク定義ファイルを指定して実行
./node_modules/.bin/fly --file filename.js
```

# おまけ

## 参考のサンプル実装がみたい
Flyのリポジトリに色々のっているので参考になる
https://github.com/flyjs/fly/tree/master/examples

## サードパーティのライブラリを探す
npmで検索検索
https://www.npmjs.com/browse/keyword/fly
UnityでiOS9ATS対策（HTTP通信が使えない件の応急処置）

# iOS9ではセキュリティ強化のためHTTP禁止
これまで作ったアプリがiOS9で正常に動かない。どうやら通信周りがうまくいかないようだ。
調べるとiOS9ではHTTPはセキュリティの都合でplistで明示的に許可を取らないと使えないらしい。

# 標準的なiOSアプリ開発での対策
基本的にHTTPS通信を使えとのこと。
しかしplistでブラックリスト、ホワイトリストを設定し許可したドメインのみでHTTP通信もできるようだ。
これに関しては今回は割愛。

今回紹介する応急処置は、推奨はされないのだろうけど

```xml
<key>NSAppTransportSecurity</key>
<dict>
	<key>NSAllowsArbitraryLoads</key>
	<true/>
</dict>
```

をplistに記述しこれまで通り全面的にHTTP通信を許可する方法だ。

# Unityでは何が不都合か
UnityでビルドされたiOSプロジェクトのplistを手動で書き換えるのはスマートではない。
ビルド毎にplistを編集するのはしんどいし、リリースビルド時などに間違えがあれば最悪だ。
（その上、Unityクラウドビルドに対応できない。）

かといってPostProcessBuildPlayerスクリプトを書くのは面倒だ。

# 良質なアセット見つけた

BuildBuddy
[https://www.assetstore.unity3d.com/jp/#!/content/20041]
というアセットを見つけた。
これがあればplist（Androidアプリ開発でもmanifestファイル）を編集できる。
これはiOSやAndroidをビルドすると自動的に変更が適応される。

iOS9でHTTPを全面的に許可するにはこのように設定すれば良い。

![Title.unity - Cazasdeel - iPhone, iPod Touch and iPad 2015-09-24 03-36-38.jpg](https://qiita-image-store.s3.amazonaws.com/0/14940/3016e9fc-1257-61c9-5a7b-c089421f7b06.jpeg)

あとは普通にiOSビルドすればplistに反映される。
SwipeRefreshLayoutをListFragmentで使うとゾンビ化することがある

# 事例

1. `SwipeRefreshLayout`を使おうと思った時に、既存のクラス(`ListFragment`を継承)をあまり変更したくなかったので、`SwipeRefreshListFragment`という新しいクラスを作成し、それを継承する形に

2. `SwipeRefreshListFragment`のコードは[ここ](https://developer.android.com/samples/SwipeRefreshListFragment/src/com.example.android.swiperefreshlistfragment/SwipeRefreshListFragment.html)のコードをそのまま使用

3. Refreshしている最中に別のFragmentへ遷移しようとすると遷移前の画面が残ってしまう（裏ではきちんと遷移先のFragmentの処理が走っている）

4. HierarchyViewerを見ても残っているレイアウトが見当たらない（まるでゾンビ）

# 試したこと

- `SwipeRefreshListFragment`の`onPause`の中で`setRefresh(false)`
 - 効果なし

- `SwipeRefreshListFragment`のコード内にあるような、`SwipeRefreshLayout`をコード上から生成するのをやめ、XMLから生成するように
 - 効果なし


# 解決策

`SwipeRefreshLayout`の外側に`FrameLayout`を設置する

- `SwipeRefreshListFragment.ListFragmentSwipeRefreshLayout`を別のjavaファイルに分割する
 - 以下のようなクラスを作る

```ListFragmentSwipeRefreshLayout.java
public class ListFragmentSwipeRefreshLayout extends SwipeRefreshLayout {

    public ListFragmentSwipeRefreshLayout(Context context) {
        super(context);
    }

    public ListFragmentSwipeRefreshLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean canChildScrollUp() {
        ListView listView = (ListView) findViewById(android.R.id.list);
        return listView.getVisibility() == View.VISIBLE && ViewCompat.canScrollVertically(listView, -1);
    }
}
```

- `res/layout/fragment_swipe_refresh.xml`を作る

```fragment_swipe_refresh.xml
<?xml version="1.0" ?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
        >

    <com.example.ListFragmentSwipeRefreshLayout
            android:id="@+id/swipe_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            >

        <ListView
                android:id="@+id/android:list"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                />

    </com.example.ListFragmentSwipeRefreshLayout>
</FrameLayout>
```

- `SwipeRefreshListFragment`の`onCreateView`を以下のように変更する

```SwipeRefreshListFragment.java
 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View listFragmentView = inflater.inflate(R.layout.fragmetn_swipe_refresh, container, false);
        mSwipeRefreshLayout = (SwipeRefreshLayout) listFragmentView.findViewById(R.id.swipe_list);
        return listFragmentView;
    }
```

# 参考
https://code.google.com/p/android/issues/detail?id=78062
http://stackoverflow.com/questions/27057449/when-switch-fragment-with-swiperefreshlayout-during-refreshing-fragment-freezes/27073879#27073879
djangoのloggerの(最低限の)使い方

- 正確にはpythonのlogger
- djangoではsettings.pyに設定書いてつかう
- 他にもいろいろ凝ったことが出来るがまずは最低限だけ

settings.pyに下記のような設定を書く

```python
LOGGING = {
    'version': 1,   # これを設定しないと怒られる
    'formatters': { # 出力フォーマットを文字列形式で指定する
        'all': {    # 出力フォーマットに`all`という名前をつける
            'format': '\t'.join([
                "[%(levelname)s]",
                "asctime:%(asctime)s",
                "module:%(module)s",
                "message:%(message)s",
                "process:%(process)d",
                "thread:%(thread)d",
            ])
        },
    },
    'handlers': {  # ログをどこに出すかの設定
        'file': {  # どこに出すかの設定に名前をつける `file`という名前をつけている
            'level': 'DEBUG',  # DEBUG以上のログを取り扱うという意味
            'class': 'logging.FileHandler',  # ログを出力するためのクラスを指定
            'filename': os.path.join(BASE_DIR, 'django.log'),  # どこに出すか
            'formatter': 'all',  # どの出力フォーマットで出すかを名前で指定
        },
        'console': { # どこに出すかの設定をもう一つ、こちらの設定には`console`という名前
            'level': 'DEBUG',
            # こちらは標準出力に出してくれるクラスを指定
            'class': 'logging.StreamHandler', 
            'formatter': 'all'
        },
    },
    'loggers': {  # どんなloggerがあるかを設定する
        'command': {  # commandという名前のloggerを定義
            'handlers': ['file', 'console'],  # 先述のfile, consoleの設定で出力
            'level': 'DEBUG',
        },
    },
}
```

こんな関数を作って呼ぶ

```python
def info(msg):
    logger = logging.getLogger('command')
    logger.info(msg)

info("hello!")
```

django.logと標準出力に下記の形式で出力される

```
[INFO]	asctime:2015-09-23 16:27:11,291	module:my_module_name	message:hello!	process:97649	thread:140735161512704
```

公式のドキュメントには設定例がいくつかある: https://docs.djangoproject.com/en/1.8/topics/logging/#examples
アプリ用のアイコン


既存のアイコンはこの形を利用していたので再現しました。
レイヤーを重ねて独自のアイコンに工夫すれば既存のアイコンと似ているので違和感を覚えないはず。

behavir の設定で「ユーザーのリクエストにより開始」
を選択する事でタブレットに表示できました。

![pepper_app_icon.png](https://qiita-image-store.s3.amazonaws.com/0/58501/26a68d12-1ca1-11da-1ec1-fa3535cb83a0.png "pepper_app_icon.png")
pepperのボックス内で言葉のチューニングを行う場合

Macにて「バックスラッシュ」\で苦戦したのでメモ
optionキーを押しながら、¥キーを押す

■声の高さ
\vct=135\

■話すスピード
\rspd=110\

■一定時間待つ
\pau=2000\
ディープラーニングライブラリBVLC/Caffeを管理者権限rootなしでインストールした時のメモ集

[Caffe](http://caffe.berkeleyvision.org)は深層学習（特にビジョン系）で非常にパワフルなツールでありますが、たくさんの依存ライブラリがあり、インストールの段階で多くの初心者達が出鼻をくじかれると聞いております。特に、自分がroot権限を持っていないクラスタマシン等でのインストールにおいては、１ヶ月やってもできなかった、なんて言う人がいるという伝説も聞いたことがあります。

ここでは、あくまで一例として僕自身が計算クラスタ環境でインストールしたときのメモを、少しでも皆様の参考になればと貼り付けておきます。

* [環境１](https://github.com/tnarihi/wiki/wiki/Caffe-on-ICSI-clusters)
* [環境２](https://github.com/tnarihi/wiki/wiki/Caffe-on-TTIC-clusters)

システムに元からインストールされているライブラリは環境によってまちまちだと思うので、上を参考にご自身で足りないライブラリをインストールしてみてください。
Elixirのプロセスをマルチコア環境で試した

最近Elixirをちょこちょこ使ってみている。
オンラインゲームを作るプラットホームとして優れているのではないかと考えたからだ(ベースとなるerlangが電話交換機を制御するための言語なので得意なのは当たり前だが)。

また、CPU単体での性能向上に陰りが見えてきて、メニーコア環境でのプログラミングが増えて来ている。
elixir/erlangが持っているプロセスを使って、簡単にメニーコアを使えて性能が向上するなら、こちらを使って行く方が、メニーコア環境でのコア数増加の恩恵を得られるのではないかと思っている。

CPUが大量にある環境でプロセスを使うことでどの程度コアを並列に使うのか調べてみた。

## 調査環境

EC2のc4.8xlargeを利用して、多数のCPU環境下でelxirがどの程度CPUを使用するか調べてみた。
c4.8xlargeはCPUを36個持っている(手軽に、数ドルで、36cpu環境を試せるEC2は素晴らしいな)。

##使ったソースコード

https://gist.github.com/shibacow/c96f330501a721f6cd53

使用したソースはこちら

簡単なKeyValueストアを作り、プロセスを作って、putをgetを行なう。
putしてその値をgetした後には何もせずに、終了する。

実行は

```shell
$iex -S mix
Erlang/OTP 18 [erts-7.1] [source] [64-bit] [smp:36:36] [async-threads:10] [kernel-poll:false]

Interactive Elixir (1.0.5) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> PTest.test(1000)
```

で行なう。

## 実行結果

上記のコマンドを実行しつつ、topで数値を調べた。1と押すとCPU個別でどの程度使われているか出てくる。３６個全部使った訳ではないが、適当にバラけて実行されているようだ。

![実行結果](https://i.gyazo.com/bcfaef509f08b16a181b359c3b9239e4.png)


## まとめ

elixirを使えば、簡単にマルチコア環境で、並列なプログラムが書けるのではないか。

## はまった所

callerの指定がわからなかった、最初

```ex

      {:ok,tsk}=Task.start_link(fn -> loop() end)
      send pid,{:get,key,tsk}

```

としなければならないところを、

```ex
      {:ok,tsk}=Task.start_link(fn -> loop() end)
      send pid,{:get,key,self()}
```
と書いていて、全くreceiveされずに、困った。

start_linkされたりspawnされたりしたら、別のself()とは別のpidが生成されるのが、ちょっとわかりづらいなと思った。
PDO DSN URI呼び出し


相対パスにファイル作成
例えば./hoge/local.dsn

```local.dsn
mysql:dbname=test;host=localhost;charset=utf8;
```

PDOインスタンス生成

```php
$dsn = 'uri:hoge/local.dsn';
$pdo = new PDO($dsn);
```
iOS Simulatorあらため「Simulator」のXcode7の場所


Xcodeを7にアップデートしたらiOS Simulatorが「Simulator」に改名されていた。
またも1単語のApple製アプリが増えた。

パスもまた変わった模様。

	/Applications/Xcode.app/Contents/Developer/Applications/Simulator.app

にあった。

Alfredで起動する場合はSearch Scopeに上記パスを追加すれば起動できる。
検索ワードはiOSを付けてもヒットしないので「Simulator」に慣れる。



Alfred Workflow「Launch iOS Simulator」で起動する場合は、Workflowのスクリプトのパスも過去に変更。

```bash:bash
open /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app/ Simulator.app/
```
Slackのモバイルアプリの通知音の設定方法


Slackモバイルアプリのデフォルトの通知音はΩ＼ζ°)ﾁｰﾝと鳴る。
アプリ側（iPhone側）の設定には通知音の項目がないので、変更はできないと思っていたが、変更はブラウザ側での設定だった。
これでモバイルアプリも通知音をKnock Brush(スッポポポ)音にできて、Slackとわかりやすくなった＼(^o^)／

Preference > Notifications「set notification preferences for email & mobile」のリンクをクリック。ブラウザが立ち上がる。
![150729-0002.png](https://qiita-image-store.s3.amazonaws.com/0/16548/325a4c09-8c51-7f8e-b353-90dcc3520214.png "150729-0002.png")



Mobile Push Notificationsから選ぶ。
![150729-0001.png](https://qiita-image-store.s3.amazonaws.com/0/16548/749c409b-12a9-d569-3f72-063765e02e40.png "150729-0001.png")




📲 < ｽｯﾎﾟﾎﾟﾎﾟｯ
PDO での　select count(*)


PDOStatmant::fetchColumnを使う

```php
$sql = 'select count(*) from T_test where name = :name';
$stmt = $pdo -> prepare($sql);
$stmt -> execute(array('name' => 'もえの'));

$count = $stmt -> fetchColumn();
//fetchColumn(0)の0を省略
echo $count;
```
fetchAll()の[0][0]と同じ。
gnu-sedのインストール


osx標準のsedはPOSIX sedなので-iオプションが使えないので不便極まります。
GNU sedがhomebrewに入っているので以下のコマンドでインストール。


```
$ brew install gnu-sed
```

これで、ディレクトリ以下の`txt`ファイルの`hoge`を`hage`に書き換えるのに以下のコマンドだけで済みます。

```bash:
$ gsed -i "s/hoge/hage/g" *.txt
```

-iオプションがないPOSIX sedならおそらく以下のようになります。

```bash:
$ for i in *.txt; do cat $i | sed "s/hoge/hage/g" > $i.new; mv $i.new $i; done
```
**最悪！** :scream: 
素直にgnu-sedインストールすべきですね。

個人的はosx標準のsedをzshのaliasで上書きしています。

```.zshrc
alias sed='gsed'
```

sed便利 :triumph: 


## 追記
コメントにてgnu-sedを標準のsedの代わりにデフォルトで使う設定にするインストール方法を教えていただきました :tada: 
`--with-default-names`オプションを付けます :+1: :+1: :+1: 

```
$ brew install gnu-sed --with-default-names
```

:triumph: homebrew便利 :triumph: 

## 追記の追記
いつもは :kobito: kobito :kobito: で書いてるんだけどqiitaで追記 :memo: 書いてる時に絵文字パレットの存在を知ってしまって絵文字欲が抑えきれなくなりました :rocket: