OmniAICreator/Qiita-1.07M huggingface dataset:
【GAS】JANコードからCD情報を取得してスプレットシートに書き込む

# はじめに

家にあるCDが増えてきたので一覧を作りたいと思ったものの、手入力するのは面倒だったのでJANコードからCD情報を取得してタイトルやアーティスト名などを自動でスプレットシートに書き込めるようにしました。

# 楽天ブックスCD検索API

CD情報を取得には楽天ブックスCD検索APIを使いました。
参照：https://webservice.rakuten.co.jp/api/bookscdsearch/

# スクリプト

```
const APPLICATION_ID = "アプリIDを記載";
const SEARCH_URL = "https://app.rakuten.co.jp/services/api/BooksCD/Search/20170404";

function writeActiveCellCdAttribute(){
  const sheet = SpreadsheetApp.getActiveSheet(); 
  const activeRange = sheet.getActiveRange();
  
  if(!activeRange){
    return;
  }
  
  if(activeRange.getNumRows() != 1 || activeRange.getNumColumns() != 1){
    return;
  }
  
  const col = activeRange.getColumn();
  const row = activeRange.getRow();
  // JANコード列か判定
  if(col == 2 && !sheet.getRange(row, 1).getValue()){
    const jan = sheet.getRange(row, col).getValue();
    const result = getCdAttribute(jan);
    if(result){
     writeCdAttribute(sheet, row, result);
   }
  }
}

function writeCdAttribute(sheet, row, info){
  var col = 3;
  sheet.getRange(row, col++).setValue(info.title);
  sheet.getRange(row, col++).setValue(info.titleKana);
  sheet.getRange(row, col++).setValue(info.artistName);
  sheet.getRange(row, col++).setValue(info.artistNameKana);
  sheet.getRange(row, col++).setValue(info.label);
  sheet.getRange(row, col++).setValue(info.makerCode);
  sheet.getRange(row, col++).setValue(info.salesDate);
}

function getCdAttribute(jan) {
 
  const url = SEARCH_URL
      + "?" + "format" + "=" + "json"
      + "&" + "applicationId" + "=" + APPLICATION_ID
      + "&" + "jan" + "=" + jan;
 
  const response = UrlFetchApp.fetch(url).getContentText();
  const resultJson = JSON.parse(response);
  
  const item = resultJson.Items[0].Item;
  if (item) {
    const result = {
        title: item.title,
        titleKana: item.titleKana,
        artistName: item.artistName,
        artistNameKana: item.artistNameKana,
        label: item.label,
        makerCode: item.makerCode,
        salesDate: item.salesDate,
    };    
    return result;
  }
  return null;
}
```

# トリガーの設定

スプレットシートに何かしら入力するとwriteActiveCellCdAttributeメソッドが呼ばれるように設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537648/b77959c0-9a0f-8dd0-07c3-cfa63dcfa164.png)


# スプレットシート 

<img width="1179" alt="スプレットシート .png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537648/58c5aa72-318f-f182-19a6-37a2683f92d6.png">

# まとめ

スマホのカメラでバーコードを読みとる機能は精度が悪くて挫折しました。
P5.js 日本語リファレンス(createImage)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の createImage関数を説明します。

## createImage() 

### 説明文

新しい p5.Image (画像を格納するためのデータ型)を作成します。これは、操作するピクセルの新しいバッファを提供します。幅と高さのパラメータでバッファのサイズを設定します。

.pixels は、表示ウィンドウ内のすべてのピクセルの値を含む配列へのアクセスを提供します。これらの値は数値です。この配列は、表示ウィンドウx4 のサイズ(pixelDensityの適切な係数を含む)であり、各ピクセルのR、G、B、Aの値を順番に表し、各行を左から右に移動し次に各列を下に移動します。詳細については .pixels を参照してください。 set() または get() を使用する方が簡単な場合もあります。

画像のピクセルにアクセスする前に、データを loadPixels() でロードする必要があります。配列データを変更した後、 updatePixels() を実行して変更を更新する必要があります。

### 構文

createImage(width, height)

### パラメタ

- width  
Integer：ピクセル単位の幅

- height  
Integer：ピクセル単位の高さ


### 戻り値

p5.Image：p5.Imageオブジェクト


### 例1

```javascript
function setup(){
  
  // 66 x 66 サイズの p5.image を用意します
  let img = createImage(66, 66);
  img.loadPixels() ;

  // 全てのピクセル (i, j) に対して、color(180, 10, 10)を割り当てる
  // アルファ値はx座標値を正規化した値の3倍を割り当てる
  for(let x = 0; x <img.width; x++){
    for(let y = 0; y <img.height; y++){
      img.set(x, y, color(180, 10, 10, (x % img.width) * 3));
    }
  }

  // p5.image の更新
  img.updatePixels() ;

  // ずらして p5.image の表示
  image(img, 17, 17);
  image(img, 34, 34);
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/FZNAPeqjx


### 例2

```javascript
function setup(){
  let pink = color(255, 102, 204, 100);

  // 66 x 66 サイズの p5.image を用意します
  let img = createImage(66, 66);
  img.loadPixels() ;
  
  // 画像のピクセルにアクセスするためのサイズを求めます
  // (1画素 R、G、B、Aの4バイトあるため4倍します) 
  let fullImage = img.width * img.height * 4;

  for(let i = 0; i < fullImage; i += 4){
    img.pixels [i] = red(pink);        // 255
    img.pixels [i + 1] = green(pink);  // 102
    img.pixels [i + 2] = blue(pink);   // 204
    img.pixels [i + 3] = alpha(pink);  // 100
  }
  
  // p5.image の更新
  img.updatePixels() ;

  // p5.image の表示
  image(img, 0, 0);
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/aFpGn8Vzo



### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
Python3学習１

前回は開発環境を仮想環境で整え、Python３が動作するのを確認するところまで行いました。
今回は、Python３で入力など行っていきたいと思います。

# 初めに

コンソール画面でPython３と入力するとPythonのコーディングが可能になりますので
ここでコーディングを行っていきたいと思います。

```
python3
>>>
```

## 出力

printで囲われた内容が出力されます

```
>>> print("任意")
任意
```

###  四則演算
- ＋

```
>>> print(3 + 4)
7
```

- ー

```
>>> print(5 - 1)
4
```

- /

```
>>> print(10 / 2)
5.0
```
- *

```
>>> print(4 * 4)
8
```

- 文字＋数値

```
>>> print(９ ＋　”４”)
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
```

- 文字＋文字

```
>>> print("7 + ４”)
7 + 4
>>> print("7" + "４”)
7 4
```
DjangoでS3にファイルを保存しようとしたらbotocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the PutObject operation: Access Denied出た時の対処法

# なんかエラー出た！

Djangoで`static`ファイルをS3上にテスト的に上げるときに

```
$ python manage.py collectstatic
```

を実行したら、

```terminal
botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
```

と出た。


なんじゃこれと思い読んでみると、どうやらS3のバケットにアクセスする際に権限ないんだが？お前の設定間違っているんだが？という意味らしい。

先駆者様がいないかなーと思いエラー名をそのままググる。
すると

[LambdaでS3からファイルを取得しようとしたらbotocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the GetObject operation: Access Deniedとなった時の対応方法](https://qiita.com/ponsuke0531/items/c5b0b9fd4f985a311ce9)

といういかにも似たようなケースの方を発見する。

どうやらこの方はロールの割り当てを忘れていたようだ。
しかし、私の場合はしっかりロールを割り当てているのにアクセスできない・・・

なんでかと思いバケット側の設定をみてみると、アクセス権限という欄が。

嫌な予感がして見てみると、

![スクリーンショット 2020-06-12 17.12.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412789/defd92e4-154e-4afb-ffb9-e4ee701da79b.png)

この状態になっていました。
そりゃパブリックアクセスを禁止してるのにアクセスできたら逆に問題ですよねー・・・

AWSよく分かってないが故のエラーでした。
以後気をつけます。
apiコントローラー作成　備忘録　laravel

#postでapiにデータを渡す
概要：送信されてきたデータとデータベースに保存されているデータを比べて、照合する。
データベースに保存されていたらsuccessを返し、失敗したらnot foundを返す。

##laravelの記述
###routeの設定
```php:api.php
Route::post('/filecheck','ApiController@filecheck')->name('api.filecheck');
```

###ControllerでApiのファンクションを書く
```php:ApiController.php

public function filecheck(Request $request){
        $license_number = $request->get('license_number');
        $md5_string = $request->get('md5_string');
        $customer = \DB::table('customers')->where('license_number','=',$license_number)->first();
        $files = \DB::table('files')->where('customer_id','=',$customer->id)->get();
        foreach($files as $file){
            if($file->md5_string == $md5_string){
                return Response::json("success",200);
            }
        };
        return Response::json("not found",400);
    }
```

##静的サイト側の記述
```index.html
<script>
$(function(){
    $("#btn").click(function(){
        $.post("http://127.0.0.1:8001/api/filecheck",
        {"license_number":"37EYVXR12G",
        "md5_string":"1a7a070e29fc994a58421bb26c765fc3"},
        function(data){
            console.log(data);
        },
        "json"
        );
    })
});
</script>
```

参考
http://js.studio-kingdom.com/jquery/ajax/post
ESLint が .gitignore を認識するように設定する方法

どのファイル・ディレクトリを無視するかを ESLint に設定するために `.gitignore`ファイルをそのまま使うには、以下の方法があります。

## 1. CLI オプション `--ignore-path` で指定

`eslint --ignore-path .gitignore` のように、CLI オプションで指定できます。

ただし、`.gitignore` がサブディレクトリにある場合には対応できない他、エディタ連携はその設定を認識できません。

## 2. `.eslintignore` ファイルをシンボリックリンクに

`.eslintignore` ファイルを `.gitignore` ファイルのシンボリックリンクにすれば、ESLint は `.gitignore` の内容を認識できます。

ただし、`.gitignore` がサブディレクトリにある場合には対応できません。

## 3. `.eslintrc.js` で `.gitignore` を読む

`.eslintrc.js` ファイル内で `.gitignore` ファイルを読み込み、`ignorePatterns` フィールドに設定すれば、ESLint は `.gitignore` の内容を認識できます。
[eslint-gitignore](https://www.npmjs.com/package/eslint-gitignore) パッケージを使うと少し楽をできます。

```js:例
// __dirname 以下から全 `.gitignore` を探して `ignorePatterns` で使えるように変換する
const { readGitignoreFiles } = require("eslint-gitignore")
const gitignore = readGitignoreFiles({ cwd: __dirname })

module.exports = {
    ignorePatterns: gitignore,
    // ...他の設定...
}
```

※ `__dirname` 以下を見るので、共有設定でこれをすると期待通りには動かないと思います。
SlackのSlash Commandで書式付きメッセージを送る方法

## はじめに
普段Slackアプリでポチポチしてコメントに書式を適用していますが、Slash CommandやBotの応答メッセージに書式を適用する場合は少々工夫する必要があります。
今回は、各書式付きメッセージの作り方をまとめました。

## 前提
- Slash Commandの実装はすでに出来ているものとします

まだの方は、以下を参照
http://blog.serverworks.co.jp/tech/2020/02/21/beginner-slash-command/

## 書式付きメッセージ
### メンション
 - `<@yourname>`

<>の中に@ユーザ名を入れるだけ

例)
<img width="214" alt="mention.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/8b4f7863-9da6-8630-2b07-f3480766a3b7.png">

```txt
"<@yourname> さん、こんばんは！"
```

### 太文字
- `*bold text*`

*で両端を囲うと太文字になります
※**の前後にスペースを入れないと太文字になりません

例)
<img width="177" alt="bold.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/475bdd5d-922d-71d2-5862-043f03d7e0ce.png">

```txt
"これは *太文字*"
```

### 斜体
- `_italic text_`

**_**で両端を囲うと*斜体になります
※__の前後にスペースを入れないと斜体になりません

例)
<img width="168" alt="italic.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/aee4e4d9-c633-a892-7b5d-77df83a1e38d.png">

