OmniAICreator/Qiita-1.07M huggingface dataset:
CTFカーネルエクスプロイトで使うコマンドなど色々

# カーネルエクスプロイトで使うコマンドなど色々
これはまだカーネルエクスプロイトに入門していない人向けの記事です。

## セキュリティ機構のチェック

```shell
$ checksec --kernel bzImage
```

```shell
 Vanilla Kernel ASLR: 　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　Full
　　Protected symlinks:   　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　Enabled
　　Protected hardlinks:　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　Enabled
　　Ipv4 reverse path filtering: 　　　　　　　　　　　　　　　　　　　　　　Enabled
　　Ipv6 reverse path filtering: 　　　　　　　　　　　　　　　　　　　　　　Disabled
　　Kernel heap randomization:              Enabled
　　GCC stack protector support:            Disabled
　　Enforce read-only kernel data:          Disabled
　　Hardened Usercopy:                      Disabled
　　Restrict /dev/mem access:               Disabled
　　Restrict /dev/kmem access:              Enabled

* X86 only:            
  Address space layout randomization:  　　　　Disabled

* SELinux:  　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　No SELinux

  SELinux infomation available here: 
    http://selinuxproject.org/

* grsecurity / PaX:                      No GRKERNSEC
```

## カーネルからvmlinuxを抽出する
https://github.com/torvalds/linux/blob/master/scripts/extract-vmlinux

```
$ extract-vmlinux [kernel-image] > vmlinux
```

## QEMU上の仮想マシンにgdbを繋ぐ

