OmniAICreator/Qiita-1.07M huggingface dataset:
情弱が泣きながらSpringBootのdemoを動かしてみた

# はじめに
インターンでspring frameworkを触るかも？となり、いくつかページを見て勉強しようとしたんですが、古い記事が多いしそもそも日本語少ないし今にも泣きそうです…。結局たどり着いたのは[公式ページのdemo](https://spring.io/quickstart)でした。Hello World!を表示させるだけの極めてシンプルなものですが、エラーなく動いたときは泣きました(公式だから当然動く)。何にも工夫してませんが今日はこれで許してください。。

# プロジェクトの作成
本当はSTSとかターミナルとかでプロジェクトを作成するのが正しいと思うんですけど、[start.spring.io](https://start.spring.io/)に全て任せました(許して)。
![Screen Shot 2020-08-22 at 3.28.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682620/e90e0850-f68f-aa41-f003-b11fbdfbf641.png)
Maven Projectにし、基本デフォルトのまんまです(画像は諸事情でNameがdemo2になっています)。ADD DEPENDENCIESでSpring Webを追加します。
GENERATEボタンを押すとプロジェクトのzipファイルをダウンロードできます。解凍したらプロジェクト完成です！

# DemoApplication.javaに追記
src/main/java/DemoApplication.javaを以下のように変更します。

~~~java:src/main/java/DemoApplication.java
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping; // 追加
import org.springframework.web.bind.annotation.RequestParam; // 追加
import org.springframework.web.bind.annotation.RestController; // 追加

@SpringBootApplication
@RestController
public class DemoApplication {

  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }

  // 追加
  @GetMapping("/")
  public String top() {
    return "TOP Page!";
  }

  @GetMapping("/hello")
  public String hello(@RequestParam(value = "name", defaultValue = "World") String name) {
    return String.format("Hello %s!", name);
  }
}
~~~

# 実行
ターミナルでプロジェクトディレクトリに移動して、次のコマンドを実行するとプロジェクトが走ります。

~~~
$ ./mvnw spring-boot:run
~~~
http://localhost:8080/ に行くと以下のようになります！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682620/fd872a7a-db6d-7045-d419-280dde925f24.png)

http://localhost:8080/hello に行くとhello()が呼び出されます。これがGetMappingの役割みたいです。その際nameの値はdefaultValueですが、http://localhost:8080/hello?name=Canon とすると「Hello Canon!」になります。感動。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682620/aee2ae51-b0ab-8dbf-0e77-44c65a7bdec8.png)
Slack アプリを AWS Lambda で動かす


# Slack アプリを AWS Lambda で動かす

## やること

Slack アプリを `AWS Lambda` で動かす。
Slack アプリは `Slack Bolt` で開発し、Slackのショートカットからモーダルを起動する。

## [Slack Bolt](https://slack.dev/bolt-js/ja-jp/tutorial/getting-started) とは

Slack アプリを手軽に作成するためのフレームワークで、Slack 社が提供している。Bot だけを作れるとかそういうわけではなく、色々なトリガーからアプリを起動させて色々な処理をさせることができる。トリガーは以下の通り。

- Webhook 起動
- ショートカット起動（イナズママークのやつ）
- スラッシュコマンド起動

また、[BlockKitBuilder](https://app.slack.com/block-kit-builder/) を使えば、よりリッチな UI を実現できる。

## シーケンス

![スクリーンショット 2020-08-22 2.03.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/3ddeab20-c438-b627-3373-d3949ad1d8eb.png)

## 開発言語

- Node.js 12.16.1

## 依存関係のある npm パッケージ

- @slack/bolt 2.2.3
- @slack/logger 2.0.0
- aws-serverless-express 3.3.8

## 開発環境のみの npm パッケージ

- serverless 1.78.1
- serverless-offline 6.5.0

ローカルのAPIは[ngrok](https://ngrok.com/) で外部公開する必要がある。（この記事では割愛）

## 実装内容

```js
// ------------------------
// Bolt 初期化処理
// ------------------------
const { App, ExpressReceiver } = require('@slack/bolt');
const { LogLevel } = require('@slack/logger');
const logLevel = process.env.SLACK_LOG_LEVEL || LogLevel.DEBUG;
const processBeforeResponse = false;

const receiver = new ExpressReceiver({
  signingSecret: process.env.SLACK_SIGNING_SECRET,
  processBeforeResponse,
});

const app = new App({
  token: process.env.SLACK_BOT_TOKEN, // Bot User OAuth Access Token
  logLevel,
  receiver,
  processBeforeResponse,
});

// ------------------------
// Bolt メイン処理
// ------------------------

// ショートカット起動
app.shortcut('{callback_id}', async ({ logger, client, body, ack }) => {
  // logic...
  await ack();
});

// レスポンス処理
app.view('{callback_id}', async ({ logger, client, body, ack }) => {
  // logic...
  await ack();
});

// ------------------------
// AWS Lambda ハンドラ
// リクエストを受け付けたらExpressサーバを起動する
// ------------------------
const awsServerlessExpress = require('aws-serverless-express');
const server = awsServerlessExpress.createServer(receiver.app);
module.exports.hello = (event, context) => {
  awsServerlessExpress.proxy(server, event, context);
};
```

## Slack アプリ作成

アプリは、以下から作成できる。
https://api.slack.com/apps/new

## Slack アプリ設定

アプリをショートカット起動する場合は、以下から設定する。「Callback ID」は ソースコードの app.shortcut('{`callback_id`}')〜 と一致させる。
https://api.slack.com/apps/{作成したアプリID}/interactive-messages

## 実装のポイント

- Slack アプリはレスポンスを`3秒以内`を返さないとエラーになってしまうため、`ack()` をどのタイミングで返すかがキモになってくる。3 秒を超えるような処理を実装する場合は Lambda を分割し先に ack() をしてから、一方の Lambda を非同期処理させると良い。
- BlockKitBuilder の JSON と app.view の `callback_id` が紐づいているので、view が開かない場合 `callback_id` を確認すると良い。
- BlockKitBuilder の JSON に `block_id` と `action_id` を指定すれば、リクエストを input ごとに取得することできる。

## さいごに

Lambda で Bolt を動かす場合、Lambda 起動+Bolt 起動の時間が乗ってくるため、3秒ルールが結構シビア。Lambda で動かすよりもサーバでBoltを動かす方が、考えることが少なくて済み、良い。
個人的な備忘の記事なので、不明点はコメントか参考になったURLをみてもらえればと。

## 参考になったURL

- https://github.com/seratch/bolt-starter
- https://github.com/seratch/serverless-slack-bolt-aws
- https://slack.dev/bolt-js/ja-jp/tutorial/getting-started
【国家資格】知財検定３級を取るまでを記録していく

#この記事について
知財管理システムを開発しているエンジニアが、
知財３級を取るまでの勉強時間をまとめてみた。

モチベーション維持のために毎日書いていく。

#知財検定３級について
【国家資格】 知的財産管理技能検定 ３級
合格率は60％ほどだと言われている。

試験日 : 2020年11月14(土)

#試験内容
<table>
<tr>
<td>学科試験</td>
<td>筆記試験<br>
（マークシート方式 3肢択一式）</td>
<td>30問</td>
<td>45分</td>
</tr>
<tr>
<td>実技試験</td>
<td>筆記試験<br>
（記述方式）</td>
<td>30問</td>
<td>45分</td>
</tr>
</table>
#使用する参考書
公式テキスト
www.amazon.co.jp/dp/4909189130
過去問題集
www.amazon.co.jp/dp/4909189165

公式テキストを３回ほど読み流し、
過去問集を読んで理解を深めていく。

# 勉強時間をメモしていく(集中して取り組んだ時間のみ)
2020/08/22 : 30分
2020/08/23 : 50分
2020/08/24 : 30分
2020/08/25 : 0分
2020/08/26 : 0分 
2020/08/27 : 30分
2020/08/28 : 0分
2020/08/29 : 30分
2020/08/30 : 30分
2020/08/31 : 0分
2020/09/01 : 30分
2020/09/02 : 10分
2020/09/03 : 30分
2020/09/04 : 0分
2020/09/05 : 0分
2020/09/06 : 40分
2020/09/03 : 10分
nextInt()→nextLine()の落とし穴

数字と文字列の2つのパラメータを標準入力で渡したいと思います。

使うメソッドは、
nextLine()：改行までの一行分の入力を取得することができるメソッド
nextInt() ：int型の数値を取得することができるメソッド
この2種類ですが、
順番が問題です。

nextLine()が先だと、入力を２回受け付けてくれます。

```java

import java.util.*;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        String numStr = sc.nextLine();
        int num = sc.nextInt();

        sc.close();

        System.out.println(num);
        System.out.println(numStr);
    }
}

```

nextLine()が後だと、入力を1回しか受け付けてもらえません。
numStrには空文字が入ります。

```java

import java.util.*;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int num = sc.nextInt();
        String numStr = sc.nextLine();

        sc.close();

        System.out.println(num);
        System.out.println(numStr);
    }
}
```

これは、nextIntで数値を読み込んだ際、改行文字が残ってしまっているためです。
int＋enter(\n)
その残った改行文字をnextLineで読み込んでしまっています。

順番を変える以外の解決策としては、        
int num = sc.nextInt();
sc.nextLine();←改行をここで読み込ませる。（変数には格納する必要なし）
        String numStr = sc.nextLine();

があります。
AWS Kinesisが超絶分かりにくい件

いやー、超絶分かりにくいですね。

例えばこれ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/492eb024-fa08-c840-0bf2-b4ea01ad5a1f.png)

再試行は関数がエラーを返すときに再試行する最大回数です。
と書いてあり、デフォルト値として「-1」が入っていますが、この数値に関する説明がありません。
「-1」は無限に再試行するの？ホントに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/0d04f904-3d02-b91a-ecdb-bdfc8ededb94.png)

再試行してほしくないので当然ながら「0」を指定してみたんですが、エラーが出ました。英語で。
「MaximumRecordAgeInSecondsは-1(永久)から60〜604800でなければいけません」
だそうです。

その下の **レコードの最長有効期限** は、もっと謎です。
こちらも-1がデフォルト値ですが、説明が一切ありません。
「-1」は無限ではないです。なぜなら、最大値（604,800秒）が規定されているから。
有効期限が0なら0を使えば良い訳で、「-1」という値は、まったくもって謎です。

最後の処理結果: 

|表示|意味|
|---|---|
|No records processed|まだレコードが来ていない(処理していない)|
|OK|おっけー牧場👌|


AWSは、不幸を生み続けるサービスです。

# 参考
https://qiita.com/mksamba/items/2854ee0b83e2043b5313
Ubuntuでのmozc日本語レイアウト化

以下のファイルを変更する
/usr/share/ibus/component/mozc.xml
開くと以下のように記載されている部分を

```
<layout>default</layout>
```

```
<layout>jp</layout>
```

に変更する。
その後再起動すると日本語配列となる
生のPHPでカレンダーを作る

# 背景
自分のためのメモ書きみたいなもんなのでめちゃくちゃ簡素です。すみません。
あまりに簡素すぎるので気が向いたときに機能追加していきます。
現状8月の設定でハードコーディングしてます。

# コード

```calendar.php
<?php
define("DAYS_OF_WEEK", 7);
define("MAX_WEEKS_OF_MONTH", 6);
define("NUMBER_OF_SQUARES", DAYS_OF_WEEK * MAX_WEEKS_OF_MONTH);
define("WEEK_DAYS", ['日', '月', '火', '水', '木', '金', '土']);

$_ = function($s) { return $s; };

$startDayPosition = date('w', strtotime('2020-08-01'));
$daysOfMonth = cal_days_in_month(CAL_GREGORIAN, 8, 2020);
$lastDayPosition = $daysOfMonth + $startDayPosition;
$weeksOfMonth = ceil($lastDayPosition / DAYS_OF_WEEK);
echo "<h1>2020年8月</h1>";
echo '<table>';

for ($d = 0; $d < count(WEEK_DAYS); $d++) {
    echo "<td>{$_(WEEK_DAYS[$d])}</td>";
}

echo "<tr>";

for ($squarePosition = 1; $squarePosition <= $lastDayPosition; $squarePosition++) {
    if($squarePosition - 1 >= $startDayPosition) {
        $dayCount = $squarePosition - $startDayPosition;
        echo "<td>$dayCount</td>";
    } else{
        echo "<td> </td>";
    }
    if ($squarePosition % DAYS_OF_WEEK === 0) {
        echo "</tr>";
    }
}
```

# 見た目
こうなります。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531430/ab449e5e-e37b-4aee-88b0-19b0473688d3.png)

