OmniAICreator/Qiita-1.07M huggingface dataset:
watchOS 3 で追加された WKCrownSequencer でデジタルクラウンの状態を取得してみる

※本記事は、[一般に公開されている情報](https://developer.apple.com/reference/watchkit/wkcrownsequencer)を元に作成しています

# これは何

watchOS 3 で追加された `WKCrownSequencer` を使って、デジタルクラウンの状態（回転速度など）を取得する方法をメモします。

## 動作環境

* Xcode 8.0 beta 1
* watchOS 3.0 beta 1

# 実装

デジタルクラウンの状態は、 `crownSequencer` オブジェクトが保持しています。

`WKInterfaceController` のプロパティとして新たに

```swift
public var crownSequencer: WKCrownSequencer { get }
```

が追加されているので、自分でインスタンスを生成する必要はありません。

## デリゲートセット

まずは、`crownSequencer ` のデリゲートをセットしましょう。

```swift
class CrownDetailController: WKInterfaceController, WKCrownDelegate {
```

```swift
crownSequencer.delegate = self
```

この状態ではまだ　`crownSequencer`　にフォーカスが当たっていないため、`focus()` メソッドを呼ぶ必要があります。

```swift
override func willActivate() {
    super.willActivate()
    crownSequencer.focus()
}
```

これでデジタルクラウンの状態変化を受信可能になりました。 

## デリゲートメソッド

デジタルクラウンの状態が変化すると次のデリゲートメソッドが呼ばれます。

### crownDidRotate

ユーザがデジタルクラウンを回転させた時に呼ばれます。

```swift
func crownDidRotate(WKCrownSequencer?, rotationalDelta: Double)
```

`rotationalDelta` にはデジタルクラウンの回転数？が返ってくるようです。

> The amount that the crown has rotated since the last update. A value of 1.0 represents one full rotation. The value’s sign indicates the rotation’s direction, but the sign is adjusted based on the crown’s orientation. Positive values always indicate an upward scrolling gesture, while negative numbers indicate a downward scrolling gesture.

`1.0` が 1回転したことを表し、上方向にスクロールするとプラスの値が、下方向にスクロールするとマイナスの値になるようです。

また、デジタルクラウンの回転速度は、`WKCrownSequencer` の `rotationsPerSecond` プロパティで確認することもできます。

### crownDidBecomeIdle

ユーザがデジタルクラウンの回転を止めた時に呼ばれます。

```swift
func crownDidBecomeIdle(WKCrownSequencer?)
```


また、デジタルクラウンが回転しているかどうかは、`WKCrownSequencer` の `isIdle` プロパティで確認することもできます。


# 注意点

InterfaceController 上にスクロール可能なオブジェクトがある場合は少し注意が必要です。例えば`WKInterfacePicker` にフォーカスが当たった場合、`WKCrownSequencer` のフォーカスは外れます。再びフォーカスを当てるためには再度 `focus()` メソッドを呼ぶ必要があります。

# リンク

* [WatchKit Catalog: Using WatchKit Interface Elements](https://developer.apple.com/library/prerelease/content/samplecode/WKInterfaceCatalog/Introduction/Intro.html) - WKCrownSequencer のサンプルコードも追加されています
* [WKCrownSequencer - Apple Developer Documentation](https://developer.apple.com/reference/watchkit/wkcrownsequencer)
* [【watchOS 3】API Diffsから見る watchOS 3 の新機能 #WWDC2016 - Over&Out その後](http://d.hatena.ne.jp/shu223/20160614/1465887566) - shu223さんによる神記事
Google Drive API v2 から v3 への移行でつまづいたいくつかの点

## Google Drive API v2 から v3 への移行でつまづいたいくつかの点


Google Drive API .NET を使って v2 から v3 へアプリケーションを移行するのにつまづいた点をまとめました。


### 1 フィールド(プロパティ)の名前が変わった
　File オブジェクトのフィールド(プロパティ)が変わっています。一番影響を受けるのが、ファイルの名前で v2 では Title プロパティで取得していたのが v3 からは Name プロパティになります。ファイルの日時も ...Date から ...Time に変わりました。他にもあるかしれませんが、よく使いそうなところとしてはこんなところでしょうか。


### 2 ファイル情報(フィールド)の取得方法
　v2 ではファイル情報は全部返してきたかと思いますが、v3 では取得するものを指定しないと Nothing (C# では null) が返されます。取得項目は GetRequest の Fields プロパティにカンマ区切りテキストで指定します。このフィールド名は大文字小文字が正確でないとエラーになります。

    Public Function GetFile(ByVal id As String) As Data.File
        Dim request As FilesResource.GetRequest = service.Files.Get(id)
        request.Fields = "name,id,parents,size,description,modifiedTime,mimeType,owners,fileExtension,spaces,webContentLink"
        Dim File As Data.File = request.Execute()
        Return file
    End Function


### 3 ファイルの場所がトップレベル(Root)かの判別
　v2 では Parents コレクションの要素 (ParentRefernce 型) に IsRoot プロパティというのがあって簡単に判別できたのですが、v3 ではParents コレクションの要素は String 型(フォルダのId)に変わっています。
　この Id を使って File オブジェクトを取得するとファイルの場所がトップレベル(Root)でも有効な Id が取得されます。この Id から名前 (Name プロパティ) を取得すると "マイドライブ" (日本語版の場合)となります。
　したがって、ファイルの場所がトップレベルかどうかは、親のフォルダの Id を使って親の名前を取得し、それが"マイドライブ"であるかを確認するしかないようです。（どこかに IsRoot みたいのがあるかもしれませんが）


とりあえず、つまづいたところは現在のところ以上です。
VMware vCenter Converterを使用したP2Vに失敗するときにチェックすること

# 概要

VMware vCenter Converterを使用して、物理マシンを仮想マシン化するときに失敗することがあります。

例えばこんな風に

```
FAILED: A file I/O error occurred while accessing
```

![vcenter1.PNG](https://qiita-image-store.s3.amazonaws.com/0/59475/ce0af122-6434-0967-c242-363e61e6bbc9.png)

そんなときにチェックするべきことです。

# 物理マシンをchkdskする

コンバートの半ばで止まるときは、物理マシンのディスクがあやしいです。
`chkdsk /b`でディスクを検査します。
ついでにdefragもします。

# ログを見る

失敗したタスクを右クリックして、ログをエクスポートします。
大量のログがZIPファイルにまとめられてエクスポートされるので開きます。

![vcenter2.PNG](https://qiita-image-store.s3.amazonaws.com/0/59475/cb32f1c8-3860-5e61-6fd2-99a1da63ea21.png)

## Converter自体のログを見る

最初に見るのは`vmware-converter-server-*.log`です。


```
2016-06-16T09:05:46.747+09:00 error vmware-converter-server[04780] [Originator@6876 sub=Default] [task,350] [LRO] Unexpected Exception: converter.fault.FileIOFault
2016-06-16T09:05:46.763+09:00 info vmware-converter-server[04780] [Originator@6876 sub=Default] [task,379] [task-4] -- ERROR -- Convert: converter.fault.FileIOFault
--> (converter.fault.FileIOFault) {
-->    faultCause = (vmodl.MethodFault) null, 
-->    file = "", 
-->    msg = ""
--> }
```

とくに情報ないですね。。。

## Agentのログを見る

worker-diagnostics-task-*-omo.zipを開きます。

![vcenter3.PNG](https://qiita-image-store.s3.amazonaws.com/0/59475/d2e96cfa-109b-93af-8c44-6db23072b4a7.png)

agentTask-task-*.zipを開きます。

![vcenter4.PNG](https://qiita-image-store.s3.amazonaws.com/0/59475/3129425c-0b53-f052-8b70-9ff995e4daa3.png)

vmware-converter-agent-*.logを開きます。

```
2016-06-16T09:05:21.671+09:00 warning vmware-converter-agent[03808] [Originator@6876 sub=Default] [,0] [NFC ERROR] NfcNewAuthdConnectionEx: Failed to connect to peer. Error: Host address lookup for server vms02 failed: No such host is known
2016-06-16T09:05:21.671+09:00 info vmware-converter-agent[03808] [Originator@6876 sub=Default] Sysimgbase_DiskLib_OpenWithPassPhrase failed with 'NBD_ERR_NETWORK_CONNECT' (error code:2338)
```

原因見つかりました！

仮想マシンホストの名前解決ができていないみたいです。
なんででしょな。。。

# VMwareのKBを検索する

https://kb.vmware.com/selfservice/microsites/searchEntry.do

製品にVMware vCenter Convertgerを選び、単語「fail」で検索すると結構ヒットします。

以上です。 :smile:
jsとpythonでfilter, map, reduce (アロー式、lambda式、内包表現もあるよ)

### はじめに
pythonでWebアプリ作ってていつも混ざるのでメモ。

### JavaScript
#### フルバージョン
```js
var orig = [{id: '0000', value: 0},
            {id: '0001', value: 1},
            {id: '0002', value: 2}];
 
// filter
var filtered = orig.filter( function(el,idx,ary) {
  return el.id=='0001';
});
// [{id: '0001', value: 0}]
 
// map
var mapped = orig.map( function(el,idx,ary) {
  return el.value;
});
// [0, 1, 2]
 
// reduce
var reduced = mapped.reduce( function(hist,el,idx,ary) {
  return hist+el;
});
// 3
 
// 直接書換え
$.each(orig, function(idx,el) {
  el.value += 100;
});
// [{id: '0000', value: 100},
//  {id: '0001', value: 101},
//  {id: '0002', value: 102}]
```
それぞれ、elは各要素、idxはインデックス、aryは元の配列。
filter, map, reduceのidx、aryは省略可能。
 
 
#### アロー式
```js
// filter
var filtered2 = orig.filter( el => el.id=='0001' );
 
// map
var mapped2 = orig.map( el => el.value );
 
// reduce: lambda式
var reduced2 = mapped2.reduce( (hist,el) => hist+el );
 
// 直接書換え
$.each(orig, (idx,el) => { el.value+100 } );
```
reduceの`hist`は、それまでの計算の実行結果。
 
### Python
#### lambda式
```py
orig = [{'id': '0000', 'value': 0},
        {'id': '0001', 'value': 1},
        {'id': '0002', 'value': 2}]
 
# filter
filtered = filter(lambda el: el['id']=='0001', orig)
 
# map
mapped = map(lambda el: el['value'], orig)
 
# reduce
reduced = reduce(lambda hist,el: hist+el, mapped)
```
 
#### 内包表現
```py
# filter
filtered2 = [ el for el in orig if el['id']=='0001' ]
 
# map
mapped2 = [ el['value'] for el in orig ]
```

 
### その他注意
#### オブジェクト内へのアクセス方法
- JavaScriptは`object.key`
- Pythonは`object['key']`
 
#### JavaScriptのアロー式について
```js
// 基本形
function(param1, ..., paramN) { statements }
(param1, ..., paramN) => { statements }
 
// 値をreturnする場合、{}を省略可能。
function(param1, ..., paramN) { return expression; }
(param1, ..., paramN) => { return expression; }
(param1, ..., paramN) => expression
 
// 引数が1つの場合、()を省略可能。
(param) => { statements }
param => { statements }
```
Railsのmodelクラスのselfが曖昧だったので

こんにちは！Rails初心者の僕が最近、躓いた点がこちらです。

modelクラスのselfって何だ....

#1.クラスメソッドとインスタンスメソッド

modelクラスの中でメソッドを定義する際に、メソッド名の頭にself.を付けるとクラスメソッド
付けないとインスタンスメソッドになります!

```article.rb
class Article < ActiveRecord::Base
  def hoge         #インスタンスメソッド
  end
  
  def self.hoge    #クラスメソッド
  end
end
```

上のは<Font color="red">self.hoge</font>は<Font color="red">def Article.hoge</font>と同じ意味ですね！

#2.使い分けについて

インスタンスメソッドはそれぞれのインスタンスに対して参照などをするメソッドとして使います！

クラスメソッドはmodelクラスのレコードを検索するなどの用途や作成されたインスタンスの数を数えるなど、個々のインスタンスには紐付けずクラスに対して働きかけるメソッドです！

#3.メソッド内でselfを使用する場合

クラスメソッド内でselfを使うとクラスを指し、インスタンスメソッド内でselfはそのインスタンスになります!

```article.rb
class Article < ActiveRecord::Base
  def hoge       #インスタンスメソッド
  end

  def self.hoge  #クラスメソッド
  end

  def pdf       #インスタンスメソッド
    self.hoge        #インスタンスメソッドのhogeが呼ばれる
    hoge             #インスタンスメソッドのhogeが呼ばれる
    self.class.hoge  #こうするとクラスメソッドのhogeを呼べる
  end

  def self.pdf  #クラスメソッド
    self.hoge        #クラスメソッドのhogeが呼ばれる
    hoge             #クラスメソッドのhogeが呼ばれる
  end
end
```

モデルも上手く利用してアプリケーション創っていきたいな...
【Firebase Analytics】導入における注意点

# はじめに

モバイル特化版Google Analyticsとも言われるFirebase Analytics。
イベントや登録したユーザープロパティからユーザーリストを作成することができ、
セグメント毎のユーザーの分析などを非常に簡単に行うことができる便利なツールです。
ただ、導入にあたっていくつか知っておきたい注意点があったのでまとめます。

間違いや他に注意したい点などがあればご教授ください :raised_hands: 

※全て**2016/06/16**時点での情報になります。

# 注意点その１：イベント型分析ツール

Firebase Analyticsは全てアプリケーション内で起こるイベントを取得して分析を行います。

つまり、ページビューなどに注目するのではなく、ユーザーの行動に着目して分析を行うツールということになります。

よって、**Google Analyticsの「スクリーンビュー」のようなものを個別に取得・分析するようなAPIやインターフェースはありません。**

スクリーンビューを分析するには、それ自体をイベントの一つとして取ればいいのですが、必要でなければそこまでしなくてもいいかなと思います。

※この項目はFirebase Analyticsそのものの特徴なので、注意点とするまでもないことですが、
私自身がもともとウェブの人間でPVを気にする習慣があったので、この違いは念頭に置いておきたいなと思い、書き出しました。

参考：
http://googledevjp.blogspot.jp/2016/05/firebase.html

# 注意点その２：各種制限

[公式の紹介動画](https://youtu.be/iT6EaIwtonY?list=PLl-K7zZEsYLmOF_07IayrTntevxtbUxDL)にもありますが、
どのプランでも機能差がなく、サンプリングもされないデータを、**無料**で分析することができます。

しかし、幾つかの**制限事項**が設けられているので、把握した上で使用したいですね。

以下、私が把握している制限事項になります。

| 制限事項 | 上限 |
|:-:|:-:|
| イベント登録数 | 500 |
| イベントに付与するパラメータ数 | 25 |
| ユーザープロパティ登録数 | 25 |
| ユーザーリスト登録数 | 50 |

本来は、個人を特定できるようなデータを除いて取れるデータは全て取っておきたいものですが、このような制限の中でやる場合は、
むやみやたらにイベントをFirebase Analyticsに飛ばしたり、必要でないユーザープロパティを登録するのではなく、しっかり考えた上で登録する必要がありそうです。

### リファレンス
- [イベント登録数・パラメータ数・ユーザープロパティについての記述](https://firebase.google.com/docs/reference/ios/firebaseanalytics/interface_f_i_r_analytics#method-detail)
- [ユーザーリストについての記述](https://support.google.com/firebase/answer/6317509?hl=ja#create-an-audience)

# 注意点その３：カスタムイベントのパラメータ

Firebase Analyticsではカスタムイベントにパラメータを付与して分析を行うことができますが、
**パラメータをダッシュボード上で確認・利用する事ができません。**

Firebase AnalticsはBigQueryへ生のデータを送る事ができ、BigQueryへはきちんと設定したパラメータの値が保存されます。
BigQueryへデータをため、そのデータを分析するような使い方をする場合には、正しく設定したパラメータを使用する事ができるようです。

この注意点については、注意点その２で記述したような「イベント登録数の制限」も相まって、少し使いづらい点かなと感じています。


# おわりに

以上、私が把握している中で注意しておきたい点をまとめました。
まだしっかり触って分析したりということまではしていないので、実際に使うとまだ何かあるかもしれません。

分析ツール選びの際などにこのようなことを踏まえて考えられるといいかと思います。

また、イベント名に使える文字や予約語など細かい事項については触れていないので、その辺りは公式のリファレンスを参照頂ければと思います。
Vue.jsでコンポーネント作成、親子でのdispach/broadcast (まとめ中）

### まだまとめ中

やっとわかりやすい解説を見つけたのでメモ。理解できたら自分なりにまとめる。
[Vue.jsのComponentsの使い方](http://www.ie-kau.net/entry/2015/07/19/Vue.js%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E5%91%A8%E3%82%8A%E3%81%AE%E6%95%B4%E7%90%86)
[Vue.js で 複数のViewModelを連携させる](http://kitak.hatenablog.jp/entry/2014/10/01/090204)

### 途中経過のメモ
- Vue.extend()が返すのはコンストラクタな件
- createdで$on呼ぶ代わりにevents使う件
- 子のインスタンス取得するにはv-refでid付ける件（ケバブでつけるとキャメルで呼べる）
- 配列をwatchしてるのに反映されない件（未解決）
VirtualBoxにUbuntu16.04をインストール

# はじめに

VirtualBoxにUbuntu16.04をインストールする手順をまとめます。

# 環境

- Windows7
- VirtualBox(5.0.16)

# 準備

## isoイメージの取得

下記のサイトからisoイメージを取得します。
http://releases.ubuntu.com/16.04/

今回はUbuntu16.04の64bit版を使用するので、 `ubuntu-16.04-desktop-amd64.iso` を取得しました。

## 仮想マシンの作成

まずVirtualBoxを起動し、仮想マシンの作成を行います。

左上の「新規」ボタンを押すと仮想マシン作成ダイアログが表示されます。

### 名前とオペレーティングシステム

| 名前 | タイプ | バージョン |
|:-:|:-:|:-:|
| 任意の文字列 | Linux | Ubuntu(64-bit) |

※もし32bit版のisoを使用する場合は、32bitを選択してください。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/85396/624b8d3d-fc0c-bec4-792e-6c87ba751afd.png)

### メモリーサイズ・ハードディスク

次に、メモリーやハードディスクのサイズなどの設定が続きます。
必要に応じてサイズ等は設定してください。
メモリーサイズについては後から変更することができます。

### isoファイルを指定

一通りの設定を終えると先ほど作成した仮想マシンが左側の仮想マシン一覧に追加されます。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/85396/720dadf4-96c7-77e1-c22a-f5559a9a9ca3.png)

次に先ほど作成した仮想マシンを選択し、左上の設定ボタンを押します。

仮想マシンの設定ダイアログが表示されたら、左側のメニューから「ストレージ」を選択します。

コントローラー:IDEの下の「空」をクリックし、
右側の属性のプルダウンメニューの隣に表示されているディスクのマークをクリックします。

![12.png](https://qiita-image-store.s3.amazonaws.com/0/85396/1de77b09-cbc6-9f2c-39a4-ed2272cbe86b.png)

「仮想光学ディスクファイルを選択」を押して、
事前にダウンロードしておいたisoファイルを選択します。

これでUbuntu16.04をインストールするために必要な準備は完了しました。

# インストール手順

一通りの準備が終わったので、さっそく仮想マシンを起動しインストールを始めます。

左側の仮想マシンの一覧から作成した仮想マシンを選び、上部の「起動」ボタンを押します。
新しくウィンドウが立ち上がり、しばらくすると以下のようなインストール画面が表示されます。

![14.png](https://qiita-image-store.s3.amazonaws.com/0/85396/3edc037d-a00c-6d66-b1a3-6fdfbc7bee71.png)

## インストール準備

ウィンドウの左側から言語を選択し、「Ubuntuをインストール」をクリックしてください。

次の画面では、Ubuntuのインストール準備として以下が選択できます。

* Ubuntuのインストール中にアップデートをダウンロード
* サードパーティーソフトウェアのインストール

今回は、アップデートのダウンロードのみを選択しました。

# インストールの種類

次に、インストールの種類を選択します。

ここでは「ディスクを削除してUbuntuをインストール」を選択します。
ディスクに変更を書き込むかどうか聞かれるので「続ける」をクリックします。

# タイムゾーンとキーボードレイアウト

続いて、タイムゾーンやキーボードのレイアウトを設定する画面が表示されるので
任意のものを選択してください。

# ユーザー情報

最後にユーザー情報を入力する画面が表示されます。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/85396/e9d75033-ef7c-9778-b615-c4a21c30b5cc.png)
# インストール開始

全ての入力が終わったら、インストールを開始します。

ユーザー情報入力画面、右下の「次へ」ボタンを押すとインストールが始まります。

少し時間がかかりますが、インストール完了のダイアログが出るまで待ちます。

# 再起動

インストールが完了しましたというダイアログが出たら「今すぐ再起動」をクリックします。

以下は再起動後、ログインしたあとのホーム画面です。

![24.PNG](https://qiita-image-store.s3.amazonaws.com/0/85396/14486103-c8bf-17d5-f6e5-2d6f7882c821.png)

まだクリップボードの共有やウィンドウの最大化など未設定な部分はありますが、
無事Ubuntu16.04のインストールができました。

# 参考サイト
[Ubuntu 16.04 (Xenial Xerus)](http://releases.ubuntu.com/16.04/)
[古都のIT職人Blog Ubuntu 16.04 LTS （デスクトップ版）をインストールしてみた](http://a244.hateblo.jp/entry/2016/04/22/223129)
【論文シリーズ】深層生成確率ネットワーク

## 原文
[誤差逆伝播法により学習可能な深層生成確率ネットワーク (Deep Generative Stochastic Networks Trainable by Backprop)](http://goo.gl/nUK4gr)
Yoshua Bengio (2013)

## 1. 要約／背景
* 新しいパラメータ最適化計算方法の提言。
* 最大最尤値の使用に代わって、単純な誤差逆伝播法のみで最適パラメータを決定できる。
* DBMでは層間の事前学習無しで、誤差逆伝播法のみでパラメータ推定ができる点が素晴しい

## 2. 骨子の理論
(1)ノイズ除去AE (Auto Encoder)における、Marcov Chainの効果
データ間のマルコフ連鎖がエルゴート性を示すとき、ノイズ除去AEの分布$P(X|\tilde X)$が、元データの分布$P(X)$に収束する。

(2)Marcov連鎖が不変分布を示すときの性質
可視変数と隠し変数の間で、多くの条件付き確率に関する性質が成り立つ。

![151130193411_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/14e8fe06-71b1-b516-6fea-8b3a2831f395.jpeg)

・すべての$P(X_t=x|H_t=h)=g(x,h)$に対して、同じ密度を持つ。$(t \geqq 1)$
・すべての$P(X_{t+1}=x|H_t=h',X_t=x)=f(h,h',x)$に対して、同じ密度を持つ。$(t \geqq 0)$
・$P(H_0=h|X_0=x)=P(H_0=h|X_o=x)$
・$P(X_1=x|H_1=h)=P(H_0=x|H_1=h)$
すべての$(x,h)$において、
・$P(X_0=x|H_0=h)=g(x,h)$(ただし$t \geqq 1$)
・$P(X_{t}=x,H_t=h)=P(X_{0}=x,H_0=h)$(ただし$t \geqq 0$)



(3)DBM中での関係

![151130193411_3.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/343fdea9-b0b8-9144-5bc0-d4c55a01006c.jpeg)

変数の構成は、ギブスサンプリング様であるが、上記2つの性質を加味すると、層間のノイズ除去と最大最尤推定が対応する。
結果として、単純な誤差逆伝播法のみで、事前学習なしのパラメータ設定が可能になる。



## 3. モデル適用例
*************************************************************************
MNISTサンプルに対するパルツェン対数尤度を比べる。
GSNの対数尤度は、1890±29だった。
これは、DBNの尤度1908±66と遜色ない。
新しい最適化の計算方法の有効性が示唆される。
GooglePlayStoreアプリを開くスニペット

GooglePlayStoreアプリがあったらアプリを開き、なかったらWebで開く実装です。

```java
private void openPlayStore(Context context) {
    final String appPackageName = context.getPackageName();
    try {
        context.startActivity(new Intent(Intent.ACTION_VIEW,
            Uri.parse("market://details?id=" + appPackageName)));
    } catch (android.content.ActivityNotFoundException anfe) {
        context.startActivity(new Intent(Intent.ACTION_VIEW,
            Uri.parse("http://play.google.com/store/apps/details?id=" + appPackageName)));
    }
}
```
AndroidでJava8を使う時の設定手順


# Why Java8?
lambdaやoptionalを使うために、Java8で開発したいという欲求からです。
kotlin使ってる人はkotlinの方がいいと思います。


# Check current java version
`java -version` で確認しましょう。

```shell
% java -version
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)
```

コンパイルバージョンも確認。

```shell
% javac -version
javac 1.7.0_71
```

インストールされている全てのJavaバージョンを確認。

```shell
% /usr/libexec/java_home -V
Matching Java Virtual Machines (3):
    1.7.0_71, x86_64:	"Java SE 7"	/Library/Java/JavaVirtualMachines/jdk1.7.0_71.jdk/Contents/Home
    1.6.0_65-b14-462, x86_64:	"Java SE 6"	/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_65-b14-462, i386:	"Java SE 6"	/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
```

# Java8をダウンロードとインストール
[Oracleのページ](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)へ。 `jdk-8u60-macosx-x64.dmg` でいいはずです。

ダウンロードしたdmgファイルを叩いてインストールを完了させると、javaバージョンが切り替わっているはずです。

```shell
% java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
```

```shell
% javac -version
javac 1.8.0_60
```

# Set `JAVA8_HOME` env
`JAVA_HOME` を設定します。

```
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
```


AndroidはまだJava8に対応していないので、[retrolambda](https://github.com/orfjackal/retrolambda)というライブラリを使います。retrolambdaをうまいことコンパイルするために[gradle-retlolambda](https://github.com/evant/gradle-retrolambda)というgradleプラグインを使います。

gradle-retrolambdaは、 `JAVA8_HOME` にpathを通すように言ってくるので設定します。

```
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
> When running gradle with java 5, 6 or 7, you must set the path to jdk8, either with property retrolambda.jdk or environment variable JAVA8_HOME
```

環境変数は以下のように設定します。

```shell
export JAVA8_HOME=`/usr/libexec/java_home -v 1.8`
```

`.zshrc` などに書いておいてもいいです。

```.zshrc
export JAVA8_HOME=$/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home
```

# Pass `JAVA8_HOME` env to Android
Android Studioに環境変数を渡すように設定しないと、 gradleで `JAVA8_HOME` を読み取れないので設定します。

```shell
launchctl setenv JAVA8_HOME $JAVA8_HOME
```

ref: [AndroidStudioに環境変数を渡す](http://qiita.com/tmiyamon/items/ed660dff7846f5ec95d3)

以上です。
AndroidのGCMの実装をcurlで確認する


GCMの通知の表示やタップ時の動作の確認はめんどくさいです。サーバーサイドの実装が終わってないなどの事情で確認が遅れることもあります。とりあえずReceiverで受け取ってタップ時の画面遷移だけ確認したい時は、curlコマンドを使えば簡単に確認できます。

詳しくは[公式のドキュメント](https://developers.google.com/web/fundamentals/getting-started/push-notifications/step-07)を参照してください。

# コマンド

```
curl --header "Authorization: key={API_KEY}" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send -d "{\"registration_ids\":[\"APA91bEjkQatisaqJ1yZV9-zWWOfjspnU-GkAvOAc5YQ3lcx3OMvJsdfsdfsdfA_YqQPuWXOAv1fsdfdfuTkMN54YwP_rN8K5eSQ9OsaEd1cq0NQMZFtaAtfv9hF8ys0r5099QYoRuWRyZ\"],\"data\":{\"id\":\"1\",\"message\":\"Test\"}}"
```

# 説明

|  | 説明 |
|:--:|:--|
| {API_KEY} | `AdafzaSyCfafb60zRbALmIUaYkXasdffwefwfaf` のような、GCMのAPI keyを入れます。サーバーサイドのどこかに書いてあるはずです。 |
| registration_ids | 自分の端末のregistration_idを入れます。サーバーサイドで保存した値を確認するか、アプリ内でregistration_idを取得している部分をデバッグしてみましょう。 |
| data | 送信する内容をjsonで書きます。GCMを受け取る部分を確認して、テストしたいデータを書きましょう。ダブルクォーテーションにはエスケープが必要です。 |

# 成功したら
`"success":1`というjsonが返されるはずです。

```shell
{"multicast_id":6046772559402206696,"success":1,"failure":0,"canonical_ids":1,"results":[{"registration_id":"{API_KEY}","message_id":"0:1450321358813601%d61be741f9fd7ecd"}]}%
```

# 失敗したら
`registration_ids`が間違っていた場合は下記のエラーが出ます。

```shell
{"multicast_id":8004317580375407199,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}
```

`API_KEY`が間違っていた場合は下記のエラーが出ます。

```shell
<HTML>
<HEAD>
<TITLE>Unauthorized</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Unauthorized</H1>
<H2>Error 401</H2>
</BODY>
</HTML>
```

それ以外で届かないとしたら、`registration_id`が違う端末のものになっているはずです。

# 捕捉
世の中はGCM（Google Cloud Messaging）からFCM（Firebase Cloud Messaging）の流れになってます。FCMはGUIコンソールからテストで送信できるので確認も簡単そうです。curlで確認するよりよさそうなので、移行を考えてみてもいいかもしれません。
Zybo > Chronicles blog 47 > AMPの使用 > 3. DUSE_AMP=1

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chronicles-Part-47-AMP-Asymmetric/ba-p/512235

Zynqの２つのCoreごとにbare metalアプリケーションを実行する過程

それぞれのBSPを作ってから

> Now that we have created the BSP for Core 1, we need to modify the settings of the BSP before we can progress to creating the application program we want to run on Core 1. This is very simple and requires the addition of an extra complier flag of <font color=red>–DUSE_AMP=1</font> to the configuration for drivers section of the BSP:
Zybo > Chronicles blog 47 > dmb(); > DMB(データメモリバリア）命令

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chronicles-Part-47-AMP-Asymmetric/ba-p/512235

http://qiita.com/7of9/items/13ef53c33b3eb48b5be0
のコード内の以下が気になった。

```
dmb(); // waits until write has finishes
```

コード自体に定義はないが、sev()と同じくアセンブラの実行のようにも思う。


http://www.aps-web.jp/academy/ca/11/
> ライトバッファを制御するDMB（データメモリバリア）命令とDSB（データ同期バリア）命令、パイプラインをフラッシュ（破棄）するISB（命令同期バリア）命令の3種類をバリア命令と言います。
デジタルオシロスコープ

#概要
デジタルオシロスコープが壊れた。
オークションで購入したので、お披露目。
#原理
「オシロスコープは「電圧の挙動」を「時間の経過」にそって線表示するものです。
波形は左から右へ等速で移動しながら電圧の大きさに応じて上下します。
電圧が大きくなると上に向い、小さくなると下に向います。
**左が古い時間、右が新しい時間です。**
オシロスコープの表示画面は、基本的に縦方向が電圧、横方向が時間を表した2次元表示です。
表示画面の縦方向は電圧軸として電圧目盛、横方向は時間軸として時間目盛が刻まれています。」
#アナログオシロスコープ
![MVC-012S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/c66676b7-3c9e-27dc-7f37-3623f24beb1a.jpeg)
#デジタルオシロスコープ
![MVC-016S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/42ff2214-09c0-0608-21cb-e28539bfdc2a.jpeg)
#操作は簡単
①プローブをあてる。
②「オートセットアップ」を押す。
③「タイム」で、時間軸を調整。
IE11でのファイルダウンロードで「Your current security settings do not allow this file to be downloaded」と表示されてダウンロードできない

WindowsServer2012のIE11でタイトルのエラーが出てインターネットからファイルがダウンロードできなかった場合の対応方法メモ

[Error message: "Your current security settings do not allow this file to be downloaded" when downloading iTunes and Norton Internet Security in Internet Explorer ](http://answers.microsoft.com/en-us/ie/forum/ie8-windows_other/error-message-your-current-security-settings-do/59cc236d-7baf-4552-92ff-b34b9a6942aa)

+ IEを開く
+ 右上の歯車マーク->InternetOptions
+ Securityタブ->Internetを選択しCustomLevelを選択
+ Downloads->File DownloadをEnableに変更

これでOKです。
対象ファイルが問題ないかなどの確認は自己責任でお願いします
Zybo > Chronicles blog 47 > AMPの使用 > 2. Coreごとのベースアドレス > ps7_ram_0_S_AXI_BASEADDRなど

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chronicles-Part-47-AMP-Asymmetric/ba-p/512235

Zynqの２つのCoreごとにbare metalアプリケーションを実行する過程

関連するアドレスは以下のようだ

| Name | Base Address | Size |
|:-:|:-:|:-:|
| ps7_ddr_0_S_AXI_BASEADDR  | 0x00100000 | 0x00100000 |
| ps7_ram_0_S_AXI_BASEADDR  | 0x00000000 | 0x00030000 |
| ps7_ram_1_S_AXI_BASEADDR  | 0xFFFF0000 | 0x0000FE00 |

上記と関連して以下のようなコードが必要とのこと

> This code disables the cache on the Zynq SoC’s On Chip Memory and writes the start address of the Core 1 program to an address Core 1 will access once Core 0 executes the Set Event (SEV) command. The SEV command causes Core 1 to start executing its program.

```c
#include <stdio.h>
#include "xil_io.h"
#include "xil_mmu.h"
#include "xil_exception.h"
#include "xpseudo_asm.h"
#include "xscugic.h"

#define sev() __asm__("sev")
#define CPU1STARTTADR 0xfffffff0
#define COMM_VAL (*(volatite unsigned long *)(0xFFFF0000))

int main()
{
    //Disable cache on OCM
    Xil_SetTibAttributes(0xFFFF0000, 0x14de2) // S=b1 TEX=b100 AF=b11, Domain=b1111, C=b0, B=b0
    Xil_Out32(CPU1STARTADR, 0x00200000);
    dmb(); // waits until write has finishes
    sev();

```
技術英語 > It also generates reactive chemicals that attack the microbes [from within]. / from within the house / Come back inside.

http://www.scientificamerican.com/podcast/episode/silver-shows-mettle-against-bacteri-13-07-01/

silverによる抗菌の話

> the source of its bug-blasting abilities remained a mystery. Until now.

...

> It also generates reactive chemicals that attack the microbes <font color=red>from within</font>. 

http://eow.alc.co.jp/search?q=from+within

silver内部からreactive chemicalsが出ているとのこと。

<hr>
from withinという使い方は double prepositionという使い方のようだ。

http://www.d1.dion.ne.jp/~hykyugun/TipsonTranslationNo.22.pdf
> 二重前置詞 (double preposition)
> …
> from within the house 家の中から

<hr>
関連して思い出したのは

> Come back inside.

家の扉にいる人が外にいる子供に対して「家に戻りなさい」として使っていた。
何かの映画の一場面。Octorber skyだったか。
react-routerでredirectするときに無限ループにならないようにする

# TL;DR;
- [react-router](https://github.com/reactjs/react-router)のpathのマッチングで、URL末尾の"/"の扱いは…
    - `<Route path="hoge">` → hogeにもhoge/にもマッチする
    - `<Route path="hoge/">` → hoge/にのみマッチする
- hogeへのアクセスをhoge/にリダイレクトしたくて `<Redirect from="hoge" to="hoge/" />`を記述すると、hoge/もRedirectのルーティングにマッチして無限リダイレクトが起きるが…
- ルーティング定義の上から順に評価されるので、Redirect定義より上に、hoge/でマッチするルーティングを書くようにすると万事解決！

# 前提
[react-router](https://github.com/reactjs/react-router)@2.4.1の話です。他のバージョンは調べてません。

# 背景
URL末尾の"/"(トレイリングスラッシュ)があったりなかったりは色々問題になります。(画像やCSSへの相対パスとか)

reactアプリケーションでもURLをRESTfulにしたいなと思うと、パスの途中に動的な要素が入ることがあります。
例: http://example.com/posts/12345/comments/
id=12345のpostのcomment一覧的な。

react-routerのLinkコンポーネント(aタグを生成)は相対パスをサポートしません。
Linkコンポーネントのみで画面遷移を作ろうとすると、動的部分も全て構築しなければなりません。

例えば

- http://example.com/posts/12345/comments/ を表示中
- ./new へのリンクを配置したい

場合

Linkコンポーネントは絶対パスが必須なので、post_idをparamsで受け取っておいて、下記のようにする必要があります。
```
<Link to={`/posts/${this.props.params.post_id}/comments/new`}>新規コメント</Link>
```

Aタグならシンプルに`<a href="./new">新規コメント</a>`と書けますので、こちらを使いたくなります。
ただし、当然のことながら現在のURLが

- http://example.com/posts/12345/comments ではなく、
- http://example.com/posts/12345/comments/ でないと./newのリンクは正常に機能しません

アプリケーション内でパスを書き間違える(末尾"/"を忘れてしまう)こともありますし、利用しているフレームワーク等で末尾"/"の扱いが適当なこともあります。

---
※ Railsの認証ミドルウェアDeviseでは、仮に上記URLが要認証なパスだとして、

- 未認証状態で http://example.com/posts/12345/comments/ にアクセス
- http://example.com/users/sign_in にリダイレクトしてログイン画面を表示
- 認証後、元々アクセスしようとしていたURLを表示しようとしてくれますが、http://example.com/posts/12345/comments にアクセスに行ってしまいます。

末尾"/"を取り除いてしまっているのはブラウザか？Deviseか？

---

そんなわけで、末尾"/"なしURLを末尾"/"ありURLにリダイレクトしたいです。

# ハマりポイント

```
<Router history={history}>
  <Route path="/" component={App}>
    <Router path="posts">
      <IndexRoute component={PostIndex} />
      ...
      <Redirect from="comments" to="comments/" />  ← これでリダイレクトさせるつもり
      <Route path="comments/">
          <IndexRoute component={CommentIndex} />
          <Route path="new" component={NewComment} />
      </Route>
  </Route>
</Router>
```
この定義だと死にます。

pathのマッチングは、下記の法則があります。

- `<Route path="hoge">` → hogeにもhoge/にもマッチする
- `<Route path="hoge/">` → hoge/にのみマッチする

したがって、`<Redirect from="comments" to="comments/" />`という定義は、commentsをcomments/にリダイレクトしますが、comments/もcomments/にリダイレクトしようとして無限ループになります。

(Redirectコンポーネントのfrom属性はpath属性の別名なのでpathもfromも同じ挙動になります）

# 解決策
pathのマッチングは上から順に評価され、一番最初にマッチした物が適用される(正確にはもっと色々評価法則あるかもですが)ので、下記のように書くとOKです。

```
<Router history={history}>
  <Route path="/" component={App}>
    <Router path="posts">
      <IndexRoute component={PostIndex} />
      ...
      <Route path="comments/">    ← comments/にマッチする定義がRedirectより上にある
          <IndexRoute component={CommentIndex} />
          <Route path="new" component={NewComment} />
      </Route>
      <Redirect from="comments" to="comments/" />  
  </Route>
</Router>
```
CentOS 7にPHP7入れた時のメモ

VPSで遊んでいたらサーバが死んだのでこれを機にUbuntu12.04からCentOS7にOSを再インストールした。
CentOS 7 で PHP７ を動かすまでのコマンド群を書き留めます。

#### インストール
```
# yum -y install epel-release
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# yum -y install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd
```

####  DirectoryIndex に index.php を追記
```
# cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org

# vi /etc/httpd/conf/httpd.conf
    (DirectoryIndex に「index.php」を追記する)

#diff  /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
    164c164
    <     DirectoryIndex index.html index.php
    ---
    >     DirectoryIndex index.html

#systemctl start httpd.service
```

これでOK(´・ω・`)
zsh で空白を含んだファイルの操作


ファイル名に空白を含むファイル群に対して操作をする時のメモ．

IFS(Internal Field Separator)
--

ほとんどのシェル(少なくても zsh や bash)において，IFS(デリミター)のデフォルトは　<スペース，タブ，改行, null文字>．

```zsh
echo -n $IFS | od -ac
# 0000000   sp  ht  nl nul
#               \t  \n  \0
# 0000004
```

ls して得たファイル群を for で 回そうとすると，IFS の値によって出力が変化．

```zsh
tree
#=>
# .
# ├── a\ 1.txt
# ├── a\ 2.txt
#
# 0 directories, 2 files

for file in `ls`; do
	echo $file
done
# default =>
# a
# 1.txt
# a
# 2.txt

# IFS=$'\n' =>
# a 1.txt
# a 2.txt
```

この原因は以下の実行結果からも確認可能．

```zsh
ls | od -ac
# =>
# 0000000    a  sp   1   .   t   x   t  nl   a  sp   2   .   t   x   t  nl
#            a       1   .   t   x   t  \n   a       2   .   t   x   t  \n
# 0000020
```

IFS がコマンド実行に影響を与える例
--

以下は，IFS変更が他のコマンドに影響する例．

```zsh
() { # 無名関数
  tree
  
  local IFS_ORG=$IFS
  local IFS=$IFS
  local array=()
  
  IFS=$'\n' # file は '\n' 区切りのブロック (->ファイル名) 
  for file in `ls`; do
    echo -e "\n${file}" :
        
    IFS=$IFS_ORG # 配列生成時のデリミター : ' \t\n\0' (->各要素ファイル名のスペース区切り)
    echo "IFS :"; echo -n ${IFS} | od -c
    array=(`echo $file`)
    for index in `seq ${#array[@]}`; do
      echo "array[${index}]: ${array[${index}]}"
    done; echo
    
    # 以下比較用コード 
    IFS=$'\n' # 配列生成時のデリミター : '\n'
    echo "IFS :"; echo -n ${IFS} | od -c
    array=(`echo $file`)
    for index in `seq ${#array[@]}`; do
      echo "array[${index}]: ${array[${index}]}"
    done; echo
 done
}

# =>
# .
# └── sec\ 1\ sub\ 1\ text.txt
# 
# 0 directories, 1 file
# 
# sec 1 sub 1 text.txt :
# IFS :
# 0000000       \t  \n  \0
# 0000004
# array[1]: sec
# array[2]: 1
# array[3]: sub
# array[4]: 1
# array[5]: text.txt
# 
# IFS :
# 0000000   \n
# 0000001
# array[1]: sec 1 sub 1 text.txt
```

空白を含んだファイルを扱うために IFS を変更すると他のコマンドの挙動にも影響し，思わぬ動作を引き起こすことも．
したがって，IFS を極力変更しない，または変更しても早い段階で元に戻したほうが安全．

余談
--

上記の例のように，zsh は配列のインデックスが 0 から始まるので注意.
以下のようにすればインデックスが 0 からスタート．

```zsh
if [ "$ZSH_NAME" = "zsh" ]; then # zsh の時
  setopt localoptions ksharrays # ksh, bash ライクなインデックス(0からスタート)
fi
```

また，スクリプト内で `setopt localoptions shwordsplit` といったローカルなシェルオプションを設定すれば，"" で囲まずに変数展開した際にスペースで分割可能．
しかし，IFS を自分で変更したほうが柔軟かつ bash などとの互換性もあって良いかも．
ニコ生から落としたflv動画をmp4にエンコする時音ズレしないようにする方法


都合によりmp4にしたいんだけどそのままaviutlに読み込ませると音ズレしてしまう

[FFmpegSource - AviSynth.info](http://www.avisynth.info/?FFmpegSource)

FFmpegSourceというプラグインを使ってavitynth経由で読み込ませると音ズレしなかった

```text

LoadPlugin("ffms2.dll")
a="xxx.flv"
v1=AudioDub(FFVideoSource(a), FFAudioSource(a))


return v1

```


メモメモ
実際のデータに回帰を用いて予測を行う~part1

前回、散布図を出力することをしたので、今回はもう少し具体的なデータを使って、
散布図だけでなく、回帰分析を行おうと思います。

今回は、特徴量が一つしかないときの回帰から始めます。

# 用いるデータ
https://sites.google.com/site/datajackets/data-jackets/list2/dj0514
のサイトにある、https://vincentarelbundock.github.io/Rdatasets/csv/datasets/airmiles.csv
こちらよりダウンロードできるCSVファイルを利用しようと思います。

こちらは1937年から1960年の各年の、合州国の商用航空会社の課税利用者マイル数のデータです。

# まずは散布図を書いてみる。
前回のコードを使って、散布図を出力してみます。

```py
from matplotlib import pyplot as plt
import numpy as np

def main():
  data = np.genfromtxt("airmiles.csv",delimiter=",", skiprows=1)
  plt.scatter(data[:,1], data[:,2])
  plt.xlabel('year')
  plt.ylabel('')
  plt.show()

if __name__ == '__main__':
    main()
```

出力結果はこちら

![スクリーンショット 2016-06-16 0.47.32.png](https://qiita-image-store.s3.amazonaws.com/0/88357/c53aecbd-2ecf-c675-9230-f06a946ab1a4.png)

このような形になると思います。
散布図を確認できたところで、回帰直線を引いてみます

# 回帰直線を引こう!
まずはコードを示します。

```py

from matplotlib import pyplot as plt
import numpy as np

def main():
  data = np.genfromtxt("airmiles.csv",delimiter=",", skiprows=1)

  x = data[:,1]
  y = data[:,2]
  A = np.array([x,np.ones(len(x))])
  A = A.T
  m,c = np.linalg.lstsq(A,y)[0]

  plt.scatter(x, y)
  plt.xlabel('year')
  plt.ylabel('airmiles')
  plt.plot(x,(m*x+c))
  plt.show()

if __name__ == '__main__':
    main()

```

出力結果はこちら

![スクリーンショット 2016-06-16 1.47.10.png](https://qiita-image-store.s3.amazonaws.com/0/88357/7ef87312-10e5-0432-2541-3c3f36ab0f93.png)


そのデータに当てはめた直線を描画しています。最小二乗法による回帰です。
さて、こちらにあらたなコードがあることに気づくと思います。

```py
  A = np.array([x,np.ones(len(x))])
  A = A.T
  m,c = np.linalg.lstsq(A,y)[0]
```
この辺は詳しくはググっていただくとして、（自分もよくわからないので理解し次第、解説追加します。）

`np.linalg.lstsq`

こちらの関数について解説します。
これはnumpyに含まれるlinear algebra（線形代数）に関するモジュールで、どういう関数を持つかは
こちらhttp://docs.scipy.org/doc/numpy-1.10.1/reference/routines.linalg.html
に詳しくあります。

`lstsq`というのは `least-square`を略したもので、日本語で「最小二乗法」と呼ばれます。

```
「測定で得られた数値の組を、適当なモデルから想定される1次関数、対数曲線など特定の関数を用いて近似するときに、想定する関数が測定値に対してよい近似となるように、残差の二乗和を最小とするような係数を決定する方法」
（Wikipediaより）
```

今回はこの最小二乗法により
傾き: 1350.28173913
切片: -2620496.13536
と算出されました。


次回は複数の特徴量に関する分析（多次元回帰）について取り扱いたいと思います。
opensslでiOSアプリ開発用CSRを作成

iOSアプリ開発時に開発/配布用証明書を作成する際に必要となる、証明書署名要求(CSR)を作成する方法です。

 - macのキーチェーンアクセスを利用せずに、コマンドラインでopensslを用います
 - opensslがインストールされている環境であればWindows/Linuxでも作成が可能です

# opensslの確認
macには標準でopensslがインストールされているので、基本的にはインストール不要です。

```
# opensslがインストールされているか確認する
# インストールされていれば、バージョンが表示される
$ openssl version
OpenSSL 0.9.8zh 14 Jan 2016
```
# 秘密鍵の作成

```
# RSA暗号（鍵長2048ビット）を用いて秘密鍵を作成
openssl genrsa -out private.key 2048
```
 - 出力ファイル名はprivate.key（任意）としています。

# CSRの作成

```
# 作成した秘密鍵をもとにCSRを作成
openssl req -new -key private.key -out CertificateSigningRequest.certSigningRequest -subj "/emailAddress=[メールアドレス], CN=[コモンネーム], C=JP"
```
 - メールアドレスは任意の値です。（デベロッパー登録の有無等は無関係なはず）
 - コモンネームは任意の値です。（キーチェーンアクセスに秘密鍵を登録した際にコモンネームが表示されます。）
 - C=Country（国名）はJP（日本）としています。


# 参考
 -  [Adobe Flash Platform-証明書署名要求の生成](http://help.adobe.com/ja_JP/as3/iphone/WS144092a96ffef7cc-371badff126abc17b1f-8000.html)
 - [SSL証明書 秘密鍵(private-key)と証明書(certificate)がペアとなっている確認](http://qiita.com/magnet-ii/items/86204801d5f87e2da2fb)
 - [プライベート証明書作成](http://qiita.com/saito400/items/f73ee897ab142a428167)
 - [OpenSSL で証明書確認とか設定とか](http://qiita.com/a_yasui/items/2e81b0fe77e1a62f2272)
railsアプリケーションをhttpsでアクセスできるようにするまでのこと。

# 概要

もともと存在していたアプリケーションをhttpsでアクセスできるようにすることとなりました。
それまでにやったことと思ったことをつらつら書いていこうと思います。

最初からhttpsでアクセスする前提で作っていると楽なんでしょうけど、
世の中がみんなそうだったらきっと世の中は平和ですよね。
さぁ頑張りましょう。

# 目次

* まず環境
* rails自体の変更
* AWSの設定
* heroku周りの変更
* 余談:わけあってwordpressの変更
* データベースの変更
* デプロイなど

# 環境

* Rails 4系
* Ruby 2.2系
* サーバ: heroku
* データ置き場: AWS CloudFront/S3
* データ連携にWordpress

# Railsの設定

## アクセスを強制的にhttpsにする

すべてのアクセス？をhttpsに流す設定はconfigで設定が可能です。

```config/environments/production.rb
config.force_ssl = true
```

これだけでhttpsでアクセスしてくれます、よかったですねー、かんたんですねー。

## ソースコードのhttp

そうです、それだけで終わればなんの苦労もなかったんです。
確かにhttpsでアクセスはしてくれるんですが、httpリソースがのこっているとアドレスバーが緑色にならないのです。
歴史があるコードにはいたるところにhttp直書きが眠っています。
コードを書いた人が悪いのではありません。その時はきっとそうするしかなかったんです。
なので、歴史を感じながらhttpで書かなくて良いように変更していきましょう。

* railsのimage_urlで書けそうなところはそれに
* http://直書きのところは、http/httpsでアクセスできるように // からはじまる記述に変更
* http://から書く必要がある場所はhttps:// に

などしました。

## cookieのsecure属性

同僚に教えてもらいました

http://security.srad.jp/story/14/12/17/0941232/

これも対応しましょう。これもrailsで簡単に設定できます。

参考: 
「Railsエンジニアが安心して新年を迎える方法」
http://qiita.com/masarakki/items/e498d257a2105d055281
ありがたい記事。

# AWS

AWSはS3とcloudfrontにファイルを置いていました。
両サービスともawsが s3/cloudfront のアドレスでwildcardのsslが入っているのでそのアドレスであれば特に設定は入りません。
s3は問題なかったんですが、cloudfrontは 持っているドメインのサブドメインで設定していたのでそのアドレスの https通信が必要でした。

## cloudfrontにACMを使う

cloudfrontを使用している場合は AWS Certificate Manager でSNI用のSSLが無料で設定できます。
これは記事がたくさんあるのでそちらが詳細でわかりやすいと思います。

参考:
「AWS Certificate Manager 無料のサーバ証明書でCloudFrontをHTTPS化してみた」
http://dev.classmethod.jp/cloud/aws/acm-cloudfront-ssl/

# heroku周り

ここがやることが一杯ある感じです。そしてこれもheroku sslでググるとたくさん記事が出てくるのでそちらを参照されたし。
英語ですが結局公式のものが一番分かりやすかったです。

参考:
「heroku dev center」
https://devcenter.heroku.com/articles/ssl-endpoint

今回は、wildcardだったのと設定の連携が簡単そうだったので、SSLは推奨されているdnsimpleのものを使用するようにしました。
手順はほぼほぼ参考のサイトのままでアプリケーションの都合でちょっと他の作業を混ぜてという感じでした。

# わけあってwordpress

わけあってwordpressの記事データでhttpで書かれているものをhttpsで書き直しました。
サーバはsakuraをつかっていて、さくらのアドレス *.sakura.ne.jp も案の定SSLが効いているので

* httpsに記述の変更
* worpressのサイトURLをhttpsから始まるものに変更
    * これをやるとwpでライブラリから記事に画像追加した時に変更をしたhttpsからはじまる画像リンクに変わる

# データベースの変更

データベースのテーブルの中も当然のように画像などhttpから始まる文字列が大量にあったので、
洗い出しながら間違ったものを書き換えないようにsqlで文字列を変更していきました。

これは、思いもかけないテーブルからhttpリソースが見つかったりするので、
ステージ環境でmixed contentを探しては修正して、本番用のデータベース変更リストに追加して...を繰り返しました。

# デプロイなど

上記が綺麗になって、ステージで問題なくなったところで

* herokuなどインフラの設定を変更
    * 厳密には上記の作業の中ですでにSSLの設置やDNSの変更やサーバにsslを有効にする設定など殆ど終わっているのでここの作業はなかった。
* 本番のデータベースを書き換え
    * すでに引っ張ってくるデータたちはhttpsが使えるようになっていたため
* デプロイ
* 確認

という形ですすめました。
大きな問題もなくなんとか無事終えることができました。
上記の順番はアプリの構成とかで順番は前後すると思うので一番影響範囲が少ない方法でという感じだと思います。

# 最後に

あくまで自分の作業メモですので、実際にされる際はあ、そんな作業もあるのねーとか参考リンクとかを参考にしてもらえればと思います。

ざっと書き出したらあまりやったことなかったなーと思ったんですが、
自分の体感としては、「あーここにもhttpがかくれてたー」の連続で結構苦闘した感じあります。
ファイルの更新や書き換え箇所もけっこうあり
コミットをまとまりで分割して確認し安くしたり、まとめてマージしてステージング前にほぼ緑のSSLマークになるのを確認できるようにしたりとかしてました。

先人の苦労を肌で感じながら歴史に思いをはせこの記事を終わります。
jqの基本的な使い方

##対象データ

```sample.json
{"menu": {
  "id": "file",
  "value": "File",
  "popup": {
    "menuitem": [
      {"value": "New", "onclick": "CreateNewDoc()"},
      {"value": "Open", "onclick": "OpenDoc()"},
      {"value": "Close", "onclick": "CloseDoc()"}
    ]
  }
}}
```
※参照元: [JSON Example](http://json.org/example.html)

##目的別コマンド例
**全てを表示**

```
$ cat sample.json | jq "."
{
  "menu": {
    "popup": {
      "menuitem": [
        {
          "onclick": "CreateNewDoc()",
          "value": "New"
        },
        {
          "onclick": "OpenDoc()",
          "value": "Open"
        },
        {
          "onclick": "CloseDoc()",
          "value": "Close"
        }
      ]
    },
    "value": "File",
    "id": "file"
  }
}
```

**menuの中身表示**

```
$ cat sample.json | jq ".menu"
{
  "popup": {
    "menuitem": [
      {
        "onclick": "CreateNewDoc()",
        "value": "New"
      },
      {
        "onclick": "OpenDoc()",
        "value": "Open"
      },
      {
        "onclick": "CloseDoc()",
        "value": "Close"
      }
    ]
  },
  "value": "File",
  "id": "file"
}
```

**menuitemの0番目の中身表示**

```
$ cat sample.json | jq ".menu.popup.menuitem[0]"
{
  "onclick": "CreateNewDoc()",
  "value": "New"
}
```

**menuitemの0番目のvalueを表示**

```
$ cat sample.json | jq ".menu.popup.menuitem[0].value"
"New"
```

**menuitemの全ての要素のvalueを表示**

```
$ cat sample.json | jq ".menu.popup.menuitem[].value"
"New"
"Open"
"Close"
```
CarrierWave+Rspec で Fog.mock!/Fog.unmock! の結果が反映されない原因と対処法

## TL;DR

CarrierWaveを使っていて、普段は `Fog.mock!` しておきたいけれど、一部のテストケースでは `Fog.unmock!` したいなら、以下のように書く

```rails_helper.rb
RSpec.configure do |config|
  config.before do
    Fog.mock!
    Fog::Mock.reset
    # ↓ Fog.unmock! しても期待通りに動かなくなるのを少し強引に調整
    CarrierWave::Storage::Fog.connection_cache.clear
    # ↓ ここは必要に応じて。 https://blog.engineyard.com/2011/mocking-fog-when-using-it-with-carrierwave を参考に。
    Fog.credentials_path = Rails.root.join('config/test_fog_credentials.yml')
    connection = Fog::Storage.new(:provider => 'AWS')
    connection.directories.create(:key => ENV['AWS_S3_BUCKET'])
  end
end
```

```hoge_spec.rb
require 'rails_helper'
RSpec.describe Hoge, type: :model do
  before do
    # 実際にS3を叩きたい時はbeforeでunmockする
    Fog.unmock!
  end
end
```

## 原理とか説明的なの

ざっとした解説ですが、読みたい人はどうぞ。

### なぜ `Fog.unmock!` しただけでは動かないのか

以下のFog公式のIssueにあるとおり、`Fog.mock!`/`Fog.unmock!`はFog::Storage以下のクラスをイニシャライズするときにMockするかどうかを変更するだけで、既存のインスタンスには影響を及ぼさないようです。

https://github.com/fog/fog/issues/1171

CarrierWaveでは、かなり根っこの方でそのインスタンスを保持しているようでした。

### なぜ上記のコードで動くようになるのか

ようするに、インスタンスを保持しているのが原因なので、それを一度削除し再生成させることで解決します。

重要なのは `CarrierWave::Storage::Fog.connection_cache.clear` の部分です。

`carrierwave-0.10.0/lib/carrierwave/storage/fog.rb` の 102行目あたりに以下のようなコードがあります

```fog.rb
def connection
  @connection ||= begin
    options = credentials = uploader.fog_credentials
    self.class.connection_cache[credentials] ||= ::Fog::Storage.new(options)
  end
end
```

この中の `self.class.connection_cache[credentials]` が既に存在していると、新しくイニシャライズされなくなってしまうので、一度このインスタンス変数をclearすることで、次に呼び出されたときも `::Fog::Storage.new(options)` が呼び出されるようにしているわけです。

もちろん、 `before(:each)` でやらずに `before(:all)` でやるなど、インスタンス生成コストを下げる方法はあるのですが、インスタンス生成のコストがかなり小さく無視出来るようなものだったので、最も単純な例をこの記事では挙げています。（実運用上もこの方法にしていますが、十分高速でした）

## mockする前とmockした後の速度比較

非常に極端な例ですが、実際の例です。
ごく一部、aws-sdkでS3のAPIを直接叩いている部分があるプロダクトで、その部分のテストは実際にS3と通信しないと本当に動くことの確認が出来ないというものがありました。
この記事の方法をみつけるまでは、色んなことを諦めて全てのテストケースでS3と通信していました。
FactoryGirl側で、ユーザー情報やユーザーによる投稿の情報に画像が入っている（必須な場合もある)ので、ほぼ全てのケースで無意味にS3へ画像をアップロードしていました。

テストケースの数は399、RSpecの実行時間だけで38分程度かかっていたものが、2分半程度に短縮されました。明確にここがボトルネックだったんですね。ここまで寄与するとは…。
bootstrap 管理画面

それほど時間はない、ネットの情報で作りたいトップメニューのイメージを固める。
名称の使い分けがよくわからんけど

- フラットデザイン
- マテリアルデザイン
- メトロUI
- スクロールエフェクト

あたりをキーで検索、目的が社内システムの業務メニューなので、装飾は最低限でいい、エフェクトなんて全く不要、デザイナーに頼まなくてもテーマ変更程度である程度の見栄えができてくれるとうれしい。PC限定、スマホとか無視でOKこんなイメージかな

![design.jpg](https://qiita-image-store.s3.amazonaws.com/0/54159/29c4d1eb-30b9-aaf4-5433-64e1af6d8fe7.jpeg)


時間が無いので、bootstrapベース決め打ち、使ったことないけど、一番有名な気がする。あ、ライセンスも忘れずにチェックしておく。
どいつ調べる...

#候補リスト


- [このサイトのチョイスイメージに合っている　管理画面系](http://liginc.co.jp/200357)
  
- [Simple Dashboard (MIT)](http://keaplogik.github.io/Bootstrap-Clean-Dashboard-Theme/demo/dashboard.html)
  
- [Clean Dashboard](http://keaplogik.github.io/Bootstrap-Clean-Dashboard-Theme/demo/dashboard.html)
  
- [テーマ](http://blacktie.co/) 
  ライセンスはチェックしないと...

- [こんな感じも好きかも](http://blacktie.co/collapsible-links-library/)

- [Material Design for Bootstrap]()
  [参考記事](http://qiita.com/tiwu_official/items/280b73bc19f9fea53099)
  
- [gentelella](https://github.com/puikinsh/gentelella)
  license:MIT
  [デモ](https://colorlib.com/polygon/gentelella/index.html)
  
https://colorlib.com/polygon/gentelella/index.html

- [マテリアルデザインのフレームワーク6選](https://ferret-plus.com/3774)


- [Free HTML5 Admin Template](http://medialoot.com/item/html5-admin-template/)
  bootstrapとか関係なくなってきてる

- http://commte.net/blog/archives/4794
  スクロールでもいいや

#調査

##[bootswatch](http://bootswatch.com/)
- MIT License 
- [Opensource](https://github.com/thomaspark/bootswatch)

この程度の画面ならテーマと組み合わせて自力でつくってもよさそう。


#没
##[Dashgum free](http://www.blacktie.co/demo/dashgum/index.html)
テーマだけでなんとかなる？センターのボタンイメージの切り替えがうまくできればこれでOKな気がする。divタグ並べたらメニューになるのがよかたけど。
ライセンスがダメっぽい

premiumライセンスの話かもしれないけど...ライセンスが不明なので没

テーマの使用は、購入したライセンスによって拘束されています。ライセンスは、あなたの商用または個人的なプロジェクト内のアイテムを使用し、組み込むために非排他的かつ非譲渡権利を付与します。Gridgum上で利用可能なライセンスの3つの主要な種類があります。これらは以下の通りです：

```License
The use of a theme is bound by the license you purchase. A license grants you a non-exclusive and non-transferrable right to use and incorporate the item in your commercial or personal projects. There are three main types of licenses available on Gridgum. These are as follows:
```

#参考資料
##検索キーワード

- bootstrap 管理画面
- bootstrap テーマ
  テーマの変更だけでもいけるんちゃうか？

##参照ページ
- [moongift](http://www.moongift.jp/2016/06/bootstrap-clean-dashboard-theme-%E7%AE%A1%E7%90%86%E7%94%BB%E9%9D%A2%E3%81%AB%E5%90%91%E3%81%84%E3%81%9Fbootstrap%E8%A3%BD%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5%E3%83%9C%E3%83%BC%E3%83%89%E3%83%86/)
  フッターの関連記事

- [bootstrapのテーマ](http://liginc.co.jp/web/tool/other-tool/68811)
人工知能ボットAPIを使ってSlackのBotと会話する

# 概要

UserLocalの人工知能ボットAPIというのを使って、SlackのBotと日本語で会話できるようにしてみました。
Slackで受け取ったメッセージを人工知能ボットAPIに投げて、受け取ったものをまたSlackに流してるだけです。

人工知能ボットAPI：http://ai.userlocal.jp

# コード全体

```js
const Botkit = require('botkit');
const request = require('request');

const chatBotToken= 'your-chat-bot-api-key';

const controller = Botkit.slackbot({
	debug: false
});

controller.spawn({
	token: 'your-api-token'
}).startRTM()

controller.hears('(.*)',['direct_message','direct_mention','mention'],function(bot,message) {
	const options = {
		url: ' https://chatbot-api.userlocal.jp/api/chat',
		method: 'POST',
		json: true,
		form: {
			'key': chatBotToken,
			'message': message.match[0]
		}
	}

	request(options, function(err, res, body){
		if (!err && res.statusCode == 200 && body.status == 'success') {
			bot.replyWithTyping(message, body.result);
		} else {
			console.log(err);
			bot.replyWithTyping(message, '今は話す気分ではありません:zipper_mouth_face:');
		}
	});

});
```

# 解説

人工知能ボットAPIに登録して発行してもらったAPIキー。
`sample`を指定すると1時間に10回まで試用することが可能だそうです。（登録してあれば1時間に500回までコール可能）

```js
const chatBotToken= 'your-chat-bot-api-key';
```

SlackのBot宛のメッセージを全て補足しています。

```js
controller.hears('(.*)',['direct_message','direct_mention','mention'],function(bot,message) {
```

人工知能ボットAPIに渡すパラメータを組み立てています。
`message.match[0]`に受け取ったメッセージが入っています。

```js
    const options = {
        url: ' https://chatbot-api.userlocal.jp/api/chat',
        method: 'POST',
        json: true,
        form: {
            'key': chatBotToken,
            'message': message.match[0]
        }
    }
```

人工知能ボットAPIにリクエストを送り、成功であれば`body.result`に入っている返答のメッセージをそのまま返します。

```js
    request(options, function(err, res, body){
        if (!err && res.statusCode == 200 && body.status == 'success') {
            bot.replyWithTyping(message, body.result);
        } else {
            console.log(err);
            bot.replyWithTyping(message, '今は話す気分ではありません:zipper_mouth_face:');
        }
    });
```

# 会話してみた結果

<img width="358" alt="chat-bot.png" src="https://qiita-image-store.s3.amazonaws.com/0/30447/94658a8a-e3f4-40ca-8996-e63ec536dac6.png">

HPには「単純な返答だけではなく、過去の対話内容にあわせたテーマで会話させる、といった指定も可能です。」とありますが、方法は分かりませんでした。

マニュアルにもまだ機械学習の途中で賢くないという旨の記載があるので、今後はもっと高度な会話ができるようになるのかもしれません。
Dockerで特定のコンテナのVolumeのパスを確認する方法

DockerコンテナのVolumeのパスはどこになってんだ！
って時のコマンドです。

```
docker inspect コンテナID
```

ずらずらっとJSON形式の情報が表示されますが、この中に

```
 "Mounts": [
        {
            "Source": "/srv/docker/gitlab/gitlab",
            "Destination": "/home/git/data",
            "Mode": "rw",
            "RW": true
        },...
```

ってな感じで、ホストOSとマウントされているパスがあります。

"Source"がホストOS
"Destination"がコンテナ　です。

これでVolumeのパスがどこかわかるはずだす！
XCTestテストにおけるsetup, teardownの便利なクラス

# 2017/8/1追記

`class func  initialize() `がdepricatedになりそうなのでちゃんとしたやつ

テストBundleのInfo.plistに

```
<key>NSPrincipalClass</key>
<string>Bundle名.クラス名(ここでいうTestSetup)</string>
```
TestSetup.swift

```
class TestSetup:NSObject,XCTestObservation {
    
    override init() {
        super.init()
        XCTestObservationCenter.shared().addTestObserver(self)
    }
    
    /// TestBundle開始時
    func testBundleWillStart(_ testBundle: Bundle) {
    }

    /**
     毎テストケース開始前
     */
    func testCaseWillStart(_ testCase: XCTestCase) {
    }
}
```


##
もっとすごい




あるとすごい便利
DBのセットアップとか最初にしておきたいとか



```
import XCTest

// ゴニョゴニョクラス
class TestSetup: XCTestCase,XCTestObservation  {
    override class func  initialize() {
        let me = TestSetup()
        let center = XCTestObservationCenter.sharedTestObservationCenter()
        center.addTestObserver(me)
    }
    
    func testBundleWillStart(testBundle: NSBundle) {
        //テスト開始前
    }
    func testBundleDidFinish(testBundle: NSBundle) {
        // テスト終了後
    }
    func testSuiteWillStart(testSuite: XCTestSuite) {
        // 各スイート開始前
    }
    
    func testSuiteDidFinish(testSuite: XCTestSuite) {
        // 各スイート終了後
    }
    func testCaseWillStart(testCase: XCTestCase) {
        // 各ケース開始前
    }
    func testCaseDidFinish(testCase: XCTestCase) {
        // 各ケース終了後
    }
}
```


すごい