OmniAICreator/Qiita-1.07M huggingface dataset:
【React】react-chartjs-2で『Error: "category" is not a registered scale.』のエラーが出る対処

## はじめに
Reactでグラフの描画をしようと、サクっと日本語記事からコピペでやろうと思ったらハマったので対処法を残しておきます。

ちなみに当初コピペして以下の書き方で色々試していました。

```NG例1：Graph.tsx
import { Line } from "react-chartjs-2";

~~~~~以下略~~~~~
```

```NG例2：Graph.tsx
import { Chart as ChartJS, registerables } from 'chart.js';
import { Chart } from 'react-chartjs-2'
ChartJS.register(...registerables);

~~~~~以下略~~~~~
```

## 原因：v4になって書き方が若干変わったっぽい
バージョンによってimportのやり方が結構違うようです。
v4系の折れ線グラフの実装例を載っけておきます。

```OK例：Graph.tsx
import React from "react";
import {
  Chart as ChartJS,
  CategoryScale,
  LinearScale,
  PointElement,
  LineElement,
  Title,
  Tooltip,
  Legend,
} from "chart.js";
import { Line } from "react-chartjs-2";

ChartJS.register(
  CategoryScale,
  LinearScale,
  PointElement,
  LineElement,
  Title,
  Tooltip,
  Legend
);

const Graph: React.FC = () => {
  const options = {
    responsive: true,
    plugins: {
      title: {
        display: true,
        text: "グラフタイトル",
      },
    },
  };

  const labels = [
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
  ];

  const data = {
    labels,
    datasets: [
      {
        label: "データ1",
        data: [10, 40, 30, 40, 50, 80, 120],
        borderColor: "rgb(255, 99, 132)",
        backgroundColor: "rgba(255, 99, 132, 0.5)",
      },
    ],
  };

  return (
    <>
      <Line options={options} data={data} />
    </>
  );
};

export default Graph;
```

## 検証バージョン
- chart.js: ^3.8.0
- react-chartjs-2: ^4.3.1

## さいごに
ちゃんと公式ドキュメントを見よう！

## 参考
https://react-chartjs-2.netlify.app/examples/line-chart
Python、SeleniumによるWebスクレイピング環境構築(Windows10)

# 趣旨
PCを新調(Surface Pro 7に)したので、Webスクレイピング環境を改めて構築する。
と同時に、Windows10環境でPython、Seleniumを使用したWebスクレイピング環境の構築手順をメモとして残す。

# １．Pythonをインストール
公式サイトよりインストーラを取得し、インストールする。
https://www.python.org/downloads/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459544/31e7b75a-6e13-5e8a-30d1-9a00dd401a44.png)
インストール完了時、「Disable path length limit」をクリックするかしないか迷ったが、クリックしておいた。
Windowsの従前のバージョンではパスの長さが最大260文字までという制限があったため、Windows10 でもデフォルト状態ではパスの長さの制限が掛かっているらしい。
パスの長さが260文字を超えることはたぶんないと思うが、もし超えたときに余計なエラーで躓きたくないと思い制限解除(=Disable)しておいた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459544/c2d08ecb-5c40-8b26-a3c5-8cedec17a126.png)
ちなみにパスの長さの制限を解除できるようになったのはWindows10からのようで、意外と最近だった...。
![pythonインストール確認.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459544/93a6ed0c-21af-9842-b67a-023f74fabf05.jpeg)
正常にインストールできたか、念のため python --version で確認。
当記事執筆時点の最新バージョン(3.10.5)が無事インストールされた。

# ２．Seleniumをインストール
コマンドプロンプトで
```
pip install selenium
```
プロキシを介する場合は
--proxyオプションをつけてユーザ名・パスワード・プロキシサーバのURL等指定すればいけると思う。

# ３．WebDriverをダウンロード、配置
ひとまずEdgeが自動操作できればいいので、MicrosoftのサイトからEdge WebDriverをダウンロードし、任意の場所に置く。
https://developer.microsoft.com/ja-jp/microsoft-edge/tools/webdriver/
自分が使っているEdgeのバージョンを確認し、103だったので対応するバージョンのWebDriverをダウンロードする。(EdgeのバージョンとWebDriverのバージョンが異なると動かない)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459544/5c755c99-7e01-1bb3-da29-ad4f3c4cab2c.png)

# ４．動作確認
Googleのページを開くだけの簡単なテストコードを用意して、実行してみる。
```test.py
# coding:utf-8
from selenium import webdriver
from selenium.webdriver.edge.service import Service

driver = webdriver.Edge(service=Service('C:\webdriver\msedgedriver.exe'))
driver.get('https://www.google.co.jp/')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459544/101416be-ff6b-44aa-8c4b-6f1f45c4ba17.png)

無事に動いた。
ひとまずWebスクレイピングのための環境構築は完了。
【Unity】Normcoreでマルチプレイをしてみる

## Normcoreとは？

https://normcore.io/

Photonやモノビットエンジンと同じUnityアプリケーション上でマルチプレイを行うために利用することができるリアルタイム通信サービスです。
WebRTCによる通信を採用しているため、ビデオチャットとの親和性が高いところに類似サービスとの優位性があります。
> Up your value by supporting the web. Normcore uses the powerful WebRTC protocol. This means you can support live spectating on the web, browser editions of your game, and more.



## 料金プラン
全体的に類似サービス(Photon)と比べて制限が緩く料金も安価なところが魅力的です。
フル機能でも49＄+α（帯域やルーム数に対して従量課金）の様です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/fc9ce876-97c9-d09b-6834-cccbad3baa47.png)

ただし、WebGLで本サービスを利用するには上記料金表には記載されていないオンプレ版かプライベートクラウド版しか対応していないとこのこと。
利用する場合は問い合わせフォームから連絡を行う必要がある。
> Either Normcore Private Cloud or Normcore Private On-Premises is required in order to use Normcore with WebGL.


## 位置同期サンプル動画
<iframe width="560" height="500" src="https://www.youtube.com/embed/h13z6_bdSfc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## サンプル導入手順

サインアップを行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/c1430109-28e5-50df-8dca-ea2bfcf0f19b.png)

ダウンロードボタンを押すとUnityAssetSoreが開くのでこちらからAssetをインポートする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/64112c5d-cf74-5960-7ded-50d568fa59b0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/c80775a5-d1f4-cf56-63de-263360bd52d6.png)

Normcoreのサーバーに接続するためのAppKeyを発行するために、Create an applicationを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/8f187405-0e2f-94d8-e533-4e5fff76120f.png)

`Add new application`からアプリを作成し、App keyを発行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/00b3ade6-02ef-cb49-1637-08fc8106edc6.png)

Realtime+CubePlayerシーンを開く。
Realtime+CubePlayerオブジェクトのRealtimeコンポーネントに先ほど取得したAppkeyを入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/66da9a91-5554-63e3-7abe-acf4b408171c.png)

Playモードにしてサーバーとの接続に成功すると中央に現れる白いキューブが現れ、WASDキーでキューブを操作することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/de4d9630-53b2-b5ef-38da-f253b49e13ea.png)

Standaloneビルドを行い、生成されたexeを複数起動すると位置同期ができていることを確認することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/1982cba0-271a-355e-26c1-56c0d480a52e.png)

## まとめ
Photonと同じような感覚でCubePlayerManagerとRealtimeコンポーネントをアタッチするだけで同期することができているため、非常に使いサービスに感じました。
後日、本サービスの目玉であるWebGLプラットフォームについても触っていきたいと思います。
学んだこと乱雑まとめ

# 今週学んだことまとめ

### [0..n]と[0...n]の違い
...は、最後の値を含めない
[0..5]なら0〜5
[0...5]なら0〜4

### Array.newで配列をつくる
Array.new(size , val )
入力値分の配列欲しい時に使う?
sizeで要素数、valでようの値設定 
ex.
`Array.new（3,0)
=>[0,0,0]`

### seedファイルでデータを作る
db/seeds.rbに
`Model.create(key: 'value', key: 'value', ...)`でデータをあらかじめ用意できる。
rails db:seedで反映。

``` ruby
Item.create(name: 'ペン', price: 100)
Item.create(name: 'ペン2', price: 200)
Item.create(name: 'ノート1', price: 400)
Item.create(name: 'ノート2', price: 600)
Item.create(name: 'ペンケース1', price: 800)
Item.create(name: 'ペンケース', price: 1000)
Item.create(name: '本1', price: 1500)
Item.create(name: '本2', price: 2000)
Item.create(name: 'メガネ1', price: 20000)
Item.create(name: 'メガネ2', price: 35000)
```
を`db/seeds`ファイルに書いた場合
![スクリーンショット 2022-08-10 18.46.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2713246/a42a5f5b-653d-81e8-7107-a5baf2204838.png)
のようにデータができる。

### tallyメソッド
めちゃ便利。
わしのrubyの-vでは、使えませんでした。(アプデするの怖い)
`["a", "b", "c", "b"].tally  #=> {"a"=>1, "b"=>2, "c"=>1}`
つまり、配列の要素の数を要素の種類ごとに数えるということ。
maybeだが、.valueで数だけ取り出し。※その後のsortなど使う時に使いやすくする。

振り返ると少ない。もう少し方針固めて、勉強します。
eclipseで作ったSpringBootアプリをAWSを使って公開する#3

# SpringBootをAWSのサーバーへデプロイ

