OmniAICreator/Qiita-1.07M huggingface dataset:
Pylearn2を試してみようと思ってつまづいたこと

# はじめに
* MacBookAir(2012)で流行り(?)のDeepLearningとかやってみたくて，いくつかの記事（参考文献）を漁った
* ほぼ参考文献のサイトの手順をそのままなぞった，その時にいくつかハマった場所もあったので備忘録的として保存
* スクリプトとか詳しい内容はそちらの[サイト](http://kensuke-mi.xyz/kensuke-mi_diary/2014/11/rbma.html)へ
* とりあえず何枚か画像を読み込ませてそれっぽい画像が表示するところまでやってみた

# 環境構築
* Python,git,pip,numpy,scipyをインストールしておく
* Theanoをインストール

```コマンド:
pip install theano
```
* Pylearn2をインストール

```コマンド:
pip install pillow
pip install PyYAML
pip install IPython
pip install Cython

git clone git://github.com/lisa-lab/pylearn2.git
python setup.py develop
```

### ここまででハマったところ
```コマンド:
ImportError: No module named numpy
```

* Pylearn2のsetup.pyを実行するとimport numpyが見つからない系?
    * 以下を参考に対処してみたがうまく治らず 
    * http://d.hatena.ne.jp/aremokoremo/20140507/1399475248
    * 環境変数(~/.bash_profile)とか確認してpathを確認したりした
    * 応急処置的にとりあえずnumpyが置いてあるsite-packagesのパスを追加
    * 環境変数を再読み込み(source ~/.bash_profile)

```コマンド:
===============================
00001	#include <Python.h>
00002	#include "structmember.h"
00003	#include <sys/time.h>
~~~~~~~~~略~~~~~~~~~
Exception: Compilation failed (return status=1): /Users/user-name/.theano/compiledir_Darwin-14.5.0-x86_64-i386-64bit-i386-2.7.8-64/lazylinker_ext/mod.cpp:1:10: fatal error: 'Python.h' file not found. #include <Python.h>.          ^. 1 error generated.. 
```
* import theanoでエラー Python.hとかが見つからない系？
    * いよいよ環境が壊れているような気がしてきたのでbrew doctorで確認
    * エラー内容を一つ一つ地道に消す（エラー内容をGoogle先生に聞くと解決策がある
    * ついでにbrew updateとかした

# 実行
## 手順  

1. 同じサイズの画像を集めてくる
    * Googleから学習させたい，jpgの画像を拾ってくる(10枚くらい)
        
2. スクリプトを使ってグレースケール化 & csvにする
    * サイトにあるimg2csv.pyを実行する
    * Imageモジュールとかが見つからないとか言われたら2行目から4行目を以下に変更
         
    ```コマンド:
    from PIL import Image
    from PIL import ImageOps
    from PIL import ImageFilter
    ```
    * サイトの通り以下のコマンドを実行

    ```コマンド:
    python img2csv.py グレースケール変換した.jpgのリスト train.csv
    ```
    * ここでうまくリストが渡せなかったのでコードを読んで以下で実行
              
    ```コマンド:
    python img2csv.py "../img/*.jpg" train.csv
    ```
3. 学習させる
    * pylearn2/datasets/にサイトのhoge_dataset.pyを入れる
    * 環境変数に以下を設定  
        * export PYLEARN2_DATA_PATH=train.csvとgrbm.yamlが置いてあるパス
        * export PYLEARN2_VIEWER_COMMAND="open -Wn"
    * 学習させる
        
        ```コマンド: 
        train.py grbm.yaml
        ```
4. 学習の結果を表示する
    * 表示のコマンド
    
        ```コマンド: 
        show_weights.py grbm.pkl
        ```    

## ここまででハマったところ

### 学習時間  
* 思ったよりも時間がかかる
* 150*150の画像を10枚使って実行して20分ぐらいかかった

### 学習結果の表示（描画）
* 学習結果を表示する時に以下のようなエラーが出た

    ```コマンド:
UserWarning: Unable to import matplotlib. Some features unavailable. Original exception: No module named matplotlib.pyplot
  "Original exception: " + str(matplotlib_exception))
    ```

* 以下のコマンドでmatplotlibを追加して無事に動作を確認
    
    ```コマンド:
    pip install matplotlib
    ```

# 参考文献
[http://kensuke-mi.xyz/kensuke-mi_diary/2014/11/rbma.html](http://kensuke-mi.xyz/kensuke-mi_diary/2014/11/rbma.html)
[http://d.hatena.ne.jp/aremokoremo/20140507/1399475248](http://d.hatena.ne.jp/aremokoremo/20140507/1399475248)
Entity Framework6で単純なデータ表示フォームを作成

なかなか情報が見つからなかったので覚え書き。
MSDNにあったサンプルコードが動かなかった(EF5以前のものだった)ので。いいサイト、というかリファレンスあったら教えてください((
とりあえずSQL Server 2014 ExpressとVisual Studio 2015 Communityで作ってます。

###テーブル構造

アーケードゲームのデータをまとめたものを想定

|ModelID|ModelName|
|-------|---------|
|機種ID(主キー)|機種名|

|TitleID|ModelID|VersionNO|TitleName|
|-------|-------|---------|---------|
|タイトルID(主キー)|機種ID(外部キー)|バージョン番号|タイトル名|

###コード

Modelの作成については省略。今回はデータベースからのCode Firstで作ってます。

```csharp:MusicGameDataViewer.cs
using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;

namespace EFSample
{
    public partial class MusicGameDataViewer : Form
    {
        MusicGame entities;

        public MusicGameDataViewer()
        {
            InitializeComponent();
            entities = new MusicGame();
            entities.Database.Log = sql => Console.WriteLine(sql); //コンソールに実行SQLを出力する
        }

        //データグリッドビューに機種名を表示
        private void btnShowModel_Click(object sender, EventArgs e)
        {
            dgvResult.DataSource = entities.Models.Select(model => new { model.ModelName }).ToArray();

            //カラム名設定
            dgvResult.Columns[nameof(Model.ModelName)].HeaderText = "機種名";
        }

        //データグリッドビューに機種名,バージョン名,稼動日を表示
        private void btnShowTitle_Click(object sender, EventArgs e)
        {
            dgvResult.DataSource = entities.Models.Join(entities.Titles,
                model => model.ModelID, title => title.ModelID,
                (model, title) => new { model.ModelName, title.TitleName , title.RunningDate }).ToArray();

            //カラム名設定
            dgvResult.Columns[nameof(Model.ModelName)].HeaderText = "機種名";
            dgvResult.Columns[nameof(Title.TitleName)].HeaderText = "バージョン名";
            dgvResult.Columns[nameof(Title.RunningDate)].HeaderText = "稼動日";
        }
    }
}
```

感覚としては単純にテーブルに対してLinqでデータ抽出すればいいだけなので、`ToArray()`,`ToList()`しないといけないことだけ気をつければ後は何も悩むことはなさそう。
あとは`nameof()`のおかげで文字リテラル記述する必要がない(+インテリセンスに全部任せられる)ってのは非常に楽ですね。

###JOIN時の出力SQL

```sql:Result.sql
SELECT 
    [Extent1].[ModelID] AS [ModelID], 
    [Extent1].[ModelName] AS [ModelName], 
    [Extent2].[TitleName] AS [TitleName], 
    [Extent2].[RunningDate] AS [RunningDate]
    FROM  [dbo].[Model] AS [Extent1]
    INNER JOIN [dbo].[Title] AS [Extent2] ON [Extent1].[ModelID] = [Extent2].[ModelID]
```

まぁ、ホントに単純なJOINでしかないので、出力SQLもこんなものですね。もっと複雑なテーブル構造でどうなるかはまた確認したいところ。

###やらかしたこと
-`DbSet<T>`をそのままDataSourceに放り込んで怒られる(`NotSupportedException`)
-`DbSet<T>`を直接`ToArray()`,`ToList()`したらやたら表示が遅延(一行ずつラグって表示)した。(誰か原因教えてください)
-メソッド内で`entities`宣言してusing句でくくってたら怒られた

思い出したら追記するかも。あとエラー処理とかろくにやってないので、改善すべきとこはいろいろあるはず。
Android Studioで外部jarを取り込む

Android Studioで外部jarを取り込む方法として

- libsディレクトリの下に指定のjarファイルをおく

*build.gradleにlibs配下のjarを読み込む設定は必要*

```build.gradle
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    ・・・
}
```

通常は上記方法で問題ないが、jarが読み込まれない場合がある。
その場合は、以下の記述を行うとjarが読み込まれるようになる。

- build.gradleのdepenciesに読み込まれないjarファイルを参照するように指定する。

```build.gradle
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile file("libs/xxxxx.jar")
    ・・・
}
```

Android Studioで外部jarを取り込む際に
何度かclean buidしたりして
少しはまったので備忘録として残します。
ゲストOSからホストOS内にアクセスする

## About
ゲストOSからホストOSで構築したpostgresqlに接続する方法を調べたのでメモ。

## 接続方法
### 10.0.2.2で接続する
VM上では２つの仮想NICがあり、10から始まるIPと192から始まるIPを持っています。ホスト上では192から始まるIPしかないため、ホストから10から始まるIPに接続できません。しかしゲストOSからはホストOSが見えているようで、10.0.2.2にホストOSが割り当てられています。（virtualboxの仕様らしいです。）

```
psql -U xxx -d xxx -h 10.0.2.2
```

のようにすればアクセスできます。

詳細は時間とれたときに調べてみたいと思います。このあたりの記事が参考になりそうです。
[VirtualBox ネットワーク設定 - bit](http://iwsttty.hatenablog.com/entry/2013/12/08/194430)

## 参考
http://garbagetown.hatenablog.com/entry/20100313/1270039659
https://gist.github.com/wakamsha/087d5f95c8dbe07b9591
HibernateDaoSupportの中で left join を使う方法 

Hibernate 3.2.5GA では DetachedCriteria に JOIN の種類を指定する方法がなく、createAlias() は強制的に INNER JOIN になってしまう。

```java		
DetachedCriteria d = DetachedCriteria.forClass(Like.class);
if (idUserLike != null)  d = d.add(Restrictions.eq("idUserLike", idUserLike));
if (idSession != null)  d = d.add(Restrictions.eq("idSession", idSession));
if (idContent != null)  d = d.add(Restrictions.eq("idContent", idContent));
if (typeContent != null)  d = d.add(Restrictions.eq("typeContent", typeContent));
if (dateTimeStart != null) d = d.add(Restrictions.ge("dateTimeModified", dateTimeStart));
if (dateTimeEnd != null) d = d.add(Restrictions.lt("dateTimeModified", dateTimeEnd));

d = d.createAlias("userLike", "usrLike")
	.createAlias("userContent", "usrContent") // INNER_JOIN のため userContent が存在しない行が出てこない
	.addOrder(isAscending ? Order.asc(nameColumnOrder) : Order.desc(nameColumnOrder));
List<Like> result = (List<Like>)this.getObjectsByCriteria(d, indexOffset, numLikes);
```

そのため LEFT JOIN などを使いたい場合は Criteria を使う必要があるが、HibernateDaoSupport の中からは DetachedCriteria しか使えないと長い間思い込んでいた。今回 Criteria を使う方法が判ったのでメモ。

```java
List result = getHibernateTemplate().executeFind(new HibernateCallback() {
	public Object doInHibernate(Session session) {
		Criteria c = session.createCriteria(Like.class);
		if (idUserLike != null)  c = c.add(Restrictions.eq("idUserLike", idUserLike));
		if (idSession != null)  c = c.add(Restrictions.eq("idSession", idSession));
		if (idContent != null)  c = c.add(Restrictions.eq("idContent", idContent));
		if (typeContent != null)  c = c.add(Restrictions.eq("typeContent", typeContent));
		if (dateTimeStart != null) c = c.add(Restrictions.ge("dateTimeModified", dateTimeStart));
		if (dateTimeEnd != null) c = c.add(Restrictions.lt("dateTimeModified", dateTimeEnd));
		c = c.createAlias("userLike", "usrLike", CriteriaSpecification.INNER_JOIN)
			.createAlias("userContent", "usrContent", CriteriaSpecification.LEFT_JOIN)
			.addOrder(isAscending ? Order.asc(nameColumnOrder) : Order.desc(nameColumnOrder))
				.setFirstResult(indexOffset).setMaxResults(numLikes);
				
	    return c.list();			        
	}
});
```
なお、Hibernate 3.2.6GA 以降の DetachedCriteria では createAlias() に joinTypeが指定できる模様。
MBProgress的使用


1.将MBProgressHUD与MBProgressHUDManager添加进工程，包含头文件

`#import "MBProgressHUDManager.h"
`

```
 MBProgressHUDManager * hudManager = [[MBProgressHUDManager alloc] initWithView:self.view];
    [hudManager showIndeterminateWithMessage:@"加载中..."];
    
```

#KVNProgress的使用

KVN的使用更加简单

`#import "KVNProgress.h"
`

```
 [KVNProgress showSuccess]
 [KVNProgress showWithStatus:@"加载失败"];
 
```
分享


头文件

`#import "UMSocial.h"
`

可以分享到各种平台UMShareToSina,UMShareToSms等等
```
//分享
        [UMSocialSnsService presentSnsIconSheetView:self appKey:@"55bf7d1ee0f55a3ccc002b2c" shareText:@"OoO" shareImage:[UIImage imageNamed:@"Defaultretein1@2x"] shareToSnsNames:@[UMShareToSina,UMShareToSms] delegate:self];
        
```
重绘button


使用此方法可以改变系统button中image，title的位置，大小。

1.首先需要创建一个继承于UIbutton的类,并且设置一个属性，用作比例

```
@interface ToolsBtn : UIButton

@property (nonatomic,assign) CGFloat raido;

@end
```


2.在实现中实现button的两个方法便可

```
//返回的是按钮内部图片的 frame
- (CGRect)imageRectForContentRect:(CGRect)contentRect{

    CGRect imageRect = CGRectMake((1- _raido) * CGRectGetWidth(contentRect) / 2.0, 0, CGRectGetWidth(contentRect) * _raido, CGRectGetWidth(contentRect) * _raido);
    return imageRect;
    
    
}
//返回的是按钮内部 titleLabel的frame
- (CGRect)titleRectForContentRect:(CGRect)contentRect{
    
    CGRect titleRect = CGRectMake(0, CGRectGetWidth(contentRect) * _raido, CGRectGetWidth(contentRect) , CGRectGetWidth(contentRect)*(1-_raido));
    return titleRect;
```
循環参照を体験する雑なdemoコード作った件


Swift時代はARC前提だしSwiftから始めた人に循環参照でメモリリークする件を伝えるのはどこから話せばいいか難しい。なので動くデモコードとして循環参照するパターンとしないパターンを作ればいいかなと思ったのでGitHubにpushしています。

https://github.com/yimajo/SwiftReferenceCycleDemo


# 動作説明

- 画面は一覧と詳細画面に分かれている
- 詳細画面でTimer用のインスタンスを作りそいつがクロージャ利用
	- 詳細画面のViewControllerをクロージャに渡す
	- 詳細画面から一覧画面に戻った時に循環参照していなければdeinitされる
- deinitが実行されてるかどうかはNSLog使ってるのでXcodeのコンソール見て確認

一覧画面で循環参照すしないコードとするコードが選べる

![スクリーンショット 2015-09-02 17.17.20.png](https://qiita-image-store.s3.amazonaws.com/0/16400/4de7e237-8430-ef71-7c47-c24eb7292609.png "スクリーンショット 2015-09-02 17.17.20.png")

詳細画面はこんな感じ

![スクリーンショット 2015-09-02 17.21.39.png](https://qiita-image-store.s3.amazonaws.com/0/16400/bf4950bb-defb-51ce-6dd3-35ec6c34f3e9.png "スクリーンショット 2015-09-02 17.21.39.png")

# 備考

Timerを使っているのはクロージャを保持して動作を実行してくれるのが分かりやすいため。

# 参考

Swiftのクロージャにおける循環参照問題でunownedとweakの使い分けがわからない
http://qiita.com/susieyy/items/39efd4d34cf4c1f9d3ef
Fragment ライフサイクル

メモ

```java
public class TestFragment extends Fragment {
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_main, container, false);

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

    }

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
    }

    @Override
    public void onStop() {
        super.onStop();
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onDetach() {
        super.onDetach();
    }
}
```
RRD::Editor

RRD ファイルの構造を変更するときに CPAN の RRD::Editor は何かと便利です。

例 DS の type を COUNTER から DERIVE に変更する。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
use File::Find;
use RRD::Editor;

$SIG{__DIE__} = sub {
    print $File::Find::name, "\n";
};

$| = 1;

$top_dir = "/path/to/rrd/.";

sub process {
    return unless (/\.rrd$/);
    return unless (-f $File::Find::name);

    print $File::Find::name, " ... ";
    my ($min_pdp, $max_pdp);
    my $rrd = RRD::Editor->new();
    $rrd->open($File::Find::name);
    foreach $name ($rrd->DS_names()) {
        if ($rrd->DS_type($name) eq "COUNTER") {
            $rrd->set_DS_type($name, "DERIVE");
        }
    }
    $rrd->save();
    $rrd->close();
};

find(\&process, $top_dir);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

例 RRA のレコード数を変更する。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
use File::Find;
use RRD::Editor;

$SIG{__DIE__} = sub {
    print $File::Find::name, "\n";
};

$| = 1;

$top_dir = "/path/to/rrd/.";

sub process {
    return unless (/\.rrd$/);
    return unless (-f $File::Find::name);

    print $File::Find::name, " ... ";
    my ($min_pdp, $max_pdp);
    my $rrd = RRD::Editor->new();
    $rrd->open($File::Find::name);
    for ($i=0; $i < $rrd->{rrd}->{rra_cnt}; $i++) {
        if ($rrd->{rrd}->{rra}[$i]->{pdp_cnt} == 1) {
            if ($rrd->{rrd}->{rra}[$i]->{row_cnt} < 18432) {
                $rrd->resize_RRA($i, 18432);
            }
        }
        if ($rrd->{rrd}->{rra}[$i]->{pdp_cnt} == 6) {
            if ($rrd->{rrd}->{rra}[$i]->{row_cnt} < 3072) {
                $rrd->resize_RRA($i, 3072);
            }
        }
        if ($rrd->{rrd}->{rra}[$i]->{pdp_cnt} == 24) {
            if ($rrd->{rrd}->{rra}[$i]->{row_cnt} < 768) {
                $rrd->resize_RRA($i, 768);
            }
        }
        if ($rrd->{rrd}->{rra}[$i]->{pdp_cnt} == 288) {
            if ($rrd->{rrd}->{rra}[$i]->{row_cnt} < 797) {
                $rrd->resize_RRA($i, 797);
            }
        }
    }
    $rrd->save();
    $rrd->close();
};
find(\&process, $top_dir);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cp -r でのシンボリックリンクとハードリンクの扱い

### シンボリックリンク

BSD UNIX や UNIX SVR4 などの伝統的な UNIX では `cp -r` でディレクトリをコピーした場合、ディレクトリツリーに含まれるシンボリックリンクは、シンボリックリンクがポイントするディレクトリやファイルを参照して、実体としてコピーされます。

Linux では `cp -r` でディレクトリをコピーした場合、ディレクトリツリーに含まれるシンボリックリンクは、シンボリックリンクとしてそのままコピーされます。これは、Linux では cp は GNU 版であり、GNU の拡張が入っているためです。

`-p` オプションの指定がなければ実体に置き換わるものだと思っていたら、シンボリックリンクのままだったので、うっかりハマりました。

ちなみに Linux でも `cp シンボリックリンク 対象` というように `-r` オプションをつけない場合は、シンボリックリンクがポイントするディレクトリやファイルを参照して、実体としてコピーされます。

### ハードリンク

ディレクトリツリー中にハードリンクが存在した場合、そのままではハードリンクが切れて、別々のファイルとしてコピーされてしまいます。Linux (GNU cp)の場合は、-d オプションを指定することでハードリンクを維持することができます。-d オプションは --no-dereference --preserve=links と同じです。また -a オプション（-dｒ --preserve=all と同じ）を指定すると、ハードリンクのほかに、対象ファイルやディレクトリのアクセスモードや所有者情報、タイムスタンプなどを維持してコピーしてくれます。

Solaris, FreeBSD, MacOS などでは、cp コマンドでハードリンクを維持したままディレクトリをコピーすることはできません。`rsync -aH` や `find . -depth -print | cpio -pdmu コピー先` などの方法を使いましょう。

Solaris で tar コマンドを使用する場合、tar コマンドは 伝統的な UNIX と同様にパス名に 256 文字の制限があるため E オプションを指定する必要があります。
PDOException' with message 'SQLSTATE[HY000] [2002] No such file or directory

```
PDOException' with message 'SQLSTATE[HY000] [2002] No such file or directory
```

PDOでこういうエラーが出ることがよくあります。
`No such file or directory`というエラーメッセージが非常に紛らわしいのですが、実はファイルとかディレクトリとかは関係なく単にDB接続失敗してるだけだったりします。

私の場合、mysqldが落ちてたのが原因なのでmysqldを起動したら解決しました。
ngx_mrubyでiOSにPush通知してみた、(Parse.com経由)


Parse.comにはREST APIから各種デバイスへのPushをキックする仕組みがあるので、じゃあNginxが押してもいいじゃんと。


## iOS Pushの仕込み

Pushを受ける側についてはドキュメントを追っていっただけなので箇条書き。

- Apple Dev Centerで一式そろえる。
    - pushアリのアプリ用証明書作成＆Push用証明書作成＆登録
    - デバイス登録
    - アプリ＆デバイスを含むプロビジョニングプロファイル作成(Developer)
- Parse.comでアプリ登録
    - アプリのPushに使う証明書を登録
- 通知用の空アプリをデプロイ
    - ParseStarterProject-SwiftをXCodeでビルド
    - 端末でアプリを起動し、Pushを許可
- Parse.comで端末登録の確認
    - ついでにチャンネル`Nginx`をSubscribe(手書き)


## ngx_mrubyで外部HTTPSリクエスト用のmgemを追加

ngx_mrubyに最初から用意されているサンプルの`build_config.rb`に対して、追加したのはこれら。

- mruby-httprequest
- mruby-polarssl

※ 今回はちょっとした都合(たまたま？)で `s/mruby-onig-regexp/mruby-pcre-regexp/` という変更もした。


## ではサンプルコード

使いどころとしては、何かしら不都合や攻撃があったタイミングで使えないかなーと考えていました。
しかし、まずはシンプルにこの方針。

1. 誰かがサイトを訪れたら
2. IPをiOSに通報する

やってみよう。

```
location / {
  mruby_content_handler_code '
    Server = Nginx

    c = Server::Connection.new

    http = HttpRequest.new()
    res = http.post(
           "https://api.parse.com/1/push",
           JSON.generate({
              "channels" => ["Nginx"],
              "data"  => {"alert" => "Your site was visited from #{c.remote_ip} ."}
            }),{
            "Content-Type"           => "application/json",
            "X-Parse-Application-Id" => "Parseのアプリケーションキー",
            "X-Parse-REST-API-Key"   => "ParseのREST APIキー"
            })

    Nginx.errlogger Nginx::LOG_WARN, res["status"]

    Server.echo "reported your access."
  ';
}
```


### ブラウザでリクエストした

ちちょっとDockerで立ち上げたサーバにブラウザでリクエスト。通報された。

![192_168_99_100_8080_と_192_168_99_100_8080_と_sawanoboriyu_—_bash_—_157×41.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/b12b8515-e043-5fa0-9bae-1caa5a59da10.jpeg "192_168_99_100_8080_と_192_168_99_100_8080_と_sawanoboriyu_—_bash_—_157×41.jpg")

リクエスト処理中に同期処理でParseを叩いているので、それなりに待つのは(今回は)仕方ないとして。。。
Nginx側のログに、Parseからの戻りが`200 OK`であることが記録された。

```
2015/09/02 xx:xx:xx [warn] 1#0: *1 200 OK, client: 192.168.99.1, server: _, request: "GET / HTTP/1.1", host: "192.168.99.100:8080"
```

### Push通知確認

そしてPushは来た。

![IMG_0573.JPG](https://qiita-image-store.s3.amazonaws.com/0/7454/66490988-854a-1100-55e9-04d134147e61.jpeg "IMG_0573.JPG")

何かに外部へのリクエストを使うなら、うまいことワーカープロセスが丸ごと待ちにならないよう書きたいね。

----

追記:

メモリが無尽蔵で外部APIのレスポンスがクライアントに対して不要ならば、ダブルforkで囲んじゃうという手がある。
[WebSocket] Apache24とsocket.ioのリバースプロキシについて

延々調べたあげく、ぜんぜんうまく行かず、、試行錯誤の結果、下記に落ち着いた。


```httpd.conf
Listen 80
<Location /ws>
    ProxyPass http://localhost:8080/socket.io/
    ProxyPassReverse http://localhost:8080/socket.io/
</Location>
```

```server.js
var PORT, app, http, io;
PORT = 8080;
app = require("express")();
http = require("http").Server(app);
io = require("socket.io")(http);
io.set("origins", "*:*");
```

```client.js
var socket;
socket = io.connect(location.protocol + "//" + location.hostname + ":" + location.port, {
  path: "/ws/socket.io"
});
```
Windowsの付箋でフォントサイズを変えるショートカット

Windowsの標準の付箋を使ってみたら、コンテキストメニューにフォントサイズ変更がなかったのでショートカットのメモ

## ショートカット
- 変更する文字を選択して
  - フォント サイズを小さくする : Ctrl + Shift + < (,)
  - フォント サイズを大きくする : Ctrl + Shift + > (.)

## 参考
- Microsoftのサイト:
  - https://support.microsoft.com/ja-jp/kb/2278365
- その他、書式などいろいろ変えれるのでこのへんを参照: 
  -  http://www.kitaguniweb.com/cat-beginner/2014/p-5625/
ScrumButを訳してみた


## 訳

### スクラムの改変でおきる「スクラムやってるけど…」(ScrumBut)

ScrumButとは、本来であればスクラムを実践することで得られる利益とそれが得られない理由をまとめたものだ。スクラムは開発現場でチームの課題を解決するために実践されている。登場する役割やルール、タイムボックスのどれもが、開発の現場でよくある問題に取り組み利益を得るためにデザインされている。
ScrumButとは、問題の一因となっている機能不全が露見しても、解消するのが難しすぎる事を意味したものだ。Scrumを改変したことで問題が見えなくなり、機能不全がチームにとってもはや苦痛のたねが発芽したものがScrumButだ。

ScrumButは特定の形式で記述する:(スクラムやっているけど)(理由)(次善策)

####　ScrumButの例:

- "(スクラムやってるけど)(毎日デイリースクラムを実践するのはムダが多すぎるので)(週に一度やるようにしました)"
- "(スクラムやってるけど)(ふりかえりは時間のムダなので)(やらなくなりました)"
- "(スクラムやってるけど)(1ヶ月という期間に機能を分割して開発できないので)(私達のスプリントは6週間です)"
- "(スクラムやってるけど)(上司から作業が割り込んでくるので)(いつも完成の定義を満たすための時間がなくなりました)"

スクラムは問題を正すため、組織が短期間で変化させる。例えば、「完成」には自動テストを開発するのに数ヶ月かかるため、初期は回帰テストやパフォーマンステストを含まない。初期の数ヶ月間は透明性は信用できなかったが、できるだけ限り早く回復させるべきだ。

## 原文

https://www.scrum.org/ScrumBut

### ScrumButs and Modifying Scrum

ScrumButs are reasons why teams can’t take full advantage of Scrum to solve their problems and realize the full benefits of product development using Scrum. Every Scrum role, rule, and timebox is designed to provide the desired benefits and address predictable recurring problems. ScrumButs mean that Scrum has exposed a dysfunction that is contributing to the problem, but is too hard to fix. A ScrumBut retains the problem while modifying Scrum to make it invisible so that the dysfunction is no longer a thorn in the side of the team.

A ScrumBut has a particular syntax: (ScrumBut)(Reason)(Workaround)

ScrumBut Examples:

- "(We use Scrum, but) (having a Daily Scrum every day is too much overhead,) (so we only have one per week.)"

- "(We use Scrum, but) (Retrospectives are a waste of time,) (so we don't do them.)"

- "(We use Scrum, but) (we can't build a piece of functionality in a month,) (so our Sprints are 6 weeks long.)"

- "(We use Scrum, but) (sometimes our managers give us special tasks,) (so we don't always have time to meet our definition of done.)"

Sometimes organizations make short term changes to Scrum to give them time to correct deficiencies. For example, "done" may not initially include regression and performance testing because it will take several months to develop automated testing. For these months, transparency is compromised, but restored as quickly as possible.
Rails + Angularjs でhtmlテンプレートをHAMLで書く

Rails + AngularjsでSPA作ってると、htmlテンプレートはhamlで書きたくなるよね？？
やり方を備忘録的に記録

Gemfileにhaml-rails入れておく

```Gemfile
gem 'haml-rails'
```

assets.rbに設定を記載

```config/assets.rb
Rails.application.assets.register_engine '.haml', Tilt::HamlTemplate
```

assetsのtemplatesフォルダ内にhtml.hamlを作成

```app/assets/templates/hoge.html.haml
%div
  やっほー
```

あとは、これで取得できるよー。
http://localhost:3000/assets/hoge.html
AWS で Nginx でリバースプロキシするときの resolver の DNS サーバ

# 状況

AWS で、 nginx をフロントに立てて、後ろのサーバへリバースプロキシをしていた。
このとき、 nginx の　config ファイルに、 resolver を設定しないといけなくなった。


# 問題

よく検索したときのサンプルにある 127.0.0.1 は当然ダメ。
/etc/resolv.conf を見ると、 `ネットワークアドレス + 2` の値が書いているが、
毎回これを書くのもなあ。
っていうかこれ何？

# 解決
1.  VPC ごとに DNS サーバの IP アドレスは決まっていて、`ネットワークアドレス + 2`
    例 `10.0.0.0/24` なら `10.0.0.2` がアドレス

2. 共通で使えるにも DNS サーバもある。 `169.254.169.253`

# 参考文献
ここに全部かいている。
http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_DHCP_Options.html#AmazonDNS
R CMD check でMalformed Description field: should contain one or more complete sentences.となる理由の調査

普段全くRを使わないものがこの記事を書いています。

# 概要

R CMD check をしたときに、Descriptionをきちんと書いていると思っているが、タイトルのような出力となる。
この原因を調査した。

# 結論

以下のようなソースコードで判定されていると考えている。
Malformed...の出力をとめるには、
ピリオドで終わるなど、次の条件にマッチするようにすればよい。

```r
## some people put punctuation inside quotes, some outside.
if(strict && !is.na(val <- db["Description"])
   && !grepl("[.!?]['\")]?$", trimws(val)))
    out$bad_Description <- TRUE
```

## Rのバージョン

使用したRのバージョン

|ソフトウェア|バージョン|
|----------|--------|
|R|R version 3.2.2 Patched (2015-08-27 r69199) -- "Fire Safety"|

R-latest.tar.gzを持ってきて自分でコンパイルしたもの。

# 調査

## Google で調べてみた

* [Nobody Knows What It’s Like To Be the Bad Man: The Development Proces…](http://www.slideshare.net/Work-Bench/nobody-knows-what-its-like-to-be-the-bad-man)
* [R help - what constitutes a 'complete sentence'?](http://r.789695.n4.nabble.com/what-constitutes-a-complete-sentence-td4709358.html)

上のスライドの１９枚目で書いているが、よくわからなかった。
下の議論は長かったので、とりあえず、ソースコードのgrepをしながら読んでいたのだけど、よくわからなかった。

## ソースコードのgrepの結果

コンパイルしたあとのディレクトリで、以下のようなコマンドを実行した

```
grep -r "Malformed Description field: should contain one or more complete sentences" *
```

それっぽい行が２つヒットしていた

```
src/library/tools/R/QC.R:        writeLines(gettext("Malformed Description field: should contain one or more complete sentences."))
src/library/tools/all.R:        writeLines(gettext("Malformed Description field: should contain one or more complete sentences."))
```

どちらも同じような内容で、問題の出力は以下のところで行っていると考えた。

```r

if(identical(x$bad_Description, TRUE))
    writeLines(gettext("Malformed Description field: should contain one or more complete sentences."))
```

bad_Descriptionについては、この文書の冒頭にあげたように以下のようなコードとなっている。
きちんと深くはおっていないが、このファイルの中ではここだけであったので。

```r
## some people put punctuation inside quotes, some outside.
if(strict && !is.na(val <- db["Description"])
   && !grepl("[.!?]['\")]?$", trimws(val)))
    out$bad_Description <- TRUE
```

正規表現の感じからすると、最後の文字が何かが問題ようだとおもったので、Rを起動して以下のような感じで動かした。

```r

> val="hello"
> grepl("[.!?]['\")]?$", trimws(val))
[1] FALSE
> val="hello."
> grepl("[.!?]['\")]?$", trimws(val))
[1] TRUE
```

最初はhelloだけでFALSEになっていて、次にピリオドをつけたらTRUEになった。
上に上げた条件式としてはおそらくピリオドが最後であれば Malformed と言われることはないだろうというのが結論。


### 参考
上にあげたスライドの１９枚目をみると

|文章|結果|
|---|----|
|My awesome R package|NG|
|This package is awesome|NG|
|Blah blah blah.|OK|

となっている。
おそらく、最後のだけ通っているのは、最後の文字がピリオドだからではないか。
AlamofireでMultipartFormDataをパラメータ付きでポストする

Alamofire v1.3.1 時点

AlamofireにMultipartFormDataが実装されたが、同時にパラメータを渡す方法がわからなかった。

もっと簡潔なやり方があるのかもしれないが、値をNSDataに変換してmultipartFormData.appendBodyPart(data:name:)で追加してやれば、とりあえずパラメータを追加することはできるようだ。

例

```swift
let fileURL = NSBundle.mainBundle().URLForResource("Default", withExtension: "png")!

Alamofire.upload(
    .POST,
    URLString: "http://httpbin.org/post",
    multipartFormData: { (multipartFormData) in
        // file upload
        multipartFormData.appendBodyPart(fileURL: fileURL, name: "uploadFile")

        // stringVal=hoge
        if let data = "hoge".dataUsingEncoding(NSUTF8StringEncoding) {
            multipartFormData.appendBodyPart(data: data, name: "stringVal")
        }

        // intVal=10
        if let data = String(10).dataUsingEncoding(NSUTF8StringEncoding) {
            multipartFormData.appendBodyPart(data: data, name: "intVal")
        }
    },
    encodingCompletion: { (encodingResult) in
        switch encodingResult {
        case .Success(let upload, _, _):
            upload.responseJSON { request, response, JSON, error in
                println(JSON)
            }
        case .Failure(let encodingError):
            println(encodingError)
        }
})
```
zsh + vim 環境で vim[tab] と押すとエラー

# 対処法
`exec zsh`を実行する

# 症状
```
~/dotfiles (master ✔) ᐅ vim 
_arguments:450: _vim_files: function definition file not found
_arguments:450: _vim_files: function definition file not found
_arguments:450: _vim_files: function definition file not found
```

# ログ
```
~/dotfiles (master ✔) ᐅ vim 
_arguments:450: _vim_files: function definition file not found
_arguments:450: _vim_files: function definition file not found
_arguments:450: _vim_files: function definition file not found
~/dotfiles (master ✔) ᐅ rm ~/.zcompdump
~/dotfiles (master ✔) ᐅ vim 
_arguments:450: _vim_files: function definition file not found
_arguments:450: _vim_files: function definition file not found
_arguments:450: _vim_files: function definition file not found
~/dotfiles (master ✔) ᐅ exec zsh
~/dotfiles (master ✔) ᐅ vim
Makefile   README.md
```

#参考
https://github.com/robbyrussell/oh-my-zsh/issues/518#issuecomment-17796269
機械学習のための確率統計1


　機械学習のためにまずは確率統計からと勉強を始めた際のメモ書きです．
勉強途中ですので，間違いなどがあればどうぞ宜しくお願いします．


## はじめに
　統計的推測はモデルを通じて行う，パラメトリックと
モデルを通さずに行う，ノンパラメトリックがある．
　パラメトリックには，期待値に線形な構造をもたせ，誤差の確率分布に正規分布を仮定する正規線形モデルがある．分散分析や回帰分析などの理論は全てこの線形モデルを基礎としているためそれがわかると機械学習に入ることができると信じてる．とりあえず初回だし軽くウォーミングアップがてら，その線形モデルを学ぶために必要な統計的知識を整理していく．
この数学の基礎的な部分を抑えることで，ただ機械学習ライブラリを使うだけではなく，学習データの素性や特性から効率的にアルゴリズムを選択し，出た結果を自分で解析できるようになるはずだと信じて...
とりあえずまずは確率統計の基礎用語から追っていくこととする．



## 確率の基礎
　まず確率統計に限った話ではないが，数値が連続的か離散的かで扱いが大きく違うためとりあえずそこは注意したい．


#### 確率変数(random variable)
　ある変数のとる値が事前に予知することができず，確率$P$に従って出現するとしたときの値を，確率変数という．つまりセンサや体重を測定して得られた値は確率変数と呼ばれる．名前はこんなのだが測定するたびに違う値のこと．つまり変数．
一般的に大文字の$X,Y,Z$を用いる

#### 離散型（discrete type）と連続型(continuous type)
　サイコロのようにとりうる値が有限個，もしくは,$0,1,2,3...$というように数え上げることができるものを離散型という．
　体重や身長のようにある定められた範囲の特定の実数値をとることが可能な場合のものを連続型という．
　一般的に距離センサや波形のデータは連続型と分類してもよいかと．

#### 累積分布関数(cumlative distribution function) ,分布関数（distribution function）

```math
F(x)=P(X≦x)	
```

$X$が確率変数，$x$が選ばれる確率を意味している．
$X$が身長を表すと仮定すると．この式は，$X$が$x$以下の身長の人が選ばれるとき確率を示していることになる．
　この確率$P$は，$x$に依存して決まる関数であると言え，累積分布関数もしくは，分布関数と呼ぶ．
$ F(x)$は$x$の単調非減少関数である．また$X$は必ず有限の値をとると仮定し
 
```math
F(∞)=1 , F(-∞)=0
```
とする．

#### 確率密度関数(probability density function)，密度関数(density function)
　$X$が連続型の確率変数の場合，当然確率分布$F(x)$は$x$に関して微分可能な場合が多い．
　このとき導関数を確率密度関数あるいは密度関数と表す．

```math
F(x)=∫^x _{-∞} f(u)du	\\
``` 
```math

```   
```math 
F(∞)=∫ ^∞ _{-∞ }f(x)dx=1 
```
である．また区間$[a,b]$の値をとる確率は

```math
P(a<X≦ b)=∫ ^b _a f(u)du\\
```
となる．

####　確率関数(probability function
　$X$が離散型の確率変数の場合には，とりうる値を個々の確率で表現したほうが便利．

```math
x_i,	i=0,1,2,…\\
``` 	

で定義される関数を確率関数という．

```math
F(X)=Σ_{x_i≦ {_xP_i}}
``` 	
　となるため$F(x)$は，点$x_i$において$P_i$の高さジャンプするステップ関数となる．

####　期待値と分散，共分散
　確率分布について，分布の中心，値のばらつきがわかる指標があると嬉しい．
中心の指標の代表格が期待値である．
　離散的な確率変数に対して，期待値$E(X)$はとりうる値にその確率をかけた加重和で定義する．

```math
E(X)=Σ _{{_iP_i}{x_i}}
``` 	

 一方，ばらつきの指標が分散である．

$μ=E(x)$と置いた時，$V(X)$は

```math
V(X)=E{(X-μ)^2} =Σ _{_iP_i}(x_i-μ )^2
``` 	
で定義する．$V(X)$は，

```math
V(X)=E(X^2)-{E(X)}^2
``` 	
とも表現することができる．

　連続型の確率変数にたいしては期待値，分散ともに和が，積分に変わるだけである．

```math
\begin{align}
E(X)&=\int_{-∞ }^{∞ }xf(x)dx \\
V(X)&=\int_{-∞ }^{∞ }(x-μ )^2f(x)dx
\end{align}
``` 	
確率変数$X_i(i=1,2,3…,n)$の線形和
$$c_1X_1+c_2X_2+… +c_nX_n$$
の期待値と分散に対する公式について考える．また$c_1,c_2,c_3,…,c_n$は定数とする．


```math
\begin{align}
期待値：E(c_1+c_2X_2+… c_nX_n)&=c_1E(X_1)+c_2E(X_2)+… +c_nE(X_n)\\
分散：V(c_1X_1+c_2X_2+… c_nX_n) &= \sum_{i=1}^{n} \sum_{j=1}^{n} c_ic_j Cov(X_i,X_j )
\end{align}
```

$Cov(X_i,X_j)$は共分散とよばれ2組の対応するデータ間での，平均からの偏差の積の差である．2組の確率変数$X_i,X_j$の共分散は$E$で期待値を表すことにして
$$Cov(X_i,X_j)=E \bigl( (X_i-E(X_i))(X_j-E(X_j)) \bigl) $$
で定義される．
 
 $X_i(i=1,2,… ,n)$が互いに独立の時，
 $$Cov(X_i,X_j)=E(X_i-E(X_i))E(X_j-E(X_j))=0 (i \neq j) $$
 となるので，
 $$V(c_1X_1+c_2X_2+… c_nX_n)  =c_{1}^{2}V(X_1)+c_{2}^{2}V(X_2)+… +c_{n}^{2}V(X_n)$$
となる．
ユーザーの所属するグループ一覧の取得方法

ハマったのでメモ

#目的
GoogleAppsScriptを使って、GoogleAppsの管理ページにあるような「このユーザーがどのグループに所属しているか」を取得します。
コードアシストに出てくる引数だけ見るとそれらしい項目がないように見えますが、optionalArgsに記述することで実現可能です。

##とりあえずソース
GoogleApps for workの前提で書きます。

AdminDirectory.Groups.listでuserKeyにユーザーのメールアドレスを指定するだけです。
また、ドメインは指定しないと失敗するようです。

```js:コード.gs
function myFunction() {
  var domain = 'hoge.co.jp';
  var userEmail = 'taro@hoge.co.jp';

  var list = AdminDirectory.Groups.list({domain: domain, userKey: userEmail});

  Logger.log(list.groups.length);
}

```

##APIドキュメント
https://developers.google.com/admin-sdk/directory/v1/reference/groups/list?hl=ja

このページのTry it!で気軽に試すことができます。
WatchOS2でiPhoneとの文字データのやりとりについて

# WatchOS2でiPhoneに文字を送るやり方
Obj-Cを使ってiPhoneとの連携をまとめてみました。見てくれる人いるかな。


#### iPhone側はこんな感じのコードです。簡単過ぎて説明いらんですね。 
```objc:ViewController.m
#import "ViewController.h"
#import <WatchConnectivity/WatchConnectivity.h>

@interface ViewController () <WCSessionDelegate>
@property (weak, nonatomic) IBOutlet UILabel *Label;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    if ([WCSession isSupported]) {
        WCSession *session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
    }
}

- (void)session:(nonnull WCSession *)session
 didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext
{
    NSString *moji = [applicationContext objectForKey:@"moji"];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.Label setText:[NSString stringWithFormat:@"moji:%@",moji]];
    });
}
@end
```

```objc:InterfaceController.m
#import "InterfaceController.h"
#import <WatchConnectivity/WatchConnectivity.h>

@interface InterfaceController() <WCSessionDelegate>

@property (strong, nonatomic) WCSession *session;

@end

@implementation InterfaceController

-(instancetype)init {
    self = [super init];
    
    if (self) {
        if ([WCSession isSupported]) {
            self.session = [WCSession defaultSession];
            self.session.delegate = self;
            [self.session activateSession];
        }
    }
    return self;
}

- (void)awakeWithContext:(id)context {
    [super awakeWithContext:context];
}

- (void)willActivate {
    // This method is called when watch view controller is about to be visible to user
    [super willActivate];
}

- (void)didDeactivate {
    // This method is called when watch view controller is no longer visible
    [super didDeactivate];
}

// 適当にWatchKit AppのInterface.storyboardにボタンを追加して下さい
- (IBAction)Pressed {
    [self sendString:@"🐱"];
}

-(void)sendString:(NSString *)moji {
    NSDictionary *applicationDict = @{@"moji":moji};
    [self.session updateApplicationContext:applicationDict error:nil];
}

@end
```
普通に開発したことある人ならこれみればわかるよね？的な感じで書いてます。
Swiftもちゃんと勉強しないとなー。
WindowsでCaffeを使う：データ準備

[前回](http://qiita.com/SousukeShimoyama/items/88f538735bbcf434816b)はWindows版Caffeの環境構築について解説しました。
今回は学習を行うためのデータ準備について解説します。

#実行ファイルのビルド
始めに、データセット生成と平均画像生成の実行ファイルをビルドします。

`./examples/MainCalle.cpp`内でconvert_imageset.cppとcompute_image_mean.cppをそれぞれインクルードした場合でビルドし、吐かれたMainCaller.exeをconvert_imageset.exe、compute_image_mean.exeにそれぞれ名前変更してください。

#データセット生成
データセットの生成には画像ファイル(jpg等)とラベルが対になった学習用・テスト用データを用意します。Caffeでのデータファイルはleveldb, lmdb等の特殊な形式になっていまして、Windows版ではleveldb形式のみサポートされています。

以下、画像ファイルからleveldbファイルを生成する実行ファイルの使い方です。

`convert_imagenet.exe [root folder] [list file] [db name] [random suffle]`

-[root folder]：ルートディレクトリを指定します。ここにリストファイルやleveldbファイルのフォルダを置きます。
-[list file]：学習データが指定されたテキストファイル（ルートディレクトリからのパス）を指定します。テキストファイル内は(ルートディレクトリからのファイルパス) (クラスインデックス)　で学習用画像データとラベルを以下のように表記します。

※ テキストファイル記載例
.\dog\img0.jpg 0
.\dog\img1.jpg 0
.\cat\img0.jpg 1
.\cat\img1.jpg 1
…

データはクラスごとにフォルダ分けして管理し、学習時にリストファイルでパスを指定するとよいでしょう。
記載例では、dogフォルダに入った画像にラベル0、catフォルダに入った画像にラベル1を付与するようにしています。

-[db name]：leveldb ファイルを保存するフォルダ名（ルートディレクトリからのパス）を指定します。
-[random suffle]：list fileに記載された画像データをランダムにシャッフルして学習用データファイルに格納するオプションフラグ(0か1)を指定します。list file上でクラスごとにまとまって記載されている場合はオプションフラグをオン(1を指定)にしてシャッフルします。データ管理の都合上、クラスごとにまとめて記載し、本オプションを使用する方がスマートでしょう。
※一度のネットワークの更新で、なるべくクラスがばらけたデータ群を使用すると学習が有効に行われます。

学習用とテスト用のデータファイルを作成するには本ツールを二度走らせる必要があります。学習用、テスト用のleveldb ファイルを配置するフォルダを用意しましょう。また、ファイルリストも学習用、テスト用の2つを用意します。
既にleveldb ファイルが存在するフォルダを指定してしまうとエラーとなりますので、中身を削除するか新しいフォルダを指定してください。

#平均画像生成
Caffeでは学習画像の正規化に学習画像全体の平均画像を用いており、平均画像からの差分画像を実際の学習に用います。平均画像はなくても学習・識別は可能ですが、学習を有効に行うために使用した方がいいでしょう。

以下のように学習用データファイル(lmdb形式)から平均画像(binaryporto形式)を作成します。

`compute_image_mean.exe [db name] [mean file]`

-[db name]： 学習用のleveldb ファイルを保存しているフォルダ名を指定します。
-[mean file]：出力する平均画像のファイル名を（任意のファイル名）.binaryproto として指定します。

平均画像は学習時だけでなく、識別時にも必要になりますので学習後も保持しておきましょう。


これでデータ準備は終了です。次回は学習の仕方について解説します。
apm loginすると`EINVAL, invalid argument`で止まる

# 環境
- Windows7 Prosessional(32bit)
- Atom1.0.9
- apm1.0.4
- apm 2.13.3
- node 0.10.40
- MINGW32

# 実行
```
$ apm login
Welcome to Atom!

Before you can publish packages, you'll need an API token.

Visit your account page on Atom.io https://atom.io/account,
copy the token and paste it below when prompted.

EINVAL, invalid argument
```
token入力できない。


# 解決策
--tokenオプションを使う
```
$ apm login --token MY_ATOM_TOKEN
```
ipv4、ipv6の判定方法

メモ

```scala
scala> import java.net._
import java.net._

scala> InetAddress.getByName("127.0.0.1") match { case _:Inet6Address => 2 case _:Inet4Address => 1 case _ => 0 }
res0: Int = 1

scala> InetAddress.getByName("::1") match { case _:Inet6Address => 2 case _:Inet4Address => 1 case _ => 0 }
res1: Int = 2
```
海外からのサーバーアタックがあった時の暫定対応

# サーバーが応答しなくなった
管理しているサイト及びサーバーが大量のアクセスによって応答しなくなってしまい、やむなくインスタンスの再起動をしました。いわゆるDos攻撃かDDosです。

# 再起動後にアクセスログを確認
普段とは明らかに異なる大量のアクセス数があり、アクセス元のIPアドレスがいくつかのパターンに限定されたので、アクセス元のIPアドレスがどこの国のIPアドレスか調べました。

# どこの国のIPアドレスか確認
いくつかIPアドレスから国を割り出すサイトがありますが、今回はこちらのサイトを使用しました。

http://mgt.jp/t/country#

怪しいアクセス元をいくつか検索したところ全て
「判別結果は｢CN｣でした。」
と表示されたので、中国からのアクセスである事が確実になりました。

# 不正アクセス元の国からアクセスを遮断する
幸い中国でサービス展開はしていないので、国単位でのアクセス遮断で問題無いとの判断になり、対応する事に。以下手順です

## サーバー設定をする
**今回はNginxでのお話しです。**
サーバーにログイン後、以下手順で設定します。

### 1.各国のIPアドレスリストを取得
```
wget http://nami.jp/ipv4bycc/cidr.txt.gz
```
### 2.解凍
```
gunzip cidr.txt.gz
```

### 3.特定の国からのアクセス拒否をするconfを生成
```
sed -n 's/^CN\t\(.*\)/deny \1;/p' cidr.txt > /etc/nginx/dropip.conf
```
今回は中国からのアクセスを遮断するので**CN**となっています。
他の国を対応する例として、無いとは思いますが日本からのアクセスを遮断する場合は
sed -n 's/^**JP**\t\(.*\)/deny \1;/p' cidr.txt > /etc/nginx/dropip.conf
とします。


### 4.nginx.confに追記
http {}内に記載します。

```
http {
〜省略〜
include /etc/nginx/dropip.conf;
include /etc/nginx/conf.d/*.conf;
```

**注意点**
conf.d/*.confのincludeより上に記載してください。
conf.dにvirturlhostの設定とか書いていた場合、拒否IPのconfより先にconf.dの内容がincludeされてしまいます。

### 5.nginxのconfのリロード
```
/etc/init.d/nginx reload
```
設定が心配なら先に

```
/etc/init.d/nginx configtest
```
してください。

## 設定が適用されているか確認
nginxのエラーログを見ると以下の形式で、アクセスを遮断したipアドレスが表示されます。

```
[error] 3177#0: *1455 access forbidden by rule, client: xxx.xxx.xxx.xx
```
Swift オプショナル入門(備忘録的)

---

## Optional型とは：
　String型、Int型と同じデータの型
　nil(何もないこと)を許容する
　
宣言

```
　var num: Int?
　println(num) // => nil
　var str: String!
　println(str) // => nil
```

　両方ともにnilを返すので、宣言時にはnilが代入される。

```
var str: String? = "Hello World"
println(str)			// => Optional("Hello World")
```

非オプショナル宣言

```
var str: String
println(str)	// => Variable 'str' used before being initializedというエラーが発生
```

非オプショナル宣言、つまり普段の変数宣言では、何か値を入れないと、実行した時にエラーが発生

###非OPtionalの値とOptionalの値を足し合わせる

```
var a: Int = 10
var b: Int? = 10
a + b	// => エラーが起きる
```

理由：10(Int型)と10(Optional型)同士は計算出来ない
計算を行いたい場合は、Optinal型の値を通常に値に変換するために「アンラップ」を行う。

### アンラップとは
コードから見てみると

```
var a: Int = 10	//非オプショナル型
var b: Int! = 10	//暗黙的アンラップ型
a + b	// => 20
```

つまり、そのままでは使えないOptional型の値を、String型、Int型等として直接扱えるデータ型として変換する処理のこと。
ちなみに、変数宣言時に「！」をつけて変数を定義することを「暗黙的アンラップ型」という。

また、アンラップにはいくつかのパターンが存在する.....
1.  強制的アンラップ
2.　オプショナル・バインディング
3.　オプショナル・チェインニング

### 1. 強制的アンラップ

```
var optional: Int? = 10	//Optional型
println(optional)		// => Optional(10)

//強制的アンラップ(!をつけて)で出力
println(optional!)	// => 10
```

1つ注意点：

```
var num: Int?
num!	// => Optional型の変数numはnilなので、エラー発生
```

これは、強制的アンラップする対象のOptional型変数の中身がnilの場合、エラーが出るため、アプリが落ちてしまう！！
　そのため、中身がnilかどうか分からない場合は「オプショナル・チェインニング」か「オプショナル・バインディング」を使用
　
### 2. オプショナル・バインディング

```
var name: String?	//オプショナル型
var name: String? = "夏目漱石"

if let unwrappedName = name {
	// nameに値があれば、”夏目漱石”が代入される
	println(unwrappedName)	// => "夏目漱石" アンラップされて出力される
} else {
	// nameがnilであれば、ここの処理が実行される
	println("吾輩は猫である。名はまだないっ！！")	// => "吾輩は猫である。名はまだないっ！！"
}
```

if let構文(varでもいい)を使って、対象となる値がnilかどうかを判別して、アンラップできる。それによって、不意にアプリが落ちることを防ぐことができる。

### 3. オプショナル・チェインニング
オプショナル型の変数にプロパティを取得したり、メソッドを呼び出せる。

```
class Human() {
	let name: String = "イカ娘ちゃん"
	
	func hello() {
		println("侵略してやるでゲソ！！")
	}
}

var human: Human? = Human()

// nilでないため、プロパティが取得できる
human?.name	// => Optional("イカ娘ちゃん")

// nilでないため、メソッドを呼び出せる
human?.hello()	// => Optional("侵略してやるでゲソ！！")
```

nil出ない場合、つまり、Humanクラスのプロパティ、メソッドに値や処理が書かれていない場合は、nilを返す

```
var human: Human?

// humanはnilなので、nilが返る
human?.name	// => nil
human?.hello()	// => nil
```


コード主体で、細かい解説はできなかったですが、参考にしていただけると幸いでございます。
iOSでbodyにoverflow: hiddenが効かないとき

モーダルを出すとき、背景側の要素がスクロールしないようにしたい。
デスクトップ向けなら `body` 要素に対して `overflow: hidden;` を適用すれば済む。

しかしiOSだとこれだけではうまくいかない。
`html` 要素にも指定が必要である。

```scss
html {
  // autoで十分
  overflow: auto;
  height: 100%;
}

// モーダルを開いた時のbody
body.modal-open {
  overflow: hidden;
  height: 100%;
}
```

これでiOSでも、表示領域を固定できる。
Controller の RSpec でヘルパーメソッドを利用したい

# やりたいこと

Controller の spec ファイルの中でヘルパーメソッドを利用したい。

# 実現方法

`controller.view_context` に委譲します。

* [controller](http://www.rubydoc.info/gems/rspec-rails/RSpec/Rails/ControllerExampleGroup#controller-instance_method) はテスト対象のコントローラーのインスタンスを返します。
* [view_context](http://apidock.com/rails/ActionView/Rendering/view_context) にはビューのインスタンスを返します。

# 例

ApplicationHelper に定義した nl2br というメソッドを
sisters_controller_spec.rb でも使いたいとします。

```app/helpers/application_helper.rb
module ApplicationHelper
  # 改行を <br> タグに変換する。
  def nl2br(str)
    return '' if str.blank?
    ERB::Util.h(str).gsub(/(\r\n?)|(\n)/, '<br>').html_safe
  end
end
```

```spec/controllers/sisters_controller_spec.rb
describe SistersController, type: :controller do
  render_views

  describe '#show' do
    # controller.view_context に委譲する。
    delegate :nl2br, to: 'controller.view_context'

    let(:umaru) do
      create(
        :sister,
        name: '土間 うまる',
        note: <<-NOTE.strip_heredoc
          外では容姿端麗・品行方正・スポーツ万能・成績優秀と、
          どれを取っても完璧な「美妹 (びもうと)」として通っている。
          しかし、家に帰った途端にグータラな生活を好む「干物妹 (ひもうと)」と化す。
        NOTE
      )
    end

    it 'レスポンスが成功すること' do
      get(:show, id: umaru.id)

      expect(response).to have_http_status(:success)
    end

    it 'レスポンスボディの中身が正しいこと' do
      get(:show, id: umaru.id)

      # 呼べる！！！
      expect(response.body).to include(nl2br(umaru.note))
    end
  end  
end
```
virtualboxにて、hostonlyで立ち上げたVMにpingが通らない


macにて、`docker-machine create --driver virtualbox hoge`してるのに、
一向に成功せず、いろいろ調べた結果virtualbox上のVM(192.168.99.107)にpingが飛んでいないことがわかった。
セグメント指定でinterface指定したらどうにかなった。

```
# 接続したいインターフェイスを確認
% ifconfig vboxnet3
vboxnet3: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        ether 0a:00:27:00:00:03
        inet 192.168.99.1 netmask 0xffffff00 broadcast 192.168.99.255

# ルーティング追加
% sudo route add -net 192.168.99.0/24 -interface vboxnet3
 
# 確認コマンド
% netstat -rn
Routing tables
Internet:
Destination        Gateway            Flags        Refs      Use   Netif Expire
127                127.0.0.1          UCS             0        0     lo0
127.0.0.1          127.0.0.1          UH             14  1354634     lo0
192.168.99         link#15            UCSc            5        0 vboxnet <= 追加されてる！！！
```
[memo] Google 検索言語設定を英語にした

検索画面の右上の歯車の icon から言語設定を変えられる。英語にした。何かを検索すると英語の page がたくさん出てくるようになった。言語設定を日本語にしていたころよりも目当ての情報に早く到達できるようになった。
AVAuthorizationStatus  


デバイス機能に対しユーザのアクセス許可をしているかの状態。AVCaptureDeviceの

```objc:
+ (AVAuthorizationStatus)authorizationStatusForMediaType:(NSString *)mediaType NS_AVAILABLE_IOS(7_0);
```

で取得できる。

```objc:
typedef NS_ENUM(NSInteger, AVAuthorizationStatus) {
	AVAuthorizationStatusNotDetermined = 0,// 未決定
	AVAuthorizationStatusRestricted, // パレンタルコントロール等によってユーザの許可が機能制限されている。
	AVAuthorizationStatusDenied,// 許可されない
	AVAuthorizationStatusAuthorized // 許可されている
} NS_AVAILABLE_IOS(7_0);
```
build_url (parse_urlの逆)

PECLの[http_build_url](http://php.net/manual/ja/function.http-build-url.php)との互換性はありません。

```php:関数定義
function build_url(array $elements) {
    $e = $elements;
    return
        (isset($e['host']) ? (
            (isset($e['scheme']) ? "$e[scheme]://" : '//') .
            (isset($e['user']) ? $e['user'] . (isset($e['pass']) ? ":$e[pass]" : '') . '@' : '') .
            $e['host'] .
            (isset($e['port']) ? ":$e[port]" : '')
        ) : '') .
        (isset($e['path']) ? $e['path'] : '/') .
        (isset($e['query']) ? '?' . (is_array($e['query']) ? http_build_query($e['query'], '', '&') : $e['query']) : '') .
        (isset($e['fragment']) ? "#$e[fragment]" : '')
    ;
}
```

```php:例&#32;(コード)
<?php

$patterns = [
    ['host' => 'example.com'],
    ['scheme' => 'https', 'host' => 'example.com'],
    ['scheme' => 'http', 'host' => 'example.com', 'port' => 8080, 'path' => '/x/y/z'],
    ['scheme' => 'http', 'host' => 'example.com', 'port' => 8080, 'user' => 'anonymous', 'query' => 'a=b&c=d', 'fragment' => 'xyz'],
    ['scheme' => 'http', 'host' => 'example.com', 'user' => 'root', 'pass' => 'stupid', 'path' => '/x/y/z', 'query' => ['a' => 'b', 'c' => 'd']],
    ['path' => '/x/y/z', 'query' => 'a=b&c=d'],
];

foreach ($patterns as $pattern) {
    echo json_encode($pattern, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\n/* " . build_url($pattern) . " */\n\n";
}
```

```js:例&#32;(結果)
{
    "host": "example.com"
}
/* //example.com/ */

{
    "scheme": "https",
    "host": "example.com"
}
/* https://example.com/ */

{
    "scheme": "http",
    "host": "example.com",
    "port": 8080,
    "path": "/x/y/z"
}
/* http://example.com:8080/x/y/z */

{
    "scheme": "http",
    "host": "example.com",
    "port": 8080,
    "user": "anonymous",
    "query": "a=b&c=d",
    "fragment": "xyz"
}
/* http://anonymous@example.com:8080/?a=b&c=d#xyz */

{
    "scheme": "http",
    "host": "example.com",
    "user": "root",
    "pass": "stupid",
    "path": "/x/y/z",
    "query": {
        "a": "b",
        "c": "d"
    }
}
/* http://root:stupid@example.com/x/y/z?a=b&c=d */

{
    "path": "/x/y/z",
    "query": "a=b&c=d"
}
/* /x/y/z?a=b&c=d */
```
path指定でbundle installしたGemのメソッドがRubyMineでコード補完されない問題の解決方法


**環境**
- RubyMine7.1.4

# 問題点
Railsアプリケーションを作る時は

```
bundle install --path vndor/bundle
```

で、任意のパスにGemをインストールする事がよくあると思います（というかほとんどそうだと思います
このプロジェクトをRubyMineを開くと、`before_action`や`belongs_to`のメソッドがコード補完されない。（IDE使っているのにコード補完されないなんて！
`before_action`にいたっては、「Cannot find 'before_action'」と警告がでる。

![Kobito.LsZqkF.png](https://qiita-image-store.s3.amazonaws.com/0/30441/5a0802d5-6d7e-f8a6-0775-18b98c5c9450.png "Kobito.LsZqkF.png")

# なぜ起こるのか
RubyMineに`.bundle/config`の`BUNDLE_PATH`を見てくれないバグがあるようです
[Gems in vendor/bundle are not listed as external dependencies : RUBY-16428](https://youtrack.jetbrains.com/issue/RUBY-16428)

# 解決方法
https://gist.github.com/robd/ebd2570cc8c50bcda072 のスクリプトを実行すると、使用しているGemの一覧をRubyMineの設定ファイルに反映してくれる。実行後はRubyMineを再起動する。
※新しくGemを追加したらその都度実行する必要がある

# その他
このバグは次期バージョンで修正されいるようなので、期待して待ちましょう:smile:
[RubyMine 8 Early Access Program is Now Open | JetBrains RubyMine Blog](http://blog.jetbrains.com/ruby/2015/08/rubymine-8-early-access-program/)
unity > シーン間移動でDontDestroyOnLoad(this)したGameObjectの関連付けが消える

```txt:動作確認
Unity 5.1.2-f1 on MacOS X 10.8.5
```

- Mainシーン
  - UI > Button
  - UI > InputField
  - UI > Toggle
  - GameObject: someProcess
- Otherシーン
  - UI > Button 　

MainシーンからButtonでOtherシーンへ移動し、OtherシーンからButtonでMainシーンに戻るようにしている。

Main -> Other -> Main にシーン移動した時、someProcesゲームオブジェクトのスクリプト(someProcessScript.cs)にインスペクタで関連づけていたInput Field, Toggleが両方ともNoneになってしまう。

```someProcessScript.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class someProcessScript : MonoBehaviour {

	public InputField IF_name;
	public Toggle Toggle_test;
	private static bool created = false;

	void Awake() {
		if (!created) {
			created = true;
			DontDestroyOnLoad (this.gameObject);
		} else {
			Destroy (this.gameObject);
		}
	}

	void Start () {
	}
	
	void Update () {
	
	}
}
```

どうもMainシーンに戻った時にDestory()されているのは、新しく作られた方でなく、もとからあったほうで、そのため関連付けがNoneになっているようだ。

新しく作られた方をDestroy()する方法を模索中。
[オブジェクト指向三大要素]　カプセル化がなぜ必要か。


<br>個人用備忘録。
カプセル化の最も簡単な例。
以下のコードは、身長を保持（設定／取得）するためのクラス。
<br>

```java:Java

class tall {
    private double tall; // カプセル化されたフィールド

    public double getCentimeters() {
	    return tall / 10;
    }

    public double getMillimeters() {
	    return tall;
    }

    public double getFeets() {
	    return tall / 304.8;
    }

    public void setCentimeters(double tall) {
	    if( tall < 0 ) throw new Error();
	    this.tall = tall * 10;
    }

    public void setMillimeters(double tall) {
	    if( tall < 0 ) throw new Error();
	    this.tall = tall;
    }

    public void setFeets(double tall) {
	    if( tall < 0 ) throw new Error();
	    this.tall = tall * 304.8;
    }
}

public class mesureTall {

    public static void main(String[] args) {
        tall t=new tall();
        double tall2;
	    t.setFeets(180);
	    tall2 =t.getFeets();
	    System.out.println(tall2);
    }

}
```

<br>
ひとつの利点。
内部的には、身長はミリメートル単位で保持されているが
内部状態を全く意識することなく、フィートで設定して、
センチメートルで取り出すといったことが可能になる。

<br>
ふたつめの利点。
身長が負の値になったりすることはありえないが、
tallの double型変数がパブリックで宣言されていると、
tall = -170 といった非現実的な値も設定できてしまう。

しかし、前記のコードのsetCentimeters()メソッド等に
　　public setCentimeters( double tall ) {
　　　　if( tall < 0 ) throw new Error();
　　　　this.tall = tall * 10;
　　}
という風に適当なエラーを送出するように設定することで
不自然な値自体を設定できないようにすることが可能になる。



<br>
<br><br>


参考
http://oshiete.goo.ne.jp/qa/3019797.html