OmniAICreator/Qiita-1.07M huggingface dataset:
GHCで自動的にメモ化される条件


ghcコンパイラで自動的にメモ化される条件を調べてみました。
##フィボナッチ数を計算
例としてよくあげられているフィボナッチ数の計算です。

```haskell:fib1.hs
fib 0 = 0
fib 1 = 1
fib n = fib (n-2) + fib (n-1)

main = print $ fib 40
```
これをtimeで時間を測ってみますと、0m19.056sかかりました。
次にfib nを展開したプログラムです。長くなりますが40まで展開しています。

```haskell:fib2.hs
fib' 0 = 0
fib' 1 = 1
fib' 2 = fib' 0 + fib' 1
fib' 3 = fib' 1 + fib' 2
fib' 4 = fib' 2 + fib' 3
fib' 5 = fib' 3 + fib' 4
fib' 6 = fib' 4 + fib' 5
fib' 7 = fib' 5 + fib' 6
fib' 8 = fib' 6 + fib' 7
fib' 9 = fib' 7 + fib' 8
fib' 10 = fib' 8 + fib' 9
fib' 11 = fib' 9 + fib' 10
fib' 12 = fib' 10 + fib' 11
fib' 13 = fib' 11 + fib' 12
fib' 14 = fib' 12 + fib' 13
fib' 15 = fib' 13 + fib' 14
fib' 16 = fib' 14 + fib' 15
fib' 17 = fib' 15 + fib' 16
fib' 18 = fib' 16 + fib' 17
fib' 19 = fib' 17 + fib' 18
fib' 20 = fib' 18 + fib' 19
fib' 21 = fib' 19 + fib' 20
fib' 22 = fib' 20 + fib' 21
fib' 23 = fib' 21 + fib' 22
fib' 24 = fib' 22 + fib' 23
fib' 25 = fib' 23 + fib' 24
fib' 26 = fib' 24 + fib' 25
fib' 27 = fib' 25 + fib' 26
fib' 28 = fib' 26 + fib' 27
fib' 29 = fib' 27 + fib' 28
fib' 30 = fib' 28 + fib' 29
fib' 31 = fib' 29 + fib' 30
fib' 32 = fib' 30 + fib' 31
fib' 33 = fib' 31 + fib' 32
fib' 34 = fib' 32 + fib' 33
fib' 35 = fib' 33 + fib' 34
fib' 36 = fib' 34 + fib' 35
fib' 37 = fib' 35 + fib' 36
fib' 38 = fib' 36 + fib' 37
fib' 39 = fib' 37 + fib' 38
fib' 40 = fib' 38 + fib' 39

main = print $ fib' 40
```
0m0.003sと大幅に速くなっています。
何か起こっているのか調べてみます。traceを使うと式が評価される状況がわかります。

```haskell:fib3.hs
import Debug.Trace

fib'' 0 = 0
fib'' 1 = 1
fib'' n = trace ("fib'' "++show n) (fib'' (n-2) + fib'' (n-1))

main = print $ fib'' 40
```
この場合は、同じnであっても何回も評価されています。

fib2.hsの方も同じくtraceで調べると(長くなるのでここには書きません)、一回ずつしか評価されないことがわかります。
要するに、fib2.hsでは自動的にメモ化され、その効果が出ていることがわかりました。

(注意)
必ずコンパルして実行してください。ghciだとメモ化されないことが多くあります。

##リストを出力する場合
次は1からnまでのリストを出力するプログラムです。
33, 34, 35までを連続して出力します。

```haskell:fib4.hs
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

fibList n = map fib [0..n]

main = do
  print $ fibList 33
  print $ fibList 34
  print $ fibList 35
```
この場合は0m8.229sかかりました。
5行目だけを変えています。

```haskell:fib5.hs
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

fibList' n = take n $ map fib [0..]

main = do
  print $ fibList' 33
  print $ fibList' 34
  print $ fibList' 35
```
こちらの方は、0m2.536sと速くなっています。
traceを使ってみますと、上はfibが1から33,1から34,1から35と毎回計算されていますが、下のプログラムでは1から35までを1回計算しただけです。

`map fib [0..]`は自動的にメモ化されるが、map fib [0..n]ではされないこと結果になりました。

まとめると、変数を使わない計算は自動的にメモ化されるが、変数があるとメモ化がされないようです。

こちらの方は使い道がかなりありそうです。


使用装置
MacOS 10.12.5 CPU Core i5-2467M 1.60GHz
GHC 8.0.2
Insta360 Air をRaspberryPiで使う


