OmniAICreator/Qiita-1.07M huggingface dataset:
出力ストリームに区切り文字を自動で挿入する

# 目的 :bulb: 

CSV形式やTSV形式で出力したい時、区切り文字を毎回書くのはちょっと面倒。

```cpp
for (size_t i = 1; i < 10; i++) {
  std::cout
    << "[csv] "
    << i
    << ", " << std::string(i, 'x')
    << ", " << std::boolalpha << (i % 2 == 0)
    << "\n";
}
```

次のように書けると気分が良い。

```cpp
for (size_t i = 1; i < 10; i++) {
  make_auto_sep(std::cout, "[csv] ", ", ", "\n")
    << i
    << std::string(i, 'x')
    << std::boolalpha << (i % 2 == 0);
}
```

という類のものを何度も再発明していることに気付いたので、纏めたものをメモ。

# コード :sparkles: 

```cpp
#include <iostream>
#include <string>

// 出力ストリームに区切り文字を自動で挿入するラッパクラス
template<class CharT, class Traits, class Sep, class End>
class AutoSep {
  std::basic_ostream<CharT, Traits>& os_;
  const Sep& sep_;
  const End& end_;
  bool is_first_ = true;

public:
  template<class Start>
  AutoSep(
    std::basic_ostream<CharT, Traits>& os,
    const Start& start,
    const Sep& sep,
    const End& end) : os_(os), sep_(sep), end_(end)
  {
    os_ << start;  
  }

  ~AutoSep()
  {
    os_ << end_;
  }

  // マニュピレータは区切り文字を入れない
  AutoSep& operator<<(std::ios_base& (*func)(std::ios_base&))
  {
    os_ << func;
    return *this;
  }

  // 二回目から区切り文字を入れる
  template<class T>
  AutoSep& operator<< (const T& v)
  {
    if (is_first_) {
      os_ << v;
      is_first_ = false;
    } else {
      os_ << sep_ << v;
    }

    return *this;
  }
};

// コンストラクタの型推論用
template<class CharT, class Traits, class Start, class Sep, class End>
AutoSep<CharT, Traits, Sep, End> make_auto_sep(
  std::basic_ostream<CharT, Traits>& os,
  const Start& start,
  const Sep& sep,
  const End& end)
{
  return AutoSep<CharT, Traits, Sep, End>(os, start, sep, end);
}

int main()
{
  for (size_t i = 1; i < 10; i++) {
    make_auto_sep(std::cout, "[csv] ", ", ", "\n")
      << i
      << std::string(i, 'x')
      << std::boolalpha << (i % 2 == 0);
  }

  return 0;
}
```

