OmniAICreator/Qiita-1.07M huggingface dataset:
WP-CLI でメモリ不足のエラーが出る時の対処法

WP-CLI のパッケージコマンド関連のサブコマンド、たとえば `wp package install` とか `wp package update` では、`composer` を呼び出しているので、以下のようにメモリ不足のエラーが出ることがあります。

```
PHP Fatal error:  Allowed memory size of 268435456 bytes exhausted (tried to allocate 32 bytes) in ...
```

そんな時は、以下のようにするといいみたい。

```bash
$ php -d memory_limit=-1 /usr/local/bin/wp
```

たまたまそういう事案を目にした同じ日に WP-CLI の開発チームの方で話題になってたのでメモ。

## 追記

頻繁にこのエラーが出る場合には、`~/.bash_profile` に以下のように書いておくといいかも。

```
alias wp="php -d memory_limit=-1 /usr/local/bin/wp"
```

## 追記（2016/12/23）

@ayato さんから指摘をいただいて調べたのですが、Homebrew でインストールした場合の WP-CLI はシェルスクリプト経由で呼び出されているため、以下のようにする必要があります。

(以下はbashの場合)

```
$ WP_CLI_PHP_ARGS='-d memory_limit=-1' wp
```

ただし僕の環境では、デフォルトが `-1` でした。

> Daniel: WP_CLI_PHP_ARGS is only applicable when calling the bash starter script. If you've installed the Phar, you can php directly
> Miya: Which is the homebrew verion? Japanese user who install from homebrew asked me that php -d memory_limit=-1 /usr/local/bin/wp wasn't seem to be working for him. Is it right?
> Daniel: homebrew is Phar

リード開発者のダニエルちゃんも勘違いしてたみたい。。。笑
ぼくのかんがえたさいきょうのRailsのenum

