OmniAICreator/Qiita-1.07M huggingface dataset:
オレオレ証明書の署名付きで暗号化して送る



こんなことをしてみた、の記録。

# 目的
ファイルを暗号化して送りたい。ただし以下の条件で。

## 条件
- パスワードは人が覚えられる程度にしたい（４文字くらい）
- 暗号化されたファイルはそれなりに暗号強度を保ちたい
- 複合化した内容が正しいか検証したい（送り先にオレオレ証明書があるとして）
- 圧縮は事前に済ませておく

です。環境はMac。
いえ、Macでなくてもいいんですけど、手元がMacなので。


# 方針
そこで、こんなことを考えました。

- 対象ファイルは一つとしよう。
複数ある場合は、事前にzip化しておけばいいし。

ここでは、適当に10MBのファイルを用意します。

```bash
dd if=/dev/random of=./rnd.bin bs=1024 count=10240
```
rnd.binができました。

## パスワードの生成

パスワードは英小文字4文字にしよう。それ以上は覚えられない。

```bash
# pwgenが入っていなければいれます
brew install pwgen

pwgen -A0 4 1 > pass.key
```

パスワードが英小文字4文字程度ではBruteforceされてしまうので、sha256で1000回ストレッチします。
スクリプトでもよいのですが、1000回ストレッチするとちょっと遅かったので、Cでやっつけでこさえます。
ソースは[こちら](https://github.com/urakarin/sign_then_encrypt/blob/master/enc/sha.c)。

これで、

```
./sha 1000
```

とすることで、1000回のストレッチが可能です。パスワードファイル名(pass.key)と暗号鍵ファイル名(cek.key)は決め打ちです。


## 暗号化

### 送り先で検証できるように署名をつけよう。

```bash
# 秘密鍵を用意します
openssl genrsa 1024 > private-key.pem
# ダイジェストを取得します
openssl dgst -sha256 -sign private-key.pem rnd.bin > rnd.bin.sig
```

これで、手元にはrnd.bin と rnd.bin.sigの2つのファイルがあります。

### ひとまとめにしよう

なんのひねりもなく、安直にtarします。

```bash
tar cvf rnd.bin.tar rnd.bin rnd.bin.sig
```

これで、対象ファイルはrnd.bin.tar一つだけになりました。


### 役者がそろったので、暗号化します

```bash
openssl aes-256-cbc -e -in rnd.bin.tar -out rnd.bin.encrypted -pass file:./cek.key
```

これで、相手に渡す暗号化ファイル( rnd.bin.encrypted )ができました。

### オレオレ証明書の作成

一緒に渡すオレオレ証明書も作ります。有効期限は3日間です。

```bash
openssl req -new -x509 -out oreore.crt -key private-key.pem -days 3
```

できた oreore.crtを相手に渡して信頼してもらえれば完璧です。

### 相手に渡すもの
以下の3つです。

- rnd.bin.encrypted (暗号化された実体)
- oreore.crt (オレオレ証明書。できれば別経路で事前に渡しておきたいところ)
- パスワード(英小文字4文字。別手段で。電話とか)

## 複合化

では、受け取った方の処理です。

## パスワードの生成
pass.keyファイルに受け取った英小文字4文字のパスワードを書いて保存します。
暗号化の時と同様に、1000回のストレッチをかけると、暗号化時と同じcek.keyが出来上がります。

```bash
./sha 1000
```

### 複合化
```bash
openssl aes-256-cbc -d -in rnd.bin.encrypted -out rnd.bin.tar -pass file:./cek.key
```

これで、rnd.bin.tar が出来上がります。

### ばらす

```bash
tar xvf rnd.bin.tar
```

これで、rnd.bin と rnd.bin.sig がでてきます。

### 検証する
最後に、でてきたrnd.binが本当に正しいものかを検証します。

```bash
# 公開鍵証明書から公開鍵を取り出します
openssl x509 -in oreore.crt -pubkey -noout > public-key.pem
# 署名検証を行います
openssl dgst -sha256 -verify public-key.pem -signature rnd.bin.sig rnd.bin
```

```Verified OK ```
とでれば、無事検証されたということです。
```Verification Failure ```
であれば、改ざんされた可能性があります。

めでたし。めでたし。

# 参考
証明書まわり、大変参考になりました。おもしろい。

- [公開鍵暗号をプログラムで扱う方法のまとめ](http://qiita.com/kunichiko/items/7d4945d8b512ea1a3446)
- [自堕落な技術者の日記](http://blog.livedoor.jp/k_urushima/archives/979220.html)
- [証明書のファイル形式について](http://moca.wide.ad.jp/moca_guide/about_fileformat.html)

# おわりに
なりすましには対処できません。そこは許容ということで。
また、実際には各OSごとに証明書を扱う作法があると思いますが、そこは置いておきます。

おわり。
Wireshark 2.x のLuaスクリプトでTCP/UDPの判別を行う

# はじめに

2015年の末にWiresharkがバージョン2になっていました。
なので公式サイトからダウンロードしてインストールしました。
インストール完了後に init.lua を弄って自作のスクリプトを読み込ませてみた所、以前のバージョンではエラーが無かったLuaスクリプトでエラーが発生しました。

# ipprotoが使えない
読み込ませたのは以下のLuaスクリプトです。
ポート:6609番への通信を"ORG_PROT"プロトコルとして表示します。

```Lua
-- ポート:6609番への通信を"ORG_PROT"プロトコルとしてデコードする

-- Create a new dissector
ORG_PROT = Proto ("ORGNP", "Original Network Protocol")

-- Tables
CONSTANT = {
    -- IP Protocols
    TCP_PROTOCOL = 6,
    UDP_PROTOCOL = 17,

    -- Port Number
    PORT_NUM = 6609,
}

-- Dissector function
function ORG_PROT.dissector (buffer, pinfo, tree)

    -- Add the protocol to the tree
    orgnpTree = tree:add (ORG_PROT, buffer())

    -- Check whether packet uses TCP or UDP
    if ( pinfo.ipproto == CONSTANT.TCP_PROTOCOL) then

        -- TCP Packet
        debug( "TCP Packet dissector Function" )

    elseif ( pinfo.ipproto == CONSTANT.UDP_PROTOCOL) then

        -- UDP Packet
        debug( "UDP Packet dissector Function" )

    end
end

-- UDP with static port
udp_table = DissectorTable.get ("udp.port")
udp_table:add (CONSTANT.PORT_NUM, ORG_PROT)

-- TCP with dynamic port assignment
tcp_table = DissectorTable.get ("tcp.port")
tcp_table:add (CONSTANT.PORT_NUM, ORG_PROT)
```

実際に読み込んでみたところ以下のエラーが発生しました。

```
Lua Error: C:\Wireshark\plugins\sample.lua:504: No such 'ipproto' getter attribute/field for object type 'Pinfo'
```

# 原因
原因はWiresharkが 2.0 になって ipproto が無くなった為にこのエラーが発生していました。

[参照: Wireshark’s Lua API Reference Manual][1]
[参考: Wireshark-bugs: [Wireshark-bugs] [Bug 10882] No such 'ipproto'getter attribute/field for object][2]


# 解決案

ipproto を使用しないでTCPかUDPかを判定するために以下の方法を使いました。

```Lua
ipprotof = Field.new("ip.proto")

local ipprotostr = tostring( ipprotof() )
local ipproto = tonumber(ipprotostr)

if ( ipproto == CONSTANT.TCP_PROTOCOL ) then

	-- TCP Packet
	debug( "TCP Packet dissector Function" )

elseif( ipproto == CONSTANT.UDP_PROTOCOL ) then

	-- UDP Packet
	debug( "UDP Packet dissector Function" )

end
```

それにしても何でipprotoを無くしたんでしょうかね？

[1]: https://www.wireshark.org/docs/wsdg_html_chunked/lua_module_Pinfo.html#lua_class_Pinfo
[2]: https://www.wireshark.org/lists/wireshark-bugs/201501/msg00534.html
MacOSX El Capitan で Apache JMeter をインストールする

## 実現したいこと

MacOSX El Capitan で Apache JMeter を "楽に" インストールする

## 実現方法および解決方法

本稿では、Homebrewでインストールを行います。

## 実行コマンド

```
brew install jmeter
```

## 情報源




## 補足

Java必須
下記のURLから、JDKをインストールします。

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
underscoreコードリーディング（keys）

underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##keysとは


###[underscorejs.orgのkeys](http://underscorejs.org/#keys)

こんな説明。
>####_.keys(object) 
Retrieve all the names of the object's own enumerable properties.


```javascript
_.keys({one: 1, two: 2, three: 3});
=> ["one", "two", "three"]

```
------------- 

引数で渡されたobjectの、enumerable属性のすべてのnamesを検索し、返します。


###[underscore.keys](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L926)
コード的にはこのあたり。

```javascript
  // Retrieve the names of an object's own properties.
  // Delegates to **ECMAScript 5**'s native `Object.keys`
  _.keys = function(obj) {
    if (!_.isObject(obj)) return [];
    if (nativeKeys) return nativeKeys(obj);
    var keys = [];
    for (var key in obj) if (_.has(obj, key)) keys.push(key);
    // Ahem, IE < 9.
    if (hasEnumBug) collectNonEnumProps(obj, keys);
    return keys;
  };
```


objがobjectではなかった場合は空の配列を返す
nativeKeysが存在する場合は、nativeの[keys](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/keys)を用いる

上記に当てはまらない場合
keysを空の配列として宣言する
for文で回し、objがkeyを持っていた場合はkeysにkeyをpushし続ける。
enumにbugがある場合はcollectNonEnumPropsを用いる。

その後、keyをあつめた配列のkeysを返す
ビルド時に The operation couldn’t be completed. (LaunchServicesError error 0.)でシミュレーター起動できない時


## 現象
`podinstall`したらシミュレーター起動しなくなった

## 解決方法
###XcodeのDerivedDataを削除する
`$ rm -rf ~/Library/Developer/Xcode/DerivedData/*`
DerivedDataはプロジェクトのインデックスやビルド時の生成物、ログ、キャッシュなどがあり、削除してもまたビルドすると生成されるので問題ない。
Ansible モジュール firewalld

#firewalld
firewalldに関する任意のポートやサービスを管理する
バージョン1.4で追加。

##概要
常駐又は非常駐するfirewalldに対し、サービスやtcp/udpのポートの追加/削除の設定を行う。

##前提条件
firewalldのバージョンが0.2.11以上。

##オプション

|引数|必須|デフォルト|値|備考|
|:---------|:---------|:---------|:---------|:---------|
|immediate<br>(1.9で追加)|no|||即時に反映される。(firewalld-cmdの--permanentを指定しない場合と同様)|
|permanent|yes|||リブート後も持続する。<br> permanent=true immediate=yesにするとfirewalld-cmdの--permanentを付けた場合＋つけてない場合を同時に実行してくれて便利。|
|port|no|||追加/削除するポート番号/ポート範囲。形式はポート番号の場合、PORT/PROTOCOL。ポート範囲の場合、PORT-PORT/PROTOCOL。|
|rich_rule|no|||追加/削除するリッチな設定(firewall-cmdのadd-rich-rule/remove-rich-rule指定)|
|service|no|||追加/削除するサービス。 /usr/lib/firewalld/services/と/etc/firewalld/servicesにあるサービスを設定|
|source<br>(2.0で追加)|no|True||追加/削除するソース/ネットワーク。|
|state|yes||・enabled<br>・disabled|ポート接続の許可/拒否。|
|timeout|no|||非常駐時においての設定有効期間。|
|zone|no|システムデフォルト(public)|・work<br>・drop<br>・internal<br>・external<br>・trusted<br>・home<br>・dmz<br>・public<br>|追加/削除するfirewalldのゾーンを指定する。(publicがデフォルト）ここに挙げたものは初期設定されているゾーンであり自分で作成したZoneを指定も可能。但しその場合Firewalldモジュールではなく先にゾーンを追加しといてね)|

##使用例

```yaml:
- firewalld: service=https permanent=true state=enabled
- firewalld: port=8081/tcp permanent=true state=disabled
- firewalld: port=161-162/udp permanent=true state=enabled
- firewalld: zone=dmz service=http permanent=true state=enabled
- firewalld: rich_rule='rule service name="ftp" audit limit value="1/m" accept' permanent=true state=enabled
- firewalld: source='192.168.1.0/24' zone=internal state=enabled
```

##注意点
- Debianベースのシステムでは未検証である。
- Pythonのバージョンが3に変更された場合でもPython2のfirewalldのbindingを必要とする。

###Ansible特別(extra)モジュール
このモジュールは現在Ansibleと一緒にリリースされるが、将来的に分離するかもしれない。コミュニティーによりメンテナンスされます。
React - inputにplaceholderを設定しているとonChangeが走ってしまう不具合(IEのみ)

本日はまったので共有します。

IEのみ起こる不具合ですが
input(text)にplaceholderを設定していると最初の一回だけonChangeが走ってしまいます。

既に修正されているとのことですが対象バージョンは0.15になるみたいです。
詳細は以下に載っていました。
https://github.com/facebook/react/issues/5438
Chainerを使った多層パーセプトロン：関数フィッティング

Chainerの勉強を目的に、[人工知能に関する断創録_多層パーセプトロンによる関数近似](http://aidiary.hatenablog.com/entry/20140122/1390395760)に記載の事柄をChainerを用いて実装してみました。

```Python:fitting_with_MLP.py
import numpy as np
import matplotlib.pyplot as plt
import chainer
from chainer import cuda, Function, gradient_check, Variable, optimizers, serializers, utils
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L

class MyChain(Chain):
    def __init__(self):
        super(MyChain, self).__init__(
            l1 = L.Linear(1, 10),
            l2 = L.Linear(10, 1),
        )

    def __call__(self, x):
        h = F.sigmoid(self.l1(x))
        out = self.l2(h)
        return out

class MyModel_fitting(Chain):
    def __init__(self, predictor):
        super(MyModel_fitting, self).__init__(predictor=predictor)

    def __call__(self, x, t):
        y = self.predictor(x)
        loss = F.mean_squared_error(y,t)*0.5
#        loss = (y-t)*(y-t)*0.5
        return loss

    def predict(self, x):
        y = self.predictor(x)
        return y

if __name__ == "__main__":
    #---Loading training data---#
    train_x = np.linspace(0.0, 1.0, num=1000, dtype=np.float32)
    train_y = train_x*train_x
    n_epoch = 1000
    n_batch = 100

    model = MyModel_fitting(MyChain())
#    serializers.load_hdf5('MyChain.model', model)
    optimizer = optimizers.Adam()
    optimizer.setup(model)

    for epoch in range(n_epoch):
        print 'epoch : ', epoch
        indexes = np.random.permutation(np.size(train_x))
        for i in range(n_batch):
            model.zerograds()
            x = Variable(np.array([[train_x[indexes[i]]]], dtype=np.float32))
            t = Variable(np.array([[train_y[indexes[i]]]], dtype=np.float32))
            loss = model(x, t)
            loss.backward()
            optimizer.update()
        print 'loss : ', loss.data

    learned_y = np.zeros_like(train_y)
    for i in range(np.size(learned_y)):
        x = Variable(np.array([[train_x[i]]], dtype=np.float32))
        learned_y[i] = model.predict(x).data[0,0]

    plt.plot(train_x, train_y, 'o')
    plt.plot(train_x, learned_y)
    plt.show()
    serializers.save_hdf5('MyChain.model', model)
```

誤差関数として二乗誤差を返すことで、回帰問題を解いています。
今回も注意点は、Variableへの値の渡し方です。
Chainerはミニバッチ学習を前提とした実装となっているそうで、[[入力ベクトル1],[入力ベクトル2],・・・]と入れることでミニバッチ学習が行われます。
オンライン学習を行う場合は、[[入力ベクトル1]]のように、括弧をひとつ多くつける必要があります。
Circle-CIでnode.jsのプロジェクトを動かすときのcircle.yml設定


忘れがちなのでメモ。

nodeバージョンは適宜最新バージョンにあわせる

```circle.yml
machine:
  node:
    version: 6.3.0 
  post:
    - npm install -g npm@3
  timezone: Asia/Tokyo
```

- nodeのバージョンのデフォルトが`0.10.33`とすごい古いのでバージョンを上げておく（ほんとこれなんとかしてほしい）
- npmもあわせて2系になっているので、3系に上げる
- timezoneは好みによるが、時間絡んだテストしてたりすると変な落ち方したりするのでやっといて損はないかも
抄訳 Boostの命名規則

# 概要
- [Boost Library Requirements and Guidelines](http://www.boost.org/development/requirements.html) の抄訳
- 抄訳なので大幅に内容がカットされてます
- 詳細には原文を読んで下さい
- 意訳を多分に含む
- 誤訳があったら教えて下さい

# 訳文

> ## デザインとプログラミング
> 
> - 名前は一部を除き全部小文字。アンダースコアで単語を繋ぐ。[^1]
> - 略語は一般的な名前と同じ扱い(例 `XML_parser` の代わりに `xml_parser` を使う)。
> - テンプレート引数名は大文字で始める。[^2]
> - マクロ(＊おおっと＊)名は全て大文字。接頭辞 `BOOST_` を付ける。[^3]

[^1]: snake_case
[^2]: PascalCaseのことだろう。
[^3]: `BOOST_VERSION` 等。

なんと基本的な命名規則はこれだけ。シンプル。

> ## 名前の一貫性
> 今までの開発経験から、でかいライブラリの設計では以下のアプローチが有用そうだ。
> ライブラリ名には、自身の内容について説明する名前をつける。意味不明な略語は使うな。
> C++標準ライブラリでの経験に基づき、基本的に名前は複数形ではなく単数形を使う。
> 例えば、ファイルシステムを扱うライブラリなら `filesystems` でも `fs` でもなく `filesystem` 。
> 
> - (略)
> - Boost内の各ライブラリには、ライブラリ名と同じ名前を使う。ただし、ライブラリ名と、ライブラリ内の主要なコンポーネントが同じ名前を持つ場合は、複数形の名前空間名を使う。[^4]

[^4]: たとえば、 `boost::tuple` は実際には `boost::tuples::tuple` のusing宣言である。

> ## 命名規則の根拠
> C++標準化委員会のライブラリ作業グループは、この問題について詳細に、そして長期間にわたって議論を行った。
> この議論は初期のBoostの投稿で幾度と無く蒸し返された。要約すると、
> 
> - 命名規則はぶっちゃけ戦争の火種でしかない。いくつかは広く使われてるけど、どれかが一つ優れてるなんてことは無い。
> - 次期標準への提案という目的があるから、Boostは標準ライブラリの規則に従う。
> - 一度落ち着いたら一貫して使おうぜ。

結局、こういう感じ。すごい一般論楽しく命名。

# 考察と私的運用

Boostの命名規則はとにかくルールを減らし、命名規則のシンプルさを重視しているように思う。
ルールが多いとプログラマが覚えるべきことが増えるのが大きなデメリットになる。
逆に、覚える事が増えてもいいから、各種名前を明確に区別するなら、適していないだろう。

## snake_caseとPascalCase

テンプレート引数名と、その他の名前を分けているのはおそらく明確な理由がある。
C++では以下のように、テンプレート引数名をクラス内でネストした名前としてusing宣言する事が多い。

```cpp
template< typename ValueType >
struct s
{
    using value_type = ValueType;
    value_type value;
};
```

この方法は型を取り回す時にとても便利。テンプレート引数名とその他の名前とで、明確に命名規則を分けないと、名前が衝突して大変不便である。

## 変数

変数名には名詞を使用する。これによって関数名との衝突を防ぐ。

### ローカル変数

ローカル変数名は、型名やメンバ変数との衝突を防ぐため、型名以上の意味が無い場合はガンガン省略を行う。
関数は短く記述するのが基本なので、寿命が極めて短いから意味が不明瞭になったりはしない。

### グローバル変数

使わない。静的なメンバ変数で代用する。

### メンバ変数

#### 静的な公開メンバ変数

標準ライブラリには以下のような、公開メンバ定数を持つクラスが多数ある。
scoped enumも同じ扱い。できればenumも。

```cpp
bool b = std::numeric_limits< int >::is_exact;
```

コンパイル時定数を扱う時、今なら `constexpr` 関数があるが、昔は無かったので、テンプレートクラスと定数を組み合わせるならどうしてもこうせざるを得なかった。
`std::numeric_limits::max` と `std::numeric_limits::min` を関数にしたのは設計ミスだという話は有名だ。
標準ライブラリの命名規則に従うのであれば、静的メンバ定数は snake_case になる。

#### 公開メンバ変数

危険なので使用しない。

#### 非公開メンバ変数

接頭辞 `m_` を使用する。これによって、型名やローカル変数との衝突を防止する。
長い寿命を持ちうるので省略は行わない。名前衝突を防ぐのが目的なので、別の命名規則を適用しても問題無いだろう。

#### 静的な非公開メンバ変数

静的公開メンバ変数に準拠。

## 関数

動詞を用いる。これによって変数名との衝突を防ぐ。
公開、非公開、静的、非静的に関わらず同じ命名規則を用いる。
変数と異なり、名前衝突があまり起きないのでこの運用でも問題ない。
GradleでJavaアプリを実行する最小構成サンプル

最小構成でJavaとGradleをコンソールのツールとして使うためのスケルトンのようなものです。バッチ処理とかどうでしょうか。最小とは言えクラスが複数あって、依存ライブラリもあるようなパターンにしています。


料理の仕方としては、`build.gradle`を置いたディレクトリで、`gradle nantoka`　や、`gradle -Ddousita.param=kousita kantoka` 実行すると、それぞれ指定されたクラスのmainメソッドが実行されます。mainへのコマンドライン引数もそれなりに渡ります。

その後は、必要に応じて必要な機能やテストやGradleのプラグインや、使いたいプロパティファイルなどを足していけば良いと思います。色々いじってみると、Gradleの理解が深まるかもしれません。

# 必要なファイル

``` build.gradle
apply plugin: 'java'

repositories {
  jcenter()
}

dependencies {
  compile 'org.apache.commons:commons-lang3:3.4'
}

task nantoka(type: JavaExec) {
  main = "org.example.Nantoka"
  classpath = sourceSets.main.runtimeClasspath
  args('apple', 'banana', 'cherry')
  args 'durian'
}

// gradle -Ddousita.param=kousita kantoka
task kantoka(type: JavaExec) {
  main = "org.example.Kantoka"
  classpath = sourceSets.main.runtimeClasspath
  args(System.properties['dousita.param'] ?: "default")
}
```
```  Nantoka.java
package org.example;

import java.util.Arrays;

public class Nantoka {
  public static void main(String[] args) {
    System.out.println("This is Nantoka");
    System.out.println(args.length);
    Arrays.stream(args).forEach(System.out::println);
    Kantoka.doKantoka();
  }

  static void doNantoka() {
    System.out.println("i am Nantoka");
  }
}
```

``` Kantoka.java
package org.example;

import org.apache.commons.lang3.SystemUtils;

import java.util.Arrays;

public class Kantoka {
  public static void main(String[] args) {
    System.out.println("This is Kantoka");
    System.out.println(args.length);
    Arrays.stream(args).forEach(System.out::println);
    System.out.println(SystemUtils.JAVA_VERSION);
    Nantoka.doNantoka();
  }

  static void doKantoka() {
    System.out.println("i am Kantoka");
  }
}
```


# ディレクトリ構成

この構成で、ファイルを配置してください。

```
│  build.gradle
└─src
    └─main
        └─java
            └─org
                └─example
                        Kantoka.java
                        Nantoka.java
```

# バージョン番号など

- Java 8
- Gradle 2.10
Upverter > Dashboardのアイコンの説明 > アイコン上にカーソルを止めると説明が表示される

https://upverter.com/dashboard/

Dashboardにあるアイコン

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f752b6a2-801b-27d0-27ee-54b4174e8c16.png)

これらの説明を探したがよくわからなかった。

説明を表示するには、それぞれのアイコンの上にマウスカーソルを置いておけばいい。そうすると説明文が表示される。

- 二重丸 : 進行中のもの
- ただの丸 : No Schematic / No PCB
self.window?.rootViewController　の設定でエラー

画面真っ暗でエラーが出てしまったのでメモ

Storyboardを使っている場合は注意


```
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
        // ViewControllerを生成する.
        let myFirstViewController: FirstViewController = FirstViewController()
        
        // UIWindowを生成する.
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        
        // rootViewControllerにNatigationControllerを設定する.
        self.window?.rootViewController = myFirstViewController
        
        self.window?.makeKeyAndVisible()
        
        return true
    }
```



この場合新しいインスタンスをrootViewControllerにしてしまうが
```
self.window?.rootViewController = myFirstViewController
```

Storyboardをルートビューにしたいので下記のように書く
※ViewControllerには
IDとして"ViewController"を指定しておく必要がある。

```
var storyboard:UIStoryboard =  UIStoryboard(name: "Main",bundle:nil)

self.window?.rootViewController = storyboard.instantiateViewControllerWithIdentifier("ViewController") as UIViewController
```
Docker Toolbox をプロキシ下で利用する

Mac(多分Windowsも同じ)でDocker環境を使う時、会社とかだとプロキシサーバが何かと障害になる・・・
プロキシ環境を設定して、dockerコマンドをちゃんと使えるようにしたい。
pullとかで長いこと待たされた挙句にtimeoutとかまじありえん。

# boot2dockerの時は
boot2docker を利用していた時は、`boot2docker ssh`コマンドでdokcerサーバにログインして以下のファイル修正でいけた。
ついでなのでタイムゾーンを日本時間に変更して時刻同期を行うようにもしてた。
これをやっておけば、ホストOSをスリープにしてる間にコンテナの時間が止まるを防げる。
PROXYサーバを設定しているような会社では大抵アカウント管理をADでやっているだろうから時刻同期サーバも社内にあるはず。
不明またはそんなの知らんって場合は、ネットで公開されているstratum 2とかの時刻同期サーバのIPでいいんじゃないかな。

```bash:/var/lib/boot2docker/bootlocal.sh
export http_proxy=http://PROXYサーバのアドレス:ポート
export https_proxy=$http_proxy
export no_proxy=127.0.0.1,localhost,192.168.59.103,社内でアクセスしたいIP
export TZ="JST-9"
export NTP_SERVER="社内の時刻同期サーバIP"
```

# Docker Toolboxでは
ところがどっこい。
Docker Toolbox (Docker Quickstart Terminal アイコンで起動するあれ) ではこれが何でか元に戻される。
boot2dockerではここだけは変更されないはずだったのに。

んで、Docker ToolboxではホストOS側にあるJSONファイルに定義すればよいらしい。
これに定義した内容がbootlocal.shに反映される。
HostOptions > EngineOptions > Env に配列定義すればいいんだよ。

```json:~/.docker/machines/machine/default/config.json
{
  "HostOptions": {
    "EngineOptions": {
      "Env": [
        "HTTP_PROXY=http://PROXYサーバのアドレス:ポート",
        "HTTPS_PROXY=http://PROXYサーバのアドレス:ポート",
        "NO_PROXY=127.0.0.1,localhost,192.168.99.100,社内でアクセスしたいIP",
        "TZ=Asia/Tokyo",
        "NTP_SERVER=社内の時刻同期サーバ"
      ],
    }
  }
}
```
これでもうプロキシサーバと戦わなくて済む！

## 追記:2016/09/09
新しい環境を構築していたら、またまた仕様が変わってた。
設定作業内容はboot2dockerとほぼ同様で、保存先ファイルが /var/lib/boot2docker/profile になった。
Upverter > プロジェクトの消し方 / How to delete Project 

http://qiita.com/exabugs/items/a8b3b399160cdd5ee47a
にて紹介されたUpverterを少しずつ使っている。

プロジェクトを消したいと思ったが、その方法が最初よく分からなかった。
以下のようだ。

1. Dashboardを選択
2. 削除したいプロジェクトを選択
3. Edit Detailsを選択
4. Delete Projectを選択

<font color=red>Delete Projectを押したときに確認ダイアログもなく消えるので注意
(When you select "Delete Project", your project will be deleted without asking confirmation. )
</font>
ログをlogmon で監視してSlackに通知


## logmon のインストール

logmon のインストールについては、以前書きました。

http://qiita.com/inouet/items/cc1eacef237f2328e98f


## Slack client のインストール

Slack のAPIをcurlで叩いてもいいんですが、もうちょっと簡単な方がいいので、Slack clientを入れてみました。

https://github.com/cleentfaar/slack-cli


```
$ curl -sS http://cleentfaar.github.io/slack-cli/installer | php
$ sudo mv slack.phar /usr/local/bin/slack
```

slack コマンドを /usr/local/bin/slack に配置しました。

## Slack client 設定

logmon は root　で実行されるので、rootに トークンをセットしておきます。

```
# /usr/local/bin/slack config:set default_token <your-token-here>
```

## logmon 設定

/etc/logmon/logmon.conf

```
:/home/foo/bar/error.log
(.+)
/usr/local/bin/slack chat:post-message general "<%%%%>" --username=$(hostname) --icon-emoji=bike
```

1行め、: から始まる行が監視対象のファイル、2行めが監視文字列（今回はなんでもマッチ）、3行めが実行するコマンドです。
<%%%%> のところに2行めの正規表現にマッチした行が入ります。

logmon 再起動

```
# /etc/init.d/logmon restart
```

## テスト

ログに何か出力してみる

```
$ echo "test" >>  /home/foo/bar/error.log

```

Slackに通知されていることを確認。
【Kotlin】whenでif-else


KotlinのwhenはJavaのswitch文とは異なりstringの比較を行うことが出来るうえに、whenは引数をとる必要が無いのでif-elseをwhenで書くことが出来ます。

ただ、when文のorにハマりポイントがあるのでメモ程度に紹介します。


# whenでのif-else(基本構文)

## Java <-> Kotlin

* Java

```java
int hoge = 2

if(hoge == 0) {
	System.out.println("0")
} else (hoge == 1 || hoge == 2) {
	System.out.println("1, 2")
} else {
	System.out.println("else")
}

// 1, 2
```

* Kotlin(引数あり)

```kotlin
val hoge = 2

when (hoge) {
	0 -> {
    	println("0")
    }
    1, 2 -> {
        println("1, 2")
    }
    else -> {
    	println("else")
    }
}

// 1, 2
```

* Kotlin(引数なし)

```kotlin
val hoge = 2

when {
	hoge == 0 -> {
    	println("0")
    }
    hoge == 1 || hoge == 2 -> {
        println("1, 2")
    }
    else -> {
    	println("else")
    }
}

// 1, 2
```

こんな感じでif-elseをwhenで書き換える事が出来ます。


# orの書き方


上記のでwhenでは、引数無しのwhenでは`,` 引数ありでは`||`を使いましたが、ハマりポイントがあるので詳しく見ていきたいと思います。
operatorに関しては[ここ](https://kotlinlang.org/docs/reference/operator-overloading.html)を読んで下さい。
この記事も面白いです。
[【Kotlin】 OperatorとInfixでCustom operatorを作る](http://qiita.com/AAkira@github/items/d2cb56eff8952ecfc66b)


* 引数ありの場合

コンパイラのチェックでは`or`も使用することが出来ます。
ここでは`||`は使えません。

```kotlin
val hoge = 2

when (hoge) {
	0 -> {
    	println("0")
    }
    1 or 2 -> {
        println("1, 2")
    }
    else -> {
    	println("else")
    }
}

// else
```

しかし、結果は **elseになってしまう** ので注意が必要です。

|  ,  |  or  |  11  |
|:---:|:----:|:----:|
| ◯   | △    | ☓    |

※ △はコンパイラは通るが求める結果と異なる
※ markdownの都合上`||` -> `11`になっています


* 引数なしの場合

この場合`||` `,`は使用可能ですが`or`は使えません。
ただ、`,`を使った場合はコンパイラが引数なしの場合に変換してくれます。


```kotlin
val hoge = 2

when {
    hoge == 0 -> {
    	println("0")
    }
    hoge == 1, hoge == 2 -> {
        println("1, 2")
    }
    else -> {
    	println("else")
    }
}

// 1, 2
```

|  ,  |  or  |  11  |
|:---:|:----:|:----:|
| ◯   | ☓    | ◯    |


### Booleanの場合

whenはもちろんBoolean型も判定に使用可能です。


```kotlin
val foo = false
val bar = true

when {
    foo -> {
        println("foo")
    }
    foo || bar -> {
        println("foo, bar")
    }
    else -> {
        println("else")
    }
}
// foo, bar
```

|  ,  |  or  |  11  |
|:---:|:----:|:----:|
| ◯   | ◯    | ◯    |

try-kotlinで入力したら`,`はコンパイルエラーだったのですが、
IntelliJではコンパイル可だったので◯にしています。
上記の引数ありの場合とは異なり全てfoo, barが出力されます。


### Enumの場合

もちろんEnumも使用可能です。

```kotlin
enum class Hoge {
    ABC,
    DEF,
    GHI,
    JKL
}
```

```kotlin
val value = Hoge.GHI

when (value) {
    Hoge.ABC -> {
        println("ABC")
    }
    Hoge.DEF, Hoge.GHI -> {
        println("DEF, GHI")
    }
    else -> {
        println("else")
    }
}

// DEF, GHI
```

Enumの場合は`,`のみ使用可能です。


|  ,  |  or  |  11  |
|:---:|:----:|:----:|
| ◯   | ☓    | ☓    |


### おまけ and

```kotlin
val foo = true
val bar = true

when {
    bar && foo -> {
    	println("foo and bar")
    }
    bar -> {
    	println("bar")
    }
    else -> {
    	println("else")
    }
}
```

andはどちらも使用可能です。

| and |  &&  | 
|:---:|:----:|
| ◯   | ◯    |



# まとめ

長くなりましたが、when構文はとても便利なのでKotlinでif-elseを使う際は積極的に使うことをオススメします。
現在のプロジェクトでもif-elseが出てくる箇所ではwhen文で比較しています。
ただ、引数ありの場合はorの書き方で結果が変わってしまうので注意が必要です。
Bashで、Railsのtryライクな実装をする


## ActiveSupportのtryメソッド

- ActiveSupportの[try](http://guides.rubyonrails.org/active_support_core_extensions.html#try)メソッドといえば、非常にかゆいところのnilチェックを不要にしてくれる、とてもイカすやつだ

```
@account = Account.find(445)
account_name = @account.try(:name)
```

```
@account = Account.find(445)
if @account.present?
  account_name = @account.name
end
```


## Bashで Let's try

- そんな `try` のようなものをBashでも実装してみた
- Bashの場合はオブジェクト指向ではないので、メソッドではなく、関数という形で、こんな感じ
- コマンドや関数、エイリアス等が存在しているかチェックして、存在している場合のみ実行する
- `~/.bash_profile` などに定義しておく

※ 書いておいてアレですが、将来的にBashに`try`句が実装される可能性を嫌って、私個人は`try_exec`として定義して使っています

```Bash:~/.bash_profile
function try() {
   if type $1 2>/dev/null 1>/dev/null; then
      eval $@
   fi
}
```

- どのように使うのかといえば、インストールされているかどうか、ifで確認してから実行する場面があると思う
- 例えば、[rbenv](https://github.com/rbenv/rbenv) の初期化処理で、rbenvが存在している場合のみ実行するのに、以下のようにするところ、

```Bash:~/.bash_profile
export PATH="$HOME/.rbenv/bin:$PATH"
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi
```

- こんな感じ、ちょっと綺麗に見えません...?

```Bash:~/.bash_profile
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(try rbenv init -)"
```

- パイプもok

```Bash
$ try fortune | try cowthink
```

- 完全にオレオレ流なので、流儀的にどうなのかは怪しいけど、使用は自己責任でオネシャス
Zybo > Chronicles blog 08 > XADC > System.mss / System.xml / xadcps.h / xil_types.h

@ Adam Taylor blog

https://forums.xilinx.com/t5/Xcell-Daily-Blog/MicroZed-XADC-Software-Adam-Taylor-s-MicroZed-Chronicles-Part-8/ba-p/383861

> When we last looked at the MicroZed we had just finished implementing the hardware and exporting it to the SDK. Once exported, you should be able to see the added XADC within the <font color=red>System.mss</font> and <font color=red>System.xml</font> files available under your board support package (BSP) and hardware definition respectively:

BSPの下に System.mss と System.xml が作成され、XADCが入っているとのこと。

>  In fact, the SDK does come with drivers for the XADC, which are defined with <font color=red>xadcps.h</font> and are available under the include files within the BSP.


> ...  I also included <font color=red>xil_types.h</font> to support the u32 type.
Ansible モジュール command

#command
リモートノードでコマンドを実行する

##概要
コマンド名＋スペース区切りの引数の形で受け付ける。コマンドは選択された全てのノードで実行される。シェルを通して実行しない為、<b>${HOME}</b>のような記述や、<b><</b>、<b>></b>、<b>|</b>、<b>&</b>のような記号は使用できない。（もしこれらの記述が必要であれば、[shell](http://docs.ansible.com/ansible/shell_module.html#shell)モジュールを使うこと）

##オプション

|引数|必須|デフォルト|値|備考|
|:---------|:---------|:---------|:---------|:---------|
|chdir|no|||実行前に指定されたディレクトリに移動。|
|creates|no|||ファイル名又はglobパターン(2.0以降)を作成。既に存在する場合、スキップされる。|
|executable|no|||コマンドを実行するシェルを変更。シェルへの絶対パスであること。|
|free_form|yes|||フリー形式のコマンドを実行可能。「free form」という引数は実際には存在しない。使用例を参照。|
|removes|no|||ファイル名又はglobパターン(2.0以降)を削除。それらが存在しない場合、スキップされる。|
|warn<br>(1.8で追加)|no|True||ansible.cfgでcommand_warningsがオンになっている場合、<b>no</b>又は<b>false</b>に設定することにより、そのコマンドに関しては警告を出さない。|

##使用例

```yaml:
# Ansible Playbooksからの例
- command: /sbin/shutdown -t now

# 指定したファイルがない場合コマンドを実行する
- command: /usr/bin/make_database.sh arg1 arg2 creates=/path/to/database

# 「args」を使いオプションを設定可能。
# 作業ディレクトリをsomedir/に変更し、/path/to/databaseandが存在しない場合のみ実行される。
- command: /usr/bin/make_database.sh arg1 arg2
  args:
    chdir: somedir/
    creates: /path/to/database
```

##注意点
- シェルを通じてコマンドを実行したい（<、>、 |等を使う ）場合、[shell](http://docs.ansible.com/ansible/shell_module.html#shell)モジュールを使うことが推奨される。commandモジュールはユーザの環境によって影響を受けない為、より安全である。
- 「creates」、「removes」、「chdir」はコマンドの後で指定する。例えば、あるファイルが存在しない場合のみコマンドを実行したい場合、これらを使用する。

###Ansibleコアモジュール
このモジュールはコア・アンシブルチームによりメンテナンスされます。
[Eclipse+VMware]Mavenがビルドエラーしちゃう時の対応策

#毎度！苦労させられる(愛されていない)Eclipse議事録です。

愛が足りないんですね。わかります。
ごめんね？Eclipse。愛してないようです。(だから所々よく壊れるのかしら。

##不調Picup。
SubMachineくんが、ビルドのたんびにMavenエラーが出る。
気になりつつGoogle先生でも同様のパターンがHitせず。
困らなかったのでほかっといた。けど直そうと思いまする。

##現状の環境
* Main → iMac(Bootcamp)
* SubM → macbookPro15(VMware Fusion7)
* Mobile → macbook12(Bootcamp)

で、お送りしております。

# Mac+Winで仕事するなら私の場合Bootcampが素敵と気がついた。
発端は、**VMでEclipseなど業務に使うアプリ系を動かすと重い。**というところから始まった。
MainMachineがBootcampってところがポイント。
同じBootcampだとローカルリポジトリの場所も同じ場所なので問題ないんです。
だけど、VMwareだとローカルリポジトリの場所が`¥¥VMware〜`になってしまうので、これを`C:¥〜`に変えます。
ここに気づくまでに苦労したからメモメモメモ。

## Mavenのsettingsファイルの作成
ローカルリポジトリの場所を移動するにあたって、Settingsファイルを作成します。
C:¥Usersに、.m2ディレクトリがないので、作ります。

管理者権限でcmdを立ち上げて、ユーザーフォルダに移動。
```cd C:¥Users¥ユーザー名``` 

それから.m2フォルダ作成。
```mkdir .m2```

それから、settings.xml作って↓`<localRepository>`にrepositoryフォルダの場所を記入。
それを.m2に格納します。
repositoryフォルダは勝手に作ってくれまする。

```lang:settings.xml
    <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                          http://maven.apache.org/xsd/settings-1.0.0.xsd">
      <localRepository>C:\Users\ユーザー名\.m2\repository</localRepository>
      <interactiveMode/>
      <usePluginRegistry/>
      <offline/>
      <pluginGroups/>
      <servers/>
      <mirrors/>
      <proxies/>
      <profiles/>
      <activeProfiles/>
    </settings>
```

これでパスも通ったし、ブツも揃った。

## Eclipseの設定→Maven→ユーザー設定
参照ボタンを押してsettingsファイル指定。
設定の更新を押すと、ローカルリポジトリの場所が変わります(*^^*)わあい♥

## Eclipseをクリーン
はい。それではいつもの
『困ったときのEclipseを　**eclipse.exe -clean**　で起動。』

##それでは、早速ビルドしてみましょう！

・・・治ったー♡(∩´∀｀)∩ﾜｰｲ
Zybo > Chronicles blog 07 > XADC > AXI 4 lite interface > S00_AXI / M00_ACLK / M01_ACLK

@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Getting-the-XADC-Running-on-the-MicroZed-Adam-Taylor-s-MicroZed/ba-p/380989

> The next thing to do is to connect this AXI port within the PS to an AXI Interconnect block. Doing this allows the Zynq PS to interface to the XADC’s <font color=red>AXI 4 lite interface</font>. You add the AXI Interconnect block to your block diagram from the Vivado IP Catalog. Once you have added it to the block diagram, connect the PS master AXI port to the AXI Interconnect Slave port. Connect FCLK_CLK0 from the PS to the AXI interconnect’s S00_ACLK and master aclk. Similarly, connect the resets as shown in the diagram above.


### axi_interconnect足してみた

blogの画像は不鮮明だが、なんとなくで近いものをVivadoで作ってみた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/003514c6-04af-5a98-7847-b7e271acbdda.png)

axi_interconnect_xで見える以下のもの

- S00_XXX
- M00_XXX
- M01_XXX

slave と master だろうか。
現時点ではよくわからない。

自分で足したaxi_interconnect_0にはM付きのものがM00とM01の２つがあるが、blogの画像ではM00しかない。これもわかっていない。

blogを読み進めるうちにわかるだろう。

> Once the AXI Interconnect is wired to the PS we can customise the AXI Interconnect to select the number of slave and master ports. Click on the AXI interconnect module and you will be able to select the number of master and slave interfaces. In this example I selected one of each.

という記載がすぐ下にあった。

`Number of Master Interfaces`が2になっていた。1にしたらblogと同じ感じになった。


### XADC足してみた

blogの画像と違う(xadc_wiz_0が複雑になっている)のはVivadoのバージョン違いが理由なのだろうか?

```txt:動作確認
Vivado 2015.4 on Windows 8.1 pro (64bit)
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c7d8f07e-1c82-ddcb-6ed4-60120f768806.png)
[Linux][ImageMagick] スキャナで取り込んだPDFから特定のページを画像で取り出す

スキャナで紙資料をPDFにしたもので、特定のページを画像ファイルにして抽出することができます

# PDFから画像を抽出するには

ImageMagickのconvertコマンドを使います

## コマンド

<pre>
$ convert -density %解像度% %PDFファイル%[%ページ%] %画像ファイル%
</pre>

* 解像度の指定は"横x縦"で指定します (200dpiであれば 200x200 で指定します)
* ページ番号は0から始まります。PDFにあるページより大きい値を指定するとエラーになります
* ページ番号を省略した場合は全てのページが変換され、変換後のファイル名に連番が振られます
* 画像ファイルには拡張子を付けることで、任意の形式で出力することができます (.jpg .pngなど)

## 実行例

PDFの2ページ目(0から始まるので1は2ページ目になる)をPNG画像に出力

<pre>
$ convert -density "200x200" "2016年02月04日21時02分23秒.pdf[1]" "page001.png"
</pre>

PDFの全てのページをJPG画像に出力

<pre>
$ convert -density "200x200" 2016年03月12日08時00分51秒.pdf page.jpg
</pre>

* page-0.jpg, page-1.jpg, page-2.jpg ,... という形でファイル名に連番が付けられていきます
* 変換にはメモリを大量に使用する場合がありますので、ページ数が多すぎると変換に失敗することがあります。その時はページ数を指定して小分けに変換してください

# 複数の画像をPDFにするには

逆に、抽出した複数の画像をPDFにすることもできます

## コマンド

<pre>
$ convert %1ページ目の画像% %2ページ目の画像% ... %PDFファイル名%
</pre>

## 実行例

<pre>
$ convert page000.jpg page001.jpg document.pdf
</pre>

スキャンし終えてPDFに後でページを追加したり、余分なページを省きたい時に使えると思います
Zybo > Chronicles blog 07 > XADC > 内部状態を見ることができる > VCCInt / VCCAux / VRefP / VRefN / VCCBram / VCCPInt / VCCPAux / VCCDdr

@ Adam Taylor blog

https://forums.xilinx.com/t5/Xcell-Daily-Blog/Getting-the-XADC-Running-on-the-MicroZed-Adam-Taylor-s-MicroZed/ba-p/380989


> One great advantage is that you can use the XADC to monitor a number of internal device parameters to verify the health of your design. In addition, to ease verification during the early stages within a Zynq SoC-based system, you can use the XADC to measure the temperature as recorded by the on-chip temperature sensor, along with the following additional parameters:
 
- VCCInt: The internal PL core voltage
- VCCAux: The auxiliary PL voltage
- VRefP: The XADC positive reference voltage      
- VRefN:The XADC negative reference voltage
- VCCBram: The PL BRAM voltage
- VCCPInt: The PS internal core voltage
- VCCPAux: The PS auxiliary voltage
- VCCDdr: The operating voltage of the DDR RAM connected to the PS

これらの電圧をチェックすることでZynqが正常に動作しているのか確認できそうだ。
Zybo > Chronicles blog 07 > XADC > ノイズ軽減 > 16-, 64- or 256-sample averaging

@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Getting-the-XADC-Running-on-the-MicroZed-Adam-Taylor-s-MicroZed/ba-p/380989


> The XADC supports user-selectable averaging to reduce input noise and offers <font color=red>16-, 64- or 256-sample averaging</font>. You can also program an automatic series of minimum and maximum alarm levels for each measured internal device parameter (voltage and temperature).

MSP430でいうところのOSR(Over sampling ratio)みたいなものをするということだろうか。
Zybo > Chronicles blog 07 > XADC > SNR / THD / ENOB > ENOB = (SNR - 1.76 / 6.02)

@ Adam Taylor blog

https://forums.xilinx.com/t5/Xcell-Daily-Blog/Getting-the-XADC-Running-on-the-MicroZed-Adam-Taylor-s-MicroZed/ba-p/380989

> The XADC’s mixed-signal performance is very good, with a minimum 60-dB <font color=red>signal-to-noise ratio (SNR)</font> and 70 dB of <font color=red>total harmonic distortion (THD)</font> according to the data sheet. Depending upon the operating temperature range, -55 to 125°C or -40 to 100°C, the XADC’s resolution is 10 bits or 12 bits respectively. This gives the XADC an <font color=red>equivalent number of bits</font> of 9.67 when using the equation

```math
ENOB = (SNR - 1.76 / 6.02)
```

### dB関連
http://qiita.com/7of9/items/c3ea67cf58990f52f57a

上記のSNRの場合はlog(比)の前の係数は10なのか、20なのか、未消化。


### THD

https://en.wikipedia.org/wiki/Total_harmonic_distortion

さっぱりわからん。

### ENOB

http://www.cqpub.co.jp/term/enob.htm

上の式はZynq/Zybo特有でなくADCの一般的なもののようだ。

1.76と6.02は何から来ているのかは興味があるが今日は調べない。

[このダウンロードに時間がかかるPDFファイル](http://www.xilinx.com/publications/archives/xcell/Xcell80.pdf)に詳細が書かれているとblogに書いている。
【エラー】Attempt to insert non-property list object


NSUserDefaultにNSMutableArrayを突っ込もうとしたら怒られました。

```
reason: Attempt to insert non-property list object
```

ここにバッチリ書いてありました。
[iPhoneアプリ開発虎の巻](http://iphone-tora.sakura.ne.jp/nsuserdefaults.html)

>NSUserDefaultで保持できる型は、NSString型、NSNumber型、NSArray型、NSDictionary型、 NSData型、NSDate型のみです。
これ以外の型を保持させたい場合は一旦NSData型に変換してから保持し、読み込む時もNSData型として読み込んだ後に型変換を行う必要があります。

はい、覚えました。

```
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:mutableArray];
[userDefault setObject:data forKey:@"hoge"];
```

わーいできた〜
iOSの「写真」アプリみたいなギャラリーを作る

# iOSの「写真」アプリみたいなギャラリーを作る

iPhoneの「写真」アプリってデフォルトだけあってギャラリーアプリとしては快適な動きをします。

http://recordit.co/CPaQC1SSPF

これを自作するとなると意外にもいいライブラリも見つからず、また、これだ！と思うコードも見つからなかったので自作してみたという話です。


コードは以下

https://gist.github.com/yama23/1f870f2a6dee886aa185



## 基本はUIScrollViewを使う

ギャラリーの動きはUIScrollViewで再現できます。表示したい写真をUIScrollViewを下地に、水平方向に並べて`addView`させます。ただし、標準だと写真と写真の境目で止まらないので、`pagingEnabled` を `YES` にしてページ送りの動きにします。


## 表示したい写真の前後だけaddViewする

仮に10枚の写真を表示したければ10枚分`addView`すればいいでしょうが、これが何百、何千になったらメモリが足りなくなったり重くなったりするでしょう。なので、最初に表示するべき写真とその前後の写真3枚のみを`addView`し、スクロールが完了したタイミングで前のaddView画像を破棄し、新たに3枚の写真を`addView`するという仕組みにしました。

## スクロールを「進めた」か「戻った」かの判定がシビア

この処理は、スクロールが完了した時に呼ばれるメソッド`scrollViewDidEndDecelerating`内で行っていますが、スクロールを開始して指を離して自然と止まる（ページ送りが完了する）前に指で止めても呼び出されるため、自然と止まったか、そうでないかの判定をしておかないと、表示されるべき画像がおかしくなります。
試行錯誤したあげく、結局は`scrollViewWillBeginDecelerating`という指を離したタイミングで呼ばれる関数内で一旦スクロールを不許可にして止めれないようにして、`scrollViewDidEndDecelerating`で元に戻すという処理にしました。


## おわりに

以上でギャラリーっぽいアプリにはなりましたが、`scrollViewWillBeginDecelerating`でスクロール禁止しているだけあって、高速で移動することができません。他にもサムネイルを画面下部に表示させた上で、サムネイル直接選択で画像にジャンプするとかいう機能もつけてみたいところではあります。というか、もっと探せば便利なライブラリがありそう、、
CapybaraでReactをテストしようとしたらエラーになった件

RailsでReact.jsをE2Eテストを行おうとしたらエラーになってハマりました。
しかもローカルではテストをパスするのにCircleCIで動かしたらエラー吐いた


開発環境

- Rails(4.2.5)
- Capybara (2.6.0)
- Poltergeist (1.8.1)
- react-rails(1.5.0)

以下エラーメッセージ
>Capybara::Poltergeist::JavascriptError:
        One or more errors were raised in the Javascript code on the page. If you don't care about these errors, you can ignore them by setting js_errors: false in your Poltergeist configuration (see documentation for details).
      
        TypeError: 'undefined' is not a function (evaluating 'RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\d_.\-]*$/)')
        TypeError: 'undefined' is not a function (evaluating 'RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\d_.\-]*$/)')
            at http://127.0.0.1:55927/assets/application.js:27030
            at http://127.0.0.1:55927/assets/application.js:16683 in __webpack_require__
            at http://127.0.0.1:55927/assets/application.js:25132
            at http://127.0.0.1:55927/assets/application.js:25210
            at http://127.0.0.1:55927/assets/application.js:16683 in __webpack_require__
            at http://127.0.0.1:55927/assets/application.js:16792
            at http://127.0.0.1:55927/assets/application.js:16867
            at http://127.0.0.1:55927/assets/application.js:16683 in __webpack_require__
            at http://127.0.0.1:55927/assets/application.js:16743
            at http://127.0.0.1:55927/assets/application.js:16683 in __webpack_require__
            at http://127.0.0.1:55927/assets/application.js:16723
            at http://127.0.0.1:55927/assets/application.js:16683 in __webpack_require__
            at http://127.0.0.1:55927/assets/application.js:16710
            at http://127.0.0.1:55927/assets/application.js:16683 in __webpack_require__
            at http://127.0.0.1:55927/assets/application.js:16703
            at http://127.0.0.1:55927/assets/application.js:36304


# 解決方法
どうやらphantomjsのバージョンが低くてbindが定義されていないのが問題らしい。
es5-shimをいれるといいらしい、というのが[こちら](
http://stackoverflow.com/questions/26102903/capybara-poltergeist-and-reactjs-undefined-is-not-a-function)にありました。

- [es5-shim](https://github.com/es-shims/es5-shim/blob/master/es5-shim.js)の入手先
- applicaion.jsでreactよりも前にshimを読み込ませる

        //= require es5-shim
        //= require react
        //= require react_ujs
UIStoryboardからUIViewController取得する過程で間違ったStoryboard名を渡して落とさないためのUIViewControllerExtension

## 概要

UIStoryboardインスタンス生成時に存在しないStoryboardファイルの名前を渡すと `NSInvalidArgumentException`が発生します。

そもそも渡す名前を間違えなければ問題ないのですが、気になったので安全な方法が無いか調べてみました。

## 方法

[stackoverflow](http://stackoverflow.com/questions/31955234/instantiate-uistoryboard-at-runtime-in-swift2-how-to-handle-failure)にありました。😃

`NSBundle.mainBundle().pathForResource("StoryboardName", ofType: "storyboardc")` でStoryboardのパスがあるかを確認すればいいみたいです。

```swift

import UIKit

extension UIViewController {

    public class func safetyDestinationViewController(storyboardName: String) -> UIViewController? {

        guard let _ = NSBundle.mainBundle().pathForResource(storyboardName, ofType: "storyboardc") else{
            return nil
        }

        let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
        guard let vc = storyboard.instantiateInitialViewController() else{
            return nil
        }

        return vc
    }
}
```

viewControllerのstoryboardIDも指定できるようにしたい所ですが、`instantiateViewControllerWithIdentifier`メソッドに間違ったIDを渡して落ちるときの対処方法がわかりませんでした。。。

参考

[Instantiate UIStoryboard at runtime in Swift2, how to handle failure?](http://stackoverflow.com/questions/31955234/instantiate-uistoryboard-at-runtime-in-swift2-how-to-handle-failure)
[Swift]Swift2.0からUIUserNotificationTypeのoption設定が変わった

#UIUserNotificationTypeの"|"でエラーした
Swift1.2まではUIUserNotificationTypeのoption設定は"|"で区切ることによって複数設定していた。が、Swift2.0に更新したらerrorが発生しちゃった。
どうやらUIUserNotificationTypeの型がRawOptionSetType（Bit演算可能）からOptionSetType（Bit演算不可能）に変更されたのが原因らしい。

・Swift1.2 ver

```swift:AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
        
    application.registerUserNotificationSettings(
        UIUserNotificationSettings(forTypes:
            UIUserNotificationType.Sound
              | UIUserNotificationType.Badge
              | UIUserNotificationType.Alert
            , categories: nil))

    return true
}
```
error: ```Binary Operator "|" cannot be applied to two UIUserNotificationType operands```

・Swift2.0 ver

```AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
        
    application.registerUserNotificationSettings(
        UIUserNotificationSettings(forTypes:
            [UIUserNotificationType.Sound,
                UIUserNotificationType.Badge,
                UIUserNotificationType.Alert]
            , categories: nil))

    return true
}
```

これでO.K.

###参考URL
StackOverFlow: http://stackoverflow.com/questions/30761996/swift-2-0-binary-operator-cannot-be-applied-to-two-uiusernotificationtype
Toyship.org: http://www.toyship.org/archives/2208
CSS セレクターで〈特定の属性を持たない〉をどう表すか

`href` を持たない `a` 要素にスタイルを適用したかったのですが，セレクターをどう書けばいいか，すぐには分かりませんでした。

[属性セレクターの一覧](https://developer.mozilla.org/ja/docs/Web/CSS/Attribute_selectors) をじーっと見ても載ってない。

`not` を使えばいいんですね。

```css
a:not([href]) {
  opacity: 0.7;
}
```
dephi > メタファイルテスト 2016/02/04 19:55

```txt:動作環境
Rad Studio XE4
Windows 7 pro 32bit
```

### code

```
procedure TForm1.BitBtn1Click(Sender: TObject);

var
  myMetafile   : TMetafile;
  myMetaCanvas : TMetafileCanvas;
  R            : TRect;
  File1: String;
  File2: String;
begin
  File1 := 'TEST_OLD.WMF';
  File2 := 'TEST_NEW.WMF';

  Image1.Picture.LoadFromFile(File1);

  myMetafile := TMetafile.Create;
  try
    R := Rect(0, 0, Image1.Picture.Width, Image1.Picture.Height);

    myMetafile.Enhanced := True;
    myMetafile.Width    := R.Right;
    myMetafile.Height   := R.Bottom;

    myMetaCanvas := TMetafileCanvas.Create(myMetafile, 0);
    try
//      myMetaCanvas.Draw(0, 0, Image1.Picture.Graphic);
      myMetaCanvas.StretchDraw(R, Image1.Picture.Graphic);
    finally
      MyMetaCanvas.Free;
    end;
    myMetafile.SaveToFile(File2);
  finally
    MyMetafile.Free;
  end;

  Image2.Picture.LoadFromFile(File2);
end;

end.
```


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c473813a-441d-d1d0-912d-e1e35f309856.png)


### Stretchプロパティ = true

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f82d776d-1152-d470-0752-d2703a676965.png)
Java 8 でモックを作るさいの注意メモ。

自分の場合は Java 8 & Spock でぶち当たった問題だけれど、元をたどると cglib というモック時にバイトコードをごにょごにょするライブラリに問題があった。
cglib というと Mockito、EasyMock や PowerMock でも使われているので、それなりのインパクトがあると思う。

# 結論
Maven レポジトリ上だと、Spock 1.0 (Groovy 2.4) は cglib 3.1 にオプショナルで依存しているけど、Java 8 でモック機能を使いたいなら 3.2 を使わないとダメっぽい。

# 経緯
Spock 1.0 (Groovy 2.4) と cglib 3.1 をMavenで導入し、よし何かテスト書いてやろうと思ったら、モックの際に `IllegalArgumentException` が出てしまった：

```groovy:HelloMySpec.groovy
import spock.lang.Specification

class HelloMySpec extends Specification {
    def "test description"() {
        setup:
        def mock = Mock(SomeClass) // <-- こ奴が問題

        expect:
        name.size() == length

        where:
        name    | length
        "Spock" | 5
    }
}
```
以下の様な例外：

```java
java.lang.IllegalArgumentException
    at net.sf.cglib.proxy.BridgeMethodResolver.resolveAll(BridgeMethodResolver.java:61)
    …
```

ググってみると、Spock のイシュートラッカーに cglib 3.2 を使ってみたら治ったよ、という[書き込み](https://code.google.com/archive/p/spock/issues/384)があったので、従ってみたところ見事解決。
AngularJsにて、input[type=number] のバリデーションを行う



Angular 1.4.7にて...

html5から追加されたinput[type=number]用いたフォームの部品で、数字以外が入力された場合のチェックをng-patternで正規表現を書いて対応しようと思ったが、一応 [ドキュメント](https://docs.angularjs.org/api/ng/input/input[number]) を読んでみる。


```example.html
<div role="alert">
  <span class="error" ng-show="myForm.input.$error.required">
    Required!</span>
  <span class="error" ng-show="myForm.input.$error.number">
    Not valid number!</span>
</div>
```

数値以外を入力した際には $error.number が追加される、と。賢い！

やはりなにかヤる前にはドキュメントを読むべきですね...
Carthageのcopy-frameworksでInput Filesに追加するframeworkの一覧を出力するスクリプトを書いてみた


## :package:概要
`carthage update`を行ったあとに、Targetの[Build Phases]にRunScriptを作って、
以下のようにcommandとInput Filesにライブラリのframeworkのpathを指定するのですが、
![スクリーンショット 2016-02-04 16.57.42.png](https://qiita-image-store.s3.amazonaws.com/0/27802/f2195f8f-0dfc-9500-01c2-9ae3ec95a21c.png "スクリーンショット 2016-02-04 16.57.42.png")

このInputFilesに入力するpathの一覧をターミナルで出力できるように、スクリプトを書いてみました。
特に手入力して頑張る場合、typoする可能性もあるので、正確なpathを吐き出してもらったほうが安心したりします。

## :notebook_with_decorative_cover:コード

こんな感じで書いてみました。
体裁は[こちら](http://qiita.com/blackenedgold/items/c9e60e089974392878c8)を参考にさせて頂きました。
Gistは[こちら](https://gist.github.com/sgr-ksmt/2f3a91159ef4cc7ff470)です。

```bash:carthage-framework-paths.sh
#!/bin/bash
usage() {
    cat <<HELP
SYNOPSIS:
  $0 [-d] [iOS(default)|watchOS|tvOS|Mac]
  $0 [-h]

ARGUMENTS:
  iOS       print paths for iOS (default)
  watchOS   print paths for iOS
  tvOS      print paths for iOS
  Mac       print paths for iOS

OPTIONS:
  -h  Show usage
  -d  output decorated result, e.g. "\$(SRCROOT)/Carthage/Build/iOS/APIKit.framework",

EXAMPLE:
  $0 iOS
  $0 -d watchOS

HELP
}

framework_not_found() {
  echo "framework not found."
}

print_paths() {
  dir_path="Carthage/Build/$1"
  if [ ! -d $dir_path ]; then
    framework_not_found; exit 0;
  fi
  if [ $DECORATE -eq 1 ]; then
    paths=$(find Carthage/Build/"$1" -type d -name "*.framework" | xargs -n 1 -I % echo '"$(SRCROOT)/'%'",')
  else
    paths=$(find Carthage/Build/"$1" -type d -name "*.framework" | xargs -n 1 -I % echo '$(SRCROOT)/'%)
  fi
  [ ! -z "$paths" ] && echo "$paths" || framework_not_found
}

main() {
  SCRIPT_DIR="$(cd $(dirname "$0"); pwd)"
  DECORATE=0
  for ARG; do
    case "$ARG" in
      -*)
      while getopts h,d OPT "$ARG"; do
        case "$OPT" in
          h) usage; exit 0;;
          d) DECORATE=1;;
          *) exit 1;;
        esac
      done
      ;;
    esac
  done

  shift $(expr $OPTIND - 1)
  if [ $# -gt 1 ]; then
    echo -e "Too many arguments. See below:\n"; usage; exit 1;
  fi
  if [ ! -d Carthage/Build ]; then
    echo "directory \"Carthage/Build\"  not found"; exit 1;
  fi
  print_paths ${1:-iOS}
}

main "$@"
```

## :coffee:使い方

事前に`carthage update`等でCarthage/Build以下にframeworkが生成されている状態にします。
あとは、上記shファイルをプロジェクトのルートディレクトリに配置して実行するだけです。

デフォルトで **"Carthage/Build/iOS"** 中のframeworkのpathを出力しますが、
引数で **"iOS, watchOS, tvOS, Mac"** を指定すれば、それぞれのプラットフォームに対応したframeworkのpathの一覧を出力します。
あとはこれをInput Filesに追加していけばオッケーです:smiley: 

## :pencil2:出力してみる

```bash:output
$ ./carthage-input-files.sh
# 出力結果
$(SRCROOT)/Carthage/Build/iOS/APIKit.framework
$(SRCROOT)/Carthage/Build/iOS/Bond.framework
$(SRCROOT)/Carthage/Build/iOS/FirstAppearing.framework
$(SRCROOT)/Carthage/Build/iOS/Himotoki.framework
$(SRCROOT)/Carthage/Build/iOS/Result.framework

$ ./carthage-input-files.sh watchOS
# 出力結果
$(SRCROOT)/Carthage/Build/watchOS/APIKit.framework
$(SRCROOT)/Carthage/Build/watchOS/Result.framework

```
[Laravel]POST通信が上手くいかない場合に確認すること

# POSTが上手くいかなかったのでその時に確認事項を覚書

こうゆうルーティングを書いた

```php
Route::group(['prefix' => 'search'], function()
{
    Route::post('/', 'SearchController@postSearch');
});
```

そしてこうゆうform書いた

```html
<form acton="http://xxxx.com/search/" method="post">
{{ csrf_field() }}
```

submitした。
ダメでした。。。

## 解決

```html
<form acton="http://xxxx.com/search" method="post">
{{ csrf_field() }}
```

URLの最後に「/」があるとPOST後に「301」でGETリダイレクトされる。
そういう仕様なのでしょうかね？
とりあえず覚書。
Choregraphe 複数のBoxをまとめる

Choregrapheで複雑な処理をさせようと頑張っているとと、だんだんBoxが増えちゃいますね。
そうすると操作もしづらいし見た目も煩雑です。

そんなとき、複数のBoxをひとまとめにできると楽ですね。
C言語でいうと関数化みたいなものです。


1.Choregraphe上でまとめたいBoxを選択します。
(複数選択は "Shiftを押しながらクリック" でできます)

2.右クリックして、「Convert to Box」を選択します。

3.Nameにわかりやすいタイトルをつけます。

これで完了です！
Herokuデプロイを簡単にするGit史上最低のコマンド

##概要
PaaSのHerokuを使ってWEBサービスやアプリのサーバーを運用しています。個人開発のサービスでは修正して（テスト無しで・・・）とにかく早くデプロイしてしまいたい、という時がたくさんあります。（あると思います）

そんな時、これまでは

> git add .
> git commit -m "commit message"
> git push heroku master

という3行のコマンドを打たなければなりません。テスト環境になんかアップせずいきなり本番ですし、commitの粒度なども無視しています。commitのメッセージも適当に書いてしまうこともあります。

そんなクソ開発環境においては、3行のコマンドすら面倒くさいのです。そこで、Git史上最低のコマンドではないかと思っていますが、これをたった5文字で完結させるgitのサブコマンドを公開します。それが、

**git uh**

です。git update herokuを省略して、git uhとしました。

中身は

`git add -A && git commit -m 'latest commit' && git push heroku master`

と、そのまま連結しただけです。

しかし・・・これはかなり作業効率がアップします。ぜひGit史上最低のコマンドをお試し下さい。

##配布場所
https://github.com/naoya0731/git-uh

##設置方法
`git --exec-path`

をコマンドラインで打ち、設置場所を確認し、そのフォルダ内に git-uh ファイルを置きます。

`chmod +x <ファイルのパス>`

とします。

すると

`git uh`

使えます。

糞コマンドお試しください！

PS　ブログもやっています
http://naoyaf.com/?p=19