OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScript勉強会第4回(2022/02/21)　組み込みの型関数


初回　=> https://qiita.com/KuwaK/items/b5de29fe21af3724f316

TypeScriptには組み込みで使える便利な型関数がいくつかあります。
すべての組み込みの型関数の一覧は以下にありますが、よく使う便利なものだけ紹介します。
https://www.typescriptlang.org/docs/handbook/utility-types.html

### NonNullable<T>

指定された型から、nullやundefinedを取り除いた型を返します

```.ts
type T0 = NonNullable<string | number | undefined>;
// => string | number

type T1 = NonNullable<string[] | null | undefined>;
// => string[]
```

### Pick

指定された型から、指定した名前のメンバのみを抜き出した新しいObjectの型を返します。

```.ts
type = Todo {
  title: string;
  description: string;
  completed: boolean;
}
 
type TodoPreview = Pick<Todo, "title" | "completed">;
// => TodoPreview = {
//     title: "Clean room",
//     completed: false,
//    };
```

### Omit

Pickの逆で、指定された型から指定された名前のメンバを取り除いた新しい型を返します

```.ts
type Todo = {
  title: string;
  description: string;
  completed: boolean;
  createdAt: number;
}
 
type TodoPreview = Omit<Todo, "description">;
 
// => {
//   title: "Clean room",
//   completed: false,
//   createdAt: 1615544252770,
// };
 
```

### Partial

指定した型のメンバをすべてOptionalな型（存在しない可能性があるメンバ）に変換します。
デフォルト値が設定された関数の引数の型などに使用する場合が多いです

```.ts
type Todo =  {
  title: string;
  description: string;
}

type PartialTodo = Partial<Todo>
// => {
//     title?: string;
//     description?: string;
//    }
```

### Required

Partialの逆で、すべてのメンバを必須メンバに変換します。デフォルト値が設定された関数の引数をその関数内で呼び出したときなどは `Required<Aargs>` な型になっていることが多いです。

```.ts
type Props = {
  a?: number;
  b?: string;
}
 
type RequiredProp = Required<Props> 
// => {
//      a: number;
//      b: string;
//    };

```

### Record

Record型は任意の型のキーを持つObjectの型を返します。 `Record<string, 任意の型>` で、その型の連想配列の型付をすることができます。

```.ts

type User = {
  id; string
  name: string
  age: number
}

Record<string, User>
// => {
//      1: user1,
//      2: user2
//      ...
//    }

```

同じように連想配列を表す型に `{[key in string]:任意の型}` という、Mapped Typesを使った書き方がありますが、ちょっと読みにくいので、特に理由がなければ、`Record` を使ったほうが良いと思います。

### Parameters

指定した関数の引数の型をタプル型で返します。（配列ではないことに注意）

```.ts
 
type T0 = Parameters<() => string>;
// => []

type T1 = Parameters<(s: string) => void>;
// => [s: string]

type T2 = Parameters<<T>(arg: T) => T>;
// => [arg: unknown]

type F1 = (arg: { a: number; b: string }) => void;
type T3 = Parameters<F1>;
// => [arg: {
//      a: number;
//      b: string;
//    }]
```

### ReturnType

指定した関数の返り値の型を返します。

```.ts
 
type T0 = ReturnType<() => string>;
// type T0 = string

type T1 = ReturnType<(s: string) => void>;  
// type T1 = void

type T2 = ReturnType<<T>() => T>;     
// type T2 = unknown

type T3 = ReturnType<<T extends U, U extends number[]>() => T>;  
// type T3 = number[]

type F1 = () => { a: number; b: string };
type T4 = ReturnType<typeof F1>;     
// type T4 = {
//   a: number;
//   b: string;
// }
```
Nest(Node.js), Vue3, MySQL(Prisma), GraphQLで動かしてみる

##　環境構築
- Docker-compose

## Nest.js
- dockerコンテナ内で`npx nest new {APP_NAME}`　で新規プロジェクトを作成
- prismaの設定
 - `yarn add -D prisma` 
 - `yarn add @prisma/client` 
 - `yarn init`　で、生成されたファイルにテーブルの定義をしていく
 - 定義後に`npx prisma migrate dev`でデータベース作成
 - Nest.jsにデータを読み込ませるために、テーブルを更新したら、毎回マイグレーション後に`npx prisma generate`をする
