OmniAICreator/Qiita-1.07M huggingface dataset:
シェルスクリプトで階層された圧縮ファイルを解凍する方法

## 目的

以下のようなファイル構造になっている圧縮ファイルを纏めて解凍して
ワークディレクトリに格納するシェルスクリプトを載せる。
今回は、tarとgzで階層化されているがコマンドを変えれば、
他の圧縮形式にも対応することができる。

```
# tarの中にgzが入れ子となっているようなファイル構造
XXXXXXX.tar
 |- MMMMMM.gz
 |- MMMMMM.gz
 |- MMMMMM.gz
 ・
 ・
 ・

XXXXXXX.tar
 |- MMMMMM.gz
 |- MMMMMM.gz
 |- MMMMMM.gz
 ・
 ・
 ・

```

## スクリプトファイル

実行対象の圧縮ファイルが格納されたディレクトリ（SCRIPT_DIR）で、```sh main.sh```を実行すると、
実行時の現在時刻のワークディレクトリ(WORK_DIR) に全てデータを展開する。

```main.sh
#!/bin/sh

## 階層された圧縮ファイルを解凍するスクリプト ##

##カレントディレクトリを取得
SCRIPT_DIR=$(cd $(dirname $0); pwd)

##現在時刻を取得
NOW_TIME=`date "+%Y%m%d_%H%M%S"`

##展開先ディレクトリを変数で定義し、格納用ディレクトリを作成
WORK_DIR="${SCRIPT_DIR}/${NOW_TIME}"
mkdir $WORK_DIR

##カレントディレクトリ内のtarファイルを格納用ディレクトリに展開
##格納用ディレクトリにデータを展開し次第、実ファイルは削除
for SCRIPT_DIR in `\find $SCRIPT_DIR -maxdepth 1 -name '*.tar'`;
do
    tar -xvf $SCRIPT_DIR -C $WORK_DIR
    rm $SCRIPT_DIR -f
done

#格納用ディレクトリ内のzipファイルを同ディレクトリ内に展開
for WORK_DIR in `\find $WORK_DIR -maxdepth 1 -name '*.gz'`;
do
    gzip -d $WORK_DIR
done

```
Linux環境に固定IPを設定する

#目的
Hyper-Vに作ったCentOS8の仮想マシンに固定IPを設定する
仮想マシンにTera Termで接続する
#環境
CentOS 8.1.1911
#手順
###現在の状態確認
●コマンドで状態を確認

```
# ip a
# ip a show dev eth0
```
*eth0: inet 192.168.10.4/24*

これで現在のプライベートIPアドレスがわかります。
ネットワークアドレス "192.168.10"
ホストアドレス "4"
※最後の"24"はプレフィックス長といい、先頭24ビットがネットワークアドレスであることを表す。

###設定ファイル編集
●インタフェース設定ファイルを以下のように編集します。
※書いてないパラメータはそのまま。

```:/etc/sysconfig/network-scripts/ifcfg-eth0
IPV6INIT="no"
#IPV6_AUTOCONF="yes"
#IPV6_DEFROUTE="yes"
#IPV6_FAILURE_FATAL="no"
#IPV6_ADDR_GEN_MODE="stable-privacy"

BOOTPROTO="none"
IPADDR=192.168.10.100
PREFIX=24
GATEWAY=192.168.10.1
DNS1=192.168.10.1
DNS2=8.8.8.8
```
IPV6は使わないのでIPV6INITを"yes"から"no"に変更しました。
ほかのIPV6絡みのパラメータは除きました。

・BOOTPROTO：
IPアドレスの指定方法　[none/dhcp/bootp]
固定IPを指定する場合は"none"、もしくは"static"でもいいみたいです。

・IPADDR：
指定するIPアドレス
さっきのネットワークアドレスに適当なホストアドレスつける。

・PREFIX：
プレフィックス長
これはたぶんNETMASKってパラメータでもどっちでもいいのかな？たぶん。。。

・GATEWAY：
ルーターのIP

・DNS
"8.8.8.8"はGoogle Public DNS

●設定してからネットワーク再起動

```
# systemctl restart NetworkManager
```
状態確認すると...
*eth0: inet 192.168.10.100/24*
###ipv6無効化
さっきの手順で再起動したあとで確認しても、inet6が設定されていました。
別に問題ないのかもしれませんが、設定で使わないとしたつもりだったので無効化します。

●以下のファイルを作成

```:/etc/sysctl.d/disable_ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
```
●反映

```
# sysctl -p/etc/sysctl.d/disable_ipv6.conf
```
状態確認するとinet6が消えていました。
#確認
●設定したIPアドレスを入力
![コメント 2020-02-09 112306.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577787/3c2a6c00-efbf-8702-a0ae-0e8295cc80f9.jpeg)

●ユーザとパスワード入力後、接続
![コメント 2020-02-09 112307.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577787/3c599033-1132-6592-ada7-840f234dc04a.jpeg)

接続できました。
ひとまずこれで、やりたいことが出来たこととします。
anyenv を使っていて command not found: django-admin になったときの対処法

anyenv で pyenv を入れて使っていますが、そこで Django を使おうと思ったときに `command not found: django-admin` エラーに出会ったのでメモ。

anyenv の下の pyenv に `django-admin.py` があるので、それをシンボリックリンクで PATH を通してやればいい。

```console
ln -s ~/.anyenv/envs/pyenv/versions/3.7.4/lib/python3.7/site-packages/django/bin/django-admin.py /usr/local/bin
```
TypeScriptの型定義からJSON Schemaを生成するオンラインツールを作ってみた

