OmniAICreator/Qiita-1.07M huggingface dataset:
【Java】CrLfのみでreadLineする厳密改行ストリームリーダを実装した。

ハッキリ言って、**百万回実装された猫**だと思うけど。
ぼくも所用あって実装した事があるので、せっかくだからGitHubに上げてみた。


# ■概要：

## ◇背景

要件としては物凄くありがちな**「CSVパーサを実装する必要が出て来た」**事による。
ぼく個人としてはCSVと言うファイル形式は色々と面倒事が多いので好きじゃないので、
システム間IFとしてはXMLなりJSONなり、他の構造化文字列形式を採用して欲しいのだが、
残念ながら諸事情あって**何が何でもCSV**と言う事に。



## ◇独自実装する前に探してみた

要するに欲しいのはCSVパーサであって、出来ればそんな泥臭いものは自分でガリガリ書きたいモノではない。
という事で、使えそうなライブラリを探してみたのだが、どれもいまいちピンと来ない。

主に以下の点がネックになった。

- CSVのエスケープ実装が弱い。
- 一旦ファイルの全量をメモリに乗っけてしまう。
<br>*（恐らく、内部的にScannerを使ってるとか、正規表現を使っているとかで、その辺の事情だと思う）*

どうにかして実装済みのライブラリで済ませたい*（自分で泥臭いコードは書きたくない）*ので、結構頑張って探したんだけど、
要件を全てクリア出来るいいモノは結局見付からなかった。


## ◇実装要件

- CSVに含まれるデータには改行*（LF line-feed : \n）*が含まれ、これをきちんと処理する必要がある。
- レコードの区切りはCrLf、データ内改行はLfのみ、と言うのは仕様として確定している。
- CSVファイルのデータ量はそこそこ大きく、全量メモリに展開するのはNG。ストリーム処理が出来る事が必須。

で、まぁテキストファイルを一行ずつ読み込んでって、
普通にインクォート処理しながらCSVのトークンパースしてくだけじゃん。
泥臭いけどまぁ楽勝楽勝。

って思ってたんですが、残念なことに **BufferedReader#readLine() が肝心の CrLf と Lf を区別してくれない** と言う事を知らず。

トークンパーサはすぐに出来たのに、肝心の行読み込みが上手く行かず、結局そっちを自作する必要がでた、という。


# ■実装コード：

コアロジック部分のみ抜粋。
関連する他クラスとかは省略してるので、全量はGitHubの方を見て下さい。
*（コメントも全部削除してコードだけ乗っけてるので、コメント必要な方もそっち推奨）*

```java:CrLfReader#next

	public String next()
	{
		this.sb.setLength( 0 );
		
		if ( this.build() )
		{
			return this.sb.toString();
		}
		else
		{
			return null;
		}
	}
```


```java:CrLfReader#build

	private boolean build()
	{
		if ( this.end )
		{
			return false;
		}
		else
		{
			this.readline( false );
			return true;
		}
	}
```

```java:CrLfReader.Buffer

	private class Buffer
	{
		private final char[] temp;
		
		private int size;
		private int index;
		private boolean eof;
		
		public Buffer(int size)
		{
			this.temp = new char[max( size, MIN_SIZE )];
			this.size = 0;
			this.index = this.temp.length;
			this.eof = false;
		}
		
		public boolean fill()
		{
			if ( !eof )
			{
				size = reader.read( temp );
				index = 0;
				eof = -1 == size;
			}
			
			return !eof;
		}
		
		
		public boolean seekable()
		{
			return index < size;
		}
		
		public char seek()
		{
			return temp[index++];
		}
	}
```


```java:CrLfReader#readline

	private static final char CR = '\r';
	private static final char LF = '\n';
	
	private void readline(boolean cr)
	{
		while ( this.buffer.seekable() )
		{
			final char c = this.buffer.seek();
			
			if ( cr )
			{
				if ( LF == c ) return;
				
				this.sb.append( CR );
			}
			
			cr = CR == c;
			
			if ( !cr )
			{
				this.sb.append( c );
			}
		}
		
		
		if ( this.buffer.fill() )
		{
			this.readline( cr );
		}
		else
		{
			if ( cr ) sb.append( CR );
			
			this.end = true;
		}
	}

```


# ■GitHub

repository URL
https://github.com/sugaryo/sharp4j

class FQN
sharp4j.util.io.CrLfReader


# 余談

C#だったら yield return 使って更に便利なユーティリティに出来るんだけど、
JavaだったらStreamAPIを使う事になるのかな？

ちょっとその辺の勉強がてら、拡張してみたいな。
AnacondaのJupyter notebookでipywidgtesのエラーの対処法

# これなに

例えば、下記のように ipywidgets を使おうとしてエラーになった場合の対処方法です。

```py3:jupyter
import ipywidgets.widgets as iw
iw.Button(value='test')
```

```:エラーメッセージ
Widget Javascript not detected.  It may not be installed or enabled properly.

Error rendering Jupyter widget. Widget not found: ...
```

Anaconda で、 ipywidgets==6.0.0, widgetsnbextension==3.0.2 の環境でエラーになりました。
下記の解決方法のいずれかで直りました。

# 解決方法その1

- conda-forge を使う。→ ipywidgets が 7.0.1 でなります。

```shell-session:shell
    conda install -y -c conda-forge ipywidgets
    jupyter nbextension enable --py widgetsnbextension
```

# 解決方法その2

- pip で入れる。→ ipywidgets が 7.0.1 でなります。

```shell-session:shell
    conda uninstall -y widgetsnbextension
    pip install ipywidgets widgetsnbextension
```

# 解決方法その3

- conda で古いのを入れる。→ ipywidgets が 6.0.0 でなります。

```shell-session:shell
    conda install -y ipywidgets=6 widgetsnbextension=2
```

おそらく、現在の Anaconda の組合せが間違っているのかと思います。すぐ直ると思いますが。

ipywidgets|widgetsnbextension|可否
:--|:--|:--
7.0|3.0|OK
6.0|2.0|OK
6.0|3.0|NG ← 現在の最新状態(conda update --all)

以上
IT勉強会では基礎的なことをかためるべきなのかなーという話

Skype勉強会を開催している上で思ったことがある。それは、IT勉強会では基礎を固めるべきなのかなとかいうことである。
そう思ったきっかけというのが、基礎的な部分を扱ったSkype勉強会は人が集まりやすいということだ。単純に、「簡単で理解しやすいから」集まりやすいのかなと思ったが、そうではないのかもしれない。
例えば、建物を建造するときは、基礎はちゃんと固めないといけない。基礎をちゃんと固めてない上に構造物を構築することは不可能だ。
それこそ、覚えこむぐらいに繰り返す必要があるんじゃないかと思う。
応用的なことを迅速に、できるだけ考えずにやろうとした場合、基礎的なことをちゃんとマスターする必要があるんじゃないか。
基礎が貧弱でも小屋ぐらいなら建てることはできるが、都庁を建てることはできない。
そして、もしかしたら、基礎がちゃんと構築されていない状態で応用の勉強をすることは、時間の無駄とは言わないけど、能率が悪いんじゃないか。
IT勉強会で、基礎的なことを固める勉強会は意外と少ない。ほとんどが応用的な学問だ。
多分、応用的な勉強会が多いのは、そもそも主催者が基礎的なことは別のところで固めていて、応用のフェーズにあるからじゃないかと思う。
勉強会を開催するのは、ほとんど自分が勉強したいからだ。
例えば、iOSアプリを作る上での「基礎」とは、だいたいSwiftの基本的な文法や構文だと思う。ライブラリやフレームワークの使い方は、応用になる。
IT勉強会はだいたい昼は仕事があって来ている人が多いのだが、応用的なことはだいたい仕事でやっていることが多いのである。
さらに言うと、ITにおいては基礎が結構ゴロゴロ変わるのである。
結論として言えることは、IT勉強会では熟練者も初心者も基礎を固めるべきなんじゃないかということだ。

英語などの言語をマスターする場合とか、受験とかでも基本は重要だとされているようである。

ちょっとまとまってない文章ですが。
数値を英語の番号（序数）に変換するメソッド

使いどころとしてはfor文で回してるときに```$i```の数値によって英語序数で表記したいときとかですかね
あんまりきれいなコードじゃないですがどうでしょう？

```test.php
     /**
     * 数値を英語の番号（10番目まで）に変換します。
     *
     * @param int $int
     * @param bool $is_abbreviation
     * @return string|null
     */
    static function convertIntegerToOrdinalNumberUpToTen(int $int, $is_abbreviation = false) {

        $abbreviation = $is_abbreviation === true ? 'abbreviation' : 'ordinal_number';

        $list = [
            1 => [
                'ordinal_number' => 'first',
                'abbreviation'   => '1st',
            ],
            2 => [
                'ordinal_number' => 'second',
                'abbreviation'   => '2nd',
            ],
            3 => [
                'ordinal_number' => 'third',
                'abbreviation'   => '3rd',
            ],
            4 => [
                'ordinal_number' => 'fourth',
                'abbreviation'   => '4th',
            ],
            5 => [
                'ordinal_number' => 'fifth',
                'abbreviation'   => '5th',
            ],
            6 => [
                'ordinal_number' => 'sixth',
                'abbreviation'   => '6th',
            ],
            7 => [
                'ordinal_number' => 'seventh',
                'abbreviation'   => '7th',
            ],
            8 => [
                'ordinal_number' => 'eighth',
                'abbreviation'   => '8th',
            ],
            9 => [
                'ordinal_number' => 'ninth',
                'abbreviation'   => '9th',
            ],
            10 => [
                'ordinal_number' => 'tenth',
                'abbreviation'   => '10th',
            ]
        ];

        return array_key_exists($int ,$list) === false ? null : $list[$int][$abbreviation];
    }
```
Python で Domo の アクセストークンを取得する