### QEMUの起動オプションを追加
起動するとすぐにgdbの接続待ちになる(-S を省略すると待たずに続行）

```shell
$ -S -gdb tcp::4444
```

### gdbでアタッチする
アタッチしたあとはCtrl-C(SIGINT)で制御をgdbに移すことができる

```shell
$ gdb run.sh -ex 'target remote localhost:4444'
```

## cpuの設定を確認する
SMAP（Supervisor Mode Access Protection）やIntel SMEP（Supervisor Mode Execution Protection）の確認ができる

```shell
$ cat /proc/cpuinfo
```

## カーネルのシンボル情報を取得する
prepare_kernel_cred()やcommit_creds, 問題のカーネルモジュールのシンボル情報を取得できる

```shell
$ cat /proc/kallsyms
```

## カーネルメッセージを確認する

```shell
$ dmesg
```

## カーネルモジュールの確認
ロードされているモジュール

```shell
$ lsmod
```

ロードされていないモジュールも含めた一覧

```shell
$ modprove -l
```

## QEMUなどの問題環境にバイナリを置く方法

### wget
```shell
$ wget exmample.com/exploit
```

### curl 

```shell
$ curl -o exmample.com/exploit
```

### 16進数文字列に変換後、問題環境でバイナリに変換 
まずバイナリを16進数文字列に変換 

```python
# convert.py

import sys
import binascii

with open(sys.argv[1], 'rb') as f:
    binary = f.read()
    enc = binascii.b2a_hex(binary)
    print(enc)

```

```shell
$ python convert.py exploit > exploit.enc
```

問題の環境でviなどを使って頑張ってコピペしてxxdでバイナリに戻す

```sh
$ cat exploit.enc | xxd -r -p > exploit
```

## ディスクイメージをマウントする
ディスク中のファイル改変や抽出等に利用する

```shell
$ mount -t ext4 -o loop rootfs.ext2 /mnt
```
しずく感なCSS

# 背景
オッシャレなフロントエンドな方々のポートフォリオサイトを見ていたら作りたくなったので
いろいろな演出を模索していた。

思いついたのは液体のしずくのようなアニメーション…
これをCSSのみで実装したい…

# 結論
いろいろと悩んだ結果、下記でそれっぽい演出は可能…

``` html
<div class="t1">
  <div class="t2"></div>
  <div class="t3"></div>
 </div>
```

``` css
    .t1{/*水滴を表現するためのステージ*/
        position:absolute;
        left:100px;
        margin-top: 100px;
        filter: blur(30px) contrast(100);/*<- ここが肝です*/
        margin:auto;
        width: 200px;
        height:500px;
        background-color:#333;
    }
    .t2{/*上に固定される水滴*/
        position:absolute;
        margin-top: 50px;
        margin-left: 50px;
        width: 100px;
        height:100px;
        background-color:#00f;
    }
    .t3{/*垂れる水滴*/
        position:absolute;
        width: 60px;
        height:60px;
        margin-top: 50px;
        margin-left: 70px;
        background-color:#00f;
        animation: anime 1s linear infinite !important;
    }
    @keyframes anime{/*たれ方のアニメーション*/
        0%  {margin-top: 100px; }
      100% {margin-top: 300px; }
    }
```


<p data-height="265" data-theme-id="0" data-slug-hash="rvYvod" data-default-tab="css,result" data-user="hashito" data-embed-version="2" data-pen-title="Waterっぽい" class="codepen">See the Pen <a href="https://codepen.io/hashito/pen/rvYvod/">Waterっぽい</a> by hashito (<a href="https://codepen.io/hashito">@hashito</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 残った課題
 * 背景色を変えるとfilterがうまくかからず、思った色にできない
 * サイズを小さくしすぎるとfilterで水滴が消失してしまう  
良い解決策があればコメントいただけると助かります…


# ［追記］テキストでもやってみました。

テキストでも同様のことができることに気づいたので、「I'll be back」を溶岩に落とすアニメーションをつくってみました。

<p data-height="370" data-theme-id="0" data-slug-hash="XqYaVr" data-default-tab="css,result" data-user="hashito" data-embed-version="2" data-pen-title="Drop "I'll be back" in the melting furnace" class="codepen">See the Pen <a href="https://codepen.io/hashito/pen/XqYaVr/">Drop "I'll be back" in the melting furnace</a> by hashito (<a href="https://codepen.io/hashito">@hashito</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

結構無理矢理感…
フォントサイズがかなりデカくないと駄目なので```fontsize```を```200px```にして```transform:scale(0.2,0.2);```にて縮小しています。

あと、```'```が小さすぎで見えなくなってしまっています。
Ubuntuでfiddlerを使ってみる


#まず、Monoのインストール環境を整えます。
## Ubuntu 18.04
```
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb https://download.mono-project.com/repo/ubuntu stable-bionic main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
sudo apt update
```

## Ubuntu 16.04
```
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
sudo apt install apt-transport-https
echo "deb https://download.mono-project.com/repo/ubuntu stable-xenial main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
sudo apt update
```
# Monoをインストールします。
```
sudo apt install mono-complete
```

# fiddlerをダウンロードします
http://www.telerik.com/docs/default-source/fiddler/fiddler-linux.zip?sfvrsn=2



参考：
http://www.mono-project.com/download/stable/

https://askubuntu.com/questions/922377/how-to-install-fiddler-on-ubuntu?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
十字の壁がそそり立つ世界の中を君は螺旋状に歩く (規則性、Crystal/Perl6)


|問題|http://nabetani.sakura.ne.jp/hena/ord28spirwa/|
|:--|:--|
|シミュレーション (Python/Ruby/C++)|http://qiita.com/cielavenir/items/8c77a158136bd668a27b|
|規則性 (Python/Ruby/C/C#/Java)|http://qiita.com/cielavenir/items/a285b0cea4a26ff886b8|
|規則性 (D/Go/Swift/PHP/ **Vala** )|http://qiita.com/cielavenir/items/edb1daff9ea861a418ec|
|規則性 (VB/F#/Perl)|http://qiita.com/cielavenir/items/0c84af4049ab161f82c1|
|規則性 (PowerShell)|http://qiita.com/cielavenir/items/d9ef9f12068e99e888f2|
|規則性 ( **AIR-lang** )|http://qiita.com/cielavenir/items/d804f61412fb4f07ba06|
|規則性 (Crystal/Perl6)|http://qiita.com/cielavenir/items/13896a662b05da8b77a2|
|Rubyの多次元配列で最初の要素を加工して返したい<br>(tap/break等について)|http://qiita.com/cielavenir/items/3f209351b924e2615f5e|

完全についでですなこりゃ

```cr:tyama_hena28_fast.cr
#!/usr/bin/env crystal
#http://qiita.com/Nabetani/items/23ebddb44f0234e7fb15
#http://nabetani.sakura.ne.jp/hena/ord28spirwa/

dir="ESWN"
while l_=gets
	line=l_.chomp.split(':')
	n,e,s,w=line[0].split(',').map(&.to_i64)
	l=[e,s,w,n]
	days=line[1].to_i64+1
	(0..1/0.0).each{|i|
		[
			l[i%4]+(i%4==0 ? 1 : 0),
			(i/4+1)*2,
			l[i%4]-(i%4==3 ? 1 : 0),
		].each_with_index{|e,j|
			days-=e
			if days<0
				puts dir[(i+j)%4]
				break
			end
		}
		break if days<0
	}
	STDOUT.flush
end
```

```perl6:tyama_hena28_fast.p6
#!/usr/bin/env perl6
# http://qiita.com/Nabetani/items/23ebddb44f0234e7fb15
# http://nabetani.sakura.ne.jp/hena/ord28spirwa/

$*OUT.out-buffer=False;
my $dir="ESWN";
loop (;my $line=get();) {
	$line ~~ /^(\d+)","(\d+)","(\d+)","(\d+)":"(\d+)/;
	my $n=+$0;
	my $e=+$1;
	my $s=+$2;
	my $w=+$3;
	my $days=+$4+1;
	my @l=($e,$s,$w,$n);
	my $f=1;
	loop (my $i=0;$f;$i++) {
		my $j=0;
		my @x=(@l[$i%4]+($i%4==0),($i/4 +< 1)+2,@l[$i%4]-($i%4==3));
		loop ($j=0;$j < 3;$j++) {
			if ($days-@x[$j] < 0) {
				say substr($dir,($i+$j)%4,1);
				$f=0;
				last;
			}
			$days-=@x[$j];
		}
	}
	#$*OUT.flush();
}

```
十字の壁がそそり立つ世界の中を君は螺旋状に歩く (規則性、AIR-lang)


|問題|http://nabetani.sakura.ne.jp/hena/ord28spirwa/|
|:--|:--|
|シミュレーション (Python/Ruby/C++)|http://qiita.com/cielavenir/items/8c77a158136bd668a27b|
|規則性 (Python/Ruby/C/C#/Java)|http://qiita.com/cielavenir/items/a285b0cea4a26ff886b8|
|規則性 (D/Go/Swift/PHP/ **Vala** )|http://qiita.com/cielavenir/items/edb1daff9ea861a418ec|
|規則性 (VB/F#/Perl)|http://qiita.com/cielavenir/items/0c84af4049ab161f82c1|
|規則性 (PowerShell)|http://qiita.com/cielavenir/items/d9ef9f12068e99e888f2|
|規則性 ( **AIR-lang** )|http://qiita.com/cielavenir/items/d804f61412fb4f07ba06|
|規則性 (Crystal/Perl6)|http://qiita.com/cielavenir/items/13896a662b05da8b77a2|
|Rubyの多次元配列で最初の要素を加工して返したい<br>(tap/break等について)|http://qiita.com/cielavenir/items/3f209351b924e2615f5e|

[スクリプト言語ＡＩＲ](https://www20.atwiki.jp/air-lang/)として公開され、今は[ツインテールdeエンジェルモード!!](https://ja.osdn.net/projects/angelmode/)と言う名前になっている謎言語。
このたび[さくらサーバー上に導入したLinuxBrew上でビルドすることに成功しました](https://qiita.com/cielavenir/items/741921fcecb281555f77)ので、その記念にyhpgの過去問1つをば。


文法自体はかなりまともで、Perlに近いです。mapとかreverseとかないですが…

そういえば、flushしなくても正しく採点できるようです。どういう実装になってらっしゃるんだろう…

```
#!/usr/bin/env tt
# http://qiita.com/Nabetani/items/23ebddb44f0234e7fb15
# http://nabetani.sakura.ne.jp/hena/ord28spirwa/

dir="ESWN"
while(line=gets()){
	_=split(line,':')
	days=int(_[1])+1
	_=split(_[0],',')
	l={int(_[1]),int(_[2]),int(_[3]),int(_[0])}
	f=TRUE
	for(i=0;f;i++){
		x={l[i%4]+(i%4==0),(i/4*2)+2,l[i%4]-(i%4==3)}
		for(j=0;j<3;j++){
			if(days-x[j]<0){
				print("%c\n",subchr(dir,(i+j)%4))
				f=FALS
				break
			}
			days-=x[j]
		}
	}
}
```
QnAMakerのPreviewが終わりGA（正規版）がアナウンスされたので要点をまとめる

# 概要
MicrosoftのAI（Cognitive）サービスの１つである、QnAMakerのPreview期間が終了し、正規版が公開されたので要点をまとめる。

# TL;DR
- QnAMakerはAzureサブスクリプション必須に。
- QnAMakerの検索アルゴリズムは、Azure SearchのAnalyzerに依存するように。
- QnAMakerのランタイムを動かす環境として、WebAppsが必須に。
- メタデータなどの編集が可能に。

# 所感
- 精度が出しづらいプレビュー版であったが、機能のシンプルさはいい意味で特筆すべき点だった。
- しかし、GAにより**仕組みが複雑化**し、**LUISやAzureSearchとの役割分けがますます混沌としてきた**。

# 引用元（2018年5月7日公開）
Announcing General Availability of QnAMaker
https://blog.botframework.com/2018/05/07/announcing-general-availability-of-qnamaker/

Learn about QnA Maker
https://docs.microsoft.com/en-us/azure/cognitive-services/QnAMaker/overview/overview

# ハイライト
## **QnAMakerは、AzureSearchのAnalyzerに依存するように**
- [このページ](https://docs.microsoft.com/en-us/azure/cognitive-services/QnAMaker/overview/languages-supported)にしれっと書いてあるが、QnAMakerはAzureSearchのAnalyzerに依存するようになる。  

```
QnA Maker depends on language analyzers in Azure search for providing results. Special re-ranking features are available for En-* languages that enable better relevance.
```

## QnAMakerが、Azureのサブスクリプションと紐づく。
- いままでは完全に独立したサービスだったが、Azureのサブスクリプションと紐づける契約形態になる。  

## 課金制になる。
- 課金は[こちら](https://azure.microsoft.com/en-us/pricing/details/cognitive-services/qna-maker/)となっているが、まだ掲載されていない（2018/05/08 0:33現在）。
- 実際はAzurePortalから選択できるこちらの価格になる。QnAMaker自体の価格と、AzureSearchの価格が適用される。  
  - QnAMakerの価格  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195903/458753d2-6deb-a153-61a4-f3310e9aaf40.png)  
<br>
  - AzureSearchの価格  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195903/763930ce-6242-3ba2-9b50-0408a508d4a0.png)  


## データプライバシーとコンプライアンスについて、Azureと同等のものが適用。
- **[このSLA](https://azure.microsoft.com/en-us/support/legal/sla/cognitive-services/v1_1/)が担保される**。セキュリティで足踏みしていた企業には朗報。

## 新しいポータル
- [新QnAMakerポータルのURL](https://www.qnamaker.ai/)。**AzurePortalでQnAMakerのリソースを作成した後にこのサイトにサインインすると、勝手にサービスが追加されている。**  
  
旧ポータル
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195903/b89049d9-d4d1-77d1-0241-bd7ea49f7fc6.png)
  <br>
新ポータル、洗練されている。LUISに見た目が近づいた。( 参考：https://docs.microsoft.com/en-us/azure/cognitive-services/QnAMaker/how-to/edit-knowledge-base )
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195903/73c769c7-b703-e2e2-c50d-292bb9e175b1.png)  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195903/7ed699a5-d359-bb92-c3f2-b65ac5e5c44a.png)  

## スケーラブル
- 必要に応じてスケールを変更できる。いままではフルマネージドのSaaSなQnAMakerだったが、GA後はAzure WebAPpsと、Azure Searchに依存する（ 参考：https://docs.microsoft.com/en-us/azure/cognitive-services/QnAMaker/tutorials/choosing-capacity-qnamaker-deployment )。

## ログ
- Application Insightsと連携し、ログをため込む。（ https://docs.microsoft.com/en-us/azure/cognitive-services/QnAMaker/how-to/get-analytics-knowledge-base ）ログ設計の煩雑さから解消されるか。PowerBIと連携すれば一気に可視化も可能。

## 共有
- 共有も可能。すべてIAMで管理されている。


## スコアリングの考え方の変更
- 参考（ https://docs.microsoft.com/en-us/azure/cognitive-services/QnAMaker/concepts/confidence-score ）
- 従来のものと大きく変更されていないように感じる。

## API 4.0のリリース
- 従来よりAPIでのサービス操作がしやすいようになっている印象。

# 次回
本記事執筆時点では、QnAMakerの新ポータルで、なぜか新しいナレッジベースが作成できなかった。
なので、実際にナレッジベースを作成し、旧QnAMakerと比較しながら変更点や要点をまとめる。
CPU/GPU マイニングで Blender に仮想通貨で寄付を行い, 日々の感謝のお気持ちを Blender に伝える

Blender は素晴らしいですね!

https://www.blender.org/

もはや Blender なしでの生活は考えられません.
日々の感謝をお気持ちを Blender チームにお伝えしたい!

Blender セミナーを開いたり, Blender アーティストに対価を払ったり, Blender 開発に寄付をしたり, コントリビューションのしかたは人それぞれですね!

今回は, 仮想通貨のマイニングを行い, 得られた収益を Blender に寄付したいと思います.

Blender をお使いのみなさまにおきましては, そこそこ性能のよい CPU, GPU を利用されているでしょうから, Blender を使っていない時間に CPU, GPU をマイニングに振り分けることができて好都合です!

## 寄付のアドレス

blender のサイトに, 仮想通貨での寄付のアドレスがあります.

https://www.blender.org/foundation/donation-payment/

## マイニング収益の分配をコントロールする

たとえば Coinsplit というサービスがあります.

https://coinsplit.io/

ここに自分のアドレスを Blender のアドレスを記載することで, たとえばマイニングして得られた報酬の 20% を Blender に寄付, ということができます!

## マイニングプール選び.

いくつかマイニングプールがあります.

* Nicehash(BTC のみ)
* https://nanopool.org/
* https://dwarfpool.com/

筆者は普段, 主に BTC が欲しいときは Nicehash, ETH は Dwarfpool, ZEC は Nanopool を使っています.

nanopool は XMR の払い出し基準が 1.0(2018 年 5 月 7 日で 3 万円ほど)と, 高めになっているので注意です!

## マイニングソフト選び.

とりあえず Nicehash であれば迷うことはありません.

ETH, ZEC とかをマイニングしたいときはググってください.

ETH は ethminer https://github.com/ethereum-mining/ethminer がおすすめです.
XMR なら xmr-stak https://github.com/fireice-uk/xmr-stak がおすすめです.

CPU なら XMR, NVIDIA 系は ZEC, AMD 系は ETH が効率がよいです.

https://whattomine.com/

で自分が使っている GPU ではどれが収益率がよいか調べてみましょう!

## TODO

* 仮想通貨で寄付をしたときの課税について調べる. 現状日本では仮想通貨で寄付を行ったときの税控除というのはなさそう...
* XMR, ZEC あたりで匿名アドレスを使って寄付するスキームを調べる. 
* ERC721(non-fungible token)で Blender に寄付するスキームを確立する(Blender 関連のオークションとか, Blender でのレンダリング画像の売り上げを一部寄付とか)
* いずれは Blender 専用の Blender コインが発行される... といいな.
Windows10でhypvervisorlaunchtypeの切り替え(Hypver-V/Virtualbox切り替え)

コマンドプロンプトを管理者権限で起動して下のコマンドを実行

# 現在の起動条件をコピーします。
```
bcdedit /copy {current} /d "Windows10 hypervisorlaunchtype off"
```

# コピーした起動条件のキーを調べます。
```
bcdedit
```

# hypervisorlaunchtypeをoffにします。

```
bcdedit /set {調べたキー} hypervisorlaunchtype off
```

Windows10のアップデート後、設定が解除される場合がありますが、再度設定すれば利用できます。
Arch系LinuxにRuby2.3系以前をrbenvでインストールする

# はじめに
mikutterを使いたいと思いたち、そのためにはruby 2.3系以前を使わないといけない事に気づいた @maskuarade です。([追記](https://qiita.com/maskuarade/items/bd28a5a855d39b5c83ce#%E6%9C%80%E5%BE%8C%E3%81%AB))
手元の環境はmanjaro linuxですがベースはArchなので基本的には同じです。
前提として、rbenvとruby-buildがインストール済であることを想定します。

## Arch でのインストールの仕方  
```
yaourt rbenv
yaourt ruby-build
```
でそれぞれ `aur/rbenv`, `aur/ruby-build` を選択してインストールします。

# インストールの失敗
早速 `rbenv install 2.3.7` と勢い良く打ち込み、Let's install! と行きたいところですがエラーが出ます。
以下、エラーです(読み飛ばして頂いて結構です)。

```
Downloading ruby-2.3.7.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.7.tar.bz2
Installing ruby-2.3.7...

BUILD FAILED (ManjaroLinux 17.1.9 using ruby-build 20180329)

Inspect or clean up the working tree at /tmp/ruby-build.20180507235750.29802
Results logged to /tmp/ruby-build.20180507235750.29802.log

Last 10 log lines:
make[1]: *** [exts.mk:212: ext/openssl/all] エラー 2
make[1]: *** 未完了のジョブを待っています....
linking shared-object json/ext/generator.so
make[2]: ディレクトリ '/tmp/ruby-build.20180507235750.29802/ruby-2.3.7/ext/json/generator' から出ます
linking shared-object objspace.so
make[2]: ディレクトリ '/tmp/ruby-build.20180507235750.29802/ruby-2.3.7/ext/objspace' から出ます
linking shared-object nkf.so
make[2]: ディレクトリ '/tmp/ruby-build.20180507235750.29802/ruby-2.3.7/ext/nkf' から出ます
make[1]: ディレクトリ '/tmp/ruby-build.20180507235750.29802/ruby-2.3.7' から出ます
make: *** [uncommon.mk:203: build-ext] エラー 2
  279.68s user 29.53s system 172% cpu 2:58.82 total
```

# 解決策
[Arch Wiki rvmのページ](https://wiki.archlinux.jp/index.php/RVM#Ruby_1.8.x_.E3.81.8C_RVM_.E3.81.A7.E3.82.B3.E3.83.B3.E3.83.91.E3.82.A4.E3.83.AB.E3.81.A7.E3.81.8D.E3.81.AA.E3.81.84)や[ruby-buildのwiki](https://github.com/rbenv/ruby-build/wiki#openssl-usrincludeopensslasn1_mach102-error-error-this-file-is-obsolete-please-update-your-software)をゲロゲロいいながら漁っていたら該当しそうなものを見つけました。

rubyをコンパイルする時に、Archでは(ローリング・リリースで更新が早い故に)、opensslの1.1を使おうとするようですが、rubyの2.3系以前では1.0系を使う必要があるので、指定してビルドします。

```
# openssl 1.0 をインストールしていない場合
sudo pacman -S openssl-1.0
# rubyのビルド
PKG_CONFIG_PATH=/usr/lib/openssl-1.0/pkgconfig rbenv install 2.3.7
```

# 最後に
これで多くの迷える人が救われ、Rubyist, Rubyminerが増える事を願います。
これでmikutter使えるかな？なんて思っていたら他の人のForkを見ていただけでした。2.3系どころか2.6でも使えるんでなかろうか。
南無。
メモ：fluent-plugin-kinesisとバッファまわりの設定


# 概要

fluent-plugin-kinesisを使っているが、バッファまわりの設定が気になって調べた。

fluent-plugin-kinesisに限定しない話が多い。

メモなのでバラバラ書いていく。

# メモ
## Fluentdのアーキテクチャ（バッファ）

https://docs.fluentd.org/v0.12/articles/buffer-plugin-overview

チャンク、バッファ、キューの概念を抑えておく。

## 設定値について
https://tagomoris.hatenablog.com/entry/20130123/1358929254

## fluent-plugin-kinesis

https://github.com/awslabs/aws-fluent-plugin-kinesis/blob/master/README.md

スループットを上げるための設定が上記のREADMEに書いてある。

```
  flush_interval 1
  chunk_limit_size 1m
  flush_thread_interval 0.1
  flush_thread_burst_interval 0.01
  flush_thread_count 15
```

前のバージョンのFluentdではこう。

```
  flush_interval 1
  buffer_chunk_limit 1m
  try_flush_interval 0.1
  queued_chunk_flush_interval 0.01
  num_threads 15
```

## バッファとしてのメモリとファイル

Fluentdのデフォルトはメモリだが、ファイルに変更することもできる。fluent-kinesis-pluginは、`BufferedOutput`を継承しているため。

https://github.com/awslabs/aws-fluent-plugin-kinesis/blob/master/lib/fluent/plugin/kinesis.rb

ファイルを使うようにするには、`<match foo.bar></match>`の中に、下記を入れる。

```
  buffer_type file
  buffer_path /path/to/buffer
```

## バッファのサイズ

buffer_chunk_limit × buffer_queue_limit　で計算できる。
たとえば、buffer_chunk_limitが2MBでbuffer_queue_limitが100ならば、200MBまでバッファに入れておける。

バッファタイプをファイルにした場合、指定したパスに2MBのファイルが100個できているはず。

## よくわからなかった点

バッファの総量を超えるデータを流し込んだときに、データがどうなっているのか。（失われてしまう？）

実験としてバッファのサイズを大きく超えるデータを流し込んだ結果、ファイルとして作成されたバッファの数・サイズは変わらず、メモリ使用量にも変化がなかった。

そして、バッファに溜まったデータが少しずつ捌けていくと、新しくバッファのファイルが作成されていた。（この傾向は30分以上続いていた）

下記のワーニングは継続している出ている状態。
> 2018-05-07 15:24:24 +0000 [warn]: emit transaction failed: error_class=Fluent::BufferQueueLimitError error="queue size exceeds limit" tag="test"

このログの意味は下記。

> fluentdのバッファはキューが全部埋まってデータをもう入れられない場合，Inputプラグイン側にBufferQueueLimitErrorを返します．
https://qiita.com/repeatedly/items/11f8f2eefc4ae1eea2f9

inputはin_tailを使っていたが、たしかに、長い時間がたっても読み込みは完了していない様子だった。

outputがこの例外をinput側に渡すことで、読み込み速度を調整しているのかもしれない。


#### 参考
https://tagomoris.hatenablog.com/entry/20120731/1343707793
GitHub Pagesの独自ドメインHTTPS化対応

### はじめに
これまではGitHub Pagesで独自ドメインをHTTPS化するにはCloudFlareを仲介させるなどの対応が必要でしたが、この間公式にHTTPS対応がアナウンスされていたので、私のサイトも早速行ってみました。結構簡単にできたので手順を軽くまとめておきます。(HTTP -> HTTPS リダイレクトも行ってくれます)
https://twitter.com/github/status/991366832421523456

**公式ドキュメントはこちら**
https://help.github.com/articles/setting-up-an-apex-domain/

### 前提
すでにGitHub Pagesで独自ドメインによりサーブしているコンテンツ(HTTP通信)がある状態とし、そのサイトをHTTPS化するものとします。

### Step1:　ドメインのDNSレコード設定を変更する
対象ドメインのDNSレコード設定に以下4つのAレコードを追加します。

- 185.199.108.153
- 185.199.109.153
- 185.199.110.153
- 185.199.111.153

お名前.comの設定画面だと、ちょうど以下のようになります。

![sam.jpg](https://qiita-image-store.s3.amazonaws.com/0/73643/da26a80d-2aab-7239-00b9-5123d920b973.jpeg)

### Step2: ドメインを再設定
GithubのSetting画面にいき、ドメインを再設定します。
GitHub Pages > custom domainで、設定済みのドメインを一度クリアしてSave。
その後対象独自ドメインを再入力してSaveします。

<img width="742" alt="スクリーンショット 2018-05-08 0.22.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/73643/30aa2b49-5faf-0dec-93cc-3cae87cdda6c.png">

### Step3: Enforce HTTPSにチェック
Step2を終えると、`Enforce HTTPS`の項目に「Not yet available for your site because the certificate has not finished being issued」と表示されるようになります。

この状態でDNS設定が反映されるまで少し時間がかかるのでしばし待ちます。
(私の環境では15分程度でした)

設定が反映されると、以下のように`Enforce HTTPS`にチェックを入れられるようになるので、ここにチェックをいれることでHTTPS対応は完了となります。

<img width="738" alt="スクリーンショット 2018-05-08 0.28.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/73643/ec5c293b-92c8-60a4-dc73-bf170663dc10.png">

### ちょっとハマった
`Enforce HTTPS`にチェック後、以下のような警告文が表示され続けました。
CNAMEの設定やAレコードの設定などを見直しましたが、解消されず・・
しかし1時間後、警告文は消え、何事もなかったかのようにhttpsでアクセスできるようになってました。なんだったんでしょう、、まあ気にしない。

<img width="763" alt="スクリーンショット 2018-05-07 23.10.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/73643/f0b2c38b-2e31-a9de-dd20-cb0be7f2d20e.png">
CentOS7.4 で ZFS な iSCSI ターゲットを作成する

## 環境

CentOS7 を minimal インストールして `yum -y update` した状態。

<pre>
# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
</pre>
<pre>
# uname -a
Linux localhost 3.10.0-693.21.1.el7.x86_64
</pre>

3TBのHDDを3台接続。

<pre>
# cat /proc/partitions
major minor  #blocks  name

   8        0  250059096 sda
   8        1    1048576 sda1
   8        2  249009152 sda2
   8       16 2930266584 sdb
   8       32 2930266584 sdc
   8       48 2930266584 sdd
</pre>

## ZFSのインストール・設定

### リポジトリの追加

<pre>
# rpm -Uvh http://download.zfsonlinux.org/epel/zfs-release.el7_4.noarch.rpm
</pre>

### 必要パッケージのインストール

<pre>
# yum install -y kernel-devel gcc-c++ zfs
</pre>

> ネット上の情報では kernel-devel と zfs をインストールするようなことが書いてあるが、 gcc-c++ も入れておかないと以下のエラーになるようだ。
> 
> <pre>
> # zpool status
> The ZFS modules are not loaded.
> Try running '/sbin/modprobe zfs' as root to load them.
> </pre>
> <pre>
> # /sbin/modprobe zfs
> modprobe: FATAL: Module zfs not found.
> </pre>

CentOSなら zfs-kmod のほうがいいかもしれない

### 自動起動設定

<pre>
# systemctl enable zfs-import-cache
</pre>
<pre>
# systemctl enable zfs-mount
</pre>
<pre>
# systemctl enable zfs.target
</pre>

とりあえず、ここらで再起動しておこう

### ストレージプール作成

<pre>
# zpool create tank raidz /dev/sdb /dev/sdc /dev/sdd
</pre>

> ちなみに、他で動いていたHDDをまとめて移行する場合は `zfs import` で持ってこれるようだ。
> 
> <pre>
> # zpool import
> </pre>

### ボリューム作成

<pre>
# zfs create -V 1T tank/vol
</pre>

### デバイス確認

<pre>
# lsblk -l
NAME          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda             8:0    0 238.5G  0 disk
sda1            8:1    0     1G  0 part /boot
sda2            8:2    0 237.5G  0 part
  :
zd0           230:0    0     1T  0 disk
</pre>

zd0 ができてる

## iSCSIのインストール・設定

### 必要パッケージのインストール

<pre>
# yum -y install targetcli
</pre>

起動しておこう

<pre>
# systemctl start target
</pre>

### 自動起動設定

<pre>
# systemctl enable target
</pre>

### targetcli(ストレージマネージャー)での設定

<pre>
# targetcli
</pre>

ブロックデバイスをLUNに登録

<pre>
/> /backstores/block create name=lun0 dev=/dev/zd0
</pre>

IQNを作成

<pre>
/> /iscsi create 
</pre>

IQNにデバイスを紐づけ

<pre>
/> /iscsi/iqn..../tpg1/luns create /backstores/block/lun0 
</pre>

IQNにイニシエーターを紐づけ

<pre>
/> /iscsi/iqn..../tpg1/acls create iqn.... 
</pre>

ここまでの設定を保存

<pre>
/> saveconfig
</pre>

ファイアウォールに穴あけ。

<pre>
# firewall-cmd --zone=public --permanent --add-port=3260/tcp
</pre>

## 接続

イニシエーターから接続してみよう!
JavaScript クロージャとは

意識しないうちに利用しているクロージャだが人に教えるのはなんか難しい。
人に教えねばならぬ機会に恵まれたため、ここに復習の意味も込めて纏めておこうと思う。

# 関数を理解することが大事
クロージャを理解するにはまず関数の特性を理解するとこからだ。
というか関数を理解できたらそれはクロージャを理解できたことになると思う。

## ① スコープは関数定義時に決まる
関数内のスコープはローカルスコープとなりますがそれは関数定義時に決まります。
実行時ではありません。これを静的スコープといいます。
これはJavaScriptの関数が**定義時のコンテキスト**で実行されることも意味します。

```javascript
var scope = 'global';

function func1() {
    console.log(scope);
}

function func2() {
    var scope = 'local';
    func1();
}

func1(); //global
func2(); //global
```
`func1`はグローバルスコープに定義されているのでスコープチェーンによって`scope`の値は「global」となる。
`func2`はローカルスコープ内で`func1`が呼び出されているが、実行コンテキストは定義時のコンテキストになるのでやはり結果は「global」となる。

## ② 関数は第１級オブジェクトである
第１級オブジェクトとは、通常のオブジェクトの様に、プロパティに定義したり、他の関数の引数として渡したり、戻り値にすることができるという意味です。これはJavaScriptの関数は定義されたコンテキストとは異なるコンテキスト上で実行できるということです。

```javascript
var test = function () {
        console.log('Hello World!!!');
    },

    test2 = function (fn) {
        fn();
    };

test2(test); //Hello World!!!
```

`test`はグローバルに定義されていますが、実行は`test2`のローカルスコープ内です。

## ③ 定義時のコンテキストと異なるコンテキストから呼ばれる
この場合にクロージャとなる。①と②を踏まえて以下のコードを見てみる。

```javascript
function makeCounter() {
  var count = 0;
  return f;
  function f() {
    return count++;
  } 
}
var a = makeCounter();
console.log(a());  // 0
console.log(a());  // 1
console.log(a());  // 2
```

まず関数`makeCounter`は`f`という関数を戻り値として返しています。
これは②の**関数は第１級オブジェクトである**という特性に当てはまりますね。
この`f`という関数は`makeCounter`の関数内で定義されているので関数内のスコープを参照することができます。これは①のスコープは関数定義時に決まるでした。（スコープチェーン）
そして、`makeCounter`関数は変数`a`に格納されグローバルスコープで実行されていますが、
実行コンテキストは関数宣言時のコンテキストとなるので結果`count`という変数を参照し続けます。

# 纏め
1. スコープは関数定義時に決まる
2. 関数は第１級オブジェクトである
3. 定義時のコンテキストと異なるコンテキストから呼ばれる

この３つがクロージャの本質となるので覚えておきましょう。
Java8 Gold試験の備忘録

書きかけ
##Javaのクラス設計
###不変クラス
* クラス：継承されないようにfinal宣言
* フィールド：外部からのアクセスと変更を不可にするため、private final宣言
* アクセサメソッド：ゲッターメソッドのみ提供

###static初期化子
```Java
public class Test {
    static int x;
    static { x = 1; }
```

###Enum
* 自動的にfinalクラスとしてコンパイルされるため、修飾子にfinalやabstructは指定できない
* 自動的にstaticが修飾されるが、明示的にstaticを付けてもよい
* extendsはできないが、implementsは可能
* メソッド内での宣言は不可
* コンストラクタは必ずprivateで宣言する
* フィールドやメソッドを記述する場合は、列挙定数の最後にセミコロンが必要。記述しない場合は、セミコロンは付けても付けなくてもよい

|メソッド|説明|
|---|---|
|static E valueOf(String name)|指定された名前の列挙定数を返却|
|static E[] values()|列挙型の配列を返却|
|String name()|列挙定数名を文字列としたを返却|
|int ordinal()|0から始まる列挙定数の序数を返却|

###Java8での追加要素
```Java
interface A {
    static void test1() {
        System.out.println("static");
    }

    default void test2() {
        System.out.println("default");
    }
}

class B implements A { }

class test {
    public static void main(String[] args) {
        A.test1(); // 「static」
        A.test2(); // コンパイルエラー
        B b = new B();
        b.test1(); // コンパイルエラー
        b.test2();  // 「default」
    }
}
```
* 同じシグニチャのdefaultメソッドを持つinterfaceを多重継承した場合、コンパイルエラーが発生する。そのため、オーバーライドする必要性がある。
* 同じシグニチャのdefaultメソッドを持つinterfaceの型階層の距離が違う場合は多重継承が可能である。その際、距離が最も近いdefaultメソッドが呼び出される。

##デザインパターン
###シングルトン
```Java
public class Singleton {
    private static Singleton s = new Singleton(); // 1

    private Singleton() {} // 2

    public static Singleton getInstance(){ // 3
        return singleton;
    }
}
```
①インスタンスが常に一つだけ生成されるように、private staticフィールドを宣言する。
②外部からインスタンスを生成できないように、コンストラクタをprivateで宣言する。
③外部からインスタンス参照を取得できるように、インスタンスを返却するpublic staticメソッドを宣言する。
GitHub の Issue Template を複数設定して使い分ける

いつから出来る様になったんだろう？

ずっとやりたかったんだけど、出来る様になってることに気がついたので試した

## GitHub にテンプレートを作ってもらう
Settings タブの
<img width="614" alt="01_settings.png" src="https://qiita-image-store.s3.amazonaws.com/0/113398/4b18d2e7-ee43-09e7-dea6-ae62745659c3.png">

下の方にある Set up templates というボタンがある
<img width="614" alt="2_setup.png" src="https://qiita-image-store.s3.amazonaws.com/0/113398/2ac77b64-64d3-2109-a30f-c4c37fcd5282.png">

ここで GitHub が用意したひな形があるので適当に選ぶ
<img width="594" alt="3_select.png" src="https://qiita-image-store.s3.amazonaws.com/0/113398/87e782f2-37f5-706c-d0eb-844ad8763532.png">

<img width="594" alt="4_select.png" src="https://qiita-image-store.s3.amazonaws.com/0/113398/6e10d4af-34cd-ec70-4f9c-58272515209e.png">

## Issue を作る
普段の Issue タブから Issue を作成しようとすると、テンプレート選択の画面が現れる
<img width="614" alt="5_choice.png" src="https://qiita-image-store.s3.amazonaws.com/0/113398/b8ea4077-1cd7-de40-711f-53adf09917d0.png">

選ぶとそれが適用される
<img width="594" alt="6_inserted.png" src="https://qiita-image-store.s3.amazonaws.com/0/113398/7b8d860a-e013-ab85-7a7b-67a6c7ce99ba.png">

## ちょっと見ていじってみる
実体としてはこのパスでこんなファイルがコミットされている
<img width="594" alt="7_files.png" src="https://qiita-image-store.s3.amazonaws.com/0/113398/97fcf446-f3f8-c9af-db2a-530c8af17f2e.png">

こいつらのファイル名を変えたり中身をいじったりしてみて、どうやら先頭行のこの記載がポイントっぽい

```markdown
---
name: Bug report
about: Create a report to help us improve

---
```

ファイル名は変えても反映されたけど、これを書いてない`.md`ファイルは無視された

逆に言えばこれを書けば自分で用意したファイルでも良いはず

やってみた

```
$ cat .github/ISSUE_TEMPLATE/task.md
---
name: タスク
about: タスクの整理と内容を記す

---

## タスク

### 資料
+ 

### 作業
+ [ ] 

### 完了条件
+
```

<img width="594" alt="8_own.png" src="https://qiita-image-store.s3.amazonaws.com/0/113398/ab74e2ab-7644-b04f-5e6c-be39372ea98b.png">

これは良い！

地味だけどテンプレートを使わないってリンクも下にひっそりとあるのも良いね
今までは絶対挿入されてたから

pull request template も複数設定が出来るっぽいけど、どうもうまく反映出来なかったのでとりいそぎここまで


## 関連
[GitHubを中心とした開発プロセス 課題管理](https://qiita.com/suzuki-hoge/items/3a568dff36fd981082ba#git-template-for-issue-issue%E4%BD%9C%E6%88%90%E6%99%82%E3%81%AE%E8%AA%AC%E6%98%8E%E6%AC%84%E3%81%AB%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)
iOS端末の向き

端末がロックされていた場合の向きの取り方
モーションセンサーを使えば行けました！

```
    let motion = CMMotionManager()

    override func viewDidLoad() {
        super.viewDidLoad()
        motion.accelerometerUpdateInterval = 1.0;

        motion.startAccelerometerUpdates(to: OperationQueue.current!, withHandler:
            
            { (data, error) in
                self.getOrientation( x:(data?.acceleration.x)!, y:(data?.acceleration.y)! )
            })
    }
    
    func getOrientation(x: Double, y: Double) {
        if (fabs(x) < 0.5) {
            if (y < 0) {
                print( "right" )

            } else {
                print( "left" )

            }
        } else {
            if (x < 0) {
                print( "up" )
            } else {
                print( "down" )
            }
        }
    }
```  

-----------------------------------------------------
これで全部のパターンで向き取れたのはいんだけど。

端末側で向きがロックされてたら取れないね・・・
ロックされてても回転方向知りたいorz ボスケテ


```
    override func viewDidLoad() {
        super.viewDidLoad()
 
        NotificationCenter.default.addObserver(self, selector: #selector(ViewController.onOrientationDidChange(notification:)), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
    }

    @objc func onOrientationDidChange(notification: NSNotification) {

        switch UIDevice.current.orientation {
        case .faceDown:
            print("Face down")
        case .faceUp:
            print("Face up")
        case .unknown:
            print("Unknown")
        case .landscapeLeft:
            print("Landscape left")
        case .landscapeRight:
            print("Landscape right")
        case .portrait:
            print("Portrait")
        case .portraitUpsideDown:
            print("Portrait upside down")
        }
    }
```
Actions on Googleでシミュレーターができない： Could not find draft details for 'en' locale

Actions on GoogleでSimulatorを使おうと思ったら**Could not find draft details for 'en' locale**でハマったのでメモ。



##これにハマった
Actions on Google画面左の[Simulator]ボタンを押して、LanguageをJapanese(Japan)を選択すると、
画面下部にテキストボックスが表示され、Dialogflowで作成したIntentをテストできるようになるはずが
**Could not find draft details for 'en' locale**
のメッセージが表示されテストできない
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253915/9982b0b1-ad16-d3b4-255d-30e5c60ad0b2.png)


##原因
Overviewで設定する、アプリ全体の言語を入力する箇所では、全ての言語でactionが設定されていないとSimulatorが起動できない。
筆者の場合は日本語のみ設定したかったが、デフォルトであるEnglishを設定から外すのを忘れていて、Englishのactionが登録されていないためSimulatorが起動できなかった。

- Japaneseの設定はOKだが、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253915/6014e96f-1f0e-5998-9b07-f815b585a1dd.png)

- Englishが未設定ではSimulatorは使えない
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253915/81f6e6e5-3901-44d2-d520-553eb3fcaaea.png)

##解決
どちらかの方法で解決できる
- Englishの場合のaction設定をする
- Englishを外す　👈今回はこちらを選択

####言語の部分を選択し[Add/remove language]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253915/83bb7ba0-7b24-10b1-230f-b8256675aaeb.png)
####Englishを外して[UPDATE]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253915/10a8818b-fbc9-78b4-16d3-2853bd8c6b82.png)

⇒DELETEしてよろしいですか的な警告を無視して進むと...
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253915/4dabf778-a845-0f36-27e7-7c562ae500e9.png)
Inputのテキストが表示され、無事テストできました。

言語を入れる項目は他にもあるので、どこのことを言っているか特定するのに時間がかかった。。。
ClickOnceでSystem.Data.SQLiteを使うアプリを発行する場合の注意点

# 概要
ClickOnceでSystem.Data.SQLiteを使うアプリを発行する場合、
何も対処しないと実行時に以下の例外が発生してしまいます。
その対処法です。

```
ハンドルされていない例外: System.DllNotFoundException: DLL 'SQLite.Interop.dll' を読み込めません:指定されたモジュールが 見つかりません。 (HRESULT からの例外:0x8007007E)
   場所 System.Data.SQLite.UnsafeNativeMethods.sqlite3_config_none(SQLiteConfigOpsEnum op)
   場所 System.Data.SQLite.SQLite3.StaticIsInitialized()
   場所 System.Data.SQLite.SQLiteLog.Initialize()
   場所 System.Data.SQLite.SQLiteConnection..ctor(String connectionString, Boolean parseViaFramework)
   場所 System.Data.SQLite.SQLiteConnection..ctor(String connectionString)
   場所 SQLiteMigrationSample.Program.Main(String[] args)
```

# やり方
プロジェクトの直下にx64とx86フォルダを作成します。
![create_x84_x64_folder.png](https://qiita-image-store.s3.amazonaws.com/0/178867/f3d01400-2b70-9ac6-6a6c-42e9e0cfaa6e.png)

追加したx64のフォルダに対して、右クリックから[追加]-[既存の項目]を選択します。
![select_add_existing_items.png](https://qiita-image-store.s3.amazonaws.com/0/178867/57e65fd6-458c-2ea6-ef89-286ac148a218.png)

x64に対応するSQLite.Interop.dllを選択し、[リンクとして追加]を行います。
対応するdllは、例えばpackages/System.Data.SQLite.Core.1.0.108.0/build/net46/x64/SQLite.Interop.dllにあります。
![add_dll_as_link.png](https://qiita-image-store.s3.amazonaws.com/0/178867/8180c1d4-7027-42e8-1a83-8d06d6a7d2b5.png)

同様にx86フォルダに対してもdllを追加します。
最終的に以下の感じになります。
![added_dll_sample_image.png](https://qiita-image-store.s3.amazonaws.com/0/178867/62f18b2c-e5d8-c901-654d-c29a447dc5ad.png)

[プロジェクトのプロパティ]-[発行タブ]-[アプリケーションファイル]に追加したdllがあればOKです。
![added_dll_in_application_file.png](https://qiita-image-store.s3.amazonaws.com/0/178867/02778e56-1ed1-88fd-c2ed-c7bfd4367ff7.png)

この状態で今まで通り発行すると、x64/x86フォルダのdllもパッケージに含まれ、正しく動作するようになります。

# コメント
SQLite以外でも、x64/x86フォルダにDLLがあるライブラリで使えるはずです。

# 参考URL
- http://webbercross.azurewebsites.net/ef7-sqlite-click-once-deployment-error/
    - ほぼ、ここの内容です。
JavaScript  でニーモニックを生成

```
$ npm install bip39
```

```
var bip39 = require('bip39')
const mnemonic = bip39.generateMnemonic()
console.log(mnemonic)
```


# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/JavaScript_でニーモニックを生成
自動で連番を付与するCSS

#はじめに
自動で連番表示させ、連番をCSSで装飾をしたいがspanやolのデフォルトの連番は使いたくない。

####**やりたいこと**
リストに対して自動で連番を振りたい。
CSSのcounter-incrementプロパティーを使用する

#実装

####**counter-increment**
要素のカウンターにおける値を進める際に使用するプロパティ
####**使い方**
counter-incrementプロパティを適用する要素に:before擬似要素、:after擬似要素を付けて、contentプロパティでカウンタ名を指定してやることで、要素の直前または直後にカウンタの値を挿入することができる。

###**実装**
```slim:slim
ol.number
  li text
  li text
  li text
  li text
```
```scss:scsss
.number {
  list-style: none;
  //何も指定しない場合は 0 から
  counter-reset: data-num;
  li {
    //カウンタの増加数
   //例　counter-increment: data-num 2; (2づつ増加)
    counter-increment: data-num;
    &::before {
      //表示形式を指定(conter(変数)"表示形式")
      //例 content: counter(data-num)"位"; (1位、2位、3位...);
      content: counter(data-num);
      //装飾
      display: inline-block;
      width: 24px;
      height: 24px;
      font-size: 12px;
      line-height: 22px;
      color: white;
      text-align: center;
      border-radius: 50%;
      background-color: black;
      margin-right: 6px;
    }
  }
}
```
#結果
<img width="152" alt="スクリーンショット 2018-05-07 23.48.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/20635/e196b10a-cc4f-6498-51de-890c811efb91.png">

#メモ
覚えた技術を実務で積極的に使ってみようと思う。
「自作Python100本ノック」１日目（はじめに〜5本目）

#はじめに
 今回から「自作Python100本ノック」を始めていくのですが最初に、
「なぜやるのか？」
「どういう問題を対象にしているのか？」
「どの様に進めていくか？」
を簡単に整理しておきます。

##なぜやるのか
**１、エンジニアのサマーインターンのコーディング試験に受かるため**
今まではなんとか基礎力を隠してこれたんですが、ついに誤魔化しが効かない壁が現れました。

**2、生駒ちゃんが乃木坂46を卒業し暇になったから**
急に毎日が退屈で暇になってしまいました。

**3、これからPythonを勉強する様な人にとってちょうど良い問題集を作るため**
ネットで検索すれば、Pythonの基礎的なコーディング問題はたくさんヒットしますが、
ページはバラバラ。難易度はバラバラ。「え？それいつ使うの？」という問題も多かったりと実用性もバラバラ。快適に勉強ができる環境ではないなと感じました。
そこで、それなら自分が色々なサイトを回って良いなと思ったものを寄せ集めて問題集を作れば、今度自分と同じ様な状況の人にとって役立つのではないかと思いました。
もちろん備忘録の意味もあります。

##どういう問題を対象にしているのか？
問題は全て独断と偏見で選んでいますが、
実用性や応用性があるものを優先して集めるつもりです。

**「最低限の知識（print,for文,if文,関数の使い方等）は勉強したから、ちょっとした問題解いてみたいな」**

**「CheckiOとかは難しすぎるから入門者向きのちょど良い問題ないかなあ。。。」**

**「解答がすぐ見れるやつが良いな。。」**

という自分みたいな人が主な対象となるので、難易度もそこらへんになります。
CheckiOが１人でゴリゴリにできるという人は、クオリティ的にもCheckiOで鍛えることを強く勧めます。

##どの様に進めていくか？
簡単でシンプルな問題から順に進めていきたいと思いましたが、
既に100問用意できているわけではないので、**良さげな問題を見つけ次第どんどん投稿していこうと思います。**
完成後余裕があれば、簡単な問題順に並び替えます。
外部から持ってきたものの出典は全て載せます。

**解答は基本的に自分にとって１番わかりやすいものを載せようと思います。**
「なにそのコード汚な」
「え。そんな面倒なことしてんの？それ、これ使えば1文で書けるよ。」
と思う人が多いと思いますが、
まだ自分は「コードはアートだ！」みたいな境地に辿り着いていないのでそこらへんはご了承ください。
美しい別の回答は、出典から確認してください。

作った問題集（解答がついていないバージョン）は今後まとめてGitHubに上げようと思いますので、まとめて解きたいという方はそちらを使ってください。（未定）
よろしくお願いします。


#自作Python100本ノック（1本〜5本目）
##Q1: 1から50までの和を計算して表示
基本です。
「おいおいこのレベルでやっていくのかよ。」と思われた方もそう焦らないでください。
まだ99本ありますから。
　　　

```q1.py
s = 0
for i in range(1,51):
    s += i
print(s)
```
##Q2: 1000以下の素数を計算して表示せよ
素数の性質を考えれば解けますね。
　　　

```q2.py
for i in range(2,1001):
    for n in range(2,i): #2からその数より以前の数で割り切れないものが素数となる
        if i%n == 0:
            break
    else:
        print(i)
```
##Q3: フィボナッチ数列（１０個目まで）を表示せよ
1,1,2,3,5,8・・・・・・ってなるやつです（２つ前と１つ前の数の和になる数列）
こんなにシンプルに解けるとは驚きました。
　　　
 
```q3.py
a = 0
b = 1
for i in range(10):
    print(b)
    a, b = b, a+b
```
##Q4: 2つの自然数の最小公倍数/最大公約数を表示せよ
2つの数字を引数に渡すと、その２つの最大公約数と最小公倍数を計算して表示してくれる関数を作ってください。
まあ、でもこれは計算方法知ってないと初見では解けないですよね。
   
　　　

```q4.py
#最大公約数
def gcd(a,b):
    if b == 0:
        return a
    else:
        return gcd(b,a%b)  #この方法で最大公約数が求められます。

a = 16
b = 6        
xab = gcd(a,b)
print(xab)

#最小公倍数
zab = a*b/xab  #この方法で最小公倍数が求められます。
print(zab)
```
[出典][Pythonのお勉強　問題集](http://python.rdy.jp/wiki.cgi?page=%CC%E4%C2%EA%BD%B8#p4)
##Q5: 0から100の内３の倍数と３のつく数字だけ表示せよ。
世界のナベアツさんのネタと同じ原理です。
`str()`と`in`を使う発想が好きです。
　　　

```q5.py
#最大公約数
for i in range(0,101):
    if "3" in str(i) or 0 == i % 3:
        print(i)
```
[出典][data9824さん](https://yukicoder.me/problems/no/207)


##感想
初めてQiitaでちゃんとした（？）ものを投稿させてもらいました。
問題のストックはまだあるんですけども、思ったより投稿が大変ですね。笑
まあ、投稿自体は頭使う必要ないので夜中にやるには良いかも。（なので投稿は夜中が多いと思います。）

レベル感は、今回のところを最低として進めていきます。
（最大公約数と最小公倍数のは初見殺し感あったので除く）

今後ともこんな感じで6本目以降も気力が持つまで続けていこうと思います。
本当にQiitaの自体初心者なので、「こうした方が良いよ！」とかその他感想とかありましたらなんでも励み、参考になるのでコメントしてもらえると助かります。
よろしくお願いします。
それでは！

→[2日目](https://qiita.com/ahpjop/items/909fd55e48211dab2c5c)
レイと点の最短距離をベクトル計算で求める

レイと点の最短距離をベクトル計算で求める方法です。

レイは以下の図のように位置ベクトル$\vec{origin}$と方向ベクトル$\vec{dir}$で表し、点は位置ベクトル$\vec{point}$で表します。求めたいのはレイとベクトルの最短距離$x$です。以下の計算では方向ベクトル$\vec{dir}$は正規化されているとします。

![20180507.png](https://qiita-image-store.s3.amazonaws.com/0/61569/0a35545e-b978-6669-4f1f-286bb2ea2a9a.png)


$\vec{point}$と$\vec{origin}$の距離を$a$とし、$\vec{origin}$から$\vec{point}$へ向かうベクトル$\vec{op}$と$\vec{dir}$がなす角を$\theta$とすると余弦の定義から以下のような方程式が成り立ちます。

```math
sin\theta = \frac{x}{a}
```

これを$x$について解くと以下のようになり、$a$と$sin\theta$を求めれば$x$を求めることができることがわかります。

```math
x = asin\theta
```

`a`は位置ベクトル間の距離で以下のように求まります。

```math
\vec{op} = \vec{point} - \vec{origin} \\
a = \sqrt{dot(\vec{op}, \vec{op})}
```

$sin\theta$は$sin\theta^2 + cos\theta^2 = 1$より以下のように求まります。

```math
\vec{op} = normalize(\vec{point} - \vec{origin}) \\
cos\theta = dot(\vec{dir}, \vec{op}) \\
sin\theta = \sqrt{1 - cos^2\theta}
```

この計算をプログラムで書くと以下のようになります。プログラムはJavaScriptで、ベクトルクラスには[p5.jsのp5.Vector](https://p5js.org/reference/#/p5.Vector)を使っています。

```js:JavaScript

function calcDistance(origin, dir, point) {
  const pointToOrigin = p5.Vector.sub(point, origin);
  const pointToOriginLength = pointToOrigin.mag();
  pointToOrigin.normalize();
  const cosTheta = p5.Vector.dot(dir, pointToOrigin);
  return pointToOriginLength * sqrt(1 - cosTheta * cosTheta);
}
```

以下の画像ではレイと点の最短距離を求めて、距離で色付けしています。
https://www.openprocessing.org/sketch/546990
![20180507.gif](https://qiita-image-store.s3.amazonaws.com/0/61569/b81c592e-ed9b-6ce5-3a00-567a945b0fd2.gif)
Atomで使っているテーマ、パッケージをまとめてみた

Atomで使っているテーマ、パッケージをメモ。

# テーマ
## [seti-ui](https://atom.io/themes/seti-ui) / [seti-syntax](https://atom.io/themes/seti-syntax)

とにかくおしゃれ。

# パッケージ
## [japanese-menu](https://atom.io/packages/japanese-menu)

まずは、これ。

## [file-icons](https://atom.io/packages/file-icons)

ファイルのアイコンをおしゃれにする。
seti-uiと組み合わせるときは、seti-uiのSettingsでCustom Iconsのチェックを外す。

## [minimap](https://atom.io/packages/minimap)

大きなスクロールバーとして使用。

## [project-manager](https://atom.io/packages/project-manager)

複数の作業を同時期にする時、便利。

## [sublime-style-colum-selection](https://atom.io/packages/sublime-style-column-selection)

短径選択。

## [php-debug](https://atom.io/packages/php-debug)

Xdebugと組み合わせて使用。
入力より先に覚えたいVimのウィンドウ操作のこと

ほとんどのVimの解説を見ながらぼんやりと思ってたことなんだけど、今日日Vimってカーソルキー使えるわけだし、乱暴な話モード切り替える`a`と`:w`と`:q`教えたら文章「は」打てるわけじゃないっすか？[^1]んで「なんだこれ不便だな」ってなった人にコマンドの洪水をブチ撒けてあとは様子を見るみたいな雑な方法がデジタリアンがやる由緒正しい洗脳で、その方法にとやかく文句を言うつもりはないんだけど、その流れの中で「`:h [command]`出来ますよ」って言うなら先に教えるべきは`:sp`とか`:sbp`なんじゃないの？って思っちゃったんですよ。
というより現時点でバッファを辿りたいことがすごく多くて、その度にb以外に何も思い出せないことがすごく多いので、まずそれを把握していこうと思いました。ハイ導入終わり。

[^1]: もっと言うと`<C-c>`したり閉じるボタン押すだろうから`:q`すら必要ないまで…

## Window Licker

ウィンドウ分割したい時にまず考えることは「縦/横どっちに割りたいか？」なので、まず大本の`:sp`と`:vs`を覚えて、そこから単語を修飾していくような方法で覚えるのがいいのかなと思いながらまとめ始めます…と言っても覚えるべきは

- `:sp[lit]` is *SPlit* window.
- `:vs[plit]` is *Vertical Split* window.

だけなのでどんどん進みます。

ここで[チュートリアル](http://d.hatena.ne.jp/lemniscus/20121022/1350920565)を見ながら、`<C-w> s`やら`<C-w> v`に気がついたのでここも捉えられるな、ということで自分で覚えるためにもうちょっとまとめます。

|command|key map|
|:--|:--|
|`:sp`|`<C-w> s`|
|`:vs`|`<C-w> v`|
|   |   |
|`:new`|`<C-w> n`|
|`:q`|`<C-w> q`|
|`:clo[se]`|`<C-w> c`|
|`:on[ly]`|`<C-w> o`|

ここで覚えている`:only`や`:close`のキーマップの方も一緒に記憶してしまうこととします。あと今まで頑張っていちいち`:vne`してたのはなんだったのか…ってなってます。

## 人間は間違える

新しくウィンドウを作る方はこれで覚えたとして、じゃあ実際は？というと間違えるわけで、次は間違えたあと修正する方法を覚えたいところです。`<C-w>`絡みのキーマップにそのあたりがあるのでそれで処理しましょう。

| |フォーカスを移動|ウィンドウを移動|
|:-:|:-:|:-:|
|h (←)|`<C-w> h`|`<C-w> H`|
|j (↓)|`<C-w> j`|`<C-w> J`|
|k (↑)|`<C-w> k`|`<C-w> K`|
|l (→)|`<C-w> l`|`<C-w> L`|
|w (次)|`<C-w> w`|`<C-w> r`|
|W (前)|`<C-w> W`|`<C-w> R`|

見えるものは全てこれで把握できるかなと。ウィンドウ移動がコマンドで実現できる`:to[pleft]`や`:bo[tright]`もあるんだけどなんかとっ散らかるんで…
ウィンドウサイズに関してはマウスでやるほうが早いんじゃないっすかね？[^2]

[^2]: もしくは[winresizer](https://github.com/simeji/winresizer)なんて便利なものもあるみたいです。

## 見えないものを見ようとして

ここからさらに間違えるとして、やり直そうとして閉じてしまった場合のことまでフォローしに行けるのでそこまで把握します。閉じてしまったウィンドウは、まだバッファ内に存在するのでまずは確認する方法を覚えます。shでお馴染みの`:ls`が短くて覚えやすかったけど、じゃない人は`:files`でも、バッファ系の操作はbなんちゃらなので複合して覚えるために`:buffer`でも…

| |カレントウィンドウ|新規ウィンドウ (上に)|*新規ウィンドウ (左に)*|
|:-:|:-:|:-:|:-:|
|任意のバッファ ([0-9])|`:b [0-9]`|`:sb [0-9]`|*`:vert sb [0-9]`*|
|次 (next)|`:bn`|`:sbn`|*`:vert sbn`*|
|前 (previous)|`:bp`|`:sbp`|*`:vert sbp`*|
| | | | |
|最初 (first)|`:bf`|`:sbf`|*`:vert sbf`*|
|最後 (last)|`:bl`|`:sbl`|*`:vert sbl`*|

Vimに感じるクセというか、ヘルプドキュメントの欠陥臭い部分も解決したくて`:bN`や`:br`に関することは省いています。[^3]その上で、見慣れない`:vert`に関しての説明も。`:vert`コマンドはその後に続く任意の**新規ウィンドウを開く**コマンドのウィンドウ分割を上下から左右に替えるコマンドです。バッファをウィンドウとして再表示する際は`:sp`や`:vs`じゃダメなのでこちらを使うんですけど、ぶっちゃけ開いてから`<C-w> H`すれば覚えなくても…コマンド長いし。

[^3]: フォーカス移動の際にもそうなってたんですが、コマンドによる指定方向の逆を[shift+キー]で実現することが多いのに、ヘルプドキュメントの「任意の数字[N]」と「nextの逆の大文字のN」がごっちゃになって書かれているので、とても捉えづらかったんです。

## もうめんどくさいから前の覚えてくれないの？

`:mks`なんで事もできるけど、Session.vimの保存場所がカレントディレクトリになり、`set autochdir`してる我が家の環境では好きじゃない挙動するので…いい具合のプラグインが見つかりました。
[xolox/vim-session](https://github.com/xolox/vim-session)を使います。

### タイムマシンにお願い

```vim:vimrc
Plug 'xolox/vim-misc' | Plug 'xolox/vim-session'
	:
	:
	:
" vim-session
let g:session_directory = '~/vimfiles'
let g:session_autosave = 'yes'
let g:session_autoload = 'yes'
let g:session_autosave_periodic = 0
```

なんか検索して出た解説ではいろいろ書かなくちゃならない感じだったんだけどバージョンの問題なのかこれだけで何の不都合もないみたいです。Windowsだからかな？

## 記事更新中に気がついたこと

- `.`を有効活用できることを意識する、特に反復作業は挿入モードを使ってマクロ的にやれる。
- クリップボードからのペーストがめんどくさかったら`<C-r> +`を有効活用する。但しインデント周りで大変なことになる。
- いい加減にi/aをちゃんと使えるようにする。
キーボード設定覚書

Macbookを初期化してキーボード設定がわからなくなったので、備忘録。

# MacbookPro13(Big Sur) + Kinesis Advantage2 LF

# Karabiner

[Karabiner](https://pqrs.org/osx/karabiner/)と[Complex Modification](https://pqrs.org/osx/karabiner/complex_modifications/) をインストールして、下記の様に設定。
システム環境設定の修飾キーの設定はデフォルトにしておく。

#### mac日本語キーボード
![スクリーンショット 2023-10-02 9.03.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4404/e2f3285f-d270-7281-3178-f4711f79e37a.png)

#### mac英字キーボード
![スクリーンショット 2021-06-24 11.38.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4404/e284a541-965d-74eb-cb0c-6639787a7e31.png)
![スクリーンショット 2021-06-24 11.38.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4404/7c6043c7-9cb6-f2e1-66a8-dcdb37778a73.png)

#### Kinesisキーボード
![スクリーンショット 2021-06-24 11.33.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4404/829b89eb-f875-a826-69a8-dc91e752e253.png)

#### Logi ERGO K860
![スクリーンショット 2023-11-27 19.27.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4404/cfc63550-51b0-3fd6-2785-8f749e51eba5.png)

# Kinesis Advantage2 LF

## thumb mode

`pc`

## program remap

設定開始： `progrm` + `progrm remap(F12)`

その後、下記の順に押下。
（最初に押すキーを次に押すキーの位置にマッピングする。マッピングは連続して行えるが、マッピング中にリアルタイムに反映されるので、設定の順番も重要）

- vimのキーマップに合わせる
  - `↑`　→　`↓`
  - `↓`　→　`↑`
- `Space` →　`Backspace`
- `Backspace` → `Delete`
- `Delete` → `End`
- `Alt（左）` → `Home`
- `<windows>`(Alt) → `Alt（左）`

設定終了：`progrm`

リセット：`Shift` + `progrm` + `RESET(F9)`
linux:Ev3dev.ini

#覚書
webで見るにほとんど事例が見られないものが多いのでメモとして残しています
:10/4~ ubuntu
###まずREADME.md読もうず
鉄則のようです
解凍直下（また細かいのはそれぞれのディレクトリ）にあるので読もう

##現在
`/ev3dev-c/source/ev3`で`make`とか`make shared`とかしようとすると

```
arm-linux-gnueabi-gcc -I. -I../../3d_party -Iev3_link -O2 -std=gnu99 -W -Wall -Wno-comment -fPIC -c ../../3d_party/modp_numtoa.c -o ../../object/./modp_numtoa.o
In file included from ../../3d_party/modp_numtoa.h:37,
                 from ../../3d_party/modp_numtoa.c:4:
/usr/lib/gcc/arm-linux-gnueabi/8.1.0/include/stdint.h:9:16: fatal error: stdint.h: No such file or directory
 # include_next <stdint.h>
                ^~~~~~~~~~
compilation terminated.
make: *** [makefile:294: ../../object/./modp_numtoa.o] Error 1
```
というお叱りを受けたので探索中
ネット上の情報に寄ると`arm-none-eabi-newlib`をインストールするといいよと書いてありましたが、もうすでにインストール済みだった...

##やったこと

yaourtのインストール
arm-linux-gnueabi-gccのインストール
手動
pgpエラー

```
$ yaourt -G arm-linux-gnueabi-gcc arm-linux-gnueabi-binutils
```
[Arch Linuxとパッケージシステム](https://qiita.com/boronology/items/6ea8a4dd540c5980627b)
[One or more PGP signatures could not be verified!](https://bbs.archlinux.org/viewtopic.php?id=191954)
[makepkg](https://wiki.archlinux.jp/index.php/Makepkg)

####makefileに追加

```:ev3dev-c/source/ev3/makefile
 50 ifeq ($(SKIP_PP),0)
 51 PP = python2 -u $(YUPP_HOME)/yup.py    #python -> python2
 52 else
 53 PP = @echo makefile: warning: preprocessing step is skipped,
 54 endif
```
左側は行数
####dockerの起動(自分の場合)

```
$ docker run --rm -it -v ~/contener:/src -w /src ev3cc
```
[Using Docker to Cross-Compile](https://www.ev3dev.org/docs/tutorials/using-docker-to-cross-compile/)
####SSH接続
[Connecting to Ev3dev Using SSH](https://www.ev3dev.org/docs/tutorials/connecting-to-ev3dev-with-ssh/)

sshについても勉強

```
ssh robot@10.199.47.90
```
*`robot`はユーザ名
*IPアドレスのところはev3の画面左上に表示されたもの
Railsのランキング機能で得た知見

#前説
本日あまり進捗生み出せなかったので、記事は少なめです。
今日はDockerの勉強とランキング機能を少し実装しました。
今回はあくまで自分の備忘録です。

#実装内容
Rails 4.2
デザインは未完成ですが、いいねの数を集計してランキングさせた機能です。
いいねに関してはこちらの[リンク(前編)](https://qiita.com/networkyohan69/items/40cf567880557148d8f4)と[リンク(後編)](https://qiita.com/networkyohan69/items/229d0ecf2b578fa2ed0e)

#コード

<img width="1098" alt="スクリーンショット 2018-05-07 23.06.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/253129/5e3a47e8-f752-2445-db32-39feb1d4eca2.png">

```ruby:product_controller.rb
def ranking
    #ランキング機能
    # group(レコード配列)->order(レコード配列)->limit(レコード配列)->count(ハッシュ)
    @like_count_id = Like.group(:product_id).order('count_product_id DESC').limit(10).count(:product_id).keys

    #whereメソッドはidを整列させる作用があり、せっかく順番にしたのに意味がない
    @like_count_product = @like_count_id.map{|id| Product.find(id)}
    @like_count = @like_count_id.map{|id| Like.where(product_id: id).count}
 end
```
#説明書き
着目していただきたいのは、「型」です。
プログラミングにおいてどの「型」で渡すのか、どの「型」を受け取るのかがメソッドを扱う上で重要です。


- テーブルからgroupメソッドで指定したカラムを取得し、レコード配列に。
- レコードをorderで順番に並び替えます。
  -  orderの中身は'count_(カラム) (昇順or降順)'という意味があります。
- limitでレコードを10個取得。
- countはレコード配列で取得しますが、ここでいいね！の数を数えているそうです。  
  -　 orderとcountの順序で違和感を感じた方へ。order('count_(カラム) (昇順or降順)').count(:(カラム))は文法上の作法らしくcountメソッドはレコード配列で取得し、ハッシュで返す為このような順番になった。


###whereメソッドとfind_byメソッド

| メソッド      |       役割 |   
|:-----------------|------------------:|:------------------:|
| where          |              条件に該当するモデルを複数取得 |        
| find_by           |   条件に該当するモデルを一つ取得    |

[参考記事](https://rails-study.net/find-find_by-where/)

orderで降順に取得した要素に対してwhereメソッドを用いると、要素を並び替えてしまいます。

今回は取得した配列をそのまま実行してくれるmapを用います。
mapメソッドはeachメソッドやselectメソッドに似ています。

#終わりに
今回は少し勉強不足な箇所があるので、鉞あればよろしくお願いします。特にwhereメソッドのへん。
Reduxでdispatchしてもstoreが更新されない時はreducerを確認

# dispathcしているのにstoreが更新されない時

**＜ もともと書いていたReducer＞**

```javascript
export default function postListReducer(state = [], action) {
  switch (action.type) {
    case ActionType.FETCH_POST_LIST:
      return action.postList.reduce((accumulator, currentV) => {
        accumulator.push(currentV);
          return accumulator;
       }, state);
    default:
      return state;
  }
}
```

**＜ 修正したReducer ＞**

```javascript
export default function postListReducer(state = [], action) {
  switch (action.type) {
    case ActionType.FETCH_POST_LIST:
      return [...state, ...action.postList];
    default:
      return state;
  }
}
```

元のコードだともともとのstateを変更してしまっています。
Reducerでは新規にオブジェクトや配列を返す必要があるので、正しく動作していませんでした。
(State自体は変更されるが、componentWillReceivePropsが動作しない。)

以上。