OmniAICreator/Qiita-1.07M huggingface dataset:
Swift で外部ライブラリを使わずに画像を Post する。


外部のライブラリに依存しないで画像を Post する方法を見かけなかったので、以前 Objective-C で書いていたのを元に書いてみた。

文字列で投稿用の NSData を組み立てる為、ちょっと拡張しておく。

```swift:ちょっとした拡張
extension NSMutableData {
    func appendString(string: String, encoding: UInt = NSASCIIStringEncoding) {
        guard let data = string.dataUsingEncoding(encoding) else {
            // お好きなように
            return
        }
        appendData(data)
    }
}
```

こっちが送信用。エラー処理はプロジェクトにあわせて上手いことやってください。画像以外に文字列も送信したい場合は ```params``` に辞書形式で渡してください。ヘッダにトークンなんかの値をもたせたいときは ``` NSMutableURLRequest::setValue() ``` でヘッダに値をセット出来ます。

```swift:送信用

class ImageUploader {
    func exec(image: UIImage, params: [String: String]?, urlString: String, httpMethod: String = "POST", completeHandler: (status: Bool) -> Void) {
        guard let url = NSURL(string: urlString) else {
            completeHandler(status: false)
            return
        }
        guard let imageData = UIImagePNGRepresentation(image) else {
            completeHandler(status: false)
            return
        }

        let request = NSMutableURLRequest(URL: url)
        request.HTTPMethod = httpMethod

        let boundary = "Boundary-\(NSUUID().UUIDString)"

        request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
        request.HTTPBody = createBody(params, fileParamName: "image", imageData: imageData, boundary: boundary)

        let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
            data, response, error in
            if let error = error {
                completeHandler(status: false)
                return
            }
            guard let data = data else {
                completeHandler(status: false)
                return
            }

            let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
            dispatch_async(dispatch_get_main_queue(), {
                completeHandler(status: true)
            })
        }
        task.resume()
    }

    // fileParamName は画像のパラメータ名
    private func createBody(params: [String: String]?, fileParamName: String, imageData: NSData, boundary: String) -> NSData {
        let body = NSMutableData()
        if let params = params {
            for (key, value) in params {
                body.appendString("--\(boundary)\r\n")
                body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
                body.appendString(value, encoding: NSUTF8StringEncoding)
                body.appendString("\r\n")
            }
        }
        let filename = "test.png"
        let mimetype = "image/png"
        body.appendString("--\(boundary)\r\n")
        body.appendString("Content-Disposition: form-data; name=\"\(fileParamName)\"; filename=\"\(filename)\"\r\n")
        body.appendString("Content-Type: \(mimetype)\r\n\r\n")
        body.appendData(imageData)
        body.appendString("\r\n")
        body.appendString("--\(boundary)--\r\n")
        return body
    }
}

```
実験屋の為のカイ二乗分布