Domo の user と　password から access_token を取得する方法です。

```py3:main_get_token.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	main_get_token.py
#
#					Sep/21/2017
#
# ------------------------------------------------------------------
import	sys
import	requests
#
from domo_config import domo_config_proc
from get_access_token import get_access_token_proc
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
config = domo_config_proc()
access_token = get_access_token_proc(config)
#
print(access_token)
#
sys.stderr.write("*** 終了 ***\n")
#
# ------------------------------------------------------------------
```

次の user と password は書き換えて下さい。

```py3:domo_config.py
# -*- coding: utf-8 -*-
#
#	common/domo_config.py
#
#					Sep/21/2017
#
# ------------------------------------------------------------------
import	sys
#
#
# ------------------------------------------------------------------
def domo_config_proc():
#
	config = {}
#
	config['user']="0ab7adx9-1ep8-44bb-a622-67g91f578e94"
	config['password']="cd295ed5dd33eb70914f8fx61523e8370b9e72d23c084a1209154ad6d203b1fx"
#
#
	return config
#
# ------------------------------------------------------------------
```

```py3:get_access_token.py
# -*- coding: utf-8 -*-
#
#	common/get_access_token.py
#
#					Sep/21/2017
#
# ------------------------------------------------------------------
import	sys
import	requests
import	json
#
#
# ------------------------------------------------------------------
def get_access_token_proc(config):
#
	url="https://api.domo.com/oauth/token"

	params= {
		"grant_type": "client_credentials",
		'scope': 'data'
		}

	rr = requests.get(url,params=params,auth=(config['user'],config['password']))
	print(rr.status_code)
	json_str = rr.text
	dict_aa = json.loads(json_str)
	access_token = dict_aa['access_token']
#
	return access_token
#
# ------------------------------------------------------------------
```

