OmniAICreator/Qiita-1.07M huggingface dataset:
2023/02/20以降の記事はVCC使用前提で記述します。

しばらく記事を書いていない間にVCC(VRChatCreatorCompanion)が実装されてしまいました。
今後SDK3でのプロジェクトのアップロードができなくなると思うので、
VCCでのプロジェクト作成手順を記載します。(2023/02/20時点)

# VCCって何？
ワールドとかアバターとかのプロジェクトをバックアップしたりアップデートしたりできるやつ。
**VRChat版のUnity Hubみたいなもの**だと思ってください。
# 入れ方
![VCC.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708808/63a27cbe-d9d9-1b1d-e1a1-3dff68e0361d.png)
VRCHATのマイページでDownload→Download the Creator Companionをクリックしてください。
ダウンロードしたファイルを実行していけばインストールが終わります。
# 使い方
![vc1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708808/6de40895-9192-9404-8dba-b31ee163a74a.png)

**Add→プロジェクトをVCCで管理できるようにする
New→新しくVCCでプロジェクトを作成する**

**今回はNewでプロジェクトを作成してください。**
![VC2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708808/b2685dea-aff2-1d7d-5fce-1769dfc097ed.png)
**ProjectのNew→UdonSharpを選択してください。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708808/039e716f-6c8b-a9d1-53b6-36fc9f6dffd1.png)
**プロジェクト名とフォルダパス(プロジェクトの保存先)を指定してください。
New projectのままだとファイルがどれかわからなくなるので変えたほうがいいです。**
ファイル名を入力したら右下のCreateボタンを押してください。
![VC3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708808/2ae80d29-32c9-b35b-6560-e4e779fdbcd3.png)
ちょっと待ったらこんな感じの画面になると思います。
UdonSharpだけ使うなら別に大丈夫ですが、**この状態(UdonSharpのバージョンが1.0.1より新しいとき)にIwasyncやQVPenを入れるとスクリプトがエラーを吐いて動かなくなる**(執筆時現在)ので、右のスクロールバーを下げてUdonSharpのバージョンを1.0.1にDowngradeしましょう。
![VCC4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708808/10723b60-1229-506d-683e-b3645abe1203.png)
**UdonSharpをDowngradeすると何故かSDKのバージョンもDowngradeされて、プロジェクトのPrefabからVRCWorldのPrefab(ワールドアップロードに必須のやつ)が消えてたりするときもある**ので、赤枠のUpdateボタンを押しておいてください。

ここまででプロジェクトの作成は完了です。あとはOpen Projectでプロジェクトを開けばいつものUnityの画面に移動します。

![VC5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708808/0affde65-2c63-9d38-bcaf-df943764bb3e.png)

プロジェクトが開いたら、**赤線の場所にあるVRCWorldのPrefabをHierarchy(矢印のあたり)にドラッグ＆ドロップし、
Hierarchy上で右クリック→3D Object→Planeで仮の足場を作っておいてください。**

次回は今回作ったこのプロジェクトに色々なギミックを追加していきます。
Nuxtとtailwindcssを使ってSnackBarを作る

# 前置き
Nuxt(vue.js)とtailwindcssを用いてSnackBarを作ろうと思い、記事を探していたが、当てはまる記事がなかったためこの記事の作成した。
Nuxtやvue.jsでSnackBarを作成する場合、vuetifyを使用して作るのが一番簡単そうかな、
しかしvuetifyを使うと定められたデザインしか表現できないため、tailwindの方が自分の考えたデザインで作ることができる。
UIライブラリや、cssフレームワークを使わない場合にも参考にできる。

# SnackBarとは
>🍿snackbar🍿
>- ユーザーが行った（もしくは行う予定の）動作に直接関係する通知をする時
>- アクションが起きた画面の中（文脈が読み取れる範囲＝画面が表示されている時）で使う
>- 画面外にスワイプできる
>- １つだけアクションを持つことができる
>- 一度に表示できるスナックバー は１つだけ

https://note.com/dreamarts_design/n/na830aedec855

# コード

## アニメーションなし

``` vue
<template>
  <div class="m-10">![animationSnackBar.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651685/2d195f41-4b26-7e11-1e1f-f850dae4f297.gif)

    <div v-if="isShow" class="fixed z-50 w-screen flex flex-col items-center">
      <div
        class="mt-3 mx-16 bg-stone-600 w-80 rounded-sm h-10 text-center flex items-center"
      >
        <p class="w-full text-white text-sm">{{ snackBarNotifyText }}</p>
        <button
          class="font-bold text-sky-600 pr-3"
          @click="closeSnackBar"
        >
          close
        </button>
      </div>
    </div>
    <button
      class="bg-white outline rounded px-3 py-2"
      @click="show({ text: 'snackbarの表示に成功しました' })"
    >
      show snackbar
    </button>
  </div>
</template>

<script lang="ts">
import Vue from 'vue';

type snackBarNotify = {
  text: string;
};

type DataType = {
  isShow: Boolean;
  snackBarNotifyText: string;
};

export default Vue.extend({
  data(): DataType {
    return {
      isShow: false,
      snackBarNotifyText: '',
    };
  },
  methods: {
    show(data: snackBarNotify): void {
      if (data) {
        this.snackBarNotifyText = data.text || '';
        this.isShow = true;
        setTimeout(() => {
          this.isShow = false;
        }, 5000);
      }
    },
    closeSnackBar(): void {
      this.isShow = false;
    },
  },
});
</script>

```
実際の画面
![nonAnimationSnackBar.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651685/443ec18c-64aa-145b-9930-ebaecd911278.gif)

## アニメーションあり

先ほどのテンプレートの中に以下を追加する

``` diff_vue
<template>
  <div class="m-10">
    <div
      :v-if="isShow"
      class="fixed z-50 w-screen flex flex-col items-center 
+       duration-[500ms]
      "
+     :class="isShow ? 'opacity-100' : 'opacity-0'"
    >
      <div
        class="mt-3 mx-16 bg-stone-600 w-80 rounded-sm h-10 text-center flex items-center"
      >
        <p class="w-full text-white text-sm">
          {{ snackBarNotifyText }}
        </p>
        <button class="font-bold text-sky-600 pr-3" @click="closeSnackBar">
          close
        </button>
      </div>
    </div>
    <button
      class="bg-white outline rounded px-3 py-2"
      @click="show({ text: 'snackbarの表示に成功しました' })"
    >
      show snackbar
    </button>
  </div>
</template>
```
実際の画面
![animationSnackBar.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651685/a8d12e6d-d8f5-559f-3f29-9f13ed0dacd9.gif)
HP Laptop 15s-eq3000でUbuntuをWifiに繋いだ話

この記事では以下のURLを参考にした。
https://askubuntu.com/questions/1412219/wifi-adapter-not-found-realtek-rtl8852be-wifi-6-802-11ax-pcie-in-ubuntu-22-04


まず僕の場合は、Ubuntu22.04をインストールするところから（ここでは省略）。

インストールが完了した直後はWifiに繋げなかったので、
デザリングを使い、ターミナルでコマンドを打っていく。
（USBデザリングでWifiに繋いだスマホに繋ぐと便利！）

まずはapt-getを最新の状態にする。
```
$ sudo apt-get upgrade
$ sudo apt-get update
```

そして、以下のコマンドを打っていく。
```
$ sudo apt-get install build-essential
$ sudo apt-get install linux-headers-6.0.0-1011-oem
$ sudo apt-get install git bc
$ git clone https://github.com/HRex39/rtl8852be.git -b dev
$ cd rtl8852be
$ make -j8
$ sudo make install
$ sudo modprobe 8852be
```
これで完了だ。

ネットワークドライバ(RTL8852be)は、Windowsのデバイスマネージャーで調べた。
有線でなくてもデザリングで初期設定できることに気づかせてくれた知人に感謝である。

このネットワークドライバでなくても、
WindowsでWifiが動いているならばそれを調べて、
githubからそのネットワークドライバをクローンし、
README.mdを見ながら進めていけばうまくいきそうだ。
【SAP HANA SQLScript】SAP DBTech JDBC: [1281]: wrong number or types of parameters in call: 


# エラーメッセージ例
Could not execute 'call プロシージャ名(引数1, 引数2)'
SAP DBTech JDBC: [1281]: wrong number or types of parameters in call: テーブル名 is not bound: line 1 col 6 (at pos 5)

# 発生箇所
独自に定義したプロシージャの戻り値（OUT）にテーブルを指定したにもかかわらず、呼び出すときに戻り値のテーブルを指定しないと発生した。

## 例
```SQL
-- プロシージャ側
CREATE OR REPLACE foo(
    IN a INT,
    IN b INT, 
    OUT outtable TABLE(i INTEGER, c VARCHAR(3))
)AS BEGIN 
/* 処理 */
END;

--呼び出し側
-- NG
DO
BEGIN
call foo(1, 2); -- 引数に戻り値のテーブルを指定していない
END;

-- OK
DO
BEGIN
DECLARE outtable TABLE(i INTEGER, c VARCHAR(3));
CALL foo(1, 2, outtable); -- Table Variableを宣言して引数に指定
END; 
```
ちなみに中身を確認するには
```SQL
SELECT * FROM :outtable;
```
をCALLした後に呼べば見れる。

