OmniAICreator/Qiita-1.07M huggingface dataset:
【最新版】JavaでNullPointerExceptionっていうエラーが出たときの対処法

# はじめに
こんにちは。RaimuProjectのやむぅです。
今回は、Javaのコーディング中に起きたエラー「NullPointerException」の解説や対処法についてお話ししていきます。
どんな不具合なのか、どうやって調査・対処すればいいの？という人向けに書いたものです。ぜひ読んで見ていただけると嬉しいです。

※ ちょこっと紹介！
現役エンジニアの僕が教える、フルスタックエンジニアを目指せるスクールを運営しています。
プログラミング初心者の方やリスキリングを考えている方にぜひ！

https://programing-factory.raimuproject.com/lp

# 開発環境
今回僕のMacを使っています。
そのためショートカットキーを使う際、WindowsのPCを使う人は以下のように変換して記事を見てください。
| Mac | Windows |
|:-----------|------------:|
| ⌘(Cmd)       | Ctrl        |
| ⌥(Option)     | Alt      |
| ⇧(Shift)       | Shift        |

:::note warn
ex)コピーのショートカット:
Mac → ⌘ + c
Windows → Ctrl + c
:::

# エラー発生
Javaのプログラムを実行したらこんなエラーが発生した。
```
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "str" is null
	at testJava.Main.main(Main.java:8)
```

## エラーの意味
このエラーメッセージは `java.lang.NullPointerException` で、よく`ぬるぽ`と呼ばれているやつです。これは**Null参照に対して操作を試みた際に発生する例外**で、具体的には、今回`str`という変数がnullであるにも関わらず、`length()`というメソッドを呼び出そうとしているため、「そもそも文字どころか何もないじゃん！」とエラーが発生しています。

## 原因と調べ方
まずこのエラーの原因は、変数`str`がnullの状態にもかかわらず、その変数に対して`length()←文字数を求めるメソッド`を呼び出したことです。null には実際のオブジェクトが存在しないため、メソッド呼び出しができずに例外が発生しました。

では次に調べ方ですが、まずはエラーメッセージを見ていきましょう。

エラーメッセージの内容: testJava.Main.main(Main.java:8) という記述から、エラーが`Main.java`ファイルの8行目で発生していることが分かります。コードの該当部分を確認して`str`がどのように使用されているかを見ます。
この`str`の初期化状態→どこで宣言・初期化されているのか、また、`null`の状態になる可能性があるか確認します。
確認する方法として、一番シンプルかつ初心者向けのやり方としては、`null`になっていそうな箇所の後ろに`System.out.println(str);`を置き、`str`の値がどこで`null`になっているかを確認するといいでしょう。

```java
String str = "あいうえお";

str = null; // ←ここでnullになってそう！(なってる)
System.out.println(str); // ←strを出力して中身確認！
```

## 対処法
対処法は状況と場合によっていろいろありますが、
* `null`チェックを追加すること
`str`が`null`でないことを確認してから`.length()`メソッドを呼び出すようにしましょう。
```java
if (str != null) {
    System.out.println(str.length());
} else {
    System.out.println("ヌルじゃん");
}
```
このようにしてNullPointerExceptionを回避して、というよりnullのものを処理させないようにしましょう。

# 最後に
この記事では、プログラミングをやり始めた初心者から実際にエンジニアとして働いた時の実務のコーディング中に発生したエラーやバグの調査方法から対処法、基礎的な知識をできる限り**さっくり**と**わかりやすく**解説しています。


# その他
現役エンジニアの僕が教える、
* チャット質問で悩み解決
* 週一で1 on 1メンタリング実施あり
* 実務レベルの高難易度課題 & レビューあり
* あなた専用のロードマップを一緒に作成
* 案件や実務のエンジニアのリアルが学べる & 体験できる
* 未経験から4ヶ月で<font color="OrangeRed">フルスタックエンジニア</font>を目指せる

こんな内容が学べる・経験できるプログラミングスクールです。
プログラミング初心者の方やリスキリングを考えている方にぜひ！

https://programing-factory.raimuproject.com/lp
Vue+Vuetifyプロジェクトのはじめかた

## テンプレート作成

1. プロジェクトルートディレクトリで `npm create vuetify@latest` を実行
1. 以下のように回答
![vuetify.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670736/4fac9ad9-88c0-1b5d-94ef-b564586c7e01.png)
1. `frontend` ディレクトリに移動
1. `npm install` を実行

## デバッグサーバ起動

1. frontendディレクトリで `npm run dev` を実行
1. Webブラウザで `http://localhost:3000` にアクセスして表示を確認

## ビルド実行

1. frontendディレクトリで `npm run build` を実行
1. frontend/dist ディレクトリにビルド結果が出力されることを確認

## ディレクトリ構成確認
以下は src ディレクトリ下の構成
public ディレクトリ下にはバンドル対象外としたいUI要素を配置する
  - UI実装
    - layouts
      - pages
        - components
    - styles
  - build時にバンドル対象としたいUI要素
    - assets
  - 画面遷移
    - router
  - 状態管理
    - stores
  - プロジェクト外部モジュール
    - plugins
  - 汎用スクリプトやbackend通信処理など
    - (自動生成されていないのでディレクトリを用意する)


## index.html
`index.html` の以下の箇所を編集
  - `<html lang="en">` を `<html lang="ja">` に
  - `<title>Welcome to Vuetify 3</title>` を任意のWebサイトタイトルに


## App.vue
`src/App.vue` を以下のように編集

  - `v-main` などの配置を `layout` の責務にするため `App.vue` から排除する

  ```vue
  <template>
    <router-view />
  </template>
  ```


## レイアウトデザイン

最初に作りたいWebサイトのレイアウトをざっくり決める
SPAであれば以下の4要素の有無を基準に考えると良い
  - ヘッダー
  - フッター
  - 動的に変化しない領域（ヘッダー/フッター以外）
  - 動的に変化する領域

ヘッダー/フッターを持ち、左にメニューバーを持つレイアウトの例：

![layout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670736/c8adf709-49b8-8d41-b200-3dcc028957a7.png)

## レイアウト実装

`layout/default.vue` を編集
ここで実装するのは要素の静的構造であり、スタイルや動的処理を実装すべきではない

  - `v-main` タグの内側に配置するか外側に配置するかはコンポーネントの仕様を参照
    - 例として今回は `my-side-bar` 内で `v-navigation-drawer` を定義する想定とする
    - 各領域要素の中でどのコンポーネントを使用するか、この段階で大まかに想定できるのが理想
  - 動的に変化する領域は　`router-view` で実現
  - 以降、import文にある `pages` ディレクトリ以下の要素を実装していく

```vue
<template>
  <v-app>
    <my-header />
    <my-side-bar />
    <v-main>
      <router-view />
    </v-main>
    <my-footer />
  </v-app>
</template>

<script lang="ts" setup>
import MyFooter from '@/pages/MyFooter.vue';
import MyHeader from '@/pages/MyHeader.vue';
import MySideBar from '@/pages/MySideBar.vue';
</script>
```

## Router実装

 - 今回の例のように画面の一部だけを変化させたい場合、`setupLayouts` は使用しない

```typescript
import { createRouter, createWebHistory } from 'vue-router/auto';
import type { RouteRecordRaw } from 'vue-router/auto';


const routes: RouteRecordRaw[] = [
  {
    path: '/',
    component: () => import('@/layouts/default.vue'),
    children: [
      {
        name: 'ViewA',
        path: '',
        component: () => import('@/pages/ViewA.vue'),
      },
      {
        name: 'ViewB',
        path: '/bbb',
        component: () => import('@/pages/ViewB.vue'),
      },
    ],
  },
  {
    name: 'NotFound',
    path: '/:pathMatch(.*)*',
    component: () => import('@/pages/NotFound.vue'),
  },
];

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: routes,
});

export default router;
```
ビルド時に出た Sandbox: sed(2330) deny(1) file-read-data ...エラーへの対応

# Releaseスキームでのビルド時に発生したエラー

```
error: Sandbox: sed(2330) deny(1) file-read-data /Users/***username***/Developer/Xcode Projects/***app name***//***app name***.xcodeproj/project.pbxproj (in target '/***app name***' from project '/***app name***')
```

Debugスキームで動かしているときは、何のエラーもなく動いていました。
デバッグも終わり、`Direct Distribution`で配布するためにReleaseスキームでビルドしたときに、このエラーが出ました。

このエラー、新しいアプリを開発するたびに出るのですが、ついつい対応方法を忘れてしまいます。

Releaseスキームの時、多くの方もやってらっしゃるであろう`ビルド番号の自動更新`をRunScriptで実現しています。
このエラーが出る原因はこのRunScriptを実行することです。
この実行を許可しなくてはいけなんですね。

# 対応方法
![スクリーンショット 2024-10-11 15.07.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/bcf9320f-4dac-8473-1b9e-831f9d5b3f9c.png)

ビルドオプションの`User Script Sandboxing`をNoに変更します。
Xcodeのあるバージョンから、この設定がデフォルトでYesになり、この対策方法がわからずに苦慮しました。
現在、Noは非推奨です。

