OmniAICreator/Qiita-1.07M huggingface dataset:
バンディットアルゴリズムことはじめ

巷で話題のバンディットアルゴリズムを、
ネット上の素晴らしい資料を参考にしたり引用したりしながら、
おおまかなイメージがつかめるようにまとめていきます。


# 導入：タカシ君のお年玉

20XX年、元旦。
タカシ君は、この冬休みずっと、コインに念を送って表を出す練習に励んできました。
というのも、

- コインが5種類(A,B,C,D,E)あるが、どうやらそれぞれ形が違うようで、表が出る確率が違う（が変化はしない）
- 「1回ごとにコインを1つ選んで、50回コイン投げていいよ」と両親に言われている
- 表が出た回数×1000円をお年玉としてもらえる

ので、なんとかして表が出る回数を最大にしたいのです。
冗談はさておき、タカシ君は、どういう方針でコインを選ぶのがいいのでしょうか。

- 同じコインを投げ続ける？「コインB、君に決めた！」
- 全てのコインを均等に投げる？「平等にコインAを10回、Bを10回、...」
- これまで表が出たコインを多めに引く？「コインCは表が出やすそう」


# 根底にある考え

複数の選択肢から、最終的に一つを選ぶとき、

- 選択肢ごとに『良さ』の度合いを何らかの方法で数値化できる（事前には分からないけど）
- 試行回数が限られている

場合に

- 「ダメな選択肢をできる限り選ばずに、ベストな選択肢を選びたい」


# 問題の例：日常生活

- ランチのお店（和食？洋食？イタリアン？中華？）
- 旅行の行き先（北欧？南米？アフリカ？）
- 彼女へのプレゼント（時計？ネックレス？バッグ？）


# 問題の例：ビジネス
- どの広告を出すと、一番多くクリックされるか(CTR)
 - 1クリック20円なら→予算10万円なら5,000クリック
- どのメールの文面を使うと、一番多く開封してもらえるか(メール開封率)