| 項番 | ページ内リンク |
|:----:|:-------------|
| 1 | [1. アップデート確認](#1-アップデート確認) |
| 2 | [2. Javaのインストール](#2-Javaのインストール) |
| 3 | [3. Gitのインストール](#3-Gitのインストール) |
| 4 | [4. Gradleのインストール](#4-Gradleのインストール) |
| 5 | [5. Gitからプロジェクトをクローン](#5-Gitからプロジェクトをクローン) |
| 6 | [6. Mavenのインストール(Apatch, Tomcat)](#6-https://qiita.com/drafts/d5e6b447b87fffefa695/edit#6-maven%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%ABapatch-tomcat%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) |
| 7 | [7. ビルド](#7-ビルド) |
| 8 | [8. 実行](#8-実行) |
| 9 | [9. 実装](#9-実装) |
| 10 | [10. さいごに](#10-さいごに) |


## 1. アップデート確認
```
# sudo yum update
```
## 2. Javaのインストール
```
//java11のインストール 
# sudo yum -y install java-11-amazon-corretto
```

## 3. Gitのインストール
```
# sudo yum -y install git
```

## 4. Gradleのインストール
最新バージョンはこちらで確認
https://services.gradle.org/distributions/
```
# wget https://services.gradle.org/distributions/gradle-7.5.1-bin.zip

# chmod 777 gradle-7.5.1-bin.zip
# sudo unzip -d /opt/gradle ./gradle-7.5.1-bin.zip
# ls /opt/gradle/gradle-7.5.1

```

パスを通す
```
# vi .bash_profile
```
コマンド
i : 編集
ESC : 編集モード解除
ZZ : 保存して終了

以下を追加
```Bash:.bash_profile
export GRADLE_HOME=/opt/gradle/gradle-7.5.1
export PATH=${GRADLE_HOME}/bin:${PATH}
```

変更を反映
```
# source .bash_profile
```

確認
```
# gradle -v
```

## 5. Gitからプロジェクトをクローン
```
// git clone リモートリポジトリurl
# git clone https://github.com/sakuraba-coder/WebToDoStarter.git
```
URLは以下から
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781422/cfa7f4fd-30f1-1abe-944b-d9692f129c6b.png)

## 6. Mavenのインストール(Apatch, Tomcatのインストール)
MavenにはApache, Tomcatが内包されており、簡単にデプロイができる。

```
//Apache Mavenのインストール
# sudo wget https://archive.apache.org/dist/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz
//インストールしたMavenファイルの解凍
# sudo tar -xzvf apache-maven-3.8.6-bin.tar.gz
//解凍ファイルのディレクトリを移動
# sudo mv apache-maven-3.8.6 /opt/
```

```
//テキストエディタでpathを追加。vimを使用
# vim .bash_profile
```

```Bash:.bash_profile
//Mavenのインストールされたパスを指定、パスを通す
MVN_HOME=/opt/apache-maven-3.8.6
PATH=$MVN_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin
```

```
//変更を反映
# source .bash_profile
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781422/b14dcf0e-2b74-e3e0-4407-b5f2e08bc152.png)

## 7. ビルド
gradleのあるディレクトリに移動の後ビルド
```
# cd クローンしたプロジェクトのディレクトリ
# gradle assemble
```

## 8. 実行
jarファイルがlibに作成される
java -jar jarファイルのパスで実行
```
# cd /home/ec2-user/WebToDoStarter/build/libs
# java -jar WebToDoStarter-0.0.1-SNAPSHOT.jar
```

ブラウザで以下を実行。アプリケーションが実行される。
IPアドレス:8080/

## メモ 
変更をとりこむ
```
# git pull https://github.com/sakuraba-coder/WebToDoStarter.git 
```

## さいごに
gradleの理解不足のため、ビルドが成功するまでに時間がかかった。
今でもよくわからないが、assembleとjavaコマンドでとりあえず実行することができた。
今考えるとMavenかgradle、どちらかでいいのではないか…？


## 参考
https://qiita.com/tosumaso/items/63628d9199d3246ba757
https://qiita.com/kumaGoro_95/items/f56746a87c516882daf3
写真を撮ると画像の容量がデカすぎるので圧縮して容量を小さくしよう。

使用ライブラリ
1. [camera](https://pub.dev/packages/camera)
2. [flutter_image_compress](https://pub.dev/packages/flutter_image_compress)

## 機能概要
1. 撮った写真を一覧表示する(全部で40枚とする)。
2. それぞれのボタンをタップするとカメラ画面に移動する。

### 問題点
数枚程度、写真を撮り一覧画面に戻るとアプリがクラッシュしてしまう。しかもエラーも出ない。

### 問題の原因
だいたいネットからダウンロードした画像の大きさを確認すると数十KBであることがほとんど。
では、写真を撮った場合の大きさはというと数MB程度もあり、1MB = 1000KBなので、これはアプリのクラッシュ原因になる。
なので、写真と撮る際は必ず画像圧縮ライブラリで

#### 画像圧縮のやり方

では画像のサイズを圧縮してあげて、ネットからダウンロードした画像と同じくらいの大きさに変更してあげましょう。
flutter_image_compressという画像圧縮ライブラリがあるのでそれを使用すればいい。
MySQL8で使える型一覧

# MySQLで使える型一覧 
適宜追加していきます
## 数値 

### 整数型　int
tinyint, smallint, midiumint, int, bigintの順に扱える値の範囲が大きくなるが、基本はintを使っておけば問題ない。
##### INT UNSIGNED
非負整数に限られ扱える値の範囲が大きくなる
##### INT ZEROFILL
表示桁数に合わせて０が追加される 


:::note
例
123 → 00123, 456 → 0000456

:::
##### INT(N)
Nにある自然数を当てはめることで表示桁数を指定できる


::: note warn
このNは扱える値の範囲を指定するものではない
扱える値の範囲内でこのN桁を超えるような値のときはその値が表示される

:::





###
【Python3.9 / FastAPI】アップロードされた画像容量を取得して、バリデーションをかける方法

# 環境

* fastapi
* python3.9

# 全体のソース

```sample.py
from fastapi import UploadFile
from pydantic import BaseModel, validator
from sample_app.domain.models.valueobjects.exceptions import InvalidRequestException

IMG_MAX_SIZE = 2 * 1024 * 1024

class UploadImage(BaseModel):
    upload_image: UploadFile

    @validator("upload_image")
    def validate_upload_image(cls, v: UploadFile) -> UploadFile:
        v.file.seek(0, 2)
        img_size = v.file.tell()
        if img_size > IMG_MAX_SIZE:
            # 任意で作成した例外
            raise InvalidRequestException("2MB以上の画像はアップロードできません")
        return v
```

# 解説

```sample.py
v.file.seek(0, 2)
img_size = v.file.tell()
```

`v.file.seek(0, 2)`で取得したファイルオブジェクト(`v.file`)のファイルの参照位置を取得しています。
`(0, 2)`で最初から最後までの位置を取得しています

https://fastapi.tiangolo.com/ja/tutorial/request-files/#uploadfile

`v.file.tell()`では、ファイルの最初から最後までのバイト数を返しているので画像サイズとして取得しています

https://docs.python.org/ja/3/tutorial/inputoutput.html#methods-of-file-objects
【self-introduction】スキルの棚卸しとロードマップの作成

# はじめに
この記事はこれまでの経験や携わってきた技術を棚卸しし、これから私が目指したい理想のエンジニア像とのギャップを明確にすることを目的としています。読むことで知識が得られるような記事ではないため、お忙しい皆様の時間を奪わないためにもブラウザバックしていただいて問題ありません。
ただ、かれこれ６年エンジニアをやってきましたが、まだまだ素人です。これから継続的に学習・アウトプットして成長していきたいと思っているため、もし同じ意識を持った方が読んでいたらフォローしていただけるとモチベーションになります。

# 自己紹介
はじめまして。nyoutkです。簡単に自己紹介をします。
<dl>
<dt>働いている場所</dt>
<dd>東京ではない地方</dd>
<dt>経歴</dt>
<dd>・XXX製品のGUI開発（プログラマ）<br>→今思うと一番楽しかった</dd>
<dd>・XXX証券業務システムの設計（SE）<br>→忙しかったけど人として成長した（飲み会が好きになった）</dd>
<dd>・XXX銀行のインフラ導入（CE）<br>→暗黒時代。おもしろことなんて一つもなかった。</dd>
<dd>・XXX保険業務システムの設計（SE）<br>→特に目新しい技術もなく、スキルは上がらなかった。</dd>
<dt>スキル</dt>
<dd>・Java読める。書いていたのは社会人2年目くらいまでなのでもはや設計やコーディングの仕方は忘れた。</dd>
<dd>・お客様へ自信を持って「これは仕様です。要件通りです。」と言えること。100万回は言った。</dd>
<dd>・深夜残業も休日出勤も苦ではない境地に達していること。</dd>
<dd>・プライベートでちょっとだけAngularを触ったくらい。フロントエンド側はほぼ無知。</dd>
<dd>・SQLは簡単なものなら読める（そもそも読みにくいSQLは悪かもしれないが、、）</dd>
<dt>興味のあること（今後増減するｶﾓ）</dt>
<dd>・Java、Go、Typescript</dd>
<dd>・Spring、Angular</dd>
<dd>・AWS、Azure、GCP</dd>
<dd>・認証／認可周りのなにか</dd>
<dd>・分散トランザクション周りのなにか</dd>
<dd>・マイクロサービス</dd>
</dl>

# ロードマップ
自己紹介を書いてみて、自信を持って「自分の武器はコレです」と言えるものは何一つないことがわかりました。その分、やりたいこと・やらねばならないことが多い事にも気づきました。しかし、仕事をしながら全てやろうとすると何年もかかるし、もしかしたら結局何も身につかなかったとなるかもしれないです。そのため、興味のあることをもとに優先順位をつけながらこれからのロードマップを書いていこうと思います。

1. マイクロサービス、分散トランザクション
   まず、これを第一優先として学んでいこうと決めました。理由としては仕事で使いそうだからです。あとは、これらを学ぶ中で認証／認可やGoやTypescriptやクラウドを使っていくことになるであろうから、ここから始めるのが効率がいいと感じました。懸念点としては資格試験もないため、何を基準にマスターしたと言えるようになるのかが不明であることです。これについては目標をしっかりと定めて、グダらないようにしたいです。
1. AWS、Azure、GCP
これらを第二優先で学んでいきます。理由としては市場価値が高そうだから。特にGCP知ってると給料高いらしい。知らんけど。また、資格試験もあるため、モチベーションの維持やゴールが明確になりそうなのでいいと思いました。
1. Angular、Typescript
マイクロサービスをやっていると、フロントエンドがリッチになってくるイメージがあるためマイクロサービスを実装してみようとなったときに結果が見える画面があるとモチベーションになるかと思ったからです。
1. 認証／認可
あまり今の所興味はないですが、かなり奥が深そうです。仕事でもこれだけを軸に案件が走っていたりするのを見るので、需要はあるのかなと思いました。

# 抱負
とりあえず思い浮かんだままに書き殴りましたが、軸としたいのは「実際に目に見える形で作ること」です。なぜなら昨今よくみるITエンジニアのように概念だけ知っていて概念だけで論破するようなおじさんにはなりたくないからです。また、これからの時代は口が達者であることも引き続き需要はありますが、実際に作ることができるスキルも重宝されるとなんとなく感じています。なので概念的なテーマであっても、実際に作って理解することを軸にやっていこうと思います。
ALBが使用予定のIPをつかんでしまった話

# はじめに
※2022/5頃の情報です。
環境を構築しようとしていた時の出来事です。
EC2を立てようとAWSコンソールをポチポチしていたところ、以下の表示が出ました。
![EC2起動失敗.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743619/cb8affb7-38f9-aef8-65af-874a796f67fa.jpeg)
どうやらすでにIPを使用されており起動できなかったようです。
「空いてるIPだったと思うけど...」と考えながら調査開始。

# 原因
同じサブネット上にALBが配置されており、使用予定のIPをつかんでいました。
ALBはスケールアウトや時間経過とともにIPが変わるようで、その際にたまたま今回使用予定のIPをつかんでしまったようです。

# 対処
たまたま該当ALBは作業時間当時に使用していなかったため、一度ALBを別サブネットに付け替えました。
そうすると30分~1時間程度でALBが使用していたIPを離してくれたので、その隙にEC2を立てて、当初使用予定だったIPを取得しました。


# 参考
https://aws.amazon.com/jp/premiumsupport/knowledge-center/elb-find-load-balancer-IP/

https://dev.classmethod.jp/articles/tsnote-alb-ip-001/#fn-767310-1
テストにおける優先度

2ポスト目も自己紹介にある嫌いな言葉「優先度」についてです。
個人の解釈をもう少し正しく書き表すなら「ユウセンド」で「優先度」では無いような気がします。
しかし、この2つが区別されず、、、いや前者の意味で使用される機会に多く出会ってきたと思います。
この前者の意味で使用されるユウセンドがホント嫌いです。


# 魔法のことば　ユウセンド
とあるシステム開発物語 ^^
```
要件がなかなか定まらない中、どうにか突き進んできたシステム開発。
状況は開発の遅れと不具合の多発によりひっ迫。
なぜか先に決まっているリリース日が近づきテスト真っ盛り。
このままでは残業をしても土日出勤をしても到底間に合わない。
そこでリリース日に間に合うようにテスト内容を見直すことにしました。
ユウセンドを高/中/低の3段階でつけて、ユウセンドが高いものから順にテストを進め、
低いものは実施しない、万が一余裕があれば優先度低も実施することにしました。
```
この物語を経験したことある方いませんか？？

これは**優先度ではなくてユウセンド**を決めているのです。
<font color="OrangeRed">ユウセンドをつけるとテスト工数がギュッッーーート縮む</font>というとんでも魔法が発動します。
不思議ですよね。


# ユウセンドの魔法使いへの想い
#### 問1. ひっ迫とは関係無く、初めから不要なテスト項目では？
<font color="Red">**画面テスト(Edge)** をコピーして **画面テスト(Chrome)** を作っていたのでそれぞれ半分ずつやります。</font>
まさかとは思いますが、こんなことはしていないですよね。まさかね。。

ユウセンドをつけたら不要なテストがあった。
これは厳しい評価をすると
<font color="OrangeRed">テスト実装において効率や生産性が低く、無駄な作業を行った。そしてテスト実施でも無駄なことをやろうとしている。</font>
ことに他なりません。
テストの7原則の1つに「全数テストは不可能」というのがあります。
別の言い方をするとテスト内容を絞る必要があります。テストは単に多ければ多いほど安心安全ではありません。適切に絞るための作業がテストアーキテクチャ、テスト設計、組み合わせ技法の使用などになります。
これらを適切に行えていれば初めから不要なテストを用意していないはずですが、存在するということはそういうことです。

```
・効率
・生産性
・納期
・コスト
```
これらの1つでも意識をしている組織で「**ユウセンド**をつけてやらないことにしました」と報告している方、ユウセンドに関わらず常に気にしましょう。
リリースOKという同じ結果を出すならテストの工数は少ない方が良いですよね！


#### 問2. 必要なのに実施しないことにしたテストでは？
まず、開発チームは基本的にリリースに向けてGOのベクトルで話を進めてくることが多いです。
QAや検証といった担当の役割をもう一度見直しましょう。会社やチームに入ったときに求められた役割は何でしたか。時と場合によっては存在意義に関わる選択になるかもしれません。

さて、現実的にこの選択しかない場合にQAとして譲歩するための条件をいくつか出します。

```
・機能制限をつける
　テストが出来なかったところは導線を塞ぐなど、不具合が発生し得ない状況にする。
　テストが終わった一部機能でもリリースすることがメリットがある場合に選択する手法です。
・テストをしていない箇所、想定する不具合の共有
　リリース前に営業やサポートデスクなどユーザーと直接かかわる方へ共有します。
　これをしないとユーザーはもちろん、内部的な信用問題にもなるので必ずやりましょう。
　事情を説明して先に謝ると意外なほどに許容度が上がります。
・リバート、ロールバックの準備
　不具合の発生を前提に元の状態に戻せる用意をする。
　サービス継続不可、データ消失でリカバリ不可などは取返しのつかない不可逆な状態を避ける。
```


# あるべき姿の優先度
優先度はプロダクトの種類、ベンダー、SIなど製品やポジションによって事情が異なるので一概にコレと決めるものではありませんが、一例として本来の優先度は以下のようにつけるものです。

```
■優先度を高くするもの
・共通ロジック部分
　不具合発生時の影響範囲が大きく、修正コストが大きくなる可能性があります。
　テストが進められない範囲が広い、修正待ちが長くなると想定する箇所は先に実施をしましょう。
・実装難易度が高い箇所
　実装難易度が高い機能は不具合が発生しやすく、不具合数が多くなりがちです。
　不具合の数が多くなりがちなうえ、難易度も高いため修正待ちが長くなることが想定されます。
・リスクの大きさ
　セキュリティやプロダクトとして致命的な不具合となる箇所の不具合はサービスの継続に関わるので
　優先的に行いましょう。ユーザーが良く使う機能なども考慮が必要です。

■優先度を低くするもの
・UIの一部
　タイポ、文字色の違いなど正しい仕様でなくても使用できるものなどは妥協できる範囲
　とすることが多いです。（デザイナーの方ごめんなさい）
・オプション的な機能
　メイン機能が整っていれば後日追ってリリースとすることが多いです。
　メイン機能50%、オプション機能が50%ではリリースできませんが
　メイン機能100%、オプション機能0%ならきっとリリースできるでしょう。
　やった/やっていないの管理もすっきりです。
```


## 締め
個人的には優先度をつけるのが嫌いです。
理由は
<font color="blue">テストケースは全部やるんだからやりたいところからやらせてくれー</font>
<font color="blue">優先度つけても1つも進まないじゃん！誰が美味いのそれ？</font>
と思っているから。

ヤバくなったからユウセンドをつけて！なんて言われても
<font color="blue">そんなものは初めから無いから消して良いものなんか無い！
機能を制限するならそこはやらないけど^^</font>
修正コストは一応気にするけど
<font color="blue">リリース日よ　オマエが変われば全てよし！</font>

リリース日に追われる案件とか無理ゲー。
[nvim] cannot find color scheme molokai

結局、```/home/user/.config/nvim/colors/molokai.vim```に置いたらいけた
以下ではだめだった..

- 公式のやりかた
    - ``` ~/.vim/colors/molokai.vim```
    - .vimrc/init.vimで```colorscheme molokai```を指定
- dein.vim

  ```
  call dein#add('tomasr/molokai')↲
  "call dein#source('molokai')↲
  ```
基本情報（正規化）

正規化はデータに矛盾や重複が生じないように表を最適化することです。
流れとしては下記となります。

```
非正規形
// 正規化されていない繰り返し部分を持つ表
第１正規形
// 繰り返し部分を分離させて、独立したレコードとした表
第２正規形
// 部分関数従属している列を切り出したカタチの表
第3正規形
// 主キー以外の列に関数従属している列を切り出したカタチの表
```
正規化の目的は、データや矛盾に重複を生じさせないこと。
関係データベースでは、第３正規形の表を管理します。

## 非正規系の表は繰り返し部分を持っている
![seikyup01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/79ba3f57-e055-fdca-b434-41be8e728028.png)
例えば上記の請求書があるとします。
ちゃんとカラムを設計できているかは別として例えば下記のような表になるとします。
|  請求書No |取引先名 |品名  |単価  |数量 |単位 |金額 |
|---|---|---|---|---|---|---|
|1  |太郎商事  |ペロペロキャンディ  |100  |1|個|400
|2  |田中悪代官 |もも  |200  |2|個|700

別のレコードがあるとします。
品名  |単価  |数量 |単位 |金額 |品名  |単価  |数量 |単位 |金額 |
|---|---|---|---|---|---|---|---|---|---
すもも  |400  |1|個|400|アイス  |500  |1|個|500
たこ  |200  |2|個|400

各レコードの長さがバラバラで、２次元の表になっていません。これが、非正規系の表です。
関係データベースでは、バラバラなレコードは表として管理することができません。

## 第１正規系の表は繰り返しを除いたカタチ
非正規系の表から、正規化を行うと
|  請求書No |取引先名 |品名  |単価  |数量 |単位 |金額 |
|---|---|---|---|---|---|---|
|1  |太郎商事  |ペロペロキャンディ  |400  |1|個|400
|1  |太郎商事|すもも  |400  |1|個|400|
|1  |太郎商事|アイス  |500  |1|個|500
|2  |田中悪代官 |もも  |200  |2|個|400
|2  |田中悪代官 |たこ  |200  |2|個|400

これで表が出来上がりました

## 関数従属と部分関数従属
ちょっと難しい言葉ですが、表の中における列と列との関係を表したものです。
主キーに対して、この項目がどんな関係にあるかを表す言葉だと思えば良いらしいです。

主キー
|  社員番号（主キー） |名前 |部署  |
|---|---|---|
|20000 |田代  |営業  |
|20001  |山本|開発  |

「社員番号」が決まると「名前」が決まる「部署」が決まる

主キー（複合キー）
|  学年（複合キー） |組(複合キー) |出席番号(複合キー)  |名前|
|---|---|---|---|
|6 |3  |001  |田代
|6  |3|002  |岡本

「学年」「組」「出席番号」が決まると「名前」が決まる

主キーが決まれば、列の値が一意に定まる関係のことを**関数従属**と呼びます。
「名前」は「社員番号」に関数従属している、などと使います。

複合キーの一部の項目だけで、列の値が一意に定まる関係
|  受注No |受注日付 |顧客コード  |顧客名称  |商品コード |商品名 |単価  |数量  |
|---|---|---|---|---|---|---|---|
|1011 |2010/11/12  |C010  |ほげ  |B101  |紙ファイル  |50 | 12
|1011  |2010/11/12|C010  |ほげ  |B102  |3色ボールペン  |300 | 8

受注Noが決まれば、3つの列が決まり
商品コードが決まれば2つの列が決まる

主キーの一部分に対して関係従属する項目なので、このような関係を**部分関係従属**と呼びます。

## まとめ
第二正規系と第三正規系は次でまとめます。
pythonで"/"を含む文字列を"/"で区切って一番最後の要素を出力する際の備忘録

pythonで"/"を含む文字列を"/"で区切って一番最後の要素を出力する際の備忘録

```test.py
# /を含む文字列
s = "xxx/yyy/zzz"

# "/"区切りで分割してリスト化
s = s.split("/")

# 最後の要素を取得
s = s[-1]

# 出力
print(s)
```

```test2.py
# 1行で実行する場合は以下の通り
s = "xxx/yyy/zzz"
print(s.split("/")[-1])
```

```sh
$ python test.py
zzz
$ python test2.py
zzz
```

他にも色々な方法がありそうな気がする

# 参考
https://atmarkit.itmedia.co.jp/ait/articles/2103/23/news022.html
eclipseで作ったSpringBootアプリをAWSを使って公開する#1

# eclipseからGithubにpushする
かなり手間取ったのでメモしておく。
Githubでトークン取得、リポジトリ作成ののち、EclipseでプロジェクトをGitにより連携する。

## 1. Githubで個人アクセストークンによる認証準備
### 1.1 アクセストークン作成
「Setting」→「Developer settings」→「Personal access tokens」と進んで「Generate new token」をクリックします。(https://github.com/settings/tokens)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781422/957e2141-fb25-e89d-9c3c-f7b6e47f8218.png)

ここで出てくるトークンをコピーして保存しておく。ページ遷移すると消えてしまうので注意。

### 1.2 リポジトリの作成
「Repositories」→「New」→名前を入力して「Create repository」
ここでのリポジトリ名はなんでもよいが、Javaプロジェクトの名前と一緒にするとわかりやすいと個人的には思う。今回はWebToDoStarter

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781422/ea297b30-4941-dec9-bf42-73f06cc6ed36.png)
[HTTPS]を選択し、URLを控えておく
ここでは https://github.com/sakuraba-coder/WebToDoStarter.git

## 2. EclipseでGithubへの最初のpush

プロジェクトの上で右クリック→「チーム」→「プロジェクトの共用」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781422/de2af3da-f8ae-da71-6520-94efdb18cf54.png)

リポジトリタイプは「Git」を選択し「次へ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781422/571323ea-b7af-2464-b521-1b0e5a24f20e.png)

「プロジェクトの親フォルダ―ないのリポジトリを使用または作成」をチェック
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781422/90fd7b67-0df7-182c-66cd-0b64af823d23.png)
プロジェクトを選択し、「リポジトリの作成」を押下
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781422/7cccce6c-92ce-409f-b09a-89cc868772a2.png)

ecipseの画面右上から「Git」を押してパースペクティブを変更する。
プロジェクトを開き、「リモート」の上で右クリック→「リモートの作成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781422/5c4e6d95-510e-5b7b-7399-14b267117089.png)

新規リモートの名前はそのままに「作成」

URLにgithubでコピーしたURLをコピペ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781422/5f57c1b1-c0c3-0b63-37f4-638e2234ae4f.png)

パスワードにはアクセストークンをコピペし「完了」を押下。
※「パスワード」となっていてややこしいがここはトークンを貼り付ける。

プッシュの構成はそのまま「保存およびプッシュ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781422/45f1d1c3-59b4-0f70-e86a-5281628e20f1.png)
成功！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781422/e03efb14-3a84-4926-94d4-b297503b2129.png)
以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781422/aa1b884c-f484-ad58-2f79-1e7c747669be.png)

## おまけ コード変更時のpush
ecipseの画面右上から「Git」を押してパースペクティブを変更する。
「Gitステージング」タブでステージされていない変更の「＋」ボタンを押下
「コミットおよびプッシュ」ボタンを押下→そのまま「次へ」→「完了」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781422/e5e67879-cffc-3e61-8653-ee80be8ddc7f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781422/265b061a-30df-21de-4d84-078e25615ef6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781422/4a2c0e5b-9b6a-fb32-2cf1-ef9728e6c0eb.png)

## 参考
https://insource-mkd.co.jp/staff-blog/16236.html

https://yuta-iwase.github.io/doc/pdf/github_tutorial.pdf

https://teratail.com/questions/187903

https://qiita.com/ikumi1025193/questions/59ec1894f747af722df0

## 続き
Saelsforceで「管理者は任意のユーザでログインできます」のチェックが非表示になっている場合の対応方法

Saelsforceでは
「管理者は任意のユーザでログインできます」
にチェックがある場合、
システム管理者が、内部エンドユーザにログインアクセスの許可を得なくても、任意のユーザとして組織にログイン可能です。

#### ヘルプ
「管理者は任意のユーザでログインできます」機能の有効化
https://help.salesforce.com/s/articleView?id=000334140&type=1

設定場所は以下となります

![ログインアクセス完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/919c0d63-3684-ccb0-68bd-65ceb6aacbe8.png)


しかし、実際には
「管理者は任意のユーザでログインできます」のチェックが非表示の場合があり、この場合サポートに問い合わせたら解決できる場合がございます
![ログインアクセス01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/70f4ec78-68ef-94d4-b88c-50e78ff792e8.png)


## サポートへ問い合わせる際の注意点

以下の内容をサポート問い合わせ内容に入れることにより対応してくださるスピードが速くなるかと思います


#### 記載内容1 有効化を実施する組織の組織 ID
有効化するIDを記載しましょう
組織IDの確認は以下のヘルプをみてください

Salesforce 組織 ID の確認
https://help.salesforce.com/s/articleView?id=000325251&type=1

#### 記載内容2 有効化を要望の組織のシステム管理者からの依頼であることの確認
サポートへの問い合わせ内容に「組織のシステム管理者からの依頼」であることを伝えましょう

#### 記載内容3 ヘルプを見たことの確認

以下のヘルプの内容を確認し、その旨をサポートにお伝えしましょう

「管理者は任意のユーザでログインできます」機能の有効化
https://help.salesforce.com/s/articleView?id=000334140&type=1


上記３点を記載することによりサポートの対応がスムーズになること間違いないかと思います。
クエリのアンチパターン

https://www.oreilly.co.jp/books/9784873115894/

SQLアンチパターンⅢ部のまとめメモです。
自分用にざっくりアンチパターンと解決策だけまとめるので、気になった方はぜひ書籍を読んでみてください。

### アンチパターン：NULLを一般値として使う、または一般値をNULLとして使う
データ型を問わず、欠けている値にはNULLを使う。それ以外には使わない。

### アンチパターン：非グループ化列を参照する
クエリのSELECT句に列挙されるすべての列は、行グループごとに単一の値の行でなければならない。(単一値の原則)

### アンチパターン：データをランダムにソートする
非決定性を持つ式(RAND関数)によってソートを行うことは、テーブルスキャンが発生しインデックスを使えない高コストなソートが行われてしまう。
以下のテクニックを用いてクエリの結果からランダムに行を１つ選択するようにする
* 1と最大値の間のランダムなキー値を選択する
* 欠番の穴の後にあるキー値を選択する
* すべてのキー値のリストを受け取り、ランダムに１つを選択する
* オフセットを用いてランダムに行を選択する

### アンチパターン：全文検索でパターンマッチ述語を使用する
パターンマッチ述語の最も大きな問題点は、テーブルスキャンが発生しインデックスを使えないこと。また、意図しないマッチが生じてしまうことが多い。
全文検索したいときは、各種データベース製品で提供される適切なツールを使用すること。

### アンチパターン：複雑な問題をワンステップで解決しようとする
１つのクエリで複数のタスクを行おうとしない。
同じ結果を返す複雑で長い１つのクエリと単純な２つのクエリがあるとすれば、後者を選ぶこと。

### アンチパターン：ショートカットの罠に陥る
タイプ数を減らすためSELECT句にワイルドカードや暗黙的な列指定を使用しない。
必要な列名は明示的に指定する。
素数表から模様を作る

$n$ を素数として、座標 $P_n$

```math:
\begin{eqnarray}
P_n & = & \left( \frac{ \cos{n} }{r}, \frac{ \sin{n} }{r} \right)　\\
r & = & \log{(n+\alpha)} \\
\end{eqnarray}
```

とします。$r$ は適当な値の半径。$Mathematica$ で

```mathematica:
Manipulate[Graphics[{Red, Point[
  Table[With[{x = Prime[n]}, {Cos[x], Sin[x]} /Log[x + r]], {n, p}]
]}], {p, 100, 1000000, 1}, {r, 10, 10000, 1}]
```

を実行してみたら綺麗な模様が出てきました。

![Mathematica.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226677/da2e4775-0705-2c7c-1caf-d7da31c152bf.png)

上記は捻れているので、$\cos,\sin$ の引数 $x$ を少し弄って $\frac{10^{10}-850}{10^{10}}$ 倍してみると、だいぶ捻れが戻った。

![スクリーンショット 2022-08-12 22.22.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226677/c1d76fa8-942e-b3da-b3b2-39cb0e7a6a35.png)

周期性があるので

```math:
\begin{eqnarray}
x & = & n \times 71 \times 280 \times \frac{10^{21} - 84913671448038.\cdots}{10^{21}} \\
P_n & = & \left( \cos{x}, \sin{x} \right) \\
\end{eqnarray}
```

とすると

```mathmatica:
ListPlot[Table[With[{x = Prime[n], y = 71*280*(10^21 - 84913671448038)/(10^21)},
 {Cos[x y], Sin[x y]}], {n, 100000}]]
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226677/aa406247-489b-aa2c-54d4-a62914a39b63.png)

捻れ分の補正ができれば 1 箇所 $(1,0)$ 付近に集まりそうですが…
<sup>手作業で値を追い込むのは厳しい…</sup>

追記： $71 \times 280 \times \cdots$ ではなく $710 \times \cdots$ でもよさそう。

というか $710 ≒ 113 \times 2\pi$ だった。
最小二乗法・リッジ回帰・ラッソ回帰の係数を比較する

<link rel="canonical" href="https://k-dm.work/ja/basic/regression/ridge_and_lasso/">

<iframe width="560" height="315" src="https://www.youtube.com/embed/rhGYOBrxPXA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# この記事は何？

リッジ回帰・ラッソ回帰とはモデルの係数にペナルティを付けることでモデルが過学習しないように工夫した線形回帰モデルです。これらの手法のように、過学習を防いで汎化性を高めようとする技術を正則化と呼びます。このページでは、pythonを使って最小二乗法・リッジ回帰・ラッソ回帰を実行して、それらの係数を比較します。

## 必要なモジュールをインポート

```python
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.datasets import make_regression
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
```

## 実験用の回帰データを作成する
[sklearn.datasets.make_regression](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_regression.html)を用いて人工的に回帰データを作成します。予測に必要な特徴量は2つ(`n_informative` = 2)と指定します。それ以外は予測の役に立たない冗長な特徴量です。

```python
n_features = 5
n_informative = 2
X, y = make_regression(
    n_samples=500,
    n_features=n_features,
    n_informative=n_informative,
    noise=0.5,
    random_state=777,
)
X = np.concatenate([X, np.log(X + 100)], 1)  # 冗長な特徴量を追加する
y_mean = y.mean(keepdims=True)
y_std = np.std(y, keepdims=True)
y = (y - y_mean) / y_std
```

## 各モデルを学習する
それぞれのモデルについて同じデータをつかって訓練して違いを見てみます。
本来は正則化項の係数alphaをいろいろ変えて試すべきですが、ここでは固定しています。

```python
lin_r = make_pipeline(StandardScaler(with_mean=False), LinearRegression()).fit(X, y)
rid_r = make_pipeline(StandardScaler(with_mean=False), Ridge(alpha=2)).fit(X, y)
las_r = make_pipeline(StandardScaler(with_mean=False), Lasso(alpha=0.1)).fit(X, y)
```

## 各モデルの係数の値を比較する

各係数の絶対値をプロットします。線形回帰は係数がほとんど０にならないことがグラフから見て取れます。 また、Lasso回帰は予測に必要な特徴量以外で係数＝０になっていることが確認できます。

有用な特徴は２個（`n_informative = 2`）だったので、線形回帰は有用でない特徴でも無条件に係数がついていることがわかります。Lasso・Ridge回帰は２個まで絞り込むことはできませんでしたが、それでも多くの不要な特徴で係数が０になるという結果になりました。

```python
feat_index = np.array([i for i in range(X.shape[1])])

plt.figure(figsize=(12, 4))
plt.bar(
    feat_index - 0.2,
    np.abs(lin_r.steps[1][1].coef_),
    width=0.2,
    label="LinearRegression",
)
plt.bar(feat_index, np.abs(rid_r.steps[1][1].coef_), width=0.2, label="RidgeRegression")
plt.bar(
    feat_index + 0.2,
    np.abs(las_r.steps[1][1].coef_),
    width=0.2,
    label="LassoRegression",
)

plt.xlabel(r"$\beta$のインデックス")
plt.ylabel(r"$|\beta|$")
plt.grid()
plt.legend()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2225166/33d9aecb-95a2-5fce-76ce-af216126f443.png)
Javaの学習 ~varによる型推論~

### varとは
変数宣言時のデータ型を推論する（ローカル変数の型推論）場合に、データ型の代わりにvarを使って変数を宣言します。
※型推論はコンパイル時に行われる。
※ローカル変数の宣言にしか使えない。

#### 推論できるパターン
例えば、下記の変数aには整数リテラルの10を代入しているので、データ型はint型になります。
```java
var a = 10;
```

また、以下のようにメソッドの戻り値を受け取るのにも使うことができる。(メソッドの定義から型が判別できる為)
```java
var b = sample();
```
###### ダイヤモンド演算子
ダイヤモンド演算子とは、下記コードに使用されている「<>」のこと。
```java
ArrayList<String> c = new ArrayList<String>();
//右辺の<>の中身（String）を省略することができる。
ArrayList<String> c = new ArrayList<>();
```
型推論において、下記のようなコードを記述したとすると、
```java
var d = new ArrayList<>();
```
参照できる型情報がない場合はObject型として判断される為、以下のコードと同じ意味になります。
```java
var d = new ArrayList<Object>();
```
#### 推論できないパターン
大まかにいうと、データ型を特定できない時にコンパイルエラーとなります。

・変数が初期化されていない
```java
var e;
```
・nullで初期化している
```java
var f = null;
```
・ラムダ式
```java
var g = () -> {};
```
・配列の初期化式
```java
var h = {1, 2, 3};
```
・フィールドの宣言
※フィールドとは、クラス内で値を保管するために使用するもの。
```java
public class Sample {
    var name = "";
    var age = 15;
}
```
・引数の型宣言
```java
public class Sample {
    public void test(var value) {
        System.out.println(value);
    }
}
```

### まとめ
私のレベルでは、varの使い所がいまいち分かりませんでした。今後実務でも使いこなせるようにしていきたいです！！
閲覧いただきありがとうございました！！！
【Swift 5.5】inout 引数とは

Swift の inout 引数について改めて調べ直したので、まとめておこうと思います。

## 環境

- Swift 5.5

## inout 引数とは

> 関数内での引数への再代入を**関数外へ反映**させる

ことができるそうです。（『[改訂新版]Swift 実践入門』より）

少し言い換えると、**引数として受け取った値を変更し、関数外へその値を伝えたい**場合に inout 引数を使用すると理解しています。

では、inout ではない普通の引数と比較しながら理解してみようと思います。

まず普通の引数を関数内部で変更してみます。

```swift
// 普通の引数の場合
func greetUsual(user: String) {
    if user.isEmpty {
        user = "Anonymous" // Cannot assign to value: 'user' is a 'let' constant のエラー発生
    }
    print("Hello, \(user)")
}
```

もうコードに書いていますが、結論**できません**。
`Cannot assign to value: 'user' is a 'let' constant`というコンパイルエラーが発生します。

では次に、inout 引数で試みます。
関数に関しては普通の引数との違いは、`inout`をつけることです。

```swift
// inout 引数の場合
func greet(user: inout String) {
    if user.isEmpty {
        user = "Anonymous"  // 引数を変更することができる。エラーは発生しない。
    }
    print("Hello, \(user)")
}
```

本当に**外部に変更した値を伝えることができているのか**、以下のコードで確認してみます。
`user1`　の値が`Anonymous`に変わっていれば、成功です。

また inout 引数をもつ関数を呼び出す時は、以下2点に注意します。

- `&`（アンパサンド）をつけること
- 引数には変数を渡すこと（定数ではダメ）

```swift
var user1: String = ""  // 変数を定義
print("user1（変更前）：\(user1)")

greet(user: &user1)  // `&`（アンパサンド）をつける

print("user1（変更後）: \(user1)")
```

実行結果はこうなりました。

```
user1（変更前）：
Hello, Anonymous
user1（変更後）: Anonymous
```

成功です！ :tada: 
見事**関数の外にある`user1`という変数に、関数内での引数への再代入を反映させる**ことができました。
`greet`関数を実行する前と後で、`user1`の値が変化していることが証拠です。

## 注意点（※コンパイルエラーレベル）

いくつか注意点があったので、記載しておこうと思います。どれもコンパイルエラーで指摘される内容にはなります。:bow:

### inout 引数には変数を指定する必要がある

inout 引数は何度も書いているように、関数内での引数への再代入を関数外へ反映するという機能なので、定数を指定することはできません。変数を指定する必要があります。

もしも以下のように定数を指定した場合、
`Cannot pass immutable value as inout argument: 'user1' is a 'let' constant`のエラーが発生します。

```swift
let user1: String = ""
greet(user: &user1)  // Cannot pass immutable value as inout argument: 'user1' is a 'let' constant のエラーが発生
```

### inout 引数にはデフォルト値を指定することができない

以下のように`user`に`ユーザ1`というデフォルト値を持つように試してみますと、
`Cannot provide default value to inout parameter 'user'`のエラーが発生します。

```swift
func greet(user: inout String = "ユーザ1") {  // Cannot provide default value to inout parameter 'user' のエラーが発生
    if user.isEmpty {
        user = "Anonymous"
    }
    print("Hello, \(user)")
}
```

### inout のパラメータには可変長引数を設定することができない

以下のように`user`を可変長引数にしてみますと、
`'inout' must not be used on variadic parameters`のエラーが発生します。

```swift
func greet(user: inout String...) {  // 'inout' must not be used on variadic parameters のエラーが発生
    // do something
}
```

## おわりに

説明しておいてなんですが、いくつかの記事では
関数の処理の中で意図せず値が書き換えられてしまうので、処理を追いづらく、不具合の元になってしまうため、使用はあまり推奨していないという記事を確認しました。

inout を使って書き換えるよりも、関数から戻り値として返す方がいいということかなと理解しています。

今回はそれを念頭に置きつつも、仕事でこの inout 引数を見かけてなんじゃこりゃとなったので調べてみました。

間違いその他コメントあれば、ご指摘いただけると幸いです :pray: 

## 参考

- （書籍）『[改訂新版]Swift 実践入門』

https://qiita.com/chihayafuru/items/f6bb38c4a34d8cf62aa9

https://www.swiftlangjp.com/language-guide/functions.html#in-out-%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BFin-out-parameters

https://zenn.dev/shinkano/articles/6fd6930e37e4db
AWS SAA合格。勉強法を紹介(2022/8/12)

検索したら腐るほど出てくるAWS SAAの合格体験記。
私も合格したのでせっかくだから残そうと思います。

ちなみにスコアは747点(合格ライン720点)でした。
結構勉強したつもりなのに結構ギリギリ…

# 使用した教材
以下の教材を使用しました。
・koiwaの『AWS WEB問題集で学習しよう』
・Udemyの『【2022年版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座』
※Udemyは最終セクションの問題集のみを2周。
　ハンズオン等はAWS CLFの勉強や実務で触ったのでいいかなと思いやっていません。

問題集をひたすら解き、分からないところは公式ドキュメントや各種解説サイトを見て勉強する。というスタンスで挑みました。

# 勉強期間や内容
勉強期間は仕事の兼ね合いもあり1ヶ月半で、1日1~2時間程度やりました。
トータルの勉強時間は大体50~60時間ぐらいかと思います。

koiwaの問題集は#1~#79までを1周、#80~#160を3周しました。
※個人的には#100~#160を3周でもいいかと感じました。

試験前は、
AWS問題集は模擬試験で大体850点~950点ぐらいの正答率。
Udemyは80%~90%の正答率。
を安定して出せるレベルまで持っていきました。

# 試験の感触
koiwaの問題集が試験に近い内容が多かったと感じました。

問題内容としては大体以下の様な感触です。
約30%：問題集とほぼ同じ。
約30%：問題集と似ていて、少し考えれば回答可能。
約30%：問題集と似ているが、ある程度考えなければいけない。
約10%：問題集には無かったような内容。

# 個人的にやっとけばよかったこと
ECSとRoute53関連をもっと実際に触っていればよかったと感じました。

ECSもDockerも業務やハンズオンで触ったことが無かったので、問題集と公式サイトや解説サイトの説明を丸暗記しているだけの状態でした。
サービス単体を答える問題はそれほど難しくなかったですが、複数のAWSサービスを組み合わせて最ベストプラクティスを答える問題の時に悩まされました。

Route53も同様です。こちらはELBやCloudFrontとの絡みに悩まされました。

この辺りを抑えておけばもう少しスコアを出せたかな？と、感じています。

# 最後に
問題集をひたすら解き、類似問題が多いサービスやよく間違る問題のサービスを公式ドキュメントや解説サイトで抑える。
という、AWS SAA合格サイトに書かれている王道な勉強法で合格できました。

ただ、やったことの無い分野に関してはハンズオンで身体に覚えさせるべきだと感じました。

なにはともあれ合格できて一安心です。

2週間程度は羽根を伸ばしてのんびりし、次はSysOps辺りを狙おうかと思います。

以上。
指定した三つの数字の最小値を表示するプログラム

# 指定した三つの数字の最小値を表示するプログラム

```python:最小表示練習1.py
import tkinter as tk

def dispLabel():
    A = int(EditBox1.get())
    B = int(EditBox2.get())
    C = int(EditBox3.get())
    str_A=str(A)
    str_B=str(B)
    str_C=str(C)
    
    if A<=B and A<=C:
        lbl4.configure(text="一番小さいのは"+str_A)

    elif B<=A and B<=C:
        lbl4.configure(text="一番小さいのは"+str_B)

    else C<=A and C<=B:
        lbl4.configure(text="一番小さいのは"+str_C)


EditBox1= tk.Entry(width=2)
EditBox1.place(x = 20, y = 20)
EditBox2= tk.Entry(width=2)
EditBox2.place(x = 60, y = 20)
EditBox3= tk.Entry(width=2)
EditBox3.place(x = 100, y = 20)

btn=tk.Button(text="最小値を求める",command=dispLabel)
btn.place(x = 60, y = 60)

lbl4=tk.Label(text=" ")
lbl4.place(x = 20, y = 100)
```


## 感想
A,B,Cの大小の場合分けを最初は六通りにしていたけれど、三通りのコードにできることにも途中で気づけた。
できるだけ簡単なコードにすることを模索することも大切だと感じた。
Redshift Serverless について見かけた課題と対応策

Redshift Serverless について見かけた課題と対応策（2022年7月19日時点）をまとめました。GitHubリポジトリ「[Awesome Redshift JP](https://yuzutas0.github.io/awesome-redshift-jp/docs/setup/faq.html)」にまとめた内容の転記です。

# 概要

- プレビュー料金に見える→金額あってそう
- 名前空間やワークグループの削除エラー→英語表示
- ProvisionedとAPIが違う→ラッパーを使う
- 時間課金でストリーミング不向き→二台構成 or マイクロバッチ化

# Redshift Serverless の料金表が「プレビュー」のままに見える（2022年7月19日時点）

日本語だと「プレビュー」の記載がありますが、英語だとPreviewの記載は外れています。 料金表の内容も同じなので、日本語の翻訳が間に合っていないようです。

日本語の料金表:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308961/b52240ee-c90f-e5af-628e-323d0e467ab6.png)

英語の料金表:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308961/febf3e90-aa65-2b5c-dc0d-177f5ca73b62.png)


# Redshift Serverless の名前空間やワークグループの削除ができない（2022年7月19日時点）

日本語表示だとコンソールでエラーになってしまう。

> Amazon Redshift Serverlessで名前空間もワークグループもコンソールのエラーで削除できない
> https://twitter.com/Korosuke512tr/status/1547783609666265089

https://twitter.com/Korosuke512tr/status/1547783609666265089

解決策1) 管理コンソールを日本語から英語に変える。

> 管理コンソールの言語を英語に変更して試していただくと、削除できるようになるかもしれません。
> https://twitter.com/simosako/status/1547790642926870528

https://twitter.com/simosako/status/1547790642926870528

解決策2) CLI経由で削除する。

> CLI で消せた
> https://twitter.com/hayaok3/status/154708635348962099

https://twitter.com/hayaok3/status/1547086353489620992

# Redshift Serverless の credentials はiamが別

`redshift:GetClusterCredentials` ではなく `redshift-serverless:GetCredentials` が対象となる。

> 一時的な認証情報を使用してサーバーレスワークグループへの認証を行う場合は、ポリシーで redshift-serverless:GetCredentials アクションの使用が許可されていることを確認します。 > https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/data-api.html

非公式ラッパーとして https://github.com/mashiike/redshift-credentials が作られた。

> ServerlessなのかProvisionedなのか意識して、更にAPIの投げわけしないといけないの？ そう思った人（私）向けにServerlessでもProvisionedでも、どっちのエンドポイントをパラメータに渡してもいい感じに一時認証してDB USERとDB Passwordを返してくれる君を書いてみました。
> https://datatech-jp.slack.com/archives/C03MHCZS2GG/p1657977637298559

https://datatech-jp.slack.com/archives/C03MHCZS2GG/p1657977637298559

# Redshift Serverless は時間課金なのでバッチ向き

ストリーミング連携など、高頻度にデータ連携するときは以下の構成だとコスト効率が良い。

- 小さめの常駐インスタンスにデータを流す。
- Redshift ServerlessからData Sharingで常駐インスタンスを参照する。

> https://twitter.com/mashiike/status/1547032218140192768

https://twitter.com/mashiike/status/1547032218140192768

Redshift Serverlessで完結したい場合は、ログをストリーミングでS3に反映しつつ、 Redshiftへのロードは1時間に1回のマイクロバッチで実現するような設計が考えられる。

> https://twitter.com/yuzutas0/status/1547011222998220800

https://twitter.com/yuzutas0/status/1547011222998220800

# 最後に

「[Awesome Redshift JP](https://yuzutas0.github.io/awesome-redshift-jp/docs/setup/faq.html)」では、Amazon Redshift によるデータ活用を実現するためのノウハウや参考資料をまとめています。主に、Slackコミュニティ「[datatech-jp](https://datatech-jp.github.io/)」の「[#redshift](https://datatech-jp.slack.com/archives/C03MHCZS2GG)」チャンネルで会話しています。オススメの記事があればリポジトリに反映したいのでぜひ教えてください。
json-jwt gem の JWK Set キャッシュ戦略

## JWK Set 取得タイミング

* OIDC ID Tokenの署名検証時 
* その他 JWT 署名検証時
  * e.g.,) Apple の Server-to-server Notification

## JWK Set 取得頻度とキャッシング

JWK Set には複数の鍵が含まれており、固定の URL から取得可能になっていることが多い。
OpenID Connect では `/.well-known/openid-configuration` にアクセスすることで JWK Set が公開されている URL (`jwks_uri`) を取得できる。

このエンドポイントから返される鍵は、一定期間ごとに新しいものに差し替えられたりするが、`jwks_uri` は固定であるため署名検証者は常にこのエンドポイントにアクセスすれば署名検証に必要な鍵が得られるようになっている。

しかし、ID Token や Server-to-server Notification が届くたびにこのエンドポイントにアクセスするのは負荷が高いので、一定期間この JWK Set をキャッシュしたくなる。

一方で、一般的に OpenID Connect では、鍵の差し替え (Key Rotation) は IdP が任意のタイミングで行い、その際事前に RP に通知することもない。
よって RP 側はキャッシュした JWK Set に署名検証に必要な鍵が含まれていないという事象が任意のタイミングで発生することになる。

## JWK Set キャッシュと JWT の kid ヘッダー

JWK Set を `jwks_uri` で公開し、ID Token やその他 JWT をその JWK Set 中の特定の鍵で署名検証させる場合、JWK Set 中の各鍵に `kid` を付与しつつ、署名検証対象となる ID Token や JWT のヘッダーに署名に使うべき鍵の `kid` を付与することが一般的である。

そのため、キャッシュされた JWK Set に署名対象の ID Token / JWT に付与された `kid` を持つ鍵が存在しなければ、キャッシュを破棄して新たに `jwks_uri` から JWK Set を取得し直すべきである。

こんな感じ？

```ruby
cached_jwks = Cache.read('apple:jwks')
jwk = cached_jwks.detect { |jwk| jwk.kid == kid }

if jwk.present?
  jwk
else
  new_jwks = fetch(jwks_uri).detect { |jwk| jwk.kid == kid }
  Cache.write('apple:jwks', new_jwks)
end
```

ただ、こういうコードをライブラリ中で扱おうとする少しめんどくさいので、`json-jwt` では `kid` を Cache Key に含めて JWK Set をキャッシュするという方法を取っている。

こんな感じ。([実際のコードはこちら](https://github.com/nov/json-jwt/blob/master/lib/json/jwk/set/fetcher.rb#L63-L83)、[詳しい使い方はこちら](https://github.com/nov/json-jwt/wiki/JWK-Set#fetching))

```ruby
def self.fetch(jwks_uri, kid:, auto_detect: true)
  cache_key = [
    'json:jwk:set',
    OpenSSL::Digest::MD5.hexdigest(jwks_uri),
    kid
  ].collect(&:to_s).join(':')

  jwks = Set.new(
    JSON.parse(
      cache.fetch(cache_key) do
        http_client.get_content(jwks_uri)
      end
    )
  )

  if auto_detect
    jwks[kid] or raise KidNotFound
  else
    jwks
  end
end
```

この方法では、JWK Set に複数の鍵が含まれている場合、`kid` 単位で別々に同じコンテンツがキャッシュされうるため、キャッシュコンテンツは増えてしまうが、一般的には JWS Set に1,000個や10,000個もの JWK が含まれるような実装は存在しないので、せいぜい5~6個の同じコンテンツが重複してキャッシュされてしまうにすぎないだろうということで、`json-jwt` では実装のシンプルさを優先している。

なお、上記コードではデフォルトでは JWK Set 取得と同時に `kid` による JWK の特定まで行なっている。
`JWK::Set` クラスが `fetch` すると `JWK` インスタンスを返してくるのは少し違和感はあるのだが、`kid` を指定して `fetch` しておいて、JWK Set 全体が欲しいケースなどそうそうないだろうという判断である。

## JWK Set をキャッシュする際の注意点

Cache Key に `kid` を利用する都合上、`kid` が特定されるまえに (= ID Token 等を Parse して `kid` ヘッダーを見る前に) JWK Set を取得するといった処理はできない。

よって、ID Token 等を受け取る前に事前に JWK Set をキャッシュしておくといった利用方法は取れないことになる。
addやcommitをやり直したいときのコマンド

はじめに
--
ポートフォリオを作成するときに、commitメッセージのルールをしっかり決めて運用した方がいいと思い、とてもシンプルでわかりやすい下記の記事を参考に開発を進めています。

https://qiita.com/itosho/items/9565c6ad2ffc24c09364

しかしいくらルールを守ろうと思っても、やはり人間なので

**commit後にメッセージ内容間違えた！**
**ステージングに上げるファイル間違えた!**

ということミスが何度も起きます。

ミスするたびに調べるのも無駄な工数だと思ったので、忘れないように備忘録を残そうと思います。

commitをやり直したいとき
--
コミットを間違えた！という時は、下記のコマンドを叩けば直前のcommitを取り消すことができる。

~~~
#直前のcommitを取り消し
git reset --soft HEAD^
~~~

ちなみに、複数のcommitを同時に取り消したいときは、下記のコマンドを叩けばOK。
~~~
#取り消したい数をnの箇所に書く
git reset --soft HEAD~n
~~~

commitメッセージだけ修正したい時
---
commitしたファイルはあってるけど、メッセージ内容を間違えただけだからそれだけ修正したい！というときは下記のコマンドを叩けばOK。
設定しているエディタが起動し、修正が可能。

最初はviが怖かった。。

~~~
git commit --amend
~~~

addを取り消したいとき
--
下記のコマンドを叩けばOK。
ただインデックスからワーキングツリーの戻るだけなので、このコマンドを叩くことによってファイルの中身が消えるとかそういう心配はしなくて良い。

~~~
git reset
~~~

以上です。
黒いターミナルとgitは最初は怖くて仕方なかったけど、いろんなコマンドを叩くことによって親近感が最近湧いてきています。正直まだ怖い時はありますが。。
DB物理設計アンチパターン

https://www.oreilly.co.jp/books/9784873115894/

SQLアンチパターンⅡ部のまとめメモです。
自分用にざっくりアンチパターンと解決策だけまとめるので、気になった方はぜひ書籍を読んでみてください。

### アンチパターン：FLOATデータ型を使用する
丸め誤差が生じてしまうため、小数値のデータ型が必要な場合にFLOATデータ型を選択しない。
NUMERICデータ型を使用すること。

### アンチパターン：限定する値を列定義で指定する
ENUMやCHECK制約のように列の取りうる値を指定されたセットの中に制限することはしない。
参照するためのテーブルを作成し、許可する値をレコードとして登録すること。

### アンチパターン：物理ファイルの使用を必須と思い込む
画像をファイルシステムにファイルとして格納し、ファイルパスをVARCHARとしてデータベースに格納しない。
BLOBデータ型を使用し、画像データをデータベースに格納すること。

### アンチパターン：闇雲にインデックスを使用する
インデックスを全く定義しなかったり、役立たないインデックスを定義したりしない。
MENTORの原則に基づいて効果的なインデックス管理を行う。
* M - Measure(測定)
* E - Explain(解析)
* N - Nominate(指名)
* T - Test(テスト)
* O - Optimize(最適化)
* R - Rebuild(再構築)
STM32G031J6M6用の俺の考えた最強のLチカ(Keil Studio)(タイマー割り込み)


x 過去ログを見よ!!

目的
最強のLチカを作る。
PA_11(5ピン)
STM32G031 mbed-osの攻略の進捗が少し進んだ
なんか動かなくて1か月くらい悩んでいたが「すっきり」

![o_con660.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e7964537-60e5-5621-d7a2-ea04e5e9d996.jpeg)


![o_con661.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ae107c0c-f893-201a-d5ee-782396db7ca2.jpeg)



![o_con656.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4a667265-e111-064f-75f0-5fc24e87c92a.jpeg)


![o_con657.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f726df0a-e3bf-3e1f-0259-544340b50f7f.jpeg)


![o_con658.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d54d2b6e-7dc2-abf7-4498-062bbeb778ab.jpeg)



```c++

//PA_11_L_TI_KA_031_K1

#include "mbed.h"


//LEDのポートの定義
DigitalOut myled(PA_11);

//タイマー割り込みの定義
Ticker flipper;


//タイマー割り込みの呼び出し関数
void flip()
{

    //LEDの反転
    myled = !myled;

} //flip


//メイン関数
int main()
{

    //タイマー割り込みの開始
    flipper.attach(&flip, 2s);

    //無限ループ
    while(1) {}

} //main



```
【初心者が教える超入門】Pythonによるデータサイエンス①（要素数、ユニーク数の確認）

# はじめに
初めまして！
技術・プログラミング初心者のTim（てぃむ）です。
今後は、自身で学び始めて分かったこと・習得したこと等を初心者ならではの視点でお伝えできればなと思っております。
記事をご一読いただいた上で、意見/指摘/アドバイス等々いただけるととても嬉しいです！
よろしくお願いいたします。

# 本題
今回は、最近学び始めたデータサイエンスの分野です。
Pythonでデータ分析を行う際に、必要なコードを簡単に綴っていこうと思います。
複数回に分けて随時投稿していきます。
記念すべき第1回です！

# データフレームの行列・列数の確認
## df.shape
```python
import pandas as pd

#csvファイルの読み込み
df = pd.read_csv('test.csv')

df.shape
print("行数,列数", df.shape)
```
出力例
```python
行数,列数 (450, 8)
```


# データのサイズ(行数x列数)の確認
## df.size
size関数の返り値は行数x列数ですが、これは欠損値(NaN)を含んだデータの個数です。
```python
import pandas as pd

#csvファイルの読み込み
df = pd.read_csv('test.csv')

df.size
print("データのサイズ", df.size)
```
出力例
```python
データのサイズ 3600
```


# ユニーク数の確認
## df[“列名”].nunique()
ユニーク数とは、特定の列に含まれる要素の「種類」の数を表します。
```python
import pandas as pd

#csvファイルの読み込み。test.csvの箇所には各自のcsvファイル名を記入。
df = pd.read_csv('test.csv')

#df["列名"].nunique()
df["都道府県"].nunique()
print("都道府県の数", df["都道府県"].nunique())
```
出力例
```python
都道府県の数 44
```


# ユニークな要素の一覧
## df[“列名”].unique()
```python
import pandas as pd

#csvファイルの読み込み。test.csvの箇所には各自のcsvファイル名を記入。
df = pd.read_csv('test.csv')

#df["列名"].unique()
df["都道府県"].unique()
print("都道府県のユニークな要素", df["都道府県"].unique())
```
出力例
```python
都道府県のユニークな要素 ['北海道' '青森県' '岩手県' '宮城県' '秋田県' '山形県' '福島県' '茨城県' '栃木県' '群馬県' '埼玉県' '千葉県' 
 '東京都' '神奈川県' '新潟県' '富山県' '石川県' '福井県' '山梨県' '長野県' '岐阜県' '静岡県' '愛知県' '三重県' 
 '滋賀県' '京都府' '大阪府' '兵庫県' '奈良県' '和歌山県' '島根県' '岡山県' '広島県' '山口県' '香川県' '愛媛県' 
 '福岡県' '佐賀県' '長崎県' '熊本県' '大分県' '宮崎県' '鹿児島県' '沖縄県'] 
```


# 特定の列の「要素別の頻度（出現回数）」の確認
## df[“列名”].value_counts()
```python
import pandas as pd

#csvファイルの読み込み。test.csvの箇所には各自のcsvファイル名を記入。
df = pd.read_csv('test.csv')

#df["列名"].value_counts()
print("都道府県別の頻度", df["都道府県"].value_counts())
```
出力例
```python
都道府県別の頻度 東京都     56 
神奈川県    39 
愛知県     36 
埼玉県     34 
大阪府     33 
兵庫県     21 
...
```


# 要素別のデータ数を「昇順」で表示
## df[“列名”].value_counts(ascending=True)
```python
import pandas as pd

#csvファイルの読み込み。test.csvの箇所には各自のcsvファイル名を記入。
df = pd.read_csv('test.csv')

#df["列名"].value_counts(ascending=True)
print("都道府県別の頻度", df["都道府県"].value_counts(ascending=True))
```
出力例
```python
都道府県別の頻度 山形県      1 
宮崎県      1 
青森県      1 
岩手県      2 
熊本県      2 
佐賀県      2 
...
```
PowerShellの起動時にエイリアスを設定してみた

## はじめに
PowerShellでvimコマンドを使う為にエイリアスを設定しましたが、PowerShellを閉じると設定が消えてしまいます。
PowerShellを起動する度にコマンドを打つのは面倒なので、PowerShellの起動時にエイリアスが実行される様にしました。

## Step1. 実行ポリシーの変更

管理者権限でPowerhsellで以下のコマンドを実行する。
```
get-executionpolicy
```
上記で`RemoteSigned`が返ってくればOK。
デフォルトは`Restricted`なので多くの人は`Restricted`が返ってくると思います。

`Restricted`が返ってきた人は、下記を実行します。
```
Set-ExecutionPolicy RemoteSigned -Force
```
もう一回`get-executionpolicy`を実行し、下記の様に`RemoteSigned`が帰ってくることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188830/cc59e61c-bf09-5d85-88c0-3b89b59307d6.png)

## Step2. プロファイルの作成。
ユーザー権限でPowerhsellを開きなおし、下記のコマンドを実行する。

```
New-Item –type file –force $profile
notepad $profile
```

`notepad $profile`でメモ帳が起動する。

## Step3. エイリアスの定義

今回は。Vimコマンドを使える様にしたかったので、
以下の様にVimをインストールしたディレクトリを指定し、エイリアスの定義をしました。

```
set-alias vi 'C:\Program Files (x86)\Vim\vim90\vim.exe'
set-alias vim 'C:\Program Files (x86)\Vim\vim90\vim.exe'
```

## Step4. 結果確認
vimコマンドを使用できる様になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188830/cf24161a-0a4a-5611-b813-10d9af71bdbf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188830/1abbbdf6-94cf-7522-b313-c459f7da8756.png)


## 用語解説
`ExecutionPolicy`・・・PowerShellの実行ポリシー
以下の公式ドキュメントが参考になります。
https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.2

`New-Item`・・・ファイルやフォルダを作成するためのコマンド
参考記事
https://atmarkit.itmedia.co.jp/ait/articles/1606/23/news017.html
STM32G031J6M6用の俺の考えた最強のLチカ(mbed-os 6)(タイマー割り込み)


x 過去ログを見よ!!

目的
最強のLチカを作る。
PA_11(5ピン)
STM32G031 mbed-osの攻略の進捗が少し進んだ
なんか動かなくて1か月くらい悩んでいたが「すっきり」

![o_con662.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/89e0e7f3-00d8-6635-a6e6-00e9832c1242.jpeg)



![o_con660.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/62d3524a-386b-6635-22ad-172f6e59fffb.jpeg)



![o_con661.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/22781b80-4f60-aa6b-af56-faa5b619e7a0.jpeg)



```c++


//PA_11_L_TI_KA_031_1

#include "mbed.h"


//LEDのポートの定義
DigitalOut myled(PA_11);

//タイマー割り込みの定義
Ticker flipper;


//タイマー割り込みの呼び出し関数
void flip()
{

    //LEDの反転
    myled = !myled;

} //flip


//メイン関数
int main()
{

    //タイマー割り込みの開始
    flipper.attach(&flip, 2s);

    //無限ループ
    while(1) {}

} //main



```