OmniAICreator/Qiita-1.07M huggingface dataset:
Javaのプリミティブ型について調べてみた

# はじめに
仕事でJavaを使っていると，等価評価にequalsを頻繁に使うようになる．
新人のときは，「等価はequalsを使え！」と耳にタコが出来るほど聞いたものです．
しかし，これはString型をはじめとしたオブジェクト型の話である．

ここでプリミティブ型を持つint/Integerやlong/Longなどの場合で気になることがあった．
それは「Long型はオブジェクト型なんだから普通に==を使って比較できないんじゃね？」と言う疑問が出てきた．

手軽な疑問なので，検証してみました．

# 比較するパターンの洗い出し
対象はプリミティブ型を持つLong型にして，比較方法は==のみ使います．
左側にLong型インスタンスを右側に様々な方法でLong型を指定していく感じです．
あと，long定数とLong型の比較です．
さっと思いついたパターンだけですので，物足りないかもしれないです．

# いざ検証！！
検証は以下のメソッドをJunit4で動かして確認しました．
バージョンに依存しないと思いますが，念のためJava8を使いました，と言っておきます．
「Long型はオブジェクト型である」という前提の元，検証したものもあります．

```java
@Test
public void testEqualsMethod() {
	Long value1 = 100L;

	// いずれの方法で作ったLong型でも等価と評価される
	assertTrue(value1==100L);                   // (1)
	assertTrue(value1==Long.parseLong("100"));  // (2)
	assertTrue(value1==Long.valueOf("100"));    // (3)
	assertTrue(value1==Long.valueOf(100));      // (4)
	assertTrue(100L==Long.parseLong("100"));    // (5)
	assertTrue(100L==Long.valueOf(100));        // (6)

	Long value2 = value1;        // Long型がオブジェクト型だとすると
	++value2;　　　　　　　　　　　// value2の値を変えれば，value1の値も変化するはず...
	assertTrue(100L==value1);    // しかし，value1は変化しない
	assertTrue(101L==value2);    // value2はしっかりと1増えてる
	assertTrue(value1!=value2);  // もちろんオブジェクトが違う...らしい
}
```

# 考察
上記のテストメソッドから，いずれの方法でLong型を生成すると==を使って等価評価が出来るということが分かった．
しかし「Long型->オブジェクト型->等価はequals」の感覚が消えない...
また，Long型を別のオブジェクトに代入してもオブジェクト型の共有するような挙動がないということも分かった．
つまり，Long型は別の変数に代入すると別のオブジェクトとして生成されるということになる．

この結果は，類似のInteger型には言える．
だがDouble型とFloat型では，テストメソッドの(3)と(4)でvalueOf()がオブジェクト型を返しているためか，評価はNGとなった．
（逆になぜLong型とInteger型はvalueOf()でTrueになったかが疑問…）

「xxx == Xxx.parseXxx()」や「xxx == Xxx.valueOf()」とする場合の注意点として，整数型か小数型か，ということになる．ということで，以下に等価可能か否かを表にしました．

|型|Xxx.parseXxx()|Xxx.valueOf()|
|:--|:--|:--|
|Long|可能|可能|
|Integer|可能|可能|
|Double|可能|不可能|
|Float|可能|不可能|

実は，テストメソッドの(5)はプリミティブ型同士の比較で，(1), (2), (6)は[プリミティブ型]==[オブジェクト型]の等価比較となっている．
そのため，「Trueになっているのではないか？」ということが考えられる．

このままだとズルズルと引きずってしまうので，この疑問は別の機会に検証したいと思います．
一旦お開きということで．．．

# おまけ
オートボクシングの性質も確認したかったので，以下のテストメソッドで実験をしてみた．
引数をObject型にしたメソッドを用意して，いろんな値をメソッドに放り込んでどんなクラスになるかを確認するようなものです．
（検証環境：Java8, JUnit4）

```java
@Test
public void testAutoBoxing() {
	// 引数のクラス名を返すだけのクラス
	class AutoBoxingTester {
		public String get(Object obj) {
			return obj.getClass().getName();
		}
	};
	AutoBoxingTester tester = new AutoBoxingTester();

	// いろんな値を放り込んでみた
	assertEquals(Integer.class.getName(), tester.get(100));
	assertEquals(Long.class.getName(), tester.get(100L));
	assertEquals(String.class.getName(), tester.get("str"));
	assertEquals(Float.class.getName(), tester.get(3.14f));
	assertEquals(Double.class.getName(), tester.get(6.0e23));
}
```
Vive Controller & Oculus Touch 3D model

