OmniAICreator/Qiita-1.07M huggingface dataset:
コマンドラインでフォルダ一覧を出す

拡張子.txtのファイル一覧取得

```
dir *.txt /s/b > file_list.txt
```

フォルダは以下のファイル一覧取得

```
dir /b /a-d /s > file_list.txt
```

dir でファイル・フォルダー名の一覧を取得
/b オプションでファイル・フォルダ名だけに絞り込み
/a-d オプションでフォルダを除外
/s オプションで下層フォルダも含めて取得
Play Python async


There are a few post about python asyncio introduced since Python 3.3. I played around and this is the note for myself. 

# Summary
I evaluated thread and coroutine and find out the fact that the performace does not have a huge difference. Though, async is faster a little.(delimiter: I tested them with a really simple model. I do not say this is the ground truth.) Perhaps, the advantage of coroutine is chaining using `yield from`, which is easy to write compared with using queue and thread

# Spec
- Python 3.5dev
- Mac OSX 10.10
- Memory DDR3 16GB
- CPU 2.3 GHz Intel Core i7

Python async module was introduced in 3.3. 

> I'm not trying to reinvent the wheel. I'm trying to build a good one. 

>Guido van Rossum


import asyncio

- Reference implementation for PEP-3156.
- Basic components for doing async i/o
- Works officially on Python >= 3.3


Goals

- Modern implementation of async i/o for Python
- Use yield from (PEP-380)
- Don't use anything that requires Python > 3.3
- Interoperabililty with  other frameworks
- Unix and Windows support
- IPv4 and IPv6
- TCP, UCP and pipes
- Basic SSL
- Subporcess

Non goals

- Perfection
- Replacing current framwork
- Protocol implementations
- Replace http, smtplib, ...
- Make it work on Python < 3.3


Coroutine, Futures and Tasks

Coroutines
 - generator function, can receive values
 - decorated with `@coroutine`
Future
 - promise of a result or an error
Task
 - Future which runs a coroutine


# Thread vs Coroutine


```python
import time
import asyncio
import threading
import numpy as np


def fib(n):
    if n in (1, 2):
        return 1
    return fib(n - 1) + fib(n - 2)

@asyncio.coroutine
def co_fib(n):
    if n in (1, 2):
        return 1
    return fib(n - 1) + fib(n - 2)

def coroutine_test(n):
    tasks = [asyncio.ensure_future(co_fib(20)) for _ in range(n)]
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(tasks))

def thread_test(n):
    threads = [threading.Thread(target=fib, args=(20,)) for _ in range(n)]
    for thread in threads:
        thread.start()

    for thread in threads:
        thread.join()

def evaluate(n, m):
    r = []
    print("thread start")
    for _ in range(n):
        s = time.time()
        thread_test(m)
        process_time = time.time() - s
        r.append(process_time)
    print("thread average: ", np.average(r), " secs")
    print("thread distribution: ", np.var(r))

    r = []
    print("coroutine start")
    for _ in range(n):
        s = time.time()
        coroutine_test(m)
        process_time = time.time() - s
        r.append(process_time)
    print("coroutine average: ", np.average(r), " secs")
    print("coroutine distribution: ", np.var(r))


if __name__ == "__main__":
    evaluate(100, 1000)


```

## Result

```
thread start
thread average:  2.26430218458  secs
thread distribution:  0.000516381104439
coroutine start
coroutine average:  2.17451543093  secs
coroutine distribution:  0.00377455202351
```


reference

http://www.slideshare.net/saghul/asyncio
Electron と Mithril でソースリーディングを助けるアプリをつくってみた


CoffeeScript, Electron, Mithril でソースリーディングを助けるソフトウェアをつくってみました。よかったら使ってみてください。