プロシージャ共通のお決まりなのか、HANA特有かは分かりません。
備忘録(eclipseにフレームワークSpring(Spring Boot)を導入)

# EclipseでフレームワークSpring(Spring Boot)を導入した時の備忘録

初心者なので必要のないデータやチンプンカンプンな表記があるかもですが、ご指摘いただけると嬉しいです。

## バージョン
OS:Windows 10 Home
Eclipse:2021-06 (4.20.0)
Spring:Spring Tools3(Standalone Edition)3.9.14 RELEASE
Spring:Spring Tools3 Add-On for Spring Tools 4 3.9.22 RELEASE

Springについて2つあったので2つとも記載(知識がなく、どちらが機能しちているかわからないため。)
(2023/2/17現在)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692532/068fb6f1-89d3-8251-6442-22f7ed4b3297.png)


## 今回導入する際に参考にしたサイト

[こちらのサイトを参考にしながら導入を行った](https://medium-company.com/sts%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e6%89%8b%e9%a0%86/#3_EclipseSpring_Tool_Suite)


名前だけで「Spring Tools 4 (aka Spring Tool Suite 4) 4.17.2.RELEASE」を導入しようとしたが、
「いくつかの依存関係が満たされていないため、インストールを完了できません。」
というエラーで導入できず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692532/ee6ad1c9-bce9-3ef7-3307-9fb397e45fe1.png)

インストール完了後、問題なく動作するか確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692532/6fade231-19e4-7af9-0b6c-9d17b8034161.png)

問題なく入っているようだ


## 続いて、このサイトを参考にしながら動作確認
https://medium-company.com/spring-boot%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89/

「2.Springスターター・プロジェクトの選択」
この項目からスタート


しかし実際の起動で上手く起動できず…

### 次回原因に立ち向かう！！！！
エンジニアインターン16日目

今日は前回の続きでアプリの管理画面にurlの情報を入力して編集ボタンを押すとDBに情報が保存される仕組みを開発した。DBに情報があればinsert文を情報がなければupdate文を入力するようにしたい。前回でinsert文を読み込ませるところまでできていたので、今日はupdate文を読み込ませる仕組みを進めた。進めていく中でまた入力した内容がDBには読み込まれているがもう一度入力しようとしたときに空になってしまうという問題が発生した。この原因はsql文が間違っていたためであった。しかし、今日はsql文があっていたにもかかわらず反映されていなかった。その理由は入力した値を取得するapiに取得したい値のsql文を追記していなかったためだった。そこで、二つのDBをかけあわっせたかったのでJOINを使って共通のIDを取得し、DBに保存するといった方法を使った。
今までに開発したものが実際のアプリに使われていることを先輩エンジニアから聞いた。とてもうれしかった。自分が約1か月にかけて開発したものが会社のアプリに使われていて達成感も感じたし、エンジニアになった気分になれた。自分の成長を形としてできた瞬間であった。これからも努力を欠かさずに貢献していきたい。
【SwiftUI】アプリ情報ウインドウを作成する

# はじめに
macOSアプリを使っていると「〇〇について」みたいなボタンで以下のようなウインドウが表示される機能がよくあります。
![スクリーンショット 2023-02-20 21.00.15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/ce9def9e-f85b-6d68-5e45-6ff75d23d6ab.jpeg)
やり方が気になったので調べてみました。

# 実装方法
```swift
Button {
    NSApplication.shared.orderFrontStandardAboutPanel(
        options: [NSApplication.AboutPanelOptionKey(rawValue: "Copyright"): "© 2023 Taishin Miyamoto"]
    )
} label: {
    Text("\(Image(systemName: "gearshape"))")
}
```

# おわり
今回記載した実装コードは最低限のコードです。
他にも色々なカスタマイズができるっぽいので気になる方は試してみてください！

# 参考記事
https://nilcoalescing.com/blog/CustomiseAboutPanelOnMacOSInSwiftUI/
ファイルを読み込んで空ファイルを作成するバッチの作り方

# 概要
ファイルを読み込んで空ファイルを作成するバッチの作り方です。
テキストファイルより作成したいファイルの名称を読み込み、ファイルを作成するバッチで、
名前や種類の異なるファイルを一度に大量に作成したいときに役立ちます。
### 必要なもの
①作成したいファイルの名称を記載したテキストファイル
②バッチファイル
③出力先フォルダ

# バッチの中身と解説
### 前提
・バッチが読み込むテキストファイルの名称は「fileList.txt」とする。
・バッチの名前は「createFile.bat」とする。
・ファイル出力先フォルダは「カレントディレクトリ\output」とする。
### 中身
```bat:createFile.bat
@echo off

setlocal enabledelayedexpansion

set n=0
set filePass=%~dp0\output

for /f %%s in (fileList.txt) do (
  set string[n]=%%s
  type nul > !filePass!\!string[n]!
  set /a n=n+1
)

endlocal
```
### 解説
大まかにはテキストファイル「fileList.txt」を読み込み、
ループの中で一行ずつデータを読み込んで、ファイルを出力していく処理になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3190838/d97a1d0d-12a1-ba86-fb8b-6e4603e2b10d.png)

# 使い方
例えば今回のバッチの設定ではこんな感じに配置しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3190838/563140af-adf2-c727-6eaa-0b2c6e9d63a2.png)

①バッチが読み込むテキストファイル「fileList.txt」に出力したいファイルの名称を記載する。
今回は例として様々な種類のファイルを記載しておく
```txt:fileList.txt
sample1.txt
sample2.txt
sample3.csv
sample4.xlsx
sample5.xlsm
sample6.doc
```
②バッチを実行する。（バッチファイルをダブルクリックorコマンドプロンプトで実行）
③outputフォルダに空ファイルが出力されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3190838/6f76ebc2-68a9-0d60-a12f-8eef2d76afbe.png)
💭ターミナルの基本コマンド

***:cherries:学んだことを随時まとめてく:cherries:***
<font color="MistyRose">~間違っている点があれば是非教えてください~<font>

```cli:
#カレントディレクトリのパスを表示
  $pwd

#今いる地点にあるファイルを一覧表示
  $ls

#作業場所の移動
  $cd 

#現在のディレクトリから、上の階層への移動は「 ../ 」を使う
  $cd ../

#ディレクトリの作成
  $mkdir 作成したいディレクトリ名

#ファイルを新規作成
  $touch 作成したいファイル名

#ファイルを複製する
  $cp コピーするファイル名 新しく作るファイル名

#場所（階層）を移動するmvコマンド
  $mv 操作対象ファイル(ディレクトリ)名 移動先ディレクトリ

#名前を変更するmvコマンド
  $mv 現在のファイル/ディレクトリ名 変更する名前

#ファイルを削除する
  $rm 削除したいファイル名
```


* * *
参考サイト
[skillhub.jp](https://skillhub.jp/courses/153/lessons/805)
Go言語でCLIツールを実装する【Cobra】

## はじめに
最近業務でGolangを使ったCLIツールを実装する機会があったので、調べた内容を簡単に記載していきます！

## 【前談】GoでCLIを実装するためのライブラリ
まずはざっくりGoでCLIツールを実装する際に使用するライブラリを調べていきます。GoでCLIツールを作成するためのライブラリとして、以下のものがあるようです。

### Cobra
Cobraは、強力なモダンCLIアプリケーションを作成するためのライブラリです。CobraはKubernetes、Hugo、GitHub CLIなど、多くのGoプロジェクトで使用されています。

https://github.com/spf13/cobra

### cli
cli は、Go でコマンドラインアプリケーションを構築するための、シンプルで、高速で、楽しいパッケージです。目標は、開発者が表現力豊かに、高速で配布可能なコマンドラインアプリケーションを書くことができるようにすることです。

https://github.com/urfave/cli

### go-flags

https://github.com/jessevdk/go-flags

#### 各ライブラリのスター数
各ライブラリのスター数は以下のような感じ。今回は**Cobra**を使用することにします。

Cobra：30.7kスター
Cli：19.8kスター
Go-flags:2.4kスター

## Cobraを使用してCLIツールを実装する
実際にCobraを導入して、CLIツールを実装するまでを解説していきます。
### cobra・cobra-cliのインストール
まずはcobraとcobra-cliをインストールしていきます。**cobra-cli** は **cobra** アプリケーションとコマンドファイルを生成するためのコマンドライン・プログラムです。これは雛形をブートストラップして、Cobraベースのアプリケーションを迅速に開発することができます。

下記2つのコマンドを実行することで、インストール可能です。
```bash
$ go get -u github.com/spf13/cobra@latest
```
```bash
$ go install github.com/spf13/cobra-cli@latest
```
### 雛形をブートストラップ
続いて、下記のコマンドを実行してください。
```bash
$ cobra-cli init
```
実行完了すると、下記のようになディレクトリやファイルが自動的に生成されます。
```
├── cmd
│   └─ root.go
├── go.mod
├── go.sum
├── LICENSE
├── main.go
```

### サブコマンドを追加
`cobra-cli add <サブコマンド名>`を実行し、サブコマンドを追加します。今回は`init`というサブコマンドを作成します。
```
$ cobra-cli add init
```
このコマンドを実行すると、下記のように`init.go`ファイルが自動的に作成されます。
```
├── cmd
│   └─ root.go
│   └─ init.go
```
ファイルの中身は下記のようになっています。（簡略化するためにコメントなどは削除してあります。）
```go:cmd/init.go
package cmd

import (
	"fmt"
	"github.com/spf13/cobra"
)

var initCmd = &cobra.Command{
	Use:   "init",
	Short: "A brief description of your command",
	Long: `A longer description that spans multiple lines and likely contains examples
and usage of using your command. For example:

Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
	Run: func(cmd *cobra.Command, args []string) {
        // サブコマンドinitを叩くと実行したい処理をこちらに記載します
		fmt.Println("init called")
	},
}