[Insta360 Airの360度USBウェブカメラ(UVC)としての性能はなかなか優秀](http://hammmm.hatenablog.com/entry/2017/04/23/150552)に普通にUVCでDual Fisheyeとして動くと書いてあったので、勢いで注文してみた。

最初Macに繋いで、ブラウザやQuickTime Playerやffmpeg（brew install でいれたもの）からカメラとして認識されてはいるものの映像がまったく出てこないので目の前が真っ暗になっていたのだけど、RaspberryPi（Raspbian Jessie）でビルドしたffmpegから以下のような感じでいけた。

```bash
ffmpeg -f video4linux2 -input_format h264 -i /dev/video0 -c:v copy output.h264
```

`-input_format`を指定する必要がある模様。
ちなみに指定可能なフォーマットの一覧は、ffmpegコマンドかv4l2-ctlコマンドで確認できる。

**ffmpegの場合**

```shell-session
$ ffmpeg -f video4linux2 -list_formats all -i /dev/video0 
ffmpeg version N-86494-g18f0952 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 4.9.2 (Raspbian 4.9.2-10)
  configuration: --enable-gpl --enable-nonfree --enable-mmal --enable-omx-rpi --enable-omx --extra-cflags=-I/home/pi/ffmpeg/include --extra-ldflags=-L/home/pi/ffmpeg/lib --extra-libs=-ldl
  libavutil      55. 66.100 / 55. 66.100
  libavcodec     57. 99.100 / 57. 99.100
  libavformat    57. 73.100 / 57. 73.100
  libavdevice    57.  7.100 / 57.  7.100
  libavfilter     6. 92.100 /  6. 92.100
  libswscale      4.  7.101 /  4.  7.101
  libswresample   2.  8.100 /  2.  8.100
  libpostproc    54.  6.100 / 54.  6.100
[video4linux2,v4l2 @ 0x18c0210] Compressed:       mjpeg :          Motion-JPEG : 1472x736 2176x1088 3008x1504
[video4linux2,v4l2 @ 0x18c0210] Compressed:        h264 :                H.264 : 1920x960 2560x1280
/dev/video0: Immediate exit requested
```

**v4l2-ctlの場合**

```shell-session
$ v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Index       : 0
        Type        : Video Capture
        Pixel Format: 'MJPG' (compressed)
        Name        : Motion-JPEG
                Size: Discrete 1472x736
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 2176x1088
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 3008x1504
                        Interval: Discrete 0.033s (30.000 fps)

        Index       : 1
        Type        : Video Capture
        Pixel Format: 'H264' (compressed)
        Name        : H.264
                Size: Discrete 1920x960
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.042s (24.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
                Size: Discrete 2560x1280
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.042s (24.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)
```


https://trac.ffmpeg.org/wiki/Capture/Webcam
複数のExcelデータをAccessでひとまとめに方法

![複数データ結合.png](https://qiita-image-store.s3.amazonaws.com/0/160563/1947080a-415b-606c-c98f-5548aea43a67.png)


#利用シチュエーション
複数に分かれているExcelデータを一つのファイルにまとめたい時

##Excelファイルだけでも可能
わざわざ、Accessを使わなくてもVLOOKUP関数などを用いれば可能だが...
Accessなら一瞬でできる！

#前提事項
* くっつけるデータの項目数(フィールド数)は同じ数同士でなければいけない

#設定方法
01.結合したいデータ(複数に分かれているExcelデータ)をAccessに読み込む
02.クエリを作成する(クエリデザインをクリック)
03.「ホーム」>「作成」>「SQLビュー」を表示
04.SQL文を記載

```sql:qiita.rb
SELECT * FROM [テーブル名]
UNION ALL SELECT * FROM [テーブル名];
-- テーブル名には読み込んだファイルの名前を記載する
```

##詳細設定(SQL)
* 複数のテーブルを結合させる

```sql:qiita.rb
-- UNIONでひたすら繋げるだけ
SELECT * FROM [テーブル名]
UNION ALL SELECT * FROM [テーブル名]
UNION ALL SELECT * FROM [テーブル名]
UNION ALL SELECT * FROM [テーブル名];
```
* 重複データは削除する

```sql:qiita.rb
-- ALLを記述しない
SELECT * FROM [テーブル名]
UNION SELECT * FROM [テーブル名]
UNION SELECT * FROM [テーブル名];
```
* 特定の項目(フィールド名)のみを結合する


```sql:qiita.rb
-- フィールド名をそれぞれ指定する
-- フィールド名を複数指定する場合はカンマで区切る
SELECT フィールド名,フィールド名,フィールド名 FROM [テーブル名]
UNION ALL SELECT フィールド名,フィールド名,フィールド名 FROM [テーブル名]
UNION ALL SELECT フィールド名,フィールド名,フィールド名 FROM [テーブル名];
```

#公式ヘルプ
[ユニオンクエリを使って複数のクエリを1つの結果に結合する](https://support.office.com/ja-jp/article/%E3%83%A6%E3%83%8B%E3%82%AA%E3%83%B3-%E3%82%AF%E3%82%A8%E3%83%AA%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%AF%E3%82%A8%E3%83%AA%E3%82%92-1-%E3%81%A4%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%AB%E7%B5%90%E5%90%88%E3%81%99%E3%82%8B-1f772ec0-cc73-474d-ab10-ad0a75541c6e)
Spring 4.3で@ParametersのついたテストがShould have no parameters

# 現象
Spring Bootを1.4系にversionをあげたら、JUnitParamsの`@Parameters`のついたテストが`should have no parameters`のメッセージで`Initialized Error`で落ちてしまう

# 解決策
Runnerを`@RunWith(JUnitParamsRunner.class)`に変える

# 背景
- SpringBoot 1.4の中で依存しているSpring Framework4.3系から`SpringJUnit4ClassRunner`のコンストラクタの実装が変わったっぽい。
- 4.2までは`SpringJUnit4ClassRunner`でも`@Parameters`が動いていたが4.3から動かなくなった。

参考
- 3.2.6 http://docs.spring.io/spring/docs/3.2.6.RELEASE/javadoc-api/org/springframework/test/context/junit4/SpringJUnit4ClassRunner.html
- current http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/junit4/SpringJUnit4ClassRunner.html
attrとpropの 違い と 使用用途

#はじめに
指定した属性の値を取得したい時に attr または propを使用するが
なぜ同じ用途のセレクタがあるのか？が疑問に思ったので調べた。

#attrとpropという関数について
##.attr
指定した属性の値を取得。
.attr(name) → .attr(値を取得したいプロパティを指定)
.attr(name, value) →　.attr(値を設定したい属性を指定, 設定する値を指定) 

##.prop
指定した属性の値を取得。
.prop(name) → .attr(値を設定したいプロパティを指定)
.prop(name, value) → .attr(値を設定したい属性を指定, 設定する値を指定)

#attrとpropの違い
###取得する値が違う
・attrは、**属性における値** を取得
・propは、**プロパティの真偽** を取得

例：チェックした値を取得

```jQuery
$(":checkbox").click(function() {
   alert($(this).prop('checked'));     
　　　　　　alert($(this).attr('checked'));
});
```
###チェック時
attr　→　checked
prop　→　true

###非チェック時
attr　→　undefined
prop　→　false

#attrとpropの使用用途
HTMLの属性を取得する場合　→　attr
なぜなら、**属性における値** を取得するから

input関連の値を取得する場合　→　prop
なぜなら、**プロパティの真偽** を取得するから

#参考記事
[jQueryにおけるattrとpropの違いと使いドコロまとめ](http://qiita.com/kbyay_/items/7a7ce9547f29b34a63b1)

#コメント
実際にコードを書いて検証ツールで見るのが理解度が増すのと納得するのでオススメ
ちなみに[オンラインコードエディタ](http://paiza.hatenablog.com/entry/2017/01/30/%E3%80%902017%E5%B9%B4%E7%89%88%E3%80%91%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E4%B8%8A%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8BJavaScript%E9%96%8B%E7%99%BA%EF%BC%86%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83Web)とやらを活用するとファイルを作成する手間が省けるので良い。
革新的なDeepLearning用ラベリングAndroidApp完成！

## アップデート情報
### ZoomWindow実装！(2017/07/03)
1. 矩形生成時に、指で見えづらくなっている問題を解決！
2. その他クラッシュバグの修正！
![Screenshot_20170629-183153(1).png](https://qiita-image-store.s3.amazonaws.com/0/156582/abd5ab44-89bc-8bae-a95b-30a756834e76.png)


## 革新的なラベル付けツール
1. アノテーションファイル生成を遂にスマホで！
2. あの辛いラベル付け作業をスマホでリラックスしながらできる！
3. 直感的なタッチ操作！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156582/635279b4-8288-15f9-7878-5240febc254b.png)

と、Android向けのラベリングツールを作成しました。インストールを強く推奨します。

[Labeling Tool For Deep Learning - Google Play の Android アプリ](https://play.google.com/store/apps/details?id=com.tomoya.yololabelingtool)

## アノテーションファイルのフォーマット

```
[ClassNum] [RectCenterXRatio] [RectCenterYRatio] [RectWidthRatio] [RectHeightRatio]

[ClassNum] = クラス番号(0 ~)
[RectCenterXRatio] = （矩形の中心ｘ座標) / (画像の横幅）
[RectCenterYRatio] = （矩形の中心ｙ座標) / (画像の縦幅）
[RectWidthRatio] = （矩形の横幅) / (画像の横幅)
[RectHeightRatio] = （矩形の縦幅) / (画像の縦幅)
```

テキスト保存例:

```
0 0.4488 0.3485511 0.458482 0.147
0 0.15487 0.554 0.5487 0.3684
1 0.245 0.814 0.4574 0.15144
2 0.488 0.254 0.7841 0.1584
4 0.154 0.455521 0.48454 0.545
```
【Swift】iOSで放置型育成ゲームを作りたい(0)

# 前書き
- 放置ゲームが好き
    - ポチポチするのめんどくさい
    - 普段スマホいじってられる時間があんまりない
- 育成できるゲームが好き
    - 時間経過でパラメーターが上がってくのを見てにやけるのが好き
- ガチャができるゲームを作りたい
    - デバッグ機能で無限にガチャしたい

→　デジモンと艦これ合わせたらそれっぽいのできるかなあ

という動機からデジモンと艦これを掛け合わせたようなものを作ろうとする取り組みをシリーズ物という形で残さんとする備忘録ですよ

# いわゆる
ブログでやれ案件

# こんな人に見てもらいたい
- ゲーム好きで作りたいけどどうしたらよいか分からない人
    - ぜひ一緒に考えましょう:muscle: 
- Swift得意な人
    - ツッコミ大歓迎です:pray:

# 使うアーキテクチャ
- Swift
- Xcode
- SpriteKitとか使わずにSingle View Applicationで作るよ

将来的なものを考えるとAPIも作った方がいいんだろうけど、そこまでできる気がしないのでとりあえずはスタンドアロンで動くものを作るよ
ゲーム作るならSpriteKitとか使えばいいかもしれないのだけれど、仕事では使わないし学習コストが高いのでSingle ViewでUIパーツなんかを駆使して作ってみるよ

# 技術レベル
- 初心者に毛が生えたレベル　基本はコピペ
- なんとなくオブジェクト指向を理解している(つもり)　かなり怪しい
- とりあえず動けばいいか！の精神

(考えるべきなんだろうけど)パフォーマンスとかはあまり気にせず、とりあえず動くものを作ることを目的にするよ

# 進め方
- 作りたい機能を決めて機能ごとに分割して作るよ
- どんなことに困ってどう検索してどうやってコードを書いたかを記事にするよ
- 方向性は柔軟に変化するよ
- コメントをもらって理解が足りないところを明らかにしたいよ
- 最終的にはAppStoreへの申請を目指すよ

さて、色々書いたけどできるかな！かな！次回からコードを書いていきます！

## 2017/6/21追記
第一回を投稿しました
http://qiita.com/nasteng/items/6a8d2b875851689b9cc8
エラートラッキングツールfaultlineのNodejs用モジュールnode-faultline-protoを作ってみた

## faultlineとは

オープンソースのエラートラッキングツール。
AWS上に構築する。

- [https://github.com/faultline/faultline](https://github.com/faultline/faultline)
- [サーバーレスアーキテクチャなエラートラッキングツール faultline](http://k1low.hatenablog.com/entry/faultline)

## node-faultline-proto
今回作成したのは、Nodejsのエラートラッキングにfaultlineを使うためのnpmモジュール。
[GitHub sinofseven/node-faultline-proto](https://github.com/sinofseven/node-faultline-proto)

### インストール
```bash
npm install node-faultline-proto
```

### 使い方 明示的な方法
```js
var faultlineJs = require('node-faultline-proto');
var faultline = faultlineJs.createClient({
                  project: 'faultline-js', 
                  apiKey: 'xxxxXXXXXxXxXXxxXXXXXXXxxxxXXXXXX',
                  endpoint: 'https://xxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/v0',
                  notifications: [
                    {
                      type: 'slack',
                      endpoint: 'https://hooks.slack.com/services/XXXXXXXXXX/B2RAD9423/WC2uTs3MyGldZvieAtAA7gQq',
                      channel: '#random',
                      username: 'faultline-notify',
                      notifyInterval: 1,
                      threshold: 1,
                      timezone: 'Asia/Tokyo'
                    }
                  ]
                });
faultline.notify(new Error("test"));
```

### 使い方2 自動的な方法
```js
var faultlineJs = require('node-faultline-proto');
var faultline = faultlineJs.createClient({
                  project: 'faultline-js', 
                  apiKey: 'xxxxXXXXXxXxXXxxXXXXXXXxxxxXXXXXX',
                  endpoint: 'https://xxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/v0',
                  notifications: [
                    {
                      type: 'slack',
                      endpoint: 'https://hooks.slack.com/services/XXXXXXXXXX/B2RAD9423/WC2uTs3MyGldZvieAtAA7gQq',
                      channel: '#random',
                      username: 'faultline-notify',
                      notifyInterval: 1,
                      threshold: 1,
                      timezone: 'Asia/Tokyo'
                    }
                  ]
                });
faultline.handleExceptions();
throw new Error("test");
```

```faultline.handleExceptions(); ```を使うことでキャッチされない例外が投げられたときに自動でfaultlineに送ってくれる。

＊注意＊
~~処理は例外が投げられたところで止まるようなので、AWS Lambdaなどでは使いにくいかもしれない。~~
そもそもAWS Lambdaだと例外が投げられたらLambda側がcatchして再度throwするみたいなので自分でtry catchした方がよさそう。 (2017/06/21 追記)


## 課題
大きくわけると3つ。

- そもそもfaultlineの仕組みやAPIなどを理解しきれていない。
- ベースとなったnpmモジュールの仕組みを理解しきれていない。
- テストコードや自動テストなどの整備もできていない。

基本的には自分の技術力不足が原因。
いずれは理解して、テストも整備したいと思って入るけどもモチベーション次第(やらない可能性もある)。
npmモジュールの自動テストなど参考になりそうなものを教えていただけると非常に有り難いです。
もう詰まらない、Digest認証の設定

#はじめに

Digest認証で設定するたびにうまくいかないことが多かったので、実際に設定できた手順を紹介します！

OS：CentOS6.8
Apache:2.2



##・まずはDigest認証のファイルを作成します。

IDとPWは下記のものを変更して下さい。
ID:123456
PW:11112222

/var/hoge/の部分は設置したいページのドキュメントルートに合わせて適宜変更して下さい。

Digest Zoneはわかりやすい名前を適宜つけましょう。



```
% sudo htdigest -c /var/hoge/.htdigest 'Digest Zone' 123456
Adding password for 1431050 in realm Digest Zone.
New password:11112222
Re-type new password:11112222
```



##・digest認証のモジュールが有効か確認。


```
cd /etc/httpd/conf
sudo cp httpd.conf httpd.conf.bk
sudo vim /etc/httpd/conf/httpd.conf
LoadModule auth_digest_module modules/mod_auth_digest.so
```

バックアップは忘れずに。
この時LoadModule auth_digest_moduleがコメントアウトされていたら外しましょう。


##・Apacheのconfファイルにダイジェスト認証の設定を追記

[Digest認証のファイルを作成](http://qiita.com/miyazawa214/items/45c5e6a5109dc9e12e65#%E3%81%BE%E3%81%9A%E3%81%AFdigest%E8%AA%8D%E8%A8%BC%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%99)
のときに指定した、/var/hoge/.htdigestとDigest Zoneと完全に一致している必要があるので注意して下さい。

```
sudo vim /etc/httpd/conf.d/hoge.conf

 <Directory "/var/hoge/">
      Options FollowSymLinks
      AllowOverride None
      Order deny,allow
       AuthType Digest
       AuthName "Digest Zone" 
       AuthUserFile "/var/hoge/.htdigest" 
       Require valid-user
  </Directory>
```

##・Apacheを再起動し設定を反映

```
sudo /etc/init.d/httpd restart
```

ダイジェスト認証の設定が適用され、ページにアクセスすると、IDとPWを要求されるはずです。
これでダイジェスト認証の設定はOKです。






##特定のIPに対してダイジェスト認証なしでアクセスを許可する設定

実は、社内からのアクセスだけダイジェスト認証無しでお願い！なんて要望にもばっちり応えることが出来ます。




##/etc/httpd/conf.d/hoge.confに下記内容を追記

```
Satisfy Any                                                           
Order deny,allow                                                      
deny from all                                                         
Allow from XXX.XXX.XXX.XXX NNN.NNN.NNN.NNN
```

```
sudo vim /etc/httpd/conf.d/hoge.conf

  <Directory "/var/hoge/">                                            
      Options FollowSymLinks                                                 
      AllowOverride None                                                                                                      
       AuthType Digest                                                       
       AuthName "Digest Zone"                                                
       AuthUserFile "/var/hoge/.htdigest"                            
       Require valid-user                                                    
       Satisfy Any                                                           
       Order deny,allow                                                      
       deny from all                                                         
       Allow from XXX.XXX.XXX.XXX NNN.NNN.NNN.NNN                                     
  </Directory>
```
                       
Allow fromで指定したIPからアクセスすると、Digest認証が要求されないようになりました！
これで安全なIPアドレスからのアクセスでいちいち認証する必要がなくなりました！
Python のリストとタプルとカンマ

## 1. カンマありのリスト
```
email_addresses = [
    'test@gmail.com',
]
for email_address in email_addresses:
    print email_address
```

```    
#出力=> test@gmail.com
```

## 2. カンマなしのリスト
```
email_addresses = [
    'test@gmail.com'
]
for email_address in email_addresses:
    print email_address
```
```    
#出力=> test@gmail.com
```

## 3. カンマありのタプル
```
email_addresses = (
    'test@gmail.com',
)
for email_address in email_addresses:
    print email_address
```

```    
#出力=> test@gmail.com
```

## 4. カンマなしのタプル
```
email_addresses = (
   'test@gmail.com'
)
for email_address in email_addresses:
    print email_address
```

```    
#出力=>  
 t
 e
 s
 t
 @
 g
 m
 a
 i
 l
 . 
 c
 o
 m
```

文字列としてみなされるためか、一文字ずつ出力される。

※ 見出しには便宜上タプルと表記しているが、こちらはタプルではない。
詳しくは shiracamus さんのコメントを参照。

## 5. 複数要素のタプル
```
email_addresses = (
    'test@gmail.com',
    'sample@gmail.com'
)
```

```
for email_address in email_addresses:
    print email_address
    
#出力=> test@gmail.com
       sample@gmail.com
```

## コメント
5 の状態だったものを 4 に変更したらバグったので、気になって調べてみた。

こういうことらしい。

```
foo = "abc"
bar = ("abc")
foo == bar
 #↑ True
```
5000兆円もらうだけ

ちまたで噂の「5000兆円欲しい！」
（画像は載せていいのかわからないので載せません...）

元ネタはこちらの[ツイート](https://twitter.com/_mutagasi/status/869386693693939712)のようですね

そこでとりあえず、`5000`ってきたら`兆円欲しい！`って出力するだけのメソッド作りました:sunglasses:w

# 解説するほど凄いこともしてないコード

```swift
import Foundation

func trillion() {
	let trillion = ["5", "0", "0", "0"]
	var array:[String] = []
	while array.suffix(4) != trillion.suffix(4) {
		let trillion = ["5", "0"][Int(arc4random_uniform(2))]
		print(trillion)
		array.append(trillion)
	}
	print("兆円欲しい！")
}
```

## Foundation
乱数生成のために`arc4random`を使用するために`import`

## trillion
兆を英語にしてみました:frowning2:

## 判定用配列
```swift
let trillion = ["5", "0", "0", "0"]
```
答えの配列を入れておきます！

## 判定
```swift
array.suffix(4) != trillion.suffix(4)
```
`array`には`"5"`か`"0"`がランダムで入ります

### suffix
`suffix`メソッドは最後から引数分の要素を取り出します

```swift
[0, 1, 2, 3, 4, 5].suffix(2) // [4, 5]
```
注意すべき点は、`suffix`の返り値は、`ArraySlice`クラスになることです
そこで、`trillion`変数も`ArraySlice`クラスにするために`suffix`をしています

# 結果
```
0
0
0
0
0
5
5
5
5
0
5
5
0
5
5
5
0
5
0
0
0
兆円欲しい！
```
（実行したら21回かかってたので、そのまま載せましたw
とりあえず、最後を見ると**5000兆円欲しい！**になってますね！成功:blush:

# まとめ
よくよく考えるとこの実装だと繰り返し系はなんでもいけるなーと！！
とりあえず、皆様に報告。このコード実行しても5000兆円はもらえなかったです
代わりにいいねもらえたら嬉しいです:upside_down:
Vue.jsプロジェクトにAirbrakeを導入する

Vue.jsのプロジェクトにAirbrakeを導入した。
airbrake-jsのREADMEに、Vueについての記述がなかったので残しておく。


# Vue自体のエラーハンドラに登録
Vueにランタイムエラー時のフックが用意されている。そこで`notify`を呼ぶ。

https://vuejs.org/v2/guide/deployment.html#Tracking-Runtime-Errors

```js
import Vue from 'vue';
import Airbrake from 'airbrake-js';

const airbrake = new Airbrake({ projectId: XXXX, projectKey: 'XXXXX' });

Vue.config.errorHandler = (e) => {
  airbrake.notify(e);
  throw e;
};

new Vue({ el: '#app' });
```

# 飛ばす通知に環境ラベルをつける

ステージング・本番で環境(process.env.NODE_ENV)を分けている場合がある。その場合、airbrakeダッシュボードで、どの環境でのエラーか表示させたい。
ただし、開発環境(process.env.NODE_ENVがundefined)の場合はエラーを飛ばしたくない。


```js
airbrake.addFilter(notice => {
  // もし開発環境ならばエラー通知を飛ばさない
  if (typeof process.env.NODE_ENV == 'undefined') {
    return null;
  }

  // 他の環境であれば環境ラベルをつけてエラー通知を飛ばす
  notice.context.environment = process.env.NODE_ENV;
  return notice;
});
```


# axiosのcatch等にも追加しておく

Vueクラス内でaxios等でAPIにアクセスするとき、もしcatchを書いていたらその中で`airbrake.notify`を書かないとエラー通知をしてくれない。忘れないように追加する。

```js
import axios from 'axios';
import Airbrake from 'airbrake-js';

const airbrake = new Airbrake({ projectId: XXXX, projectKey: 'XXXXX' });

export default {
  someApiCall() {
　　　　  axios.get('/api/action').then(res => {
      // process
    }).catch(err => {
      console.log('api action failed');
      airbrake.notify(err);
    });
  }
}
```

# 複数回使うのでまとめておくと楽

axiosを使っている箇所でインポートして使えるように、まとめておくと楽かも。

```js:lib/airbrake.js
import Airbrake from 'airbrake-js';

const airbrake = new Airbrake({ projectId: XXXX, projectKey: 'XXXXX' });
airbrake.addFilter(notice => {
  // もし開発環境ならばエラー通知を飛ばさない
  if (typeof process.env.NODE_ENV == 'undefined') {
    return null;
  }

  notice.context.environment = process.env.NODE_ENV;
  return notice;
});

export default airbrake;
```

使用例:

```js
import airbrake from 'lib/airbrake.js';

export default {
  someApiCall() {
　　　　  axios.get('/api/action').then(res => {
      // process
    }).catch(err => {
      console.log('api action failed');
      airbrake.notify(err);
    });
  }
}

```
Visual Studio Codeでバックスペースに悩まされたら

# TL;DR

* VSCodeで日本語入力マジ鬼門
* VSCode側では対応予定ないみたい
* pre-commit hookでもって、せめてコードには残らないようにしてやろう

# 対象読者 or 前提条件 or 環境

VSCodeで、バックスペースの混入に悩まされている人

# さらばATOM

最近ATOMのgoプラグインの開発が滞ってる感があったので、Visual Studio Codeへ乗り換え中です。
ところがどっこい、罠がありました。

# VSCodeの日本語入力問題

最近Slackでも問題になった「Mac・IME・Chromiumの組み合わせでバックスペースがゴミとして入力されちゃう問題」が、Visual Studio Codeでも一部影響を受けているようです。
Markdownなどを書いていると、日本語の合間合間に `\b（backspace;0x08)` が入ってしまいます。

https://github.com/Microsoft/vscode/issues/24981
https://bugs.chromium.org/p/chromium/issues/detail?id=714771


## 特段の対応予定は無いみたい

VSCode的には、Chromiumの最新版が来るのを待つらしい。
それはエディタとしてどうなの。

https://github.com/Microsoft/vscode/issues/24981

~~だからvimを使えと~~

### ATOMは？

Electronといやあ、Atomはどうなんだよと思ったら、Electronのバージョンが古いために問題になってないみたい。
![ai-analyst-back 2017-06-20 19-32-15.png](https://qiita-image-store.s3.amazonaws.com/0/31053/d904cc73-4c4c-175b-5235-058c19fe08f2.png)
（現時点での最新は1.6.x)

それはそれでどうなんだ…

## いくらなんでもCommitされるのは困る

編集時に意図しない文字が紛れ込むのは１億歩くらいゆずって ~~エディタではなくクソを吐く何かとして~~ 認めてやるとして、いくらなんでもそれがcommitされてしまうのはあまりにもダサいので、pre-commit hook でなんとかしようと思います。

### 必要なもの

* ggrep(gnu-grep)

`brew install grep` とかしましょう

### やるべきこと

`.git/hooks/pre-commit` に、以下コマンドを追加（または新規作成）します。

```
! git diff --cached --name-only | xargs -n1 ggrep -Hne $'\b'
```

`.git/hooks/pre-commit` に実行権限を付与するのを忘れないように。

### 参考情報

[pre-commit hook の使い方](http://blog.manaten.net/entry/645)

http://qiita.com/quattro_4/items/59fdf8b9aa9ef48ecbdf

# あとがき

VSCodeがエディタになりますように。
CSharp > link > Marshalling – what is it and why do we need it? | managed | unmanaged

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
```

Windows Forms Applicationのコードを見ていて`Marshal.Copy()`という処理を初めて知った。

IntPtr型の変数からbyte[]型の変数にMarshal.Copy()している。

同じ処理のC++ Builder実装ではこういうことは行っていない。

C#特有の処理のようだ。

以下に関連しそうな情報が見つかった。
[Marshalling – what is it and why do we need it?](https://stackoverflow.com/questions/2240804/marshalling-what-is-it-and-why-do-we-need-it)。

- managed : managed by CLR
- unmanaged : C, C++, assemblerなどで書かれたコード

SDKのAPIで得たデータをC#で使えるようにするためにMarshallingしているようだ。

SDKのAPIはC#だけでなく、C++にも対応するように用意されている。
Emscriptenでwasmモジュールをキャッシュする

WebAssemblyでは、コンパイル済のwasmモジュールを[indexDBでローカルにキャッシュ](https://developer.mozilla.org/ja/docs/WebAssembly/Caching_modules)することができます(Chrome 61+, Firefox 55+ で確認)。とは言っても生のwasmをいじることはあんまりなくて、大抵はEmscriptenで生成したwasmを使いますよね? というわけで、この記事ではEmscriptenで生成したwasmをキャッシュする方法を説明します。

## wasmファイルをコンパイルしてみる

Emscriptenでキャッシュしたい場合は、自分でwasmモジュールのインスタンス化を行うようにする必要があります。具体的には`emcc`の`--pre`オプションで指定するファイルで`Module.instantiateWasm`を実装すればokです。とりあえず普通にフェッチしてコンパイルしてインスタンス化するようなコードを書いてみましょう。

```js
var Module = {};
var wasmCacheVersion = 1;
Module["instantiateWasm"] = function (info, callback) {
  fetch("foo.wasm")
  .then(function(res) { return res.arrayBuffer() })
  .then(function(buff) { return WebAssembly.instantiate(buff, info) })
  .then(function(result) { callback(result.instance) });
  return {};
};
```

`info`で`WebAssembly.instantiate`で指定するインポートオブジェクトを受け取ります。`callback`関数では、インスタンス化された`WebAssembly.Instance`オブジェクトを引数に指定して実行する必要があります。`{}`を返しているのは元々インスタンス化を行っている関数でそれを返していたので同じように書いています(ちなみに何も返さないとエラーになる)。

## キャッシュしたバージョンを使う

次にキャッシュするように書き換えてみましょう。

```js
var Module = {};
var wasmCacheVersion = 1;
Module["instantiateWasm"] = function (info, callback) {
  instantiateCachedURL(wasmCacheVersion, "foo.wasm", info).then(function (instance) {
    callback(instance);
  });
  return {};
};
```

簡単にするために、上のmdnのページで紹介されている`instantiateCachedURL`を使います。こいつはキャッシュされていたらそれを使い、なければフェッチしてコンパイルしたものをローカルにキャッシュしてくれます(詳しくは[wasm-utils.js](https://github.com/mdn/webassembly-examples/blob/master/wasm-utils.js)を参照)。実行したら、resolve時に`WebAssembly.Instance`オブジェクトを渡してくれるのでそれを`callback`関数の引数に指定すればokです。

実際にキャッシュしたバージョンについては[デモ](https://ukyo.github.io/re2-validator/example/)を確認してください。初回と2回目以降で結構スピードが変わっているはずです。

## まとめ

Emscriptenで生成されたwasmモジュールをローカルにキャッシュする方法を紹介しました。この機能はモバイルだと特に嬉しいですねー。

## 参考

* [コンパイルされた WebAssembly モジュールをキャッシュする \- WebAssembly \| MDN](https://developer.mozilla.org/ja/docs/WebAssembly/Caching_modules)
* [wasm-utils.js](https://github.com/mdn/webassembly-examples/blob/master/wasm-utils.js)
* デモ: https://ukyo.github.io/re2-validator/example/
DockerでPostgreSQL環境を構築する（更新: 2017/6/20）

## はじめに :elephant: 
PostgreSQLを使用した開発をするにあたり、

* ローカルにインストールしたくない :elephant: 
* でも、Vagrantもいや :elephant: 
* どうせならDocker使おう :whale: 

と思ったので、Dockerで開発環境を構築する手順をまとめました。

ザクザク行けば、10分でログインしてSQLを発行するところまでいけると思います。

※Docker自体のインストールは[DockerをMacにインストールする](http://qiita.com/kurkuru/items/127fa99ef5b2f0288b81)をご覧ください。

## PostgreSQLを起動する :rocket: 

```
$docker run -d --name {コンテナ名} -e POSTGRES_PASSWORD={スーパユーザのパスワード} -p {コンテナへフォワードするホストのポート:フォワード先のコンテナのポート} postgres{:バージョン（指定しなければ最新）}
```

でイメージからコンテナを立ち上げることができます。
（ローカルにイメージがない場合はDocker Hubから取得してくれます。）

今回は
* コンテナ名に`postgres`
* スーパユーザのパスワードに `test`
* ポートフォワードは `5432:5432`（つまり、同じポート番号でホストとコンテナを繋ぐ）
* バージョンは指定せずに最新

としました。

```
$docker run -d --name postgres -e POSTGRES_PASSWORD=test -p 5432:5432 postgres
Unable to find image 'postgres:latest' locally
latest: Pulling from library/postgres
ef0380f84d05: Pull complete 
50cf91dc1db8: Pull complete 
d3add4cd115c: Pull complete 
467830d8a616: Pull complete 
089b9db7dc57: Pull complete 
6fba0a36935c: Pull complete 
81ef0e73c953: Pull complete 
338a6c4894dc: Pull complete 
15853f32f67c: Pull complete 
044c83d92898: Pull complete 
17301519f133: Pull complete 
dcca70822752: Pull complete 
cecf11b8ccf3: Pull complete 
Digest: sha256:1364924c753d5ff7e2260cd34dc4ba05ebd40ee8193391220be0f9901d4e1651
Status: Downloaded newer image for postgres:latest
aeb38b69100e3c6956d682367d50c959e511084b6ef64467fc208e7feb536d6a
```

**余談：バージョンを指定することもできます**
上記の方法だと、最新版が入りますが、もちろんバージョンを指定することもできます。

例） 9.5系を指定する場合、末尾に `:9.5`と付けます。
（NAMESはお好きなもので大丈夫です。今回は `postgres95`と指定しました。）

```
$docker run -d --name postgres95 -e POSTGRES_PASSWORD=test -p 5432:5432 postgres:9.5
```

これだけです。簡単！

## 起動を確認する :eyeglasses: 

`docker container ls`で立ち上がっているか確認する。

```
$docker container ls
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                      NAMES
aeb38b69100e        postgres              "docker-entrypoint..."   4 days ago          Up 4 minutes        0.0.0.0:5432->5432/tcp                     postgres
```

いい感じ！

## ログインする :computer: 
```
$docker exec -ti {NAMES} bash
```
でDockerコンテナにログインできます。

今回だとNAMESには`postgres`を指定していました。それでは、早速入ってみましょう。

```bash
$docker exec -ti postgres bash # ログイン
root@aeb38b69100e:/# psql --version # バージョンを確認
psql (PostgreSQL) 9.6.3
root@aeb38b69100e:/# psql -U postgres # スーパーユーザでPostgreSQLにログイン
psql (9.6.3)
Type "help" for help.

postgres=# create database test; # 試しにデータベース `test`を作成
CREATE DATABASE
```

## おわりに
いかがでしたでしょうか。DockerはVagrantと比べてサクっと立ち上げられるところが利点ですね。
次はDockerで立ち上げたサーバ同士で通信するところまで行ってみようと思います。
プライベートEthereum ネットワークにでっかいTransactionを流したらエラー

# 原因

でかいトランザクションをながしたら、ガスが足りない。

>
Error: Intrinsic gas too low at Object.module.exports.InvalidResponse (/root/ethereum_util/commentoken/node_modules/web3/lib/web3/errors.js:38:16) at RequestManager.send (/root/ethereum_util/commentoken/node_modules/web3/lib/web3/requestmanager.js:61:22) at Eth.send [as sendTransaction] (/root/ethereum_util/commentoken/node_modules/web3/lib/web3/method.js:145:58) at SolidityFunction.sendTransaction (/root/ethereum_util/commentoken/node_modules/web3/lib/web3/function.js:167:26) at SolidityFunction.execute (/root/ethereum_util/commentoken/node_modules/web3/lib/web3/function.js:253:37) at Object.<anonymous> (/root/ethereum_util/commentoken/commentoken.js:23:13) at Module._compile (module.js:460:26) at Object.Module._extensions..js (module.js:478:10) at Module.load (module.js:355:32) at Function.Module._load (module.js:310:12)

# 解決方法

単純にリクエストを送る時に十分なガス量を指定していなかったことが原因でした。
(実際にはcommentに大サイズのオブジェクトを渡してます。)

```js:app.js(error)
// Construct a query request
contract.sendCoin("0xd47adfb65b14a24781bdef68e60011c6e7ac4b5c", amount, comment});
```

```js:fix_app.js
// Construct a query request
contract.sendCoin("0xd47adfb65b14a24781bdef68e60011c6e7ac4b5c", amount, comment, { gas: 400000000 });
```





## 試したこと

* genesis.jsonでgaslimitを大きくした。　/ダメ
* genesis.jsonでトランザクションを実行するアカウントに多額の初期etherを与えた。 /ダメ


```json:genesis.json
{
    "nonce": "0x0000000000000042",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "difficulty": "0x400000",
    "alloc": {
        "0x008ef4688faefa1caaf9397fb4f31bed5665033b": { "balance": "100000000000000000000000000000000000000" }
    },
    "coinbase": "0x0000000000000000000000000000000000000000",
    "timestamp": "0x00",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "extraData": "Custem Ethereum Genesis Block",
    "gasLimit": "0xffffffff"
}
```

些細なことでした。
MySQLで指定したIPアドレスがサブネット内にあるかチェック

#IPアドレスをMySQLで比較する
##はじめに
個人的なメモを確認していたら発掘したので書いておく。何かの役に立つかとか何故こんなことをメモしていたのかは不明… [せっかくなので使ってみた](https://qiita.com/papillon/items/d34fd21a9dd5a97a6423)。

##やりかた
192.168.11.123 が 192.168.11.0/24 に入っているか調べたい。

###IPアドレスをintにする。

```
INET_ATON('192.168.11.123') => 3232238459
INET_ATON('192.168.11.0') => 3232238336
```

###両者のXORを取る

```
3232238459 ^ 3232238336 => 123
```

###サブネット分をビットシフト 32 - 24 = 8

```
123 >> 8 => 0
```

0ならサブネット内にある

###SQLにしてみる

```sql
SELECT (INET_ATON('192.168.11.123') ^ INET_ATON('192.168.11.0')) >> 8;
```

###IPアドレスとサブネットを分割

```sql
SELECT SUBSTRING_INDEX('192.168.11.0/24', '/', 1);
192.168.11.0
SELECT SUBSTRING_INDEX('192.168.11.0/24', '/', -1);
24
```

###全部合わせる

```sql
SELECT (INET_ATON('192.168.11.123') ^ INET_ATON(SUBSTRING_INDEX('192.168.11.0/24', '/', 1))) >> (32 - SUBSTRING_INDEX('192.168.11.0/24', '/', -1));
```

# 備考
サブネットマスクが24ビットとかなら `LIKE '192.168.11.%'`とかでいいけど、23ビットだとめんどくさくなるのでこういうことを考えたんだと思う。
GearVR Unityセットアップ


##開発環境
・mac book pro
・Unity5.6.1
##端末
 Galaxy S7 edge
 http://www.galaxymobile.jp/galaxy-s7-edge/
 Gear VR with Controller（SM-R324NZAAXJP）
　　http://www.iodata.jp/product/samsung/gear/sm-r324nzaaxjp/index.htm

##事前準備（Androidに出力するセットアップは割愛）
・Oculusのアカウント作成
　https://auth.oculus.com/login/?redirect_uri=https%3A%2F%2Fdashboard.oculus.com%2Fredirect%2F

・Oculus Utilities for Unity 5のDL
　https://developer.oculus.com/downloads/package/oculus-utilities-for-unity-5/
　今回は1.14.0を使用　過去バージョンもインストール可能
ZIPファイルを解凍したらovr_unity_utilities_1.14.0/OculusUtilities/OculusUtilities.unitypackageをUnityプロジェクトに入れる

・Oculus　Platform SDKのDL
　https://developer.oculus.com/downloads/package/oculus-platform-sdk/
今回は1.14.0を使用　過去バージョンもインストール可能
ZIPファイルを解凍したらOVRPlatformSDK_v1.14.0/Unity/OculusPlatform.unitypackageをUnityプロジェクトに入れる

・（macの場合）Oculus Runtime for OSXのDL
https://developer.oculus.com/downloads/package/oculus-runtime-for-os-x/
今回は0.5.0.1-betaを使用　現状１つしかなかったが今後アップデートする際多分過去バージョンもインストール可能 

・SmartSwitchのDL
　http://www.galaxymobile.jp/apps/smart-switch/
これがないと転送できなかったような

##初期設定や端末出力まで参考になったURL
https://framesynthesis.jp/tech/unity/gearvr/
http://portaltan.hatenablog.com/entry/2016/04/12/203434
http://portaltan.hatenablog.com/entry/2016/04/01/155005
http://tsubakit1.hateblo.jp/entry/2015/05/03/031428
http://mizutanikirin.net/unity-gearvr%E3%81%AE%E9%96%8B%E7%99%BA%E3%81%AB%E5%BD%B9%E3%81%AB%E7%AB%8B%E3%81%A4tips
http://vr-cto.hateblo.jp/entry/2016/04/17/221252
googleスプレッドシートのテンプレートのコピーを簡単に行うGAS

## 目的
テンプレートのコピー、コピーしたシートの名前を変える、という手順が面倒で一回で済ませたいと思って作りました。今回は「ファイル」等と同じ階層へメニューを追加する方法をとりました。

## 前提知識
パソコン操作ができれば作れると思います。そのくらいで実装できる簡単な内容です。

## 実装手順
1. 処理を実装したいスプレッドシートを用意し、スクリプトエディタを起動![1.png](https://qiita-image-store.s3.amazonaws.com/0/48817/4acebb47-68f1-8807-070d-65300ea3a596.png)

1. スクリプトエディタへコードを貼り付け（そのまま貼り付ければOK）
![1-2.png](https://qiita-image-store.s3.amazonaws.com/0/48817/0b89ba7d-7206-2440-1095-e829625cb232.png)

```javascript

    // シートのコピーを行う処理
	function sheetCopy() {
	  var name = Browser.inputBox('新しいシート名を入力してください', Browser.Buttons.OK_CANCEL);
	  
	  if (name != 'cancel') {
	    var sheet = SpreadsheetApp.getActiveSheet();
	    SpreadsheetApp.getActiveSpreadsheet().duplicateActiveSheet().setName(name);
	  }
	}
```
```javascript

    // メニューへ追加する処理
	function onOpen() {
	  var ss = SpreadsheetApp.getActiveSpreadsheet();
	  var menus = [{name: "シートを複製", functionName: "sheetCopy"}];
	  ss.addMenu("custom menu", menus);
	}
```
保存するときにプロジェクトの名前を求められます。好きな名前をつけてください。

1. リロードしてメニューを表示
![2.png](https://qiita-image-store.s3.amazonaws.com/0/48817/35aecb2d-7347-cd1d-7eac-2d2ee994497c.png)

1. 処理の実行．．．の前に承認
![3.png](https://qiita-image-store.s3.amazonaws.com/0/48817/a1e294dd-1abd-23d2-5738-53d080a54308.png)
![4.png](https://qiita-image-store.s3.amazonaws.com/0/48817/d5fc5abf-6be8-af09-7ce9-720b372b83e8.png)
![5.png](https://qiita-image-store.s3.amazonaws.com/0/48817/8e70443d-7fee-c3a6-173c-b2208dd8d8f5.png)


1. 処理実行
![6.png](https://qiita-image-store.s3.amazonaws.com/0/48817/d9e8f667-9ea3-e0ff-bb23-0e64db459561.png)

1. シートを複製できました
![7.png](https://qiita-image-store.s3.amazonaws.com/0/48817/a4cde3fb-f5f8-223b-f7c5-8c930f9a9096.png)



## 機能拡張について
シートの複製部分をライブラリ化し、各スプレッドシートは最低限の記述で済ませる方法もあります。今回はハードルを低くするために一つのスプレッドシートの中で済ませました。
興味のある方はライブラリにする方法を調べて実装してみてください。
週報 

#韻律情報における感情の決定
##[対話音声における韻律と声質の特徴を利用したパラ言語情報の抽出の検討](http://www.irc.atr.jp/~carlos/pdf/carlos-aichall0510.pdf)
この研究では基本周波数、パワー、持続時間、イントネーションやリズムなどの韻律情報だけでなく声質に関する音響パラメータが提案されています。
韻律情報に関しては韻律パラメータとしてF0move(ピッチ(音の高さ)の動きを１オクターブの12分の1で表すパラメータ)と発話の持続時間を用いている。
韻律パラメータの発話行為の分布を見ると
肯定、同意、相槌(F0moveが下降、持続時間が短い)
聞き返し(F0moveが上昇、持続時間が短い)
疑い(F0moveの動きの幅が広く上昇し、持続時間が長い)
考え中、戸惑い(F0moveが平坦、持続時間の幅が広い)
などには有効であると言える。
しかし、F0moveが上昇、音の持続時間が長い時には(非難・嫌悪、感 心・羨望、不満、驚き・意外)が混合、またF0moveが上昇、音の持続時間が短い時にも聞返しと驚き・意外の識別は明確ではない。
このことから韻律特徴だけでの表現の識別は難しい。
なのでここでは声質による音響パラメータが提案されています。
ここで大事なのが
vocal fly(発声の低音域でバイブレーションが起こる現象)区間の検出
非周期.ダブル周期区間の検出(声帯振動の周期性が 不規則になる特徴を持っている。これらの不規則性 は、声帯パルスの非周期性またはダブル周期性として現れる)
息漏れ区間の検出(声門での十分な狭めによ って生成される気流雑音)
の３つである。
ここでは以下の３つを発音ごとのパラメータとして提案している。

＊Vocal fry rate (VFR):発話全体に対し、Vocal fry (creaky)が検出された区間の割合。

＊Aperiodicity rate (APR):発話全体に対し、非周期 またはダブル周期が検出され、Vocal Fryとは検出されなかった区間の割合。

＊Aspiration noise rate (ANR):発話全体に対し、息漏れ雑音が検出された区間の割合。

これらの発話レベルの声質パラメータの閾値を0.1と設定する。 VFR > 0.1 の発話は c (creaky)、APR > 0.1 の発話は h (harsh)、ANR > 0.1 の発話は w (whispery)、それ以外 のものはm(modal)と認識した結果を発話行為ごとに分配された表を見ると、強い気息性及び強い非周期性を持つ声質(w, hw, h)は、驚き、意外、嫌悪、疑いなど、比較的強い感情や態度を表す項目に多く検出されていて、検出するのに有効といえる。
ただ、h, hw の検出が不十分であり、harsh声質を正しく検出するためには、非周期、ダブル周期区間の検出で提案した手法が不十分であることを示している。
cに関しては、強い感情を表す感心と嫌悪ではpc(力んだ creaky)であり、考え中・肯定で現れたcは柔らかいcreakyであり、力みを検出するため、更なる音響特徴が必要である。
##[音声からの感情認識を目的とする特徴量の検討](http://www.kansei.soft.iwate-pu.ac.jp/abstract/2007/0312004126.pdf)
感情認識システムの構成として、まず音声入力→pitch,power抽出→重要pitchの抽出→特徴量の分析→感情の分類といった流れで構成されている。
 特徴量の分析において、pitchとpowerの値から平均値・最大値・最小値を求め，感情による変化傾向「喜び」「怒り」「悲しみ」の発話がそれぞれ「普通」と比較してどの程度変化しているを見ると
「喜び」：　特徴料が高くなる
「怒り」：　平均 pitchは低く平均powerは高くなる
「悲しみ」：　最小pitchは高く最大powerは低くなる
のような変化が得られた。
感情認識を実際に行う際は比較対象となる普通のデータが存在しないため、pitch・powerの最大値・最小値が平均値に対してどの程度変化しているかを算出した変化率を用いることで対応する。
##[韻律的特徴の総合的なモデル化と、感情の表現・伝達過程](http://www.gavo.t.u-tokyo.ac.jp/tokutei_pub/houkoku/model/ohno.pdf)
DebianをJessieからStretchにアップグレードする

2017/06/17 Debian Stretch リリース！
https://www.debian.org/News/2017/20170617

ということでアップグレードする。
https://www.debian.org/releases/stretch/amd64/release-notes/ch-upgrading.ja.html
特に注意点は無さそうなのでいつも通り`sources.list`の`jessie`を`stretch`に変更して`apt-get upgrade`する。


ちなみにサーバーはさくらのVPS。一応 Debian 8.8 なのを確認する。

```bash
apt-get upgrade
cat /etc/os-release
cat /etc/debian_version

vi /etc/apt/sources.list
# jessie => stretch

apt-get clean
apt-get update
apt-get upgrade
apt-get dist-upgrade
apt-get autoremove

reboot
```

で完了。
途中で

```
dpkg: 警告: 古いディレクトリ '/var/lib/initramfs-tools' を削除できません: ディレクトリは空ではありません

dpkg: `udev' のインストール によって壊れた ifupdown の設定削除を考えています ...
dpkg: 問題ありません。(udev によって壊れた) ifupdown の設定削除をします
dpkg: `udev' のインストール によって壊れた systemd の設定削除を考えています ...
dpkg: 問題ありません。(udev によって壊れた) systemd の設定削除をします

dpkg: python-requests-whl: 依存関係に問題があります。しかし要求に従い削除しています:
```

のような怪しい警告は出るけどね…。


停止時間は数秒が何度か、長くて数分だったと思う。
無事に新しいカーネルで起動した。相変わらずDebianのバージョンアップはあっさりだ。

古い`mysql-server-5.5`は`mariadb-server-10.1`に変わる。clientもmariadbに変わる。
古い`PHP5`は削除されずにそのまま残る。PHP5が勝手にPHP7に置き換わったらどうしようかと思ったけどそんなことはなかった。
`libapache2-mod-php5`は残り、`libapache2-mod-php7.0`はインストールされない。
`apache2`は`jessie`の`2.4.10-10+deb8u8`から`stretch`の`2.4.25-3`へ更新されてる模様。


MySQLは何もせずにそのままMariaDBとして動くし、PHP5もそのまま動くので、古いEC-CUBE2系もそのまま動いた。

`git`でインストールした`certbot`も動いている。というかpython2.7はそのまま残ってる。




次はデスクトップで使っているDebianの更新だけれど…さすがにこれはもう少し待つかな…。
Windows で VirtualBox を使って LAMP の練習環境を構築しようぜ

Qiita の画像アップロード容量が 100MB とのことで　上限に達して Too Large なんで、自分のブログに記事を移動した。ここでは概要を書く。

もとが Qiita の記事なんで、まとめブログだ。

# まとめ記事へのリンク

「＜まとめ＞Windows 10（ウィンドウズ）にVirtualBox 7（バーチャルボックス）を使ってCentOS（セントオーエス）を入れてLAMP（ランプ）の練習環境を構築しようぜ☆（＾～＾）」
http://makegame.warabenture.com/?p=364

構築日：2017年6月

# ゴール

- `http://localhost` で index.html が開ける
- `http://localhost/phpinfo.php` で phpinfo を見れる
- MySQLサーバーにログインでき、show databases; で表を表示できる

# インストール、設定　所要時間

わたしは　3日かかっているが、PCに空き容量が十分にあり、Linuxに慣れていて　もし　つまづかずに手戻りなしで全部うまく　できるのなら　うまくいけば　1日でできるのではないか。

Linux のインストール放置で 1時間強は　かかる。

# お品書き

|種類|名称|バージョン|
|---|---|---|
|ホストOS|Windows|10|
|^|必須ハードディスクの容量|基本ソフトのインストールで5GBぐらい使うようなので8GBは欲しい|
|仮想マシン|VirtualBox|5.1|
|ゲストOS|CentOS|CentOS-7-x86_64-DVD-1611|
|BIOS||Antec ASUSのマザーボードに入ってるやつ|
|使用したテキストエディター|nano||
|^|Visual Studio Code||
|使用したWebブラウザー|Firefox||
|Webサーバー|Apache|2.4.6-45|
|参考にしたHTML|Bootstrap|v4.0.0-alpha.6|
|サーバーサイドスクリプト言語|PHP|7.0.20|
|PHPのパッケージ管理|Composer|1.4.2|
|削除したデータベース|mariaDB||
|データベース・サーバー|MySQL|5.7.18|
|データベース・クライアント|MySQL|14.14|
angular2/4 で jquery を使う

jquery をインストールする。

```
npm install jquery --save
```

型情報をインストールする。

```
npm install @types/jquery --save-dev
```

angular-cli.json の scripts に下記を追記する。

```
"../node_modules/jquery/dist/jquery.js",
```

importする

```
import * as $ from 'jquery';
```

以上。
Swiftで排他的論理和(XOR)

## 概要
Swiftで排他的論理和(XOR)を算出する方法
![xor.png](https://qiita-image-store.s3.amazonaws.com/0/165931/42a09ab1-9c42-3ca5-560e-31e1f488b2a3.png)

## 実現方法
### Int型の場合
```swift:Int
let x = 1
let y = 1
let xor = x ^ y
```

### Bool型の場合
```swift:Bool
let x = true
let y = true
let xor = (x != y)
// let x = true ? 1 : 0
// let y = true ? 1 : 0
// let xor = x ^ y
```
~~Bool値を用いた算出は存在しないようなので一旦Intに変換しつつ算出する必要がある。~~
コメントにて指摘頂きました。Boolのxorには`!=`が使えます。

## サンプルケース
UICollectionViewを使って下記のような表現を行う際に用いました。
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/165931/780bae03-89df-1d73-cf5f-8e0e67c3c029.png)

## サンプルコード
```swift:sample
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
    let isDeepLine = 27..<54 ~= indexPath.row
    let isDeepColumn = 3..<6 ~= (indexPath.row % 9)
    let isDeep = (isDeepLine != isDeepColumn)
    cell.backgroundColor = isDeep ? .darkGray : .lightGray
    return cell
}
```

## おわりに
`&&`や`||`の組み合わせを使うよりもスッキリとしたコードで条件を書くことが出来ました。
誤りやより良い方法などありましたら、コメント/編集リクエスト頂けると助かります。
[追記]
コメントにて新たな知見を得ることが出来ました。tkhpさんありがとうございます！
ぼくの考えたさいきょうのCSSだけで2pxの縁取り文字【2017/7/28追記】

#まずは1pxの縁取り

CSSのtext-shadowのみを使って、白文字+黒の1px縁取りをしてみます。
考え方としては

 - ぼかしを0pxにして塗りつぶしの影を作る
 - 1pxずつずらして複数指定することで縁取りっぽく見せる

LIGさんの記事で素晴らしい解説がありました。

>
##2.テキストシャドウ使う方法
```CSS:
text-shadow: black 1px 1px 0px, black -1px 1px 0px,
             black 1px -1px 0px, black -1px -1px 0px;
```

>引用元：[IEでもキレイ！ブラウザ上でアウトライン（縁取り）を表現する方法](https://liginc.co.jp/web/html-css/css/70065)

▼1px四方向の出力サンプル▼
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176912/7282d985-634f-5490-5b73-ab232e40b63f.png)

1pxの縁取りであれば、上下左右の指定だけで結構いい感じになります。

###**2017/7/28追記** 1pxでキレイな縁取り
上記の方法だと、右下、左上、左下、右上の4方向なので、上下左右に縁取りがないことになってました。
そこで、上下左右の指定も追加して、1pxでさらにキレイな縁取りを作ってみました。

```css:1pxでさらにキレイな縁取り文字.css
text-shadow: 
		black 1px 1px 0, black -1px -1px 0,/*右下、左上*/
		black -1px 1px 0, black 1px -1px 0,/*右上、左下*/
        black 0px 1px 0, black  0-1px 0,/*右、左*/
        black -1px 0 0, black 1px 0 0;/*上、下*/

```

▼1px八方向の出力サンプル▼
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176912/fe505433-e118-58ea-e3c0-cc3fc466a614.png)

これは見やすい！やったね！

#次は2pxの縁取り
しかし、2px以上になるとちょっとガビガビになっていたのが気になってました。

```CSS:上下左右のみ2pxだと悲しいことになるCSS
text-shadow: black 2px 2px 0px, black -2px 2px 0px,
	black 2px -2px 0px, black -2px -2px 0px;
```

▼2px上下左右の出力サンプル▼
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176912/b441d5a6-8ede-3588-6425-431d9dd22f03.png)



そこで斜めも指定してあげるといい感じになってくれました。

[2017/7/28修正]
コメント頂きましてありがとうございます！
それを踏まえて、短くしてみました。


```css:さいきょうの縁取りCSSver2.css
text-shadow: 
    black 2px 0px,  black -2px 0px,
    black 0px -2px, black 0px 2px,
    black 2px 2px , black -2px 2px,
    black 2px -2px, black -2px -2px,
    black 1px 2px,  black -1px 2px,
    black 1px -2px, black -1px -2px,
    black 2px 1px,  black -2px 1px,
    black 2px -1px, black -2px -1px;
```

▼2px上下左右斜めの出力サンプル▼
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176912/7f89b646-ed46-9b40-a300-53064e7aba03.png)

結構納得のいく感じの縁取り文字になったんじゃないかなーと満足。
ボタン作りとかに役立てていきたい次第。
本当はもっとスマートに書けるとよいなあと思いつつ、
見た目が良い感じになったのでとりあえずしばらくこれで。

ちなみに旧バージョン(2017/6/20ver)はこちら。
（同じ指定をしてしまっている箇所があったのでこっそり修正しました…。）


```css:さいきょうの縁取りCSSver1.css
text-shadow: 
    black 2px 0px 0px, black -2px 0px 0px,
    black 0px -2px 0px, black 0px 2px 0px,
    black 2px 2px 0px, black -2px 2px 0px,
    black 2px -2px 0px, black -2px -2px 0px,
    black 1px 2px 0px, black -1px 2px 0px,
    black 1px -2px 0px, black -1px -2px 0px,
    black 2px 1px 0px, black -2px 1px 0px,
    black 2px -1px 0px, black -2px -1px 0px,
    black 1px 1px 0px, black -1px 1px 0px,
    black 1px -1px 0px, black -1px -1px 0px;
```



#確認環境
確認環境はChrome59、Firefox53、Edge38。出力サンプルは全てchrome。
統計基礎知識その１

最近、統計を学んでいるので、備忘録がてらに投稿します。
本当に基礎の基礎から学び始めているので、当たり前のことも多いかもしれませんがご容赦ください。

#そもそも統計は何のために行うのか？

イギリスの物理学者ケルビンは、「結果を数値として表すことができるならば、それについてなんらかの知識を獲得したことになる」といっている。つまり、統計により自然現象や社会現象について数量化することで知識を深めていくことができるのである。

また、統計は行動決定の指針となる。国家や企業の経営にとっては、統計によって把握した規則や法則を行動指針として利用している。アメリカの統計学者デミング博士は、「統計は行動のためにある」といっている。

#統計は何を表すか？

一言でいえば、集団の特徴を数量的に表す役割を果たしている。

集団の内部構造を表す統計を作るためにとりあげる特性（男女別、年齢など）を**観察の標識**という。
観察の標識には①質的な特性、②量的な特性がある。
①質的な特性の例として、性別、職業、学歴など
②量的な特性の例として、収入、就業時間、身長、体重など

#統計的記述によって集団の特徴を要約する

観察の標識が軽量である場合には、数値の集合が与えられる。
数値の集合の特徴は点の分布状態の特徴を記述することになる。
最も重要なものは分布の**中心の位置**である。すなわち、**平均**である。
次に重要なのは**バラツキ**の程度である。バラツキはそれぞれの数値と平均との差を平均することを意味する。

それぞれの数値から平均を引いた値―これを**偏差**という―を加え合わせると0になるから、符号を取り去ってから平均する。
また、偏差の2乗の平均を計算し、これによってバラツキの程度を測ることもできる。これを**分散**という。分散の平方根を**標準偏差**という。

とりあえずここまで。
次はさらに踏み込んだ内容を纏めます。
《jQuery》3系で廃止になった.andSelf()のこと。

直前に選択していた要素を現在の要素集合にマージさせる`.andSelf()`は、jQueryの3系から`.addBack()`メソッドに置き換わりました。

## .andSelf()は .addBack()になった

例えば、任意のテキストを 一文字ずつ`span`で囲うスクリプトを書いてみました。

```js

const spanText = (text) => {

  $(text).children().andSelf().contents().each(function() {

    if (this.nodeType == 3) {

      $(this).replaceWith($(this).text().replace(/(\S)/g, '<span>$1</span>'));

    }

  });

};
spanText('.js-span');

```

上は、下のようになります。


```js

const spanText = (text) => {

  $(text).children().addBack().contents().each(function() {

    if (this.nodeType == 3) {

      $(this).replaceWith($(this).text().replace(/(\S)/g, '<span>$1</span>'));

    }

  });

};
spanText('.js-span');

```

## .andSelf()と.addBack()の違い

`.andSelf()`と`.addBack()`の違いとしては`.addBack()`には引数を与えることでフィルタリングが可能になります。
以前選択していた要素集合をフィルタリングしてから現在の集合にマージします。

* [リファレンス](http://www.jquerystudy.info/reference/traversing/addBack.html)
Conoha の Mastodon テンプレート 1.2 -> 1.4.3 にバージョンアップ(non Docker)

## 背景
 - Conoha のテンプレートで Mastodon を立ち上げる
 - バージョンが古い（1.2系）なので 1.4.3 にあげるも precompile で止まる

## 目指すところ
 - 問題を回避して 1.4.3 にアップデートする

## 原因
 - mastodon ユーザーで yarn が実行できなかった（nodejs のインストールの仕方が悪かったかも？）

## 結果(手順)

必要なパッケージのインストールを以下の手順で行うことでエラーを回避できました。

### 各種アップデート
root で実行

```
npm install -g npm@3
npm install -g yarn@0.18.2
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
apt-get install nodejs
apt-get install -y pkg-config libprotobuf-dev protobuf-compiler
```

nom と yarn は最新すぎると動かない報告があったのでバージョンを指定してインストール
node の更新に n を入れる方法もあったのですが、それだと mastodon ユーザーの時に動かなかったのでこちらの方法で入れる。


### rails の更新
mastodon ユーザーに切り替えて作業

```
su mastodon

cd /home/mastodon/live
git fetch
git checkout v1.4.3
bundle install
yarn isntall

RAILS_ENV=production bundle exec rails mastodon:maintenance:prepare_for_foreign_keys
RAILS_ENV=production bundle exec rails assets:precompile
RAILS_ENV=production bundle exec rails db:migrate
RAILS_ENV=production bundle exec rails r Rails.cache.clear
```

もし過去に root で git の操作をしてしまっていたらファイルの権限を見直してください。
問題なければここの precompile は通る！

### mastodon の再起動
root に戻って作業

```
exit

systemctl restart mastodon-sidekiq
systemctl restart mastodon-streaming
systemctl restart mastodon-web
```

以上で 1.4.3 にあげることができました。

参考
リリースノート https://github.com/tootsuite/mastodon/releases
Conoha 公式 https://www.conoha.jp/guide/mastodon.php?btn_id=news_mastodon&_ga=2.167012218.536184911.1497860060-674940405.1444268309
1.4.1 のエラーについて https://github.com/tootsuite/mastodon/issues/3251
Reactで複数のinputタグがある時に、それぞれonChange関数を用意するのではなく、汎用的なonChange関数にする

# 背景
一つのコンポーネントで複数のinputタグがある時に、以下の例のようにそれぞれに対して別々のonChange関数をbindしていました。
2つ、3つとかなら良いのですが、inputの数が増えると冗長ですし、すごく頭が悪くなりそうな感じがしてました。

```js:例：改善前
const InputName = React.createClass({
　　/* firstName用のonChange関数をbind */
    onChangeFirstName(e) {
        this.setState({ firstName: e.target.value });
    },
    /* familyName用のonChange関数をbind */
    onChangeFamilyName(e) {
        this.setState({ familyName: e.target.value });
    },
    render() {
        return (
            <div>
                <input type="text" value={this.state.firstName} onChange={this.onChangeFirstName.bind(this)} />
                <input type="text" value={this.state.familyName} onChange={this.onChangeFamilyName.bind(this)} />
            </div>
        );
    }
});

```

# 改善後
onChangeは一つにしたい、引数にpropertyの値を渡すとそれに応じた値をsetStateさせるようにしました。

```js:例：改善後
const InputName = React.createClass({
    onChange(property, e) {
        // ブラケット演算子でオブジェクトを作成する
        this.setState({ [property] : e.target.value });
    },
    render() {
        return (
            <div>
                <input type="text" value={this.state.firstName} onChange={this.onChange.bind(this, 'firstName')} />
                <input type="text" value={this.state.familyName} onChange={this.onChange.bind(this, 'familyName')} />
            </div>
        );
    }
});

```

#感想
冗長にならなくて良いし、汎用的なので個人的には満足です。
もっと良い方法ご存知でしたら教えていただけると幸いです。

#参考
[JavaScriptのオブジェクトのキーに変数の値を使うTips](http://qiita.com/masarufuruya/items/d29a567d0ca4bbfb00cb)