API の仕様はこちら
[Obtaining an access token](https://developer.domo.com/docs/authentication/overview-4#Obtaining%20an%20access%20token)
【cakephp3】prefixを用いてフロントと管理画面でerror.ctpを分ける

# cakephp3におけるerror.ctp

存在しないURL(ページ)にアクセスしたときに表示される共通のページのレイアウトです。
ページが存在しませんというページです。

その際に、レイアウトがフロントと管理画面で二種類あるケースでcakephp3においてerror.ctpをどのように二つに分けるかをまとめました。

# 要件と修正前の状態

現在は下記のように二つのレイアウトが存在するとします。

    app/src/Template/Layout/front.ctp
    app/src/Template/Layout/admin.ctp

テンプレートではfrontのレイアウトを呼んでいます。

```html:app/src/Template/Error/error.ctp
(中略)
    $this->layout = 'front';
(中略)
```

今回は、新しく、管理画面のページ(/admin/以下の存在しないURL)に読み込ませるレイアウトを変更したいとします。
※現在は、フロントも管理画面(/admin以下)も、通常通りフロントのerror.ctpが出てしまいます。


存在しないURLを叩くと、本来フロントではなく、管理画面のヘッターやフッターが出て欲しいところですが、これがフロントのレイアウトが出ている状態です。

    ex /admin/hoge_not_exit

そのため、判定が必要です。

# 悪い修正例(文字列で判定)

```html:app/src/Template/Error/error.ctp
(中略)
if (strstr(Router::url(), 'admin') === false):
    $this->layout = 'front';
else:
    $this->layout = 'admin';
endif;
(中略)
```

## なぜダメなのか

『admin』という文字列で判定してしまうと、
/aaaaadmin でも管理画面用のレイアウトが出てしまうからです。

要件としては、/admin/以下の存在しないURLの場合のケースにadmin用のレイアウトを出したいからです。

そのためprefixでの判定が望ましいです。

## 速さを比較するとstrstr関数よりもstrpos関数を使うべき

http://php.net/manual/ja/function.strstr.php

# 良い修正例(prefixで判定)

prefixの判定を使うのがベターなようです。
https://book.cakephp.org/3.0/ja/controllers/request-response.html#id3

```html:app/src/Template/Error/error.ctp
(中略)
if ($this->request->param('prefix') === 'admin'):
    $this->layout = 'admin';
else:
    $this->layout = 'front';
endif;
(中略)
```

## prefixとは

ちなみに、prefixは、config/routes.phpで設定してあるものです。
そのため、prefixで、adminの設定をして、trueが返却されるようにします。
https://book.cakephp.org/3.0/ja/development/routing.html#prefix-routing

フロント画面では、設定していないためfalseが返ります。

# デバック方法

## デバックモードを切る

app.phpの一番上のデバックモードをfalseにしないと、まずローカル環境でテストができないので、error.ctp系の開発するときは一回切ります。そして存在しないURL(存在しないコントローラーやアクション)を叩いて何が表示されるか確認します。

## prefixのデバック

prefixをdebugする方法としては下記の通り
    
    $passedArgs = $this->request->param('prefix');
    debug($passedArgs);

※cakephp3.4以降であれば getParamが使えます。

https://github.com/tyrellsys/jsh/blob/develop/app/config/routes.php#L50
Pythonおぼえがき＜演算子の優先順位＞

Python始めました。
Windows 10, Python 3.6.2rc2 を使っています．

演算子の優先順位が分からなかったので，ここにおぼえがき

# 演算子の順序

|優先度|演算子|意味 |
|:----:|:----|:----|
|高：１ |(expressions...)|優先順位の指定 / ダブルリテラル|
|      |[expressions...]|リストリテラル|
|      |{key: value...}|辞書リテラル|
|      |{expressions...}|集合リテラル|
|2     |x(arguments...)|関数呼び出し|
|3     |x[index]|添え字指定|
|      |x[indexStart:indexStop]|スライス|
|4     |x.attribute|属性参照|
|5     |**|べき乗|
|6     |+x, -x, ~x|正，負，bit否定|
|7     |*, /, //, %|乗算，除算，整除除算，剰余<br>書式化文字列|
|8     |+, -|加算，減算|
|9     |<<, >>|bitごとのシフト|
|10    |&|bitごとの論理積|
|11    |^|bitごとの排他的論理和|
|12    |\||bitごとの論理和|
|13    |<, <=, >, >=, !=, ==|比較演算子|
|14    |in, is|メンバシップ演算子|
|15    |not x|否定|
|16    |and|論理積|
|17    |or|論理和|
|18    |if condition : else|条件式|
|低：19    |lambda|ラムダ式|

## 同じ演算子が重なったときは
基本的には左が優先される
~~~
>>> 8 // 2 // 2
2
>>> (8 // 2) // 2
2
>>> 8 // (2 // 2)
8
~~~
でも累乗 ** は右優先
~~~
>>> 2 ** 2 ** 3
256
>>> 2 ** (2 ** 3)
256
>>> (2 ** 2) ** 3
64
~~~


# おわりに
~~tableの仕様なのか書けなかったのですが，12行目の演算子は"|"です．~~
~~あと，1つのセルに複数行を書く書き方が分からなかったので，若干見にくくなっています．~~
Markdownの方法を教えてくださ~~ると，大変助かります．~~り，ありがとうございます。

同列優先度の順序に関しては，[shiracamus](https://qiita.com/shiracamus)さんの[こちら](https://qiita.com/tTAGUCHI/items/1dee92cd058f975ffce3#comment-c851e9266681654a0783)のコメントをご覧くださいませ．

----
今さらながら修正をしました．（2023年9月19日）
線形代数わかるまでの道～１日目・地固め～

#目的
私は趣味で物理学の本を読んでいたのですが線形代数が出て拒絶してしまって、今は線形代数を聞くと体調が悪くなります...何度もそれをトライしてきましたが途中で力尽きてしまいます。それを打開するため、書き起こしながら理解しようとそういう作戦です。

#線形代数のイメージ
沢山あるので箇条書きで書いていきます。

- 線形代数は行列が主体になっている
- 数字、ベクトル、行列の順に何かの次元が増えてる
- 行列の四則演算や一次変換、連立方程式の解き方は分かる
- 行列でいろんなものを一般化する
- でも行列の意味なんて知らない
- 行列とベクトルを合わせるとテンソルになる
- 線形性は分かるけど何がそんな重要なの？
- 道のりが長すぎて難かしい

少ししか分かっていませんが出来る限り書いていきます。

#前提
昔の高校数学までの行列の知識があること。具体的に以下のことです。

- 行列の和、差、積の演算
- 一次変換
- 行列式、逆行列、連立方程式を解けること

#下ごしらえ
道のりが長いので今知ってる単語を理解しなおしてから超簡単に書いていきます。（ネットの線形代数について書いてあるものだいたいが行列式までで終わっているのがちょっと怖いからｗ）

##行列
###正方行列

n×nの行列、正方形の行列ですね。3×3の正方行列は

```math
\begin{pmatrix}
a & b & c \\
d & e & f \\
g & h & i
\end{pmatrix}
```

のようになります。

###転置行列
右上と左下を交換することです。紙をくるっと裏返すような感じかな...
交換するときには左上にtを付けたり、右上にTを付けたりします。

```math
A=
\begin{pmatrix}
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9
\end{pmatrix}

B=
\begin{pmatrix}
a & b & c \\
d & e & f 
\end{pmatrix}
```

```math
{}^t \! A = 
\begin{pmatrix}
1 & 4 & 7 \\
2 & 5 & 8 \\
3 & 6 & 9
\end{pmatrix}

{}^t \! B=
\begin{pmatrix}
a & d \\
b & e \\
c & f
\end{pmatrix}
```

###対角行列
これは初めて知りました。正方行列で左上から右下のライン（これを主対角線という）の成分になんでもいいから数字が入っていて、それ以外の成分は0となっている行列です。例えば

```math
\begin{pmatrix}
5 & 0 \\
0 & 3 
\end{pmatrix}
・
\begin{pmatrix}
-2 & 0 & 0 \\
0 & 4 & 0 \\
0 & 0 & 8
\end{pmatrix}
・
\begin{pmatrix}
1 & 0 & 0 & 0 \\
0 & -6 & 0 & 0 \\
0 & 0 & 0 & 0 \\
0 & 0 & 0 & -3
\end{pmatrix}
```

等があります。

###単位行列
スカラー行列とも言ったりするらしいです。対角行列の中で主対角線が全て1の行列です。3×3の単位行列は

```math
\begin{pmatrix}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{pmatrix}
```

そして全てのn×nの正方行列とn×nの単位行列をどっちから掛けてもn×nの正方行列になります。単位行列をE、正方行列をAとすると

```math
EA=AE=A
```

これは数字でいう1を表しています。
色々な数字の行列を見ていきましょう。


###０の行列

**零行列**と言います。すべてに０が入っている行列です。2×2の零行列は

```math
\begin{pmatrix}
0 & 0 \\
0 & 0 
\end{pmatrix}
```
零行列をOとすると

```math
OA=AO=O
```
となります。

###虚数の行列
つかわないけど面白いので載せておきます。
この2×2の行列はこんな感じです

```math
\begin{pmatrix}
0 & -1 \\
1 & 0 
\end{pmatrix}
```
この行列をIとすると

```math
I^2=-E
```
となります。
また、複素数の行列は

```math
Z = aE + bI = 
a
\begin{pmatrix}
1 & 0 \\
0 & 1 
\end{pmatrix}
 + b
\begin{pmatrix}
0 & -1 \\
1 & 0 
\end{pmatrix}
=
\begin{pmatrix}
a & -b \\
b & a 
\end{pmatrix}
```

となったりします。これらを使ってこねくり回してみると面白いですよ。
他に四元数/クォーターニオンの行列がありますが、それはパウリ行列などと調べてみてください。

##
NEM/mijinにおけるマルチシグのユースケースについての考察

#マルチシグとは？

仮想通貨におけるマルチシグの基本的な考え方は「送金時に複数個の秘密鍵を必要とする」ことです。この仕組みが意味することは、一つの鍵が盗難されたとしても出金されることはないということです。

[Multisig(マルチシグ)って何？ | ビットコインダンジョン](http://coinandpeace.hatenablog.com/entry/what_is_multisig)


信頼のおける場所にサービスとお金が集まった段階で最終決済をおこなうという意味で使用されているようです。
さらに発展させてこれを利用させることを考えてみましょう。マルチシグは単に盗難防止だけではなく、**トランザクションを自分で作るのは面倒くさいので、作成してくれる人に鍵を1個預けておく**ことが可能になります。

- ECサイト
- ブラウザ

こういったサービスに鍵を預けておくことで効力を発揮します。
また鍵の一つを**場所や時間に制限された環境下に置くことで本人確認の方法として利用する**こともできます。

- センサーが感知した場合のみ署名
- 制限時間内にパスコードを入力した場合のみ署名

そしてネットワーク上にプッシュされたトランザクションは最後に自分が最も信頼のおけるアプリから署名することで決済となります。

- nanoWallet
- NEM Pay(まだ開発中?)

NEMの場合はこのマルチシグ署名者の変更が実に容易で、マルチシグされたアカウントを権利物（コンテンツ）として扱うことで、譲渡・貸借などのユースケースにも簡単に使えます。また、トランザクションに独自トークンや暗号化メッセージを載せることもできるので、その効力はさらに強力です。トランザクション作成者にプログラムコードを記述させ、独自ポイントを発行し、手元スマホのボタン一つで実行・配布させることが可能です。

#ユースケース例

## 行政サービス
###転入から転出
住民AがB市に転入する場合を考える。
住民AがマルチシグCを作成し、Cのアドレスを役所Bに通知する。
役所BはアカウントCに対して、マルチシグを行い住民登録完了とする。
マルチシグCの秘密鍵を行政サービスシステムに登録しておく。
また、マルチシグCに対して市民トークンを配布しておく。

住民Aが転出する場合はマルチシグCからアカウントBの解除で対応する。
なお役所Bアカウントは公務員Dからマルチシグされており、人事異動などがあれば住民Aの転入・転出と同様に対応する。

住民Aが元アカウントを紛失した場合は、新規アカウントEを作成しマルチシグCに追加、その後アカウントAを解除する。
住民AがマルチシグCの秘密鍵を紛失した場合も同様、新規マルチシグFを作成し、秘密鍵を行政サービスシステムに再登録する。

###住民票取得
住民AがB市システムにアクセスし、住民票取得ボタンをクリックする。
B市サービスは、紐づけられたマルチシグCを特定し、そこから市民トークンを返却させるためのトランザクションを作成しNEM/mijin上にPUSHする。
住民Aが署名することでB市はAが住民であることを特定、マルチシグCに対して住民情報を暗号化してメッセージ送信する。

行政サービスシステムがインストールされた端末から、マルチシグCの秘密鍵を用いて住民情報を復号化する。
住民票のプリントアウトやその他サービスが求める要件に応じて、役所BからのトランザクションIDと共に住民情報を提供する。


## ECサイト

###商品紹介から商品購入まで
ユーザAはマルチシグBを作成し、ショップCのアカウントを追加する。
ユーザAはあらかじめショッピング用に使用する金額をマルチシグBに振り込んでおく。
また、ショップCは独自トークンをマルチシグBに送付しておく。
紹介者Dのコメントで商品に興味を持ったユーザAはリンクをクリックすることで、
マルチシグBから紹介者Dへのトークン送信トランザクションが生成される。
商品詳細を読んで気に入ったユーザAは購入ボタンをクリックして、
ショップCが送金トランザクションをNEMネットワーク上にPUSHする。
ユーザAは手元のNEMPayで金額を確認し署名（クリック）することで決済が完了する。
また、紹介者Dは貯まった独自トークンをショップCに送付することでXEMと交換できる。

## 物流
###追跡
荷物Aは出荷元Bから中継地Cを経由して目的地Dへ行くものとする。
荷物の移動については追跡監視アカウントEによってモニターされている。
まず、荷物Aを出荷元B、中継地Cによってマルチシグ化しておく。
出荷元Bセンサーは荷物Aが倉庫から離れたことを検知すると荷物AからシステムEに対し、トークン送信を行う。
中継地Cセンサーは荷物Aが接近したことを検知するとトークン送信の署名を行う。
システムEはトークンを受信し、マルチシグAから出荷元Bを解除し、新たに目的地Dを追加する。
出荷元Cセンサーは荷物Aが倉庫から離れたことを検知すると荷物AからトークンをシステムEに送信する。
以下同様。

(この投稿では、引き続きマルチシグのユースケースについて考えていこうと思います。)
【しずおかアプリ部】活動ログ　第44回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/ee800648-fa25-1829-20c3-bad9c2055d35.jpeg)

##■公式サイト##
[http://monolizm.com/shizuoka-app](http://monolizm.com/shizuoka-app)
「Slack」も利用しています。 shizuapp で検索し、ご参加ください。

##◾️参加申し込み##
しずおかアプリ部への参加申し込みは[こちら](https://shizuoka-app.connpass.com/)から

##■タイトル##
第４４回


##■開催日##
２０１７年９月１６日（土）　１６：００～１８：００


##■参加者##
１１名


##■活動内容（概要）##
・最近の話題の技術ニュース、告知
・部員さんプレゼン「Unityを使った３Ｄブロック崩しの作り方２」



##■活動内容（詳細）##

【実演・プレゼン】

**・最近の話題の技術ニュース、告知**
　・新iPhone
　・Androidの「ARCore」 
　・CEDECでの任天堂の講演の話題
　・CEDECでのUE4の話題
　・360度カメラ「THETA V」
　・[中学生の部員さんがScratchで作ったゲームが、Scratchの注目のプロジェクトに選ばれる！](https://scratch.mit.edu/)
<hr>

**・部員さんプレゼン「Unityを使った３Ｄブロック崩しの作り方２」**
　　　Unity初心者向けに3Dブロック崩しの作り方をプレゼン。

　　　前回はブロックとラケットと壁を表示し、ボールが跳ねてブロックを壊すという部分まで。
　　　前回の内容
　　　・ステージ配置
　　　・色を変える
　　　・動くボール
　　　・ラケットを動かす
　　　・消えるブロック
　　　・ブロックを手作業で並べる改造して

　　　　資料
　　　　　[Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で](https://qiita.com/JunShimura/items/cbb0db8087a5cc75735e)
　　　　　[【Unity】シーン表示上のシーンの向きに戸惑わない方法](http://qiita.com/yaju/items/f4829daeedd685888ef7)



　　　今回はゲームとして仕上げる作業を行った。
　　　内容
　　　・スコアの表示
　　　・ゲームマネージャークラスを作る
　　　・ブロックをスクリプトで配置
　　　・音を鳴らす

　　　![IMG_8086.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/c32e7e34-8e79-044c-4256-3f94195c02ff.jpeg)

　　　詳細
　　　・スコアの表示
　　　　uGUIのText機能を使ってスコアとハイスコアを表示する
　　　　スクリプトからスコアテキストをセットできるようにした

　　　・ゲームマネージャクラスを作る
　　　　ゲームの状態（クリアやゲームオーバーなど）や画面遷移を管理するクラスを作った。

　　　・ブロックをスクリプトで配置
　　　　前回は手動で配置していたので、
　　　　一旦ゲームをプレイするとブロックがなくなってしまっていた。
　　　　ブロックをプレハブ化して、スクリプト側で配置するようにした。

　　　・音を鳴らす
　　　　あたり判定があった時に音を鳴らすスクリプトを用意し、
　　　　壁、ブロック、ラケットにアタッチすることで、
　　　　他のスクリプトを修正しることなく、効果音を鳴らせるようにした。
　　　　BGM,効果音をつけることでゲームらしさが一層増した。


　　　資料
　　　　[Unity】索引とまとめ：「はじめてのUnity」のブロック崩しを改造しながら学ぶ - Qiita](http://qiita.com/yaju/items/b9f6ffbc1606a451ea9b)

<hr>

　　　![IMG_8083.JPG](https://qiita-image-store.s3.amazonaws.com/0/88105/deb5f87f-5643-04df-6aa8-313f738331cc.jpeg)


　　今回は、TEABREAKの時間も使って、フルにプレゼンと制作を行っていただきました。
　　Unityの基本的な機能の使い方、ゲームの作り方を学ぶのには最適な内容でした。
　　アプリ部の時間の都合上、各自がカスタマイズするところまではいけませんでしたが、
　　こういった機会から、Unityやゲーム制作に興味を持つ人が増えれば嬉しいですね。
Heroku CLIを使わないで、Spring BootアプリケーションをHerokuへデプロイする

## 公式のやり方
https://devcenter.heroku.com/articles/deploying-spring-boot-apps-to-heroku
Qiita内にもいくつか同様のやり方が載っているようです。

## Heroku CLIを使わない方法
Heroku CLIめんどくさい！とにかく早くデプロイしたい！っていうものぐさな方はこちら。
（Spring BootアプリケーションはGitHubとかに出来てる前提）
maven/gradleに適切な設定してれば、DBの初期化とかもされるはず（試してない）

1. Personal AppsのページからNew -> Create new appする。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/184997/896ef56b-461b-9a53-f86e-39133aac8dc0.png)

2. App nameに適当な名前を入力して、Create appボタンをクリックする。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/184997/a0b82c2f-07c1-c2c2-f759-ff394466b2b0.png)

3. Settingsをクリックして、Add buildpackボタンをクリックする。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/184997/468a4678-01e7-4381-dc46-fd708ad97413.png)

4. javaのアイコンをクリックして、Save changesボタンをクリックする。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/184997/768a60bc-4ea4-cae1-4dc5-57ee5bae93de.png)

5. Deployをクリックして、デプロイするアプリケーションを選択する。（ここではGitHubの自分のリポジトリを選択）選んだらconnectボタンをクリックする。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/184997/2e5fd693-c0b2-9b8b-398f-84f0db82b357.png)

6. Deploy Branchボタンをクリックする。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/184997/4b92ba08-9915-82f1-9d89-0cb868119b60.png)

7. Deployが終わったら、Viewボタンをクリックすると、アプリケーションが開けます。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/184997/8efcd5c0-0ffb-0125-dbe7-6bd57346329f.png)
Ruby文法の登竜門、Fizz_Buzz問題を解いてみよう！

#Fizz_Buzz問題とは
有名なプログラミング問題です。
1〜100までの整数をターミナルに表示させます。その際、「3の倍数」であればFizz、「5の倍数」であればBuzz、両方の倍数である「15の倍数」であればFizzBuzzと出力させるようにします。
#ソースコード
```
def fizz_buzz
    for num in 1 .. 100 do
    
        if num % 3 == 0 && num % 5 == 0
            puts "FizzBuzz"
                
        elsif num % 3 == 0
            puts "Fizz"
                
        elsif num % 5 == 0
            puts "Buzz"
                
        else 
            puts num
        end
        
    end
end

fizz_buzz

```
#ポイント
・for文で１から100までの整数を順番にnumへ代入させる
<font color="red"><b>・if文では最初の条件として「3の倍数かつ5の倍数の場合」を指定する</b></font>
　⇒「3の倍数かつ5の倍数の場合」よりも先に「5の倍数の場合」を指定すると、例えば15や30がどちらの条件にも合致してしまう
Firebase tips(Database rule .1)

# FIREBASE TIPS

## 1. Allow users to read everything and write everything.

```json:database.rule.json
{
  "rules": {
    ".read": true,
    ".write": true
  }
}
```

## 2. Allow users to read everything and write everything under user object.

```json:database.rule.json
{
  "rules": {
      "user" :{
        ".read": true,
        ".write": true
      }
  }
}
```

## 3. Allow users who is certificated to read everything and write under own($uid) object.
```json:database.rule.json
{
  "rules": {
      "user" :{
        "$uid": {
            ".write": "$uid === auth.uid",
            ".read": "auth != null"
        }
      }
  }
}
```

- TEST:Read without certification.
![test1.png](https://qiita-image-store.s3.amazonaws.com/0/199460/bed3bf44-e3d3-b045-c277-3829f9072dd9.png)

- TEST:Read with certification.
![test2.png](https://qiita-image-store.s3.amazonaws.com/0/199460/925d4642-6119-e186-763c-d02584aae5f3.png)

- TEST:Write with other certification.
![test3.png](https://qiita-image-store.s3.amazonaws.com/0/199460/6d4c0deb-76ff-0035-dc40-9239fb69cb14.png)

- TEST:Write with certification.
![test4.png](https://qiita-image-store.s3.amazonaws.com/0/199460/8561947b-ced7-d6cc-78bf-706c98f8381d.png)
vue-routerで動的リンクを生成する

自分用のメモ。随時更新。

# 前提
- [vue-cli](https://github.com/vuejs/vue-cli)でのプロジェクト作成
（説明のため。もちろんリンクの生成自体はcliなしでできます）

# VueRouterのルーターインスタンス作成
```index.js
import Router from 'vue-router'
export default new Router({
  routes: [
    {       
      path: '/event/:id', // 動的セグメントをコロン:で設定
      name: 'Event',
      components: {
        // 複数のコンポーネントを指定
      }
    },
  ]
})
```

# リンク生成
`vue-router`を使用してのリンク生成は幾つか方法がある。
## router-linkタグを使用する
### `/event/1234`のリンク

```Hello.vue
<router-link v-bind:to="{ name : 'Event', params : { id: event.id }}"></router-link>

// event.id = 1234
```

### `/event?q=hoge`のリンク
```Hello.vue
<router-link v-bind:to="{ path: 'event', query: { q: 'hoge'}}"></router-link>
```

## JavaScriptで記述する
`vue-cli`で生成されるプロジェクトに追加したコンポーネントは、自動的に`main.js`に記述された`Vue`インスタンスの内部に配置されるので、`this.$router.push()`を呼ぶことで遷移できる。もちろん`import`してもいい。

```Hello.vue
<script>
  router.push({ name: 'Event' })
</script>
```
router-linkのときと同じように、パラメータ・クエリを渡すこともできる

```Hello.vue
<script>
  router.push({ name: 'Event', params: { id: 1234 } })
  router.push({ path: 'event', query: { q: 'hoge' } })
</script>
```

# 参考
- https://router.vuejs.org/ja/essentials/dynamic-matching.html
- https://router.vuejs.org/ja/api/router-link.html
- https://router.vuejs.org/ja/essentials/navigation.html
ATOM導入メモ

#ATOMのインストール

##環境
Windows10　64bit

##ダウンロード
https://atom.io/

##インストールフォルダ
AtomはC:\ProgramFilesには保存されない。

```bash:フォルダ
C:\ユーザー\[ユーザー名]\AppData\Local\atom\app-1.19.7\atom.exe
```
このショートカットを作成しておけばOK。

格納場所が気になったとしてもアップロード等を考えると誤作動の原因となるため、詳しくない間はインストール先を変更することは控えた方が良さそう。

##日本語化の手順

- メニューバーから[File] →　[Settings]をクリック。
- 表示された左側リストの中から、+ Installを選択する。
- +Install Packagesへjapaneseと入力し、Packagesをクリック（この部分の動作が重いです）
- 表示されたらjapanese-menuをインストールして終了

##フォントの追加
プログラミング用に0とOが区別しやすくなっていたり、プログラミング用に作られたフォント
https://github.com/edihbrandon/RictyDiminished

インストールしたら、フォルダを解凍してRictyDiminishedDiscord-Regular.ttfをクリック。
開いたウィンドウからインストールを行う。

##フォントの設定
[ファイル]→[環境設定]をクリック。
エディタ設定のフォントにRicty Diminished Discordと入力

Windows10の場合：
[コントロールパネル]→[デスクトップのカスタマイズ]→[フォント]
から、Ricty Diminishedなのか、Rictry Diminished Discordなのかを確認する。
名称が違うと読み込まれず、明朝体の書式となる。
変更が完了すると、対応する書式になる。

##毎回出てくるWelcomeGideを消す
チェックを外すだけ
チェックしても毎回表示されるので、再インストールを試したらできた。

##動作が重い場合に試したこと
.atom\compile-cacheフォルダと.atom\storageフォルダ内のファイルやフォルダを削除した。
デスクトップにリンクしていたフォルダごと全て削除。
WelcomeGideを非表示にした。 

####重かった原因が判明
　　最初にインストールし、その後アンインストールした。
　　その状態で、.AtomフォルダやAppDataフォルダにAtomの残骸が残っていた。
　　その後再度インストールした時に不具合が出たものと考えられる。
　　
　　対策：.Atomフォルダの削除とAppData内のatomフォルダを削除
　　結果：非常に軽くなった
Rails+Postgresql9.X+partition対応の実装時考慮

# 前提

Rails 4.2.6
ActiveRecord 4.2.6
activerecord-import 0.15.0
paranoia 2.1.5
PostgreSQL 9.5
※古くてごめんなさい

# 個人的な結論
よほどの事情がなければRailsのアプリケーションでDB(PostgreSQL前提)のpartitionは切らないほうが良いです。
どうしても切らなければならない場合、CRUD全ての処理で考慮が必要になります。
そもそも億件超えるような要件であればRails以外を選択する、DBはAurora検討するなど、無理やり頑張らないほうが良いと思いました。

# CRUD各処理における実装考慮点

以下は考慮点なので、実装例までは掲載していません。
細かい実装は要件しだいなので、載せるのが厳しいかと思ってのことです。

## find/find_by/where
一番オーソドックスなパターン
各検索メソッドの前にパーティションキーを充てるのみで対応可能

```ruby:OK
User.where(partition_key: value).find(1)
User.where(partition_key: value).find_by(id: 1)
User.where(partition_key: value, id: 1).first
```
## build

※後で追記したいです

## destroy/destroy_all(paranoia前提)

初めに結論ですが、以下のメソッドにパッチを充てないと対応できません。
※もしくはparanoiaにパッチ充てるか
ActiveRecord::Persistence.ClassMethods#update_columns

例えば以下のように記載しても対応されません。

```ruby:NG
user = User.where(partition_key: value).find(1)
user.destroy

users = User.where(partition_key: value, name: '田中')
users.destroy_all
```

実装を追うとわかるのですが、updateが実行される前に必ずunscopeされますし、何よりActiveRecordがupdate時にはサロゲートキーしかレコード条件に当ててくれません。

```ruby:ActiveRecord/Persistence.ClassMethods#update_columns
    def update_columns(attributes)
      raise ActiveRecordError, "cannot update a new record" if new_record?
      raise ActiveRecordError, "cannot update a destroyed record" if destroyed?

      attributes.each_key do |key|
        verify_readonly_attribute(key.to_s)
      end

      updated_count = self.class.unscoped.where(self.class.primary_key => id).update_all(attributes)

      attributes.each do |k, v|
        raw_write_attribute(k, v)
      end

      updated_count == 1
    end
```

## delete（使っていないので未検証・対応は必須）

物理削除実装していないのでわかりませんが、たぶんこちらもサロゲートキーしか当てていないはずなので、パッチが必要になると思います。

## joins/eager_load

join先テーブルのパーティションキーをscopeに含めれば対応完了です。

## save

以下参照
https://qiita.com/ya-mada/items/399d26975a276111bd3e

## update

update_columns同様unscopedされてた上でidのみを当てているため、defult scopeも無意味です。
したがってパッチを充てないと厳しいです。

```ruby:ActiveRecord/Relation#_update_record
    def _update_record(values, id, id_was) # :nodoc:
      substitutes, binds = substitute_values values

      scope = @klass.unscoped

      if @klass.finder_needs_type_condition?
        scope.unscope!(where: @klass.inheritance_column)
      end

      relation = scope.where(@klass.primary_key => (id_was || id))
      bvs = binds + relation.bind_values
      um = relation
        .arel
        .compile_update(substitutes, @klass.primary_key)

      @klass.connection.update(
        um,
        'SQL',
        bvs,
      )
    end
```


## bulk insert(active record import)

基本的に考慮は不要です。
ただし、公式ページにある以下の例、has_manyのパターンを一括でimportするオプションは使えません。
背景としては、recursiveも結局RETURNINGに依存している為となります。
※partitionを切ったテーブルではRETURNINGを使えません。

```ruby:import
Book.import books, recursive: true
```

# Postgresql10.Xについて

partitionの実装方式変っちゃいます。  
今回作りこんだ処理でパーティションキーが適切に当たるかを検証したいです。
twig extendでif文は使えないので三項演算子を使う




ログイン可否でレイアウトを分けたいが
if文の分岐では500エラーが出てしまう。
三項演算子を使うと上手くいった。

間違ったコード

```ruby:sample.twig
{% if abc() %}
  {% extends 'twig/test1.twig' %}
{% else %}
  {% extends 'twig/test2.twig' %}
{% endif %}
（後略）
```

500エラー文
Twig_Error_Syntax: "An exception has been thrown during the compilation of a template ("Node "1" does not exist for Node "Twig_Node".") in "今いるURL"."[Previous] LogicException: "Node "1" does not exist for Node "Twig_Node"."


上手くいったコード

```ruby:qiita.rb
{% extends abc() ? " twig/test1.twig " : " twig/test2.twig " %}
```

正常に表示される。


以下のURLを参考にif文ではなく三項演算子を使うとうまくいった

参考URL
https://github.com/symfony-japan/twig-docs-ja/blob/master/recipes.rst
WAF（WebApplicationFirewall）比較

# 書いた理由

+ WAF導入にあたり、各社のWAF製品（主に価格）を比較しました
+ 比較日：2017/5/31

# WAFとは？

+ クラウド型のWAFとレンタルサーバーの機能としてのWAFがあります
+ クラウド型で代表的な3サービスを比較し、レンタルサーバーでも比較しました
+ この他にSiteGuardが有名です
    + SiteGuardはライセンスの他にサーバー代がかかるので比較から除外しました
+ AWS WAFは比較対象としませんでした

## クラウド型WAF

名称|Incapsula（代理店）|Incapsula（直販）|攻撃遮断くん（CSC）|Scutum
------|------|------|------|------
初期費用|60万|0|20万|20万
月額／年額|188万／年|$59/一サイト|22万／月|21万／月
年間トータル|248万|$7,080（10サイトと仮定|284万|272万
SSL証明書|無料|無料|無料だが3ヶ月毎に入替え。一月で10件超えるとオプション料金がかかる|無料だが3ヶ月毎に入替え
FQDN数|11|ドメインで増えていく|無限|10
帯域|50Mbps|5Mbps|100Mbps|50Mbps
ポイント|SSL証明書の更新が楽|英語|サイト数の増加に耐えられる|最安

## レンタルサーバー型WAF

名前|wadax|さくらのレンタルサーバー|シックスコア|Xserver
------|------|------|------|------
プラン名|typeG|スタンダード|s3|x10
初期|3,204円|1,029円|6,480円|維持
基本|2,808円|515円|6,600円|1000円（年契約）
WAF会社|SiteGuard|SiteGuard|不明|なし
WAF月額|432円|0|0|0
ドメイン|20個|0個|25個|無制限
MySQL|20個|0個|15個|50個
ポイント|セキュリティ対策は最強|とりあえず簡易版|XSeverと同じ運営会社|現状
【RaspberryPi】RTC DS1307 導入方法まとめ

# RaspberryPi + RTC 導入方法まとめ

RaspberryPi3Bの時間が起動時毎回おかしいのでRTC(リアルタイムクロック) を導入しました。
スタンドアロン状態でセンサから値をMysqlに取り込む装置を作っていたところ、時刻が大変なことになっていました。
なのでとりあえずRTCを導入してみました。 

使用機器
- RaspberryPi3B
- RTC DS1307（ピン付きの完成品）

コイン電池(CR1220)が必要。
i2cで通信するのでRaspberryPiからの制御が容易。

### はじめに注意すること

- NTP,fake-hwclockと共存させようとすると上手く動かない（解決済み）
- rc.localがデフォルトではうまく動作しない（解決済み）

### 導入方法

電池をDS1307に入れてRaspberryPiのIOに挿してある前提で進めます。

また必要であれば

```
$ sudo raspi-config
```
からi2cを有効化しておいて下さい。


【1】必要なツールをインストール

```
$ sudo apt-get install i2c-tools // 制御に使用
$ sudo apt-get install ntpdate   // ntpクライアント時刻設定に使用 
```

【2】/etc/modulesに「i2c-dev」と「rtc-ds1307」を追加

```
$ sudo echo i2c-dev >> /etc/modules
$ sudo echo rtc-ds1307 >> /etc/modules
```

【3】接続されたアドレスを確認（私の環境では0x68でした。）

```
$ sudo i2cdetect -y 1
```

【4】次は管理者から実行

```
# modprobe rtc-ds1307
# echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
# i2cdetect -y 1
```
この時点でアドレスが変わっていると、ちゃんとシステムの管理下に置かれていることになります。

【5】NTPとfake-hwclockの停止

```
$ sudo apt-get install chkconfig
$ sudo chkconfig ntp off
$ sudo apt-get remove fake-hwclock
$ sudo dpkg --purge fake-hwclock
```

【6】起動スクリプトの修正

/etc/rc.local に以下の内容を追加
ちなみに起動時のrc.localは管理者権限で実行されるのでsudoは必要ありません。

```/etc/rc.local

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

ntpdate -v ntp.nict.jp

if  [ $? = 0 ]; then
  hwclock -w # システムクロック => RTC
else
  hwclock -s # システムクロック <= RTC
fi

```

【７】rc.localの有効化

そのままではrc.localが上手く動作しません。

```
$ sudo raspi-config
```

から
"Wait for Network at Boot"を選択し、
"Slow Wait for network connection before completing boot"を選択して下さい。

これで上手く動くはずです。


### 参考URL
http://my-web-site.iobb.net/~yuki/2016-11/raspberry-pi/rtc/
http://my-web-site.iobb.net/~yuki/2016-11/raspberry-pi/rtc-ok/
https://qiita.com/nuwaa/items/298ada62c4209ea7f9ca
http://www.pentacreation.com/blog/2016/12/161209.html
Xcode 9でも⌘(コマンド) + クリックで定義に飛びたい

Appleメニュー > Preferences > Navigation > Command-click on Code を Jump To Definition に変更。
![170921-0002.png](https://qiita-image-store.s3.amazonaws.com/0/43078/31193aff-f52b-17a3-c100-8d66c4f36065.png)
SQL Serverベンチマーク

#有用なリンク先のメモ
##SQL ServerのI/Oの基礎
https://msdn.microsoft.com/ja-jp/library/ms191475(v=sql.105).aspx
https://msdn.microsoft.com/ja-jp/library/aa337560(v=sql.105).aspx

##SQLIOSIM
http://blog.engineer-memo.com/2012/05/17/sqliosim-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%82%B9%E3%83%88%E3%83%AC%E3%82%B9%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E5%AE%9F%E6%96%BD/
http://sqlazure.jp/r/sql-server/261/
https://support.microsoft.com/ja-jp/help/231619/how-to-use-the-sqliosim-utility-to-simulate-sql-server-activity-on-a-d

試した物を随時追記していくつもりです。
Windows10に検証環境を用意する

# 概要
自宅で使用しているWindows10のリソースが余っているので検証(学習)環境を用意することにした。

### コンピュータ環境
|リソース     | スペック                     |
|:----------:|:----------------------------:|
| CPU        | Intel Core i7-7700 @ 3.60GHz | 
| RAM        | 32.0 GB                      |
| OS version | Windows10 home (x64)         |

### 検証環境の用途
LPIC取得のため、Redhat系およびdebian系Linuxの実行環境として利用する。

### 検証環境の選定
検証環境としてトレンドのDockerを採用したかったが、Windows10+DockerをするにはHyper-Vが利用できなければいけなかったため断念。

|  | Vmware Workstation Player  | Oracle VirtualBox | Hyper-v |
|:-:|:-:|:-:| :-:|
| 知名度 | ○ | ○ | △ |
| スナップショット作成機能 | × | ○ | ○ |
| 仮想スイッチ | ○ | ○ | ○ |
| サポート | △ | × | ○ |
| 有償性 | フリー[^1] | フリー | フリー [^2] |


# 注釈
[^1]: VMware Workstation Player Proを利用する場合はライセンスの購入が必要
[^2]: Windows Pro エディション以上で利用可能
rmakdownのchildは単数形だけど一人じゃない

#rmarkdownとは

Rでデータ解析した結果(プロットなど)に、その説明や解釈をドキュメントとして加えたhtml, pdf, docxなどを出力できるスゴい奴。

詳しい説明は日本語でもいっぱいあります([kazutanさんのとか](https://kazutan.github.io/kazutanR/Rmd_intro.html#r_markdownとは))

#レポートが長くなった時に

ファイルを分割したくなりますよね。

そんなあなたに`child`引数。

\```{r, child = 'ichiro.Rmd'}

\```

とすると、親のRmdファイルの任意の場所にichiro.Rmdを挿入できます。
childはmdファイルでもOK

#もっとレポートが長くなった時に

もっとファイルを分割したくなりますよね。


\```{r, child = 'ichiro.Rmd'}

\```

\```{r, child = 'jiro.Rmd'}

\```


みたいなコードを何度も繰り返すのか……？
ムダに複数行使うし、順番変えにくいし……。

英単語のchildは単数形ですが、引数のchildは一人に限定しません。

\```{r, child = c('ichiro.Rmd', 'jiro.Rmd', 'saburo.Rmd', 'shiro.Rmd')}

\```

なんてことが可能なのです。
これなら、`c()`の中でRmdの順番を変えるなり、足すなり引くなり自由自在。

直前のチャンクで`x <- dir(pattern = '\\.Rmd$')`なんてしえおけばディレクトリ内にあるRmdファイルを一辺に合体なんてことも可能。
これはbookdownを使うことでも可能(また[kazutanさんの説明参照](https://kazutan.github.io/JapanR2016/JapanR2016.html#/))なのだけれど、スライド作りには使えないんだよなあ。
revealjsを使いたいので、こんな方法を考えてみました。
個人的React周りベストプラクティス② - 準備編

#前の記事
前回：[個人的React周りベストプラクティス① - 構成編](https://qiita.com/enshi/items/e6ad8c91168cfe8a88da)

#nvm node.js npmインストール
##:one: nvmインストール
gitからnvmをclone

```shell-session
$ git clone git://github.com/creationix/nvm.git ~/.nvm
$ source ~/.nvm/nvm.sh
```
ターミナル立ち上げ時にnvmを読み込むように~/.bash_profileに以下の内容を記述

```vim:~/.bash_profile
if [[ -s ~/.nvm/nvm.sh ]];
 then source ~/.nvm/nvm.sh
fi
```

##:two: node.jsインストール
Lambdaで使用できるnode.jsのバージョンの中で最新のバージョンにする（以下の場合は6.10）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156086/9611cb78-c3bd-fa57-4c04-73cf31a67c06.png)


インストール可能なnode.jsのバージョンは「nvm ls-remote」で確認できる

```shell-session
$ nvm ls-remote
```

```shell-session
$ nvm install v6.10.0
$ nvm alias default v6.10.0
$ node -v
v6.10.0
```
##:three: npmアップデート
node.jsがインストールされた時にnpmもインストールされているはず
アップデートしておく

```shell-session
$ npm install -g npm
```
#Serverless Framework
Lambda関数やそれにつながるイベント等をローカルからアップロードできるもの
パッケージと関数をzipで固めて→アップロードして→Api Gatewayと紐付けてといった手間をなくせる
##:one: インストール
```shell-session
$ npm install serverless -g
```

#AWS CLI
AWSに対してコマンド操作ができるようにするもの
上記Serverless Frameworkの中で使用しているので必要

##:one: インストール
```shell-session
$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
$ python get-pip.py
$ pip install awscli
```

##:two: IAMユーザ追加
AWSのIAMからユーザを作成する
管理ポリシーとして「AdministratorAccess」を指定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156086/f1b44047-2b5f-dad7-6d44-b3a5e39cf7cd.png)

##:three: IAMの資格情報を登録
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156086/dd0c3bb4-83fe-8d5e-1f97-d169c4dd81c8.png)

```shell-session
$ aws configure
AWS Access Key ID [None]: 上記画像のアクセスキーIDの部分
AWS Secret Access Key [None]: 上記画像のシークレットアクセスキーの部分
Default region name [None]: ap-northeast-1
Default output format [None]: 未入力でENTER
```

#create-react-app
React.jsの開発環境を簡単に作れるもの
webpackやbabelの設定をする必要がなくなる

##:one: インストール
```shell-session
$ npm install -g create-react-app
```

#次の記事
[個人的React周りベストプラクティス③ - React・Reduxパッケージ・ミドルウェア編](https://qiita.com/enshi/items/3802f48cbcb05d028738)
cap deploy で git remote update に失敗したときにやった対応

CapistranoでRailsアプリをデプロイする際に、適当に `test` とか `tmp` とかの一時的なブランチ名を使いまわしていて、 `git remote update` に失敗していたので、対応した方法をメモ。

とりあえず対応で、ちゃんと原因とかは調べきれていないです。

あくまで自分がやったことをメモしてるだけ。

# 結論

デプロイ先の `/repo/refs/heads` 内になるディレクトリを削除する

# 環境

- Capistrano3.2
- リモートサーバは AWS(AmazonLinux)

# 実際の手順

1. リモートサーバにログインして、デプロイ先ディレクトリに移動
2. `/repo/refs/heads` の中を確認
3. 更新に失敗してるブランチと同じ名前のディレクトリがあったので `rm -rf`
4. デプロイを再実行 -> 成功
デバッグやブログ記事に便利。iPhoneの操作を動画撮影する方法と便利テクニック

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

従来、iOSの画面を動画撮影するにはmacOSのQuickTime Playerを使う必要がありました。**iOS 11ではiPhone単体で画面収録が可能になります**。


<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">iOS 11で画面を録画した動画がこちら。<br>これまではパソコンを使ってやっていた作業がiPhoneだけで完結するのは便利。<a href="https://t.co/o6i30ZoRko">https://t.co/o6i30ZoRko</a><a href="https://twitter.com/hashtag/iPhone?src=hash">#iPhone</a> <a href="https://twitter.com/hashtag/iOS11?src=hash">#iOS11</a> <a href="https://t.co/3tBk37eynq">pic.twitter.com/3tBk37eynq</a></p>&mdash; 鹿野壮@WPJでiOSアプリ記事 (@tonkotsuboy_com) <a href="https://twitter.com/tonkotsuboy_com/status/910726790548561920">2017年9月21日</a></blockquote>

次のようなシーンで役立つでしょう。

- ウェブサイトやアプリの開発中のバグを録画してチームでシェアする
- 画面操作方法を技術記事やSNSでシェアする
- アプリゲームのプレイ動画を撮影してYouTubeにアップする（著作権にご注意ください）
- iPhoneの操作方法がわからない親に対して、操作方法を説明した動画をLINEで送信する

本エントリーでは、画面収録の設定方法と覚えておくと便利なテクニックを紹介します。

# 設定方法

① [設定]→[コントロールセンター]→[コントロールセンターをカスタマイズ]より、コントロールセンターのカスタマイズ画面を開く

② [コントロールを追加]より[画面収録]を選択し、[含める]に移動する

<img width="375" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/67884/186f1981-ae21-f593-3915-9a3075b7ea93.jpeg">

③ コントロールセンターに画面収録用ボタンが現れる

<img width="375" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/67884/42ec5367-9ca6-1aa0-4123-8c7a95bb0191.jpeg">


# 収録方法
コントロールセンターの画面収録ボタンをタップすると、画面の録画が始まります。停止する場合は、再度同じボタンをクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/e1a40dde-f7e9-fc6a-26c3-2e6bbd0dd55c.png)

収録した動画は、写真アプリに保存されます。動画をタップすると、正しく画面上の操作が収録されているのがわかります。

<iframe width="560" height="315" src="https://www.youtube.com/embed/tebMYEcEYdQ" frameborder="0" allowfullscreen></iframe>

## 音声ありでの収録も可能
収録ボタンを強くタップすることで、撮影時のマイク設定が可能になります。音声ありでの画面収録に役立つでしょう。

<img width="375" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/67884/e2c91d3a-0b3c-e5ef-d3b0-abe1a67ac686.png">

# 撮影終了部分をトリミングするのがベター
撮影終了時はコントロールセンターを開いてボタンをタップするのですが、**その部分はトリミングしておくと不要な操作画面を見せずに済みます**。

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">iOS 11で画面収録した場合、撮影終了時の録画ボタンをタップする動作まで録画される。<br><br>写真アプリを使ってトリミングするのがベター。<br><br>→ iPhoneの操作を動画撮影する方法と便利テクニック<a href="https://t.co/o6i30ZoRko">https://t.co/o6i30ZoRko</a><a href="https://twitter.com/hashtag/iPhone?src=hash">#iPhone</a> <a href="https://t.co/KHgoSrz72G">pic.twitter.com/KHgoSrz72G</a></p>&mdash; 鹿野壮@WPJでiOSアプリ記事 (@tonkotsuboy_com) <a href="https://twitter.com/tonkotsuboy_com/status/910720743565963264">2017年9月21日</a></blockquote>

# SNSへのアップについて
写真アプリの画面左下のシェアボタンより、YouTube、Facebook、LINE、Instagram等への動画投稿が可能です。

<img width="375" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/67884/771f2a9c-63c6-8586-aba0-86abe8ba74a6.png">

Twitterへのアップは、公式アプリから可能です。

<img width="375" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/67884/dc0f2a8b-1963-6c8c-7c23-49ce779ff740.jpeg">

よきiOSライフを。
bash > 10秒おきにランダムにdata/*.mdのtitleを表示する

```txt:動作環境
Ubuntu 14.04 LTS
```

### 参考

[ファイルの行をsort -Rでランダムに並び替える](https://qiita.com/ariarijp/items/7a9da60066cd0756f206)


### 試した

https://github.com/yasokada/TechEnglish_170903

```bash:shuffle_bash_170921_exec 
#!/usr/bin/env bash
ls data/*.md | sort -R | head -n 1 | xargs grep title
```

データを取得。

```
$ git clone https://github.com/yasokada/TechEnglish_170903.git
```

dataディレクトリが見える場所に移動。

```
$ cd TechEnglish_170903
```

10秒おきに表示する。

```
$ watch -n 10 bash shuffle_bash_170921_exec 
```

以下のような表示が10秒おきに切り替わる。

```txt:run
Every 10.0s: bash shuffle_bash_170921_exec              Wed Sep 20 20:49:20 2017

title: "before making OSSD output connections and [interfacing the EZ-SCREEN LS
to the machine]"

```

技術英語の復習として、とりあえずランダムには表示できる。

### TODO

- Recently updated
- Touch Barに表示
    - Touch Bar付きMacbook Proは持っていない
- PowerShell? for Windows
PHPにおけるPOST要素数制限の挙動について

Wildfly利用にあたって、1回のPOST処理内に含まれる要素数(input の数、といえばよいか？）について古いJBOSSと異なり制約があることを今更知った。
そういえばPHPでも同じような話があったよな、と思い少し調べてみた。

POSTをenctype　defaultで実行すると、POSTの実体はGETと同じようにkey1=value&key2=value のような＆で区切られたパラメータとして扱われる。
結構前から各処理系においてDoS対策などのためにこの要素数の上限が設定されている。

PHPにおいてはphp.ini内の"max_input_vars"で要素数制限ができる。
defaultは1000。

で、今回のポイント。
JAVAなどで組んでいたシステムではこのパラメータ数を回避する策として、enctypeをmultipart/form-data として、boundaryで区切られているがデータとしては１件として送るような対策を打った。
ところが、PHPの場合はこれが機能しない。

PHPにおいてはPOSTされたデータは $_POST スーパーグローバル変数に格納されるのだが、ご丁寧にmultipart/form-dataの場合でも内容をちゃんと解析して連想配列として納してくれるのだ。

このためmultipartとして1000を超える要素を送っても、PHPで処理をしようとするときにはすでに1000要素まで切り詰められたものしか処理できないということになる。

回避策としては普通にPOSTするのではなくストリームとして処理するようにする必要があるようである。　うーむ。
iOS11(GA版)におけるScreen Recording(スクリーンキャプチャ)と動画再生の関係まとめ

# iOS 11で変わったこと
OSのNative機能としてScreen Recording(スクリーンキャプチャ)機能が追加されました。iPhone端末の画面上で表示している映像や音声を、ビデオ(動画)として録画, 保存できます。
ここでは、動画コンテンツを配信している事業者さん向けに、主にコンテンツのセキュリティをどのように担保するのかといった観点で記述します。

既にAndroid で導入されているScreen Recording APIに似ていますが、使い勝手がちょっと違うのでまとめてみました。

- [AndroidでのScreen Recording制御方法についてはこちら](https://qiita.com/kozyty@github/items/2f67e207e63d85df7d74)

# テスト結果と対策方法
## 音声収録
- ふつうに画面中の音声も綺麗に録音できる。Preview 版では「画面中の音は録音できず、外部マイクから録音できる」仕様だった認識だったが、GA版で変わった？
- コントロールセンターからキャプチャボタンを3D Touchで押すと、外部マイク入力のオンオフが選べる。

## DRM保護
- Native App Player で Fairplay DRM 保護された動画を「再生中に」キャプチャ開始すると、 Native Player が終了してから録画が開始する。つまり Player が active になってるときは、自動的にキャプチャが一時停止されている。
- キャプチャを「開始してから」 Native Player を active にして再生を開始すると、録画は一時停止せずに映像はブラックアウトする。音声は録音される模様？
- App でも Web でも non DRM であれば問答無用でキャプチャできる。

## App側での保護
- App であればキャプチャ状態のステータスを取得できるので、以下を用いて対策をとることは可能。
 - [isCaptured - UIScreen | Apple Developer Documentation](https://developer.apple.com/documentation/uikit/uiscreen/2921651-iscaptured)
 - [iOS11から搭載されるスクリーンレコーディングでの録画を検知する方法](https://qiita.com/kazuhiro4949/items/e5f5d86b1b18ecac34ee)

# 結論
## 対策方法
- iOS 11むけに動画コンテンツの権利を保護するには Player をアプリ化する必要あり。
- そのうえで DRM 保護、もしくはキャプチャを抑止するための上記ロジックを実装する必要あり。

## 課題
- DRM 保護も上記ロジックも使えない Mobile Web での動画再生は、今のところ保護する方法なし？（なにかワークアラウンドがあれば情報求む…）
Microsoft Wordで様式（罫線）が指定された文書をLaTeXで作成する方法

## 背景

大学に勤務していると、折々に以下のような「研究業績調書」なるものを用意する必要が生じます。

|論文名称|著者|発行年月日|雑誌名|概要|
|:------|:--|:--------|:----|:---|
|1. くじらの卵を求めて|○△□|9999年9月|大海原の夢社|くじらの卵についての探求記録について述べた一般向け書籍．|
|2. くじらの卵の発見|○△□|9999年9月|全宇宙夢想的生物学会誌, Vol.99, No.99, pp.2999-3000|くじらの卵についての記述論文．|

ところが、某大学の指定様式は、とても面倒な様式になっていました。

1. Microsoft Word で縦方向の罫線だけが指定されていて、横方向の罫線が存在しませんでした。そのため、各頁の2番目以後の項目については、手動で改行を挿入して垂直方向の開始位置を揃える必要がありました。
1. 論文名称の冒頭に 1,2,... と手動でナンバリングしなければならない。

特に垂直方向の位置を揃える作業に悶絶[^msword]したので、Microsoft Wordで様式が指定された文書をLaTeXで記述する方法を調べてみました。結論としては、[科研費LaTeX](http://osksn2.hep.sci.osaka-u.ac.jp/~taku/kakenhiLaTeX/)で用いられている方法と良く似ているのですが、以下のような手順になりました。

1. Microsoft Word文書をEPSファイルに変換[^reason]
1. EPSファイルをwallpaper.styを使って、LaTeX文書の背景に貼る。
1. 適当に場所を調整してLaTeX文書を作成する。今回の様式の場合はlongtable環境が適切。

[^msword]: Microsoft Wordに熟練されている方であれば、様式を壊さずに横方向罫線を追加して対応できたのだろうと思うのですが、筆者にはできませんでした‥‥。

[^reason]: 実際には、Microsoft Word文書をEPSファイルに変換する方法を忘れていて右往左往したので、この文書は備忘のために作成しました。

## Microsoft Word文書をEPSファイルに変換

最初に、何らかの方法でMicrosoft Word文書をPDFファイルに変換します。筆者の利用しているOffice2010では、「ファイル」→「名前をつけて保存」→「ファイルの種類」でPDFを選択、という手順で変換できました。

次に、pdfcropコマンドを使って、PDFファイルの余白部分を削除します。

```shell-session
pdfcrop given-msword-based.pdf mywallpaper.pdf
```

次に、pdftopsコマンドを使って、PDFファイルをEPSファイルに変換します。

```shell-session
pdftops -eps mywallpaper.pdf mywallpaper.eps
```

なお、pdfcropコマンドおよびpdftopsコマンドは、Debian GNU/Linuxでは、texlive-extra-utilsパッケージに含まれていますので、適宜にインストールしておきます。

## EPSファイルの様式を背景とするLaTeX文書の作成

様式中のテキストの入るべき場所と、LaTeXが想定しているテキスト範囲を適当に一致させた文書を作成する必要があります。今回は背景として貼り込む様式の最外周の罫線を、そのままテキスト範囲と一致させました。サンプルは、以下の通りです[^bibtex]。

[^bibtex]: 実際には、自分の業績リストはBibTeX形式のファイルで管理しています。そのBibTeX形式のファイルから、サンプルを自動生成するスクリプトを用意して対応しました。

```tex:sample.tex
\documentclass[9pt]{jsarticle}

% 今回は背景として貼り込む様式の最外周の罫線を、そのままテキスト範囲と一致させた。
\addtolength{\topmargin}{-5.5mm}
\addtolength{\textheight}{25mm}
\addtolength{\fullwidth}{25mm}
\setlength{\oddsidemargin}{-12mm}

\usepackage[dvipdfmx]{graphicx}
\usepackage{wallpaper}
\usepackage{longtable}
\usepackage[normalem]{ulem}

% 今回は複数ページからなる書類で、各ページにページ番号を付番しなければならない様式。
% 以下は、そのページ番号を指定箇所に出力させるための独自のページスタイルの定義。
\makeatletter
\def\ps@myheadings{%
  \ps@headings
  \def\@evenfoot{}%
  \def\@oddfoot{}%
  \def\@evenhead{%
    \if@mparswitch \hss \fi%
    \hbox to \fullwidth{No.~\thepage\hfil}%
    \if@mparswitch\else \hss \fi}%
  \def\@oddhead{%
    \hbox to \fullwidth{\hfil No.~\thepage}\hss}%
}
\makeatother
\pagestyle{myheadings}

% 業績をナンバリングするためのカウンタの定義
\newcounter{journal}
\setcounter{journal}{0}
\renewcommand{\thejournal}[0]{\stepcounter{journal}\arabic{journal}.}

\begin{document}
\CenterWallPaper{0.9}{mywallpaper.eps}
\renewcommand\arraystretch{1.5}
\begin{longtable}{p{4mm}@{~}p{35mm}p{14mm}p{20mm}p{36mm}p{72mm}}
\rule[0mm]{0mm}{32mm} \\% 様式の固定部分をスキップ．
\endhead
\thejournal
   & くじらの卵を求めて
   & ○△□
   & 9999年9月
   & 大海原の夢社
   & くじらの卵についての探求記録について述べた一般向け書籍．\\
\thejournal
   & くじらの卵の発見
   & ○△□
   & 9999年9月
   & 全宇宙夢想的生物学会誌, Vol.~99, No.~99, pp.~2999--3000
   & くじらの卵についての記述論文．\\
\end{longtable}
\end{document}
```
Hyper-Vとインテルディスプレイドライバで存在しないモニターが増える

docker for windowsを導入しようと、Hyper-Vを有効化したところ起こった問題です。
現在Intel HD Graphics 4600を使用しているPCでHyper-Vを有効化させると、相性が悪いらしく存在しないディスプレイが検出される不具合が存在します。
これが起こる環境と一応の解決策です。
##環境

* dynabook R73
* Windows 10 Enterprise
* Intel(R) HD Graphics 4600 バージョン:20.19.15.4549
* Hyper-V

##バグ内容
![Pasted image at 2017_09_11 02_38 PM.png](https://qiita-image-store.s3.amazonaws.com/0/200861/db47a6bc-7a02-9bc1-d638-1b8b2fd632e8.png)
これが実際に不具合が起こっている研究室メンバーPCの画像です。
画像ではディスプレイが五つも接続されているように見えますが、もちろんそんなに接続しているわけもなく、実際に存在しているのはノートPCの画面のみです。ディスプレイ2~5が不具合として現れる存在しないモニターですね。
自分の場合はこれに加え外部ディスプレイへの表示ができなくなるという問題が起こりましたが、研究室内ではディスプレイが増えるも外部への表示は問題なく行える場合もありました。画像とはディスプレイの増え方が異なっていたので、そのあたりに原因があるのではと思います。
参考サイトにあるインテルサポートコミュニティのスレッドに、もう一パターンのディスプレイの増え方があるのでそちらもどうぞ。
##バグの起こる環境
特定のグラフィックドライバを利用している状況下でHyper-Vを有効化すると起こります。
研究室内で不具合が起こったことを確認したのはIntel HD Graphics 4600のみですが、インテルのスレッドによると他のインテル製ドライバでも同様の症状が起こるものはある様子でした。
##解決策

* アップデートを待つ
ひとまずIntel側もこの不具合自体は把握しているようなので、そう遠くないうちに修正されると思います。直接的な問題が起こっていないのであれば、特に気になりませんしね。研究室メンバーの一人は余計なディスプレイが認識されてはいるものの、特に不都合はないので放置中です。

* Hyper-Vを無効化する
あくまでドライバとHyper-Vの問題なので、Hyper-Vを無効化してしまえば元通りになるそうです。ですが有効化したからには理由があるわけで、場合によってはあまり現実的ではありません。docker for windowsを使ってるから無効化できない！という人もスレッドにいました。というか自分がまさにその口です。

* ドライバのバージョンを下げる
おそらくこれがあまり環境を変えずにバグを消せる方法でしょうか。
Intel(R) HD Graphics 4600の場合、バージョンを__20.19.15.4300__まで戻せば余計なディスプレイは消滅します。自分の場合は__20.19.15.4331__に戻しましたが、こちらでも正常にディスプレイが認識されました。もちろん、外部ディスプレイへの出力も元通りです。

##参考サイト
[False multiple monitors with intel drivers |Intel Communities](https://communities.intel.com/thread/110642)
[Windows 10 x64 with HD Graphics 4600 - multiple fake monitors when Hyper-V enabled |Intel Communities](https://communities.intel.com/message/479789#479789)
配列の初期化のためにmapメソッドを用いる際のふるまいについて

配列の初期化を書くときに、値が未代入の配列に`map`メソッドを使おうとして、

```js
Array(3).map(e => 0);
```

みたいなものを書いても思ったとおり動作しないですよね。`Array.prototype.map()`は値を代入されていない要素をスキップするので。
なので、通常は、

```js
[...Array(3)].map(e => 0);
Array.from(Array(3)).map(e => 0);
```

のように、配列を再度生成するかと思います。

ところで、`TypedArray.prototype.map()`はこのスキップ処理をしないので、

```js
new Int8Array(3).map(e => 0);
```

これは普通に動きますから、配列の要素が数値であると決まっているなら`TypedArray`を使った方がいい場面も多いかもですね。
　
StringArrayの登場が待たれます。
　
　
　
なお、MDNには、

> callback関数は値を割り当てたtyped arrayのインデックスに対してのみ呼び出されます。すなわち、undefined値である場合や、削除された場合や、値が割り当てられていない場合のインデックスに対しては呼び出されません。
[TypedArray.prototype.map() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/map)

と、このスキップ処理をするように書かれていますが、[仕様](http://www.ecma-international.org/ecma-262/6.0/#sec-%typedarray%.prototype.map)を見る限りこれは誤記かと思います。
iTunes Connectの概要が変更できない！　アプリのセール情報はどこに書けばいいの？　答えはプロモーション用テキストです。


## iTunes Connectの概要が変更できない！

iOSアプリのセールをするときに、iTunes Connectの概要欄に『期間限定セール！』のようなことばをいれていました。

しかし、iOS11のリリースに合わせてiTunes Connectが変更になり、概要はあたらしいバージョンを申請するときしか変更できなくなってしまいました。

それなら、セールの情報はどこに書けばいいのでしょう？

## iTunes Connectにプロモーション用テキストが追加されました。

その答えは、iTunes Connectに追加された『プロモーション用テキスト』という項目です（タイトルですでに答えを書いていますが）。

プロモーション用テキストは、いつでも変更することができます（もちろん、あたらしいバージョンを申請しなくても、です）。ですので、この欄にセール情報や最新ニュースやイベント情報などを登録することで、ユーザーに最新情報をお届けすることができます。

じっさいに、プロモーション用テキストを登録すると、どんな感じになるかご覧ください。サンプルは、iOS11と同時リリースした、ARKit対応のキュートでポップなアクションゲーム『[こぱんたっぷAR](http://toshi586014.net/2017/09/20/kopan-tap-ar/ "あなたのiPhoneで、不思議な世界をのぞいてみませんか？　タップだけの簡単操作で遊べるキュートでポップなアクションゲーム『こぱんたっぷAR』をリリースしました。")』です。

![promotion.png](https://qiita-image-store.s3.amazonaws.com/0/38924/c77d7510-fb3a-bd30-b8ca-c768e02d51e7.png "promotion.png")


左がプロモーション用テキストなしの場合で、右がプロモーション用テキストを登録した場合です。赤枠でかこった部分がプロモーション用テキストです。

プロモーション用テキストは170字とやや短めですが、概要のうえに表示されるので、いちばんにユーザーの目にはいります。アプリの最もアピールしたいポイントをいれておくといいですね。

詳しくは、[アップル公式の記事](https://developer.apple.com/app-store/product-page/ "Making the most of your product page on the all-new App Store.")をご覧ください（こちらの記事は、わたしのアプリ開発の先生であるアプリ道場の[あきおさん](https://twitter.com/akio0911 "Twitterであきおさんを開く")に教えていただきました。あきおさん、ありがとうございます！）。

## プロモーション用テキストをつかうときの注意点

さいごに、ひとつだけ注意点を。

プロモーションという名前から想像して、概要のいちばんうえに書いたアピールポイントをコピペすると、こちらのように残念な感じになってしまうので注意してくださいね（画像は合成ですが、じっさいにこのようになるはずです）。
![zannen.png](https://qiita-image-store.s3.amazonaws.com/0/38924/9f781e3e-d94b-22ba-47a5-d0d830f1b5e7.png "zannen.png")


晴れた日も、曇った日も、素敵なアプリ開発ライフをあなたに。
『[はれときどきくもりZ](http://toshi586014.net/ "ブログ『はれときどきくもりZ』を開く")』の[とし](https://twitter.com/toshi586014 "Twitterでとしを開く")がお送りしました！