- Webページ最適化
バラク・オバマ陣営が、[大統領選挙戦でWebページ最適化を活用して多額の献金を集めることに成功した](https://blog.optimizely.com/2010/11/29/how-obama-raised-60-million-by-running-a-simple-experiment/)のは有名ですね。


Webページ最適化では、
「仮説パターン」＝デザインや機能がオリジナルと一部異なるウェブページ
を用意して、この仮説パターンの中から「広告クリック率」や「ページ滞在時間」といった評価指標を最大化するパターンを探しだします。


# 探索(exploration)と活用(exploitation)

- 探索：現在知っている情報以外の情報を獲得するために選択肢を選ぶこと
 - 行ったことのない定食屋に行ってみる
 - 出したことのない広告を出してみる（A/Bテスト実行中）

- 活用：現在知っている情報から、利益を最大化する選択肢を選ぶこと
 - 「一番おいしいここにしよう」
 - 「一番よかった広告を出そう」（A/Bテスト後の本番）


# 探索と活用はトレードオフ

- 探索ばかりだと・・・いい選択肢が分かっているのに選ばない←A/Bテスト中
- 活用ばかりだと・・・他にもっといい選択肢があっても気付けない


# バンディットアルゴリズム

- 探索と活用を効率的に行い、一定期間での利益を最大化するアルゴリズム
- （強化学習の文脈では）エージェントが効率的な学習を行うために用いられるアルゴリズム

- 単純のため、以下では値は2値
 - 当たりかハズレか、クリックされたか否か、購入されたか否か



# 言葉の定義


| 言葉           | 意味              |
|---------------:|-----------------:|
| アーム      | 選択肢のこと |
| 多腕        |      腕(アーム)が多数あること。 |
| 引く      | アームを選択し、その結果を受け取ること。 |
| 探索    |      アームに関する情報を増やすためにアームを引くこと |
| 活用      | いま持っている情報から、最適と判断できるアームを引くこと |



# アルゴリズムの種類

- epsilon-greedy
 - 確率eで活用（期待値の最も高いアームを引く）、1-eで探索
 - A/Bテストは、epsilon-firstと分類できる（一定期間ずっと探索→その後はずっと活用）
- Softmax
- UCB


# A/Bテストとバンディットアルゴリズムは目的が違う！

http://www.slideshare.net/greenmidori83/ss-28443892
の42ページあたりからご覧ください。


# シミュレーションしたい。

体裁は整え中・・・。

- シミュレーション1、e=0.4
![eg0.4_avg10000_update30.png](https://qiita-image-store.s3.amazonaws.com/0/32910/b6f6c0ae-2818-3ae8-816a-a1ef9553ac65.png)

- シミュレーション3、e=0.4
![eg0.4_avg10000_update1000.png](https://qiita-image-store.s3.amazonaws.com/0/32910/b7f3d249-3485-a8f5-5cb8-11153bb4b2c7.png)



# おわりに

- 手元の情報を生かしながら意思決定できる方法として、
「探索」と「活用」の考え方に基づくバンディットアルゴリズムを理解する
- シミュレーションを通して、バンディットアルゴリズムのイメージをつかむ

# 発展

- Contextualなbanditなるものがあるらしい。
 - http://www.slideshare.net/tsubosaka/introduction-contexual-bandit
 - 男性/女性、年齢など、ユーザの情報を取り入れたwebマーケティングなどに応用可能
 - LinUCBは代表的なアルゴリズム


# 参考資料

- [バンディットアルゴリズム入門と実践](http://www.slideshare.net/greenmidori83/ss-28443892)
- [コードサンプル](https://github.com/johnmyleswhite/BanditsBook)
- [バンディットアルゴリズムを使って広告最適化のシミュレーションをしてみたよ](http://qiita.com/ysks3n/items/4e782603f7592743625b)
- [Optimizely](https://www.optimizely.co.jp)
对话


去年9月, 之前一个同事在13年底查出胃癌之后不到一年的时间.在他29岁生日前夕不治离世, 永远离开了我们.
下面这是我和他远嫁日本的姐姐的对话. 从对话的内容中,我们似乎能够感受到一些悲伤, 但是说实话只有自己的亲人才会有的感受, 对于我们这样的朋友来说, 永远都是无法感同身受的. 马上就要他的生日了. 纪念他!


## AAA 2014-9-27 上午 11:48

hi, 你是XXX的朋友吗? 你知道他近况吗,我是他同事, 现在已经联系不到他了 电话打不通. 看见你给他的留言了,真的吗?

## BBB  2014-10-14 下午 10:26

你好，我是XXX的姐姐，谢谢你对他的关心，你有他的qq或微信吗？如果有，应该知道了

## BBB 2014-10-14 下午 10:38

他曾经对我说他有在国外的同事，想必就是你了吧？
祝你快乐健康一生

## AAA 2014-10-14 下午 10:39

你好, XXX的事情我那天看见你的信息就已经知道了. 心里很难受. 不知道该说什么.
我是他北京的同事.

## BBB 2014-10-14 下午 10:40

那天凌晨5点走的

## AAA   2014-10-14 下午 10:40

其实前一天我知道是他的生日

## BBB  2014-10-14 下午 10:40

我哭着发了这条信息后就没再打开过

## AAA 2014-10-14 下午 10:40

我就心里一直惦记着
然后周六早上起床就看见你的信息了

## BBB 2014-10-14 下午 10:41

是的，29，他过不了这个9
谢谢你

## AAA   2014-10-14 下午 10:41

不用谢的.
应该的
我们之前在一起吃饭 打球
很多的回忆的.

## BBB 2014-10-14 下午 10:42

他会感受到你的心意的

## AAA 2014-10-14 下午 10:42

他和我的性格有点像 不愿意说话
话很少

## BBB 2014-10-14 下午 10:42

他很想活下去

## AAA 2014-10-14 下午 10:42
是啊, 一个大小伙子
我们这边很多同事都有很多美好的回忆

## BBB 2014-10-14 下午 10:44

希望大家能带着对他的回忆，好好珍惜每一天

## AAA 2014-10-14 下午 10:44
恩是! 珍惜每一天 谢谢.
还有身边的人

## BBB 2014-10-14 下午 10:45

他受了太多痛苦

## AAA 2014-10-14 下午 10:46
是, 去年夏天我们做项目的时候 ,他有很多的心事,但是还是坚持在干活.
他的内心很强大

## BBB 2014-10-14 下午 10:46
现在解脱了，活着的人还要继续在这尘世里煎熬
这些心事正是一把利剑，把他逼到绝境

## AAA 2014-10-14 下午 10:48
恩 是啊, 他有时候就在哪里发呆,不说话 我们都感觉到了.
都历历在目

## BBB 2014-10-14 下午 10:48

我们没有一个人从根本上帮得了他，

## AAA 2014-10-14 下午 10:49
恩 是的

## BBB 2014-10-14 下午 10:49

命运太残酷，把地狱酷刑都让他一一受尽，最后是痛死的，
我每每想到就心如刀割，人活着是一件多么残忍的事情

## AAA   2014-10-14 下午 10:51

恩 说实话我完全无法想象姐姐你的感受
因为我作为一个志坤的朋友 每每想起来 都是无法接受的.

## BBB   2014-10-14 下午 10:55
是的，带着对他的无限爱怜和罪孽感，我没对他尽力的罪孽感，去赎罪，打开真心爱周围的人，坦然接受生命的种种，直到能和他相见为止

## AAA   2014-10-14 下午 10:57

恩 是, 爱身边的人,真心的对待他们包括自己.

## BBB   2014-10-14 下午 10:58

他有很多都是命中注定的

## AAA   2014-10-14 下午 11:08

姐姐要注意自己是身体
要过好以后的每一天.

## BBB   2014-10-14 下午 11:11

谢谢你，如今看淡了很多，放下了很多
觉得轻松了很多
大概是僧者修行人，所谓看破红尘吧

## AAA   2014-10-14 下午 11:13

加油!

## BBB   2014-10-14 下午 11:13

虽然很想放下一切，但世俗难免责任在身，努力活着，活下去
嗯
你也保重，那么，再见吧！

## AAA   2014-10-14 下午 11:14
好的! 加油
リングモジュレーターとAM

# リングモジュレーターとAM

## リングモジュレーター
![スクリーンショット 2015-09-17 17.09.00.png](https://qiita-image-store.s3.amazonaws.com/0/93396/cc8d26ce-d66b-aefb-0a82-d84fb84534af.png)
　リングモジュレーターは、キャリアとモジュレータによって作られます。キャリアにはサイン波、モジュレーターには好きな信号を入れます。振幅は、キャリアは[-1〜1]、モジュレーター[-1〜1]の間にします。

## AM（Amplitude Modulation / 振幅変調）
![スクリーンショット 2015-09-17 17.09.04.png](https://qiita-image-store.s3.amazonaws.com/0/93396/641ba300-a689-4d34-7081-a9418eb6aef8.png)
　AMも、キャリアとモジュレータによって作られます。キャリアにはサイン波、モジュレーターには好きな信号を入れます。振幅は、キャリアは[-1〜1]、モジュレーター[0〜1]の間にします。

## リングモジュレーターとAMの違い
　リングモジュレーターとAMはどちらも音声や映像信号等を送るのに使われています。

#### リングモジュレーター
　複数の信号を混ぜあわせて一つの信号にするために使われています。別々の２つの信号が流れている線を、１つの線にまとめたい時などに使われています。
　元々はアナログ回路で作られていて、回路の形がリング状なのでこの名前がついたそうです。

#### AM
　ラジオの電波などに使われています。音声信号をそのまま電波として送ることも可能ですが、ノイズが乗りやすく再現しにくくなります。そこで変調をかけることでそれらを回避します。例えばラジオでは、キャリアの信号を音声信号で変調（音量を変化させる）して送ります。これによって混在する電波の中から聞きたい放送の帯域だけを受信できます。


#### ２つの音響的違い
![スクリーンショット 2015-09-17 17.39.20.png](https://qiita-image-store.s3.amazonaws.com/0/93396/421ce744-0688-17ce-225c-88af412ae06e.png)
　左側がリングモジュレーター、右側がAMです。どちらもキャリアに2,000Hz、モジュレータに1,000Hzを送っていますが、スペクトルを見ると前者は山が２つで後者は３つになっています。
　AMの中央の山がキャリアの周波数です。キャリアの周波数にモジュレータの周波数を足した周波数と、引いた周波数が左右に現れています。
　一方リングモジュレーターはキャリアの周波数が消えて、キャリアの周波数にモジュレータの周波数を足した周波数と、引いた周波数の２つのみが現れています。
navigationControllerの左スワイプで戻る機能を無効化する方法


iOS7移行、デフォルトで「左スワイプしたら前の画面に戻る」ようになってしまった。うざい。
特定画面で無効化する方法

xcode7
iOS7~9

## 無効化する方法(iOS7~9で動く…と思う)
全部で動く(と思う)が、めんどくさい方法
例: NavigationControler -(rootViewController)-> HogeViewController

```swift:HogeViewController.swift
class HogeViewController: UIViewController, UIGestureRecognizerDelegate {

	// navigationcontrollerに元から設定されているdelagateを保持しておく
	private var originalNavigationControllerDelegate: UIGestureRecognizerDelegate?

	override func viewWilAppear(animated: Bool) {
		super.viewWillAppear(animated)

		// popGestureを乗っ取り、左スワイプでpopを無効化する
		// 必ずdisappearとセットで用いること
		if let popGestureRecognizer = navigationController?.interactivePopGestureRecognizer {
			self.originalNavigationControllerDelegate = popGestureRecognizer.delegate
			popGestureRecognizer.delegate = self
		}
	}

	override func viewWillDisappear(animated: Bool) {
		super.viewWillDisappear(animated)

		// popGestureを乗っ取り、左スワイプでpopを無効化する(のを解除する)
		// 必ずwillAppear/willDisappearとセットで用いること
		if let popGestureRecognizer = navigationController?.interactivePopGestureRecognizer {
			popGestureRecognizer.delegate = originalNavigationControllerDelegate
			originalNavigationControllerDelegate = nil
		}
	}

	// MARK: - UIGestureRecognizerDelegate

    // popGestureを乗っ取り、左スワイプでpopを無効化する
    func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
        return false
    }
}
```

## 簡単に無効化する方法(iOS8.0~iOS8.4では動かない)
iOS8系で動かないけど簡単な方法
http://blog.nambo.jp/2013/11/29/disable-uinavigationcontroller-popgesture/

iOS8で動かない(実際実機で動かなかったが)情報
http://stackoverflow.com/questions/17209468/how-to-disable-back-swipe-gesture-in-uinavigationcontroller-on-ios-7
【SSL】設定について


##いじったファイル

```
- ①/private/etc/apache2/extra/httpd-vhosts.conf
- ②/private/etc/apache2/extra/httpd-ssl.conf
- ③/private/etc/apache2/httpd.conf

```


##apache関連コマンド

```
- sudo apachectl configtest
- sudo apachectr restart
```

##手順

①vatualhostの追加
②sslの情報も追加

```
<VirtualHost *:443> //ここ443に変更してvhosts.confに追加したものをコピペ
//（ここから）
    ServerAdmin hanako@tanaka.com
    DocumentRoot "/Users/hanako/Documents/works/vhosts/kintone-js/www"
    ServerName hanako.tanaka.com 
    ErrorLog "/Users/hanako/Documents/works/vhosts/kintone-js/err_log"
    CustomLog "/Users/hanako/Documents/works/vhosts/kintone-js/acc_log" common
        <Directory "/Users/hanako/Documents/works/vhosts/kintone-js/www">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
Options FollowSymLinks
Options +ExecCGI
        </Directory>
//（ここまで）

//以下はSSLの情報をコピペでディレクトリを上とあわせる！
SSLEngine on
SSLCertificateFile /Users/hanako/Documents/works/vhosts/kintone-js/ssl/20150323.crt
SSLCertificateKeyFile /Users/hanako/Documents/works/vhosts/kintone-js/ssl/20150323.key
SSLCertificateChainFile /Users/hanako/Documents/works/vhosts/kintone-js/ssl/20150323_intermediate.crt
```


ちょとその他思い出せないのであとで追記予定。
[Vue.js] v-repeatした配列にフィルタを掛けた時の$indexに注意


v-repeatにorderByでフィルタをしたときの$indexを使って、rootのdataを更新しようとすると、意図しないオブジェクトが取得される。ということにハマったのでメモ。


# やること

* contents配列の各オブジェクトを`v-repeat`
* `orderBy`を使って、dateTimeの降順で表示

```html:index.html
<div id="list">
  <ul>
    <li v-repeat="content in contents | orderBy 'dateTime' true">
      index: {{$index}} - id: {{content.id}} - {{content.memo}} - {{content.dateTime}}
      <button v-on="click : outputIndex(this)">button</button>
    </li>
  </ul>
</div>
```

```javascript:index.js
var List = new Vue({
  el: '#list',
  data: {
    contents: [
      {id: 1, memo: 'memo 1', dateTime: '2015/9/10'},
      {id: 2, memo: 'memo 2', dateTime: '2015/9/11'},
      {id: 3, memo: 'memo 3', dateTime: '2015/9/12'},
      {id: 4, memo: 'memo 4', dateTime: '2015/9/13'},
      {id: 5, memo: 'memo 5', dateTime: '2015/9/14'},
      {id: 6, memo: 'memo 6', dateTime: '2015/9/15'}
    ]
  },
  methods: {
    outputIndex: function (item) {
      // targetVMの$index
      console.log('index: ' + item.$index);
      // targetVMのid
      console.log('id (targetVM): ' + item.content.id);
      // targetVMの$indexでイベントが起きた1件のオブジェクトを検索
      console.log('id (this.contents): ' + this.contents[item.$index].id)

    }
})
```

![Kobito.m9S3RS.png](https://qiita-image-store.s3.amazonaws.com/0/34837/2484b877-6c10-774c-b6b2-b539c961c674.png "Kobito.m9S3RS.png")

buttonをclick

![Kobito.68v8Ro.png](https://qiita-image-store.s3.amazonaws.com/0/34837/a8ddb5b8-2772-0a2a-eb43-53a7159e3653.png "Kobito.68v8Ro.png")


targetVMは`id: 1`のオブジェクトだが、その$indexをrootで利用すると意図しないオブジェクトが取得される。 **orderByで子インスタンスがソートされるとき、contents内の配列がソートされるわけではないので$indexで取れる値と一致しなくなるのが原因。**

## 起きた問題

`$set()`等のデータを更新するメソッドで意図しないオブジェクトのデータが更新される。indexに依存した処理が正しく機能しなくなった。

# 解決策

ユニークなidでcontentsを検索して正しいindexを取得する

```javascript
var list = new Vue({
  el: '#list',
  data: {
    contents: [
      {id: 1, memo: 'memo 1', dateTime: '2015/9/10'},
      {id: 2, memo: 'memo 2', dateTime: '2015/9/11'},
      {id: 3, memo: 'memo 3', dateTime: '2015/9/12'},
      {id: 4, memo: 'memo 4', dateTime: '2015/9/13'},
      {id: 5, memo: 'memo 5', dateTime: '2015/9/14'},
      {id: 6, memo: 'memo 6', dateTime: '2015/9/15'},
    ]
  },
  methods: {
 
    outputIdx: function (item) {
      var id = item.content.id;
      var idx = this.findById(id)
      
      console.log('index: ' + item.$index);
      console.log('id (targetVM): ' + item.content.id);
      console.log('id (this.contents): ' + this.contents[item.$index].id)
      
      console.log('正しいindex: ' + idx);
      console.log('targetVMのid:' + id);
    },

    // idを渡して正しいindexを取得するメソッド
    findById: function (id) {
      for (var i = 0; i < this.contents.length; i++ ) {
        if (this.contents[i].id === id) {
          return i
        }
      }
    }
  }
})
```

![Kobito.lkuL63.png](https://qiita-image-store.s3.amazonaws.com/0/34837/c5224d74-d110-917a-414c-2c37b5a2ef7e.png "Kobito.lkuL63.png")


独学手探りプログラミングおじさんが出した解決策です。
もっとよい解決策があればご指摘よろしくお願いします。
[.NET] 検証:Task + CancellationTokenSourceでは.NET4.0以前のスレッドの実行をブロックするメソッドを中断できない

.NET4.0で導入された`Task`と`CancellationTokenSource`を使用したとき、.NET4.0以前から存在するスレッドの実行をブロックするメソッドを中断できるかどうかを検証する。

# 動機 (追記)
.NET4.0(VisualStudio2010)の環境下、`Task`でマルチスレッドのアプリケーションをプログラムしながら、ふと思った。
「`Thread.Interrupt`なら`WaitSleepJoin`状態のスレッドを中断できるけど、`Task`と`CancellationTokenSource`だとこの状態のスレッドは中断できないよね」
`Interrupt`には、スレッドをブロックするメソッド(`Monitor.Wait`のような)で`ThreadInterruptedException`を発生させて途中終了させるという機能がある。しかし、`Cancel`にはそのような機能はない。

……いや、実は知らないだけで、実は裏でそんな機能があるのではないか。`Thread`を捨てて`Task`を使おうと喧伝されているのだから、`Task`にも似たような機能がついていてもおかしくない。
検証してみよう。そして、ついでだから、`ThreadInterruptedException`を発生しないようなメソッドについても調べてみよう。

# `Monitor.Enter`中のスレッド(`Task`)を中断できるか
## 実験コード
```csharp:Program.cs
static void Main(string[] args)
{
    var cancel = new CancellationTokenSource();
    var o = new object();
    var task1 = Task.Factory.StartNew(() =>
    {
        Trace.WriteLine("Task1 - start Monitor.Enter");
        Monitor.Enter(o);
        Thread.Sleep(10000);
        Monitor.Exit(o);
        Trace.WriteLine("Task1 - done Monitor.Exit");
    });

    Thread.Sleep(100);
    var task2 = Task.Factory.StartNew(() =>
    {
        try
        {
            Trace.WriteLine("Task2 - start Monitor.Enter");
            Monitor.Enter(o);
            Trace.WriteLine("Task2 - done Monitor.Enter");
            Thread.Sleep(1000);
        }
        catch (Exception ex)
        {
            Trace.WriteLine(ex.ToString());
            throw ex;
        }
        finally
        {
            Monitor.Exit(o);
            Trace.WriteLine("Task2 - done Monitor.Exit");
        }
    }, cancel.Token);
    task2.ContinueWith(t => Trace.WriteLine(t.Status));

    Thread.Sleep(100);
    cancel.Cancel();
    Trace.WriteLine("Foreground - canceled");

    Console.WriteLine("Press Enter Key...");
    Console.ReadLine();
}
```
## 実行結果
```
Task1 - start Monitor.Enter
Task2 - start Monitor.Enter
Foreground - canceled
Task1 - done Monitor.Exit
Task2 - done Monitor.Enter
Task2 - done Monitor.Exit
RanToCompletion
```
## 結果
中断できない。
`Monitor.Enter`中で中断できないのだから、`lock`ステートメントでオブジェクトのロック取得待ちの状態についても同様と言える。

# その他のスレッドをブロックするメソッドはどうか
下記のメソッドについても同様の実験を行う。

- `Monitor.Wait`
- `EventWaitHandle.WaitOne`
- `AutoResetEvent.WaitOne`
- `ManualResetEvent.WaitOne`
- `ReaderWriterLock.AcquireWriterLock`
- `Thread.Sleep`

## 実験コード
似たようなコードなので省略

## 結果
どれも中断できない。

# 結論
実行をブロックするメソッドのうち、`CancellationTokenSource`で中断できるのは、引数に`CancellationToken`を指定できるメソッドだけである。
これには、以下のメソッドなどが該当する。

- `CountdownEvent.Wait`
- `ManualResetEventSlim.Wait`
- `Barrier.SignalAndWait`
- `BlockingCollection.Add,Take`

中断できないメソッドの中には、`Thread.Interrupt`で中断できたメソッド(`Monitor.Wait`)も含まれる。
そのため、`Monitor.Wait`を使用したい場合、`Thread`を使用する意味が依然として存在するように思える。

# 外部情報
プログラミングC# 第7版の以下のような記述を裏付けることができた。
> 既に説明した同期メカニズムの中にも`CancellationToken`を指定できるものがあります(Windowsの同期プリミティブは.NETのキャンセルモデルをサポートしないため、`WaitHandle`派生のクラスではサポートされていません。また、`Monitor`でもキャンセルはサポートされていません。新規に追加されたAPIではサポートされています)。

# 続き
[Monitor.Wait/PulseよりもManualResetEventSlimを使う](http://qiita.com/laughter/items/1e64ab8712e410a8f047) へと続く。
Parse PHP SDKでSESSIONを使う

Parse PHP SDKを使ってログイン後別のページなどでユーザ情報を取得するにはどうしたらいいんだろうと、色々やってみてようやく判明したので、忘れない内にメモしときます。


```php:login.php
<?
  require 'vendor/autoload.php';
  session_start();

    date_default_timezone_set('Asia/Tokyo');
 
    use Parse\ParseClient;
    use Parse\ParseUser;
    use Parse\ParseSessionStorage;
    use Parse\ParseException;

   ParseClient::initialize('<Application ID>', '<REST API Key>', '<Master Key>');

   ParseClient::setStorage( new ParseSessionStorage() );
try {
  $user = ParseUser::logIn("<username>", "<password>");
  // Do stuff after successful login.
  	echo "success : " . $user->get("username");

} catch (ParseException $error) {
  // The login failed. Check error to see why.
	echo "Error: " . $error->getCode() . " " . $error->getMessage();

}
  $currentUser = ParseUser::getCurrentUser();
  echo "<br>";
  echo $currentUser;
  echo "<br>";
?>
<a href="./second.php">second page</a>
```

```php:second.php
<?
  require 'vendor/autoload.php';

  session_start();

  use Parse\ParseClient;
  use Parse\ParseUser;
  use Parse\ParseSessionStorage;

  ParseClient::initialize('<Application ID>', '<REST API Key>', '<Master Key>');
    
  $currentUser = ParseUser::getCurrentUser();
  $username = $currentUser->getUsername();

  echo $username;

?>
```
肝は`session_start();`を`require 'vendor/autoload.php';`の後に書くこと。
いろんなサイトで`session_start();`を最初の行に書いているところがありますが、それだと動きません。
ずっと、一行目に書いたまま、色々試してみてて無駄な時間を使ってしまいました。

あと`ParseClient::setStorage( new ParseSessionStorage() );`も必要です。
sessionを利用する方では不要です。

--2015.10.3追記--
use Parse\ParseException;が抜けてたので追記しました。
これないとErrorがとれません。
bootstrap-sassとslimで表示のテンプレートを作ってみた

# Rails × Slim × bootstrap-sass
Bootstrapにはイケてるサンプルがたくさん用意されています。
それを、Slimで使うRailsで実際にテンプレートとして表示されるまでの記録。
あくまでも、個人で楽しんでくださいね。

Railsにbootstrap-sassは導入済み

# 雛形となるテンプレート探し
まずBootstrapの公式サイトから、自分の理想に近いテンプレートを探してきます。
http://getbootstrap.com/getting-started/
ページの下の方に行くと...

![スクリーンショット 2015-09-17 17.11.58.png](https://qiita-image-store.s3.amazonaws.com/0/3377/c3d8d651-72ba-892f-43c7-ba4753db4dd5.png)

> Build on the basic template above with Bootstrap's many components. We encourage you to customize and adapt Bootstrap to suit your individual project's needs.

とあるので、大いに使わせていただきます！
自分の理想に近いページのソースを拝借し、ソースコードを確認しhtmlをslimにしてみます。

# slim書いたこと無い...というあなた(私)

1. ドキュメント読んで頑張ってください。
http://docs.slimframework.com/

2. htmlをslimにしてくれるサービスを使うのも手ですね。
https://html2slim.herokuapp.com/
ただし、ところどころ崩れたり、おかしかったりするため、手動で修正する必要はあります。

# Application.html.slimにぶっこむ
作成したソースコードを挿入して、サーバ起動してページ確認してみる。

# しかし崩れます
理由は簡単です。bootstrapのサンプルの多くには、サンプル用のcssが用意されています。
なので、自分のプロジェクトにもそれを取り組んで上げる必要があります。

今回は、sassを使っているので、
サンプルのcssを参考にしつつ、sassに置き換えてください。

# 備考
slimやsassを触ったこと無い初心者からすると、
たたき台があるだけで、かなり学習の助けになると思います。
気になったサイトがあったら、こういう形でsassだったら、slimだったら...というふうに変換してみても良いかもしれません。
MacでGyazoとGyazo TeamsをSSIDで切り替える

Macのアプリケーションを仕事用とプライベート用で使い分けている場合、[MacでFnキーを押すとGyazoを起動する設定 - Qiita](http://qiita.com/uiureo/items/dc1dc2f0a068dc99153f) のように普段使いのアプリケーションの方にショートカットキーを当てたりしていると仕事用の方ときに使い勝手が違って不自然な気持ちになるので、ちょっと試しに設定をしてみたところ、割と便利に使えているので紹介します。

SSIDで切り替えるので、今日はリモートワークにしようとかそもそもノマドワーカースタイルだったら使えないけど、まぁ逆に家とそれ以外という使い方も出来そう。

良しなに使って下さい。

## 使い方

`~/.switch_gyazo`にSSID名を以下の要領で書き込む。

```yaml:~/.switch_gyazo
ssids:
 - myOfficeWiFi_SSID_NAME
 - mySecondOfficeWiFi_SSID_NAME
```

以下のスクリプトを適当に保存する。

```rb:switch_gyazo.rb
#!/usr/bin/env ruby
require 'yaml'

settings = YAML.load_file("#{ENV['HOME']}/.switch_gyazo")
ssid = `system_profiler SPAirPortDataType | awk -F':' '/Current Network Information:/ {
getline
sub(/^ */, "")
sub(/:$/, "")
print
}'`.chomp
if settings['ssids'].include?(ssid)
  app_path = settings['teams_app'] || "/Applications/Gyazo\\ Teams.app"
else
  app_path = settings['private_app'] || "/Applications/Gyazo.app"
end
exec "open #{app_path}"

```

これまでの `Gyazo.app` を呼び出す代わりに `switch_gyazo.rb` を実行するようにする。

例えば、[MacでFnキーを押すとGyazoを起動する設定 - Qiita](http://qiita.com/uiureo/items/dc1dc2f0a068dc99153f)を真似して、karabinerを利用している場合は`~/Library/Application\ Support/Karabiner/private.xml`の内容を次のように変更する。(以下の設定をそのまま使う場合は`% chmod +x switch_gyazo.rb`などで実行可能にしておく必要があります)

```xml:private.xml
<?xml version="1.0"?>
<root>
    <vkopenurldef>
        <name>KeyCode::VK_OPEN_URL_GYAZO</name>
        <url type="shell">
          <![CDATA[ /path/to/switch_gyazo.rb ]]>
        </url>
    </vkopenurldef>

    <item>
        <name>fn to Switch Gyazo</name>
        <identifier>remap.fn2gyazo</identifier>
        <autogen>
            --KeyOverlaidModifier--
            KeyCode::FN, ModifierFlag::FN,
            KeyCode::FN,
            KeyCode::VK_OPEN_URL_GYAZO
        </autogen>
    </item>
</root>
```

デフォルトでは、指定したSSIDでは`/Applications/Gyazo Teams.app`が起動し、それ以外では`/Applications/Gyazo.app`が起動します。

もしファイルを変更したい場合は`~/.switch_gyazo`に以下のように項目を追加することで起動アプリケーションを変更することが出来ます。

```yaml
teams_app: "/Applications/MyGyazoTeams.app"
private_app: "/Applications/MyPrivateGyazo.app"
```
【Monaca】Android 端末にて、Connectionプロパティが読み込めない

# 問題点
Monacaにて、AndroidとiOS上でオンラインかオフラインを判定する処理を実装しておりました。
[参考サイト: http://docs.monaca.mobi/3.5/ja/reference/phonegap_34/ja/connection/](http://docs.monaca.mobi/3.5/ja/reference/phonegap_34/ja/connection/ "Qiita")

ここで、iOSでは、判定が出来るのに、Androidでは判定出来ない(ロジックが通らない)事がありまして、調べましたので、共有させて頂きます。
実機: SC-02C (Ver.4.0.3)

```js:オンライン判定ロジック
var networkState = navigator.connection.type;

if (networkState != Connection.NONE) {
    alert("オンライン!");
} else {
    alert("オフライン!");
}
```

# 現象・解決方法
取り敢えず、どこでこけているのか、色々、確認していきました。
その結果、`typeof Connection // -> undefined` こんな事実が分かりました。
**Connectionが定義されていない**。。？

それを元に調べました所、我らがStackOverflow様 にて発見しました。
[参考サイト: http://stackoverflow.com/questions/25672502/phonegap-network-connection-cannot-read-property-type-of-undefined](http://stackoverflow.com/questions/25672502/phonegap-network-connection-cannot-read-property-type-of-undefined "Qiita")

**Cordovaのnetwork-informationのプラグインのバージョンを0.2.7** にしてください、との事みたいですね。

でも、Monacaのnetwork-informationのプラグインのバージョンは **0.2.10 (2015/09/17 現在)**だそうで。。
Monacaでは、有料会員で無ければ、Cordovaの外部プラグインを自分でインストールしてきて、組み込む、という事が出来ません。

色々悩んだ挙句、、

```js:解決コード
var networkState = navigator.connection.type;

if (networkState != "none") {
    alert("オンライン!");
} else {
    alert("オフライン!");
}
```
としました。

一応、このnetworkStateの型がStringだったので、一先ずはこれで良いかな。。。と。
ただ・・・だっさいよね(´・ω・`)
[aws-cli]Amazon S3のバケットに、ストレージクラス「Standard – IA」を適応する

## json出力
```
aws s3api put-bucket-lifecycle-configuration --generate-cli-skeleton > set_s3_standard_ia_lifecyclepolicy_config.json
```

```s3_standard_ia_lifecyclepolicy_config.json
{
    "Bucket": "image_test_bucket",
    "LifecycleConfiguration": {
        "Rules": [
            {
                "ID": "test_STANDARD_IA",
                "Prefix": "",
                "Status": "Enabled",
                "Transitions": [
                    {
                        "Days": 30,
                        "StorageClass": "STANDARD_IA"
                    }
                ]
            }
        ]
    }
}
```

## 実行
```
aws s3api put-bucket-lifecycle-configuration --cli-input-json file://s3_standard_ia_lifecyclepolicy_config.json
```

## 確認
```
aws s3api get-bucket-lifecycle-configuration --bucket image_test_bucket
```
```
{
    "Rules": [
        {
            "Status": "Enabled",
            "Prefix": "",
            "Transitions": [
                {
                    "Days": 30,
                    "StorageClass": "STANDARD_IA"
                }
            ],
            "ID": "test_STANDARD_IA"
        }
    ]
}
```
ActiveDirectoryのレプリケーションで困ったときに使ったコマンド(メモ書き)

ActiveDirectoryを触っていて、直面した問題を解決するために使ったコマンドたち。
忘れないようにメモ書き(笑)
随時追加していきます。お勧めコマンドなどがあればコメントください。助けてください(笑)

### レプリケーション状態の確認
確認したい対象のDCサーバで次のコマンドを実行する。
`repadmin /showrepl`


### レプリケーションが出来ない
>"このサーバーとの最後のレプリケーション以来、廃棄 (Tombstone) の有効期間を超えた時間がたっているため、ディレクトリ サービスはこのサーバーでレプリケートできません。"

恐らく長期間に渡って正常にレプリケーションが出来ておらず、差分レプリケーションが上手くいかなくなってしまったことが原因･･･かな。
次のコマンドで全体をレプリケーションする

`repadmin /replicate [レプリケーション先DC名] [レプリケーション元DC名] CN=Configuration,DC=example,DC=com /full /force`

###結局レプリケーションが復活できなかったので、ドメインコントローラを強制削除する

Microsoftのサイトにあるこちら
https://technet.microsoft.com/ja-jp/library/cc731871(v=ws.10).aspx

`dcpromo /forceremoval`

/forceremovalってオプションがあるのを知らなかった･･･。
「Active Directory ドメイン サービス インストール ウィザードの開始」で何度か脅される(笑)が、「大丈夫だ。問題ない」と心の中でつぶやきながら次に進める。

削除処理は環境によるようだが、当方の環境では10分以上掛かった。ちょっと焦ったが、**心を落ち着かせて待つこと**が大事。
再起動まで完了すれば、対象のサーバからActiveDirectoryが削除される。

が、しかし･･･

このままだと、削除したサーバの情報がフォレスト上に残ってしまうので、メタデータのクリーンアップなる作業を行う。

参考にしたページはこちら
https://support.microsoft.com/ja-jp/kb/216498
http://network.station.ez-net.jp/server/microsoft/windows/dc_delete.asp

最後にDNSから削除したサーバのレコードを削除すればスッキリ!

追記:
と思ったら、コンピュータオブジェクトが残っていると、再度ドメイン参加しようとしたときに「アカウントが存在しています」って怒られるので、検索して残らず削除する。
Bootstrap3のmodalをknockout.jsと連携させて表示する


## Bootstrapでいろいろやると結局DOM操作になる…

Modalに宛てるViewModelを定義しても、表示するのは結局jQueryを使っていたりしてどうにも趣味じゃなかったので、多少見た目がよくなるようにと思ってカスタムバインディングを作ってみました。


## ハンドラーを定義する

モーダルは閉じる用のボタンを押したりしなくても閉じることがあるので、万が一ViewModelを通じて表示・非表示の操作が行われた場合のことも考慮して、表示・非表示のコールバックイベントを使って状態を変更する処理も定義しておきます。

```coffee:CoffeeScript
ko.bindingHandlers.bs_modal = {
  init: (element, valueAccessor) ->
    # モーダルの表示・非表示の際に状態を変化させる
    $(element).on 'shown.bs.modal', ->
      value = valueAccessor()
      value(true) unless value()
    $(element).on 'hidden.bs.modal', ->
      value = valueAccessor()
      value(false) if value()

    ko.computed(
      read: ->
        state = ko.unwrap(valueAccessor())
        if (state)
          $(element).modal('show')
        else
          $(element).modal('hide')
      ,
      disposeWhenNodeIsRemoved: element
    )
}
```

## 実際に使ってみる。

### View(モーダルのHTML)

data-bindする際に、bs_modalにbool型のobservableを指定します。

```slim:slim
button#btn_show_modal

.modal.fade role="dialog" data-bind="bs_modal: state"
  .modal-dialog
    .modal-content
      .modal-header
        button.close type="button" data-dismiss="modal" aria-label="Close"
          span aria-hidden="true" &times;
        h4.modal-title モーダルタイトル
      .modal-body
        p モーダルボディ
      .modal-footer
        .container-fuild
          .row
            .col-md-offset-6.col-md-3
              button.btn.btn-danger.btn-block type="button" data-dismiss="modal"
                | キャンセル
            .col-md-3
              button.btn.btn-default.btn-block type="button"
                | ボタン
```

### ViewModel

次は、ViewModelのです。
指定したobservableの値が変われば、モーダルの表示・非表示ができるので、
それ用のメソッドを定義しておきます。


```coffee:CoffeeScript
class @ModalViewModel
  constructor: ->
    @state = ko.observable(false)
    
  show: ->
    @state(true)
    
  hide: ->
    @state(false)

$ ->
  vm = new ModalViewModel()
  ko.applyBindings(vm)
  
  # モーダルを表示するイベントを設定してみる。
  $('#btn_show_modal').click ->
    vm.show()
```

## 感想

ViewModelに対して表示・非表示の切り替えの命令ができるので、すっきりしました。
jQueryイベントがうまくいかない…


#事象
a-jaxのイベントの発生前までは動作するが
イベント後になんか動作しない

```aspx-vb:test.aspx

    <script type="text/javascript">
    <!--
        $(document).ready(function () {
            $('#TextBox').on('change', function () {
                //イベント発生！！
            });

        });

    //-->
    </script>    

    <td>
        <asp:HiddenField ID="HiddenField" runat="server" />
        <asp:TextBox ID="TextBox" runat="server" Width="200px" ReadOnly="true" />
        <asp:Button ID="Button001" runat="server" Text="※"  width="50px"/>
    </td>


```


#もしかすると
いろいろいじってみると、発生するのは「Button」の時だけ
予想としては、何かa-jaxのイベント発行後に
該当のイベントの習得ができないのかなと…



#一応これで動いた
UPDATEパネルか



```aspx-vb:test.sap
$(document).ready(function() {
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    // 開始時のイベント
    prm.add_beginRequest(function() {
       // 開始時のイベント記述
    });
    // 終了時のイベント
    prm.add_endRequest(function() {
        // 開始時のイベント記述
    });
});
```

上のサンプルに追記すると

```aspx-vb:test.aspx

    <script type="text/javascript">
    <!--
        $(document).ready(function () {
            //全体のアップデートパネルの設定
            var prm = Sys.WebForms.PageRequestManager.getInstance();

            // 終了時のイベントに設定する
            prm.add_endRequest(function () {
	            $('#TextBox').on('change', function () {
	                //イベント発生！！
	            });
            });

            $('#TextBox').on('change', function () {
                //イベント発生！！
            });


        });

    //-->
    </script>    

    <td>
        <asp:HiddenField ID="HiddenField" runat="server" />
        <asp:TextBox ID="TextBox" runat="server" Width="200px" ReadOnly="true" />
        <asp:Button ID="Button001" runat="server" Text="※"  width="50px"/>
    </td>


```

#参考

[■UpdatePanelの更新をフックする - Architect Life]
(http://d.hatena.ne.jp/coma2n/20080718/1216362909)
Pepperアプリ開発Tips

Pepperアプリを開発していてつまずいたこと、情報が見つけにくいことをまとめたTipsです。（随時、追記しています。）

#▼アプリ開発に便利な機能
##■ssh接続
PepperはChoregrapheを使わなくてもssh接続をして動かすことができます。
接続は、以下を実行します。

```
$ssh nao@＜pepperのIPアドレス or 機体名.local＞
```

ssh接続状態で以下を実行することで高速に再起動することができます。

```
$nao restart
```


このコマンドで、NAOqi OSだけを再起動することができます。

###・Pepper(linux)内のエディタ
Pepper内のnginxなどの設定ファイルを見ようとしても、viやvimなどが入っていません。（他にもmakeなどがありません。）エディタはnanoが入っているのでこちらを使います。

##■タブレットに表示されているhtmlをPCのブラウザで見る
Pepperアプリ実行中にPCなどのブラウザで

http://＜pepperのIPアドレス＞/apps/<アプリID>/<htmlファイルなどのパス名＞

にアクセスすると、実行中のアプリのhtmlファイルなどを見ることができます。（最後のパス名を指定しないときは、アプリ内のhtml/index.htmlにアクセスします。）
Pepperアプリのhtmlやjsファイルをデバッグするには、大変便利です。


#▼アプリ開発で気をつけること
##■ポーズ
ポーズは必ず正立に戻してください。正立以外のポーズをとり続けていると機体の温度が上がって、「肩の赤ランプが点灯→再起動」という憂き目にあいます。

##■ファイル名
ファイル名は日本語があってもよいですが、必ず半角英数字から始めてください。また、ボックス名に”/”は使わないようにしましょう。

##■unicode型
Pythonにはstr型とunicode型と言う二つの文字列を扱う型があります。str型はコード中でencode形式を意識しておかなければならないのでPythonではunicode型の登場頻度が多くなっています。しかし、ChoregrapheではonStopped()などBOXをまたいで文字列を渡すメソッドの引数はstr型でなければなりません。さもなくば文字列が全てNoneになってしまいます。

##■Touch Detectionボックス
NAOqi OSのバージョンが2.3以降になるとディスプレイの解像度が本来の1707×1067ピクセルに対応します。しかし、touch detectionボックスの出力はOSのバージョンによらず1280×800ピクセルになっています。

##■Play Videoボックス
Play Videoボックスによる動画再生中はタブレットのタッチイベントが発生しません。Show Web Viewボックスなどhtmlファイルをブラウザで表示している際はタッチイベントが有効なので、動画再生中にタッチイベントを発生させたいときはvideoタグなどを使ってhtmlから動画を再生することで対処できます。

#▼アプリの保守性を上げるために
##■dialogボックスとSpeech Reco.の使い分け
ボックスが多くなるとメモリを消費するだけでなく、可読性・保守性が低下します。そのため、コミュニケーションが１往復程度ならSpeech Reco.でよいですが、それ以上ならdialogボックスを使いましょう。

##■タイムラインのフレーム数
保守面からタイムラインボックスは500フレーム以内が推奨されています。


#▼できないこと and 問題点
##■初期化できない
Choregraphe上部で「接続＞アドバンスト」　とたどると「ロボットシステムを初期化／アップデート」と表示されますが、システムイメージが公開されていないためここから初期化を行うことはできません。（2015/09/16現在）
ただ、ssh接続を使った方法なら初期化できるようです。(詳細は[こちら](http://qiita.com/yuhki50/items/4ba082eb305d4b6278a1))

##■retinaディスプレイ非対応
Choregraphe (2.3.1)はmacのretinaディスプレイに対応していません。特に、retinaではロボットビューが小さく表示されます。ポーズの微調整をしたいときは、ロボットビュー全体にロボットが写っていると想像して、調整したいパーツがあると想定される場所にカーソルを置くとうまくいきます。（詳しくは[こちら](http://qiita.com/Takatymo/items/93c9cc16d0b7311ca694)の記事参照）

##■アプリがロボットにインストールされない
ロボットアプリケーションダイアログからプロジェクトをインストールしようとしても、無線LANだと通信速度が遅いなどの問題でインストールされないことがあります。解決策としては有線LANで接続するのがベターですが、無線LANでも次の方法があります。

* 待つ。
* インストールしたアプリを上書きしようとして上手くいかないときは、インストールするbehavior
ファイルのパスを以前のものと変えてインストールを試みる。

##■よく分からないエラーが起きる
Pepperはロボットであることもあって、まま原因が分からないエラーが起きます。その時は、下記の順に試します。

1. Choregrapheを再起動
2. Pepperをsleep、からのwake up
3. sshで nao restartコマンドでNAOqi OS再起動
4. 胸ボタン４秒押しから再起動
5. 胸ボタン８秒押しから再起動
【Railsメモ】Rails g controller のスキップオプション

`rails g controller controller_name` に使えるスキップオプションをメモしておきます。

| command                  | description |
|:-------------------------|:------------|
| `--skip-template-engine` | viewsの作成をスキップ |
| `--skip-test-framework`  | テストの作成をスキップ |
| `--skip-assets`          | assetsの作成をスキップ |
| `--skip-helper`          | helperの作成をスキップ |

すべて使えば、`app/controllers` にファイルが作成されるだけになります。
Atom キーバインド変更メモ

# 不満

- カーソルを右に移動させようとして、Ctrl-f で検索ダイアログが表示されていらいらする
- tab と pane 移動がつかいにくい
- windows と mac でかなり違う

# 方針
- ~~なるべくデフォルトから変更しない~~ 'ctrl-k' はいったんすべて無効にする
- Mac cmd -> Win alt を基本にする option キーを使うやつをどうするか考える

# カーソル移動

| orig(win)          | orig(mac) | customize | function                | description    |
|--------------------|-----------|-----------|-------------------------|----------------|
| Ctrl + End         |           | -         | core:move-to-bottom     |                |
| Ctrl + Pagedown    |           | -         | pane:show-next-item     | タブの移動     |
| Ctrl + Pageup      |           | -         | pane:show-previous-item | タブの移動     |
| Ctrl-k, Ctrl-left  |           | -         | focus-pane-on-left      | 左のPaneに移動 |
| Ctrl-k, Ctrl-right |           | -         | focus-pane-on-right     | 右のPaneに移動 |
# Windows 環境でのカスタマイズ

```json:keymap.cson
'.platform-win32 atom-workspace atom-text-editor':
  'ctrl-shift-a':'core:select-all'

'.platform-win32 atom-text-editor':
  'ctrl-f': 'core:move-right'
  'alt-f':'find-and-replace:show'
  'ctrl-b': 'core:move-left' # fuzzy-finder:toggle-buffer-finder
  'alt-b': 'fuzzy-finder:toggle-buffer-finder' #'editor:move-to-beginning-of-word'
  'ctrl-p': 'core:move-up'
  'alt-p': 'fuzzy-finder:toggle-file-finder'
  'ctrl-n': 'core:move-down'
  'alt-n': 'application:new-file'
  'alt-a': 'editor:move-to-first-character-of-line'
  'alt-e': 'editor:move-to-end-of-screen-line'
  'ctrl-a': 'editor:move-to-beginning-of-line'
  'ctrl-e': 'editor:move-to-end-of-screen-line'
  'alt-w': 'editor:select-word'
  'ctrl-alt-l': 'pane:show-next-item'
  'ctrl-alt-h': 'pane:show-previous-item'

  'alt-k alt-w': 'pane:close'
  'alt-k alt-l': 'pane:split-right-and-copy-active-item'

  'ctrl-k':'editor:cut-to-end-of-line'

'atom-text-editor:not([.mini])':
  'tab': 'snippets:expand'
  'ctrl-y': 'emmet:expand-abbreviation'
```

# よく忘れるキーのメモ

| 機能                   | キーバインド    |
|-----------------------|--------------|
| keybinding-cheatsheet | ctrl-alt-/   |
| toggle-focus          | alt-\        |
Telepathy Unity SDKの開発環境構築の手順

Telepathy向けアプリケーションを開発する際に、3DグラフィックエンジンであるUnityを活用することでよりリッチなアプリケーションを開発することが可能です。
このページでは、Telepathy向けアプリケーションを開発する際に必要な「Android SDK」「Android Screen Monitor」「Unity SDK」「Telepathy Unity SDK」の構築手順を解説します。

## 動作環境
OS：Windows / OSX
（バージョン等詳細は下記SDKの動作条件に準じます）

## インストールするソフトウェア
### 1) Android SDK
Android SDKは、Androidアプリを開発するためのSDKです。
下記のリンクから、手順の確認とSDKダウンロードを行い、Android開発環境を構築してください。
http://docs.unity3d.com/ja/current/Manual/android-sdksetup.html

### 2) Android Screen Monitor
Android Screen Monitorは、Android端末の画面をリアルタイムでPC上に表示するツールです。
下記のページを参考に、Android Screen Monitorをインストールしてください。
http://adakoda.github.io/android-screen-monitor/
http://www.adakoda.com/adakoda/android/asm/

### 3) Unity SDK
Unity SDKは、3Dモデルをアプリ内で使用するための3Dグラフィックエンジンとその開発環境です。
下記のリンクからダウンロードとインストールしてください。
http://japan.unity3d.com/unity/download/

### 4) Telepathy Unity SDK
Telepathy Unity SDKは、Telepathy上で動作するUnityを活用したAndroidアプリを開発するためのSDKです。
下記のリンクから開発者登録を行い、SDKをダウンロードしてください。
開発者登録；https://support-telepathy.com/
SDKダウンロード：https://support-telepathy.com/sdks
（開発者登録、SDKのダウンロードはいずれも無料です）

---
この他にもFBグループ「[Telepathy Developer Community](https://www.facebook.com/groups/987006401320333/)」を活用してTelepathy向けアプリケーションに関する情報を発信予定です。
是非ご参加いただき、あなたが開発したTelepathy向けアプリケーションをご紹介ください！
gulp-uglify で minify したけど、1行にならないとき（UglifyJS で改行位置の最適化をする）

例えば複数のライブラリを browserify でまとめて、コード量が多くなったものを minify すると、1行にならず複数行に渡ってしまうことがあります。
それは、output オプションの max_line_len デフォルト値が32000だからです！

## 解決方法
ouput オプションの max_line_len の値をデカくする。

```javascript:gulpfile.js
gulp.task('js',function(){
  browserify({
    entries: ['src/js/app.js']
  })
  .bundle()
  .pipe(source('main.js'))
  .pipe(buffer())
  .pipe($.uglify({
    output:{
      max_line_len: 100000
    }
  }))
  .pipe(gulp.dest('dst/js/'));
});
```

## というか解決しなくてもいい（2015/9/17 追記）
コメント欄でご指摘を受け、ClosureCompiler では圧縮コードに適宜改行が挟まれるという件について、理由を調べてみました。
以下にそのような内容の翻訳を見つけました。

http://www37.atwiki.jp/aias-closurecompiler/pages/30.html#id_74f9e4da
（原文は https://developers.google.com/closure/compiler/faq#linefeeds ）

改行が gzip にどのような影響を与えるのかについては具体的な内容を調べられていない状況ですが、第一に改行を0にするより gzip をするだけのほうが圧倒的に圧縮率は上がるので、本記事で行ったような指定はほとんど無意味か、場合によっては有害になるかもしれないです。
オプションの使い方の参考までにということで……！

## 補足
uglify の output オプションは他にもいろいろあります。
以下、オプションとデフォルト値を引用します。

```
indent_start  : 0,     // start indentation on every line (only when `beautify`)
indent_level  : 4,     // indentation level (only when `beautify`)
quote_keys    : false, // quote all keys in object literals?
space_colon   : true,  // add a space after colon signs?
ascii_only    : false, // output ASCII-safe? (encodes Unicode characters as ASCII)
inline_script : false, // escape "</script"?
width         : 80,    // informative maximum line width (for beautified output)
max_line_len  : 32000, // maximum line length (for non-beautified output)
ie_proof      : true,  // output IE-safe code?
beautify      : false, // beautify output?
source_map    : null,  // output a source map
bracketize    : false, // use brackets every time?
comments      : false, // output comments?
semicolons    : true,  // use semicolons to separate statements? (otherwise, newlines)
```

引用元
http://lisperator.net/uglifyjs/codegen
RaspberryPi:Pi_PiperでPermission Errorが起きる


最近のRaspbianでは、GPIOに出力するときにsudoが必要なくなりました。

例えば、GPIO17で出力をするとき。

```
echo 17 >/sys/class/gpio/export
echo out >/sys/class/gpio/gpio17/direction
echo 1 > /sys/class/gpio/gpio17/value
```

こんな感じで、上記のコマンドを一行づつシェルで実行すると、以前のようにsudoをつけなくてもGPIOの読み書きができるはずです。

##Pi_Piperを使うがエラー
ここで、RubyのPi_Piperを使ってGPIOを出力してみます。

```rb:test.rb
require 'pi_piper'

pin = PiPiper::Pin.new(:pin => 17, :direction => :out)
pin.on
sleep 1
pin.off
```
これをsudoなしで実行してみます。

しかし、`Pin.new`の時点で

```
2.2.0/gems/pi_piper-1.3.2/lib/pi_piper/pin.rb:24:in 
initialize': Permission denied @ rb_sysopen - /sys/class/gpio/gpio17/direction (Errno::EACCES)
```

と怒られてしまいます。


しかし、このときの`/sys/class/gpio/gpio17/`を`ls -la`してみると、

```
drwxrwx--- 3 root gpio    0  9月 17 14:56 .
drwxrwx--- 5 root gpio    0  9月 17 14:56 ..
-rwxrwx--- 1 root gpio 4096  9月 17 14:56 active_low
-rwxrwx--- 1 root gpio 4096  9月 17 14:56 direction
-rwxrwx--- 1 root gpio 4096  9月 17 14:56 edge
drwxrwx--- 2 root gpio    0  9月 17 14:56 power
lrwxrwxrwx 1 root gpio    0  9月 17 14:56 subsystem -> ../../../../class/gpio
-rwxrwx--- 1 root gpio 4096  9月 17 14:56 uevent
-rwxrwx--- 1 root gpio 4096  9月 17 14:56 value
```

となり、それぞれのペリフェラルファイルはgpioグループになっており、権限もグループにたいしてrwxである事が確認できます。(ユーザー:piもgpioグループが付与されています)


Pi_Piperの`pin.rb`をみてみると、23,24行目で

```rb
File.open("/sys/class/gpio/export", "w") { |f| f.write("#{@pin}") }
File.open(direction_file, "w") { |f| f.write(@direction == :out ? "out" : "in") }
```
となっています。

どうやら、RaspbianでGPIOをexportしたときに、/sys/class/gpio/gpioXX/以下のファイルは、一旦rootグループとなり、そのあとgpioになるようで、今回の問題は、gpioグループになる前にdirectionファイルに書き込もうとするので、Permission Errorになるようです。

##結論
`pin.rb`を編集し、

```rb
File.open("/sys/class/gpio/export", "w") { |f| f.write("#{@pin}") }

sleep 0.1

File.open(direction_file, "w") { |f| f.write(@direction == :out ? "out" : "in") }
```

と、sleepを入れることで解決。

###Versions:
>Pi_Piper (1.3.2) https://github.com/jwhitehorn/>pi_piper
>ruby 2.2.3p173 (2015-08-18 revision 51636) [armv7l-linux-eabihf]
>RASPBIAN Debian Wheezy 2015-05-05(Linux kernel 3.18)
リバースプロキシでBASIC認証して、認証で使ったユーザ名をプロキシ先のMediawikiに飛ばす

直接公開するサーバがあったり、リバプロ経由で公開するサーバがあったりで、ポリシーがばらばらだったので、統一させることにしました。直接公開がMediawikiだけだったので、Mediawikiを別サーバに移行して、リバースプロキシからプロキシできるようにしました。

# 環境
- Ubuntu 14.04
- Apache 2.4

# 目標
リバースプロキシでBASIC認証して、認証OKなら、認証したUserIDをプロキシ先のMediawikiに渡して、Mediawikiで利用中ユーザとして右上に表示する。

# 新Mediawikiの構築とデータの移行
まず、新しくMediaWikiを立てた。
立てたらデータ移行する。移行対象は「MySQL」と「添付ファイルを含むディレクトリ」を移行すればうまくいった。

移行元サーバで全DBを出力。(本当はMediawiki関連だけで十分だとは思う）
> mysqldump -u root -x --all-databases > mysql.dump

移行先サーバで全DBを上書き。（他にデータがある場合は消えてしまうので注意
> mysql -u root -p < mysql.sump

上記以外には、下記ディレクトリをそのまま移動すればOK。
> /var/lib/mediawiki
> /var/lib/mysql

# リバースプロキシの設定
リバースプロキシ自体は簡単。apacheの設定ファイルに下記を書くだけ。

```apache
ProxyPass 公開パス 転送先URL
ProxyPassReverse 公開パス 転送先URL

```

例えば、私の場合は https://ドメイン/wiki に来た時に、https://内部用wikiドメイン/wikiに飛ばすようにしたかったので、こう記述。

```apache
ProxyPass /wiki https://内部用wikiドメイン/wiki
ProxyPassReverse /wiki https://内部用wikiドメイン/wiki
```

しかし、これだけだと証明書でエラーが出てしまう。どうも、SSL（HTTPS）でProxy先へ飛ばす場合は、Proxy用の証明書の設定も必要。

```apache
SSLProxyCACertificateFile xxx.crt
```

証明書は事前にオレオレ証明書として作っておいたものを利用。

リバースプロキシ側でBASIC認証をするので、BASIC認証の設定も入れる。セキュリティ的な観点では、非暗号化状態では丸見えのBASIC認証よりは、Digest認証の方が望ましい。今回はSSLを使っているのでBASIC認証で問題ないだろうという判断。

```apache
<Location /wiki>
  AuthType Basic
  AuthName "Authentication for wiki"
  AuthUserFile /etc/httpd/.htpasswd
  Require user secret
</Location>
```

しかし、このままだと、BASIC認証した際のUserIDをプロキシ先に渡せないので、下記の設定を入れる。（参照: http://d.hatena.ne.jp/end0tknr/20140612/1402570414） ここでは認証済UserID（REMOTE_USERに入っている値）を、変数 X-Forwarder-User に入れている。X-Forwarded-Userに入れると、プロキシ先に渡してくれるよう。

```apache
 RewriteEngine On
 RewriteCond %{LA-U:REMOTE_USER} (.+)
 RewriteRule . - [E=RU:%1,NS]
 RequestHeader add X-Forwarded-User %{RU}e
```

全体として見ると、下記のような設定が必要。他にも当然、ProxyやSSLに関するモジュールを/etc/apache2/mods-enable/に入れる等は必要。

```apache:/etc/apache2/sites-enable/revp.conf
Listen 443
<VirtualHost *:443>
  SSLEngine on
  SSLProxyEngine on

  <Location /wiki>
    AuthType Basic
    AuthName "Authentication for wiki"
    AuthUserFile /etc/httpd/.htpasswd
    Require user secret

    RewriteEngine On
    RewriteCond %{LA-U:REMOTE_USER} (.+)
    RewriteRule . - [E=RU:%1,NS]
    RequestHeader add X-Forwarded-User %{RU}e
  </Location>

  SSLProxyCACertificateFile xxx.crt
  ProxyPass /wiki https://内部用wikiドメイン/wiki
  ProxyPassReverse /wiki https://内部用wikiドメイン/wiki
</VirtualHost>
```

# 新Mediawiki側の設定
基本的なサーバ設定と合わせて、UserIDを受け取って、それをREMOTE_USERに入れる設定が必要。（REMOTE_USERに入った値は、Mediawiki側で読み込まれて、Wikiの右上のユーザ名として表示される。ただし、そのためにはMediawiki側で拡張機能を導入する必要がある。（参照： https://www.mediawiki.org/wiki/Extension:Auth_remoteuser ））

```apache
  RewriteEngine On
  RewriteCond %{REMOTE_USER} $^
  RewriteCond %{HTTP:X-Forwarded-User} (.+) [NC]
  RewriteRule . - [E=REMOTE_USER:%1,NS]
```

最終的にはこういうコンフィグになる。

```apache:/etc/apache2/sites-enable/wiki.conf
Listen 443
<VirtualHost *:443>
  DocumentRoot /var/lib/mediawiki
  ServerName 内部用wikiドメイン
  SSLEngine on
  SSLProxyEngine on
  SSLCertificateFile xxx.crt
  SSLCertificateKeyFile xxx.key

  RewriteEngine On
  RewriteCond %{REMOTE_USER} $^
  RewriteCond %{HTTP:X-Forwarded-User} (.+) [NC]
  RewriteRule . - [E=REMOTE_USER:%1,NS]
</VirtualHost>
```

これで完了。
gRPCをVisual Studio C++(2013)でビルドする

最近話題のgRPCを、MSVC++(2013)でビルドしてみた。一応動作まではさせてるけど、長くなるのでこのTIPSではビルドまでとする。もうβなのに、Windowsで使おうとすると色々バグっぽいものがあった。

##環境
このTIPSでは、以下の環境を使用して評価・検証を行っている。

| 項目        |内容                                     |
|:-----------|:----------------------------------------|
| OS         | Windows 10 pro 32bit (Parallel Desktop) |
| Machine    | MacBook Pro (Retina, 13-inch, Mid 2014) |
| MSVC++     | 2013 update5                            |
| CMake      | 3.3.1                                   |
| gRPC       | Beta Release 0.11.0                     |
| protobuf   | Version 3.0.0-beta-1                    |


##ビルド
[gRPC](https://github.com/grpc/grpc)を適当なフォルダにgit cloneしてくる。
gRPCは様々なsubmoduleを持っているので、悪いこと言わんからZIPとかで落とさないこと。

###protobufのビルド
grpはprotobufのv3以上に依存している。opensslとかは、gRPC内のvsprojectでNugetパッケージ指定されているので自動で持ってきてくれるが、protobufは自分でビルドしないといけなかった。protobuf v3にはvsprojectが含まれていないので、CMakeList.txtからvsprojectを生成する必要がある。
なお、当初MSVC++ 2015を使ってビルドしようとしたが、Releaseモードのみリンクエラーが出てビルドできなかった。調べてみると、[自分だけではないみたい。](https://github.com/google/protobuf/issues/240)仕方がないのでMSVC++2013をインストールしたけど、今はもう直ってるくさい（未確認）

####cmakeでvsprojectを生成
cmakeを起動して、ソースコードディレクトリとビルドディレクトリを指定する。両方とも、protobufのcmakeフォルダを指定すること。(grpc/third-party/protobuf/cmake)
指定したら真ん中あたりのConfigureボタンを押す。
![スクリーンショット 2015-09-17 14.32.45.png](https://qiita-image-store.s3.amazonaws.com/0/93136/7820858d-48fe-0be1-822c-9836ef627a6f.png "スクリーンショット 2015-09-17 14.32.45.png")

生成するvsprojectのバージョンを選んでしばらくすると、エラーがでる。これは依存するテスト関連モジュールが見つからないかららしい。BUILD_TESTのチェックを外して再度Configureを押す。さらっとConfigure Doneと言ってくるのですかさずGenerate。
![スクリーンショット 2015-09-17 14.42.30.png](https://qiita-image-store.s3.amazonaws.com/0/93136/da966c94-2c52-c23a-f2cc-220af3650628.png "スクリーンショット 2015-09-17 14.42.30.png")

####ビルドする
grpc/third-party/protobuf/cmake配下に生成されたprotobuf.slnを開き、ビルドする。
細かいことは考えなくてよいはず。


###gRPCのビルド

####したごしらえ
gRPCにはvsprojectsが付属しているので、ポチポチ押すだけでビルドできる。ところが、ビルドは成功するんだけどクライアント側の動作に問題がでる。この問題は既にGitHubに[issue](https://github.com/grpc/grpc/issues/3336)として上がっていて、vsprojectを変更することで回避できる。具体的には、拡張子がvcxprojなファイルに含まれる全ての"_USE_32BIT_TIME_T;"を、""に置換してやればいい。（ダブルコーテーションは説明用につけてる。実際は含まない）該当箇所は数千箇所あるので、sakuraなりなんなりでgrep置換しよう。

####ビルドする
grpc/vsprojects配下の
grpc.sln
grpc_csharp_ext.sln
grpc_protoc_plugins.sln

をそれぞれ開いてビルドする。
Release-DLLとかDebug-DLLとかいうビルドモードがあるが、C#用のビルドオプションであり、C++向けのDLLにしてくれるわけではないようだ。

以上でビルドが完了するはず。お疲れ様でした。
[JavaScript] iOSでdocumentに張ったclickイベントが発火しない

※環境
iOS8.4.1 / iPhone5

あとから追加される要素にイベントを張るときによく使う

```js
$(document).on('click', '#target', function(){...});
```

iOSだとイベント発火してくれない。知らなかった...


## 解決策

**document → 別のDOMセレクタに置き換える**

```js
$('#wrapper').on('click', '#target', function(){...});
```

※windowもbodyでもだめらしい



## おまけ

**※ 2015/09/19追記 過去に起こっていたようですが、
iOS8.4では修正済みのようで以下のコードは動作します。**

jQueryに限った問題ではなく、生JSで

```js
document.addEventListener('click', function(){...})
```

と書いても同じ現象が起こります

## 参考
http://qiita.com/38kun/items/ce6a26c9c59612e6f515
http://kimizuka.hatenablog.com/entry/2013/12/20/075448
UIPageControllerで一部のGestureのみを無効にする方法


UIPageControllerは、page curlモードだと、デフォルトでは

* 画面の左右端タップでページめくり
* 画面を左右スワイプでページめくり

の２つのgestureRecognizerを持っている。

    pageViewController.gestureRecognizers

で取得できるので、型判別して、それぞれを無効化することが出来る。

## サンプルコード

```swift
class HogeViewController: UIViewController {
	override func viewDidLoad() {
		super.viewDidLoad()
		let pageVC = //pageViewControllerを取得してきます

		// tapによるページめくりを担当するインスタンスを取得　
		let tapGestureRecognizer = pageViewController.gestureRecognizers.filter{ $0 is UITapGestureRecognizer }.first as! UITapGestureRecognizer

		// swipeによるページめくりを担当するインスタンスを取得　
		let panGestureRecognizer = pageViewController.gestureRecognizers.filter{ $0 is UIPanGestureRecognizer }.first as! UIPanGestureRecognizer

		// 例 swipeによるページめくりは有効、tapによるページめくりは無効
		tapGestureRecognizer.enabled = false
		panGestureRecognizer.enabled = true
	}
}
```
Pepper（NAO）をMac経由でインターネットに接続する

# 概要
この前、NAOの無線LANの調子が悪く、インターネットやパソコンに接続ができなくなった。
PepperやNAOは、頭の後ろを開けるとLANケーブルを接続できるので、持っているLANケーブルを使ってMacとNAOを接続したところ、MacからNAOを操作することはできるようになった。しかし、困ったことにMacからはインターネットに接続できるが、NAOからは接続できなかった。そのため、WebAPIを呼び出すアプリが使い物にならなくなってしまった。

最終的に、NAOからMacを経由してインターネットに接続できるようにしたので、その方法を共有したい。なお、NAOでしか試していないが、Pepperでも同様な方法で接続できるはず。


# 環境
* OS X Yosemite 10.10.2

# 方法
方法は非常に簡単。以下の方法で、Macをルーター化するだけ。
1. システム環境設定を開く
2. 共有からインターネット共有を選択
3. 共有する接続経路で「Wi-Fi」を選択
4. 相手のコンピュータが使用するポートで「USB Ethernet」を選択

参考までに、設定のスクリーンショットを貼っておく。
![スクリーンショット 2015-09-07 15.42.36.png](https://qiita-image-store.s3.amazonaws.com/0/77079/026719c5-9608-1a20-b667-99cea3c28631.png)
XCode7(iOS9)にして最初に出たエラーと対策方法とか


## Swift2でのSyntaxエラー対応
#### XCode menu bar -> Edit -> Convert -> To Latest Swift Syntax...

Objective-Cベースのプロジェクトで
一部Swift製ライブラリを使用していた程度だったので
ほぼこれで問題なかった


## does not contain bitcodeエラー

->[Xcode7GMでビルドすると「does not contain bitcode.」とか言われる](http://qiita.com/Takumi_Mori/items/ace01198c43c8bac6df0)

## 非SSL/TLSサイトのデータが取得できない

アプリ内から非SSL/TLSサイトにアクセスすると、以下のログがでてブロックされる

```
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
```

特定ドメインでATSを無効にする設定は .plistに以下のように追記

```
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>your.domain.com</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>
```
参考:[[iOS 9] iOS 9 で追加された App Transport Security の概要](http://dev.classmethod.jp/smartphone/iphone/ios-9-intro-ats/)

## Localizable.stringが効かない、英語になる

->[iOS9で日本語のLocalizable.stringが適用されない](http://qiita.com/Takumi_Mori/items/0126533eb8b622400111) 
>日本語のコードが「ja」から「ja-JP」や「ja-US」などのコードに変更されました。
Velocity.js 使ってアニメーションでトグルする為の class

アニメーションでトグルって良く使うんだけど、毎回その為の関数を用意するのが面倒なんで、出来るだけ簡単にかつ汎用性があるやつ作ってみた。
ただ、これが処理的に良いのかは分からないけど。。。

## 編集履歴
- CoffeeScript -> ES20616（2016/8/2）

## Class

```js:ES2016
import 'lodash';

class ToggleAnimate {

  static get defOpts() {
    return {
      el      : null,
      anime   : [{},{}],
      showType: 'display',  // [display | visibility | null]
      opts    : {},
    }
  }

  constructor(_opts = {}) {
    const { el, anime, showType, opts } = _.defaults(_opts, ToggleAnimate.defOpts);

    this.el       = el;
    this.anime    = anime;
    this.showType = showType;
    this.opts     = opts;
  }

  run(_toggle, _opts = {}) {
    const defOpts_ = {
      el   : this.el,
      opts : this.opts,
      anime: (_toggle ? this.anime[0] : this.anime[1]),
    }

    const { el, anime, opts } = _.defaultsDeep(_opts, defOpts_);

    const opts_ = _.clone(opts);

    if(typeof anime !== 'string') {
      switch(this.showType) {
        case 'display':
          opts_.display = _toggle ? 'block' : 'none';
          break;
        case 'visibility':
          opts_.visibility = _toggle ? 'visible' : 'hidden';
          break;
      }
    }

    Velocity(el, 'stop');
    Velocity(el, anime, opts_);
  }

}
```

## 使い方

```js:ES2016
const toggle = new ToggleAnimate({
  el: document.getElementById('sample'),
  anime: [{
    opacity: 1,
  }, {
    opacity: 0,
  }],
});

toggle.run(true);
```

語彙が少ないので命名がダサい気がする。
特に表示切り替えメソッドの `run` とかコレでいいのかって感じ。