[[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](http://melpon.org/wandbox/permlink/5CstKZuElTMDCtK6)

# 出力 :white_flower: 

```
[csv] 1, x, false
[csv] 2, xx, true
[csv] 3, xxx, false
[csv] 4, xxxx, true
[csv] 5, xxxxx, false
[csv] 6, xxxxxx, true
[csv] 7, xxxxxxx, false
[csv] 8, xxxxxxxx, true
[csv] 9, xxxxxxxxx, false
```
JavaScriptで指定した期間の日付の連番を生成する方法

「2014/4/1から2014/5/1(の前日)までの日付の連番を生成したい」というときにはこう書けばできます。

```js
var start = new Date("2014-4-1");
var end = new Date("2014-5-1");
for(var d = start; d < end; d.setDate(d.getDate()+1)) {
  console.log(d);
}
```

実行結果

```
Tue Apr 01 2014 00:00:00 GMT+0900 (JST)
Wed Apr 02 2014 00:00:00 GMT+0900 (JST)
Thu Apr 03 2014 00:00:00 GMT+0900 (JST)
Fri Apr 04 2014 00:00:00 GMT+0900 (JST)
Sat Apr 05 2014 00:00:00 GMT+0900 (JST)
Sun Apr 06 2014 00:00:00 GMT+0900 (JST)
Mon Apr 07 2014 00:00:00 GMT+0900 (JST)
Tue Apr 08 2014 00:00:00 GMT+0900 (JST)
Wed Apr 09 2014 00:00:00 GMT+0900 (JST)
Thu Apr 10 2014 00:00:00 GMT+0900 (JST)
Fri Apr 11 2014 00:00:00 GMT+0900 (JST)
Sat Apr 12 2014 00:00:00 GMT+0900 (JST)
Sun Apr 13 2014 00:00:00 GMT+0900 (JST)
Mon Apr 14 2014 00:00:00 GMT+0900 (JST)
Tue Apr 15 2014 00:00:00 GMT+0900 (JST)
Wed Apr 16 2014 00:00:00 GMT+0900 (JST)
Thu Apr 17 2014 00:00:00 GMT+0900 (JST)
Fri Apr 18 2014 00:00:00 GMT+0900 (JST)
Sat Apr 19 2014 00:00:00 GMT+0900 (JST)
Sun Apr 20 2014 00:00:00 GMT+0900 (JST)
Mon Apr 21 2014 00:00:00 GMT+0900 (JST)
Tue Apr 22 2014 00:00:00 GMT+0900 (JST)
Wed Apr 23 2014 00:00:00 GMT+0900 (JST)
Thu Apr 24 2014 00:00:00 GMT+0900 (JST)
Fri Apr 25 2014 00:00:00 GMT+0900 (JST)
Sat Apr 26 2014 00:00:00 GMT+0900 (JST)
Sun Apr 27 2014 00:00:00 GMT+0900 (JST)
Mon Apr 28 2014 00:00:00 GMT+0900 (JST)
Tue Apr 29 2014 00:00:00 GMT+0900 (JST)
Wed Apr 30 2014 00:00:00 GMT+0900 (JST)
```

ポイントは、`d.setDate(d.getDate()+1)`で日付をインクリメントできるところですね。
月末や年末をまたいだときもちゃんと繰り上がってくれます。
SoftLayer Server Cancellation の取り消し

#0. はじめに
SoftLayer 環境で Cancel (以下、キャンセル)するサーバーを間違えた場合にどの様にするキャンセルを取り消すか(ちょっと判りにくいですね :sweat_smile: )について書いてみたいと思います。
また、Hourly 課金の場合、非常に短い時間(数分)で実際に削除される事例を確認していますので、今回の記事は Monthly 課金のサーバーを対象にしているとお考え下さい。

#1. キャンセル時の選択肢
Device List などからキャンセルする際のオプションは、そのサーバーの課金が Hourly か Monthly で選択肢が異なります。
以下は Monthly の例ですので、即時(Immediately)にキャンセルするか、次回の Anniversary Date に削除するかを選択可能です。
![cancel1.png](https://qiita-image-store.s3.amazonaws.com/0/74185/bcc98bd3-2b19-3525-1e79-557a92e520c3.png)
一方、Hourly の場合は即時(Immediately)にキャンセルする以外の選択肢はありません。

#2. Anniversary Date でのキャンセルの取り消し
操作直後に間違いに気が付いた場合、以下の様に cancellation page へのリンク含むメッセージが表示されているはずですので、そのリンクを辿ります。
![cancel_voidablemsg.png](https://qiita-image-store.s3.amazonaws.com/0/74185/b296622c-d889-93a7-fca9-617aa547433a.png)
また、このメッセージに気づかずに画面を切り替えた場合でも、カスタマー・ポータルから Account -> Sales -> Cancellations の順に選択することで、キャンセルの一覧を表示できます。
![cancelvoid2.png](https://qiita-image-store.s3.amazonaws.com/0/74185/39f3b9d6-e9c2-6d55-90a7-2c9425b5163e.png)
上記画面右側の Void Cancellation のリンクをクリックすることで、以下の確認ダイアログが表示されます。
![cancelvoidconfirm.png](https://qiita-image-store.s3.amazonaws.com/0/74185/7357af75-6569-7e76-e74c-48a996d221b9.png)
ここで Yes をクリックすることで、キャンセルを取り消すことが可能です。

#3. 即時(Immediately)キャンセルの取り消し(の試み)
この場合でも、経験上はしばらくの間、サーバーは以下の様な状態でしばらくの間は Device List 上に消されずに残っています。
![cancelvoid3.png](https://qiita-image-store.s3.amazonaws.com/0/74185/767be510-f0bf-14c4-2c28-3f7f4fdaf412.png)
この時点では、Cancellation の依頼はチケットの形で Support -> Tickets から参照可能です。
![cancelvoid3.png](https://qiita-image-store.s3.amazonaws.com/0/74185/f85e4a2c-1168-4a7f-91a1-288cdc432a1e.png)

上記の様に表示されるチケットへの Update として、この Cancellation request を Void(取り消し)したい旨を伝えれば、(確実ではありませんが)復旧できる可能性があると考えています。

Update の例：

```
Hello,

I would like to void this cancellation request for hostname.softlayer.com.
If it is possible, please void this cancellation request, please. 
```

#4. おわりに
一切の間違え無しに操作できれば一番ですが、「やらかしてしまった」場合でもこんな方法があるということが頭の隅に残っていれば、落ち着いて操作することで「やらかしてしまう」確率も下がるのではないかと思っています。
私が「PRを切ってからPRがmergeされるまでの期間は空いてはいけない」と信じる理由

昔から
「PRを切ってからPRがmergeされるまでの期間は空いてはいけない」
という信仰を抱き続けているんだけど、この気持ちを整理すると
だいたい理由の80%くらいが
* 「あるBranchを開発しようと思った気持ちが萎える」
* 「conflict地獄はやめろ、俺が死ぬ」
* 「rebaseすると見づらくなる」
で説明がつく

ただし開発スピードが速すぎるとConflict地獄を回避するために定期的なrebaseが必要になり、MRのdiscussionのダラダラ感が加速する。

# github先生へ
Discussionのrebase分のcommitを非表示にする機能はないですかね
Gitをコマンドラインから使うときに楽をする3つの方法

## 概要

GitはGUIから使うよりコマンドラインから使う方が、ほとんどの場合に楽で効率的だと個人的には思うのです。が、そのためにはいくつかの準備が必要です。具体的には、可能な限りタイプ数を減らすことで、GUIを上回るような効率でGitを使うことができるようになると思います。以下ではその方法を説明します。

## 方法１：`git`にaliasを設定する

`git`とかいちいちタイプしてられないので、`.bash_profile`やら`.zshrc`やらに

```
alias g="git"
```

と書いておきます。

## 方法２：`.gitconfig`にaliasを設定する

混乱しやすいですが、Gitは独自のaliasを設定できます。参考までに、私の`.gitconfig`には

```
[alias]
  a  = add
  f  = fetch
  l  = log
  ps = push
  pl = pull
  re = rebase
  co = checkout
  ss = status
  br = branch
  ci = commit
  mt = mergetool
  df = diff
```

という記述があります。
特に便利なのは`co`で、タイプ数を６文字も節約できる上、使用頻度が高いので効率上昇に大きく貢献します。

## 方法３：`hub`をインストールする

[hub](https://hub.github.com/)は`git`コマンドをラップしてGitHubへのアクセスを便利にしてくれるツールです。GitHub公式ですし、Gitを使用する上でGitHubにアクセスする頻度を考えると導入に値するツールといえるでしょう。
[この記事](http://rcmdnk.github.io/blog/2014/08/21/computer-git-github/)が日本語記事としては新しいので、インストール方法等はそちらを参照してください。

## まとめ

これらのちょっとした工夫で、コマンドラインでGitを使う効率は大きく向上すると思います。
ArgumentError: uncaught throw :warden が 出た場合

# 起きたこと
Featureテストで`ArgumentError: uncaught throw :warden`と言われて実行ができなくなってしまった。Devise利用している。

今回の場合、 `Confirmable`に対応したあとで起こるようになったようだ（事後判断）。


# 解決方法
`login_as`等で`user`オブジェクトを作成していると思うが、このオブジェクトが適切で無い場合にこの例外が送出される。今回の場合、`confirmed_at` が入っていなかったのが原因。なので`user`オブジェクトを作成する際に`confirmed_at`が入るように修正した。

簡単なことなのにかなり時間をかけてしまった…
PostgreSQLの排他制御（ロック処理、デッドロック）、大量アクセス時の考察

#DBによるロック処理（排他制御）の実装#

##前提として##
* ロックは最小限にする（長いとロック待ちが多発）
* 必ず1人ずつ処理させたい部分にロックを加える
* DBにロック処理は任せる
(`LOCK [ TABLE ] name [, ...] [ IN lockmode MODE ] [ NOWAIT ]`)
* デッドロックは何かがおかしいので必ず解決する

##ロックテーブルを一つにまとめる##
* ロックする箇所を一つにまとめるのもアリ ⇒ share_lock 等のテーブルを用意
* share_lockをロックする事で一人一人処理される事を約束する ⇒ 必ずこの中で排他制御したい処理をする
* デッドロックの発生箇所を把握しやすくし、発生を抑えることが出来る

##行ロック##
* 最終的に確認する必要があれば、その行だけロックをしてから確認の処理をする
* 決済などは先に済ましてからロックする。（ロック時間は極力短くする）
* 別途cron処理があれば、cron側を NOWAIT として、ロックされていたら（処理中）エラーとして次の処理にする等を考慮する

##ロックのモード##
http://www.ecoop.net/memo/archives/2008-05-30-1.html

* ACCESS EXCLUSIVE を使う事はほぼ無い（最強、違うセッションからのアクセスは許さない）
* EXCLUSIVE 基本読み取りは大丈夫な場合が多いので、見直す



#高負荷時（大量アクセス時）の考察#

##メモリ不足##
* フレームワークによってはメモリを一気に食ってしまうような場合がある。
* その為大量にそのページへ流れると、一気にメモリ不足に陥りレスポンスが遅くなってしまう。（※DBで大量のデータがあるテーブルを検索、一覧を取得してモデル化する時など）

##DBのindexを見直す##
* 検索で時間がかかっている場合などはindexを見直して、検索で使うけどindexが張られていない状態を無くす

##abテスト（ApacheBench）を出来れば行う##
* 同時アクセス数を数値で指定して、どのくらいのアクセスに耐えられるのか把握する必要がある。
* 出来れば本サーバもしくはそれに近い環境で出来ると良い。ローカル環境でも出来るが参考程度。

http://qiita.com/flexfirm/items/ac5a2f53cfa933a37192
http://kaworu.jpn.org/kaworu/2013-02-23-1.php

このあたりが参考になる。


> Complete requests　⇒　成功した数
> Failed requests　⇒　失敗した数　※ここを減らす
> HTML transferred　⇒　HTMLの容量（この容量があまりに多かったり少なかったりしたら、想定しているページが表示されていない）
> Requests per second　⇒　1秒あたり何リクエストさばけるか　※ここを増やす
> Time per request　⇒　1リクエストあたりの処理時間　※ここを短くする
> Percentage of the requests served within a certain time　⇒　右側に表示された時間内に処理されたリクエストの割合。「75% 3000」は、75％のリクエストが3000ms以内に処理されたことを表す。

#まとめ#
* 共有ロックテーブルをつくって、テーブルロックはその箇所のみにする
* 更新したい行だけロックをすることで、他からの影響は受けないようにする

というのが特に勉強になりました。
ロックのモードも重要で、全てをロックする事（検索も許さない）で負荷が上がってしまうので、更新だけロックするように調整しました。

フレームワークの使い方によってメモリを消費してしまうので、
高負荷（アクセスが多い）の場合は顕著にレスポンスが遅くなったりします。

abテストを行って、アクセス数が増えると著しくレスポンスが遅くなる個所を見つけて処理を見直す必要ありです。
Railsのログをlessで色付きで見る

## 概要

Railsのログはデフォルトで色がついています。が、`less`で見るときに、そのまま見ようとするとカラーコードがエスケープされてしまいます。これを避けるには、`less`のオプションに`-R`をつけます。

```shell-session
less -R log/development.log
```

これでログ閲覧がはかどりますね。

## おまけ

流れてくるログを見るのに`tail`コマンドを使っている人も多いと思いますが、`less`内で`Shift-F`を押すことで`tail`っぽい動作をするモードに移行できます。`Ctrl-C`で通常モードに戻ります。

`less`便利ですね！
C++　std::vector同士の連結方法

C++　std::vector同士の連結方法

```
std::vector v1;
std::vector v2;
　　~初期化~
v1.insert(v1.end(), v2.begin(), v2.end());
```

以上としていましたが、
std::copyを使ったほうが良いというコメントをいただきました。
以下の通り修正したものを参考にしてください。
（下記に追記しました。大事なことなのに長い間忘れていて反省しています。）

```
std::vector v1;
std::vector v2;
　　~初期化~
std::copy(v2.begin(),v2.end(),std::back_inserter(v1));
```
追記:
std::copyを使う場合は元のvectorのサイズに注意してください。
あるvectorの後ろに連結させる場合、
連結させたいvectorのサイズが連結先のvectorより小さい場合は良いのですが、
連結させるvectorが連結先のvectorより大きい場合には、
サイズが足りなくなるとメモリを確保し直します。
サイズ差によってはメモリ確保が何度か繰り返されてしまいます。
そのため、場合によりreserve()したほうがいい場合があります。
*場合に応じてどちらが良いかは変わってくるということでよろしくお願いします。
情報セキュリティ関連のメモ書き


色々メモ書き。ちょいちょい更新する（かも）

## 情報セキュリティの3要素

情報セキュリティは以下の3要素で構成される

* 機密性: 情報システムが保持している情報が許可されていない範囲からアクセス出来ないこと
* 可用性: 情報システムを利用したい時に利用出来ること
* 完全性: 情報システムが保持している情報が意図せず改竄されないこと

海の向こうでは、可用性＞完全性・機密性 という優先度で判断されることが多いのに対し、
我が国では 機密性＞完全性・可用性 という優先度で判断されることが多いので、海外事例を読む場合は留意のこと

## セキュリティの勘所

不正活動は以下の3要素（MOM）が揃うと実行に移される

* Measure: 手段
* Opportunity: 機会
* Motivation: 動機

不正活動を防ぐには3要素（MOM）の全てか、いずれかを軽減/遮断出来れば実行に移されることはないと言える。

## 防御について

境界防御（きょうかいぼうぎょ）と縦深防御（じゅうしんぼうぎょ）について
※軍事用語が由来

* 境界防御: システム間・モジュール間のインターフェース部分でバリデーションチェックを行い入力できない物はその段階で除去する方法
* 縦深防御: システム間・モジュール間のインターフェース部分ではバリデーションチェックを行わず、内部に取り込んだ上で入力に都合の悪い情報を除去していく方法

縦深防御では、不正データを内部に取り込んでしまうため、不具合を誘発する可能性がある
セキュリティ観点からは、境界防御を主軸に、境界防御では防ぎきれない物を縦深防御で防ぐ方策を採るのがベストと考えられる。

※システム設計を行い再、「契約プログラミング」と呼ばれる手法を採ると、境界防御を考慮しやすくなる（参考）
　http://ja.wikipedia.org/wiki/契約プログラミング

## 攻撃対象削減対策

* 要塞化の手段の一つ
* 「使用していない機能は、攻撃者が悪用しないように無効にする」
* 「ファイヤウォールで利用していないポートは全て遮断する」「使わないサービス（デーモン）は停止する/アンインストールする」などもこれに相当する
* 攻撃者へのタッチポイントを限界まで減らすことで、手段を封じ、リスク軽減を図ると共に、メンテナンス対象となる物を減らすことでコスト軽減も図ることが出来る

## セキュリティ設計原則

Microsoftさん提唱のセキュリティ設計を考える上での原則

|項目|内容|
|:-----|:-----|
| オープンな設計 | 攻撃者はソースや仕様を知っているという前提 |
| フェイルセーフ名限定の実装 | 失敗しても終了するようにする。失敗したら失敗した、という状態で終了させる。デッドロックさせないようにする |
| 最小特権 | 処理に必要な必要最低限の特権のみを与える |
| 経済的メカニズム | 構造は出来るだけ単純にする。メンテナンスコストや実装コストを最小に考える |
| 特権の分離 | 一つの条件に基づいて操作を許可しないようにする |
| すべてに対する仲介 | すべてを毎回チェックする |
| 最小限の共通メカニズム | 共有ソースに注意する |
| 心理的な受容 | その実装・そのシステム、あなたは使いたいですか？ |

## 対策方法の選択肢が多く迷ったら場合

 対策方法の選択肢が多くて迷った場合、企業ユースの場合は「経済効率性」を軸に対策方法の取捨選択をすると良い。どういうことかというと…

* 完璧な対策だが、払うコストも高い
* まずまずの対策で、払うコストは中程度
* あまり効果が期待できないが、払うコストが安い

と言うような3パターンの場合、中段の方法を採用するのが最もベストバランスである、という判断。
但し、求められるセキュリティのレベルが非常に高く、コスト度外視と言う場合はこの限りでは無い。

## SSL/TLS回りの話し

暗号通信に関する分野は非常に専門的で、深く難しい分野なので、ベストプラクティスを取り込んで設定するのが一番安全。
暗号化しているにもかかわらず、設定が残念なことになっていて、ほとんど意味が無い（暗号化しているよ、という表示がされているだけ平文通信をしているよりもたちが悪いかもしれない）なんて事がないよう、常に最新情報を仕入れて設定の更新をするのが良い（去年大丈夫だった設定が、今年も大丈夫か？という保証はないです）

### IPA発行資料

* 日本語で詳しく解説されている資料が発表されました（2015/05/12）
* 3つのセキュリティレベルを定めて、暗号化手法やハッシュアルゴリズムの選択について推奨する設定を解説しています
* https://www.ipa.go.jp/security/vuln/ssl_crypt_config.html

### Mozillaのコンフィグレーションファイル生成ツール（サイト）

* サーバープログラムの種類や、OSにインストールされているOpenSSLのバージョン、求める設定のAggressiveさを選ぶと、各サーバーの設定ファイルを生成してくれる便利ツールです
* https://mozilla.github.io/server-side-tls/ssl-config-generator/

## 調査によく使うサイト

メジャーどころばかりなので、ここに書くのも今更感ありますが、メモ書きと言うことで
※その他、良いサイトがありましたらお知らせ頂けると幸いです

### 脆弱性情報の調査・収集

* CVE details http://www.cvedetails.com/
* Exploit-DB https://www.exploit-db.com/
* PacketStorm http://packetstormsecurity.com/
* JVN https://jvn.jp/index.html

### ウィルス・マルウェア・アクセス先のサイト安全性などの確認

* VirusTotal https://www.virustotal.com/
Macの資産管理について

# インストールされているアプリケーションとそのバージョンを取得する

まずはMacにインストールされているアプリケーションのバージョンをターミナルで取得する方法を調査した。

## アプリケーションごとに取得する

例：Google Chrome

### AppleScript

```bash
$ osascript -e 'version of app "Google Chrome"'
41.0.2272.89
```

### defaultsコマンド

```bash
$ defaults read /Applications/Google\ Chrome.app/Contents/Info.plist CFBundleShortVersionString
41.0.2272.89
```

### plutilコマンド

```bash
$ plutil -p /Applications/Google\ Chrome.app/Contents/Info.plist | grep "CFBundleShortVersionString"
  "CFBundleShortVersionString" => "41.0.2272.89"
```

## インストールされているアプリケーションすべて取得する

システム情報.appにアプリケーションの情報を保持しているので、それをコマンドで表示する。

### ターミナルに出力する

```bash
$ system_profiler -detailLevel full SPApplicationsDataType
```

### XML形式でファイルとして保存する

拡張子をspxにするとシステム情報.appで開くことができる。

```bash
$ system_profiler -xml > ~/report.spx -detailLevel full SPApplicationsDataType
```

XMLで保存しておけばプログラムで処理しやすい。
rspecについてメモ


# validateが通る事を確認する書き方

```rspec
expect(record).to be_valid
```

# 数値の大小の比較(> <や等)

```rspec
expect(assigns[:records].size).to be >= 1
```

# コントローラーでファイルアップロードをパラメータ化するメソッド

```rspec
Rack::Test::UploadedFile.new( filepath )
```


```ruby:actionpack/lib/action_dispatch/testing/test_process.rb

 29     # Shortcut for <tt>Rack::Test::UploadedFile.new(File.join(ActionController::TestCase.fixture_path, path), type)</tt>:
 30     #
 31     #   post :change_avatar, avatar: fixture_file_upload('files/spongebob.png', 'image/png')
 32     #
 33     # To upload binary files on Windows, pass <tt>:binary</tt> as the last parameter.
 34     # This will not affect other platforms:
 35     #
 36     #   post :change_avatar, avatar: fixture_file_upload('files/spongebob.png', 'image/png', :binary)
 37     def fixture_file_upload(path, mime_type = nil, binary = false)
 38       if self.class.respond_to?(:fixture_path) && self.class.fixture_path
 39         path = File.join(self.class.fixture_path, path)
 40       end
 41       Rack::Test::UploadedFile.new(path, mime_type, binary)
 42     end
```
  

factorygirlを利用していたので、fixture_pathから使えなかったのでメモ。

# メールをテストする

ActionMailer::Base.deliveries.lastを参照する

```ruby
describe "password_set_complete パスワード設定完了" do
  it "処理後、メールが配信される" do
    expect {
      post :password_set_complete, parameters
      mail = ActionMailer::Base.deliveries.last
      expect(mail.subject).to eq "PASSWORD登録のお知らせ"
    }.to change(ActionMailer::Base.deliveries, :size).by 1
  end
end

```
gitで文字列検索、git grepとgit log -Sがとっても便利

「hogeを含むファイルってどこにあったっけ…」
「そもそもhogeっていつ、だれが、どのファイルに追加したっけ…」

などなど、確認したいときは以下のコマンドを使うとすぐに探せます。

# 現在のワークツリー上から対象文字列を含むファイルを検索
```
git grep ${検索したい文字列}
```
-Eや-Gを使う事で正規表現も使用可能です。
（-E, --extended-regexp, -G, --basic-regexp）
-Iを使用する事でバイナリファイルを検索対象から除外できます。

# 過去のコミットから対象文字列を含むコミットを検索
```
git log -S 
```
コミットを1行表示して、対象ファイル名のみ表示する場合は以下のオプションを使います。
--pretty=oneline --name-only 
正規表現を使う場合は--pickaxe-regexを使います。
アプリケーションにフォーカスがあるか調べる

MonoBehaviour.OnApplicationFocus() で調べることができるんだけども…。

公式のスクリプティングマニュアルから説明を抜粋。

プレイヤーの取得またはフォーカスを失った時に全てのゲームオブジェクトに送信されます。

    void OnApplicationFocus(bool focusStatus) {
        paused = focusStatus;
    }

この focusStatus が true の時にフォーカスを得たという意味なのか、失ったという意味なのか分からない。
マニュアルでも明示していない。
上記の使用例だと、逆の意味を持つ paused という名前のフィールドに focusStatus の値を代入しているのでどっちなのか余計に混乱する。


実際にスクリプト書いて値を調べたところ、フォーカスを得たときに true になり、失ったときに false になると分かった。

4.x を使用
URLの最後の/のあるなしでカレントの位置が異なる


考えてみれば当たり前だけど、念のためめも

**カレントは一番最後のスラッシュのあとになるため、相対パスを使うときは注意する**

リンクをhoge.htmlと書いた場合に、URLの/のあるなしで指しているパスが異なる

例えば、aタグで書いたり

```
<a href="hoge.html">hoge</a>
```

ajaxで書いた場合、

```
$.get(hoge.html)
```

以下のようになる。


１．カレントのURLの最後にスラッシュがないパターン

現在のURL　http:://foo/bar
絶対パス　http:://foo/hoge.html

２．カレントのURLの最後にスラッシュがあるパターン

現在のURL　http:://foo/bar/
絶対パス　http:://foo/bar/hoge.html

３．カレントのURLにクエリストリングがあるパターン

現在のURL　http:://foo/bar?fuga=12345
絶対パス　http:://foo/hoge.html
chrome > 検索結果が表示されない > googleをクリックしてから検索

google chromeを使っていると、google検索した時に検索結果が表示されない時がある。

そうなったら以下の手順を実行する
1. 左上の「google」をクリック
2. 画面中央の検索ボックスにキーワードを入れて検索
xcode6.3 ios8.2 実機テストができないとき

***
xcode6.3にバージョンアップしたら、iOS8.2の実機でテストができな時に対処方法。
・target versionは問題無し
・window -> devices で接続したiPhoneが認識されているのも確認済み
でも、認識しない（ineligible Devices となる）
***
####**1.対処方法**

targetを選択して、メニューから
Product -> Destination 
を選択すると、Indeligible Deviceで対象のデバイスを選択できる。

以上で、認識されるようになりました。
kivy-iosメモ kivy v1.9.0-dev URL連携（MAC）


新しいもので行う方法(まだ、開発版なので変わる可能性あり)。
# 1.呼び出し編

[kivy v1.8.0と同様に実行可能である。](http://qiita.com/leon_AKQJT/items/3933446ecf7138a0a1a3)

# 2.呼び出され編

基本的に[kivy v1.8.0](http://qiita.com/leon_AKQJT/items/3933446ecf7138a0a1a3)と同様であるが、修正するソースの箇所が違う。

```py:kivy/kivy/core/window/window_sdl2.py
        .
        .
        .
                self._mouse_down = True
                self.dispatch('on_mouse_down',
                    self._mouse_x, self._mouse_y, btn, self.modifiers)
                self._mouse_down = False
                self.dispatch('on_mouse_up',
                    self._mouse_x, self._mouse_y, btn, self.modifiers)

            elif action == 'dropfile':
# ADD START
                from kivy.app import App       <--- 追加
                app = App.get_running_app()    <--- 追加
                dropfile = args
                app.dispatch('on_dropfile', dropfile[0]) <--- 修正
# ADD END
            # video resize
            elif action == 'windowresized':
                self._size = self._win.window_size
                # don't use trigger here, we want to delay the resize event
                cb = self._do_resize
                Clock.unschedule(cb)
                Clock.schedule_once(cb, .1)
        .
        .
        .
```


・kivy/kivy/app.pyについては、[kivy v1.8.0](http://qiita.com/leon_AKQJT/items/3933446ecf7138a0a1a3)と同様に修正する。
PDOでMySQLに接続するためのクラス

自分用メモ。
職場の環境がPHP5.2.4なのでそこで使える形に。

```PHP:classDB
<?php
//設定ファイルの読み込み
require_once ('define.php');

/**
 * Class DB
 */
class DB {

  protected $pdo;
  protected $stmt;

  /**
   * @param $host
   * @param $dbname
   * @param $user
   * @param $password
   */
  public function __construct($host, $dbname, $user, $password) {
    try {
      $this->pdo = new PDO("mysql:host=".$host. ";dbname=".$dbname, $user, $password ,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
      $this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
      $this->pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
      $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
      $this->pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
    } catch (Exception $e) {
      print "エラー!!:". $e->getMessage() . "<br/>";
    }

  }

  /**
   * @param $sql
   * @return res[]
   */
  function pdoQuery($sql){
    $stmt = $this->pdo->query($sql);
    foreach ($stmt as $row) {
      $res[] = $row;
    }

    return $res;
  }

  /**
   * @param $sql
   * @param $arr
   * @param int    $mode SELECTの時は1,それ以外の時は2
   * 
   * @return res[]
   */
  function pdoPrepare($sql,$arr,$mode){
    $stmt = $this->pdo->prepare($sql);
    foreach ($arr as $key => $val) {
    //if(is_numeric($val)){
    /* is_numericで判定すると、数値だけど文字列として扱いたいとき
　　　　(電話番号とか)に不具合が起きたので修正 */
      if(is_int($val)){
          $val = (int)$val;
          $stmt->bindValue($key,$val,PDO::PARAM_INT);
      }else{
          $val = (string)$val;
          $stmt->bindValue($key,$val,PDO::PARAM_STR);
      }
    }

    $stmt->execute();

  　//SELECTの時とそれ以外の時で返す値を切り替え
　　//SELECTのときは配列$res内に1行ずつ結果を格納、それ以外はtrueを返す
　　if($mode == 1){

      foreach ($stmt as $row) {
        $res[] = $row;
      }

      return $res;
      
    }else{

      return true;
    }

  }


}

 ```

コード内にも書きましたが、型判断なのに、型ではなく数値かどうか？でチェックしていたので不具合が発生。
Seasar2(S2JDBC/SAStruts)においてupdate文をベタ書きしたい

現在DBと連携したWebアプリを作っています。jQueryUIのSortableを使っており、ソート後のリスト情報をDBに保存したいと思っています。 
環境はSeasar2(S2JDBC/SAStruts),Java,jsp、DBはPostgreSQLです。 

質問があるのですが、 
<br>
**Seasar2のサービスクラスでupdate文をベタ書きで書くにはどのように書けばいいでしょうか？** 
<br>

Seasar2のリファレンスやいろいろ調べているのですが、なかなか思うようなのが見つかりません。 

次のSQL文をベタ書きで書きたいです。（数字のところは取得する数値によって変わります。）

```sql:実現したいupdate文
UPDATE    task
SET    sort=1
WHERE    sort=4
```
<br>
現在このような書き方をしており、「int result=」の後が知りたいです。それ以外でも間違いがあればご指摘下さい。 

```java:Serviceクラス
public int updateSort(Long beforSort,Long afterSort)
    {
        String sql = "UPDATE task SET sort= "+afterSort +" WHERE sort= "+beforSort;
        int result = 
        return result;
    }
```
<br>
もしわかる方がいればお願いします。
Pythonでローカルでテストできる簡易SMTPサーバを立てる方法

## はじめに
開発やソフトウェアのインストールでメールを飛ばす部分をテストしたいっていうニーズは結構あったりします。

SMTPサーバが既にある場合はそれを使えば万事OKなんだけども、自前でサーバ立ち上げて色々やっている時にわざわざPostfixやSendmail立てるなんてのはやってられない!

## テスト用SMTPサーバを立てる
というわけで、サクっとテスト用のSMTPサーバを立ててしまおう!
Linuxなら以下のコードを叩くだけでOK。Windowsの場合でもPythonを入れれば動く。
Python素敵!

```shell
python -m smtpd -n -c DebuggingServer localhost:8025
```

ポート番号は他と競合しない番号であればよい。

## 注意点
テスト用のSMTPなので実際にメールが配信されるのではなく、ターミナル上に送信した内容が表示される。
日本語のメッセージを送信するとBase64でエンコードされているので、内容まで確認する場合はBase64でデコードすること。
ghq で管理している各リポジトリでコマンドを実行する ghq-foreach 書いた

[ghq](http://motemen.hatenablog.com/entry/2014/06/01/introducing-ghq) で取得したリポジトリ全部で `git pull --ff-only` したり `git gc` したりできたら嬉しいな、ということで嬉しくなるやつを書いた。

![ghq-foreach gc --aggressive](https://qiita-image-store.s3.amazonaws.com/0/735/6fee8742-2a15-6319-7ae2-c58b72ec4917.png)

`ghq-foreach <git-subcmd>` で任意のサブコマンドを各リポジトリに対して実行できる。 `-e` オプションをつけて `ghq-foreach -e <shell-cmd>` するとシェルコマンドも使える。

複数行のシェルコマンドなら `ghq-foreach -e sh -c 'cmd1; cmd2'` となる。

```bash:ghq-foreach.sh
#!/bin/bash

#
# ghq-foreach - executes git subcmd or shell cmd for each repo managed by ghq
#

EXEC=
QUIET=

say() {
    [[ -n "$QUIET" ]] && return
    if [[ -t 1 ]]; then
        printf '\e[1;34m%s\e[m\n' "$1"
    else
        printf '%s\n' "$1"
    fi
}

main() {
    if [[ "$1" = "-q" ]]; then
        QUIET=1
        shift
    fi
    if [[ "$1" = "-e" ]]; then
        EXEC=1
        shift
    fi

    if [[ "$#" -eq 0 ]]; then
        echo "usage: ghq-foreach [-q] (<git-cmd> | -e <shell-cmd>) [args...]" >&2
        echo "    -e  Execute shell command" >&2
        echo "    -q  Don't print each repository path" >&2
        return 1
    fi

    ghq list -p | while read -r repo; do
        (
            cd "$repo"
            say "> $repo"
            if [[ -n "$EXEC" ]]; then
                "$@"
            else
                git "$@"
            fi
        )
    done
}

main "$@"
```
hifiveでビューを扱う

Webアプリケーションはリリース時には特に問題がなくとも、更新が重なっていくと徐々に構造的、ロジック的に破綻することがよくあります。その最たるものとしてはUI部分ではないでしょうか。

HTMLは手軽に修正できる反面、適切な管理、運用を心がけないとあっという間にごちゃごちゃになってしまいます。

そこでhifiveではテンプレートエンジンを設けることでロジックとビューを分離して管理できるようになっています。今回はそんなビューを使ったサンプルを紹介します。

## まずは完成図

最初の表示です。

![](https://htmlhifive.files.wordpress.com/2014/06/hifive-02-01.png)

例えば5を入力して出力ボタンを押します。

![](https://htmlhifive.files.wordpress.com/2014/06/hifive-02-02.png)

このように奇数は赤、偶数は青で表示されます。

## ソースをみる

実際にこの処理を行っている部分のソースを見てみましょう（CoffeeScriptです）。

```
$ ->
  # コントローラの元となるオブジェクトを作成
  controller =
    __name: "NumListController"
    # 使用するテンプレートのパスを書く（HTMLファイルからのパスです）
    __templates: "./views/list.ejs"
    "#output click": ->
      # 入力値を取得
      to = $("#to").val()
      # 値がなければ処理を終了
      return  unless to
      # StringからNumberへ変換。変換に失敗したら終了
      try
        to = parseInt(to)
      catch e
        return
      # テンプレートに値を渡してHTML文字列を取得する
      numList = @view.get("list",
        num: to
      )
      # 結果を画面に出力
      $("#list").html numList
  # id="container"である要素にコントローラをバインド
  h5.core.controller "#container", controller
```

入力値は $("#to").val() で受け取っています。これはjQueryを使っていますので分かりやすいかと思います。大事なのは、 @view.get() の部分です。

hifiveではEJSをテンプレートエンジンとして用いています。EJSはEmbedded JavaScript の略で、Ruby on Rails標準のテンプレートエンジンであるerbに似た公文が使われています。

__templates のところでテンプレートを定義しており、@view.getでテンプレートを指定しています。この時のテンプレートlist.ejsは次のようになっています。

```
<script type="text/ejs" id="list">
[% for (var i = 1, len = num + 1; i < len; i++) { %]
<li>
	<span style="[%= 'color: ' + (i % 2 === 0 ? 'blue;': 'red;') %]">[%= i %]</span>
</li>
[% } %]
</script>
```

scriptタグのところにある id="list" がコントローラ側で呼び出す際の list に相当します。また、numというのはコントローラから与えられている変数になります。下のコードがテンプレート処理を行っているところになります。

```
numList = @view.get("list",
  num: to
)
```

このようにしてテンプレートとそこに渡す変数を定義することで更新に強いWebアプリケーション開発をサポートしています。この辺りの仕組みはサーバサイドの開発では一般的になっていますが、クライアントサイドではついおろそかにされがちです。しかしUI周りの安直な実装は後々の更新、機能追加の際に必ず負債になってきます。hifiveでは予めMVCの枠組みが決まっていますので、テンプレートエンジンに悩んだりすることもなく実装が進められるでしょう。

[デモ：hifive ビュー操作](http://www.htmlhifive.com/ja/tutorial/step5/step5.html)

[hifive - HTML5とスマートフォンのための開発プラットフォーム - hifive](http://www.htmlhifive.com/conts/web/view/Main/WebHome)
hifive 最初の一歩！Hello Worldを出してみる

あなたはJavaScriptで複雑難解な、保守できないコードに出くわしたことがありますか？私は何度もあります。個人のプロジェクトであればまだしも、業務で使われるコードでもそんなスパゲティなコードがたくさん存在します。

そんな現状に辟易しているプログラマな方にとって hifive はきっと一助になると思います。hifive はエンタープライズレベルの開発用途を踏まえたHTML5/JavaScriptフレームワークになります。多人数での開発も hifive を使うことでスムーズになるはずです。

そこでまず今回は hifive を使ってHello Worldを表示させるまでを行ってみたいと思います。コードは全て [GitHub にアップされています](https://github.com/moongift/hifive-examples)ので不明点があればご覧ください。

## まずは完成図

最初に完成図から。

![最初の表示](https://htmlhifive.files.wordpress.com/2014/06/hifive-01-01.png)

ボタンを押すとアラートが出ます。

![Hello, World!](https://htmlhifive.files.wordpress.com/2014/06/hifive-01-02.png)

簡単ですね。ではコードを見ていきます。

## HTMLファイル

HTMLファイルは次のようになっています（必要ない部分は除いています）。

```
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <link href="//code.htmlhifive.com/h5.css" rel="stylesheet">
  </head>
  <body>
    <div id="container">
      <input type="button" id="btn" value="Hello World!" />
    </div>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="javascripts/hello.js"></script>
    <script src="//code.htmlhifive.com/ejs-h5mod.js"></script>
    <script src="//code.htmlhifive.com/h5.js"></script>
  </body>
</html>
```

スタイルシートファイル、JavaScriptファイルは外部から取得しています。実際に書いたのはhello.jsだけです。hifiveの本体、モジュールになるのがh5.js/ejs-h5mod.jsです。jQueryとも連携しますので、これまでの使い慣れた開発スタイルが維持できます。そこも大きなメリットではないでしょうか。

## JavaScriptファイル

では実際に処理を行っているコードを見てみましょう。CoffeeScriptから生成していますので javascripts/hello.coffee を見てみます。

```
$ ->
  helloWorldController = 
    __name: 'HelloWorldController'
    '#btn click': ->
      alert 'Hello, World!'
  h5.core.controller '#container', helloWorldController
```

コードはこれだけです。 __name はコントローラの名前です。実際の処理としては **'#btn click'** がアクションの監視を行っています。#btnがクリックされたタイミングで指定された処理を行っている訳です。

そして作成したコントローラを **h5.core.controller** に登録します。その際どのDOM以下の監視を行うかの指定を行っています。このサンプルの場合は **#container** になります。

例えばこの処理を素のjQueryだけで書く場合は次のようになるでしょう。

```
$("#container #btn").on 'click', (e) ->
  alert 'Hello, World!'
```
1つだけのイベントであればjQueryのが簡単に見えますが、これが数十のイベントを管理したり、相互作用するようになれば話は全く違ってきます。さらに複数人で開発したりすれば…jQueryだけでは恐ろしいことになるでしょう。

## サンプルの動かし方

最後に[GitHub にアップされているコード](https://github.com/moongift/hifive-examples)の試し方です。hifiveはHTML5/JavaScriptフレームワークになりますのでサーバサイドは不要です。ただしローカルにWebサーバがある方が確認しやすいと思います。例えば筆者のMac OSXなどでPythonが入っている場合は次のように実行します。

```
$ wget https://github.com/moongift/hifive-examples/archive/master.zip
$ unzip master.zip
$ cd hifive-examples-master
$ python -m SimpleHTTPServer
$ $ open http://localhost:8000/
```

Windowsでは同様にPythonを使ったり、 [QuickShare](http://houbysoft.com/program/QuickShare/) などを使うと手軽にHTTPDサーバが立てられるようです。またはIISなどを使っても良いかと思います。

----

今回はこれにて終わりです。hifiveの世界にようこそ、これからhifiveのさらなる使い方、魅力をどんどんお伝えします！

[hifive - HTML5とスマートフォンのための開発プラットフォーム - hifive](http://www.htmlhifive.com/)
ssh コマンドでパスワード認証を指定して接続するオプション

```bash
ssh username@ipaddress -o PreferredAuthentications=password
```

# 参考

[sshで接続時の「Too many authentication failures for username」エラーの対処法 - ブログ三郎](http://d.hatena.ne.jp/kou_i/20101121/1290352589)
JavaScript/hifiveの理解度チェックしませんか？

JavaScriptの良いところはWebブラウザだけで実行できることです。さらに最近のブラウザでは開発ツールも充実しており、コンソールを使うなどしてJavaScriptが簡単に実行できます。

そこでhifiveを使って作られたのが[理解度確認クイズ](http://www.htmlhifive.com/ja/study-room/quiz/index.html)です。hifiveのみならず、jQueryやCSSセレクターなどをWebブラウザ上で実行、結果を確認できます。

## クイズの種類

用意しているテストは執筆時点では以下の8種類です。

- セレクタ
- 要素の生成・追加
- 要素の編集
- 要素の編集(スタイル)
- 要素の削除
- jQueryその他
- イベントハンドラ
- 非同期処理

![](https://htmlhifive.files.wordpress.com/2014/12/questions.png)

例えばセレクタのテストを選択します。

![](https://htmlhifive.files.wordpress.com/2014/12/selector1.png)

太字になっている部分を選択を書く問題です。これは難しくないでしょう。

![](https://htmlhifive.files.wordpress.com/2014/12/selector1-answer.png)

答え合わせを押すと、実際に実行して結果を確認できます。問題は進むにつれて難しくなっていきます。最後に全体の結果が出ます。

![](https://htmlhifive.files.wordpress.com/2014/12/answers.png)

さらにhifiveの学習にも使えます。

![](https://htmlhifive.files.wordpress.com/2014/12/hifive-test.png)

この場合はJavaScriptのコードを書いてテスト実行できます。

![](https://htmlhifive.files.wordpress.com/2014/12/hifive-answer.png)

----

Webアプリケーションを開発するための基礎知識が多いので、ぜひチャレンジしてみてください。

[理解度確認クイズ](http://www.htmlhifive.com/ja/study-room/quiz/index.html)
[ionic入門] その1: プロジェクトを作って、localhost や ios simulator や herokuにあげてみる

API Serverから、JSONを受け取って表示していくシステム、web, ios, androidなんだっていいから作りたかったので、ハイブリッド開発が出来るionicを使ってみました。

以下自分用作業メモです。

![Screen Shot 2015-04-14 at 14.33.20.png](https://qiita-image-store.s3.amazonaws.com/0/18705/5591aee4-6c7b-1fce-b058-a38b18231c77.png)


とりあえず、localhost, ios simulator, herokuでアプリを確認出来るところまでやっていみました。
簡単すぎたので、あんまり書くことありません。。。。
リンクとスクショを貼っていきます。

# Condition

* Yosemite

# Install

read: http://ionicframework.com/getting-started/

```js
$ npm install -g cordova ionic
```

# Select Project Template

read: http://ionicframework.com/getting-started/

![Screen Shot 2015-04-14 at 14.34.04.png](https://qiita-image-store.s3.amazonaws.com/0/18705/ccc13653-8600-2d8c-0569-c2d539c3d317.png)

```js
$ ionic start myApp sidemenu
```

# run

## ionic command

![Screen Shot 2015-04-14 at 14.30.08.png](https://qiita-image-store.s3.amazonaws.com/0/18705/7d7b72ee-3af7-aefa-c303-44ec52a1ce3f.png)

## localhost

```js
$ ionic serve
```

![Screen Shot 2015-04-14 at 14.29.47.png](https://qiita-image-store.s3.amazonaws.com/0/18705/ffdd9f16-1cb5-8fee-8327-2afa942796c3.png)

![Screen Shot 2015-04-14 at 14.30.15.png](https://qiita-image-store.s3.amazonaws.com/0/18705/4cc00e4c-9998-4269-cd42-d81b810aa8c9.png)

![Screen Shot 2015-04-14 at 14.29.59.png](https://qiita-image-store.s3.amazonaws.com/0/18705/b565b268-3ac1-6d93-f5d1-1ab5e82de79c.png)

## ios simulator

```js
$ npm install -g ios-sim
$ ionic platform add ios
$ ionic build ios
$ ionic emulate ios
```

![Screen Shot 2015-04-14 at 15.02.30.png](https://qiita-image-store.s3.amazonaws.com/0/18705/a0059482-fa8a-e5a6-cc24-1572ac0d7266.png)


## heroku

read: http://blog.ionic.io/heroku-ionic/

![Screen Shot 2015-04-14 at 14.40.40.png](https://qiita-image-store.s3.amazonaws.com/0/18705/374c1947-1a16-a75f-032d-4957cb3497e7.png)

![Screen Shot 2015-04-14 at 14.21.11.png](https://qiita-image-store.s3.amazonaws.com/0/18705/ad85de91-ceec-ee63-262f-279bae764a6b.png)

### package.json

```js
"dependencies": {
    "express": "4.8.4", <--- add this line
```

### web.js

```js
var express = require('express');
var app = express();
 
app.use(express.static(__dirname + "/www"));
app.listen(process.env.PORT || 5000);
```

### Procfile

```js
web: node web.js
```

### heroku dyno

```js
$ heroku ps:scale web=1
```

### deploy

```js
$ git push heroku master
```

### check

```js
http://hogehoge.herokuapp.com
```

# references

* http://ionicframework.com/getting-started/
* http://blog.ionic.io/heroku-ionic/
* http://forum.ionicframework.com/t/has-anyone-deployed-an-ionic-app-to-heroku/8284
ESP8266とNodeMCUをLuaでWi-Fi設定とLチカする


NodeMCUのファームウェアをアップロードしたESP8266をホストマシンとUSB-TTLシリアル接続します。シリアル通信はCoolTermから操作します。ArduinoをESP8266への3.3Vの電源供給用です。NodeMCUを使うとESP8266単体でLuaを使ったハードウェア制御ができるようになります。

## Wi-Fiの設定

最初にアクセスポイントの設定をします。NodMCUをファームウェアにしたESP8266は既存の無線LANの子機として動作させます。`wifi.sta.config`にはアクセスポイントのSSIDとパスワードを指定します。DHCPからIPアドレスが取得できました。

```lua
> wifi.setmode(wifi.STATION)
> wifi.sta.config("{SSID}","{Password}")
> = wifi.sta.status()
5 GOT IP
> = wifi.sta.getip()
192.168.1.16	255.255.255.0	192.168.1.1
> 
```

## HTTPクライアント

次にNodeMCUをHTTPクライアントとして使ってみます。Node.jsのようにイベント駆動なコールバックを定義して受信したpayloadを出力します。この例ではNodeMCUのホームページのHTMLを取得します。

``` lua
> conn = net.createConnection(net.TCP, false) 
> conn:on("receive", function(conn, payload) print(payload) end)
> conn:connect(80,"121.41.33.127")
> conn:send("GET / HTTP/1.1\r\nHost: www.nod`mcu.com\r\n"
>> .."Connection: keep-alive\r\nAccept: */*\r\n\r\n")
```

## Lチカ

配線図のようにLEDをESP8266のGPIO0につなぎます。USB-TTLシリアル変換モジュールのVCCが5Vなので、Arduino Unoを3.3V電源供給用に使います。

![ESP8366-led.png](https://qiita-image-store.s3.amazonaws.com/0/43745/9ef2b47b-371c-da9a-aaad-29cb4e9abf0c.png)

ESP8266のGPIO[ピンアサイン](https://github.com/nodemcu/nodemcu-firmware/wiki/nodemcu_api_en#new_gpio_map)を見るとGPIO0は`Pin 3`になります。CoolTermから以下のように実行します。Arduinoと似た感じでHIGHでLEDが点灯し、LOWで消灯します。

```lua
> pin = 3
> gpio.mode(pin,gpio.OUTPUT)
> gpio.write(pin,gpio.HIGH)
> gpio.write(pin,gpio.LOW)
```

![nodemcu-led.png](https://qiita-image-store.s3.amazonaws.com/0/43745/bb08a507-0f0d-4ee0-3a41-a46edee263ea.png)
ShinobiLayer: SoftLayerにおけるWindows Serverのハードニング(3)

http://qiita.com/testnin2/items/50e1ea0281c21b8cc4e4 の続き

#7. 接続元IPを制限する
もし接続元IPが分かっているのであれば、Remote Dektopなどの接続元を制限して特定のPublic IPアドレスからのみ接続できるようにしておくと、より安全になります。もちろん、SoftLayerのHardware Firewallを購入されている方は、Hardware Firewall側で制限する方が運用的には楽だと思います。

* Remote DesktopのPublic側を制限する。
Control Panel -> System and Security -> Windows Firewall -> Advanced SettingsにてInbound RuleにおけるRemote Desktop(**Public**/**TCP**)を右クリック。
![IPrestrict_TCP_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/7c6cf7f6-b608-a58d-111e-0d7b3b009a3e.jpeg)

* 限定アクセスするIPを指定する。(サブネットマスクを指定したり、レンジを指定することも可能）
![IPrestrict_TCP_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/74794683-a499-8336-7938-3ba904526b03.jpeg)
* 同様に、Remote Desktop(**Public**/**UDP**)も設定する。TCP/UDPの両方の設定が必要っぽい。


#8. Remote Desktopのポート番号を変更する（手順4が前提）

前回、Remote DesktopをPrivate側から接続するという運用を前提に、Public側のポートを全て防ぐ方法を紹介しました。しかし、運用や利便性を鑑みると、どうしてもRemote Desktopをpublic側から繋げたいんだけど、接続元を制限することもできない、というケースもあるかもしれません（できたら、全部Public側は遮断して、Private経由で接続した方が望ましいのですが。。。）
**接続元IPの制限をせずにPublic側から接続したい場合は、SoftLayerのHardware Firewallを仮に使っていたとしても、Remote Desktopのデフォルトのポート番号3389以外の番号に変更することを強く推奨します。なぜならば、Firewallは3389番へのアクセスであれば、正規アクセスであっても不正アクセスであっても区別できませんので、Firewallの有無に関わらず、無差別に攻撃を受ける可能性があるからです。。。** もちろん、Public側の接続元IPを制限した上で、ポート番号も変更すると、よりセキュアになるでしょう。

下記は、3389 -> 33389に変更することを想定した手順を紹介します。

1. 33389のInbound通信を許可する。**TCP/UDPの両方が必要で必要なので、UDP側はStep 2で実施。**
Control Panel -> System and Security -> Windows Firewall -> Advanced SettingsのInboundにて、33389/TCPのポートを開く。
![PortChange01.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/bf57acda-e05e-d3b2-f748-4365dbf82e28.jpeg)
![PortChange02.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/a709df0d-ae47-b19d-3552-b3cb35d3e915.jpeg)
![PortChange03.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/764451ad-136d-706f-d5d5-6302ccaeafb1.jpeg)
![PortChange04.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/6279bb0d-767a-ed87-bb8c-931e7631b8e2.jpeg)
![PortChange05_new.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/11d5cd85-1820-6edb-cc86-9520aca4ab1e.jpeg)
![PortChange06.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/c47de6b6-c77d-16b7-2a25-b159c422f6fd.jpeg)

2. 同様にUDP/33389も追加する
![PortChange03_UDP.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/73f4ff01-edb6-7abe-645d-8b3f6e41a55a.jpeg)

3. レジストリ変数にて、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-TcpにおけるPortNumberを3389 -> 33389に変更。数値入力時には**Dedimal**にしておくと良い。
![PortChange08.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/4362803e-2d2c-f1be-22dd-a8f28ab4148d.jpeg)
4. OS再起動
5. リモートデスクトップでは、以後以下のようにport 33389を指定する。
![PortChange09.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/f98a9f6a-c074-9c9a-493f-0f10ca50b857.jpeg)
Asset CatalogでPDF形式を使ったらいろいろ問題が出た


新規アプリを１本作るにあたってアセットカタログ＋PDFの組み合わせで開発を行いました。
その際いくつかトラブルに見舞われましたので、その辺をまとめておこうかと思います。

間違いやもっと良い方法などありましたら、ご指摘頂ければ幸いです。
（Xcode6.3にて確認）

## 基礎知識

* Xcode6からAssset CatalogでPNG形式だけでなく、PDF形式がサポートされるようになりました。
* PNGの場合は非Retina、@2x、@3xなど解像度別の画像を用意する必要がありましたが、PDFなら1ファイルで全解像度に対応することができます。
* 用紙（白い背景）は透過されます。
* コンパイルの時点でPDF形式はラスタライズされます。
 * ラスタライズ後の形式は公表されていないと思いますが、おそらくPNG形式と同等のものだと思われます。
 * ラスタライズされるため、実行時に画像をロードをして拡大しても綺麗には描画されません。

## トラブル１　色がおかしい

デザイナーもプログラマー（私）もほとんどPDFの知識が無く、とりあえずイラレで作ってもらったPDFをAsset Catalogに突っ込んだら、まずはとにかく色がおかしい問題に出くわしました。

先が思いやられます。


例）
![CMYK.png](https://qiita-image-store.s3.amazonaws.com/0/31347/9d2b19e9-dc57-6d87-693d-fdb7bb5ce220.png "CMYK.png")

４つの画像の色は微妙にどれもRGB値は違うのですが、アプリ実行時画面だけ劇的に違うのが見て判るかと思います。


で、これはどうやらイラレの「ドキュメントのカラーモード」がCMYKになっていると起こるようで、RGBにしたところ、期待した結果（に近いもの）になりました。
（他にも書き出し時の色プロファイルを変えると影響するようですがよくわかりません。）

CMYKではなくRGBにしたもの↓
![RGB.png](https://qiita-image-store.s3.amazonaws.com/0/31347/11302fc0-b676-9200-8a9c-9a3b3b45e987.png "RGB.png")

だいぶ近くなりましたね。


しかしこうなってくると、デザイナーは書き出したPDFをiPadなどの端末上で見て確認する必要性が（以前よりも）高くなります。
（実際はRetinaと非Retinaで発色がかなり違うのと、端末の明るさ設定によっても見え方が変わってきますので、どこかで落とし所を付ける必要があるかなと思われます。）

iPadなどの端末でPDFを見る方法はいくつかあると思いますので省略しますが、作業工程上楽なものを探してみてください。
社内で専用アプリを作るのもアリかもしれませんね。
（背景色変えられる＆拡大縮小できると良いです）

## トラブル２　うまく半透明にならない

もらったPDFを実機で実行したのに半透明らしき個所がうまく透過しない事案が発生。
![乗算.png](https://qiita-image-store.s3.amazonaws.com/0/31347/146a546a-da08-30be-3546-6990f1760aab.png "乗算.png")

これはデザイナーが半透明っぽいオブジェクトの描画モードを「乗算」にしていた事が原因のようでした。
![スクリーンショット 2015-04-14 17.25.18.png](https://qiita-image-store.s3.amazonaws.com/0/31347/254394b7-d5f9-9b7e-2873-ca5195260049.png "スクリーンショット 2015-04-14 17.25.18.png")


たしかに最終的に32bitPNGっぽくラスタライズされると思えば、そういった乗算のような合成方法は無効になってしまうのも頷けます。

透過しない部分では乗算などを使ってもらっても構いませんが、半透明になってしまうような部分では描画モードを「通常」でなんとかしてもらう事で回避しました。
![通常.png](https://qiita-image-store.s3.amazonaws.com/0/31347/83abe800-dd3c-0180-9f23-227cfea38c21.png "通常.png")

期待通り透過しますね。
こういった挙動はデザイナーさんに予め伝えておくとスムーズですね。

## トラブル３　端が欠ける

手元で再現しないので、もしかしたら改善されているのかもしれませんが、用紙ギリギリまで図形が描かれるようなPDF（例えば円形のデザインなど）は、ラスタライズの際に端が微妙に欠けてしまう事がありました。

これは地味な方法ではありますが、1ピクセル分余白を入れてあげる事で回避しました。

## トラブル４　書き出しが面倒くさい

トラブルではありませんが、イラレで一枚のキャンバスにいろいろなアイコンなどを配置して、それられに名前をつけて一括でPDF形式で保存する方法がまだ無いそうです(PNGでは可能)。

例えば色味などの修正が入ったときに、一個一個手動で書き出し直すのが面倒だったようで、プログラマーが楽だと思って提案したPDF形式がデザイナーにとっては逆に負担になっていたりする可能性もなきにしもあらずということで、その辺の手順について一度デザイナーと確認しておいた方が良いかと思われます。

アドオン（スクリプト？）などを探せばもしかしたら可能なのかもしれませんが、イラレ公式で対応してほしいですね。
LifecycleHookの準備完了通知をインスタンス自身にさせたい

EC2のオートスケーリングのライフサイクル管理をやってみたいとは前から思ってるんだが…。

- SQSでPending:Waitの通知を受けてプロビジョニングして完了通知をするっちう流れの仕組み上どうしてもSQSをポーリングする人が欲しくなるから中々面倒なのよね。
- その為に1個インスタンス立てるのもアホらしいし、EC2自身にSQSをポーリングさせると復数同時にスケールアウトしたときに自分以外のインスタンス用のメッセージを受け取っちゃうことも考える必要あったりとかやっぱし何かと面倒。
- LambdaがSQS受けられるようになったからそいつにPending:Waitの受信をさせれば良いんじゃね？
- プロビジョニング自体はEC2のuserdataで自分でやらせてるからその終了タイミングで自分で通知させたいんだよな。
- あれ？EC2インスタンスの方で`LifecycleActionToken`の値知らないと通知出来なくね？これLambda側は知ってるけどどうやってEC2に伝えよう。
- Lambdaが受けた通知内容をEC2に教えたいんだけどそのためだけにDynamoDBとかS3とか別のDBに一時保存するとコストもかかるし面倒だよな。できるだけ余計なリソース作らずに完結させたい。
- Lambdaで受けた`LifecycleActionToken`を対象のEC2インスタンスにタグとして付けとけばストレージ不要で値渡せるんじゃね？
- EC2はセットアップ終わったら自分のインスタンスに付いてるタグから`LifecycleActionToken`の値を取得してCompleteLifecycleActionで成否を自分で通知すればよさそう！

てことで、この構成だと最小限のリソースで管理不要でライフサイクルフックが利用できそうだなってことであとで試すメモ。
Facebookで友人やページのIDをサクッと調べるTips


##はじめに
**FacebookのAPIを使おうとするとIDってよく使うと思います。**

サクッとIDを調べる方法の紹介をします。
(2015年4月時点)

## まずはユーザー名を調べる
idはこのURLの部分です。

![](http://i.gyazo.com/1e1d5d3780e70c1965454d01699ca458.png)

![](https://pbs.twimg.com/profile_images/585749828308598784/rIRZWGBC_reasonably_small.jpg)

今回は[弊社マネージャーの中水さん](http://liginc.co.jp/member/member_detail?user=nakamizu)のFacebookを元に解説します。

`https://www.facebook.com/toshihisa.nakamizu`このURLの`toshihisa.nakamizu`の部分がfacebookの **ユーザー名**になりますね。

## IDを調べる

`http://graph.facebook.com/*********`このURLの*******の部分に先ほどのユーザ名を入れてブラウザで確認するだけです。

http://graph.facebook.com/toshihisa.nakamizu

アクセスすると以下のようなJSONデータが出力されます。

![](http://i.gyazo.com/594a5dec27148e104ffd62dfd9ce43d8.png)

```
{
id: "100001606903992",
first_name: "利久",
gender: "male",
last_name: "中水",
link: "https://www.facebook.com/toshihisa.nakamizu",
locale: "ja_JP",
name: "中水 利久",
username: "toshihisa.nakamizu"
}
```

このidキーの部分がfacebookのIDになります。
今回で言えば、100001606903992がそうですね。

### Facebookページでも

https://www.facebook.com/nobiserver
例えばこのサイトの場合は

http://graph.facebook.com/nobiserver
として調べれば

```
{
id: "753405358113275",
about: "株式会社LIGで働く、エンジニア菅原のびすけは、自身の思うプロの形として、 カラダにサーバーを埋め込む。",
can_post: false,
category: "Blogger",
checkins: 0,
cover: {
cover_id: 753417498112061,
offset_x: 0,
offset_y: 57,
source: "https://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-xap1/v/t1.0-9/11058413_753417498112061_2392954531444152009_n.jpg?oh=2776ed477c2e1d4785dba508500eba89&oe=5599D770&__gda__=1437598124_227cb0970acb3411020281ad318d2157",
id: "753417498112061"
},
has_added_app: false,
is_community_page: false,
is_published: true,
likes: 82,
link: "https://www.facebook.com/nobiserver",
name: "Backend 〜サーバーと一体化した男の話〜",
talking_about_count: 66,
username: "nobiserver",
website: "http://liginc.co.jp",
were_here_count: 0
}
```

という感じで情報を取得できます。

ぜひご活用ください :)
nyagosでghqとgh-openをpecoってつかいたかった

pecoには、表示結果をCtrl+Spaceで複数選択できるという機能があります。
複数のリポジトリを一気にブラウザで参照したい時に不便だったので例によってnyagosのaliasでつくりました。

~~~lua
alias {
  phq = function (arg)
    local arg = string.format("%s", arg[1])
    local str = nyagos.eval("ghq list -p | peco")
    if (str ~= nil ) then
      if arg == "open" then
        for line in string.gmatch(str, '[%a|%p]+[\n]*') do
          nyagos.exec("gh-open "..'"'..chomp(line)..'"')
        end
      else
        nyagos.exec("cd ".. '"' ..chomp(str).. '"')
      end
    end
  end
}

function chomp(src)
    return string.gsub(src, "[\r\n]+$", "")
end
~~~


# 使い方
nyagos.dにphq.luaを放り込むか、.nyagosに記述します。

~~~
C:>phq
~~~
ghq getしてきたローカルリポジトリの一覧を表示します。

~~~
C:>phq open
~~~
gh-openを繰り返し行うので、ctrl+spaceで複数行を渡しても開いてくれます。

#謝辞
[nyagos](https://github.com/zetamatta/nyagos)
[ghq](https://github.com/motemen/ghq)
[gh-open](https://github.com/typester/gh-open)
[peco](https://github.com/peco/peco)
cocos2d−x v3.2、cocostudio1.6連携

便利なユーティリティー

名前を指定して、ノードを検索する。
正規表現により文字列置換しての検索や、入れ子になった子ノードの検索まで行える。
"//"
"[[:digit:]]"
など、その他ある。
```
dynamic_cast<ui::Widget*>( utils::findChildren(*this, "//PartyBoostFrameImage").front() );

これを使って、

cocostudio側で、オブジェクトに名前をつけて、これを検索する。
[Ruby基礎学習] パターンの表示①

# はじめに
プログラミングなるものに挑戦してみようと、色々なプログラミング言語の本を本屋で何冊か見てみると、Rubyという言語がなんとなく好みだったのでRubyにした。
基礎本をとりあえず読んでみた。
分岐や繰り返しの連続っぽいので読む分には分からない部分をググりつつ見ればわかるが、いざ書こうとしてみると全然手が進まない。
英文はなんとなく意味がわかるが、喋れはしないのに似てるなと思った。
試行錯誤しながら書いてみることが大事なんだろうなと思ったので問題をやってみることにした。

# 問題
以下を表示する。

```
#####
####
###
##
#
```

# 解答
最初に思いついたのは以下だった。
でもなんだかこれだけのために変数を外側に宣言するのはイマイチな気がした。
他の言語と見てみると、`count -= 1`という部分は`count--`みたいな書き方ができるみたいだけど、Rubyはできないらしい。
素人目には`count -= 1`も`count--`もcountから1引いてるだけだから一緒なんじゃないかなと思えるけれど、どう違うんだろう。

```rb
count = 5
5.times do
  print("#" * count + "¥n")
  count -= 1
end
```

次にこうやってみたけれど、外側は特にfor文である必要もないなと思った。
`5..1`ってすれば数字を減らしてくれるかなと思ったけどそんなことはなかった。
でもエラーは出ないし、無限ループが発生することもなかったのでどういう解釈されているんだろう？と気になった。

```rb
for i in 1..5
  for j in 5..1
    print("#" * j)
  end
  print("¥n")
end
```

調べてみたら、`upto`とか`downto`とかいうのがあるらしい。
使ってみたら3行になった。

```rb
5.downto(1).do |i|
  print("#" * i + "¥n")
end
```

1行でも書けるみたいなので上のを1行にしてみた。
すっきりしたなー！と思った。

```rb
5.downto(1){ |i| print("#" * i + "¥n") }
```

今のところ思いついている書き方は以上です。

# 問題の出典
* プログラマの考え方がおもしろいほど身につく本　問題解決能力を鍛えよう！
「その改善本当は意味ないかもしれないですよ？」- Mixpanelでしっかり行うABテスト


https://mixpanel.com/


## 背景

- 一個先の効果じゃなくて、最終的な効果が見たい
- 可視化されてない、分析に時間がかかるABテストは使われなくなる

これらの問題を解決するために、MixpanelでABテストの枠組みを作ると幸せになれるかもしれないというお話。

## WebUI上でもサーバー上でもモバイルアプリでも

実は、いろんなメトリクスは、Javascriptやアプリ側じゃなくてサーバーサイドのリクエストでトラックしたほうが楽だよねみたいなことも多いので、サーバーサイド側のライブラリが充実しているのが、Mixpanelのありがたいところ。
ココらへんがOptimizelyやGoogle Analyticsよりも優れている。（どっちも非公式のライブラリ使うとか、無理やり頑張る方法はあるけど、あまりイケてない。）

* WebUI
 - [JavaScript](https://mixpanel.com/help/reference/javascript)
* モバイル
 - [iOS](https://mixpanel.com/help/reference/ios)
 - [Android](https://mixpanel.com/help/reference/android)
* サーバーサイド
 - [Ruby](https://mixpanel.com/help/reference/ruby)
 - [Python](https://mixpanel.com/help/reference/python)
 - [PHP](https://mixpanel.com/help/reference/php)
 - [Java](https://mixpanel.com/help/reference/java)

他にもActionScript用のがある他、HTTP経由でアクセスできるものもあるので、他の言語でも対応できそう


## Mixpanelで行うたった一つのこと

Mixpanelで行うべきことはたった一つしか無い。それは、

**イベントを投げる**

こと

- イベントを4,5個投げることでファネルを作ることが出来る
- イベントを送る時に付加情報(property)をつけることができる
 - 例えば画像のアップロードというイベントにpng,jpgなどのファイルタイプをつけるなど


### イベントを投げる例

```js:javascript
mixpanel.track("Video played", {
    "Video length": 213,
    "id": "hY7gQr0"
});
```

https://mixpanel.com/help/reference/tracking-an-event

### ユーザーのプロフィールをつける

```js:javascript
mixpanel.identify("13487");　// user_id
mixpanel.people.set({
    "$first_name": "Joe",
    "$last_name": "Doe",
    "$created": "2013-04-01T09:02:00",
    "$email": "joe.doe@example.com",
    "age": 24,
    "gender": "Male"
});
```

\$から始まる4種類のキーの値は、Mixpanelの中で特別な意味を持っている。その他のものは自由につけてよく、その時\$からはじめてはいけない。
値としては、string, integer, date, listが使える

https://mixpanel.com/help/reference/creating-a-profile


## 投げたイベントをABテストに使う

基本的には、これだけのことしかできないのだが、これだけでFunnel分析やRetentionの分析が出来るのがMixpanelの良いところ。
ここでは、Funnelを使ってABテストをする例をみせる。

まずはMixpanelのFunnel画面の結果から示そう。

### 全体

![mixpanel_abtest.png](https://qiita-image-store.s3.amazonaws.com/0/6664/8489a602-0a0b-6693-5b78-0bb909fba5b8.png "mixpanel_abtest.png")

### バージョンA(ベース)

![var0.png](https://qiita-image-store.s3.amazonaws.com/0/6664/dd40d827-d557-a91a-dc44-e12ba9f2c94a.png "var0.png")

### バージョンB(改善後)

![var1.png](https://qiita-image-store.s3.amazonaws.com/0/6664/55e61320-84fa-7070-077b-26cba1cb75f5.png "var1.png")

### 結果解釈

いわゆる一般的に行われるABテストだと、最初の2つの棒の比較をしてしまい、+47ポイント改善したで終わってしまう。しかし、実際は本当のゴール地点ではほとんど差が出なかったという結論がでている。

例えば、この改善は、これはフォームで入力項目を少なくしたり、詳細な説明を省いたりする行動をとるような変更をしたと思っていただきたい。

そういうものは確かにそのフォームの通過率は上げるけれど、結局のところ、その先で躓くだけで、最終到達点では結果がほぼ変わらない(見た目ちょっと悪くなっているが有意ではない)という結論になっている。

もちろん、最初の通過率を上げて、次の通過率を上げてと改善を続けていけば最終到達地点の数値も上がるかもしれないし、2個目まで通過すれば、別の施策を打てる可能性もあるので、Bの改善が無駄ではないかもしれない。
だが、ここで改善をやめてしまっては効果がなかったことがすぐに分かる。

### このABテストのやり方

例えば、MixPanelは X->Y->Z とフローがあった時に

- ユーザごとにUniqueな結果で表示される
- Yを飛ばしてX->Z、Xを通ってなくてZのみ行われているといったものはZにカウントされない

といった特性がある。(cf. https://mixpanel.com/help/questions/articles/how-are-funnels-calculated )


なので、最初のXのパートのみでABテストのどちらだったか(ここではvariationを使用)を`mixpanel.track`の2引数目に入れておけばこのファネルを描くことが出来る。
これはJavascript側でやってもいいし、サーバー側でやっても良い。例えば、Ruby on Railsだったら、createアクション等Controllerで処理すると自然。

もちろんXをのぞいた他のポイントで見たい時もあるので、可能であれば全てのイベントを送るポイントでABのどちらだったかを送っておくとよい。
SwiftでnavigationControllerに画面遷移する際のメモ

[自分用メモです]
navigationControllerを挟んでmodalの遷移をしようと思ったのですが、エラーが出てしまいました。
当然のことでしたが、遷移先をnavigationController指定にしないとしないといけなかったんですね...

```
    let nav = segue.destinationViewController as UINavigationController
    let secondView = nav.topViewController as SecondViewController
```
SaaS型の仮想スイッチ「Pertino」で、L2オーバーレイネットワークを構築してみた

# はじめに
[Pertino](https://pertino.com/)という便利なネットワークサービスをみつけたので、そのメモ書きです。_φ(･_･　

Webからユーザー登録し、デバイスにPertino仮想スイッチをインストールするだけで、簡単にL2オーバーレイネットワークを作ることができます。例えば下記のような構成も **10分程度** できますので、是非試してみてください。

ネットワーク構成
![ 2015-04-14 11.16.57.png](https://qiita-image-store.s3.amazonaws.com/0/42406/d01caa16-5b84-60e7-b88a-5597f3725d62.png)

# ユーザー登録
+ [Pertino](https://pertino.com/)より、Sing up
+ Start your free planを選択（無料で３つのデバイスまで登録できるようです。）
+ 個人情報をいれて、Register

>ここまで１分

# デバイスにPertinoの仮想スイッチをインストール
+ [サポートされているデバイス](https://support.pertino.com/hc/en-us/articles/200488469-Supported-Devices)
Windows, Mac, Ubuntu, CentOS, Docker, iOS, Androidあたりには対応しているようです。
+ [各種ダウンロード](http://pertino.com/download)
+ [Linuxへのインストール方法](https://support.pertino.com/hc/en-us/articles/201116845-Pertino-Linux-installation-and-configuration-guide)
+ MacやWindowsはインストーラー実行するだけ

>自宅のMac, Ubuntu on **[DigitalOcean](https://www.digitalocean.com/?refcode=e4ecde3969e0)** (Singapore), Ubuntu on **[SoftLayer](http://www.softlayer.com)** (San Jose)にインストールのに、全部合わせて１分もかからない！
>DigitalOCeanでのサーバーデプロイは1分以内
>SoftLayerでのサーバーデプロイも最近速く2分でした。

サーバーやデバイスに仮想スイッチをインスールすると、[Pertino](https://pertino.com/)のWebからこのように見えます。

ダッシュボード
![ 2015-04-14 11.10.09.png](https://qiita-image-store.s3.amazonaws.com/0/42406/9899963f-7fea-7cd6-3434-760acae42d91.png)  
各デバイスの詳細
![ 2015-04-14 11.10.44.png](https://qiita-image-store.s3.amazonaws.com/0/42406/88b1e7a9-1515-08be-1955-0823bf18d5ed.png)

>10分程度で、自宅横浜のMBAと、DigitalOcean（シンガポール）上のUbuntuと、SoftLayer（サンノゼ）上のUbuntuで、仮想的なLANを構成することができました！

詳細は、時間があればあとで。