- GraphQLの設定
 - [参考　Nest/GraphQL/schema-first](https://docs.nestjs.com/graphql/quick-start)

### error: GraphQLのversionは15系じゃないとうまく動かなかった
- リファレンス通りに実行すれば問題ない

## Vue3 (Vite)
- dockerコンテナ内で`npx init @vitejs/{APP_NAME}`　で新規プロジェクトを作成
- apollo(GraphQL)の設定
 - [参考　Vue3/apollo](https://v4.apollo.vuejs.org/guide/) 
 - [参考　GraphQL/code-generator](https://www.graphql-code-generator.com/plugins/typescript-vue-urql)
Laravel8(LaravelVite), Vue3, Nginxでdockerの環境構築する


## Docker環境を構築する
- Dockerfile, docker-compose.ymlを作成する

##　Lravevel (ver.8)
- プロジェクトファイルを作成する
 - `composer create-project laravel/laravel {APP_NAME}`
 - `composer require laravel/jetstream`
 - `php artisan jetstream:install inertia`
 - `npm install --save-dev vite @vitejs/plugin-vue`
- LravelViteをプリセットする
 - `npx @preset/cli laravel:vite` 

:::note warn
上記プリセットコマンドはうまく動かず、、、
手動で行う、、、
:::


>LaravelViteはLaravelMixの代わりになります。[参考　LaravelVite](https://laravel-vite.dev/guide/quick-start.html#installation-in-a-fresh-project)

## DBの要件定義

|Users||
|:-|-:|
|id|UNSIGNEDBIGINTEGER|
|name|VARCHAR|
|email|VARCHAR|
|email_verified_at|DATETIME|
|password|VARCHAR|
|remember_token|BOOLEAN|
|created_at|TIMESTAMP|
|updated_at|TIMESTAMP|

|Articles||
|:-|-:|
|id|UNSIGNEDBIGINTEGER|
|user_id|UNSIGNEDBIGINTEGER|
|title|VARCHAR|
|content|VARCHAR|
|created_at|TIMESTAMP|
|updated_at|TIMESTAMP|

|Tags||
|:-|-:|
|id|UNSIGNEDBIGINTEGER|
|article_id|UNSIGNEDBIGINTEGER|
|category|VARCHAR|
|created_at|TIMESTAMP|
|updated_at|TIMESTAMP|

|Comments||
|:-|-:|
|id|UNSIGNEDBIGINTEGER|
|user_id|UNSIGNEDBIGINTEGER|
|article_id|UNSIGNEDBIGINTEGER|
|content|VARCHAR|
|created_at|TIMESTAMP|
|updated_at|TIMESTAMP|

|Favorites||
|:-|-:|
|id|UNSIGNEDBIGINTEGER|
|user_id|UNSIGNEDBIGINTEGER|
|article_id|UNSIGNEDBIGINTEGER|
|created_at|TIMESTAMP|
|updated_at|TIMESTAMP|

|Comment_Likes||
|:-|-:|
|id|UNSIGNEDBIGINTEGER|
|user_id|UNSIGNEDBIGINTEGER|
|comment_id|UNSIGNEDBIGINTEGER|
|content|VARCHAR|
|created_at|TIMESTAMP|
|updated_at|TIMESTAMP|

|Follow_Users||
|:-|-:|
|id|UNSIGNEDBIGINTEGER|
|user_id|UNSIGNEDBIGINTEGER|
|following_user_id|UNSIGNEDBIGINTEGER|
|created_at|TIMESTAMP|
|updated_at|TIMESTAMP|

## 実装する
### query(param)をint型で取りたいがstr型になってしまう
- `('ANY_TYPE')$query`で任意の型に変換する
エッジAI端末を使ってみた 〜動体追跡編〜

## 概要
* データの発生源に近い場所でデータを処理する「エッジAIコンピューティング」が注目されている
* まず、エッジAIのおおまかな概念を理解し、実際にエッジAI端末を購入して使ってみる
* 今回はVisionWorksのFuture Trackerのデモの動作を確認する

## エッジAIとは何か
* 通常AI利用する場合は、センサーから収集された各種データはマイコンボードやスマホ、ネットワークを経由し  
、クラウド上や従来型のサーバーで解析処理を行う
* エッジAIを利用すると、センサーから収集された各種データはマイコンボードやスマホ内で解析される

![スクリーンショット 2021-11-05 9.57.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701445/c860f214-fb02-3180-c4a4-554e91e7371a.png)

## 用意するもの
* Jetson Nano開発者キット 2GB
* RaspberryPi4 対応 電源セット(5V 3.0A)　←Jetson Nanoにも使えます
* microSDカード(32GB以上推奨)
* HDMI接続のディスプレイ(4K推奨)

## インストール  
デモ環境のセットアップ
ホームディレクトリ ~/ にデモ環境をインストールする

```
# /usr/share/visionworks/sources/install-samples.sh ~/
```

ソースコードの状態なので、そのままでは実行できません。 make コマンドでコンパイルします。

```
# make -j4 # add dbg=1 to make debug build 
```
makeコマンドのオプション解説

* -j4 makeコマンドをマルチプロセッサ環境で高速化する  
　※この場合はジョブ数が4となります  
　※ ＃以降は、コメントです

![p21_04-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701445/0095c6f5-430e-3d0a-f39d-42c271fc3a4e.jpeg)

実行ファイルのあるディレクトリに移動する


```
# cd bin/aarch64/linux/release/
```

デモを実行する

公園を散歩している人や動物に追跡するよう水色の矢印が表示されており、
動く方向に向いていることが分かります。

```
# ./nvx_demo_motion_estimation
```

![IMG_0700.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701445/4a74459b-0e3f-35ce-3518-2915288f3cb2.jpeg)

![IMG_0701.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701445/7491fb27-0a8c-2ee8-f703-5dc885474093.jpeg)

![IMG_0702.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701445/72b5058b-3d82-0f77-a94b-8e19864758f9.jpeg)

任意の動画を読み込ませることもできます

```
# ./nvx_demo_motion_estimation --source=/home/jetson/Desktop/test.mov
```

自身で空撮した動画
水面が映っており、またカメラ自体も移動しているので処理が重い(20FPS程度)


![photo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701445/fad898cc-1177-898a-0507-3896bdcb696a.jpeg)


![IMG_0705.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701445/a347677a-30ad-cdc1-f0dd-eeb347ac64bf.jpeg)


![IMG_0706.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701445/57c5fb0b-8f78-8c06-120a-b565af8bb8ee.jpeg)

![名称未設定 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701445/23f7b0c6-8785-eba7-79f0-c501fee7a753.gif)

## 検証を終えて
* ドローンを固定した場合と飛行させた場合の動作の違いを検証したい。
* 対象が小さすぎた。どの程度の大きさなら検出が上手く行われるのかを検証したい。
* 常に動きがある水面（自然物）の処理が原因で処理が重くなっていることが分かった。
* 追跡結果を操縦者にフィードバックすれば操縦の補助に利用できるかもしれない。
[Go] Structの子要素を親要素のポインタで変更できるのか

## はじめに
Structのポインタを渡して中身を変更するときに子要素のStructの中身も変更できるのか分からなかったので検証しました。

バージョン：Go 1.16

## 検証
```go
package main

import "fmt"

type Child struct {
	AAA string
}

type Parent struct {
	BBB   string
	Child Child
}

func changeParent(p *Parent) {
	p.BBB = "ccc"
}

func changeChild(p *Parent) {
	p.Child.AAA = "ddd"
}

func changeChildDirect(c *Child) {
	c.AAA = "eee"
}

func main() {
	c := Child{
		AAA: "aaa",
	}

	p := Parent{
		BBB:   "bbb",
		Child: c,
	}

	fmt.Println(p)
	// {bbb {aaa}}

	changeParent(&p)

	fmt.Println(p)
	// {ccc {aaa}}
    // これは当然変わる

	changeChild(&p)

	fmt.Println(p)
	// {ccc {ddd}}
    // 子要素もちゃんと変わった

	changeChildDirect(&c)

	fmt.Println(p)
	// {ccc {ddd}}
    // オブジェクトを渡した時点で中身がコピーされるのか、元の子要素を変えてもここは変わらない。
}

```

## 結論
親要素のポインタで子要素のStructの中身も変わる。
40 代おっさん GASのSpreadsheetAppクラスについて学ぶ

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## SpreadsheetAppクラス

SpreadsheetAppクラスとは
Spreadsheetサービスの最上位に位置するオブジェクト

|メンバー|戻り値|説明|
|--------|------|----|
|create(name)|Spreadsheet|新しいスプレッドシートnameを作成する|
|flush()|Void|スプレッドシートの保留中の変更を適用する|
|getActiveRange()|Range|アクティブなセル範囲を収得する|
|getActiveSheet()|Sheet|アクティブなシートを収得する|
|getActiveSpreadSheet()|Spreadsheet|アクティブなスプレッドシートを収得する|
|getCurrenCell()|Range|現在のセルを収得する|
|getUi()|Ui|スプレッドシートのUiオブジェクトを取得する|
|open(file)|Spreadsheet|ファイルfileをスプレッドシートとして取得する|
|openById(id)|Spreadsheet|指定したidのスプレッドシートとして取得する|
|openByUrl(url)|Spreadsheet|指定したurlのスプレッドシートとして取得する|
|setActiveRange(range)|Range|セル範囲rangeをアクティブにする|
|setActiveSheet(sheet)|Sheet|シートSheetをアクティブにする|
|setActiveSpreadsheet(newActiveSpreadsheet)|void|するnewActiveSpreadsheetをアクティブにする|
|setCurrentCell(cell)|Range|セルcellを現在のセルにする|

### スプレッドシートを取得する

スプレッドシートを収得する主な方法

・アクティブなスプレッドシートを取得する
・IDでスプレッドシートを取得する
・URLでスプレッドシートを取得する

#### アクティブなスプレッドシート

アクティブなスプレッドシートとは
スクリプトにバインドされているスプレッドシートを指す

構文

```javascript
SpreadsheetApp.getActiveSpreadsheet()
```

アクティブなオブジェクトを取得するメソッドは、コンテナバインドスクリプトでのみ使用できる。

＊コンテナバインド型は、スプレッドシートやドキュメント、フォームなどのGoogleのサービスに紐づく、Google Apps Scriptのスクリプトです。

バインドされていないスプレッドシートを収得sる場合は、別の方法が必要
その主な方法
IDにより収得する　openByIdメソッド

構文

```javascript
SpreadsheetAPP.openById(ID)
```

URLにより収得する　openByUrlメソッド

構文

```javascript
SpreadsheetApp.openByUrl(URL)
```

スプレッドシートはGoogleアプリケーションのアイテムは、URLが定められており、そのURLにアクセスすることでブラウザ上で開くことが出来る。
GASでも同様で、URLを知っているいれば、スクリプトから指定のスプレッドシートを収得できる。
IDはそのURLの一部を構成している。

```javascript
https://docs.google.com/spreadsheets/d/{ID}/edit#gid=0
```

お試し

```javascript
function toshiki4() {
  const ssActive = SpreadsheetApp.getActiveSpreadsheet();
  console.log(ssActive.getName());

  const url = 'https://docs.google.com/spreadsheets/d/××××××××/edit#gid=0'
  const ssByUrl = S×preadsheetApp.openByUrl(url);
  console.log(ssByUrl.getName());

  const id = '1OEin_rjSrOCukOhxJ5Lsu2SxRSVF8PHzc2MCu-cYG4o';
  const ssByid = SpreadsheetApp.openById(id);
  console.log(ssByid.getName());
}
```

＊メソッド実行によるGoogleアプリケーションへのアクセスは実行時間が遅いという事実がある。
GASでは実行時間に関する厳しい制限がある。
Googleアプリケーションへアクセスをするメソッドの実行回数はできる限り減らすのが望ましい。

コンテナバインドスクリプトであれば、アクティブなシートを直接収得する方法としてgetActiveSheetメソッドを使うことができる。

構文

```javascript
SpreadsheetApp.getActiveSheet()
```

お試し

```javascript
function toshiki4() {
  const sheet = SpreadsheetApp.getActiveSheet();
  console.log(sheet.getName());
}
```

＊複数のシートが存在している場合は、スクリプトから見て「どのシートがアクティブか」想定できないので注意
原則としてスプレッドシートが1つしかない場合、ブラウザでシートを開いている時のみ実行する。スクリプトの使用に限る。

## 参考資料

<https://www.amazon.co.jp/s?k=google+apps+script+%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80&adgrpid=110264232688&gclid=CjwKCAiA9aKQBhBREiwAyGP5lSl7AJJLCvOEHb4wQgMlyqW1fll5X8GDTT_Rkd1_soUAyIPMXQr26hoClHEQAvD_BwE&hvadid=553833563682&hvdev=c&hvlocphy=1009076&hvnetw=g&hvqmt=b&hvrand=4378489642044417389&hvtargid=kwd-594191211348&hydadcr=4106_13159878&jp-ad-ap=0&tag=googhydr-22&ref=pd_sl_2x1owglv0s_b_p52>
独自のThemeを作るときの注意点

色とか全体にRippleの指定とかしたい時にThemeを作るけどもComposableの順で指定したRippleが消えたので注意点。

``` kotlin
@Composable
fun MyTheme(
    themeType: ThemeType,
    content: @Composable () -> Unit,
) {
    val color = themeType.colorPalette
    CompositionLocalProvider(
        localMyColors provides color,
        LocalRippleTheme provides MyRippleTheme
    ) {
        MaterialTheme {
            content()
        }
    }
}
```

こうするとMaterialThemeのなかでLocalRippleThemeを上書きしてしまい、せっかく指定したMyRippleThemeが効かなくなる

正しくはこうする

``` kotlin
@Composable
fun MyTheme(
    themeType: ThemeType,
    content: @Composable () -> Unit,
) {
    val color = themeType.colorPalette
    MaterialTheme {
        CompositionLocalProvider(
            localMyColors provides color,
            LocalRippleTheme provides MyRippleTheme
        ) {
            content()
        }
    }
}
```
Azure DevOps Server で Git の master ブランチへの直接コミットを禁止する

# 概要

Azure DevOps Server で Git の master ブランチへの直接コミットを禁止する方法を記載します。

# 手順

## 1. 該当の Azure DevOps Server プロジェクトで「設定」－「Repos」－「リポジトリ」を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/f4beab56-59d4-c954-1433-4de013f58c56.png)


## 2. 「ブランチ」－「master」を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/32e089eb-58bf-75d9-564a-772fcc9e5f4b.png)

## 3. 「ポリシー」を選択するとmasterブランチのポリシー設定画面が開きます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/7e8466d5-8278-3cbb-8689-d9c932b3811a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/fdea5a66-5fe9-f5ab-0591-85e263747948.png)

## 4. とりあえず直接コミットを制限したいのであれば、次の「マージのタイプを制限する」にチェックし、マージタイプはすべてチェックONの状態とします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/81ec1965-3c99-4426-67f6-d1ed99422d12.png)

## 5. オプションとして、レビュー担当者を制限したい場合は、「レビュー担当者の最少数が必要です」にチェックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/5f7219ed-826d-c46c-08cb-55a685b13ccb.png)

# 参考

https://docs.microsoft.com/ja-jp/azure/devops/repos/git/branch-policies?view=azure-devops&tabs=browser
laravelで作成したポートフォリオをherokuでデプロイした

ポートフォリオをherokuでデプロイするために、
まず任意のフォルダを作成→heroku

その後、アップロードしたいherokuファイルを
git clone (url)
でファイルに取り込む。
その際cloneしたファイル以外は削除する。

その後、app/Providers/AppServiceProvider.php
public function boot()
    {

        \Schema::defaultStringLength(191);

        if (\App::environment('production')) {
            \URL::forceScheme('https');
        }
    }

を記述。

次に、
heroku create 作成したい名前 --buildpack heroku/php

コマンドを実行herokuに新規ファイル作成。

その後,
git init

heroku git:remote -a heroku上に作成したファイル名

git add .

git commit -m

git push heroku main

heroku addons:add cleardb

heroku config:get CLEARDB_DATABASE_URL
mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true

heroku config:set DB_DATABASE=[データベース名]
heroku config:set DB_HOST=[ホスト名]
heroku config:set DB_USERNAME=[ユーザー名]
heroku config:set DB_PASSWORD=[パスワード]

composer install
heroku config:set APP_KEY=$(php artisan key:generate --show)
heroku config:set APP_NAME=laravelquestions
heroku config:set APP_ENV=heroku

heroku run php artisan migrate
heroku open
「setInterval」一定間隔で繰り返し実行

_コード構文_

```
setInterval(「関数①」,「秒数」);
```
この関数setIntervalは
「一定間隔（「秒数毎」）で関数①を呼び出し続ける」
というものです。
実際に例でどういうものかを見ていきます。

_コード例_

```
function console1(){
  console.log("tagotyan");
}
setInterval(console1,300);
```
上記記述は
・コンソールに「tagotyan」という文字列を出力する関数を定義。
・setInterval関数を使用して「関数①」に「console1関数」を、「秒数」に「３００」を記述しています。
・「0.３秒に一回「tagotyan」をコンソールに出力し続ける」という意味になります。
ここでの「３00」は0.３秒、仮に「1000」だと１秒ですね。

次は二次元配列で定義した変数をランダムで呼び出し続ける時の注意点です。

_ランダム変数コード構文_

```
let 二次元変数名=[[],[]];
let 乱数変数名=Math.floor(Math.random()*(二次元変数名.length));
```
_ランダム変数一定間隔呼び出し関数コード構文_

```
function 関数名(){
  console.log(二次元変数名[乱数変数名]);
}
setInterval(関数名,秒数);
```
このコードでは
・配列の中に配列がある二次元配列の変数を定義。
・後に出力する用の配列番号を乱数で呼び出せるように乱数変数名を定義。
・二次元配列を乱数で出力する関数を定義。
・setInterval関数を使用して「関数①」を「秒数」毎に呼び出し続ける。
という内容です。
「Math.random()」では小数点以下しかランダムで出ないため、
「二次元変数名.length」を使って二次元配列の数をかけることにより１の位に乱数を適用させ、
それを「Math.floor()」で小数点以下を切り捨てています。

このコード構文も実際に例でどういうものかをやりますが、
失敗例と成功例の２つを見ていきます。

_失敗コード例_

```
let sample=[["tagotyan"],["tagokun"]];
let randomSample=Math.floor(Math.random()*(sample.length));
function console1(){
  console.log(sample[randomSample]);
}
setInterval(console1,300);
```
この二次元配列と乱数定義を関数外に出しているコードだと、
最初の一回のみ乱数で二次元配列変数「sample」が出力され、
後は一度取得した変数「sample」を0.3秒毎に出力し続けるため、
0.3秒毎に最初の一回と同じものが出力し続けてしまいます。

_成功コード例_

```
function console1(){
  let sample=[["tagotyan"],["tagokun"]];
  let randomSample=Math.floor(Math.random()*(sample.length));
  console.log(sample[randomSample]);
}
setInterval(console1,300);
```
このように関数内に、二次元配列と乱数定義を入れて定義していることで、
関数「console1」を０.３秒毎に呼び出し続けるたびに、
乱数定義により、毎回「tagotyan」「tagokun」をランダムで出力できるようになりました！
AtCoder Beginner Contest 240 参戦記

# AtCoder Beginner Contest 240 参戦記

## [ABC240A - Edge Checker](https://atcoder.jp/contests/abc240/tasks/abc240_a)

4分で突破. 書くだけ.

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

if (a + 1 == b) or (a == 1 and b == 10):
    print('Yes')
else:
    print('No')
```

## [ABC240B - Count Distinct Integers](https://atcoder.jp/contests/abc240/tasks/abc240_b)

1分半で突破. 書くだけ. というか、種類数を数える問題何度目だ. 頻出にもほどがある.

```python
N, *a = map(int, open(0).read().split())

print(len(set(a)))
```

## [ABC240C - Jumping Takahashi](https://atcoder.jp/contests/abc240/tasks/abc240_c)

4分で突破. C問題で DP 出るのかあと思った.

```python
from sys import stdin

readline = stdin.readline

N, X = map(int, readline().split())
t = set([0])
for _ in range(N):
    a, b = map(int, readline().split())
    u = set()
    for x in t:
        u.add(x + a)
        u.add(x + b)
    t = u

if X in t:
    print('Yes')
else:
    print('No')
```

## [ABC240D - Strange Balls](https://atcoder.jp/contests/abc240/tasks/abc240_d)

9分で突破. 数値と幾つ連続で並んでいるかの2つ組のリストを管理すればいいだけですね.

```python
N, *a = map(int, open(0).read().split())

q = []
c = 0
result = []
for x in a:
    if len(q) == 0 or q[-1][0] != x:
        q.append((x, 1))
        c += 1
    else:
        n = q[-1][1]
        if n == x - 1:
            q.pop()
            c -= n
        else:
            q[-1] = (x, n + 1)
            c += 1
    result.append(c)
print(*result, sep='\n')
```
railsの削除機能 destroyが機能しない原因と解決策

railsの削除機能が効かないのは
javascriptのjqueryが効いていないのが原因でした。
なので、以下のようなコードをapplication.jsに追加すると
削除機能が動くようになりました。

```javascript:application.js
//= require jquery
//= require jquery_ujs
```

https://qiita.com/ytleoo/items/6fa36f4f3e5b05df7b13

それでも動かない場合はこちらを試すと正常に動きました。

Railsのセキュリティー機能CSRFが動いているため

以下のように書き直すと動きました。



```rails:rails
link_toではなくbutton_toにする
<%= button_to '削除', board, class: 'btn btn-outline-dark', method: :delete %>
```

https://qiita.com/mami3sansan/items/6a9710b3ffdc937aa5f3
CCNAの勉強0

勉強開始:2022.2.3-
きっかけ:何となく興味が沸いたから。じゃあとりあえず勉強してみるか、向いてるなら自然と勉強も続くはず、というところ。
目標:3月下旬までに合格。
勉強方法:Udemyの講座を聴きながら、Ping-tで問題を解く。恐らく最もオーソドックスな方法。
進捗:Udemy Section13 STPまで

Qiitaには理解不十分な部分をメモとして残していきます。
2022/2/21主にITとかセキュリティの記事

【記者のひとこと】対処すべき5％の脆弱性(2/18)
https://www.bcnretail.com/market/detail/20220218_267071.html

iPhoneのSafariで表示されるプライバシーレポートとは｜見方と危険性を解説(2/18)
https://news.nifty.com/article/technology/techall/12276-1477759/

メモアプリから口座ID不正入手し送金容疑　大学生を再逮捕　愛知県警(2/17)
https://www.ctv.co.jp/news/articles/b68zqpyey8nim5m6.html

知られざる「IT拠点ウクライナ」の企業が直面する危機的状況(2/18)
https://forbesjapan.com/articles/detail/45922

ウクライナ危機：ロシアのサイバー攻撃に備えは必要、パニックは不要(2/19)
https://japan.zdnet.com/article/35183736/

TwitterでDMを削除する方法 - 送信取消（相手側も消去）はできない？(2/18)
https://news.mynavi.jp/article/20220218-2275723/

ブラウザの「バージョン100」問題、Yahooなど大手サイトにも影響があることが判明(2/18)
https://iphone-mania.jp/news-438847/

『個人情報漏洩被害公表と株価の変化に関する調査レポート』を発表(2/17)
https://www.jiji.com/sp/article?k=000000267.000009107&g=prt

【コラム】創業者の派手な発言は会社のためになっているのか？(2/18)
https://jp.techcrunch.com/2022/02/18/2022-02-17-when-the-founder-becomes-the-story/

【米国初】QKD量子暗号通信の実用性を金融アプリで確認　東芝アメリカ社とJPモルガン･チェース、シエナの3社が連携(2/19)
https://robotstart.info/2022/02/19/toshiba-usa-qkd-quantum.html

Mac搭載T2セキュリティチップの脆弱性判明！パスワード解析ツールでロックアウト回避される(2/18)
https://www.appps.jp/362494/

Metriportは自分の様々な行動を数値化し相関性を探って自己改善を図れるアプリ(2/19)
https://jp.techcrunch.com/2022/02/19/2022-02-17-metriport-merrily-measures-your-me-verse/

FirefoxとChromeのバージョンが初の3ケタ「100」になるとユーザーエージェント文字列が原因で一部のサイトが破損する可能性があるとの警告 - GIGAZINE(2/19)
https://newstopics.jp/url/19457463

Apple、iOS15.3の署名停止。iOS15.3.1からのダウングレードは不可に(2/18)
https://iphone-mania.jp/news-438849/

プエルトリコが米「暗号資産ハブ」に。“タックスヘイブン”への相次ぐ移住で超富裕コミュニティーが増殖(2/19)
https://ampmedia.jp/2022/02/19/puerto-rico-crypto-assets/

Apple「AirTag」悪用対策強化に「なぜ最初からしなかった？」疑問の声(2/18)
https://news.nifty.com/article/item/neta/12277-1477615/

ウェブ3プロトコルの有望性を見極める方法(2/19)
https://www.coindeskjapan.com/139836/

大学生が航空追跡システム開発　身の危険感じた米テスラCEOと金銭取引も？(2/19)
https://news.nicovideo.jp/watch/nw10553503

「金融分野におけるサイバーセキュリティ強化に向けた取組方針」のアップデートについて(Ver. 3.0)(2/18)
https://www.fsa.go.jp/news/r3/cyber/torikumi2022.html

Windows 11ミニTips 第47回 OneDriveの「この日の思い出」を無効にする(2/19)
https://news.nicovideo.jp/watch/nw10553184

Teamsのチャットの削除方法とは? 相手側への通知や復元方法も(2/19)
https://news.mynavi.jp/article/20220219-2259133/

Binanceが規制当局の要請に応じ「イスラエルに焦点を当てたすべての活動」を停止(2/18)
https://nextmoney.jp/?p=48282
WSLのUbuntu20.04にsystemctlを導入するには！？

Windowsに環境を入れたいと思いPostgreSQL、nginxを導入したが、「systemctl」がない！？となり10分程ハマったので自分用の記録のため記載。

参考サイト(以下サイトを参照することで解決します):
https://info.nikkeibp.co.jp/media/LIN/atcl/books/040200025/
https://snowsystem.net/other/windows/wsl2-ubuntu-systemctl/

nginxの状態が見たかったので「systemctl」コマンドを実行しましたが以下のようにメッセージが出てしまった。

```
$ systemctl status nginx
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
```

まず、psコマンドで「PID 1」がどうなっているのかを調べた。

```
$ ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   1744  1088 ?        Sl   02:17   0:00 /init
```

「init」が「PID 1」になっていることが判明。調べたところ「systemd」を「PID 1」で動作させる必要がある。
そこで以下URLの手順を実施していった。
https://snowsystem.net/other/windows/wsl2-ubuntu-systemctl/

以下で「Permission denied」となった。「vimで記載すればええわ」とvimで記載。

```
$ cat << EOF > /etc/apt/sources.list.d/wsl-transdebian.list
 deb https://arkane-systems.github.io/wsl-transdebian/apt/ $(lsb_release -cs) main
 deb-src https://arkane-systems.github.io/wsl-transdebian/apt/ $(lsb_release -cs) main
 EOF
-bash: /etc/apt/sources.list.d/wsl-transdebian.list: Permission denied
```

vimで記載して「sudo apt update」した。「Error」!?、「アカンのかいな！！」声がでてしまった。
なんでやねんと思いつつ調べた。

```
$ sudo vi /etc/apt/sources.list.d/wsl-transdebian.list

$ sudo apt update
Ign:1 https://arkane-systems.github.io/wsl-transdebian/apt $(lsb_release InRelease
Hit:2 https://packages.microsoft.com/ubuntu/20.04/prod focal InRelease
Err:3 https://arkane-systems.github.io/wsl-transdebian/apt $(lsb_release Release
  404  Not Found [IP: ●●●]
Hit:4 http://archive.ubuntu.com/ubuntu focal InRelease
Get:5 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Get:6 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
Get:7 http://archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB]
Hit:8 http://apt.postgresql.org/pub/repos/apt focal-pgdg InRelease
Reading package lists... Done
E: The repository 'https://arkane-systems.github.io/wsl-transdebian/apt $(lsb_release Release' does not have a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
```

以下サイトに同じような内容が記載されている！！！ここの「wsl-transdebian.list」を追記してみたらいけそう！！
https://info.nikkeibp.co.jp/media/LIN/atcl/books/040200025/

おー、できたわ。試しに「postgresql」で実行してみた。

```
$ systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Mon 2022-02-21 03:14:30 JST; 6min ago
   Main PID: 329 (code=exited, status=0/SUCCESS)
      Tasks: 0 (limit: 7049)
     Memory: 0B
     CGroup: /system.slice/postgresql.service
```

めっちゃええサイトがあるもんやなと思った。感謝です。
※なんで「nginx」ちゃうねんに関しては、特に意味はない。
【基本】C言語の標準入力・標準出力とは

C言語の標準入出力とは何かということをなるべく行間を作らずに解説しようという記事です。

ひとことで言えば、標準入出力とは、デバイスやプロセスの入出力のうち、アプリケーションで標準的に利用される入出力のことです。ターミナルでは、ユーザーのキーボード入力を標準入力としてアプリケーションに入力し、アプリケーションからの標準出力は画面に表示するようになっています。Unix/Linuxではデバイスやプロセスの入出力を、ファイルへの書き込み・読み込みとして扱います。従って、標準入出力もファイルの書き込み・読み込みの一種と捉えることができます。


## 例
次のようなプログラムを考えます。

```c
#include <stdio.h>

int main(){
    char data[16];
	scanf("%s", data);
	printf("%s\n", data);
    return 0;
}
```

実行結果

```
$ ./a.out
Hello (自分で入力する) 
Hello
```

このプログラムを実行するとハングし、文字列を入力しエンターキーを押すと先程入力した文字列をそのまま返します。このとき、入力した文字列`Hello`は標準入力であり、出力された文字列`Hello`は標準出力です。

実はこの標準入力・標準出力はファイルへの書き込み・読み込みとして実装することができます(しかもそちらの方が本質的です)。どういうことでしょうか？このことを理解するには次の節で説明するファイルの書き込み・読み込みの知識が必要です。

# ファイルの書き込み・読み込みとファイルディスクリプタ
ファイルの書き込み・読み込みをするためには、ファイルを開く必要があります。オペレーティングシステムは開かれたファイルの状態を**オープンファイル記述**と呼ばれる構造体に保存します。オープンファイル記述は、現在ファイル内部のどの場所を読んでるか（あるいは書き込んでいるか）を示すオフセット値、ファイルが読み・書き・読み書き両方のうちどの利用目的でアクセスされているかを示すアクセスモードなどを含んでいます。

オープンファイル記述は現在オペレーティングシステムが開いているファイルの分だけあるわけですが、このオープンファイル記述を指し示す整数のことを**ファイルディスクリプタ**と言います。ファイルディスクリプタとオープンファイル記述の対応関係は**ファイルディスクリプタテーブル**に保存されます。ファイルディスクリプタテーブルはプロセスごとに独立に存在しています。

## 例
次のプログラムを考えます。あらかじめ`Hello`と入力したテキストファイル`a.txt`を用意しておきます。

```c
#include <stdio.h>
#include <fcntl.h>

int main(){
    // "a.txt"を開く。第２引数はアクセスモードで、今回は読み込みO_RDONLYを指定
    // フラグO_RDONLYはfcntl.hで定義されている
    // fdはファイルディスクリプタ
    int fd = open("a.txt", O_RDONLY); 

	printf("%d\n", fd);
    return 0;
}
```

実行結果

```
$ ./a.out
3
```

この場合、ファイルディスクリプタは`3`であることがわかりました 。
このファイルディスクリプタを用いてファイルの読み込み・書き込みができます。

- 読み込み

```c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h> 

int main(){
    int fd = open("a.txt", O_RDONLY); 

    // ファイルディスクリプタを表示
	printf("%d\n", fd);
    
    // ファイルを読み込んだデータを保存する為の配列を定義
    char buf[32];

    // 現在のオフセット(ファイルの先頭)から32バイト分だけファイルを読み込んで、bufに書き込む
    // char1文字は1バイトなので32文字読取ることになる
    read(fd, buf, 32); 
    printf("%s\n", buf);
    return 0;
}
```

実行結果

```
$ ./a.out
3
Hello
```

- 書き込み

```c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h> 

int main(){
    int fd = open("a.txt", O_WRONLY); 

    // ファイルディスクリプタを表示
	printf("%d\n", fd); 

    //書き込み用のデータの用意。多めに32バイト分確保。
    char buf[32] = "Hello, World!"; 
    
    //現在のオフセット(ファイルの先頭)から32バイト分だけファイルに書き込む
    write(fd, buf, 32); 
    return 0;
}
```

実行結果

```
$ ./a.out
3
$ cat a.txt
Hello, World!
```

# 標準入力・標準出力・標準エラー出力とは
いよいよ本題です。**標準入力・標準出力・標準エラー出力とは、それぞれのファイルディスクリプタが`0`, `1`, `2`の読み込み・書き込みのことです。**　というこは、冒頭の入力した文字列をそのまま返すプログラムも`read()`, `write()`関数で書き換えることができるはずです。やってみましょう。

```c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h> 

int main(){
    char buf[32];
    // ファイルディスクリプタを0に指定することで標準入力を読み込む
    read(0, buf, 32);
    // ファイルディスクリプタを1に指定することで標準出力を書き込む
    write(1, buf, 32); 
    return 0;
}
```

実行結果

```
$ ./a.out
Hello (自分で入力する) 
Hello
```

確かにファイルディスクリプタを`0`に指定することで標準入力を読み込み、ファイルディスクリプタを`1`に指定することで標準出力を書き込むことがわかりました。


# 最後に

間違っている点があればお知らせください。
Android Studio から Kotlin Script (*.kts) を実行する


Kotlin 1.3.70 から Kotlin Scripting に対応しています。

https://github.com/Kotlin/kotlin-script-examples/blob/master/jvm/main-kts/MainKts.md

Android Studio からも、`*.main.kts` ファイルを設置するだけで Kotlin を Script として実行可能です。

Android Studio から Kotlin Script を使用する手順を解説します。

## `*.main.kts` スクリプトの設置

`{任意のファイル名}.main.kts` の形式で Kotlin Script を設置します。`.main.kts` 以外の suffix では動かないので、必ず `.main.kts` としてください。

サンプルとして以下のファイルを設置します。

`script.main.kts`

```kotlin
//@file:Repository("https://example.com/maven")
@file:DependsOn("com.ibm.icu:icu4j:70.1")

import com.ibm.icu.text.BreakIterator

fun CharSequence.displayLength(): Int {
    val iterator = BreakIterator.getCharacterInstance()
    iterator.setText(this.toString())
    var count = 0
    while (iterator.next() != BreakIterator.DONE) {
        count++
    }
    return count
}

println("🧑‍🦰".displayLength())
```

## スクリプトの実行

`script.main.kts` を右クリックして `Run 'script.main.kts'` からスクリプトを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17931/c778dade-16cf-2d23-8b45-c922416a7add.png)

スクリプトの実行結果が Run ウィンドウに表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17931/65c62c3d-9fad-a6ec-6612-0fef4c4d0e05.png)

1 度実行すると、次からは Run Configuration に登録された履歴から実行できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17931/e3c0b1e1-8a6d-abba-f735-59b6164853d3.png)

## スクリプトの実行 (プロジェクトをビルドしない)

> 2022/08/02: コメントで教えていただいて手順を更新しました

現時点の intelliJ Kotlin Plugin (211-1.6.10-release-923-AS7442.40) では、上記の Kotlin script としての実行では、開いているプロジェクト全体をビルドしてしまいます。

Run Configurations から Before launch の Build を削除するとプロジェクト全体のビルドなしで Kotlin script を実行できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17931/d590a641-7d2a-2162-bd8c-7104c84cf166.png)

## 外部依存設定

以下の設定により、Kotlin Script から外部のライブラリを利用することができます。

mavenCentral リポジトリは定義を省略しても依存解決に使えるようです。

| 実装 | 説明 |
| --- | --- |
| `@Repository("...")` | 外部 Maven リポジトリの定義 |
| `@DependsOn("...")` | 外部 Maven ライブラリの依存定義 |
| `@Import("...")` | 他の Kotlin Script を読み込む |

詳しくは以下のドキュメントを確認してください。

https://github.com/Kotlin/KEEP/blob/master/proposals/scripting-support.md#kotlin-main-kts
Emacsのモードラインにヒヨコを入れた

## モードラインのメジャーとマイナーを仕舞っちゃおう

クリックできるし、枠がスッキリして見てて辛くないし良き。
ひよこ可愛い。
黄色にするのに苦労した。

![モードラインにひよこ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23434/c8ad76ba-794a-74fa-6170-4c82df7d9623.jpeg)



### メジャーは mode-icon
### マイナーは miniones
### コード

init.el 抜粋と書いてるけど、実際には initローダーでモードライン用のelを読み込んでます。
ずらずら書いてあるのを把握するだけの脳キャパないんですよ〜。
これ、そのままコピペしてあるので、絵文字フォント入れてあればそのまま表示されるはず！
Font Awesomeだったっけ・・・。

```emacs-lisp: init.el 抜粋
;; 編集中ファイルのアプリアイコンを表示する
(leaf mode-icons :ensure t
  :custom (mode-icons-grayscale-transform . nil)
  :config (mode-icons-mode))

;; マイナーモードのずらずら並んでるのを隠してくれる。クリックできる
;;   
;;   ﬥ  ﮃ    ﬡ        ﮂ ﳀ   﫜              
;;                
(leaf minions :ensure t
  :custom
  ;;(minions-mode-line-delimiters . nil)
  (minions-mode-line-delimiters . '("" . ""))
  (minions-mode-line-face . '((:inherit font-lock-comment-face :slant normal :foreground "yellow")))
  (minions-mode-line-lighter . "")
  :config
  (minions-mode))

;; (if window-system
;;     (progn
```
設計パターンとは ios

# 設計パターン

設計パターンについて初めて調べたので記録のために残しておきます🐒

## 🦄what
一言で言うと、**「どういうパターンでシンプルにするか」**の設計のこと。
![what_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569820/e507188b-57c5-ffb6-351d-4fc75e089a85.png)

アプリ開発に慣れてくると、機能も多くなりコードを１つのファイル等に書きまくってFatViewControllerになってしまうことがあると思います。そんな時に設計パターンを意識することでみやすいコード、プロジェクトにすることができるのです。

設計パターンは別名アーキテクチャとも言います。今回はiosでの設計パターンを書きますが、他の言語においても概念としては同じことが言えます！

# 🦄Specific pattern
ここからは具体的なパターンを紹介していきます。

##① MVC (iosでは cocoaMVC ともいう)
###特長：Viewとmodelを分けるパターン

**Model：**UIに関係しない純粋なビジネスロジックを書く
**View：**UIに関するロジックを書く
**Controller：**ModelとViewを参照する。仲介人。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569820/5441ccd8-6b47-002d-2635-517e14803c32.png)


##② MVP

**Model：**UIに関係しない純粋なビジネスロジックを書く (MVCの時と同じ)
**View：**ユーザーの操作を受けて、画面表示についてのみ書く
**Presenter：**ModelとViewを参照する。仲介人。

**〜MVCとの違い〜**
MVCではViewControllerにまとめられていた部分を、「描画処理」と「プレゼンテーション」に分けている。

　　描画処理：label.text = name やtableView.reloadData()など普通の描画
　　プレゼンテーション：ビュー更新や画面遷移

##③ MVVM
**Model：**UIに関係しない純粋なビジネスロジックを書く (MVCの時と同じ)
**View：**UIイベントを受け付けてViewModelに伝える。ViewModelを監視し、その状態更新を受けて描画処理を行う。
**ViewModel**Viewからの指示を受け、Modelの処理を呼び出す。Modelからの状態更新を受け取り、自身の状態を更新。Viewに表示するためのデータを保持する。

〜MVVMを理解するのに必要な知識〜
　　データバインディング：ViewModelを監視して、その状態を受けて描画処理を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569820/d03fdebb-4cc9-7620-a5b2-9a4e638d95ba.png)

##④ Flux
###特長：Fluxでは常に単一方向でデータフローが生成される
→そのため、ため、アプリケーションの複雑化を防ぐことができます。また、チーム開発などでもフローを追いやすく、保守性の高いコードが書ける。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569820/4159a6bc-b34d-7646-7e80-4a63009e15de.png)


**Action：**：実行する処理を特定するためのtypeと、それに関連するdataがセットになったもの。
**Dispatcher：**Actionを受け取り、その値をStoreに伝える役割。
**Store：**:Dispatcherから伝わってきたActionを受けて、自身の状態を更新して通知。
**View：**Storeの状態を監視し、その状態更新を受けて画面を更新。

#🦄まとめ
他にも種類はありますが、今回は４つだけ選んでまとめてみました。開発するアプリの特長や、開発メンバーなども考慮した上でその時にあった設計パターンを使うと良いと言うことがわかりました！
設計パターンについて調べる中で、知らなかった言葉に出会ったりと、いろんな面で理解が深まった気がします。これからは綺麗なコードを意識してエンジニアとしてワンランクアップできるように頑張ります🐣


##参考にした記事
[iOSのいろいろなアーキテクチャパターンを試してみる](https://qiita.com/AbeTatsuhiro/items/6686ce00c9dcfb59ad3f)
[手を動かしてMVPパターンを体験する](https://qiita.com/6bar10/items/ba3d22eb584379defd35)
ビジネスロジックはフロントエンドで実装したい。に応えるために営業の私が調べたこと 

# 本記事について
本記事はフリーランスSESの営業マンが記載しています。
背景として企業から「ビジネスロジックはフロントエンドで実装したい、できる人はいるか？」と聞かれ回答に困ったので、自分なりに調査しました。
非エンジニアのため記載に誤りがあった場合は優しくご指摘ください。

# ビジネスロジックとは何か
システムが処理をしてデータベースに登録する部分をビジネスロジックと呼ぶことが多いです。
ただし、明確な定義ではなく使う人の解釈がかなり含まれているので、相手が「ビジネスロジック」という単語を使った場合は「〜の処理は含まれるか？」など認識のすり合わせはした方が良さそうです。

3層アーキテクチャの「アプリケーション層」に該当する部分だな、というのは以下記事を見てわかります。

Wikipediaでは以下のように説明されています。
> データベース上のデータに対する処理手順といったようなものを指す、ソフトウェア工学的な用語である。
~中略~
エンタープライズ系（業務支援系）ソフトウェアを開発する企業が内部的に、もしくは顧客への販売促進のために用いる用語である。この用語は、主にプログラムが3層構造となるWebアプリケーション開発で使われる。ビジネスロジックは3層の中の中間層（アプリケーションサーバ）に相当する。いずれにしても、ビジネスロジックという用語は明確な定義がなく、人によって意味が異なる可能性がある。

e-Worksでは以下のように説明されています。
> 「3階層システム」（3-tier system）では、プレゼンテーション層（ユーザーインターフェース層）とデータアクセス層（データベース層）の中間に位置し、「ビジネスロジック層」あるいは「アプリケーション層」と呼ばれる。アプリケーション固有の処理やルールが記述される。

#### ビジネスルールとワークフローがビジネスロジックをつくる鍵になる
また、ビジネスロジックにはビジネスルールとワークフローの2つが大きく関わっています。
以下は自分なりの解釈を含みますが、2点のイメージを記載します。ビジネスの構造に合わせて定義されているルールです。

ECサイトで在庫がある商品のみ顧客は購入することができる、の「在庫がある商品のみ」などを定義し制御している部分がビジネスロジックで、ECサイトでカートに入れた商品のみ購入することができるなど一連の作業や手続きがワークフローです。

クリーンアーキテクチャでいうと「エンタープライズビジネスルール(Entities)」「アプリケーションビジネスルール(Use Cases)」などと表現されています。

おそらくサーバーサイドの話なので、バックエンドエンジニアがPHPやJavaなどで開発する部分だろうと思います。

# フロントエンドエンジニアは何が求められるのか？

ここで疑問。
今回企業からは「ビジネスロジックはフロントエンドで実装したい、できる人はいるか？」と聞かれています。
なぜフロントエンドがビジネスロジックに関与するのか？

フロントエンドはクライアントサイド（ECサイトで言うと買い手、ユーザー側が見る部分）の実装をする人です。HTMLやCSS、JavaScriptなどで書いてるイメージです。
そのフロントエンドでビジネスロジックを実装させるとなると、サーバー側の処理も一部になって欲しいということでしょうか。

#### SPAを作るのであればサーバサイドにはAPIだけがあれば十分？

SPA(Single Page Application)とは、Webブラウザでページの移動をしなくてもよい単一ページのアプリケーションです。
SPAの開発にはReactやAngular、Vue.jsなどが使われることが多く、このライブラリ/FWがビジネスロジックの実装に関わっていて、「アプリケーション層」の実装に関わるとのことです(MVCフレームワークのModelとの部分)。

vtecxのブログに以下との記載があり、フロントエンドでもビジネスロジックを実装してそうです。
> サーバサイドのビジネスロジックや帳票レイアウト作成においてもJavaScript(React)を利用できます.
~中略~
サーバサイドでレンダリングするのではなく、クライアントからAjax(XHR)でサーバのAPIにアクセスし、サーバからはJSONデータを返すのみとなります。これを、Thin Server Architectureといいます。
ビジネスロジックはクライアントサイドに移るので、サーバサイドはAPIができれば８０％は完成したも同然です。


# まとめ
つまり、「ビジネスロジックはフロントエンドで実装したい、できる人はいるか？」の回答はYesです。
また、どんな人なのかと聞かれたら、【React/Angular/Vue.jsの技術を使ってWebアプリケーション開発経験がある人】と言えるのかも？

# 参考
- [ビジネスロジック - Wikipedia](https://ja.m.wikipedia.org/wiki/%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF)
- [ビジネスロジック (business logic)とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word13666.html)
- [ビジネスロジックとは - IT用語辞典 e-Words](https://e-words.jp/w/%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF.html)
- [React Server Componentsに感じたフロントエンドの消失 - Zenn](https://zenn.dev/koduki/articles/3f5215f2a79843)
- [フロントエンドエンジニアがすべてのシステムを作る未来 - vtecx](https://blog.vte.cx/%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8C%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E4%BD%9C%E3%82%8B%E6%9C%AA%E6%9D%A5-34971678f9d5)
- [SPAのフロントエンド実装は、モデルの理解が重要 - Yohei Isokawa ](https://blog.yuhiisk.com/archive/2017/07/10/frontend-spa-with-model.html)

# 関連記事
- [「ビジネスロジック」とは何か、どう実装するのか - Qiita](https://qiita.com/os1ma/items/25725edfe3c2af93d735)
djoserで作ったloginエンドポイントにモンキーパッチを当てる

## なにが書いてあるのか？
- djoserのトークン認証用の/auth/token/login/というエンドポイントのレスポンスデータを書き換えるという内容です。
- 例えば、rest_frameworkを使っているプロジェクトでトークン認証をすることに決めたとします。
- djoserを導入するとlogin処理を書かなくてもうまいことエンドポイントが追加されるので便利です。

```curl
crul -X -POST -H "Content-Type: application/json" -d '{"username": "abc", "password": "passabc"}' http://.../api/v1/auth/token/login/
>>> {"authToken": ....}
```

- ResponseはデフォルトではauthTokenだけがreturnされますが、ここにユーザの情報を一緒に返してあげると[chatty(おしゃべり)なAPI](https://www.oreilly.co.jp/books/9784873116860/)になるのを回避できそうです。
- したがって、以下のような結果を期待します。
```
>>>
{
	"authToken": ....
	"user": 
		{
			"username": ...,
			"email": ...,
		}
	}
```

## 実装
### 方針
- ３つのステップで実装を試みます。
1. 複数インスタンスをシリアライズするシリアライザを定義します。
2. djoserのlogin用のviewクラスにシリアライザをセットする。
3. なるべく早いタイミングでモンキーパッチを適用する。
- また、djangorestframework-camel-caseをつかってPythonではスネークケース、生成するJSONではキャメルケースになるようにしております。
- またまた、drf-spectacularによって正しいレスポンスの値をOpenAPIスキーマで生成させるようにしています。どうでもよい方はスルーして大丈夫です。

### パッチ用のモジュールを作成

```python
# apiv1.patch.py

import djoser
from drf_spectacular.utils import extend_schema


class CustomTokenSerializer(djoser.serializers.TokenSerializer):
    user = djoser.serializers.UserSerializer() # 追加したフィールド
    class Meta:
        model = djoser.conf.settings.TOKEN_MODEL
        fields = ("auth_token", "user")


@extend_schema(
    description="トークン認証のエンドポイントです。",
    responses={201: CustomTokenSerializer}
)
class CustomTokenCreateView(djoser.views.TokenCreateView):
    pass


# パッチを適用するメソッドを定義
def patch_djoser_endpoints():
    djoser.serializers.TokenSerializer = CustomTokenSerializer
    djoser.views.TokenCreateView = CustomTokenCreateView
```

- djoser.serializer.TokenSerialierはデフォルトでauthTokenのみをシリアライズしますが、それを継承したCustomTokenSerializerにはユーザのフィールドを追加しております。djoserには便利なUserSerializerがあったのでそれを利用します。
- 単にパッチを当てるだけならCustomTokenCreateViewを定義する必要がありませんが、スキーマを修正させています。
- 最後にモンキーパッチ部分をメソッドにまとめました。


### メソッド呼び出し

```python
# apiv1.urls.py
...
from .patch import patch_djoser_endpoints

# メソッド呼び出し
patch_djoser_endpoints()

djoser_token.urlpatterns = [
    re_path(r"^token/login/?$", djoser.views.TokenCreateView.as_view()),
    re_path(r"^token/logout/?$", djoser.views.TokenDestroyView.as_view()),
]
...
```

- 今回はapiv1/urls.pyでモンキーパッチを実行しました。
- urls.pyに書いた理由を説明します。
Djangoのアプリの読み込み順序は[ドキュメント](https://docs.djangoproject.com/ja/4.0/ref/applications/#initialization-process)によると、
1. サーバの起動やmanagement系のコマンドによってdjango.setupメソッドが実行
2. settingsの読み込み
3. ロギングの準備
4. アプリケーションの準備

アプリケーションの準備ではINSTALLED_APPSのインポート、そのあとにModelsのインポート、各アプリケーションのreadyメソッドの呼び出しが実行されます。

ただし、settings.pyのINSTALLED_APPSのインポートの段階ではまだモデルをロードできていないためエラーになります。

また、views.pyでパッチを適用するとOpenAPIスキーマにパッチが適用されないという問題に直面しました。

 ということでなるべく早いタイミングで、ただ早すぎないタイミングで適用させる必要があります。そこで、アプリケーションロード時のviewsを直接参照しているurls.pyに記述しました。
【 Java_さまざまな命令 】

Javaを学習中の初学者です。
備忘録としての投稿になります。


#Javaのさまざまな命令７種
Javaにはさまざまな種類の命令があり、今回はその中でも代表的なものをピックアップしました。
####①System.out.println(引数)
画面に文字を表示させる命令
例えば、

```java
String name = "龍一";
System.out.println(name);
```
の実行結果は「`龍一`」になります。

####②System.out.print(引数)
改行をせずに画面に文字を表示させる命令
例えば、

```java
System.out.print("私は");
System.out.print ("龍一です");
```
の実行結果は「`私は龍一です`」になります。

#### ③int a = Math.max(a, b)
引数①・②の二つを比較して大きい方の数値を代入する命令。
例えば、

```java
int a = 5;
int b = 10;
int x = Math.max(a, b);
System.out.println(x);
```
の実行結果は「`10`」になります。

#### ④ int n = Integer.parseInt(引数)
文字列を数値に変換することができる命令。
例えば、

```java
String age = "20";
int n = Integer.parseInt(age);
System.out.println(n + 1);
```
の実行結果は「`21`」になります。

#### ⑤int r = new java.util.Random().nextInt(上限値)
nextInt(上限値)で指定した上限値を元に乱数を発生させます。
上限値を90としたとき、0~89内の数字がランダムに代入されます.
例えば、

```java
int r = new java.util.Random().nextInt(90);
Sywstem.out.println("今回生成された乱数は" + r + "です");
```
の実行結果は「`46(生成されたランダムな値)`」になります。

#### ⑥String s = new java.util.Scanner(System.in).nextLine()
文字列の入力を受け付ける命令。
例えば、

```java
System.out.println("あなたの名前は？");
String name = new java.util.Scanner(System.in).nextLine();
System.out.println("ようこそ" + name + "さん");
```
を実行すると名前の入力を促され、`「龍一」`と入力すると、`「ようこそ龍一さん」`と出力される。
#### ⑦int input = new java.util.Scanner(System.in).nextInt()
整数の入力を受け付ける命令。
例えば、

```java
System.out.println("あなたの年齢は？");
int age = new java.util.Scanner(System.in).nextInt();
System.out.println("あなたは" + age + "才です。");
```
を実行すると名前の入力を促され、`「23」`と入力すると、`「あなたは23才です。」`と出力される。

#まとめ
以上、Javaの重要な命令7種を取り上げました。
まずはイメージからしっかり掴んで行こうと思います！
NodeJSからAPI Gateway SDK Javascript版を使ってみる



```Node.js
// eval(fs.readFileSync("apiGateway-js-sdk/lib/axios/dist/axios.standalone.js", 'utf-8'));
const axios = require('axios'); //npm install axios
eval(fs.readFileSync("apiGateway-js-sdk/lib/CryptoJS/rollups/hmac-sha256.js", 'utf-8'));
eval(fs.readFileSync("apiGateway-js-sdk/lib/CryptoJS/rollups/sha256.js", 'utf-8'));
eval(fs.readFileSync("apiGateway-js-sdk/lib/CryptoJS/components/hmac.js", 'utf-8'));
eval(fs.readFileSync("apiGateway-js-sdk/lib/CryptoJS/components/enc-base64.js", 'utf-8'));
eval(fs.readFileSync("apiGateway-js-sdk/lib/url-template/url-template.js", 'utf-8'));
eval(fs.readFileSync("apiGateway-js-sdk/lib/apiGatewayCore/sigV4Client.js", 'utf-8'));
eval(fs.readFileSync("apiGateway-js-sdk/lib/apiGatewayCore/apiGatewayClient.js", 'utf-8'));
eval(fs.readFileSync("apiGateway-js-sdk/lib/apiGatewayCore/simpleHttpClient.js", 'utf-8'));
eval(fs.readFileSync("apiGateway-js-sdk/lib/apiGatewayCore/utils.js", 'utf-8'));
eval(fs.readFileSync("apiGateway-js-sdk/apigClient.js", 'utf-8'));

var apigClient = apigClientFactory.newClient({
    apiKey: 'API_KEY'
});
```
AWSの多要素認証(MFA)解除方法【IAM】

# はじめに

AWSでアカウント作って多要素認証(MFA)も設定しておこう！って設定するのはいいが、
解除したい時なんか探しにくいなと少しでも感じたのでここに簡単ではありますが残しておこうといった感じです！
(慌てると何も出来なくなるので、、公式サイトみるでもいいと思ったのですが自分が見るようにということで残してます、、:bow_tone1:)

ちなみに『多要素認証(MFA)』したい時は、

```
ログイン 
=> IAM 
=> ダッシュボードで以下のように出てくるので『MFAを自分に追加』のボタンタップ 
=> 『MFAデバイスの割り当て』
=> 『仮想MFAデバイス』タップ 
=> 使用するためのアプリを自分のデバイスにインストール。(私はGoogleの『Google Authenicator』をインストールしました。) 
=> 『QRコードを表示』タップ 
=> インストールしたアプリで読み取り、出てきたコードを１つ目、その後に違ったコード出てくるので2回めいのとこにそのコード入力とすると登録できます。
```

![スクリーンショット 2022-02-21 0.08.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/9acc45ed-9ab8-0242-5dd2-d407a8fb5953.png)

# 自分の多要素認証(MFA)解除方法

```
(iamユーザー)

IAM
=> ダッシュボードタップ
=> 『自分の認証情報』が右らへんに小さくあるのでタップ
=> 下の方にスクロールしていくと『MFAデバイスの管理』あるのでタップ
=> 『削除』にチェック項目いれて『次へ』をタップ
```

又は

```
(rootユーザー)

IAM
=> ダッシュボードタップ
=> 『自分の認証情報』が右らへんに小さくあるのでタップ
=> 『多要素認証（MFA）』タップ
=> 『管理』タップ
=> 『削除』にチェック項目いれて『次へ』をタップ
```

でいけるはずです。


# 自分以外の多要素認証(MFA)解除方法

```

IAM
=> ダッシュボードタップ
=> 左の方の『ユーザー』をタップ
=> 解除したい『ユーザー』の名前をタップ。
=> 上部タブの『認証情報』をタップ
=> MFA デバイスの割り当ての右の方の『管理』をタップ
=> 『削除』にチェック項目いれて『次へ』をタップ
```

# 最後に
上記以外の経路でもいけるはずではあるかと思います！ヽ(´▽｀)/
100日でSQLの達人になる@LeetCode! Day20 <isnull句を覚えるぞ。>

## 1407. Top Travellers （問題レベル: Easy）要課金
今日の問題はこれ。
顧客を旅行距離順にリストアップするという問題。

問題文の意図は簡単で、使うコマンドもほぼ瞬時に分かったが、やっかいなのは次の条件。
顧客が全く旅行していない場合は、０を入力せよ。

いままでは、`case when`句を多用してやってきたし、この問題でも`case when`句でやることも可能であるがどうしても記載がややこしくなる。

そこで、今日のポイントは、`MS SQL Server`で｀NULL`値を例外処理する時は`isnull(NULL値を含む可能性のある変数,NULLの場合の戻り値)`を使うだ。

ややこしいのは、`MySQL`では`IFNULL`を使うこと。
`COALESCE`もほぼ同様の関数で、こちらはどのSQLでもほぼ同様に使えるのでこっちを覚えた方が良いかも。
ただ、結合するという意味の英単語なのだが、スペルが間違えそうなんだよなぁ。

提出した回答はこちら。 
```
SELECT u.name, ISNULL(SUM(r.distance), 0) as travelled_distance
FROM users u
LEFT JOIN rides r
ON u.id=r.user_id
GROUP BY u.name
ORDER BY SUM(r.distance) DESC, u.name ASC
```

* [LeetCode](https://leetcode.com/)の問題は、MS SQL Serverで解いています。
JavaScriptで配列の重複を削除する方法

# はじめに
個人で開発しているブログサイトのとある機能にて、JavaScriptで重複を含む複数の数値が格納された配列から、重複を削除する方法が知りたかったので、調べてみたところ、すぐに2つの実装方法が見つかりました。今回は、そちらの方法の紹介に加えて、2つの方法の相違点から、実装にあたって考慮するべき点についてまとめてみました。

# 結論
先にこの記事での結論をお伝えすると、**JavaScriptで重複を削除する際には、基本的に[Setオブジェクト](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Set)を使うことをお勧めします。**下で紹介するようなindexOfメソッドとfilterメソッドを用いた方法もありますが、処理の対象となるデータが将来的に大きくなることが予想される場合、計算量の大幅な増大につながるため、処理速度の問題となる可能性があります。下記で実装方法を含めて説明します。

# 1. indexOfとfilterメソッドを使った場合
JavaScriptでの重複を削除方法について調べると、こちらの方法が最も紹介されています。配列の各要素のインデックスが、配列内で最初に一致するかどうかを条件としてfilterメソッドでフィルタリングすることで、配列から重複を取り除くことができます。

```JavaScript
const arrayA = [1, 2, 3, 3, 1, 4];
const arrayB = arrayA.filter((element, index) => {
    return arrayA.indexOf(element) == index;
}) 
console.log(arrayB); //[ 1, 2, 3, 4 ]
```

# 2. new Set()を用いた場合
2つ目の方法として、EcmaScript 2015からJavaScriptに標準で導入されたSetオブジェクトを用いるやり方があります。
MDNのリファレンスによると、Setオブジェクトについて以下のように説明されています。

>Set オブジェクトは、プリミティブ値やオブジェクト参照を問わず、あらゆる型で一意の値を格納できます。


つまり、文字列や数値などのデータ型に関係なく、配列内を必ず一意な要素のみに変換してくれるというものです。下記は、1つ目の方法と同じ数値の配列における重複の削除を行っています。

```JavaScript
const arrayA = [1, 2, 3, 3, 1, 4];
const arrayB = Array.from(new Set(arrayA));
console.log(arrayB);  //[ 1, 2, 3, 4 ]
```
上の実装の2行目は、以下のようにスプレッド構文を用いて記述することも可能です。

```JavaScript 
const arrayB = [...new Set(arrayA)];
```
また、重複削除後の配列内の各要素の順序は、元配列の要素の順序であることが保証されています。

# 2つの方法において異なる点
この2つの実装方法で得られる結果は同じですが、**計算量と処理速度**に大きな違いがあります。
[こちらの記事](https://qiita.com/netebakari/items/7c1db0b0cea14a3d4419)で詳細に書かれていますが、indexOfとfilterメソッドの場合、**配列の要素数の2乗に比例した計算量**が発生します。例えば、データ量が100倍になれば、計算量は10000倍になるということに。。また、要素数が100000個の場合の２つの方法の処理速度は、およそ55倍違うそうです（Setオブジェクトの方が速い）。このようなスケーラビリティ上の問題点の有無がindexOfとfilterメソッドと、Setオブジェクトの大きな相違点になります。

また、コードの簡潔さの面から見ても、Setオブジェクトが優れていることが上の実装例から分かります。


# 感想
今回は、JavaScriptで配列内の重複を削除する方法についてまとめてみました。
この方法について調べる前は、コード量についてはある程度意識して、プログラムを実装していました。しかし、処理の計算量については、ほとんど考慮できていませんでした。システムの規模が大きくなったり、処理の対象となるデータが将来的に肥大化していく可能性がある場合は、エラーなく動くだけでなく、計算量を意識したプログラムの実装が求められることを、この比較を通して感じました。
アルゴリズム大事。。勉強します。。


# 参考文献
[JavaScriptで重複排除を自分で実装してはいけない（Setを使う）](https://qiita.com/netebakari/items/7c1db0b0cea14a3d4419)

[Set - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Set)
M5StickC Plusでプログラムを書き込むまで

M5StickC Plusは、M5Stackシリーズの１つで、指先ほどの大きさのIoTコンピュータです。赤外線、加速度センサーとジャイロ、Wi-Fi、Bluetooth 4.2が使えるため、開発しやすいとの触れ込みです。
今回はAruduino IDEを使って開発を行います。

## ドライバインストール(Windows)

FTDIドライバーをインストールします。サイトからはインストーラ形式をダウンロードできますが、これではうまく行かないケースもあるとのこと。M5StickC PlusをUSBケーブルでPCに接続するとデバイスマネージャーにて黄色三角アイコンが出てしまうようです。
その場合は、デバイスをPCに接続し、デバイスマネージャーからZip版のFTDIドライバーをインストールすると良いのこと。
今回は「USB Serial Port(COM4)」が表示されましたので接続成功です。名前から察するに、接続先ポートはCOM4です。

## Aruduino IDEをインストール

[公式サイト](https://www.arduino.cc/en/software)からダウンロード・インストールできます。
[Chocolatey](https://chocolatey.org/)からもインストールできます。

```
choco install arduino -y
```

# ボード設定

Arduino IDEを開き、ファイル＞環境設定＞設定を開きます。
追加のボードマネージャのURLという箇所に、以下のURLを貼り付けます。

```
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
```

ツール＞ボード＞ボードマネージャを開きます。
ダイアログに、 `M5Stack` を入力し、インストールします。

ツール＞ボード＞M5Stack Arduiono＞M5StickC Plusを選択する。

# ライブラリ設定

Arduino IDEを開き、スケッチ＞ライブラリをインクルード＞ライブラリを管理を開きます。
ダイアログに、 `M5StickCPlus` を入力しインストールします。
これでサンプルのスケッチを使えるようになります。

# ポート設定

接続先のCOMポート番号が4ですので、ツール＞シリアルポート＞COM4を選択しました。

# 書き込み

マイコンボードに書き込むボタンを押すと、プログラムの書き込みが行えます。
試しに実行したところ、以下の出力とともに書き込み成功しました。

```
最大1310720バイトのフラッシュメモリのうち、スケッチが284561バイト（21%）を使っています。
最大327680バイトのRAMのうち、グローバル変数が17908バイト（5%）を使っていて、ローカル変数で309772バイト使うことができます。
esptool.py v3.1
Serial port COM4
Connecting.......
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 4c:75:25:c5:8b:e0
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 1500000
Changed.
Configuring flash size...
Flash will be erased from 0x0000e000 to 0x0000ffff...
Flash will be erased from 0x00001000 to 0x00005fff...
Flash will be erased from 0x00010000 to 0x00055fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Compressed 8192 bytes to 47...
Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.1 seconds (effective 590.4 kbit/s)...
Hash of data verified.
Compressed 17104 bytes to 11804...
Writing at 0x00001000... (100 %)
Wrote 17104 bytes (11804 compressed) at 0x00001000 in 0.4 seconds (effective 355.5 kbit/s)...
Hash of data verified.
Compressed 284944 bytes to 154199...
Writing at 0x00010000... (10 %)
Writing at 0x0001ace1... (20 %)
Writing at 0x00027642... (30 %)
Writing at 0x0002cb4c... (40 %)
Writing at 0x000324a2... (50 %)
Writing at 0x00037d85... (60 %)
Writing at 0x0003d249... (70 %)
Writing at 0x000428c1... (80 %)
Writing at 0x0004b095... (90 %)
Writing at 0x0005356b... (100 %)
Wrote 284944 bytes (154199 compressed) at 0x00010000 in 2.8 seconds (effective 827.7 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 128...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (128 compressed) at 0x00008000 in 0.1 seconds (effective 378.0 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
```

## 電源のONとOFF

画面向かって左側のボタンを2秒長押しすると電源がONになります。
このボタンを6秒長押しすると、電源がOFFになります。

## 参考

[Arduino IDE environment - M5StickC Plus](https://docs.m5stack.com/en/quick_start/m5stickc_plus/arduino)

[M5Stack Arduino Library - GitHub](https://github.com/m5stack/M5StickC-Plus)
FlutterのFirebase Cloud Messaging及びflutter_local_notifications利用時にAndroidで'int java.lang.Integer.intValue()'エラーになる時の対処

# 環境
Flutter 2.10.2
firebase_messaging 11.2.6
flutter_local_notifications 9.3.2

# 結論

どうやらアイコン関係でエラーになっているようで、

https://stackoverflow.com/questions/55820299/flutter-local-notifications-platformexception-platformexceptioninvalid-icon

ここに書いてある内容で解消できました。
自分は一旦通知にアイコンはいらなかったので２つ目のアンサーの方で対処しました。

```dart
var initializationSettingsAndroid =
    new AndroidInitializationSettings('@mipmap/ic_launcher');
```

# 余談
最初から↑の投稿にたどり着ければ早いですが、そこそこ時間かかったので最初にググったワードで記事作りました...