func init() {
	rootCmd.AddCommand(initCmd)
}

```
ファイルを作成した段階では`fmt.Println("init called")`しか記載されていないので、実行しても「init called」と表示されるだけですが、確認のために実行してみます
```bash
$ go run main.go init
init called
```
うまく動いていることが確認できますね！あとはご自身で必要な処理をどんどん追加で実装していってください。

## 最後に
今回は簡単にCLIツールを実装するための手段と、Cobraの実装の進め方を解説しました。何かご指摘等あればお気軽にコメントください！
AIでTwitterクローンを作るプロジェクト

## ER

```plantuml
@startuml
entity User {
  + user_id: int
  username: string
  email: string
  password: string
  bio: string
}

entity Tweet {
  + tweet_id: int
  content: string
  created_at: datetime
  user_id: int
}

entity Tag {
  + tag_id: int
  tag_name: string
}

entity UserFollowsUser {
  + follow_id: int
  follower_id: int
  followee_id: int
}

entity Like {
  + like_id: int
  user_id: int
  tweet_id: int
}

User "1" -- "0..*" Tweet: authored by
Tweet "1" o-- "0..*" Tag
User "1" -- "1..*" UserFollowsUser: follower
User "1" -- "1..*" UserFollowsUser: followee
UserFollowsUser "1" -- "1" User: follower
UserFollowsUser "1" -- "1" User: followee
Like "0..*" -- "1" Tweet: liked by
Like "0..*" -- "1" User: liked by

Tweet.user_id "1" -> "1" User.user_id
@enduml
```

## ORM

```python:models.py
from django.db import models

class User(models.Model):
    username = models.CharField(max_length=255)
    email = models.EmailField()
    password = models.CharField(max_length=255)
    bio = models.CharField(max_length=255)

class Tweet(models.Model):
    content = models.TextField()
    created_at = models.DateTimeField()
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='tweets')

class Tag(models.Model):
    tag_name = models.CharField(max_length=255)
    tweets = models.ManyToManyField(Tweet, related_name='tags')

class UserFollowsUser(models.Model):
    follower = models.ForeignKey(User, on_delete=models.CASCADE, related_name='following')
    followee = models.ForeignKey(User, on_delete=models.CASCADE, related_name='followers')

class Like(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='likes')
    tweet = models.ForeignKey(Tweet, on_delete=models.CASCADE, related_name='likes')

```
【悲報】いまだにVLOOKUP使ってるワイ。。。

# 結論

**悪いことは言わねぇから早くINDEX/MATCHに慣れろ！**


# 以下解説

まず、VLOOKUPよりINDEX/MATCH関数を使用するメリットはこんな感じ。

　　　1. 処理速度が速ええ。
　　　2. 検索元テーブルのキーワードを一番左に置かなくてOK。
　　　3. 検索用元データの更新が楽。(範囲ではなく、列指定できるためデータ行追加は自動更新される)
　　　4. 複数条件指定可能。
<br>
はい、１だけで使用する価値ありますね。

<br>
<br>
例えば、以下のような店舗毎在庫数テーブルがあったとします。

店舗コード、商品コードに合わせて数量を抽出したい場合。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2614309/de271478-eaee-28e6-067f-a5b9e99a571e.png)
※項目I3の数量を抽出する関数は項目I4に記載。

検索条件(F3列・G3列)にマッチするレコードを店舗毎在庫数テーブル(B列～D列)から抽出。
列番号3番目の数量項目を返します。

複数条件はこれでOK。

<br>

### 上画像のINDEX,MATBHを分解すると...
<br>

```vb
    '検索値以外は列指定でOK
    '検索値1を検索範囲1から探すよ～
    '検索値2を検索範囲2から探すよ～
    =INDEX(検索元テーブル, MATCH(検査値1&検査値2, 検査範囲1&検査範囲2, 照合種別 ), 検索元テーブルの返したい列番号 )
```
<br>

照合種別については以下。
|照合種別|一言でいうと|詳細|
|:-:|:-:|:-:|
| 0 | 完全一致|検索値に等しい最初の値を検索・検索範囲は任意【**これ使っとけばOK**】|
|1|以下|検索値以下の最大値を検索・検査範囲は昇順で配置する必要あり|
|-1|以上|検索値以上の最小値を検索・検査範囲は降順で配置する必要あり|

<br>

### あと、もちろん単一条件でも検索可能


```vb
=INDEX(検索元テーブル, MATCH(検査値1, 検査範囲1, 照合種別 ), 検索元テーブルの返したい列番号 )
```

<br>
最初は戸惑うかもしれませんが絶対慣れておいた方がいいね。

<br>

***

上記だと検索条件と一致しなければN/Aエラーが発生するから、ついでに`IFERROR関数`を使えば完璧。
一致しない場合、任意の文字を入れられる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2614309/64091af3-d2f8-abc8-83a4-98f4a313e234.png)
Ruby 2つの文字列の末尾に対して一致・不一致を判断するプログラム

- メソッドの引数に、任意の2つの文字列を指定する。
- 引数に指定された2つの文字列のうち、どちらかがもう一方の文字列の末尾にある場合は、Trueを出力する
- 上記を満たせていない場合は、Falseを出力する
- 入力された文字が大文字でも小文字でも、同一の文字として処理を行う

ヒント1:sliceメソッドを活用する
ヒント2:大文字を小文字に変換するdowncaseメソッドを利用する


```ruby:模範解答
def end_other(a, b)
  a_down = a.downcase
  b_down = b.downcase
  a_len = a_down.length
  b_len = b_down.length
  if b_down.slice(-(a_len)..- 1) == a_down || a_down.slice(-(b_len)..- 1) == b_down
    puts "True"
  else
    puts "False"
  end
end

# 呼び出し例
end_other('Hiabc', 'abc') 
```

```:ターミナル
True
```

# 解説
今回、条件の中に大文字と小文字を区別しないと記載があったため、２つの任意の文字列を小文字に変換させます。
次に、2つの文字列のうち、どちらかがもう一方の文字列の末尾にあるかどうか確かめるため、a, bそれぞれの文字数を数えます。
それが以下の記述になります。
```ruby
  a_down = a.downcase
  b_down = b.downcase
  a_len = a_down.length
  b_len = b_down.length
```


```ruby:呼び出し例
end_other('Hiabc', 'abc') 
```
ここからは、呼び出し例が上記だった場合を例に考えて行きます。
この場合、以下のように処理がされます。
```ruby
a_down = hiabc
b_down = abc
a_len = 5
b_len = 3
```

if分の中身を見ていきます。
< 条件式の左辺 >
b_down.slice(-(a_len)..- 1)は、b_down.slice(-5..-1)となりますが、b_down = abcとなっているため、インデックス番号-5から-1という条件で切り取ることができません。
そのため、この部分はnilとなります。
結果、nil == a_downは等しくないと評価されるので、falseになります。

< 条件式の右辺 >
a_down.slice(-(b_len)..- 1)はと、a_down.slice(-3..-1)となります。
ここで、hiabcという文字列の最後にabcが含まれているかを確認したいため、abcという文字列分を左から数えます。
そうするとhiabcの最後までを範囲指定していることがわかります。
a_down = hiabcとなるので、インデックス番号-3から-1という条件で切り取るとabcが残ります。
結果、abc == b_downは等しいと評価されるので、trueとなります。
Open_Clipの使いかた

# 画像とテキストをそれぞれembeddingにし、比べることのできるモデル

https://github.com/mlfoundations/open_clip

# 使いかた

### インストール

```shell
pip install open_clip_torch
```

たとえば、以下の画像をembeddingにして、３つのテキストをembeddingにしてテンソルの積を計算し、最も確率の高いものをsoftmaxで選びます。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/af55fdd2-c19a-34fb-5241-712c8b6a979f.jpeg width=200>


```python
import torch
from PIL import Image
import open_clip
model, _, preprocess = open_clip.create_model_and_transforms('ViT-B-32-quickgelu', pretrained='laion400m_e32')
tokenizer = open_clip.get_tokenizer('ViT-B-32-quickgelu')

image = preprocess(Image.open("cat.jpeg")).unsqueeze(0)
text = tokenizer(["a diagram", "a dog", "a cat"])

with torch.no_grad(), torch.cuda.amp.autocast():
    image_features = model.encode_image(image)
    text_features = model.encode_text(text)
    image_features /= image_features.norm(dim=-1, keepdim=True)
    text_features /= text_features.norm(dim=-1, keepdim=True)

    text_probs = (100.0 * image_features @ text_features.T).softmax(dim=-1)
torch.set_printoptions(sci_mode=False)