```txt
"これは _斜体_"
```

### 改行
- `\n`

おなじみ改行したいところで**\n**を入れるだけです

例)
<img width="199" alt="br.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/2489664f-ea69-e660-e0c5-8c19947ce8f2.png">

```txt
"これは、リンゴ\nあれは、みかん"
```

### ハイパーリンク
- `<link|text>`

**<>**の中に**リンク**と**テキスト**を入れて**|**を間に入れるだけ

例)
<img width="225" alt="link.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/ca1af53f-2f4e-03bf-8044-216d8051f5b8.png">

```txt
"<https://zozo.jp/|ZOZO>で夏セールやってるらしい"
```

### コード
- `` `code text` ``

バッククオートで両端を囲うとコード書式になります
※ ``の前後にスペースを入れないとコード書式になりません

例)
<img width="233" alt="code.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/bc80a49d-18a6-1f5c-e3f1-183779df7739.png">

```txt
"これで表示できます `print('hello')`"
```

### スタンプ
- `:stamp:`

:で両端を囲うとスタンプが表示されます

例)
<img width="180" alt="stamp.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/ef3be6fa-d712-d60b-55b6-03a9bdc1b17c.png">

```txt
"完全に理解した:thinking_face:"
```


## おわりに
よく使う書式シリーズをまとめてみました。
ここには無い書式付きメッセージの作り方があればコメントいただければと思います！
Ubuntu 2号機のアップグレード【Tensorflow 1.14→2.2】

完全に個人的な備忘録です。
TF2.1.0とTF2.2.0の挙動の違いについて記載がありますが、あまり重要でないと思います。
###TF 2.2と2.1の違い
Tf2.2だと　`keras.load_model`　 `tensorflow.keras.load_model`の混在はエラーになる。
Tf2.1にダウングレードするとエラー吐かない。
##今回の課題
Tensorflow1.14→2.2へアップグレード（最終的にTF2.1へ）
GPUを認識していないことが判り、その対処

`sudo apt update`
`sudo apt upgrade`
`ubuntu-drivers devices`

```
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00001C82sv00001043sd0000862Abc03sc00i00
vendor   : NVIDIA Corporation
model    : GP107 [GeForce GTX 1050 Ti]
driver   : nvidia-driver-435 - distro non-free
driver   : nvidia-driver-440 - third-party free recommended
driver   : nvidia-driver-415 - third-party free
driver   : nvidia-driver-390 - distro non-free
driver   : nvidia-driver-418 - third-party free
driver   : nvidia-driver-410 - third-party free
driver   : xserver-xorg-video-nouveau - distro free builtin

$ sudo apt install nvidia-driver-440
```
`reboot`
`nvidia-smi`

```
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.64.00    Driver Version: 440.64.00    CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 105...  On   | 00000000:01:00.0  On |                  N/A |
| 29%   30C    P8    N/A /  75W |    224MiB /  4037MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0       935      G   /usr/lib/xorg/Xorg                           110MiB |
|    0      1117      G   /usr/bin/gnome-shell                          70MiB |
|    0      2742      G   ...AAAAAAAAAAAACAAAAAAAAAA= --shared-files    39MiB |
+-----------------------------------------------------------------------------+
```
install succeed.
GPU認識してくれた。
一方`nvcc -V`がとおらない。言われたとおりToolKitをインストールしてみる。

```
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
///　中略
physical_device_desc: "device: 0, name: GeForce GTX 1050 Ti, pci bus id: 0000:01:00.0, compute capability: 6.1"
, name: "/device:XLA_GPU:0"
device_type: "XLA_GPU"

$ nvcc -V
Command 'nvcc' not found, but can be installed with:
sudo apt install nvidia-cuda-toolkit
```
インストール後完了。

```
$ nvcc -V
Command 'nvcc' not found, but can be installed with:
sudo apt install nvidia-cuda-toolkit

```
現状
　
Tf2.2だと　`keras.load_model`　 `tensorflow.keras.load_model`の混在はエラーになる。
Tf2.1にダウングレードするとエラー吐かない。（ていうかその混在を整理しろ。ってことですけど）
小学生でもわかる。クラスとインスタンス。

