OmniAICreator/Qiita-1.07M huggingface dataset:
MiniSAT を mac で動かしたメモ


## はじめに

こんにちわ、[ユニバ](http://uniba.jp)の [MJ](https://www.facebook.com/jun.mori.351) です。
普段はフロントエンドをしているんですが、社内の動きもありそろそろ C++ に手を出したいと思っていた時の話です。

## SAT と SAT solver

この話はカナーーーーリ長くなるので割愛。でもここら辺を読んでくれれば嬉しい。

* [充足可能性問題](https://ja.wikipedia.org/wiki/%E5%85%85%E8%B6%B3%E5%8F%AF%E8%83%BD%E6%80%A7%E5%95%8F%E9%A1%8C)
* [高速SATソルバーの原理](http://www-erato.ist.hokudai.ac.jp/docs/seminar/nabeshima.pdf)
* [MiniSAT](http://minisat.se/)
* [コンペティション](http://www.satcompetition.org/)

かくいう私も山がいっぱいある中の大学でSATを学んでいた一人です。

`SAT` というのは充足可能性問題のことで、それを解くのが `SAT Solver` です。
`SAT` は `NP完全`な問題として知られています。つまり数ある　`NP` な問題でもっとも難しく解き方によっては指数的に時間がかかってしまう問題(こんな言い方であっているのかとても不安！)

ともあれ、`Solver` は この問題を効率良く解くための施策がいくつもされていて、それがとっても C++ の勉強に役立つ。ということです。

`MiniSAT` はオープンソース なので自分で改造して性能を伸ばすことができます。
ちなみに `Solver` の評価尺度はより早く問題を解くことなので、とてもシンプル。
コンペティションもあるのでみんなもやってみよう！

## MAC で動かしてみよう

さて、上の話についてけた人なら当然
`xcode` は入っているだろうし `brew` も入っているでしょう。
入ってない人はとりあえず、入れましょう。

### gcc

さて `xcode` 経由で入れた `gcc` のバーションは少し古いです(私は 4.2でした。)
これだと 最新の `minisat-2.2.0` をコンパイルしようとすると error します。

```error
/core/SolverTypes.h:50:16: error: friend
      declaration specifying a default argument must be a definition
    friend Lit mkLit(Var var, bool sign = false);
```

mkLit 関係で error しているようです。 これを解消するために `gcc5系` を `brew` 経由で `install` しましょう。

### brew install

まずは `search`

``` search
brew search gcc
```

そうすると次のような結果が返ってきました

```
gcc ✔
homebrew/dupes/apple-gcc42            homebrew/versions/gcc45               homebrew/versions/gcc48               homebrew/versions/gcc6              
homebrew/versions/gcc43               homebrew/versions/gcc46               homebrew/versions/gcc49               homebrew/versions/llvm-gcc28        
homebrew/versions/gcc44               homebrew/versions/gcc47               homebrew/versions/gcc5                Caskroom/cask/gcc-arm-embedded 
```

どうやら私は `brew install gcc` していた模様。もしかしたら `homebrew/versions/gcc5` しても良いかもしれない。

### install した gcc を使う

`install` した gcc を見に行きましょう。私は `brew` で `install` したものは `/usr/local/bin/` に入っているので確認します。
そうすると

```/usr/local/bin/の中
gcc-5
g++-5
```

はい、version5 系の gcc が入っていました。
これを `minisat` のコンパイルの時に使うよう指定してあげましょう。
ちなみに コードは [ココ](http://minisat.se/downloads/minisat-2.2.0.tar.gz)からダウンロードして
適当なフォルダに展開します。
そのあとで、展開したフォルダにこんな感じのシェルを書いておくと楽かも

```shell
#!/bin/sh

export MROOT=$(pwd)
cd ./core
make r CXX=g++-5
```

加えて、Apple 用に `/utils/System.cc` を次のように変更します。

```
#elif defined(__APPLE__)
#include <malloc/malloc.h>

double Minisat::memUsed(void) {
    malloc_statistics_t t;
    malloc_zone_statistics(NULL, &t);
    return (double)t.max_size_in_use / (1024*1024); }
double Minisat::memUsedPeak(void) {return memUsed(); } <- この行を追記

#else
```

`./build.sh` を実行すれば `gcc5系`でコンパイルされ、`solver` の実行ファイルができるはずです。

## 終わりに

これを `xcode` で build して動かしたい気持ちになっている。できるかな。
とりあえずは `terminal` で動かして `SAT` の学習を始めましょう。
テンプレートクラスのメソッドの部分特殊化

# やりたいこと


```cpp
// ※このコードはコンパイルできません
template<class A, bool b = false>
class Outer {
public:
    void func(void) { cout << "Default" <<endl;};
}

// 第二テンプレート引数をtrueにすると、メソッドの挙動が変わるようにしたい
template <class A>
void Outer<A, true>::func(void) { cout << "Special" <<endl;};
```

# 回答

boolの値を一旦型にマッピングし、関数のオーバーロードでどうにかする

```cpp
template <class A, bool b = false>
class Outer2 {
private:
   // "maps" a bool value to a struct type
   template<bool B> struct i2t {};
   void funcImpl(i2t<true>) { cout << "Special" <<endl;};
   void funcImpl(i2t<false>) { cout << "Default" <<endl;};

public:
   inline void func() { funcImpl(i2t<b>()); }
}
```

# コメント欄から追記

### 最適化に任せる
単純にこれで。コンパイラがなんとかしてくれます。

```cpp
template<class A, bool b = false>
class Outer {
public:
    void func(void) 
    {
        if (b) {
            cout << "Special" << endl;
        } else {
            cout << "Default" << endl;
        }
    }
};
```
この程度の例だと起こりませんが、たとえ最適化で落とされる方でもコードがコンパイルエラーになるような場合は、上手く行かない場合もあります。
(akinomyogaさんのコメント参照)

### SFINAEを使う

```cpp
template< class A, bool b = false >
class Outer {
public:
    template< bool b0 = b, std::enable_if_t< b0, std::nullptr_t > = nullptr >
    void func()
      { std::cout << "true" << std::endl;};

    template< bool b0 = b, std::enable_if_t< !b0, std::nullptr_t > = nullptr >
    void func()
      { std::cout << "false" << std::endl;};
};
```


# 他に試したこと。

~~私が一番かっちょよくて、記述のコストも少ないなと思ったのは上の方法ですが、~~

他の方法として
①クラス全体を部分特殊化する
②部分特殊化したい関数を子クラスや関数オブジェクトに移譲する

という方法もあるみたいです

①の方法は、小さなクラスなら良いですが、大きなクラスだと大量にコピーする必要があり大変そうだと思いました。今回のようにスイッチひとつぐらいならともかく、intで渡した値で特殊化するとか、複数スイッチがあるような場合は管理コストも大変そうかなと。
もしくはテンプレートパラメータで切り替えられる一連のメソッド郡をまとめたクラスを作り、interface classみたいにして使うとか？

②の方法は、構造が階層化されてしまうため、親クラスのメンバやメソットを触りたい場合は、thisを渡してそれ経由で触る必要があります。これはちょっとわずらわしいかなと。

```cpp
// ②の例
template<class A, bool b = false>
class Outer3 {
public:
   // inner class の primary な定義
   template<class iA, bool ib>
   struct Inner { void func() { cout << "Default" <<endl;} };

   // inner class をtrueの場合に特殊化
   template<class iA>
   struct Inner<iA, true> { void func() { cout << "Special" << endl;} };

   // 移譲
   inline void func() { Inner<A, b>::func(); }
}
```

また部分特殊化でなければ、また話は変わってくるとおもいます
Aがなければ、これでよい

```cpp

// これは可
template<bool b = false>
class Outer4 {
public:
    void func(void) { cout << "Default" <<endl;};
}

// Outer全体を特殊化
template <>
void Outer4<true>::func(void) { cout << "Special" <<endl;};
```

# 参考文献

ここの方法を参考にしました
より詳しくはこちらをご覧ください
http://stackoverflow.com/questions/1501357/template-specialization-of-particular-members

どのテンプレートが特殊化・部分特殊化できる・できないか
http://mimosa-pudica.net/cpp-specialization.html

partial template specialization
http://en.cppreference.com/w/cpp/language/partial_specialization
``Members of partial specializations``の項目の``a2.f()``の呼び出しがエラーになる
自動的にprimary テンプレートの``f``を呼んでくれる、なんてことはないんですね・・・
だから、部分特殊化で①の場合、全部コピーしないといけない、のかな？
Docker Windows (1.12.0-rc2-beta)で -v (--volume)オプションを使う場合の注意点

# インストールしたままでは使えない。

Shared driveでドライブの共有が必要。
![20160701_195015#00.png](https://qiita-image-store.s3.amazonaws.com/0/116241/d73b9955-02c9-2123-7b75-c060d7aaf21e.png)
ここでCドライブのSharedをチェックして、Applyボタンを押す。
Microsoftアカウントとパスワードを入力する必要がある。

# どこでもマウントできるわけではない。

[Manage data in containers](https://docs.docker.com/engine/tutorials/dockervolumes/)に以下の記述があるように、

```
docker run -v /c/Users/<path>:/<container path> ...
```

実際には、

```
c:\Users\<myname>\<path>\<to>
```

という感じで`c:\Users\<myname>`以下のディレクトリしかマウントできない。
例えば、

```
docker run -v /c/develop/project/<hogehoge>:/<container path> ...
```

をマウントしようとしてもNGであった。
もしかしたら方法があるかもしれないが、私にはわからなかった。

# まとめ

とりあえず、マウントできたので今日はおしまい。
CocoaPodsでインストールできるオリジナルライブラリを作成する(3)

#目次

[CocoaPodsでインストールできるオリジナルライブラリを作成する(1)](http://qiita.com/nakau1/items/ec8117d789c4fb2d697a)
[CocoaPodsでインストールできるオリジナルライブラリを作成する(2)](http://qiita.com/nakau1/items/cc22985e2aad15ca02ff)
[CocoaPodsでインストールできるオリジナルライブラリを作成する(3)](http://qiita.com/nakau1/items/c3ea1d60fa81bbd87890)
[CocoaPodsでインストールできるオリジナルライブラリを作成する(4)](http://qiita.com/nakau1/items/15e7187d422cbf8ffb7e)

> 注意
> 
> この話を書く上の例として、
> 自作ライブラリの名前として `"NeroBlu"` という名前をつけています
> 
> これは自分の屋号から取ってきた名前なので、ただの「サンプル名」としてご認識ください
> 名前は各自でご自由につけなおしてくださいね

#まえがき

ライブラリである以上、メンテナンスすることは絶対あります
それはバグ修正であったり、機能追加であったり、、

なので、ライブラリの中身を修正すれば
それを使用しているプロジェクトは最新のものをインストールしていきたいものですが、

単純にそういうわけにもいかないこともありますねぇ

ライブラリの中身の修正により
今まで動いていたものが動かなくなることもあります

なので、`CocoaPods` の利点であるバージョン指定でそれを解決したい

手段としては、

* タグを使う方法
* リリースを使う方法

が、あると思いますが、今回はタグを使う方法を書きたいと思います

#タグ付け
前回までのコミットに対して、git上でタグを付けます
タグ名は `"1.0.0"`としておきます

で、
前項で作った `String+Echo.swift` を少し書き換えます

```String+Echo.swift
import UIKit

public extension String {
    
    public func echo() {
        print("ver 1.1: \(self)")
    }
}
```

`podspec` も `1.0.0` ではなく、`1.1.0` に書き換えてみます

```NeroBlu.podspec
d::Spec.new do |s|
  s.name         = "NeroBluTemp"
  s.version      = "1.1.0"
  s.summary      = "NeroBlu: Library for iOS."
  s.description  = ""
  s.frameworks   = "Foundation", "UIKit"
  s.source       = { :git => "https://github.com/xxxx/NeroBlu" }
  s.source_files = "NeroBlu/*"
end
```

これで `git push` します
すると、`NeroBluTemp`ライブラリは、`1.1.0` が最新となり
使用する側で pod install してやると

```
-> Installing NeroBluTemp (1.1.0)
```
と、見事に `1.1.0` がインストールされると思います


さて、これで前項で実装した

```ViewController.swift
import UIKit
import NeroBluTemp

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        "Hello".echo()
    }
}
```

のソースコードそのままで実行してみると

```
ver 1.1: Hello
```
コンソールにこのように`1.0.0` にはなかった出力がなされました

#バージョン指定
さて、次はバージョンを `1.1.0` にはしたくない場合です

`Podfile` にこのように書きなおします

```
use_frameworks!

pod 'NeroBluTemp', :git => 'https://github.com/xxxxx/NeroBlu', :branch => 'temporary’, :tag => ‘1.0.0’
```

`:tag => ‘1.0.0’` を追記しました
これで、さきほどタグ付けしたコミットが、バージョン`1.0.0` として扱われます


試しに `pod install` を行います

```
-> Installing NeroBluTemp 1.0.0 (was 1.1.0)
```
`1.1.0` だったものが `1.0.0` に差し戻されたことがログで確認できます

再度実行してみると

```
Hello
```
と、バージョン`1.0.0` 時の挙動でコンソール出力されたかと思います

修正ごとに面倒ですがバージョンを切っていけば、
後々に影響を受ける自分のプロジェクトは少なくなりますね

#あとがき

最初にも書きましたが、本来はリリースによってバージョン管理したいところ

自分のためだけに使うならタグの方法でいいのですけど
誰かに公開、共有するなら
`Podfile` に `~>1.0` という書き方でバージョン指定ができればと思うんですが・・・

ちょっとそこまで研究できてないので
今回は割愛します

また試したら書きます・・・。
CentOS7, FedoraなどのGnome3でペンタブレットの指タッチ機能をOFF

全国1000人くらいのLinuxでのwacomタブレット使いの皆様こんばんは。

CentOS7, FedoraなどのGnome3でペンタブレットの指タッチ機能をOFFにする方法が実現できたのでここに記します。

```
% yum install dconf-editor
% dconf write /org/gnome/settings-daemon/peripherals/wacom/8573f9e848c54131bb773b303591501e-usb:056a:0315/touch false
```

16進数で書かれているところは適宜自分の環境に合わせて直していただきたい。
分からない場合は、

```
% dconf list /org/
```

でディレクトリーを掘って探っていくとわかるはず。

以上です。
WordPress:数字だけのパーマリンクに「-2」がつく問題を解消する裏技

WordPressパーマリンク設定で「投稿名」にすると、記事のパーマリンクを自由に設定できるが、「900」のような数字だけのパーマリンクは必ず「-2」がついて「900-2」のようなURLになってしまう。


<img width="601" alt="新規投稿を追加_‹_test_—_WordPress.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/fda3b2a1-a0eb-2f5a-5c64-13738858e3d7.png">


この問題を解決する裏技を紹介する。


まず、「パーマリンク設定」を「基本」にしておく。


<img width="947" alt="パーマリンク設定_‹_test_—_WordPress.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/699c0507-f82e-ccd9-e404-ac66e20999ab.png">

次に、記事タイトルをパーマリンクにしたい番号にして「公開」しておく。

<img width="1020" alt="新規投稿を追加_‹_test_—_WordPress.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/45b304bf-6a5a-ba24-abcf-b7453cd71986.png">

記事を公開したら、再び「パーマリンク設定」に行き「投稿名」に設定変更する。

<img width="961" alt="パーマリンク設定_‹_test_—_WordPress.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/0ac995a6-d75e-e2b8-96ce-9581265f33de.png">


その後、数字タイトルで投稿した記事にいくと、パーマリンクが「-2」なしのURLになっている。
なお、その記事はタイトルを変更してもパーマリンクは変わらることがない。

<img width="653" alt="投稿の編集_‹_test_—_WordPress.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/00496504-b654-d702-a927-9094bbaf4b28.png">
傾斜計 > dmpGetYawPitchRoll()はバグっているのかもしれない

関連 http://qiita.com/7of9/items/b8a31f470555fb845cb5
関連 http://qiita.com/7of9/items/31fa9ab93e792f60a3d8

Quaternionを使っての図示に失敗したため、roll, pitch, yawで図示しようとしている。
しかしこちらも意図通りに図示できていない。

そんな中、以下のリンクを見つけた。
http://forum.arduino.cc/index.php?topic=331084.0
> When I spin my mpu6050 in 80 degree in the X axis (or Y axis) the MPU6050 tells my arduino it has 80 degree, great! But when I spin my mpu6050 in 100 degree in the X axis (or Y axis) the MPU6050 also tells my arduino it has 80 degree! 

dmpGetYawPitchRoll()の結果がどうもおかしいということらしい。

`#10`にてPs991さんが独自の計算関数を掲載している。
それを実際にためしてみた。


左3つはdmpGetYawPitchRoll()の出力。右3つはPs991さんの関数の出力。

```
yawPitchRoll	177.60	-1.75	-79.81 | 	177.60	350.04	79.96
...
yawPitchRoll	177.73	-1.75	-82.36 | 	177.73	346.73	82.57
...
yawPitchRoll	178.05	-1.78	-87.03 | 	178.05	323.21	87.62
```

値がプラスマイナス違うのは定義の問題なのでなんとかなる。

問題は2つ目の数値(-1.75と350.04)や(-1.78と323.21)など。
両者の値が足して360度になるなら定義の違いだけだが、足しても360にならない。どちらかの計算に間違いがあるが、dmpGetYawPitchRoll()はバグっているのかもしれない。

関連あるのか不明だが、以下のリンクも見つけた。
https://github.com/jrowberg/i2cdevlib/issues/64
> Hello, I'm not totally sure but I think the problem is because dmp code on this library isn't the last version. Invensense updated a new code (you can download it in invensense official website in developers corner).
[Swift2]HealthKitから指定日の歩数を取得するサンプル

Swift2でHealthKitから指定日１日分の歩数を取得サンプルです。

いつもどおりgithubにアップしていますので、
ソースが必要な方はそちらもごらんください。

[ソースはこちら](https://github.com/Synashida/GetStepsFromHealthKitSwift2)

```ViewController.swift
    @IBAction func getSteps(sender: UIButton) {
        healthKit.recentStepsOfDay(dtpDate.date, completion: {steps, error in
            // Autolayoutを使っているとき、データの変更がAutolayoutの監視対象にはいるようで、
            // データの反映がかなり遅れる（体感で30秒くらい時間がかかる）ので、
            // ここの反映に関してはAutolayoutの非同期処理を実装する
            dispatch_async(dispatch_get_main_queue(), {
                self.lblSteps.text = steps.description
            })
        })
    }
```

``` HealthKit.swift
import HealthKit

/// HealthKitから歩数を取得するサンプルプログラム
class HealthKit {
    /// HealthKitストレージにアクセスする
    var storage:HKHealthStore = HKHealthStore()
    
    /**
     HealthKitへのアクセス許可を確認
     
     - returns:
     */
    init() {
        checkAuthorization()
    }
    
    /**
     HealthKitへのアクセス許可確認
     
     - returns: true = 許可 / false = 不許可
     */
    func checkAuthorization() -> Bool {
        var isEnabled = true
        
        // 利用しているデバイスでHealthKitが利用可能か調べる
        if HKHealthStore.isHealthDataAvailable()
        {
            // 歩数の取得をリクエスト
            let steps = NSSet(object: HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)!)
            
            // 許可されているかどうかを確認
            storage.requestAuthorizationToShareTypes(nil, readTypes: steps as? Set<HKObjectType>) { (success, error) -> Void in
                isEnabled = success
            }
        }
        else
        {
            isEnabled = false
        }
        
        return isEnabled
    }
    
    /**
     指定日１日分の歩数をHealthKitから取得する
     
     - parameter findDate:   検索対象日
     - parameter completion: データ取得後に呼び出されるデリゲート関数
     */
    func recentStepsOfDay(findDate: NSDate, completion: ((steps:Int, error:NSError!) -> Void)!) {
        // HKSampleから歩数の取得をリクエスト
        let type = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)
        
        // 対象日の24時間分の歩数を取得する
        let predicate = HKQuery.predicateForSamplesWithStartDate(findDate, endDate: NSDate(timeIntervalSince1970: findDate.timeIntervalSince1970 + 86400), options: .None)
        
        // 指定期間内のデータを取得する
        let query = HKSampleQuery(sampleType: type!, predicate: predicate, limit: 0, sortDescriptors: nil) { query, results, error in
            var steps: Int = 0
            
            // 指定期間で取得できた歩数の合計を計算
            if results?.count > 0
            {
                for result in results as! [HKQuantitySample]
                {
                    steps += Int(result.quantity.doubleValueForUnit(HKUnit.countUnit()))
                }
            }
            // 合計歩数をコールバック関数へ返す
            completion(steps: steps, error: error)
        }
        
        storage.executeQuery(query)
    }
}
```

つまづいたところはHealthKitから取得した歩数をUILabelやUITextViewに設定しても描画されなかった現象に遭遇したところです。
それを回避するためにdispatch_asyncブロックでデータのセットを行っています。

歩数の取得条件に関してはPredicateで範囲指定ができるので、ある程度自由に取得が可能です。
Visual Studio Code でファイル検索の除外設定


Visual Studio CodeでRails開発をしていたら、検索（Ctrl/⌘+P）にSprocketsのキャッシュファイルがやたら出てくるので除外する方法を探した。

`なんとか.exclude`という設定はいくつかあるが、今回は`search.exclude`に設定すれば解決した。

- `files.exclude`
	- ファイルブラウザに表示しない
	- 検索除外設定にも継承されるので、ここで指定したファイルは完全にないものとして扱われる
- `search.exclude`
	- ファイルブラウザには表示するが、検索から除外する
	- 上記の通り`files.exclude`の設定を継承する

```javascript:settings.json
  // ファイルブラウザに表示しない
  "files.exclude": {
    "**/.git": true,
    "**/.svn": true,
    "**/.DS_Store": true
  },

  // ファイルブラウザには表示するが、検索から除外する
  "search.exclude": {
    "**/node_modules": true,
    "**/bower_components": true,
    // 例えばキャッシュディレクトリを追加すると、検索で余計なファイルが出てこなくて便利
    "**/tmp/cache": true
  },

```
WordPressで固有IPを変更してしまってサイトが開けなくなった時の対処法

##WordPressでIPを変更してしまってサイトが開けなくなった時の対処法


まずはMySQLにログインしてください。(AWSのEC2からRDSをにログインする場合)

```
sudo mysql -P ポート番号 -h エンドポイント -u ユーザ名 -p
```
パスワードを聞かれるので入力してください。
次に現在のIPの確認

```
mysql> select * from wp_options where option_name = 'siteurl';

mysql> select * from wp_options where option_name = 'home';
```
<img width="778" alt="スクリーンショット 2016-07-01 18.41.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/121620/9b22375d-91bf-04f7-4ce0-2e862a217256.png">
<img width="775" alt="スクリーンショット 2016-07-01 18.41.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/121620/21665b5e-a567-3309-8b7b-8e54171d76f3.png">

画像のようにIPが現在のIPと違ったら変更します。

***-***-***-***を自分の変更したIPにしてください。

```
mysql> update wp_options set option_value = 'http://ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com/wordpress' where option_name = 'siteurl';

mysql> update wp_options set option_value = 'http://ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com/wordpress' where option_name = 'home';
```

この変更が終わったら、自分のサイトが開けるようになってると思います。


参考にしたサイトです
http://promamo.com/?p=3026
Rails5にアップグレードしてたくさん出てくるDEPRECATION WARNINGを非表示にする

Rails5がリリースされましたね。アップグレードしてサーバーを起動するとalias_method_chainの非推奨についての警告が大量に表示されました。

```sh
DEPRECATION WARNING: alias_method_chain is deprecated.
Please, use Module#prepend instead.
From module, you can access the original method using super.
 (called from <top (required)> at /myapp/config/application.rb:7)
```

まだRails5に対応前のgemが多いようなので警告を非表示にします。非表示にするには警告が表示される前に ActiveSupport::Deprecation.silenced を指定します。

```rb:config/application.rb
require_relative 'boot'

require 'rails/all'
#
# Rails5に対応前のgemからの警告が多いのでサイレントにします。
#
ActiveSupport::Deprecation.silenced = true
```

すっきり。

このalias_method_chainへ対処するPullRequestを多く見かけたのでRails5に対応されるのをしばらく待ちましょう。
ミニマリストの僕にはvim-plugが性に合っている

# はじめに
自分はそもそもVim Pluginのヘビーユーザーではない。[NERDTree](https://github.com/scrooloose/nerdtree)と、あとはGoとPythonのPluginがいくつか使えればPlugin Managerなんて動けばなんでもいいと思っている。そんな自分が[vim-plug](https://github.com/junegunn/vim-plug)にした理由としては以下の通りである。

* vim-plug自体は1ファイルでできておりそれをロードするだけですぐ利用を開始できる
* カスタマイズをほとんどやらない僕には導入障壁の低いPlugin Managerが性に合っている
* Redditでオススメされてた

## Redditのスレッド
そもそもvim-plugの存在を知ったきっかけは、Redditのこのスレッドを見たからだ。
[Vundle vs Pathogen vs ?](https://www.reddit.com/r/vim/comments/49uag0/vundle_vs_pathogen_vs/)

一番upvoteされてるコメントがこちら。
> I love vim plug

# A minimalist Vim plugin manager
## インストール
インストール方法は、plug.vimをダウンロードして、"autoload"ディレクトリ配下に置くだけである。

```shell-session
$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
```

## 使い方
利用方法としては、`~/.vimrc`に`call plug#begin()`と`call plug#end()`セクションを書いて、その間に使いたいプラグインを羅列するだけである。

例えばこんな感じである。

```vim:~/.vimrc
call plug#begin('~/.vim/plugged')

Plug 'scrooloose/nerdtree'
Plug 'jistr/vim-nerdtree-tabs'

call plug#end()
```

その後、`.vimrc`をリロードして、`:PlugInstall`コマンドを実行すれば対象のプラグインがインストールされる。

こんな感じでとても簡単である。

## その他
他にも、プラグインの状態を確認するための`:PlugStatus`や、前回からのアップデートとの変更点を表示する`:PlugDiff`などがあるが、今のところ僕には必要無い。

## 感想
現在、dein.vimやVundleを使っているユーザがわざわざ乗り換える必要があるかどうかは分からない。しかし、今まで1度もPlugin Managerを使ったことが無かった人なら、vim-plugは簡単に始められるので、1度使ってみることをオススメする。
Windows向けのElectronアプリのウィンドウの左上のアイコン設定


`__dirname`は付けるけど、`file://`は付けない。`win.loadURL("file://${__dirname}/index.html");`が近くにあるから騙されがち。

参考「[Cannot get BrowserWindow icon to work #563 - electron](https://github.com/electron/electron/issues/563)」

```
mainWindow = new BrowserWindow({
    ...略...
    'icon': __dirname + '/../images/icon.png',
    ...略...
});
```
Authorの名称をGitHubと同じにする

# 背景

名称不一致でGitHub上でアイコンでないし誰のcommitか分かり難い。

# nameとemailを設定する(コマンド)

```bash
git config --global user.name "GitHub上での名称"
git config --global user.email "GitHub上でのメールアドレス"
```

# nameとemailを設定する(Eclipse)

- `Window` > `Preferences` > `Team` > `Git` > `Configuration` > `User Settings(タブ)`
- `user.name`, `user.email` の設定がない場合は `Add Entry...` で加える。  
![configuration.jpg](https://qiita-image-store.s3.amazonaws.com/0/69521/b03cf181-c1ed-d0a1-d231-8269a5cc43cd.jpeg)

# 参考

http://qiita.com/sea_mountain/items/d70216a5bc16a88ed932

https://git-scm.com/book/ja/v1/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-%E6%9C%80%E5%88%9D%E3%81%AEGit%E3%81%AE%E6%A7%8B%E6%88%90#個人の識別情報

http://stackoverflow.com/questions/10663492/how-do-i-change-the-default-author-and-committer-in-the-eclipse-git-plugin
ReactJS + Flumpt のカウンターのサンプルその2


## 目的

[以前書いたサンプル](http://qiita.com/cortyuming/items/54b13904353bd67a3181)を書き直してみた

## ファイル構成

```
.
├── dest
│   └── app.js
├── index.html
├── package.json
└── src
    └── app.jsx
```

## package


```pacage.json
{
  "devDependencies": {
    "babel-preset-es2015": "^6.9.0",
    "babel-preset-react": "^6.11.1",
    "babelify": "^7.3.0",
    "browserify": "^13.0.1",
    "flumpt": "^0.2.0",
    "flux": "^2.1.1",
    "react": "^15.1.0",
    "react-dom": "^15.1.0",
    "watchify": "^3.7.0"
  },
  "dependencies": {},
  "scripts": {
    "watch": "watchify src/app.jsx -o dest/app.js -v --debug"
  },
  "browserify": {
    "transform": [
      [
        "babelify",
        {
          "presets": [
            "es2015",
            "react"
          ]
        }
      ]
    ]
  }
}

```

## 実行

```
$ npm install
$ npm run build
$ npm run watch

```

## code

```src/app.jsx
'use strict';

import * as React from 'react';  //eslint-disable-line
import {Flux, Component} from 'flumpt';
import {render} from 'react-dom';


class CounterComponent extends Component {
  render() {
    return (
      <div>
        <p>count: {this.props.count}</p>
        <div>
          <button onClick={() => this.dispatch('counter', {num: 1})}>+1</button>
          <button onClick={() => this.dispatch('counter', {num: -1})}>-1</button>
        </div>
      </div>
    );
  }
}


class App extends Flux {
  subscribe() {
    this.on('counter', value => {
      this.asyncWait(1000).then(() => {
        this.update(state => {
          state.count += value.num;
          return state;
        });
      });
    });
  }

  render(state) {
    return <CounterComponent {...state}/>;
  }

  asyncWait(msec) {
    return Promise.resolve(msec)
      .then(msec => {
        const currentTimeMsec = new Date().getTime();
        while (new Date().getTime() < currentTimeMsec + msec);
      });
  }
}


const app = new App({
  renderer: el => {
    render(el, document.querySelector('.js-container'));
  },
  initialState: {count: 0},
  middlewares: [
    // logger
    (state) => {
      console.log(state);
      return state;
    }
  ]
});

app.update(_initialState => _initialState);
```

## 表示

```
$ python -m SimpleHTTPServer 8000
```

- http://localhost:8000

![スクリーンショット 2015-11-07 14.48.21.png](https://qiita-image-store.s3.amazonaws.com/0/41656/b7055cbf-05b3-2817-c15f-20cbbea0c1e9.png "スクリーンショット 2015-11-07 14.48.21.png")



## メモ

- `whatwg-fetch` で api たたくことを想定して asyncWait 関数作って値を遅れて取る感じにしてみた

### 参考

- https://github.com/mizchi/flumpt
[Kotlin]interfaceを継承しているクラス自体を保証して引数に取る

次のようなクラスがあったとします。

```kotlin
class Cat: Animal() {}
class Fox: Animal(),Growlable {}
class Dog: Animal(),Growlable {}
```

Growlable interfaceを実装しているクラスのみを引数に取りたい場合

```kotlin
fun showTooth(growlableAnimal: Growlable) {
}
```

と指定すればいいです。
使う時は

```kotlin
showTooth(Cat()) //ng
showTooth(Fox()) //ok
showTooth(Dog()) //ok
```

ではインスタンスを生成したくない時など、クラス自体を取る時はどうすればいいのでしょうか
Javaでは

```java
public void showTooth(Class<? extends Growlable > growlableClass) {
}
```

と書けました。
Kotlinでは

```kotlin
fun showTooth(growlableClass: Class<out Growlable>) {
}
```

と指定すればOK

使う時は

```kotlin
showTooth(Cat::class.java) //ng
showTooth(Fox::class.java) //ok
showTooth(Dog::class.java) //ok
```
TouchDesignerで起動時自動的にフルスクリーンで実行する

TouchDesignerはF1キー、escキーでフルスクリーン表示の切り替えを行うことができますが、展示作品の場合、起動時にフルスクリーンで実行されるのが望ましいです。以下、その設定方法を記しておきます。

### 1. メインメニューの **Dialogs > Window Placement** をクリックし、**Window Placement ダイアログ** を開く

![bandicam 2016-07-01 16-37-47-445.jpg](https://qiita-image-store.s3.amazonaws.com/0/35267/70243f83-6537-254e-5e41-c4c8af1daf58.jpeg)

### 2. **Start in Perform Mode** にチェックを入れる
これでTouchDesigner起動時にパフォームモードで実行されるようになります。
![bandicam 2016-07-01 16-38-19-846.png](https://qiita-image-store.s3.amazonaws.com/0/35267/c63cf41b-2d3e-94c2-3e8e-d2dd252a4b9c.png)

### 3. パラメータを設定し、フルスクリーンになるようにする
Pをクリックすると、パラメータを設定することができます

![bandicam 2016-07-01 16-38-19-846_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/35267/ee032f7f-29d4-4baf-902c-09621e35f5f3.jpeg)

![bandicam 2016-07-01 16-43-13-122.jpg](https://qiita-image-store.s3.amazonaws.com/0/35267/7055e7ac-e738-6ca2-653b-fbbe624617c3.jpeg)


#### Location
**Single Monitor**または**All Monitors**を選択
**Main Monitor**を選択する場合は、**Ignore Taskbar**を**On**にする

**Single Monitor**を選択した場合は、**Monitor**で表示するモニタのインデックスを指定する

+ MainMonitor
Windows Control Panelでmain display、または、NVIDIA control panelでprimary displayと設定された主要なモニタに表示。このオプションでは、タスクバーも含めて計算するので、デフォルトではタスクバーを覆わない。

+ SingleMonitor
モニタのインデックスを指定して表示するオプション。タスクバーは無視する

+ All Monitors
すべてのモニタに位置するようにするオプション。タスクバーは無視する

#### Size
Fill Locationを選択。
細かな設定を行いたい場合はCustomを選択。

+ Automatic from COMP/TOP
特定されたCOMP/TOPから自動的にサイズが決定される

+ Fill Location
上の*Location*パラメータで設定されたロケーションを満たすようになる

+ Custom
設定値による

#### Borders
ウィンドウのタイトルバーやボーダーを非表示にするかどうか
非表示にしたい場合は、Offに

#### Always on Top
他のフローティングウィンドウがある場合、常にそれよりも上に位置させるかどうかを設定

#### Cursor Visible
ウィンドウの上にカーソルがあるときに見えなくするかどうかを設定
(スタートアップからWindows起動時に実行したとき、5回に1回ぐらい消えてくれなかったという報告がありました…(ver088を使用))

その際、起動時に下記のPythonコードを実行すると強制的にマウスポインタを動かして消すことができます（あまり良い解決ではないですが）

```py3
import ctypes
ctypes.windll.user32.SetCursorPos(0, 0)
```
ajax json サーバーサイド接続

### ajax json サーバーサイド接続
```temp1.js
function GET(messageId){
  loading();
  $.ajax({
    type : 'GET',
    url : '/test/url',
    dataType : 'json',
    success : function (data, dataType) {
      if(data.statusCode == 200) {
        //成功時処理
        //data内にサーバーサイドから受け取った値が入っている
        cosole.log(data);
      } else {
        //失敗時処理
        alert('error');
      }
    },
    error : function(httpRequest, status, thrown) {
      //失敗時処理
      alert('サーバーとの通信に失敗');
    },
    complete : function() {
      hideLoading();
    }
  });
}
```
サーバーサイドからリストで返却があった時

```temp2.js
function GET(messageId){
  loading();
  $.ajax({
    type : 'GET',
    url : '/test/url',
    dataType : 'json',
    success : function (data, dataType) {
      if(data.statusCode == 200) {
        //返却されたlist要素をループ処理
        $.each(data.list, function(i, val) {
          cosole.log(val);;
        });
      } else {
        //失敗時処理
        alert('error');
      }
    },
    error : function(httpRequest, status, thrown) {
      //失敗時処理
      alert('サーバーとの通信に失敗');
    },
    complete : function() {
      hideLoading();
    }
  });
}
```
Android アプリ特有のテストのてびき

* Android アプリ特有の事柄を確認するテストです
* 厳密には Android 特有ではないものもたくさん混じっていますが、そこは、ご容赦ください

# 各種ライフサイクルを適切に実装できていることのテスト

各種ライフサイクルを適切に実装できているかを確認するためのテストです。
主に下記の点を確認します。

* 表示崩れの有無
* 期待通りに通信できているかの確認
* SharedPreferences や DB に期待通りに値を書き込めているかの確認

Activity, Fragment などの開始、変化、終了のタイミングでアプリをバックグラウンドにしたり画面を回転させたりします。
具体例は以下の通りです。

## ダイアログ

|タイミング \ 実施する操作|バックグラウンドに回す|画面回転させる|
|:--|:--|:--|
|**ダイアログオープン時**|ダイアログがオープンするはずのタイミングでアプリをバックグラウンドにしておき、<br>バックグラウンド中にダイアログを開こうとさせます|ダイアログのオープンと同時に画面を回転させます|
|**ダイアログ表示中**|ダイアログ表示中にバックグラウンドにして、すぐにフォアグラウンドに戻します|ダイアログ表示中に画面を回転させます|
|**ダイアログクローズ時**|ダイアログがクローズするはずのタイミングでアプリをバックグラウンドにしておき、<br>バックグラウンド中にダイアログをクローズさせます|ダイアログをクローズするのと同時に画面を回転させます|

## Activity

|タイミング \ 実施する操作|バックグラウンドに回す|画面回転させる|
|:--|:--|:--|
|**画面を開くとき**|画面が開くはずのタイミングでアプリをバックグラウンドにしておき、<br>バックグラウンド中に画面を開こうとさせます|画面を開くと同時に画面を回転させます|
|**画面表示中**|表示中にバックグラウンドにして、すぐにフォアグラウンドに戻します|表示中に画面を回転させます|
|**別の画面へ遷移するとき**|別の画面へと遷移するはずのタイミングでアプリをバックグラウンドにしておき<br>バックグラウンド中に画面を遷移させようとします|別の画面へ遷移すると同時に画面を回転させます|

### Fragment や View

|タイミング \ 実施する操作|バックグラウンドに回す|画面回転させる|
|:--|:--|:--|
|**表示の変化時**|表示が変化するはずのタイミングでアプリをバックグラウンドにしておき、バックグランド中に変化させようとさせます|何らかの操作を行ってからすぐに画面を回転させます|
|**表示中**|アプリをバックグラウンドにして、すぐにフォアグラウンドに戻します|画面を回転させます|

# 例外的な画面操作を行っても問題ないことのテスト
例外的な画面操作を行っても問題ないことのテストです。
主に下記の点を確認します。

* 不正な操作ができないこと

イライラしているユーザの気分になってとにかく速いスピードで操作したりするとバグを見つけやすいと思います。

## 連打

|タイミング|実施する操作|
|:--|:--|
|ボタン等の操作|ボタン等をなるべく短い間隔で連打する|

## 同時押し

|タイミング|実施する操作|
|:--|:--|
|ボタン等の操作|複数のボタン等を同時に押す|

# 環境依存のテスト

* 機種依存
* OS 依存
* 言語依存
* アプリのインストールの仕方依存
* 状況依存

の問題が起きないかを確認するテストです。

主に下記の点を確認します。

* 表示崩れが発生しないこと
* 機能が動作すること

## 機種依存
|機種|実施内容|
|:--|:--|
|なるべくメモリが少ない機種|メモリ不足で落ちないかをテストします|
|なるべく画面が小さい機種|表示が崩れないことを確認します|
|積んでいるセンサーが異なる機種|機種によって積んでいるセンサーの種類が違うので、正常に動作するかを確認します|
|色々なメーカーの機種|メーカーによる OS のカスタマイズの影響を受けることがあるので、適切に動作することを確認します|

## OS 依存
|OS|実施内容|
|:--|:--|
|なるべく古い OS|動作しない機能がないことを確認します|
|なるべく新しい OS|動作しない機能がないことを確認します|

## 言語依存
|言語|実施内容|
|:--|:--|
|イタリア語、フランス語など|日本語よりも文字数が多くなりがちなので、表示が崩れないかを確認します|
|繁体字|フォントサイズが小さい場合に視認性が下がりやすいので、視認できるかを確認します|
|RLO な言語|RLO な言語でも表示が崩れていること、表示を理解できることを確認します|

## アプリのインストールの仕方依存

|インストール方法|実施内容|
|:--|:--|
|新規インストール|動作しない機能がないことを確認します|
|最新のリリース済みアプリからのアップデート|動作しない機能がないことを確認します|
|過去の大規模な DB のマイグレーション前など、問題が起きそうなバージョンからのアップデート|最新以外のバージョンからアップデートしても動作することを確認します|

## 状況依存

|タイミング|実施内容|
|:--|:--|
|速いスピードで端末を動かしている時|端末をシェイクするように動かして、センサーが変な値を返しがちな時の動作をテストします|
|速いスピードで端末が回転してる時|端末を速いスピードで回転させて、センサーが変なたいを返しがちな時の動作をテストします|
|GPS で測位できていない時|建物内から屋外に出てすぐなど、 GPS での測位が完了していないタイミングでの動作をてstします|

# スリープの制御
バッテリー保ちを良くするために、極力スリープ可能にすべきです。

[公式のガイド](https://developer.android.com/training/scheduling/wakelock.html) にあるようにいくつかの方法でスリープの可否を制御できますが、
下手にいじってスリープできなくなったりしていないことを確認します。

## アプリを放置する

|タイミング|実施内容|
|:--|:--|
|スリープしてはいけないとき|放置して、スリープしないことを確認します|
|スリープしてもいいとき|放置して、スリープすることを確認します|
アプリ内ブラウザ(webview)調査

久しぶりに最近流行りのアプリにおけるアプリ内ブラウザ(webview)のUAを調べてみた。

## 調査対象
- Facebook
- LINE
- Twitter
- Snapchat

## 調査詳細
- 調査日: 2016/07/01
- 端末: Xperia 501SO(5.1.1) / Priori 3s LTE(5.1)

## 調査結果
### Facebook
``` webview.UserAgent
Mozilla/5.0 (Linux; Android 5.1; FTJ152B Build/LMY47D; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/51.0.2704.81 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/83.0.0.20.71;]
```
``` webview.Referer
http://m.facebook.com/
```

### LINE
``` webview.UserAgent
Mozilla/5.0 (Linux; Android 5.1; FTJ152B Build/LMY47D; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/51.0.2704.81 Mobile Safari/537.36 Line/6.4.1
```

### Twitter
``` webview.UserAgent
Mozilla/5.0 (Linux; Android 5.1.1; 501SO Build/32.0.C.0.380) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.81 Mobile Safari/537.36
```
``` webview.Referer
https://t.co/HUo6Cw4FCj
```

### Snapchat
``` webview.UserAgent
Mozilla/5.0 (Linux; Android 5.1.1; 501SO Build/32.0.C.0.380; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/51.0.2704.81 Mobile Safari/537.36 Snapchat/9.33.1.0
```

## 考察
TwitterだけUA内に、識別子が含まれていないため、`Referer`を元に流入を確認する必要がありそう。
Slackでたくさんのチャンネルからまとめて特定のユーザーをkickするrubyスクリプト

うまい方法が見つからなかったので（知ってたら教えて下さい）、API叩いてみました。結構強力な操作をしているのでうっかり大事故にならないように気をつけてください、私は責任取れません;)
slack-api gemが必要です。

```rb
#! /usr/bin/env ruby
require 'slack'

Slack.configure do |config|
  config.token = "YOUR_TOKEN"
end
client = Slack::Client.new

user = client.users_list['members'].find { |u| u['name'] == 'johndoe' }['id']

channels = client.channels_list(exclude_archived: 1)["channels"].select { |c| c["name"].start_with?('foo-') && c['members'].include?(user) }
channels.each do |c|
  puts client.channels_kick(channel: c['id'], user: user)
end
```

## 雑な解説

u['name']がアカウント名、c['name']がチャンネル名、start_with?のところは要件次第でいろいろだと思います（チャンネル名リストがあるなら突っ込むがいい、とか）。
傾斜計 / geometry > Quaternionの図示 > 失敗 > アドバイスを受けて成功

http://qiita.com/7of9/items/b8a31f470555fb845cb5
で取得した傾斜計のQuaternion値を理解するため、図示してみた。

> - ほぼ水平の時
```quat    0.92    0.01    0.01    -0.40```
- X軸を持ち上げた時
```quat    0.91    0.04    0.17    -0.37```
- Y軸正方向を上げた時
```quat    0.85    -0.19   0.12    -0.47```
- Y軸負方向を上げた時
```quat    0.91    0.25    -0.08   -0.32```


参考 http://threejs.org/docs/#Reference/Math/Quaternion
参考 http://qiita.com/edo_m18/items/ba2d58f7a0dda4bd8827#2-3

http://jsfiddle.net/w44qpa05/58/

- 赤: ほぼ水平
- 緑: X軸を持ち上げた時
- 青: Y軸正方向を上げた時
- 灰: Y軸負方向を上げた時

どうも思った方向に向いていない気がする。

基準となるベクトルの向き(0,0,2)が間違いなのか。座標の定義がY,Z反対なのか。
これ以外もためしたが、思い描いたような結果は得られていない。

##  x,y,z,wの値

[cubic9さん](http://cubic9.com/Devel/%C5%C5%BB%D2%B9%A9%BA%EE/Arduino/%A5%E2%A1%BC%A5%B7%A5%E7%A5%F3%A5%BB%A5%F3%A5%B5/MPU-9150/)のUnityコードを見ていると以下のように値を取っている。

```
if (values[0] == "quat") {
    x = float.Parse(values[2]);
    y = -float.Parse(values[4]);
    z = float.Parse(values[3]);
    w = float.Parse(values[1]);
    _handQuaternion.Set(x, y, z, w);
}
```

スケッチからは(w,x,y,z)と出力しているようにあるが、上記ではそれを(w,x,z,-y)と読取っている。
UIImagePickerControllerで編集した画像を取得できないとき

```swift

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
  let image = editingInfo![UIImagePickerControllerEditedImage] as! UIImage
}

```

ではうまくいかないので

```swift

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
  let image = info[UIImagePickerControllerEditedImage] as! UIImage
}

```

を使いましょう。
先輩にきいてみたっ！- Amazon Web Serviceのセキュリティ その2 - 第8話 保護

AWSのことを学ぶ際に、面白おかしく一貫した情報を得られたら素敵じゃありませんか？
そんなコンテンツが欲しいと思いながら、なかなか見つからないため自分たちで作っています。
※ ストーリーはフィクションであり、実在の人物・団体とは一切関係ありません。

前回までのストーリー:
* [第1話 起動](http://qiita.com/ukiuni@github/items/c82cf2b0b3d16ab7c2a0)
* [第2話 両得](http://qiita.com/kazuqqfp/items/1e326e1452468c33800b)
* [第3話 お金](http://qiita.com/imafuku/items/b40a5a9b049c38fdbd48)
* [第4話 自動](http://qiita.com/aikawa2002/items/191d34b5b7c2c836a69f)
* [第5話 構成](http://qiita.com/alingogo/items/d3b4b0e61791555d28f0)
* [第6話 プロフェッショナル](http://qiita.com/kenszk/items/3942f55fae098c4840ed)
* [第7話 管理](http://qiita.com/chano2/items/e261c73e09f0cbd8667e)

今回は連載第8話です。今回の話題はセキュリティ(全2回のうち第2回)です。

# 8話 保護
今日もAは寝不足だ。夜に飼い猫のNが暴れる音で寝付けなかったのだ。
「今日は気になってたセキュリティの続きを調べるか。えーっとノートPC、ノートPC…！」
NがノートPCの上で寝ている。Aは寝不足でもNはそんなことはおかまいなしだ。
そんなNのあまりに心地よさそうに寝ている様子を見てしまうとAには起こせない。
Nのその心地よい時間を守ってあげたいのだ。

ノートPCが使えなくてもAにはデスクトップがある。デスクトップの方に向かってAは次なる疑問の解消の時間にはいった。
「CloudTrailでAPI呼び出しの監視はできることはわかった。でも保管中データそのものの保護はどうやってやるのかはわからないままだ。今日はここから調べてみよう。S3に置いているデータはどうやって保護するのやら。」

出社までの時間でAは独り言を連発している…。
「ふむふむ。データへアクセス権をユーザごとにコントロールできるのか。どうやってやるんだ？」
「ん？それだけじゃないぞ。S3はバージョニング機能やアクセスログの取得ができる機能もあるんだな。」
「へー！バージョニング機能を使っておけば間違えて削除してしまっても削除する前のバージョンに戻してあげれば、復帰できるのか！これは便利だ。」
時計をちらっと見たAは出社しないといけない時間が迫っていることに気づいた。
Aはもう少し続けたかったが家を出ることにした。

出社したAは隣の部署に向かった。今日もざわついていたるからだ。
Aが近づいてきたことに気づいたメンバーが口を開いた。焦りが垣間見えている。
「S3に集積したログデータを削除してしまったんだ…。
　君が教えてくれたCloudTrailの通知で気づいたんだが、、復旧できなくて・・」
Aがバージョニング機能を使っているか確認しようとすると、近くにいたS先輩が口を開いた。
「そのbucketはバージョニングを有効にしたはずよ。ね。」
AWSのコンソール画面を見ながら話すS先輩には焦りはなかった。
Aは、さすがS先輩。ぬかりない。と思いながらS先輩に続けた。
「ということは、削除前の状態に戻せば復旧できますね！」
「そうね！A君、勉強している成果が出てるわね！」
S先輩に褒められてAは上機嫌で午前中の仕事をこなした。

お昼休みだ。ご飯を食べ終えて歯磨きをしながらAはふと考えた。
（「あれ。アクセス権を設定するとストレージのデータを保護できるということはわかったけど、EC2インスタンスへのアクセス制御もしてEC2も守ってあげないといけないよな。あれあれ…？そういえばEC2はどこまで守ってあげないといけないんだ・・？OSのアップデートは？物理的に保護する方法があったりするのか…？？？」）
歯磨きをしながら午後に調べることが次々と出てきた。

お昼休みが終わった。
「よし。今の僕なら自分でさっきの疑問は解消できるぞ」と意気込んで、Aはひとつずつ疑問を解消していくことにした。

まずはEC2インスタンスの保護について、アクセス制御について調べることにした。
アクセス制御ににはVPCやセキュリティグループを使えばいいとわかった。
「なるほど。こういう時に使うものだったのか。」とAは納得した。
Aはすでに [第5話](http://qiita.com/alingogo/items/d3b4b0e61791555d28f0) で学習していたのだ。
となると、次はどこまで自分たちでやればいいのかだ。調べているとAWSが公開しているPDFを発見した。
嬉しくなったAはS先輩に話しかけに行った。
「S先輩、[こんなPDF](http://media.amazonwebservices.com/jp/wp/AWS_Security_Best_Practices.pdf#8) が公開されていたんですね！ハードウェアの設備やネットワークインフラなんかを保護したりはAWSのユーザは考えなくていいんですね！」
「あら、もうそんなところまで勉強しているのね。もう私なんて目じゃないわね！」
そう言われると嬉しい反面寂しさも感じるAであった。



帰ろうとしたAが居室から出るとS先輩の声が聞こえてきた。誰かと電話している。
聞き耳を立てたわけではないが、衝撃の言葉が聞こえた。
「…ええ、わかったわ。それじゃぁ式場はそこね！そうね。…」

午前中上機嫌だったことは一瞬にして忘れ去られた。。
明日からもAは果たしてやっていけるだろうか…。
【論文シリーズ】ネットワーク内包ネットワーク

## 原文
[ネットワーク内包ネットワーク (Network In Network)](http://goo.gl/YD8TSK)
Min Lin (2014)

## 1. 要約／背景
* **NIN(Network in Network)**とは、入力層の活性化関数の代わりに、小さいNNを用いたモデルのことである。
* Micro Networkの活用により、学習精度の向上と汎化誤差の低減が認められた。
* CNNでは、高次の特徴を抽出する際、込み入った中間層の形成がポイントになるが、NINではこの効果も期待できる。

## 2. 骨子の理論
*************************************************************************
(1)畳込み層における変化
一般的なCNNは、畳込み層において、GLMによる線形演算をベースにプーリング層に引き渡す。

![151201010150_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/0e18531b-dc5a-59ce-96e5-6e6d833ecc53.jpeg)

一方で、NINでは、Mlpconv(Multi layer perception convolutional)層を形成して、小規模のNNのアウトプットがプーリング層へ引き渡される。

![151201010150_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/10c4dd0d-20c6-8396-acf5-cd09bfff9470.jpeg)

1 → n層の多層NNの処理を引渡し時に行う

```math
f^1_{i,j,k_1} = \max(w_{k_1}^1 {}^Tx_{i,j}+ b_{k_1}, 0)\\
.\\
.\\
.\\
f^n_{i,j,k_n} = \max(w_{k_n}^n {}^Tf_{i,j}^{n-1} + b_{k_n}, 0)
```

(2)総平均プーリング
従来CNNの全結合層に取って代わるモデル。頑健性を高める。
Mlpconvで出力した特徴ベクトルの平均を取り、それを直接ソフトマックス関数に入れ込んだ。



## 3. モデル適用例
頑健性という点において、精度としてDropConnectなどの手法と拮抗する感じ。
CIFAR-100のテストでは、NINにDropoutを組み合わせたモデルが最も良いパフォーマンスを出した。

![151201010150_4.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/605c5aaa-7db1-6182-18c4-395fa1728196.jpeg)
F#+WPF+ReactiveProperty

#何?

F#とWPFとReactivePropertyで簡単なアプリケーション作る流れです。

#目標

ボタンを押すと数字が1増えるという素晴らしいアプリの作成

#方法
##F# Empty Windows App(使わない)
F#でWPFを作るための素晴らしいプロジェクト
…なのだが、ReactivePropertyと一緒に使おうとしたら
> FS2024: 静的リンクでは、別のプロファイルを対象にしたアセンブリは使用されない場合があります。

TypeProviderとPCLライブラリ回りで何かあるらしい?
よくわからんので、とりあえずF# Empty Windows Appは使わずにやります。

##プロジェクト生成~豆腐画面を出す
普通にF#コンソールプロジェクトを生成します。
こいつをWPF相当の環境まで改造します。

大筋は[Creating a WPF application in F#](http://putridparrot.com/blog/creating-a-wpf-application-in-f/)を参考にしました

###プロジェクト設定の変更
プロパティで、出力の種類をコンソールからWindowsアプリケーションに変えます。

###参照
参照に

* PresentationCore
* PresentationFramework
* System.Xaml
* WindowsBase

を追加します。

###Program.fs書き換え
無心でコピペします。

```F#:Program.fs
open System
open System.Windows
open System.Windows.Controls
open System.Windows.Markup


[<STAThread>]
[<EntryPoint>]
let main argv = 
    let application = Application.LoadComponent(
                        new System.Uri("/<アセンブリ名>;component/App.xaml", UriKind.Relative)) :?> Application
 
    application.Run()
```

「App.xamlなんてない」だって?
今から作ります。

###App.xamlの作成
テキストファイルでもコードでも何でも良いので追加し、App.xamlというファイルを用意します。
こいつに限らず、xamlはビルドアクションをResourceにしましょう。
実行時にリソースがないと文句を言われます。30分ぐらい悩みます。悩みました。

そして無心でコピペ


```xml:App.xaml
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
</Application>
```


「MainWindow.xamlなんてない」だって?
今から作ります。

###MainWindow.xamlの作成

App.xamlと同様にファイルを用意して中身を適当に作る

```xml:MainWindow.xaml
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
</Window>
```

###実行
豆腐が表示されます。お疲れ様でした。

##ボタンを押すとカウントアップする素晴らしいアプリにする

###NuGet!
ReactivePropertyを導入します。以上。


###ViewModelを作る

```F#:MainWindowVM.fs
namespace FsWpfTrial.ViewModels

open System.Reactive.Linq
open Reactive.Bindings

type MainWindowVM() =
    let addOne = new ReactiveCommand()
    let count = addOne.Scan(0,fun a _ -> a + 1).ToReadOnlyReactiveProperty(0)

    member x.AddOne = addOne
    member x.Count = count
```

なんかC#っぽいですが気にしません。

###Viewを作る

MainWindow.xamlにいろいろ追記
ちなみにちゃんとデザイナ使えます。

```xml:MainWindow.xaml
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm ="clr-namespace:FsWpfTrial.ViewModels;assembly=FsWpfTrial"
    Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <vm:MainWindowVM/>
    </Window.DataContext>
    <StackPanel>
        <TextBlock Text="{Binding Count.Value}"/>
        <Button Content="Count +1" Command="{Binding AddOne}"/>
    </StackPanel>
</Window>
```
`xmlns:vm ="clr-namespace:FsWpfTrial.ViewModels;assembly=FsWpfTrial"`を打ち込んでいる時に
入力候補が出たのでそれをそのまま使ったら
`assembly`以下が入力されてなくて気づかなくて時間を無駄にしました。

###実行

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/72075/99f6a189-1f04-a918-9a1c-fa17c20852c3.png)

(カチカチカチカチ…)

動きました。
GCP Bitnami Servise Restert（覚書）

sudo /opt/bitnami/ctlscript.sh restart
sudo /opt/bitnami/ctlscript.sh restart apache

## 余談： local host に 自分のパソコン（ブラウザ）からアクセスする。
```
Linux And Mac OS X

To access the application using your Web browser, create an SSH tunnel, as described below.

Make sure you can log in to the server using SSH. Refer to the FAQ for more information on this.
Open a new SSH session to the server using the command below:
```

 `ssh -N -L 8888:127.0.0.1:80 -i KEYFILE bitnami@SERVER-IP`

```
Remember to replace KEYFILE in the previous commands with the path to your private key file, and SERVER-IP with the public IP address or hostname of your server. Note that if successful, this command will create an SSH tunnel but will not display any output on the server console.

While the tunnel is active, you should be able to access the phpMyAdmin console through the secure SSH tunnel you created, by browsing to http://127.0.0.1:8888/phpmyadmin.

To log in, use username root for MySQL and the application password from the detail page for your cloud server.

```
Instrumentsでメソッド名やコードが出ない時の対処法




1. TargetsのBuild Settingsを開く
2. Debug Information Format を **DWARF with dSYM File** にする

Cococapods等でライブラリを入れてる場合は、そちらのターゲットでも同様のことをする必要があります。

#### 補足
- DWARF with dSYM File にすると若干ビルドが遅くなるので、嫌な場合は **DWARF** に戻しましょう。
collectionを使ってセレクトボックスのフォームをつくる

# 使うもの

- Formというファサード
    -  laravelcollectiveをcomposerでインストールすると使える便利なアレ([インストール方法](https://laravel10.wordpress.com/2015/03/08/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AElaravel-5-16-form%E3%81%AE%E4%BD%9C%E6%88%90/))
- `pluck()`というcollectionメソッド

# 手順
## テーブルからデータを取得する
Eloquentモデルからデータを取ってくる想定

``` php
$plucked_categories = $this->category->all()->pluck('category_name', 'id');
```

### POINT： pluck()でデータを整形する
`pluck()`は、collectionのメソッドの１つで
第１引数をvalue、第２引数をkeyとした配列を返してくれる

ここではセレクトボックスを作るのでそこで使う値を得る必要がある

Formファザードを使うと以下のHTMLが生成されるので、それを想定して引数を指定する

``` html
<select>
 <option value="key1">value1</option>
 <option value="key2">value2</option>
 <option value="key3">value3</option>
</select>
```

## Formを作る

以下を書くとセレクトボックスのフォームができる

``` html
{!! Form::open(['url' => /hoge, 'method'=>'PUT']) !!}
        <div class="form-group">
            {!! Form::label('category', 'カテゴリ:') !!}
            {!! Form::select('category', $plucked_categories, $article->category_id, ['class' => 'form-control']) !!}
        </div>
        <div class="form-group">
            {!! Form::submit('送信', ['class' => 'btn btn-primary form-control']) !!}
        </div>

{!! Form::close() !!}

```

ちなみに
`From:select（）`の引数は以下を渡す
第１引数: name要素
第２引数: セレクトボックスの要素
第３引数: デフォルト値
第4引数: classとかidとか

先輩のお知恵を借りて得た知恵٩(ˊᗜˋ*)و
Bash | 変数に収めたコマンドを実行する

変数をベタ書きするだけで良い

# 例

```bash
command='ls'

$command
```

# 結果

```bash
a.txt b.txt c.txt
```

# 応用

つなげることも出来る。

```bash
$command /music
```

```
Bomb_A_Head.wav Feeling_good.wav Funky_Gutsman.wav
```


# 環境

- sh 3.2
- bash 3.2








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Googleのポリシーに則ったパーミッションリクエストのフロー

Android M以降、ストレージの使用や位置情報の使用など、ユーザに許可を求めるタイミングが、当該機能を実行する直前になりました（ランタイムパーミッション）。より文脈の中で問いかけすることを意識したフローに変更になったわけですが、どういうフローで許可を求めるべきなのか、改めてガイドラインを見てみました。

参考：https://developer.android.com/training/permissions/requesting.html

# 流れ

ざっくりとした流れは、このサイトが参考になるかもしれません。
http://sys1yagi.hatenablog.com/entry/2015/11/07/185539

一応、許可を求めて、権限を取得して実行する流れをおさらいしておくと、

1. 権限を持っているか確認
2. 要求に際して説明が必要かどうかを確認（初回の要求かをチェックして、2回目以降は説明が必要）。必要であればダイアログなどを表示して、権限の許可が必要な理由をユーザに説明する。
3. 権限取得のダイアログを表示する。許可が出れば終了。拒否された場合は、さらに追加で説明を出すことができる。

こんな感じの流れでした。

# 実装

サンプルを見てみましょう。ここでは、最初に挙げたDeveloperサイトのサンプルに、実例を入れつつ書いてみたいと思います。

## requestPermissions

```java:
// thisActivity: 現在のActivity
// 許可を持っているかどうかを確認する（必要な権限全て確認する）
// Android M 未満の端末にも対応するなら、PermissionCheckerを使うのが安全
if (PermissionChecker.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED 
            || PermissionChecker.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {

    // 権限を要求する「根拠」を説明すべきかどうかを確認
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.CAMERA)
            || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {

        // 必要があれば説明ダイアログを表示
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        ...
        // Dialogを表示したあと、再度、許可を求める（requestPermissionする）
        ...
        builder.show();

    } else {

        // 説明が必要ない場合は、そのまま通常通り、requestPermissionする
        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA},
                MY_PERMISSIONS_REQUEST_CAMERA_AND_STRAGE);

        // MY_PERMISSIONS_REQUEST_CAMERA_AND_STRAGEは: intの定数, リクエストコード
    }
}

// ここ以降は、権限を持っている場合の処理
```

## onRequestPremissionsResult

```java
@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_CAMERA_AND_STRAGE: {
            // リクエストがキャンセルされた場合、配列のサイズは0
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED
                && grantResults[1] == PackageManager.PERMISSION_GRANTED) {

                // 許可されたので、処理を続行する

            } else {

                // 拒否されたため、フロー終了。
                // 追加の説明をすることもできる（権限の要求はしない）

            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}
```

ざっくり、以上のような実装になります。

ユーザがより詳細に、アプリの権限を設定できるようになった分、なおさら、
適切な（Googleポリシーに則った）フローで求めるようにしましょう。
Electronで作成したアプリを署名後、アプリがフリーズする

ElectronアプリをMac App Storeに出した時のつまずきです。

署名後にアプリがフリーズして慌てました。

plistにEntitlements(権限まわりのいろいろ)を指定する必要があります。
※ Entitlementsに指定できるもの → 「[Enabling App Sandbox](https://developer.apple.com/library/mac/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html)」

「`com.apple.security.network.client`」キーを追加したら動いた。通信してたのでこれが必要らしい。

```parent.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    ... 省略 ...
    <key>com.apple.security.network.client</key>
    <true/>
    ... 省略 ...
  </dict>
</plist>
```

# 参考
[[2016年3月時点]Mac用Electronバイナリに署名してApp Storeにアップするためのメモ - Qiita](http://qiita.com/hachi8833/items/e87c00f381c29b7f0120#_reference-82416ed1413dc3f52e9b)

# おわりに
今回リリースしたElectronアプリのインストール・使い方は記事「[LINEアニメスタンプにも利用できる！ APNGやWebPへ変換可能なアプリ「アニメ画像に変換する君」をリリース](https://itunes.apple.com/jp/app/anime-hua-xiangni-bian-huansuru/id1127676902?mt=12)」を参照ください。

もうちょっとしたら、全体の手順もまとめます〜(∩´∀｀)∩ﾜｰｲ
Electronで作成したアプリに署名後、ファイルの保存が出来ない

ElectronアプリをMac App Storeに出した時のつまずきです。

署名後にファイルの保存が出来なくて悩みました。

plistにEntitlements(権限まわりのいろいろ)を指定する必要があります。
※ Entitlementsに指定できるもの → 「[Enabling App Sandbox](https://developer.apple.com/library/mac/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html)」

ユーザーが選択したファイル・フォルダにしか読み書きの権限を与える例

```parent.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    ... 省略 ...
    <key>com.apple.security.files.user-selected.read-write</key>
    <true/>
  </dict>
</plist>
```

今回のアプリは、「〇〇.png」と関連の「〇〇.html」と、複数のファイルを保存する実装になっていた。もともと「〇〇.png」というファイルを保存するダイアログを出して、保存名が決まった後にファイル名部分の拡張子を変えて別ファイルの保存を行うという処理を実装していたけれども、「〇〇.png」を保存した後、アクセス権限がない「〇〇.html」を保存しようとすると、エラーが発生してしまって出来なかった。

もしかしたら別の解決法はあったかも知れなかったけれども、ひとまず処理を変更して「〇〇.png」も「〇〇.html」も両方保存ダイアログを出すようにしました。

ちなみに、一時的なファイルを作成するためにテンポラリフォルダーに読み書きを行ったのだけど、ここの読み書きは特に許可してなくても大丈夫でした。


# 参考
[[2016年3月時点]Mac用Electronバイナリに署名してApp Storeにアップするためのメモ - Qiita](http://qiita.com/hachi8833/items/e87c00f381c29b7f0120#_reference-82416ed1413dc3f52e9b)

# おわりに

ElectronアプリをMac App Storeに出したときの手順をまとめました。「[Electron製アプリ「アニメ画像に変換する君」をMac App Storeにリリース、アプリリリース時の手順まとめ - Qiita](http://qiita.com/nyamogera/private/fd42dfa8151371d526bd)」

また、今回リリースしたElectronアプリのインストール・使い方は記事「[LINEアニメスタンプにも利用できる！ APNGやWebPへ変換可能なアプリ「アニメ画像に変換する君」をリリース](https://itunes.apple.com/jp/app/anime-hua-xiangni-bian-huansuru/id1127676902?mt=12)」を参照ください。
kobitoの画像Upload上限値について

# kobitoについて
kobitoの使用歴は3年目になりました。
主にMacで使用しています。
主にメモとして使用していますが、その際に文章と一緒に画像を貼りたい場合があります。
ドラッグアンドドロップすることによって画像がサーバー上にUploadされ、参照できるようになります。
※ Windowsの場合はサーバーにUploadされずローカルのパスがMarkdown上に記載されます。

# 画像Upload上限値は2MB
この機能、大変便利なのですが上限値が2MBとなっています。
Qiitaに投稿することで100MBまで増えるとのこと。
そのためにこの記事を記載してることは内緒www