print("Label probs:", text_probs)
```

> Label probs: tensor([[    0.0000,     0.0000,     1.0000]])

 ["a diagram", "a dog", "a cat"]

　のうち３つ目の "a cat" が一番確率が高い。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

機械学習、ARアプリ（Web/iOS）を作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
LaTeX文書の分割方法

# 本記事の背景
この記事は、私が卒業論文を執筆していた際、友人からの質問へ答えるために作成したものです。
LaTeX を使用する人々のお役に立てれば幸いです。

# はじめに
卒業論文を書く際には、LaTeX を使うことが多いです。しかし、全ての文書を `main.tex` ファイルに書き込むと、行数が非常に多くなってしまいます。
そこで、ファイルを分割する方法があります。
この方法を使うと、文章の修正や入れ替えが簡単になり、作業効率を上げることができます。

## 本題に入る前に
LaTeX を使う場合は、ファイル名やフォルダ名をすべて半角英数で指定することがおすすめです。
全角文字を使用するとエラーを発生する可能性があります。

<!-- textlint-disable -->
:::note warn
分割したファイル名、フォルダ名は必ず半角英数にする
:::
<!-- textlint-enable -->

# 外部の文書ファイルの読み込み
LaTeX で外部の文書ファイル(`.tex` ファイル)を読み込むためには、`input` で読み込む方法と `include` で読み込む方法があります。

## `input` で読み込む場合
外部の LaTeX ファイルを `input` コマンドで読み込む方法を説明します。
例えば、`hoge.tex` を読み込みたい場合は、`main.tex` に次のように書きます。

```main.tex
\input{hoge.tex}
```
この場合、拡張子は省略しても大丈夫です。

また、複数のファイルを読み込む場合は、次のように書きます。
```main.tex
\input{hoge.tex}
\input{fuga.tex}
\input{piyo.tex}
```
これにより、複数のファイルを 1 つの LaTeX 文書にまとめることができます。

## `include` での読み込み
`include` コマンドを使うと、外部ファイルを読み込むことができますが、`input` と異なり、コマンドの前後に改ページが挿入されるため、注意が必要です。

```main.tex
\include{hoge.tex}
```
複数のファイルを読み込む場合は、次のように書きます。

```hoge.tex
\include{hoge.tex}
\include{fuga.tex}
\include{piyo.tex}
```
なお、`include` コマンドは新しいページから始まるため、本文中で使用するには注意が必要です。
主に、章ごとに分割する場合などに使用されます。

# 最後に
修正点、疑問点があれば編集リクエスト、コメントお待ちしています。

## 参考文献

https://medemanabu.net/latex/input-include/
React ステートフックで使っている分割代入について

# はじめに
突然ですが、Reactのステートフックを使う際に、出てくる
`[変数1, 変数2] = useState(初期値)`
これ、何だと思いますか？

配列？っぽいな、React特有の呪文かな？:thinking:と思っていたのは私です。

これは、分割代入というJSの書き方を使っています。

# 分割代入
分割代入とは、右辺に置いた配列やオブジェクトの値を左辺の変数に代入するもの。

## 配列 & 分割代入
まずは、配列でつかう分割代入を見ていきます。
下記の例では、配列の中身を取り出すためには、`配列名[インデックス番号]`が必要です。
```js
const arr = [1,2,3]
console.log(arr[2])
-> 3
```

ここで分割代入を使って、配列arrを代入してみます。
```js
const [hoge,foo,woo,yee] = arr

console.log(hoge)
->1

console.log(yee)
->undefined

// const hoge = arr[0]
// const foo = arr[1] 
// const woo = arr[2] 
// で一つずつ入れるよりスマートですね
```
ちなみに、代入する値より多い変数を定義した場合、上記のように`undefined`となります。
分割代入を使うと代入するのと、呼び出すのが楽になりますので、慣れていきたいと思う今日このごろ。

## オブジェクト & 分割代入
上記では、配列を分割代入しましたが、オブジェクトでも使えます。
が、ちょっとだけ配列のときと雰囲気違うので一度まとめておきます。

```js
// まず、オブジェクトを作成
const person = { name: "Taro", age: 20, address: "Tokyo" };

// ここで[name, score]で受けるとエラーになるので、左辺と右辺で揃えること
const {address, score} = person
console.log(address)
-> Tokyo

console.log(score)
-> undefined
```
オブジェクトを分割代入した場合、オブジェクトのプロパティ名と同じ変数名を左辺に入れて置くと、自動的に対応する値が代入されます。
配列のときは、配列の中身が順番に代入されていました。

オブジェクトの場合は、
順番は関係なく、プロパティ名と一致した変数に値が代入されていきます。

もちろん、プロパティ名として使われていないものを変数名に入れると、中身は`undefined`になります。
OpenAPIのスキーマファイルとSQL Severの型マッピング

# 1. はじめに
* SQL Serverのテーブルから取得したDTOをAPIとして返却するときに主な型のマッピングを定義したい

# 2. SQL Serverの型一覧

https://learn.microsoft.com/ja-jp/sql/t-sql/data-types/data-types-transact-sql?view=sql-server-ver16

http://teabreak.info/%E3%83%A1%E3%83%A2/sqlserver-%E3%82%AB%E3%83%A9%E3%83%A0%E5%9E%8B%E4%B8%80%E8%A6%A7/

# 3. OpeiAPIのタイプ一覧

https://swagger.io/docs/specification/data-models/data-types/#numbers

# 4. マッピング表
|SQLServer型|OpenAPI type|OpenAPI format|
|:---|:---:|:---:|
|int  |integer  |-  |
|smallint  |integer  |int32  |
|float  |number  |float  |
|decimal  |number  |double  |
|varchar  |string  |-  |
|char  |byte  |-  |
|bit  |boolean  |-  |
|date  |string  |date  |
|datetime  |string  |date-time  |

* OpenAPIのtype,formatは下記のスキーマ定義の値を指す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/67fe1f24-f1d1-d064-4157-d636664e2c78.png)

# 5. 参考文献

https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md
READMEとは？

本日はREADME（リードミー）についてまとめていきます！


README（リードミー）とは
-----
簡単にいうと説明書みたいなもの。
そのアプリの簡単な説明書や注意書きなどが記載されているファイル。
基本的にアプリケーションを立て上げた際にすでに作成されている。


言葉の意味は「私を見て」というなんともわかりやすい名前ですね笑


基本的にはアプリ作成時に記載するもので全体の構成もイメージつきやすいですよ:smiley:

今日はここまで！ありがとうございました！！
paizaラーニング レベルアップ問題集 新・Bランクレベルアップメニュー JavaScript 【シミュレーション 4】位置情報システム

【シミュレーション 4】位置情報システム (paizaランク B 相当)

https://paiza.jp/works/mondai/b_rank_new_level_up_problems/b_rank_new_level_up_problems__move_simulation

# 解答例
問題文に沿って実装します。

等速直線運動の計算は以下の通りです。

移動元が、時刻 t_1 で座標 (y_1,X_1), 
移動先が、時刻 t_2 で座標 (y_2,X_2) であるような 
2 点の間を等速直線運動すると仮定したとき、

移動元と移動先の間、時刻 t_1 ≦ T ≦ t_2 における y 座標は、 

移動元y_1 に、
等速直線運動の単位時間あたりに進む距離 (y_2-y_1)/(t_2-t_1) と
移動時間 (T-t_1) をかけた値を
足すといった計算をすればよいので、

移動元y座標 + 移動時間　* 単位時間あたりに進む距離、すなわち、
y_1 + (T-t_1)*(y_2-y_1)/(t_2-t_1) となります。


x座標についても同様です。
最後に、小数点以下を切り捨てます。

# 解答例(C++の場合参考)
JavaScriptの計算で、 Number型 は小数点以下約 17 桁の精度しか保持できません。BigInt型で計算します。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const [n] = lines[0].split(" ").map(Number);

//1.時刻 t_1(=0), t_2, ... , t_n(=100) のユーザーの位置情報 (y,x) を取得する。
const [t, y, x] = [[], [], []];
for (let i = 0; i < n; i++) {
  [t[i], y[i], x[i]] = lines[i + 1].split(" ").map(Number);
}

//2.各時刻 T = 0, 1, ..., 100 のユーザーの座標(位置情報)を次の方法で計算する。
let now = 0;//配列t,y,xで、今見ているインデックス
for (let T = 0; T <= 100; T++) {
  
  //1.T = t_1, T = t_2, ..., T = t_n のいずれかに当たる場合
  if (T === t[now]) {
    //時刻 T における座標(1. で取得した位置情報)を時刻 T における座標 (y,x) とする。
    console.log(y[now], x[now]);
    now++;//次へ
    
  //2.t_i < T < t_{i+1} (1 ≦ i < n) の場合  
  } else {
    /*t_i 時点での座標 (y_i, x_i) から t_{i+1} 時点での座標 (y_{i+1}, x_{i+1}) へ
    等速で直線移動すると仮定し、時刻 T における座標を計算によって求める。*/ 
    console.log(
      Math.trunc(Number(BigInt(y[now - 1]) + BigInt((T - t[now - 1])) * BigInt((y[now] - y[now - 1])) / BigInt((t[now] - t[now - 1])))),
      Math.trunc(Number(BigInt(x[now - 1]) + BigInt((T - t[now - 1])) * BigInt((x[now] - x[now - 1])) / BigInt((t[now] - t[now - 1]))))
    );
  }
}
```
WPFでC#コードを使用せずにStoryboardを使って数字時計を実現する方法