ページ [SourceR - ソースリーディングを助けるソフトウェア](http://hakomo.github.io/sourcer)
ソース [hakomo/SourceR · GitHub](https://github.com/hakomo/SourceR)

# 概要

巨大なフレームワークなどをメソッド単位までツリーで表示し、読み終わったファイルやメソッドにタグをつけたりメモを書いたりして進捗をグラフィカルに確認することができます。

![a.png](https://qiita-image-store.s3.amazonaws.com/0/19593/43a25e5a-ddae-6c75-b300-630b7a730117.png)

# つくった理由

とあるフレームワークを読んでいたんですが、読めども読めども読み終わらなくてつらい。「よっしゃー今日も読むぞー！」って気分にさせてくれるものが欲しくなった。

あと、他人のソース読んだほうがいいよ、勉強になるよっていうけれど読みかたって体系化されてないし、支援ツール的なものもないから何かつくってみようと思った。

# 技術的なはなし

## Exuberant Ctags

メソッドの列挙には Exuberant Ctags を使っています。 Exuberant Ctags はプロジェクト内のシンボル一覧とその位置をファイルに書きだしてくれるもので、テキストエディタでシンボルにジャンプするときに使われます。本来メソッドの列挙に使われるものではないと思いますが、多数の言語に対応していて高速かつ他に手頃なものがなかったので使うことにしました。

## Electron

ネイティブアプリは私がリッチな GUI 組めないし、 Web アプリはアップロードとかソースの解析とかが重く向いていないので Electron にしました。

ほとんど Web と Node.js の知識で書けてしまうので Electron について覚えることはメニューとダイアログと環境構築くらいでした。

## Mithril

興味があったのと、複雑になりそうなロジックをシンプルに書き下せそうだったので仮想 DOM を使っています。ただ、これが完成する前に大きなライブラリを読みたくなかったのでソースが短い Mithril にしました。

## 高速化

フレームワークによっては総メソッド数が数千とか数万とかいくので DOM 数も数万いきます。これを馬鹿正直に描画するとめっちゃ重いので高速化をしています。

**生 DOM の生成を遅延**
見えている生 DOM だけ生成して、折りたたまれるなどして隠れている生 DOM の生成は遅延（見えるようになったら初めて生成）します。

**仮想 DOM の差分計算を局所化**
一般的なサイトの DOM 数なら仮想 DOM の差分計算は一瞬で終わりますが、 DOM 数が数万となるとそうもいきません。何かするたびに数秒待たされたくはありませんのでツリーの変更された部分にだけ差分計算をします。

上記の高速化を施した view を簡略化したソースです。

```js
function view(ctrl) {
    var changedDescendant = false,
        model = ctrl.model,
        visibleChild = !model.filtered() && model.children.length && !model.folded(),
        views = [];

    if (visibleChild) {
        for (var i = 0; i < model.children.length; ++i) {
            var v = model.children[i].view();
            changedDescendant = changedDescendant || v.subtree != 'retain';
            views.push(v);
        }

    } else {
        for (var i = 0; i < model.children.length; ++i)
            views.push({ subtree: 'retain' });
    }

    if (model.changedVirtualDom() || changedDescendant) {
        model.changedVirtualDom(false);

        return virtualDom;
    }
    return { subtree: 'retain' };
```

view が { subtree: 'retain' } を返すとその子孫の仮想 DOM は変更なしとみなされ差分計算は省略されます。

それを利用して、見えない DOM は { subtree: 'retain' } を返すことで生 DOM がなければないまま、生成されていればあるままになり、生 DOM の生成を遅延させています。 DOM が見えるかどうかはモデルから生えている見えるかどうかに影響するプロパティを元に判断します。ここでは filterd（フィルター）, folded（折りたたみ）を参照しています。

また、モデルに changedVirtualDom（仮想 DOM が変更されているか）プロパティを生やし、仮想 DOM が変更されるようなモデルの変更時に一緒に true にします。 view はこのプロパティが false な部分に { subtree: 'retain' } を返すことで差分計算を局所化しています。そして changedVirtualDom プロパティは他のプロパティの setter 時に自動で true になるよう差し込むため間違えたり忘れないようにしています。

やたら複雑になってしまいましたが view と setter さえ気をつけて実装すればあとはどう書いても壊れないので、 jQuery などで常に気を張りながら書くよりはかなり楽になりました。

# まとめ

Electron, Mithril でリッチな GUI のデスクトップアプリを楽に書けたし、パフォーマンス的な意味でネイティブでやれって内容でも意外と何とかなった。
マルチスレッド手法GCD(Grand Central Dispatch)

#マルチスレッドによる並列処理についてしらべました。#

通信処理などを行う際などにアプリで平行して別の処理をしたい場合にマルチスレッド化が必要になってきます。メインスレッドですべての処理をおこなうと一つずつ実行していくため、ある処理に時間がかかると他のアクションへの反応ができずに固まった状態に陥ってしまいます。

同時に並列して処理を行うためには別スレッドを用意し、それに処理を追加して順番に実行していくという方法をとります。

タスクを非同期に実行する技術のひとつとして、Grand CentralDispatch（GCD）が用いられます。
**dispatch queue**といい、タスクを追加していくと順番に処理を行っていきます。

主に２つの関数があります。
・dispatch_async・・・非同期実行
・dispatch_sync・・・同期実行



```swift
func performSlowCalculationAsynchronously(someString: String, anotherInt: Int, completionHandler: (result: Int) -> ()) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
        let result = self.performSlowCalculation(someString, anotherInt: anotherInt)

        completionHandler(result: result)
    }
}
```
EC2のインスタンスをコピーした後のお話

現在稼働している使っているサーバを増やす（移行する）手順とその後

１．やりざまとしては動いているインスタンスからAMIを作成
　（ホントはインスタンスをSTOPしてからの方がよいそうなのだけど、動いたままでもできました。）
２．「１」で作成したAMIから新しいインスタンスを立ち上げ
でおしまい。

↑については　↓のリンクを参考にしました。
http://qiita.com/murachi1208/items/8be3cd006d31f1f81ee4

で、この後、元のインスタンスを止めるとか、その辺は問題なかったのですが

新しいインスタンスを作成した後の AMI と その際にできた スナップショット 。。。
これをどうするべきなのか。（以降使わないことが前提）

結論
　１．AMI を削除（登録解除）する。
　　AMIの名前は控えておくこと。「２」で削除するスナップショットの検索するときの手立てになるので。
　２．スナップショットを削除する。

AMI、スナップショットを削除しても コピー元にも
コピーしたインスタンスにも迷惑かからないので不要なら削除してOK。

いまいちaws理解できていないせいで分かっていないのですが。
何がどこまで影響するか分からなくて怖いんですよね。。。
初期パスワードを大量に生成する方法


8文字のパスワードを100個生成する場合は以下のコマンドになる。

````
cat /dev/urandom |tr -dc[:alnum:]|head -c 800|fold -w 8
````
※ linuxを想定しています。BSD系ではコマンドの挙動が違うかもしれません。
※ 左のコマンドから順にパイプでつなげていって出力を見れば、下の解説いらないかも。

# 解説

## 乱数生成
````
cat /dev/urandom
````

* /dev/urandomは乱数を生成する仮想デバイス
* 参考：https://ja.wikipedia.org/wiki//dev/random

## 英数字以外を削除
````
tr -dc [:alnum:]
````

* [:alnum:]は英数字[0-9A-Za-z]を意味する正規表現
* -d は削除
* -cを入れるとスペースのあとで表現したものの補集合がtrコマンドの対象となる。ゆえに、-c [:alnum:] で英数字以外のものがtrコマンドの対象となる。
* -dc [:alnum:]で「英数字以外の文字列を削除」という意味。

## 最初の800文字を抽出
````
head -c 800
````

* head -c n で最初のn文字を表示
* 8文字×100で800とした。

## 8文字づつ改行

````
fold -w 8
````

* fold -w n でn文字ずつ改行
* 10文字のパスワードにしたい場合は fold -w 10
arduinoでrfid

千石で購入した、rfr101a1mをarduino unoにつないで見ました。
##写真
![MVC-006S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/58101f37-ca2d-c01a-6a3c-cf7264efb5e2.jpeg)
##回路図
![rfid.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/cd29180c-13ca-e574-b0f2-547eb0453423.png)
##サンプルコード
```
void setup()
{
	Serial.begin(9600);
	while (!Serial)
	{
		;
	}
	pinMode(13, OUTPUT);
	digitalWrite(13, LOW);
}
void loop()
{
	if (Serial.available())
	{
		if (Serial.find("0B0065E2C549"))
		{
			pinMode(13, OUTPUT);
			digitalWrite(13, HIGH);
		}
		else
		{
			digitalWrite(13, LOW);
		}
	}
}

```
Python IDLE のカスタムテーマの作成と変更について

[Python IDLE を少しだけ使いやすくする](http://aikotobaha.blogspot.jp/2011/12/python-idle.html)を参考にした.

1. ホームディレクトリにある ~/.idlerc/config-highlight.cfg に書いて保存
2. IDLEの環境設定で, Highlighting の Highlighting Theme から選び,設定

他のテーマは,Gistで "config-highlight.cfg" を検索しても良いと思う.
お手軽な端末時間を進めるチートの対策

# 対象の方

- cocos2d-xを用いて開発をしている
- 時間管理を伴うゲーム開発をしている
- サーバプログラムは書きたくない
- そんなに厳密でなくて良い

# 手順

下記のリポジトリからファイルをコピーして自分のプロジェクトに取り込んでよしなに使う
(cocos2d-x v2.X系のコードになっているので適宜書き換えて使って頂ければ)

https://github.com/akehoyayoi/ntp_checker

下記は画面遷移時にボーナスを付与する使用例(仮に画面をSampleSceneとしてます)

```lang:SampleScene.h
#include "NtpChecker.h"

class SampleScene 
: public CCLayer
〜略〜
void bonus(NtpResult result); // コールバック関数の定義
};

```

```lang:SampleScene.cpp

void SampleScene::onEnter()
{
〜略〜
    // 時間があっているかチェックする
    NtpChecker::sharedInstance()->check(this, ntpchecker_selector(SampleScene::bonus));
}

void SampleScene::bonus(NtpResult result)
{
    switch(result) {
        case NtpResult::OK:
            // TODO:ここにボーナス付与の処理を書く
        case NtpResult::NG:
            // チートしてる可能性あり、懲らしめたい人はなんかやって下さい
        case NtpResult::Unknown:
        default:
            // 通信途絶など
    }
}

```

# 仕組み

ボーナス付与時に標準時刻と端末の時間を照らし合わせて合っていればボーナスあげるよ、という仕組みになっています、端末時間がずれていればチートの可能性が高いことにしています
最近はデフォルトで端末は標準時刻に合わせるようになっていますしよほどのことがない限りは端末時間がずれるということはありません(海外旅行とか行くとずれますけどね)
詳しい仕組みについては[こちらの記事](http://qiita.com/kazu0620/items/64ed22b42649c6ef6ce4)をご参照下さい

上記の記事でより厳密に対応されているのですが、下記のモチベーションでちょっと調べてました

- iOSしか対応してない、Androidも対応したい
- 依存ライブラリがあるからなくしたい

iOS,Android両対応するためにすべてC++で書きたかったのですが、自分の技術力ではどうにもUDP通信がダルくて色々調べたところ、HTTPで時間が[ここ](http://www.nict.go.jp/JST/http.html)から取得できることが分かったので書いてみました
HTTPであればcocos2d-xの機能を使えば実現できます

NICTのレスポンスがHTMLだったのでそれを適当にパースして合わせてます。割と長いこと運用されているみたいなのでそんなにフォーマット変わるものでもなさそうなので、まあいいかなーというどんぶり感で作ってます。
c++ > クラス内でstatic const [ ]宣言できない

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

String型の配列をconstで持とうとしたら以下のエラーがでた。

```cpp
class myClass {
private:
   static const String errorLevels[4] = {
     L"High", L"Middle", L"Low", L"Debug"
   };
};
```

```
E2233 クラスメンバ変数を初期化できない
```

どうも以下と関係あるようだ
http://www.cplusplus.com/forum/beginner/44486/

> You can only define static const integral values (i.e. short, int, long, bool, char, instance of an enum) within a struct. You can't declare static const arrays of integral values within a struct, unfortunately.
...
>Since your array is so short, you might consider doing this:

```cpp
struct A{
   static const int m1 = 1;
   static const int m2 = 3;
   static const int m3 = 5;
};
```

配列でないのが拡張性に問題あり。

.cppで持たせることにした。
.hにconstを持つのは、API使用者に開示したい場合かもしれない。今回の場合は、別に開示したい情報でもない。

### 関連

[cpp > クラス内での静的定数の宣言 > class MyAPI { public: static const int MAX_NAME_LENGTH; ...](https://qiita.com/7of9/items/356ce79685ea2230d899)
Zshでhsenv.shを自動activate / deactivate

[この記事](http://qiita.com/saturday06/items/3b67861b8ebcadeb01cd)にはbash版しか載っていなかったのでzsh版を作った。

```zsh:auto-hsenv
local search_dir=$PWD
while [[ "${search_dir}" != "/" ]]
do
    local hsenv_dir=""
    for dir in $(find ${search_dir} -maxdepth 1 -type d -name '.hsenv*')
    do
        if [[ -n "${HSENV}" && -e ${dir}/bin/activate ]]; then
            return
        elif [[ -z "${HSENV}" && -n "${hsenv_dir}" ]]; then
            echo "multiple environments in ${search_dir}."
            echo "activate manually"
            return
        elif [[ -z "${HSENV}" && -e ${dir}/bin/activate ]]; then
            hsenv_dir=${dir}
        fi
    done
    if [[ -z "${HSENV}" && -n "${hsenv_dir}" ]]; then
        source ${hsenv_dir}/bin/activate
        return
    fi
    search_dir=${search_dir}/..
    search_dir=${search_dir:a}
done
[[ -n "$HSENV" && "${search_dir}" == "/" ]] && deactivate_hsenv
```

これを `FPATH` の通った所に保存して `.zshrc` に以下のように追記すればOK。

```zsh
autoload -Uz auto_hsenv && add-zsh-hook precmd auto_hsenv
```
VMWare FusionでサブネットとIPアドレス設定


サーバ環境のテストなどではDHCPで振られるネットワークやIPアドレスを制御、固定したい場合があります。その際の設定です。
今回は、VMWare Fusion 8を利用しましたが、5,6,7でも同じだと思います。

##やりたいこと

* subnetの変更
* IPの固定

##設定する

###サブネットの変更

サブネットを編集するには、

```bash
/Library/Preferences/VMware\ Fusion/networking
```
を編集します。

>/Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.confを直接変更しないほうがいいです。

```
answer VNET_1_DHCP yes
answer VNET_1_DHCP_CFG_HASH C82570C8B6D29562281FAF07FD006E4F515D527F
answer VNET_1_HOSTONLY_NETMASK 255.255.255.0
answer VNET_1_HOSTONLY_SUBNET 192.168.210.0
answer VNET_1_VIRTUAL_ADAPTER yes
answer VNET_8_DHCP yes
answer VNET_8_DHCP_CFG_HASH CD0C70DE79271529B48EEADE47F56F2862AF18D3
answer VNET_8_HOSTONLY_NETMASK 255.255.255.0
answer VNET_8_HOSTONLY_SUBNET 172.16.149.0
answer VNET_8_NAT yes
answer VNET_8_VIRTUAL_ADAPTER yes
```
Fusionには、v(m)net1とv(m)net8があり、vnet1がホストとゲストをつなぐネットワーク。v(m)net8が物理ネットワークとつなぐもの。
なので、基本v(m)net8を編集します。

```diff
-answer VNET_8_HOSTONLY_SUBNET 172.16.149.0
+answer VNET_8_HOSTONLY_SUBNET 192.168.77.0
```
の部分をお好みで編集します。ここでは、覚えやすく192.168.77.0としました。
もちろんMASKを変えてもいいです。

ここでVMWare Fusion自体を再起動して、仮想マシンが既にある場合は、仮想マシンも再起動した状態で、ふられているIPアドレスが変更されているか確認します。

###IPアドレスの固定

IPアドレスを固定するには、/Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.confを編集します。
当該ファイルは、見えない場合がありますが、その場合にも、


```bash
vi /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf
```
とすると編集できます。

####固定したいInterfaceのMacアドレスを調べる
固定したいInterfaceのMacアドレスをifconfig(HWaddr)が、VMWare Fusionのネットワーク->詳細情報等から取得しておきます。

####dhcpd.confの編集

vi等で開くと、

```
allow unknown-clients;
default-lease-time 1800;                # default is 30 minutes
max-lease-time 7200;                    # default is 2 hours

subnet 192.168.77.0 netmask 255.255.255.0 {
    range 192.168.77.128 192.168.77.254;
    option broadcast-address 192.168.77.255;
    option domain-name-servers 192.168.77.2;
    option domain-name localdomain;
    default-lease-time 1800;                # default is 30 minutes
    max-lease-time 7200;                    # default is 2 hours
    option netbios-name-servers 192.168.77.2;
    option routers 192.168.77.2;
}
host vmnet8 {
    hardware ethernet 00:50:56:C0:00:08;
    fixed-address 192.168.77.1;
    option domain-name-servers 0.0.0.0;
    option domain-name "";
    option routers 0.0.0.0;
}
####### VMNET DHCP Configuration. End of "DO NOT MODIFY SECTION" #######
```

こんな感じになっています。nat.confの方で変えた設定にもとづき、192.168.77.xベースで設定ファイルが再生成されています。
このファイルの、

```
####### VMNET DHCP Configuration. End of "DO NOT MODIFY SECTION" #######
```
以降に、IP固定用の記述をします。

```
host host1 {
    hardware ethernet 00:0C:29:C0:E5:2D;:
    fixed-address 192.168.77.100;
} 
```
host1は、他と区別できれば何度もかまわないようです。複数のマシンがある場合は、この設定をホスト毎に作成します。
設定完了後、VMWare Fusionを再起動し、かつ、VMを再起動すればMacアドレスに特定のIPがふられるようになります。

>DHCPのRange以外のipであれば、上記の設定をせず、OS側のIP設定でIPを固定しても大丈夫です。

以上です。
OWASP関連リンク集

##要件定義
- Webシステム/Webアプリケーションセキュリティ案件書

##設計・開発
- owasp proactive controls: https://www.owasp.org/index.php/OWASP_Proactive_Controls
- owasp asvs: https://www.owasp.org/index.php/Category:OWASP_Application_Security_Verification_Standard_Project
- owasp cheat sheet series: https://www.owasp.org/index.php/OWASP_Cheat_Sheet_Series

##テスト
- owasp zed attack proxy: https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project
- owasp testing guide: https://www.owasp.org/index.php/OWASP_Testing_Project
- owasp owtf: https://www.owasp.org/index.php/OWASP_OWTF

##運用・保守
- owasp modsecurity core rule set project: https://www.owasp.org/index.php/Category:OWASP_ModSecurity_Core_Rule_Set_Project
- owasp appsensor: https://www.owasp.org/index.php/OWASP_AppSensor_Project
- owasp dependency check: https://www.owasp.org/index.php/OWASP_Dependency_Check

##その他
- owasp top10 / mobile top10 / IoT top 10: https://www.owasp.org/index.php/OWASP_Internet_of_Things_Top_Ten_Project
- owasp snakes and ladders (game)
- opensamm (software assurance maturity model): http://www.opensamm.org

##Books or webpages:
- OWASP v.2013 (Locallized in Japanese)
- OWASP IoT Top10
小技:PhpStorm で横スクロールしたい時は Shift + 上下スクロール

タイトルのままですが、

`Shift + 上下スクロール` で横スクロールします。

最近まで知りませんでした…

mac の PhpStorm 9.0.2 で確認してますが、たぶん windows 版でも同じはず。

間違ってたらすみません。
electronとnw.jsの技術的な違い

electoronもnw.jsもjsでデスクトップ・アプリを作るための環境である。どちらがいいのかなと思うけどもそれよりも技術的な相違ってどうなの？ぼんやりと思っていた。

electoronの「[Technical differences to NW.js (formerly node-webkit)](https://github.com/atom/electron/blob/master/docs/development/atom-shell-vs-node-webkit.md)」にそのことが書いてあったので、それを比較表的にまとめてみた。

|       項目    | electron | nw.js |
|:---------------------:|:------------:|:------------------------------:|
| 目的 | デスクトップアプリを作る。|デスクトップアプリを作る。|
| エントリポイント| jsファイル|htmlページ|
| ビルドシステム|libchromiumcontentを利用。<br/>共有ライブラリなのでelectronのビルドには含まれない。| Chromiumを内包。<br/>Chromiumのビルドも必要。 |
| Nodeとの統合|Chromiumにパッチしない方法。|Chromiumにパッチ。|
|マルチコンテキスト|WebPage中に新たなコンテキスト導入はない。<br/>Nodeのマルチコンテキスト機能を使用。|NodeコンテキストとWebコンテキスト。<br/>開発者はコンテキストを意識してプログラミング。|

electronはChromiumとは疎に保っているのですな。そしてよりnode.jsライクにプログラミングできるようになっていると。electron使ってみようかな。
function(){}();はなぜダメなのか、少し掘り下げてみる。

グローバル汚染を防ぐために

```js:例
(function(){
   // code ... 
})();
```
で囲むけど、これのバリエーションっていろいろある。

```js:バリエーション
// + を使う
+function(){
  // code ...
}();

// - を使う
-function(){
  // code ...
}();

// ! を使う
!function(){
  // code ...
}();

// void を使う

void function()
{
  // code ...
}();

```

ただこれはだめ。

```js:ダメ
function(){
  // code ...
}();

// nodeだと「SyntaxError: Unexpected token (」となる

```

これはなぜダメなのかというと、このfunctionは「文」として、例とバリエーションは「式」としてみなされるからだそうだ。このあたり、仕様書を見て少し掘り下げてみることにする。

「[ECMA2015](http://www.ecma-international.org/ecma-262/6.0/#sec-function-definitions)」の「14.1 Function Definitions」を見ると、

<blockquote><pre>
14.1 Function Definitions

Syntax

FunctionDeclaration[Yield, Default] :
  function BindingIdentifier[?Yield] ( FormalParameters ) { FunctionBody }
  [+Default] function ( FormalParameters ) { FunctionBody }
FunctionExpression :
  function BindingIdentifieropt ( FormalParameters ) { FunctionBody }
.
.
.
</pre>
</blockquote>

functionは「FunctionDeclaration（function宣言）」と「FunctionExpression（function式）」の2種類ある。あ、「文」と「式」じゃなくて「宣言」と「式」なのか。で、「function式」として解釈されると例やバリエーションのように使えるのである。でもダメな例は「function式」に適合している。なぜだめなのか。それは「[Expression Statement(式文)](http://www.ecma-international.org/ecma-262/6.0/#sec-expression-statement)」に書いてある。

<blockquote><pre>
an ExpressionStatement cannot start with the function or class keywords because that would make it ambiguous with a FunctionDeclaration, a GeneratorDeclaration, or a ClassDeclaration.
</pre>
</blockquote>

「式」としてみなされるためにはfunctionを文頭におけないルールになっているのである。なぜこうなっているのかというと「function宣言」と紛らわしいから。文頭に`function`を置くと「function宣言」とみなされる。

しかしなぜ「function宣言」だとダメで、「function式」で解釈されれば良いのかという疑問は残る。

これはJSの言語仕様上「FunctionDeclaration（function宣言）」と「FunctionExpression（function式）」の実行時評価に違いがあるからのようだ。（「のようだ」と書いたのは仕様書の解釈に少し自信がないため）

[14.1.20 Runtime Semantics: Evaluation](http://www.ecma-international.org/ecma-262/6.0/#sec-function-definitions-runtime-semantics-evaluation)の項を読むと、「function宣言」の戻り値は「empty」である。

<blockquote>
<pre>
FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody }
 1. Return NormalCompletion(empty).
NOTE 1 An alternative semantics is provided in B.3.3.

FunctionDeclaration : function ( FormalParameters ) { FunctionBody }
 1. Return NormalCompletion(empty).
</pre>
</blockquote>
そして「function式の戻り値」は「closure」となっている。「closure」はFunctionオブジェクトである。
<blockquote><pre>FunctionExpression : function ( FormalParameters ) { FunctionBody }
 1.If the function code for FunctionExpression is strict mode code, let strict be true.otherwise let strict be false.
 2.Let scope be the LexicalEnvironment of the running execution context.
 3.Let closure be FunctionCreate(Normal, FormalParameters, FunctionBody, scope, strict).
 4. Perform MakeConstructor(closure).
 5. Return closure.
 </pre></blockquote>

つまり「function宣言」では「empty（空）」が返るので`()`をつけるとNGであり、function式の戻り値はFunctionオブジェクトなので`()`を付けてもOKなのである。

まとめると、

1. ECMA Script 2015 の言語仕様により、文頭が`function`で始まる文は、「function宣言」になり、実行時評価後の戻り値が「empty」となるため、`()`を付加すると文法エラーとなる。
2. 「式（式文）」の途中に「function」が始まる場合は「function式」となる。「function式」の評価後の戻り値は「Functionオブジェクト」のインスタンスとなる。そのため`()`を付与して即時に実行することができる。

ということかな？
arduinoでsdカード

秋月で購入した、sdカードをarduino unoにつないで見ました。
##写真
![MVC-005S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/c0a07bca-1eb7-4622-314f-b33692a13b36.jpeg)

##回路図
![sd.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/60913362-b7c9-72da-3c7d-3d0fffb697c8.png)

##ハイパーターミナル
![sd0.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/c680a003-68a3-9ed1-5433-f6b572109d8a.png)

##サンプルコード
```
#include <SPI.h>
#include <SD.h>

File myFile;
void setup()
{
	Serial.begin(9600);
	while (!Serial)
	{
		;
	}
	Serial.print("Initializing SD card...");
	if (!SD.begin(4))
	{
		Serial.println("initialization failed!");
		return;
	}
	Serial.println("initialization done.");
	myFile = SD.open("test.txt", FILE_WRITE);
	if (myFile)
	{
		Serial.print("Writing to test.txt...");
		myFile.println("testing 1, 2, 3.");
		myFile.close();
		Serial.println("done.");
	}
	else
	{
		Serial.println("error opening test.txt");
	}
	myFile = SD.open("test.txt");
	if (myFile)
	{
		Serial.println("test.txt:");
		while (myFile.available())
		{
			Serial.write(myFile.read());
		}
		myFile.close();
	}
	else
	{
		Serial.println("error opening test.txt");
	}
}
void loop()
{

}

```
network / shell > 日時付きのping > ping www.google.fr | while read pong; do echo "$(date): $pong"; done

```txt:動作確認
MacOS X 10.8.5 のターミナル
(linuxでも動くでしょう)
```

日時付きのpingをしたい。

以下にやり方があった。
http://askubuntu.com/questions/137233/how-to-command-ping-display-time-and-date-of-ping

```
ping www.google.fr | while read pong; do echo "$(date): $pong"; done
```

毎回上記を入力するのは面倒なので、エイリアスを作るのがいいかもしれない。
技術英語 > tweaks > ちょっと手を加える

http://d.hatena.ne.jp/iteigo/20070210

> 「改変、改造」というとcustomizeという言葉がありますが、「手を加える」という意味でtweakがよく使われます。
> We need to tweak the code so it can handle Unicode.（Unicodeに対応するように、コードをちょっと手直ししないとね）

ある人のcommitを見ていてコミットメッセージに tweaks for XXX という記載があったので、調べてみた。

「XXXのための手直し」という意味なのだろう。

<hr>
https://github.com/wesbos/cobalt2
> Tweaked and refined Sublime Text theme based on the original cobalt.
Apache2 Debian conf どこになにを置けばいいのか

背景：　
apache2を触ることになったんですが、confフォルダがたくさんあり、
confをどう配置するのが正しいのかを調べてみました。(なぜavailableとenabledに分かれているのか)

#まとめ　(TL;DR)
設定をコメントアウトしたり、バックアップをとって削除したりは面倒なので、
設定はavailable置き、a2en---コマンドで適用、a2dis---で解除する方がベターだと思います。

#基本情報
基本的に、　/etc/apache2/apache2.conf　の意訳となります。

まず初めにDocumentのTopに、

>Apache 2 installation　は、
モジュール、バーチャルホスト、個人的な設定の追加、削除がフレキシブルに行えるようにする試みを行いました。

とあります。

これはどういうことかと言うと、RedHat系のapacheの設定ファイルはhttpd.confに書いてあるのですが、
これでは1つのconfファイルをいじるので、設定変更の際の切り替えが面倒ということです。

ですので、Debian apache2 では、
apache2.confが入っているroot, そして　available - enableというフォルダが、conf, sites modsに個々に用意されています。

mods, conf, sites の違いは下記URLを参照ください。
参考URL：[http://www.linux.net-japan.info/](http://www.linux.net-japan.info/install08.html)

#なぜフォルダが２つあるのか(available, enabled)
結論からいうと、**使う設定ファイルと、使わない設定ファイルを分けるためです。**
availableはconfを保存しておくためのフォルダで、ここにたくさんファイルを置いても設定に反映されません。
こうするとなにがうれしいかというと、実はapacheのコマンドでこの設定ファイルを適用、非適用することが簡単にできることです。
コマンドは以下になります。

```
a2ensite filename :sites-avalableの中に入っている filename.conf の設定を適用します。 
a2dissite　filename :sites-enableの中に入っている filename.conf の設定を削除します。

a2enmod filename :mods-avalableの中に入っている filename.conf の設定を適用します。 
a2dismod filename :mods-enableの中に入っている filename.conf の設定を削除します。

a2enconf filename :conf-avalableの中に入っている filename.conf の設定を適用します。 
※filename.loadに　LoadModule ... の１文を記載し、残りの<IfModule> 〜を .confに書きます。
a2disconf filename :conf-enableの中に入っている filename.conf の設定を削除します。
```
a2 が apache2を指していて、 en = enable, dis = disable だと思われます。
# How does it work? (どうやって動いているのか？

apache2.confがロードしている内容は以下のとおり

```/etc/apache2/apache2.conf
#       /etc/apache2/
#       |-- apache2.conf
#       |       `--  ports.conf
#       |-- mods-enabled
#       |       |-- *.load
#       |       `-- *.conf
#       |-- conf-enabled
#       |       `-- *.conf
#       `-- sites-enabled
#               `-- *.conf
```
実は /etc/apache2/apache2.confを最後まで読んでみると、141、216、219行目で（vim だと :set nu で行数がでます。）
`IncludeOptional ***-enabled/*.conf　(***　= mods, sites, conf)　`となっています。
本来ならば、apache2.confしか呼ばれないのですが、ここで各 enableフォルダの.confをincludeしています。
ここで勘の良い方は、分かると思うのですが、読み込ませたいconfはenableフォルダに置けばロードされます。
では上記のコマンドで何をやっているかというと、
**a2en---とやることで指定したavailableのconfファイルのシンボリックリンクがenabledフォルダに作成されます。**
**a2dis---でenabledからリンクが削除されます。**
そうやって、enabledにできたconfファイルがapache2.confから呼ばれるわけです。
jQueryで使える配列系便利関数

「使用できるライブラリはすでに入れてあるjQueryだけです、他のライブラリは一切使用できません」とかいう~~ふざけた~~プロジェクトでUnderscore.js/lodashが使えなくてつらいのでなんとか配列などをいい感じに扱える便利関数がないのか調べてみたらあったのでそれのメモです。

## [`$.unique`](http://api.jquery.com/jQuery.unique/)

配列内の重複した値を削除してくれる。

```js
$.unique([1, 2, 3, 4, 3, 2, 1, 2, 3, 4]);
// => [1, 2, 3, 4]
```

破壊的な関数らしく、配列を変数に入れて引数に渡すと引数の配列の中身が戻り値と同じになっている。

引数は一つしか受け取れないみたいだ。

jQuery 3.0で非推奨になったらしく、代わりに[`$.uniqueSort`](http://api.jquery.com/jQuery.uniqueSort/)を使用するように、と書いてある。

## [`$.merge`](http://api.jquery.com/jQuery.merge/)

引数に渡された二つの配列を連結する。

```js
$.merge([1, 2, 3], [2, 3, 4, 5]);
// => [1, 2, 3, 2, 3, 4, 5]
```

この関数も破壊的な関数なので最初の引数の配列が変更される。

引数は二つしか受け取れない。

## [`$.extend`](http://api.jquery.com/jQuery.extend/)

引数に渡されたオブジェクトをマージする。

```js
$.extend({ a: 1, b: 2 }, { b: 3 }, { a: 3, c: 4 });
// => { a: 3, b: 3, c: 4 }
```

最初の引数に`true`を渡すとオブジェクト内を再帰的にコピーしてくれるようになる。

引数はいくつでも受け取れる。

## [`$.grep`](http://api.jquery.com/jQuery.grep/)

コンパレータ関数（という呼び方でいいのか？）で`true`が返された値だけ配列に入れて返す。`Array.prototype.filter`と同じ感じ。

```js
$.grep([1, 2, 3, 4, 5, 6], function(value, index) {
  return (value % 2 === 0);
});
// => [2, 4, 6]
```

三番目の引数として`true`を渡すと条件が反対になる。つまり、上記のコードの第三引数に`true`を加えると戻り値は`[1, 3, 5]`になる。

## [`$.inArray`](http://api.jquery.com/jQuery.inArray/)

配列内から目的の値の位置を返す。`Array.prototype.indexOf`と同じ感じ。

```js
$.inArray(3, [1, 2, 3, 4, 5]);
// => 2
```

三番目の引数として、検索を開始するインデックスを渡せる。

## [`$.map`](http://api.jquery.com/jQuery.map/)

配列を渡す場合は`Array.prototype.map`と同じ感じ。オブジェクトも渡せる。

```js
$.map([1, 2, 3], function(value, index) {
  return value * 2;
});
// => [2, 4, 6]
```

```js
$.map({ a: 1, b: 2, c: 3 }, function(value, key) {
  return key;
});
// => ["a", "b", "c"]
```

## [`$.makeArray`](http://api.jquery.com/jQuery.makeArray/)

配列っぽいオブジェクトから配列を生成する。

```js
$.makeArray({ length: 2, 0: 1, 1: 2 });
// => [1, 2]
```

`getElementsByTagName`とか、`querySelectorAll`で取得したやつを渡したりするとヨサソウ( ˘ω˘)

## [`$.proxy`](http://api.jquery.com/jQuery.proxy/)

`Function::bind`の代わり。

---

Underscore.js/lodashを用いなくても配列に関しては意外とjQueryだけでどうにかなりそうな印象は得られたかも。

とはいえつらみだ( ˘ω˘)
inflateMenu で InflateException が発生して落ちる

かなりハマったのでメモしておきます。
こんなことでハマって時間をくうなんて…ぐううう！！！

## エラー内容

昔のプロジェクトをAndroidStudioにインポートしたときに
ToolbarにinflateMenuすると落ちていました。
 > android.view.InflateException: Binary XML file line #17: Error inflating class android.support.v7.internal.view.menu.ActionMenuItemView
 
原因はいくつかありました。

## 原因
**SupportライブラリのToolbarを利用しているにもかかわらず**
**AppCompatを使ったスタイルを指定していなかったことが問題でした。**




```xml:style.xml
<resources>
  <style name="CustomTheme.Light" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar">
      <!-- 割愛 -->
  </style>
</style>
```


下位互換を考えているクラスなので、利用方法に制限があるようです。
AndroidDeveloperのリファレンスを見ていなかった私が悪い…

昔の開発環境でビルドできていたのが仇となりました。

## 回避策
parentをTheme.AppCompat.Light.NoActionBarに変更します。

```xml:style.xml
<resources>
  <style name="CustomTheme.Light" parent="Theme.AppCompat.Light.NoActionBar">
      <!-- 割愛 -->
  </style>
</style>
```

##追加対応
一緒にある問題が発生していました。
それは、テーマで指定していたViewパーツ（チェックボックス等）の色指定が無効になっているというもの。

```xml:style.xml
<resources>
  <style name="CustomTheme.Light" parent="Theme.AppCompat.Light.NoActionBar">
    <!--   theme UI controls like checkboxes and text fields -->
    <item name="android:colorAccent">@color/liteBlue</item>
  </style>
</style>
```
と、これが効いていなかったのですが、
AppCompatのテーマを利用すると「android」がいらないようです。

```xml:style.xml
<resources>
  <style name="CustomTheme.Light" parent="Theme.AppCompat.Light.NoActionBar">
    <!--   theme UI controls like checkboxes and text fields -->
    <item name="colorAccent">@color/liteBlue</item>
  </style>
</style>
```
これにて解決。
他のprimaryColorなどもこれで解決するようです。

AndroidDeveloperにも書かれてますが、
下位互換を考える場合はバージョン毎にスタイル指定してやらないと
エラーが発生してしまう場合があるので注意が必要。

##参考

[AppCompatを使ったActionBar](http://teik.in/?p=47)
[AndroidDeveloper:Styling the Action Bar](https://developer.android.com/intl/ja/training/basics/actionbar/styling.html)
[捕捉情報：Viewのテーマが変わらん問題の解決フォーラム](http://stackoverflow.com/questions/26608390/android-v21-theme-appcompat-color-accent-is-ignored-no-padding-on-dialogs)
１つのイベントに複数のイベントリスナを登録してみよう

## はじめに

『独習JavaScript』第２版を読んでいます。１つのイベントに複数のイベントリスナを登録することができるというのがよく理解できなかったので、手を動かしながら学んでみました。

この記事では、使用したファイルを紹介します。index.htmlとapp.jsを同じディレクトリに置いて、index.htmlを開くと、つぎのようなものが表示されると思います。

![スクリーンショット 2015-08-29 1.20.01.png](https://qiita-image-store.s3.amazonaws.com/0/29884/8e182b78-912d-0faf-28ec-d1b43ed60ce7.png)

## ファイル

使用したファイルは２ファイルです。

- index.html
- app.js

index.htmlを見てみます。特に目新しいものはありません。

```index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
  <script src="app.js"></script>
</head>
<body>
  <div id="around" style="width: 100px; height: 100px; background-color: chocolate">
    <div id="hello" style="position: absolute; top: 25px; left: 25px; width: 50px; height: 50px; background-color: yellow">hello</div>
  </div>
</body>
</html>
```

つぎに、app.jsを見てみます。１つのイベントに複数のイベントリスナを登録しています。

```app.js
function assert(bool) {
  if (!bool) alert("warning");
}

var count = 0;
function logTarget(e) {
  console.log(count + ": target: " + e.target.id +
              ", currentTarget: " + e.currentTarget.id +
              ", eventPhase: " + e.eventPhase +
              ", bubbles: " + e.bubbles +
              ", cancelable: " + e.cancelable);
  count++;
}

function changeRed(e) {
  logTarget(e);
  this.style["background-color"] = "red";
}

function changeBlue(e) {
  logTarget(e);
  this.style["background-color"] = "blue";
}

function changeYellow(e) {
  logTarget(e);
  this.style["background-color"] = "yellow";
}

function changeAzure(e) {
  // e.stopPropagation();
  logTarget(e);
  this.style["background-color"] = "azure";
}

function changeChocolate(e) {
  // e.stopPropagation();
  logTarget(e);
  this.style["background-color"] = "chocolate";
}

function changePurple(e) {
  // e.stopPropagation();
  logTarget(e);
  this.style["background-color"] = "steelblue";
}

function changeText1(e) {
  logTarget(e);
  this.innerText = "world";
}

function changeText2(e) {
  logTarget(e);
  this.innerText = "hello";
}

window.onload = function () {
  var elem1 = document.getElementById('hello');
  elem1.addEventListener('click', changeRed, false);
  elem1.addEventListener('mouseover', changeYellow, false);
  elem1.addEventListener('mouseover', changeText1, false);
  elem1.addEventListener('mouseout', changeBlue, false);
  elem1.addEventListener('mouseout', changeText2, false);
  var elem2 = document.getElementById('around');
  elem2.addEventListener('click', changeAzure, true);
  elem2.addEventListener('mouseover', changeChocolate, true);
  elem2.addEventListener('mouseout', changePurple, true);
};
```

少し説明を補足します。

addEventListenerの第３引数にtrueを指定すると、キャプチャフェーズのイベントを捕捉し、falseを指定すると、バブリングフェーズのイベントを捕捉するとのことです。

stopPropagation()は「キャプチャフェーズにおいて親要素でイベントを横取りするような場合に使用すると効果的」とのことです。

ついでに、stopPropagation()も学ぶことができました。(余談ですが、『独習JavaScript』第２版P328の表8.8のisPropagationStopped()の説明がstopPropagetion()の説明と同じでした。)

## まとめ

１つのイベントに複数のイベントリスナを登録できることを確認しました。preventDefault()とstopPropagation()の違いがよく分かっていなかったのですが、手を動かしたことによってその違いを整理できたと思います。
Phoenix で外部 API にリクエストする API を作る

Phoenix で外部 API にリクエストする API を作ってみます。[OpenWeatherMap API](http://openweathermap.org/) に問い合わせて、指定された緯度経度の天気を JSON で返却するという ~~無駄な~~挙動をさせてみましょう。

Phoenix で JSON API 作る方法は[コチラ](http://qiita.com/mserizawa/items/03d3579457aa7c2bf2e5)を参照してください。

# 依存関係に HTTPoison を追加する

Elixir 版のサードパーティライブラリアーカイブ（PyPI や npm といった類のもの）には [Hex](https://hex.pm/) があります。
ここに公開されているライブラリは Mix を使うことで簡単にプロジェクトに追加でき、またこれらの依存関係は `mix.exs` というファイルで管理できます。

今回は HTTP Client として [HTTPoison](https://github.com/edgurgel/httpoison) を利用しますので、以下のように追記します。

```ex:mix.exs
  ...

  # Specifies your project dependencies
  #
  # Type `mix help deps` for examples and options
  defp deps do
    [{:phoenix, "~> 0.17"},
     {:phoenix_ecto, "~> 1.1"},
     {:postgrex, ">= 0.0.0"},
     {:phoenix_html, "~> 2.1"},
     {:phoenix_live_reload, "~> 1.0", only: :dev},
     {:cowboy, "~> 1.0"},
     # HTTPoison を追記
     {:httpoison, "~> 0.7.2"}]
  end
end
```

その後、以下のコマンドを実行すると、ファイルがダウンロードされます。

```sh
$ mix deps.get
```

サーバを起動している場合は、忘れずに再起動しておきましょう。

# ルートを追加する

/api/weahter/:lat/:lon で天気を問い合わせられるようにします。

```ex:router.ex
  scope "/api", SampleApp do
    pipe_through :api

    get "/weather/:lat/:lon", PageController, :weather
  end
```

# OpenWeatherMap API に問い合わせる

コントローラに HTTP リクエストの処理を書きます。

```ex:page_controller.ex
  ...

  def weather(conn, %{"lat" => lat, "lon" => lon}) do
    HTTPoison.start
    result = HTTPoison.get! "http://api.openweathermap.org/data/2.5/weather?units=metric&lat=#{lat}&lon=#{lon}"

    case result do
      %{status_code: 200, body: body} -> json conn, Map.get(Poison.decode!(body), "main")
      %{status_code: code} -> json conn, %{error: code}
    end
  end
end
```

HTTPoison.start の後に HTTPoison.get! とすることで GET リクエストが発行されます。
OpenWeatherMap API のエンドポイントに対して入力された緯度経度を与えます。Elixir では文字列の中に `#{...}` と記述することで、変数を結合させられます。

リクエスト結果は変数 result に束縛させ、case に渡します。

case 構文のなかではパターンマッチが行われます。
1つ目の句は、status_code が 200 のときにマッチします。マッチングの際に body プロパティの中身を変数 body に束縛しておき、中の処理でそれのデコードと返却をします。
Elixir の句は上から順に評価されるため、status_code が 200 以外のリクエストは自然と2つ目の句にマッチします。この場合は status_code を束縛しておき、それを返却します。

ちなみに、Elixir の関数名には `!` が付いているものと付いていないものがありますが、これには**エラーを発生させるかどうか**の違いがあります。
例えば上記の `HTTPosion.get!` には `HTTPoison.get` もあり、返却はそれぞれ以下のようになります。

```iex
iex> HTTPoison.get! "..."
%HTTPoison.Response{ ... }
iex> HTTPoison.get "..."
{:ok, %HTTPoison.Response{ ... }}
```
`get!/1` の場合は関数実行時にエラーが発生した場合はそのままスローされます。
一方、`get/1` の場合はエラーは一切スローされず `{:error, ...}` という返却がされます。
エラーハンドリング次第で使い分ける、という感じですね。

# リクエストしてみる

サーバを起動してリクエストしてみましょう。
六本木ヒルズの緯度経度を投げてみます。

```bash
$ curl -s "http://localhost:4000/api/weather/35.6585373/139.7151887" | jq .
{
  "humidity": 100,
  "pressure": 1015,
  "temp": 20.21,
  "temp_max": 23.33,
  "temp_min": 15.56
}
```

ちゃんとそれっぽい数値が取れました。
Datadog Agentのインストール問題でサポートを受ける場合のお助けコマンド。


次のコマンドオプションは、logファイルを収取して一括にまとめてくれます。インストールの障害をサポートには、このログコマンは非常に重要です〜。logの添付がない場合は、第一レスポンスは、「logを送って〜ぇ」という話になります。

```
sudo /etc/init.d/datadog-agent flare {case_id}
```

このコマンドオプションは、最近追加されたものなので公式ドキュメントにはまだ追加されていませんが、便利なのでsupportの問い合わせの際には是非使ってみてください。

なお、windowsなどの場合、以下のページを参照してください。

https://github.com/DataDog/dd-agent/wiki/Send-logs-to-support

宜しくお願いします。
出会い系アプリを作ってわかったAppleのリジェクト地獄へようこそ


数多くのアプリを世の中にリリースしてきましたが、出会い系というジャンルは全く別物なのですね、、、聞いてはいましたが味わうと大変です。


出会い系アプリを作成して、リリースしてわかったこと、、、
少し書いておきます。何かしらの参考になれば幸いです。


どのようにするとリジェクト地獄から回避してリリースできるのか、、、

6月に申請してリジェクトされまくり、8月に入ってからリリースされました。この間、約２０回以上のリジェクトをされまくりました。


## リジェクトの嵐へようこそ
Appleはあの手この手でリジェクトへのアプローチをかけてきます。
しかも、一度質問がなくなったと思ったら５回も後に似たような条件でダメ出しされたり、、、最初から言ってよ！というものも多々あります。

## 重要な点
* アプリ上にて相手が誰だかわかること。相手のプロフィールを表示する。（ブラインドのがドキドキするけどもね）
* 管理者に通報できること（不快な思いをした時に管理者に通報できる機能があること）
* 相手をブロックできること
* 管理者は、２４時間以内に通報された人を排除できること
* 利用規約に、どんなユーザを排除するのかを明示すること
* 特急申請も申し込む。ここは丁寧にどうしても特急申請をしないといけないことを記入する（これができれば、リジェクトされて再度申請してもすぐに審査に入ります）

2021/01/06追加
* 男女が平等に利用できることを明示する（女の子や子供を商品にすることは禁止されておりますので、男女ともにサムネイルなどに写真を掲載することが重要です）
* メールアドレスログイン以外の、サードパーティーログインを入れている場合（LINEログインや、Facebookなど）は、AppleIDログインを実装する

## 機能に対してのダメだしについて
他のアプリで、似たような機能にかかわらずAppStoreに掲載されているアプリがある場合には、このアプリは似たような機能になっているし、もっと誠実な機能であることを伝える。

## 男性女性のアプリの動画を撮影する
* どのように利用するのか丁寧に説明する。
* 男女のアカウントを提示するのはもちろんのこと、どのように利用できるのかを動画を撮影して示す。


## 課金はテストモードでね！
出会い系を作っているということはきっと課金機能はあると思うのですが、課金はわかりやすくね！

* １００ポイント　であれば、１００ポイントとする。変な記入の方法は辞めて、わかりやすくする。
* レビュー時には、Appleのテストサーバに向けてね。リリース時には本番サーバに向けてね！


## その他の点
レビューなどに対してポイントをつけちゃダメだよ。レビューしたらポイントあげる！とかはNG
(2016/02/21追加）
強引にレビューしてね！というようなダイアログもNG


(2016/02/21追加）
##期間型課金について
ｘｘヶ月というようなプランをつけることもできた、、、
Non-Renewable Subscription　か、自動更新型の課金を使う。


2021/01/06追加
## 正しくまもればリリースできますよ。
あまりにも常識を逸したアプリケーションはリリースできません。
利用者に対して不利益を被るようなアプリケーションはリリースできません。

2022/07/22追記
アドバイスしたのちにリリースできたアプリが出ました。
　結構有名な出会い系アプリです。


# こちらにご相談受け付けてます。

１時間１万円程度で相談をお受け致しますので、お気軽にご連絡ください。
sahiruhasahiruha@aol.com
Jsoupを使って株価をスクレイピング


Jsoupを使って株価をスクレイピングできるようになったのでメモ。
最終的には取得した値をまとめてメールで送れるようにする予定です。

```java:Parser.java
package parser;
import java.io.IOException;
import java.util.ArrayList;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Parser {

	// コンストラクタでURLを指定するので、private
	@SuppressWarnings("unused")
	private Parser() {
	};

	protected Document document = null;
	public Parser(String url) throws IOException {
		this.document = Jsoup.connect(url).get();
	}

	public ArrayList<String> getElementsByClass(String className) {
		ArrayList<String> list = new ArrayList<>();
		Elements elements = document.getElementsByClass(className);
		for (Element element : elements) {
			list.add(element.text());
		}
		return list;
	}
}
```

```java:Main.java
package main;
import java.io.IOException;

import parser.Parser;

public class Main {
	public static void main(String[] args) throws IOException {
		// 今回はトヨタの株価を取得してみる。
		String kabuka = new Parser("http://stocks.finance.yahoo.co.jp/stocks/detail/?code=7203.T").getElementsByClass("stoksPrice").get(1);
		System.out.println(kabuka);
	}
}
```
Vim Plugin 作成の勉強のため特定のパターンに一致する行を抽出して編集するためのスクリプト作った

# 概要

特定のパターンを含む行だけを矩形選択して編集したいのに！っていう要望が僕の中にあったので、せっかくだから Vim Plugin を開発する練習台にと作ってみました。

:octocat: [tAkihiko/vim-region-edit](https://github.com/tAkihiko/vim-region-edit)

![vim-region-edit.gif](https://qiita-image-store.s3.amazonaws.com/0/72083/e21cdac8-4955-1ccc-7987-8ee205a93e9d.gif)

# 使い方

範囲選択 or 何も選択せずに以下を入力

```vim
:RegionEdit {pat}
```

Tempfile が開くので編集

```vim
:EndRegionEdit
```

で終了



# 本題

Vim Plugin を作ったことが無いので、コレを踏み台に色々と調べてみたいと思います。

とは言え使いたいから作ったので、 **等価・高機能なやり方やプラグインがあったら教えて下さい。**

（`:%s/hoge/piyo/`以外で…）

## 今の所把握してるわからないこと・やりたいこと（順次追記予定）

* [x] 変更の検出
    * modified, mod オプションフラグを参照する
* [x] 一旦公開したプラグインを継続して開発する便利な手法（公開されたものしか使ったことが無かった…）
    * [Vim プラグインの開発スタイルのお話 - 永遠に未完成](http://d.hatena.ne.jp/thinca/20100216/1266294717)
    * [Vim プラグインのヘルプを書く人がするべき設定 - 永遠に未完成](http://d.hatena.ne.jp/thinca/20110903/1314982646)
    * [Shougoさんの方法](https://twitter.com/ShougoMatsu/status/675073145548730368)
* [ ] Vim Script のイロハ
    * [VimScriptざっくりチュートリアル(バッファ編集編) - かせいさんとこ](http://d.hatena.ne.jp/kasei_san/20130714/p1)
    * [VimScriptざっくりチュートリアル(関数編) - かせいさんとこ](http://d.hatena.ne.jp/kasei_san/20130711/p1)
* [ ] テストの作り方
* [ ] `./plugin/`, `./autoload/` に置くべきものたちの区別
* [ ] 変数名・関数名・コマンド名の付け方
* [ ] `0 delete _` みたいなダサげな記述を消したい
* [x] どんな記述がダサいか
    * [vimrcアンチパターン - rbtnn雑記](http://rbtnn.hateblo.jp/entry/2014/11/30/174749)
* [ ] 仮バッファの作り方・使い方

とりあえず幾つかアンチパターンに引っかかってるようなので、調べて修正していきます。
【メモ】JetsonのプレインストールされたOSが起動しないとき

近日中にこの現象に遭遇した人がどうも少なそうなので、もしかしたらレアケースかもしれない。
公式の英語BBSでは報告が上がってた。R19だとこうなる？

# 遭遇したこと
HDMI接続していると起動途中で止まる。
シリアルでみても起動完了まで行ってるように見えない現象に遭遇した。

# 原因らしきこと
モニタから返ってきたEDIDをパースするのに失敗して、途中で止まる。

# 対処
落ち着いて最新のドライバやらOSやらを書き込めば起動した（僕の場合）。

ちなみにJetPackで諸々を焼こうとしたら失敗して起動開始すらしなくなった。
大人しくDriver PackとSample File Systemを落として直接焼いた。
モンティ・ホール問題をRubyで検証

頭で考えたら、別に選び直さないでいいし、むしろ正解率が上がったような気になってしまって釈然としないので、コードで確認。

```rb
def f(resample)
  doors = Array.new(3, &:itself)          # 3つのドアがある
  1000000.times.count do
    car = doors.sample                    # 一つが当たり
    select = doors.sample                 # プレーヤーが1つ選択
    if select == car
      next true                           # いきなり正解
    end
    goat = (doors - [select, car]).sample # 残りのドアのハズレの1つを開示
    if resample
      select = (doors - [goat]).sample    # 選び直す(同じのを再選択する場合もある)
    end
    select == car
  end
end

# 選び直さない場合と、選び直した場合の当たり数
f(false)                        # => 333480
f(true)                         # => 665914
```
やっぱり選び直した方が正解率が上がるのか。なんでだろ。

# 参考

モンティ・ホール問題 - Wikipedia
https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%BB%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C

math - モンティ・ホール問題を解く - Qiita
http://qiita.com/ynakayama/items/1e1693503e27ce33e0a0
require include


## Bモジュール
```rb 
module B
 def hoge_b
    puts "puts in class B"
 end
end 

```

## A クラス
```
require '/Users/xu.zhiqiang/xu_code_test/b'

  class A 
    include B

    def hoge_a 
       hoge_b
    end

  end


a = A.new
a.hoge_a
結果　puts in class B
```
## include　extend の使い方http://sekai.hateblo.jp/entry/2013/08/23/083258
```rb
require '/Users/xu.zhiqiang/xu_code_test/b'

  class C
    include B
  end


c = C.new
c.hoge_b

puts in class B
```

```rb
require '/Users/xu.zhiqiang/xu_code_test/b'

  class D
    extend B
  end

D.hoge_b
puts in class B
```
Phoenix で JSON を返却する

Phoenix に JSON を返却させてみます。特に CRUD 操作などは作りません。
Phoenix のインストールについては[コチラ](http://qiita.com/mserizawa/items/a861b4aa0d55b42b2324)を参照してください。

# ルートを追加する

折角なので新しいルートを追加してみましょう。
Phoenix では `web/router.ex` というファイルでルーティングを設定します。「/api/:key/:value」で指定した key, value のオブジェクトを返すようにしてみましょう。

```ex:router.ex
  ...

  scope "/", SampleApp do
    pipe_through :browser # Use the default browser stack

    get "/", PageController, :index
  end

  # 以下のスコープを追加
  scope "/api", SampleApp do
    pipe_through :api

    get "/:key/:value", PageController, :api
  end

  ...
```

Phoenix のルーティングには **パイプライン** という概念があり、特定のスコープに対するリクエストに一律の処理を加えることができます。パイプライン自体は **プラグ** と呼ばれるモジュールの並びで構成されています。Tomcat でいうところのフィルターのようなイメージでしょうか。
デフォルトで生成されるスコープには `:browser` というパイプラインが設定されていますが、これはブラウザに表示する HTML を返却することに最適化されたものです。今回のような View に関心がない JSON API の場合は、同じくデフォルトで用意されている `:api` というものを使います。

# アクションを追加する

次にアクションを追加します。`web/controllers/page_controller.ex` に先ほど作成した :api の処理を書きます。

```ex:page_controller.ex
defmodule SampleApp.PageController do
  use SampleApp.Web, :controller

  def index(conn, _params) do
    render conn, "index.html"
  end

  def api(conn, %{"key" => key, "value" => value}) do
    json conn, Map.put(%{}, key, value)
  end
end
```

ルートで :key, :value というパラメータを定義しているので、第2引数にそれらのマッピングを書きます。どうやら各パラメータはアトムにはならないようで、キーワード構文は使えないみたいです。
JSON を返却する場合は `json/2` という関数を呼び出します。第1引数にはコネクション情報、第2引数には JSON にしたいオブジェクトを渡します。
ちなみにこの `json` やルーティングで書いた `get` といったものはマクロで、内部的に関数呼び出しに展開されているようです。Phoenix ではこのようなマクロの活用が散見されます。

マップの作成は `%{"foo" => "bar"}` や `%{foo: "bar"}` のように書くのですが、今回のようにキーを文字列型の変数にしたい場合の方法がイマイチ分からなかったので、Map モジュールの `put/3` を使って作成しています。

# リクエストしてみる

ブラウザで適当に（ex: /api/hello/world）リクエストを投げてみると、ちゃんと意図通りの返却になっていることがわかります。

```json
{
    "hello": "world"
}
```

ちなみに、パラメータが足りていないと「no route found」としてエラー画面に飛びます。
LightBlue から Konashi 2.0 を操作して Lチカ する


![20150828-DSC03680.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/7cd95d9c-025d-e5aa-62d8-ba32ff35bf48.jpeg "20150828-DSC03680.jpg")

セントラルのデバイスが、ペリフェラルのBLEと read / write な通信したい場合

1. セントラルがペリフェラルをスキャン
2. 通信したいペリフェラルへ接続。サービスをスキャン
3. サービスを見つけたらキャラクタリスティックをスキャン
4. キャラクタリスティックに read / write

という流れになる。iOS デバイスをセントラルとして、上の一連の流れがアプリから操作できるのが [LightBlue](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CB0QFjAAahUKEwj19PXB0MvHAhUGlZQKHcXHCcc&url=https%3A%2F%2Fitunes.apple.com%2Fjp%2Fapp%2Flightblue-bluetooth-low-energy%2Fid557428110%3Fmt%3D8&ei=-j_gVfWPJIaq0gTFj6e4DA&usg=AFQjCNEblmsCHvTCUNl1YMVf2nuJV08hrA&sig2=Cd65vFSUGrhy0HPqEu3b9g) アプリなんだけど、こいつだけでたとえば Konashi 2.0 に対してLチカできる。

LightBlue だと

1. スキャンしたペリフェラルが表示されてる。koshian-* なデバイスを選択する。
2. タップすると、サービスがスキャンされ並ぶ。下の方にキャラクタリスティックのUUIDが並ぶ。
3. PIO の LED の部分を OUTPUT にセットしたいので pioSettingUUID である 229B3000-... を選択する
4. LED2~5 を OUTPUT にするため、Binary (右上で選べる！) 0b00011110 を Write new value で書き込む
5. 3.と同様に pidOutputUUID である 229B3002-... を選び、0b00011110 を Write new value で書き込む
6. LED2~5 が点灯する！5. の値を変えればもちろん消したりできる。

かんたん！

なお Android では BLE Scanner アプリなどで同様のことができるが、あまり安定して無くアプリが良く落ちる。何が言いたいかというと、LightBlue 素晴らしい。

あとこれらのことが解りやすく説明されている書籍、[iOS×BLE Core Bluetoothプログラミング](http://tatsu-zine.com/books/ios-ble-core-bluetooth-programming) 素晴らしいですね。
GCEのインスタンスにssh接続できない時の対策



```
$ gcloud compute instances list
instance-name
```
で、みると一覧にはあるけど

```
$ gcloud compute ssh instance-name
ERROR: (gcloud.compute.ssh) Could not fetch instance:
 - The resource 'instance-path' was not found
```
で、なぜかつながらない時の対策

***

```
$ gcloud compute --project "project-name" ssh --zone "zone-name" "instance-name"
```
これでつながる。

Google Developer Console → 対象プロジェクト → (右側メニューの)コンピュート → Compute Engine → VMインスタンス → 対象インスタンスの 接続 ssh 右側のメニュー → gcloudコマンドを表示
からコピペしてきてもOK
モデル間のリレーションに紐付いた属性を引っ張ってくる方法

例えば、CompanyとUserという2つのモデルがあったとして、CompanyUserというのを作って関連づけることはよくある。こんな感じ。

```
class Company < ActiveRecord::Base
  has_many :company_users
  has_many :users, through: :company_users
end

class User < ActiveRecord::Base
  has_many :company_users
  has_many :companies, through: :company_users
end

class CompanyUser < ActiveRecord::Base
  belongs_to :company
  belongs_to :user
end
```

CompanyとUserとの間にroleのようなものがあった時、CompanyUserにroleを入れておけばよいが、その引き出し方に少し悩んだ。下のように書けば大丈夫だった。

```
class Company < ActiveRecord::Base
  has_many :company_users
  has_many :users, -> {
    select('*, user_companies.role as role')
  }, through: :company_users
end
```

これで、companyの中からusersを見たとき、userはrole属性を持っているように見える。attr_accessor :role をUserの中に定義しているとむしろうまく動かなかったので注意が必要。(Rails 4.2.4で検証)

```
company = Company.fist
company.users[0].role # => 'hoge'
```
NavigationController直下のビューに戻りたい

Objective-CでiOS開発中です。
NavigationControllerの挙動についてよくわからない部分があるのでご助言いただきたく投稿します。

「NavigationController以下のページが全て閉じられた時，戻って表示されるビューがNavigationControllerより1つ前のビューになってしまいます。」

NavigationController - Master 以下に Detail と Add ビューがあり，Addビューを閉じたときにMasterに戻って欲しいのですが，Masterビューが一瞬見えたあと，NavigationController以前のビューが表示されます。

この現象はなぜ起こるのでしょうか？
JRuby は JIT によって 10倍ぐらい速くなる場合がある。

昨日書いたベンチマークの記事
http://qiita.com/Nabetani/items/2d054512c45990dd1235
で、JRuby の場合の測定時間の変化が面白かったので、変化だけを調べてみた。

結論：JITすごい。

追記：
> もう少し調べた記事を書いた。
> [JRuby は実行時最適化によって 50倍以上速くなり、CRuby を華麗に抜き去る場合がある。]( http://qiita.com/Nabetani/items/c5635ab2a4a8ab2233ab )を参照

やってみたことは、
「ちょっと時間がかかる処理を、時間を計りながら20回行う」というプログラムをJRubyで3回、CRuby で1回 動かす、という作業。
で。
まずはグラフ。

![Kobito.GULL7m.png](https://qiita-image-store.s3.amazonaws.com/0/6854/522ff89d-7438-1225-3f5d-cc0f6497eaaa.png "Kobito.GULL7m.png")

JRuby に注目すると。

* どの trial も初回が一番遅い。
* 2回目はいきなり半分ぐらいの時間で処理が終わる。
* 5回目で遅くなり、6回目以降は大きな山はないもののどんどん速くなる。
* 10〜15回目ぐらいで落ち着く感じ。

5回目の山は、JITが頑張っている山なんだと思うけど、どうだろう。

初回と最終回の開きは、いずれも10倍ぐらい。JIT恐るべし。

とはいえ。
今回のコードについてはCRubyが速いので、ちょっと面白みには欠ける。
JIT の威力でCRubyを追い抜く！　みたいなストーリーを作りたかったんだけど、そうはならなくて残念。
グラフからは読みにくいけど、CRuby の場合は、最速と最遅で2倍も差がないし、特に傾向も感じられない。
まあ処理時間が短すぎるのでよくわからないんだけれど。

ちなみにソースコードはこんな感じ。

```ruby
#encode:utf-8

(p RUBY_DESCRIPTION) rescue p "1.8.x or former"
require "benchmark"

def test
  a=->(b){->(c){->(d){->(e){ (->(f){f+1})[e] }[d] }[c] }[b] }
  r=a[a[a[a[a[a[a[a[a[a[a[a[a[a[
  a[a[a[a[a[a[a[a[a[a[a[a[a[a[
    1
  ]]]]]]]]]]]]]]]]]]]]]]]]]]]]
  n=400
  s=eval("#" "{"*n+"r"+"}"*n)
end

def run_bench
  20.times do |ix|
    tick = Benchmark.realtime{ test }
    puts "%d,%.9f" % [ ix+1, tick ]
  end
end

run_bench
```

ベンチマーク以外には何の役にも立たない馬鹿げたプログラムだと思う。

追記：
JRuby は、

```text
jruby 9.0.0.0 (2.2.2) 2015-07-21 e10ec96 Java HotSpot(TM) 64-Bit Server VM 25.60-b23 on 1.8.0_60-b27 +jit [darwin-x86_64]
```

つまり、JRuby9000 + Java8
で
CRuby は、

```
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin14]
```

をつかった。
つまり、両方最新のつもり。ハードウェアは最新じゃないけど。
electronでd3.jsを使おうとすると「d3 is not defined」って怒られた


読み込んでそのまま使おうとしたけどd3 is not definedとエラーが出たので以下の一行を追加

```html:index.html
<script>
// 変数d3にぶちこむ
var d3 = require('../bower_components/d3/d3.min.js');

// d3.jsの素敵なコード
</script>

```

似たような問題で[ElectronでjQueryがundefinedになる](http://qiita.com/pirosikick/items/72d11a8578c5c3327069)というのがあったので、こちらを踏襲するようにしたら利用できるようになった。