OmniAICreator/Qiita-1.07M huggingface dataset:
Unity - "NativeArray<T> where T:struct" の要素を "T[] where T:struct" へ高速にコピーする

Marsha.CopyTo() には IntPtr -> IntPtr のコピーメソッドがないので、kernel32.dll にある CopyMemory() を使う。

```csharp
public static class Kern32 {
	[DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]
	public static extern void CopyMemory(System.IntPtr dest, System.IntPtr src, uint count);
}
```

"T[] where T:struct" は Generic なので fixed ブロックでポインタに変換できない。Marsha.UnsafeAddrOfPinnedArrayElement() で配列の最初のポインタが取れるのでそれを利用する。その前に、GC されないように Pinned データに指定しておく。

```csharp
public static class NativeArrayExtension {
	public static void UnsafeCopyTo<T>(this NativeArray<T> src, T[] dst) where T:struct {
		unsafe {
			var pSrc = (System.IntPtr)src.GetUnsafePtr();
			var hDst = GCHandle.Alloc(dst, GCHandleType.Pinned);
			try {
				var pDst = Marshal.UnsafeAddrOfPinnedArrayElement(dst, 0);
				Kern32.CopyMemory(pDst, pSrc, (uint)(dst.Length * Marshal.SizeOf<T>()));
			} finally {
				hDst.Free();
			}
		}
	}
}
```
jQueryを使って文字数カウントを表示させる方法

textareaなどでjQueryを使って文字数カウントを表示する方法を紹介します。

まずはコードから

```html:sample.html
<!DOCTYPE html>
<html lang="ja">
<head>
 <meta charset="utf-8">
 <title>sample</title>
</head>
<body>

<textarea id="js-count" rows="10" cols="100"></textarea>
        <div class="counter">
          <span class="show-count">0</span>文字
        </div>

<script src="https://code.jquery.com/jquery-3.3.1.js">
</script>
<script src="js/app.js">
</script>
</body>
</html>
```

```javascript:app.js

$(function(){

  $('#js-count').keyup(function(){
    var count = $(this).val().length;
    $('.show-count').text(count);
  });
});
```

- 文字数を取得したいところのid属性やclass属性を入力してノードを取ってくる（ここでは#js-count）

- keyupメソッドを使ってキーを離した時に処理が走るようにする

- 変数（ここではcount）の中に文字数の値を入れる

- 文字を表示したい場所（ここでは.show-count）を指定して.textで値(count)を表示させる
YAMLの60進数の罠

さて、突然ですが、このYAMLをRubyでパースするとどのような結果になるでしょうか？

```YAML
hoge: 12:34
```

多くの人は `{"hoge" => "12:34"}` という結果になると思いますが、実は違います。
このYAMLのパース結果は、`{"hoge" => 754}` です。

この記事の後半では`754` という謎の数字の正体に迫って見ようと思います。