[Fusic Advent Calendar 2016](http://qiita.com/advent-calendar/2016/fusic) 19日目の記事です。
昨日は[インターンのティム君の記事](http://qiita.com/timtam95/items/ee0c24ed03001e16258f)でした。プログラミングと出会った頃を思い出させてくれますね。

さて、予定が崩れて今日ドタバタで記事を書いてます。
残り1時間半。誕生日なのに…><

今日は、ぼくのかんがえたさいきょうのRailsのenum拡張gemについて書いてみる。
extended enumを略してexnum。さいきょうっぽい名前。英語的に合ってるかは知らない。
https://github.com/Kta-M/exnum

## enumがこうだったらさいきょうだとぼくは思う
- I18nに対応している
- それぞれのステータスに紐付いた値を設定できる

というわけで、そうなるようにしてみた。
もちろん、enumに元から備わっている機能はそのまま使えるように。

## I18n対応
たとえばUserモデル。

```user.rb
class User < ActiveRecord::Base
  exnum role: {guest: 10, general: 20, admin: 30}
end
```
このときに、

```translation_ja.yml
ja:
  activerecord:
    enum:
      user:        # モデル名
        role:      # フィールド名
          guest:   ゲスト
          general: 一般ユーザー
          admin:   管理者
```
としておけば、

```ruby
User.roles_i18n
# => {"guest" => "ゲスト", "general" => "一般ユーザー", "admin" => "管理者"}

user = User.new(role: :guest)
user.role_i18n
# => "ゲスト"
```
となる。さいきょう。

## それぞれのステータスに紐付いた値を設定できる
なんかenumを使ってると、
「このステータスのときはああして、このステータスのときはこうして…」とかいうのがよく出てきて、せっかくenum使ってるのに結局case文書かんといかんのかい、ということがしばしば。
じゃあもう一緒にパラメータを設定できるようにしちゃえ！ということで。

たとえば、ステータスに応じて表示時のラベルの色を変えたかったり、パーミッションを設定したかったりする。

```user.rb
class User < ActiveRecord::Base
  # valの値が本来のenumの値
  # それ以外が関連パラメータ
  exnum role: {
    guest:   {val: 10, label: :red },
    general: {val: 20, label: :green, permission: false },
    admin:   {val: 30, label: :blue,  permission: true},
  }
end
```

こうしておくと、

```ruby
User.role_labels
# => {"guest" => :red, "general" => :green, "admin" => :blue}
User.role_permissions
# => {"guest" => nil, "general" => false, "admin" => true}

user = User.new(role: :general)
user.role_label
# => :green
user.role_permission
# => false
```
さいこう。

## まとめ
さいきょうでさいこう。

明日は上腕二頭筋がスバラシイ今年の新卒、ジョンくんの記事です。
その二の腕でタイプされるPHPの記事に期待です。
【質問】パケットジェネレータについて教えて下さい。

パケットジェネレータについて教えて下さい。

仕事で基盤関連の部署になり、
勉強目的で以下条件を満たすパケット自動生成ツールを探しています。
①Windows環境で動作する
②CUI/CLI型(コマンドで実行)
③HTTPのリクエストを文字列感覚で自由に指定出来る
④第３層ネットワーク層までのヘッダ/データを自由に指定が出来る (例)宛先IPを指定する

以下にwikiの一覧があります。
https://ja.wikipedia.org/wiki/%E3%83%91%E3%82%B1%E3%83%83%E3%83%88%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF


■質問
上記条件を満たすツールと、そのツールのダウンロード先、インストール、使用方法を、
分かる範囲で教えて下さい。
有名どころでは「hping」があるそうですが、windowsでは使えず、
かつ、③のHTTPの箇所(アプリケーションレイヤの指定)が出来なそうです。
[Swifty]総称型

<p>ギブアップ。そもそもの構造が違うので、発表のとおりの修正は無理。</p>

<p>発表では、DataSourceに総称型を導入。</p>

<pre><code>class DataSource: NSObject, UITableViewDataSource, SourceType {
    var dataObject: DataType
    
    init<A: DataType>(dataObject: A) {
        self.dataObject = dataObject
    }
}
</code></pre>

<p>そうすると、初期化は以下のようになる。</p>

<pre><code>class HandDataSource: DataSource {
    init() {
        super.init(dataObject: Hand())
    }
}
</code></pre>

<p>ただ、何度も言い訳をして苦しいが、自分のプロジェクトでは、Model（Dataコントローラ）のクラスを用意しているので、こうはならない。</p>

ソースコード
GitHubからどうぞ。<br />
<a href="https://github.com/murakami/workbook/tree/master/ios/Hand">https://github.com/murakami/workbook/tree/master/ios/Hand</a> - GitHub<br />

関連情報
<a href="https://realm.io/jp/news/tryswift-daniel-steinberg-blending-cultures/">文化を調和させる</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
OpenCVの最適化モジュールについて

本記事はOpenCV Advent Calendar 19日目です。

OpenCVの中には沢山の機能が入っています。本日は、その中から最適化に関するモジュールの使い方について解説します。

# 最適化とは

ここでの最適化とは関数の最小化を指すものとします。例えば、

```math
f(x) = x^2 + 2x + 1
```

の最小値は、$x=-1$の時にゼロになりますね。こういう簡単な問題は良いのですが、複雑な問題は、そう簡単に解けません。そのような時にどうするかというと、数値を色々試しに入れてみて、最適解を探索するという方策が取られます。ただし、愚直に全数値を入れていると当然ながら計算は終わらないので、これを効率化する様々な方法があります。OpenCVにはその中でも有名な、滑降シンプレックス法、共役勾配法、線形計画法、本日は紹介しませんがMarquardt法など様々なアルゴリズムが実装されています。研究開発をしていて、モデルとなる数式はできたので、これを最適化したい！という時にサクッと最適化できるので、便利なのではないでしょうか。

# 滑降シンプレックス法

詳しい説明は以下にあるので省略します。
https://ja.wikipedia.org/wiki/ネルダー–ミード法

ここでは、

```math
f(x, y) = x^2 + y^2
```

という、簡単な数式を最小化してみましょう。以下にあるように、そのままですが、MinProblemSolver::Functionを継承して、関数を定義してやります。先ほどの数式における$x$がコードのx[0]に、$y$がコードのx[1]に対応します。また、変数の次元数をgetDims関数で定義します。

```cpp
class DistanceToLines :public MinProblemSolver::Function {
  public:
  double calc(const double* x)const{
    return x[0] * x[0] + x[1] * x[1];
  }
  virtual int getDims() const { return 2; }
};
```

定義した関数を以下のように最小化します。ここまで書いたところで時間がなくなったので、また追記します。

```cpp
void test_downhill()
{
  Mat P = (Mat_<double>(1, 2) << 1.0, 1.0);
  Mat step = (Mat_<double>(2, 1) << -0.5, 0.5);

  Ptr<MinProblemSolver::Function> ptr_F(new DistanceToLines());
  Ptr<DownhillSolver> solver1 = DownhillSolver::create();
  
  solver1->setFunction(ptr_F);
  solver1->setInitStep(step);
  
  double res = solver1->minimize(P);

  cout << "res " << res << endl;
}
```

# 共役勾配法
https://ja.wikipedia.org/wiki/共役勾配法

```cpp
class DistanceToLines2 :public MinProblemSolver::Function {
  public:
  double calc(const double* x)const{
    return x[0] * x[0] + x[1] * x[1];
  }
  void getGradient(const double* x, double* grad) {
    grad[0] = 2 * x[0];
    grad[1] = 2 * x[1];
  }
  virtual int getDims() const { return 2; }
};
```

```cpp
void test_conj()
{
  Mat P = (Mat_<double>(1, 2) << 1.0, 1.0);

  Ptr<MinProblemSolver::Function> ptr_F(new DistanceToLines2());
  Ptr<ConjGradSolver> solver2 = ConjGradSolver::create();
  
  solver2->setFunction(ptr_F);
  
  double res = solver2->minimize(P);

  cout << "res " << res << endl;
}
```

```cpp
void test_lp()
{
  Mat A=(cv::Mat_<double>(3,1)<<3,1,2);
  Mat B=(cv::Mat_<double>(3,4)<<1,1,3,30,2,2,5,24,4,1,2,36);
  Mat z;
  cv::solveLP(A,B,z);
  cout << z << endl;
}
```
CureAppでより良い開発環境を整えるために導入したこと

こんにちは、 @imoans です。
この記事は [CureApp Advent Calendar 2016 19日目の記事](http://qiita.com/advent-calendar/2016/cureapp) です


CureAppでは、より良い開発環境を整えるためにいろいろな工夫を行っています。
その中で、導入してみてよかったものを挙げていきます。


# 作業内容把握bot
社内で働いている人同士は、どのような作業をしているのかだいたい把握できますが、
リモートワークの方は、PRや日報で作業を把握するしかなく、
作業の進捗やどんなことに困っているのかがわかりづらいという問題が起きていました。

また、作業の進捗状況が把握しづらいので、開発スピードを測ることができず、
開発予定と進捗のずれの見積もりが難しくなっていました。

そこで、slackに毎日15時に作業内容の記入を促すbotを導入しました。
このbotは@pomtoonさん(非エンジニア)に導入していただきました！

実際に↓のようなメッセージが投稿されます。
<img width="524" alt="スクリーンショット 2016-12-19 21.29.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/88394/0132f2eb-12a5-111b-9a49-b6fe5b6e65ac.png">

このbotのおかげで、作業の進捗や作業予定が把握できるようになりました！

さらに、詰まった所をここに書けば、みんなが見ているので、誰かが手を差し伸べてくれます。

チームの作業進捗を把握できることに加えて、不要に悩む時間をなくすことができ、開発時のストレスがかなり減りました。


# 分報
もともと、CureAppでは、15分悩んでも解決できない問題があるときは
誰かに相談するというように決めていました。
ですが、作業している人に話しかけたり開発チームメンバー全員がいるチャットに投稿したりするのはノイズになってしまうかな？と遠慮することがありました。

そこで、slackに分報を導入しました。
個人に1つ分報channelが用意されていて、困ったことや、発見したこと、作業の進捗などを自由につぶやきます。

特定の人に質問がある時は、その人の分報channelに話しかけます。
これにより、チャットが流れてしまって気づかれない、なんてことを防げます。

また、この分報channelは出入自由です。
質問したい時に入って、集中したい時は出るなどができるので、
つぶやく側、見る側のどちらも負担を少なくできます。

こうして、お互いの負担を増やすことなく、問題解決がスムーズに行えるようになりました。

実際に↓のように学んだことをつぶやくと、詳細な資料を挙げていただいて、とても勉強になっています。
<img width="665" alt="スクリーンショット 2016-12-19 21.54.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/88394/276d9a6b-92b4-0872-57cf-be7ab760cad3.png">


# PRテンプレート

私は主に、スマートフォンアプリのフロントを担当していますが、
iOSのみしか動作を確認していなくて、マージ後Androidで起動できなくなる、なんてことが結構ありました。

そこで、githubのPRテンプレートを導入して、
iOS, Androidのスクリーンショットの欄を設けました。

このテンプレートによって、Androidの動作確認を忘れずに行うことができ、
不要なデバッグ作業をすることがなくなりました!


スマートフォン特有の注意点の他にも、PRテンプレートはまだ改良の余地があり、

- レビュワーに、見てもらいたい点を書く欄
- テストがかけなかったときの理由を書く欄

などを追加したいという声が上がっているので、どんどん改良していきたいと思います。


# review wantedチャンネル
CureAppでは、2人からapproveをもらったらマージするという決まりがあるので、PR作成時に、レビュー者を2人指定するようにしていました。
しかし、レビュー依頼が同じ人に集中して、レビューがスムーズに進まず、なかなかマージされないといったことが起きていました。

レビュー依頼者にも、レビュワーにも大きな負担がかかっていました。

そこで、slackにreview wantedチャンネルを作成しました！
このチャンネルでは、レビューしてほしいPRを投稿すると、余裕のある方がレビューをしてくれます。

今までレビューをお願いしていなかった、違うプロジェクトの担当の方にもレビューしてもらえるようになり、
レビュー＆マージのサイクルが早くなりました。



------

このように、CureAppではよりよい開発環境を整えるために、いろんな工夫を行ってきました。
来年も、こつこつと工夫をして、さらにチームが働きやすい環境を整えていきたいと思います！!

明日は @janus_welさんです！
[Swifty]DataSourceのサブクラス

<p>今回も辛いはず！</p>

<p>DataSourceを継承したHandDataSourceを作る。</p>

<pre><code>class HandDataSource: DataSource {
    override init() {
        super.init()
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath) as? CardCell else {
            return UITableViewCell()
        }
        let card = document.getItem(at: indexPath.row)
        cell.fillWith(card: card)
        return cell
    }
}
</code></pre>

<p>ハンドビューコントローラがこれを利用するようにする。</p>

<pre><code>class HandVC: UITableViewController {
    private var dataSource = HandDataSource()
}
</code></pre>

<p>スーパークラスを変更する。</p>

<pre><code>class DataSource: NSObject, UITableViewDataSource, SourceType {
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        fatalError("This method must be overriden")
    }
}
</code></pre>

<p>継承されなかったら、エラーにするということだ。</p>

ソースコード
GitHubからどうぞ。<br />
<a href="https://github.com/murakami/workbook/tree/master/ios/Hand">https://github.com/murakami/workbook/tree/master/ios/Hand</a> - GitHub<br />

関連情報
<a href="https://realm.io/jp/news/tryswift-daniel-steinberg-blending-cultures/">文化を調和させる</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
HoloLensの視界外にあるホロの位置を把握する Pro Radar Builder #アセットアドカレ

この記事は Unity Assets Advent Calendar 2016 12日目の記事になります。

HoloLensの視野角の狭さから、出したホロを見失うことがあるので、その問題をカバーするアセットをご紹介します。

## Pro Radar Builder 3.5.1a (Dec 13, 2016)

[![image](https://qiita-image-store.s3.amazonaws.com/0/32347/c9a9e3e6-3173-02d4-2692-09f8558493ef.png)](https://www.assetstore.unity3d.com/jp/#!/content/52837)

### 使い方

#### レーダーの配置

![image](https://qiita-image-store.s3.amazonaws.com/0/32347/c87dde37-5763-0a7b-2b7d-76b8996a6661.png)
Tools > DaiMangou > Pro Radar Builder を選択してPro Radarウインドウを開く

![image](https://qiita-image-store.s3.amazonaws.com/0/32347/336b1739-a09f-2702-f7eb-5b6ef5048787.png)
3Dを選択してCreateボタンを押してオブジェクトを配置する。


![image](https://qiita-image-store.s3.amazonaws.com/0/32347/71eb0089-70c6-8c6a-59a1-1f26f8f936cc.png)
3D RadarとRender Cameraオブジェクトがシーンに配置される。 Render Cameraはいらないので削除しておく。


#### レーダーで追跡したいオブジェクトを指定する

![image](https://qiita-image-store.s3.amazonaws.com/0/32347/21c8f9c4-eb5a-3228-6943-b37bd5fbf8d7.png)
Radarで追跡したいオブジェクトをシーンに配置。Tagを新たに作成して設定しておく。

![image](https://qiita-image-store.s3.amazonaws.com/0/32347/d4f96880-56de-6faa-7226-6001388c8df9.png)
Radarで追跡するオブジェクトのTagを指定する。
Number Of Other Blip Typesで追跡するTagの種類数を指定する。今回はTrackタグのみを対象にするので1を入力してBlipの表示などの設定の定義を行う。
Blips([ブリップ 《レーダーのスクリーンに現われる映像》](http://ejje.weblio.jp/content/blip))タブの下の選択肢からTagを指定。
位置を示すBlipの表示でSpriteを選択し、実際に表示するSpriteとMaterialを指定する。
右上の電源アイコンをクリックしてActiveにする。
またカッコいいので上下の高さを示すラインを表示するTacking Lineについてもマテリアルを指定して右上の電源アイコンをクリックして有効にしておく。

#### レーダーの表示サイズと位置を調整する

Holographic Remoting Playerを使い、ちょうどよさそうな位置を探していきます。
![image](https://qiita-image-store.s3.amazonaws.com/0/32347/2206dfa3-ca27-4a47-4170-e1d597788c14.png)
Pro RadarウインドウでDesignタブを開いて、Scale > Use Local ScaleをONにして、インスペクターから直接指定できるようにします。

![image](https://qiita-image-store.s3.amazonaws.com/0/32347/cf9609cd-58b3-a16f-3064-66b33d53a6be.png)
DesignタブのTracking BoundsとScene Scaleを弄ってよさそうな値を探します。
今回はとりあえず上記の図のような感じに

#### レーダー盤のデザインを変更する
レーダー盤のカスタマイズは、ゲームオブジェクトに指定されているSpriteを直接変更します。
![image](https://qiita-image-store.s3.amazonaws.com/0/32347/aec25c14-ba8d-248b-bb9a-4fc0508341ef.png)

シーンビューのレーダー盤を直接クリックして、Default3DRadarSpriteオブジェクトを選択。
Sprite RendererのSpriteやColorで好きなデザインにカスタマイズしよう。

#### レーダーを常に視界に移動させる

このままではレーダー盤がWorld座標、最初に配置した場所に固定されて、ホロを見失わないよう追跡する以前に、レーダー盤を見失いかねません。
レーダー盤については常に視界の内に移動するようにしましょう。

単純にMain Cameraの子に3D Radarオブジェクトを配置しても良いですが、常にピッタリ張り付くように移動するよりはちょっと遅れてスムーズに追従したほうがカッコいいので今回はHoloToolkit-Unityに含まれるTagalongを使います。

使い方は3D RadarにTagalong.csをアタッチするだけ。

#### 完成
![image](https://qiita-image-store.s3.amazonaws.com/0/32347/aed295a7-1676-a3a5-2961-37a5c73e1acb.png)


## おまけ
ホロを見失う問題の解決については、今回のアセットのほかに、以前紹介したオフスクリーンインジケーターのアセットを使うアプローチもオススメ。
これとどちらを採用するか？または組み合わせて使うか？つくるアプリのデザインに合わせて実装しましょう。

> HoloLensの視界外にあるホロの方向を表示する方法 Off Screen Indicator  develog.holo
http://2vr.jp/2016/12/02/off-screen-indicator-1-1/
Nginxでベーシック認証



# このページでわかること
Nginxを使ったベーシック認証の設定方法

# 手順

## htpasswdの導入


```bash:htpasswdのインストール
sudo apt-get install -y apache2-utils
```


htpasswdで特定のユーザの認証設定を導入する。
(ここではsampleユーザに認証設定を導入している)

## ベーシック認証ファイルの作成

```bash:ベーシック認証の設定
htpasswd -c /etc/nginx/conf.d/.htpasswd sample
New password: 
Re-type new password: 
Adding password for user sample
```

auth_basicで認証の名前(任意)
とauth_basic_user_fileにhtpasswdで作成した
パスワードファイルを指定する。

## nginxの設定

nginxの設定ファイルに認証設定を記述する。

```text:nginxの設定ファイル(default.conf)       
server {
    listen       80;
    server_name  localhost;

    auth_basic "Basic authentication";
    auth_basic_user_file /etc/nginx/conf.d/.htpasswd;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
```

ここではserver直下に認証設定を記述しているので80番ポートでlistenしているため、
すべてのlocationに対してベーシック認証が必要となる。
location配下に認証設定を記述することで、
特定のlocationにのみベーシック認証を設定することもできる。

## 設定の適用

```bash:nginxの設定再読み込み
service nginx reload
```

# 結果

![Kobito.SbcLTk.png](https://qiita-image-store.s3.amazonaws.com/0/40692/1b5ef84b-7238-6691-b8e7-bb6265cbc7c4.png "Kobito.SbcLTk.png")


正しいユーザ名とパスワードを入力すると画面が表示される。
![Kobito.mhbSsC.png](https://qiita-image-store.s3.amazonaws.com/0/40692/0eb6afa0-d03a-ffc0-5d80-7da23a919721.png "Kobito.mhbSsC.png")
conflictしたときにGitHub Desktopをつかって解決！

こちらは[東京理科大学 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/tokyo_university_of_science)の19日目の記事です。

今日はGitHub Desktopをつかった、比較的簡単(だと思われる)conflictの解消の仕方をかいていきます。
ターミナルとGitHub Desktopを混ぜて使っているのでこの通りにやると画面の切り替えが面倒かもしれません。
ターミナルに慣れたいけどgitはまだこわい初心者の人にはおすすめかな？
ちなみに、開発中にリモートのmasterがどんどん更新されていったときにその変更分を自分が作業しているbranchに取り込みたいと思った時は、手順の2と3を行えば取り込めます。

#GitHub Desktopとは
簡単にgitの基本操作を行えるツールです。
コードを変更した時に差分が簡単に見られたり、コードは元にもどさないまま1個前のcommitを簡単に取り消せたりするので便利です。
基本的な使い方は[GitHub Desktopの使い方 - Qiita](http://qiita.com/yukiyan/items/2ea3dc5813fdba5d9cd2)が参考になります。

# conflictの解消方法
## 1 gitHubでconflictしてるよ！と言われる
pushしてpull requestをだすとconflictしてるよといわれます。
![conflict](https://qiita-image-store.s3.amazonaws.com/0/141150/15f98a9e-c927-ecdf-d0a6-9e003bc332ff.png)


## 2 localのmasterを更新
自分のbranchでcommitしていない変更があればしておきます。
そしてmaster branchに移動をします。
以下の$マークはターミナルでコマンドを打ったことを明示するためにつけているだけなので実際には打ちません。

```
$ git checkout master
```

そしてリモートから最新のmasterの情報を自分のmaster branchにもってきます。

```
$ git pull origin master
```
これでlocalのmaster branchが最新の状態になりました。

## 3 master branchの変更分をとりこもうとする
conflictしているbranchに移動をします。
そしてGitHub Desktopをみると左上のUpdate from masterボタンが押せるようになっているので押すと下のような画面になります。
conflictしていなければ、ボタンを押すことでmasterの変更分が取り込まれるcommitが問題なく生成されます。
![GitHub Desktop1](https://qiita-image-store.s3.amazonaws.com/0/141150/c112ddcf-f56f-b663-797a-59113a7e9888.png)

## 4 conflict内容を確認し、変更
先ほどの画面が出たあとEditorを開くとconflictした部分が以下のように書き変わっています。

```
.container {
<<<<<<< HEAD
  width: 30%;
||||||| merged common ancestors
  width: 60%;
=======
  width: 90%;
>>>>>>> master
  margin: 0 auto;
}
```

これはどういうことかというと、

```
.container {

/// conflictしたbranchの変更分 ///
<<<<<<< HEAD
  width: 30%;

/// おおもとのコード ///
||||||| merged common ancestors
  width: 60%;

/// リモートの変更分 ///
=======
  width: 90%;
>>>>>>> master

  margin: 0 auto;
}
```

ということです。

これを見比べて、残しておくコードを決め、変更してcommitします。
今回は以下のようにコードを残しておくことにしました。

```
.container {
  width: 30%;
  margin: 0 auto;
}
```

## 5 commitする
最後にGitHub Desktopに戻ってcommitをします。

![GitHub Desktop2](https://qiita-image-store.s3.amazonaws.com/0/141150/c52a0e7f-b7c1-551b-a60e-060fe73584cf.png)
すると、masterの変更分が取り込まれてconflictが解消できます！

# まとめ
これはconflict解消法の1例です。
慣れてきたらさらに早く解消できる方法を探してみてください。

[東京理科大学 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/tokyo_university_of_science)の19日目の記事でした。
Perl1年生、進級する

これは [Perl入学式 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/perl-entrance) 19日目の記事です。

時刻はもうすぐ２３：００を迎えようとしています。記事の更新期限が迫ってまいりました。
こんばんは。先程までちょうどPerlを書いていた[@umaaaaa_chan](https://twitter.com/umaaaaa_chan)です。
昨日は[@htk291](https://twitter.com/htk291)さんの[Perl入学式をとりまく学習環境](http://htk291.github.io/blog/2016/12/18/perl-entrance-advent-calendar-2016/)でした。
Perl入学式を卒業して、サポーターをやらせていただいている身として、共感できる部分がすごく多かったです。

## Perl１年生
2105年のPerl入学式に参加させていただきました。昨年は、前期と後期がなかったので、まだ全講義が終わってなかったかもしれませんね。

現在は、サポーターとしてPerl入学式に携わらせて頂いています。前期の第２回では講師をやらせていただきました。
業務ではPerlをメインに書き始めたりと、Perlとは仲良くやっているつもりです。
そんなこんなで、Perlを触って1年経過したので、無事(?)進級できました:v: 

## Perl入学式の次のステップ
懇親会などで、よく言われるのが、

「Perl入学式の次のステップはないの？」

というご意見をいただきます。このようなコメントは意外と多くて、昨年私も同じことを思っていました。***.pmなどのコミュニティはなんだかレベルが高そうと思っていました。参加してみると実際、？？？な話も多かったです。いや、今でもわからないことだらけです！
そういう意味でも色々勉強になりますが、やっぱり敷居は高いイメージはあります。

そこで、Perl入学式の次のステップとしておすすめしたいのは、**サポーターになることです！**

サポーターになる方法は簡単です。
「サポーターやります」
こう言いましょう。

## サポーターの魅力
Perl入学式の内容は、プログラミングの基礎なので、あまり難しくないです。Perlのプロフェッショナル達が生徒としてやってくるわけではないので、幾分か気が楽です。
講師をやらなくても、サポーターとしてやるだけでも良いと思います。もし、受講生の質問に的確に答えられなくても、そばには強いエンジニアがいるので安心ですね！！講師をするのも、同じ理由から、非常に安心して講師を経験することが出来ます。

Perlに触れてすぐに、サポーター側にまわれるというのはなかなか貴重な機会だと思っています。今のPerl入学式の体制だと、半年くらいで、サポーター側にまわれると思うと、かなりお得だと思います。他の勉強会ではなかなか考えられませんね……

## まとめ
Perl入学式がきっかけで、いろいろなエンジニアの方ともお知り合いになれましたし、とても感謝しています。Perlに限らず、エンジニアとして経験が豊富な方が多くいらっしゃるので、多方面で勉強になります。
ぜひ、いろいろな形でPerl入学式を活かしていけたらと思います。

明日は、[karkador73]さんのPerl入学式に参加して、いろいろ刺激を受けた件です！
[Swifty]計算済みプロパティの追加

<p>かなり無理をしている状態になってきたが、それだけ、試行錯誤しないといけないので、得るものはある。</p>

<p>今回は、計算済みプロパティの追加だ。今回も、無理がありそう！</p>

<p>やはり、これは無理。</p>

<pre><code>protocol SourceType: UITableViewDataSource {
    //var dataObject: DataType {get set}
    //var conditionForAdding: Bool {get}
}
</code></pre>

<p>Model（Dataコントローラ）に計算済みプロパティを追加することに変更。</p>

<pre><code>class Document: NSObject {
    private var dataObject: DataType = Hand()
    
    var conditionForAdding: Bool {
        return dataObject.numberOfItems < 5
    }
}
</code></pre>

<p>すると、こうなる。</p>

<pre><code>class DataSource: NSObject, UITableViewDataSource, SourceType {
    private var document = Document.sharedInstance
    
    func addItemTo(tableView: UITableView) {
        if document.conditionForAdding {
            document.addNewItem(at: 0)
            insertTopRowIn(tableView: tableView)
        }
    }
}
</code></pre>

<p>条件判定はプロパティになっている。</p>

ソースコード
GitHubからどうぞ。<br />
<a href="https://github.com/murakami/workbook/tree/master/ios/Hand">https://github.com/murakami/workbook/tree/master/ios/Hand</a> - GitHub<br />

関連情報
<a href="https://realm.io/jp/news/tryswift-daniel-steinberg-blending-cultures/">文化を調和させる</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
働きやすい環境のために国に協力してもらおう(厚生労働省: テレワーク助成金)

また[募集](http://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/roudoukijun/jikan/syokubaisikitelework.html)が始まったようです。 平成29年12月1日（金）が締め切りです。

以下本題。

---

テレワーク(リモートワーク)をする場合は環境をきちんと整備しないとオフィスで働いてる人とテレワークをしている人の間にコミュニケーション格差が発生してしまい、疎外感などが産まれなんか仕事が嫌になったりしてしまいます。

環境を整備するにしてもお金は必要だし、色々試してみないとわからないし、それには結局お金が必要だし、うちにそんなにお金は無いし...みたいな悩みを持つ会社は多いと思います(うちもその１つでした)。

そういった悩みを少しだけ解決するために厚生労働省がテレワーク(リモートワーク)を支援するための助成を行っています(詳細は以下のリンク参照)。


[職場意識改善助成金（テレワークコース）](http://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/roudoukijun/jikan/syokubaisikitelework.html)

この助成金は以下のようなものに適用可能です(一部抜粋)。

- テレワーク用通信機器の導入・運用
- 保守サポート料、通信費
- クラウドサービス使用料

具体的にはディスプレイやウェブカメラ、ヘッドセットの購入、有料のチャットツールなど使用料に対して適用可能です。

実際に使用した金額の3/4が支給されます(上限150万円)。

これを活用することで、前から興味のある機材や Web サービスなどをより少ない予算で試すことができます。

### 実際に申請してみて

- 書類作るのは大変でした
- 窓口のテレワーク相談センターはとても丁寧に対応してくれます
  - 申請が通るように色々アドバイスしてくれます
- 丁度申請が承認されました
- これから評価期間に入るので後で追記します

### 評価期間

評価期間にはざっくり以下の様なことをします。 詳細はテレワーク申請マニュアルの pdf や申請承認後に送られてくる資料に書いてあります。 よくあるミスなどが結構細かく書いてあって実施する際に非常に助かりました。

- 社内にテレワーク助成金の評価期間のことについて周知する
- 始業・終業時にメールを出す
- 労使間の話し合いの機会を設ける

### 支給申請

評価期間が終わったら、テレワークの事業計画どおりに行ったので助成金をくださいという申請書を送ります。

書き方は申請のマニュアルに書いてあるのでただひたすら作業するだけです。 

一旦 pdf にして担当の方に間違いありませんか？とチェックしてもらうことも出来るので結構安心して作成できました。

### 振り込まれました

支給申請が承認されるとお金が振り込まれます。 感無量...

### まとめ

テレワークの導入のために国の助成金を活用する方法を紹介しました。

弊社は従業員の人数が少ないので申請できる上限金額が低いため助成金の金額そのものは少ないものでした。

しかしながら、会社全体として「テレワークを整備するぞ！」という気分になり、設備だけではなく会議の仕方や日々の作業の仕方もテレワークの人がいても問題ないように自分たちで考えるようになったので凄く良い効果があったと思います。

今年(2017年)の申請も受付開始しているようなので良かったらやってみてください。
rails install〜serverを起動するまで

#ruby〜rails install
mac
http://qiita.com/keneo/items/1772adc2ebbde229fb71

ubuntu
https://www.oiax.jp/rails/zakkan/rails_4_2_installation_on_ubunt.html

#server起動
`rails new 名前`
`rails server`
で起動できるが、
`rails s -b 0.0.0.0`
でサーバ起動したらlocalhostだけでなく、外部pcからブラウザでみれるので
外部からsshで開発する場合はこっちで

インストールからサーバ起動までです
jQueryで要素が画面内に存在しているかどうか調べる

```js
scrollTop = $(window).scrollTop();
scrollBottom = scrollTop + $(window).height();
if ($target.offset().top > scrollTop && $target.offset().top < scrollBottom) {
  // 存在するとき
}
else {
  // 存在しないとき
}
```

`position: fixed` な要素があれば、その高さを考慮するほうがいいかも。また、上のコードは「要素の上端が画面内に存在するとき」になっているので、対象が高さのある要素だったりすると適宜修正が必要かも。
Jenkinsのメール通知にSendGridを利用する

個人的に好きなSendGridの利用方法として**開発ツールでの利用**があります。SendGridではSMTP接続を簡単に行うことができます。SMTPの接続情報は[こちら](https://support.sendgrid.kke.co.jp/hc/ja/articles/204187885-SMTP%E3%81%AE%E6%8E%A5%E7%B6%9A%E6%83%85%E5%A0%B1%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84-)を参照してください。

今回はCIツールであるJenkinsで使う方法を書いてみます。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/47737/e76de91e-98b3-6483-48fe-fd6aaa6f4133.png)

Jenkinsはwarファイルをダウンロードして

```bash:Jenkins起動
java -jar jenkins.war
```

だけで使えるのでホント手軽ですね。

管理者でログインして、「Jenkinsの管理」から「システムの設定」を選択します。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/47737/b86e5d08-3371-9dca-559e-219b6d17de6e.png)

「E-mail通知」のメニューで「高度な設定」を開きます。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/47737/0b3835bc-a2b6-ca39-119e-ab0532a45740.png)

最低限、SMTPサーバー、ユーザ名、パスワード、SMTPポートを入力します。ポートは25も使えますが、SendGridが推奨している587を使います。Jenkinsでは、そのままテストを送信できるので、テストメールを送る宛先を入れて「設定を確認」ボタンでメール送信します。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/47737/218374b0-e34c-b3a6-f0e1-e16c9af6be09.png)

メールを確認すると届いてます。ただ、Fromが「まだアドレスが設定されていません。」となっています。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/47737/c4c314de-f47a-0b12-7bd5-0a34c0f09208.png)

送信元Fromを変更するには、さきほどと同じく「システムの設定」から「Jenkinsの位置」にある「システム管理者のメールアドレス」を変更します。デフォルトは次の通り。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/47737/98636382-5617-d46a-2ab8-2c54105ef1b9.png)

「Jenkinsからのメール通知 <jenkins@kikutaro.xyz>」のように設定してみました。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/47737/7e2a28a8-b4c7-9f44-d80e-c428ad07d626.png)

再度テスト送信すると、Fromがちゃんと変わってます。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/47737/c5e4ea70-8fbb-12bd-0c49-f6784d37708b.png)

Fromのメールアドレスもちゃんと設定されています。
![9.png](https://qiita-image-store.s3.amazonaws.com/0/47737/598ea8f9-dca6-2b3e-b144-c8e647e9169a.png)

これでビルド状況の通知メールなど、SMTPサーバを準備せずとも簡単にメール送信ができます。
GoogleSpreadsheetsでArrayFormulaを使って累計を計算する

# 概要
単に累計出すだけなら
=sum($a1:a1)
をコピペでドーーーーン！ってすれば終わり。

でもコピペは嫌なんで[ArrayFormula](https://support.google.com/docs/answer/3093275?hl=ja)使ってこんな感じにしたくない？

=ArrayFormula(sum(offset(A1,0,0,1,column(A1:J1))))

ところがArrayFormulaは[sum関数](https://support.google.com/docs/answer/3093669?hl=ja)や[offset関数](https://support.google.com/docs/answer/3093379?hl=ja)と相性が悪い。
しょうがないので行列の積を使ってなんとかしてみた的な。


## 結果だけ欲しい人向け
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/14114/8e785ab5-94f4-96c1-b999-38166884454e.jpeg)

=mmult(A1:J1,ArrayFormula(1*((transpose(column(A1:J1)))<=column(A1:J1))))

A1:J1に計算したい値が入っているとして、A2に上記の式を書くだけでB2:J2が自動計算される。

## もう少し解説が欲しい人向け
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/14114/931a3aa3-64fd-066c-f5a8-ad8ea55e0ce1.jpeg)

1行目の数列に3～12行目の10x10の配列を[MMULT関数](https://support.google.com/docs/answer/3094292?hl=ja)に放り込める形の配列をArrayFormulaででっち上げればいい。
行列の計算は解説できるほど得意ではないので、Google先生経由で各自理解をお願いします。
まぁこの行列の積は、見た目でどういう計算しているか分かり易いとは思いますが。

３行目～１２行目の配列の作り方は

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/14114/d2b3101d-3bbf-f6a4-4c36-07db729886b2.jpeg)

こんな感じです。（はしょりすぎ）
ArrayFormula分かってる人向けって事で。

## おわり
集計表の中に埋め込んである関数式ぶっ壊す人は４んだ方がいいと思うの。
Elasticsearch 5.0 で追加された Rollover Index / Shrink Index 触ってみる

こんにちは bsoo です。

Elasticsearch 5系から追加された Rollover Index / Shrink Index APIの紹介です。
前々から追加されたことは知っていましたが、使ったことはなく、Elastic{on} Tokyo 2016の中でも紹介されていたのですが、少し気になったので調べてみました。


+ [Rollover Index](https://www.elastic.co/guide/en/elasticsearch/reference/5.1/indices-rollover-index.html)
+ [Shrink Index](https://www.elastic.co/guide/en/elasticsearch/reference/5.1/indices-shrink-index.html#indices-shrink-index)

# ◼Rollover Index
RolloverIndexとは

> ロールオーバーインデックスAPIは、既存のインデックスが大きすぎる場合や古すぎる場合に、エイリアスを新しいインデックスにロールオーバーします。: [公式ドキュメント](https://www.elastic.co/guide/en/elasticsearch/reference/5.1/indices-rollover-index.html)より引用

### このAPIでできること
簡単にいえば、新しいインデックスを作成してそちらにエイリアスを移してくれる APIです。 ※ reindexとは違い、mappingやデータは移行されません。

ログを取っているIndexを切り替える際に便利ですね。

### 使い方
Rollover Indexを使用するためには以下の条件を満たしておく必要があります。

- 対象のインデックスにエイリアスがついていること
- エイリアスに対してインデックスが一つであること

簡単な例を書きます。

```bash:
# index名: log-001
# alias名: log

# request
POST /log/_rollover

# response
{
  "old_index": "log-001",
  "new_index": "log-002",
  "rolled_over": true,
  "dry_run": false,
  "acknowledged": true,
  "shards_acknowledged": true,
  "conditions": {}
}
```
インデックス名の末尾を `-001` のように `-` + `数値` としておけば自動で数値をインクリメントしたインデックスを作成してくれます。

自分で名前を指定する場合は URLの後ろに新しいインデックス名を指定します。

```bash:
# request
POST /log/_rollover/log-000001

# response
{
  "old_index": "log-001",
  "new_index": "log-000001",
  "rolled_over": true,
  "dry_run": false,
  "acknowledged": true,
  "shards_acknowledged": true,
  "conditions": {}
}

```

また、新しいインデックスを作成するかどうかの条件を設定することができます。

```bash:
# indexの作成から一日以上経過している
# ドキュメントの数が10以上になっている
# 上記の条件を満たす場合に新しいインデックスを作成

# request
POST /log/_rollover
{
  "conditions":{
    "max_age": "1d",
    "max_doc": 10,
  }
}
```

他にもmappingや設定も指定してインデックスを作成もできるようです。

やっていることは単純ですが、ログを運用している人にとっては嬉しい機能ですね。

`dry_run`オプションが用意されているので、本番で使用するときには事前に確認しておきましょう


# ◼Shrink Index
ShrinkIndexとは
> 既存のインデックスをより少ないプライマリシャードで新しいインデックスに縮小できます。
[公式ドキュメント](https://www.elastic.co/guide/en/elasticsearch/reference/5.1/indices-shrink-index.html#indices-shrink-index)より引用

### このAPIでできること
・ シャード数を縮小したインデックスを作成できる

縮小まで一発でやってくれるreindex っていう認識でいいのかな？ :thinking: 　

### 使い方

まずテスト用のインデックスを作成します。
Shrink Indexで縮小する際、新しく作るインデックスのシャード数は元のインデックスのシャード数の因数である必要があります。

なので、今回は128で作ってみます。

```bash:
PUT /test_shrink_01
{
  "settings": {
    "number_of_replicas": 1,
    "number_of_shards": 128
  }
}
```

また、元となるインデックスには以下の設定を反映させます。

```bash:
PUT /test_shrink_01/_settings
{
  "settings": {
    "index.routing.allocation.require._name": "node_name", 
    "index.blocks.write": true 
  }
}
```

これで準備完了です。
以下のリクエストでShrinkIndexを実行します。

```bash:
# request
POST test_shrink_01/_shrink/test_shrink_02
{
  "settings": {
    "index.number_of_replicas": 1,
    "index.number_of_shards": 8, 
  }
}

# response
{
  "acknowledged": true,
  "shards_acknowledged": true
}
```

さらにインデックスの状態を確認します。

```bash:
GET /_cat/indices?v

index           pri  docs.count
test_shrink_01    8          55
test_shrink_01  128          55

```

こちらも簡単にできました。

まだ詳細な挙動や設定項目が色々あるので、活用方法は多そうです。
ReindexAPIとの使い分けはどうするべきなのか...

今度ゆっくり調べたい。
MISCONF Redis is configured to save RDB snapshots

```
MISCONF Redis is configured to save RDB snapshots
```

Redisを利用している際に、上記のエラーが発生した場合、以下の可能性がある。

1. Diskが不足している
2. `rdb` ファイルを設置するディレクトリの権限がない

後者の場合は、
Redisのコンフィグで定義している`dir`の値が`rdb`ファイルの書き出し場所になるため、以下のいずれかを行うと良い。

* `dir`ディレクトリに書き込めるように権限調整を行う
* `dir`の値を変更する
    * Redis起動時に設定ファイルにて指定できる
    * デフォルトは`dir /var/lib/redis`

# 参考
[MISCONF Redis is configured to save RDB snapshots | stack overflow](http://stackoverflow.com/questions/19581059/misconf-redis-is-configured-to-save-rdb-snapshots)
windows 10 64bitのQt 5.7 上でOpenCV 3.1を動かしてみた件

# はじめに
仕事でちょこまかとOpenCVを使っています。しかし、他の人に活用してもらいたいときはGUIにしたいのですがOpenCV純正のGUIは貧弱でこまっていました。なので、今回はQt上で動かせるようにしてGUI作成の自由度向上を図りたいと思います。

## 環境
- OS: windows 10 64 bit
- Qt: 5.7
- OpenCV: 3.1.0 (※)

※今回、OpenCVは**chocolatey**というパッケージマネージャを用いて簡単にインストール出来ました！
chocolatey導入法: https://chocolatey.org/install
chocolatey内OpenCV紹介サイト: https://chocolatey.org/packages/OpenCV

注) OpenCVのdllはpathに登録しておくこと!

## QtにOpenCVを取り込むための手順
### Step1 .proファイルを下記を追記に修正
```shell-session:QtOpenCV310
win32:DEPENDPATH  += "C:\tools\opencv\build\include"
win32:INCLUDEPATH += "C:\tools\opencv\build\include"
win32:LIBS +=      -L"C:\tools\opencv\build\x64\vc14\lib"
win32:LIBS += -lopencv_world310d
```
注) OpenCV3.1以降からライブラリの大半がopencv_world310[|d].libに統合されています

### Step2 qmakeをビルドを実行
こうすればinclude文の挿入時に、opencvやopencv2フォルダが補完対象になります。

### Step3 include宣言部に下記を追加
```cpp:QtOpenCV310\mainwindow.cpp
#include "opencv2/world.hpp"
```
注) headerファイルはworldで全て統合されているわけではないので、ビルド時に不足している場合は適宜追加してください。

### Step4 ソースコードにOpenCVの記述をお好みで行う!
例としてカメラ映像を出力するコードを書いてみました。

## おまけ) cv::Mat -> QImageの変換
cv::MatとQImageの大きな違いは、RGB値の配置が **BGR(cv::Mat)** と **RGB(QImage)** な点。
cv::cvtColorでRGB値の配置変換し、QImageのコンストラクタを下記コード例の様に対応を合わせれば、簡単に変換可能。

```cpp:QtOpenCV310\mainwindow.cpp
cv::Mat src, dst;
// get a cv::Mat data as a camera frame
cam >> src;

// cv::Mat -> QImage
cv::cvtColor(src, dst, CV_RGB2BGR);
QImage cam_frame_qimg((uchar *)dst.data, dst.cols, dst.rows,(int)dst.step, QImage::Format_RGB888);
// set painter
QPainter painter(this);
// refresh image
QPoint draw_point(25,25);
// draw a QImage data with QPainter
painter.drawImage(draw_point,cam_frame_qimg);
```

### まとめ
本当に簡単ですがQt上からOpenCVが叩ける方法を残してみました。皆さんのお役に立てるかわかりませんがお役に立てれば幸いです。
明日12/25は@soramimi_jpさんの "Qtを使った自作アプリの宣伝と開発者募集の告知をします" です。お楽しみに。

### 成果物
今回作ったコード: https://github.com/AkiEga/QtOpenCV310

### 参考
Qt 5.7 | QImage http://doc-snapshots.qt.io/qt5-5.7/qimage.html
Qt 5.7 | QPainter http://doc-snapshots.qt.io/qt5-5.7/qpainter.html
名前空間


デモ：http://codepen.io/mo4_9/pen/rWPYyR

```javacript:namespace.js
function namespace(ns) {
  
  const names = ns.split('.');
  let parent = window;
  
  for(let i = 0, len = names.length; i < len; i++) {
    parent[names[i]] = parent[names[i]] || {};
    parent = parent[names[i]];
  }
  return parent;
  
}
```

多重の名前空間もつくれる
ex) CompanyX.ProductY.App

```javacript
const ns = namespace("App");

ns.Modal = class{
  constructor(){
    console.log("namespace modal");
  }
};

const modal = new ns.Modal();
console.log(modal instanceof App.Modal); // true
```
FlatBuffersをMacで使う(flatcインストール編)

ここではflatcの導入方法のみ扱います

# FlatBuffersとは

[FlatBuffers](http://google.github.io/flatbuffers/)とはGoogleが開発したシリアライザであり、ハイパフォーマンスが要求されるようなゲームに適しているとされています。

使い方については[こちら](http://qiita.com/y_miyoshi/items/873ae853509f8cd59f0b)を参考にしてください。

# 1.homebrewでインストール

```
brew install flatbuffers
```

# 2.makeでコンパイルする

```shell-session
git clone https://github.com/google/flatbuffers.git
cd flatbuffers
cmake -G "Unix Makefiles"
make # or gmake
```
makeが終わるとflatcが出来上がるのでPATHが通っているディレクトリにコピーします。

# 参考

http://stackoverflow.com/questions/24275803/how-to-build-flatbuffers-on-osx
mitmproxyを使ってどんなサイトでもクローリング・スクレイピングする

この記事は [クローラー／Webスクレイピング Advent Calendar 2016](http://qiita.com/advent-calendar/2016/crawler) 19日目の記事です。

最初に言っておくと、[mitmproxy](https://mitmproxy.org/) は**スクレイピングツールでもクローリングツールでもありません**が、これをスクレイピングに活用するのが今回の記事の趣旨になります。

##mtimproxy という最終兵器

mtimproxy は名前の通り**プロキシー**で、man-in-the-middle proxy の略だと思われます。Python 製の OSS です。

図で書くと、次のようなものです。いわば、自分で自分に中間者攻撃をするようなプロキシーのイメージでしょうか。

![image](https://qiita-image-store.s3.amazonaws.com/0/26289/d4dc096f-fe96-ab61-2769-b1837b44b94e.png)

自分で書いてみて、あまりに意味のない図だったので少し驚いていますが、mitmproxy を使うと、

- 外部サイトに送るリクエストの内容をフックして、加工できる
- 外部サイトから届くレスポンスの内容をフックして、加工できる

ことができるので、**閲覧したサイト全てを、Pythonのスクリプトで自動的に加工できる**ということになります。

Pythonでレスポンスを加工できるということは、レスポンスを保存できるということなので、**一種のクローリングツールとして使える**、ということです。

もちろん、mitmproxyはただのプロキシツールなので、自動的に何らかの戦略でクローリングしに行くことはできません。**人間様が spider(bot) として稼働**し、**閲覧した結果を保存・スクレイピングする**のが今回の戦略です。

## 具体的なユースケース

mitmproxy を使ったスクレイピングが最強な理由を説明しましょう。

- 人間様がどのページをダウンロードするかを決定するが、人間様は bot よりも賢い(2016年現在)
- 人間様は bot に比べて自然に振る舞う(2016年現在)
- プロキシが使えるなら、どんな態様のサイトでも保存できる

たとえば、次のようなユースケースがあるでしょうか。

- Javascript や Flash 製のサイトの API をクローリングしたい
- 自分が一日に見たサイトをまるっと分析したい

逆に、次のようなものは向かないと思います。

- 定時的にクローリングしたい
- 全世界中のサイトを自分ひとりでクローリングしたい
- SPA など、Javascript によるレンダリングが重要なサイトで、その結果をクローリングしたい

## mitmproxy のインストール

インストールは簡単です。インストールにはまったら、公式の [Docker 版](https://hub.docker.com/r/mitmproxy/mitmproxy/)とか使いましょう。

```
pip install mitmproxy
```

mitmproxy には2つのツールがあります。mitmproxyとmitmdumpです。前者は、CUI でインタラクティブなツールです。後者は、インタラクションをなくしたもので、スクレイピング用途ならこちらが良いでしょう。

起動方法は単純で、`mitmdump`　とシェルに打ち込んであげるだけです。デフォルトでは、`8080` 番のポートで起動するので、`127.0.0.1:8080` をプロキシとして指定してあげれば良いです(Chromeだと、[Proxy SwitchySharp](https://chrome.google.com/webstore/detail/proxy-switchysharp/dpplabbmogkhghncfbfdeeokoefdjegm?hl=ja) という拡張が使いやすいです)。

プロキシの設定がうまくいったら、適当なサイトを開いて下さい。うまくいくと、mtimdump が受け取ったコンテンツが、次のように表示されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/26289/61a3e43e-2b73-c0e4-5ed6-1621ce205493.png)

## mitmproxy でのスクレイピング方法

mitmproxy で Python スクリプトを実行する方法を紹介します。

```
mitmdump -s path_to_script.py
```

実行するスクリプトは、例えば次のようなものがあると思います。次の例は、Content Type が `text/html` のものだけ絞って、保存するものです。

```py3
def response(flow):
    content_type = flow.response.headers.get('Content-Type', '')
    path = flow.request.url.replace('/', '_').replace(':', '_')
    if content_type.startswith('text/html'):
        with open(path, 'w') as f:
            f.write(flow.response.text)
```

もちろん、lxml などを使った要素の抽出などは適宜行えばよいかと思います。

その他、mitmproxy の機能を網羅した example は [GitHub 上にあります](https://github.com/mitmproxy/mitmproxy/tree/master/examples)。

## まとめ

mitmproxy を使ったクローリングのテクニックをご紹介しました。人間様最高！

説明を省いてしまいましたが、SSL のサイトにも対応しています(詳細はググっていただけると)。

## 注意

今回の方法は、いわば中間者攻撃のような方法です。同意のない状態で他人に仕掛けた場合、立派な犯罪になるので絶対にやめて下さい。あくまで、自分の閲覧したサイトを、自分で保存して分析するために利用しましょう。また、利用規約によって禁止されている非公開の API の利用もやめましょう。
Do ButtonでRaspberry Piを操作する

この記事は[おうちハック Advent Calendar 2016](http://qiita.com/advent-calendar/2016/ouch-hack)の19日目の記事です。

#目的#
エアコンをプログラマブルに操作したい、という動機のもとに「任意のタイミングでRaspberry Piを**手軽に**操作する」ことを実現します。このtipsは下記のような目的にも使えます。

・任意のタイミングでRaspberry Piに命令を出したい
・ユーザが指示したときに特定サービス、コマンドを実行したい

#必要なもの#
・Raspberry Pi か 常時起動可能なPC
　(Apache HTTP Serverが動けばよいので、WindowsでもLinuxでも可能)
・グローバルIPアドレス
　(ルーターのポートフォワード等の機能で外部からRaspberry Piにアクセスできるようにしておく)
・iOS端末もしくはAndroid端末

#実装方式概要#
・Do ButtonからHTTPリクエストをRaspberry Piに送信
・ApacheにてDo Buttonからのリクエストを受け付け、ApacheのSSI機能を用いてRaspberry Pi上で**コマンド実行**

概要図
![実装方式概要](https://qiita-image-store.s3.amazonaws.com/0/107271/e8baab0a-3109-638b-604f-f7231cb7608c.png)

#設定方法#
設定は下記の2つに対して必要です。
・Do Button
・Apache HTTP Server

##Do Buttonの設定##
IFTTT\([iOS](https://itunes.apple.com/jp/app/id660944635)\)\([Android](https://play.google.com/store/apps/details?id=com.ifttt.ifttt)\) をインストールの上、下記の通りに設定。
下記はiOS ver3.1.1にて確認
参考：[IFTTT Help center](https://ifttt.com/help/questions-about-DO-Applets)

■設定一覧
This：Button widget
That：Maker
　URL：http://[RaspberryPiのグローバルIPアドレス]/filename.shtml
　Method：GET
　Content Type：text/plain

##Apache HTTP Serverの設定##
下記の設定手順、ファイルの変更内容を参考に設定を入れ、SSI機能を有効にする。
下記はRaspbian Jessie(Debian8)、Apache 2.4.10にて確認
参考：[Apache チュートリアル: Server Side Includes 入門](https://httpd.apache.org/docs/2.0/ja/howto/ssi.html)

```shell-session:設定手順
①Apache HTTP Serverをインストールする
$ apt-get install apache2

②SSI機能を有効にするために設定ファイルを編集する（下記参考）
$ vi /etc/apache2/apache2.conf

③SSI機能の有効化
$ a2enmod include; a2enmod cgid

④Raspberry Piに実行させたい内容をコマンドとしてshtmlファイルに記載（下記参考）
$ vi /var/www/html/filename.shtml

⑤Apache HTTP Serverを再起動する
$ systemctl restart apache2
```

```shell-session:/etc/apache2/apache2.conf
<Directory /var/www/>
        （～～省略～～）
        Options +Includes # この行を追加
</Directory>
```

```shell-session:/var/www/html/filename.shtml
<!--#exec cmd=“/path/to/cmd (any option)" -->
```

#デモ動画#
Raspberry PiからIRKitに連携し、エアコンを操作するデモ動画です。
右下の青色のLEDがIRKitです。
https://www.youtube.com/watch?v=YiEAQL1TJ2Y

#補足#
・ボタンを押してからの遅延は5秒程度です。（ちなみにDo ButtonのパケットはアメリカのAWSから来ます）
・暗号化も何もしていないので、このままでは*途中経路でパケットをのぞき見されたら*誰でもあなたの家のRaspberry Piにあらかじめ設定した操作を実行できます。気になる場合はオレオレ証明書を作成してhttpsリクエストを受けることで回避可能です。
・Do Buttonから送信したHTTPリクエストのステータスコードがエラーだとIFTTTから"エラーが起きました"メールが来ます。
Arch Linux + Bluez 5でシリアル通信 

Arch Linux+bluez 5でBluetoothシリアル通信を行おうとしたら、ドキュメントがなくて苦労したのでその時のメモです。色々手間取ったので、順番が違うところがあったり、抜けがあったりするかもしれませんが、やり直して順序を確認する気にもならないので、このままで公開します。
Markdownの書き方もよくわかっていないので、そのあたりもご容赦ください。

# 環境
PC: Dell Inspiron 11 3000 (3162)
OS: Arch Linux(bluez 5.43-2)

# 手順
1.  Bluetooth関連のパッケージをインストールする  
    
        $ sudo pacman -S bluez bluez-utils
2.  一旦、手動でbluetoothサービスを起動し、bluetoothctlを使って、ターゲットのアドレス調査と接続確認を行う。  
    
        $ sudo systemctl start bluetooth
        $ bluetoothctl
        [bluetooth]# power on
        [bluetooth]# agent on
        [bluetooth]# scan on
        (アドレスを確認する)
        [bluetooth]# scan off
        [bluetooth]# pair XX:XX:XX:XX:XX:XX
        [bluetooth]# quit
        $ sudo modprobe rfcomm
        $ sudo /usr/bin/rfcomm connect /dev/rfcomm0 XX:XX:XX:XX:XX:XX 1
3.  問題がなければ、起動時にBluetoothが使えるように設定する。  
    1.  起動時に電源をONにするため、udevルールを追加する。  
        
            sudo vi /etc/udev/rules.d/10-local.rules
            ---
            # Set bluetooth power up
            ACTION=="add", KERNEL=="hci0", RUN+="/usr/bin/hciconfig hci0 up"
    2.  systemd-udevd.serviceのRestrictAddressFamiliesを修正する  
        
            $ sudo vi /etc/systemd/system/systemd-udevd.service
            ---
            RestrictAddressFamilies=AF_UNIX AF_NETLINK AF_INET AF_INET6 AF_BLUETOOTH
    3.  dbus-org.bluez設定を修正する。ExecStart行に--compatオプションをつけて互換モードで動作させる必要がある。  
        
            $ sudo vi /etc/systemd/system/dbus-org.bluez.service
            ---
            ExecStart=/usr/lib/bluetooth/bluetoothd --compat
    4.  サスペンド状態から復帰する際に自動で電源をONにするように、bluetooth-auto-power@.serviceを作成する。  
        
            $ sudo vi /etc/systemd/system/bluetooth-auto-power@.service
            ---
            [Unit]
            Description=Bluetooth auto power on
            After=bluetooth.service sys-subsystem-bluetooth-devices-%i.device suspend.target
            
            [Service]
            Type=oneshot
            ExecStartPre=/usr/bin/sleep 1
            ExecStart=/usr/bin/dbus-send --system --type=method_call --dest=org.bluez /org/bluez/%I org.freedesktop.DBus.Properties.Set string:org.bluez.Adapter1 string:Powered variant:boolean:true
            
            [Install]
            WantedBy=suspend.target
    5.  rfcomm.serviceを作成する。ExecStart行でBluetoothのアドレスがXX:XX:XX:XX:XX:XXの機器にチャネル1で接続するように設定している。  
        
            $ sudo vi /etc/systemd/system/rfcomm.service
            ---
            [Unit]
            Description=RFCOMM service
            After=bluetooth.service
            Requires=bluetooth.service
            
            [Service]
            ExecStart=/usr/bin/rfcomm connect /dev/rfcomm0 XX:XX:XX:XX:XX:XX 1
            
            [Install]
            WantedBy=bluetooth.target
4.  bluetooth/bluetooth-auto-power/rfcommをsystemdへ登録して再起動する。  
    
        $ systemctl enable bluetooth
        $ systemctl enable bluetooth-auto-power\@hci0
        $ systemctl enable rfcomm
        $ sudo reboot
[swift] Firebase Realtime Databaseのリスナーについて

firebaseに触れる機会があったので、こちら参加してみました
主にリスナーについてさらっと軽め書いていこうかと

# Firebase Realtime Database とは
> Firebase Realtime Database はクラウドにホストされたデータベースです。データは JSON として保存され、接続されているすべてのクライアントとリアルタイムに同期されます。Android、iOS、JavaScript SDK を使用してクロスプラットフォーム アプリを構築すると、すべてのクライアントによって 1 つの Realtime Database インスタンスが共有され、最新のデータによる更新が自動的に受信されます。

[日本語の公式ドキュメントより](https://firebase.google.com/docs/database/?hl=ja)

# イベントリスナーのアタッチ
リスナーはデータの初期状態で1回トリガーされます。またデータが変更されると、そのたびに再びトリガーされます
`observeSingleEventOfType`メソッドを使用すると、1度だけトリガーされるイベントを設定できます

````
let userID = FIRAuth.auth()?.currentUser?.uid
ref.child("users").child(userID!).observeSingleEventOfType(.Value, withBlock: { (snapshot) in
  // Get user value
  let username = snapshot.value!["username"] as! String
  let user = User.init(username: username)

  // ...
  }) { (error) in
    print(error.localizedDescription)
}
````

## イベントリスナーの種類
イベントの種類は全部で5種類あります

| イベントの種類 |呼ばれるタイミング|
|:-----------|------------:|
| FIRDataEventTypeValue|パス全体に対する全ての変更に対して呼ばれる|  
| FIRDataEventTypeChildAdded|データが追加されたとき、リスナーをセットしたときに呼ばれる。データが無いときは呼ばれない|  
|FIRDataEventTypeChildRemoved|データが削除されたとき|  
| FIRDataEventTypeChildChanged|データが変更されたとき。.added, .removedと併用して使用する|  
| FIRDataEventTypeChildMoved|データの並び替えが発生したとき|    

# 実際にイベントリスナーをつけてみよう
## はじめに
タイタンというロボットが召喚された回数(=fallCount)がカウントアップされたとき、labelの回数表示も更新するという感じで`.value`イベントで監視していきます

データ構造

````
"titan": {
    "fallCount": { 
        0
    }
}
````
FIRDatabaseReference、FIRDatabaseHandleをまとめて定義しておくといいと思います

````Database.swift
typealias ObserverReturnValue = (ref: FIRDatabaseReference, handle: FIRDatabaseHandle)
````

## 実際にリスナーをセット

````ViewController.swift
@IBOutlet weak var fallCountLabel: UILabel!

var observer: Database.ObserveReturnValue
observer = Observe.observeFallCount(completion { count in
    if let count = count {
        fallCountLabel.text = count
    }
})
````

````Observe.swift
static func observeFallCount(completion: @escaping ((Int?) -> ())) -> Database.ObserverReturnValue　｛
    let path = "taitan/fallCount" 
    let ref = FIRDatabase.database().reference().child(path)
    let handle = ref.observe(.value, with: { snapshot in
        if snapshot.exists(), let count = snapshot.value {
            completion?(count)
        } else {
            completion?(nil)
        }
    })
    return (ref: ref, handle: handle)
}
````

## 不要になったリスナーはremoveしてあげましょう

````ViewController.swift
func removeObserve() {
    if let ref = , observer.ref, let handle = observer.handle {
        ref.removeObserver(withHandle: handle)
    }
}
````

## おわり
これからたまーにアウトプットしていこうと思ってます。なにか間違いなどありましたら教えていただけると幸いです。おつかれさまでした
VBScriptでLotusScriptを利用する

# VBScriptでLotusScriptを利用する

　使い方を聞かれたので簡単にまとめてみました。
　~~注意点にも記載しましたが、今後のことを考えると、ローカル環境でWindowsの機能を使いつつLotusScriptで何かしたい場合はWindows PowerShellで実装するのがお勧めです。~~

※[PowerShellからLotusScirptのクラスを呼んだときのGetFirstDocumentの挙動について \- Qiita](https://qiita.com/fumimix/items/0a9dd6303a5311ec7992)に記載しましたが、GetFirstDocumentの挙動がおかしいため、この問題が解消してからのほうがよいかもしれません。


## 概要

　[Component Object Model](https://ja.wikipedia.org/wiki/Component_Object_Model)（COM）セッションを利用して Dominoオブジェクトへのアクセスが可能です。

　DBに直接LotusScript書くほうが早そうですが、以下のようなメリットがあります。Windowsの各種機能と組み合わせてLotusScriptでNotesDBをつつけるので、色々と便利な場面があります。

- ユーザーのローカル環境から実行するときに、処理が終わるまでNotesクライアントが固まらない（バックグラウンドで実行できる）
- VBScript側で用意されている機能のいいとこ取りができる
- Windowsの機能のいいとこ取りもできる
  - 例：ユーザーのローカル環境で定期的に実行させたいエージェントがあった場合に、Windowsのタスクスケジューラなどの機能を使って実行する

　一方でデメリットもあります。

- フォアグラウンドのクラス(NotesUIWorkSpaceから派生するクラス、ユーザーインターフェースに関するクラス、など)は使えない
- バックグラウンドのクラスでもCOMでは使えないものもある
- IBM Notes/IBM Domino 上とCOMで実行したときで、挙動が異なるクラス・メソッドがある

　上手く使えば仕事を楽にしてくれるので、知っていると便利です。


## サンプルコード

　VBScriptからLotusScriptのNotesSessionを利用する簡単なスクリプトはこちら。

```VBScript:sample.vbs
	' VBScriptでLotusScriptのクラスやオブジェクトを利用するためのシンプルな例

	Option Explicit


	' 初期設定
	' 変数の設定
	Dim objWsh				' バッチファイルをウィンドウ開かずに実行させるときに必要
	Dim objSS				' NotesSessionクラスのオブジェクト


	' Notesのセッションを用意する
	' Initialize メソッドに引数を渡さないことで、デフォルトのパスワード入力ウィンドウを表示させる
	Set objSS = WScript.CreateObject("Lotus.NotesSession")
	Call objSS.Initialize


	' NotesSession のプロパティを呼んでみる（今回はユーザー名の共通部分を出力してみる）
	Wscript.Echo objSS.CommonUserName
```

　上記コードを適当なフォルダに保存し、前提条件を満たした環境下で以下のように実行してあげると、ユーザー名の共通部分が表示されます。

```CMD:実行例
	C:\>C:\Windows\SysWOW64\CScript.exe //nologo sample.vbs
	Hoge Fuga
```


## 注意点
　64bit環境下では、32bit版のCScript.exe(またはWScript.exe)からVBSを呼ぶ必要があります。64bit環境下では通常64bit版のCScript.exeが呼ばれてしまうのですが、このCScript.exeではオブジェクトを作成できず、以下のようなエラーになります。

```CMD:失敗例
	C:\>cscript //nologo sample.vbs
	C:\sample.vbs(14, 1) WScript.CreateObject: "Lotus.NotesSession" というオブジェクトを作成できませんでした。
```

　このため、上の例のように C:\Windows\SysWOW64\CScript.exe から実行する必要があるのですが、知らないとハマります。昔のコードが新しい環境で動かない……ということで焦ることになります。

＃"WOW64"は"Windows-On-Windows 64"の略で、64bit Windows で 32bit Windows アプリケーションを動作させる仕組みのことなのだけど、見ただけならこっちが64bit版のCScript.exeだと思っちゃいますよね……。なんて分かり辛い。

　また、VBScriptがいつ打ち切られてしまうか分からないため、そうなった場合はWindows PowerShell への移行を迫られることになります。

「Windows PowerShellでもLotusScriptを利用できるの？」という声が聞こえてきそうですが、できるので続きは後ほど……。

2017/10/22 追記：
　だいぶ時間がたってしまいましたが、PowerShellからLotusScriptを呼び出す方法についてエントリを用意しました。
[PowershellでLotusScriptを利用する \- Qiita](https://qiita.com/fumimix/items/13a74e534bc5f2b6aaae)
SQLを書く上で大切にしたいこと



| 内容| 理由 |
|:-----------|:------------|
| 3秒以内にSQLを返す。   |ユーザーにストレスなくサービスを使ってもらうため|
| カバリングindexにする。（SQLをindexだけでカバーする。）indexをはりすぎると更新に時間はかかるので注意|ユーザーにストレスなくサービスを使ってもらうため |
| INNER JOINとLEFT JOINを明確に意識する|必要なデータを明示化することによって、テーブル同士の関係性を明らかにするため。INNER JOINならば、そのデータが必須であることなどがわかる。 |
|nullを避ける |基本的にはNULLの必要性がない。また、NULLを無くすことによって検索スピードが向上する。 |
|GROUP BYしてカウントするようなSQLは非正規化しておく | GROUP BYとCOUNTは時間がかかるので、あえて非正規をすることによってSELECTのスピードを上げる|
| UNIONは使わない。SQLを2つにわける。| UNIONを使うと、１つのDBに負荷がかかるようになり、スケーラビリティがしづらくなる。それを２つのQueryに分けておけば、DBを追加すれば負荷に対応できるようになる。|
|自己結合は使わない。SQLを2つにわける | 自己結合を使うと、１つのDBに負荷がかかるようになり、スケーラビリティがしづらくなる。それを２つのQueryに分けておけば、DBを追加すれば負荷に対応できるようになる。|
| sub queryは使わない。SQLを2つにわける。|sub queryを使うと、１つのDBに負荷がかかるようになり、スケーラビリティがしづらくなる。それを２つのQueryに分けておけば、DBを追加すれば負荷に対応できるようになる。相関サブクエリーは判断に迷うが、O/Rマッパーはサポートしてないし、基本的には使わない方針でいいと思う。|
|時系列的に積み重なるテーブルは、パーティショニングを行う。 |データが無限に膨らんでいき、将来的にメンテナンスが大変になることを防ぐため。 |
押さえておきたいデファクトスタンダードなIT技術

※個人的に気になっている,これから勉強していくIT技術をまとめたもの

# パブリッククラウド
* AWS
* Azure
* Google Cloud Platform
‎

# プライベートクラウド
* VMware 
* OpenStack
* Docker

# 自動化
* Ansible
* ServerSpec
* jenkins
* Terraform
 
# 監視システム
* Zabbix

# 機械学習/ビッグデータ
* tensorflow
* Hadoop Spark
* fluentd + Elasticsearch + kibana

# webアプリケーション
* rails
* Angular2
* react

# OS
* RHEL7

# プロジェクト管理
* Redmine
* Github
* asana