#はじめに
[実験屋の為の初等統計学と誤差論](http://qiita.com/KFTamang/items/bdf6a47345920461e0df)も参照してね。
分布の様子や検定についても加筆したい。

#カイ二乗分布
カイ二乗($\chi^2$)分布とかカイ二乗検定とか聞くけどなんなのか。いまいちわからなかったので調べてみた。

wikipediaによると

```math
独立に標準正規分布に従う k 個の確率変数 X_1, ..., X_k をとる。 このとき、統計量\\
 Z=\sum^k_{i=1}X_i^2 \\
の従う分布のことを自由度 k のカイ二乗分布と呼ぶ。 
```

らしい。

つまり正規分布（を線形変換で規格化したもの）から$k$個だけ数字を取ってきて二乗和を取った値が従う分布である。

二乗和といえば分散である。
しかも多数のデータの平均を取れば中心極限定理によって正規分布に近づいていくのだから、
前提条件もクリアできる。

#用途
ではカイ二乗分布は何に使うのか。
物理実験の場面では実験結果のフィッティングに用いることが多い。
例えばX線のスペクトル（エネルギー分布）のフィッティングを行ったとして、その結果が正しく実験結果を推定しているかをどのように確認すればいいだろうか。
X線のスペクトルとは結局あるエネルギー範囲（ビン）に来たフォトンの個数を数えているので、ビン内のカウントはポアソン分布に従う。カウントが十分多ければ正規分布と近似できる。

フィッティングによる値から実際の値は正規分布で何シグマ分外れているかをすべてのビンについて二乗和を取る。
もしフィッティングが正しく、フィッティングと実験値の差は統計的ゆらぎのみに起因するならば、この二乗和はカイ二乗分布に従う。

自由度がわかればこの二乗和がカイ二乗分布に従う確率が計算できるため、フィッティングが正しいかの検定に使えるのである。

また、以上の話からわかるようにフィッティングと実測値の二乗和をカイ二乗検定に使う場合はポアソン分布が正規分布に近似できることが仮定されている。
この仮定が成り立たないような低カウントではカイ二乗検定の数字は必ずしも意味のあるものとは言えず、議論の根拠として用いるべきではない。

#参考資料
[実験屋の為の初等統計学と誤差論 - Qiita](http://qiita.com/KFTamang/items/bdf6a47345920461e0df)
[カイ二乗検定 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%82%A4%E4%BA%8C%E4%B9%97%E6%A4%9C%E5%AE%9A)
[【統計学】正規分布とカイ二乗分布の関係を可視化してみる。 - Qiita](http://qiita.com/kenmatsu4/items/b6318d66fcfe78b84d83)
その「Nullチェック」必要ですか？ ～レビューで指摘を一つ減らすために～

プログラミングを初めて最初のほうで考えることの一つに、「Nullチェック」があります。
誰でも一度は、
「ここNullになりそうだけど大丈夫？」
とレビューで指摘をうけたことがあるでしょう。

それで覚えるやり方が、

``` java
if (hoge != null) {
    hoge.fuga();
}
```

こんな感じのやつですね。
ただ、覚えたての人って何でもかんでもこのコードを差し込みがちになると感じています。
安全安心なコードとして「Nullチェック」はとても大切ですが、
私としては、一緒に覚えてほしいことがあります。
**「Nullチェック」の必要のないコーディングをすること**
必要のないチェックはコードのステップ数が増えて煩雑さを生みます。
そして、チェックが必要なコードというのは作ったその時はわかっているのかもしれませんが、
チームのほかの人や未来の自分がそのモジュールを使ったときにNullチェックをし損ねて、
バグを出してしまう可能性があることを意味します。
チェックの必要のないコードはその時だけでなく周りや未来の自分にも優しいのです。

どの言語でも同じではありますが、
私がいまAndroidを中心に開発をしているのでjavaベースで書かせていただきます。

# 「Nullチェック」は必要な場所だけでやること
## 戻り値がCollectionの時にNullは返さない
よく「Nullチェック」をする個所としてメソッドの戻り値に対してのものが多いかと思います。

```
// DBから一覧を取得する
List<HogeEntity> hogeList = loadDbAll();
if (hogeList != null) {
    for (HogeEntity hoge : hogeList) {
        //処理
    }
}
```
こんな感じですね。
ただ、考えてみてください。
この「Nullチェック」は本当に必要でしょうか？

```
List<HogeEntity> loadDbAll() {
    ・
    ・処理
    ・
    if(件数が0件だったら) {
        return null;
    }
}
```
のような形になっていたら呼び出し側で「Nullチェック」は必要でしょう。
ただ、件数が0件であるという戻り値を返したいのであれば、Nullよりも空のCollectionを返したほうが、
状況としても適切ですし、呼び出し側で「Nullチェック」の必要もありません。

```
List<HogeEntity> loadDbAll() {
    ・
    ・処理
    ・
    if(件数が0件だったら) {
        return new List<HogeEntity>();
    }
}
```
こんな感じですね。
事前にCollectionを宣言していればそもそも件数チェックのif文すら不要になるかもしれません。


## 実行の成否をNullで表現しない
上記は全件取得のようなパターンでしたが、
特定のキーから1件だけ取得するという場合で考えてみます。
こういうときでも、取得出来たら～～するというように、「Nullチェック」することが多いと思います。

```
// DBから1件取得する
HogeEntity hoge = loadDb(id);
if (hoge != null) {
    hoge.fuga();
}
```
こんな形になると思います。
これも本当に必要でしょうか？
ユーザー入力からのあいまい検索をかけるような場合であればまだしも、
DBのPKなどを使ってシステム上で検索をかけるような、
狙ったレコードがヒットすることが前提である場合にはそれが取得できないというパターンは、
システム的な異常である可能性が高いです。
それにもかかわらず、取得できなかった時にNullを返すような作りは、
呼び出し改装にNullチェックをさせるだけでなく、システム異常の検知を投げることになるため設計上もよくありません。

```
List<HogeEntity> loadDb(int id) throws IllegalArgumentException {
    ・
    ・処理
    ・
    if(ヒットしなかったら) {
        throw new IllegalArgumentException();
    }
}
```
としておきましょう。
こうすることで、呼び出し側では「Nullチェック」の必要はなく、
実行の成否の判断もExceptionの発生で判断することができます。
### Nullになる可能性のあるfindViewByIdはしない
Android開発をやっていると時々目にするコードに、

```
Button button = (Button)findViewById(R.id.my_button);
if (button != null) {
    button.setText();
}
```
のようなものがあります。
レビューでなぜこのタイミングで「Nullチェック」をするのか聞くと、
「複数の画面と共通化していて、このビューがない画面もあるからです」
と言われることが多いのですが、
「このビューがない画面であるならば、この処理を持ち込まないでほしい」と考えます。
Activityの親クラスを作って共通化していると思いますが、
継承関係を整理して必要なモノだけを継承するように設計しましょう。

## おわり
以上、「Nullチェック」を減らすことでステップ数を減らし可読性を向上することができます。
また、Nullになると落ちるからとむやみにチェックを入れることでその場は回避できてなんとなく動くようになったとしても、本質的な問題に気づけないということに陥る可能性が残ってしまいます。
私見も多分に含まれていると思いますが、少しでもお役に立てば幸いです。
iPhone7には第3世代のモバイルFeliCa SEが載っている…と予想

iPhone7には第3世代のモバイルFeliCa SEが載っている と思います。

なので、そう考える根拠を書いてみます。

# 1) iPhone7にはモバイル FeliCa SEが載っている。

Engadget の記事 「 [iPhone 7の電池が切れてもSuicaは使える? JR東日本『使えますが...』](http://japanese.engadget.com/2016/09/08/iphone-7-suica-jr/) 」によると、電源オフでもSUICAが使えると書いてある。

```
「基本的には、(Androidスマホ等にすでに提供中の)モバイルSuicaと同じイメージ。
電池が切れてもしばらくは使える。ただ可能であれば充電して使っていただくことに
なる」(JR東日本広報部)
```

電源オフ時でも使えるということは、 iPhone 7 はHCE (Host based Card Emulation) でなく、"おサイフケータイ"と同じように Secure Element  を端末に搭載しているということになる。 HCEだとソフトウェア処理が必要なので、電源オフ時には使用できない。

なので、iPhone7にはモバイル FeliCa SEが載っていると予想します。

# 2) iPhone7には、第3世代のモバイルFeliCa SE が載っている。

モバイル FeliCa SEには３つの世代があります。

* 第１世代のモバイル FeliCa SEはソニー製で、もう製造されていない。　
* 第２世代のモバイル FeliCa SEは2007年から製造され、２０１６年現在も使用されている。 ソニー製、ルネサス製、東芝製がある。
* 第３世代のモバイル FeliCa SEは2016年から背製された。東芝製、Sumsung製がある。

モバイルFeliCa SEの製造元、製造年の情報は、ちょっと前に「[Mobile FeliCa SEチップのCC認証](http://qiita.com/eggman/items/27d988fe5c0be2c38a33)」の記事で調べました。

2014年ごろの記事「[iPhoneでも「おサイフケータイ」を実現？！、ソニーとフェリカネットワークスが新技術や新コンセプトを披露](https://wirelesswire.jp/2014/07/12295/)」によると、第３世代のモバイル FeliCa ICチップの特徴は、NFC標準規格のCLFに対応したことのようです。

なので、NXPのNF対応CLFと接続する場合は、NFC標準規格のCLFと接続可能な第３世代のMobile FeliCa SEである必要があると予想します。


# 3) NXPのNFCパッケージ内にMobile FeliCa SEのダイが入っている。

2016-09-24 時点の情報では、どこにSEが載っているかは不明です。

[chipworksのiPhone SEの分解レポート](http://www.chipworks.com/about-chipworks/overview/blog/apple-iphone-se-teardown)によると、NFCのチップのパッケージにNXP製SEのダイが入っていました。多分これはApple Payで使うSEだと思います。

モバイルFeliCaのSEチップも同様にNFCチップのパッケージ内に入っていると予想します。

iPhone7のNFCチップのパッケージの中には、NFCチップのダイ、ApplePay用SEのダイ、モバイルFeliCa SEのダイの３つが入っていると予想します。。

早くNFCチップを分解した結果を出して欲しいところです。
Node.js で server の random port を取りたい時は listen(0) にする。

# Node.js で server の random port を取りたい時

server を使った test をしたい時、 その環境で使われていなさそうな port をあれこれ確かめたりしていた時代が僕にもありました。んで、それはさすがに無駄なので [random port を取るためのモジュール](https://www.npmjs.com/package/plz-port) を作っちゃったりしてたんですが、こんなことをしなくても `server.listen(0)` にするだけでrandom port とれます。

```javascript
const http = require('http');

const server = http.createServer((req, res) => {
  res.end('hello');
});

server.listen(0);
server.on('listening', () => {
  // ここで random port が取れる
  const port = server.address().port;
});
```

# なんでこんなことができるのか

listen(0) にすると、node.js では random port を勝手に取ってくれます。 OS の機能で使っていない port を取るわけです。便利。
このランダムな port は ephemeral port と呼ばれています。直訳すると短命ｐort。
ephemeral port は [wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%95%E3%82%A7%E3%83%A1%E3%83%A9%E3%83%AB%E3%83%9D%E3%83%BC%E3%83%88) によるとそのレンジが決まっています。

```
IANAは、ポート番号49152から65535を"DYNAMIC AND/OR PRIVATE PORTS"（動的・私用ポート）として使うように提言している。
FreeBSDはバージョン4.6以降でIANAの提言する範囲を使っている。

多くのLinuxカーネルは32768から61000を使う。割り当て範囲は/proc/sys/net/ipv4/ip_local_port_rangeに書かれている。

Microsoft WindowsはWindows XPとWindows Server 2003まではデフォルト設定で1025から5000をエフェメラルポートとして使用していた。Windows VistaとWindows Server 2008以降はIANAの提言する範囲を使用している。
```

つまり IANA の定義では、 16383 程度のportはもてます。
ただそれ以上のportは割当できないので、注意は必要です。それ以上のportを割り当てたテストをしたい場合は上述したrandom portを割り当てるためのモジュール使うほうが良いかと。
How to read pydoc on python interpreter

Windows でも(ConEmu)[https://conemu.github.io/] 環境から直接 python.exe を叩くことでインタプリタを動かせばわりと便利なのだが、Unix 環境に接続していない状態で pydoc を読もうとしてはたと詰まった。 Cmd の窓を開いても、パスは通っていないようだ。

コマンドラインで読むには、と検索して 'python -m pydoc [target] という tipsもみつけた ( [Windows 7 - pydoc from cmd -Stack Overflow-](http://stackoverflow.com/questions/4149274/windows-7-pydoc-from-cmd) ) のだが、これも二枚の窓を開くことになる。unix 環境につないだときに pydoc の本体をみて。　いや、Windows 環境のままでも 'pydoc -m pydoc pydoc' で出てきた唯一のメソッドをそのまま実行すればよかったのだが。インタプリタ上では次のようにすればよかった。

'import pydoc
pydoc.help( 'pydoc' )'


こういう感じになる
![pydoc.png](https://qiita-image-store.s3.amazonaws.com/0/141890/4d2fb505-a9f4-61d8-3907-c292ae54f528.png)
クリップボードの内容をプレーンテキストとHTMLに変換するAppleScript


## pasteboardAsString

```pasteboardAsString.scpt
use framework "AppKit"
use framework "Foundation"

return my pasteboardAsString()

on pasteboardAsString()
	--require framework: AppKit, Foundation
	set pasteboard to current application's NSPasteboard's generalPasteboard
	return (pasteboard's stringForType:(current application's NSPasteboardTypeString)) as text
end pasteboardAsString
```


### 更新履歴

* 2016-02-01: AppKitフレームワークのNSPasteboardクラスとNSAttributedStringクラスを使って作成
* 2016-09-24: `stringForType`メソッドを使用



## pasteboardAsHTML

```pasteboardAsHTML.scpt
use framework "AppKit"
use framework "Foundation"

return my pasteboardAsHTML()

on pasteboardAsHTML()
	--require framework: AppKit, Foundation
	set pasteboard to current application's NSPasteboard's generalPasteboard
	set HTML to pasteboard's stringForType:(current application's NSPasteboardTypeHTML)
	if HTML = missing value then
		set RTF to pasteboard's dataForType:(current application's NSPasteboardTypeRTF)
		if RTF = missing value then
			error
		end if
		set attributedString to current application's NSAttributedString's alloc()'s initWithRTF:RTF documentAttributes:(missing value)
		set attributes to current application's NSDictionary's dictionaryWithObject:(current application's NSHTMLTextDocumentType) forKey:(current application's NSDocumentTypeDocumentAttribute)
		set HTMLData to attributedString's dataFromRange:{location:0, |length|:attributedString's |length|()} documentAttributes:attributes |error|:(missing value)
		set HTML to current application's NSString's alloc()'s initWithData:HTMLData encoding:(current application's NSUTF8StringEncoding)
	end if
	return HTML as text
end pasteboardAsHTML
```


### 更新履歴

* 2016-02-01: AppKitフレームワークのNSPasteboardクラスとNSAttributedStringクラスを使って作成
* 2016-09-24: `stringForType`メソッドと`dataForType`メソッドを使用
UITableViewCellをタップして削除ボタンを表示させる


![cellOnTapShowDelete.gif](https://qiita-image-store.s3.amazonaws.com/0/49022/fa7429b6-aece-c33c-49d3-86d833a6e30b.gif "cellOnTapShowDelete.gif")

`UITableView`のリストを削除するケースで、`UITableViewCell`をタップして削除ボタンを表示させるやり方。

本来であれば、iOSの作法にのっとってナビゲーションバーに編集ボタンを置いて編集モードにさせたり、Cellを左にスワイプした時に削除ボタンを表示させるのが普通だけど、それらのUIが他の機能とバッティングしていたため、このような対応が必要になった。

## MGSwipeTableCellを使用
`UITableViewCell`をスワイプした時に表示させる削除や編集ボタンのアニメーションやイベントをカスタマイズできるライブラリ`MGSwipeTableCell `を使った。
もともとスワイプさせてボタンを表示させることを目的としたライブラリだが、スワイプの操作を無効にすることと、ボタンを表示させるメソッドが用意されているので、その２つのAPIを利用して、今回の仕様に対応させた。
`MGSwipeTableCell `は`cocoapods`からインストールできる。

以下は、ストーリーボードで実装した場合。

## ストーリーボードの設定
Cellをタップした時に`UITableView`の`didSelectRowAtIndexPath`が呼ばれるように`UITableView `の`Selection`を`Single Selection`に設定する。

![Main_storyboard_—_Edited2.png](https://qiita-image-store.s3.amazonaws.com/0/49022/2ec0ca94-ad86-c0d5-29a7-8a859da58a78.png "Main_storyboard_—_Edited2.png")


`UITableViewCell`のClassに`MGSwipeTableCell`を指定

![Main_storyboard_—_Edited.png](https://qiita-image-store.s3.amazonaws.com/0/49022/cfa77314-ecea-a125-37f3-0eccb7310ac3.png "Main_storyboard_—_Edited.png")


## 削除ボタンを設定
`cellForRowAtIndexPath`で削除ボタンを設定する。
下記サンプルは右ボタンに削除ボタンを１つだけ設定しているが、複数のボタンを配置したり、セルの左側にボタンを設定することも可能。

```swift
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
  let reuseIdentifier = "programmaticCell"
  var cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier) as! MGSwipeTableCell!
  if cell == nil
  {
    cell = MGSwipeTableCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: reuseIdentifier)
  }
  cell.textLabel!.text = "Title"
  cell.delegate = self
  
  // セルの右に表示する削除ボタンを設定
  cell.rightButtons = [MGSwipeButton(title: "Delete", backgroundColor: UIColor.redColor())]
  cell.rightSwipeSettings.transition = MGSwipeTransition.Static
  
  return cell
}
```

## Cellがタップされた時の処理
`didSelectRowAtIndexPath`で削除ボタンを出現させる。

```swift
//Cellを選択した時
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
  let cell = tableView.cellForRowAtIndexPath(indexPath) as! MGSwipeTableCell!
  //削除ボタンを表示
  cell.showSwipe(MGSwipeDirection.RightToLeft, animated: true)
}
```

## 削除処理
`MGSwipeTableCellDelegate`でスワイプでのボタン表示を無効にし、削除ボタンが押された時の削除処理を実装する。
削除ボタンが押された時は`tappedButtonAtIndex`でボタンのIndex。`direction`で左右の位置が取得できる。
サンプルはCellの右側から出現した１つ目のボタンを削除ボタンとして判定している。

```swift
extension tableViewController:MGSwipeTableCellDelegate{
  func swipeTableCell(cell: MGSwipeTableCell!, canSwipe direction: MGSwipeDirection) -> Bool {
    //Swipe操作を無効
    return false
  }
  func swipeTableCell(cell: MGSwipeTableCell!, tappedButtonAtIndex index: Int, direction: MGSwipeDirection, fromExpansion: Bool) -> Bool {
    //削除ボタンを選択した時
    if direction == .RightToLeft && index == 0 {
      // 削除処理
      // ・・・
      return false
    }
    return true
  }
}
```


## 参考
[MGSwipeTableCell](https://github.com/MortimerGoro/MGSwipeTableCell)
[UITableViewCell show delete button on tap](http://stackoverflow.com/questions/31081639/uitableviewcell-show-delete-button-on-tap)
PowerShell で問題ステップ記録ツールが生成するMHTMLから画像を抽出する


* Windowsには、問題ステップ記録ツール(psr.exe)という、簡易的にスクリーンキャプチャしてくれる便利ツールが標準搭載されている（いつから標準搭載されているのかは知らない）。
* しかし、出力がZIP化されたMHTMLファイルで、キャプチャ画像はBASE64で符号化されていて、ZIPを解凍しても画像が取り出せない。
* とりあえず解凍してできたMHTMLファイルから画像（JPEG）を抽出したい。
* ので、雑に作った。

# 使い方

```
PS C:\demo\psr> tree /a /f
フォルダー パスの一覧:  ボリューム TI31063700D
ボリューム シリアル番号は 7884-7485 です
C:.
|   mhtml2jpeg.ps1
|   
\---psr
        Recording_20160924_2126.mht

PS C:\demo\psr> .\mhtml2jpeg.ps1 .\psr\Recording_20160924_2126.mht .\psr
PS C:\demo\psr> 
PS C:\demo\psr> ls .\psr -name
Recording_20160924_2126.mht
screenshot0001.JPEG
screenshot0002.JPEG
screenshot0003.JPEG
```

# コード

```.ps1
Param ([string]$Path, [string]$Destination)

$Path = Resolve-Path $Path
$Destination = Resolve-Path $Destination

$nameRE = [regex]"^Content-Location: (?<Name>screenshot\d{4}.JPEG)$"
$nextRE = [regex]"^--=_NextPart"

$imagePart = $false
$base64 = ""

switch -regex -file $Path
{
    '^$' {}

    $nameRE
    {
        $name = $nameRE.Match($_).Groups['Name'].Value
        $file = Join-Path $Destination $name

        $imagePart = $true
    }

    $nextRE
    {
        if ($imagePart)
        {
            $byte = [Convert]::FromBase64String($base64)
            [IO.File]::WriteAllBytes($file, $byte)

            $imagePart = $false
            $base64 = ""
        }
    }

    default
    {
        if ($imagePart)
        {
            $base64 += $_
        }
    }
}
```
mp4 から音声ファイル (.aac) を抜く


#1ファイル処理
```bash
avconv -i mov.mp4 -vn -acodec copy snd.aac
```
`-vn` は video を無視.

#ディレクトリのファイル全てを処理する bash script

```bash:extract_aac_from_mp4.sh
#!/bin/bash
ls *.mp4 | sed "s/\.mp4//" | awk '{printf "avconv -i \"%s.mp4\" -vn -acodec copy \"%s.aac\"\n", $0, $0}' | sh
```
`~/script/extract_aac_from_mp4.sh` に保存.

#bash script の呼び出し
```
~/Download/mp4$ sh ~/script/extract_aac_from_mp4.sh
```

#参照
[[SOLVED] Best way to extract AAC from mp4 losslessly](http://www.linuxquestions.org/questions/linux-software-2/best-way-to-extract-aac-from-mp4-losslessly-852936/)
CentOS7にGitLab8を構築

# [概要]
GitLabをプライベートの環境に欲しかったので勉強がてら構築する。

インストールは公式のドキュメントがあるので参考にすると良い。
https://about.gitlab.com/downloads/#centos7

# [事前準備]
CentOS7をインストールしてあること。

# [作業内容]
## 依存関係のパッケージをインストール
```bash
$ sudo yum install curl
$ sudo yum install policycoreutils
$ sudo yum install openssh-server
$ sudo yum install openssh-server
$ sudo yum install openssh-clients
$ sudo yum install postfix
```

## postfix起動
```bash
$ sudo systemctl start postfix
$ sudo systemctl enable postfix
```

## GitLabのインストール
### GitLabのリポジトリを追加
```bash
$ curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
```

### GitLabのパッケージ追加
```bash
$ sudo yum install gitlab-ce
```

### GitLabの設定反映と起動
```bash
$ sudo gitlab-ctl reconfigure
```

### GitLabの設定ファイルについて
GitLabの設定ファイルは `/etc/gitlab/gitlab.rb` となっている。
GitLabの構成は、Nginx、PostgreSQL、Redis、Unicorn等のミドルウェアから構成されており、この設定ファイルをもとに、サーバー構成ツールの `Chef` が、各種ミドルウェアの設定を行う、といった流れになっている。
そのため、GitLabの設定を変更したら `gitlab-ctl reconfigure` を実行して、設定を反映するといった運用になる。

### GitLabの設定ファイル確認
```
$ sudo vi /etc/gitlab/gitlab.rb
```

下記のURLが、正しく設定されているか確認
正しくなかった場合は、設定ファイルを編集し、`sudo gitlab-ctl reconfigure` を実行

```/etc/gitlab/gitlab.rb
external_url 'http://{ドメイン}'
```
### GitLabへアクセス
サーバのIP・ドメイン等をURLに打ち込みアクセスする。
初期ユーザ情報

|ユーザ名   |root    |
|----------|-------|
|パスワード |5iveL!fe|

ログインするとパスワードの変更が求められるので変更する。
変更後は、ログイン画面に飛ばされるので、変更したユーザ情報でログインする。

## [事後確認・作業]
iterm2をアップデートしたら背景画像が動的に変わらなくなったので。

#背景画像を動的に変えて楽しむ

エンターを押すたびに背景画像を切り替えて飽きないようにしていた。

最近、アップデートしたらスクリプトが動かなくなったので修正した。
~/.zshrc

```

image_list1=(`find '/Users/hoge/Pictures/zsh' -name "*.png"  -o -name "*.jpg" -o -name "*.gif"`)
image_index=1
bg() {
     if [ -z "$BUFFER" ]; then
        if test $image_index -eq 10; then
            image_index=1
        else
            image_index=$(( $image_index + 1 ))
        fi
            image_path=$image_list1[$image_index]
            osascript -e "tell application \"iTerm\"
                            tell current window
                                tell current session
                                    set background image to \"$image_path\"
                                end tell
                            end tell
                          end tell"
            zle reset-prompt
            zle accept-line
    else
        zle accept-line
    fi
}
zle -N bg
bindkey '^m' bg

```

とりあえず、コレで動いたのでメモ

各人、'/Users/hoge/Pictures/zsh'は変えてください

indexが10まででループしてあるので、枚数が違う人は
```
if test $image_index -eq 10; then
```
の行の10を変えてください。
Docker コンテナ自動起動

yum updateをした時にコンテナが止まるので自動起動設定しておく
(次のyum updateでちゃんと起動するか要確認ヽ(･ω･)/ｽﾞｺｰ)
多分、再起動とかした時は大丈夫な・はず。

なお、docker run する時にオプション追加でも行けるかも？
うーんc(`Д´と⌒ｃ)つ彡 ﾔﾀﾞﾔﾀﾞ

環境
`$ cat /etc/redhat-release`
CentOS Linux release 7.2.1511 (Core)

serviceに下記の設定ファイルの追加

```:/usr/lib/systemd/system/docker-auto.service
[Unit]
Description=docker-auto
After=docker.service
Requires=docker.service

[Service]
ExecStart=/usr/bin/docker start [DockerID OR DockerNAME]

[Install]
WantedBy=multi-user.target
```

[docker-auto].service:[]ここはわかりやすい名前でいいっぽいヽ(･ω･)

[DockerID OR DockerNAME]は半角スペースで複数可能
順番は先に書いた方が優先。ものによっては順番注意。


ステータスの確認
`# systemctl status docker-auto.service`

自動起動して
`# systemctl enable docker-auto.service`

自動起動止め
`# systemctl disable docker-auto.service`



★[参考記事](https://blog.openmedialabo.net/10963)

※まとめてストップのスタートはできんかったかも？消しました。



### 今更的追記。

`restart: always`

`docker-compose`なら上記追記で自動的に再起動するぽい／(^o^)＼
runにも多分ある。
[備忘録]アプリローカルに書いたファイルをダウンロード


忘れてすぐググるのでメモ。

genymotionでエミュレータ起動

androidstudioのadbのコンソールで、deviceを調べる

```
adb devices
```

```
List of devices attached
192.168.56.101:5555     device
```
でてたらよいが、offlineになってたら、

```
adb kill-server
```

して、エミュレータ再起動し、

```
adb start-server
```

で、

```
adb devices
```

で、ID見る。

でダウンロードしたいファイルのパスをしらべ、以下のコマンド

```
adb -s [deivesで調べたID] pull [DLしたいファイルのフルパス] [落としたい場所]
```

exp.

```
pull adb -s 192.168.56.101:5555 pull /storage/emulated/legacy/Android/data/gkgkdrink.com.jspdftest/files/Documents/ttt.pdf /Users/hoge/work/ggg.pdf
``` 

hogeさんのworkフォルダにttt.pdfがggg.pdfとしてダウンロードされる（ハズ。。。）
ffmpeg/imagemagick のインストール


20160915

~~Anaconda のおかげでコマンドの `$HOME` へのインストールは手軽になったもんだ。~~


## Anaconda

```
$ conda install -c menpo ffmpeg
$ conda install -c kalefranz imagemagick
```

**20160927 imagemagick について追記**

ん〜、いざ使う段になったら、エラーが出るなあ、、、

```
$ identify FOO.png
convert: UnableToOpenConfigureFile `delegates.xml' 
```

他の方法で入れるべきか、、、


## Windows Subsystem for Linux

~~上の方法でも入ると思うが、~~ `apt-get` で。

```
$ sudo add-apt-repository ppa:mc3man/trusty-media
$ sudo apt update
$ sudo apt install ffmpeg
$ sudo apt install imagemagick imagemagick-doc
```
Ruby でクラスインスタンス変数に対するアクセサの作り方

# TL;DR

ActiveSupport が使えるなら `class_attribute` でいいでしょう。
使えない場合は、以下のようにするのが最も簡単そうです。

```ruby
class A
  class << self
    attr_accessor :rw_prop
    attr :ro_prop
  end
  @rw_prop = :rw
  @ro_prop = :ro
end

p A.rw_prop        #=> :rw
p A.ro_prop        #=> :ro
p A.rw_prop = :rw2 #=> :rw2
p A.ro_prop = :ro2 #=> NoMethodError
```

アクセサメソッドを特異メソッドとして定義するだけですね。[^1]

[^1]: 9/25 追記: 最初↑の「余談」のような書き方をしていましたが、コメントを受けて修正しました。

# Motivation

Ruby でクラス内で有効な変数を作りたいとき、クラス変数を使うと継承したクラス同士で値が共有される副作用があり、使いづらいことがあります。
下の記事にも解説があります。

- [これはMUST！ActiveSupport の Class#class_attribute を使おう！ - Qiita](http://qiita.com/cuzic/items/ffd115f1e17458020b1b)

ActiveSupport が使えるのであれば、 `class_attribute` が便利ですが、ライブラリを書いていて使えないなどの場合は、普通はクラスインスタンス変数を使うのが手軽かなと思います。
クラスインスタンス変数であれば、継承関係のあるクラス間で共有されないので、ハマるリスクは少なそうです。

…が、そのままではインスタンスメソッドからアクセスする際に不便なので、さくっとアクセサを作る方法を調べました。

# 参考

- [Rubyのクラスインスタンス変数をアクセサで定義する [俺の備忘録]](http://o.inchiki.jp/obbr/168)
- [Rubyでクラスインスタンス変数にインスタンスメソッドからアクセス | EasyRamble](http://easyramble.com/ruby-class-instance-variable.html)
- [徒然なるままに｜Rubyの継承についてのはなし（インスタンス変数,クラス変数,クラスインスタンス変数,インスタンスメソッド,クラスメソッド,定数）](http://kamiyasu2.blog.fc2.com/blog-entry-35.html)
- [【まとめ】インスタンス変数、クラス変数、クラスインスタンス変数 - Qiita](http://qiita.com/mogulla3/items/cd4d6e188c34c6819709)

# 余談(9/25 追記)

最初、下のような書き方をしていましたが、コメントを頂いて module 要らないことに気づきました。

```ruby
class A
  module M
    attr_accessor :rw_prop
    attr :ro_prop
  end
  extend M
  @rw_prop = :rw
  @ro_prop = :ro
end

p A.rw_prop        #=> :rw
p A.ro_prop        #=> :ro
p A.rw_prop = :rw2 #=> :rw2
p A.ro_prop = :ro2 #=> NoMethodError
```

# 脚注
provideメソッド


show.html.erb(個別のビューファイル)

```
<% provide :title, "マイページ" %> # provideメソッドを使って、`マイページ`という個別のタイトルを設定します
レイアウトファイルでは設定されたタイトルをyieldで表示します。
```


application.html.erb(レイアウトファイル)

```
<head>
  <title>Aiueo | <%= yield :title %></title> # レイアウトファイルでは設定された`マイページ`というタイトルをyieldで表示します
</head>
```

結果

```
<head>
  <title>Aiueo | マイページ</title>
</head>
```
gnu stow

http://fatmouse.xyz/2016/03/07/2016-03-07-manage-package-using-stow/

尝试安装nginx ruby成功

http://stackoverflow.com/questions/1439950/whats-the-opposite-of-make-install-ie-how-do-you-uninstall-a-library-in-lin

http://unix.stackexchange.com/questions/73426/dealing-with-gnu-stow-conflicts
Spring＋Hibernate環境ではStaleObjectStateExceptionがcatchできない

ググってもなかなかヒットしなかったので書き残す。

Hibernateは楽観的排他エラー検出時にorg.hibernate.StaleObjectStateExceptionをthrowするが、Spring環境ではorg.springframework.orm.ObjectOptimisticLockingFailureExceptionにラップして再throwされる。

参考：
[Spring＋Hibernate連携時の主なExceptionまとめ](http://d.hatena.ne.jp/yomama/20070802)


SpringBootならObjectOptimisticLockingFailureExceptionをCatchすればいいですよ。
ORMがHibernateから別なORMに切り替わったとしても、Catch節を書き直さなくて済むようにラッピングしているのです。
[備忘録]ファイルをBase64エンコード(Ruby)


いつも、忘れるからメモ

```
# coding: utf-8                                                                                                                                                                    
require "base64"
#require "open-uri"

# 以下を入力                                                                                                                                                                       
#puts ARGV[0]                                                                                                                                                                      
puts Base64.strict_encode64(open(ARGV[0]).read)

```
LINUX LITE 3.2beta使ってみた

## 自分用メモ

```
sudo apt install -y \
  vncviewer expect autossh vim-gtk xfce4-terminal freerdp-x11-dbg comix rdesktop \
  ssh tig
```

```
sudo update-alternatives --set x-terminal-emulator /usr/bin/xfce4-terminal.wrapper
sudo update-alternatives --set editor /usr/bin/vim.gtk
```

```
sudo ufw allow 22
```

```
sudo apt install -y vino
vino-preferences
gsettings set org.gnome.Vino require-encryption false
sudo ufw allow 5900
/usr/lib/vino/vino-server
```

```
sudo sh -c "wget -qO- https://get.docker.com/ | sh"
sudo usermod -aG docker your-user
```


## download

* [Linux Download | Download Linux Lite Free Linux Operating System](https://www.linuxliteos.com/download.html)
* 特徴
    * 955MiB。1GBのUSBメモリに収まりきらなかった。
    * タスクバーが縦置きにできる (LXDEでは文字が読めなかった)
    * thunderbirdやLibreOfficeが最初から入っている。
    * usage コマンドが便利かも

## インストール

インストーラーで漢字を表示できないため、fontインストール

```
sudo apt update
sudo apt install -y fonts-mona
```

![Screenshot_2016-09-24_17-11-55.png](https://qiita-image-store.s3.amazonaws.com/0/25728/281c2180-8be1-2e80-9935-7bc8dd4847d7.png)

![VirtualBox_lite_24_09_2016_14_57_55.png](https://qiita-image-store.s3.amazonaws.com/0/25728/55443dd5-45fb-eb52-d60d-f4d946d6bd82.png)

```
sudo sed -i -e 's/us./jp./g' /etc/apt/sources.list
sudo apt update
sudo apt install -y build-essential
```

## 日本語入力

* Menu -> Settings -> Language Support
* 日本語を一番上にドラグアンドドロップしてApply

![1st.png](https://qiita-image-store.s3.amazonaws.com/0/25728/136b19fd-f508-666d-6af9-15953f5eed94.png)

## 追加パッケージのインストールが便利

![Screenshot_2016-09-24_17-36-34.png](https://qiita-image-store.s3.amazonaws.com/0/25728/870d535b-51be-1082-ed21-4797c4823413.png)

## samba設定済みで便利

* 以下設定となっている。

```bash:パスワード設定
smbpasswd -a ユーザー名
sudo ufw allow 445
mkdir ~/share/
```

```rb:/etc/samba/smb.conf
[global]
workgroup = WORKGROUP
server string = Linux Lite Shares
netbios name = linuxlite
security = user
encrypt passwords = true
username map = /etc/samba/smbusers
map to guest = bad user
guest account = nobody
dns proxy = no
#======================= Share Definitions ===================================
[linuxliteshare]
path = /home/%U/share
available = yes
valid users = %U %G
write list = %U
browsable = yes
public = no
writable = yes
guest ok = no
read only = no
printable = no
locking = no
strict locking = no
```
git submoduleを再作成する時の注意



削除後の再作成でハマったのでメモ。
と言っても推奨されない使い方で`git submodule add --force`した場合の話。

# まず作成・削除

submoduleを作成する。

```
$ git submodule add <url> <path>
```
このコマンドで、以下が行われる。
+ `.gitmodules`が作られ、submoduleの情報が追記される
+ `.git/config`にsubmoduleの情報が追記される
+ `.git/modules/<path>`が作られ、管理ファイルが置かれる
+ `<url>`のリポジトリが`<path>`にcloneされる

対して削除コマンドは
```
$ git submodule deinit <path>
```
これで以下が行われる。
+ `.gitmodules`から指定submoduleの情報が削除される
+ `.git/config`から指定submoduleの情報が削除される

cloneされた実体が消えていないので`git rm`も行う。
```
$ git rm <path>
```

# 再作成
表面上は削除できたが、実は`.git/modules/<path>`が残っている。
そこで同じ`<path>`に対してsubmoduleを作ろうとするとエラーが返る。

```
$ git submodule add <url> <path>
A git directory for '<path>' is found locally with remote(s):
  origin        <url>
If you want to reuse this local git directory instead of cloning again from
  <url>
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.
```

+ 同じリポジトリについて再度submoduleを作りたいなら`--force`を指定せよ
+ そうでないなら`--name <name>`で別名を付けろ

ということだ。

## ダメなやり方: 異なるリポジトリなのに--forceで再作成
```
git submodule add --force <other-url> <path>
```
異なるリポジトリなのにムリヤリ`--force`を指定すると、表面上はうまくいってしまう。
しかし管理ファイルは以前のリポジトリを参照したままなので、期待した動作にはならない。
`git submodule status`などでは違うステータスが見える筈。

## 良いやり方: 異なるリポジトリなので--nameで再作成
```
git submodule add --name <name> <other-url> <path>
```

この場合管理ファイル置き場は`.git/modules/<name>`になるので古いディレクトリとはぶつからない。

## たぶんダメなやり方: 管理ファイルを削除してから再作成

`.git/modules/<path>`を削除してからなら`--force`も`--name`も無しで再作成できる。
しかし、たぶんこれはよくないやり方。弊害がありそう。

古いsubmoduleがあった時代をcheckoutできなくなったりするとか？
でも分散バージョン管理でそんなことあるかな。

ご存知の方教えてください
GoogleSpreadsheet‎で入力したセルへ自動的に更新者情報のメモを入れる

# やりたかったこと

どいつもこいつも社内のGoogle共有スプレッドシートに自分の署名を入力しないので、GASで自動的にメモを入れてやろうと考えた。
むしゃくしゃしてやった。今も反省してない。

# この記事のポイント

* GSUITEでないと更新者情報（email)は取得できない
* onEdit(event)はプロジェクトのトリガーとして設定しなくても良い
* user.getEmail()は「メールアドレスの表示」が許可されていないと使えない
* メールアドレスを取得するようなコマンドを実行しない限りアクセス許可を求めてこない

## GSUITEでないと更新者情報（email)は取得できない

割と有名かとは思うけど改めて言及しておきます。
Google Spreadsheet‎やForms等にアクセスしてデータを入力した人のユーザー情報は、GSUITEの同一ドメインのユーザー同士でしか取得ができないです。
https://developers.google.com/apps-script/reference/base/user

## onEdit(event)はプロジェクトのトリガーとして設定しなくても良い

とりあえずシートの作り方とかスクリプトエディタの立ち上げ方は飛ばします。
その辺わからない方はGoogle先生に聞いてください。

記事のタイトルである**GoogleSpreadsheet‎で入力したセルへ自動的に更新者情報のメモを入れる**コード自体は以下で終了です。

```
function onEdit(e) {
  var range = e.range;
  range.setNote('Last modified: ' + e.user.getEmail());
//  Logger.log(e);
}
```

私の感覚だとonEditをスクリプトエディタからプロジェクトのトリガーとして設定する必要があると考えていたのですが、onEditに関しては最初から自動で実行されているようです。
似たようなものにonChangeがありますが、こちらはプロジェクトのトリガーを明示的に設定しないと動きません。

この辺に関しては以下のブログを参考にさせて頂きました。
[まだ中学生のブログ](http://madachugakusei.hatenablog.com/entry/2015/10/18/140439)


## user.getEmail()は「メールアドレスの表示」が許可されていないと使えない

ここからが実際に私がハマった箇所になりますが、上のコードを実行しただけでは上手く行かないんですよ。
具体的には渡されたe.userには何も入っていません。

入力されたセルにはsetNoteによって”Last modified: ”のメモだけ書き込まれます。

以前私が作った別のスプレッドシートやフォームではユーザー取得は上手く行っていたのに…はて？

## スクリプト中にSession.getActiveUser().getEmail()のようなコマンドを実行しない限りアクセス許可を求めてこない

GASを作ったことがある人なら必ずと言っていいほど見かけたことのあるこのダイアログ。

![GoogleAppsScriptの許可ダイアログ](https://qiita-image-store.s3.amazonaws.com/0/14114/4eb13677-23c3-6db7-db9a-6fbf0d045850.png)

今回の手順では、これが出てきていません。

こいつを出すためには、コーディング中のどこかの場面で許可が必要なコマンドを実行させる必要があるのですが、今回のように単に渡されてきたUser classを叩いてもそもそもClassが渡って来ていないので何も起こりません。

## メールアドレスを取得するようなコマンドを実行する必要がある

というわけで今回は

```
function onEdit(e) {
  Session.getActiveUser().getEmail();  // ←　1回許可した後は消してOK
  var range = e.range;
  range.setNote('Last modified: ' + e.user.getEmail());
//  Logger.log(e);
}
```

といった感じで、メールアドレスの表示許可をGoogle先生から頂き解決する事が出来た。
(多分、スクリプトエディタのどっか弄れば許可設定できると思うけど…）

![めでたしめでたし](https://qiita-image-store.s3.amazonaws.com/0/14114/a016fa2a-ab0d-80d4-15f4-f33af440c9cc.png)

メルアドじゃなく、実名に変換して記入したいところだけど、まぁいいや。
Angularの環境構築（Yeomanで構築）

> この記事は[Angular+Firebaseでチャットアプリを作る](http://qiita.com/Yamamoto0525/items/a76ea4b3924eeb82b0f9)のエントリーです。
> 関連：[Angularの環境構築（Angular CLIで構築）](http://qiita.com/Yamamoto0525/items/65d5a0b36eb4dbd8079b)

Yeomanでの環境構築も試してみました。
手間はAngular CLIよりもかからないかもしれないけれど、将来性とカスタマイズ性を考えたらAngular CLIの方がいいかな……

## yeoman&angular2&typescriptインストール→実行

```bash
npm install yo generator-angular2-typescript typescript -g
mkdir my-new-project && cd $_
yo angular2-typescript [app-name]
```

yeomanの選択肢↓

```bash
? Which CSS framework would you like to use? Bootstrap
? Which module loader would you like to use? Webpack
? Would you like to use Gulp? No
? Which additional angular packages would you like to include
@angular/forms,
@angular/http
? What's your name: **
? Your email (optional): **@gmail.com
? Your website (optional): 
? Which license do you want to use? MIT
```

## generator-angular2-typescriptでできること

```bash
npm start //実行
npm run build　//ビルド
npm test // karmaテスト
```

実行するとこんな感じ↓

![app test.png](https://qiita-image-store.s3.amazonaws.com/0/112566/374fa9e3-daac-000e-766c-d229d04ce19e.png)
Swift3でdynamicTypeからtype(of:)になったさいにクラス同一判定で躓いたこと


# 概要
Swift2.2プロジェクトをXcode8にしてSwift3にしてエラーをポチポチ潰していたのですが、dynamicTypeで少し躓いたので共有しておきます。




# 内容

## Swift2.2
下記プログラムは、Swift2.2で書いてました。
渡されたUIViewControllerのサブクラス(Hoge/Fuga)が、既にセット済みであれば、即終了する処理です。

~~~Swift

class HogeViewController : UIViewController{}
class FugaViewController : UIViewController{}

class MenuViewController : UIViewController{

  var contentViewController:UIViewController!

  func setContentViewController(contentViewController:UIViewController){
    guard self.contentViewController.dynamicType != contentViewController.dynamicType else { return }
    // 省略
  }
}
~~~

## Swift3
Swift3+Xcode8では次のようにdynamicTypeからtype(of:)にエラー補完されました。

~~~Swift
class HogeViewController : UIViewController{}
class FugaViewController : UIViewController{}

class MenuViewController : UIViewController{

  private var contentViewController:UIViewController!

  func setContentViewController(contentViewController:UIViewController){
    guard type(of:self.contentViewController) != type(of:contentViewController) else { return }
    // 省略
  }
}
~~~

# 実行結果

正常に動きません。


# 結果

次のようにif let でunwrapしてから判定するようにしました。

~~~Swift
class HogeViewController : UIViewController{}
class FugaViewController : UIViewController{}

class MenuViewController : UIViewController{

  private var contentViewController:UIViewController!

  func set(contentViewController:UIViewController){
    if let currentContentViewController = self.contentViewController {
      guard type(of:currentContentViewController) != type(of:contentViewController) else { return }
    }
    // 省略
  }
}
~~~
東京ゲームショウ 2015, 2016 から見る VR 業界の急速な成長

東京ゲームショウ 2016 に行ってきた。東京ゲームショウ 2015 と 2016 の VR 業界の差分を自分が感じた範囲で紹介しようと思う。

## 東京ゲームショウ 2015 の VR

2015 年も VR 系の展示はあったものの、ハコスコなどで 3D 空間を表示してジャイロセンサーで頭の動きをトラッキングしてカメラの回転を反映させている程度だった。 Oculus も展示していたようだが自分が見ていなかったのでここの部分は不明。

2015 年の　VR は 3D の CG をどのように表示するかという部分にフォーカスされていたように思う。また、2015 年は個別のゲームで VR 対応しているものを展示しており、展示場所が点在していた印象。

## 東京ゲームショウ 2016 の VR

今年のゲームショウではまず、初日の基調講演が "VRマーケットの展望" から始まり、 VR 専用の展示ゾーン (9-11) が大きく設けられていた。また PSVR や HTC Vive, FOVE などのメジャーどころが出展しており、それぞれの整理券がすぐに完売していた。展示エリアに占める VR の割合が大幅に増えた。

展示の中身も大きく変わり、今年は VR 空間内で 3D 空間を表示するのに加え、ユーザーのインプット、フィードバック方法を変えるアプローチが多くされていた。以下に自分が試せたものを紹介していく。

### Rez Infinite VR

電気刺激を様々箇所に受ける独自のスーツ （Synesthesia Suit） を着て体験するアプリケーション "Rez Infinite VR" が出展しており、運良く体験することができた。

![Synesthesia Suit](http://res.cloudinary.com/djgriccu9/image/upload/v1474705171/synesthesia-suit_u1tbvy.jpg)

Qiita で YouTube 動画の貼り方が分からないので続きは元記事にて＞[東京ゲームショウ 2015, 2016 から見る VR 業界の急速な成長](http://monopocket.net/blog/vr/tgs2016/)
Android Studioの未使用コード削除手順

## 概要
Android Studioで未使用コード（不要なコード）を消すための手順です。

## 簡易まとめ
- Analyze > Inspect Code... > Inspection scopeで検査範囲選択してOKボタン
- Declaration redundancy > Unused declaration > 対象を選択 > 右クリックメニューのSafe delete実行

## 前提
OS: OS X El Capitan
Android Studio version: 2.1.3

## 手順

### コード検査
Analyze > Inspect Code... > Inspection scopeで検査範囲選択してOKボタン
![Screen Shot 2016-09-16 at 18.54.32.png](https://qiita-image-store.s3.amazonaws.com/0/123122/100d10e8-3a0d-c1d6-aeac-930fe8a9d203.png)
大きいprojectだと時間がかかるので適当な範囲に絞る

### コード削除
Declaration redundancy > Unused declaration > 対象を選択
![Screen Shot 2016-09-16 at 18.57.32.png](https://qiita-image-store.s3.amazonaws.com/0/123122/9ea517ad-8ee5-8677-a06e-30491437a0e1.png)

右クリックメニューのSafe delete実行
![Screen Shot 2016-09-16 at 18.58.15.png](https://qiita-image-store.s3.amazonaws.com/0/123122/f1212969-93f1-959a-d61d-7c9d5138231a.png)
Angular+Firebaseでチャットアプリを作る

# はじめに

今、最も注目されているJavaScriptフレームワークの１つであるAngular(9.xx)と、同様に注目度の高いBaaS（Backend as a service）であるFirebaseを使って、チャット用WEBアプリをハンズオン形式で書いていきます。

「Angular+Firebase」のリアルタイム更新に興味がある方はご一読ください。

*****
（追記：2017/6）本記事は元々「Angular2+Rails5でチャットアプリを作る」と題していましたが、ここ半年ほどひたすら「Angular+Firebase」を触ってきたので、「Angular+Firebaseでチャットアプリを作る」として、現時点（2017年6月）での最新の内容に書き換えています。
（追記：2018/1）現時点（2018年1月）での最新の内容に書き換えています。
（追記：2018/9）現時点（2018年9月）での最新の内容に書き換えています。
（追記：2020/6）現時点（2020年6月）での最新の内容に書き換えています。
（追記：2020/8）最後の記事を投稿しました。本連載は以上で終了です。
*****

## 対象読者
- nodeについてある程度知識がある
- Angularに興味がある
- Firebaseに興味がある
- サクサク動くチャットアプリを作りたい

## 開発環境
Mac OSX: v10.15.5
Node: v12.18.0
np@m: v6.14.5
@angular/cli: v9.1.8
firebase-tools: v8.4.3

## プロジェクトで使用するライブラリ
Angiular: v9.1.11
firebase: v7.15.3
Bootstrap: v4.4.0
Moment.js: v2.26.0
ngrx: v9.2.0

## レポジトリ
https://github.com/Yamamoto0525/NgChat
*****
（2018/9時点）https://github.com/Yamamoto0525/NgChat_bk2
（2017/6時点）https://github.com/Yamamoto0525/NgChat_bk
*****

## 作成するアプリの仕様
- マルチデバイス対応
- 自分と第三者とでチャットを行う
- 入力には認証が必要
- チャット内容をリアルタイム（更新などを行わず）に、他の端末に反映
- ユーザーはコメントの作成、読み込み、更新、削除（CRUD）ができる

# トピック
## チャットの入力画面を作成
- [Angularの環境構築（Angular CLIで構築）](http://qiita.com/Yamamoto0525/items/65d5a0b36eb4dbd8079b)
- [Angularでビュー（チャット画面）を作る](http://qiita.com/Yamamoto0525/items/94613c79ef2aa461b91e)
- [AngularのngForでチャットコメントを実装する](http://qiita.com/Yamamoto0525/items/5ee362967295ec4d2c65)
- [AngularのngIfとsubmitイベントでチャットコメントを実装する](http://qiita.com/Yamamoto0525/items/a6995da3ffbb4985c5e2)
- [AngularのPipeを使って、日付を変換する](http://qiita.com/Yamamoto0525/items/afc1c23ea56ae20a1931)

## Firebaseの導入
- [Firebaseの環境構築](http://qiita.com/Yamamoto0525/items/fb23707831ff6d181544)
- [AngularのプロジェクトにFirebaseを導入する](http://qiita.com/Yamamoto0525/items/437a2884c0c51f5a3af8)
- [Angular+Cloud FirestoreでCRUD(CREATE, READ, UPDATE, DELETE)を実装する](http://qiita.com/Yamamoto0525/items/c1ec1b7ce2350b294aeb)

## Angularの階層構造構築
- [AngularのNgModuleを使って、アプリの構成を管理する](http://qiita.com/Yamamoto0525/items/c647f03a5ab56883e09e)
- [Angularのルーティング設定（基礎編）](http://qiita.com/Yamamoto0525/items/e870713d9d05d2d36a80)
- [AngularのRxJSを使ってデータの受け渡しをする](https://qiita.com/Yamamoto0525/items/efc0e5617c7427fea86a)

## Angular+Firebaseの認証設定
- [Angular+Firebase Authenticationで認証機能を導入する](https://qiita.com/Yamamoto0525/items/054b28e8b34135399237)
- [Angularのルーティング設定（応用編）](https://qiita.com/Yamamoto0525/items/bebb507416b562b14b77)
- [Angular+Firebase ユーザー設計とデータの保護](https://qiita.com/Yamamoto0525/items/e94fc6da25b2d2524332)

## Angularのngrxを使って状態管理を行う
- [Angularのngrxを使って状態管理を行う（理論編）](https://qiita.com/Yamamoto0525/items/03155acbce1ffd1d037e)
- [Angularのngrxを使って状態管理を行う（実装編：初期設定～エフェクト設定）](https://qiita.com/Yamamoto0525/items/6c31cd6b45d23e54637b)
- [Angularのngrxを使って状態管理を行う（実装編：エンティティ設定）](https://qiita.com/Yamamoto0525/items/e66804ba742bceeb3e38)

## デプロイ環境設定
- [WEBアプリでFirebaseのデプロイ環境を構築する](https://qiita.com/Yamamoto0525/items/782a84cc92a14b35786c)
- [AnglarのビルドとFirebaseのデプロイを連動させる](https://qiita.com/Yamamoto0525/items/0c01ff3922cf461f685b)

## 番外
- [Angular2の環境構築（Yoemanで構築）](http://qiita.com/Yamamoto0525/items/76d0461e38f2fec861bc)
raspberrypi3のバックアップ

raspberrypiの初期セットアップ完了後にバックアップを取得しておくと2度目移行にセットアップを行う際に時間を大幅に短縮できるようになる。

# バックアップを取得する
  - [DD for Windows](http://www.si-linux.co.jp/techinfo/index.php?DD%20for%20Windows)でmicroSDからイメージファイルを作成する。
  - 管理者として実行する。  
        ![DDWin実行.jpg](https://qiita-image-store.s3.amazonaws.com/0/141266/9b7de5ad-9013-c2f9-92b6-be2b0c4c381d.jpeg)

  - ディスク選択でmicroSDのドライブを選択、ファイル選択で保存先を選択する。  
![ddforwin_bkup1.jpg](https://qiita-image-store.s3.amazonaws.com/0/141266/4439e7bf-6a05-a3c2-77d1-d7b27527a980.jpeg)
  - 読込をクリックする  
![ddforwin_bkup2.jpg](https://qiita-image-store.s3.amazonaws.com/0/141266/8e05376a-c6a2-1775-5c4c-27731be5b226.jpeg)

  - バックアップから復帰させる場合は上記手順の逆に書込を行う。
Bash on Ubuntu on WindowsでWebアプリ開発などをする時に困るESETの競合

Bash on WindowsをDjangoアプリの開発に使おうと思って居たのですが，何故かConnection Resetがブラウザに表示され使えませんでした．しかもデバッグ用のstatic filesは見れる(cssやjsなど)という状況でしたが，単にEset Smart Securityのインターネット保護に引っかかっただけでした．
ちゃんとした悪意のあるサイト(？)の場合はEsetがフィルタリングしてると警告を表示するので気づくのに時間がかかり…除外設定をしたらすんなり使えました．
![eset cap.PNG](https://qiita-image-store.s3.amazonaws.com/0/112269/6a3b8d7a-9881-3da1-6643-dec362cb6f42.png)

ただそれだけといえばそれだけの話．
【jonny-five】node.jsでArduinoを操作する。Lチカからセンサ入力まで

`node.js`環境で、手軽にArduinoを扱える`jonny-five`を試してみる。Lチカに終わらず、アナログセンサからの入力までを紹介する。

## 準備
筆者の環境はmacOS、nodeは`v6.6.0`である。
他のOSもしくは環境は使っていたら、適宜読み替えてほしい。

`brew cask`を使ってArduinoをインストール

```
$ brew cask install arduino
```

純正Arduinoを買うのは値段的に馬鹿らしいので、中華Arduino(400円)を使った。
macの場合は別にドライバのインストールが必要がある。
`CH341`あたりでググって自己責任でドライバをインストールする。

## Lチカ

まずは、`jonny-five`をインストールする。

[rwaldron/johnny-five: JavaScript Robotics and IoT programming framework, developed at Bocoup.](https://github.com/rwaldron/johnny-five)


```
$ mkdir arduino-sample
$ cd arduino-sample
$ npm init -y
$ npm install --save johnny-five
```

Arduino側に`StandardFirmata`を書き込んでおく。
`ファイル>スケッチの例>Firmata>StandardFirmata`で見つかるはずだ。
さて、Firmata(フェルマータ)とはなんだろう。
Firmataとは、シリアル通信用の汎用的なプロトコルである。
これを使うことで`node.js`に限らず、様々なプログラミング言語でArduinoを操作できる。

準備ができたら、電子工作のhelloworldことLチカを試してみる。

```js:index.js
'use strict';
const five = require('johnny-five');

const board = new five.Board();
board.on('ready', () => {
  const led = new five.Led(13);
  led.blink(500);
});
```

5行程度で完成だ。

実行

```
$ node index.js
```

<img src="https://raw.githubusercontent.com/rwaldron/johnny-five/master/assets/led-blink.gif"/>

## 光センサからセンサ情報を取得
次は、センサから入力を試してみる。
簡単なアナログセンサとして、光センサがある。
CdSセルやフォトレジスタと呼ばれるあれだ。
たぶん40円ぐらいで買える。

`jonny-five`は様々なセンサやハードウェアに対応しているが、今回は単純にアナログインプットを使う。

```js:index.js
'use strict';
const five = require('johnny-five');

const board = new five.Board();

board.on('ready', () => {
	const s = new five.Sensor('A0');

	s.on('change', v => {
		console.log(v);
	});
})
```

抵抗をはさみ`A0`と`5V`と`GND`を繋げばいい。
ググれば同じような構成なサンプルが数多く出てくるからわからければ参考にしてほしい。

```
$ node index.js
1474702700109 Device(s) /dev/cu.wchusbserial1410
1474702700117 Connected /dev/cu.wchusbserial1410
1474702704011 Repl Initialized
>> 0
335
338
340
342
330
82.5
28
17
16
14
9.5
7
6
5
71
332
341.5
```

CdSセルを手で覆ったり放したりすると、値が変化するのがわかる。
本来は正規化した方がよさそうだが、今回は簡単のためここまでとする。

## おわりに
jonny-fiveを使うと簡単にArduinoを扱えることがわかったと思う。いちいちArduinoに書き込む手間がないので、プロトタイプ作成にはもってこいだ。

## 参考

[rwaldron/johnny-five: JavaScript Robotics and IoT programming framework, developed at Bocoup.](https://github.com/rwaldron/johnny-five)
Vue.js の新機能をみていこう（２

[前回](http://qiita.com/kazusa-qooq/items/39278dba2b8c855b0c86)の続きです。
Vue.jsの２系の更新内容を見ていきます。

#v-modelの変更点
* lazyとnumberの記法がパラメータからモディファに変わりました
    * \<input v-model.lazy="text">
* trimモディファが追加されました。
* debounceパラメータは非推奨になりました。
* v-modelはテンプレートに書かれた値を無視し、Vueインスタンスのデータを初期値として使用します。
* 同様にテキストエリアも、テンプレートに書かれたテキストではなく、Vueインスタンスのデータを初期値として使用します。
* これはつまり、JavaScript側がテンプレート側の値を気にする必要がないということです。
* プリミティブ値の配列（strings)をv-forに渡し、その値（str）をバインドする場合、v-modelは機能しません。代わりにオブジェクトの配列（objs)をv-forに渡し、そのオブジェクトの属性（obj.str）をバインドしてください。

# Props
* onceとsyncは非推奨になりました。データの反映は親から子への下方向のみです。親に変更を反映するにはイベントを発生させてください。
* 2.0においてPropsは不変だと考えてください。新しい描画メカニズムにより、ローカルでPropsを変更しても親のレンダリング時に上書きされるでしょう。代わりにデータプロパティか算出プロパティを使います。

# keep-alive
* keep-aliveはコンポーネントになりました。\<keep-alive>で囲んでください。

# Slots
* 同じテンプレートに同じ名前のSlotは複数存在できません。
* すでに描画されたSlotはそれ以降無視されます。
* SlotでインサートされるコンポーネントはSlot属性を保持できません。

# Refs
* v-refは属性になりました。
    * \<comp ref="foo">
* 動的バインディングもサポートされました
    * <code> \<comp :ref="dynamicRef">
* vm.\$els と vm.\$refsは統合されまれた。通常の要素上ではrefはDOM要素を、コンポーネント上ではコンポーネントを指します。
* vm.\$refsはレンダリング中に設定される値なので、値の変更は画面に反映されません（つまり、リアクティブではありません）。
* 基本的に\$refsはJavaScript内で使うためのものです。テンプレートでは使用しないほうがよいです。

#Misc
* track-byはkeyに置き換わりました。属性と同じルールでバインディングされます。ただし、v-bind: または　：（コロン）は必要ありません。またリテラル文字列を与えてください。だいたいの場合、動的バインドを使用するので、以下のようになるでしょう。
    * \<div v-for="item in items" :key="item.id">
* 属性内の文字列置換は非推奨になりました。代わりに動的バインドを使用してください。
* バインディング時、null, undefined, flaseのみがfalseとして扱われ、0, 空文字はtrueになります。
* 列挙型の属性においてこれは次のような挙動を示します。
    * <code> :draggable="''" => draggable="true"
    * さらに列挙型については文字列'false'もflaseとして扱われます。
* カスタムコンポーネントのv-onは、カスタムイベントのみに反応し、DOMのイベントは無視します。
* v-elseはv-showでは使えないので、否定演算子！を用いてください。
* ワンタイムバインディング{{ * foo }}は非推奨になりました。代わりにv-onceを使います。
* Array.\$set/\$removeも非推奨です。代わりにVue.set か Array.splitを使ってください。
* !importantは直書きの:styleでは使えません。
* ルートインスタンスはpropsではなくpropsDataを使います。
* elオプションはVue.extendでは使えなくなりました。インスタンス生成でのみ使えます。
* Vueインスタンス上ではVue.set/deleteは使えません。トップレベルのdataオプションを定義する際に使用します。
* コンポーネントインスタンスのルート\$dataは置き換えできません。
* vm.\$watchで作成したウォッチャーはコンポーネントの再描画前に呼び出されます。これにより無用な更新を避ける機会が与えられます。
* コンポーネントが更新された後にDOMを操作したいなら、lifecycleフックが使えます。

# Tips
* \$dispatchと\$broadcastの非推奨について
    * jQueryのようなEventEmitterを用意してるので代用してください。
    * v = new Vue(); v.\$emit / .\$on / .\$off
* Arrayフィルターの非推奨について
    * 算出属性で代用してください


やっぱり結構変わってますね。移行とか大丈夫なんですかね？
つぎはIntroductionの内容でもやっていきましょうか。
Unity / geometry > droxtalの表示 > v0.1 to v0.3 > Droxtalの頂点計算 / mesh表示 / 1024個のdroxtal

```txt:動作環境
Unity 5.3.5f1 on MacOS X El Capitan
```

関連　http://qiita.com/7of9/items/86edd64a1014ecb9ee80

Dorxtalの頂点計算を実装してみた。
とりあえず、頂点の位置に球を配置して計算の妥当性を確認する。

### 幾何情報

http://www.ssec.wisc.edu/~BAUM/Papers/AO_Zhang_2004.pdf
のEquations1-3と図2を参考にする。

```math
a_1 = R sin\theta_1
```

```math
a_2 = R sin\theta_2
```

```math
L_1 = Rcos\theta_1
```

```math
L_2 = Rcos\theta_2
```

```math
h = a_1 * (L_1 - L_2) / (a_2 - a_1)
```

天頂角(θ1,θ2),radius(R)が与えられれば上記の値が求まり、頂点の座標となる。


### code v0.1

[v0.1 @ github](https://github.com/yasokada/unity-160924-droxtal/releases)

### 結果

実際のUnityではカメラ回転スクリプトを入れているので回転しながら見ることができる。

その一場面が以下。Droxtalの形状になっている。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d3a8d9b8-0fae-fd88-c7aa-52648fb8141b.png)

### code v0.2

Mesh表示してみた。

[ v0.2 @ github](https://github.com/yasokada/unity-160924-droxtal/releases/tag/v0.2)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4fa59fd6-1028-207c-635c-1e70c5c126d2.png)

MaterialsのElement0をDefault-diffuseとしている。

形状がわかりくいがDroxtalになっている。

### code v0.3

1024個のdroxtalをランダムに並べてみた。
これが１つのGameObjectで作成できている。

[ v0.3 @ github](https://github.com/yasokada/unity-160924-droxtal/releases/tag/v0.3)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0ba9992a-cafa-9c83-e80e-7c692f544a47.png)

2048個にした時に以下のエラーが出る。

> Mesh.vertices is too large. A mesh may not have more than 65000 vertices.

1つのdroxtalが44個の三角形から構成されるので、この上限に達する。

今回作ったdroxtalGOを1000個並べると100万個の粒子の表示ができるが、もっと簡単な方法はないものか。
raspberrypi3の日本語対応

# 日本語が表示されるようにする
  - 初期状態では日本語が表示されないため、下記コマンドで日本語フォントをインストールする。

  ```
  sudo apt-get update
  sudo apt-get install fonts-ipaexfont
  ```

# 言語設定、タイムゾーンを日本語にする
 - Raspberry Pi Configurationを開く  
 ![japanese1.jpg](https://qiita-image-store.s3.amazonaws.com/0/141266/4fc545b4-8809-c8be-d627-43e5385236db.jpeg)

 - Localisationタブを選択
 - Set Localeをクリック、Lanuguage設定でja(japanese)を選択する。  
![japanese2.jpg](https://qiita-image-store.s3.amazonaws.com/0/141266/f52790ae-573a-ff65-b3d1-dde87f2fc48f.jpeg)

 - Set Timezoneをクリック、Area設定をJapanで選択する。  
 ![japanese3.jpg](https://qiita-image-store.s3.amazonaws.com/0/141266/751bf508-80e9-be58-f02d-eced693c4f7e.jpeg)

 - Set Keyboardをクリック、CountryからJapanを選択する。
   - キーボード設定はリモートではできないため直接操作して変更する

# 日本語入力ができるようにする
  - IMEソフトのインストール

  ```
  sudo apt-get update
  sudo apt-get install uim uim-mozc
  ```
  - rebootを行い、日本語の入力ができていれば成功です。
ruby on rails で　localhost が開かないです。　ターミナルでこのようなエラー文が書いてありますがどうすればいいでしょうか？

first_apuri $ rails server
=> Booting WEBrick
=> Rails 4.2.6 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
Exiting
/Users/　　　　　/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:268:in `load': /Users/　　　　　/first_apuri/config/routes.rb:4: syntax error, unexpected end-of-input, expecting keyword_end (SyntaxError)