OmniAICreator/Qiita-1.07M huggingface dataset:
company-ironyを使ってemacsでC/C++の補完

[company-modeの紹介記事はこちら](http://qiita.com/sune2/items/b73037f9e85962f5afb7)

# 概要

[irony-mode](https://github.com/Sarcasm/irony-mode)は，clangを使ってC/C++を書くときに色々と賢いことをしてくれるマイナーモード．
[company-irony](https://github.com/Sarcasm/company-irony)は，company-modeでironyの補完を使うためのbackend．
emacsのバージョンは24.4以降推奨．

![スクリーンキャスト](https://qiita-image-store.s3.amazonaws.com/0/81323/b768a558-78e5-4727-cd75-8301d3d6fae5.gif)


# インストール
MELPAからインストール可能．

```
M-x package-install RET irony RET
M-x package-install RET company-irony RET
```

# 設定

```el
(require 'irony)
(add-hook 'c-mode-hook 'irony-mode)
(add-hook 'c++-mode-hook 'irony-mode)
(add-hook 'objc-mode-hook 'irony-mode)
(add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
(add-to-list 'company-backends 'company-irony) ; backend追加
```

`irony-cdb-autosetup-compile-options`は，`compile_commands.json`からコンパイルオプションを取得するためのもの．
自分は，常に適用するコンパイルオプションを設定したかったので，以下のようにした．

```el
(setq irony-lang-compile-option-alist
      '((c++-mode . ("c++" "-std=c++11" "-lstdc++" "-lm"))
        (c-mode . ("c"))
        (objc-mode . '("objective-c"))))
(defun irony--lang-compile-option ()
  (irony--awhen (cdr-safe (assq major-mode irony-lang-compile-option-alist))
    (append '("-x") it)))
```

`irony-lang-compile-option-alist`で言語ごとのコンパイルオプションをリスト形式で設定する．
この形式にするため，`irony--lang-compile-option`も変更する必要があった．
もっといい方法があれば教えて下さい．

また，[yasnipet](https://github.com/capitaomorte/yasnippet)をインストールして

```el
(yas-global-mode)
```

とすれば上のスクリーンキャストのように引数をいい具合に展開してくれる．

**(2015/08/02追記)**
コンパイルオプションの設定に対して @KazuSoap さんからコメントを頂きました。
以下のような設定が良いとのことです。情報ありがとうございます。
詳しくはコメントを参照ください。

```el
;; 連想リストの中身を文字列のリストに変更せず、変数そのままの構造を利用。
;; 複数のコンパイルオプションはスペースで区切る
(setq irony-lang-compile-option-alist
      (quote ((c++-mode . "c++ -std=c++11 -lstdc++")
              (c-mode . "c")
              (objc-mode . "objective-c"))))
;; アドバイスによって関数を再定義。
;; split-string によって文字列をスペース区切りでリストに変換
;; (24.4以降 新アドバイス使用)
(defun ad-irony--lang-compile-option ()
  (defvar irony-lang-compile-option-alist)
  (let ((it (cdr-safe (assq major-mode irony-lang-compile-option-alist))))
    (when it (append '("-x") (split-string it "\s")))))
(advice-add 'irony--lang-compile-option :override #'ad-irony--lang-compile-option)
;; (24.3以前 旧アドバイス使用)
(defadvice irony--lang-compile-option (around ad-irony--lang-compile-option activate)
  (defvar irony-lang-compile-option-alist)
  (let ((it (cdr-safe (assq major-mode irony-lang-compile-option-alist))))
    (when it (append '("-x") (split-string it "\s")))))
```



# 使い方

初回実行時のみ，

```
M-x irony-install-server RET
```

でirony-serverをインストールする．
irony-serverがインストールされる場所は`irony-server-install-prefix`で指定できる．
あとは適当にprefixを打てばcompanyが補完候補を表示してくれるはず．
modan.IE(VM)でSeleniumを使ってIE各バージョンのテストをする方法

modern.IEというIEをテストするための仮想環境が90日無料で使えるのでそれを活用してIE各バージョンのテストができるようにする
**必ず、必ずを守って下さい**


# 環境構築前
## VMplayer
まずVMplayerをインストール
https://my.vmware.com/jp/web/vmware/free#desktop_end_user_computing/vmware_player/6_0|PLAYER-607|product_downloads

##modern.IE
win環境の方は**必ずIE**でVM用にダウンロード
https://www.modern.ie/ja-jp

ダウンロードしたら解答して.ovfファイルを実行
インポートして完了。
#環境構築
##ネットワークアダプタの追加
左上のPlayerから管理→仮想マシン設定で追加
ネットワークアダプタを選択、**必ずNAT**を選択して追加。

##Pythonをインストール
Pythonをインストール
https://www.python.org/downloads/release/python-2710/
Windows x86 MSI installerをインストール

##Path
PythonのPathを通す
管理者権限でコマンドプロントを起動。
`SETX /M PATH "%PATH%;C:\Python27;C:\Python27\Scripts;"`

##pip install
コマンドラインで`pip install selenium`実行

IEdriverが必要なので取ってくるが、**必ず32bit**をダウンロード。
http://selenium-release.storage.googleapis.com/index.html

記事が書いた時点での直リンク
http://selenium-release.storage.googleapis.com/2.46/IEDriverServer_Win32_2.46.0.zip

#環境構築完了

と書いてしまったがこの一連の処理を自動できるように友人が作ってくれた模様。
https://github.com/prprhyt/PythonSeleniumIEDriverSetup

#参照
Internet Explorerの実行環境を仮想マシンとして作れるmodern.IEをVMで立ち上げてみた
http://hotuta.hatenablog.com/entry/2015/06/22/135828

modern.IEでSeleniumを使いIEを立ち上げるまで
http://hotuta.hatenablog.com/entry/2015/06/17/162230

#発展
Selenium+xlrdでエクセルファイルを読み込んでブラウザテストする方法
http://hotuta.hatenablog.com/entry/2015/07/11/161227
sqlite最低限の覚書（Mac）


MacでSqlite触るときの最低限の知識。たまに使うとき忘れるのでメモ。

##インストール

あま、brewでいいかと。

```bash
brew install sqlite3
```
以上。

##操作

###動いてる？
動いてるかどうか含め、バージョン確認。

```bash
sqlite3 version
```

###ログイン？

ファイル名を指定して起動すると、コンソールに入る。ただ、テーブル作るまではファイルはできない。

```bash
sqlite3 test.sqlite
```

###テーブル作成

```bash
sqlite>create table users(name, email);
```
型は指定してもしなくても良い。その他、使えるオプションとしては、

```
sqlite>create table users(
	id integer primary key autoincrement,
	name text,
	age integer,
	email text unique,
	status integer default 1
);

```
てな感じ。もちろん、not nullなども。

###状況確認

そもそもどんなセッティングか？ MySQLのstatu的な。

```bash
.show
```

どんなテーブルがあるか？

```bash
sqlite>.table
```

どんな構造か？

```bash
sqlite>.schema users
```

### 内容をCSVで出力

下記のようにするとCSV出力できる。便利。
modeをCSVにし、headerを付け（必要なら）、selectするだけ。.exitするとモードは初期化されるみたい。

```bash
sqlite> .mode csv
sqlite> .headers on
sqlite> .output output.csv
sqlite> select * from users;
sqlite> .exit
```

###利用
あとはSQLスキルの問題。
アマゾンクラウドエンジニア(新卒用）

#アマゾンクラウドエンジニアが選ぶ３５選

今日は昨日のshareslideでの紹介からの続きです。

http://www.slideshare.net/livesense/web-49772012

このshareslideから　基礎を学ぶ大事さを教えていただきました。

僕は本当に基本にも程遠いやつなので毎日頑張らなければなりません。

そこで、これからの**具体的** な目標です。

それがこちら！！（kindleが少ないのが少し残念）
題して「**アマゾンクラウドエンジニアが選ぶ３５選**]
http://www.amazon.co.jp/b?node=3517238051

この中に３５冊ありますが、数冊ずつピックしてやります。

最初の一冊はこちら
**体系的に学ぶ 安全なWebアプリケーションの作り方　脆弱性が生まれる原理と対策の実践**
http://www.amazon.co.jp/gp/product/4797361190/ref=amb_link_73893269_34?pf_rd_m=AN1VRQENFRJN5&pf_rd_s=merchandised-search-6&pf_rd_r=1MVPXH309Q08F593JPMJ&pf_rd_t=101&pf_rd_p=208714729&pf_rd_i=3517238051

こちらをやります。

また今日ほかのshareskideを見てました。（特に新卒研修のもの）

以下の２つの会社の新人研修を見つけました。

DeNA http://www.slideshare.net/DaisukeTamada/perl-26371335
Bizreach   http://www.slideshare.net/ToshiakiArai/jjug-46887039

これらの新人研修を見ての共通点

・とにかく手を動かさないと何も始まらない。
・基本を身に着けるのはとても大変
➡社会人になるまでに７か月あるので、時間を無駄にできないb。
・タイピングは自分は遅いので毎日練習しなきゃ！
・モチベーション維持が一人では大変。理由としては
フィードバックをもらう機会がないのでとにかくわからないことは自分で調べるしかない。
（主体性を持って行動）
・実際は現場に入らないとわからないことばかりだが、少しでも基礎を付ける必要がある。
・論理性を磨く！！
http://www.slideshare.net/kotas/git-15276118　これが人気だった
また、初心者向けメッセがあったので共有します。

・先輩からのアドバイス大事に
・積極的に自分の知識やコードをアウトプットすることで他人から刺激をもらえ
・webの意見に騙されるな。（優先順位は実験　公式　書籍の順）
・スピードが命
・現場思考が大事
・可読性の高いコードにこだわる

以上です。　これからも更新していきますのでどんどんdisってください
Windowsの L##quote ってなんだ


こちらで説明してくれている方がおられた。

[プリプロセッサのマクロ展開と##演算子](http://d.hatena.ne.jp/masugata_k/20081114/1226675350)


1. TEXT(HELLO_WORLD)
2. __TEXT(quote)
3. __TEXT(HELLO_WORLD)
4. __TEXT("Hello, world.")
5. L ## quote
6. L ## "Hello, world."
7. L"Hello, world."

上記URLより引用させていただいた。

要するに、L"文字列" の形に展開されるということで納得。
React.jsで改行を<br />に変換する

# 課題

React.jsで`\n`を`<br>`として表示したい。

# 解決策

```
React.createClass({
    nl2br: function (text) {
        var regex = /(\n)/g
        return text.split(regex).map(function (line) {
            if (line.match(regex)) {
                return React.createElement('br')
            }
            else {
                return line;
            }
        });
    },
    render: function () {
        return (
            <p>{ this.nl2br(this.props.text) }</p>
        );
    }
});
```
SwiftでIntの最大値・最小値を超えた時の挙動（オーバーフロー）

Swiftにおける符号付き整数型には、`Int`、`Int8`、`Int16`、`Int32`、`Int64`があります。`Int`の後に8や16と数字がついているのは、その整数のビット数を表します。例えばInt8は8ビットの符号付き整数なので、2^8個の値を表すことができます。具体的には-2^7~2^7-1、すなわち-128~127です。`Int`は環境によって`Int32`または`Int64`となります。

では、この最大値を超えた時の挙動はどうなるのでしょうか？

挙動を確認するため、SingleView Applicationを作って、ViewContoroller内で、`Int8`の最大整数aに1を加えるコードを記述してみます。

```swift:Swift
let a:Int8 = Int8.max;  // Int8の最大値
override func viewDidLoad() {
    super.viewDidLoad()
    var b:Int8 = a + 1;
}
```

これを実行すると、EXC_BAD_INSTRUCTIONというエラーが発生し、アプリが停止します。**`Int8`が最大値である127より大きな値や、-128より小さな値を取れないために発生するオーバーフローという現象**です。

![スクリーンショット 2015-07-11 20.16.45.png](https://qiita-image-store.s3.amazonaws.com/0/67884/eb355ad3-9ced-fb1c-73ef-ebcdc73c18e8.png)

オーバーフローが起こってもエラーを発生させないためには、&を使います。

```swift:Swift
var b:Int8 = a &+ 1;
```

注意すべきは、`b`の結果は128ではなく、-127になるという点です。つまり、`Int8`の最小値である-128から1を足した値です。

#最後に
ゲームアプリにおける得点の管理にInt型を使っている時、`Int`型が想定よりも大きな値になって、最大値を超えてエラーになるというのはよくある現象です。`Int`の最大値、最小値を超えた時の挙動はきちんと抑えておきましょう。
ちなみに、ActionScript 3.0では、`Int`(32ビット符号付き整数)の最大値を超えると、エラーは起きずに-2^16になります。
[AWSCLI]VPC周りの簡易コマンドリファレンスその3




昨日までと打って変わっていきなり暑くなってげんなりしてます。吉田です。
暑いの嫌い...でも暑いとビールが美味い。

---
vpc編のラストです。
その１、その２でVPCの作成からサブネットの定義まで見ていきました。
今回はIGWのアタッチなどを見ていきます

[[AWSCLI]VPC周りの簡易コマンドリファレンスその1](http://qiita.com/Yuki_BB3/items/3952f34dc08078bd6c52)
[[AWSCLI]VPC周りの簡易コマンドリファレンスその2](http://qiita.com/Yuki_BB3/items/eee8a4e3f2aa54b50f09)

公式サイト
http://docs.aws.amazon.com/cli/latest/index.html
基本的にサンプルとかは公式から持ってきています。

---

###aws ec2 create-internet-gateway
IGWを作成するコマンドです。
今回はこれといって指定するオプションはありません。
JSONの出力結果で「InternetGatewayId」が確認できると思うので控えておきましょう。
>　igw-XXXXXXXX

####aws ec2 describe-internet-gateways
例によって「describe」で確認することができます。
「jq」で整形すれば変数として格納することができます。

|    オプション　|     意味 　　　| 何を書けばいいか |
|:------------|:------------:|:------------:|
| --internet-gateway-ids | IGWのid | igw-XXXXXXXX |

igwのidを指定することによってigwに関しての情報を取得できます。

```bash:サンプル
aws ec2 describe-internet-gateways --internet-gateway-ids igw-XXXXXXXX

```
例によって「 --filters」でフィルターもできます。

---

###aws ec2 attach-internet-gateway 
文字通りです。IGWをアタッチします。

|    オプション　|     意味 　　　| 何を書けばいいか |
|:------------|:------------|:------------:|
| --internet-gateway-id | IGWのidを指定する | igw-XXXXXXXX |
| --vpc-id | IGWをアタッチするVPCを指定する　 | vpc-xxxxxxxx |

これも単純に、「取り付けたいIGW」「取り付ける先のVPC」を指定してあげるだけです。

```bash:サンプル
aws ec2 attach-internet-gateway --internet-gateway-id igw-XXXXXXXX --vpc-id vpc-xxxxxxxx

```

---

VPCにIGWをアタッチすることができました。
これであとは前回作成したサブネットのルートテーブルで取り付けたIGWに対して通信を向けてあげればパブリックなサブネットを作成することができます！
あと一踏ん張りです！！！

---

###aws ec2 describe-route-tables
その２で見たコマンドですね。
これを使って作成したルートテーブルのidを確認してください。
控えてあれば大丈夫です。

---

###aws ec2 create-route
ルートテーブルでルートを指定してあげます。

|    オプション　|     意味 　　　| 何を書けばいいか |
|:------------|:------------|:------------|
| --route-table-id | 設定を行うルートテーブルの指定 | rtb-xxxxxxxx |
| --destination-cidr-block | トラフィックの向ける先を指定 | 0.0.0.0/0で全てのトラフィックの意 |
| --gateway-id | トラフィックを向ける先のIGWを指定します | igw-XXXXXXXX |
| --instance-id | NATインスタンスに向けたい時に使う | i-xxxxxxxx |

今回は全てのトラフィックをIGWに向けたいので0.0.0.0/0(全てのトラフィック)としています。
マネジメントコンソールでやる時と一緒です。

```bash:サンプル
aws ec2 create-route --route-table-id rtb-xxxxxxxx --destination-cidr-block 0.0.0.0/0 --gateway-id igw-XXXXXXXX
```
---

どうですか？
これでもうVPCの設定ができてしまいました！
マネジメントコンソールを使わなくったってAWSは操作できるんです！！！
まあ、これをやるなら確かにマネジメントコンソールの方が楽なのですが、１回やってみると結構勉強になるので自分で叩いてみるといいと思います。
自分は最初挫折しそうになりましたが、頑張っているいうちに拒否反応起こさなくなってきました！

最後に、サブネット内のインスタンスに自動でパブリックIPを振る設定をして終わりにしたいと思います。

---

###aws ec2 modify-subnet-attribute
その１でVPCの設定を修正しました。今回はサブネットの修正を行います。

> --subnet-id subnet-xxxxxxxx

毎度のことですね。設定を行うサブネットをidで指定します。
重要なのは以下のオプション。

> --map-public-ip-on-launch 
> --no-map-public-ip-on-launch

このオプションでインスタンスにパブリックIPを振るかどうかを指定します。
「--map-public-ip-on-launch 」を指定します。

```bash:サンプル
aws ec2 modify-subnet-attribute --subnet-id subnet-xxxxxxxx --map-public-ip-on-launch
```

---

以上、３回にわたってVPCの作成コマンドを確認してきました。
これらのコマンドを使用すればマネジメントコンソールに頼ることなくVPCを作成することができます。
AWSCLIは今まさに勉強しているので今後も書いていきたいと思っています。
Unityである点を向けさせながら回転させる

下記、ソースコードを対象のゲームオブジェクトにアタッチするとシーンの中心(0,0,0)をみながら

```java
using UnityEngine;
using System.Collections;

public class MyCamera : MonoBehaviour {
	private Transform myTransform;

	void Awake ()
	{
		myTransform = transform;
	}

	void Update ()
	{
		Vector3 relativePos = Vector3.zero - myTransform.position;
		Quaternion rotation = Quaternion.LookRotation(relativePos);
		myTransform.rotation = rotation;
		myTransform.RotateAround (
                    Vector3.zero, Vector3.up,
                    10.0f * Time.deltaTime
                 );
	}
}
```
Atomでscriptパッケージ入れてJavaScript実行しようとしたらnodeなんていないと言われた

今までSublimeText使ってたもののちょっとAtomに浮気してます。んで、いろいろパッケージを入れてたところ掲題の件の現象。

### 入れたパッケージ
- https://github.com/rgbkrk/atom-script
- Atom上でコードを実行できるやつです

### 動かしてみた
- こんなんでた

![スクリーンショット 2015-07-11 19.00.14.png](https://qiita-image-store.s3.amazonaws.com/0/25841/ccce4710-bdd6-5c44-1053-40822bb40360.png)

### 直してみた
- どうもnodeのPATHが見えてないっぽい。。。調べたら[issue](https://github.com/rgbkrk/atom-script/issues/61#issuecomment-37337827)が切られてたので、やりとりを参考にinit Scriptを開いてPATHを追加してみる。
- Atom -> Open Your Init Scriptを開いて自分のnodeのPATHを追加

```js
process.env.PATH = ["/Users/rei_m/.nodebrew/current/bin", process.env.PATH].join(":");
```

- Atom再起動で動くようになりました。もっとうまい解決法がある気がする。。。
GeneratorとSequence


# GeneratorType
generatorとは新しい要素を返す処理のことで、以下の`GeneratorType`プロトコルに従う。

```swift
protocol GeneratorType {
	typealias Element
	func next() -> Element?
}
```

例えば、文字列を各行を返すgeneratorはこんな感じで実装する。

```swift
class LineGenerator: GeneratorType {
    typealias Element = String
    
    var lines: [String]
    
    init(text: String) {
        self.lines = text.componentsSeparatedByString("\n")
    }
    
    func next() -> Element? {
        return lines.isEmpty ? nil : lines.removeAtIndex(0)
    }
}

let text = "いろはにほへと ちりぬるを\nわかよたれそ つねならむ\nういのおくやま けふこえて\nあさきゆめみし よひもせず"
let generator1 = LineGenerator(text: text)
generator1.next() //=> いろはにほへと ちりぬるを
generator1.next() //=> わかよたれそ つねならむ
generator1.next() //=> ういのおくやま けふこえて
generator1.next() //=> あさきゆめみし よひもせず
generator1.next() //=> nil
```

# GeneratorOf
generatorを書くとき上のようにクラスを定義するのが面倒なら、`GeneratorOf<T>`構造体が便利。以下のような感じで定義されている。

```swift
struct GeneratorOf<T>: GeneratorType, SequenceType {
	init(_ nextElement: () -> T?)
	
	mutating func next() -> T?
}
```

`GeneratorOf`構造体は`GeneratorType`プロトコルに従っており、初期化時に渡されたクロージャを`next()`で実行するようになっている。なので、上のコードは以下のように書き直せる。

```swift
func lineGenerator(#text: String) -> GeneratorOf<String> {
    var lines = text.componentsSeparatedByString("\n")
    return GeneratorOf { return lines.isEmpty ? nil : lines.removeAtIndex(0) }
}

var generator2 = lineGenerator(text: text)
generator2.next() //=> いろはにほへと ちりぬるを
generator2.next() //=> わかよたれそ つねならむ
generator2.next() //=> ういのおくやま けふこえて
generator2.next() //=> あさきゆめみし よひもせず
generator2.next() //=> nil
```

# SequenceType
sequenceはループによって中身の要素を走査できる構造のことで、以下の`SequenceType`プロトコルに従う。

```swift
protocol SequenceType {
	typealias Generator: GeneratorType
	func generate() -> Generator
}
```

sequenceはgeneratorを`generate()`で生成して、それを使って中身の要素に順にアクセスする。`SequenceType`プロトコルに従うオブジェクトは`for-in`ループに渡すことができる。

```swift
class LineSequence: SequenceType {
    typealias Generator = LineGenerator
    
    var text: String
    
    init(text: String) {
        self.text = text
    }
    
    func generate() -> Generator {
        return LineGenerator(text: text)
    }
}

for line in LineSequence(text: text) {
    print(line)
}
```

# SequenceOf
`GeneratorOf`と同様に`SequenceOf`も存在する。

```swift
struct SequenceOf<T>: SequenceType {
	init<G: GeneratorType where T == T>(_ makeUnderlyingGenerator: () -> G)
	func generate() -> GeneratorOf<T>
}
```

```swift
func lineSequence(#text: String) -> SequenceOf<String> {
	return SequenceOf { return lineGenerator(text: text) }
}

for line in lineSequence(text: text) {
	print(line)
}
```
【Oracle】WITH句の問合せを一時表にする方法


WITH句で問合せを定義しても、そのWITH句の問合せの利用箇所が1カ所のみの場合には、
オプティマイザーが気を利かせて一時表にせずに、本体の問合せとマージされた実行計画が作られる場合があります。

# 解決方法
WITH句のQueryごとに /*+ materialize */ ヒントを埋め込む。

なお「_with_subquery」という隠しパラメータも11gから追加されていて、
ALTER SYSTEM、ALTER SESSION、または、opt_param('_with_subquery' 'materialize') をヒント句に仕込んでSQLごとにどのようにWITHのQueryの挙動を操作できるようになっているようですが、
試したところ上手くいかず。（パターンは以下の３パターン）
今回は、WITH句ごとに materializeヒントを埋め込む対応を取りました。

# なぜ一時表にする必要があったか？
今回この対応をしたのは、テーブル（マスタ系データ）の名称どうしの中間一致での結合でのパフォーマンス対応がきっかけでした。
LIKE結合（Table1.col_name1 LIKE '%' || Table2.col_name2 || '%'）
をしていて、非等価結合だと結合方法がNL結合になってしまうため（HASH結合、SORT-MERGE結合は選択されない）、結合する対象データ（今回はTable2のデータ）の件数をあらかじめ絞り込んでおいたほうが、NL結合での対象件数がへって、結果として処理の時間の短縮に繋がります。
そのためTable2の件数をあらかじめ絞り込んでおいた一時表を、WITH句をわざと使用して作成しようとしたのですが、ヒントなしではオプティマイザによって最適化されて一時表が作成されず意図した実行計画にならなかったという経緯です。

# 参考
materialize
http://www.dba-oracle.com/t_materialize_sql_hint.htm
_with_subquery
https://dioncho.wordpress.com/2009/02/09/_with_subquery-parameter-controlling-subquery-factoring/
http://www.orafaq.com/parms/parm2088.htm
ionicで子要素から親要素へのクリック伝播を止める

* ionic ver: 1.6.1
* MacOSX: 10.10.3

# ionicクリックイベントの伝播遮断

こんなHTMLがあったとする。

```
<div ng-repeat="item in items | orderBy:orderProp">
    <div class="item item-thumbnail-left item-icon-right" ng-click="showConfirm()" >
        <img ng-src="{{item.image}}">
        <h2>{{item.title}}</h2>
        <p>{{item.description}}</p>
        <button class="button" ng-click="goMovie()">
            サンプル動画を見る
        </button>
        <i class="icon ion-ios-arrow-right"></i>
    </div>
</div>
```

このHTMLの、サンプル動画を見るというボタンをクリックすると、

1. サンプル動画を見るのクリックイベント(`goMovie()`)発火
2. 親のdiv要素のクリックイベント(`showConfirm()`)発火

となり、子要素の動画ボタンだけ押したいのに親要素もクリックされたことになってしまう。

# 対処法

イベントを止めたいところに `ion-stop-event="click"` を追記する。

```
<div ng-repeat="item in items | orderBy:orderProp">
    <div class="item item-thumbnail-left item-icon-right" ng-click="showConfirm()" >
        <img ng-src="{{item.image}}">
        <h2>{{item.title}}</h2>
        <p>{{item.description}}</p>
        <button class="button" ion-stop-event="click" ng-click="goMovie()">
            サンプル動画を見る
        </button>
        <i class="icon ion-ios-arrow-right"></i>
    </div>
</div>
```

これで、「サンプル動画を見る」ボタンが押された時は`goMovie()`イベントが発火し、親要素の`showConfirm()`は発火しなくなる。

# 参考

* [Cancel event propagation between nested ng-click calls - ionic - Ionic Forum](http://forum.ionicframework.com/t/cancel-event-propagation-between-nested-ng-click-calls/6202/4)
* [Stop ng-click propagation on list item buttons · Issue #550 · driftyco/ionic · GitHub](https://github.com/driftyco/ionic/issues/550)
やりたいこと・わからないこと

# Emacs

* symbol と文字列の違い．
* (for|back)ward-word を customize したい．
* 日本語の助詞ごとに cursor 移動したい．
* 日本語を syntax highlight したい．接続詞を強調表示したい．
* tag jump を使いこなせていない．
* 他の editor や IDE を使って，良い点を emacs に取り入れたい．
* helm を使いこなせていない．
* org-mode で markdown 文書を編集できる？
* markdown を表示できる？
* modeline に自分のほしい情報 (battery 残量等) を表示したい．
* powerline をうまく customize できない．
* skk の辞書を utf-8 にする。

# Chrome

* Password を保存させるとどんな危険があるか．
* Master password を設定できるか．
* keyconfig を使いこなせていない．
* [Command 指向の Emacs 利用](http://qiita.com/ticonz/items/a6dd5c57f3f4d59432cc) 的な interface を作りたい．

# zsh

* C-S-a 等の key に機能を割り当てたい．
* delete-key とか push-line といった command の一覧はどこで見られる？
* Prompt に色をつけたい．

# zangband

* hjkl で移動できない．

# gnupack

* magit の build に makeinfo が必要だが，どうするのが smart か．

* * apt-cyg で makeinfo を入れたが、だめだった。

# git

* 全ての branch を pull する方法．
* github の issue を shell か emacs から閲覧・編集したい．

# mail

* shell から mail を送りたい．
* mail で qiita, hatena を更新したい．
* sendmail の使い方．

# blog

* 版管理のできる blog がほしい．
    * 各 entry を local で git で管理して、最新版を api ではてなに put すればOK? 

# google ime

* 設定 file はどこに置いてある？
    * Windows 8 では `/c/Users/[ユーザー名]/AppData/LocalLow/Google/Google Japanese Input` .

# google calendar

* CLI で閲覧・編集したい．

# mac

* Pages の文書を pdf で書き出すのを CLI でやりたい．

# autohotkey

* dvorak + Emacs 的 keybind を実現したい．

* * ほぼ実現できた．→ https://github.com/idaisukee/ahk_scripts

# amazon

* review の閲覧を楽にしたい．
* 出品を楽にしたい．
c++ builder > IDE > 下に配置 > 最後に選択した物に合わせる

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

「位置 -> 位置揃え > 下に寄せる」により複数のフォーム上コンポーネントを下に揃えることができるが、いつもよくわからなくなるのは、「どのコンポーネント」の下に揃うのか、ということ。

最後に選択したものに合わせるようだ。
HTML5の<input type="datetime-local">が対応していないブラウザでも大丈夫なように正規表現で変な値を入れさせないようにする


過去にTwitter予約投稿サイトを作成した時にHTML5の\<input type="datetime-local">を使ったんですがその時
ブラウザが対応していない場合、ただのテキストボックスで表示されることが分かりました。

<input type="datetime-local">

↑これ

がFirefoxなどでみると

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/85815/ca21fa6e-0d17-4b42-d616-55b25166e8b3.jpeg)

↑こんな感じで表示される

なので対応していないブラウザを使われた時に変な値を送信されないように正規表現を使って正しい値しか受け取らないようにします。

**★方法**

```html+php:form.php

～略～

<form action="processing.php" method="post" name="tmm_form">
<input type="datetime-local">
予約日時：<input type="datetime-local" step="600" name="yoyaku_time" maxlength="16">
<br />※HTML5未対応ブラウザ用日時の書き方例：2014-10-06T02:00

～略～

<input type="submit" name="btnA" value="予約する">
</form>
```

```php:processing.php
 /* 時間をフォームに入力させるときの処理 */

 //今の時間取得
 date_default_timezone_set('Asia/Tokyo');
 $nowYMDHI = date("Y-m-d H:i");

 //予約時刻取得
 $yoyaku_time = $_POST['yoyaku_time'];

 //予約日時チェック
 //フォーマット例：2014-10-06T03:00
 //正規表現
 if(!preg_match("/^(20)[0-9]{2}\-[0-9]{1,2}\-[0-9]{1,2}[T](0[0-9]|1[0-9]|2[0-3]):[0-5][0]$/", $yoyaku_time)){
    //エラー
    $_SESSION['message'] = 
      "予約日時空白か時間が変です。お使いのブラウザがHTML5に対応していない可能性があります。
       <br />お手数ですが時間をフォーマット通りに入力するか、HTML5対応ブラウザ(Chrome最新版など)でお使いください。
       <br />フォーマット例：2014-10-06T12:10";

    header("Location: ./form.php");
    exit;
 }else{
    $yoyaku_year = substr($yoyaku_time, 0, 4);
    $yoyaku_month = substr($yoyaku_time, 5, 2);            
    $yoyaku_day = substr($yoyaku_time, 8, 2);
    //日付けの正当性
    if(!checkdate($yoyaku_month, $yoyaku_day, $yoyaku_year)){
        //エラー
        $_SESSION['message'] = 
          "予約日時空白か時間が変です。お使いのブラウザがHTML5に対応していない可能性があります。
           <br />お手数ですが時間をフォーマット通りに入力するか、HTML5対応ブラウザ(Chrome最新版など)でお使いください。
           <br />フォーマット例：2014-10-06T12:10";

        header("Location: ./form.php");
        exit;                
    }
 }

 $yoyaku_time = str_replace('T', ' ', $yoyaku_time); //時間のフォーマット整え

 if($nowYMDHI >= $yoyaku_time){
    $_SESSION['message'] = "指定した予約日時は現在の時刻か、もう既に過ぎています。
                            <br/>現在時刻：".$nowYMDHI."　予約時刻：".$yoyaku_time;

    header("Location: ./form.php");
    exit;
 }
```

で今回で言いう一番重要なところは
`if(!preg_match("/^(20)[0-9]{2}\-[0-9]{1,2}\-[0-9]{1,2}[T](0[0-9]|1[0-9]|2[0-3]):[0-5][0]$/", $yoyaku_time))`
ここです。
ここでフォームの値が正しいフォーマットかどうか判断しています
※ただこれが完璧な正規表現かというとあんまり自信ないです（数回しかテストしてないので）
ごめんなさい

あとの処理は見てもらえるとわかるように今の時間より過去になってないかの判断をしております。

自分的メモおわり
ブラウザのシェアを調べる時のお勧めサイトまとめ

Webサイトを制作する時は多くのユーザーに見てもらうため、できるだけ多くのブラウザに対応することが理想ですが、古いブラウザの対応は工数がかかる場合が多いです。**事前にブラウザのシェアを調べ、費用対効果を考えて、適切に対応ブラウザを決定していくのが望ましい**でしょう。
今回は、デスクトップブラウザ、モバイル用ブラウザ、OSのシェアを調べるときに役に立つサイトを紹介します。

#豊富な情報量のStatCounter
ブラウザのシェアを調べるときに一番お勧めなのが[StatCounter Global Stats](http://gs.statcounter.com/)です。有名なサイトで、以下のようなものを調べることができます。
* ブラウザのシェア
* ブラウザバージョン別のシェア
* OSのシェア
* 解像度別のシェア

また、以下の様なオプションが指定可能で、より詳細な情報を得ることができます。
* デスクトップ、タブレット、モバイルのプラットフォーム
* 期間
* 地域（日本も指定可能）

例えば、直近3ヶ月の日本のブラウザ別シェアは以下のようになっています。
http://gs.statcounter.com/#all-browser_version-JP-monthly-201504-201506

![StatCounter-browser_version-JP-monthly-201504-201506.png](https://qiita-image-store.s3.amazonaws.com/0/67884/2426b4c9-c1cc-13af-fce9-df9eae7ebeba.png)

執筆時（2015/07/11）時点では、1位がIE11、2位がSafari iPhone、3位がChrome 43となっています。

#モバイルブラウザのOS別シェアを調べる
StatCounterは豊富な情報ですが、唯一不便なのがモバイルのOS別のシェアを調べられないことです。iOSの標準ブラウザ「Safari」やAndroidの標準ブラウザ「ブラウザ」のバージョンは、OSのバージョンに依存します。モバイルOSのバージョン別シェアは次のようにして調べます。

##iOSのバージョン別シェア
iOSのバージョン別シェアはdeveloperサイトで分かります。
https://developer.apple.com/support/app-store/
>![スクリーンショット 2015-07-11 17.59.01.png](https://qiita-image-store.s3.amazonaws.com/0/67884/6d1c6804-d859-ab78-904e-7178e01e0dd2.png)
>https://developer.apple.com/support/app-store/ より引用

2015年7月6日時点では、iOS 8のシェアが84%、iOS 7が14%となっています。

##Androidのバージョン別シェア
Androidのバージョン別シェもdeveloperサイトで調べることができます。
http://developer.android.com/about/dashboards/index.html

>![スクリーンショット 2015-07-11 18.02.23.png](https://qiita-image-store.s3.amazonaws.com/0/67884/e4dd7103-5a7f-c6a0-6eb0-f29b5c5d53d9.png)
>http://developer.android.com/about/dashboards/index.html より引用

執筆時（2015/07/11）時点では、4系のシェアが約80%と圧倒的に多く、5系は約10%、2系は5%ほどです。

#最後に
対象ブラウザは、Webサイト制作の工数に大きく影響してきます。古いブラウザの対応をするならば相応の工数と予算が必要です。よく起きがちなトラブルが、対象ブラウザを曖昧にしたままプロジェクトを進め、途中で予期せぬ古いブラウザ対応を迫られ、工数が想定より肥大化してしまうことです。**トラブルを起こさないためにも、あらかじめシェアをきちんと調べて対象ブラウザを明確に決定しておきましょう**。
今回はStatCounterを紹介しましたが、いくつかのサイトを見比べてシェアを確認するとより安全です。
GPUImageを使っていやらしいカメラ撮影をしてみる

# 勉強がてらGPUImageを使って見る

とりあえずカメラが起動してフィルターをかけるまで。

```

import UIKit

class GPUCaptureViewController: UIViewController {
    var videoCamera:GPUImageVideoCamera?
    var filter:GPUImagePixellateFilter?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        videoCamera = GPUImageVideoCamera(sessionPreset: AVCaptureSessionPresetHigh, cameraPosition: .Back)
        videoCamera!.outputImageOrientation = .Portrait;
        filter = GPUImagePixellateFilter()
        videoCamera?.addTarget(filter)
        let i:GPUImageView = GPUImageView(frame: self.view.frame)
        filter?.addTarget(i)
        self.view.addSubview(i)
        videoCamera?.startCameraCapture()
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
}
```

なんとこれだけで動く。
ブリッジヘッダでGPUImageはimportした。
podfileでGPUImageを追加して動かしてみた。


これでGPUImagePixellateFilterというモザイク撮影ができる。
![Screen Shot 2015-07-11 at 18.27.57.png](https://qiita-image-store.s3.amazonaws.com/0/31237/7949d86f-9a1c-5859-5917-4da62ecc736a.png)
Xamarin(C#)で、メンバ変数変更時に自動で値を表示するような事をやってみたかった。


Objective-CだとKVOに近い、「値が変わったら自動で反映させる」仕組みができないか遊んでました。

元はこれ
http://developer.xamarin.com/guides/android/user_interface/date_picker/

Andoridのサンプルで、DatePickerで設定した日付をTextFieldに反映していますが、この反映が関数呼び出しになるのでイマイチ感がありました。これをEventHandlerで出来ないか試しました。

```C#:
using System;

using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;

namespace HelloDatePicker
{
	[Activity (Label = "HelloDatePicker", MainLauncher = true, Icon = "@drawable/icon")]
	public class MainActivity : Activity
	{
		private TextView dateDisplay;
		private Button pickDate;

		private DateTime _date;		// 保存する日付の本体
		private DateTime date {   // ハンドラーを呼び出す偽日付
			get{ return _date; }
			set {
				_date = value;
				this.updateDateHandler (this, this.date);
			}
		}

		private event EventHandler<DateTime> updateDateHandler;
		// ハンドラ


		protected override void OnCreate (Bundle savedInstanceState)
		{
			base.OnCreate (savedInstanceState);
			SetContentView (Resource.Layout.Main);

			// capture our View elements
			dateDisplay = FindViewById<TextView> (Resource.Id.dateDisplay);
			pickDate = FindViewById<Button> (Resource.Id.pickDate);

			// add a click event handler to the button
			pickDate.Click += delegate {
				// ShowDialog (DATE_DIALOG_ID); 
				DatePickerDialog dialog = new DatePickerDialog (this, OnDateSet, date.Year, date.Month - 1, date.Day);
				dialog.Show ();
					
			};

			// this.dateが変更されたらdateDisplayに反映するイベント登録
			this.updateDateHandler += delegate(object sender, DateTime e) {
				dateDisplay.Text = e.ToString ("d");
			};

			// get the current date
			date = DateTime.Today;

		}

		// the event received when the user "sets" the date in the dialog
		void OnDateSet (object sender, DatePickerDialog.DateSetEventArgs e)
		{
			// DatePickerDelegateで設定おされたら呼び出される
			// this.dateを更新してるだけ。
			this.date = e.Date;
		}
	}
}
```

変数本体と「見せかけのgetter/setter」が別々に出来てしまったのがちょっとアレです。ここもっと上手く書けそうな気がします。誰か教えて下さい m(_ _)m
Ubuntuでデフォルトのシェルを変える


地味に知らなかった

* ubuntu

適当にシェルをインストール

```
$ sudo apt-get install zsh
```

シェルを起動してみる

```
$ /bin/zsh
（設定ファイルが無い云々言われる）
```

シェルを切り替える

```
$ chsh
no talloc stackframe at ../source3/param/loadparm.c:4864, leaking memory
Changing the login shell for yoshi
Enter the new value, or press ENTER for the default
	Login Shell [/bin/bash]:
```

みたいな感じで聞かれるので `/bin/shell` と答える

ログインしなおしてみる。shellが変わる。`echo $SHELL` を見てみる。
el-getを使ってみる


今までgitを使ってEmacsの設定をしていましたが、package.elとかcaskとかel-getとかを導入しようと思いました。その中でも、el-getが最もEmacsに特化していて、多くのパッケージを管理できそうなので、el-getを導入してみようと思いました。

# 環境

* Ubuntu 14.10
* Emacs 24.3.1

基本的には `~/.emacs.d/` に `init.el` を置いて、そこに設定をカリカリ書いていく感じにしようと思います。

# el-getのインストール

最初のel-getだけはgitからインストールすることにしました。
GitHubのリポジトリは https://github.com/dimitri/el-get です。
READMEにInstallationという項目があり、 `git clone` しろと書いてあるのでcloneします。

```bash
$ git clone https://github.com/dimitri/el-get.git
```

今回は `~/.emacs.d/el-get` に配置しました。

`~/.emacs.d/init.el` を以下のようにします

```elisp
;; load-path で ~/.emacs.d とか書かなくてよくなる
(when load-file-name
  (setq user-emacs-directory (file-name-directory load-file-name)))

;; el-get
(add-to-list 'load-path (locate-user-emacs-file "el-get"))
(require 'el-get)
;; el-getでダウンロードしたパッケージは ~/.emacs.d/ に入るようにする
(setq el-get-dir (locate-user-emacs-file ""))
```

これでEmacsを起動した時にエラーがでなければ問題ありません。

Emacsを起動した時にel-getがなかった場合は自動でcloneしてくるような設定もできますので、気になる人は調べてください。


# 適当にパッケージをインストールしてみる

では、試しにパッケージをインストールする設定を書きます。 `init.el` に以下を追記しました。

```elisp
;; auto-complage
(el-get-bundle auto-complete)
```

これによって、起動時に `auto-complete` が入っていなかったら勝手に入れてくれます。一回Emacsを終了して起動してみると、なにやらダウンロードが始まります。ダウンロードが終わると、auto-completeが動いていることが分かると思います。

`el-get-bundle` でインストールしたいパッケージを見たい場合は、 `M-x el-get-list-packages` とすれば見られます。


# パッケージのダウンロード元を設定する

`csharp-mode` を入れてみたいと思います。以下を追記します。

```elisp
(el-get-bundle csharp-mode)
```

そしてEmacsを再起動すると以下のように怒られます

```text
Error (el-get): while installing csharp-mode: el-get: *git svn clone csharp-mode* Could not install package csharp-mode
```

というわけで、ダウンロード元を設定してみます。 `csharp-mode` のGitHubのリポジトリは  https://github.com/josteink/csharp-mode です。この場合は以下のように書きます。

```elisp
(el-get-bundle josteink/csharp-mode)
```

これで無事に `csharp-mode` のインストールが走ります。
`csharp-mode` は個人で開発されたものらしく、ちゃんとした更新がなされていないので、いろいろと警告が出ますが、インストールできます。
このようにすることで、パッケージが登録されていなくても、GitHub のリポジトリを指定するだけで勝手に色々ダウンロードしてきてくれます。

# おわりに

最終的にこんな感じになりました。

https://gist.github.com/yoshikyoto/aa56dc09950342040ac8
Swift 初心者向け もくもく会 vol.2に参加してきた


##どんな会？

[[申し込みサイト]](http://swift-beginner.connpass.com/event/17035/?utm_campaign=event_message_to_selected_participant&utm_source=notifications&utm_medium=email&utm_content=title_link)をごらんください！（手抜き

##雰囲気は？

みなさん、自分でちゃんと目標をもって参加されていて
わからないところは積極的に有識者に質問したり、
また、iOS関連の開発事情などの情報交換もありました。
最後はみんなで成果をさっくり報告。
楽しいもくもく会でした。
次回も参加したいですね。

##僕がやったことは？

下記の書籍を読みながら、ソースコードをひたすら写経。
[[本気でゲーム開発力をつけたい人のための！ iPhone 2Dゲームプログラミング]](http://www.shuwasystem.co.jp/products/7980html/4372.html)

書籍の感想ですが、随所に溢れる誤植さえ気にしなければなかなかいいと思う。
Swift+ゲームプログラミング以外に
AutoLayoutにも一部言及されていて
いまの僕の興味のあることを押さえてくれている感じ。

##感想

雑談の話題にもなっていたけど
やっぱりプログラミングって書籍を読むだけでは覚えることは難しくて
実際にコードを書いて試していかないと覚えないなー。
alias_methodの使い道

こんなケースでよく使ってる

```rb
class User < ActiveRecord::Base
  has_one :user_profile

  alias_method :profile, :user_profile
end

class UserProfile < ActiveRecord::Base
  belongs_to :user
end

user.profile
```

他でもなんたらprofilesテーブル作りそうとか、でもポリモーフィック関連は嫌だとか、既にそういうテーブルがあったから仕方ないとかそんなケースで使ってる。
userくらいならいいかもしれないけど、prismaticallization.prismaticallization_profileとかだとグッと短くできる。
user.user_profile.user_hoge.user_fooとか悲しい感じにならなくて良い。
draper使ってるケースではdecoratorクラスも同様に書かないとダメ。

```rb
class UserDecorator < Draper::Decorator
  delegate_all
  decorates_association :user_profile
  alias_method :profile, :user_profile
end

class UserProfileDecorator < Draper::Decorator
  delegate_all
end
```

最近は気にせずprofilesテーブル作っちゃうほうが幸せな気がしてる。
namespaceうまく使ったらもっと幸せになれるのだろうか？
WordPress の WP Super Cache の 設定をしました

WordPressでは最初に WP Super Cache のプラグインを入れるようにしています。 WP Super Cache は[さくらレンタルサーバースタンダードプラン](http://www.sakura.ne.jp/standard.html)で使ってますヾ(o´∀｀o)ﾉ

#  WP Super Cache を有効に
**設定** > **WP Super Cache** を選択し、**キャッシング利用 (推奨)**をチェックして**ステータスを更新**を押します。

# 有効時間とガーベージコレクションを設定
ここの設定はしなくてもいいみたいなのですが、長めに設定しています。
**Cache Timeout**がデフォルトで1800秒だったので1800000秒に変更しました。

# プリロードの設定
プリロードされたキャッシュファイルは`14400`分毎にリフレッシュされます。と設定し、**プリロードモード (レガシーなキャッシュファイルに対してのみガーベージコレクションを実行。推奨)**にチェックを入れます。

**キャッシュプリロードをすぐに実行**を押します。

# キャッシュの確認
**コンテンツ**から**すべてのキャッシュファイルを表示**を選びます。
キャッシュされているファイルが表示されるはずです。

ここに何も表示されていなかったら何かがおかしいのかもしれません。

# 参考
http://denshikousaku.net/wp-super-cache-for-small-website
JavaScriptで藤原竜也変換ツールを作りましたよ゛お゛お゛お゛

こんにちは、ICSの[鹿野](https://twitter.com/tonkotsuboy_com)です。

藤原竜也変換ツールをご存知でしょうか？
テキストを打ち込むと、自動的にすべての文字に濁点を付けて返してくる便利なツールです（[藤原竜也変換ツールが便゛利゛す゛ぎ゛る゛よ゛お゛お゛お゛お゛お゛お゛お！！！ - Togetterまとめ](http://togetter.com/li/771846)）。

しかし、このツールがいつの間にか無くなってしまいました。DEATH NOTE、カイジ、るろうに剣心と名だたる実写映画で圧倒的な存在感を放つ藤原竜也さんの大ファンの私はショックで夜も眠れなかったので、JS版で作りなおしてみました。

[藤原竜也変換ツールJS版 - jsdo.it]
(http://jsdo.it/tonkotsuboy/2uNT)

上部のテキストフィールドに文字を入力すると、下部のテキストフィールドに自動的に濁点がついたテキストが表示されます。

[![](https://qiita-image-store.s3.amazonaws.com/0/67884/c4ad1811-7634-c1a0-9f22-4a567702ab55.png)](http://jsdo.it/tonkotsuboy/2uNT)

コードは簡単です。テキストフィールドに入力されたら、文字それぞれについて濁点（゛）をつけて新しいテキストフィールドに入力しています。

```js:JavaScript
const rawTextField = document.querySelector("#rawTextField");
const newTextField = document.querySelector("#newTextField");

rawTextField.value = "きんっきんにひえてやがるよおおお";

convertAction();

rawTextField.addEventListener("keyup", convertAction);

function convertAction() {
  const rawText = rawTextField.value;
  const newText = `${[...rawText].join("゛")}゛`;
  newTextField.value = newText;
}
```

技術的な工夫としては、濁点をつける際に文字列をスプレッド演算子`...`で配列に変換している箇所です。

```js
`${[...rawText].join("゛")}゛`;
```

これにより、サロゲートペア文字列（「𦥑（臼ではありません）」や、「𩸽（ホッケ）」などの漢字、「😀」「😺」といった絵文字）を考慮に入れつつ正しく濁点をつけることに成功しています。

詳しくは記事「[2018年に見直した現代的なJavaScriptの記法を紹介するぜ \- ICS MEDIA](https://ics.media/entry/17262)」を参照ください。

TwitterやFacebookで圧倒的直感を信じて新世界の神になりたいときにご利用ください。


* * *

（2015/07/13 追記）
Tweet機能をつけました。

（2017/12/13 追記）
ツ゛ー゛ル゛が゛1゛0゛万゛V゛i゛e゛w゛超゛え゛た゛よ゛お゛お゛お゛お゛お゛な゛ん゛な゛ん゛だ゛よ゛お゛お゛お゛お゛お゛お゛！゛！゛！゛

（2018/07/24 追記）
本家が復活しているようです。

- [藤原竜也変換ツール](http://fujiwara.morishin.me/)
exeファイルをエクスプローラーでダブルクリックしてからプロセスが作られ、プログラムのエントリポイントまで移動するまでの過程（2015年7月11日暫定版）

木村屋です。この記事は私のブログからの転載です。
Windowsでプロセスが作られ、プログラムが実際に動き出すまでの過程について調査を行ったのでメモをまとめました。
あくまで暫定版なので、あっさりした内容になっています。一部省略した記述もあります。
また間違いや勘違いも含まれていると思われます。予めご了承ください。
正確性を期した積もりですが誤りがあった場合は文責はすべて私にあります。

1. 親プロセスからexeファイルが起動される（普通のユーザーがexeファイルを起動する場合、親プロセスはエクスプローラーやコマンドプロンプトである場合が多いと思います。エクスプローラーから起動した場合、エクスプローラーが親プロセスになります）
2. 関数CreateProcessがexeファイル（イメージファイル）を開き、セッションオブジェクトを作成（関数NtOpenFileがファイルを開き、関数NtCreateSectionがセッションオブジェクトを作成する）
3. 関数CreateProcessがプロセスオブジェクトを作成（ntdll.dll内にある関数NtCreateProcessExが呼び出され、新しいプロセスが仮想アドレス空間に作られる）
4. 関数CreateProcessがスレッドオブジェクトを作成（ntdll.dll内にある関数NtCreateThreadがプロセスの最初のスレッドを作成する）
5. Windowsサブシステムがプロセスを初期化する（kernel32.dllがWindowsサブシステムにメッセージを送信）
6. 最初のスレッドの実行を開始。関数KiThreadStartupを呼び出し、スレッドを初期化する
7. イメージローダー（ntdll.dll内にあるLdrからはじまる関数群）に制御を移す
8. イメージローダーが最初のヒープの作成などのプロセスの初期化処理を行う
9. イメージローダーがexeのインポートテーブルの解析を行い、必要なDLLをすべて洗い出す。
10. イメージローダーが実行時、必要に応じてDLLをロード、アンロードする。ロードされているモジュールのリスト（モジュールデータベース）を管理する。ロードされているモジュールのリストにはDLLとメインの実行ファイルが含まれる
11. イメージローダーによりすべてのDLLがロードされた後、IAT（インポートアドレステーブル）を解析し、インポートされた関数を調べる（この処理で.textセクションにある外部のDLLにある関数呼び出しとメモリに呼び出されたDLL内部にある関数呼び出しの名前とアドレスの解決を行うものと思われる。詳細は未調査）
12. イメージローダーが依存関係を解決した後、インポート後の初期化処理が行われる（.NETアプリケーションかどうかの確認、静的なインポートのすべてのロードの処理等）
13. エントリポイントからプログラムの実行を開始

以上です。今後も調査を実施し、追記があれば記事の訂正、追加等を行います。

**引用文献**
Mark E. Russinovich、David A. Solomon、Alex Ionescu 2012 3.10 イメージローダー インサイドWindows 第6版 上 265
Mark E. Russinovich、David A. Solomon、Alex Ionescu 2012 実習：イメージローダーを監視する インサイドWindows 第6版 上 266
Mark E. Russinovich、David A. Solomon、Alex Ionescu 2012 5.3 CreateProcessの処理の流れ インサイドWindows 第6版 上 411
Mark E. Russinovich、David A. Solomon、Alex Ionescu 2012 実習：プロセスの起動をトレースする インサイドWindows 第6版 上 431
平成15 年度夏学期集中講義　コンピュータ科学特別講義III (戦略ソフトウェア特論II) http://i-web.i.u-tokyo.ac.jp/edu/training/ss/lecture/new-documents/Lectures/13-Processes/Processes.pdf

**転載元**
南関東開発機構 : exeファイルをエクスプローラーでダブルクリックしてからプロセスが作られ、プログラムのエントリポイントまで移動するまでの過程（2015年7月11日暫定版）
http://blog.livedoor.jp/south_kanto_dm/archives/52099041.html
swiftで　if　let　を使う理由 (のひとつ　)

swiftでnull(nil)チェックを行う際に、下記のようにしてチェックをする事が多いと思います。

```swift:hoge.swift
if let hoge = nilValue {
    //nilじゃなかったらー
}
```

この場合、nilValueがnilじゃなかったら中に入るのはわかるのですが、別に下記のように普通にnullチェックしてもいいんじゃあないかって初心者の僕は思うんですよね

```swift:fuge.swift
if nilValue != nil {
    //nilじゃなかったらー
}
```

上記の2つとも動作的には同じ(たぶん)なはずなので、わざわざわかりにくい　if　let　の方を使う必要ってなんなんだろうなって思ってたんですが、下記のように、ifの中でnullチェックしたものを使う場合に便利なんですよね。

```swift:poge.swift
if let poge = controller.navigationController {
    poge.hidesBarsOnSwipe = true
    poge.hidesBarsOnTap = true
    poge.navigationBarHidden = false
    poge.popToRootViewControllerAnimated(true)
}
```

上記を　if　let　なしで書くと、下記のようになります。

```swift:pupi.swift
controller.navigationController?.hidesBarsOnSwipe = true
controller.navigationController?.hidesBarsOnTap = true
controller.navigationController?.navigationBarHidden = false
controller.navigationController?.popToRootViewControllerAnimated(true)
```

もちろんこれでも動作はするのですが、4度のアンラップ(？)を行ってしまっています。さらに、controller.navigationControllerを何度も書かなくて済みます。

【まとめ】
if　let　を使う理由は、nullチェックを行った変数をifの中で使用する際に便利だからです。


※説明が間違っている場合や他にも理由がある場合は教えていただけると助かります。


参考
Swift Optionals: When to use if let, when ? and !, when as? and as
http://www.touch-code-magazine.com/swift-optionals-use-let/
Amazon EC2でCentOSを使う際の初期設定


# はじめに
こんにちは、新卒クラウドゆとりの[えのかわ](https://twitter.com/enkw_)です。
EC2のCentOSはAmazon Linuxとは違った点があるので初期設定をまとめてみました。なにか間違っている点などありましたらご指摘して頂けると嬉しいです。


#パッケージのアップデート
`ec2-user`ではなく`root`でSSHログインしてパッケージをアップデートします。

```bash
[enokawa]$ ssh -i key-pair.pem root@ec2-**-**-**-**.ap-northeast-1.compute.amazonaws.com 
# cat /etc/redhat-release
CentOS release 6.5 (Final)

# yum -y update

# cat /etc/redhat-release
CentOS release 6.6 (Final)
```


# 日本時間に設定する
デフォルトではUTCなので、JSTに設定します。

```bash
# cp -p /usr/share/zoneinfo/Japan /etc/localtime
cp: overwrite `/etc/localtime'? y
# date
Fri Jul 10 10:50:43 JST 2015
```
※追記
シンボリックリンクを作る方法もあるみたいです。

```bash
$ ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

# SELinux無効化
デフォルトではSELinuxが有効になっていますので無効化します。

```bash
# setenforce 0
# vi /etc/sysconfig/selinux
# cat /etc/sysconfig/selinux

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
```


# ファイアーウォールの無効化
AWSのSecurityGroupでアクセスを制御しましょう。

```bash
# /etc/init.d/iptables stop
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]

# chkconfig iptables off
# chkconfig iptables --list
iptables       	0:off	1:off	2:off	3:off	4:off	5:off	6:off
```


# rootでSSHログインできないようにする
新たに`ec2-user`を作成し、`root`アカウントではSSHログインできないように設定します。


```bash
# adduser ec2-user
# cp -r ~/.ssh/ /home/ec2-user/
# chown -R ec2-user:ec2-user /home/ec2-user/

# usermod -G wheel ec2-user
# visudo
%wheel        ALL=(ALL)       ALL
%wheel        ALL=(ALL)       NOPASSWD: ALL

# vi /etc/ssh/sshd_config
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no

# /etc/init.d/sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]
```
これで`root`アカウントではログインできなくなります。一旦ログアウトして`ec2-user`でしかログインできないことを確認します。
ここまで出来たらAMIを取得しておきましょう。後で使い回す際に便利です。


# 参考
EC2でCentOSを使う « サーバーワークス エンジニアブログ http://blog.serverworks.co.jp/tech/2013/02/25/centosonec2/
vagrant環境でrails serverへブラウザアクセス

用あって、rails勉強しようと思い。。。
てか、勉強したいだけだったので、簡単に済ませました。
個人環境だし。。。プライベートネットワークだし。。。
iptableはoffったまま、サクッと動かしたかったので。。。。


# 手順
ざっくりとですが・・・下記の通り。

1. windows側の名前解決（hostsファイル）
2. vagrant側名前解決


# 環境
ホスト：windows 7
ゲスト：[centos6.6(自作したやつ)](http://qiita.com/kieaiaarh/items/8f5f9cd888f4ab8fbcb8)

※[rails環境インストール](http://qiita.com/kieaiaarh/items/bed189015dbaa3486187)済み
# 1.windows側の名前解決（hostsファイル）

```
C:\Windows\System32\drivers\etc
```

* winなら（たぶん）上記のとおり、hostsファイルがあると思うので下記を最終行に追記

```
192.168.33.10 localhost #　追記　(ipは適宜変更してください)
```


# 2.vagrant側名前解決

* vagrantのプライベートネットワーク設定をする

```
$ vim Vagrantfile
config.vm.network :forwarded_port, host: 3000, guest: 3000↲　# ホスト、ゲスト間の3000番ポート転送設定
config.vm.network "private_network", ip: "192.168.33.10"↲ #　追記　(ipは適宜変更してください)
```

で、

```
$ vagrant up
```

vmが起動したらログインして、

```
$ sudo vi /etc/hosts
192.168.33.10 localhost　#　追記
```

あとは、railsチュートリアルのとおり。。。rails server 起動

```
$ cd rails_project/first_app
$ rails s
=> Booting WEBrick
=> Rails 4.2.2 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2015-07-11 16:04:35] INFO  WEBrick 1.3.1
[2015-07-11 16:04:35] INFO  ruby 2.2.2 (2015-04-13) [i686-linux]
[2015-07-11 16:04:35] INFO  WEBrick::HTTPServer#start: pid=2370 port=3000

```

で　ブラウザから「 http://localhost:3000 」へアクセスして、

![image](https://qiita-image-store.s3.amazonaws.com/0/64537/a4995c7c-9bf2-bb82-bb13-81d9f35182b0.png)

となるはず。

※追記
iptableがオンになっているなら、オフにするか、3000番の設定が必要

```
$  sudo vi /etc/sysconfig/iptables
```

```code:/etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3000 -j ACCEPT # 追加
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
```

して、リスター卜する

```
$ sudo service iptables restart
$ sudo service iptables stop     #offにするなら、上記追記はなしでこっちだけでいい

```
いつの間にか？VirtualBox Guest Additionsをインストールするのにperlが必要になっていたようです

デスクトップではない、CUIのCentOSの仮想マシンにVirtualBox Guest Additionsをインストールする際にperlが使われるようになっていました。確か少し前までは不要だったと思うのですが、いつから（ひょっとして最初から？）Perlを必要とするようになったかは不明です。

# 環境

* CentOS 6.6(x86_64) カーネル 2.6.32
* VirtulBox 4.3.20

# VirtualBox Guest Additionsインストール失敗

いつものように、デバイスドライバをビルドするのに必要なパッケージを入れてビルドしました。

```shell-session:いつものインストール方法
yum -y install kernel-devel kernel-headers dkms gcc gcc-c++
mount -t iso9660 /dev/cdrom /mnt
sh /mnt/VBoxLinuxAdditions.run
```

```text:失敗
Verifying archive integrity... All good.
Uncompressing VirtualBox 4.3.20 Guest Additions for Linux............
VirtualBox Guest Additions installer
Removing installed version 4.3.20 of VirtualBox Guest Additions...
Copying additional installer modules ...
Installing additional modules ...
Removing existing VirtualBox DKMS kernel modules           [  OK  ]
Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
Building the main Guest Additions module                   [失敗]
(Look at /var/log/vboxadd-install.log to find out what went wrong)
Doing non-kernel setup of the Guest Additions              [  OK  ]
Installing the Window System drivers
Could not find the X.Org or XFree86 Window System, skipping.
```

# Perlを追加してインストール

```shell-session:Perlを追加して再度インストール
yum -y install perl
sh /mnt/VBoxLinuxAdditions.run
```

```text:成功
Verifying archive integrity... All good.
Uncompressing VirtualBox 4.3.20 Guest Additions for Linux............
VirtualBox Guest Additions installer
Removing installed version 4.3.20 of VirtualBox Guest Additions...
Copying additional installer modules ...
Installing additional modules ...
Removing existing VirtualBox DKMS kernel modules           [  OK  ]
Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules     [  OK  ]
Doing non-kernel setup of the Guest Additions              [  OK  ]
Starting the VirtualBox Guest Additions                    [  OK  ]
Installing the Window System drivers
Could not find the X.Org or XFree86 Window System, skipping.
```

うまくいきました。
Slack API を使いチームへの招待作業を自動化する


# はじめに
## Slack とは ?

![Slack](https://qiita-image-store.s3.amazonaws.com/0/51394/8abba2aa-5c15-dd1e-9da2-8c967601f319.png)

[Slack](https://slack.com/) はチームで使うチャットサービスの一つです。同じようなサービスに、[HitChat](https://www.atlassian.com/ja/software/hipchat) や [ChatWork](http://www.chatwork.com/ja/) があります。

- [国内外のベンチャーで大ブレイク中！社内チャットの「Slack」を徹底解説！](http://blog.nanapi.co.jp/marketing/slack/)


## Slack チームへの参加方法は 2 種類
Slack では以下の 2 種類の方法でチームに参加できます。

1. 新規メンバーから参加申請
2. 既存メンバーによる招待

![Team Settings](https://qiita-image-store.s3.amazonaws.com/0/51394/e715539d-464d-13e6-484b-ddb12a88a5fa.png)

しかし、『 1. 新規メンバーから参加申請 』 の方法では、**登録するメールアドレスのドメインを制限する必要**があります。

そのため、ドメインを持たないグループ (ユーザーズグループ、勉強会のグループ、など)  では 『 2. 既存メンバーによる招待 』 の方法を取らざるを得ません。この招待を自動化したい、というのがこの記事の主題です。


## Slack API について
Slack は [Slack API](https://api.slack.com/methods) として REST 形式の API が提供されています。チームへの招待も API が存在するのですが、公式の API 一覧には載っていません (非公式 API 扱いのようです)。

- [How I hacked Slack into a community platform with Typeform](https://levels.io/slack-typeform-auto-invite-sign-ups/)

コンソールから、以下のようにして呼び出せます。

```
$ curl -X POST 'https://TEAM.slack.com/api/users.admin.invite' \
--data 'email=EMAIL&token=TOKEN&set_active=true' \
--compressed
```

TEAM は、スラックのチーム名 (英数字) で、EMAIL に招待する人のメールアドレスが入ります。TOKEN は、[Slack Web API](https://api.slack.com/web#auth) のページから作成できます。


# API を利用して自動招待する

## 招待するプログラムを書く
POST リクエストを送るだけの簡単な処理なので、お好きな言語でプログラムを書けば終了です。
以下は、私が Crystal で作った自動招待プログラムの例です。

- [pine613/crystal-jp-slack-invite](https://github.com/pine613/crystal-jp-slack-invite)

![crystal-jp-slack-invite](https://qiita-image-store.s3.amazonaws.com/0/51394/e61c8608-7b72-9bcb-487a-bdac987da4b8.png)


## 既存のプロジェクトのコードを利用する
Node.js で書かれた汎用招待プログラムが GitHub 上で公開されています。これを利用すると、簡単に招待ページを作ることができます。

- [rauchg/slackin](https://github.com/rauchg/slackin)
- [outsideris/slack-invite-automation](https://github.com/outsideris/slack-invite-automation)

# まとめ
Slack API を使うと、チームへ招待するプログラムが作ることができます。Slack で快適なチャットライフを!
detectMultiScale()はRaspberryPi　B+ではなぜ遅いか

OpenCV+Pythonの組み合わせで人物検出器を動作させたときに、
クロック速度から予想される処理速度よりも、格段処理が遅いのを
Raspberry Pi B+で感じました。
その理由をメモします。

hog=cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
hogParams = {'winStride': (8, 8), 'padding': (32, 32), 'scale': 1.05}
human, r = hog.detectMultiScale(im, **hogParams)

detectMultiScale()というメソッドは、インテルのマルチコアのCPUでは複数のスレッドで検出処理をしているのです。
そのため、ARMのシングルコアのRaspberryPi B+では、複数のスレッドでは動作しないからです。

実際モジュールの方のhog.cppの記述をみると、以下のように画像のサイズごとに並列に検出処理しているのがわかります。
void HOGDescriptor::detectMultiScale(
    const Mat& img, vector<Rect>& foundLocations, vector<double>& foundWeights,
    double hitThreshold, Size winStride, Size padding,
    double scale0, double finalThreshold, bool useMeanshiftGrouping) const
{
//中略
    parallel_for_(Range(0, (int)levelScale.size()),
                 HOGInvoker(this, img, hitThreshold, winStride, padding, &levelScale[0], &allCandidates, &mtx, &tempWeights, &tempScales));
//後略
}

実際、Windowsの[タスクマネジャー]で[パフォーマンス]
で各コアの動作状況を見ていると、
 detectMultiScale()時には、複数のコアが動作しているのが見て取れます。
それに対し、detect()では、そのような動作はしていません。

これは、C++のときもPythonのときも同じです。

Intel Threading Building Blocks（TBB）を用いた実装なので
RaspberrｙPi2のクアッドコアでは、別のマルチスレッドの実装をしない限り
クアッドコアの恩恵にはあずかれなさそうです。


追記：
cv::parallel_for_
の使い方について追加した参考資料を参照してください。
cv::parallel_for_
 はIntel TBBが使えない環境では、別のフレームワークで、threadを管理するようです。
TBBでは、明示的にthreadの作成や終了を記述しないものとのことです。

追記：
[OpenCV　TBBによる並列処理](http://mibc.blog.fc2.com/blog-entry-113.html)に
TBBのインストール方法、OpenCVのCMake時の変更点が記されています。

[Threading Building Blocks](https://www.threadingbuildingblocks.org/download#stable-releases)
を入手してから、CMakeするのは必須ですね。


OpenCV備忘録
[Raspberry Pi 2でOpenCV 2.4.11をビルドした](http://iwaki2009.blogspot.jp/2015/03/raspberry-pi-2opencv-2411.html)
[Raspberry Pi 2 で OpenCV 2.4.10 をビルドした]
(http://iwaki2009.blogspot.jp/2015/02/raspberry-pi-2-opencv-2410.html)
によると、Raspberry Pi 2でTBBをソースからインストールできるようです。後者の記事ではCMakeの設定が書かれています。



**参考資料**
「TBBによる処理の並列化と高速化」
http://opencv.jp/opencv2-x-tips/opencv_performance_with_tbb

「cv::parallel_for_を使ってみる」https://github.com/atinfinity/lab/wiki/cv::parallel_for_%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B
nagiosプラグインのcheck_mysqlでConnection using olication protocol refused (client option 'secure_auth' enabled) d (pre-4.1.1) authent

nagiosを新サーバに移したらmysqlのチェックで次のエラーを吐くようになった。
Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled) 

CentOS7にして、MySQLをyumで入れたら5.6.25になって5.6.7以降の問題にぶつかったらしい(5.6.7以降はデフォルトでtrueになる)。


この問題を解決するには
①サーバ側にsecure_authを切る。
→　台数が多いので却下

②クライアントからの接続に --skip-secure-authをつける
これが望ましいかったので、nagiosプラグインのソースをいじることにした。

nagios-plugins-2.0.3/plugins/check_mysql.c
nagios-plugins-2.0.3/plugins/check_mysql_check.c

を修正。
普段は全くさわらないC言語なので簡単なこともなかなか時間がかかる。

connect一行前の140行目に下記を足す。
my_bool opt_secure_auth= FALSE;
mysql_options(&mysql,MYSQL_SECURE_AUTH, (char *) &opt_secure_auth);

コンパイルしたらうまく接続されるようになりました。