for文二回以上使わないという条件でもっといい書き方があれば教えてください。
RPGツクールMZ：オートセーブによる事故の回避方法


結論だけ言うと**イベントシーン中や連戦では「セーブ禁止」状態にしてオートセーブを無効化する**のが最適解です。
特にオープニングイベント中はオートセーブ禁止を推奨します。

オートセーブは一歩間違うと大惨事になります。

#何が問題なのか
具体的にはタイトル画面で操作ミスでニューゲームが選択されて、そのニューゲームでオートセーブが実行されて上書きになると大事故だということです。

オートセーブの実行されるのは以下の2つのタイミングです。

+ 他のマップから移動してきたとき
+ 戦闘が終了した直後

オープニング中は演出のためにマップ移動や戦闘が多発します。
これでオートセーブが発生し、予期せぬエラーからの復帰という目的を果たせなくなってしまいます。


#いつオートセーブ許可を行うか
個人的なオススメはオープニング中の最初の戦闘の直前にセーブの許可を出し、最初の戦闘が終わった直後にオートセーブが動くようにするパターンです。
この戦闘がそれなりに長ければ、プレイヤーは問題に気づいてリセットし、オートセーブを開いて本来のゲームに戻るでしょう。
また、最初のセーブポイントに触れたタイミングで許可を出すのもオススメです。

#おわりに
元々はプラグインを書いてこれを対策する方法を考えました。
しかし、イベントコマンドの「セーブ禁止の変更」で解決すると判明したので、没にしてこの記事を作成しました。
難しいことは必要ないので、ササッと組んでしまいましょう。
レジストリ修正不要で、エクセルファイルを右クリックメニューから読み取り専用で開く

## 概要
Windowsでエクセルファイルを右クリック「送る」メニューを通して自動的に読み取り専用モードで開くための、PowerShellスクリプト埋め込みBatファイルです。
レジストリ修正によるExcel本来機能を使う事ができない（管理者権限が無い）環境で作業する必要があるので、自分用に作りました。
## 特徴
* レジストリ修正が不要
* Windows標準で使用できる簡易なコード／スクリプトのみで実装
* インストール不要
* 右クリックコンテクストメニューからのシンプルな操作
* ファイルの一時的なコピーなどは不要

誤操作によるファイル更新や不要なロックを抑止するため、参照するだけなら読み取り専用でファイルを開くように個人的に心がけています。
`レジストリ修正によるExcel本来機能については多くの記事がありますのでここでは特に触れません。`

## コード
```batch:ReadOnly_Excel.bat
<# : by earthdiver1
@echo off & setlocal EnableDelayedExpansion
set BATCH_ARGS=%*
for %%A in (!BATCH_ARGS!) do set "ARG=%%~A" & set "ARG=!ARG:'=''!" & set "PWSH_ARGS=!PWSH_ARGS! "'!ARG!'""
if defined PWSH_ARGS set "PWSH_ARGS=!PWSH_ARGS:^^=^!"
endlocal & Powershell -NoProfile -Command "$input|&([ScriptBlock]::Create((gc '%~f0'|Out-String)))" %BATCH_ARGS%
exit/b
: #>
Function Main($file) {

    try {

        $excel = New-Object -ComObject Excel.Application
        $excel.Visible = $true
        $book = $excel.Workbooks.Open($file, $false, $true)
        
        [Void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($book)
        [Void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
        [GC]::Collect()

    } catch [System.Exception] {

        Write-Host "システム例外が発生しました。" -Fore Red
        Write-Host $Error[0].Exception
        Read-Host "何かキーを押すと終了します。" 

    } finally {

    }
}

Main $Args[0]
```

## 使い方
1. このコードをbatファイル形式で保存して、batファイルへのショートカット又はbatファイル本体を、以下に格納します。  
C:\Users\username\AppData\Roaming\Microsoft\Windows\SendTo  
 ※[Windowsキー]+[R]で「ファイル名を指定して実行」から[shell:sendto]で開く場所です。
2. 開きたいエクセルファイルを右クリックして「送る」メニューからbatファイル(又はショートカット)を選べば、エクセルファイルが読み取り専用で開きます。

## コードの流れ
* 冒頭の8行でbatコマンドを記載しています。その中で自分自身のファイルを再呼び出しして、9行目以降をpowershellスクリプトとして読み込み実行します。
* 右クリック「送る」へ送ったエクセルファイルは、batファイルへの引数として受け取り、さらにpowershellスクリプトの引数として渡されます。
* powershellスクリプトでExcel.ApplicationのComObjectを生成し、引数で受け取ったエクセルファイルを読み取り専用モードで開きます。
* このbat(powershell)自体は、エクセル起動に使った変数を破棄した後にすぐに終了するので、起動したエクセルだけが残ります。