## コード

```xml
<Window x:Class="DigitalClock.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:system="clr-namespace:System;assembly=mscorlib"
        Title="Clock" Height="150" Width="350">
    <TextBlock Text="{Binding DataContext.Now,RelativeSource={RelativeSource Self}}"
               DataContext="{DynamicResource DateTime}">
        <TextBlock.Resources>
            <system:DateTime x:Key="DateTime"
                             x:Shared="false" />
            <Storyboard x:Key="Storyboard">
                <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="DataContext"
                                               Duration="0:0:1"
                                               RepeatBehavior="Forever"
                                               AutoReverse="False">
                    <DiscreteObjectKeyFrame KeyTime="50%"
                                            Value="{StaticResource DateTime}" />
                </ObjectAnimationUsingKeyFrames>
            </Storyboard>
        </TextBlock.Resources>
        <TextBlock.Triggers>
            <EventTrigger RoutedEvent="Loaded">
                <BeginStoryboard Storyboard="{StaticResource Storyboard}" />
            </EventTrigger>
        </TextBlock.Triggers>
    </TextBlock>
</Window>
```

## 説明

上記のコードでは、`Window`内に`TextBlock`を配置し、`Storyboard`を使用して現在時刻を表示しています。以下は、コードの詳細な説明です。

- `TextBlock`は、時刻を表示するために使用されています。

- `TextBlock`の`Text`プロパティは、バインディングを使用して`DataContext`から現在時刻を取得しています。`RelativeSource={RelativeSource Self}`は、`DataContext`が自分自身であることを示しています。

- `TextBlock`の`DataContext`プロパティは、`DynamicResource`を使用して`DateTime`リソースを取得しています。

- `TextBlock`の`Resources`プロパティには、`DateTime`リソースと`Storyboard`リソースが含まれています。

- `DateTime`リソースは、`system:DateTime`を使用して定義されています。このリソースは、現在時刻を表しています。

- `Storyboard`リソースは、`ObjectAnimationUsingKeyFrames`を使用して、現在時刻が`1`秒ごとに更新されるように設定されています。

- `EventTriggerは、RoutedEvent="Loaded"`によって、`Window`がロードされたときにトリガーされます。`BeginStoryboard`は、`Storyboard`リソースを使用してアニメーションを開始します。

以上が、WPFを使用して数字時計を実装するためのXAMLコードとその説明です。
ノートパソコンの蓋をしめてもRokyLinuxがサスペンドしない設定【忘備録】

/etc/systemd/logind.conf の設定

#HandlePowerKey=poweroff
#HandleSuspendKey=suspend
#HandleHibernateKey=hibernate
この三つの設定を、

HandlePowerKey=ignore
HandleSuspendKey=ignore
HandleHibernateKey=ignore
とすること。

参考：https://mseeeen.msen.jp/how-to-avoid-sleep-on-pc-closing-with-centos-7/
OpenAPIの分割したスキーマファイルを結合する

# 1. はじめに
* OpenAPI用スキーマファイルが肥大化したため、$refで外部ファイル化したものを1ファイルに結合したい
* node.jsをインストールしてnpm経由でswagger-cliを取得して実行したい

# 2. node.jsのインストール
* npmを使用してインストールするためnode.jsをインストールする
## 2.1. node.jsのダウンロードサイトを開く

https://nodejs.org/ja/download/

## 2.2. インストーラーをダウンロードする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/af8e3064-fbf6-2b4a-c475-e5a8ca7dc0bb.png)

## 2.3. インストーラーを実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/f6baf5a3-824f-c36e-7f5a-e08da580e9af.png)

## 2.4. Nextボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/e8a9a4fe-8fc2-1da6-1a47-72cc4c99d0e4.png)

## 2.5. チェックボックスをONにしてNextボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/95580f3b-4f44-852a-6c22-0344d1bac668.png)

## 2.6. Nextボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/ce133b1a-aac6-cedc-56e4-6d8a94889290.png)

## 2.7. Nextボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/7b2b9074-4761-c4ea-9415-9bdcd242e01a.png)

## 2.8. Nextボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/eebf823f-1fb4-36dc-c704-e78272a6c06b.png)

## 2.9. Installボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/98a98774-85a9-f981-d971-8adb05a5d92a.png)

## 2.10. Finishボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/c411b038-388b-1fa2-7489-62d3ccdc0684.png)

## 2.11. パソコンを再起動する

# 3. swagger-cliのインストール
## 3.1. コマンドプロンプトを起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/a5a96034-37f1-1747-676c-7663d8de1dfc.png)

## 3.2. node.jsのインストールを確認する
```node --version```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/a6142ae2-2d57-4e00-ff9c-11a1942ea4ce.png)


## 3.3. swagger-cliをインストールする
```npm install -g @apidevtools/swagger-cli```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/71a9a9a4-e9a9-e2be-27fc-1441ecea2372.png)

# 4. スキーマファイルの統合
```swagger-cli bundle -o ./.gen_api_schema/openapi.yaml -t yaml ./openapi.yaml```

* -o : 結合したスキーマファイルの出力先（結合後）
* -t: ファイル形式（YAML形式を選択）
* <file>: 分割したスキーマファイル（結合前） 

## 5. 参考文献

https://garafu.blogspot.com/2020/06/multi-file-openapi.html

https://gift-tech.co.jp/articles/structured-openapi-schema/
Gitflowでリリースするコマンド操作めも