#SteamVRからモデルを探す
![steamvr.jpg](https://qiita-image-store.s3.amazonaws.com/0/105021/4cc8bfb0-c576-7451-7947-464eba3b5109.jpeg)
SteamVRのプロパティで「ローカルファイルを閲覧」をクリックするとSteamVRのインストールディレクトリが表示される
ここからresources\rendermodelsと潜っていく
例「C:\Program Files (x86)\Steam\steamapps\common\SteamVR\resources\rendermodels」
すると「dk2_hmd」や「vr_controller_vive_1_5」というフォルダがあるので
このフォルダごとプロジェクトにコピーする

#Unity側作業
rendermodelsにある主なモデル。
これ以外にもセンサーのモデルが入っていたり、Viveのプロトタイプが入っていたりする。
| フォルダ名 | 内容 |
|:-:|:-:|
|vr_controller_vive_1_5|Vive Controller|
|oculus_cv1_controller_left|Oculus Touch Left|
|oculus_cv1_controller_right|Oculus Touch Right|
|dk2_hmd|Oculus Rift DK2 HMD|

各モデルは、コントローラーで1メッシュになったものと
パーツごとにメッシュが分かれているものがある。
パーツごとに色を変えたり、動かす用途でなければ1メッシュのものを使ったほうが楽

vr_controller_vive_1_5に入っているモデル
![vive.jpg](https://qiita-image-store.s3.amazonaws.com/0/105021/a0ea4fcb-d091-4f4c-e8cf-50c16b69a2b7.jpeg)

Oculus Touch
![touch.jpg](https://qiita-image-store.s3.amazonaws.com/0/105021/45b40c28-8aee-9a01-2606-e2be46ec72ae.jpeg)


パーツに分かれているモデルを使う場合は親の階層を作り、パーツを子に入れる
![vive2.jpg](https://qiita-image-store.s3.amazonaws.com/0/105021/c290ce60-c003-6e73-c96f-131f650e40b7.jpeg)
CentOS6にansibleとansible_specをインストールする

構成管理ツールである[Ansible](https://www.ansible.com/)とテストツールである[ansible_spec](http://qiita.com/volanja/items/5e97432d6b231dbb31c1)を使うための初期設定手順になります。
各ツールの細かい使い方などは公式をご覧ください。
ansible_specについては、[volanjaさん](http://qiita.com/volanja)が同じくテストツールである[Servespec](http://serverspec.org/)を
ansibleのインベントリとroleを使って管理できるように作成されたものです。

##①必要なパッケージをインストール
以下のコマンドで、ざらっとインストールをします。
最後にansibleが入ったか確認するためにバージョンを表示してみます。

```bash
[user@host]$ sudo yum install git gcc make openssl-devel libffi-devel readline-devel epel-release.noarch 
[user@host]$ sudo yum install ansible
[user@host]$ ansible --version
ansible 2.2.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
```

##②ansibleからのログインユーザーを作成
ansibleはエージェントレスでsshによるコマンド実行で処理をしていきます。
そのためのユーザーは何でもいいですが、ここでは"ansible"とします。
ユーザを作成して公開鍵を設定したらログイン確認まで行います。

```bash
[user@host]$ ssh-keygen -t rsa
[user@host]$ sudo useradd ansible
[user@host]$ sudo sh -c "cat .ssh/id_rsa.pub > ~ansible/.ssh/authorized_keys"
[user@host]$ sudo diff ~/.ssh/id_rsa.pub ~ansible/.ssh/authorized_keys
[user@host]$ sudo chown ansible.ansible -R ~ansible/.ssh/
[user@host]$ ssh ansible@localhost
:
Are you sure you want to continue connecting (yes/no)? yes
:
[ansible@host]$ exit
```

##③rubyインストール
以下のコマンドでインストールします。
インストールできたか確認するためバージョンを表示してみます。

```bash
[user@host]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
[user@host]$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
[user@host]$ vi ~/.bashrc
```

```bash:~/.bashrc
:
# User specific aliases and functions
PATH=$PATH:$HOME/bin
export PATH
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```
```bash
[user@host]$ source .bashrc
[user@host]$ rbenv versions
* system (set by /home/user/.rbenv/version)
[user@host]$ rbenv install 2.3.0 ※ちょっと時間かかることもある
[user@host]$ rbenv versions
* system (set by /home/user/.rbenv/version)
  2.3.0
[user@BIND-test ~]$ rbenv versions
* system (set by /home/user/.rbenv/version)
  2.3.0
[user@BIND-test ~]$ rbenv rehash
[user@BIND-test ~]$ rbenv versions
* system (set by /home/user/.rbenv/version)
  2.3.0
[user@BIND-test ~]$ rbenv global 2.3.0
[user@BIND-test ~]$ rbenv versions
  system
* 2.3.0 (set by /home/user/.rbenv/version)
```

##⑤ansible_specインストール
以下のコマンドでインストールします。
インストールできたら".ansiblespec"というファイルができている

```bash
$ gem install bundler
$ gem list bundler

*** LOCAL GEMS ***

bundler (1.14.4)
$ mkdir sample_playbook
$ cd sample_playbook
$ rbenv exec bundle install --path vendor/bundle
$ ~/.rbenv/bin/rbenv exec bundle exec ansiblespec-init
$ cat .ansiblespec
---
-
  playbook: site.yml
  inventory: hosts

```

あとはansibleを通常通り使うときと同じようにplaybookを書きながら
role/commonとかの中にspecというフォルダを作成して、その中にxxxx_spec.rbを作ればOKです。
playbook書くのが面倒という方は、Google先生に**"ansible playbook sample"**とかで探せるので自己責任でどうぞ。



---
#参考
http://qiita.com/KisaragiZin/items/5682370f5b63b398dbb1
http://qiita.com/volanja/items/5e97432d6b231dbb31c1
http://takatoshiono.hatenablog.com/entry/2015/01/09/012040
http://dev.classmethod.jp/tool/rbenv-too-slow/
http://docs.ansible.com/ansible/index.html
JuliaのPyPlot.jlで日本語フォント豆腐を解消

Juliaは言語自体がMatlabみたいな機能を備えていますが，グラフを描く機能は持っていないので別のパッケージを入れて使います．D3.jsと連携しているGadfly.jlとか，Plots.jlとかあります．中でもPyPlot.jlはmatplotlibに似てる（というかそのまま）のでPython+numpyに慣れている人だと，だいたいそのまま使えます．

PyPlot.jlをデフォルトで使うと日本語が化けるので，設定方法をメモっておきます（毎回忘れるので）．やり方はmatplotlibと同じです（同じやり方で出来るので楽というべきか，他のバックエンドならそのまま使えるのか（未調査））

# フォント設定
JuliaからPythonを呼び出すPyCall.jlを使って，matplotlibの設定を書き込みます．

```julia
using PyPlot
using PyCall
PyCall.PyDict(matplotlib["rcParams"])["font.family"] = "TakaoPGothic";
x = 0.01:0.01:2.4;
y = sin(x) + cos(sin(2x));
plot(x, y, "r--", label="y=\sin(x) + \cos(\sin(2x))")
title("お豆腐にならないよ")
xlabel("お豆腐にならないよ")
ylabel("yもならないよ")
legend()
```

![fig.png](https://qiita-image-store.s3.amazonaws.com/0/7181/8df2021a-ac99-80d0-bd31-daa89915e3c0.png)


# 参考サイト
- [ubuntuでmatplotlibのfontを設定](http://qiita.com/gymnstcs/items/50432a12fb9139b316bc)
- [matplotlib、pylabで日本語+フォント変更](http://tatabox.hatenablog.com/entry/2013/07/21/025603)
- [PyPlot.jl でデフォルトのfigsizeを指定する方法](http://qiita.com/r9y9/items/8978d35d172ee3006a18)

# おまけ
- Plots.jlを使ってみましたが，やはりお豆腐ラベルでした．調べたら設定できるとは思いますが・・・．

```julia
using Plots
x = 0.01:0.01:2.4;
y = sin(x) + cos(sin(2x));
plot(x, y, xlab="お豆腐になる？")
```

![fig2.png](https://qiita-image-store.s3.amazonaws.com/0/7181/727920cf-3d73-4adf-2683-25ad157f7cbc.png)
git grep の代わりに ag を使えるように設定する

`ag` コマンドを使ってみようと思って `git grep` の代わりに `ag` で grep できるように設定した

基本
http://moznion.hatenadiary.com/entry/2014/08/14/124358
を参考にさせてもらって一部だけ書き換えた

```
git config --global alias.ag '!git ls-files | xargs ag --nogroup --color-match=1\;31 --color-path=0\;0 --color-line-number=0\;0 --pager="less -R"'
```

color code を一部変えたかったので
http://stackoverflow.com/questions/5947742/how-to-change-the-output-color-of-echo-in-linux
を参考に変更した
すごーい！きみはLINE Messaging APIが使えるフレンズなんだね！


# すごーい！なにこれーー！？
[LINE Messaging API][lmapi]を使ったbotです．フレンズに追加すると簡単なジャパリパークレベルの対話ができます．

<img src="http://qr-official.line.me/L/vpi2T2pY_f.png">

<a href="https://line.me/R/ti/p/%40bwa5974j"><img height="36" border="0" alt="友だち追加" src="https://scdn.line-apps.com/n/line_add_friends/btn/ja.png"></a>


# つくったーー！？！？
![account.PNG](https://qiita-image-store.s3.amazonaws.com/0/35230/d83e687f-9964-9fbf-b175-f13227aacced.png "account.PNG")

たーのしー！！

![talk1.PNG](https://qiita-image-store.s3.amazonaws.com/0/35230/4291d81c-1a73-8d01-3f7a-d4231da4d009.png "talk1.PNG")

うみゃみゃみゃみゃー！！！

![talk2.PNG](https://qiita-image-store.s3.amazonaws.com/0/35230/3665b4b5-fb93-92c6-6162-0814516d797a.png "talk2.PNG")

うわああああ！！しゃべったああああ！？？

# じっそうずみきのー
| きー    | はんのー |
|:---------:|:------------|
| hogeごっこ/hogeしよう/hogeやろう | 🐯< わーい！ hogeごっこだね！ |
| hogeがとくい | 🐯< すごーい！hogeがとくいなフレンズなんだね！ |
| hogeがすき | 🐯< へー！hogeがすきなけものなんだね！ |
| しっぱい | 🐯< へーきへーき！フレンズによってとくいなことちがうから！ |

他にもいろいろ送ってみて下さい．


# たーのしー！！
随時機能追加していきます．要望あればコメントなど頂けるとたーのしー！！


# 参考サイト
* [けものフレンズプロジェクト | 公式サイト](http://kemono-friends.jp/)
* [LINE Messaging API][lmapi]



[lmapi]:https://business.line.me/ja/
EclipseでTomcatのソースを見る正しい方法

## 悩みポイント
1. Jadclipse使ってみたけどデバッグ時に行がずれる！
2. インデントずれたりで、ソース読みにくい！

## 解決策
1. Tomcatのソース・ファイル(今回はTomcatのバージョンが6.0.47だったのでそのzipファイル)を[公式サイト](http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.47/)からダウンロード
2. Eclipseでクラスファイルを適当に開いて、「添付ソースの変更」
3. ダウンロードしたソースを添付する

ソースが表示される！
デバッグも問題なし、スタックトレースもちゃんと辿れる！
ggplot2::geom_tile()で日本地図

R bologgers (www.r-bloggers.com) で、カナダの地図上にデータをマッピングする例が紹介されていたので、日本用に書いておきます。これくらいのデザインの方が見やすい時もあるので。
***
### **Library**
```{r setup, include=FALSE}
library(tidyverse)
library(viridis)
library(ggplot2)
```

### **Map Info.**

```{r position_size}
# Location Data
JP_plot <- tribble(
    ~Prefecture, ~Code, ~x, ~y,
    "北海道", "HK", 16, 14,
    "青森県",　"AO", 15, 11,
    "岩手県",　"IT", 15, 10,
    "宮城県",　"MG", 15, 9,
    "秋田県",　"AK", 14, 10,
    "山形県",　"YG", 14, 9,
    "福島県",　"FS", 15, 8,
    "茨城県",　"IB", 15, 6,
    "栃木県",　"TC", 15, 7,
    "群馬県",　"GU", 14, 7,
    "埼玉県",　"ST", 14, 6,
    "千葉県",　"CB", 15, 5,
    "東京都",　"TY", 14, 5,
    "神奈川県",　"KN", 14, 4,
    "新潟県",　"NI", 14, 8,
    "富山県",　"TM", 13, 7,
    "石川県",　"IS", 12, 7,
    "福井県",　"FI", 12, 6,
    "山梨県",　"YN", 13, 5,
    "長野県",　"NA", 13, 6,
    "岐阜県",　"GI", 12, 5,
    "静岡県",　"SZ", 13, 4,
    "愛知県",　"AI", 12, 4,
    "三重県",　"ME", 11, 4,
    "滋賀県",　"SI", 11, 5,
    "京都府",　"KY", 10, 5,
    "大阪府",　"OS", 9, 5,
    "兵庫県",　"HG", 8, 5,
    "奈良県",　"NR", 10, 4,
    "和歌山県",　"WA", 9, 4,
    "鳥取県",　"TT", 7, 5,
    "島根県",　"SM", 6, 5,
    "岡山県",　"OY", 7, 4,
    "広島県",　"HS", 6, 4,
    "山口県",　"YA", 5, 5,
    "徳島県",　"TK", 7, 1,
    "香川県",　"KA", 7, 2,
    "愛媛県",　"EH", 6, 2,
    "高知県",　"KO", 6, 1,
    "福岡県",　"FO", 4, 3,
    "佐賀県",　"SG", 3, 3,
    "長崎県",　"NS", 2, 3,
    "熊本県",　"KU", 3, 2,
    "大分県",　"OI", 4, 2,
    "宮崎県",　"MZ", 4, 1,
    "鹿児島県",	"KG", 3, 1,
    "沖縄県",　"OK", 1, 1)

# Define Map sizes
JP_plot$Scale <- c(3,rep(1,46)) #北海道だけ少し大きく

# Abbreviated Prefectues
JP_plot$Prefec <- JP_plot$Prefecture
JP_plot$Prefec <- gsub("県", "", JP_plot$Prefec)  
JP_plot$Prefec <- gsub("府", "", JP_plot$Prefec) 
JP_plot$Prefec <- gsub("東京都", "東京", JP_plot$Prefec) 

```

### **Data Preparation**

```{r Fake_data}
# Fake Data
set.seed(27)
JP_plot$Data <- rnorm(n=47, mean=50, sd=20)

```

### **Plot by ggplot2**

```{r JP_plot}
# Plot
JP_plot %>%
  ggplot(aes(x = x,
             y = y,
             width = Scale,
             height = Scale)) + 
  geom_tile(aes(fill = Data), color = "white") + 
  geom_text(aes(label = Prefec), size = 2.7, color = "white") +  
  
  # Codeをラベルとして表示する場合
  #geom_text(aes(label = Code), size = 2.7, color = "white") + 

  coord_fixed(ratio = 1) + 
  theme(
    panel.background = element_blank(),
    panel.grid = element_blank(), 
    axis.title = element_blank(), 
    axis.text = element_blank(), 
    axis.ticks = element_blank()) + 
　　scale_fill_viridis(na.value = "#E1E1E1", option = "D", begin = 0, end = 1)

　# マニュアルで色（3色）を指定する場合
  # scale_fill_gradient2(low="#777777",
  #                      mid="#DDDDDD",
  #                      high="#2A465C,
  #                      midpoint = 50)

 
```

![01.png](https://qiita-image-store.s3.amazonaws.com/0/166617/4ddf61fa-34a8-f393-ed59-df78c296a383.png)
![02.png](https://qiita-image-store.s3.amazonaws.com/0/166617/657aee8b-0c79-616c-8ee6-62da924de131.png)


> <https://www.r-bloggers.com/the-tile-grid-map-for-canada/>
Basic Operators


*演算子 Operator* は記号で表され、チェック、変更や計算に利用される。例えば *加算演算子 +* は `let i = 1 + 2` のように足し算に使われ、*論理積演算子 &&* は `if enteredDoorCode && passedRetinaScan` のように2つのBool値を組み合わせることに使われる。

Swift は標準的なC言語の演算子を備えているほか、よくあるエラーをなくすために様々な強化が行われている。
例えば *代入演算子 =* は、 *等価演算子 ==* と間違って使われないように値を返さないし、 *+, -, *, /, % のような算術演算子* は処理した値がその値が格納されている型が対応している範囲超過を検知し、超過があってもそれを許可しない。
しかしながら *Overflow Operators* を利用すれば超過も限定的に利用できる。

またSwiftはC言語にはなかった、2つの *範囲演算子 a..<b と a...b* が用意されている。これらは数値の範囲を表すのに利用できる。

後述の *Advanced Operators* では独自のカスタム演算子の定義、実装方法などが解説されている。

## 用語
演算子には単項、二項、三項演算子が用意されている。

* *単項演算子* は `-a` のような単一の値を対象とする。単項演算子には `!b` のように、対象の値の前に添えられる *前置単項演算子* と、 `c!` のように後ろに添えられる *後置単項演算子* の2つがある。
* *二項演算子* は `2 + 3` のように、2つの値を対象とする。二項演算子は値と値の間に添えられるので中置になる。
* *三項演算子* は3つの値を対象とする。C言語と同じくSwiftは `a ? b : c` という条件演算子1つしか持たない。

演算子の処理対象になる値は *被演算子 operands* と呼ばれる。例えば `1 + 2` において、`1` と `2` は被演算子で、 `+` は二項演算子である。
黒背景に白文字にするjs（ブックマークレット）

# まぶしい

黒背景に白のIDEやターミナルやエディタを見ている。
あ、あれなんだっけ、グーグル先生にきこう。
chrome開く →　白背景ぺかーー☆☆
ま、まぶしい。。。

# 解決方法

jsでdarkifyする。

以下のスクリプトをブックマークレットに登録。

```js
javascript:(function(){var d=document,e=d.createElement("script");e.src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js";d.getElementsByTagName("head")[0].appendChild(e);setTimeout(function(){jQuery("*").css({"background-color":"black","color":"white"});},1e2);})()
```

ブックマークバーとかに表示しておけばどんなサイトでもボタン一発で黒背景に白文字になる。

# 目を大切に

ときどき目を休ませてあげましょう。
「ニューラルネットワークと深層学習」の翻訳ページリンク

#### **① [ニューラルネットワークと深層学習(和訳)](http://qiita.com/nushio/items/7bc4a32d8e27e8b5b751)**
#### **② [Michael Nielsen著のオンライン書籍「ニューラルネットワークと深層学習」の翻訳に参加しました](http://yusuke-ujitoko.hatenablog.com/entry/2017/02/18/235231)**

上記リンクは Deep learning オンライン書籍の和訳をされているお二方のブログ記事です。本当に有難いですね。
以下は自分用メモ、オンライン書籍和訳ページのリンクまとめになります。

----------------------------------------------------------
【ニューラルネットワークと深層学習(和訳)】

[・CHAPTER 1：ニューラルネットワークを用いた手書き文字認識](http://nnadl-ja.github.io/nnadl_site_ja/chap1.html)

[・CHAPTER 2：逆伝播の仕組み](http://nnadl-ja.github.io/nnadl_site_ja/chap2.html)

[・CHAPTER 3：ニューラルネットワークの学習の改善](http://nnadl-ja.github.io/nnadl_site_ja/chap3.html)

[・CHAPTER 4：ニューラルネットワークが任意の関数を表現できることの視覚的証明](http://nnadl-ja.github.io/nnadl_site_ja/chap4.html)

[・CHAPTER 5：ニューラルネットワークを訓練するのはなぜ難しいのか](https://nnadl-ja.github.io/nnadl_site_ja/chap5.html)

[・CHAPTER 6：ディープラーニング](https://nnadl-ja.github.io/nnadl_site_ja/chap6.html)
Python+numpy行列上のfor文とJuliaのfor文の違いを吸収したい

Python+Numpyを使っているときと，Juliaを使っているときで，間違ってやばいコードになることが多く（というか動かない）最近悩んでいる件を書きました．誰かいいアイデアを教えてください．

# Python + numpyの場合
- Anaconda 4.3.0 (64-bit), Python 3.6.0, IPython 5.1.0で試しました

```python
import numpy as np
X = np.array([[1, 2, 3], [4, 5, 6]])
# X = np.matrix([[1, 2, 3], [4, 5, 6]]) でもだいたい同じ

for elem in X: print(elem)
# 出力
# [1 2 3] (matrixの場合は [[1 2 3]])
# [4 5 6] (matrixの場合は [[4 5 6]])
```
- 慣れているのでこうなってほしい．

# Juliaの場合
- Julia 0.5.0で試しました

```julia
X = [1 2 3; 4 5 6]
# 出力
# 2x3 Array{Int64, 2}:
#  1 2 3
#  4 5 6

for elem in X; println(elem); end
# 出力
# 1
# 4
# 2
# 5
# 3
# 6
```

- 個人的にはこのiterationがあまり直感に合わない（Python/Numpy脳とも言える）のでなんとかしたい．
- 元々JuliaはRowかColumnのどっちかのイテレーションが遅いとかなんとか（詳細は知らない）
- 死にそうな気分で次のようなコードを量産した

```julia
X = [1 2 3; 4 5 6]
m, n = size(X)
for i=1:m; println(X[i, :]); end
# 出力
```

- 一応動く
- 嫌な理由: 気分


## 調べたこと
一応いろんな議論されている（イマイチ古いけど）．

- http://stackoverflow.com/questions/21778374/what-is-the-recommended-way-to-iterate-a-matrix-over-rows
  - 上の解決法と同じ
- https://github.com/JuliaLang/julia/issues/14491
  - iteratorを自分で定義する（良さそう，でも面倒）
- https://github.com/gasagna/ArraySlices.jl
  - インストールしたら使えるかも（未検証）
- http://pkg.julialang.org/
  - 一応公式パッケージ眺めてみたけど，特に公式にはなさそう？
rainbow gem の install でエラーが発生した場合に gem update をして gemspec に required_ruby_version を指定する

bundler が 1.13.7 より上かつ gem が 2.6.9 未満という条件で bundle install をすると、
rainbow gem の install がエラーになります。
詳細は下記記事を参照。

[Bundler 1.14.0 で rainbow が `can't modify frozen String` と吐いてインストールできない - @tachiba - Qiita](http://qiita.com/tachiba/items/b905a740fbe7bcd85639)

`gem update --system` をすれば問題は解決できるのですが、
チームで開発をしている際に、他のメンバーが同じ沼にはまらないために
gemspec に依存 gem のバージョンを設定しておきます。

```sh
# 略
  spec.required_rubygems_version = '~> 2.6.9'
# 略
```

## 独り言
required_rubygems_version の利用例をGitHubで検索していたら、 ore gem で生成した
gem のプロジェクトがいっぱいヒットしました。使っている人、多いのかな？

https://github.com/ruby-ore/ore

## <i class='fa fa-book'></i> 関連資料
* [REQUIRED_RUBYGEMS_VERSION=(req) - SPECIFICATION REFERENCE - Guilde - RubyGems](http://guides.rubygems.org/specification-reference/#required_rubygems_version)
ボイスコッド正規化

# ボイスコッド正規型(BCNF)

第5正規化までで一つの記事にしようと思ったが長引いたので分割。
投稿のクォリティが低いので後日書き直すかも。

## 準備
例えば以下のようなテーブルがあるとする。

| \_農産物_ | \_地区_ | 最多生産県 | 生産高 | 
|-----|----|-------|-----|-----| 
| りんご | 東北 | 青森    | 176600 | 
| りんご | 中部 | 長野    | 39143 | 

※補足アンダーライン( _ )に囲まれているのが主キー

各農産物の地方ごとの最多生産権の情報を持っている。この時関数従属性は

 - {農産物,地区} → 最多生産県
 - {農産物,地区} → 生産高
 - 最多生産県 → 地区

である。

推移従属、部分従属が無いため、第3正規型である。

ボイスコッド正規型であるためには、そのテーブルが第3正規型であることが必要条件である。
ともあれこれで準備は整った。

## ボイスコッド正規型の定義

>ある関係上に存在する自明でない全ての関数従属性の決定項が候補キーであるとき

by [Wikipedia](https://ja.wikipedia.org/wiki/関係の正規化#.E3.83.9C.E3.82.A4.E3.82.B9.E3.83.BB.E3.82.B3.E3.83.83.E3.83.89.E6.AD.A3.E8.A6.8F.E5.BD.A2)

つまりテーブル上に存在する関数従属すべてに関して

 - 関数従属が自明であること
 - 決定項が候補キー※となること

の2点のどちらかを満たす時、そのテーブルはボイスコッド正規型であるといえる。
※本によっては候補キーではなくスーパーキーとしているものもある
用語をおさらいしておこう

### 用語
#### 候補キー
一行を特定できる値の組で最小のもの。複数存在する場合がある。
Nullを含むことが出来るなど、主キーより制限はゆるい。
通常、複数ある候補キーの中からふさわしいものを主キーとして選ぶ。

#### 決定項
関数従属の値を決める、決められるの関係の「決める」ほう
言葉より図示したほうが速い

X → Y

このときのXのこと。


では早速件のテーブルの関数従属をチェックしよう。

## ボイスコッド正規型かどうか確認

> - {農産物,地区} → 最多生産県

 - この関数従属は自明ではない。
 - 決定稿{農産物、地区}は主キーであるため候補キーである。


> - {農産物,地区} → 生産高

 - この関数従属は自明ではない。
 - 決定稿{農産物、地区}は主キーであるため候補キーである。


> - 最多生産県 → 地区

 - この関数従属は自明ではない。
 - 決定稿{最多生産県}は候補キーではない

**条件を満たさない関数従属があった = このテーブルはボイスコッド正規型ではない。**

## 正規化してみよう

ボイスコッド正規化を満たさなかったテーブルを満たすように正規化してみよう。

| \_農産物_ | \_地区_ | 最多生産県 | 生産高 | 
|-----|----|-------|-----|-----| 
| りんご | 東北 | 青森    | 176600 | 
| りんご | 中部 | 長野    | 39143 | 
| もも|東北 | 福島　|23300|

### 不適切なテーブル分割の例
最多生産県 → 地区の関数従属性を追い出せばいい、と
なんの考えもなしにテーブル分割すれば

| \_農産物_ | \_地区_ |生産高| 
|-----|----|---|
| りんご | 東北 |176600|
| りんご | 中部 |39143|

| \_地区_ | 県 |
|-------|-----|
|東北|青森|
|中部|長野| 
|東北|福島|

上記のような分割をしてしまうだろう。
この操作後のテーブルは正規形になっていない。結合操作によってもとのテーブルに戻せなくなるからだ。
正規化を行うときはもとに戻すことが出来る=可逆的な操作で行わなければいけない。

これを**無損失分解**という

ボイスコッド正規形を目指したテーブル分割はこのような非可逆的な操作を行ってしまうおそれがある。

### 正しい正規化の例
以下のように結合操作で戻せるように正規化しましょう。

| \_農産物_ | \_県_ |生産高| 
|-----|----|---|
| りんご | 青森 |176600|
| りんご | 長野 |39143|

| \_県_ | 地区 |
|-------|-----|
|青森|東北|
|長野|中部|
|福島|東北|

# 参考
達人に学ぶDB設計徹底指南書
情報処理教科書 データベーススペシャリスト 2017年版
[関係の正規化 - wikipedia](https://ja.wikipedia.org/wiki/関係の正規化)
http://www.fukudat.com/w/ja/images/e/ed/Basic-4-fd.pdf
Ruby の gem のバージョン指定に利用する ~> の名前に関するまとめ

## <i class='fa fa-question-circle'></i> `~>` とは？
Gemfile や gemspec で依存 gem のバージョン指定をする際に指定される記法。

[Ruby's Pessimistic Operator - Giant Robots Smashing into Other Giant Robots](https://robots.thoughtbot.com/rubys-pessimistic-operator)

## <i class='fa fa-list'></i> 様々な呼び方
* pessimistic comparison operator
* twiddle-wakka
* approximate
* spermy

ググってみると `pessimistic (comparison) operator` と呼んでいる人が多い。
RubyGemsのドキュメントでは `twiddle-wakka` になっている。
RubyGemsのソースコードでは `approximate` になっている。
`approximate` に変更する前は `spermy` になっていた。名前が微妙なので変えたようだ。
まぁ、たしかに見た目は・・・いや、しかし・・・。

## <i class='fa fa-history'></i> 成り立ち
Jim Weirich 氏によって `>*` という書式で追加されたあとに `~>` に変更された。
コミットコメントをみると当時は `pessimistic operator` と名付けていたようだ。

* [commit eacba214b5d815e82d0ab0c09a7ac378e004898e - RubyGems](https://github.com/rubygems/rubygems/commit/eacba214b5d815e82d0ab0c09a7ac378e004898e)
* [commit b9d09b19571b6b884fba3384c98f41acd4c5e755 - RubyGems](https://github.com/rubygems/rubygems/commit/b9d09b19571b6b884fba3384c98f41acd4c5e755)
* [Why is twiddle wakka designed like this? - stackoverflow](http://stackoverflow.com/questions/28332750/why-is-twiddle-wakka-designed-like-this)

## <i class='fa fa-wrench'></i> 便利ツール
* [gem の '~> 1.2' みたいなバージョン指定を ['>=', '<'] 表記に展開する](http://qiita.com/kyanny/items/a177ab74618436505841)

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [Change references to 'spermy' to 'twiddle wakka' #123 - issues - rubygems/rubygems - GitHub1](https://github.com/rubygems/rubygems/pull/123)
* [Replace usage of the term "spermy" with "approximate".](https://github.com/rubygems/rubygems/pull/124)
* [Declaring dependencies - PATTERNS - Guide - RubyGems](http://guides.rubygems.org/patterns/#declaring_dependencies)
* [Ruby's Pessimistic Operator - Giant Robots Smashing into Other Giant Robots](https://robots.thoughtbot.com/rubys-pessimistic-operator)
* [Why is twiddle wakka designed like this? - stackoverflow](http://stackoverflow.com/questions/28332750/why-is-twiddle-wakka-designed-like-this)
MySQL でカウントを取ろうとしたらエラー

`COUNT` キーワードのあとにスペースを入れてはいけない。ってのが結論なのですが、恥ずかしながら今日まで知らなかったのでメモ。

`SELECT` クエリでカウントを取るとき、 `COUNT` に続けてスペースを入れてはいけません。
スペースを入れずに `(` を続けるのが正しい構文のようです。
違反すると、以下のようなエラーが出ます。

```
FUNCTION mydb.COUNT does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual
```

参考: http://stackoverflow.com/questions/7840253/sql-count-not-working
Amazon Dash Buttonの落とし穴

# Amazon Dash Buttonについて
Amazon.comが発売しているワンプッシュで商品が注文できる話題の素敵なボタンです
押すだけで家に商品が届く，素敵ボタンです．

![dashbutton.jpeg](https://qiita-image-store.s3.amazonaws.com/0/162880/7e5fc059-c835-ba99-289a-4719fe137574.jpeg)

https://www.amazon.co.jp/b?node=4752863051

このボタン知ってる人は知ってると思いますが優秀なIoTボタンなのです．

値段が５００円にも関わらず，Flash memoryやWI-FIモジュールなどが搭載されていて
ちょっとしたHackで簡単にIoTボタンとして利用できるのです．

（参考：
Amazon Dash ButtonをただのIoTボタンとして使う：http://qiita.com/jsoizo/items/3b8bba4160f41aef20f4
Amazon Dash Buttonの仕組みとハック：http://qiita.com/dkawashi/items/e6621c4b712b509c73ec
Amazon Dash Buttonを(正しくない方向で)使ってみた：http://qiita.com/takustaqu/items/8539b33780c9675c8657
）

そんな便利ボタンなAmazon Dash Buttonですが，IoTとして使用する際に機能停止してしまう落とし穴があったので
私と同じ轍を踏まないよう残しておきたいと思います．

# 症状
ボタンを押してもランプが点灯せず，AmazonアプリをつかったDash Buttonの新規登録のための青いランプすら点灯しません．
再設定もできない状態です．

# 経緯
Amazon Dash Buttonの利用法として私が所属している研究室のドア横にあるネームプレートに設置し，押すとTwitterの私のアカウントに訪問があったことを伝えるリプライを送信するScriptをRaspberry pi3をサーバとして実行していました．

ある日，Amazon Dash Buttonを押しても赤いランプが点灯->点滅し，サーバにも届いていないという状態があったためAmazon.comのアプリで再設定を試みました．

アカウントサービス -> Dash端末 -> 端末を管理　から
端末の無効化を行いました．

その後，以前やったようにAmazon Dash Buttonの登録手順を一からやっていったのですが，
ここで大きな問題がありました．

Raspberry Pi3で起動していたサーバを停止させていなかったのです．
登録手順の途中，WI-FI設定と接続テスト（？）をしている最中にTwitterにリプライが飛んできました．

この時にはすでに遅しで，ボタンの青い点滅が消え操作不能となってしまいました．

# 結論として
Node.jsを使ったAmazon Dash Button用のサーバを停止させてから登録手順を踏まないとボタンが機能停止してしまいます．
サーバを建ててAmazon Dash Buttonを使用している方が２台目以降の登録を行う際には注意してください．
僕がプログラミング初心者から抜け出すきっかけをくれた3つの問題

僕は、今年3年目のまだまだ未熟者のSIer勤めのSEです。

新卒1年目はテスターやら実装やらを交えながら仕事してました。
正直、プログラミングってなんじゃ！なんで値がこんな風に遷移しているんだ！
変数ってなんじゃ！！と毎日思いながら出社しておりました。
と思っていた際に3つの問題を当時のPM(プロジェクトマネージャー)が出してくれた。
この問題を解いたあたりからプログラミングってこういうことかぁとわかり始めるようになりました。
今では、とても温厚にプログラムを見ることが出来ます。ｗ

僕と同じ様な悩みを持っている方々に読んでいただけたら本当にうれしいです。笑

##1問目
aとbの値を入れ替えてください。

##2問目
1~100までの数字を出力してください。

##3問目
1~100までの乱数を出力して、それをソート（降順）してください。

答えは調べないで自分で考えてください。ｗ
頑張ったなら調べてもいいですけど。ｗ

※1問目は1ステップでも書けるんです。
APIのresponseをxml形式で受け取り、指定したタグのDOMを取得する

###API Requestを出し、ResponseをXMLで受け取り、指定のDOMを取得する。

意外と記載が少なかったので、ここにも記載しておきます。

APIを投げ、XML形式のResponseに記載があるsessionIDを使いたいということがありましたので、こんな投稿をしておきます。

```
String sendEncoding = "utf-8";
HttpURLConnection urlConn = null;
OutputStream out = null;
InputStream in = null;
URL url = new URL("APIのURL");
	urlConn = (HttpURLConnection) url.openConnection();
　　// POSTでRequest
	urlConn.setRequestMethod("POST");
	urlConn.setDoOutput(true);
	urlConn.setRequestProperty("Content-Type", "text/xml;charset=" + sendEncoding);
	urlConn.connect();

	out = urlConn.getOutputStream();
	out.write(request.getBytes(sendEncoding));
	out.flush();

　　// ここらでResponseを取得する。
　　// これより下は
	in = urlConn.getInputStream();
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse(in);
    in.close();

   // Listでかえって来るのでいい感じにFor文を回してあげると
　 // 欲しい値を取得できます。
    NodeList nodes = doc.getElementsByTagName("タグの名前");
```

xml形式のAPIを活用する際はぜひご活用ください。
SSHで二人以上の人が同じサーバにアクセスしたらslackに通知を飛ばす

あるところに，某ステージングサーバにて作業をするときは**一度チャットを確認して，誰も作業をしてなければ，自分が今から何の作業をするのかをチャットに残してから作業をする。**というルールがありました。
私はこれを自動化しようとして，以下の条件で動作するものを作りました。

- 誰かがサーバにアクセスする度にチャットに通知が飛ぶ
- また，二人以上が同時にログインしていると**その旨をチャットに通知**する
- ただ，誰が何の作業をしているかまでは追わない
 - 誰かいると思ったら`w`コマンドで他の人が何してるか見るか，もうチャットやら口頭で確認しちゃえば良いかな。みたいな

# 必要なもの

- slack
- slackのIncomming WebHooks URL
- 適当な(ログインの監視対象とする)サーバ

# 作り方

```bash
#!/bin/sh

SLACK_URL='https://hooks.slack.com/services/hoge/fuga' # ここにIncomming WebHooksを

SLACK_MES=''
let LOGIN_USER=$(echo `w` | sed -e 's/.*\([0-9]\+\) user.*/\1/g')
if [ ${LOGIN_USER} -ge 2 ] ; then
    SLACK_MES="既に誰かがログインしている可能性があります。 現在"${LOGIN_USER}"名がログイン中"
    echo ${SLACK_MES}
fi
curl ${SLACK_URL} -X POST --data-urlencode 'payload={"channel": "#log", "username": "ghost-bot", "text": "監視対象へのSSH接続を検出いたしました。 '"${SLACK_MES}"'", "icon_emoji": ":ghost:"}' >/dev/null 2>&1
```

[これ](https://gist.github.com/shyazusa/15f1c7bbdc5c13a08d4002e6bcdd666e)を`~/.ssh/rc`として保存します。

## 動作チェック

対象のサーバに普通にひとりでアクセスして，別タブとかで重複アクセスを試してみましょう……。

<img width="856" alt="Slack_-_shy_azusa.png" src="https://qiita-image-store.s3.amazonaws.com/0/88650/91d67e3b-792c-922b-3f19-036aa3fd724c.png">

チャットに通知が飛んできました!!
また，重複ログインを行った人のコンソールには

<img width="770" alt="1__ec2-user_next-timecard____ssh_.png" src="https://qiita-image-store.s3.amazonaws.com/0/88650/9152422f-a4e8-8960-f76c-31468b604be1.png">

**既に誰かがログインしている可能性があります。**と，チャットの後ろの部分と同じメッセージが出現しています。
slackで通知されればチャットを見ている誰かが気付けるだろうし，もしも気付けなくってもコンソールにも表示されるので安心ですね。

参考: [Linuxへのsshログインをslackへ通知する - Qiita](http://qiita.com/you0328/items/97d2c17a59ff8be87a26)
Brainfuck派生言語を簡単に作成するPHPライブラリをつくった

## なぜつくったのか

[r-fxxk](https://github.com/masarakki/r-fxxk)という、Brainfuck派生言語を簡単に作成するためのRubyライブラリがあります。たとえば、[プログラミング言語フレンズ Kemono](https://github.com/consomme/kemono_friends_lang)は以下のような非常に簡単なコードで実装されています。

```rb
class Kemono < Brainfuck
  nxt "たのしー！"
  inc "たーのしー！"
  prv "すごーい！"
  dec "すっごーい！"
  opn "うわー！"
  cls "わーい！"
  put "なにこれなにこれ！"
  get "おもしろーい！"
end
```

PHPにも似たようなのが無いかなー、と思って探してみましたが、見つからなかったので作りました。コードは[GitHub](https://github.com/ryo-utsunomiya/php-fxxk)で公開しています。

## つかいかた

インストール：

```
composer require ryo-utsunomiya/php-fxxk
```

Kemonoを実装してみます。

```php
<?php

require_once __DIR__ . '/vendor/autoload.php';

use BrainFuck\Mapping;
use BrainFuck\Language;

// Kemono の定義
$kemono = new Mapping([
    'たのしー！',
    'たーのしー！',
    'すごーい！',
    'すっごーい！',
    'うわー！',
    'わーい！',
    'なにこれなにこれ！',
    'おもしろーい！',
]);

// 「Hello World!」を出力するプログラムを生成
$program = $kemono->helloWorld();
echo $program . PHP_EOL;

// マッピングを使用してプログラム実行
$output = Language::withMapping($kemono)->run($program);

// プログラムの実行結果はintの配列になるので、
// intをasciiの値とみなして文字列として出力
foreach ($output as $char) {
    echo chr($char);
}

```

ちなみに、KemonoでHello World!を出力するプログラムは以下。

```
すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！なにこれなにこれ！たのしー！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！たのしー！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！たのしー！すごーい！すごーい！すごーい！たのしー！すごーい！たーのしー！たーのしー！たーのしー！たーのしー！すっごーい！おもしろーい！たのしー！すごーい！すごーい！うわー！たのしー！すごーい！うわー！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！うわー！うわー！すごーい！すごーい！すごーい！うわー！たのしー！すごーい！すごーい！うわー！たーのしー！たーのしー！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！すごーい！うわー！たのしー！うわー！すごーい！すごーい！すごーい！うわー！すっごーい！すっごーい！すっごーい！すっごーい！すっごーい！すっごーい！うわー！すっごーい！すっごーい！すっごーい！すっごーい！すっごーい！すっごーい！すっごーい！すっごーい！うわー！たのしー！すごーい！うわー！たのしー！うわー！
```

`Mapping`を継承したクラスを作ってもOKです。

```php
<?php

namespace KemonoFriends;

use BrainFuck\Mapping;

class Kemono extends Mapping
{
    protected $mapping = [
        'たのしー！',
        'たーのしー！',
        'すごーい！',
        'すっごーい！',
        'うわー！',
        'わーい！',
        'なにこれなにこれ！',
        'おもしろーい！',
    ];
}
```

## 設計のポイント

BF系言語を翻訳して本家Brainfuckに変換し、Brainfuckインタープリタが変換後のコードを実行する、というのがこのライブラリのアーキテクチャです。

このライブラリにおいてキモになるのは、BF系言語 => Brainfuckの変換部分で、ここは`Mapping`というクラスが担っています。

PHPで実装されたBrainfuckのインタープリタはいくつかありますが、[ircmaxell/PHP-BrainFuck](https://github.com/ircmaxell/PHP-BrainFuck)を使っています。クラスがきれいに分割されていて、拡張しやすそうだったので採用しました。

## まなんだこと

当初は、スクラッチでBrainfuckインタープリタを作ろうとしてたのですが、意外と大変でした。特にループが難しく、プログラム中からループの内部だけを正規表現で抜き出そうとすると、コードのトークンが2文字程度でもバックトラック制限に引っかかります。

そこでr-fxxk等の実装を眺めてみたところ、インタープリタの部分はBrainfuckのままで、変換部分で工夫している、ということが分かったので、同じように実装しました。

あと、Packagistにライブラリを公開するのは初めてだったんですが、ソースがGitHubにあってcomposer.jsonに必要な情報が書いてあれば、簡単に公開できるということがわかりました。
React+Reduxを手っ取り早く試してみたい人向けのなるべく小さいサンプル

React+Reduxを触ってみたいんだけどサンプルコードがイマイチ分かりにくいし、もっと単純なサンプルで動かしてみたい！という人用に、数値をインクリメントするだけのなるべく単純化したサンプルを作成し、おおまかな説明を付けました。
なお本格的に触る場合は、公式ドキュメントを参照されることをお薦めします。

## 使うもの

* Node.js v9.11.1
* npm v5.8.0
* react v16.3.1
* redux v3.7.2
* webpack v4.5.0

## 基本的なReduxの流れ
![図解Redux.png](https://qiita-image-store.s3.amazonaws.com/0/11433/58d44e31-4f0e-250f-b6ce-d092f742fd77.png)


## 準備

まずは適宜作業スペースを用意。

```
mkdir react-redux-sample
cd react-redux-sample
npm init --yes
```

必要なパッケージを入れます。webpackを用いるのでその辺りも入れます。

```
npm install react react-dom react-redux redux
```

```
npm install --save-dev webpack webpack-cli webpack-dev-server babel-loader @babel/core @babel/preset-env @babel/preset-react
```

## ソース

```index.html
<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <div id="root"></div>
    <script src="/bundle.js"></script>
  </body>
</html>
```

確認用のhtmlです。`bundle.js`はwebpackで生成するjsです。

---

```js:index.jsx
import React from 'react';
import { render } from 'react-dom';
import { Provider } from 'react-redux';
import { createStore } from 'redux';

const reducer = function (state = {count: 1}, action) {
  switch (action.type) {
    case 'INCREMENT':
      return {
        count: state.count+1
      };
    default:
      return state;
  }
};
const store = createStore(reducer);

import App from './App.jsx';

render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);
```

Reactのrender処理と、Reduxのstoreを準備しています。

* reducerはReduxにおいて、actionを受け取ってstateを更新する役割を担っています。
    * 今回はINCREMENTアクションを受けた時、countを+1しています。
* reducerをcreateStore()に渡すことでRedux storeを生成します。
* ProviderはReactとReduxを繋ぐ仕組みの一環です。

---

```js:App.jsx
import React from 'react';
import { connect } from 'react-redux';

function App({ count, onIncrementClick }) {
  return (
    <div>
      <span>{count}</span>
      <button onClick={() => { onIncrementClick(); }}>
        inc
      </button>
    </div>
  );
};

export default connect(
  state => {
    return { count: state.count };
  },
  dispatch => {
    return {
      onIncrementClick: () => {
        dispatch({ type: 'INCREMENT' });
      }
    };
  }
)(App);
```

Reactコンポーネントです。

* connect()はreact-reduxが提供する、ReactコンポーネントとRedux storeを繋ぐ処理で、ReduxからReactコンポーネントに渡すstateやdispatchをそれぞれ設定します。
* `{ type: 'INCREMENT' }`はactionであり、dispatch()に渡すことでreducerに伝わります。

## 動作確認

webpackを設定します。

```webpack.config.js
var path = require('path');

module.exports = {
  mode: 'development',
  entry: './index.jsx',
  output: {
    path: path.resolve('dist'),
    filename: 'bundle.js'
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env', '@babel/preset-react']
        }
      }
    ]
  }
};
```

以下のコマンドでwebpack-dev-serverを起動。

```
npx webpack-dev-server --progress --hot
```
http://localhost:8080/webpack-dev-server/index.html
にアクセスすると動作が確認できます。
Processingとp5.jsのコードを移植する時のTips（随時更新）

最近JavaScriptの勉強もはじめたのですが、p5.jsをあつかうときにProcessingのコードも移植できたら勉強になるなと思い、Processingのコードをp5.jsで再現するチャレンジを行っているのでそのTipsを随時まとめていきたいと思います。

## メソッド名が変わるもの
### popMatrix(), pushMatrix()

Processingの`popMatrix()`と`pushMatrix()`というメソッドはp5.jsでは`pop()`と`push()`というメソッド名に変わっています。

## 雑多な注意点
### 画面のsetupについて

Processingでは最初画面を初期化するさい`size(width, height)`というようにして画面の大きさを指定すると思います。
ですが、p5.jsの場合Web上で動かすことが想定されているため`canvas`をつくってそこに描画をするということでここでは`createCanvas(width, height, HOGE)`といったメソッドを使うことになります。このときHOGEの部分は省略可能ですが`WEBGL`や`P2D`などの定数を入れることでモードの指定が可能になっています。

### 型の扱いについて
基本的にJavaScriptはほぼ全て型推論の言語なので型の扱いには注意しなければなりません。
たとえばProcessingだと型宣言があるので

```c
float frame = 30;
```

というような書き方も可能ですがJavaScriptでは

```js
var frame = 30.0;
````

というように型がしっかり推測できる書き方をしましょう。またキャストはもちろんJavaScriptにもありますが、しっかりと型推論できる形で書いていれば省略が可能になります。
Mac OS上でadbにパスを通す

## .bash_profileにplatform-toolsのパスを記入  

``$vi ~/.bash_profile``

```
export PATH=$PATH:/Users/xxxxx/Library/Android/sdk/platform-tools
```

## .bash_profileを再度読み込む

下記のいずれかの方法で再読み込み可能

・ ターミナルの再起動
・``$source ~/.bash_profile``
Jupyter notebookで動的なグラフを表示する。（D3.jsのインライン表示）

Jupyterでデータを触っていて、可視化のためにグラフをインラインで表示したいことは多々あると思います。
多くの場合は
```
%matplotlib inline
```
で十分だと思います。

しかし、データが多すぎて読めないグラフが表示されたり、もっと綺麗な図で見たい場合もあると思います。
そこで、動的な綺麗なグラフをJupyterで出す方法をみつけたので試してみました。


まずはデモを見てください。

↓移動や拡大縮小ができる分散図
![d3.gif](https://qiita-image-store.s3.amazonaws.com/0/129147/8b549ad1-47bb-9019-5a25-f146392f2cfb.gif)

↓Twitterのフォローした人と自分を結んだグラフ図
![twitter8.gif](https://qiita-image-store.s3.amazonaws.com/0/129147/b273d638-416d-4a5d-8562-6600865a5229.gif)


具体的にはD3.js（https://d3js.org/ ）というデータの可視化に特化したJavaScriptのライブラリを使った結果をJupyterにインライン表示します。

まず、jupyterを動かしている環境にpy_d3というエクステンションを入れます。（https://github.com/ResidentMario/py_d3 ）
```
pip install py_d3
```

jupyter notebookでインポートしてエクステンションをロードしてください。
```
import py_d3
%load_ext py_d3
```
そうすれば、セルの先頭で%%d3というマジックをつければD3.jsが使えるようになります。

```
%%d3

<g></g>

<script>
d3.select("g").text("Hello World");
</script>
```
と入力して実行すると、
![Screenshot from 2017-02-20 19-11-11.png](https://qiita-image-store.s3.amazonaws.com/0/129147/67ee69f5-5d97-f728-8d13-18a597c01d6e.png)


こんな感じです。

また、外部のJSファイルやCSSも読み込めるので、過去に作ったものがあるならすぐに実行できます。
D3.jsを使ったことある人は何が出来るのか想像出来ると思いますが、そうでない人は[D3.jsの公式サイト](https://d3js.org/ )や[py_d3のgithubのREADME](https://github.com/ResidentMario/py_d3)を見ると感じがつかめると思います。思っている以上にすごいことが出来ます。
Python3.6.0をUbuntu16.04に導入する。

## 初期セットアップ。

```
sudo apt-get update
# gitが無い場合は
sudo apt-get install git 

# Pythonのビルドに必要なライブラリをインストールする。
sudo apt-get install build-essential libncursesw5-dev libgdbm-dev libc6-dev zlib1g-dev libsqlite3-dev tk-dev libssl-dev openssl libbz2-dev libreadline-dev

```

## pyenvをセットアップする。

>pyenvはPythonのバージョン管理を行なうコマンドラインツールで、複数のバージョンのPythonのインストールや切り替えを容易に行うことができます。pyenvを利用すれば、既存のPythonの環境をいじることなく色んなバージョンのPythonを同居させることが可能です。

以下のコマンドを実行して下さい。

```
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
echo 'eval "$(pyenv init -)"' >> ~/.profile
source ~/.profile
```
## Python3.6.0をインストールする。


```
pyenv install 3.6.0
```

この状態ではまだデフォルトは2.x系なので、導入した3.6.0を`global`として設定を反映させます。

```
pyenv global 3.6.0
# version確認
python -V
Python 3.6.0
```


以上です。
お疲れ様でした。

## 参考資料

- [Python3の環境構築(Linux、Mac)](http://www.python.ambitious-engineer.com/archives/7)
【iOS】Associated Domains セッティングチート【ユニバーサルリンク】

##　1. Associated Domainsサービスを有効に
<img width="982" alt="Settings_-_iOS_App_IDs_-_Apple_Developer.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/fe2c1c2f-188c-c01f-e1f1-74d6a31b0986.png">


## 2. サーバにJSONファイルを用意
<img width="964" alt="1__root_moviec__usr_share_nginx_apps-launch_public__ssh__と_moviec_xcodeproj.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/37a51cc6-d086-9889-4963-f6c38127e532.png">

JSONに指定するappIDは、**PrefixとBundlIDをドット（.）で繋いだ**ものです。
<img width="995" alt="iOS_App_IDs_-_Apple_Developer.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/d56ed4a6-e3a9-3824-a133-e021c280b6bd.png">

## 3. XcodeのCapabilitiesを開く
<img width="1603" alt="moviec_xcodeproj.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/00fcc9a7-0701-f61d-97e5-377668f7c32e.png">
Domainsには、**"applinks:" + ドメイン名** を。
PowerCMS「インポート/エクスポート機能 (ImportExportObject プラグイン)」用CSVを作成する際に、気をつけるべきこと

PowerCMS 4.3で検証しています。

PowerCMSの機能「インポート/エクスポート」を用いれば、各オブジェクトデータを、CSV方式でインポート、エクスポートすることができます。

- 記事
- ウェブページ
- カテゴリ
- フォルダ
- アイテム
- カスタムフィールド
- テンプレート

上記オブジェクトデータを大量に登録しなければならない場合、手作業では大変手間になります。
PowerCMSでは、インポート用のCSVファイルを作成すれば、一括で登録ができるので、とても便利です。

一方、CSVデータを作成する際に、気を付けなければならない点があります。

# CSVデータ作成時に留意すべき事項

CSVデータのidカラムの扱いについて、PowerCMSのマニュアルに注意書きがあります。

```
id カラムへは空の指定ができませんので、id カラムがある場合は既存オブジェクトの ID を必ず指定してください。
新規インポートを行う場合は id カラムごと削除してください。
```

新規インポート時にidカラムを残したままだとどうなるか、「記事」「カスタムフィールド」用CSVデータを例に挙げて説明します。

# 「記事」用CSVデータ上に、空のidカラムが存在する状態でインポートした場合

![1.png](https://qiita-image-store.s3.amazonaws.com/0/47173/afbe8c21-27d0-e0ab-5a1b-5726cd68dfdb.png)

記事のインポートはできますが、メインカテゴリを指定していても無視されます。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/47173/7c9ce733-215a-cc97-b64c-8d4e961401c8.png)

# 「カスタムフィールド」用CSVデータ上に、空のidカラムが存在する状態でインポートした場合

インポートできる場合と、エラーになる場合があります。

# 結論

うっかりidカラムを入れたままCSVデータを作ってしまいがちなのですが、CSVデータのidカラム値を指定する場合は、登録済みのオブジェクトデータを上書きインポートしたい時のみとしましょう。
技術書評「Effective Ruby」

![51UuacnMrjL._SX258_BO1,204,203,200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/20307/5568af66-c9db-877c-567a-de1b47f5a08c.jpeg)

「Effective Ruby Peter」 J. Jones (著), arton (監修), 長尾 高弘

## 感想
- オススメ度 4/5
- 「初めてのRuby」の後に読んだ
- Rubyのお作法とか、よりよい書き方が示されて迷いが減る
- Moduleとかincludeとかextendとか特異クラスとかよくわからなかったけど大体わかった
- 5章のメタクラス以降は難しくてわからなかった

## メモ
#### 1章 rubyに体を慣らす
- false, nil以外すべて真
- 定数は#freezeする

#### 2章 クラス、オブジェクト、モジュール
- サブクラスの初期化ではsuperを使って親クラスも初期化する
- クラスを作るほどでもない構造化データにはHashではなくStructを使う
- クラス変数よりもクラスインスタンス変数
- 別途まとめた
  - モジュール: http://qiita.com/shogo807/items/d50d6b3420805569c9e1
  - 特異クラス: http://qiita.com/shogo807/items/c1415f1fa9b687356bf3

#### 3章  コレクション
- 継承よりも移譲
- dupはfreezeをコピーしない & 特異メソッドをコピーしない
  - コレクションをコピーするならdup
- reduceにはアキュムレータを常に指定するのがオススメ

#### 4章 例外
- 独自Exceptionをちゃんと実装する

#### 5章 メタプログラミング
#### 6章 テスティング
#### 7章 ツールとライブラリ
#### 8章 メモリ管理とパフォーマンス
PostgreSQLのpg_dumpとPowerShellの組み合わせでハマった話

# PowerShellからpg_dumpで作成したダンプファイルがリストア時にエラー

## 現象
```
pg_dump -d "DB名" > "hoge.dump"
```
PowerShellから上記のようなコマンドで作成したダンプファイルが、psqlでリストアする際にエラーが発生し失敗する。

>ERROR:  invalid byte sequence for encoding "SJIS": 0xff 0xfe

## 原因
PowerShellでは、リダイレクト（> or >>）を使ってテキストファイルにテキストを書き込むと、Unicode形式(UTF16)で書き込まれるため。

## 回避策

- cmdシェルを使う
- バイナリ形式でダンプする
- 標準出力からファイルにリダイレクトするのではなく、pg_dumpの -f オプションを利用して直接ファイル出力する
- パイプを使ってOut-Fileコマンドレットでファイルに出力する

```
pg_dump -E sjis -d "DB名" | Out-File -encoding default -filepath "hoge.dump"
```
Invalid JWT: Token must be a short-lived token and in a reasonable timeframe

Dockerでfluent-plugin-bigqueryを動かしていて以下のエラーに遭遇しました。

```
fluentd_1  | 2017-02-20 09:09:25 +0000 [warn]: temporarily failed to flush the buffer. next_retry=2017-02-20 09:09:20 +0000
error_class="Signet::AuthorizationError" error="Authorization failed.  Server message:\n{\n \"error\": \"invalid_grant\",\n \"error_description\": \"Invalid JWT: Token must be a short-lived token and in a reasonable timeframe\"\n}" plugin_id="object:xxxxx"
```

時間がズレてるみたいです。調べたら6分くらいズレてました。dinghyをrestartしたら解決しました。

## 参考
http://stackoverflow.com/questions/30115933/access-token-and-refresh-token-giving-invalid-grant-in-google-plus-in-python/30117441#30117441

http://stackoverflow.com/questions/36189612/token-must-be-a-short-lived-token-and-in-a-reasonable-timeframe
Googleの入社試験(非公式)にGroovyでチャレンジしてみる

# 概要
@megmism さんの 「[Googleの入社試験(非公式)にチャレンジしてみた[java]](http://qiita.com/megmism/items/d91ba4f17fd2862b2a1e)」 を見て、試されている気がしたので、特に書けるわけでもない Groovy で書いてみました。

```groovy
int count = 0
(1..1000000).forEach{it ->
	String str = Integer.toString(it)
	for (int i = 0; i < str.length(); i++) {
		char c = str.charAt(i)
		if (c == '1') {
			count++
		}
	}
	if (it == count) {
		println it
		return
	}
}
println count
```

雑すぎる上にまったく Groovy のよさがないコードですみません。もっと Groovy っぽい書き方をお教えください :bow:

# Gist 連携
投稿する際に「Gist に投稿する」のチェックを入れると、連携している GitHub アカウントの Gist に自動でコードを投稿してくれる機能が Qiita にあると知りました。連携先は[こちら](https://gist.github.com/toastkidjp/30d0c66c890e2ac9644beae66ecca778)

詳細は以下をご覧ください。

- [Qiita > Gist連携 > こういう機能があることを知らなかった](http://qiita.com/7of9/items/5d536013da52cdbb5998)
How to change .nuget directory

### prologue
 - Under VMWare Horizon View 7 - Full Clone environment,  I have installed Visual Studio 2015 Community Edition.
 - I have experienced Profile size error dialogs during development with VS 2015
 - The User Profile size is limited = 300MB 
 - Nuget tries to download the packages into **C:\User\.nuget** which is limited under the restriction above.
 

### How to change .nuget directory

- set **NUGET_PACKAGES** environment variable

```
NUGET_PACKAGES = C:\Nuget\.nuget
```


:thumbsup:
Opera Mail for Macのアンインストール

# Opera Mail for Macを完全に削除したい
個人で調べた限り以下のコマンドできれいに削除できる。

```
rm -rf /Applications/Opera\ Mail.app/

rm -rf ~/Library/Application\ Support/Opera\ Mail
rm -rf ~/Library/Caches/Opera\ Mail
rm -rf ~/Library/Opera\ Mail
```

Operaでfindすると「Operator」系のファイルがHITしてややカオスになった:sweat_smile:
LineBot + Heroku + Docker + Pythonで環境立ち上げ

## 概要
* line-bot-sdk-pythonを利用したオウム返しをDocker + Herokuで構築したのでその備忘録

主に参考にしたページ
> https://devcenter.heroku.com/articles/container-registry-and-runtime

> https://github.com/line/line-bot-sdk-python

※ アカウントの取得やアクセスキーの取得は終わっているものとします（たくさんのページが見つかるのでここでは割愛）

## Dockerにlinebot用のサーバ環境を構築
通常のHerokuへのデプロイだと、requirement.txtとかprocfileとかもろもろプッシュするのだと思うが、自分がDockerで環境を作れればそれを利用するほうが楽だろうという考えでDockerを使った環境構築を行う。

### フォルダ構成
linebot
    │  .dockerignore
    │  Dockerfile.heroku
    │
    └─app
        │  bot.py


```Dockerfile.heroku
FROM kyobad/miniconda3-alpine:latest

MAINTAINER K.Kato

RUN pip install --upgrade pip \
    && conda install -y flask \
    && pip install flask gunicorn line-bot-sdk \
    && adduser -D botter \
    && mkdir /home/botter/app

USER botter

COPY ./app /home/botter/app

WORKDIR /home/botter/app

CMD gunicorn -b 0.0.0.0:$PORT bot:app --log-file=-
```

```bot.py
###公式SDKのコピペです###
from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

app = Flask(__name__)

line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('YOUR_CHANNEL_SECRET')


@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'


@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))


if __name__ == "__main__":
    app.run()

```

Dockerfileでは、自分が使用する環境を構築しています。自由に変えられるが、ポートだけは``$PORT``としないとHeroku側で認識されないので注意

## デプロイ方法
### Herokuにアプリケーションを作成する
https://www.heroku.com/home
自分の作成したアプリケーション名は覚えておく（cliを使ったアプリケーション生成でもOK）

### DockerイメージをBuildする
ここからはcliで作業をしていく
まずは、``heroku container:login``でレジストリにログインする
次に、``docker -f Dockerfile.heroku build``でイメージを作成する。イメージ名は後で変えることになるので自由につけてよし

### HerokuにPushしてデプロイ
イメージを作成した後に、HerokuにPushするためにイメージ名を書き換える
``docker tag <image> registry.heroku.com/<app>/<process-type>``
ここでの``<app>``はherokuでのアプリケーション名、``<process-type>``はwebとしておけばOK
そして、``docker push registry.heroku.com/<app>/<process-type>``

これで、指定のURLでコンテナが立ち上がる！便利！だけどこれではまだ動かない

### 環境変数の設定
アクセスキーやシークレットキーをコードにベタ打ちはさすがにしないので、herokuのcliを使って設定する
``heroku config:set ACCESS_TOKEN=hogehoge --app appname``
といった具合に、コンソールから環境変数を設定してあげる。

ここまで終わるとオウム返しが完成しているはず
常にマウスの方を向くボックス

## 概要
- マウスの動きに合わせて傾き、角度を変えるボックス
- 左から右や、上から下など反対側にマウスを動かしたときのボックスの表示が同じにみえるため、CSSのPerspectiveプロパティで遠近感を出す。

## デモ
[http://codepen.io/viscosenpai/pen/NdZyqW](http://codepen.io/viscosenpai/pen/NdZyqW)

## コード
```html:index.html
<main>
  <div id="box">Hello World!</div>
</main>
```

```css:style.css
body {
  position: relative;
  margin: 0;
  width: 100%;
  height: 100vh;
}

p {
  margin: 0;
}

main {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100vh;
  perspective: 800px;
}

#box {
  display: block;
  background: #ff9191;
  width: 400px;
  height: 200px;
}
```

```javascript:script.js
var body = document.body;
var box = document.getElementById('box');
var mouseHandler = function (e) {
  var docW = body.clientWidth / 2;
  var docH = body.clientHeight / 2;
  var moveX = (e.clientX - docW) / 10;
  var moveY = (e.clientY - docH) / 10;
  box.style.webkitTransform = 'translate(' + -moveX + 'px, ' + -moveY + 'px)';
  box.style.webkitTransform += 'rotateX(' + -moveY + 'deg)';
  box.style.webkitTransform += 'rotateY(' + moveX + 'deg)';
}
body.addEventListener('mousemove', mouseHandler, false);
```

## ポイント
`perspective`の値を小さくすればより奥行きがダイナミック(?)になります。
ボックスの傾き、回転の取得値を反転(+ から - へ)したい場合、変数の先頭にマイナスをつければそのまま反転します。今回一番の収穫かも(517 => -517)

## 最後に
もっとこうした方がパフォーマンス的にええで。というようなことがあれば指摘をお願いします。
AndroidのMediaCodecとMediaExtractorあたりで動画のフレームスキップなどをしてみる

Androidの[MediaPlayer](https://developer.android.com/reference/android/media/MediaPlayer.html)だとフレーム単位で制御するAPIがなく早送りや任意にフレームスキップさせることは困難である。
しかし、[MediaCodec](https://developer.android.com/reference/android/media/MediaCodec.html)や[MediaExtractor](https://developer.android.com/reference/android/media/MediaExtractor.html)を使えばフレーム単位での制御が可能である。

ここでは自分で調べた結果をまとめておく。
動画再生に関しては素人なので間違ったことを書いてるかも。

## 実装サンプル

[mafshin/MediaCodecDemo: Android MediaCodec API Demo with Seek and MediaController](https://github.com/mafshin/MediaCodecDemo)
実装としては上記のコードがわかりやすい。
MediaExtractorで動画ファイルから動画データを読み(音声データは無視)、MediaCodecで動画データをデコードしてSurfaceに対して描画している。

ちなみに、MediaCodecの[getInputBuffers()](https://developer.android.com/reference/android/media/MediaCodec.html#getInputBuffers())あたりはdeprecatedなので以下のように置き換える。

```java
// 変更前
ByteBuffer[] inputBuffers = decoder.getInputBuffers();
...
ByteBuffer buffer = inputBuffers[inIndex];

// 変更後
ByteBuffer buffer = decoder.getInputBuffer(inIndex);
```

## フレームスキップ

* [java - Skip frames in video playback with MediaExtractor and MediaCodec - Stack Overflow](http://stackoverflow.com/questions/30307809/skip-frames-in-video-playback-with-mediaextractor-and-mediacodec)
* [android - Problems with MediaExtractor - Stack Overflow](http://stackoverflow.com/questions/21103347/problems-with-mediaextractor)

動画のキーフレーム以外のフレームではキーフレームからの差分のデータしか持っていないため、MediaCodecにはキーフレームからのデータを与え続ける必要がある。
上記リンク先の質問のようにMediaExtractorでキーフレームを無視してキーフレーム以外の動画データをMediaCodecに渡してもデコードは上手くいかない。

MediaExtractorの[seekTo()](https://developer.android.com/reference/android/media/MediaExtractor.html#seekTo)ではキーフレームにしか移動できないがここらへんが関係していそう。

基本的にはMediaCodecにはキーフレームからのデータを与え続けてエンコードさせ[releaseOutputBuffer()](https://developer.android.com/reference/android/media/MediaCodec.html#releaseOutputBuffer(int,%20boolean))でrenderフラグをfalseにして描画をしないことでフレームスキップする。

## 早送り/スローモーション再生

上記のサンプルに対して以下のようにすることで早送りやスローモーション再生ができたりする。
が、上記のフレームスキップやサンプルのようにsleepで待つ方が良い？

* 2倍速早送り再生

```java
decoder.queueInputBuffer(inIndex, 0, sampleSize, extractor.getSampleTime() / 2, 0);
```
* 2倍速スローモーション再生

```java
decoder.queueInputBuffer(inIndex, 0, sampleSize, extractor.getSampleTime() * 2, 0);
```

## 動画と音声の同期

* [android - Synchronise Decoded Audio and Video data from Mediacodec - Stack Overflow](http://stackoverflow.com/questions/15691933/synchronise-decoded-audio-and-video-data-from-mediacodec)

提示されているコードはよくわかってないけど、音声再生ベースにして動画再生をフレームスキップや待ったりして同期かければ良いのかなという感じ。