こちらのサイトが役立ちました。
こちらのサイトの情報によると、ちゃんとしたスクリプトを記述すれば、このようなエラーは出ないそうです。
[Xcode で Run Script 時 Sandbox: ... deny(1) file-read-data 的なエラーが出た時の対処法](https://zenn.dev/feb19/articles/c3e6ec545383bb)
Autodesk Inventor API Hacking (AddInのpath)

# 0. はじめに
[Freeradical](https://www.freeradical.jp)の中の人、[yamarah](https://qiita.com/yamarah)です。
AddIn.dllと同じdirectoryに、設定ファイル.xmlを置きたい場面があると思います。このために、自分のAddIn.dllの場所を知る方法を調べました。

# 1. 結論

|API|2024以前|2025以降|
|-|-|-|
|System.Reflection.Assembly.GetExecutingAssembly().Location|AddIn.dll自体のpath|←に同じ|
|System.AppDomain.CurrentDomain.BaseDirectory|Inventor.exeのdirectory|空文字列|
|System.AppContext.BaseDirectory|Inventor.exeのdirectory|空文字列|

`GetExecutingAssembly().Location`を`GetDirectoryName()`するのが良さそうです。
また、今回のお題とは関係ありませんが、`Inventor.exe`のdirectoryを得るのに`BaseDirectory`を使っていた場合は、2025以降で挙動が変わっているので注意してください。

# 99. 親の記事に戻る
[Autodesk Inventor API Hacking (概略)](https://qiita.com/yamarah/items/cee08eb8f2b7aecbda83)
LeetCodeを1日1題解いてみる (day2)

2日目に取り組んだ問題はこちら！

# 9. Palindrome Number

https://leetcode.com/problems/palindrome-number/description/

## 問題文
Given an integer x, return true if x is a palindrome, and false otherwise.

## 僕の回答

```py
class Solution:
    def isPalindrome(self, x: int) -> bool:
        x_str = str(x)
        reversed_str = x_str[::-1]
        return True if x_str == reversed_str else False
```

## より効率の良い回答例

```py
class Solution:
    def isPalindrome(self, x: int) -> bool:
        return str(x)==str(x)[::-1]
```
### コメント
変数に代入してから比較せずに直接`return`時で比較すればよかったですね！
また、`True if x_str == reversed_str else False`のように書かずとも、`str(x)==str(x)[::-1]`で`True` or `False`を返してくれますね！

### 次回はこちら!
https://qiita.com/h_y_s_d/items/dfa0b5aed3118d8f9fe7
Differential Transformerの構造解説

## はじめに
この記事では、2024年10月7日に登場したばかりの新しい機構、
[arXiv:2410.05258](https://arxiv.org/abs/2410.05258)
において提唱されたDifferential Attentionの解説をします。
本解説では実装できるレベル感の解説をします。

## Differential Transformer (以下DiT) 概要
この機構は、従来のTransformerで問題となっていた、重要ではない無関係な情報にも注目度をふってしまうことを改善するために作られた機構ということです。
様々な条件下で、従来のTransoformerより性能が良いことが示されています。

## 機構解説
$DifferentialAttention(Q, K, V) = Linear(GroupeNorm([Softmax(\frac{Q{_1}K{_1}^T}{\sqrt{d{_k}}}) - λSoftmax(\frac{Q{_2}K{_2}^T}{\sqrt{d{_k}}})]V))$
DifferentialAttention(以下DiA)では、全結合層を通った後のQuery・Keyのテーブル上で無関係な情報に付与される注目度を減らすために、重みを共有しないもう一つのQuery・Keyテーブル(以下QKテーブル)を用意します。
1つ目のQKテーブルから、二つ目のQKテーブルの値を引くことで、必要な情報以外を減らすことができるという差動アンプと似ている手法が使われています。
この手法を採用すると、下のグラフで示されているようにノイズキャンセリングのように無関係なところに割り振られるノイズを減らす効果が確認されています。
引用元 https://arxiv.org/html/2410.05258v1/
![効果](https://arxiv.org/html/2410.05258v1/x1.png "効果検証データ")

そして、減算部分の系数$λ$については、学習パラメータとのことです。
これ以外は通常のTransformerとおおむね同様のようです。
性能の根拠 引用元 https://arxiv.org/html/2410.05258v1/
![スクリーンショット 2024-10-11 14.43.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619971/a8bb6726-83eb-1b78-435c-1f4308ba487e.png)

## 終わりに
「いやはや、ノイキャンを応用するというアイデアは恐れ入った汗」という感想ですね笑
私としては、脳神経系の、とあるニューロンが発火したら、逆の作用をするニューロンを抑制するという現象と似ていて面白いなと感じました。
もし間違い等あればコメントください。
本当に素晴らしい技術を生み出してくださった論文の著者に感謝です！！
## 実装したコード(Pytorch)
[Github](https://github.com/NinTow/DifferentialTransformerLib)
Googleドライブのファイル名一覧を取得する

## 目的

Googleドライブの特定のディレクトリでファイル数がとても多い時、まとめてファイル名一覧を取得したい時がありました。
開発者ツールで見ると `KL4NAf` クラス名が使われていることがわかりました。(クラス名ハッシュ化されてそうだから変わったりするのかも

```html
<div class="KL4NAf">サンプル.txt</div>
```

## 手順

開発者ツールのコンソールを開いて下記のコマンドを実行する。

```js
const elements = document.querySelectorAll('.KL4NAf');
const list = Array.from(elements).map(el => el.textContent.trim());
console.log(list);
```

完。

## 追記

もっと短く書ける方法を教えてもらいました。

```js
$$('.KL4NAf').map(el => el.textContent.trim())
```

### 補足

- `$$` Chromeのブラウザ開発者ツールでのみ使用できるショートカット関数
    - `Array.from(document.querySelectorAll())` を簡単に書ける
- `.map(el => el.textContent.trim())`
    - `$$()` で取得した配列の各要素の前後の空白をtrimしている
【PostgreSQL】各要素の名称を改めて調べてみた

フィールド、を列と定義してる人と、セルと定義している人がいる...  
どっちが正しい...
ということがあり、改めて用語の定義を見直してみた  

## PostgreSQL テーブル用語まとめ

出典：

https://www.postgresql.jp/document/16/html/glossary.html

俯瞰図：

![png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/81f86a03-0665-a2de-4b1d-e25a201ce43d.png)




### Database【データベース】

> ローカルなSQLオブジェクトの名前付き集合。

Excel で言う「ファイル」に該当するかな

テーブルから属性まで、全ての要素はSQLオブジェクトと言うみたい
基本的に1つのデータベースに対してのアクセスになるので、一番大きい単位だと思うと良さそう

標準SQL では `Catalog【カタログ】` とも呼ばれるみたい



### Schema【スキーマ】

> スキーマは、同じデータベースに存在するSQLオブジェクトのための名前空間です。 
> 各SQLオブジェクトは正確に一つのスキーマに存在する必要があります。
>
> より一般的には、スキーマという用語は、与えられたデータベースあるいはその部分集合中のすべてのデータの記述（テーブル定義、制約、コメントなど）の意味で用いられます。

Excel で言う「ブック」に該当するかな

1つのデータベースの中に定義する、名前空間のようなもの
スキーマを使うことで、複数のテーブルグループが同居できる
省略すると `public` が使われる

つまり Database は物理的な単位、Schema は論理的な単位  

`mysql` の場合、`Schema = Database` なので、意識する必要が無い



### Table【テーブル】

> 共通のデータ構造を持つタプルの集合（同じ数の属性が同じ順序で、位置ごとに同じ名前と型を持ちます）。 
> テーブルは、PostgreSQLにおけるリレーションの最も一般的な形式です。

Excel で言う「シート」に該当する

よく見かける、縦横があるテーブルと同義  
タプルは後述  




### Column【列】

> テーブルまたはビューに含まれる属性。

Excel で言う「縦の列」に該当する

列要素  
SQL では列ごとに属性を定義していく  




### Tuple【タプル】/ Row【行】 / Record
> 属性を一定の順序で集めたもの。
> この順序はタプルが含まれるテーブル（または他のリレーション）によって定義されます。
> その場合タプルは、しばしば行と呼ばれます。
> また結果セットの構造によって定義される場合もあります。
> その場合、タプルはレコードと呼ばれることがあります。

Excel で言う「横の行」に該当する

難しく書いてあるが、要するに行要素  
タプルは、順序がある決まった集合の要素、って考え方  





### Attribute【属性】
> タプル内にある特定の名前とデータ型を持つ要素。

Excel で言う「セル」に該当する

でもセルも属性、列も属性だと、属性がこんがらがる気がする  





## おわりに

SQLはいろんな派生があるせいで、用語が入り乱れている気がする  
属性ってわかりにくいな？  

一応 mysql のも調べた

https://dev.mysql.com/doc/refman/8.0/ja/glossary.html

結局フィールドってなんだ...？
【学習】MVP後、わからなかった部分

# はじめに
MVPリリースが完了した後、共通課題？のような内容で「？」だった用語などについて、私自身が見返すために+アウトプットの為に、誰かの参考になればいいな。を含め記事にしたいと思います。


##### 1：独自ドメイン反映-> DNSやSSLの対応も必要
現在私は`hogehoge.onrender.com`でアプリを運営？しています。つまり、Renderが提供しているサブドメインを利用している状態です。
詳しく言うと、**ウェブアプリがRenderのサーバー上でホストされている**ことを示しています。

これを独自ドメインにするという事は私専用のウェブサイトアドレスを取得するという事。
ウェブサイトを独自のURL（例えば example.com のようなドメイン名）でアクセスできるように設定すること＝**独自ドメイン反映**
このプロセスに、**DNS設定やSSL証明書**の対応が必要になるそうです

> ###### なぜDNSやSSLの対応が必要か？
> - **DNS設定**：独自ドメインを設定する際、ドメイン名がウェブサーバーと正しくリンクされるように、DNSレコードの設定が必要です。
> - **SSL証明書**：独自ドメインでウェブサイトを運営する場合、ユーザーのデータを保護するためにSSL証明書が必要です。これを導入しないと、サイトが「安全ではない」と表示されることがあり、信頼性に影響を与えます。

<br>

##### 2：OGP（静的 or 動的）-> SNS等でシェアするときの見栄えが良くなる
###### 【用語の解説】
- **OGP（Open Graph Protocol）**：Facebookが開発したもの。ウェブページの情報をSNSにシェアする際にどんなコンテンツを表示するかを定義するための規格。他のSNS（Twitter、LinkedInなど）もこれをサポートしている。
- **静的OGP**：事前に決めた固定のメタデータをHTML内に記述する方法。ページごとに設定を変更することが少ないサイトに向いている
- **動的OGP**：動的に生成されるページ（例：ブログやECサイトの商品ページ）で、ページごとに異なるメタデータを生成し、OGPを設定する方法。ページの内容に応じたメタ情報が表示されるため、内容にマッチした情報がSNSで表示される。

###### 【OGPを設定する理由（メリット）】
- **シェア時の見栄えが良くなる**：シェアされた際に、適切な画像、タイトル、説明が表示されることで、リンクが目立ちやすくなり、クリックされやすくなる。
- **ブランドイメージの統一**：一貫性のある画像やタイトルが表示されるため、ブランドやサイトの認知度向上につながる。
- **ユーザー体験の向上**：適切な情報が提供されることで、SNS上での信頼性が増し、ユーザーがどんなページにアクセスするのか予測しやすくなる。

<br>

##### 3：RSpec（モデルテスト+システムテスト or モデルテスト+リクエストテスト）
- このツールを設定しておくことで開発における品質の意識や開発効率の意識の高さをアピールできる
- RsepcはRubyで作られたアプリのテストを自動化するためのツールで開発コードが正しく動作するか確認するためのもの
- テストの種類は次の通り
- > テストの種類
モデルテスト：データベースとのやりとりを行う部分（モデル）が正しく動作しているかを確認します。バリデーションや関係性のチェックを行います。
システムテスト：ユーザーが実際に操作するような動きをシミュレートし、アプリが正しく動作するかを確認します。ブラウザを開き、ページの表示やリンクが正常に動くかチェックします。
リクエストテスト：特定のページや機能にリクエストを送って、サーバーが期待通りのレスポンス（結果）を返すかを確認します。

<br>

##### 4：CI（継続的インテグレーション） with GitHub Actionsを設定したほうがいいそうだがCIとは？
- コードを自動でテストしたりチェックする仕組み

<br>

##### 5：Rubocopでのリファクタリングしたほうがいいそうだが用語がよくわかっていない。Lintって何？
- Rubocopは、Rubyのコードをチェックし、コードの書き方を改善するツール

<br>

##### 6：検索機能のアップデート（オートコンプリート、マルチ検索）を設けたほうがいいそうだが、それぞれどんな機能？
- オートコンプリートは「ユーザーが検索ボックスにキーワードを入力し始めたときに、候補を自動で表示する機能」
- マルチ検索は「複数のキーワードやフィルターを組み合わせて検索できる機能」

<br>

## 上記の事＝用語を理解した上で「？」となった部分について
CI、RSpec、Rubocopの3つについて、用語解説を見る限り似ているから、どれか一つでいいのか？と思いました。
どれか1つだけというわけではなく、それぞれの役割が下記のように異なるそうです。
- **RSpec**：プログラムの動作テストをする（機能が正しく動くかを確認）。
- **Rubocop**：プログラムの書き方をチェックする（スタイルやコードの品質を改善する）。
- **CI**：RSpecやRubocopを自動で実行する仕組み（開発者が手動で実行しなくても、変更があるたびにチェックしてくれる）。
- RubocopとLintについては、RubocopはRuby専用のLintツールで、Rubyのコードが「良い書き方」になっているかどうかをチェックし、改善案を提案するもの。

<br>

# さいごに
MVP後～本リリースに向け準備することが以外にも多いことを知りました。多くの方が利用しやすいと感じるアプリ制作の道はまだまだ続く。
WezTermで日本語入力できない

# はじめに
WezTermを使っていて日本語入力ができないのが不便だったので対応した。
# 問題
WezTermで`use_ime`がオンになっているにも関わらず、
「半角/全角キー」でIMEがオンにならず、「\`」が入力されてしまう。

# 解決方法

`fcitx5`をインストールした後、
`im-config`でデフォルトのインプットメソッドが`fcitx5`に設定されていることを確認した。
```
sudo apt remove ibus
sudo apt remove uim uim-mozc
sudo apt install fcitx5 fcitx5-mozc

im-config
```

# おわりに
ベストな解決法ではないかもしれないけど、日本語入力できるようになってよかった。

# 参考

https://deep.tacoskingdom.com/blog/211
チーム開発で成果を出すための講義を聞いてみて

講演者：成瀬允宣さん
開催日時：2024年10月11日
開催場所：zoom

今回はサポーターズのイベントの「チーム開発で成果を引き出すためのアプローチを学ぼう【就活＆ハッカソン攻略】 / 技育CAMPアカデミア」について参加してみての感想や気づきをQiitaにアウトプットして、次への活かしにしたいと思います。

## 【概要】

・本講演では、チーム開発する中で大切なこと・意識していることを実務経験を元に具体的な事例を交えて解説していただきました。

## 【要約】
- 会社によって変わることと変わらないことがある。
    - 変わらないこと
        - アーキテクチャ
        - 開発チーム体制
    - 変わること
        - 監査レベルと承認フロー
        - 言語
- 周りと差をつけるなら**変わらないこと**に力を入れるべき
- チーム開発の動き方を知っているのは即戦力になる
    - git
    - チームビルディング
    - コミュニケーション


### チームワークの構築方法

- 役割分担
    - 重要なのは誰が何をやるか
        - 誰が権限や責任を持つかを決めることで構図がわかりやすいため、相談しやすい
        
- コミュニケーション
    - 会話する場を作る
        - 例）週一回やったこと報告会を行う
            - メンバそれぞれ全員に5ふん程度会話する
                - 最近行ったところ、楽しかったことなどなんでもいい
            - 人間は承認されないと生きていけないので、そういった場で認め合う
    - 絵を描いて会話する。
        - 言葉だけだと空中戦になりやすい

- リーダーシップの形
    - リーダーシップには大きく二つある。
        - 1.後ろに立つ
            - サーバント型
            - マネジメント
            - 精神的に辛く、肉体的に楽
        - 2.前に立つ
            - ヴィジョン型
            - リーダー
            - 肉体的に辛く、精神的に楽
        - ***現状のままでいいなら1でいいが、現状の先に行くなら前に立つ必要がある***
        

## 【感想】
- 今まではチーム開発の経験がほぼなく、一人での開発が多かったので、その機会を増やそうと思いました。
例）ハッカソン,もしできたらサークル内でチーム開発
- アーキテクチャの学習を行っていないので、今回を機に取り組んでみます。
- 今ままでプログラミングに限らず、チームで何か話し合いをする時、自分が全部やったほうがスムーズに進むと思っていたが、人に役割を与えることでより主体的に話し合いに参加してもらえると思ったので、今後は役割を与えながら進めてみようと思いました。
- 私自身、アルバイトで開発を行っていてわからないことがあった時に、恥ずかさやもっと調べてみようなど自分自身で解決しようとし、時間がかかってしまうことがあります。そのため、短いスパンで現状を報告する場を作ろうと思いました。
- リーダーシップには二種類あり、現状のままでいいなら後ろに立ち、現状の先に行くなら前に立つという言葉が印象に残りました。今までは順調に進んでいても自分が前に出るのがリーダーシップだと思っていましたが、時には後ろに立つことも重要だということを学びました。
Dockerイメージ保存とロード

よくコンテナ壊しちゃうんで復元用の備忘録メモ
```
sudo docker images
sudo docker ps -a

▼image保存
docker save image_name > image.tar

▼imageをロード
docker image load -i ./Desktop/work/image.tar

docker-compose.ymlのあるディレクトリで
docker-compose up -d　でコンテナ作成
```
Slackスラッシュコマンド[リマインダー設定とGithub連携]

備忘録としてちょこちょこ使うリマインダー設定とGithub連携後のコマンドをメモ

・リマインダー設定

```
・リマインダーの設定方法について詳細を確認する
/remind help
・自分が設定したリマインダーのリストを表示する
/remind list
・メンバーやチャンネルのためにリマインダーを設定する
/remind [@メンバー または #チャンネル または me] to [何を] [いつ]
例：
/remind @user 今日は確認日です at 10:00 every Monday, Wednesday and Friday	
```

GithubをSlackに連携して使用しています。
マージ後のブランチ削除を自動で行うのがNGの場合等でfeatureブランチをまとめて削除する時に通知全部飛んじゃうので以下で一時的にオフにしてます。

```
・現在の通知一覧
/github subscribe list features

・ブランチ整理時のブランチ通知一時解除用
/github unsubscribe owner/リポジトリ名 branches
・ブランチ整理後のブランチ通知追加用
/github subscribe owner/リポジトリ名 branches
```


---
🔹SlackにGithub連携する方法
1. SlackのApp管理から追加: https://slack.github.com/
2. github連携したいslackチャンネル作成
3. コマンドを実行  
`/github subscribe <owner>/<repository> 通知したいfeature`
※以下参照


・指定できる通知機能の一覧
| feature | 説明 | デフォルト通知 |
|:-:|:-:| :-: |
|issues|issueのオープン/クローズ|◯ |
|pulls|PRの作成 / マージ	|◯|
|commits	|default branchに対するコミット|	◯|
|releases	|リリース	|◯|
|deployments|	deploymentsステータスの更新|	◯|
|reviews	|PRのレビュー|	×|
|comments	|PR / issueのコメント|	×|
|branches	|branchの作成と削除	|×|
|commits:*	|全てのブランチに対するコミット|	×|
|discussions	|作成または回答されたディスカッション	|×|
|+label:"your label"	|指定したラベルのissue、PR、コメント|	×|
yoomで改行付きのフォーマットを作る



yoomから以下のように改行されたフォーマットでSalesforceにレコードを作る

Salesforceの画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/24e17b9e-c86f-a0b5-27df-2b5f4b7920ad.png)


何故かはわかりませんが置換を使って改行が表現できる。

yoomの画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3abb5fde-3817-c744-3f9e-66fbd28e0592.png)


しかし、リストビューではこの項目はロングテキストなので表示できません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a42e9f41-3255-0f2a-b521-0b03c02fdd7b.png)

不思議なことに関連リストだとロングテキスト項目が表示できる。何でだろう？
でも、改行付きできれいに表示出来てもモバイルだと全文が見えないので、項目を/で区切っただけでいいそうです。
項目が何なのかは気にしないそうです。まぁ、楽でいいけど

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/29500dc1-3a60-eb0a-70c5-2bcb1f1d43de.png)
M5C6)Servo(サーボ)で遊ぶ。(PWM)(M5Nano C6)




x 過去ログを見よ!!
x 業務連絡　マルチメディア飲み会あるよ(絶滅メディア博物館)　なんのこと?
x サーボを繋ぐ時は、必ず絶縁してください。
x サーボをパソコンに繋いだままやるとパソコンが破壊されます。
x モーター、コイル等、逆起電力で高電圧が発生する時の安全対策は、各自実行してください。
x 最低でも、試す時は、モバイルバッテリを使用してください。
x モータ系の力学装置系をなぜ、あまりやらないのかは、まず、物理的にお金がかかる、いろいろ、危険であるから



目的
秋月で買った。
SG-90(PWMラジコンサーボ)を使い旗を振る。



結果

![o_coq506.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4920a9b6-5213-8159-7633-8cb26cddae34.jpeg)

![o_coq507.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f38cba8b-3d06-0220-5d77-782530d4bdec.jpeg)


プログラム



```C++


//PWM_ledcWrite_servo_C6_1


//インクルド
#include<Arduino.h>


//定義
//使い方　SOのマクロに0から180を設定すると
//PWMの間隔の値が返る
//        a = SO(i);
//        //a = SO(180-i);
#define V_0    500
#define V_180 2400
#define Width_0_180   (V_180-V_0)
#define Wavelength_1count (((1000000/50)*1024)/4096)
#define T_MIN ((V_0*1024)/Wavelength_1count)
#define T_MAX ((V_180*1024)/Wavelength_1count)
#define HH  ((T_MAX-T_MIN)*1024)/180
#define SO(AA) (T_MIN+(((AA)*(HH))>>10))

//PWMのポート、周期、分解度のビット数
#define PWM_PIN 1
#define FREQUENCY 50
#define RESOLUTION 12


//初期化
void setup() {

  //出力ピンの初期化
  pinMode(PWM_PIN, OUTPUT);

  // PWM設定（ピン番号, 周波数, 分解能）
  ledcAttach(PWM_PIN, FREQUENCY, RESOLUTION);
  
} //setup


//メインループ
void loop() {

  // DUTY比を指定して、ポートに対して実行 0°
  ledcWrite(PWM_PIN, SO(0));
  delay(2000); //2秒待つ

  // DUTY比を指定して、ポートに対して実行 180°
  ledcWrite(PWM_PIN, SO(180));
  delay(2000); //2秒待つ

} //loop


```
DB SELECT編予備

### 初学者向け兼個人向けのデータベース知識まとめです
+ MySQLの文法などの簡易的まとめ
+ 自分用のメモ
# SQLでの周知事項
+ SQLにおけるコマンド文は大文字・小文字の区別を行わない
+ 一文の終わりには；（セミコロン）を記述

# DESCRIBEコマンド
+ 表構造の確認
```sql:
DESC 表名;
DESCRIBE　表名;
```


# SELEC文
+ 基本文
```sql:
  SELECT <列リスト> FROM [表名];
```
+ 重複文を排除する
```sql:
  SELECT DISTINCT <列名> FROM [表名];
```
+ 行制限 WHERE句
```sql:
  SELECT <列名> FROM [表名] WHERE <列名 演算子 値>;
```
WHERE句における論理演算子を複数使用する際は
　NOT→AND→ORの順で評価される
　()を使用することで優先付が可能
+ 行ソート ORDER BY句
```sql:
  SELECT <列名> FROM [表名] WHERE 検索条件 ORDER BY 条件　ASC/DESC;
```
+グループ化での抽出・条件検索
```sql
  SELECT <列名> FROM [表名] (WHERE) GROUP BY グループ列;
  SELECT <列名> FROM [表名] GROUP BY グループ HAVING 条件式;

  /*クラス毎のテストの平均点数*/
  SELECT class_no, AVG(test) from grades GROUP BY class_no;
``` 
+ 副問い合わせ
WHERE・HAVING・FROM にて別に埋め込まれるSELECT文
```sql:
SELECT 列名 FROM 表名 WHERE 列名 比較演算子 (SELECT ~ FROM ~);
```

>+ 比較演算子で等しくないは「<>」「！＝」
>+ ＝ で繋ぐのは返り値が１つの時のみ
>+ 複数行副問い合わせで使用する演算子「ANY」「ALL」「IN」

# 結合によるSELECT
### 内部結合
2つ以上の表を共通の値に従って結合を行う。
列名が異なっていてもデータ型が同一であれば結合可能
```sql:
/*１つ目の記述法*/
SELECT 列名 FROM 表１ JOIN 表２ ON 表１.列名 = 表２.列名;
/*２つ目の記述法*/
SELECT 列名 FROM 表１, 表２ ON 表１.列名 = 表２.列名;
/*なお二つ目に関しては可読性が低下するため一部推奨ではない*/

/*表member1,classからclubとteacherを引き出す（別名使用例）*/
SELECT m.club, c.teacher  
 FROM member1 m JOIN class c ON m.name = c.name;

/*ON句以外の結合方法*/
① SELECT 列名 FROM 表１ NATURAL JOIN 表２;
② SELECT 列名 FROM 表１ JOIN 表２ USING(共通列名);
```
NATURAL JOIN句は結合する表の同じ列名を自動結合する
USING句は同じ列名のうち指定された列により結合を行う

### 外部結合
内部結合とは異なり結合条件に一致しない行の表示も可能となる。
>例）片方の列にはNULL値が含まれているが、他方の表の列にはNULL値が含まれていない

表記法：内部結合の「JOIN」に基準表に向けてLEFT・RIGHTを付ける

### クロス結合
対象表の全ての組み合わせが表示できる。
（表１の行数×表２の行数）分の結果件数を得ることができる
```sql:
 SELECT 列名　FROM 表１ CROSS JOIN 表２;
```

### 集合演算
2つ以上の問い合わせ結果から１つの結果を生成
+ UNION
複数の問い合わせ結果から重複するものを除いた結果を生成（Distinct利用時と同じ）
+ UNION ALL
複数の問い合わせ結果から重複するものも含めた結果を生成
```sql:
SELECT 列名A FROM 表１ UNION (ALL) SELECT 列名A FROM 表２ ;
```
【MySQL】基礎知識［データ定義編］

### 初学者向け兼個人向けのデータベース知②
+ MySQLの文法などの簡易的まとめ
+ 自分用のメモ(基本コマンドの備忘録）

## 表の作成
CREATE TABLEコマンドを使用し、デフォルト値を設定することが可能
```sql:
CREATE TABLE 表名 (列名 データ型 [DEFAULT 値]);
```
#### AUTO_INCREMENT
新しい行の挿入のたび自動的に一意の数値を割り当てる機能
各テーブルの１つの整数型の列に設定できる（一般的には主キー）
NOT　NULL制約と索引の作成が必要
```sql:
CREATE TABLE test1 (id INT AUTO_INCREMENT, ...);
```
>　AUTO_INCREMENTの最新値を知りたい場合は
　SELECT LAST_INSERT_ID() で確認可能

### 表のコピーを作成
```sql:
SELECT 表名 SELECT ~~ FROM ~~;
```
副問い合わせを用いてコピーした表を作成可能
元の表と列名を変更する場合表明の後ろの列リストや列別名で設定可能

## 表の変更
#### デフォルト値の変更
```sql:
ALTER TABLE 表名 ALTER 列名 SET DEFAULT '変更値';
```
#### 属性の変更
列の型やサイズを変更する際はMODIFY句を使用する
```sql:
ALTER TABLE 表名 MODIFY 列名 データ型;
```
#### 列の追加
```sql:
ALTER TABLE 表名 ADD 列名 データ型 (DEFAULT デフォルト値);
```
表内に既にデータがある状態で列を追加した場合既存データの新規列にはNULL値が入る
#### 列の削除
```sql:
ALTER TAABLE 表名 DROP 列名;
```
表切り捨てと差別化するために少なくとも１行は列を残しておく必要がある
#### 表名変更
```sql:
RENAME TABLE 旧表明 TO 新列名;
```
## 制約
#### NOTNULL制約
NULL値が入らないことを保証する
```sql:
CREATE TABLE test (id INT NOT NULL,..);
```
#### UNIQUE制約
値が一意になることを保証する。NULL値は一意とみなされる。
```sql:
CREATE TABLE test (id INT UNIQUE,...);
```
SpringBoot_@sizeのついたパラメータにnullを渡した場合

## 背景
必須ではないリクエストパラメータに対して、`@Size`を指定した場合、そのパラメータに`null`を渡したらエラーになるのか気になり調べた。



## 1. `@Size`の動作と`null`の扱い
`@Size`アノテーションは、対象となるフィールドの文字列の長さを制約しますが、`null`に対しては制約を適用しません。

つまり、`@Size(min=10, max=12)`が付与されたフィールドに`null`が渡された場合、エラーにはならず、バリデーションはスキップされます。

#### 例：
```java
import javax.validation.constraints.Size;

public class ExampleRequest {

    // 必須ではないが、値がある場合は最小10桁、最大12桁に制限
    @Size(min = 10, max = 12)
    private String param;

    // Getter and Setter
}
```

上記のコードでは、`param`フィールドが`null`の場合には、`@Size`のバリデーションは行われません。値が`null`であることはエラーにはならず、`null`は許容されます。

### 2. **`null`を許容しない場合の設定**
もし`null`を許容せずに、`null`値の場合にもエラーにしたい場合には、`@NotNull`アノテーションを併用します。

#### 例：`null`を許容しない
```java
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class ExampleRequest {

    @NotNull // nullは許容しない
    @Size(min = 10, max = 12) // 最小10桁、最大12桁
    private String param;

    // Getter and Setter
}
```

このようにすると、`param`フィールドが`null`の場合にはエラーが発生し、バリデーションに失敗します。

### 3. **結論**
- `@Size(min=10, max=12)`を使用している場合、リクエストパラメータが`null`であってもエラーにはなりません。`null`値は許容され、バリデーションはスキップされます。
- `null`をエラーとして扱いたい場合は、`@NotNull`を併用する必要があります。
オイラーの公式のアニメーション、摩擦つきの強制振動のアニメーション（複素数形式）、波動のアニメーション

vscodeでcopilotへの指示を繰り返して作りました。すこしずつ賢くなってきている。
https://colab.research.google.com/drive/1xpRfu1RkXvgDGXIC8dMJ2p5FyjWeL-r9?usp=sharing

## オイラーの公式のアニメーション
アニメーションとして理解する必要があります。まずはこれを確認しておく。

## 摩擦つきの強制振動のアニメーション（複素数形式）

物理や数学は数式を脳内でアニメーションする学問です。
ですが、今の時代、作って、見て確認するほうが早いのもある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482779/0d042954-0a71-984e-7f4d-55b6a119beef.png)

* 共鳴により振幅が大きくなる。共鳴点では９０度ずれる。このとき、外力最大の時刻で速度が最大になるのでエネルギー吸収速度が最大になる。

* それと同時に、位相の遅れ（これはどれだけの応答遅延が発生するかということと直接に対応する）にも注意する。遅延は０からπまで。インパルスが入力の場合、全ての振動数を一様に重ね合わせることになる。応答が立ち上がるには、ω0-γに対応する時間がかかってしまう（遅延応答）、ということになる。

* 出力(t)= A x 入力(t)という関係が成り立っている。Aは入力の振動数による。線形応答であり重ね合わせできる。インパルスは波を重ねることで作れるからそれに対する応答も重ね合わせて作ることができる。この方法だと複素積分の知識が必要。直接に実時間描像で計算することもできる。

## 波動のアニメーション
波動$e^{i (kz - \omega t)}$のアニメーションです。x,y面が実軸、虚軸です。真横から見るとただのサイン波です。真横にしてからアニメーションボタンをおして確認しましょう。真横にするとxy面内で回転させても同じに見える。実軸と虚軸は等価です。
$e^{i (kz - \omega t)}=e^{i kz} e^{-i \omega t}$です。時間を固定して、あるいは位置を固定して考えてみる。
Copilot Pages降臨！なにができる？

先日のMicrosoft 365 Copilot Wave 2で紹介されたCopilot Pagesが職場の環境にも降りてきたので、さっそく確認してみました。

# Copilot Pagesとは？
Copilot PagesとはMicrosoft 365 Copilotライセンス内で使えるBizChatで使える機能です。BizChat内でCopilotを利用して生成した結果をメモ用途でPagesに保存することができます。また、Copilot Pagesは実質Loopと同じような機能を持つので、プロンプトの結果を他者と共有したり編集することができます。

# Teams内から早速やってみた
### 始め方
適当なプロンプトをBizChatで打つと、末尾に「Pagesで編集」画面が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/f46c1dc6-201d-7f01-04b4-8249e64d76c8.png)

### 編集するには
「Pagesで編集」を押すと生成結果がそのまま張り付いたページが出現します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/df5bcd21-770c-f14d-379a-dcba9326accc.png)

### ソースも張り付く
もちろん、ソースであるファイルの情報や、会議情報等もそのまま張り付きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/9bb0560c-6bc5-d5a8-4ac2-8cfc94c007bd.png)

### 共有するには
共有する際は右上の共有マークからLoopと同じように共有することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/828ba5d1-4fca-efee-77b3-17b3b4ab8798.png)

### ブラウザで開くには
Copilot Pagesのページマークを開くと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/95533cf2-6b59-a262-1f53-b0c667566f34.png)

(https://www.microsoft365.com/pages) に遷移して確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/4e787cdf-98d3-0a09-503f-a14b654447c4.png)

### Copilotでさらに編集するには
ブラウザで開いている場合はLoopのCopilotを使ってさらに編集することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/67014a56-dce2-43f9-4db0-14b41b538f3b.png)

ちなみにLoopのワークスペースには出現しないため、365のページでのみ確認が可能なようです！

https://www.microsoft.com/en-us/microsoft-365/blog/2024/09/16/microsoft-365-copilot-wave-2-pages-python-in-excel-and-agents/?msockid=0ba57a4462376e721e256853634d6f53
初心者がWebアプリのテストフェーズを自動化してみた！（準備編）

# 自己紹介だの経緯だの
はじめまして！！記事を読んでくださりありがとうございます！
Webアプリの開発をやってる森んちゅというものです！

アプリの機能が充実してきた（嬉しい）....のはいいものの、
テストに割ける労力がない！じゃあ自動化すればいいじゃないかと一念発起した....のはいいものの
思ったより複雑そう!なのでQiitaにメモしながら頑張ろう!ついでに初心者が躓く点を共有しよう！ってな感じで始めました！
今回は準備編です！躓きポイントがあったら随時記事を書いていくつもりです！聞きたいことがあればできるだけ答えます！初心者なのでアドバイスもお願いします！
# テストの全体像
## 今はどうやって開発してるの？
今まではバージョンリリースごとにこんな感じで開発サイクルを回していました。テストをろくにしてないのにデカいバグが見つかってこなかったので、かなり有能だと思います。**特に、テストすべき事項を開発段階前にまとめておくことで、開発中は過去問を持った大学生のような万能感が生まれるのでお勧めです。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799015/cd753ea3-e2db-4175-9dec-3ac106713c48.png)
## どこを自動化したいの？
まずはスモークテストを自動化できたらいいなと思ってます。(不安になって結局開発サイクル中に何度もしちゃって時間食ってるから）
その次に、UIテスト→APIテスト→DBテスト→パフォーマンステスト　の順に回帰テストの自動化を行っていきたいです。

残ったサニティテストと機能テストの部分はやっぱ自分で確かめたいので、自動化はしない予定です。
## どのようなツールを使うの？
スモークテストとUIテストの自動化はpytestとseleniumで何とかなりそうです。あと、色んなブラウザでのテスト結果を見たいので、webdriver_managerも導入する予定です。
##テストコードのフォルダ構造はどうするの？
ページごとにフォルダを作り、
１ページ要素をまとめたコード
２実際テストをするコード（１から要素をimportする形）
３テストデータが書いてあるcsv
４csvデータを読むためのコード
みたいな感じの構造でやってます。（後から修正する確率大）
## UIの位置が正しいかどうかとかはどう見るの？
これなんすよね...Seleniumではどうしても限界があるんで...
多分テストごとにスクショを撮る仕様にして、撮ったスクショと正常なページ画面とをAIを使って見比べる感じになると思います。今んとこいいツールが見つかってないので最悪chatGPTにやってもらう感じになると思います（アドバイスくださいお願いしますお願いします）
# まとめ
いやー前途多難っすねー　記事書いてるだけでもう頭痛くなってきてますわ
多分1~2年単位でゆっくりやっていくと思うので、温かい目でみてください～
Flutterって何？初心者でも使いやすい理由を解説！

最近、Flutterを触ってみたんですが、これ、なかなか良い感じです。
そもそもFlutterって何かと言うと、Googleが開発したフレームワークで、**1つのコードでiOSもAndroid、さらにはWebやデスクトップアプリまで作れちゃう**という優れもの。
しかも、使ってるのはDartっていう比較的新しいプログラミング言語です。

これを使えば、プラットフォームごとにコードを書き直さなくてもOKなんです！
というわけで、僕が感じたFlutterの魅力をざっくりとまとめてみました。

# 1. クロスプラットフォーム対応で効率的！

何と言っても、Flutterの一番の強みは**1つのコードで複数のプラットフォームに対応できる**ことです。
これ、マジで便利。普通だったらiOS用、Android用、それぞれコードを書かなきゃいけないんですが、Flutterだと全部一気に開発できちゃうんですよね。

例えば、小さいアプリを作る時はもちろん、スタートアップとかでスピード重視の開発をしたい時なんかにめちゃくちゃ役立つ。個人的には、時間が限られているプロジェクトには最適だなと感じました。

# 2. 「Hot Reload」でサクサク開発！

もう一つ気に入ったのが「Hot Reload」機能。
これ、開発中にコードを変更してもアプリをリロードせずにその場で反映されるんです。デザインを微調整する時やバグ修正の時なんかに特にありがたい。

デザイナーと一緒に作業している時に「これ、もう少し左に寄せようか」とか言われても、すぐに反映できるから、開発のサイクルがすごく早くなる。短い時間で成果が見えるのはモチベーションが上がります！

# 3. 美しいUIが簡単に作れる！

Flutterでは、UIの基本が「**ウィジェット**」というコンポーネントで構成されています。
このウィジェットを組み合わせることで、**簡単に美しいデザイン**を作れるんです。iOSとAndroidで見た目が若干異なる部分も、Flutterだとウィジェットで統一されているので、一貫したデザインを保てるのもポイント。

しかも、**アニメーション**も割と簡単に実装できるから、ちょっと動きのあるアプリも作りやすい。ここはかなりの強みだと思います。デザインにこだわりたい人には嬉しいフレームワークですね。

# 4. パフォーマンスもいい感じ！

クロスプラットフォームのフレームワークって、どうしてもネイティブに比べてパフォーマンスが落ちるんじゃないかって思うんですよね。
でも、Flutterは違う。**ネイティブに近いパフォーマンス**が出せるんです。

これ、Flutterが独自の「**Skia**」っていうグラフィックエンジンを使っていて、高速な描画が可能だからなんですよね。
実際にアプリを動かしてみても、モッサリ感は感じませんでした。

# 5. 便利なプラグインが豊富！

もう一つ注目すべきなのが、**プラグイン**が豊富ってこと。
Flutterには、カメラやGPS、ネットワーク接続なんかのデバイス機能を使うためのプラグインがたくさん用意されています。
これがあると、開発者がゼロから全部作り込まなくても、サクッと必要な機能を実装できるんです。

例えば、簡単にカメラ機能を追加したい時とか、APIを使ってデータを取得する時なんかも、便利なプラグインがどんどん見つかります。

# ちょっと気になるところ

良いところばかりに見えるFlutterですが、気になる点も少しあります。

例えば、**ネイティブのAPIを使う部分では少し面倒な場合がある**こと。Flutter自体はすべてのネイティブ機能をカバーしているわけではないので、時々カスタムプラグインを作る必要があります。これは、特定の機能に依存するアプリを作る時にはちょっと手間になるかも。

あと、**アプリサイズが大きくなる**傾向もありますね。簡単なアプリでも、ネイティブに比べて初期サイズが大きくなることがあるので、そこは少し注意が必要です。

# まとめ

Flutterは、**開発スピード重視のプロジェクトや複数プラットフォーム対応が必要なアプリ**を作る際には、本当に便利なツールです。特に「Hot Reload」機能は一度使うと手放せなくなりますし、見た目にこだわったUIやアニメーションも簡単に作れるので、個人的にかなりお気に入りです。

クロスプラットフォームでの開発を考えているなら、一度Flutterを試してみるのもアリだと思います。今後さらに成長する可能性もあるので、触っておくと面白いかもしれませんね！
Power Apps でデータの一括登録を行う

## はじめに
BizOptimars の井上です。
今回は、Power Apps のデータの一括登録についてご紹介したいと思います。
1 件ずつであれば、SubmitForm 関数や Patch 関数を使えば良いのですが、複数を一括で登録したい場合もありますよね。こちらの記事では、ForAll 関数と Patch 関数を組み合わせて、一括登録する方法を紹介いたします。

## 用意したもの
SharePoint Lists を 1 つ用意しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/9a7d437e-9fba-d894-23c1-af20b2816f11.png)

| 列名 |データ型 |
|:-:|:-:|
| タイトル  | テキスト  |
|  個数 | 数値  |
| 登録日  | 日付  |

## コレクションの作成
次に、アプリのほうへ移ります。
今回は、コレクションに入っているデータを一括登録していきたいと思いますので、まずコレクションを作っていきます。

ボタンに以下のように Collect 関数を使った式を書いていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/a947d7f9-7324-4df8-02b1-4b9160259bd2.png)

```
Collect(
    colData,
    {
        タイトル: 備品名のテキストボックス.Text,
        個数: Value(個数のテキストボックス.Text),
        登録日: 登録日の日付入力.SelectedDate
    }
)
```

ここでのポイントは、**データソース側とデータ型を合わせること**です！
例えば、データソース側が数値型なら、コレクションに入れる段階で数値型にしておきましょう。

いくつかコレクションに追加して、ギャラリーに表示させておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/f1f6e56a-4493-133b-5501-64854332312d.png)


## 一括登録
では、作成したコレクションを一括登録していきます。
登録ボタンを用意して、以下のように式を書きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/9fbe070f-2744-7d4e-939f-8b5ff75819b4.png)

```
ForAll(
    colData,
    Patch(
        備品リスト,
        Defaults(備品リスト),
        {
            タイトル: ThisRecord.タイトル,
            個数: ThisRecord.個数,
            登録日: ThisRecord.登録日
        }
    )
)
```

これでボタンを押してみると、一括で登録ができました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/35cc9169-ff85-3cac-f937-71b72ca654c2.png)

これに少し手を加えて、ギャラリーで選択したものだけ登録するように変更してみます。
まず、ギャラリーにチェックボックスを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/1dcc7d06-b851-d6b5-9d7c-228dae1ad996.png)

次に、チェックボックスの OnCheck プロパティに以下の式を入れます。
チェックされたデータを入れるための colSelect という別のコレクションを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/6275f55e-e5a7-fd04-07bb-80e1b07ed016.png)
```
Collect(コレクション名,ThisItem)
```

OnUncheck プロパティには、チェックを外した際に、該当のデータをコレクションから削除する処理を行いたいので、以下の式を入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/bab327b7-7bff-66e5-b7fb-4b9f65afabf7.png)
```
Remove(コレクション名,LookUp(コレクション名,タイトル=ThisItem.タイトル))
```





ペンとハサミにチェックを入れて試してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/0b950331-ea78-4527-7580-c042370b41fe.png)

登録ボタンの式は、コレクションの名前を変えておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/67ddb2d9-bec0-44ec-4efc-4383041ce315.png)

これでボタンを押すと、チェックを入れたものだけデータを登録することができました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/31a2730b-b440-a71e-375b-94f60f84ce92.png)

## おわりに
私自身、Patch 関数に対して最初は苦手意識がありました...。
このような使い方もできて便利なので、ぜひチャレンジしてみてくださいね！
なぜかうまくいかないなというときは、Patch 関数で**まずは 1 行**から試していただくと良いと思います。
dockerでrailsアプリを動作させるのとgitとgithubの使い方

# dockerの中のrailsアプリを実行する
①コンテナを再起動させる
imageを変更したときは
```
docker-compose up --build
```
既存のコンテナを起動するときは
```
docker-compose up -d
```

②コンテナの中に入るために、
コマンドを書いて、別のターミナルを開いてアプリのファイルまで行ってから

```
docker-compose exec web bash
```
コマンドを打つ
③サイトにアクセスする
```
localhost:3000
```

# gitとgithubの使い方
コードをgithubにアップするためには、
①現在の変更したファイルをステージ(追加)する。
```
git add .
```
②ステージされた変更をコミット(確定)させる。
これにより、ステージされた変更がローカルリポジトリに保存されます
```
git commit
```
③ローカルリポジトリの変更をリモートリポジトリに反映させる
```
git push
```
# PostgreSQLに入るには
```
docker ps
```
を出力して今動いているコンテナのIDを取得する
そしてPostgreSQLのIDをメモして
```
docker exec -it <コンテナID> psql -U postgres
```
とすることでPostgreSQLに入ることができる
EC2にSSH接続してCodeCommitを操作する

## 必要パッケージ

```bash
sudo dnf install aws-cli git -y
```

## Git Credential

```bash
git config --global credential.helper '!aws codecommit credential-helper $@'
git config --global credential.UseHttpPath true
```

## EC2のインスタンスプロファイルに紐づくIAMロール

- 実行したい操作に合わせて以下のいずれかのManagedPolicyを追加
  - `arn:aws:iam::aws:policy/AWSCodeCommitReadOnly`
  - `arn:aws:iam::aws:policy/AWSCodeCommitFullAccess`

## 確認

```bash
git clone https://git-codecommit.xxxx/foobar
```
Raspberry Pi 4をリモートデスクトップするまで 2024

諸事情あってRaspberry Piでリモートデスクトップすることになりました。

最初は`raspi-config`でVNC接続する予定でしたがVNC接続するとメニューバーが表示されない問題に当たりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230043/edf8a431-91da-e061-de05-54a3a26e06d9.png)

メニューバーが使えないと色々不便です。

waylandで接続するとそういうバグを引くこともあるかと思いXを使うことにしました。

がVNC事情に問題があり
tigerVNC、RealVNCその他諸々のツールにロックインされてしまうのとOSS実装がなかったり少なかったりでそもそもVNC自体が凋落している様子でした。

[Raspberry Pi Connect](https://www.raspberrypi.com/software/connect/)が生まれたのも既存のVNC事情に満足できなかった？からかもしれません。

ただRaspberry Pi Connectはローカルで完結せずRaspberry Pi ConnectのIDが必要なのが嫌でやめました。

そこでwaylandもVNCもRaspberry Pi Connectもやめて、xrdpにすると少し癖が[（後述）](#問題)
ありますが、簡単にリモートデスクトップできたので共有します。


## やり方

xrdpをインストールし、リモートデスクトップでログインするユーザーをを作成します。
そしてその作成したユーザーでログインします。

```bash
sudo apt-get install -y xrdp

USERNAME={好きなユーザー名}
PASSWORD={好きなパスワード}
sudo useradd $USERNAME
echo "$USERNAME:$PASSWORD" | sudo chpasswd
sudo mkdir /home/$USERNAME
sudo chown $USERNAME:$PASSWORD /home/$USERNAME
sudo reboot
```

## 問題

デフォルトのユーザー（大抵はpi）でログインしようとするとxrdpのクライアントで真っ青になる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230043/ad666ea9-6380-8b4b-8cf7-0da04fe2fbce.png)

### なんでか

ここに書いてある通りで原因はよくわからない

https://www.thun-techblog.com/index.php/blog/raspberry-pi-os-2022-04-04-xrdp-error/
https://www.reddit.com/r/raspberry_pi/comments/qw1cdw/raspberry_pi_4_xrdp_windows_10_remote_desktop/


## まとめ

できるだけ安定した環境を使いたい => Raspberry Pi Connect
waylandを使いたい => `raspi-config`でリモートデスクトップ有効化
バグを引きたくない => xrdpを使う

このようになると思います。

いずれにせよラズパイのリモートデスクトップ事情は厳しいですね

## おまけ raspi-config

```bash
sudo raspi-config nonint do_rpi_connect 0
sudo raspi-config nonint do_boot_behaviour B1
sudo raspi-config nonint do_vnc 1
sudo raspi-config nonint do_wayland W1
```
suffix（サフィックス）の活用で、SVGアニメーションにレスポンシブに対応する

SVGアニメーションは、ウェブサイトに動きと魅力を加える素晴らしい方法です。しかし、異なる画面サイズに対応するレスポンシブデザインでは、SVGアニメーションの実装が難しくなることがあります。今回は、「suffix（サフィックス）」を使って、レスポンシブなSVGアニメーションを簡単に実現する方法を紹介します。

## suffixとは？

suffixとは、単語や文字列の末尾に付け加える部分のことです。今回のコンテキストでは、モバイル用のSVG要素のIDに付ける「_sp」という文字列がsuffixになります。

## レスポンシブSVGアニメーションの基本戦略

1. デスクトップ用とモバイル用に異なるSVGを用意する
2. 画面サイズに応じて適切なSVGを表示する
3. JavaScriptでアニメーションを制御する際、suffixを使って適切な要素を選択する

## コードの実装

まず、HTMLの構造を見てみましょう：

```html
<figure id="frnt4efA-pcov1" class="pagecov-wrapper framePA is-animating">
  <figcaption class="pagecov-caption" style="background:#1a1311;">
    <object style="width:100%;" id="object-svg4EFA"
      data-svg_sp='<svg viewBox="0 0 750 1231">...(モバイル用SVG)...</svg>'
      data-svg='<svg viewBox="0 0 1440 1466">...(デスクトップ用SVG)...</svg>'>
    </object>
  </figcaption>
</figure>
```

次に、JavaScriptの実装を見ていきます：

```javascript
(function() {
  //SVGコンテンツを動的に設定する関数
  function setSVGContent() {
    const object = document.getElementById('object-svg4EFA');
    const isMobile = window.matchMedia('(max-width: 743.9px)').matches;
    object.innerHTML = isMobile ? object.getAttribute('data-svg_sp') : object.getAttribute('data-svg');
  }

  //画面サイズ変更時にSVGコンテンツを更新
  window.addEventListener('resize', setSVGContent);

  //初期設定
  setSVGContent();

  //アニメーション関数
  function runAnimation(isFull) {
    const suffix = window.matchMedia('(max-width: 743.9px)').matches ? '_sp' : '';
    let tl = anime.timeline({
      direction: 'normal',
      loop: false,
    });

    if (isFull) {
      //フルアニメーション（初回のみ）
      tl.add({
          targets: `#frnt4efA-pcov_ttl1${suffix} [data-fill]`,
          stroke: '#fff'
        })
        //... 他のアニメーションステップ ...
    }

    //ショートアニメーション（共通）
    tl.add({
        targets: `#frnt4efA-pcov_ttl1${suffix} [data-fill], #frnt4efA-pcov_sub2${suffix} [data-fill]`,
        fill: function(el) {
          return el.getAttribute('data-fill');
        },
        easing: 'easeInOutSine',
        duration: 500
      })
      //... 他のアニメーションステップ ...
  }

  //アニメーション実行の制御
  const animationSeen = sessionStorage.getItem('svgAnimationSeen');
  if (!animationSeen) {
    runAnimation(true);
    sessionStorage.setItem('svgAnimationSeen', 'true');
  } else {
    runAnimation(false);
  }
})();
```

## コードの解説

### テンプレートリテラル

テンプレートリテラルは、バッククォート (`) で囲まれた文字列です。`${}` を使用して変数や式を埋め込むことができます。

例：
```javascript
const suffix = '_sp';
const selector = `#frnt4efA-pcov_ttl1${suffix}`;
//selector は "#frnt4efA-pcov_ttl1_sp" になります
```

### 三項演算子（if-elseのショートハンド）

`条件 ? 真の場合の値 : 偽の場合の値` の形式で書かれる短縮形のif-else文です。

例：
```javascript
const isMobile = window.matchMedia('(max-width: 743.9px)').matches;
const suffix = isMobile ? '_sp' : '';
//モバイルの場合 suffix は '_sp'、そうでない場合は '' になります
```

### suffixの活用

suffixを使用することで、1つのJavaScriptコードで両方のSVG（デスクトップ用とモバイル用）を制御できます：

```javascript
targets: `#frnt4efA-pcov_ttl1${suffix} [data-fill]`
```

この行は、デスクトップでは `#frnt4efA-pcov_ttl1 [data-fill]` を、モバイルでは `#frnt4efA-pcov_ttl1_sp [data-fill]` を選択します。

## まとめ

suffixを活用することで、1つのJavaScriptコードでデスクトップとモバイル両方のSVGアニメーションを制御できます。これにより、コードの重複を避け、保守性の高いレスポンシブなSVGアニメーションを実現できます。
PHP-クラス-クラスメソッド 

# はじめに
PHP・WEB開発を独学中のアラフィフ主婦の忘備録です。

## メソッドの種類
PHPでは クラスメソッド と インスタンスメソッド という2種類のメソッドがあります。
1. インスタンスメソッドは、インスタンス生成後にアクセスが可能なメソッドです。**インスタンス毎に引数を代入する為、それぞれのメソッドで値が異なります。**
1. クラスメソッドはインスタンスを生成せずにアクセスが可能なメソッドです。**クラス自体に紐づく為、インスタンスに関わらず共通の処理を行います。**

クラスメソッドを実行するには、クラスの中からと外からで書き方が違います。

### クラスメソッドをクラス外から実行する
```PHP
class Customer
{
    // クラスメソッドの定義
    public static function sayHello() { // アクセス修飾子に続けて static を記述
        echo "Hello\n";
    }
}
// クラス外からの実行
Customer::sayHello(); // クラス名::(スコープ演算子)クラスメソッド名();
```

#### 出力結果
```
Hello
```
インスタンス生成なしでクラスの中の`sayHello()`メソッド(関数)を実行できる。

### クラスメソッドをクラス内から実行する
```PHP
class Customer
{
    public function __construct() { // __construct(コンストラクタ)を使えばインスタンス生成と同時に実行される
        // クラス内からの実行
        self::sayHello(); // self::（スコープ演算子）クラスメソッド([実引数]);
    }

    // クラスメソッドの定義
    public static function sayHello() { // アクセス修飾子に続けて static を記述
        echo "Hello\n";
    }
}

$customer = new Customer(); // インスタンス生成
```

#### 出力結果
```
Hello
```
クラス内で`__construct`(コンストラクタ)を使っているので、インスタンス生成だけで出力されるが、クラス外から実行するよりもコードが長くなる。

## 注意点
【アクセス可】インスタンスメソッド　⇒ ○　クラス変数 / メソッド
【アクセス不可】クラスメソッド　⇒ ×　インスタンス変数 / メソッド

```PHP
class User
{
    // インスタンス変数を定義
    public $name = "きらり";

    // クラスメソッドの定義
    public static function showName()
    {
        // クラスメソッドからインスタンス変数・インスタンスメソッドへのアクセスは不可
        echo $this->name; // "きらり"にはアクセスできない
        // Fatal error: 出力結果はエラー
        // Uncaught Error: Using $this when not in object context
    }

    // インスタンスメソッドの定義
    public function callShowName()
    {
        // インスタンスメソッドからクラスメソッドへのアクセスは可能
        self::showName(); // $this->name　を出力できる
    }
}

// クラスメソッドをクラス外から実行
User::showName(); // クラス名とクラス変数の間に ::(スコープ演算子)を用いてアクセス

// インスタンス生成しての実行
$user = new User(); 
$user->callShowName();
```

#### 出力結果
```
PHP Fatal error:  Uncaught Error: Using $this when not in object context in /workspace/Main.php:11
Stack trace:
#0 /workspace/Main.php(25): User::showName()
#1 {main}
  thrown in /workspace/Main.php on line 11
```

クラスメソッドからインスタンス変数・インスタンスメソッドへのアクセスできないので、いずれにしてもエラーになる。

### 修正します
インスタンス変数を `static` を用いてクラス変数として定義することでアクセスできるようになります。

```PHP
class User
{
    public static $name = "きらり"; // static を用いてクラス変数として定義する

    public static function showName()
    { 
        echo self::$name . "\n"; // self:: を付けてクラス変数へアクセスできる
    }

    public function callShowName()
    {
        self::showName(); 
    }
}

User::showName(); 

$user = new User(); 
$user->callShowName(); 
```

#### 出力結果
```
きらり
きらり
```

## クラスメソッド ”まとめ”
* アクセス修飾子に続けて `static` を記述して定義する
* クラス内から実行するには `self::クラスメソッド名()`
* クラス外から実行するには `クラス名::クラスメソッド名()`（インスタンスを生成せずにアクセスが可能）
* 【アクセス不可】クラスメソッド　⇒ ×　インスタンス変数 / メソッド

## 最後に
クラスはとにかくややこしくて、学習中のサイトの解説だけでは分からない部分が多かった。自分なりにかみ砕いて1つ1つ理解していくことが必要でした。
【ChatGPT Canvas】画像から、OCRして、Canvasに読み込みます（紆余曲折）


　どうも、カーブミラーです。

　今回は、画像から、OCRして、Canvasに読み込みます。紆余曲折しました。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::
　ニュースはありませんので、
　　さっそく本題に入ります。

　今回は、
　　画像から、OCRして
　　　Canvasに読み込みます。

　以前にも
　　OCRは取り上げました。
　　　今回は、Canvasを交えて
　　　　行なったところ、
　　　　　いくつか不具合が
　　　　　　発生しましたので、
　　　　　　　別物とします。

　画像内に書き込まれた文字は
　　通常、コピーできません。

　そんな画像を
　　ダウンロードしたり
　　　スクショすることは
　　　　できます。
　　　　　たまにできないときも😅

　それで得られた画像を
　　ChatGPTでOCRすれば、
　　　ChatGPTでの活用が
　　　　比較的、楽に行なえます。

　まぁ、
　　完璧ではありません。
　　　画質が荒いとか、
　　　　一部が欠けているとか。
　　　　　それで間違って
　　　　　　出力されたりもします。
　　　　　　　今のところは
　　　　　　　　ありませんけど。
***
　さて、
　　手順といきますか。
　　　紆余曲折ありましたが、
　　　　これは私的満足したものです。

　❶GPT-4o with Canvasで
　　　あることを確認。
　❷画像をアップロード
　❸下記のPromptを入力
```Text:画像OCR→CanvasへPrompt
画像から文字（英語に留まらない）をすべてを読み込んで、そのまま変更せずに、Canvasに入れてください。
```
　❹送信

　これでOCRされて
　　Canvasに挿入されます。

　Promptについて
　　ちょっと説明しますね。

　ふつうにOCRすると
　　“すべて”ではなく、
　　　メインどころの部分だけに
　　　　なります。

　また、
　　英語を読み込んで
　　　Canvasに渡すと、
　　　　和訳して表示してくれます。

　このPromptは、
　　上記二点を回避するものに
　　　なっています。

　和訳してくれるのは、
　　シチュエーションによっては
　　　ありがたいものですが、
　　　　“そんなの、自分でやらせて”と
　　　　　思う人間なもんでしてね😸
***
　ちなみに
　　ここからは紆余曲折した
　　　Promptとその結果を示します。

　（）内は結果です。

読み込んで、Canvasに入れてください。
（和訳されてしまう）
　↓
読み込んで、そのまま変更せずに、Canvasに入れてください。
（画像には日本語もあるのに入れてない）
　↓
画像から文字（英語に留まらない）を読み込んで、そのまま変更せずに、Canvasに入れてください。
（日本語ない）
　↓
画像から文字（英語に留まらない）をすべてを読み込んで、そのまま変更せずに、Canvasに入れてください。
（完成）

　なお、これらはすべて
　　その都度、セッションを
　　　開いておこなっています。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
dockerで動かすwordpressのテーマ更新方法(手動)

## 前提
FTPパスワードがわからない
データはすべてdockerVolumeの中にある。
古いテーマを削除して新しいテーマをダウンロードするという流れ

### テーマの最新版をダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/2633bf0e-1ed6-06ba-ee4e-76130bf770f5.png)
ダウンロード押す。

### 古いテーマの削除
コンテナ内へ接続 コンテナ内のテーマを削除します。
```
docker ps
```
wordpressのコンテナIDを把握します。
```
docker exec -it <wordpress_container_name_or_id> rm -rf /var/www/html/wp-content/themes/blogdata
```
<wordpress_container_name_or_id> にはコンテナIDを入れます。
blogdata　は更新したいテーマ名にしてください。

### 新しいテーマの適用
コンテナから出ます。
```
exit
```
新しいテーマをコンテナの中に置きます。
```
docker cp D:\Docker_app\docker_wordpress\blogdata af322f9400f3:/var/www/html/wp-content/themes/
```
これが出れば成功です。
```
Successfully copied 3.03MB to af322f9400f3:/var/www/html/wp-content/themes/
```
Webのレンダリング手法について（CSR->SSR->SSG->ISR）

# レンダリング手法
Reactを学んでいく中で、Next.jsというさらに便利にReactを用いることができるフレームワークについて知り、そしてNext.jsには素晴らしいレンダリングの手法が採用されているということを知り、一度レンダリングの種類と中身について軽く整理したいと思いました。

# 時系列
恐らくCSR->SSR->SSG->ISRの流れのようです！

# CSR(クライアントサイドレンダリング)
CSRはもっとも無難？なレンダリングの手法

1. ユーザーがブラウザーにてURLを入力する（リクエスト）
1. HTML、CSS、JavaScriptなどを返却する（HTMLは基本的な構造のみ 例：`<div id="app"></div>`など）
1. ブラウザ側でJavaScriptを実行してHTMLを生成する
:::note info
メリット：ページ遷移が速い。サーバーの負荷が軽い。
:::
:::note alert
デメリット：初回表示が遅い（ホワイトスクリーンが見られることがしばしばある）。SEO対策が難しい。
:::

### 主な言語
- React
- Vue
- Angular
### 適したサイト
- 管理画面
- SNS
### 理由
- 多くの処理がクライアント側で行われるため,サーバーの負荷が軽いほうが良い
- リアルタイムで更新されるので、迅速なレンダリングが求められるため

# SSR(サーバーサイドレンダリング)

1. ユーザーがブラウザーにてURLを入力する（リクエスト）
1. サーバー側でHTMLを生成する。
1. 生成したHTMLをレスポンスとして返却する。必要に応じて、CSSやJavaScriptファイルも返却する。
1. ユーザー側が受け取ったHTMLを解析し、DOM（Document ObjectMode）を生成し、CSSを適用したり、JavaScriptを実行したりする。
:::note info
メリット：初回ロードが速く、SEOに有利。
:::
:::note alert
デメリット：ページ遷移の度にサーバーへの通信が発生する。
:::

### 主な言語
- Next.js(React + Node.js)
- Nuxt.js(Vue + Node.js)
### 適したサイト
- ブログ
- ニュース
### 理由
- 多くの処理がクライアント側で行われるため,サーバーの負荷が軽いほうが良い
- リアルタイムで更新されるので、迅速なレンダリングが求められるため

# SSG(スタティックサイトジェネレーター)

1. ユーザーがブラウザーにてURLを入力する（リクエスト）
1. サーバー側で生成したHTMLを返却する。（この際、サーバー側では既にデータが埋め込まれた状態の静的なHTMLファイルが生成されている。fetchなども実行された状態になる。またCSSもビルド時に同時にビルドされた状態が返却される）
:::note info
メリット：ページ表示速度が速く、SEOに効果的
:::
:::note alert
デメリット：コンテンツが更新されたら再ビルドする必要がある。
:::

### 主な言語
- Next.js(React + Node.js)
- Gatsby(React + Node.js)
- Astro（Node.js + (React | Vue | TypeScript...)
### 適したサイト
- ブログ（更新頻度が高くない）
- ポートフォリオサイト・企業サイト
### 理由
- 更新頻度が高くないサイトに適している。サーバー側であらかじめビルドされたHTMLが生成されているので、ページ表示速度も速くSEOに効果的であるため。

# ISR(インクリメンタルスタティックリジェネレーター)

1. ユーザーがブラウザーにてURLを入力する（リクエスト）
1. サーバー側で生成したHTMLを返却する。（この際、サーバー側では既にデータが埋め込まれた状態の静的なHTMLファイルが生成されている。fetchなども実行された状態になる。またCSSもビルド時に同時にビルドされた状態が返却される）
1. 指定した時間間隔でページが再生成される。また、差分を検出して更新される。
:::note info
メリット：ページ表示速度が速い。ページが再生成されるので更新頻度が高いサイトにも使用できる。
:::
:::note alert
デメリット：リアルタイムな更新を必要とするサイトには対応しづらい。
:::

### 主な言語
- Next.js(React + Node.js)

### 適したサイト
- ブログ（更新頻度が高い）
- ポートフォリオサイト・企業サイト
### 理由
- 更新頻度が高いサイトにも適している。サーバー側であらかじめビルドされたHTMLが生成されているので、ページ表示速度も速くSEOに効果的であるため。

# まとめ
ちょっとありきたりというか、質の低い記事になってしまった気がするのですが、自分の中ではなんとなく整理できた気がします！
認証と認可

# 認証と認可の違い
はじめに、情報処理安全確保支援士の資格の学習を行なっているときに「認証」と「認可」の違いについて気になったので調べました。

認証：利用者が本人であることを確認すること
認可：認証した利用者に権限を与えること
Gradleプロジェクトのエラー: JRE System Libraryやビルドパスの問題をまとめてみた

## 前置き

![スクリーンショット 2024-10-11 10.58.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796362/7e4ecc2f-bd03-9b5b-2759-7064d0dc18c0.png)


```
Project configurator 'org.eclipse.buildship.configurators.base' failed to configure project
Unbound classpath container: 'JRE System Library [JavaSE-21]' in project
The project cannot be built until build path errors are resolved
```

このようなエラーが起きていた。

## 原因1: JREのバージョンが一致していない
このエラーのよくある原因は、プロジェクトで指定しているJavaバージョン（JRE）と、実際に使用されているJREのバージョンが一致していないことです。

例えば、build.gradleファイル内でJava 21を指定しているのに、EclipseやシステムがJava 17しか認識していないと、このような「Unbound classpath container」エラーが発生します。

### どうしてこうなるのか？
Gradleのツールチェーン設定でJava 21を指定していても、Eclipseやローカル環境がJava 21を正しく認識していないと、プロジェクトがビルドできません。
EclipseのBuild Pathで指定されたJREがインストールされていない場合、EclipseはJavaプログラムをどのJREで実行するのかがわからなくなります。

### 解決方法：
#### EclipseでのJRE設定を確認：
- Window > Preferences > Java > Installed JREs を開き、使用するJRE（この場合はJava 21）が正しくインストールされているか確認。
- JREがリストに表示されていない場合は、Add をクリックし、Java 21を追加します。

#### プロジェクトのビルドパスを修正：
- プロジェクトを右クリックし、Build Path > Configure Build Path で JRE System Library を削除し、インストールされたJRE（Java 21など）を追加します。
- Gradleツールチェーンを確認： build.gradle にJava 21が指定されている場合、以下のような設定が含まれているか確認します。

```
// build.gradle
java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}
```
この設定で、GradleがJava 21を使うように強制します。EclipseとGradleのJavaバージョンを一致させることが重要です。

## 原因2: EclipseのGradle設定が正しくない
EclipseはBuildshipというGradleのプラグインを使ってプロジェクトを構成しますが、この設定が正しくない場合にも「Project configurator failed」エラーが発生します。

### どうしてこうなるのか？
Gradleプロジェクトの構成時に、指定されたJava環境が見つからない、または依存関係が解決されないと、Eclipseはプロジェクトを構築できません。
特に、Gradle wrapperが古いバージョンを使っている場合、Javaのバージョンや依存関係が正しく解決されないことがあります。

### 解決方法：
Gradleのバージョンを確認： gradle-wrapper.propertiesファイル内で、適切なGradleバージョンが指定されているか確認します。最新バージョンを使うことをお勧めします。

```
// gradle.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
```

### プロジェクトをリフレッシュ：
- Gradle > Refresh Gradle Project を実行して、依存関係と設定を最新の状態に同期します。

### Eclipseのキャッシュクリア：
- Project > Clean でプロジェクトをクリーンし、Eclipseのキャッシュをクリアして再ビルドを行います。

## 原因3: JREやJDKがそもそもインストールされていない
Javaの実行環境（JRE）や開発環境（JDK）が正しくインストールされていない場合も、このようなエラーが発生します。特に新しいJavaバージョンを使う場合、システムやIDEにそのバージョンがインストールされていないことがあります。

### 解決方法：
- Javaのインストール状況を確認： ターミナルやコマンドプロンプトで以下のコマンドを実行し、インストールされているJavaバージョンを確認します。
```
// bash
java -version
```

もし、目的のバージョン（例：Java 21）がインストールされていなければ、Oracle JDKやAdoptOpenJDKからダウンロードしてインストールします。