たまーに[Gitflow](https://www.atlassian.com/ja/git/tutorials/comparing-workflows/gitflow-workflow)でリリースする時に、どうだっけか…となることがあるのでメモ。

## 事前準備
* (場合によりけり)該当のリポジトリをcloneしてきたディレクトリ内で`git flow init`を叩く
clone（もしくはプロジェクト立ち上げ）後に初めてgit　flowコマンドを叩きたい場合は必要。

* developブランチにリリースしたい内容をマージする

## いざリリース
1. developブランチをチェックアウト
    ```bash
    git checkout develop
    ```
2. リリース開始
    ```bash
    git flow release start ${リリースバージョン}
    ```
    リリースバージョンは`v1.7.12`などよしなにつける。
    これがリリースタグにもなる。
    プロジェクトのバージョニングルールを確認してつける。
3. リリース終了
    ```bash
    git flow release finish '${リリースバージョン}'
    ```
    このとき、リリースコメントとかタグコメントを聞かれるので適切に入力する。
    どういう内容を書くかはプロジェクトのルールとか一般的な作法に従う。
    特にタグコメントを忘れるとタグのコミットができないようで、うまく終了できないのでかならず入力する。（忘れてももっかいコマンド叩けばOK）
4. タグのプッシュ
    ```bash
    git push origin ${リリースバージョン}
    ```
CPUアーキテクチャ違いで永遠にECSのタスクを起動できなかった問題

ローカルでビルドしたdockerイメージをECRにあげ、それを使ってECSを更新しようと思ったら、下記のエラーが返却されて失敗した時の話です。

こういうエラーが出て、タスクの起動に失敗したケースです。
```
Resource handler returned message: "Error occurred during operation 'ECS Deployment Circuit Breaker was triggered'."
```

### 環境
* Mac OS 12
* Typescript 4.8.4
* node 18.10.0
* CDK CLI 2.44.0
* 作業者 Docker、AWSたまごクラブ:hatching_chick:

## ■ 調査
AWSコンソールにてECS -> 該当のクラスタ -> タスクタブ -> Stoppedを開く。
この中から今回起動してほしかったけど停止してしまったtaskを探します。

コンテナの下の▼から展開すると詳細が見れます。
終了コード(exitCode) 0 なら問題ないですが、今回は1でした。異常終了しています。

「ログ」タブにいくと、そのタスクで生まれたログを見ることができます。
今回のエラー時には下記の内容が出ていました。
`exec /opt/java/openjdk/bin/java: exec format error`

## ■ 原因
[こちら](https://docs.oracle.com/cd/E19455-01/806-2720/msgs-278/index.html)などにあるように、実行する環境のCPUアーキテクチャと、イメージのビルド時に設定されたCPUアーキテクチャが違うことによって起きる問題でした。

今回はM1 Macのローカルでビルドしたイメージを使ってECS Fargateで起動しようとしたのですが、CPUアーキテクチャをARMに設定していませんでした。（デフォルトではAMDになります。）
なので「このイメージのフォーマットが、実行環境に適してないので実行できません」と言われている状態です。

## ■ 対応策
取りうる対応は下記の2つです。
1. イメージをAMD用にビルドする
2. コンテナ側をARMに変更する

ちなむと今回は2で解決しました。

### 1.イメージをAMD用にビルドする
ARM環境でAMD向けにイメージをビルドする際は、Dockerfile内で下記の様にplatform指定してやればOKです。
`FROM --platform=linux/x86_64 eclipse-temurin:17-jdk-jammy AS build`

ただ、自分の環境ではめちゃくちゃdocker buildに時間がかかってビルドできなかったので断念しました。
（試したプロジェクトではgradleのcleanやbuildをさせているのですが、starting gradle demonから10分15分待っても進まない…という状態でした。）
先達によると「異なるプラットフォーム向けのビルドはかなりの時間がかかる」とのことなので、ここの回避策はないようでした。

永遠のときをかければビルドできるかもしれないですが、カジュアルにビルドしたい気持ちがあるので、こちらの方法は断念しました。


#### 余談）ビルドに時間がかかることに関して試行錯誤したメモ
**□ Docker Desktopの確認**
Docker DesktopにはApple Silliconチップ向けのものと、Intelチップ向けのものが用意されています。
そもそもここで異なるものをインストールしていると、Docker Desktop自体がちゃんと動かないので確認しました。

念の為インストールし直してみましたが、特に変化なしでした。

**□ Rosetta 2のインストール**
[Dockerのドキュメント](https://docs.docker.jp/desktop/mac/apple-silicon.html#id2)を見ていると、必須ではないがAMD用にビルドする等一部の機能を使用するには必要となるコマンドラインツールとしてRosetta 2の説明がされています。
> 最高の体験を得るには、Rosetta 2 のインストールを推奨します。

とのこと。

なのでドキュメントに従ってRosetta 2も入れて、platformオプションをつけたりしつつ試してみましたが、こちらも特に変化なしでした。

**□ archコマンドでの実行**
archコマンド経由で実行するというのも試しましたが、`arch -x86_64 docker build ...` としたときに`arch: posix_spawnp: docker: Bad CPU type in executable`と怒られてしまい、そもそも実行できませんでした。


### 2.コンテナ側をARM環境で実行する様に変更する
CDKでは下記のようにタスク定義にてCPUアーキテクチャを指定できます。

```typescript
new TaskDefinition(this, `taskDef`, {
    // 〜中略〜
    runtimePlatform: {
        cpuArchitecture: CpuArchitecture.of('ARM64')
    }
});
```
※[CDK Document](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ecs.CpuArchitecture.html)

こんな感じで指定して、環境側を変えちゃうことでM1 Macのローカルでビルドしたイメージでも動かすことができます。

尚、これをする場合、ARM64を指定していないタスク定義はinactiveにしておかないと、同じ理由で過去のタスク定義では動かない事象が発生するので注意しましょう。

またタスク定義とserviceが別スタックになっていたり、CDKでの更新以外でタスク定義が更新され売る場合、
CDKデプロイ失敗時のロールバックで少しややこしい事になりうるのでそこも注意です。

具体的には下記のような理由でECSのインスタンス起動が永遠に失敗する可能性があります。
* ロールバック先のスタック定義で使用されているタスク定義が存在しない
* ロールバック先のスタック定義ではタスク定義内で指定されているDockerイメージのCPUアーキテクチャとECSのCPUアーキテクチャが異なる

## ■ まとめ
以上、DockerイメージのCPUアーキテクチャ違いで困った話でした。

手段としては下記の2つがあって、今回は2を選びました。
1. イメージをAMD用にビルドする
2. コンテナ側をARMに変更する

今回はとりあえずイメージを上げて動作確認できればいいので2の手段を取りましたが、
「別にコンテナ側をARM64で動かしたくはない」という場合は解決になっていないので、別のマシンでビルドするなどして1の方向でなんとかするしかないです。
Nuxt.jsでFull Static Generationできない場合

Nuxt.jsでの完全静的生成（Full Static Generation）がうまく機能していないケースがあった。
状況と原因を理解するのに丸一日かかってしまった。検索してもそれに該当する情報に行き当たらなかったので、やり場のない怒りを供養するために、ここに放流する。

### 環境
Nuxt.js 2.15.8

# Full Static Generationとは何か
デプロイ時に全てのデータをソースファイルに組み込んでサイト生成をすることである。
それの何が良いのか。
CMSなどのウェブAPIからサイト掲載データを取得する場合、
ページロード時にクライアント（ユーザーPC）からAPIにアクセスすると、ブラウザの開発者ツールを使えばAPIキーが見えてしまう。
完全静的生成ならば、あらかじめAPIから取得したデータを含めてビルドするので、クライアントからAPIアクセスする必要がなくなり、APIキーを隠蔽できるわけだ。

詳細は公式。
https://nuxt.com/blog/going-full-static

## どうやって実現するか
- nuxt.config.jsに `target: "static"`を追加
- nuxt.config.jsの`privateRuntimeConfig`にAPIキーなど、隠蔽したい情報を指定
- ページコンポーネントで、`asyncData`でAPIアクセスしてデータを取得
- `nuxt generate` でビルド実行
```js
// nuxt.config.js
modules.exports = {
    mode: "universal",
    target: "static",
    // ...
    privateRuntimeConfig: {
        apiKey: 'xxxxxxxx',
    },
}
```
```js
// pages/index.js
exports default {
    async asyncData({ $config }) {
        // $config に privateRuntimeConfigで指定したプロパティが入っている

        console.log('fire asyncData');
        const data = await axios.get(
            'https://example.com/',
            { apiKey: $config.apiKey }
        );
        return {
            data,
        };
    },
}
```
`asyncData()`は、コンポーネントがcreateされる前にサーバサイドでのみ実行される。
そのためSSGの場合には、ビルド時のみ実行され返却値が埋め込まれることになる。


## 私の環境ではどうなったか
ビルド後のサイト（/dist）にアクセスしてみたところ、
apiKeyがないというエラーが表示されると同時に、なんと **asyncData がブラウザ上で実行されている**（consoleにlogが出ている）のだ。

「SSGでasyncDataが実行される（asyncData of Nuxt.js is called on Static genarated page）」
とかで検索しても全然出てこない。
どこの記事でも、SSGの場合には、asyncDataはビルド時にのみ実行されて、ページ表示時には実行されないと書いてある。
いやいやいや、実行されているんですけれども。

ページ表示時にasyncDataが実行されるということは、つまりビルド時には実行されていない
すなわち、APIからデータを取得できていないということだ。
そして、ブラウザで実行されているので、privateRuntimeConfigの値も`undefined`だ。
[公式ドキュメント](https://nuxtjs.org/docs/directory-structure/nuxt-config#privateruntimeconfig)では、`privateRuntimeConfig`で指定した値は、`asyncData`の中で`$config`で取れるよ、と素朴に書いてある。できねーじゃんよ。

# なぜSSGなのに、asyncDataが実行されるか。
私の環境における原因は、@nuxtjs/auth-nextを使った認証機能を組み込んでいるからであった。
認証機能に限らないのだろうが、おそらくmiddlewareを組み込んでいるとfull static generationされないのだと思われる。

middlewareは、ページを表示する際に都度実行されなければならない。
認証機能を考えればわかるが、「あらかじめ処理しておく」ということはできない。
middlewareの処理は、asyncDataより先なので、asyncDataもビルド時あらかじめ実行しておいて返り値を埋め込んでおく、ということができない。ゆえに、**Full Staticな生成ができなくなる**、ということなのであろう。
（状況から考えた雑な理解なので、間違っていたら指摘してもらえると助かります）


## どうするか
私の場合、当初の目的はAPIキーの隠蔽であった。
それは、Nuxt.jsの機能として実装することは諦め、別途自前で処理を書くことにする。


**APIにアクセスして取得したデータをJSONファイルとして保存するコードを書く、自前で。**
そして、ビルド時に`nuxt generate`コマンドを実行する前に、その処理を走らせる。
Nuxt.jsのページでは、保存したそのJSONファイルからデータを読み込むこととする。

フレームワークに疲弊させられるというのは気分が良くない。やれやれ。
PHP：条件演算子いろいろ（三項演算子、null合体演算子、リファレンス渡し）

# 三項演算子
本当に便利。比較内容が冗長だと変数に入れるなり工夫いるけど。
備忘録するまでもないけど好きだから。

```php
$item (empty($_POST['item'])) ? 'suit' : $_POST['item'];
```

# null合体演算子

```php
$item = $_POST['item'] ?? 'Not purchased';
```

# リファレンス渡し

同じ変数の内容を異なる名前で呼び出すことをリファレンスという。
別名のラベルを付けられるイメージ。

```php
$a = 7;
$b = $a;
$c = &$a; // &がリファレンス渡し（参照渡し）
$a = 8;
echo $b . PHP_EOL;
echo $c . PHP_EOL;
```
PHP：高階関数とは、関数の引数や返り値に関数を利用した関数。こんがらがる表現。。

# array_mapを用いて配列の全要素に関数の処理を行える

```php
function sum10($n) {
    return $n + $sum10;
}
$arr = [2, 4, 6];
// 超注意！！　なんと、関数名 sum10 をシングルクオートで囲んでいる！！　まるで文字列！！！
// 関数はsum10()とか、sum($n)　とかになっていれば関数とわかるが、確かにsumだけだと関数とわからない。その区別のためか？
$newArr = array_map('sum10', $arr);
print_r($newArr); // Array([0] => 12 [1] => 14 [2] => 16)
```

# array_filterは配列の要素をフィルタリングする時に使える

```php
function even($n) {
    // いつもの省略形
    return ($n % 2) === 0;
}
$arr = [1, 2, 3, 4, 5];
// 要は、偶数のみが配列として返される
$newArr = array_filter($arr, 'even');
print_r($newArr); // Array([1] => 2 [3] => 4)
```
【押したらやばい？】カスタマイズ画面の「PowerPlatformボタン」の機能

**2023年2月現在**

PowerAppsの編集画面になんか知らないボタンありましたね。（下キャプチャの青ラインの箇所）
小さめの機能なのでマイナーアップデートで追加されたものだと考えられます。

![Screenshot 2023-02-20 19.56.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/c3062907-1e41-7976-5763-f1de3e658601.png)


# 押したら…やばい？
ポチっ

## 結論
痛くも痒くもない

## 機能概要
簡単に色んな所飛べるよ〜

## 説明
・PowerPlatform関係のアプリに移動できるリンク

## 感想
別にいらない。これまでは左上のワッフルボタンから関係しているアプリを探して飛んでいたからそれで間に合っていた。。。
マイクロソフトの意向（想像）としては、アイコン統一感あるぜ！簡単に接続できるぜ！俺らもいるぜ！と存在感を示したかったのではないでしょうか。

確かにPowerPages※は最近入ってきたし、Virtual Agentは存在感薄いし、管理センターは行き方面倒だし、慣れると使い勝手はいいかもしれませんね！

※PowerPages＝過去のポータルという機能。かなり厄介なやつだったが、なんか名前変えて帰ってきた！笑

# 結論
どんどん触っていこう！問題なし
serverless Frameworkでフル権限を付与しても権限エラーで怒られた時の対処法

# 事象
serverless frameworkでVPCやサブネット等を作成する構成で`sls deploy`コマンドを実行する
→権限エラーで怒られる
→`AdministratorAccess`の権限を付与してたiamロールを付与しても怒られる

```console:console
% sls deploy

(略)

Error:
CREATE_FAILED: SampleVPC (AWS::EC2::VPC)
Resource handler returned message: "You are not authorized to perform this operation. Encoded authorization failure message:
（略）
```

```yml:serverless.yml (一部抜粋)
provider:
  name: aws
  runtime: python3.8
  region: ap-northeast-1
  iam:
    role: （AdministratorAccessを付与しているiamロール）

# （略）

resources:
  Resources:

    # VPC
    SampleVPC:
      Type: AWS::EC2::VPC
      DeletionPolicy: Delete
      Properties:
        CidrBlock: 10.1.0.0/16
        Tags:
          - Key: From
            Value: SampleVPC
# （略）
```

# 原因

AWS CLIを実行する権限が弱かったため権限エラーが発生していた。
この権限情報は特に設定していなければ`~/.aws/credentials`に登録されている`[default]`の認証情報を用いてAWS CLIを実行している。

# 解決策

## 1. AWS CLIで登録したアカウントに権限を付与する

policyを追加しましょう

## 2. serverless frameworkを実行する認証情報を設定する

1. 実行用のアカウントやロールのアクセスキーを作成し、メモする
1. ターミナルで認証情報を追加するコマンドを叩く
    ```terminal:terminal
    serverless config credentials --provider aws --key [アクセスキー] --secret [シークレットアクセスキー] --profile [認証情報の名前]
    ```
    * `[認証情報の名前]`は分かりやすいように適当に名前をつけてください(例：serverless)
1. serverless.ymlに用いる認証情報を追記する
    ```yml:serverless.yml (一部抜粋)
    provider:
      name: aws
      runtime: python3.8
      region: ap-northeast-1
      profile: serverless # ←追記
      iam:
        role: （AdministratorAccessを付与しているiamロール）
    
    # （略）
    ```

    実行してみると、、、
    ```terminal:terminal
    sls deploy
    (略)
    Service deployed to stack　[スタック名] (185s)
    ```

    無事deployが通りました！
フィクションなどから拾う情報処理用語 その31 部分一致 (モーサテ)

ニュースモーニングサテライトはテレビ東京系列(BSテレ東を含む)で放送されている朝の情報番組・経済報道番組である。2023年2月20日(月)にメインキャスター相内優香アナウンサー(月 - 水曜日担当)とサブキャスターの片渕茜アナウンサー(月・火曜日・隔週水曜日担当)の私服がほぼ一致する珍事が起きた。なおお互いに似たような写真をあげているので見比べて欲しい。

相内優香アナウンサーのInstagramよりお二人の私服

https://www.instagram.com/p/Co3wbpjpVk0/

片渕茜アナウンサーのInstagramよりお二人の私服

https://www.instagram.com/p/Co30tTtJvMz/

片渕茜アナウンサーは「今日の私服が相内さんと完全に一致していました」と勢いもあってか書いているが、実際は部分一致なのであーる。

余談だが、私はある土曜日に東京スカイツリーの麓でバーチャルユーチューバー相内ユウカとお話する機会を得た。相内優香アナウンサーはテレビ東京の本社にいてNTT DoCoMo(だったと思う)の5G回線で繋いで東京スカイツリーにいる人とお話しするという趣向である。アニメ声に騙され…たわけではないが、私はうっかり「中の人のファンです」と口走ってしまったのだが、相内ユウカはご機嫌斜めになり「中の人って言うなよー」と返した。そう。相内ユウカは毒舌キャラでもあったのだ。で私はさらに「鉄オタです。」と相内ユウカが知っても何の役にも立たない情報をカミングアウトしてしまい、「鉄オタかよー」と言われて見事に墓穴を掘ってしまった。もっとも相内優香アナウンサーは覚えていないと思う。
だが当時は全く気づかなかったが相内優香アナウンサーの夫の青井実アナウンサー(どうやって知り合ったのかは謎だが)は大阪局にいた頃から「鉄オタ選手権」のナレーターを務めている。もっとも青井実アナウンサーは関西編の後任の近田雄一アナウンサーとは違って鉄オタではないと思う。さらに余談だが、近田雄一アナウンサーは「歴史探偵」で「バツイチです」と番組とは何の関係もない(と私が思った)情報をカミングアウトしたのだが、そんな情報要らないよ、と思った事を付け加えておこう。
またさらに余談だが相内ユウカはバージョンアップしている。

相内優香アナウンサーのInstagramより当初の相内ユウカ

https://www.instagram.com/p/CIkIz3xHd98/

相内優香アナウンサーのInstagramより現在の相内ユウカ

https://www.instagram.com/p/CoyZFRVpu3H/
【jQuery】ヘッダーが固定されているページ内でアンカーリンクがずれないようにする

こんにちは。E-kan株式会社の岡田です。

ヘッダーが固定されているページ内でアンカーリンクを使うと着地点がずれてしまう問題、よくあると思うのですが私もよく遭遇するので備忘録。
これ、移動距離に固定ヘッダーの高さを足してあげれば良いということで…

## jQuery
```javascript
// ヘッダーの高さを取得してその分コンテンツを下げる
$(function() {

  // #で始まるa要素をクリックした場合の処理
  // "#"はダブルクォーテンションで囲まないと、jQueryのバージョンによっては動かない
  $('a[href^="#"]').click(function() {

    // スクロールの速度（ミリ秒）
    var speed = 500;
    // 移動先をずらすためにheaderの高さを取得
    var adjust = $('header').height();
    // クリックしたページ内リンクの値を取得
    var href = $(this).attr("href");
    // 移動先を取得 リンク先(href）のidがある要素を探して代入
    var target = $(href == "#" || href == "" ? 'html' : href);
    // 移動先を調整 idの要素の位置をoffset()で取得して代入
    var position = target.offset().top - adjust;
    // スムーススクロール linear（等速） or swing（変速）
    $('body,html').animate({scrollTop: position}, speed, 'swing');
    return false;

  });

});
```

原因を知っていればなんてことはないんだけど、知らないと延々悩んじゃうんですよね…
とりあえず、使ったものは忘れないようにメモしておきます。
ウィンドウの周囲に突然現れる青い枠

PowerToys がインストールされている場合、任意のウィンドウを `Windows + CTRL + T` により最前面にすることができる。（同キーで on/off 切り替え）

`windows` `青い枠` `消せない` 等のキーワードでネットで検索すると `ナレーターが原因` という情報が大量に出てくるので、最近まで原因がわからんかった…
Nuxt3にbootstrap-vueをインストールする

Nuxt3とbootstrap-vueの組み合わせについては情報が少なく、ほぼ1日無駄にしてしまったのでメモしておきます

詳細はこちらのGithub Issueをご確認ください

https://github.com/bootstrap-vue/bootstrap-vue-next/issues/232

# 引っかかったポイント
Nuxt + bootstrap-vueについて記述している方は多くいるのですが以下の点で色々なエラーが出てしまい、いろんな情報を組み合わせてやっと動くようになりました

:::note warn
bootstrap.min.cssをnuxt.config.tsに記述すればOKとしている記事を見かけますがこれだけだと、bootstrap.min.jsが動きません
:::

:::note warn
bootstrap-vueをyarnでインストールする説明をよく見ますが、Nuxt3では起動時にエラーになるため、bootstrap-vue-3をインストールする必要があります
:::

:::note warn
bootstrapの一部はクライアントサイドで動くので、mode:'client'でプラグイン設定するように記載しているページを見かけますが、Nuxt3では代わりにpluginsフォルダに作るファイルに'client'をつけてtemplate内でOnlyClientタグを利用します
:::


# インストール方法
## Boostrap-vueのインストール
bootstrap及びbootstrap-vueを対象プロジェクトにインストールします
```
yarn add bootstrap bootstrap-vue-3
```

## nuxt.config.tsの編集
以下のようにcssの部分に２行追加します

```nuxt.config.ts
import { defineNuxtConfig } from "nuxt3"

export default defineNuxtConfig({
  css: [
    "bootstrap/dist/css/bootstrap.css",
    "bootstrap-vue-3/dist/bootstrap-vue-3.css",
  ],
})
```

## pluginsフォルダにbootstrap.client.tsを追加
pluginsフォルダにbootstrap.client.tsという名前のファイルを作成して以下のように記述します

```plugins/bootstrap.client.ts
import BootstrapVue3 from "bootstrap-vue-3"

export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.vueApp.use(BootstrapVue3)
})
```

## 利用するコンポーネントによってOnlyClientタグを使う
動的に表示が変わるコンポーネントではOnlyClientタグを使う必要があります
参考にしたGithub Issueでは例としてアコーディオンの記述の仕方が書かれていました
```app.vue
<template>
  <div>
    <ClientOnly>
      <b-accordion>
        <b-accordion-item title="Accordion Item #1" visible>
          Accordion 1
        </b-accordion-item>
        <b-accordion-item title="Accordion Item #2">
          Accordion 2
        </b-accordion-item>
        <b-accordion-item title="Accordion Item #3">
          Accordion 3
        </b-accordion-item>
      </b-accordion>
    </ClientOnly>
  </div>
</template>
```

# まとめ
Nuxt3はリリース後間もないので、まだまだ情報が少ないですね
今後に期待です
optparseの使い方

## optparseとは

コマンドラインのオプションを取り扱うためのRubyの標準ライブラリであり、コマンドラインオプションを解析するためのライブラリです。
これにより、Rubyのスクリプトを実行する際に、ユーザーが指定するオプションを解析し、適切な値を取得することができます。

## 基本的な使い方

1 optparseは組み込みライブラリにはないため、requireする
```
require 'optparse'
```

2 OptionParserオブジェクトを作成します。
```
   options = OptionParser.new do |opt|
    # オプションを追加する
   end
```
3  opt.onを使って、コマンドライン引数として渡されるオプションを追加します。

```
opt.on('-a') {|v| p v }
opt.on('-b') {|v| p v }
```
onの引数にはハイフン+(一文字)で省略形を設定できて、ハイフン+(複数文字)で省略形でないオプション名をつけることができます。

オプション名は複数つけることができて、順番は問いません。

また、最後の引数にはそのオプションの説明を設定します。

ただ、-hや--helpはoptparseが読み込んだ時点でデフォルトで設定されているコマンドなのでこの名前のオプション名はつけないようにしましょう。

4 opt.parse!(ARGV)を使って、実際に引数を解析します。

```
   options.parse!(ARGV)
```
AtCoderで入茶するのに意外と時間がかかった件について

# AtCoderを始めた経緯
AtCoder自体大学の講義でやんわりと聞いたことがある程度でいつかやろうかなとぼんやりと考えていました。
大学3年の後期終わり自動車免許をとり終え、時間のゆとりが生まれた時期にある動画に出会いました。
テレ東BIZで配信されている
[未経験者のアナタもハマる？競技プログラミング「AtCoder」って何だ？](https://www.youtube.com/watch?v=WGNQrH0AV2k)
AtCoderは一種のゲームみたいなものと高橋社長が紹介しているのを見てゲーム感覚でプログラミングができるって今までにないコンテンツではないかとハッとしました。
>その当時AtCoderしか知らなかったので、高橋社長は競技プログラミングという概念を作り上げた人だと思ってました。
>
ゲームも好きだしプログラミングも好きだった私は一石二鳥じゃん！！と思い、競プロを始めることにしました。

# C++での挑戦(2021年3月~10月)
![rasen.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153036/ead1f749-c39c-e2fe-b136-43d7a0ab7660.jpeg)
とりあえず競プロ界隈で有名な螺旋本に着手しました。初等的整列の復習であったりスタックやキューといったデータ構造・動的計画法・幅優先探索・深さ優先探索など収録しています。競プロ初心者の私でもわかりやすくベテランの人も復習がてらに使える名著です。
この本の通り競プロと言えば、C++だろと思い込んでたんですけどC++自体あまり書き慣れていないのですぐ挫折してしまいました。Pythonはローコードで見やすいデバッグしやすいといった点自分と相性が良かったです。
>この本ではC++の解答例が載っていますが、AOJの公式サイトアルゴリズムとデータ構造入門にPythonの解答例があります！青や黄色などさらに上を目指すなら実行速度の都合上C++で解いた方がいいかもです。
>

# Pythonでの挑戦(2021年10月~)
この時期から本格的に競プロに力を入れました。授業でPythonを触っていたとはいえ競プロ特有の標準入力の形に慣れていなかったので、そこから取り組みました。そして[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067)と[AOJプログラミング入門](https://onlinejudge.u-aizu.ac.jp/courses/list)といった流れで進めました。
ここら辺は基礎中の基礎なので、解ける人はAtCoderProblemsのサイトで精進しちゃってください。なかなかレーティングも上がらず茶色になるのは相当先になると察しましたね 💦
Python3の参考書はこちら
![Python3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153036/611bf916-250c-2bb2-9ef4-5998c3449efc.jpeg)

# メンタル面に関して
そこから就活やら卒論やらで忙しくなりながらも継続してABCに参加しました。
継続するコツとしては

1.他人と比較するのでなく自分の過去の成績と比較する。
2.間違った問題や典型的な問題(解けた問題でも)何周もする。

の2点、AtCoderに参戦する人は文系・理系・情報系など様々なバックグラウンドを持ちます。中には高校生の段階でレッドコーダーになる人もいるぐらいなので他人の成績で一喜一憂してもしょうがないです。
**前に解けなかった問題が解けて嬉しい**この感情を大切にしましょう。

参加者の中には情報系でバリバリ研究をしている人もいるので文系の人で成績上がらなくて悩んでいるのはみんなそうです。成績が上がるタイミングは人それぞれです。

# レーティング推移
![rating.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153036/a5e5439d-79e0-d248-0e18-b1f2c079c07e.jpeg)
入茶するのに1年7ヶ月とめちゃんこに時間がかかりました。全然成績が上がらない人は私のレーティング推移をみて **まだマシかも？** と元気付けてください！ **私も元気に参加し続けます！**
>最初の方の上がり幅が少しなのはC言語でチャレンジしたりとVsCodeの環境構築が上手くいってなかったためです。適当なテキストエディタでプログラミングをするといったことはやめてください笑
>
flutter doctorでUnable to find bundled Java version.と指摘される(2023年2月20日)


android studioを最新版にアップデートしてdoctorを走らせると以下のようなエラーが発生した．
~~~ flutter doctor_error
[√] Flutter (Channel stable, 3.7.3, on Microsoft Windows [Version 10.0.19043.1645], locale ja-JP)
[√] Windows Version (Installed version of Windows is version 10 or higher)
[√] Android toolchain - develop for Android devices (Android SDK version 33.0.2)
[√] Chrome - develop for the web
[√] Visual Studio - develop for Windows (Visual Studio Community 2019 16.11.1)
[!] Android Studio (version 2022.1)
    X Unable to find bundled Java version.
[√] VS Code (version 1.75.1)
[√] Connected device (3 available)
[√] HTTP Host Availability
~~~
その対策法が[
Unable to find bundled Java version
](https://github.com/flutter/flutter/issues/118502)に書いてあったので説明する．

1. C:\Program Files\Android\Android Studioを開く
1. jreフォルダにjbrフォルダをコピペする
1. ターミナルを再起動してもう一回flutter doctorをする

以上の手順でエラーは解消された．
~~~
[√] Flutter (Channel stable, 3.7.3, on Microsoft Windows [Version 10.0.19043.1645], locale ja-JP)
[√] Windows Version (Installed version of Windows is version 10 or higher)
[√] Android toolchain - develop for Android devices (Android SDK version 33.0.2)
[√] Chrome - develop for the web
[√] Visual Studio - develop for Windows (Visual Studio Community 2019 16.11.1)
[√] Android Studio (version 2022.1)
[√] VS Code (version 1.75.1)
[√] Connected device (3 available)
[√] HTTP Host Availability
~~~
最近のAndroid Studioで起きているエラーらしい．
Shift-jisで読み込めない時の対処法

# 結論
**encodingに'cp932'** を指定

# 概要
* ファイルをJupyter notebook等で読み込む際、encodingにShift-jisを指定しているのに何故か読み込めない時に使えます
* WindowsユーザーでPythonを使用している人特有のエラーです

# コード
```
import pandas as pd

df = pd.read_csv('ファイルパス',encoding='cp932')
```
* エラーが起きる原因はShift-jisのバージョンが多いことにあります。
* 'cp932'はShift-jisのWindowsバージョンという位置づけなので、エンコードを指定して読み込む場合は注意しましょう（Pythonはデフォルトが'utf-8'ということも注意）

# 参考サイト
https://snowtree-injune.com/2020/05/15/codec-py003/#toc4