## 注意
* ~~ファイル名に特殊文字、特に半角括弧 **<font color="Red">()</font>** を含むと正常に動作しません。~~
 * ~~batで受け取った変数に **<font color="Red">()</font>**  を含んだままだとpowershell呼び出し時に制御文字として誤動作しエラーとなります。~~
 * ~~エスケープすればpowershell呼び出しは可能になりますが、powershell内でファイル名変数の中にエスケープ文字( <font color="Blue">/</font> )が残存するため、ファイルフルパスが判別できなくなります。~~
 * ファイル名に特殊文字を使うのは避けましょう・・・
* 起動したエクセルファイルを最前面に表示する制御は入れていないため、エクセル起動後にbat(powershell)が終了するタイミングで、エクセルファイルを右クリックした時のエクスプローラーウインドウが前面に出ます。
 * 個人用としては事足りているので、あまり手の込んだ事はしていません・・・

<Br>
2020.08.23 更新 (引数に半角括弧 **<font color="Red">()</font>** などの特殊記号が含まれる場合のエラーを回避したロジックに変更)

## 参考・引用
batからpowershellを呼び出す制御は、以下の記事を参照させていただきました。
[バッチファイルの中にPowerShellスクリプトを埋め込む](https://qiita.com/earthdiver1/items/cab769aad623a03a0f2d) [@earthdiver1 様](https://qiita.com/earthdiver1)
クリエイティブ・コモンズ 表示 - 継承 4.0 国際
DB設計

#DB設計とは
開発を始める前に、これから作成するアプリやシステムに必要な情報を洗い出し、
取り扱うデータをどのように管理していくかを決める作業です:sunny:

## なぜ必要か？
サービスはデータベースを持っています。
データベースには商品の情報、ユーザーの情報などなど多くのデータが保管されていきます。
こうしたデータ間の関係性を予め決めておく必要があります。
最初にデータベース設計を行うことで、データの関係性を明確にし、効率のいいデータ操作ができるようになるからです。

**ポイント**
**DB設計はプログラムを書き始めるより前、最初に行うこと！**

##DBの基礎
データベースを構成する要素は大きく分けて３つあります。
**・エンティティ**
**・エンティティの属性**
**・エンティティ同士の関係性（リレーション）**

**1.エンティティとは**
サービスの中で管理する必要がある情報のこと。
*ex.「ユーザー」や「投稿内容」などの情報ははエンティティになります。*

**2.エンティティの属性とは**
属性とは、エンティティが個別に持っている情報です。
*ex.「ユーザー」というエンティティが持っている属性は、「名前」「アドレス」「パスワード」「住所」など。*

**3.リレーションとは**
エンティティとエンティティ炉の間に存在する関係性のことを指します。
*ex. twitterのようなメッセージ投稿できるサービスを例にすると
「ユーザー」一人に対して、「ツイート」を複数回することができます。
これを1対多の関係と言います。
(この関係性を後にER図という図にまとめていきます)*

## 設計の順番

1.エンティティを決める
2.それぞれの属性を決める
3.リレーションを決める（関係性）
4.データベースのテーブルとして定義する

##最後に
実装中にER図を変更することもありますが、
DB設計を開発前にすることで、最初にどのようなデータ・システム・機能が必要か、
洗い出しができるので効率的に開発を進めていくことができました◎

今回は以上です。最後までお読みいただきありがとうございました＾＾
Python3で簡単なVim Pluginを書く

# はじめに

- Vimのことをもっと知りたいと思い、PythonでVim Pluginを書いてみた（Neovim使ってるけど...）
- 人生初のVim Plugin

# 作ったもの
- これ https://github.com/shase/passgen.vim
- 指定桁のパスワードを生成して、vimのbufferにinsertしてるだけ

# ディレクトリ、ファイル

```
.
├── autoload
│   └── passgen.vim
├── plugin
│   └── passgen.vim
└── python3
    └── passgen.py
```

- Pluginとして動かすだけなら、最低限3つのファイルがあれば良さそう
- もちろんテストもあったほうがよい
- 公開するのであれば、更にdocやREADMEやLICENCEも合ったほうが良い

# 作成の流れ

## まずmainの処理を普通のPythonとして書く

```python3/passgen.py
  
import secrets
import string


def passgenvim_generate_password(size=''):
   chars = string.ascii_letters + string.digits
   return ''.join(secrets.choice(chars) for x in range(int(size)))
```

## Pythonを呼び出すVimscriptをautoload配下に書く

```autoload/passgen.vim
let s:save_cpo = &cpo
set cpo&vim

py3file <sfile>:h:h/python3/passgen.py
python3 import vim

function! passgen#passgen(size)
  python3 vim.command("call setline('.', '%s')" % passgenvim_generate_password(vim.eval('a:size')))
endfunction

let &cpo = s:save_cpo
unlet s:save_cpo
```

## autoloadに書いた関数を、コマンドから呼び出す

```plugin/passgen.vim
let s:save_cpo = &cpo
set cpo&vim

command! -nargs=1 PASSGEN call passgen#passgen(<f-args>)

let &cpo = s:save_cpo
unlet s:save_cpo
```

こんな感じでOK

# 参考にしました
- https://qiita.com/zakuro9715/items/98449dd4c6b9e1d61ef5
- https://qiita.com/ka-tsu-mo/items/9ef28ea925d1cb87602f
- https://vim-jp.org/vimdoc-ja/if_pyth.html
【Python】スマブラーが動画読み込み処理をジェネレータを使った関数にしてみた

## ことのはじまり
とある依頼があり、10時間ぐらいのゲーム動画を機械学習することになったので
進捗状況をコンソール出力しながら動画を読み込むモジュールを作りました。

### 普通のプログラム
``` Python
import cv2
import sys

fpath = 'data/videos/sample_video.mp4'

video = cv2.VideoCapture(fpath)
can_read, first = video.read()

if not can_read:
    sys.exit()

progress_step = 60    # 60フレームに1回、進捗を表示する
count = 0
max = int(video.get(cv2.CAP_PROP_FRAME_COUNT))

while video.isOpened():
    if(count % progress_step == 0):
        print(f'Progress rate: {count}/{max}')

    ok, frame = video.read()
    if ok:
        # やりたい処理
    else:
        break

video.release()
```
#### 実行結果
```
Progress rate: 0/2700
Progress rate: 60/2700
Progress rate: 120/2700
Progress rate: 180/2700
...
```

#### 所感
目的は達成できてるのですが、他のプログラムでも動画読み込み系の処理があり、そこでも使いまわしたいので、どこからでも呼べるような関数にすることに。

### 関数化Ver
#### 関数
``` Python:reader.py
def video_read(input):
    """
    Parameters
    ----------
    input: str
        Input video path

    Returns
    ------
    Iterator[np.ndarray]
        Generator of video frame
    """

    # video capture start
    video = cv2.VideoCapture(input)
    can_read, first = video.read()

    if not can_read:
        print('Cannot read video file')
        return

    max = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
    yield first

    progress_step = 60    # 60フレームに1回、進捗を表示する
    count = 0
    while video.isOpened():
        if(count % progress_step == 0):
            print(f'Progress rate: {count}/{max}')

        ok, frame = video.read()
        if ok:
            count += 1
            yield frame
        else:
            break
    video.release()
```
#### 呼び出し元
``` Python
import reader

it = reader.video_read('data/videos/sample_video.mp4')
try:
    first = next(it)
except StopIteration:
    sys.exit()

for image in it:
    # やりたい処理
```

## まとめ
呼び出し元はすごくスッキリしました。
動画読み込み系の処理と、メインのやりたい処理が分離され明確になったと思います。
Pythonのジェネレータを上手に活かせた気がします。
今回の記事、スマブラー関係なくてすみません...
Termux使ってスマホ(Android)で入力補完やってみた。

`この記事ではPixel 3a XL(Android 10)にインストールしたTermux(0.98)を使っています。`

#はじめに。
こんにちは、タキガワです。初めての記事になります。私は競技プログラミングをやっていて、スマホでできたらいいと思っていたのですが、入力補完とかエラーチェックとかあるといいなと思って調べたらうまく行ったので一通りの手順を記事にしようと思いました。
こんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695816/de2f4aaa-3feb-a450-dd80-8369946566cb.png)