先日、[TypeScript + Tynderから始める宣言的検証生活](https://qiita.com/shellyln/items/bd926fa968131aa13e5f)の記事にて
スキーマ検証ライブラリ[Tynder](https://github.com/shellyln/tynder)を紹介いたしました。

# Tynderとは

![tynder-logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185253/e5c7cef0-3b8d-f9d7-b32e-f13a5fb67b89.png)

[Tynder](https://github.com/shellyln/tynder)は、**TypeScriptのサブセット＋独自の拡張文法から成るDSL**によって

1. 型の検査
1. 単独の項目の必須・値の長さ・範囲や文字列パターンの検証
1. 複数項目の相関や整合性検証の一部 (Union typeによる)

を**宣言的**に行うことができます。

# JSON Schemaを生成するオンラインツール
今回はTynderのスキーマ変換機能を使用して
JSON Schema、GraphQL、Protobuf3 のスキーマを生成するオンラインツールを公開しました。
(GraphQL、Protobuf3については実験的機能です)

* [TypeScript (Tynder DSL) → JSON Schema | GraphQL | Protobuf Converter](https://shellyln.github.io/tynder/playground.html)
  * Convert schema from Tynder DSL to JSON Schema, GraphQL and Protobuf.

![tool-scr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185253/ac1d849a-71dc-1610-6682-7c83989ae8ce.png)

## 追記(2020/2/9)
作成したスキーマはオンラインツールの[JSON Schema validator](https://www.jsonschemavalidator.net/)等で動作確認できます。

上記のJSON Schema validatorで確認するには、オブジェクト内の最後の行に、`definitions`内のエントリーに対する`$ref`を記述します。

```json
{
  "$schema": "http://json-schema.org/draft-06/schema#",
  "definitions": {
    ...
    "Entry": { ... }
  },
  "$ref": "#/definitions/Entry" // <- ここです
}
```

## 追記(2020/2/11)
[TypeScript (Tynder DSL) Schema Validator](https://shellyln.github.io/tynder/playground2.html)
でもスキーマの確認ができるようになりました。
(ただし、TypeScript(Tynder DSL)によるスキーマ記述のみに対応しています)

# 動機
[API Blueprint](https://apiblueprint.org/)等でのモックサーバー作成が捗らないかな、と思い作成しました。
UIは以前作成した[こちら](https://shellyln.github.io/liyad/playground.html)を流用することで、すぐに作成できました。

ぜひ、使ってみてくださいね
Nuxtの画像圧縮をNuxt Optimized Imagesにしてみた

#TL;DR
インストールして数行追加で完全自動で画像圧縮してくれる [Nuxt Optimized Images](https://github.com/bazzite/nuxt-optimized-images) がとても便利だった。

#使用した経緯

いつものNuxt環境でコーディングしていたら
IE11およびSafariで画像が正しく表示されない現象が発生しました。

原因はどうやら圧縮後の画像の形式が実際の画像形式と違うため。
「○○イメージをデコードできません。」のようなエラーメッセージが出ていました。

真っ先に疑ったのは画像圧縮モジュール。
「[nuxt-imagemin](https://github.com/wemake-services/nuxt-imagemin)」を使っていて、いろいろ検索してみたけれど
同様の現象が起きてる情報など発見できず。

もしかすると自分の設定が悪いのかも…と思ってドキュメントを見たけど、特別おかしなことをしているようでもない。
というか以前から思っていたけどドキュメントがちょっと見づらい…

もうめんどくさくなったので、一旦別のものに変えてみようと
gitのスターの数がより多い「[Nuxt Optimized Images](https://github.com/bazzite/nuxt-optimized-images)」を入れてみたら、即問題なく動きました:relaxed:
ダメならモジュールジプシーか…と思ってたので安心しました（笑）

#設定など

ドキュメントにあるようにmodulesに設定してあげるだけでよくて
外部の圧縮プラグインをインストールするだけ。
後はモジュールで勝手に判断してくれるので、特別な設定は不要。
とりあえず「imagemin-mozjpeg」と「imagemin-pngquant」あたりをインストールしてます。

私はgenerate時の画像はハッシュとかではなく、指定した名前そのままで書き出したいので
オプションは以下な感じにしました。

```
  modules: [
    '@bazzite/nuxt-optimized-images'
  ],
  optimizedImages: {
    optimizeImages: true,
    imagesName: ({ isDev }) => isDev ? '[path][name][hash:optimized].[ext]' : 'img/[name].[ext]'
  },
```
Ruby　基礎文法　解いてみた編　1

# はじめに
Rubyの基礎を学習中の方に向けて記載致します。
実際に問題を解いた内容をOutputします。
省略方法やご参考になる記事等ございましたら、ご教授頂けますと幸いです。

#While文からfor文への変換

```qiita.rb
#while文
num = 0
while num < 100 do
  puts num
  num += 1
end


#for文
for num in 0..99 do
  puts num
end
```

#ハッシュから値だけを取り出し、配列にする。
**ただし、hashクラスのvaluesメソッドは利用しないこと。**

```qiita.rb
# ハッシュ
attr = {name: "田中", age: 27, height: 180, weight: 75}

#回答
values = []
attr.each do |key, value| 
  values << value
end
```



#さいごに
日々勉強中ですので、随時更新します。
皆様の復習にご活用頂けますと幸いです。
VS code/gdb/cppの設定で、コンパイルされてデバッグする実行ファイルが読み込めなかったTips

# VS code/gdb/cppの設定で、コンパイルされてデバッグする実行ファイルが読み込めなかったTips

## はじめに

VS code/gdbの設定で、デバッグする実行ファイルが読み込めなかった（下記画像）ので、
その解決方法をメモ

## 解決方法 原因調査

.vscode/launch.jsonで　"preLaunchTask": "cpp build active file",
として、pre launchでbuildを指定していたが、
"cpp build active file"
で指定していた コンパイラはUbuntu 5.4.0
とversionが古く、生成された実行ファイルがgdbで読み込めないのが原因
32bit用?

## 実行環境

ubuntu16.04
vscode 1.39.1
gdb Ubuntu 8.2

## 読み込めなかった画像

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/66e5bae1-1a62-dba1-a2a4-1bed861df090.png)
ケモインフォマティクスで学ぶRの反復処理

# はじめに

[ケモインフォマティクスで学ぶRの条件分岐](https://qiita.com/yukiya285/items/7926a0380ba4dce14351)に引き続き、リピドミクス（脂質の網羅解析）を題材として「条件分岐」について解説していきます。
ケモインフォマティクスの実践例を中心に説明していきますので、基本を確認したいという人は以下の記事を読んでからこの記事を読んでみてください。

[製薬企業研究者がRの制御文についてまとめてみた](https://qiita.com/yukiya285/items/811d34e9a2e21e4aae5d)


## 3.3. for文

`for`はあらかじめ決まった回数だけ反復処理を行うときに使えます。
`for (変数 in ベクトルなど){処理}`と書きます。

```{r}
carbon.numbers <- c(16, 18, 20, 22, 24)
for (i in 1:length(carbon.numbers)){
  print(paste0("FA ", carbon.numbers[i], ":0"))
}
```

もちろん，`if`と組み合わせることもできます。

```{r}
carbon.numbers = c(16, 18, 20, 22, 24)
unsaturation.numbers = c(0, 0, 4, 6, 0)

for (i in 1:length(unsaturation.numbers)){
  if (unsaturation.numbers[i] == 0){
    print(paste0("FA ", carbon.numbers[i], ":", unsaturation.numbers[i], " is a saturated fatty acid."))
  }else{
    print(paste0("FA ", carbon.numbers[i], ":", unsaturation.numbers[i], " is an unsaturated fatty acid."))
  }
}
```

上の例では、`carbon.numbers`に脂肪酸の鎖長（炭素原子数）を、`unsaturation.numbers`に不飽和度（二重結合数）を格納しておき、ベクトルの要素を前から順番に取り出して脂肪酸の略号を書き出しています。
その際に、不飽和度の値から飽和脂肪酸`saturated fatty acid`か不飽和脂肪酸`unsaturated fatty acid`かを判定しています。

以下のように`break`を使うと反復処理を中断します。

```{r}
fatty.acids <- c("FA 16:0", "FA 18:0", "", "FA 18:1")

for (i in 1:length(fatty.acids)){
  if (fatty.acids[i] == ""){
    print("空です。処理を中止します。")
    break
  }
  print(fatty.acids[i])
}
```

上の例では、リスト`fatty_acids`の左から3番目の要素が空となっているため、その前の要素まで反復処理が行われ、要素の値が出力されます。

一方、`next`を使うと、反復処理がスキップされます。

```{r}
fatty.acids <- c("FA 16:0", "FA 18:0", "", "FA 18:1")

for (i in 1:length(fatty.acids)){
  if (fatty.acids[i] == ""){
    print("空です。スキップします。")
    next
  }
  print(fatty.acids[i])
}
```

上の例では、空白の要素は`next`によって処理がスキップされるため、要素の値が出力されることはありませんが、最後まで処理が行われ、「FA 18:1」も出力されます。


## 3.4. while文

`while`を使うと、指定した条件が成立する限り、反復処理を行います。
`while (条件){処理}`と記述します。

```{r}
Cn <- 12

while (Cn <= 24){
  print(paste0("FA ", Cn, ":0"))
  Cn <- Cn + 2
}
```

上の例では、変数`Cn`に脂肪酸の鎖長を代入し、鎖長が`24`以下の飽和脂肪酸の略号を出力しています。
出力の後は`Cn`を2増やしています。これを忘れると、いつまでたっても`Cn`が`24`より大きくならず、「無限ループ」となるので注意が必要です。
今回は`Cn`の初期値を`12`としていますが、`10`や`0`でも処理を行うことができます。このように、反復回数が決まっていない場合に、`while`を使うと良いです。


# まとめ

ここでは、Rの反復処理について、ケモインフォマティクスで使える実践的な知識を中心に解説しました。
もう一度要点をおさらいしておきましょう。

- 反復回数が決まっている場合は、`for`を使います。`if`と組み合わせて`break`や`next`により処理を中断したり、スキップしたりすることもできます。
- 反復回数が決まっておらず、特定の条件を満たした場合に反復処理を終了する場合は、`while`を使います。変数の値の更新を忘れて無限ループにならないよう注意が必要です。

続いて、Rのクラスについて以下の記事で解説しています。

[ケモインフォマティクスで学ぶRの関数](https://qiita.com/yukiya285/items/492b695ed7146e83ebe2)


# 参考資料・リンク

[プログラミング言語Rとは？統計分析に強い？](https://pharma-engineer.com/basic-programming/r-summary/)
proxyサーバ使用環境で、node-red(docker起動)の処理ノードを追加する方法

## 1. 経緯
node-redはdockerのコンテナが提供されているので、気軽に始めることが出来ます。
[Dockerで実行する!](https://nodered.jp/docs/getting-started/docker)

ハマった点として、proxy環境内でnode-redを起動して処理ノードを追加するとエラーが発生して追加できませんでした。
調べてみると、処理ノードを追加時にnpmコマンドが動作してノード追加を行っているらしく、npmコマンドにproxy設定を追加してやる必要があるようでした。
下記に、その手順を記載します。

## 2. 手順

- node-redを起動する

```ssh
$ docker run -it -d -p 1880:1880 --name mynodered nodered/node-red
```

- rootユーザでnode-redeのコンテナにログインする<br>
node-redユーザでログインすると、sudoコマンドが入っていないため、npmへproxy設定ができないようです。  
そのため、**-u root**でログインする必要があります。

```ssh
$ guest@guest-VirtualBox:~$ docker exec -it -u root <起動中のnode-redのコンテナID> /bin/bash

```
- npmコマンドのproxy設定を追加  
  rootでコンテナにログインできるので、http,httpsのproxy と registryを設定する

```sh
$ npm -g config set proxy プロキシサーバのURL:port番号
$ npm -g config set https-proxy プロキシサーバのURL:port番号
$ npm -g config set registry http://registry.npmjs.org/
$ npm config list
```
cv2.Canny(): Canny法によるエッジ検出の調整をいい感じにする

エッジとは物体同士や背景との境界のことを指し、エッジ検出とは一般に画像中の画素値の変化、輝度勾配が大きい部分を検出することでエッジを検出する画像処理を指します。


<img width="877" alt="スクリーンショット 2020-02-09 3.24.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84890/5d31caf4-cff4-339b-0dfb-cb65399f23f1.png">
（画像は[フリー画像サイト](https://www.pakutaso.com/20191228360post-24995.html)から）

### cv2.Canny() とは

opencv で実装・提供されているエッジ検出関数。簡単にエッジ画像作成を行えるが、適切に使用するためには（主に）２つのパラメータを調整する必要がある。

公式ページ：[ドキュメント](
https://docs.opencv.org/2.4/modules/imgproc/doc/feature_detection.html?highlight=canny)、[チュートリアル](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_canny/py_canny.html)


### 対象の人
`cv2.Canny()` を閾値なんとなく調整しながら使用してみるけどなんか思ったようにうまくいかない。画像的に限界なのか調整が下手なのかわからない。ちょっときちんとパラメータの意味理解しよう。

### ２つの調整パラメータ
`cv2.Canny(gray_img, threshold1, threshold2)`

簡単には、`threshold1` と `threshold2`どちらもエッジかどうかの判断の閾値を表していて、**大きいほどエッジが検出されにくく、小さいほどエッジが検出されやすくなります。**
（閾値が大きいと、より大きい輝度変化のときに初めてエッジと判定されるため。）

```python
import cv2
gray_img = cv2.imread('sample.jpg', cv2.IMREAD_GRAYSCALE)

threshold1 = 0
threshold2 = 360
edge_img = cv2.Canny(gray_img, threshold1, threshold2)
cv2.imwrite('sample_edge.jpg', edge_img)
```

*他にも引数はあります。([公式ページ](https://docs.opencv.org/2.4/modules/imgproc/doc/feature_detection.html?highlight=canny))


#### threshold2: maxVal
threshold2 のほうがまず直感的な値で、**エッジかどうかの判断の閾値そのもの**です。

実際に threshold2 を徐々に小さくしてみると以下のようになります。
（理解しやすいため threshold1 には threshold2 と同じ値を入れています。）

![threshold2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84890/d52fb2ba-2056-7401-73d4-c4f884b49f9d.gif)


#### threshold1: minVal
引数説明の前提として、Canny 法ではエッジは長い線であると考えており、**エッジに隣接している部分はエッジになりやすい**という考え方があります。（下図参考）

<img width="400" alt="スクリーンショット 2020-02-09 3.42.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84890/bb638703-f2dc-3449-ce6a-3f4507e461b5.png">

この考え方から２つ目の閾値（threshold1）を導入していて、簡単に言うと役割は「**他エッジとの隣接部分（エッジになりやすい部分）における、エッジかどうかの判断のゆるい閾値**」となります。

つまり threshold1 をゆるく（小さく）してみたとしても、元々周りに何も検出されていなかった場所にエッジが検出されるようにはなりません。

ゆるくすることで、元々 threshold2 により検出されたエッジの隣接部分がエッジになりやすくなる、すなわち直感的には、**元々 threshold2 により検出されたエッジの線を長く伸ばす**、といった感じになります。

実際に threshold1 を徐々に小さくしてみると以下のようになります。

![threshold1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84890/470510de-a369-e116-a90c-97a446c6176a.gif)


#### まとめると

`cv2.Canny(gray_img, threshold1, threshold2)` 

- threshold1: 他エッジとの隣接部分（エッジになりやすい部分）におけるエッジかどうかの判断のゆるい閾値
- threshold2: エッジかどうかの判断の閾値そのもの


### エッジ検出のパラメータ調整をいい感じにする

以上のことから、上で説明したような順番がおすすめ。

1. threhsold1 を threshold2 と同じ値となるようにしておく。
2. threshold2 を検出されてほしいところにエッジが現れるように調整する。
3. threshold1 を使用してエッジを育てる。
MongoDB の Schema Validation で "int" が必ず弾かれる。

MongoDBはスキーマレスと言われますが、[Schema Validationを定義できる](https://docs.mongodb.com/manual/core/schema-validation/)という大変便利なDBです。

Schemaで扱える`bsonType`は[こちら](https://docs.mongodb.com/stitch/mongodb/document-schemas)にまとまっています。

その中で、[Numbers](https://docs.mongodb.com/stitch/mongodb/document-schemas/#numbers)を扱おうとしたところ、 なぜか`"Document failed validation"`で保存に失敗しました。

Schema Validationはこちら。

```js
db.createCollection("intTest", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["_id", "code"],
      properties: {
        _id: { bsonType: "objectId" }, // `additionalProperties: false`にした場合、`_id`のschemaも必要！これ忘れがち
        code: {
          bsonType: "int"
        }
      },
      additionalProperties: false
    }
  }
});
```

このcollectionに対し、mongo shell上で`db.intTest.save({ code: 2020 })`を実行してもvalidationで弾かれます。

## 結論：`NumberInt()`が必要

> The mongo shell treats all numbers as floating-point values by default
https://docs.mongodb.com/manual/core/shell-types/#numberint

はい。そのため、`int`のプロパティに対しては、`NumberInt`で包んであげる必要があります。

つまり、`db.intTest.save({ code: NumberInt(2020) })`なら通ります。
Djangoでadminログインのヘッダーを変更

Django administration(管理画面)標準のログインページ
![login_original.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575922/0be72c98-2e61-2fd5-37af-1e1634cb72f5.png)
↑これを↓こうしたい
![login_mine.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575922/94af0344-b542-3b2a-3c60-fa5e03e6cf28.png)
なら

```python:project/urls.py
admin.site.site_header = 'My Nice App'
```

のように1行追加すればOK。
Django version 3.0.3
2019 Data Science Bowl 手法メモ

上位陣の手法をメモとして残します。
特に自分の知らなかった **手法** にフォーカスします。
時系列データということもあって自然言語関連の手法が見られるようです。

## [1st place solution](https://www.kaggle.com/c/data-science-bowl-2019/discussion/127469)
- <font color="maroon">**GroupKFold** を5回繰り返してスコア(qwk)が安定するか確認。結果安定しなかったのでweighted-rmse(?)を使用した</font>
<br>→モノサシが適切かどうか検証が必要ということか。自分は何もやってなかったな。。
- <font color="maroon">ダブルチェックのために**NestedCV**を使用。GroupKFoldの結果に直観に反するような結果があり、自信がなかったので使用</font>
<br>[（NestedCV解説）](https://qiita.com/Hatomugi/items/620c1bc757266b00e87f#nested-cross-validation)
<br>→こんな手法があるんですね。しかしモノサシの検証が念入りですね。
- <font color="maroon">**null importance method** で特徴量を20000→500に削減</font>
<br>[（null importance method解説(英語サイト)）](https://www.kaggle.com/ogrellier/feature-selection-with-null-importances)
<br>[（null importance method解説(日本語サイト)）](https://qiita.com/KenkenGoda/items/1d6ede5d492d1a9dc3c9)
<br>→20000の抽出方法は追い切れてません。
<br>→特徴量の選定は人間よりもコンピュータに力業でさせるほうがよさそうですね。
- <font color="maroon">**adversarial-validation**でデータの偏りがないことを確認。AUC=0.5が理想</font>
<br>[（adversarial-validation解説）](https://blog.amedama.jp/entry/adversarial-validation)
<br>→これは抽出した特徴量500に対して、学習用データとテスト用データで偏りがないかをadversarial-validationでチェックしたという意味でしょうか。で分類困難ということはAUC=0.5との意味かな。
- <font color="maroon">trainingには**rmse loss**を、validationには**weighted rmse loss**を使用</font>
<br>→以下の説明があるけど、理解できてない (**

> For the weighted loss , the weight is the sample prob for each sample (We use full data, for the test part, we calculate the expectation of the sample prob as weight).

## [2nd place solution](https://www.kaggle.com/c/data-science-bowl-2019/discussion/127388)
- <font color="maroon">**Word2Vec** を使ってるとのこと</font>
<br>→内容が理解しきれずどうう使っているかはよくわからない
- <font color="maroon">**相関関係?**の強い特徴量を削除</font>

## [3rd place solution](https://www.kaggle.com/c/data-science-bowl-2019/discussion/127891)
- <font color="maroon">**Transformer Model** を使用</font>
<br>→TransformerとはGoogleが開発した自然言語処理の手法[(参照)](https://gigazine.net/news/20170901-transformer-neural-network-language-understanding/)
<br>開設された図をみると各ゲームセッションを単語のように見なしてTransformerを適用しているように見えるが。。。各ゲームセッションの関連を表現できるモデルということでしょうか？

## [4th place solution](https://www.kaggle.com/c/data-science-bowl-2019/discussion/127210)
- <font color="maroon">**tf-idf** を使用</font>
<br>→tf-idfとは自然言語処理で使用される手法で各単語の重要度を示す手法。TFは使用頻度、IDFは希少性を示す[(参照)](https://www.sejuku.net/blog/26420)
<br>イベント系列を単語とみなしてTF-IDFを適用した様子だが、TF-IDFによって何が得られ、それをどう予測に使ったかは？特徴量生成に使用？


##参考
[上位者解法へのリンク](https://www.kaggle.com/c/data-science-bowl-2019/discussion/129119)
[上位者解法へのリンク1(日本語)](https://takaishikawa42.hatenablog.com/entry/2020/01/29/090852)
[上位者解法へのリンク2(日本語)](https://naotaka1128.hatenadiary.jp/entry/dsb-2019-top-solution)
4つの数字で10を作る「テンパズル」の問題用紙を生成する

といってもやっていることは[make10 問題一覧と解答](http://www.quiz-puzzle.com/make10/answer/list.html)の問題を拝領しているのですが。

子供の頃に、電車の切符に記載されている4桁の数字を使って10を作るというのをよくやっていたと思います（こういうのをテンパズルと呼ぶのは知りませんでした）。Suicaになって、そういう数字を見ることもなくなってしまい、あっても車のナンバーくらいでしょうか。[ドラゴン桜2で、この計算が数字に強くなるのに適している](https://www.amazon.co.jp/dp/4065182026/)と書いてありました。とはいえ、毎度切符を買うわけにもいかないし、ドライブしている時くらいしかできないのは辛いです。

[テンパズル - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%86%E3%83%B3%E3%83%91%E3%82%BA%E3%83%AB)

アプリでもあるようですが、子供向けには紙でプリントされた状態で、手を動かす方が学習効果は大きいかと思います。ということで、問題用紙を生成するGoogleスプレッドシートを作りました。

https://docs.google.com/spreadsheets/d/1-lxy2oEp6Alq78mYAyFeFsyKoJoZBIJ--_5MQ30Gsb8/edit#gid=0

> 誰でも編集権限を与えていますが、GoogleドライブにアクセスするのでGoogleログイン必須のようです。また、このシート自体はGoogleの承認を得ていないので、警告メッセージが出ます。

## 手順

[Googleスプレッドシート](https://docs.google.com/spreadsheets/d/1-lxy2oEp6Alq78mYAyFeFsyKoJoZBIJ--_5MQ30Gsb8/edit#gid=0)にアクセスします。問題生成ボタンを押すと、承認が必要といわれます。

<img width="1532" alt="Screenshot_ 2020-02-09 10.02.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/6051f042-e519-8c92-8e0e-0e35aad7829e.png">

このアプリは確認されていませんと出ます。

<img width="712" alt="Screenshot_ 2020-02-09 10.02.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/0aa34b2e-a3fa-7607-69ae-83e711ebe15d.png">

詳細のリンクをクリックします。 `テンパズル（安全ではないページ）に移動` をクリックします。この時点で私が信頼できない方は止めておいてください（生成に際して、編集権限を付与しているので、悪意を持った人が編集している可能性もあります…）。

<img width="712" alt="Screenshot_ 2020-02-09 10.03.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/16cfa665-027a-1717-b92a-2b39f1512776.png">

権限を付与します。

<img width="712" alt="Screenshot_ 2020-02-09 10.03.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/02cd04d5-618c-dbcb-2fee-d08391b6aaa9.png">

問題が生成できるようになります。

<img width="1532" alt="Screenshot_ 2020-02-09 10.03.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/af08f226-0b6d-a616-eea4-fc05105c3821.png">

## 自分で作る場合

こちらの方がお勧めです。Googleスプレッドシートの `問題用紙` と `問題一覧` の内容をそのままコピーしてください。シート名も同じにしてください。

ツールメニューのスクリプトエディタを開いて、次のコードを貼り付けます。552というのは問題の数で、決め打ちです（問題一覧シート参照）。なお、今回は全問解けるものだけにしています。解けないものを入れることもできますが、0000とか簡単すぎるものも入ってしまうので、今回は除外しています。

```js
function generate() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('問題一覧');
  var s = ss.getSheetByName('問題用紙');
  var data = sheet.getRange(1, 1, 552, 3).getValues();
  for (var i = 0; i < 5; i++) {
    var params = data[Math.floor(Math.random() * data.length)];
    var numbers = zeroPadding(params[0], 4).split('');
    var row = (i + 1) * 4;
    for (var j = 0; j < 4; j++) {
     s.getRange(row, (j + 1) * 2).setValue(numbers[j]); 
    }
  }
}

function zeroPadding(num,length){
  return ('0000000000' + num).slice(-length);
}
```

やっていることは問題一覧を取得して、その中からランダムに4問取り出して、問題用紙に貼り付けているだけです。

後は問題用紙にある `問題生成` ボタンのトリガーとして `generate` 関数を実行しています。

## まとめ

問題はボタンを押す度に新しいものに変わります。色々な問題を作って、算数脳を鍛えてみてください。なお、小学校5〜6年生レベルだそうですが、中高生で数学が苦手な人にもいいそうです。

**謝辞&参考：**

- [make10 問題一覧と解答](http://www.quiz-puzzle.com/make10/answer/list.html)
- [javascriptで０パディング（0で桁埋め）する - Qiita](https://qiita.com/terrym/items/6257f6507ca19f00cdf3)
Google日本語辞書で使う辞書とmacのユーザ辞書に互換性が無いので変換した

## 成果物
https://iamakawa.github.io/IME_Translate/index.html
github: https://github.com/iamakawa/IME_Translate

# はじめに
## 筆者の環境：
・職場；Windows10
・プライベート：Macbook、SurfacePro、iPhone8
・全てのPCにGoogle日本語入力がインストールされている
・iPhoneは標準キーボード

## なぜこれを作ったか
iPhoneとPC(Google日本語入力)のユーザー辞書同期ができず、
import/exportも直接実施不可で作業効率が落ちていた。
システムにすると大変そうなので、最小限の仕様でユーザー辞書のimport/exportを実現しました。

# 仕様
・変換元textareaに辞書ツールのエクスポート結果をそのまま貼り付け
・エクスポート方式を選択、[Translate]ボタンを押下
・下記言語仕様に沿うように文字列変換、変換後textareaに結果が出力される
・「ダウンロード」を押すとファイルがダウンロードされる

## 備考
・全て「名詞」として変換する(理由は後述)
・<,>,\tは対象外とする
・Google日本語入力(MicrosoftIME)↔Macユーザー辞書(plist)双方向でのimport/exportを実現する

## 辞書ツール言語仕様
### Google日本語入力(Microsoft IME)
#### 登録画面
<img width="701" alt="スクリーンショット 2020-02-09 9.59.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90313/53bb41e3-7b51-063e-f831-bf88a21bdd77.png">

#### エクスポート後の出力結果
```
f1    😆    名詞    
f2    😡    名詞    
f3    😭    名詞
```
#### 特徴
・Microsoft IMEとGoogle日本語入力は同じ仕様(なぜplistもこうしなかった・・)
・読み、文字、品詞を入力することができる。間にはタブ文字が挿入されている

### Macユーザー辞書(plist)
#### 登録画面
<img width="624" alt="スクリーンショット 2020-02-09 9.59.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90313/3f2b871f-012d-7d76-18ce-ab673f4af993.png">

#### エクスポート後の出力結果
```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict>
        <key>phrase</key>
        <string>😆</string>
        <key>shortcut</key>
        <string>f1</string>
    </dict>
    <dict>
        <key>phrase</key>
        <string>😡</string>
        <key>shortcut</key>
        <string>f2</string>
    </dict>
    <dict>
        <key>phrase</key>
        <string>😭</string>
        <key>shortcut</key>
        <string>f3</string>
    </dict>
</array>
</plist>
```

#### 特徴
・品詞が登録できない(は????????????)
・HTMLのタグ形式のような形。読みはshortcut、文字はphraseとして登録される

# あとがき
・Macのユーザー辞書の仕様が他とあっていないため、変換ツールを作ることができた
・Web系の言語の書き方ではないらしい。まぁやったことないししょうがないか

## TBD
(2020/2/19追記)下記対応済
~~・ファイルからの入出力(今はテキストコピーのみに対応であるため、まだ不便)~~
~~・貼り付けたファイルの自動認識(選択するのが面倒)~~
Herokuではレイヤー数が多過ぎるとDockerイメージが動かない

Herokuの [Container Registry](https://devcenter.heroku.com/articles/container-registry-and-runtime) でDockerイメージが動かなくてハマったので後世のために記しておきます。

結論から言うと、Dockerイメージのレイヤーー数が40を超えるとHeroku上では動かせません(2020年2月9日時点)。レイヤー数40の制限の詳細な仕様、実装がどうなっているのかは分かりませんが、40近い命令数になると起こりうると注意した方がよいかと。

>Images with more than 40 layers may fail to start in the Common Runtime

https://devcenter.heroku.com/articles/container-registry-and-runtime#known-issues-and-limitations

レイヤー数はDockerファイルに記載されている命令数に依存するのでとにかく命令数を減らすしかありません。
特に `RUN` 命令はまとめましょう。
なお、Dockerファイルに記載していた命令数は39でしたが、この制限に引っ掛かていたようです。
最終的には31まで命令数を減らして対応しました。

## Dockerイメージが動かない時の症例
### heroku run bash
`heroku run bash` で接続を試みると以下の状態のまま動かなくなる。

```bash
$ heroku run bash --type=worker --app [APP_NAME]
Running bash on ⬢ [APP_NAME]... connecting, worker.7390 (Standard-1X)
```

### Heroku Scheduler
`Heroku Scheduler` でイメージ上のアプリケーションを実行しようとすると、以下のログが出るだけで実行されない。

```bash
Jan 28 13:12:00 [APP_NAME] app/api: Starting process with command [COMMAND] by user scheduler@addons.heroku.com
Jan 28 13:12:26 [APP_NAME] heroku/scheduler.8466: State changed from starting to complete
```
Markdown 目次 TOC

- [はじめに](#はじめに)

<a id="はじめに""></a>
<a href="はじめに"></a>

#はじめに

```
<a id="はじめに""></a>
<a href="はじめに"></a>
```

#　目次
- [はじめに](#はじめに)
    - [主張](#主張)
    - [理由](#理由)
    - [具体例](#具体例)
     - [例1](#例1)
    - [反論](#反論)
    - [再主張](#再主張)
- [結論](#結論)

<a id="はじめに"></a>
# はじめに

<a id="主張"></a>
## 主張
 
<a id="理由"></a>
## 理由
 
<a id="具体例"></a>
## 具体例

<a id="例1"></a>
### 例1

<a id="反論"></a>
## 反論

<a id="再主張"></a>
## 再主張

<a id="結論"></a>
# 結論



```toc.html
part3

目次

- [はじめに](#はじめに)
- [環境](#環境)
- [例1](#例1)
- [方法](#方法)
- [対策](#対策)
- [余談](#余談)
- [まとめ](#まとめ)
- [感想](#感想)
- [参考文献](#参考文献)

<a id=""></a>

<a id="はじめに"></a>
# はじめに
<a id="環境"></a>
# 環境
<a id="理由"></a>
# 理由
<a id="具体例"></a>
# 例
<a id="例1"></a>
# 例1
<a id="方法"></a>
# 方法
<a id="対策"></a>
# 対策
<a id="まとめ"></a>
# まとめ
<a id="感想"></a>
# 感想
<a id="参考文献"></a>
# 参考文献

-----

- [はじめに](#はじめに)
    - [主張](#主張)
    - [理由](#理由)
    - [具体例](#具体例)
     - [例1](#例1)
    - [反論](#反論)
    - [再主張](#再主張)
- [結論](#結論)

<a id="はじめに" name="はじめに"></a>
# はじめに

<a id="主張" name="主張"></a>
## 主張
 
<a id="理由" name="理由"></a>
## 理由
 
<a id="具体例" name="具体例"></a>
## 具体例

<a id="例1" name="例1"></a>
### 例1

<a id="反論" name="反論"></a>
## 反論

<a id="再主張" name="再主張"></a>
## 再主張

<a id="結論" name="結論"></a>
# 結論


part2

目次

- [はじめに](#はじめに)
- [主張](#主張)
- [理由](#理由)
- [具体例](#具体例)
- [例1](#例1)
- [反論](#反論)
- [再主張](#再主張)
- [結論](#結論)

<a id="はじめに"></a>
# はじめに
<a id="主張"></a>
# 主張
<a id="理由"></a>
# 理由
<a id="具体例"></a>
# 具体例
<a id="例1"></a>
# 例1
<a id="反論"></a>
# 反論
<a id="再主張"></a>
# 再主張
<a id="結論"></a>
# 結論

part 4

#　目次
- [はじめに](#はじめに)
    - [主張](#主張)
    - [理由](#理由)
    - [具体例](#具体例)
     - [例1](#例1)
    - [反論](#反論)
    - [再主張](#再主張)
- [結論](#結論)

<a href="はじめに"></a>
# はじめに

<a href="主張"></a>
## 主張
 
<a href="理由"></a>
## 理由
 
<a href="具体例"></a>
## 具体例

<a href="例1"></a>
### 例1

<a href="反論"></a>
## 反論

<a href="再主張"></a>
## 再主張

<a href="結論"></a>
# 結論

```
Python PandasライブラリでExcelの表題「件名」列に「中計」と書いてある行番号を全て探す

＃ はじめに

　Python Pandasライブラリで`Excelの表題「件名」列に「中計」と書いてある行番号を全て探す`場合のメモを書き留めておきます。

# 結論

`pandas.DataFrameオブジェクト.reset_index().query( '件名 == "中計"' ).index`
と記述します。これで表題「件名」列に「中計」と書いてある行番号の配列を得ることができます。具体的には以下のように記述します。

```python:具体例
list中計行 = list( df請求一覧.reset_index().query( '件名 == "中計"' ).index )
```
## 前提条件
1. Excelシートは`ベースパス`の`請求対象フォルダ`の`年月フォルダ`の`出力フォルダ名`内のExcelブック`請求一覧ファイル名`内のシートとします
1. 表題「件名」列に「中計」と書いてあるExcelシートをPandasのDataFrame`df請求一覧`に格納します

## していること
1. `reset_index()`で`df請求一覧`の行番号に当たるインデックスを初期化します
2. `query()`メソッドで検索条件として`'件名 == "中計"'`を指定します
3. この`query()`メソッドの`index`プロパティを得ます。これが件名」列に「中計」の行番号です
4. これらの行番号が複数あるので、`list()`関数で配列化し、`list中計行`配列に格納します

# 実装例
　念のためにご参考までに、上記の具体例を使う実装例を示します。

## マージクするためのクラスたち
Excelシートの表題行（ヘッダ行）以下をPandasのDataFrameに格納指定ます

```python:merge.py
import pandas as pd
import os
import setting

class Read:
  def 請求一覧( 入力内容, listメッセージ ):
    請求一覧パス = \
              os.path.join( \
                入力内容.get( 'ベースパス' ), \
                  入力内容.get( '請求対象フォルダ名' ), \
                    入力内容.get( '年月フォルダ名' ), \
                      入力内容.get( '出力フォルダ名' ), \
                        入力内容.get( '請求一覧ファイル名' ) \
              )
    book請求一覧 = pd.ExcelFile( 請求一覧パス )
    df請求一覧 = book請求一覧.parse( \
                    book請求一覧.sheet_names[0], \
                    header=setting.Info.請求明細.get( 'ヘッダ行' ) - 1 \
                  )
    # 省略
    return( df請求一覧 )

class 請求一覧:
  def 中計行をさがす( df請求一覧 ):
    list中計行 = []
    list中計行 = list( df請求一覧.reset_index().query( '件名 == "中計"' ).index )
    print( "■list中計行 = ", list中計行 )
```
## 利用するクラス
PythonのWebフレームワーク*responder*のとあるクラスのPOSTメソッドで利用しています

```python:run.py
import responder
import merge

# 省略

@api.route("/top")
class top:
  # 省略
  async def on_post( self, req, resp ):
    data = await req.media()
    # 省略
    merge.請求一覧.中計行をさがす( merge.Read.請求一覧( 入力内容, listメッセージ ) )
    # 省略
    return
# 省略
```
## もろもろ設定クラス

```python:setting.py
class Info
    #省略
    パス = {
        "ベース": r"\\hoge\\foo\なんとか\かんとか"
        ,
        "請求対象フォルダ名": "請求対象"
        ,
        "年月フォルダ名": "yyyyMM分"
        ,
        "出力フォルダ名": "請求一覧"
        ,
        "請求一覧ファイル名": "なんとかかんとか.xlsx"
        ,
        # 省略
    }

    # 省略

    請求明細 = {
        "ヘッダ行": 9 ,
        "データ開始列": 1 ,
    }
```
Pythonのエラーメッセージは具体的でわかりやすい「が」(要素[0]でIndexError: list index out of range)

#目的
何かと比較できるほどの経験が乏しいですが、
**Pythonのエラーメッセージは具体的でわかりやすい**
と感じています。
よって、エラーは、ぱっと見るだけでなく、記載内容をまじめに読むことが、
エラー解決の近道である気がしています。

ただ、一瞬、理解できないこともあるので、
**理解できるはずという前提で落ち着いて考えましょう**
という、そんな気持ちを示すための記事です。

## 要素[0]でIndexError: list index out of range
補足の**要素[0]でIndexError: list index out of range**の意味は、
レンジ外と言われてみ、要素[0]がなんで、レンジ外なの？
という意味です。


#エラーメッセージの例

ここで示すコードは、エラーメッセージを出すためのコードで、
全く同じような間違いをする可能性があるコードではありません。
繰り返します。エラーメッセージを出さすためのコードです。
（ただし、もう少し、ややこしいコードで、同じエラーが出ているのをみたことはあります。）



## エラー１
**IndexError: list index out of range**が出るケースです。コードは、以下です。
下記のコードは、意味がありませんが、
（ただし、下記で、bが、**関数の戻り値でリストを得ている場合など**で、出会うことはあると思います。）


```index_err1.py
a = [1, 2, 3]
b = []

print("a[0]",a[0])
print("b[0]",b[0])

```

エラー表示は、以下です。

```python
Traceback (most recent call last):
  File "list_err1.py", line 5, in <module>
    print("b[0]",b[0])
IndexError: list index out of range
```

リストbは、[0]すらないというだけのことですが、
繰り返しますが、こんなコードは書かないですが、
bが、**関数の戻り値でリストを得ている場合など、多いにある。**と思いました。


# ポイント

**IndexError: list index out of range**には、Indexの指定が悪い場合以外に、
元のオブジェクトがちゃんとできていないケースがある。
**関数の戻り値でリストを得ている場合など、多いにある。**


#まとめ
エラーメッセージを構成するつくり上、当然の結果だとも思いますが、わかりやすいと感じたので。。。



#関連（本人）
## 直接はあまり関係ないもの
[pythonをストレスなく使う！（generatorに詳しくなる。since1975らしい。)](https://qiita.com/enoughspacefor/items/524a76fcde2610b9da8a)

[pythonをストレスなく使う！（Pythonでは、すべてがオブジェクトとして実装されている)](https://qiita.com/enoughspacefor/items/0c6118da4c228226a65f)
[pythonをストレスなく使う！（Pylintに寄り添う)](https://qiita.com/enoughspacefor/items/df692b27bb58ca1ffa1d)
[pythonをストレスなく使う！（ExpressionとStatement)](https://qiita.com/enoughspacefor/items/1a11f553c265a2c703f2)
[英語と日本語、両方使ってPythonを丁寧に学ぶ。](https://qiita.com/enoughspacefor/items/d4b49747773e2d0285f9)

#今後
コメントなどあれば、お願いします。:candy:
勉強します、、、、
Pythonのエラーメッセージは具体的でわかりやすい「が」(3連"""コメントの閉じる側で、SyntaxError)

#目的

　　（そのまえに、、、
　　　　「コメント」等頂いており、この記事、修正要です、すみません。）

何かと比較できるほどの経験が乏しいですが、
**Pythonのエラーメッセージは具体的でわかりやすい**
と感じています。
よって、エラーは、ぱっと見るだけでなく、記載内容をまじめに読むことが、
エラー解決の近道である気がしています。

ただ、一瞬、理解できないこともあるので、
**理解できるはずという前提で落ち着いて考えましょう**
という、そんな気持ちを示すための記事です。

## 3連"""のコメントの閉じる側での、SyntaxError
補足の**3連"""でのコメントの閉じる側で、SyntaxError**の意味は、
コメントを書いただけなのに、エラーになる、しかも、Syntaxと言われるという
言葉通りの意味です。


#エラーメッセージの例

ここで示すコードは、エラーメッセージを出すためのコードで、
全く同じような間違いをする可能性があるコードではありません。
繰り返します。エラーメッセージを出さすためのコードです。
（ただし、もう少し、ややこしいコードで、同じエラーが出ているのをみたことはあります。）



## エラー１
**SyntaxError**が出るケースです。コードは、以下です。

```comment_err1.py
a = 1
b = 2
try:
    a = 0
"""
aに0を入れてみる。
(このコード自体には、意味はありません。)
"""
    b = b/a
except:
    print("data NG!")
```

エラー表示は、以下です。

```python
C:\_qiita\python_error>python comment1_err1.py
  File "comment1_err1.py", line 8
    (このコード自体には、意味はありません。)
"""
            ^
SyntaxError: invalid syntax
```

上記の動きは、コメントを何か意味のあるものとして解釈しようとして、結局、意味がないということで**SyntaxError**となっています。
上記は、コメントのところのインデントを合わせると、問題ありません。


# ポイント

**コメントも、インデントには逆らえない。**


#まとめ
エラーメッセージを構成するつくり上、当然の結果だとも思いますが、わかりやすいと感じたので。。。



#関連（本人）
## 直接はあまり関係ないもの
[pythonをストレスなく使う！（generatorに詳しくなる。since1975らしい。)](https://qiita.com/enoughspacefor/items/524a76fcde2610b9da8a)

[pythonをストレスなく使う！（Pythonでは、すべてがオブジェクトとして実装されている)](https://qiita.com/enoughspacefor/items/0c6118da4c228226a65f)
[pythonをストレスなく使う！（Pylintに寄り添う)](https://qiita.com/enoughspacefor/items/df692b27bb58ca1ffa1d)
[pythonをストレスなく使う！（ExpressionとStatement)](https://qiita.com/enoughspacefor/items/1a11f553c265a2c703f2)
[英語と日本語、両方使ってPythonを丁寧に学ぶ。](https://qiita.com/enoughspacefor/items/d4b49747773e2d0285f9)

#今後
コメントなどあれば、お願いします。:candy:
勉強します、、、、
「Ruby での Cloud Storage の使用」をやってみた

[Ruby での Cloud Storage の使用](https://cloud.google.com/storage/docs/quickstart-ruby?hl=ja) を実施する中で苦労した点を書きます。

## 環境
- Windows
- Ruby

```
>ruby --version
ruby 2.4.9p362 (2019-10-02 revision 67824) [x64-mingw32]
```
WindowsでRubyを使おうとするから苦労するのだと思う。。。

## コマンドが実行できない

このコマンドが実行できませんでした。

```
×　bundle exec ruby buckets.rb create my-awesome-bucket
```

Windowsなので拡張子まで書きましょう。

```
○　bundle exec ruby.exe buckets.rb create my-awesome-bucket
```

## 認証が通らない

このページの範囲では認証についての記載を見つけられませんでしたが、次の流れで認証を通せました。

### 1. 「IAMと管理」よりサービスアカウントを作成する
https://console.cloud.google.com/iam-admin/ からサービスアカウントを追加する。

作成したら、「キーを生成」から、JSONで秘密鍵を含むファイルをダウンロードする。

### 2. 環境変数の設定

```
set GOOGLE_APPLICATION_CREDENTIALS=/PATH/TO/project-id-XXXX.json
```

Windowsでの？ポイント：フォルダ区切り文字は「\」→「/」にする。パスはクオートで囲わない。

### 3. Google Cloud Storage　APIの有効化

https://console.developers.google.com/apis/api/storage-api.googleapis.com からAPIを有効化する。
Unity VR 「Oculus Integration」をインポートすると「Unable to start Oculus XR Plugin.」エラーが出る場合の対処法

#はじめに
Unityに「Oculus Integration」をインポートし実行すると「Unable to start Oculus XR Plugin.」エラーが出る場合の対処方法を記述します。
![2020-02-09_06h55_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46035/ba4d5eca-ce07-cbfe-c273-171b8c3b3fcc.png)

#原因
Unity内包のプラグインと「Oculus Integration」内包のプラグインのバージョンの差異によりエラーが発生しています。

#開発環境
・Windows 10
・Unity 2019.3.0f6
・Oculus Integration 13.0
・Oculus Rift S

#手順
1. とりあえず Unity の VR 開発環境をセットアップしておいてください。
[Unity 2019.3 VR設定](https://qiita.com/necotarou/items/23d8c3f5ff48f31e0c2a)

2. 「Oculus Integration」アセットをダウンロード・インポートします。
![2020-02-09_07h14_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46035/780d1607-744c-4d16-d850-a0594b4755bd.png)

3. 任意のファイルをインポートします。
![2020-02-09_07h16_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46035/21cd0322-a660-8218-b854-32644dee30bb.png)

4. [ OVRPlugin ]を更新するように勧めてきますが[ No,Don't Ask Again ]ボタンを押します。
![2020-02-09_07h23_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46035/78b96cfe-d533-c260-5945-9ce0c6d8d205.png)

5. 後で[ OVRPlugin ]を更新する方法が表示されます。
[ Ok ] ボタンを押します。
![2020-02-09_07h24_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46035/e27ca798-be7b-ef73-6bb7-97a9c34b8095.png)

6. [ spatializer plugin ]を更新するか聞いてくることがあります。
[ Upgrade ]ボタンを押します。
![2020-02-09_07h25_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46035/bb9e5a41-b4d4-f956-fc1f-f4848b3fd44e.png)

7. [ spatializer plugin ]が更新され、Unityエディタを再起動してよいか聞いてきます。
よろしければ[ Restart ]ボタンでUnityエディタを再起動します。
![2020-02-09_07h26_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46035/e0333bff-0028-7069-df0d-5723f6036d15.png)

8. 以上で完了です。プロジェクトを実行して「Unable to start Oculus XR Plugin.」エラーが出ないか確認してください。
Wolfram Language で素数で遊ぶ


## N 以下の素数を求める

```mathematica:
In[2]:= Prime @ Range @ PrimePi[50]
Out[2]= {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47}
```

## 小さな値から順に N 個の素数を求める

```mathematica:
In[7]:= Prime @ Range[10]
Out[7]= {2, 3, 5, 7, 11, 13, 17, 19, 23, 29}
```

## N 番目の素数を求める

```mathematica:
In[4]:= Prime[1]
Out[4]= 2

In[5]:= Prime[2]
Out[5]= 3

In[6]:= Prime[100]
Out[6]= 541
```

## N を素因数分解する

```mathematica:
In[8]:= FactorInteger[2600]
Out[8]= {{2, 3}, {5, 2}, {13, 1}}
```

```mathematica:
In[20]:= Join @@ (Table[#[[1]], #[[2]]] & /@ FactorInteger[2600])
Out[20]= {2, 2, 2, 5, 5, 13}
```

## N が素数かどうか調べる

```mathematica:
In[21]:= PrimeQ[13]
Out[21]= True

In[22]:= PrimeQ[1024]
Out[22]= False
```

## N 以上の最小の素数を求める

```mathematica:
In[23]:= f[n_] := NextPrime[n-1]

In[24]:= f[13]
Out[24]= 13

In[25]:= f[14]
Out[25]= 17
```

## N 以下の最大の素数を求める

```mathematica:
In[39]:= g[n_] := NextPrime[n+1, -1]

In[40]:= g[3]
Out[40]= 3

In[41]:= g[100]
Out[41]= 97
```

## N 以上の素数を、小さな順から M 個求める

```mathematica:
In[48]:= h[n_, m_] := NestList[NextPrime, NextPrime[n-1], m-1]

In[49]:= h[1, 3]
Out[49]= {2, 3, 5}

In[50]:= h[3, 5]
Out[50]= {3, 5, 7, 11, 13}
```

## 約数の個数を求める

```mathematica:
In[52]:= DivisorSigma[0, 2^2 * 5]
Out[52]= 6

In[53]:= DivisorSigma[0, 1024]
Out[53]= 11
```

## 約数の総和を求める

```mathematica:
In[54]:= DivisorSigma[1, 12]
Out[54]= 28

In[55]:= DivisorSigma[1, 1800]
Out[55]= 6045
```

## 約数を列挙する

```mathematica:
In[56]:= Divisors[10]
Out[56]= {1, 2, 5, 10}

In[57]:= Divisors[1024]
Out[57]= {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024}
```

## リンク

- [Rubyで素数で遊ぶ(prime モジュール)](https://qiita.com/norioc/items/5c270ad6ff5d22d1efd0)
adventcalender UEでオープンワールド系のアセットを使ってみる 2019/12/9分として投稿

2020/02/08 構成を記載

こんにちは、コロナです。

12/9分ではUnrealEngineの公開されているテンプレートを使ってみるというコーナーになります。

使ってみるテンプレート
Unreal Engine Turn-Based jRPG Template

参考用のtrailerは以下になります
https://t.co/QtfzKc6kiV 

2020/02/08時点の課題
PC性能が低く、アセットを取り込むとまともに開発ができないので、新PC買い替え後に再検証

2021/01/19　アセットを取り込んだので、更新

# アセットを探す
「マーケットプレイス」で、「jRPG Template」を入力する

![アセットダウンロード用_1枚目.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/ed194ded-c487-6261-db52-b1cc9a1b626a.png)

検索をすると、確認しておいた「Turn-Based jRPG Template」を赤い枠のもので見つけたので購入しました

![アセットダウンロード用_2枚目.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/aa331b0f-f934-d5ca-83d7-57817056564b.png)

購入完了後は、「ライブラリ」についかされるので「プロジェクトを作成する」ボタンをクリックします
<font color="red">*プロジェクト一式のテンプレートなので、新しいUEプロジェクトが作成されます</font>

![アセットダウンロード用_3枚目.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/63631078-6532-0fb9-7160-1c8b237fd334.png)

<font color="red">*デフォルトでは、UEプロジェクトに使用できない「‐」が含まれていて、作成できないので赤文字を確認して、変更します</font>
![アセットダウンロード用_4枚目.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/88842b4e-3f37-8432-aef8-06dc8db7158e.png)

「クリエイト」ボタンが押せる状態になったら、クリックします

![アセットダウンロード用_5枚目.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/a5331fab-5e69-2586-4015-e9a2c3660112.png)

プロジェクトの作成が完了すると、赤枠で囲まれたようにプロジェクトが作成完了になります

![アセットダウンロード用_9枚目.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/346a80ed-ef47-ff2e-8ca9-7770453d9728.png)



## 取り込んだ結果をスクショで張り付ける

プロジェクトが開かれると、MainMenuのシーンが起動した状態となります

![アセットダウンロード用_6枚目.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/5b334c8d-3c91-298b-b6c6-21760ab5f526.png)

### 取り込んでたので、起動してみる

メニューの「>>」をクリックします。
ビルドオプションが開かれるので、「プレイボタン」をクリック

![アセットダウンロード用_7枚目.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/291ddcd3-0512-0a7d-9f67-715ee759238d.png)

UEのテンプレートプロジェクトから起動しました

![アセットダウンロード用_8枚目.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/d9a7e3e0-3791-c544-49ef-1d31dc3ddff9.png)

<font color="red">＊オリジナルの画像に差し替えたら、ビルドしてWinmdows版として、アップします</font>
adventcalender 2019/12/25 分として投稿


こんにちは、ころなです。

2020/02/08 設計を記載

今日は2019年のadventcalenderの総まとめになります。
もし外部記事からきたかたは、[ここ](https://qiita.com/drafts/2635646996072bfece1c/edit)からリンクをしてください。

# adventcalenderのイメージ図を書く

# 過去と今を指すものとして、beforeとafterのイメージ図書く
  完成したアプリのアイコンをくっつけた一つの島イメージ
　完成していない記事の部分はcomming soonを略してCSって図形に入れる
Job Inspectorをみなくても実行時間を調べる

小ネタ

```java:runtime.spl
....
| eval runtime=time()-now()
```

[実行時間　測定@google](https://www.google.com/search?sxsrf=ACYBGNQR--4ZkfgihOV-WqbgWLc9-XNzYA%3A1581198073019&ei=-So_XrBklKagBL6-ugg&q=%E5%AE%9F%E8%A1%8C%E6%99%82%E9%96%93+%E6%B8%AC%E5%AE%9A&oq=%E5%AE%9F%E8%A1%8C%E6%99%82%E9%96%93+%E6%B8%AC%E5%AE%9A)

のSplunkバージョン
`table`のあとにつけると、各行毎に微妙に増えていくのがわかります。
Unity 2019.3 VR設定

#はじめに
Unity 2019.3ではVR開発環境のセットアップの方法が新しくなりました。
この記事では Unity 2019.3でのVR開発環境のセットアップの手順を記述します。

#環境
・WIndows 10
・Unity 2019.3.0f6
・Oculus Rift S

#手順

1. メインメニューの[Edit] - [Project Settings...]を選択し「Project Settings」ウィンドウを開きます。
![2020-02-09_05h30_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46035/15ed8eab-321b-9d58-6689-9e7f9008301a.png)

2. 「Project Settings」ウィンドウの[XR Plugin Management]を選択し[Install XR Plugin Management]ボタンを押します。
![2020-02-09_05h31_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46035/2769aade-f208-a544-d656-c67f83518247.png)

3. 対象の[Install]ボタンを押します。
ここでは Oculus Rift S用に[Oculus XR Plugin]の[Install]ボタンを押しています。
プラグインがインストールされます。
![2020-02-09_05h35_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46035/b3c9ed20-fbf3-d227-77b6-9b59057a1cf3.png)

4. 「Plugin Providers」リストの[+]ボタンを押し「Loader」を選択します。
ここでは Oculus Rift S用に[1. Oculus Loader]を選択しています。
![2020-02-09_05h37_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46035/a3f920d1-9a48-9bad-6856-ad1492985bf8.png)

5. 「Plugin Providers」リストに「Loader」に登録されているのを確認します。
![2020-02-09_05h44_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46035/609e1055-10c9-a600-4589-6d798b482d80.png)

6. 「Project Settings」ウィンドウの[Oculus]を選択し[Create]ボタンを押します。
![2020-02-09_05h45_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46035/b0b481da-4cae-8aed-4222-9605587e6cb6.png)

7. 「Oculus」の設定が表示されたことを確認します。
![2020-02-09_05h47_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46035/41b39c0d-bbb7-c8d8-41a2-7725ba946b9b.png)

8. これでセットアップ完了です。
初心者によるプログラミング学習ログ 234日目

#100日チャレンジの234日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

234日目は

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>234日目<br>・Vue.jsのアプリ模写<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1226249022945366016?ref_src=twsrc%5Etfw">February 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
adventcalender 職歴管理表をアプリっぽくしてみる【2019/12/14 分として投稿】

2020/02/08 設計を記載

こんにちは、コロナです。

今回のadventcalenderでは、過去に管理していた職務経歴についてアプリ側から参照しやすい形に修正をしています

元々は、いろいろな求人情報でばらついているものを登録しなおしていきます
過去に入力したスクショ

<img width="928" alt="サンプル用のスクショ_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/1aefc044-708b-6fc4-f562-2bf93be16d00.png">

<img width="943" alt="サンプル用のスクショ_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/f6515b5b-ff99-5cfc-a0e8-c5e697bd1bad.png">


<img width="918" alt="サンプル用のスクショ_3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/bff76d23-3ecc-cf9d-2a2f-e2144ed1b612.png">

共通している内容として、以下で入力してゲームやアプリのような表現で見せられたらなと進めています
　・開始年月日
　・終了年月日
　　→期間集計をするために、文字列で取得した後に裏では日付や数値にしておく
　・システム内容
　　→スクショの例：ポータルサイト開発　財務会計システム　ソーシャルゲーム etc
　・当時の所属組織
    →雇用されている会社の名前を入れておく。　会社の名前でグルーピングして働いていた期間を入力する
　・技術構成（鈴江が「中途」で技術者畑なので→「新卒や学生は別」）
　　→開発していた時に担当していたシステムの内容
　・使われる領域（買い物サイトなのか、ゲームなのか、事務員の方向けなのか、配送や各種企業向けなのか　等々）


アプリ側構成
 
　会社建物画面
　　会社のような建物に入る→お仕事年表が見られる
　利用領域ビル
　　ゲームや、EC、企業向けなどの経験年数によってビルの高さが変動するように用意
　技術領域ビル
　　PHPやJava、Python等のアサインをしてもらう時の目安として建物の高さ化
　詳細は、ビルや各種建物で検索画面を用意

・データ入力先
・アプリのデザイン(3D化予定 詳細画面は、スクショで作成しているフォーマットを基本として進める予定)

# 2020年11月28日更新
会社建物画面の機能プロトタイプイメージです(*'ω'*)

![Yumemi.vue #4 を雑に報告すゲーム 報告2 _ フリーゲーム投稿サイト unityroom および他 22 ページ - 個人 - Microsoft​ Edge 2020_11_28 11_55_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/d3761041-1897-0cb6-b32e-ff958252f4e0.png)


https://unityroom.com/games/future_city_sarkuver_portforio
 
それでは、次回はアプリの成果物ができてたらお知らせ予定です。
adventcalender CMSからデータを取ってくるアプリサンプル作成するよ【2019/12/10 分として投稿】


2020/02/08 公開

こんにちは、コロナです。

今回のadventcalenderでは、ポートフォリオを兼ねて以下のような３段階の流れを紹介していきます

「CMSでデータを登録」
「登録した情報をAPIから取得する」
「取得した情報をユーザから見えるアプリで表示する」

サンプルアプリを用意するにあたって用意するのが以下の概要になります。

<img width="647" alt="connection_image_1210.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/f7e9fa71-3c55-cbe3-9e37-e3ff1b3a2d34.png">

概要をもとにして、次回の更新では実際に作ったアプリのプログラム等を公開していくのでお楽しみにしてください
centosでgemがタイムアウトになる現象の解決方法

# 概要
* CentOS 8でredmineをインストールしようとしたときに、bundleがインストールできなかった。
* `gem install bundler` と何度入力してもタイムアウト
* IPv6を無効化したらあっさり解消

#　方法
`/etc/sysctl.conf `を書き換える。

```shell-session
# vi /etc/sysctl.conf
・・・
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
・・・

# sysctl -p
・・・
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

# nmcli c mod eth0 ipv6.method ignore
```

これで解消しました。

#　参考
https://server.etutsplus.com/centos-7-network-configuration/2/
core-jsを読み込んだけど、IE11で"Exception thrown and not caught"というエラーが発生する

Babel 7.4.0から、@babel/polyfillが非推奨になったそうです。
ではどうすれば良いのかというと、もともと@babel/polyfillがインクルードしていたcore-jsとregenerator-runtimeを直接インポートしてやれば良いらしい。
[babelの公式](https://babeljs.io/docs/en/babel-polyfill)にも書いてある。

```javascript
import "core-js/stable";
import "regenerator-runtime/runtime";
```
設定ファイルにも書く必要がある。
このあたりの説明は[この記事](https://aloerina01.github.io/blog/2019-06-21-1)に詳しい。

これでコンパイルはできるのだが、IE11でエラーが出て動かない。

```
SCRIPT5022: Exception thrown and not caught
internal-state.js
```

Google先生に問い合わせたところ、日本語の情報は見つからなかったが、同様のエラーで悩んでいる人々がいた。
core-jsの開発者に質問ぶつけている模様。
https://github.com/zloirock/core-js/issues/514
で、[質問者は自力で解決したようだ](https://github.com/zloirock/core-js/issues/514#issuecomment-476541281)。

恥ずかしながら正確なところは理解できていないのだが、
どうもBabelがコンパイルするときに、core-jsのpolyfillを破壊してしまっているのが問題のようだ。
したがって、babel-loaderの除外対象としてcore-jsを指定することで解決するらしい。

私の場合はwebpackを使っているので、こんな感じで書いたところ、IE11でのエラーが出なくなった。
（``exclude``を追加した）

```javascript:webpack.config.js
module.expots = {
  /* 省略 */
  module: {
    rules: [
      {
        test: /\.js$/,
        use: [
          loader: "babel-loader",
          options: {
              presets: [
                [
                  "@babel/preset-env",
                  {
                    targets: {
                      ie: 11,
                      esmodules: true
                    },
                    useBuiltIns: "entry",
                    corejs: 3
                  }
                ]
              ]
          }
        ],
        exclude: /node_modules\/(?!(core-module)\/).*/
      }
    ]
  }
}
```
IE11のためにわざわざpolyfillしているのに、その過程でIE11にエラーが出るなんて。
いつまでたっても拾いきれない例外を投げまくっているのは、お前のことだぞ、IEよ。
ちょっと不思議なC#クイズ

## Q1
```csharp
struct A
{
    int sum;

    public int Sum(Action<int, int> log)
    {
        sum = 0;
        for (var i = 0; i < 10; i++)
        {
            sum += i;
            log(i, sum);
        }

        return sum;
    }
}
```

上記のクラスの`Sum`メソッドは常に`45`を返してきそうな感じがしますね。
**実はSumメソッドに渡す引数次第では他の値が返ってくる可能性があります。**
どのような引数を与えれば他の値を返すことができるでしょうか。

<details><summary>答え(リフレクションあり)</summary><div>


```csharp
var temp = new[]{(object)(new A())};
var sumMethod = typeof(A).GetMethod("Sum");
var sumField = typeof(A).GetField("sum", BindingFlags.NonPublic | BindingFlags.Instance);
var result = sumMethod.Invoke(temp[0], new object[]
{
    new Action<int, int>((i, sum) =>
    {
        sumField.SetValue(temp[0], 999);
        Console.WriteLine($"i:{i} sum:{sum}");
    }),
});
Console.WriteLine(result);
/*
i:0 sum:0
i:1 sum:1000
i:2 sum:1001
i:3 sum:1002
i:4 sum:1003
i:5 sum:1004
i:6 sum:1005
i:7 sum:1006
i:8 sum:1007
i:9 sum:1008
999
*/
```
</div></details>

<details><summary>答え(リフレクションなし)</summary><div>

```csharp
var a = new A();
var result = a.Sum((i, sum) =>
{
    a = new A();
    Console.WriteLine($"i:{i} sum:{sum}");
});
Console.WriteLine(result);
/*
i:0 sum:0
i:1 sum:1
i:2 sum:2
i:3 sum:3
i:4 sum:4
i:5 sum:5
i:6 sum:6
i:7 sum:7
i:8 sum:8
i:9 sum:9
0
*/
```
</div></details>

## Q2

```csharp
interface ITest
{
}

struct A
{
    int elemCount;

    public int Init<T>(Span<T> s)
        where T : ITest
    {
        elemCount = 0;
        foreach (ref var i in s)
        {
            elemCount++;
            i = default;
        }
        return elemCount;
    }
}
```

似たような問題です。
`Init`メソッドに要素数1以上のSpanを渡した場合、必ず1以上の値が返ってきそうな感じがします。
**これも引数次第では1以上の値が返ってこない可能性があります。**
どのような引数を与えればいいでしょうか。

<details><summary>答え</summary><div>

```csharp
struct AA : ITest
{
    public A a;
}

static void Do()
{
    Span<AA> s = stackalloc AA[1];
    var result = s[0].a.Init(s);
    Console.WriteLine(result);
}
/*
0
*/
```
</div></details>

## 最後に

どちらの解答も思いついた方は相当C#に詳しい方だと思います。
こんなこと知ってなくてもC#を書くことはできますがもしかしたら役に立つときが来るかもしれません。
Graphql React AWS backet

# GraphQLを通してreactからAWSに画像保存
参考にしたURL
https://medium.com/@enespalaz/file-upload-with-graphql-9a4927775ef7
正直, これコピペすれば 90% は完成する.
しないといけないのは,**AWS のバケット**の設定 以下それについて

## AWS S3
* バケットを作る
* アクセス権限のCORSの設定
* アクセストークンの発行 //ここまでAWSのアカウント内でやる事
* config.json の作成
* https://hack-le.com/s3-everyone-read/

## config.json
バケットに対して, バックエンドからアップロードしたりするのに必要

```
AWS.config.loadFromPath('./config.json');
```

中身は

```
{ 
  "accessKeyId": "ABCDEFGDHDHDHJDJHDJDJ",
  "secretAccessKey": "jfoaisdjfaosjfasjfasodjfasfjasdif",
  "region": "ap-northeast-1"
}
```
config.jsonと"region"は以下参照
**config.json:** https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials-json-file.html
**region:** https://docs.aws.amazon.com/general/latest/gr/rande.html