# 仕様書確認
とりあえず、YAMLの仕様書を確認してみます。
こちらが最新版のYAML仕様書なので、この中にそれっぽい仕様があるかどうかを確認してみます。
[YAML Ain’t Markup Language (YAML™) Version 1.2](http://yaml.org/spec/1.2/spec.html)

ですが、このドキュメントを読んでも、この挙動に関する記述は見つからなかったです・・・

# ソースコード確認
さて、仕様書を見てどうも解決しかなったので、ソースコードを読んでみましょう。
読み取った文字列の雰囲気を見て、いい感じにいろんな型に変換変換している部分に謎を解く鍵が見つかりました。
https://github.com/ruby/psych/blob/master/lib/psych/scalar_scanner.rb#L85

この部分の処理によって、文字列を整数型に変換しています。
そして、 `60` というマジックナンバーが登場していることも分かります。

# 仕様書確認 Again
ここで、Rubyのドキュメントを見ると、次のように書かれていました。
https://docs.ruby-lang.org/ja/latest/library/yaml.html

> psych ライブラリ: YAML バージョン 1.1 を扱う事ができます。

バージョン **1.1**

最初に確認していた仕様書のバージョンは1.2でしたので、バージョンが違いました。
というわけで、バージョン1.1の仕様書を確認してみたところ、答えを見つけました。

[YAML Ain’t Markup Language (YAML™) Version 1.1](http://yaml.org/spec/1.1/current.html#id858600)

数値を `:` 区切りで書くことによって、sexagesimal(60進数)で書くことができるようになるようです。
ソースコードに書かれていた `60` というマジックマンバーの正体はこれです。

`754` という謎の数字の正体は `60*12+34` だったんです。

# まとめ
- YAMLで文字列を書くときには念のために `"` で囲むのがベター
- いつも使っているYAMLといえども、仕様書を読むといろんな発見がある
[Chainer, PyTorch] Deconvolutionの出力サイズの計算式

chainerでDeconvolutionの出力サイズの計算がよくわからなかったのでメモ
pytorchの方のドキュメントを漁ったら出て来ました

#pytorchの場合
こちらはちゃんとドキュメントに幅と高さの計算方法を書いてくれてます
https://pytorch.org/docs/stable/nn.html#torch.nn.ConvTranspose2d

```python
class torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True, dilation=1)
```

```math
\begin{align}
    H_{out} &= (H_{in} - 1)\times stride[0] - 2 \times pad[0] + ksize[0] + output\_padding[0] \\ 
    W_{out} &= (W_{in} - 1)\times stride[1] - 2 \times pad[1] + ksize[1] + output\_padding[1]
\end{align}
```


# chainerの場合
ドキュメントには書いていないですが、ソースコードを見るとほぼ同じであることがわかります
https://docs.chainer.org/en/stable/reference/generated/chainer.links.Deconvolution2D.html

```python

class chainer.links.Deconvolution2D(self, in_channels, out_channels, ksize=None, stride=1, pad=0, nobias=False, outsize=None, initialW=None, initial_bias=None, *, groups=1)
```

```math
\begin{align}
    H_{out} &= (H_{in} - 1)\times stride[0] - 2 \times pad[0] + ksize[0] \\ 
    W_{out} &= (W_{in} - 1)\times stride[1] - 2 \times pad[1] + ksize[1]
\end{align}
```

chainerはpytorchと違って`output_padding`がありません。
そのため、$H_{in}$と`ksize`が共に奇数の場合、

```math
\begin{equation}
H_{out} = (奇数-1)\times stride[0] - 2\times pad[0] + 奇数 = 奇数
\end{equation}
```
より、$H_{out}$は奇数にしかなりません
$H_{out}$を偶数にしたい場合は、`ksize`の方を変える必要が生じる場合がありそうです
(GANのコードとかだとdeconvolutionでconvolutionとksizeが違う場合は多々あるのでまあ良いのでは？）
Elasticsearchに関する基本知識

# はじめに

弊社は内部でかなりElasticsearchを使っています
弊社が運用中に見つけた基本的知識を披露します

# Elaticsearchの推奨Node構成

![Elasticsearchの構成.png](https://qiita-image-store.s3.amazonaws.com/0/11006/9205a203-9fac-aca9-2806-f911ca4ffa26.png)

# クエリ

## filter とrange の違い

+ filter するとキャッシュが効く

# 構成

 ノードのhot とwarm に関して

+ “Hot-Warm” Architecture in Elasticsearch 5.x
    + https://www.elastic.co/blog/hot-warm-architecture-in-elasticsearch-5-x

# kibana

+ Kibanaではじめるデータ可視化・分析入門（ビデオ）
    + https://www.elastic.co/jp/webinars/getting-started-kibana

+ 時系列データの異常検知 実践入門（ビデオ）
    + https://www.elastic.co/jp/videos/intro-to-machine-learning-workshop

+ トレーニング 6/4-8 開発者（Engineer I/II）およびKibanaユーザー
    + https://training.elastic.co/?courseId=0&city=TOKYO
JSONってそもそもなに？

# 調べるきっかけ

GitLabでWebhookを用いて自動push時に自動pullとかできたら便利だなぁとか初心者技術マンが思い至った。
そこで最初に見た言葉は
「イベント発生時にGitLabから送られてくるデータは JSON 形式です。」

…さてJSON形式ってなんだ？？？

# 書いてあること

実際の具体的な書き方とかは他のサイトに任せて
JOSNって何？どういうときに使うの？ってところを中心に見ていきます。

# 「JSON」とは

* JSONとは JavaScript Object Notationの略
 ...どういうことでしょう？(英語できません)

* JavaScriptの中でオブジェクトを記述する書式
  ...オブジェクトとは複数の値をまとめたもののことを指すとのことだから
 「複数の値をまとめる記述の書式」の意味であると思う

* データを表現するための記法
  ...砕けて言うならデータの書き方のルールみたいな感じなのかな

* 記述されているデータはコンピューターや人間が見る
  ...つまりどちらが見ても理解できる記法である

* シンプルかつ軽量
  ...記法として左記のような形式をとっていると考えられる

## つまりJSONって・・・

JavaScript内で複数の値をまとめる際の記法のことで、それはコンピューターにも人間にも理解できる記法である。

# どのようなときに使うのか

複数のデータを保存したり、データを送りたいときに使うのかな。

JSON形式を使う理由としてはJSON形式を用いることで

シンプルで軽量...だからデータとして扱いやすく
人間にもわかる...だから楽に理解もしやすいデータ群を作成できる

のだと思う。

## 参考

先人の方々いつもお世話になっております。
以下の参考ページを見るとより実際にJSONをどうやって書くなどの理解が深まると思います。

https://dev.classmethod.jp/etc/concrete-example-of-json/
https://qiita.com/SotaSuzuki/items/c3b46c4e24c1ca9b4d37
https://thinkit.co.jp/article/70/1
【OrientDB】6つのイイところ、7つのイマイチなところ

# はじめに

OrientDBを使用していてよかったところとイマイチなところが結構見えてきたので、イイところ悪いところをつらつら書きます

# イイところ
## Javaでできている
Javaでできているので、基本的にはプラットフォームに依存せずに環境を構築できる。
使用するメモリサイズなどもVMで調整ができる。


## 1. Luceneが使える
文字列の検索のための索引を、Luceneで作ったアナライザで作ることができ、検索もLuceneベースで行える。


## 2. グラフDBとして使え、ドキュメントDBのように柔軟
グラフ理論に基づく検索が可能。
テーブル定義を決め切らなくてもデータの挿入が可能。



## 3. データ操作するためのAPIが豊富
http://orientdb.com/docs/3.0.x/apis-and-drivers/

JavaでできているのでJavaAPIとの親和性は高いと思われます。


## 4. Gremlinが使える
グラフDBを標準的に扱うためのApache TinkerPop Gremlinに対応しているので、ほかのグラフDBと同じインターフェースを使って実装が可能。

https://tinkerpop.apache.org/gremlin.html

## 5. メモリモードがある
メモリモードでDBを作成すると、DBインスタンスを突発的に作成することができる。

DBのサービスを落とすと消えるので、
単体テストとかに使える！！

## 6. Dockerがある
Dockerが用意されているので、Javaのバージョンとかを気にせずに環境構築が簡単にできる。

単体テストに使用しやすい！
マスターシステムではTravisCIで単体テストをする際に、Dockerで起動し、メモリモードのDBを作ってテストしています。
https://hub.docker.com/r/library/orientdb/

# イマイチだったところ
## 1. マイナーバージョンのリリースがめちゃくちゃ早い
### バージョン
3.0系
### 内容
http://orientdb.com/download-previous/
↑のページを見てわかる通り、月に2,3回バージョンが上がります。
バグが治っているのはいいことですが、追従していくにはかなりつらいと思います。

## 2. メモリ不足で落ちると復活しない
### バージョン
3.0.8
### 内容
大量のレコードを検索した際にメモリ不足で`OutOfMemory`が発生すると、その後、`Insert` を行ったりしようとすると、同じく`OutOfMemory` で `Insert`できない。

あと、Studioで大量のレコードを検索するSQLを実行して、`OutOfMemory`が発生すると、レスポンスが返ってこず、操作できなくなる。

Java VMのヒープ領域の指定は起動スクリプト(server.batやserver.sh)内にありますが、2GBが初期値で入っているので、調整するにもここを修正する必要がある。

## 3. バックアップのリストアをすると、独自のLuceneインデックスが壊れる
### バージョン
3.0.8
### 内容

バージョン変更を行う際に

1. 旧DBの停止
2. 旧DBのバックアップの作成
3. 新バージョンのDBをインストール
4. 新DBの環境設定
5. 旧DBのバックアップを新DBへリストア
D6. Bのサービスを起動する

の手順でバックアップをリストアしたときに、バックアップに含まれるインデックスが壊れ、`Insert`などをしようとすると、例外が発生してデータの操作ができなくなる。

`REBUILD INDEX`すると解消するが、これも環境次第では結構時間がかかるので嫌ですね。


## 4. JavaAPIで書き込んでコミットしたはずがデータが登録されていないことがある
### バージョン
3.0.8
### 内容
MDMの書き込みAPIで発生しますが、
POSTして、登録されたはずのデータが、GETしても取得できない時があり、DBにSELECT文を投げてみても取得できないことがある。

DB起動して最初のリクエストで起きやすいような感触です。

## 5. JavaのランタイムはJAVA_HOMEを見ている
### バージョン
3.0.8
### 内容
Javaなので当たり前といえば当たり前ですが、JAVA_HOME環境変数をみて実行されます。

開発しているアプリケーションがJava10だったりすると、同一マシン上でOrientDBを動かしたりしたい場合には少し面倒。

違うバージョンのJavaで起動してしまうと、インデックスのリビルドをするときにエラーになったりする。

起動スクリプト内でJAVA_HOMEを参照して実行しているので、使用したいJavaのディレクトリに書き換えるなどするとよいかもしれません。

## 6. 検索がまあまあ遅い
### バージョン
3.0.8
### 内容
Luceneクエリなどを使って検索をすると、まあまあ時間がかかります。

例はMDMのAPIのItemSourceのSearchです。

## 7. 悲観ロックできない
### バージョン
3.0.8
### 内容
RDBMSなどであるような`SELECT FOR UPDATE`みたいな機能は実装されていない(TODOにはなっている)。

悲観ロックできないので、トランザクション単位でのロックが難しく、処理フローなどを考慮しておかないと不整合が起きやすいかもしれないです。
Github上のREADME.mdに空白行を入れる方法

#目的
##### Github上のREADME.mdに空白行を入れて、表示を見やすくする！

# 方法
空白行を入れたい部分に、下記改行タグを入力するだけ。

```html

<br>
```

# おわり
これで見やすくなりましたね！
<br>
【Google Colaborayory】Pandasメモ【10 minites to pandas】

#はじめに

データサイエンスをやりたくてPython勉強しているんですけど、回帰とか分類とかはscikit-learnとかで何も考えずにできてしまうということがわかった。
その前の前処理のほうがプログラミング力を必要とされるときき、とりあえずPandasを学びました。

#Google Colaboratory

ただ学ぶだけだとつまらないなと思い、Google Colabを活用しました。（使っているパソコンのスペックがあまり高くないのと、今後積極的に使っていきたいなと思ったため）

#参考サイト

参考にしたサイトは下記の通りです。
http://ailaby.com/groupby_yoko/
https://pandas.pydata.org/pandas-docs/stable/10min.html
http://ailaby.com/lox_iloc_ix/
ありがとうございました。

#Pandasまとめサイト

前置きが長くなりましたが、下記の通りです。
https://colab.research.google.com/drive/1whUkvZXhnamxpHVANxa8Xbaqn2GpZeAr

編集可ではなく、閲覧可にしているため実行する場合はPLAYGROUNDにしてください。

#終わりに

・Pandas奥が深い。スラスラ使えるようになりたい。
・Google Colaboratory便利。GPUも使ってみたい。
・「こういう機能をつけたほうがいい！」というのがありましたら連絡ください。
スプレッド・レスト構文七変化

## 配列/オブジェクトの一部として挿入（スプレッド構文）

配列やオブジェクトにスプレッド演算子を使用すると、元のリテラルを展開しながら挿入することが可能になり、結果配列やオブジェクトの一部として同階層に配列/オブジェクトを挿入することができます。

### 配列を配列に入れる

```javascript
a = [ 1, 2, 3 ];
b = [ 4, 5, ...a, 6 ];

console.log(b);

// -> Array(6) [ 4, 5, 1, 2, 3, 6 ]
```

### オブジェクトをオブジェクトに入れる

```javascript
a = {
  z1: 1,
  z2: 2,
  z3: 3
};
b = {
  z4: 4,
  ...a,
  z5: 5
};
console.log(b);

// -> Object { z4: 4, z1: 1, z2: 2, z3: 3, z5: 5 }
```

### 配列をオブジェクトに入れる

```javascript
a = [ 1, 2, 3 ];
b = {
  z4: 4,
  ...a,
  z5: 5
};
console.log(b);

// -> Object { 0: 1, 1: 2, 2: 3, z4: 4, z5: 5 }
```

インデックスをキーとして挿入される。
オブジェクトを配列に入れることは（スプレッド演算子では）できない。

## 配列/オブジェクト同士の結合（スプレッド構文）

上記と同じ方法でスプレッド演算子を複数使うと配列の結合やオブジェクトのマージが可能になります。   
ただ、この場合の結合/マージは１段階の深さで行われるため、多次元の配列/オブジェクトの結合/マージ（いわゆるディープマージ）は再帰的な仕組みが必要になります。

### 配列同士の結合

```javascript
a = [ 1, 2, 3 ];
b = [ 4, 5, 6 ];
c = [ ...a, ...b ];

console.log(c);

// -> Array(6) [ 1, 2, 3, 4, 5, 6 ]
```

### オブジェクト同士の結合（マージ）

```javascript
a = {
  z1: 1,
  z2: 2,
  z3: 3
};
b = {
  z2: 4,
  z3: 5,
  z4: 6
};
c = { ...a, ...b };
console.log(c);

// -> Object { z1: 1, z2: 4, z3: 5, z4: 6 }
```

Object.assignと同じように同じkeyを上書きする。


### 多次元オブジェクトの結合（マージ）

```javascript
a = {
  z1: 1,
  z2: {
    zz1: 2.1,
    zz2: 2.2
  },
  z3: [10, 11, 12],
  z4: 4
};
b = {
  z2: {
    zz2: 2.3,
    zz3: 2.4
  },
  z3: [13, 14, 15],
  z5: 5
};

// (Arrayでない)Objectの判定
const isObject = obj => (obj instanceof Object && !(obj instanceof Array));

// マージ用の再帰的関数
const mergeObj = (x1, x2) => {
  let mg = {...x1, ...x2};
  for (key in mg){
    if (key in x2) {
      if (isObject(mg[key])) {
        mg[key] = mergeObj(x1[key], x2[key]);
      } else if (Array.isArray(mg[key])) {
        mg[key] = [...x1[key], ...x2[key]];
      }
    }
  }
  return mg;
}

c = mergeObj(a, b);
console.log(c);

/*
  {
    z1: 1,
​    z2: {
      zz1: 2.1,
​​      zz2: 2.3,
​​      zz3: 2.4
    },
    ​z3: [ 10, 11, 12, 13, 14 15 ],
    z4: 4,
​    z5: 5
  }
​*/
```

## 配列の一部を末尾から抜き出す（レスト構文）

```javascript
a = [ 1, 2, 3, 4, 5, 6 ];
[ , , ...b ] = a;

console.log(b);

// -> Array(4) [ 3, 4, 5, 6 ]
```

`[...b, , ] = a;`のように頭から抜き出すことはできない。
また同じような操作はオブジェクトに対してはできない。

## 配列/オブジェクト化（スプレッド構文）

### 文字列の配列/オブジェクト化

```javascript
a = 'アイウエオ';
b = [ ...a ];
c = { ...a };
console.log(b, c);
```

1文字ずつを格納した配列、オブジェクトになる。

### Nodelistなどの配列化

```javascript
a = document.querySelectorAll('.item');
b = [ ...a ];
console.log(Array.isArray(a), Array.isArray(b));
// -> false true
```

## 可変長で引数を受け取る（レスト構文）

```javascript
a = (z1, ...z2) => {
  console.log(z1, z2);
};
a(1, 2, 3, 4, 5);
// -> 1 Array(4) [ 2, 3, 4, 5 ]
```

## 配列を展開して関数に渡す（スプレッド構文）

```javascript
a = (z1, z2, z3) => {
  console.log(z1, z2, z3);
};
b = [ 1, 2, 3 ]
a(...b);
// -> 1 2 3
```
JANコードっぽい情報なのにJANコードで探しても見つからない商品がある

物流情報を扱ってる弊社ですが、JANコードを扱うことが非常に多いです

しかし、JANコードっぽい情報なのにJANコードで探しても見つからない商品があります

これはなぜ・・・

# 原因

JANコードっぽいものはITF物流商品情報でした
参考：[集合包装用商品コードとITFシンボル](http://www.dsri.jp/jan/itf.html)

# ITFってなんぞ？

JANコードが商品単品での商品識別コードで、
ITFコードは物流商品識別コードです

つまり、
 [低糖質カルボナーラ CarbOFF（はごろもフーズ）](https://amzn.to/2Q2Dc5C)
にかかれているのがJANコードで、
 [低糖質カルボナーラ CarbOFF（はごろもフーズ）×5個](https://amzn.to/2KIDRDn)
にかかれているのがITFコードです

商品は単品で流通するものと、ある程度セットになって流通するものがあります
ITFコードは一つのJANコードに対して複数紐づくことになりますね

# 問題

さて、ここはQiitaなので、エンジニアっぽい事をこれから書きます
ユーザーが入力するのがJANコードなのかITFコードなのか正直分かりません
今までは、JANコードのチェックデジットだけみて、JANコードの妥当性を見てましたが、
顧客は本当はITFコードを入力していたかもしれない

つまり、JANコードが駄目だったらITFコードのチェックデジットもチェックすればいいんじゃないか

そんな事を考えました

# 成果物

入力した値がJANコードもしくはITFコードであったら**true**を返します

```python
class AucfanJancode:
    total_even = 0
    total_odd = 0

    def setEvenOdd(self, jancode):
        self.total_even = self.total_odd = 0
        for index, item in enumerate(list(jancode)):
            if (index % 2) == 0:
                self.total_even += int(item)
            else:
                self.total_odd += int(item)

    def isJancode(self, jancode):
        self.setEvenOdd(jancode[:12])
        return int(jancode[12:]) == (10 - (self.total_even + (self.total_odd * 3)) % 10)

    def isItfcode(self, jancode):
        if len(jancode) <= 13:
            jancode = '1' + jancode

        self.setEvenOdd(jancode[:13])
        return int(jancode[13:]) == (10 - (self.total_odd + (self.total_even  * 3)) % 10)
        return 10 - (self.total_odd + (self.total_even * 3)) % 10

    def isCode(self, jancode):
        return self.isJancode(jancode)  or self.isItfcode(jancode)
```

8桁のものもあるぞー！
とか、
UPC対応は？
みたいな話もあるので、もうちょい桁数チェックとか厳密にやっても良かったかもしれませんが、今回はこれで勘弁してください
FlatListのonEndReachedにリストの遅延読み込みを仕込むと複数回コールバックする問題

## 前提
[前回](https://qiita.com/arasakin/items/415363df32c7b5f8a13e)書いたときに、FlatListは下にスクロールしてリストを追加ロードするのに使うもんだと思い込んでしまった。

なので、前提。
「下方向にスクロールし、端に到達すると次のリストを追加で読み込み、コンテンツが続く限りスクロールできる画面をFlatListを用いて作る」

## 問題
次のコードのように作ったら、画面遷移してきたときになぜか4回もfetchListが走った。

```JSX
class ListScreen extends React.Component<Props, States> {
  // ...略...
  componentWillMount() {
    // 前回の記事に書いた件
    // 前に読み込んだリストをクリアしておかないと、最初に一瞬renderされてしまうため
    this.props.clearList();
    // 次のリストを10件取得するアクションをdispatchする関数
    this.props.fetchList();
  }
  // ...略...
  render() {
    return (
      <View>
        <FlatList
          // 下に引っ張ったらリロード
          onRefresh={() => {
            this.props.clearList();
            this.props.fetchList();
          }}
          // onRefreshを書いたら必ず必要な、リフレッシュ中を示すフラグ
          refreshing={this.props.isRefreshing}
          // 端に来たら次のリストを10件取得するアクションをdispatchする関数
          onEndReached={this.props.fetchList}
          // 端の閾値
          onEndReachedThreshold={0.5}
          data={this.props.list}
          renderItem={({ item }) => (
            <ListComponent
              list={item}
            />
          )}
          // ...略...
        />
      </View>
    );
  }
}
```

## 解決
次のように書き換えたら、なぜかうまくいった…。
理由がちゃんとわかったら追記します。

```JSX
class ListScreen extends React.Component<Props, States> {
  // ...略...
  componentWillMount() {
    this.props.clearList();
  }
  componentDidMount() {
    this.props.fetchList();
  }
  // ...略...
}
```

## ヒントになった参考資料
https://github.com/facebook/react-native/issues/12827#issuecomment-290461093
設計書の書き方

#設計書の書き方
##画面設計書書いた時ベテランの人が教えてくれたことなど
大した内容じゃないけど、どっかに書いてあることではないのでメモ
##Excel方眼紙を作るのを忘れない。
## メモ帳で下書き作るのも有効
##ノート
繋げる
表の大きさ揃える
線と文字が重ならない
半角・全角
大文字・小文字
一行と一行の空き

#その他 ワードを使っている場合
　見出し
　本文
↑その違いに気づくのがポイントみたいだった。
##表を作るときの言葉参考
[区分]
No. 値
## よく使う言葉
・システム日付
・yyyy/MM/dd
## 語句
・入力したコード値
・取得したコード名称
・前画面で指定した部店コード
・非チェック状態にする
・先頭ページを表示する。
・・・から遷移
・〇〇が無い場合非活性
・照合し、口座番号を付与する。

##フレーズ集
・システムで取得した情報を設定する
・取得したコード名称をプルダウンリストに設定する。
ヘッダー右上の部店名(部店コード）に前画面から引き継いだ部店名・部店コードを設定する。
・〇〇日設定
前営業日を設定し、非活性にする。
・〇〇を取得する
テーブルから前々営業日以前の基準日一覧を取得する。
・データ基準日設定
FROMに最小の基準日をTOに前々営業日を設定しヘッダー右上に（以下同様の文）
検索条件の基準日プルダウンリストに基準日一覧を設定する。
・課一覧取得
部店に所属する課コードの一覧を取得する。
・〇〇チェック　
顧客情報のデータ管理、外部機関への依頼状況やチェック結果の管理を行う。
・〜にアクセスする。
Slackとワイヤレスボタンで「呼び出しシステム」を作ってみた！

#Gravioボタン！
”あのボタン”を使った記事を目にすることが多いので、私は[Gravio](https://www.gravio.com/jp/gpromo/1901-casual-iot)を使って実現してみます！！！

“あのボタン”はオールインワン型で、ボタン機能とネット接続機能がセットのソリューションです。手軽さがすごく魅力的ですよね！ただ、大量のボタンを同じエリアに設置する場合などはコストなどの関係で、安価なボタンを活用し、設置エリア内で集中管理したほうが適切な場合もあるかもしれません。IoTは適材適所なので、一概に“コレがベスト”が無いのが面白いところですね。

というわけで、Gravio流で実装してみたいと思います。

#元ネタ
イギリスのエリザベス女王、ローマ法王、カナダのトルードー首相が皆持っているそうです。私も欲しい。つまらない会議から脱出したい時に押すボタン。
https://twitter.com/JICRochelle/status/1062842367105884162

側近の方々の中には、WindowsPCやMacbookを持ち歩いている人がいるはず！
とすれば、Gravioを使ってできちゃいます:point_up_2:

今回は、ボタンが押されたタイミングでSlackで呼び出すシステムを作ってみました。

#準備するもの
■実機
WindowsPC
Gravioレンタルデバイスのワイヤレススイッチ

■サービス
[Gravio](https://www.gravio.com/jp/gpromo/1901-casual-iot)
　-Gravio Studio　Version.2.0.2000
　-Gravio Service　Version.2.0.1997
Slack（トークンまで事前準備）

#Gravioの設定
##STEP1　センサーの設定
###センサーとペアリング
ワイヤレススイッチとペアリングします。
センサーがチカチカっと光り、以下の画面となれば、ペアリング完了です。
![センサーペアリング](https://qiita-image-store.s3.amazonaws.com/0/247209/26466d73-f13e-9c68-8473-41276029deaf.png)

ペアリングについては、[こちら](https://www.gravio.com/jp/sensor-setup-guide)をご参照ください。

###センサーの登録
（1） エリア・レイヤーを登録する
画面右上の”＋”ボタンをクリックし、エリアを作成します。
エリアを作成すると自動的にレイヤーが作成画面が表示されるので、SENSING DEVICE TYPEにAqara-WirelessSwitchを選択します。

（2） レイヤーにデバイス（センサー）を登録する
一番右のデバイスウィンドウの”⊕”ボタンを選択し、デバイスを追加します。
デバイスのスライドボタンをONにすることで、データの収集が開始されます。

##STEP2　Slackの設定
Slackは2つ用意します！
脱出スラック：5分後に呼びに来て。
即脱出スラック：今すぐ呼びに来て

Gravio上で、アクションを作成します。
###動作（アクション）を作成する
サーバ管理画面より、アクションボタンをクリックし、アクション管理画面を表示します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247209/8162e59c-8b74-fe05-8f18-20a12e3722d0.png)
アクション管理画面の右上の”＋”をクリックし新しいアクションカードを作成します。
作成したアクションカードをダブルクリックし、アクションを設定します。

###アクションの設定
”ステップの追加”の下に表示されている"+"をクリックし、Slackコンポーネントを設置します。
コンポーネントのプロパティにトークンとチャネル、メッセージを設定するだけです。

|項目|内容|
|:---|:---|:---|
|Token|"取得したトークン"|
|Channel|#general|
|Text|"5分後に呼びに来て。"|

アクション（動作）ファイル名を編集しておくと、あとで設定をするときわかりやすいです。
（アクション編集画面の左上にあるAction1と書かれているところを変更するとアクション名が変わります）
作成した画面はこちら。（設定したところを赤枠で示しています）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247209/c24c585a-0e68-8ee0-6c20-c42eca3023f3.png)

##STEP3　動作タイミング（トリガー）の設定

ワイヤレススイッチをクリックしたタイミングで脱出スラックを呼び出す設定をします。
トリガー画面から、"＋”をクリックしトリガーを作成します。
トリガーの設定内容は以下のとおりです。

|項目|設定値|
|:---|:---|
|エリア|ワイヤレススイッチのエリア|
|レイヤー|ワイヤレススイッチのレイヤー|
|アクション名|脱出スラック（作成したアクションカード）|
|Interval|5（Default）|
|Classic/Threshold Trigger|Classic Trigger（Default）|
|Button press|Single Press（Default）|

次にダブルクリックの動作タイミングを設定します。
先程と同じように、"+"を選択し、新しいトリガー設定を作成します。
アクション名を”即脱出スラック”、Button pressの設定を"Double Click"に設定します。

これで、設定が完了しました！

#使ってみた
会議中に使ってみました。
ワイヤレススイッチをクリック
![ボタン一回クリック](https://qiita-image-store.s3.amazonaws.com/0/247209/b73d9981-ea32-f379-5155-bae7bbb06324.png)
ダブルクリック
![ダブルクリック時の動作](https://qiita-image-store.s3.amazonaws.com/0/247209/a0ced484-a434-a3b0-e980-407e5246af2c.png)

こんな感じで動作します！

#あとがき
今回は会議の際に呼び出す仕組みを作成しましたが、店舗などでお客様に押して頂ければ来客が判断できたりしますね。
ホテルなどで良く見かける呼び鈴を大幅に機能拡張することができるのではないでしょうか。複数の人に同報したり、遠距離の人に知らせたり、はたまた押された数をカウントしたりすれば、時間軸と合わせて職員のシフトの調整などにも活用できそうですね。

##参考
[あのボタンで呼び出しボタンを作って見た](https://qiita.com/keni_w/items/b29aee5a7f65c075557f)
Rubyで四則演算ができる簡単な計算機を作る

progateでRubyなどを学んで、自分でもアウトプットしたいと思っている方々がいるような気がしたので、自分がrubyを理解するために書いていたコードをベースに、四則演算できる計算機の作り方を公開します。対象はruby学びたての初心者です。

## 学べること
- 条件分岐文(if文)の使い方
- 繰り返し処理の使い方
- メソッドの使い方

## ファイルを作成
rubyはインストールされている前提で。どこでもいいのでrubyを書くことができるファイルを作りましょう。calc.rbとかでいいと思います。

## 変数の定義
最初に後々に使う変数を定義します。変数とは、名前をつけて一時的に値を保管しておく箱のようなものです。

```ruby:calc.rb
# loopの中にある変数は外から呼び出すことができないので、loop文の外で定義しないといけない。
# そしてその変数を更新する形で、数字を上書きする。
number = 0
number_second = 0
```
##メソッドの定義
四則演算をするためのメソッドを定義します。メソッドとは、一種の便利ボックスで、そのボックスに値を入れたら、求めている結果が返ってきます。自動販売機をイメージするとわかると思うんですが、僕たち、普段は自販にお金を入れて飲み物を買っていますが、お金を入れたから飲み物が出てくるまでの仕組みを知っているわけではないですよね。それと同じで、値を入れたら求めているものが出てくる箱がメソッドです。

```ruby:calc.rb
# メソッドの定義
def add(f, s)
    puts f + s
end

def subtract(f, s)
    puts f - s
end

def multiply(f, s)
    puts f * s
end

def division(f, s)
    puts f / s
end

def modulo(f, s)
    puts f % s
end
```
## 最初の文字を入力
最初の文字を入力する処理をするためのコードを書きます。例外として、数字以外が入力された場合を省いています。

```ruby:calc.rb
# 最初の数字を入力
print "Hello, Let's cariculate! Please enter a first number:"

loop do
    # ユーザーは文字(string)か数字(integer)を入力する。
    number = gets.chomp
    # ---
    # [前提知識]
	# 1.文字列にto_iをつけると全て0になる。
	# => numberをintegerに変更したときに、0にならない場合はbreak(次の数字が打てるようになる)。
    # 0になる場合はそれが文字列ということになるのでerror発生。
	# 2.上記条件のみだと、直接0が入力されたときにbreakできない。
    # => 0だけ例外的にbreakする処理をかく。例外的に入力した文字をstring変換した時に、
    # 結果が"0"の場合にはbreakするようにする。
    # ---

    # to_sはデフォルトだからつけなくても良い。||は「または」(&&は「かつ」)。
    if number.to_i != 0 || number.to_s == "0"
        #後の過程で計算に使用するため、integer型(又はfloat型)にする必要がある。
        number = number.to_i
		break
    else
        print "Error:Please enter a number:"
	end
end
```
##二番目の数字を入力
一番目の数字を入力するときと全く同じです。

```ruby:calc.rb
# 二つ目の数字を入力。
print "Please enter a next number:"

loop do
	number_second = gets.chomp
	# 上記と同じプロセス。
	if number_second.to_i != 0 || number_second.to_s == "0"
		number_second = number_second.to_i
		break
    else
        puts "Error:Please enter a number"
	end
end
```
## オペレーターを入力
どのオペレーターで計算をするのかを入力します。

```ruby:calc.rb
# オペレーター(+・-・*・/・%のどれか)の入力。
print "Please input operator:"

operator = ""
loop do
    operator = gets.chomp
    break if operator == "+" || operator == "-" || operator == "*" || operator == "/" || operator == "%"
    # break if %w(+ - * / %).include?(operator)という書き方も可能。「+,-,*,/,%のいずれかがoperatorに含まれている場合、breakする」という処理
    puts "Invalid operator"
end
```
## 処理の実装
オペレーターによって、処理が変わるように実装しています。ここでメソッドを活用しています。

```ruby:calc.rb
# オペレーターによって処理を変える。case文を使っても良い。
print "The answer is "
if operator == "+"
    add(number, number_second)
elsif operator == "-"
    subtract(number, number_second)
elsif operator == "*"
    multiply(number, number_second)
elsif operator == "/"
    division(number, number_second)
elsif operator == "%"
    modulo(number, number_second)
end
```

## 終わりに
Rubyについて習熟するためには、progateをひたすらやるだけではなく、自分で考えて手を動かすことが大事になってくる気がするので、積極的にアウトプットしていきましょう。
AWS LambdaでC++を動かす

この記事は「ユニークビジョン株式会社 Advent Calendar 2018」の1日目記事です。

カレンダーのURLはこちら
https://qiita.com/advent-calendar/2018/uniquevision

# はじめに
re:Invent 2018にてAWS Lambdaの新機能、Custom Runtimeが発表されました。
この機能は、Custom Runtimeを用意することで任意の言語でLambdaを使用できるようにするものです。

Custom Runtimeは自前で実装しても良いですし、AWSによって提供されているものもあります。
以下は2018/11/30 18:00時点で公開されているCustom Runtimeです。
- https://github.com/awslabs/aws-lambda-cpp
- https://github.com/awslabs/aws-lambda-rust-runtime

この記事では、公開されているC++のCustom Runtimeを用いてC++で実装されたLambda関数を作成します。

# Runtimeの作成
基本的には前述のaws-lambda-cppに記載のある手順に従うことになります。
ただし、ビルドはLinux上で行う必要があるため、ここでは以下のようなDockerを用意します。

```dockerfile:Dockerfile
FROM alpine:latest

RUN apk update && apk add cmake make git g++ bash curl-dev zlib-dev zip

WORKDIR /usr
RUN git clone https://github.com/awslabs/aws-lambda-cpp-runtime.git && \
  cd aws-lambda-cpp-runtime && \
  mkdir build && \
  cd build && \
  cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=~/lambda-install && \
  make && make install

WORKDIR /home
```

以下のようなコマンドでビルド・起動します。

```
$ docker build -t aws_lambda_cpp .
$ docker run --rm -it -v `pwd`:/home aws_lambda_cpp:latest /bin/bash
```

# Lambda関数を作成
ここもチュートリアルに従います。

- 以下の2ファイルを用意します

```CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD 11)
project(demo LANGUAGES CXX)
find_package(aws-lambda-runtime)
add_executable(${PROJECT_NAME} "main.cpp")
target_link_libraries(${PROJECT_NAME} PRIVATE AWS::aws-lambda-runtime)
target_compile_features(${PROJECT_NAME} PRIVATE "cxx_std_11")
target_compile_options(${PROJECT_NAME} PRIVATE "-Wall" "-Wextra")

# this line creates a target that packages your binary and zips it up
aws_lambda_package_target(${PROJECT_NAME})
```

```cpp:main.cpp
#include <aws/lambda-runtime/runtime.h>

using namespace aws::lambda_runtime;

static invocation_response my_handler(invocation_request const& req)
{
  if (req.payload.length() > 42) {
    return invocation_response::failure("error message here"/*error_message*/,
                                        "error type here" /*error_type*/);
  }

  return invocation_response::success("json payload here" /*payload*/,
                                      "application/json" /*MIME type*/);
}

int main()
{
  run_handler(my_handler);
  return 0;
}
```

- Dockerコンテナ内で以下の通りに実行します

```
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=~/lambda-install
$ make
$ make aws-lambda-package-demo
```

- デプロイします。Roleは適切に設定してください。

```
$ aws lambda create-function --function-name demo \
--role <specify role arn from previous step here> \
--runtime provided --timeout 15 --memory-size 128 \
--handler demo --zip-file fileb://demo.zip
```

- デプロイが成功したら、Lambda関数を実行します。

```
$ aws lambda invoke --function-name demo --payload '{"answer":42}' output.txt
```

- 正常に動いていたら以下のように表示されるかと思います。

```:標準出力
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}
```

```output.txt
json payload here
```

# まとめ
チュートリアルに従って、AWS LambdaでC++を動かすことが出来ました。
今でこそRustのような現代的な言語に立場を奪われつつありますが、過去の資産が充実しているC++がServerlessで動くのであれば用途もあるのではないでしょうか。
MacでローカルIPアドレスが一発でわかる方法

仕事で自分のIPアドレスを調べるのに簡単な方法を教えていただいたのでまとめます。

# 手順
上部にあるバーからインターネットのアイコンをクリックします。
<img width="399" alt="Screenshot 2018-11-30 at 15.42.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/181534/cd904ab3-fa55-998f-1f5e-8208d09cdc7f.png">
open Network Preferencesを選択
<img width="292" alt="Screenshot 2018-11-30 at 15.42.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/181534/279c404b-cd57-6960-c0b5-15130cb10b5a.png">
赤枠に囲まれているところにローカルIPアドレスが見えます
<img width="669" alt="Screenshot 2018-11-30 at 15.42.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/181534/bbcd2581-af78-33b8-07aa-cc056ca07e3a.png">

ちなみにグローバルIPアドレスを調べるには[こちら](http://www.cman.jp/network/support/go_access.cgi)から一発で調べられます。
Vue Routerでのページネーションライフサイクル

忘れないように記録。

# 解決すべき問題

> パラメータまたはクエリの変更は enter/leave ナビゲーションガードをトリガーしない

https://router.vuejs.org/ja/guide/advanced/navigation-guards.html

例えば検索クエリが変わっただけではコンポーネントは更新されない。

# 解決策

公式サイトに書かれている通り、beforeRouteUpdate(to, from, next)を使う。
/users?page=1から/users?page=2に移動するときなどに呼ばれる。

# ページネーションのライフサイクル

/usersという一覧画面を考える。

```index.js
import Vue from 'vue';
import VueRouter from 'vue-router';
Vue.use(VueRouter);

import UserIndex from 'path/to/UserIndex';

const routes = [
    { path: '/users', name: 'users', component: UserIndex },
];

const router = new VueRouter({ 
    mode: 'history',
    routes,
});

const app = new Vue({
    router
}).$mount('#app');
```

```UserIndex.vue
<template>
...
</template>

<script>
export default {
    data () {
        return {
            baseUrl: '/users',
            query: {},
            data: [],
        }
    },
    mounted () {
        const url = this.makeUrl(this.baseUrl, this.$route.query);
        this.fetchUserList(url);
    },
    beforeRouteUpdate (to, from, next) {
        const url = this.makeUrl(this.baseUrl, to.query);
        this.fetchUserList(url);
        next();
    },
    methods: {
        makeUrl (url, query) {
            // 検索条件を元にURL作成
        },
        fetchUserList (url) {
            // APIなどからデータ取得
        },
        search () {
            this.query.page = 1;
            const url = this.makeUrl(this.baseUrl, this.query);
            this.$router.push(url);
        },
        changePage (page) {
            this.query.page = 1;
            const url = this.makeUrl(this.baseUrl, this.query);
            this.$router.push(url);
        },
    },
}
</script>
```

初回表示から検索、ページ移動の流れを以下にまとめた。

- mounted()で初回データ表示。
- 検索するとsearch()を実行、新しい検索条件のurlが作られ、それで$router.push(url)される。
- push()されると、beforeRouteUpdate()が実行されて、そこで新しい検索クエリを元にデータを取ってきて表示。
- ページ移動はページ番号を引数としたchangePage(page)が呼ばれて、新しいページ番号を含むurlが作られ、それで$router.push(url)される。
- push()されると、beforeRouteUpdate()が実行されて、そこでデータを取ってきて表示。

こんな感じでしょうか。
URLを元にして処理を実行していく感じです。
今回はVuex抜きでやったけど、Vuexありでも流れは変わりません。
何かの助けになれば幸いです:pray:
[MacOS]Jupyterテーマ変更&アウトプット表示が見切れる問題対処方法



###はじめに
以下のOSに対してのJupyterNotebookのテーマ変更方法および、
アウトプットの表示が見切れてしまう問題への対処方法となります。

***OS：Mac OS Mojave***

###1.Jupyter Notebookのテーマを変更

参考
[Jupyterのレイアウトを変える方法](https://qiita.com/yujikawa/items/41c898ccfaae3b49e0cf)

###1-1. Terminalでコマンドにより好きなテーマに変更


```terminal:例
jt -t onedork -fs 95 -tfs 11 -nfs 115 -cellw 95% -T -N
```

###2.隠しフォルダの表示
####2-1. /Users/{ユーザー名}　のディレクトリに移動

####2-2. FinderでCommandキー + Shiftキー +　ドット(.)を押下

###3.CSSファイルを編集

###3-1. ~/.jupyter/custom/custom.cssに移動

###3-2. CSSファイルの以下の箇所を編集

```css
div.output_subarea {
 overflow-x: auto;
 padding: 1.8em !important;  /* もともとコレ padding: 0.8em !important;*/
 -webkit-box-flex: 1;
 -moz-box-flex: 1;
 box-flex: 1;
 flex: 1;
}
```

参考
[Jupyter notebookのthemeを変えたら出力セルが見切れる件](http://kenbell.hatenablog.com/entry/2018/09/29/173108)
“View Controller“ is unreachable because it has no entry points, and no identifier for runtime access via -[UIStoryboard instantiateViewControllerWithIdentifier:].

#過去に出会った警告メッセージとその対処方法備忘録
##環境
- XCode
- Swift4.2

##警告メッセージ
“View Controller“ is unreachable because it has no entry points, and no identifier for runtime access via -[UIStoryboard instantiateViewControllerWithIdentifier:].


##原因と対処方法
###原因
ストリーボード上で定義している「View Controller」がどこからもアクセスされていないよって言っています。
使われていないViewControllerがストーリーボード上に存在しているようです。

###対処方法
不要なViewControllerは削除してしまいましょう。
テスト用等で一時的に退避している場合は意図通りだと思うので、一旦無視して最終的には解決するようにしましょう。
pythonでhello world その2

#概要
pythonで、mcs使って、hello worldやってみた。

#サンプルコード

```
# coding: utf-8
# Your code here!

import subprocess
import os

def mcs():
    cs_file = 'Hello.cs'
    test_cs = """
public class Hello{
    public static void Main(){
        System.Console.WriteLine("Hello C#");
    }
}
"""
    with open(cs_file, 'w') as f:
        f.write(test_cs)
    os.system("mcs %s" % cs_file)
    cmd = "mono Hello.exe"
    result = subprocess.Popen(cmd.split(), stdout = subprocess.PIPE).communicate()[0]
    for i, v in enumerate(result[ : -1].split('\n')):
        print v

if __name__ == '__main__':
  mcs()
 
```

#成果物

https://paiza.io/projects/VX-QEyfQ8phig6PnSKNjqw

以上。
独自ドメインを使用して、静的ウェブサイトを作成する（Route 53 + S3）

使用するAWSサービス
・Amazon Route 53
・Amazon S3

なお、具体的な Route 53 や S3 の使い方などについては省きます。


---

###1.ドメインを作成し、NSレコードを登録する###

Amazon Route 53 のドメインは有料なので、 [freenom](http://www.freenom.com/ja/freeandpaiddomains.html) で取得しました。

ドメインの取得が完了したら、Route53を開き、freenom で取得したドメインを [DNS management] に登録してください。

最後にRoute53のNSレコードを freenom に登録してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/931ee645-8771-1622-d5ac-cd55c8e1dff5.png)


###2.バケットを作成し、データをアップロードする###

ルートドメイン (leonmaron.tk) 
サブドメイン (www.leonmaron.tk) 
の両方からのリクエストをサポートするために、2 つのパケットを準備してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/07ba846d-6d05-debf-76f4-1d0f2e38d5d6.png)

今回はテスト用に、適当に index.html ファイルをルートドメインのバケットにアップロードしておいてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/0fe2e426-ec99-e295-9b0d-2d90e819f83a.png)


###3.バケットにパブリック読み取り権限を付与する###

すべてのユーザー誰でも、外部から見れるように読み取りアクセス権限を付与します。

「アクセス権限」の「パケットポリシー」からパケットポリシーエディターを入力し、「保存」。
（これは、ルートドメインのみに設定）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/83ae1db2-edae-c931-d696-abb437b7a9bd.png)

↓"Resource"部分は自分のルートドメインのものに置き換えてください。

```
{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::leonmaron.tk/*"]
    }
  ]
}
```


###4.バケットをウェブホスティング用に設定する（ルートドメイン）###

ルートドメイン側の「プロパティ」を開き、「Static website hosting」をクリック。
「このバケットを使用してウェブサイトをホストする」にし、[インデックスドキュメント] に、index.html と入力し、「保存」。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/8da1b6ca-e208-f2db-52e4-d6fb03aba316.png)

これで、ルートドメイン側はダイレクトに見れます。


###5.ウェブサイトのリダイレクトを設定する（サブドメイン）###

サブドメイン側の「プロパティ」を開き、「Static website hosting」をクリック。
「リクエストをリダイレクトする」にし、「ターゲットバケットまたはドメイン」にルートドメインを入力し「保存」。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/3d1c7d49-e88a-77e6-bb7f-3db48153a076.png)

これでサブドメインはルートドメインにリダイレクトされます。


###6.ウェブサイトトラフィックのログ記録を設定する(オプション)###
オプションで、ウェブサイトにアクセスする訪問者数を追跡するログ記録を設定できます。
そのためには、ルートドメインバケットのログ記録を有効にしておきます。

「プロパティ」の「サーバーアクセスのログ記録」より、「ログの有効化」。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/40f1710b-8910-bfc8-d21c-b3899b4cc43c.png)


###7.Aレコードを追加する###

Route53 を開き、ルートドメイン、サブドメインにAレコードをそれぞれ追加してください。
ルートドメインの場合のみ下記の記載します。
Type:A-IPv4 Address
Alias:Yes
Alias Target:S3のバケット
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/d391c1fe-d34e-83a8-164e-a8cbabbf4c55.png)


###8.テスト###
これで、ルートドメインが表示されるか、サブドメインがリダイレクトされるか確認してみましょう！

また、6.で設定したログも記録されているか確認してみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/914b9f93-f712-6535-22fe-e52bb7b89e51.png)
ロード完了時に任意の処理を実行させる件メモ

最近、脱ぢぇーくえりーで既存のコードをES5に書き換えてます。
そしてJQUERYの便利さを痛感しております。

さて、タイトルのようにページ読み込みが完了した段階で何かをしたい場合、JQUERY先生だと

```javascript
$(function(){
  処理内容
});
```
でOKです。なんて簡単なんだ！！
これをES5にすると

```javascript
window.onload = function(){
  処理内容
};
```
となります。
以上！！
っておーーーーーい！！

この書き方には落とし穴がありましたｗ
複数のwindow.onloadが存在すると最後のものが上書きされ、それ以前の処理は動きません。

```javascript
window.onload = function(){
  console.log('Lupin the first');
};
window.onload = function(){
  console.log('Lupin the second');
};
window.onload = function(){
  console.log('Lupin the third');
  // ルパン3世だけ表示される
};
```

なので、理解した上でwindow.onloadを使うなら良いですが、知らないで乱発すると酷い目にあいますｗ
では、複数の処理を書きたい場合はどうしたらよいのか？

```javascript
document.addEventListener('DOMContentLoaded', function(){
  console.log('Lupin the first');
}, false);
document.addEventListener('DOMContentLoaded', function(){
  console.log('Lupin the second');
}, false);
document.addEventListener('DOMContentLoaded', function(){
  console.log('Lupin the third');
}, false);
```

こんな感じで良さそうです。
DOMContentLoaderdは画像等すべてのリソースが読み込み終わった時に何かをしたい場合はloadで。
pluckメソッドが便利な件について

今回はpluckメソッドが便利だったので自分なりにまとめてみました。

##pluckメソッドとは・・・
公式ドキュメントでは以下のように記載されています。

>pluckは、1つのモデルで使用されているテーブルからカラム (1つでも複数でも可) を取得するクエリを送信するのに使用できます。引数としてカラム名のリストを与えると、指定したカラムの値の配列を、対応するデータ型で返します。

ふむふむ。わかったようなわからないような・・・


##使い方は？

では、実際のコードを見ていきます。

Productモデルがあったとして、nameカラムの中身を確認したい場合は、

```ruby
Product.pluck(:name)
=> ["Ruby on Rails Tote",
 "Ruby on Rails Bag",
 "Ruby on Rails Baseball Jersey",
 "Ruby on Rails Jr. Spaghetti",
 "Ruby on Rails Ringer T-Shirt",
 "Ruby Baseball Jersey",
 "Apache Baseball Jersey",
 "Ruby on Rails Mug",
 "Ruby on Rails Stein"]
```

といったようにProductモデル内のnameカラムを一覧表示することができます。

```ruby
Product.pluck(:id,:name)
=> [[1, "Ruby on Rails Tote"],
 [2, "Ruby on Rails Bag"],
 [3, "Ruby on Rails Baseball Jersey"],
 [4, "Ruby on Rails Jr. Spaghetti"],
 [5, "Ruby on Rails Ringer T-Shirt"],
 [6, "Ruby Baseball Jersey"],
 [7, "Apache Baseball Jersey"],
 [8, "Ruby on Rails Mug"],
 [9, "Ruby on Rails Stein"]]
```
このように第二引数を設定することも可能です。

便利ですね〜


```ruby
Product.select(:id, :name).map { |c| [c.id, c.name] }
```

また上記のselectメソッド、mapメソッドを利用したコードと上記のコードは同等の意味になるので、pluckメソッドを上手く活用することでコードをシンプルに書くことができますね。

##注意点

ただ、pluckメソッドには注意点もあります。

```ruby
Product.pluck(:name).limit(1)   
=> NoMethodError: undefined method `limit' 
```

pluckメソッドは最初のようなケースではエラーが出てしまいます。

なぜなら、pluckメソッドはクエリを直接トリガするので、その後ろに他のスコープをチェインすることはできないからです。

```ruby
Product.limit(1).pluck(:name)
=> ["Ruby on Rails Tote"]
```

ただし上記のように、構成済みのスコープに対してpluckの前に置くことはできます。



以上、簡単ではありますがpluckメソッドに関しての投稿でした。


【参考記事】
https://railsguides.jp/active_record_querying.html
RailsのDB・マイグレーションファイル・schema.rbの関係性と役割について

こんにちは、Rails初心者のゼキです。

- DB
- migrationfile(マイグレーションファイル）
- schema.rb

rails db:migrate(db:rollback)した際にこれらがどのような関係性と役割を持って動作しているかを学びましたのでまとめてみます。


## 関係性
- `db:migrate(db:rollback)`の実行によって、`migrationファイル`に記載された内容がDBに記入される。
- その後、自動的に`db:schema:dump`が実行され、`scheme.rb`が更新される。


## 役割
- scema.rb
	- migrateしたことによって変化した**現在の**DBのテーブル構造を表している。

- migrationfile
	- データベースに記入される内容
	- db:migrate することで、その内容に基づいたデータテーブルがDBに生成される

## その他学び
- scema.rbを直接編集する意味はない
	- scema.rbは現在のDBのテーブル構造を表示しているだけのファイルなので
アジャイルWeb開発チームのカンバン上に付箋紙で作られた「楽しさ5」の文字が出現‥その秘密とは？ 

# ドン！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/65b496dc-8342-c3f0-547d-a668e9082c34.png)

# これは何？ インセプションデッキで出てきた言葉

- インセプションデッキとはチームの自己定義のための手法
- 10項目ぐらいの質問があって、チームで考えて答えていく
- その中の「トレードオフスライダー」で1メンバーが出した答え

# トレードオフスライダーとは

- すべての要素の中で何を重視するかの目盛り
- 基本はテンプレに合わせて回答するが、最後に一つ「オリジナルのスライダー項目を作るなら何にする？」という質問がある
- ひとりのメンバーの「楽しさを重視しよう！」という根本的な答えに、チーム全員や全米が同意した、この場合の5はMAX値
- 実は全員「楽しさ」が頭に思い浮かんでいたけど、あえて言わなかった感はある、その一人をのぞいては

# 楽しさ５！

- 楽しくなければプログラミングではない
- 面白くなければチーム開発ではない
- 人間やめますか？それとも楽しさ5開発を目指しますか？

# Next?
[チームyumainaura - Google Search](https://www.google.co.jp/search?q=%E3%83%81%E3%83%BC%E3%83%A0yumainaura&oq=%E3%83%81%E3%83%BC%E3%83%A0yumainaura&aqs=chrome..69i57j69i61j69i60j69i61j69i65j0.1937j1j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ヤヤネヒのcc_(キャラ).cfgファイル&.modelファイルサンプル


![フォルダ構成2.png](https://qiita-image-store.s3.amazonaws.com/0/321162/287d30d9-36bb-2327-90f4-abc4ec37c528.png)

yayanehi.model.json

>{
	"version":"Sample 1.0.0",
	"model":"yayanehi.moc",
	"textures":[
		"yayanehi.2048/texture_00.png"
	],
	"motions":{
		"idle":[
			{"file":"mtn/idle.mtn"}
		],
		"":[
			{"file":"mtn/01.mtn"},
			{"file":"mtn/02.mtn"},
			{"file":"mtn/03.mtn"},
			{"file":"mtn/04.mtn"},
			{"file":"mtn/05.mtn"}
		]
	},
	"physics":"yayanehi.physics.json",
	"name":"yayanehi"
}

相対パスのmtnの部分はmotionsで良い…　はずなのですが(Viewerだと指定した通りのフォルダ名で書き出されます)、サンプルプロジェクトのこはるちゃんの書式に合わせました。これで動作します(モーション名は随意に。)

cc_yayanehi.cfg

> set_special_action_anim yayanehi '01.mtn' 1
set_special_action_anim yayanehi '02.mtn' 2
set_special_action_anim yayanehi '03.mtn' 3
set_special_action_anim yayanehi '04.mtn' 4
set_special_action_anim yayanehi '05.mtn' 5
set_idle_anim yayanehi 'idle.mtn'

> set_arm_l_param yayanehi 'PARAM_ARM_L'  -10 10 -7
set_arm_r_param yayanehi 'PARAM_ARM_R'  -10 10 -7
set_hand_l_param yayanehi 'PARAM_ARM_L_01' -10 10 0
set_hand_r_param yayanehi 'PARAM_ARM_R_01' -10 10 0

> set_special_pose_param yayanehi 'PARAM_CHEEK' 0 2 1
set_special_pose_param yayanehi 'PARAM_TEAR' 0 1 2
set_special_pose_param yayanehi 'PARAM_RAGE' 0 1 3
set_special_pose_param yayanehi 'PARAM_HAIR_FLUFFY' 0 1 4
set_special_pose_param yayanehi 'PARAM_CATMOUSEON' 0 1 5
set_special_pose_param yayanehi 'PARAM_ARM_UD' 0 30 6


なんか記事が寂しいのでうたにっきを埋め込んでおきます(FaceRig関係ない)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">本日のついったー用　<a href="https://twitter.com/hashtag/%E3%83%A4%E3%83%A4%E3%83%8D%E3%83%92%E3%81%86%E3%81%9F%E3%81%AB%E3%81%A3%E3%81%8D?src=hash&amp;ref_src=twsrc%5Etfw">#ヤヤネヒうたにっき</a> <a href="https://t.co/HucvVIIses">pic.twitter.com/HucvVIIses</a></p>&mdash; ヤヤネヒ@V-God (@ya_ya_ne_hi) <a href="https://twitter.com/ya_ya_ne_hi/status/1050411955591114752?ref_src=twsrc%5Etfw">2018年10月11日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

動作例。最初のほうだけ見ればよいです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【神】ヤヤネヒのなまぴあの(テスト五回目【Vtuber】 - YouTube    さっきの。ぴかぴかを導入した結果、遅れがすごすぎてよっぱよっぱになっている <a href="https://t.co/xml0opsenr">https://t.co/xml0opsenr</a></p>&mdash; ヤヤネヒ@V-God (@ya_ya_ne_hi) <a href="https://twitter.com/ya_ya_ne_hi/status/1067789328170942464?ref_src=twsrc%5Etfw">2018年11月28日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
FirstVRの腕の向きを取得してみる

# はじめに
タイトルにもある通り、今回はFirstVRの腕の向きを取得するシステムを作っていこうと思います。

#下準備
まずは下準備として、FVRSDKを公式ページからダウンロードしてきて、プロジェクトを開きましょう。
https://dev.first-vr.com/downloads?locale=ja　
SDKはこちらからダウンロードできます。

プロジェクトが開けたら、新しいシーンを作ります。

![hierarchy.PNG](https://qiita-image-store.s3.amazonaws.com/0/307844/cad1513a-0173-902b-90d2-c50315f567fa.png)


そのシーンにFVRContainer,ConnectionCheck,Text×2,cubeを追加します。

![Game.PNG](https://qiita-image-store.s3.amazonaws.com/0/307844/b4f117b2-7e9e-5e48-d295-81f8bd032af0.png)

下準備はこれで終わりです。

#コード
では実際にコードを組んでいきます。
適当なC#スクリプトを作り、その中に以下のコードを書きます。

```c#
public Text verticalText;
public Text horizontalText;

FVRConnection fvr;
string verticalStr;
string horizontalStr;

	// Use this for initialization
void Start ()
{
    fvr = FindObjectOfType<FVRConnection>();
}
	
	// Update is called once per frame
void Update ()
{
    transform.rotation = fvr.centeredRotation;

    switch(fvr.verticalOrientation)
    {
        case FVRConnection.VerticalOrientation.down:    verticalStr = "下";     break;
        case FVRConnection.VerticalOrientation.mid:     verticalStr = "真ん中"; break;
        case FVRConnection.VerticalOrientation.midDown: verticalStr = "斜め下"; break;
        case FVRConnection.VerticalOrientation.midUp:   verticalStr = "斜め上"; break;
        case FVRConnection.VerticalOrientation.up:      verticalStr = "上";     break;
    }

    switch (fvr.horizontalOrientation)
    {
        case FVRConnection.HorizontalOrientation.back:        horizontalStr = "後ろ";       break;
        case FVRConnection.HorizontalOrientation.backLeft:    horizontalStr = "左斜め後ろ"; break;
        case FVRConnection.HorizontalOrientation.backRight:   horizontalStr = "右斜め後ろ"; break;
        case FVRConnection.HorizontalOrientation.front:       horizontalStr = "前";         break;
        case FVRConnection.HorizontalOrientation.frontLeft:   horizontalStr = "左斜め前";   break;
        case FVRConnection.HorizontalOrientation.frontRight:  horizontalStr = "右斜め前";   break;
        case FVRConnection.HorizontalOrientation.left:        horizontalStr = "左";         break;
        case FVRConnection.HorizontalOrientation.right:       horizontalStr = "右";         break;
        case FVRConnection.HorizontalOrientation.none:        horizontalStr = "無し";       break;
    }
    verticalText.text = verticalStr;
    horizontalText.text = horizontalStr;
}
```
![API.PNG](https://qiita-image-store.s3.amazonaws.com/0/307844/67c4efd1-50f8-5ba8-6a41-61c72c6dbefe.png)
APIを見てみると、このように腕の向きに対応したenumが用意されているので、それを見てTextの内容を変えているだけですね！

ここまで書けたらcubeにアタッチし、用意したテキストをそれぞれ入れましょう。
腕を向けた方向を検知できていたら成功です！
Gsuiteに切り替えてみたがsendEmailが使えない

過去、GASを利用してメールを送信してたらemail実行回数エラーになったという記事を書いたのですが、該当ツールを使い続けるには有料会員待ったなしと主張をしたところ、G suiteに入るお金を経費で出してくれるそうです。ありがたいですね。

これで1日1500通まで送れるのですからemailも送り放題です。

さて、ツールをコピーしてきて、各種設定を行った後、GASのスクリプトでSendEmailを行ったところ送信メールがブロックされてしまいました。

その後、Googleのサポートに調査を依頼した結果、回答が「新しすぎるドメインだとAPIを使ってメールを送る際に制限がかかる。これが解除されるのに期間は明言できないけど２～３カ月かかる」との事でした。

G suiteを導入する際に独自ドメインを購入したのですが、これが原因らしく、セキュリティ観点の問題上でそういう風にしているそうです。

この情報、公開している情報では無いという事なので、私自身もネットで調べまくっても、こういう情報が出てこなかったので、ここにメモとして残しておきます。
PhpStormのヒープメモリ割り当てを増やす

# 前書き

PhpStormはコード解析結果などでメモリを大量に使うようです。
プロジェクトが大きくなりファイル数も増えてくると、メモリ割り当てが少ないとタブの切り替え時にStructure表示など、動作に時間がかかる場合があります。（毎回コード解析走る？）

そんな場合はJVMのメモリ設定を変更して快適に動くようチューニングしましょう！！

# 設定方法

1. **システムメニューの `Help` > `Edit Custom VM Options...`**
※わかりずらい場合、記事の最後にキャプチャをつけているので参考にしてください。
2. エディタで開くので、`Xmx`の値を変更します。

割り当てる値はPCの余っているメモリ量と相談しつつ、多めに振るのがいいと思います
私の環境はメモリが余っていたので 5GBに設定しました。
ついでに初期値（Xms）も1Gに変えました。

```
-Xms1G
-Xmx5G
```

設定を保存したら、PhpStormを再起動して完了です。

## 画面キャプチャ

![PhpStorm1-a.png](https://qiita-image-store.s3.amazonaws.com/0/87995/22ff00ee-e5b3-1291-6f90-000850f5c088.png)

![PhpStorm2-a.png](https://qiita-image-store.s3.amazonaws.com/0/87995/0811148b-a8f0-74ed-983c-e3a3be9075d1.png)

## `-Xms`とか`-Xmx`とかよくわからない場合

`JVM Xms` や `JVM Xmx`のように `JVM + 単語`でググってみてください！

私も曖昧な理解なため、ここでは言及を避けます:sweat_smile:

# 公式ヘルプ

- IntelliJ IDEA ヘルプ - ヒープ・メモリーを増やす
https://pleiades.io/help/idea/increasing-memory-heap.html

- IntelliJ IDEA ヘルプ - PhpStormのチューニング
https://pleiades.io/help/phpstorm/tuning-the-ide.html
PWAを開発する上での考慮事項メモ

本記事は記録用です。
開発していく上で考慮しなければいけない要素を述べたものです。
## テーマ
Androidでフルスクリーンでサクサク動くPWA
※PWAが何かについては他の記事を参照してください。


## 課題

１.トップページにアクセスした際に複数ページをcacheしにいく。


２.新しいコンテンツをcahceするときは古いcacheをきちんと削除する。


# 実装

1
とりあえず下記レポジトリからhttp-serverモジュールで動く静的ファイル一式をgit clone

https://github.com/sitepoint-editors/pwa-retrofit


 2
sever.jsがサーバ立ち上げファイルなので、node ./server.js若しくはnpm run start


さてこれでサンプルの環境が整いました。
上記で挙げた課題を一つ一つ潰していきましょう。

まずこの写真のように、ブラウザキャッシュとSWのキャッシュが混合しているとSWのキャッシュだけを追いにくいので、DevToolのNetworkタブからDisable cacheしました。

<img width="923" alt="cache.png" src="https://qiita-image-store.s3.amazonaws.com/0/252596/6da02024-c724-2daf-7b8d-0b9c87049fde.png">


## 課題1
今のままだとトップページにしかアクセスしていないことになり、他のページをキャッシュできていません。今回はローカルサーバにアクセスしているのでオフラインでも見れますが、実際はオフラインではトップページしか見れないことになります。

<img width="335" alt="スクリーンショット 2018-11-30 14.11.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/252596/e1d7a705-0205-e323-e493-1a7badb76f21.png">

上の写真のように、ページは４つあり、それぞれのURLは
/
/work
/about
/contact
です。
DevToolのApplicationのCache Storageを見てみるとやはり/とそれに紐づくimgやcss,js以外はCacheできていません。

<img width="734" alt="スクリーンショット 2018-11-30 14.13.17 1.png" src="https://qiita-image-store.s3.amazonaws.com/0/252596/478b12c2-07b5-a166-3077-241eadb724e3.png">

なのでinstallイベントの中をいじっていきたいと思います。


```
  installFilesEssential = [
    '/',
    '/manifest.json',
    '/css/styles.css',
    '/js/main.js',
    '/js/offlinepage.js',
    '/images/logo/logo152.png'
  ].concat(offlineURL),
  installFilesDesirable = [
    '/favicon.ico',
    '/images/logo/logo016.png',
    '/images/hero/power-pv.jpg',
    '/images/hero/power-lo.jpg',
    '/images/hero/power-hi.jpg'
  ];


self.addEventListener('install', event => {

  console.log('service worker: install');

  // cache core files
  event.waitUntil(
    installStaticFiles()
    .then(() => self.skipWaiting())
  );

});
```

こいつをこう変えます。

```
  installFilesEssential = [
    '/',
    '/work',
    '/about',
    '/manifest.json',
    '/css/styles.css',
    '/js/main.js',
    '/js/offlinepage.js',
    '/images/logo/logo152.png',
    '/images/circuit.jpg'
  ].concat(offlineURL),
  installFilesDesirable = [
    '/favicon.ico',
    '/images/logo/logo016.png',
    '/images/hero/power-pv.jpg',
    '/images/hero/power-lo.jpg',
    '/images/hero/power-hi.jpg',
    '/images/hero/workspace-lo.jpg',
    '/images/hero/workspace-hi.jpg'
  ];
```
具体的にいうと下のURLを追加しました。

```
/work
/images/hero/workspace-io.jpg
/images/hero/workspace-hi.jpg
/images/circuit.jpg
```

これでもう一度最初からトップページにリクエストしてinstallイベントを発火させて今追加したURLのCacheも取れているか確認をしたいので前のCacheは一旦全部消しましょう。

<img width="557" alt="スクリーンショット 2018-11-30 14.24.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/252596/6c6758f7-e478-35ee-0442-34bc49bbfc9d.png">

はい

ここでトップページへアクセスすると、Networkタブで先ほど追加した/workなどのCacheが取得されているのが分かります。

実際に/workにアクセスしてみて、Networkタブを見てみると/workはServiceWorkerのCacheから取得されているのが分かります。
立方体の展開 (2)

[立方体の展開 (3)| three.js](http://labo.project-nya.jp/threejs/develop_cube3/)

Timelineクラス凄すぎて、動きをつけるのが楽しいっ！
立方体の展開 11パターンすべて作ってみた。

参考：[TweenJSのTimelineを使ったテキストアニメーション | kudox.jp](http://kudox.jp/java-script/createjs-tweenjs-timeline)
参照：[[CreateJS] トゥイーン (5) 〜parallel〜 | にゃあプロジェクト](http://blog.project-nya.jp/1736)
TypeError: list indices must be integers, not str

##背景
論文公開サイトarxivのスクレイピングを行い、リストの中身を操作しようとしたら
`TypeError: list indices must be integers, not str`
上記のようなエラーが出てきました。。
ちなみに[arxiv.py](https://github.com/lukasschwab/arxiv.py/tree/master/arxiv)をライブラリとして使用しました。
##TypeError: list indices must be integers, not str
エラーが出ているのは以下の関数ということがわかりました。(resultにはキーワードで検索した論文10個がそれぞれのタイトルごとに文字列としてリストに入っています。)

```python:sample.py
def prune_query_result(result):
    prune_keys = ['updated_parsed',
                  'published_parsed',
                  'arxiv_primary_category',
                  'summary_detail',
                  'author',
                  'author_detail',
                  'links',
                  'guidislink',
                  'title_detail',
                  'tags',
                  'id']


    for key in prune_keys:
        try:
            del result[key]
        except KeyError:
            pass
```
google翻訳にかけて見たところ、
`TypeError：リストインデックスは、strではなく整数でなければなりません`
あ、インデックスに文字列が指定されてしまっている。。

```python:fixed.py
def prune_query_result(result):
    prune_keys = ['updated_parsed',
                  'published_parsed',
                  'arxiv_primary_category',
                  'summary_detail',
                  'author',
                  'author_detail',
                  'links',
                  'guidislink',
                  'title_detail',
                  'tags',
                  'id']

    for i in range(len(result)):
        for key in prune_keys:
            try:
                del result[i][key]
            except KeyError:
                pass
```
インデックスに整数を入れてあげるとうまくいきました!!