#Termuxのインストール
AndroidでLinuxのターミナルっぽいことができるみたいなアプリです。(多分...)
普通のAndroidアプリと同じようにplay storeからインストールできます。
https://play.google.com/store/apps/details?id=com.termux&hl=ja
#Termuxを起動して、必要なパッケージなどをインストール
以下のコマンドをTermux上で入力して、パッケージをインストールします。今回はNeovimとc++でやります。(gccは使えないみたいなのでclangでやります。)

```
pkg install neovim clang git curl nodejs yarn
```
Neovimの設定ファイルを作る前に、Neovimのプラグインマネージャーの [vim-plug](https://github.com/junegunn/vim-plug)を導入します。

```
sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
       https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
```

#Neovimの設定をする。
次にNeovimの設定ファイルを作ります。

```
cd ~
mkdir .config && cd .config
mkdir nvim && cd nvim
touch init.vim
```
つぎに`nvim init.vim`などで`init.vim`を編集します。今回は[coc.vim](https://github.com/neoclide/coc.nvim)というvimのプラグインを使います。

```init.vim
call plug#begin()
Plug 'neoclide/coc.nvim', {'branch': 'release'}
call plug#end()
```
保存して、`:PlugInstall`をノーマルモードでEnterします。
最後に`coc.vim`を使って`clangd`と`neovim`を連携(？）します。clangdは`pkg install`した時にclangと一緒にインストールされるみたいです。
Neovimを起動し`:CocInstall coc-clangd`をノーマルモードでEnterします。
これで終わりです。
#最後に
clangのままだと`#include<bits/stdc++.h>`が使えないので、ホームディレクトリ（`cd ~`でいけるところ）のひとつ上に`usr`ディレクトリがあります。あとは[こちら](https://qiita.com/K_Lightning/items/55821df2fe850f12659d)の記事の通りにすればできると思います。`coc.nvim`もフォーマットとかできるらしいです。詳しくは参考文献を見て下さい。他の言語も似たような感じでできると思います。Bluetoothキーボードとかでコーディングできたらいいですね。



##参考文献
[Vimにcoc.nvimを入れたら便利すぎて感動したっていう話](https://qiita.com/Amadeus_vn/items/5dfcf8d3676c2c5576ef)
[Macでstdc++.hを用いてC++プログラムを実行したい！](https://qiita.com/K_Lightning/items/55821df2fe850f12659d)
二種類のcardinalityに注意

# 二種類のcardinalityに注意

データベースやデータモデリングの文脈には2種のcardinality(カーディナリティ/基数)があるのでややこしい。
簡単に整理してまとめておく。

* (1) 一つはUMLでいうmultiplicity(多重度)のこと。  
      1対多だとか、多対多だとか、0..1対0..N とかのおなじみのやつだ。
* (2) もう1つは列のcardinalityで、列のとりうる値全体の集合の数学的な濃度だ。  
      こちらのcardinalityはパフォーマンスに影響する。  
      DBのインデックスはcardinalityが高い列(即ち値の種類が多い列)に貼る必要があるし、
      hashテーブルに入れるならキーのcardinalityが十分高い必要がある。

## 参考資料

* https://orangematter.solarwinds.com/2020/01/05/what-is-cardinality-in-a-database/
  - 2種のcardinality について解説している

* https://qiita.com/soyanchu/items/034be19a2e3cb87b2efb
   - (2)のcardinalityとパフォーマンスへの影響について解説している
   - "複合インデックスを貼る時はカーディナリティの高い順に貼っていく"
   - "インデックスを作る時の目安は特定のカラム値を指定した時に全体の5%程度に絞り込めるだけのカーディナリティがあること" など参考になる

* Martin Fowlerの記事 https://martinfowler.com/bliki/MultiplicityNotCardinality.html
  * 日本語訳もある https://bliki-ja.github.io/MultiplicityNotCardinality/
dotnetコマンドで利用するSDKバージョンを切り替える

# 困ったこと
IdentityServer4の勉強でつまづいた。
.Net Core SDKの2.1系と3.1系が入っている状態で下記を叩いたら.NET Core SDK 3.1のもので作られた。

```
> cd project-dir
> dotnet new -i IdentityServer4.Templates
> dotnet new is4ui
```

そもそもコンピューター内には2つのSDKを入れてたので、最新が使われるらしい。
だからIdentityServer4.Templates も3.1系の認識でインストールしちゃった模様。

```
> dotnet --list-sdks
2.1.808 [C:\Program Files\dotnet\sdk]
3.1.302 [C:\Program Files\dotnet\sdk]
```

# 解決見つけた
[使用する .NET Core のバージョンを選択する](https://docs.microsoft.com/ja-jp/dotnet/core/versions/selection)

dotnetコマンドを実行するパスより上部にglobal.jsonを置いて、
SDKバージョンを明示すればいいらしい。

ということで、ソリューションファイルと同じディレクトリに作ることにした。
dotnet new globaljsonでバージョンを指定するとglobal.jsonを作ってくれる。
バージョンは全部一致させないとダメみたい。
(2.1.*みたいな指定はできないっぽい)

```
> cd solution-dir
> dotnet new globaljson --sdk-version 2.1.808
The template "global.json file" was created successfully.
```

できたglobal.jsonの中身はこんな。

```json:global.json
{
  "sdk": {
    "version": "2.1.808"
  }
}
```

置く前は

```
> cd solution-dir\project-dir
> dotnet --version
3.1.302
```

置いた後は

```
> cd solution-dir\project-dir
> dotnet --version
2.1.808
```

# 入れなおす
入れてたIdentityServer4.Templatesのバージョンが4.0.1で.NetCore3系だった。
3.1.2までが2.1系で動作するもののようなので、入れなおしてis4uiを叩く。

まず、.NetCore3系で入れちゃってるので、global.jsonが有効でない場所で実行する。


```
> cd :c\
> dotnet new -u IdentityServer4.Templates
```

次に、IdentityServer4.Templates 3.1.2のインストールと、
プロジェクト内にis4uiを入れなおす。

```
> cd project-dir
> dotnet new -i IdentityServer4.Templates::3.1.2
> dotnet new is4ui
```

# 備忘録
dotnet new -iでインストールされたパッケージは下記にある。
%USERPROFILE%\.templateengine\dotnetcli\SDKバージョン\packages
【homebrew】MacのMySQLを5.6から8.0に更新

## 概要
- マイグレーションツールを使いたい！
- でも、Mysql5.7以上しか対応していない！
- あげるかー！　←　今に至る

## 手順
**(1) HomeBrewのバージョンを確認**

```
$ mysql --version
mysql  Ver 14.14 Distrib 5.6.47, for osx10.15 (x86_64) using  EditLine wrapper
```

**(2) Homebrewの更新**

```
$ brew update
```

**(3) mysqlを8.0.21に更新（2020/08/22時点）**

```shell

$ brew install mysql

Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/cask).
==> Updated Casks
qcad                                                                transnomino                                                         wormhole

==> Downloading https://homebrew.bintray.com/bottles/mysql-8.0.21_1.catalina.bottle.tar.gz
Already downloaded: /Users/banaoh/Library/Caches/Homebrew/downloads/0d017278caa06d8c2921f06801b920ebffaeb68cef50eb80973e70db449facc5--mysql-8.0.21_1.catalina.bottle.tar.gz
==> Pouring mysql-8.0.21_1.catalina.bottle.tar.gz
==> /usr/local/Cellar/mysql/8.0.21_1/bin/mysqld --initialize-insecure --user=banaoh --basedir=/usr/local/Cellar/mysql/8.0.21_1 --datadir=/usr/local/var/mysql --tmpdir=/tmp
==> Caveats
We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

MySQL is configured to only allow connections from localhost by default

To connect run:
    mysql -uroot

To have launchd start mysql now and restart at login:
  brew services start mysql
Or, if you don't want/need a background service you can just run:
  mysql.server start
==> Summary
🍺  /usr/local/Cellar/mysql/8.0.21_1: 290 files, 291.2MB
```

**(4) mysqlのバージョン確認（失敗）**

```shell
$ mysql --version
mysql  Ver 14.14 Distrib 5.6.47, for osx10.15 (x86_64) using  EditLine wrapper
```

あれ、5.6のまま？
プロセスの確認、残ってたら削除

```shell

# プロセスの確認
$ ps ax | grep mysql
44146   ??  S      0:00.03 /bin/sh /usr/local/Cellar/mysql@5.6/5.6.47/bin/mysqld_safe
44255   ??  S      0:09.04 /usr/local/Cellar/mysql@5.6/5.6.47/bin/mysqld --basedir=/usr/local/Cellar/mysql@5.6/5.6.47
84116 s000  S+     0:00.00 grep mysql

# プロセスの削除
$ kill -9 44146
$ kill -9 44255
```

**(4) mysqlのバージョン確認（成功）**

```shell

$ mysql --version
mysql  Ver 8.0.21 for osx10.15 on x86_64 (Homebrew)
```

**(5) mysqlの起動**

```shell

$ mysql.server start
Starting MySQL
. SUCCESS!
```

## トラブルシューティング
### ケース1. 起動時に『ERROR! The server quit without updating PID file』 が出る

```
$ mysql.server start
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/KengonoMBP.pid).
```

- 原因
    - (1) ***.pidがない
    - (2) 権限がない
    - (3) 古い設定が残っていて、古い設定で起動しようとしている
- 解決策 ... [mysql 起動時のThe server quit without updating PID file エラーの回避法 - Qiita](https://qiita.com/jonakp/items/477a18d4a94c01a31583)

### ケース2. 再インストールしたい
- 下記の手順

```shell

# (1) アンインストール
$ brew uninstall mysql

# (2) mysqlの実体ファイルを削除 （DB消えるため、必要に応じてバックアップ）
$ sudo rm -rf /usr/local/mysql*

# (3) 再インストール
$ brew install mysql
```
ヘルパーメソッド（form_withとlink_to)

##よく使うヘルパーメソッド２つ

### そもそもヘルパーメソッドとは
Viewをわかりやすく楽に書くためにRailsで用意されたモジュールのことで、要はview作成を助けてくれるから**ヘルパー**メソッド
モジュールとはメソッドをまとめるところ。インスタンスが定義できないクラスと考えても良い。

### ヘルパー紹介
-  form_with　（入力フォームを付けたいとき）


```Ruby:入力内容をデータベースに保存しないとき
<%= form_with url: "パス" do |form| %>
  フォーム内容
<% end %>
```
```Ruby:入力内容をデータベースに保存するとき
<%= form_with model: モデルクラスのインスタンス do |form| %>
  フォーム内容
<% end %>
```






-  link_to （リンクを付けたいとき）

```Ruby:第1引数：リンクのテキスト、第2引数：URL
<%= link_to “YouTube”, “https://www.youtube.com/” %>
```
```Ruby:第1引数：リンクのテキスト、第2引数：パス
<%= link_to “トップページ”, “root_path” %>
```
#M5StickV でLチカ

### 概要
M5StickV のLEDでLチカをしてみました。
M5StickVには、RGBWで点灯するLEDが搭載されています。

###  環境
M5StickV 
MicroPython v0.5.0-123-g859098d1e on 2020-08-21;


###  回路

Kendryte K210のIO_6～IO_9のIOがLED W2SA50TSと繋がっています。

![クリップボード0211.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/4da41a5f-9def-cb54-bf35-5a104d21ed7f.jpeg)

###  Example.1

M5StickVのLEDを赤く点灯します。


![クリップボード01_Red.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/29feb387-d5fd-76ca-ffe4-c9a677484bdd.jpeg)

```Python
from Maix import GPIO
from board import board_info

fm.register(board_info.LED_R, fm.fpioa.GPIO4)

led_r = GPIO(GPIO.GPIO4, GPIO.OUT)
led_r.value(0)
```
###  Example.2
M5StickVのAボタンを押すごとに色を変えてみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/M5StickV?src=hash&amp;ref_src=twsrc%5Etfw">#M5StickV</a> でLチカ <a href="https://t.co/26WO3zvFxs">pic.twitter.com/26WO3zvFxs</a></p>&mdash; nnn (@nnn112358) <a href="https://twitter.com/nnn112358/status/1296840280113467392?ref_src=twsrc%5Etfw">August 21, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

```Python
from fpioa_manager import *
from Maix import GPIO
from board import board_info

fm.register(board_info.BUTTON_A, fm.fpioa.GPIO1)
fm.register(board_info.BUTTON_B, fm.fpioa.GPIO2)
fm.register(board_info.LED_W, fm.fpioa.GPIO3)
fm.register(board_info.LED_R, fm.fpioa.GPIO4)
fm.register(board_info.LED_G, fm.fpioa.GPIO5)
fm.register(board_info.LED_B, fm.fpioa.GPIO6)

but_a=GPIO(GPIO.GPIO1, GPIO.IN, GPIO.PULL_UP)
but_b = GPIO(GPIO.GPIO2, GPIO.IN, GPIO.PULL_UP)
led_w = GPIO(GPIO.GPIO3, GPIO.OUT)
led_r = GPIO(GPIO.GPIO4, GPIO.OUT)
led_g = GPIO(GPIO.GPIO5, GPIO.OUT)
led_b = GPIO(GPIO.GPIO6, GPIO.OUT)

led_w.value(1) # LED OFF
led_r.value(1) # LED OFF
led_g.value(1) # LED OFF
led_b.value(1) # LED OFF

counter = 0
but_stu = 1

while(True):
    if but_a.value() == 0 and but_stu == 1:

        if led_w.value() == 1:        
            led_w.value(0)
        else:
            led_w.value(1)
        but_stu = 0
    if but_a.value() == 1 and but_stu == 0:
        but_stu = 1
```

# 参考

- M5Stack Docs 
https://docs.m5stack.com/#/en/core/m5stickv
https://docs.m5stack.com/#/en/related_documents/M5StickV-Maixpy

- M5Stack Maixpy example 
https://docs.m5stack.com/#/en/related_documents/M5StickV-Maixpy

- Sipeed Maixpy Document
https://maixpy.sipeed.com/en/

- プリンをもっと見守る技術 
https://github.com/anoken/purin_wo_motto_mimamoru_gijutsu
ブラー・メディアン・ガウシアン処理

#実行環境
[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)

#Google Colaboratoryで画像を読み込む為の準備
```python:
from google.colab import files
from google.colab import drive
drive.mount('/content/drive')
```

#必要なライブラリの読み込み
```python:
import cv2 #opencv
import matplotlib.pyplot as plt 
%matplotlib inline
```

#画像準備
```python:
img = plt.imread("/content/drive/My Drive/Colab Notebooks/img/Lenna.bmp")
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
```

#処理
```python:
plt.figure(figsize=(9, 9), dpi=100,
           facecolor='w', linewidth=0, edgecolor='w')

plt.gray()

#オリジナル画像
plt.subplot(2,3,1)
plt.axis('off') 
plt.title("Original", fontsize=10)
plt.imshow(gray)

#縮小(フィルタは見やすい用に)
plt.subplot(2,3,2)
plt.axis('off') 
gray = cv2.resize(gray,(5,5))
plt.title("shukusyo", fontsize=10)
plt.imshow(gray)

size = (3,3)
size2 = 3 

#blur(平均値)
plt.subplot(2,3,4)
plt.axis('off') 
plt.title("blur", fontsize=10)
dst = cv2.blur(gray,size)
plt.imshow(dst)

#medianBlur(中央値)
plt.subplot(2,3,5)
plt.axis('off') 
plt.title("medianBlur", fontsize=10)
dst = cv2.medianBlur(gray,size2)#size2は、中央値を取るため奇数である必要あり
plt.imshow(dst)

#GAUSSIAN 処理対象画素との距離によって重みを変え計算
plt.subplot(2,3,6)
plt.axis('off') 
plt.title("GAUSSIAN", fontsize=10)
sigmaX = 11
sigmaY = 11
dst = cv2.GaussianBlur(gray,size,sigmaX,sigmaY)
plt.imshow(dst)

plt.show()
```

##結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610285/5527c08d-bfde-8202-d890-4f3b6fbbda09.png)

変化がわかりやすいように、
画像を5×5に圧縮してから各種処理を実施しました。

計算イメージはこんな感じです。(cv2.blur(gray,(3,3))の例)
3×3の領域の平均値が、処理後の値として、入力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610285/f5d189c3-73cd-3642-7c4c-2e4e9929c812.png)

今回は、anchor を指定していないため、中心を基準に処理されてます。
指定してあげることで処理位置を変えられるようです。



また、外周の枠を超える計算方法の詳細は下記リンクがわかりやすかったです。
今回は未指定なので
border=Type = cv2.BORDER_DEFAULT　（境界画素の中心で鏡映）
で実行されています。
http://www5d.biglobe.ne.jp/~noocyte/Programming/OpenCV.html#cv::borderInterpolate
nowコマンドが使えなくなっていたのでnodeをアップデートした

ある日、Zeit Nowのnowコマンドを使おうとしたところ、実行できなくなっていました。
1ヶ月前くらいまでは使えていたのに...
解決方法をチップスとして残します。

# Nowとは

nowと打つだけでデプロイできてしまうシンプルで簡単に使えるPaaSです。
https://vercel.com/home
私はNext.jsで利用していますが、他のNode.jsのフロントエンドFWやPythonやGoなどでも使えるようです。

Next.js + nowの使い方はこちらが参考になります。
https://qiita.com/shioiyan/items/540a0d68118c0384f4e4

# nowコマンドが実行できなくなった

```shell-session
$ now
> UPDATE AVAILABLE Run `npm i -g now@latest` to install Now CLI 19.2.0
> Changelog: https://github.com/zeit/now/releases/tag/now@19.2.0
> Error! The specified token is not valid
```

一度設定済みなのでnowでデプロイできるはずなのですが、Errorになりました。
アップデートで古いバージョンだと使えない仕様になったのでしょうか。

# 解決方法

`npm i -g now@latest`せよといわれているので、おとなしくコマンドを実行します。

```shell-session
$ npm i -g now@latest
> Error! Detected unsupported Node.js version.
> Expected ">= 10" but found "8.11.3".
> Please update to the latest Node.js LTS version to install Vercel CLI.
> npm WARN notsup Unsupported engine for now@19.2.0: wanted: {"node":">= 10"} (current: {"node":"8.11.3","npm":"6.13.6"})
```

今度はnodeのバージョンが低すぎると怒られました。
というわけでnodeをアップデートします。

```bash
# nコマンドのインストール
$ npm install -g n

# 安定板のインストール
$ n stable

# バージョン確認
$ node -v
> v12.18.3
```

これで無事にnowコマンドが使えるようになりました。

```shell-session
$ now
> Error! The specified token is not valid
```
上記のように怒られたときは、

`now login` でメールアドレスを認証させて、
再び`now`コマンドを実行すればデプロイできるようになります。

ちなみに--prodをつけるだけで設定なしで本番環境にdeployできるので便利です。

```bash
# DEV
$ now

# 本番
$ now --prod
```

---

以上nowのチップスでした。

参考にさせてもらいました。
node.js アップデート手順　https://mebee.info/2019/10/12/post-1793/#outline__3
Node.jsでディレクトリ配下にあるファイルを再帰的に探索する

下記のディレクトリ構造から、txtファイルのpathとfile名を一覧で取得する方法(Node.js)です。

```
./dir
├── dir2
│   ├── dir3
│   │   ├── file2.txt
│   │   └── file3.md
│   ├── file2.txt
│   └── file3.md
├── file1.md
└── file1.txt
```

## 実装コード

```javascript
const fs = require('fs');
const path = require('path');

const searchFiles = (dirPath) => {
  const allDirents = fs.readdirSync(dirPath, { withFileTypes: true });

  const files = [];
  for (const dirent of allDirents) {
    if (dirent.isDirectory()) {
      const fp = path.join(dirPath, dirent.name);
      files.push(searchFiles(fp));
    } else if (dirent.isFile() && ['.txt'].includes(path.extname(dirent.name))) {
      files.push({
        dir: path.join(dirPath, dirent.name),
        name: dirent.name,
      });
    }
  }
  return files.flat();
};

const dirPath = './dir';
console.log(searchFiles(dirPath));
```

## 出力内容

```
[
  { dir: 'dir/dir2/dir3/file2.txt', name: 'file2.txt' },
  { dir: 'dir/dir2/file2.txt', name: 'file2.txt' },
  { dir: 'dir/file1.txt', name: 'file1.txt' }
]
```
Flutter ios 環境構築メモ <Errorへの対処>

***<追加で更新中 最終更新日(2020/08/22)>***

本文は，`Flutterアプリ開発においてiosでのErrorが起こった内容および，それに対してTryしたことのメモ．`
自身が開発中に発生したエラーを共有させていただきます．また違う解決策があれば教えていただけると嬉しく思います．


## Error1：Warning: CocoaPods not installed.

***Debug時に発生するエラー内容***

1. 通常

```shell

brew install cocoapods
pod setup
```

2.　1，で完了しない場合

```shell

sudo gem uninstall cocoapods
rm -Rf Pods/
rm -Rf Podfile
rm -Rf Podfile.lock
rm -Rf Runner.xcworkspace
brew link --overwrite cocoapods
flutter build ios
```

上記の2つを行うことで解消することができた．


## Error2:  error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.

***flutter build ios 時に発生するエラー内容***

>diff: /../ios/./Pods/Podfile.lock: No such file or directory
diff: /../ios/Pods/Pods/Manifest.lock: No such file or directory
error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.

pod install を行っても，エラーは解消されない.........

◆対処法：下記URLを実行
https://www.ateliee.com/archives/2364

◆上記でも治らなかった場合

Phase 1
1. choose the target > go to Build Phrases > click Link Binary With Libraries > remove all libPods.a files

```shell

2. pod install
3. flutter clean and flutter build ios
```

Phase 2
1. open Terminal

```shell

2. pod deintegrate --verbose    
3. pod install --verbose
```

Phase 3
1. choose the target > go to Build Settings > click "+" sign
2. add 2 User-Defined Settings: [to the left = to the right]
3. PODS_ROOT = ${SRCROOT}/Pods
4. PODS_PODFILE_DIR_PATH = ${SRCROOT}/

Phase 4
もう一度アプリを作り直す...............

Phase 4まで行うことでようやく解消されましたが，これは正しい解決策とは言えないです．ですので，同じエラーにぶつかった方で解消法がありましたら，教えてください:cry:
yukicoder contest 262 参戦記

# yukicoder contest 262 参戦記

寝坊して40分遅れくらいで参加したら、ジャッジがちょうど止まってて、なんかやたらと Clar が多くて、D問題が不備行きになるし、いやなんかすごい回だった(笑).

## [A 1175 Simultaneous Equations](https://yukicoder.me/problems/no/1175)

普通に中学生の数学なので、係数を揃えて引いて x か y を消して……って感じですよね.

```python
a, b, c, d, e, f = map(int, input().split())

y = (c - f * a / d) / (b - e * a / d)
x = c / a - (b / a) * y
print(x, y)
```

## [B 1176 少ない質問](https://yukicoder.me/problems/no/1176)

だいたい底を2にするのが最適なんだろうけど、そうじゃないやつがあることは A=9 などすぐ思いつく. ただまあ、考慮するべき底はそんなに無いであろうと直感的に思うので、適当に小さい数を試してAC.

```python
from math import ceil, log

A = int(input())

result = float('inf')
for i in range(2, 100):
    result = min(result, i * ceil(log(A, i)))
print(result)
```

## [C 1177 余りは?](https://yukicoder.me/problems/no/1177)

解けず. 難易度詐欺. ★1.5から★2.5に変化した.

## [D 1178 Can you draw a Circle?](https://yukicoder.me/problems/no/1178)

制限で a = b なので、b を入力で受け取る意味が謎. 円の方程式に従って計算するだけではある.

```python
a, b, c, d, e, f = map(int, input().split())

x = c / a / 2
y = d / a / 2
t = f / a - e / a + x * x + y * y
print(t ** 0.5)
```

## [E 1179 Quadratic Equation](https://yukicoder.me/problems/no/1179)

二次方程式の解の公式は中学生の数学なので、その通りに解くだけって感じですね.

```python
a, b, c = map(int, input().split())

t = b * b - 4 * a * c
if t < 0:
    print('imaginary')
elif t == 0:
    print(-b / (2 * a))
else:
    t = t ** 0.5
    result = [(-b - t) / (2 * a), (-b + t) / (2 * a)]
    result.sort()
    print(*result)
```
機械学習初心者が学習しているリンク一覧

機械学習初心者の自分が、勉強のために集めた情報です。皆様のお役に立てれば。


###回帰分析
| 題名 | リンク | 
|:-----------|------------:| 
| リッジ回帰|   [LINK] (https://qiita.com/kotamatsuoka/items/1ccb41ca278e400b6197) |     



###決定木

| 題名 | リンク | 
|:-----------|------------:| 
| 決定木分析  |   [LINK] (https://qiita.com/3000manJPY/items/ef7495960f472ec14377#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB) |     
| 決定木とランダムフォレスト         |      [LINK](https://qiita.com/yshi12/items/6d30010b353b084b3749) |     
| How to Handle Imbalanced Classes in Machine Learning(事前データ処理)    |       [LINK] (https://elitedatascience.com/imbalanced-classes) |
| 不均衡なデータへの対応メモ   |       [LINK] (https://qiita.com/strg-frontier/items/e411d8007fce68f230d6) |

###scikit-learn
| 題名 | リンク | 
|:-----------|------------:|      
| RandomForestClassifierのパラメータ      |      [LINK](https://bataco20.com/entry/post-105#outline__1) | 
| GridSearchCV       |      [LINK](https://www.pynote.info/entry/sklearn-grid-search-cv) | 
| make_classification(データ発生関数)       |      [LINK](https://qiita.com/fujin/items/bb82d77b0b08c107f819#make_classification) | 
| .predict_proba(クラスに分類される確率を表示)       |      [LINK](https://blog.amedama.jp/entry/2017/12/18/005311) | 
| feature_importances_(ランダムフォレストで特徴量の重要度を評価する) |   [LINK] (http://aiweeklynews.com/archives/50653819.html) |
| scikit-learnで混同行列を生成、適合率・再現率・F1値などを算出      |       [LINK] (https://note.nkmk.me/python-sklearn-confusion-matrix-score/) | 
| GridSearchCVの評価指標にユーザ定義関数を使用する方法      |       [LINK] (https://qiita.com/y_kani/items/011b65a09e480322ac98) | 




###KERAS
| 題名 | リンク | 
|:-----------|------------:|      
| mnist.load_data()MNIST (手書き数字データベース)      |      [LINK](https://qiita.com/halspring/items/6f07816462f01a40d939) | 
| to_categorical(例:0->[0,0,0],1->[0,1,0],2->[0,0,1]に変換)     |      [LINK](https://analytics-note.xyz/machine-learning/keras-to-categorical/) | 
| Sequentialモデル     |      [LINK](http://marupeke296.com/IKDADV_DL_No2_Keras.html) | 


###用語
| 題名 | リンク | 
|:-----------|------------:| 
| 交差検証(cross validation) |   [LINK] (https://qiita.com/LicaOka/items/c6725aa8961df9332cc7) |
| ハイパーパラメーター |   [LINK] (https://www.codexa.net/hyperparameter-tuning-python/) |
| ROC,ACU |   [LINK] (https://qiita.com/TsutomuNakamura/items/ef963381e5d2768791d4) |
| 特徴量 |   [LINK] (https://aizine.ai/glossary-features/) |
| 学習曲線 |   [LINK] (https://axa.biopapyrus.jp/machine-learning/model-evaluation/learning-curves.html) |
|ROC曲線|[LINK](https://qiita.com/NT1123/private/345f78d7d005de0803f7) | 
|混合行列|[LINK](https://note.nkmk.me/python-sklearn-confusion-matrix-score/) | 

###トピック


| 題名 | リンク | 
|:-----------|------------:| 
| 2段階学習によるperformance metrixの改善 |   [LINK] (https://qiita.com/NT1123/private/a4b8d2f73b3e232b2443) |
RASISとは

サーバーの監視という業務は、「監視するだけ」では不十分で、監視した結果をどう評価し、問題があればどのような対策を講じる必要があるか、という点も考慮しなければいけない。

その際によく用いられる指標が**`RASIS(ラシス／レイシス)`**である。

RASISはサーバーに限らず、**コンピュータの機能や性能を測るために把握しておくべき項目の頭文字**である。

- R(Reliability) =信頼性


- A(Availability) =可用性

- S(Serviceablity) =保守性

- I(Integrity) =保全性、完全性

- S(Security) =機密性、セキュリティ性能
【初心者でもわかる】「早い・綺麗・正確」なコーディングのためのオリジナルルール

# どうも7noteです。コーディングする時のマイルールを紹介します。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/technique/myrule/
create-nuxt-appをバージョン指定 on Docker

何回かつまづいたのでメモ。
`create-nuxt-app`は3.Xからサーバーサイドフレームワークの選択がなくなり不便だったりするので2.Xをインストールする。Docker使って。

```
$ docker run --rm -it -w /app -v `pwd`:/app node /bin/bash -c "yarn global add create-nuxt-app@2.15.0; npx create-nuxt-app アプリ名"
```

`docker run`コマンドのオプションは

- `--rm`：コマンド実行終わったらコンテナ削除
- `-it`：`npx create-nuxt-app`で対話形式で入力が必要なので
- `-w /app`：コンテナのワーキングディレクトリを指定。なんでもOKだけど`/app`
- `-v ｀pwd｀:/app`：ローカルとコンテナのボリュームをマウント。`pwd`使ってカレントディレクトリをマウントしてる。コンテナ内の`/app`にNuxtアプリが作られるので最終的にローカルのカレントディレクトリにできる。

です。

`docker run`のコマンドは`/bin/bash -c "command1; command2; command3"`のように`;`でつなげることで`&&`みたいに複数コマンドを渡すことができます。

`yarn create nuxt-app`も試してみたけど最新バージョンの`create-nuxt-app`がなぜか適用されてうまくいかなかったので`npx`使ってます。
Flutter Could not build the application for the simulator. Error launching application on XXXの解決法

#Flutterでたまに起こる謎のエラー

```console
Could not build the application for the simulator
```

これ、エラーメッセージがとても少ない上、コード上でのエラーは０だから何がなんだかわからない。。。

しかもsimulatorでアプリが起動する前にこのエラーでビルド失敗するので、調べるのがめんどくさかったりする。。。:sweat:

#まずはこのコマンドを実行してみよう
コマンドプロンプト（ターミナル）でFlutterアプリのプロジェクトがある階層へ。

そして以下のコマンドを実行

```console
flutter clean
flutter run
```

色々と試す前にまずこれをやってみよう！

治る可能性がある！

#参考
https://stackoverflow.com/questions/59921997/could-not-build-the-application-for-the-simulator-error-launching-application-o
私は Scratch や L チカより、VT100 がいい。

Raspberry Pi の教育利用の例を見ると、Scratch や L チカに流れる例が多いような気がします。

しかし、私は Raspberry Pi を 「気軽に触れて限界も試せる、本物の Unix」 として学んでいただく良い方法がないか、と思います。

## 具体的なイメージと優位性
確かに、Windows や macOS にもターミナルはあり、どちらでも Unix を動かせることになっています。しかし、それぞれの OS の特性を引き継いでいて、例えば特殊な文法があったり、特殊な癖があったり、性能に制約があったりします。そもそも、メインストリームとしてサポートしたいという OS ベンダーさんのモチベーションがあるとは限らないので、常に OS ベンダーさんの真意を気にしなければなりません。

Raspberry Pi の場合、私の理解では Raspberri Pi OS という Debian が Raspberry Pi のメイン OS になっています。Unix の性能がそのハードウェアの上で最良であることが目指されています。

加えて、ハードウェアの能力に制約があることから、結果として OS の構成がシンプルであるように思います。

## 私がいいと思うコンフィギュレーションの例
Raspberry Pi にマウスやキーボードやディスプレーを接続して使う方法も魅力的ではありますが、現代の学生は、すでに中高生の頃から何らかの PC を別途持っている場合が多いと思います。そして、ssh クライアントは、概ねどの商用 OS でも標準装備になっています。

このため私は、PC から Raspberry Pi に ssh ログインして、コンソールで使う方法が、散らからなくて良いのではないかと思います。IaaS で仕事をする場合も、ssh ログインして使うパターンが多いのではないでしょうか。それと似ている、ということも良いと思います。つまり、特別感だとか、片付ける必要だとか、そういったものがなく、ハッスルしなくても 24 時間運用を試せる、ということが良いような気がします。

`ssh pi@raspberrypi.local` からはじめて、多分 tmux を最初に実行して CUI ながらマルチタスクができるようにし、エディタには vi を使いながら、じっくりとコマンドラインベースの Unix の世界の学習をしていく。それがいいな、と私は思います。

しかし、こういったシナリオでのチュートリアルは少ないように思います。「Raspberry Pi ではなくてもできる」ということから、そのようになっているのかもしれません。

Raspberry Pi を使って素直に Unix を学ぶ方法について、時間を見て探ってみたいと思っています。
macでpyenvの容量を削減してみた

## 概要
pyenvが占める容量の割合がやたら高かった(3GBくらいだった)ので，削減するための方法をいろいろ試してみた．

## pyenvの容量確認
### システム情報からの場合
デスクトップ右上の🍎マーク
->このMacについて
->ストレージ
->管理
->書類
->.pyenv

具体的な詳細は以下のリンクを参考にしてください
https://www.oyoshi.work/entry/mac-memory-system/


### ターミナルからの場合
「.pyenv」のディレクトリ下で以下のコマンド

```
$ du -sh
```

## [対処法1] バージョンの削除
インストールされているpythonのバージョンを確認する

```
$ pyenv versions
  system
  3.6.5
  3.7.0
* 3.7.4 (set by /Users/user/.pyenv/version)

```
今使ってるのは3.7.4なので，3.6.5と3.7.0を削除する．
(もし開発で複数バージョンを使い分けている場合は，間違って削除しないように注意する)

#### python 3.6.5の削除
```
$ pyenv uninstall 3.6.5
pyenv: remove /Users/user/.pyenv/versions/3.6.5? 
```
2行目が出てきたら「yes」もしくは「y」を入力してEnter.
その後，確認してみる．

```
$ pyenv versions
  system
  3.7.0
* 3.7.4 (set by /Users/user/.pyenv/version)

```

python 3.7.0も同様に行う．

<b>「結果」：<font Color="red">3.0GB -> 2.09GB(約1.0GBの削減)</font></b>

## [対処法2] ライブラリの削除
以下のコマンドで，pipでのライブラリ一覧を表示

```
$ pip freeze
```

表示されたライブラリの中からもう使ってないライブラリがあれば削除しちゃって良い．
自分だと「tensorflow」や「torch」とかの機械学習系のライブラリはいらないので消した．機械学習はGCPで回せば良いので．

以下のコマンドで，ライブラリ「tensorflow」の削除

```
$ sudo pip uninstall tensorflow
```

<b>「結果」：<font Color="red">2.09GB -> 1.21GB(約0.8GBの削減)</font></b>

## 結論
外付け買えばこんなことしなくていい．
【Laravel】画像アップロードしてデータベースに保存する際にファイル名の取得したい

###画像ファイルのファイル名の取得はgetClientOriginalName()

```php:form.blade.php
<form action="{{ route('upload') }}" method="post" enctype="multipart/form-data">
        @csrf
        <p><input type="file" name="character_image" class=""></p> // 画像に関するデータをcharacter_imageという名前で送る
        <p>
            <label for="name">名前</label>
            <input type="text" name="name" id="">
        </p>
        <p><button type="submit" name="submit">送信</button></p>
    </form>
```

`type="file"`でファイルを選択できるようになる。

それに`name="character_image"`としてとりあえず名前を与えてあげます。



###POSTで送られて来た値は、メソッドの引数の中のRequest $requestで受け取る

```php:controller
    public function upload(CharacterRequest $request){ // ( )中の記述で、POSTの値を受け取る
        // $name = $request->input('name'); // 下の方が短くてスマートですね
        $name = $request->name; // 入力した値はname属性の値に合わせて記述すれば取得できる
        $character_image = $request->file('character_image')->getClientOriginalName(); // 画像ファイル名を取得
        dd($character_image); // ***.pngなどの画像ファイル名が表示される。ちゃんと変数に入ってる！
    }
```

file('＊＊＊')
＊＊＊の部分に、type="file"と記述した部分の情報が送られてくる。

今回は、

```php:form.blade.php
<p><input type="file" name="character_image" class=""></p>
```

と記述していたので、ここで選択した画像ファイルの情報が入ってくる。

それに対してgetClientOriginalName()というメソッド（？）を実行することで画像選択するときにその画像につけている名前を取得することができる。


###スクールではClassを習っていない
スクールで習ったものだけだとClassを使うことはありませんでした。

なので`オブジェクト`という考え方が最初は全然わかりませんでした。というか今もほとんどわかっていませんが。

今のところの理解だと
`$hoge->title`で$titleという変数の値が取得できる
`$hoge->function()`でメソッド（関数）が実行できる

というくらい。

Laravelではもともと用意されているメソッドがいろいろあるけど、公式ドキュメントを見ても初心者にはよくわからない。。。
そのまま流用する分にはできるけど、応用が全く効かなくない！！

これもひたすら自分で
書く→出力→修正→出力
を繰り返すことで理解も深まっていくのでしょう。。。長い道のりだけど、思い通りになったときの感動といったら！
（初心者向け）JavaScript関数における引数の受け渡しについて

今回は関数の初学者向けに解説したいと思います。

私も最初につまずいたところですので、備忘録も兼ねて記述します。学習の手助けになれば幸いです。


## 関数における仮引数と実引数について

まず、関数を宣言する際、関数名の後ろに（）をつける必要があります。呼び出すときも同様です。

```javascript
function greet() {
 console.log(Hello!)
};

greet();
```

この（）は空でもよいのですが、引数を指定することもできます。

引数は英語で`argument`です。関数は引数を受け取って計算等に利用します。
では、以下の例を見てみましょう。

```javascript
function sum(a,b) {
 console.log (a+b)
};

sum(4,5);
```

この場合結果はどうなるでしょうか。4＋5で`９`ですね。

これは呼び出しの際、（）内の４と５がそれぞれ**関数で宣言したaとbに渡されている**からです。
ここでのaとbを**仮引数**、４と５を**実引数**と言います。関数は実引数を受けとって計算します。


##戻り値について

ついでに戻り値についても解説しましょう。
上では計算結果を単に`console.log`で出力しましたが、その結果を他のところで利用したい場合はどうすればいいでしょうか。そこで**return**が登場します。

```javascript
function sum(a,b) {
return a+b
};

const total= sum(4,5)/sum(1,2);

console.log(total);
```

関数の後に定数totalが出てきていますね。定数には**sumを使った計算式が代入されています。**
それぞれのsum（）の中に入っている引数が最初の関数に渡され、1番目は`９`、2番目は`３`という結果になります。

定数totalではそれらの数値を用いて計算が行われるため、**returnで数値を定数totalの計算式に返してあげます。**

これが**戻り値**です。結果は9を3で割って`３`ですね。

シンプルな例を上げましたが、これは基礎の基礎です。
複雑なコードになると引数の受け渡しが分かりにくいので、注意して読みましょう。

お読みいただきありがとうございました。
AWS Lambdaを使ってAPI簡単作成

# AWS Lambdaを使ってAPI簡単作成
## はじめに
AWS Lambda Function を使ってAPIを作成する方法をご紹介します。

## 前提
以下はすでに準備されている前提となります。
- AWSアカウント

## 手順
### 1. AWS Lambda関数作成
AWSにログインして、「サービス」→「コンピューティング」→「Lambda」と進みましょう。
そして、「関数の作成」をクリックして作成画面に進みます。
(初めてLmbda関数を作る場合は画面が異なるようです。)
![スクリーンショット 2020-08-21 10.49.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/10349a7a-678f-1c03-0b4d-012ed4143b8f.png)

今回は、「一から作成」、関数名を「SampleFunction」、ランタイムを「Node.js 12.x」とします。 

![スクリーンショット 2020-08-21 10.56.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/14dff8bb-30e3-32ac-a554-e6926720f16f.png)


そして、「関数の作成」をクリックすればとりあえずLambda関数が出来上がります。
作成されたデフォルトの関数コードは以下になります。

![スクリーンショット 2020-08-21 11.08.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/176091b5-fd8d-0a87-9ae8-fa48a4b3f126.png)


### 2. Lambdaテスト実行
まずは、テストイベントを作成します。
「テスト」をクリックしてください。

![スクリーンショット 2020-08-21 11.30.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/34be0630-e255-8a44-fbb5-1d053ad2f36b.png)

そして、今回はイベントテンプレートはそのままで、イベント名を「SampleFunctionTest」と設定します。
![スクリーンショット 2020-08-21 11.32.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/e513e231-e84a-d979-15cc-52cf0cf25abb.png)

入力できたら、「作成」をクリックしてテストイベントを作成します。

上記で作成したテストイベントが選択された状態で「テスト」をクリックすると以下のようにテストが実行され、ログを閲覧することができます。

![スクリーンショット 2020-08-21 11.36.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/4d1d0b59-1609-b221-e26a-6519f3aaa078.png)


### 3. API Gatewayのトリガー追加
「トリガーを追加」をクリックします。
![スクリーンショット 2020-08-21 11.39.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/f9e287cd-9941-0a54-a6b4-ccef4507a26d.png)

そして、以下のように新規のAPI設定を作成します。
![スクリーンショット 2020-08-21 11.47.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/34dda1b5-fcde-2924-4cb2-ed5ada770c54.png)

トリガーが作成できると以下のようになります。
![スクリーンショット 2020-08-21 11.49.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/1d3409d5-efa2-6235-b48f-52eee2464dd7.png)

### 4. 確認
API Gatewayをクリックします。
![スクリーンショット 2020-08-21 11.49.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/b3cbea88-23e9-bc72-9570-b6a53d878d03.png)

画面を下にスクロールするとAPIの詳細を見ることができます。
![スクリーンショット 2020-08-21 11.53.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290840/ee283389-26a1-6a81-6e93-8105a5e1906f.png)

APIのエンドポイントを叩いて以下のようなレスポンスがあれば成功です。

```
"Hello from Lambda!"
```

## 参考
- [５分でわかる！AWS Lambda の使い方](https://blog.apar.jp/web/10804/)