## クラスってなに？
クラスは、日本語で言うと**分類**/**種類**のことです

ポチは犬で、たまはネコ
みんなそれぞれ何かの種類に入っています
例えば、ポチのクラスは犬で、たまのクラスはネコです

### クイズ
1. クラスは日本語で言うと何のこと
2. カレーライスのクラスは何かな？考えてみよう

> 1のこたえ。種類。2のこたえ。たべもの。ばんごはん。からいもの。おいしいもの。すきなもの。など。いろいろ考えられるね。

## インスタンスってなに？
インスタンスは、日本語で言うと同じ種類の仲間のことです

たまはネコだし、みけもネコ、ニャースもネコ
たまも、みけも、ニャースも、みんなネコの仲間です

それを、格好良く言うと、ネコのインスタンスと言います

### クイズ
1. インスタンスは日本語で言うと何のこと
2. いきもののインスタンスは、どんなものがあるかな？考えてみよう

> 1のこたえ。同じ種類の仲間のこと。2のこたえ。バッタ。カマキリ。ひと。クジラ。タコ。など。いろいろ考えられるね。

## クラス変数ってなに？

クラス変数は、どんなクラスかを書くための項目のこと

例えば、りんごも、みかんも、ぶどうも、メロンも、みんなフルーツの仲間
だけど、みんな結構違う

- 味が違う
- 香りが違う
- 色が違う
- 名前も違う

「○○が違う」とたくさん書きました
この○○を全部、クラス変数と呼んでいます

味も香りも色も名前も、みんなフルーツのクラス変数です

>プログラミングには沢山の種類があるけど、あるプログラミングでは、クラス変数じゃなくて、フィールドって呼んだり、プロパティって呼んだりすることもあります
結局おなじことです

### クイズ
1. クラス変数は日本語で言うと何のこと
2. お菓子のクラス変数は何があるだろう？考えてみよう

> 1のこたえ。どんなクラスかを書くための項目のこと。○○が違う、の○○全部のこと。2のこたえ。色。かたち。味。香り。など。いろいろ考えられるね。


## 実際のプログラムを見てみよう！

```サンプル.ts
class アニメ {

  // アニメクラスのプロパティ・クラス変数・フィールドです(プロパティは、どんなアニメかを記述するための項目のことです)
  放送開始日: Date
  タイトル: string
  制作会社: string
  ジャンル: Genre
  エピソード: Chapter[]
  
  // これはコンストラクタです。日本語で言うと、アニメ作成くんです。アニメを作ります。
  constructor(タイトル: string, ジャンル: Genre, 制作会社: string) {
    this.タイトル = タイトル
    this.ジャンル = ジャンル
    this.制作会社 = 制作会社
  }
  
}

function アニメを作る関数() {
  // 日常を作ります。アニメを作るときは、new アニメ() を呼びます。
  const 日常 = new アニメ(
    '日常',
    Genre.コメディ,
    '京都アニメーション'
  )
  // new アニメ() は、constructor のことです。アニメを作るので、アニメを作る人を呼んでいます。
  // const 日常 が、アニメ クラスのinstanceです。

  // クラスとインスタンスの関係が分かりましたか？
  // クラスは、日本語で言うと分類のことです。種類のことです。世の中にはいっぱいアニメがありますが、ジョジョも君に届けも、分類としては、同じアニメクラスのインスタンスです。
}
```

## あとがき
研修担当のみなさまに捧げます
クラスとインスタンスの違いが分からなかったら、このリンクを貼っとけば大丈夫！
やったね！
【プログラミング初心者】Swift練習問題~ハノイの塔~

#ハノイの塔
##ハノイの塔とは
>ハノイの塔は、フランスの数学者エドゥアール・リュカが1883年に発売したゲーム『ハノイの塔』がルーツである。
https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%8E%E3%82%A4%E3%81%AE%E5%A1%94#%E7%94%B1%E6%9D%A5

プログラムとは関係のないパズルの一種でハノイの塔のオモチャもあるようです。
プログラムとは関係ありませんがプログラムで解く題材としてもよく扱われる問題の一種です。

以下のようなゲームです。
３本の棒A、B、Cがあり、棒Aに何枚かの大きさの異なる円盤が下から大きい順に棒を通して重ねられています。
<img width="491" alt="ハノイの塔１.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326173/cf3570f9-c467-6f3e-ac64-a7c066c7824a.png">
これを以下のルールに従って円盤をAからBに移動させます。

- ルール
    - １回に一枚の円盤しか動かせない。
    - 移動途中も常に大きい方の円盤が下になるように積む。
    - 棒A、B、C以外の場所に移動させてはいけない
    
（例）円盤が２枚の場合
<img width="579" alt="ハノイの塔２.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326173/75740d2b-f52c-7d4e-e71d-b4c1a8fabd8e.png">

##問題
以下表示例のような、ハノイの塔でN枚の円盤を移動させる手順を表示する再帰関数を作成してください。
※Nが０以下の場合は何も表示しなくてかまいません。

数字はそれぞれ円盤を表し、小さい円盤から順に1,2,3,...とします。

```:表示例(N=2の場合)
1の円盤をAからCに移動
2の円盤をAからBに移動
1の円盤をCからBに移動
```
```:表示例(N=3の場合)
1の円盤をAからBに移動
2の円盤をAからCに移動
1の円盤をBからCに移動
3の円盤をAからBに移動
1の円盤をCからAに移動
2の円盤をCからBに移動
1の円盤をAからBに移動
```

回答例は[こちら](https://qiita.com/euJcIKfcqwnzDui/items/fb981409de9dc5424ca7#%E5%9B%9E%E7%AD%94%E4%BE%8B)

##ヒント
解き方のヒントを載せているので難しい場合は参考にしてみてください。

- [ヒント１](https://qiita.com/euJcIKfcqwnzDui/items/fb981409de9dc5424ca7#%E3%83%92%E3%83%B3%E3%83%88%EF%BC%91)
- [ヒント２](https://qiita.com/euJcIKfcqwnzDui/items/fb981409de9dc5424ca7#%E3%83%92%E3%83%B3%E3%83%88%EF%BC%92)
- [ヒント３](https://qiita.com/euJcIKfcqwnzDui/items/fb981409de9dc5424ca7#%E3%83%92%E3%83%B3%E3%83%88%EF%BC%93)

【注意】
回答例のページと同じページに掲載しています。
下の方に回答例が書かれているので見たくない人は注意してページをスクロールしてください。

#最後に
別の問題は以下に掲載しています。
また本記事とは別でプログラミング未経験からiOSアプリ開発が行えるようになることを目的とした記事を連載しています。
連載も以下にまとめていますのでそちらも是非もご覧ください。
http://naoyalog.com/
とりあえずDarkModeに対応したい

さっくりとやるのであればMatrialComponentを使うと便利です

```gradle:build.gradle
dependencies {
    ...
    implementation 'com.google.android.material:material:${version}'
}
```

ダークモード時に上書きしたいカラー定義を `res/values-night/color.xml` に定義します。

```xml:res/values-night/color.xml
<resources>
    <color name="override_color">#FFFFFF</color>
</resources>
```

MatrialComponentsのDayNightを継承したテーマを作成します

```xml:style.xml

<resources>

    <style name="DarkThemeApp" parent="@style/Theme.MaterialComponents.DayNight.NoActionBar">
        ...
    </style>

</resources>
```

```xml:AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.darktheme"
    android:versionCode="1"
    android:versionName="1.0">

    <application
        android:name=".DarkThemeApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/DarkThemeApp">
        ...
    </application>

</manifest>
```

起動時に `AppCompatDelegate.setDefaultNightMode` で設定してあげます

```kotlin:App.kt
public class DarkThemeApplication extends Application {

    public void onCreate() {
        super.onCreate();
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
    }
}
```

- AppCompatDelegate.MODE_NIGHT_NO：どんなときでも使用しない
- AppCompatDelegate.MODE_NIGHT_YES：どんなときでも使用する
- AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM：システム設定に準拠する
- AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY：バッテリーセーバー時に使用する

簡単ですね。

# 参考
https://github.com/android/user-interface-samples/tree/master/DarkTheme
初めての投稿

# はじめまして
この記事を読んで頂き、ありがとうございます。
はじめまして、クサノと申します。

私は、2020年4月6日から[TECH CAMP](https://tech-camp.in/)というプログラミングスクールに通っており、本日が最終課題発表会であと２日間ほどで卒業となります。

この2ヶ月とちょっとの期間のプログラミング学習でしたが、この短い期間でできることがずいぶんと増えました。
チーム開発も経験させて頂き、こういった場を作って頂いているスクールには感謝しています。

# 自己紹介
軽く自己紹介します。
島から出てきた田舎者です！

1994年8月〜2013年3月
　生まれてから１８年間は、長崎県の島に住んでいました。
　海しかない、周りにはおじいちゃんおばあちゃんばかりの緩い学生生活を送っていました。

2013年4月〜2020年1月（内2015年〜2018年は大分県に転勤していました。）
　福岡県にある企業の設備部門で建築担当として勤務。
　簡単な図面を書いたり、工事計画、予算要求、施工会社と契約の取り交わし、
　社内の関係箇所なども含めて調整したり、建築物の保守維持管理業務を行っていました。

# qiitaに投稿をしようと思った理由
なぜ投稿しようと思ったのかと言いますとスクールで学習中にエラーが発生したり、これはどうやって実装するんだろうと思い、検索をかけるといつも助けて頂くのはqiitaに投稿されている方々の記事でした。

ある日たまたま実装中にエラーが発生したため、検索して参考にさせて頂いた記事のおかげでエラー解決し、誰が投稿したのか確認するとスクールの同期生が投稿していた記事でした。

学習のためにアウトプットを行っていたようですが、自分の学習のための投稿が、誰かの役に立つと考えると自分の学習のためであろうと記事を投稿するべきだと考え、記事を書くことにしました。私もプログラミング学習を初めて２ヶ月ちょっとの未熟者ですが、初学者の方々などの役に立つことができればと考えています。

# 今後の投稿について
ここまで読んでくださり、ありがとうございます。
次回以降はスクールで学習した内容を復習がてらに投稿したいと思います。

卒業後は転職活動等ありますが、スクールの同期の方々と再度チームを組んで開発を続けることになりました。
スクールではRuby中心の学習でしたが、卒業後のチーム開発はPHPという新しい言語に挑戦しようと考えていますのでその内容も投稿していきたいと考えています。
Krita(ダウンロード版)のインストール

# はじめに

## Kritaとは？
オープンソースの画像編集ツール。無料利用できる。類似ソフトウェアにGIMPなどがある。
詳しくは公式サイト https://krita.org/jp/ を参考にしてください。

## インストール注意点
特にない。強いてあげればシェル拡張コンポーネントのチェックを外さないようにね...くらい。


# インストール手順

1. [Next]をクリック。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/baae72ab-2460-a616-17c7-e7743a1a9924.png)

2. [I accept the terms of the License Agreement]をチェックし、[Next]をクリック。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/a082e331-17c6-41e4-8f3a-e4b231abd77d.png)

3. プログラムのインストール先を指定し、[Next]をクリック。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/f2a4e475-ceb3-fe86-4d92-d2a1a31c1cdb.png)

4. コンポーネントを選択して[Next]をクリック。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/e175bbe5-9692-8e4d-a242-5caef08f8263.png)
<font color="red">※Shell Integrationを外すと、エクスプローラ拡張されず、サムネイル表示されなくなるため、注意</font>

5. [I Agree]をクリック。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/242a220d-8123-fc29-5b87-daba4323e245.png)

6. [Next]をクリック。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/f4454dbb-993b-5e6d-d149-31a64c6723e0.png)

7. [Next]をクリック。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/16f383a5-a6a5-842a-7acb-436d8164e742.png)

8. [Next]をクリック。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/3124db9b-cc9d-5fbb-a4df-5223dd1daca4.png)

9. インストールが開始されるのでちょっと待ち時間。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/981f3530-afe3-54f4-10bb-359c2aea85b1.png)

10. インストールが完了したら[Next]をクリック。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/23726189-493f-fa72-db5f-7de20cca816c.png)

11. [Finish]をクリック。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/ec2885f2-055e-d5a5-786d-d0540e9fa58c.png)
Dockerを使った簡単Pytorchセットアップ

# はじめに
機械学習に使用していたサーバが死にました

### 実施環境
Ubuntu 18.04.4 Desktop (64-bit)
NVIDIA Geforce GTX 1080
NVIDIA Driver 440.82
CUDA 10.2(2020/06/12現在 PytorchがCUDA11に未対応な為)

## SSH Serverのインストール(optional)
```
$ sudo apt install -y openssh-server
$ sudo systemctl enable ssh
$ sudo systemctl restart ssh
```

## CUDAとドライバーのインストール
[Teslaのnvidiaドライバーの正しいインストール方法](https://qiita.com/npkk/items/76ff8104f54a9dceccb1)

## Dockerのインストール
[Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/)

## NVIDIA Container Toolkitのインストール
[インストール方法](https://github.com/NVIDIA/nvidia-docker/tree/master#quickstart)
[Docker 19.03 以降の環境で前だけを見て生きる場合のNVIDIA Docker のインストール方法](https://qiita.com/ksasaki/items/b20a785e1a0f610efa08#docker-1903-%E4%BB%A5%E9%99%8D%E3%81%AE%E7%92%B0%E5%A2%83%E3%81%A7%E5%89%8D%E3%81%A0%E3%81%91%E3%82%92%E8%A6%8B%E3%81%A6%E7%94%9F%E3%81%8D%E3%82%8B%E5%A0%B4%E5%90%88)

## Pytorchコンテナのダウンロード
```
$ docker pull nvcr.io/nvidia/pytorch:20.03-py3
```
[PyTorch | NVIDIA NGC](https://ngc.nvidia.com/catalog/containers/nvidia:pytorch)

## 使い方
```
$ docker run --gpus all -it --rm -v local_dir:container_dir --name pytorch nvcr.io/nvidia/pytorch:xx.xx-py3
root@XXXX:/workspace $ python hoge.py
```

# おわりに
それにしてもDocker凄いですね
面倒くさかった環境構築が一瞬でできるようになるなんて
<font color="Red">バックアップはしっかり取りましょう</font>
KaggleチュートリアルTitanicで精度80.9% (上位7% 0.80861)

#Kaggleチュートリアル"Titanic"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285972/c38db82d-3317-2eab-c867-33030e83523d.png)

Kaggleは、世界最大規模の機械学習コンペティションサイト。
Titanicは、そのチュートリアル的な課題になっている。

このコンペティションでは、タイタニック号での乗客の生死を予測する。
https://www.kaggle.com/c/titanic/overview

とりあえず、80%の壁を超えるまで、試行錯誤しました。
それを今回簡単に紹介します。
最後にコードがついてます(github)

#データ概観
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285972/ebe37a50-137d-fa44-f227-7ecec4413227.png)

このSurvivedを予測する。
Trainデータは、892個。Testデータ（提出するデータ）は、417個になっている。

#上位7%までにやったこと
他のカーネルや、記事をみて、様々試した。

###データ補完
-**Fare**： Pclassごとの平均値をとって、その平均値を持ってFareを補完した
-**Embarked**： 最頻値（S）を用いて補完した。

*Ageを平均値で補完や、Mr,Miss,Masterなどを用いて補完することも考えたが、結局精度が上がらなかったため、今回は、単純にAgeを不使用とした。

###作成した特徴量
-**Sex**,**Embarked**: これらあは、単純にダミー変数化した。
e.x.) Male -> 0, Female -> 1

-**Pclass**:１、２、３のまま使用。

-**FamilySize**: SibSp + Parchで家族の人数を計算。
　FamilySizeを用いて、独り身（IsAlone)、小規模、中規模、大規模家族という形のダミー変数を作成した。

-**Title**(敬称）: Mr, Miss, Mrs,などの情報を名前から抽出。
　年齢だけでなく、結婚情報も正確に抽出できると考えた。
　このTitleをダミー変数として、特徴量に加えた。

-**Ticket_ini**: チケットの頭文字を抽出。
　この頭文字を用いてダミー変数を作成した。

-**n_same_ticket**: 同じチケット番号を持っている人が何人いるのか。
　同じチケット番号の人は、家族or友人同士で同時にチケットを購入している可能性。
　そのため、チケット番号が同じになるのでは、と予想したそうです。
　個人的考え）SibSpやParchでは、同伴している家族情報しかわかりませんが、これだと同伴していた友人などの情報もわかるので優位なのではないかと考えた。
　参考）https://yolo-kiyoshi.com/2018/12/16/post-951/

-**Cabin_ini**: Cabinの頭文字を抽出。
　この頭文字情報をダミー変数に変換。

###特徴量のまとめ
以上３１個の変数を使用。
1 Pclass
2 Sex
3 Fare
4 n_same_ticket
5 Embarked_C
6 Embarked_Q
7 Embarked_S
8 Ticket_ini_1
9 Ticket_ini_2
10 Ticket_ini_3
11 Ticket_ini_A
12 Ticket_ini_C
13 Ticket_ini_Others
14 Ticket_ini_P
15 Ticket_ini_S
16 Ticket_ini_W
17 Title_Master.
18 Title_Miss.
19 Title_Mr.
20 Title_Mrs.
21 Title_Others
22 Cabin_Initial_B
23 Cabin_Initial_C
24 Cabin_Initial_D
25 Cabin_Initial_E
26 Cabin_Initial_N
27 Cabin_Initial_Others
28 IsAlone
29 Family_size_small
30 Family_size_mid
31 Family_size_big

##機械学習モデル
RandomForestを使用。
ハイパーパラメータを適当に調節してあげて、10foldの１０個の式で予測値平均をとった。
分割は層化k分割を使いました。

LightGBM・XGBoost・Catboostも使ってみた。
しかし、Public scoreはRandom forestの方がよかった。（過学習かな）
いくつかのモデルを作成して、アンサンブルをとってもみたが、結局Random forest単体がBESTだったので、
これで行きました。

##重要変数
ちなみにRandom forestの重要変数は、こんな感じでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285972/cebd4a07-6d57-4d19-92f7-e7e70e8fa524.png)


##Github
載せました。
細かい点を見たい方は、こちらで確認してください。
そのまま動かして、**80.861%**の精度になるはずです。
https://github.com/taruto1215/Kaggle_Titanic

##今回のきっかけ
実は、私GCI2020summerという東大松尾研究室のデータサイエンス講習に参加しております。
その時に、Titanicコンペに参加することになったのですが、
2日くらいで８０％くらいいくだろうと、甘く見ており、結局期日までに78~9%の精度で終了。。。

悔しかったので、継続してチャレンジして、80%を達成できました。
まだまだ、初心者なのでご助言などあれば、是非ください。
【JavaScript】export / import （外部のモジュールを読み込む）

# はじめに
アプリケーションが大きくなると機能を切り分けてモジュール化して管理していく必要が出てくる。
```モジュール```とは機能ごとにクラスや関数を１つのファイルにまとめたものである。
機能ごとにモジュールを分けていくと、モジュールで外部の別のモジュールの機能を使用したい場面も出てくる。そういった時に```import```と```export```を利用することで、モジュール間で機能をやりとりすることができる。
```import```を利用することで、外部から他のモジュールを読み込むことができ、読み込ませたい要素に```export```を記述してあげることで```import```が可能になる。

### 1つの要素をexport / importする

↓下記のモジュールのクラスを他のモジュールでも使えるようにしていく

```util.js
// ファイルパスは　./lib/util.js とする
class Member {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  getName() {
    return this.firstName + this.lastName
  }
}
```
#### export（デフォルトexport）
クラスを外部でも読み込めるようにするために```export default```を記述する。

```util.js
// クラスMemberをexport
export default class Member {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  getName() {
    return this.firstName + this.lastName
  }
}
```
#### import
importで外部のモジュールにクラスを読み込む。

```index.js
// import クラス名 from 'ファイルのパス名'
import Member from '@/lib/util';
// export defaultした場合、importでクラス名とは別の変数名をつけることも可能
import MyMember from '@/lib/util';
```
これで、クラスMemberが外部のモジュール（index.jsファイル）でも使用できるようになる。




### 複数の要素をexport / importする
↓下記のモジュールの2つのクラスを他のモジュールでも使えるようにしていく

```util.js
// ファイルパスは　./lib/util.js とする
// ↓ クラスMember
class Member {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  getName() {
    return this.firstName + this.lastName
  }
}
// ↓ クラスProduct
class Product {
  constructor(name) {
    this.name = name;
  }
}
```
#### export（名前付きexport）
**それぞれのクラスでexportを記述する方法**
```export class クラス名```と記述することでそれぞれのクラスをクラス名付きでexportできる。

```util.js
// クラスMemberをexport
export class Member {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  getName() {
    return this.firstName + this.lastName
  }
}
// クラスProductをexport
export class Product {
  constructor(name) {
    this.name = name;
  }
}
```
**最後にまとめてexportを記述する方法**
宣言したクラスを最後にまとめてexportすることも可能。

```util.js
class Member {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  getName() {
    return this.firstName + this.lastName
  }
}
class Product {
  constructor(name) {
    this.name = name;
  }
}
// クラスMemberとクラスProductをexport
export { Member, Product };
```
#### import
複数の要素をimportする場合は```{ }```で囲む。

```index.js
// クラスMemberとクラスProductをimport
import { Member, Product } from '@/lib/util';
```
これで、クラスMemberとクラスProductが外部のモジュール（index.jsファイル）でも使用できるようになる。
Kubectlのzsh補完機能で詰まった話

# これは何？
kubectlのzsh補完機能を設定する際に詰まったのでまとめる。

# kubectlの補完機能 (completion)
青山真也さん著の[kubernetes完全ガイド](https://www.amazon.co.jp/dp/4295004804)には以下のように記載されていた。

> kubectl の様々な使い方を説明してきましたが、シェル保管機能も用意されています。bash または zsh を選択できるため、環境に応じてどちらかを指定してください。

>```
# bash completion
$ source <(kubectl completion bash)

># zsh completion
$ source <(kubectl completion zsh)
```

>「~/.bash_profile」や「~/.zprofile」に設定しておくとログイン時に有効化されて便利です。

自分はzshユーザなので、下のコマンドを実行した。すると、`complete:13: command not found: compdef`というエラーが発生する。

# 解決法
とりあえずエラーをコピーしてでググってみたところ以下のように出力された。
![search](https://i.imgur.com/VKDbkQi.png)

AWSクライアントとかGoogle Cloudを使っているわけではないので、[上から4番目の記事](https://github.com/asdf-vm/asdf/issues/266)を開くとzshrcに以下のように記載すると良いと書かれていた。

```zsh:~/.zshrc
autoload -Uz compinit
compinit

source <(kubectl completion zsh)
```

これは補完に表示されるファイルに関するセキュリティのオプションであるそうだ。この上から4番目の記事には以下も記載しろと書いてあったが必要ない。今回参照したGithubのIssueがasdfというアプリケーションに紐付いているだけであるからだ。

```
. $HOME/.asdf/asdf.sh
. $HOME/.asdf/completions/asdf.bash
```

# 余談
同じミスをした誰かをこの記事を通して解決に導くことを目的にこの記事を書かせていただいた。
【Unity】 UXMLやUSSがエラーが出て作成されないときの対処法

# 【Unity】UXMLやUSSがエラーが出て作成されないときの対処法
自分が対処した際のメモ。

## 現象

- `Update UIElements Schema`
- `Create/UIElements/USS File`
- `Create/UIElements/UXML Template`
- `Create/UIElements/Editor Window`

上の3つのどれかを押したときに、以下のようなエラーが発生してアセットが生成されない。

```
ArgumentException: An item with the same key has already been added. Key: UnityEditor.U2D.Layout.ScrollableToolbar_isHorizontal_Type
System.Collections.Generic.Dictionary`2[TKey,TValue].TryInsert (TKey key, TValue value, System.Collections.Generic.InsertionBehavior behavior) (at <437ba245d8404784b9fbab9b439ac908>:0)
```

## 原因
以下の条件で確認されている。

- **Unity 2019.3.7f1** かつ **Visual Effect Graph(7.1.8)** がインストールされている
- **2D Animation** がインストールされている[^1]。(※自分の環境では未検証)


## 対処法

- Unityのアップデート
- Visual Effect Graph、2D Animationのアップデートかアンインストール

[^1]: https://issuetracker.unity3d.com/issues/project-with-2d-animation-package-throws-argumentexception-when-creating-uxml-template-asset
Mapはただの連想配列ではない、PartialFunctionでもあることを知っているか？

#背景
ある日、下記のコードがなぜ動くのか理解できなかった。

```scala
val a = Map(1 -> "one", 2 -> "two")
val b = Option(1)
val x = b.collect(a)
println(x) // Some("one")
```
そもそもなぜこんなことをしたのかは割愛。
#collectの認識
collectはfilterとmapが混じったものという認識でした。
下記のようなコードの風に使うんだなと。

```scala
class Person(val name: String, val age: Int)
val a = Seq(new Person("a", 10), new Person("b", 20), new Person("c", 30))
// 下二つは同じ
val b = a.collect{case person if(person.age > 15) => person.name}
val c = a.filter(_.age > 15).map(_.name)

println(b) // Seq("b", "c")
println(c) // Seq("b", "c")
```
#見えてなかった本質
本質は別にあって、collectは引数に`partialfunction`を受け取る関数なんだと！
partialfunctionとはなんぞやということなんやが、以下が簡単なpartialfunctionの例です。
partialfunctionを使うときは型宣言は省略することはできなくて省略すると怒られます。

```scala
val pf: PartialFunction[Int, String] = {case 5 => "五"}
val c = pf(5)
val d = pf(6)
println(c) // "五"
println(d) // match error
```
みたまんまで、マッチする場合のみ処理を行う関数のことを指します。だから`部分関数`なんですね。

ここで本題に戻りますが、なんと`MapはこのpartialfunctionをmixInしております。`

```scala
val a = Map(1 -> "one", 2 -> "two")
val b = a(1)
println(b) // "one"
```

このMapからキーを与えて値をとるこの動きがまさに`部分関数`な訳です。
それにあったキーのみ値を返す動きをするのが`mixIn`している理由な訳ですね。
このようなことからMap自身がpartialfuncitonとなり、collectの引数に渡せるのだと。。scala面白え。

#余談
MapでできるのであればSeqでも。。

```scala
val seq = Seq("zero", "one", "two")
val collected = Option(0).collect(seq)
println(collected) // Some("zero")
```
できた。面白い。
Ruby と Python で解く AtCoder ABC084 D 素数 累積和

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。
# 今回のお題
*[AtCoder Beginner Contest D - 2017-like Number](https://atcoder.jp/contests/abc084/tasks/abc084_d)*
<font color="green">Difficulty: 981</font>

今回のテーマ、素数 ＋ 累積和

素数と言えば***Ruby***にはPrimeライブラリがあります。
100000以下の素数をハッシュに入れ、`(n + 1) / 2`がハッシュにあるかどうかを確認して、2017に似た数を取得します。
次に、2017に似た数の出現を累積和で求めます。
# Ruby
```ruby.rb
require 'prime'

g = Prime::EratosthenesGenerator.new
h = Hash.new(0)
a = 2
while a < 100000
  h[a] = 1
  a = g.next
end
k = Array.new(100001, 0)
h.keys.each do |x|
  k[x] = 1 if h[(x + 1) / 2] == 1
end
1.upto(100000) do |i|
  k[i] += k[i - 1]
end
gets.to_i.times do
  l, r = gets.split.map(&:to_i)
  puts k[r] - k[l - 1]
end
```
```prime.rb
g = Prime::EratosthenesGenerator.new
```
素数の生成器を使用します。

```rui.rb
1.upto(100000) do |i|
  k[i] += k[i - 1]
end
```
累積和を取得しています。
# Python
```python.py
from sys import stdin

def main():
    from collections import defaultdict
    from math import sqrt
    input = stdin.readline

    h = defaultdict(int)
    h[2] = 1
    for i in range(3, 100000, 2):
        for j in range(3, int(sqrt(i)) + 1, 2):
            while i % j == 0:
                h[j] = 1
                i //= j
        if i > 1:
            h[i] = 1
    k = [0] * 100001
    for key in h.keys():
        if (key + 1) / 2 in h and h[(key + 1) / 2] == 1:
            k[key] = 1
    for i in range(1, 100001):
        k[i] += k[i - 1]
    q = int(input())
    for _ in range(q):
        l, r = map(int, input().split())
        print(k[r] - k[l - 1])
main()
```
```prime.py
    h[2] = 1
    for i in range(3, 100000, 2):
        for j in range(3, int(sqrt(i)) + 1, 2):
            while i % j == 0:
                h[j] = 1
                i //= j
        if i > 1:
            h[i] = 1
```
素数生成は自作しています。

```hash.py
        if (key + 1) / 2 in h and h[(key + 1) / 2] == 1:
            k[key] = 1
```
辞書のキーの存在確認が必要です。

||Ruby|Python|
|:--:|:--:|:--:|
|コード長 (Byte)|344|697|
|実行時間 (ms)|288|692|
|メモリ (KB)|4304|7896|
# まとめ
+ ABC 084 D を解いた
+ Ruby に詳しくなった
+ Python に詳しくなった

参照したサイト
*[ループ中にdefaultdictの未定義領域にアクセスすると例外](https://qiita.com/neko_the_shadow/items/2d9ab4d77d0d56e5a9a7)*
Unityプラグイン/C++ .. その２

# 目的

# 動かない時のチェックリスト

Unityはプラグイン更新の時に再起動が必要
PluginのコピーミスDebug/Releaseの間違い
[OpenCVをつかうとうまくいかない](https://qiita.com/raku-lab/items/57b7a851766d4ef62657)

# BUILD_WITH_STATIC_CRT 
LINUXでのshared/static LIB の違い
「BUILD_SHARED_LIBS」のチェックを外し、「BUILD_WITH_STATIC_CRT」のチェックが入っていることを確認する。

# 依存関係を調べる
[Dependency Walkerで実行ファイルの依存ファイルを調べる](https://www.off-soft.net/ja/software/develop2/depens.html)
depends.exe

# LNK2038
「エラー	LNK2038	'RuntimeLibrary' の不一致が検出されました。値 'MT_StaticRelease' が MD_DynamicRelease の値 'dllmain.obj' と一致しません。	Dll2	1	D:\GitUnity\toioUnity\0130\Dll2\Dll2\opencv_core3410.lib(stl.obj)	
」
[C++][コード生成]の設定が異なるので発生する。

新規作成したプロジェクト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/5153cf46-04d8-890c-4b60-4f97a3b7e8aa.png)

OpenCVの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/ec854a0d-c449-fc5d-a555-d0b1a65e3aa4.png)

# MD MT
/MD
アプリケーションでランタイム ライブラリのマルチスレッド対応および DLL 対応バージョンが使用されます。 _MT および _DLL を定義し、コンパイラにライブラリ名 MSVCRT.lib を .obj ファイルに挿入させます。

このオプションを使用してコンパイルされたアプリケーションは、MSVCRT.lib に静的にリンクされます。 このライブラリには、リンカーが外部参照を解決できるようにするコード レイヤーが用意されています。 実際の作業コードは、MSVCRversionnumberに含まれています。DLL。実行時に、MSVCRT.DLL にリンクされているアプリケーションに対して使用可能である必要があります。

/MT
アプリケーションで、マルチスレッド バージョンの静的なランタイム ライブラリが使用されます。 _MT を定義します。また、コンパイラにライブラリ名 LIBCMT.lib を .obj ファイルに挿入させるため、リンカーは LIBCMT.lib を使って外部シンボルを解決します。

# 問題
OpenCVをC++NativePlugin化して、Unityから使う。

凹みによると、OpenCVを/MTオプションつけてビルドするとよい。VCで[C++][コード生成]-[ランタイムライブラリ]項目/MTでうまくいくとのこと。
⇓
リンクエラーでます。
追加LIBあるので記述しておく

```
#pragma comment(lib,"ippiw.lib" ) // * 
#pragma comment(lib,"ittnotify.lib" )  // *
#pragma comment(lib,"libjpeg-turbo" CV_EXT_STR)//JPGは名称変更?
```

備考）OpenCVビルドはそのまま。DLL作成プロジェクトのみ/MTしたバージョンはダメ（確認した）

# 作成したプロジェクト
Release版のみ設定
[DLL](https://1drv.ms/u/s!ApO4wsxFJBbVuD03jOFaUAiPs9i3?e=6wwbUK) : DLLテストのためC++/exeから呼び出して確認しています。

# 参考⇓
# [[Unity]OpenCVSharpでArUcoを用いてARマーカ検出を行う](
https://kobazlab.tech/2019/02/07/opencvsharp%E3%81%A7aruco%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B/)

# テクスチャデータからOpenCV::Matを作る。

```
	int type = CV_8UC4;// byte* 4
	int h = 256;
	int w = 256;
	Mat matImage( h, w, type ); // rowl, int cols, int type );
	for ( int y = 0; y < h; y++ ) {
		for ( int x = 0; x < w; x++ ) {
			uchar* texptr = matImage.ptr( y,x );// y,x
			int index = 0;// ((y * h) + x);
			if ( y % 8 == 0 ){
				texptr[index+0] = 0xff;// 青
				texptr[index+1] = 0x0;
				texptr[index+2] = 0x0;
				texptr[index+3] = 0xff;
			}
			else{
				texptr[index + 0] = 0x0;
				texptr[index + 1] = 0x0;
				texptr[index + 2] = 0xff; // RED
				texptr[index + 3] = 0xff;
			}
		}
	}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/56fed5e9-cda3-4d4f-9764-21e4066160e2.png)
Assign Custom Avatar to ThreeDPoseUnityBarracuda

# Create your own avatar in vrm.
I used Vroid Studio to create custom avatar.
You can make your own cute avatar very easily using this and this tool supports English too.
My result of a minuite is like this.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/2f6a72d5-a338-30e5-35c4-6991d4e7406d.png)

You can export this in vrm.

# Bring it in ThreeDPoseUnityBarracuda
Open the project file in Unity, and create new folder named as 'customVRM' as following.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/f5a2e05b-79b0-4dcd-06fb-0d5af7e446e5.png)

And bring the vrm file what you made before to the folder 'customVRM'.
It takes seconds to load the file, and the VRM will be created in the folder as following.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/ff5c6143-45c0-f65a-bc6e-ece1153d67f8.png)

Drag the prefab and drop to hierarchy view as following.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/d9d4b850-da70-2e27-730b-9eb6c496a3e7.png)

And then the vrm represents in hierarchy view like this.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/b990f051-5e6a-40f0-8b40-ad9fd4793b99.png)

### Add script to the avatar
Next, click the added avatar in hierarchy view and add script named as 'VNectModel' as following.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/bab9d244-82af-8902-cd76-a5c442b20559.png)

Bring the avatar to the property of VNectModel named as ModelObject like this.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/9bbbbead-226f-9f7d-161e-e843699ee0e1.png)

### Add nose object
And next you need to add nose object to your avatar.
To do this, put very small Cube object in head of the avatar in hierarchy view like this.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/ae1da625-83b7-f51f-d0aa-148081659a13.png)

And add the cube object which is named as nose to the property of VNectModel named as nose as following.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/7a5660d9-4c47-ad39-bd97-e9220e145cac.png)

And click BarracudaRunner in hierarchy view and drag the vrm and drop it to property of that named as 'VNect Model' as follwing.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/2f93e196-9584-7142-6d9e-9bf88725319f.png)

# Now you can start
Start debbuging
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/84883656-f4f4-a0b1-bbd3-76b6e16a3f85.png)

Please adjust the position or scale of the avatar if needed.
RustのDrop::dropはスレッドがデタッチされると実行されないことがある

注意: いい加減な記事です。ドキュメントで確認したわけではなくて書いていて体験したこと書いています。正式な情報を持っていれば教えてもらえるとありがたいです。

## バージョン

```
rustc 1.43.0 (4fb7144ed 2020-04-20)
```

## 何

Rustの`Drop`トレイトはC++でいうところのデストラクタを実装するためのトレイトでRAIIによる資源の管理に利用できる。RAIIとはそのクラスが（主にコンストラクタで確保して）所有するリソースを、デストラクタで解放することによってリソース管理を自動化するテクニックだ。例えばコンストラクタでヒープメモリを`alloc`/`new`してデストラクタで`free`/`delete`するとか、コンストラクタでmutexのロックを取得してデストラクタでロックを解放するとかいうふうに利用されている。[^raii][^stdlg]

[^raii]: [RAII - cppreference.com](https://en.cppreference.com/w/cpp/language/raii)
[^stdlg]: [std::lock_guard - cppreference.com](https://en.cppreference.com/w/cpp/thread/lock_guard)

しかし、Rustの`Drop::drop()`は実装する値の所属するスレッドがデタッチされ、メインスレッドがそのスレッドより早く終了した場合は実行されないらしい。つまり、`std::thread::spawn()`の返り値である`std::thread::JoinHandle`が（`std::thread::JoinHandle::join()`に消費されずに）ドロップするとそれに対応するスレッドがデタッチされ、そしてメインスレッドが終了した時点でデタッチされているスレッドは処理を中断されるのだが、[^rs_thread]そのときそれらのスレッドに属する値の`Drop::drop()`は実行してもらえない。

[^rs_thread]: [The threading model, std::thread - Rust](https://doc.rust-lang.org/std/thread/index.html#the-threading-model)

こうなると、RAIIにおいては資源が解放されないことになる。といっても、メモリのようなOSがプロセスと対応させて管理しているような資源であればどのみちプログラムが終了した時点ですべて解放されることになるから問題にならない。しかし、`Drop::drop()`でより外的影響のある操作、例えばファイルのクリーンアップなどを実行しようとしている場合はそれが実行されないことが問題になる可能性は十分あるだろう。

## 例

よく起こりやすいのは以下のようにバックグラウンドで永続的な処理を行う状況だろう。

```rs
use std::thread;
use std::time::Duration;

struct SayBye(&'static str);

impl Drop for SayBye {
    fn drop(&mut self) {
        println!("bye. {}", self.0);
    }
}

fn main() {
    let _1 = SayBye("1");
    
    thread::spawn(|| {
        // Prepare a Drop-able thing for a background task
        let _2 = SayBye("2");

        loop {
            // Do background task in another thread
        }
    });
    
    // Do the main task
    thread::sleep(Duration::from_secs(1));
}
```

出力:

```
bye. 1
```
Google Maps風のピンをPowerpointで作図する方法

# プレゼン資料で映える地図を目指して
資料に地図を貼る時に、「ここです！」と表示したいときGoogle Maps風のピンをPowerPointで作図する方法を書きます。（かんたんです）

# 「涙形」図形の追加
一見ピンと来ませんが、これがピンに育ちます。
<img width="400" alt="涙形" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53918/3f76b3dc-39cb-7401-2441-c338465cf1d6.png">

# 図形の編集

涙形図形をピンの形へ変形させて行きます。
<img width="529" alt="図形編集" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53918/a7940a3e-6057-2e5c-f747-02cad45f4dc2.png">

1. 涙形図形は、左上の黄色い四角で角の長さの調整ができます
2. 渦巻き型の矢印のアイコンで、回転することができます
3. 文字も追加可能です。●を入力して目玉風にすることができます
4. 影を追加すると立体的に見えます

<img width="368" alt="基本操作" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53918/26a65cda-e9c6-ed12-f228-97ff28802cc2.png">



# 地図に重ねる
地図をスライドに配置した後に、涙形図形を足していきます。
<img width="854" alt="地図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53918/30587ec4-c0f4-dca6-2f84-51eaa54ad039.png">
[© OpenStreetMap contributors](https://www.openstreetmap.org/copyright)

例では、OpenStreetMapをベースにして、令和２年に開業した２駅をプロットしてみました。
ピンを目立たすには、地図の透過レベルを上げるとコントラストがついて見やすくなります。

２つの新駅の名称は、偶然かもしれませんが漢字＋カタカナ、SEO対策とかなのでしょうか。
ネットワークエンジニア視点のAWS   Networking

## とりあえずネットワーク関係で注意点？をまとめてみました 

# 諸々

+ 4つのIPv4 CIDRをVPCに追加可能。ただし既存のsubnetに追加は出来ない
+ IPv6のみの場合もIPv4はアサインが必要
+ サブネット　/27 , /28 はOK （/29はNG）
+ EC2ではOSからIPアドレスの変更は出来ない
+ グローバル、プライベートアドレスの混在不可
+ セキュリティグループでは送信先にプレフィックスIDが使用可能(ACLはNG)
+ プレイスメントグループは、単一のアベイラビリティーゾーン内で
+ EC2インスタンス名などはVPC peering接続経由で解決できない
+ ジャンボフレームのリージョン間転送は出来ない。
+ ジャンボフレームはリージョン内VPC Peering,  Direct Connectでサポート
+ 異なるリージョンのVPC間のIPSecはMarketplaceで購入した製品で
+ VPC Peeringは100まで。Transit Gatewayなら1000まで
+ VPC Lambdaにはpublic ipが割り当てられない
+ Lambdaに固定IPアドレス(EIP)は割り振れない
+ VPC LambdaではVPCにNATゲートウエイを設定するか、VPCエンドポイントを定義するかのどちらか
+ AWS based Hardware VPNは証明書が使用できない（多分）
+ NAT gatewayはUDPのフラグメントに対応、TCP or ICMPはNG
+ NAT instanceはUDP, TCP, ICMPのフラグメントに対応
+ リージョン間の接続はMAC Secで暗号化されている
+ USのリージョンはinter-regions advertisement and routing可能


# Direct Connect関係
+ AS path prependingはPublic VIFにprivate ASN を使う場合は使用できない
+ Private VIFはVPC用
+ Public VIFはAWSのサービス用
+ Direct Connect + IPSec VPNが可能なのはPublic VIF使用時のみ（多分。。）
+ 上記の場合、VPCにアタッチしたVGWに対してVPNを張る事ができる
  やり方はこちら
  https://www.youtube.com/watch?v=dhpTTT6V1So

+ Private / Public virtual interface作成時のBGP AS は public or private
+  VPC上のVGW(Virtual Private Gateway)に複数のVirtual Interfaceを終端可能
+  VPC上のVGWに複数のDirect Connect またはVPN接続を終端可能
+  Direct ConnectはBGPのみ、VPNはBGP or Static
+  public interfaceはDirect Connect Gatewayにはアタッチできない
+  Private VIF:  VPCのCIDRをAWS側から広報。オンプレ側BGP機器からはオンプレ経路を広報
+  Public VIF:  中国を除く全リージョンのAWSばプリックIPをAWS側から広報。オンプレ側はBGPのアドレスにNAT。


# Elastic Load Balancing

+ NLB:  IP addressはDirect connect越しは可能。VPC peering, VPNは不可
+ ALB:  Direct connect越し、VPC peering, VPNも対応可能
+ ELBは固定IPを持っていないため、ACLは使えない
+ NLB, CLBはAvailability zone 1つでも良い
+ ALBはAvailability zone 2つ必要
+ both CLB and ALB doesn't support SSL mutual authentication. 
+ NLBだとEC2に対してパススルーさせる事でEC2側でmutual authenticationが可能
+ ALB has the capability to route based on User-Agent headers


# ELB  Stickyセッション

+ ALB, CLB共に対応。デフォルトはdisable,  HTTP, HTTPSでのみ可能
+ NLBは5タプルを使う関係で常にスティッキー
+ ALB, CLB:  バランサーが挿入するクッキー使用
+ CLB: アプリ生成のクッキー利用可能
+ サーバ側でSSLの終端を行う場合は、スティッキーセッション機能を使うことはできない
+ NLBでip address指定の場合、スティッキーは使えない
+ 上記の場合はproxy protocolを有効にするとスティッキー可能
+ X-Forwarded-ForはHTTP/HTTPS使用時
+ 二種類のクッキー使用可能
+ 上記は以下を参照
+ https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-sticky-sessions.html


# Route 53関連

+ DNSはホストごとの設定ではなくVPCのDHCPオプションで設定
+ NTPもDHCPオプションで設定
+ Route 53 hosted zoneは関連付けしたVPCのみ有効
+ Route 53 Private hosted Zoneはサブドメインの委任に対応していない（NSレコードが設定できない）
+ Route 53 can‘t check the health of resources that have an IP address in local, private
+ Route 53のmonitorポイントは3つ、Endpoint,Status of other health checks ,State of CloudWatch alarm
kritaの環境をドット絵向けに特化させてみた

# はじめに
ドット絵の入門アプリとして有名な「EDGE」を触ってみたがいくつか不満が出てきた。
画像編集ソフトのKritaが有能そうだったのでコレをドット絵制作向けに環境を整えてみた。こんな感じ。

![kritaでpixelart環境.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/79f387b2-b7be-d2ad-156c-166c0204fdde.png)


※ワークスペースとしてツール配置を覚えさせることができるので結構有用だと思う。

# 解決したかったEDGEの不満

## 1.ツールウィンドウが制作画面から飛び出てしまう

![EDGEの不満1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/02aa20ed-a1b1-a243-c460-54ec1e430105.png)


## 2.色作成が面倒
パレットに直接色設定をしなきゃいけないのだけれども、カラー設定がRGBで、プレビューがないため直感的に色を作れない。

![EDGEの不満2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/efd5a8a1-d2fa-f7e3-e921-8261c774a8ad.png)


## 3.制作したものがエクスプローラ上でわからない

.edgファイルはエクスプローラ上にサムネイル表示してくれないので、ファイル名で何のファイルだったかちゃんと作らないとわからなくなる。

![EDGEの不満3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/fd22419b-03c3-547d-f523-5c9ffbb3aba2.png)


Windows 95の頃(1995年あたり)に制作されたドローソフトの為、最近(2020年)のソフトウェア事情で考えるとやむなしと思わざるを得ない。

# Kritaの設定

## 1.Pixelartブラシを標準ブラシとして使用。
初期で用意されているPixel_Artブラシがそのまま使える。
ブラシをコピーしてpixelサイズを小・中・大と用意できるが32-256の間なら1pixelのツールで十分描けるかなと思う。
「ブラシなど」で同じブラシを消しゴムに変えたり、サイズを変えたりできるので、ブラシを切り替えて使う必要はあまりないのかなと思う。

## 2.ワークスペースを調整
この環境では次のドッキングパネルを使用してます。
・グリッドと基準線
・パレット
・レイヤー
・拡張色選択
・ブラシなど

私は右側にツールが並んでいたほうが使いやすいのでキャンバスは左、ツール類は右に配置してます。

ツールの配置ができたら、「ウィンドウ -> ワークスペース -> New Workspace」で保存することを忘れずに。

## ブラシサイズを変えるときの注意

サイズが表示されているところにカーソルを合わせるとブラシサイズを変えることができるが、狙ったサイズを出すのは難しい。
一度サイズ調整のボックスを選択してからキーボードで任意の数値を入力することでサイズ調整はできるので覚えておくとよいかも？

![kritaペンサイズを調整.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/96d565b3-07b3-6968-4d39-0dc9e3706bf0.gif)

## カラーピッカー(スポイト)について
ツールボックスにカラーピッカー機能を呼び出すアイコンがあるのだが「Ctlキー」で簡単に呼び出すことができるので、そのためにツールボックスは非表示にしてます。

![スポイトの使い方.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/1f553e6b-f61a-2a8b-a96a-b0feae0e85f5.gif)

サンプルが粗くて醜いかもしれないけど、拡張色選択ウィンドウが拾った色に合わせて変化してるのが見えるかと思う。

好みに合わせて環境を作ってもらえればいいかな。

# 参考

http://sp-cute.hatenablog.com/entry/2015/09/02/202802
https://docs.gimp.org/2.10/ja/gimp-tool-color-picker.html
【まとめ】kubectl コマンド一覧 (チートシート)

kubectlのコマンドを忘れがちなので一瞬で思い出せるように記事を書きました。

# リファレンス
- `kubectl -h` kubectlの説明
- `kubectl <command> --help` コマンドについての情報
- `kubectl options` kubectl コマンドに付随するオプション全て
- `kubectl version` バージョン確認

# コンフィグの管理
- `kubectl config` kubeconfig(~/.kube/config)の設定を変更
    - `kubectl config set-cluster` クラスタの定義
    - `kubectl config set-credentials` 認証情報の定義
    - `kubectl config set-context` Context(クラスタ/認証情報/Namespace)
    - `kubectl config use-context` Contextの切り替え
    - `kubectl config current-context` 現在のContextの表示

# マニフェストとリソースの管理
- `kubectl create -f hoge.yaml` リソースの作成 (リソースが存在する場合はエラー)
- `kubectl get <リソース種類>` リソースの取得
    - `kubectl get <リソース種類> -o yaml/json/wide` yaml/json/wide形式で出力
    - `kubectl get <リソース種類> -l label1=val1 label2` label1を持つリソースとlabel2ラベルを表示
    - `kubectl get <リソース種類> -L label1` リソースとlabel1ラベルを表示
    - `kubectl get all` すべてのリソースを取得
- `kubectl delete -f resource.yaml` リソースの削除 (リソースが存在しない場合はエラー)
    - `kubectl delete -f --grace-period 0 --force` リソースの即時強制削除
- `kubectl apply -f resource.yaml` リソースの変更の適用 (推奨) (リソースが存在しない場合は新規生成)
    - `kubectl apply -f ./ -R` 指定したディレクトリ以下のファイルを再帰的に適用
    - `kubectl apply -f resource.yaml --prune` マニフェストから削除されたリソースを検知し、自動的に削除
- `kubectl edit <リソース種類> <リソース名>` エディタによる編集
- `kubectl describe <リソース種類> <リソース名>` リソースの詳細情報を取得
- `kubectl set image <リソース種類> <リソース名> <変更内容>` リソースの一部情報の更新
- `kubectl top <リソース種類> <リソース名>`
- `kubectl exec` Pod上で特定のコマンドの実行
    - `kubectl exec -it <Pod名> -- /bin/sh` 擬似端末を生成し(-t)、入力をパススルー(-i)しながら/bin/shの起動
- `kubectl logs <Pod名>` Podのログ確認
    - `kubectl logs -f` followしながらログ取得
- `kubectl copy <Pod名>:/<ファイル> .` コンテナ、ローカルマシン間でファイルコピー
- `kubectl port forward <Pod名> 8888:80` localhost:8888宛の通信をPodの80/TCPポートに転送