OmniAICreator/Qiita-1.07M huggingface dataset:
【SQL】HAVING句を使ったデータ取得 〜WHEREとの違い〜

SQLの基礎について復習しています。

今回はgroup byやorder byを使った、条件を指定したテーブルの並べ替えてのデータ取得に加え、HAVING句を使った条件指定について学んでいきます。


# 課題内容
- 発売年毎の楽曲数を取得しなさい。
- 楽曲数は2つ以上のデータのみを抽出しなさい。
- 楽曲数は降順に並び替えなさい。
- 出力する項目はrelease_year(発売年)とsongs_num(楽曲数)とする。


```
# songsテーブル
+------+------------+--------------+---------------+
| id   | name       | release_year | total_minutes |
+------+------------+--------------+---------------+
|  1   | songs1     | 2000         | 3:56          |
|  2   | songs2     | 2007         | 4:07          |
|  3   | songs3     | 1988         | 5:22          |
|  4   | songs4     | 1997         | 4:55          |
|  5   | songs5     | 2016         | 4:13          |
|  6   | songs6     | 1988         | 4:48          |
|  7   | songs7     | 2000         | 4:01          |
|  8   | songs8     | 1992         | 4:20          |
|  9   | songs9     | 1991         | 4:29          |
| 10   | songs10    | 2000         | 4:35          |
+------+------------+--------------+---------------+

```

# 自分の回答（間違い）
```sql
SELECT release_year, COUNT(*) AS songs_num
FROM songs
GROUP BY release_year
ORDER BY songs_num DESC
HAVING songs_num >= 2
```

## 出力結果（エラー）
```sql
ERROR:  syntax error at or near "HAVING"
LINE 1: ...oks GROUP BY release_year ORDER BY songs_num DESC HAVING boo...
```

# 解答のコード
```sql
SELECT release_year, COUNT(*) AS songs_num
FROM songs
GROUP BY release_year
HAVING COUNT(*) >= 2
ORDER BY songs_num DESC;
```

## 出力結果（正解）
```sql
+------+------------+--------------+
| release_year      | songs_num    |
+------+------------+--------------+
| 2000              | 3            |
| 1988              | 2            |
+------+------------+--------------+
```

# コードの解説

- このコードは「各年で2曲以上発売された楽曲の数を、多い順に表示する」という処理を行うSQL文である。
- `SELECT release_year, COUNT(*) AS songs_num` この部分は、`release_year`（発売年）とその年に発売された楽曲の数（`COUNT(*)`）を選択するという意味である。
- `AS songs_num`は、発売された楽曲の数を`songs_num`という名前で保存するという意味である。
- `FROM songs`は、`songsというテーブル`からデータを取得するという意味である。
- `GROUP BY release_year` この部分は、データを`release_year`（発売年）ごとにグループ化するという意味である。
- `HAVING COUNT(*) >= 2` この部分は、各`release_year`の楽曲数が2以上のものだけを選択するという意味である。
- `ORDER BY songs_num DESC` この部分は、`songs_num`（楽曲の数）の降順（多い順）で結果を並べるという意味である。



# HAVINGとWHEREの違いを理解する
- `WHERE`との違いは、SQLが実行されるタイミングに違いがある。
- 例えば、この課題の解答例の場合、`HAVING COUNT(*) >= 2`と`ORDER BY songs_num DESC`のコードを逆にするとエラーとなってデータは取得できない。
- これは、`GROUP BY`が先に実行される仕組みになっているためである。
- SELECT文を使用したSQL文の場合、命令が実行される順番は、、、`①FROM`→`②WHERE`→`③GROUP BY`→`④HAVING`→`⑤SELECT`→`⑥ORDER BY`となっている。
- 今回の場合、`GROUP BY`句を使ってグループ化しているため、HAVINGを使う場合は、`GROUP BY`句の次に持ってこないとダメ、ということになる。
- `GROUP BY`句を使った場合、`WHERE`は、グループ化する前の元データに対しての条件指定することになる。
- `GROUP BY`句を使った場合、`HAVING`はグループ化した後の加工後データに対しての条件指定をすることになる。


# 参考サイト

https://www.sejuku.net/blog/73003
【プラクティス紹介】1分でさらっと分かる「スクラムガイド読書会」

## プラクティス名（別名）
スクラムガイド読書会　（輪読会、Active Book Dialogue®、ABD、未来型読書法）

## プラクティスの目的・狙い
* スクラムガイドを集中的に読み込み、対話によって理解を深める

## どんな時に使うか
* メンバーにスクラム初心者が多い時
* メンバーがスクラムガイドをきちんと読み込んでくれない時

## 実施手順
チームメンバーの中にスクラム初心者がいる場合に「Active Book Dialogue®」という読書法を使ってスクラムガイドを読み下す、というプラクティスです。ABDの公式サイトは参考情報欄を参照下さい。

1. チェックイン　　　：メンバーを集め、アイスブレイクする（＝場をほぐす）
1. オリエンテーション：ABDの紹介と本日の流れを主催者が説明する
1. コ・サマライズ　　：ガイドを担当パートにわりふり、各自で読んで要約文を作成する
1. リレー・プレゼン　：リレー形式で各自が要約文をプレゼンする
1. ダイアログ（対話）：問いを立て、感想や疑問について話し合い、**理解を深める**
1. チェックアウト　　：全体を通して感想を参加者同士で共有し、会を終了する

※所要時間の目安は5人で行った場合で2時間程度

## アレンジ例
* 担当パートを入れ替えて、もう一周する
* 別の参考書籍を対象に定期的にチーム内で読書会を開催する

## アンチパターン
* 「5.ダイアログ」の段階で対話ではなく議論をしてしまう。意見を１つにまとめようとする。

## 参考情報
ABDの公式サイト

https://www.abd-abd.com/

スクラムガイドの公式サイト（2020年日本語版）

https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf

## こぼれ話（私的コメント）
CSM研修に行くとスクラムガイドは穴があくほど読み込むことになるのであまり違和感はないのですが、そうでない方にとってはスクラムガイドって読みにくいようで、積極的に読んでもらえないことがあります。というような悩みをアジャイルコーチの方に相談したら、解決策として教えていただきました。実際にチームでやってみたら思った以上に効果的でメンバーからも好評でした。黙々と一人でスクラムガイドを読んでいるよりは確実に楽しいですし、成果物として皆で作った要約文が残るのもポイントです。（それを見ればいつでも思い出せる）

　[アジャイルプラクティス一覧へ戻る](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)
Laravel データ作成

## はじめに
各ユーザが属しているプロジェクト、そのプロジェクトのタスク、タスクの予定と実績を記録し表示する。
出だしはそういったのを作る。
バックエンドはLaravel10、フロントはVue3を使用する。
環境は下記で対応済。

https://qiita.com/kenji123/items/15c7fe0910c706d495cc

メインはLaravelのSeeder等を使用したデータ作成方法である。
データをjson表示まででテストデータ作成方法を主に記載するが、長くなるので以下３つに分ける。

・[テーブル作成](https://qiita.com/kenji123/items/146b6895b05e25fe60be)
・[データ作成](https://qiita.com/kenji123/items/a718c4752ab8ef5a52bb)
・[データ表示(json)](https://qiita.com/kenji123/items/1100a7f8999116c19d12)

## 目的
上記をまとめることにより以下を期待する。
LaravelのSeeder、Factoryを今後使えるようになることがまず第一。
Eloquentを使用し、効率的なデータ作成を行えるようになること。
api.phpを使用したデータ表示を抑えること。
rex0220 一括更新プラグイン 項目の自動計算

[一括更新プラグイン](https://qiita.com/rex0220/items/f90ca06fde6b6e362583)の項目の自動計算について、プラグイン設定と動作を解説します。
自動計算によって、入力の手間の削減と入力ミスを防止します。

# 概要

kintoneアプリストアの問い合わせ管理アプリを利用します。
対応開始日を追加して、対応開始の一括更新時に対応開始日を自動設定します。

![2023-08-13_14h58_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/45aab1fc-8ffa-fa7a-03cb-ab41ab5cb2ec.png)

更新結果：
![2023-08-13_15h02_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/59413cf2-3033-4fa3-71ed-5ffa8d2b23bc.png)

操作例
![2023-08-13_15h01_31.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/7a385101-5cbd-ff43-5c5b-387612ce375a.gif)

# プラグイン設定
ボタン名を「対応開始」で、対象項目を登録します。
![2023-08-13_15h08_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/6144737f-208e-e646-9dae-2cd1e5a81b18.png)

入力のチェックを行わず、計算式を指定すると自動計算になります。

- 項目別設定：　対応状況と開始日を設定
    - 対応状況
        - "対応中"
    - 開始日
        - TODAY() ：　当日を設定
![2023-08-13_15h09_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/0549f453-0ce1-bf43-3eb2-3950574657b7.png)

```.js
// 更新条件
IN(Status,"","未対応")

// 対応担当者
LOGIN_CODE()

// 対応状況
"対応中"

// 開始日
TODAY()
```
Next.js v13でChakraUIが動作しない場合の対処法


NextjsでChakraUIを導入しようとした際に下記のようなエラーが発生して動作しない場合の対処法を記載します。

# 症状
```js
import { motion, useIsPresent } from "framer-motion";
SyntaxError: Named export 'motion' not found. The requested module 'framer-motion' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:

import pkg from 'framer-motion';
const { motion, useIsPresent } = pkg;

    at ModuleJob._instantiate (node:internal/modules/esm/module_job:124:21)
    at async ModuleJob.run (node:internal/modules/esm/module_job:190:5) {
}
```

# 解決方法
[公式Issue](https://github.com/chakra-ui/chakra-ui/issues/7166)に同じ症状の方が解決方法を記載してくれていました。
環境によっては改善がしないようなのですが、私の環境では治りましたので一度試してみると良いと思います。

解決方法としては特定のバージョン指定でライブラリをインストールすると解消するようです。
```
# yarnの場合
yarn add @chakra-ui/react@2.4.2 @emotion/react@^11.10.5 @emotion/styled@^11.10.5 framer-motion@^6.5.1

# npmの場合
npm install @chakra-ui/react@2.4.2 @emotion/react@^11.10.5 @emotion/styled@^11.10.5 framer-motion@^6.5.1
```
LangChainとStreamlitでFunction Calling対応のチャットボットを作る

LangchainでFunction Callingに対応したAgentにMemoryやToolを組み合わせ，Streamlitで動作するチャットボットを作成しました．

https://github.com/be4rr/chatbot-function-calling/tree/main


このコードではユーザーのプロフィール作成を手伝ってくれるチャットボットを作成しています．ユーザーのプロフィール（`name`，`favorites`，`dislikes`）を引数に受け取るToolを定義しこのToolを呼び出すように指示することで，ユーザーのプロフィールを聞き出してくれるようになります．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320225/6814d63e-50b3-a875-eb41-f257575348dc.png)

このプログラム実行したい場合は，`README.md`を参考にしてください．OPENAI APIキーは`.env`ファイルに記入します．

# カスタムToolの作成

実際のToolは次のようになっています．このToolがFunction Callingで呼び出されます．

```tools.py
class GenerateProfileSchema(BaseModel):
    name: str = Field(..., description="name of user")
    favorites: str = Field(..., description="favorite of user")
    dislikes: str = Field(..., description="dislikes of user")


class GenerateProfileTool(BaseTool):
    name = "generate_profile"
    description = "Use this tool to generate a profile."
    args_schema: Type[GenerateProfileSchema] = GenerateProfileSchema

    def _run(self, name, favorites, dislikes):
        print("generating profile")
        return {
            "name": name,
            "favorites": favorites,
            "dislikes": dislikes,
        }

    async def _arun(self, name, favorites, dislikes):
        raise NotImplementedError("Not implemented yet")
```

`GenerateProfileSchema`で引数を定義し，`GenerateProfileTool`で実際の処理を定義します．

`GenerateProfileSchema`では`pydantic`を使って引数を定義します．

https://docs.pydantic.dev/latest/

`GenerateProfileTool`で実際に行う処理を定義します．このコードではほとんど何もしていませんが，実際にはここで他のAPIやデータベースとやり取りするようなイメージです．
`GenerateProfileTool`には`_run`と`_arun`の2つのメソッドがあり，`_run`は同期処理，`_arun`は非同期処理を定義します．今回は同期処理のみを利用していますが，その場合でも非同期処理を定義しておかないといけないようなので，`NotImplementedError`を返すようにしています．

https://python.langchain.com/docs/modules/agents/tools/custom_tools

ちなみにLangChainではなく`openai`ライブラリを使うとしたらTool（というよりFunction）は次のように定義します．

```python
{
  "name": "generate_profile",
  "description": "Use this tool to generate a profile.",
  "parameters": {
    "type": "object",
    "properties": {
      "name": {
        "type": "string",
        "description": "name of user",
      },
      "favorites": {
        "type": "string",
        "description": "favorite of user",
      },
      "dislikes": {
        "type": "string",
        "description": "dislikes of user",
      },
    },
    "required": ["name", "favorites", "dislikes"],
  },
}
```

# Memoryで会話の履歴を保持する

会話の履歴を保持するために`ConversationBufferMemory`を使っています．またStreamlitを使っているので，`st.session_state`を使って`memory`を保存しています．

```main.py
def get_memory():
    # get memory from session state if it exists
    memory = st.session_state.get("memory", None)

    # initialize memory if it doesn't exist
    if memory is None:
        memory = ConversationBufferMemory(memory_key="memory", return_messages=True)

    return memory
```

# LangChainのStreamlit Callback

チャットボットの発言をストリーミング表示させるために，LangChainのStreamlit用Callbackを使っています．

```main.py
st_cb = StreamlitCallbackHandler(st.empty())
response = agent.run(prompt, callbacks=[st_cb])
```

https://github.com/streamlit/StreamlitLangChain/tree/main
Django: Google でログイン

こちらのページと同じことを、Arch Linux で行いました。
[【Django】Googleアカウントログインを実装 - 簡単4ステップで実現！](https://qiita.com/ryo-keima/items/29da18b0eb00ddc6e61a)

コードは、GitHub からクローンしました。
client_id　は、事前に作成しておくことにします。

承認済みの JavaScript 生成元 に http://localhost:8000 を入れて下さい
![Screenshot from 2023-08-13 14-57-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/fc979fae-1977-2407-0b29-e286f89e83a1.png)

## 必要なライブラリーのインストール

```bash
sudo pacman -S python-django-allauth
sudo pacman -S python-django-environ
```

## コードのクローン

```bash
git clone https://github.com/ryo-keima/django-social-auth-demo.git
```

## .env の作成

```bash
cd django-social-auth-demo/
mv .env.example .env
```

```text:.env
SECRET_KEY='goodmorning'
```

## マイグレイト

```bash
python manage.py migrate
```

## スーパーユーザーの作成

```bash
python manage.py createsuperuser
```

## サーバーの起動

```bash
python manage.py runserver
```

## 管理者サイトにログイン
http://localhost:8000/admin

![django01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/6d2b7e00-683b-ac21-1973-7be6260f279b.png)

サイト名を 127.0.0.1:8000 に変更

![Screenshot from 2023-08-13 14-43-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/a4aac985-97c6-0724-d660-33779ec8ab02.png)

Provider
名前
Client id
Secret key
Sites
を入れる
![Screenshot from 2023-08-13 14-46-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/5ca8297a-8def-f538-0644-e94c505e6b27.png)

## http://localhost:8000/login/ にアクセス
![Screenshot from 2023-08-13 14-48-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/ff7ba4e6-5c62-5fd2-24ab-1cf0654a0e1b.png)

Login with Google をクリック
![Screenshot from 2023-08-13 14-49-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/a03f0088-7c03-e782-115b-d9449df59f8d.png)

Continue をクリック

Gmail のアドレスでろぐいん

![Screenshot from 2023-08-13 14-50-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/6609da1a-d296-3ff7-6b3c-ee49fa930f19.png)

## 確認したバージョン

```text
$ python --version
Python 3.11.3

$ python -m django --version
4.2.3
```

```text
>>> import allauth
>>> allauth.__version__
'0.54.0'

>>> import environ
>>> environ.__version__
'0.10.0'
```
ELBを多段スティッキーセッションで構成する際の注意事項

# はじめに
ELBでスティッキーセッションを使うことってまだまだありますよね。セッションは外に出そうね、疎結合にがベスプラですが、アプリ側の都合やパッケージ制約で泣く泣く、スティッキーセッションを使うこともあるかと思います。
今回は、スティッキーセッションを多段で利用する場合の注意事項を解説していきます。

# 実施したい構成
![スクリーンショット 2023-08-05 15.49.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/cda9033f-27ac-4f57-bb88-94cecbe19fdb.png)
上記のように、前段にProxyサーバが待ち構えており、後続のAPサーバにリクエストを送付する構成です。
多段構成ですが、あるユーザがProxy１号機（例）に送付し、後続のAPサーバ１号機にルーティングされたとします。その後同一のユーザが再度リクエストを送付した場合には、前段のProxy ALBでセッションが維持され、Proxy１号機にリクエストを送付、後続のALBでもセッションが維持され、初回リクエストと同一のAPサーバ1号機にリクエストを送付したいという構成です。

# 実施構成と問題
![スクリーンショット 2023-08-05 15.52.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/8ecb0853-1f0b-f977-418a-b8452da4ab11.png)
実施した構成はシンプルに、スティッキーセッションを、どちらのALBでも有効化する構成です。
とはいえ、単純にこの構成を取ると以下のような問題が発生します。
![スクリーンショット 2023-08-05 15.55.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/953a235e-88a0-fcc5-666a-710534eac38d.png)

# 原因と対策
なぜこのような問題が発生するのでしょうか。
![スクリーンショット 2023-08-05 16.01.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/fdfd755b-3001-8ec1-1efc-e9e4bb1302ce.png)

ALBのスティッキーセッションは、通常期間ベースとアプリケーションベースの２つの方式があります。
一般的には期間ベースを使うことが多く、今回も期間ベースの方式を利用していました。
期間ベースの場合、ALBはユーザからのリクエストに対して、AWSELBというCookieを発行します。
このCookieが再度リクエストされてきた場合、リクエスト先のサーバを維持するという仕組みですね。
今回は、後続のALBでも同様のCookieが発行され、重複、正常に動作しない状態となっていたものです。
対策としては、アプリケーションベースのスティッキーセッションを使うことになります。

![スクリーンショット 2023-08-05 16.03.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/5f80d9b2-6b5b-6733-887a-57bc0e8576f5.png)

上記のようなイメージです。アプリケーションベースの維持では、ALBは独自のCookieを発行せず、アプリケーション側で発行されたCookieを指定することで、アプリケーション側のCookieに基づきターゲットのサーバを維持します。今回は、後続のALBでアプリケーションベースのCookieを指定することにより、解決しました。

# まとめ
スティッキーセッションはなるべく使いたくないものですが、特殊な使い方をする場合は事前の検証がおすすめです。今回は運良くアプリケーション側のCookieが利用できましたが、利用できるCookieがない場合、アプリケーションの回収が必要になるケースも考えられます。
基本はセッション外だしでいきましょうね。

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/sticky-sessions.html
【Ruby】モジュールでコールバックメソッドを定義する場合、included do内に記述する理由

# 結論
- コールバックメソッドは、実行するクラスのコンテキストで評価される必要がある。
- モジュール内にそのまま記述すると、モジュールのコンテキストで評価されてしまう。
- includedブロック内に記述することでコールバックメソッドがincludeしたクラスのコンテキストで評価されるから。

# コールバックを定義するコード
- `difine_method`を使用して、実行時にメソッドを定義している
  - `difine_method`が呼び出されるクラスに定義される
```ruby
[:before, :after, :around].each do |callback|
        define_method "#{callback}_action" do |*names, &blk|
          _insert_callbacks(names, blk) do |name, options|
            set_callback(:process_action, callback, name, options)
          end
        end

        define_method "prepend_#{callback}_action" do |*names, &blk|
          _insert_callbacks(names, blk) do |name, options|
            set_callback(:process_action, callback, name, options.merge(prepend: true))
          end
        end

        # Skip a before, after or around callback. See _insert_callbacks
        # for details on the allowed parameters.
        define_method "skip_#{callback}_action" do |*names|
          _insert_callbacks(names) do |name, options|
            skip_callback(:process_action, callback, name, options)
          end
        end

        # *_action is the same as append_*_action
        alias_method :"append_#{callback}_action", :"#{callback}_action"
      end
    end
```
VitestのIn-source testingで躓いたことメモ

In-source テストの設定で罠に引っかかったのでメモしときます。

環境：
- MacOS Ventura
- Node.js 20.3.1
- Vite 4.4.9
- Vitest 0.34.1

その他はpackage.json参照
```name:package.json
{
  "name": "solid-practice",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "tsc && vite build",
    "preview": "vite preview",
    "prettier": "prettier --write .",
    "lint": "eslint --ext .js,.jsx,.ts,.tsx .",
    "lint:html": "markuplint \"**/*.html\"",
    "test": "vitest"
  },
  "dependencies": {
    "solid-js": "^1.7.11"
  },
  "devDependencies": {
    "@solidjs/testing-library": "^0.8.4",
    "@testing-library/jest-dom": "^5.17.0",
    "@typescript-eslint/eslint-plugin": "^5.62.0",
    "eslint": "^8.47.0",
    "eslint-config-prettier": "^9.0.0",
    "eslint-config-standard-with-typescript": "^37.0.0",
    "eslint-plugin-import": "^2.28.0",
    "eslint-plugin-n": "^16.0.1",
    "eslint-plugin-promise": "^6.1.1",
    "eslint-plugin-solid": "^0.12.1",
    "jsdom": "^22.1.0",
    "markuplint": "^3.12.0",
    "sass": "^1.65.1",
    "typescript": "^5.1.6",
    "vite": "^4.4.9",
    "vite-plugin-solid": "^2.7.0",
    "vitest": "^0.34.1"
  }
}
```

## TypeError: Cannot read properties of undefined (reading 'registerGraph')

- 原因：　
    - 確証はないが、DomAPIかなんかをNode環境で動かそうとしているため、対象のメソッドが見つからない。

- メモ：　
    - vite.config.tsの中身を変えずにホットリロードだけさせる（スペースを一個入力して消すなどして）となぜかテストがパスする謎挙動を起こした。
テストが通る時だけ次の文言が出るため、言われた通りに設定を変更した。
 ```
"deps.registerNodeLoader" is deprecated.If you rely on aliases inside external packages, use "deps.optimizer.web.include" instead.
```
- やったこと： vite.config.tsの設定の見直し。下記オプションを追加

```diff_javascript
...
export default defineConfig({
  plugins: [solidPlugin()],
  // for the production build, enable this
  //define: {
  // +   'import.meta.vitest': 'undefined',
  // + },
  test: {
    environment: "jsdom",
    globals: true,
    includeSource: ["src/**/*.ts", "src/**/*.tsx"],
+   deps: {
+     optimizer: {
+       web: {
+         include: ["src/**/*.ts", "src/**/*.tsx"]
+       }
      }
    }
  }
});
```
IPointer～Handlerを使ってポップアップを出してみる（Unity）

# はじめに
まず、IPointer~Handlerというのはインタフェースであり、ユーザーのインタラクション（タッチ、クリックなど）に対応して様々なイベントを検知します。

Ipointer関連のイベントインターフェースには主に以下のものがあります

・IPointerClickHandler: オブジェクトがクリックされたときに呼び出される。
・IPointerDownHandler: ポインターがオブジェクト上で下に押された瞬間に呼び出される。
・IPointerEnterHandler: ポインターがオブジェクトの上に入ったときに呼び出される。
・IPointerExitHandler: ポインターがオブジェクトの上から離れたときに呼び出される。
・IPointerUpHandler: ポインターがオブジェクト上で放されたときに呼び出される。

今回は簡単にはなりますが、EnterHandlerとExitHandlerを使ってポップアップの出し方を説明します

# 実装

```php
public class UI : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{

    public void OnPointerEnter(PointerEventData eventData)
    {
        //ポップアップが出てくる処理
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        //ポップアップが消える処理
    }

}

```

はい、これだけです。"public void ~"　が覚えられないよ～という人はMonobehaviourの横に書いてあるIPointer~Handlerだけ覚えておいてください。
これだけ書くとソースコードエディタ（Visual Studio）から警告とともに「これをしないとだめだよ～」と指示してくれるので、それに従うと自動でメソッドを書いてくれます。
中に書いてあるthrow～は未実装であることのリマインダの役割を持っているのでこれを消して中に処理を書いていきましょう。


![スクリーンショット 2023-08-09 083848.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/1260657c-abb9-9da2-2c30-5dca2961b0b9.png)
![スクリーンショット 2023-08-09 083855.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471631/74fb64a8-8e03-ef98-c155-fb83b0c5722f.png)
Azure OpenAIのChatGPTをGoogleコラボで動かす

備忘録的な感じで記録しておきます。

Azureでも通常のChatGPTと同じようにインストールします。

```
!pip install openai
```
そして必要なインストールと環境変数の設定を行います。

```
import os
import openai

os.environ["AZURE_OPENAI_KEY"] = ""
os.environ["AZURE_OPENAI_ENDPOINT"] = ""

```
最後に以下でプッシュすれば終了です。
```
openai.api_key = os.getenv("AZURE_OPENAI_KEY")
openai.api_base = os.getenv("AZURE_OPENAI_ENDPOINT") 
openai.api_type = 'azure'
openai.api_version = '2023-05-15' # this may change in the future

response = openai.ChatCompletion.create(
    engine="test",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "日本の首都は"},
    ]
)

print(response['choices'][0]['message']['content'])
```
思っていた以上にシンプルなのと、基本的にOpenAIのAPIと同じ構造のようです。

参考
https://learn.microsoft.com/ja-jp/azure/ai-services/openai/chatgpt-quickstart?tabs=bash&pivots=programming-language-python
Gitで環境依存ファイルを管理対象外にする(🔰)

チーム開発において、特定の環境のみで必要なファイルをGitの管理から外したいことがあります。そんなときに使える方法のメモです。

## 1. `.gitignore`を使用する
`.gitignore`に無視したいファイルやディレクトリを追記することで、それらをGitの管理対象外にできます。しかし、この変更をリモートにプッシュすると、その設定がチーム全体で共有されてしまう点に注意が必要です。
```.gitignore
<無視したいファイル名やディレクトリ名>
```
## 2.`.git/info/exclude`を使用する
チーム全体での共有を避け、自分の環境だけで無視したい場合は`.git/info/exclude`を使用します。こちらに追記された内容はリモートには反映されません。

```.git/info/exclude
<無視したいファイル名やディレクトリ名>
```

<font color="gray">(他に「こんな方法があるよ！」とか「それはすべきじゃないよ！」とかありましたら、ぜひ教えてください！！)</font>
私が普段使っているガジェットを紹介


この記事は[100万人に届けたい！私のお気に入りガジェット - Qiita](https://qiita.com/official-events/8644e9719b0040cc1817)の参加記事です。

https://qiita.com/official-events/8644e9719b0040cc1817

## はじめに

私が普段使っているキーボード、マウスを紹介します。
といいつつ、目新しいものは使っていないのであまり参考にならないかもです...

## キーボード

[Happy Hacking Keyboard | HHKB Classic | PFU](https://happyhackingkb.com/jp/products/classic/)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/1b5a83b2-5c8b-7cb2-edc5-df88d4071c24.png)

### 個人的お気に入りポイント

- 電池交換が不要
  - 電池交換したくない（怠惰なだけ）
  - USB接続するならBluetoothもいらないやー
- HHKBのキー配列
  - 前はJISを使っていたが、USに慣れてしまった
  - USと言ってもANSI配列だとバックスペースキーが少し遠い
  - 程よい場所にバックスペースがある
- サイズ
  - マウスとホームポジションの距離を短くしたい
  - 60%キーボードが程よいと感じた
- オリジナルキーキャップ
  - [HHKBキーキャップ刻印サービス](https://shop.yushakobo.jp/products/hhkb_keycaps_marking)でオリジナルのキーキャップを作った
  - テンションあがる

自作キーボードに興味があるので[7sPro](https://shop.yushakobo.jp/products/7spro?_pos=1&_sid=0d802697b&_ss=r)も気になっている。

## マウス

[ロジクールMX ERGOアドバンス ワイヤレス トラックボール（ティルトプレート付き）](https://www.logicool.co.jp/ja-jp/products/mice/mx-ergo-wireless-trackball-mouse.910-005183.html)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/dd337160-cf21-0855-6e66-0e893b62e177.jpeg)

### 個人的お気に入りポイント

- トラックボール
  - 同期に勧められて買ってみたが良い
    - 最初マウスカーソルの狙いが難しかったが、慣れてしまえば最高
  - マウス本体を移動させる必要がなく、腕の動きを最小限にできる
- 手のフィット感
  - 私の手にフィットする
  - 角度がついているのもあり、手首が楽な状態になっている

惜しいポイントも書くと無線接続なところ。
私の環境だと、たまにカーソルが飛んだりしてしまう。

## 最後に

私が普段使っているキーボード、マウスを紹介しました。
目新しさはないかもしれませんが、それでもこれまで使っているということは（私にとって）最高のガジェットなんだと思います。
会社を辞めて自由になりたい！

今現在書籍を読んでいるのですが面白い章を読んだので皆さんにも共有したいと思い。

### 会社を辞めて自由になるためには？

あなたはこのまま自分の為ではなく他人のために働き続ける人生に嫌気がさしているのであれば

方法は簡単。

`上司に仕事を辞めますと伝えること。`

これであなたは他人のためには働かず自分のために働く準備ができたわけ。

ただしこの非現実的な方法では生きていくことは難しい。

だったらどうすればいいのか。

`副業として新しく事業を始めるべきである。`

一気に変わろうとはせず少しずつシフトしていくイメージで。

これにより副業を本業にする際にどのくらい働けば食い繋いで行けるのであろうかという指標がわかる。

現在の本業では人と話す時間や雑談で就業時間の半分程度しか働いていない。

副業を本業にするときはそれも踏まえた上で本当に八時間ぶっ続けで働くことができるかも考えよう。


### 会社を辞めたはいいものの...

意気揚々と会社を辞め副業を本業にしたフリーランサーになりました。

その後に待ち受けている課題にはどうやって引くて数多のフリーランサーになるかになっている。

`現在のプロジェクトが終了しても次の仕事探しに焦ることなく働くことができるフリーランスになるには。`

ズバリ。

 `インバウンドマーケティングをしよう。`

 様々なメディア(ポッドキャスト、ブログ)などを駆使して自分に対しての潜在顧客を増やすことである。


 そのためにも仕事のやめ方で伝えた最初に副業として初めていくことを強くお勧めしているのだ！

 この手法にはデメリットがあり

`効果を表すまでに時間がかかるということ。`

少しずつ潜在顧客増やしていこう。

また

`従業員の時の給料の1.75~2.0倍ほどの給料を提示しましょう。`

何故かって？

今まで会社側が賄ってくれいた

パソコン代、光熱費、保険、税金etc

`全てが自分にのしかかる。`

給料面を侮らないように。

そのような高い給料を提示しても会社側が契約してくれるようになる人材になるために、

`他人にはない専門性を磨こう。`

自分でないといけない理由を自信を持って会社側に伝えられる人間になろう。

そうすれば高い給料を払ってでもあなたでないといけない理由が出来上がるわけだ。
rex0220 一括更新プラグイン 更新条件

[一括更新プラグイン](https://qiita.com/rex0220/items/f90ca06fde6b6e362583)の更新条件について、プラグイン設定と動作を解説します。
更新条件によって、誤って不要なレコード更新を行うことを防止します。

# 概要

kintoneアプリストアの問い合わせ管理アプリを利用します。
ユーザー選択項目の担当者について、一覧から一括更新を行います。
更新条件として、対応状況が未対応で担当者が割り当てされていないものを対象にします。

![2023-08-13_13h18_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ca902046-0a2a-d53c-100f-ae6d9caebeec.png)

更新結果
![2023-08-13_13h27_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2009b48d-3462-85c3-f560-8791a6bd1910.png)

- 更新レコード対象数：6
- 更新完了：3
- 変更なし：0
- 対象外：3  ※更新条件によって、更新されなかったレコード数

操作例
![2023-08-13_13h26_54.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/63f4f6a2-f15b-8436-f35d-512368709d48.gif)

# プラグイン設定
更新条件に、更新対象にする条件を指定します。
今回は、「ステータスが未設定または"未対応"かつ対応担当者が未設定」のレコードとします。

![2023-08-13_13h33_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a6f806a2-ced6-88dc-26a4-1aa9dda2a0a9.png)

- 更新条件
    - ステータスが未設定または"未対応"かつ対応担当者が未設定

```.js
AND(
  IN(Status,"","未対応"),
  Person=""
)
```
Unity ML-Agent (Release20)　導入で詰まったところ

# 概要
Unity ML-Agent (Release20)の導入に際して詰まった点をまとめておきます。
ML-Agentのインストールドキュメントを読めばインストールできるはずですが、私が試みたとき（2023/8/12）ではモジュールが配布されていない等の課題に突き当たりました。
備忘のため、インストール環境と起こった問題およびその対処法を残しておきます。
メモレベルなので必要があれば後で清書します。


# 環境（主要なライブラリのバージョン）
PCは、Surface notebbook2（GTX1050搭載モデル）
Windows 11（Pro バージョン 22H2）
Anaconda バージョン：conda 23.5.2
Python 3.8.17
cuda toollkit 11.8
Pytorch 2.0.1



# 起きたこと　＆　原因 &　対策
### protobufのダウングレード
学習を実行させようとすると、「ディレクトリ作成できません」と言われる。
Anaconda Navigatorを使い、アンインストール→バージョン落としてインストール。
"
TypeError:  cannot not be created directly.
If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
If you cannot immediately regenerate your protos, some other possible workarounds are:
 1. Downgrade the protobuf package to 3.20.x or lower.
 2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).
"


### onnxのインストール
学習を実行させようとすると、「ディレクトリ作成できません」と言われる。
インストールする。

"
Traceback (most recent call last):
  File "C:\Users\headf\anaconda3\envs\mlagent\lib\site-packages\torch\onnx\_internal\onnx_proto_utils.py", line 219, in _add_onnxscript_fn
    import onnx
ModuleNotFoundError: No module named 'onnx'

"

### Numpyのバージョン
初回は学習できたが、2回目学習させると。。
''
AttributeError: module 'numpy' has no attribute 'float'.
`np.float` was a deprecated alias for the builtin `float`. To avoid this error in existing code, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here.
The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:
    https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
''

というエラーが出る。
Numpy 1.19.xにダウングレードする。


# 参考サイト
https://qiita.com/d83yk/items/f4e5019d3f4bbeaf36dc#:~:text=%E6%AD%A3%E5%B8%B8%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%81%AE%E7%A2%BA%E8%AA%8D%201%20%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%EF%BC%88WINDOWS%E3%83%9C%E3%82%BF%E3%83%B3%EF%BC%89%E3%81%AE%E6%A4%9C%E7%B4%A2%E3%81%8B%E3%82%89%20%5B%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%5D%20%E3%82%92%E5%85%A5%E5%8A%9B%E3%81%97%20%5B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%AE%E7%B7%A8%E9%9B%86%5D%20%E3%82%92%E9%96%8B%E3%81%8F%202,%E3%81%ABPath%E3%81%8C%E9%80%9A%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%BE%E3%81%97%E3%82%87%E3%81%86%E3%80%82%203%20command%20prompt%20%E3%81%8B%E3%82%89%20%5Bnvcc%20-V%5D%20%E3%82%92%E5%85%A5%E5%8A%9B%E3%80%81%E4%B8%8B%E8%A8%98%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8C%E3%81%B0%E6%AD%A3%E5%B8%B8%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

https://qiita.com/magical-yaya/items/9247a9edcd32c27a90b1

https://qiita.com/ozaki_physics/items/985188feb92570e5b82d
【 Java 】JavaMailを使ったメール送信

### ◾️ 最初に
今回Javaでメールを送信してみようと思いましたが、調べてみると古い記事だったり、実装方法が様々だったりで混乱してゴールに辿り着けそうになかったので、"ChatGPT"に頼って実装しました。
※自分→自分　という形でメールを送信しています。

また、実務で使う場合には今回載せているソースに加えて、下記項目を考慮する必要が出てくると思います。
その時が来たらまた調べてみようと思います。

　　・同期/非同期処理(バッチ処理)の選定
　　・ログ/モニタリング設定
　　・エラーハンドリング
　　・セキュリティ etc...
***
### ◾️ Javaでメールを送信する方法
:::note info
・使用ライブラリ
　JavaMail
　　　∟ javax.mail-1.6.2.jar
　　　∟ javax.activation.jar
:::
:::note warn
・GmailでSMTP送信する際の認証設定
※自分の場合、以下対応が別途必要でした。詳しい設定等は、参照資料へ...
　　- 2段階認証
　　- パスワードに設定する値を、Gmailのパスワードから"アプリパスワード"に置き換える
![スクリーンショット 2023-08-13 13.03.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192922/ac02eee7-3f9d-b874-60ac-7ae10d785dc8.png)

:::

```properties:mail.properties
mailaddress= 自分のメールアドレス
password= アプリパスワード
mail.smtp.auth=true
mail.smtp.starttls.enable=true
mail.smtp.host=smtp.gmail.com
mail.smtp.port=587
```

```java:メール送信
import java.io.FileReader;
import java.util.Properties;

import java.io.IOException;
import java.io.FileNotFoundException;
import javax.mail.MessagingException;

import javax.mail.Session;
import javax.mail.Message;
import javax.mail.Transport;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.InternetAddress;

public class MailSender {

	public static void main(String[] args) throws IOException, FileNotFoundException{
		
		// プロパティファイルから認証に使用するデータを取得
		Properties prop = new Properties();
		prop.load(new FileReader("src/setting/mail.properties"));
		
		// 送信元のGmailアドレス
		final String username = prop.getProperty("mailaddress");
		// Gmailのアカウントのアプリパスワード
		final String password = prop.getProperty("password");

		// SMTPサーバへの認証とメールセッションの作成 
		// ※メールセッション = メールの送信に関するパラメータや設定を保持
		Session session = Session.getInstance(prop, new Authenticator() {
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(username, password);
			}
		});

		try {
			// メール送信準備
			Message message = new MimeMessage(session);
			// 送信元の設定
			message.setFrom(new InternetAddress(username));
			// 送信先の設定
			message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(prop.getProperty(username)));
			// 件名の設定
			message.setSubject("JavaMail Test");
			// 本文の設定
			message.setText("This is a test email sent from JavaMail.");

			// メールの送信
			Transport.send(message);
			// 成功時のメッセージ
			System.out.println("Email sent successfully.");
		} catch (MessagingException e) {
			// 失敗時のメッセージ
			System.err.println("Email sent unsuccessfully ： " + e );
		}
	}
}
```
***

### ◾️ 参照資料
https://qiita.com/tomokei5634/items/f8671a8f1414a8aec3ee
【URP】表裏面で別テクスチャ＆アウトライン付与シェーダー

# 0.シェーダーを書いた経緯
このアセットをURPで使おうとしたところ、シェーダーが対応していなかったので...頑張った。

https://assetstore.unity.com/packages/3d/props/tools/free-playing-cards-pack-154780

# 1.シェーダーの最低限仕様
- 用意されている3DモデルがPlaneみたいに裏面非描画になっていたので、描画させる
- 表面と裏面で違うテクスチャを貼る
- 基本的にテクスチャの白成分が高いので、重なってもわかるようにアウトラインを付与する

# 2.作ったシェーダー
```hlsl: Custom/Outline and Double-sided.shader
Shader "Custom/Outline and Double-sided"
{
    Properties
    {
        _MainTex ("Main Texture", 2D) = "white" {}
        _BackTex ("Back Texture", 2D) = "white" {}
        _OutlineColor ("Outline Color", Color) = (0, 0, 0, 1)
        _OutlineWidth ("Outline Width", Range(0, 0.1)) = 0.02
    }
    SubShader
    {
        Cull Off
        Tags { "RenderType"="Opaque" "RenderPipeline" = "UniversalPipeline" }
        LOD 100
        
        HLSLINCLUDE
        #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

        // マクロで定数化
        #define MIN 0.0001

        struct appdata
        {
            half4 vertex : POSITION;
            half2 uv : TEXCOORD0;
        };

        struct v2f
        {
            half4 vertex : SV_POSITION;
            half2 uv : TEXCOORD0;
        };

        TEXTURE2D(_MainTex);
        TEXTURE2D(_BackTex);
        SAMPLER(sampler_MainTex);
        SAMPLER(sampler_BackTex);

        CBUFFER_START(UnityPerMaterial)
        half4 _MainTex_ST;
        half4 _BackTex_ST;
        half4 _OutlineColor;
        half _OutlineWidth;
        CBUFFER_END
        
        ENDHLSL
        
        // 裏面も描画する
        Pass
        {
            // LightModeはマルチパス実行のために必須
            Tags{ "LightMode" = "UniversalForward" }
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma target 3.0
            
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = TransformObjectToHClip(v.vertex);
                o.vertex.z += MIN;
                o.uv = v.uv;
                return o;
            }

            half4 frag (v2f i, half facing : VFACE) : SV_Target
            {
                // カメラに向いている面によって表裏のテクスチャを切り替え
                return facing > 0 ? SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv) : SAMPLE_TEXTURE2D(_BackTex, sampler_BackTex, i.uv);
            }
            ENDHLSL
        }
        
        // アウトラインの描画
        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            v2f vert (appdata v)
            {
                v2f o;
                // アウトラインの分だけ拡大
                o.vertex = TransformObjectToHClip(v.vertex * (1 +_OutlineWidth));
                return o;
            }

            half4 frag(v2f i) : SV_Target
            {
                return _OutlineColor;
            }
            ENDHLSL
        }
    }
}
```

# 3.課題点
- アウトラインが太さ統一ではなく、あくまでモデルの形を拡大したのを用意しているだけなので、ちょっと気持ち悪いなとは思ってる。まあ、妥協できるかな...

# 4.感想
正直、自力のシェーダーコーディングは初めてだったので、URPの仕様に苦戦したりShader Graphに浮気したりとまあいろいろ大変だった...。
【Flutter】1年間頼ってきたサイト3選

Flutterを学び始めたエンジニアにとって、1番ネックなのが参考サイトが少ないことですよね。。。
かといって、公式を見ても解決できないし。
そこで、自分がFlutterを学び始めてから1年間の中で、めちゃくちゃお世話になったサイトを3つご紹介します。

# 1\. ちょげぶろぐ
Flutter初心者は絶対に見るべきサイトだと思います。

https://www.choge-blog.com/

【対象目安】
初心者・中級者

【概要】
Widgetの基本的な使い方だったり、汎用性の高いUIの実装方法をこれでもかというくらいわかりやすく教えてくれます。
あまり多くのWidgetを触ったことがない初心者の方が取説として使うもよし、中級者の方が簡単なWidgetを組み合わせて作るUIの参考にしてもよし。
1年経った今でも、あまり触れることのないWidgetの用途を知りたいときや、このWidgetでこんなことできないかな？？と思いついた時などにお世話になっています。

# 2\. stack overflow

知識豊富なエンジニアたちのナレッジ交換を覗き見してきました。

https://stackoverflow.com/

【対象目安】
中級者・上級者

【概要】
プログラミングに関する題材を取り扱うQ&Aサイト。
日本語版も存在しますが、英語圏のユーザが多い為、圧倒的にQuestionの分母が多いです。
Q&Aサイトといっても、FlutterのタグがついたQuestionだけで16万件以上ヒットするので、会員登録をして質問を投げるまでもなく、検索を繰り返すだけで解決法を見つけられるのではないかと思います。
このサイトは、初めてぶつかったExceptionや、Flutter特有のWidgetを掛け合わせることによって生まれる不具合などを解決する際によく使用しました。
OSによって、掲載されている解決策通りに運ばないこともありますが、大体はここからヒントをもらって解決できます。

# 3\. 徒然なるままに技術

個人的にめっちゃ好きです。

https://gakogako.com/

【対象目安】
初心者・中級者

【概要】
仕事でFlutterのアプリ開発をしていると、なんとなく理解してるけどなーなーにしてしまっている知識って、少なからずあるじゃないですか。(僕だけ？？)
そんな僕の怠慢な知識を「あ、そういうことね」ってしてくれます。(マジ感謝)
汎用性の高いWidgetのプロパティを徹底解説してくれる記事は、初心者から参考にしやすいサイトだと思います。ただ、Widgetの応用までを用意してくれている記事もあるので、基本的なFlutterの知識を習得してから見た時に、さらに知識を入れ込むことができるため、個人的に中級者の方に見ていただきたいなと思うサイトです。

## 終わりに

Flutterエンジニアの皆さん。
いつもお世話になっている記事を教えてください！
Oracle Cloud Infrastructure Architect Associate 勉強メモ（データベース概要）

# OCIで利用できるデータベースシステム
- DBCS(DataBaseCloudSystem)
オンプレミスで動いていたDBシステムをOCI上で稼働可能。
現在はBaseDB(BaseDataBaseSystem)に名称変更。
- ExaCS
非常に高速に稼働。Exadataをクラウド上でも利用できる。
- Autonomous
DB構築・運用の自動化によるコスト・時間削減。
JSONアプリケーションの利用も可能。
- MySQL
HeatWaveという分析エンジン搭載のMySQLを利用可能。従来のMySQLに比べ高機能な分析が可能。
- NoSQL
キー・バリューベースのDB

# DBエディション（オプション）
### Standard Edition
- Multitenant pluggable database(PDB)
コンテナ・データベース(CDB)という大きなデータベースに、プラガブル・データベース(PDB)という小さなデータベースが存在する。このPDBが複数存在するものがMultitenant pluggable databaseと呼ばれる。
- 機械学習
- データベースの表領域暗号化
- Spatial and Graph
空間データおよび空間分析と、物理グラフ・アプリケーション、論理グラフ・アプリケーション、ネットワーク・グラフ・アプリケーション、ソーシャル・グラフ・アプリケーションおよびセマンティック・グラフ・アプリケーション用の高度な機能が含まれている。


### Enterprise Edition
Standard Editionの機能に加え、データのマスキングや診断・チューニング機能が利用可能。
- Data Guard
スタンバイ・データベース（トランザクション一貫性のあるコピー）の作成、メンテナンス、管理および監視など、一連の包括的なサービスを提供し、本番のOracleデータベースを障害およびデータ破損から保護を行う。
- Data Masking and Subsetting Pack
開発やデータ分析などのために本番データを非本番環境にコピーする場面などがあるが、非本番環境では本番環境ほど保護や監視が行われていないことが多いため危険である。
 Data Masking and Subsettingでは、関連する本番データだけをコピーし、マスキングしてから、非本番環境で使用することができる。
https://www.oracle.com/jp/a/tech/docs/oracle-dms-data-sheet-2019-ja.pdf
- Tuning Pack
リアルタイムのSQL監視やチューニングアドバイザ、自動チューニング機能など。
https://www.oracle.com/technetwork/jp/oem/pdf/511879-ja.pdf
- Diagnostic Pack
パフォーマンス診断機能。
https://www.oracle.com/jp/a/tech/docs/technical-resources/ds-diagnostics-pack-db12c-1964641-ja.pdf
### Enterprise Edition High Performance
Standard Edition・Enterprise Editionの機能に加え、高度なセキュリティオプションを利用可能。
- Management Pack
- Life Cycle Management Pack
Lifecycleの管理に必要なプロセスを自動化
- Advanced Security
透過的データ暗号化（許可された受信者のみが読み取れる）およびOracle Data Redaction（列データのマスク）の2つの機能で構成
- DataBase Vault and Label Security
### Enterprise Edition Extreme Performance
Standard Edition・Enterprise Edition、Enterprise Edition High Performanceの機能に加え、さらに高機能（RAC構成の使用など）が含まれる。
- Database In-Memory
ストレージと比べて圧倒的に高速なメモリの特性を生かし、データ処理の多くをメモリ内で行い、ストレージへのアクセスを最小限にとどめることでパフォーマンス向上を図るアーキテクチャ。
- Active Data Guard
エンタープライズ・データの高可用性、データ保護、ディザスタ・リカバリを実現。
- Oracle RAC
RAC構成を使用可能。（VMの場合ノード数を選択できるが、ノード数が２つ以上の場合はEnterprise Edition Extreme Performanceを選ぶ必要がある。）
- Application Continuity
トランザクション処理が異常終了した際に自動で再接続し、トランザクション処理を再実行することで、見た目上処理が継続しているように動作させることができる。
【GoogleBard】がChatGPTアプリに近付いた。

:::note info
本記事は、ChatGPTを使って
おりません。あしからず。
:::

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

　今回は、
　　GoogleBardさんに
　　　ChatGPTさんと同じような
　　　　メニューがあることが
　　　　　わかったので、
　　　　　　ご報告。
***
　右側に、
　　自分のアカウントメニューが
　　　あります。

　その左側に
　　時計のようなアイコン。
　　　これは、アクティビティです。

　さて、
　　プロンプトを入力すると、
　　　時計アイコンが消えて、
　　　　NewChatを示す
　　　　　＋アイコンが出現します。

　それは今もあるのですが、
　　アカウントとのあいだに
　　　「︙」アイコンが新しく
　　　　出てきました。

　タップすると、
　　メニューが出てきます。
　　　・固定
　　　・名前を変更
　　　・削除

　下のふたつは、
　　RenameとDeleteですね。
　　　これは、ChatGPTアプリと
　　　　同じです。

　さて、問題は「固定」です。

　やってみると、
　　「このチャットを固定」と出て
　　　セッション名が出てくる。
　　　　キャンセルと固定の
　　　　　ボタンがある。

　固定ボタンすると、
　　見た目、なんの変化も
　　　ありません。

　そこで、
　　左側のメインメニューを
　　　出しました。
　　　　？な感じ。

　見つけました。

　一番上に、
　　「固定済み」という文字が。

　タップしました。
　あれ？　ダメ？

　よく見たら、
　　そこの右側に、
　　　「∨」マークが。

　そこをタップ。
　　出てきました。
　　　固定したセッション名が。

　それをタップしたら、
　　そのセッションが出てきます。

　なるほど。
***
　次に。

　メインメニューの
　　固定済みの下に、
　　　「最近」とあり、
　　　　「∨」マークがあるので、
　　　　　タップしたら、
　　　　　　これまでのやり取り。

　選んでタップ。
　　選んだセッションが。

　なるほど。
***
　最後に。

　メインメニューを見ていて、
　　ふと思ったのが、
　　　「ログアウト、ないなぁ」

　ええ、ないんです。

　まぁ、ブラウザで、
　　つなげっぱなしな人間なので
　　　気にしていなかったですw

　まぁ、Googleさんにしてみたら
　　いつもつながっているんだから
　　　必要ないでしょ、
　　　　という話なのかも
　　　　　しれませんね。
***
　とりあえず、
　　こんなところです。
大小の確率は半々ではない

## 問題

ぼーっとしていたら、次のような問題が思いついた。

> ある実数$a, b$が無作為に抽出されたとき、$a \leq b$である確率は50%であるか？

これを考える。

## 解答

（結論から書くと確率は50%ではない。）

$\forall x \in \mathbb{R}$に対して$x$が抽出される事象の確率密度関数を$f(x)$と定義すると以下が成り立つ。

```math
\begin{gather}
f(x) > 0 \\
\int_{-\infty}^{\infty} f(x) dx = 1
\end{gather}
```

$a \leq b$である確率が50%だと仮定すると$\forall a \in \mathbb{R}$で以下が成り立つ。

```math
\begin{align}
\int_{a}^{\infty} f(x) dx = \frac{1}{2} \quad (\because \ a \leq b は \exists b \in [a, \infty)と同値なため)
\end{align}
```

すると、$\exists a_1, a_2 \in \mathbb{R} \hspace{8px} (a_1 < a_2)$に対して

```math
\begin{align}
\int_{a_1}^{\infty} f(x) dx = \frac{1}{2} \\
\int_{a_2}^{\infty} f(x) dx = \frac{1}{2}
\end{align}
```

が成り立つ。
このとき

```math
\begin{align}
&\int_{a_1}^{\infty} f(x) dx = \frac{1}{2} \\
\Rightarrow &\int_{a_1}^{a_2} f(x) dx + \int_{a_2}^{\infty} f(x) dx =  \frac{1}{2} \\
\Rightarrow &\int_{a_1}^{a_2} f(x) dx + \frac{1}{2} =  \frac{1}{2} \\
\Rightarrow &\int_{a_1}^{a_2} f(x) dx = 0
\end{align}
```

となるが、これは$f(x) > 0$に矛盾する。

よって、ある実数$a, b$が無作為に抽出されたとき、$a \leq b$である確率は50%ではない。（証明終了）

## 類似問題

https://sokrates7chaos.hatenablog.com/entry/2019/05/03/013225

https://jp.quora.com/%E6%95%B4%E6%95%B0%E3%81%AE%E4%B8%AD%E3%81%8B%E3%82%891%E3%81%A4%E3%82%92%E9%81%B8%E3%82%93%E3%81%A0%E3%81%A8%E3%81%8D-%E3%81%9D%E3%81%AE%E8%87%AA%E7%84%B6%E6%95%B0%E3%81%8C%E5%81%B6%E6%95%B0%E3%81%A7%E3%81%82

https://mathlog.info/articles/487
Paiza Cランク獲得問題（Dランク相当） 算術・代入演算メニュー

paizaのCランク獲得問題の解答がなかったので、備忘録として残します。
明らかに簡単な問題の場合は省略しますが、個人的に少しでも考えたコードを残していきたいと思います。
初心者ですので醜いコードを書きますが、温かい目で見守っていただけると嬉しいです。
また、より良い記述方法などありましたら、コメント等で教えていただけると嬉しいです。

# 目次
- 引き算・掛け算
- 割り算
- 掛け算 2
- 累乗
- 累乗 2
- 代入演算 1
- 代入演算 2









## 引き算・掛け算
[問題文](https://paiza.jp/works/mondai/arithmetic_substitution_op/arithmetic_substitution_op__arithmetic_step2/edit?language_uid=c-sharp)
```c#
using System;
class Program
{
    static void Main()
    {
        string [] AB = Console.ReadLine().Split();
        int A=int.Parse(AB[0]);
        int B=int.Parse(AB[1]);
        int D=A-B;
        int P=A*B;
        Console.WriteLine(D+" "+P);
    }
}
```

## 割り算
[問題文](https://paiza.jp/works/mondai/arithmetic_substitution_op/arithmetic_substitution_op__arithmetic_step3/edit?language_uid=c-sharp)
```c#
using System;
class Program
{
    static void Main()
    {
        int A=437326;
        int B=9085;
        int X=A/B;
        int Y=A%B;
        Console.WriteLine(X+" "+Y);
    }
}
```
## 掛け算 2
[問題文](https://paiza.jp/works/mondai/arithmetic_substitution_op/arithmetic_substitution_op__arithmetic_step4/edit?language_uid=c-sharp)
```c#
using System;
class Program
{
    static void Main()
    {
        string [] ABC = Console.ReadLine().Split();
        int A=int.Parse(ABC[0]);
        int B=int.Parse(ABC[1]);
        int C=int.Parse(ABC[2]);
        int X=A*A;
        int Y=B*B+C*C;
        Console.WriteLine(X+" "+Y);
    }
}
```
## 累乗
[問題文](https://paiza.jp/works/mondai/arithmetic_substitution_op/arithmetic_substitution_op__arithmetic_step5/edit?language_uid=c-sharp)
```c#
using System;
class Program
{
    static void Main()
    {
        int A=202;
        int B=134;
        int C=107;
        double X=Math.Pow((A+B)*C,2);
        Console.WriteLine(X);
    }
}
```

## 累乗 2
[問題文](https://paiza.jp/works/mondai/arithmetic_substitution_op/arithmetic_substitution_op__arithmetic_step6/edit?language_uid=c-sharp)
```c#
using System;
class Program
{
    static void Main()
    {
        string []ABCD=Console.ReadLine().Split();
        int A=int.Parse(ABCD[0]);
        int B=int.Parse(ABCD[1]);
        int C=int.Parse(ABCD[2]);
        int D=int.Parse(ABCD[3]);
        double N=Math.Pow((A+B)*C,2)%D;
        Console.WriteLine(N);
    }
}
```

## 代入演算 1
[問題文](https://paiza.jp/works/mondai/arithmetic_substitution_op/arithmetic_substitution_op__substitution_step1/edit?language_uid=c-sharp)
```c#
using System;
class Program
{
    static void Main()
    {
        int N=0;
        N+=3286;
        N*=4736;
        N%=12312;
        Console.WriteLine(N);
    }
}
```

## 代入演算 2
[問題文](https://paiza.jp/works/mondai/arithmetic_substitution_op/arithmetic_substitution_op__substitution_step2/edit?language_uid=c-sharp)
```c#
using System;
class Program
{
    static void Main()
    {
        string [] ABC = Console.ReadLine().Split();
        int A=int.Parse(ABC[0]);
        int B=int.Parse(ABC[1]);
        int C=int.Parse(ABC[2]);
        int N=0;
        N+=A;
        N*=B;
        N%=C;
        Console.WriteLine(N);
    }
}
```
代入演算3,4はほぼ同じです。
【プラクティス紹介】1分でさらっと分かる「ボーイスカウトルール」

## プラクティス名
ボーイスカウトルール

## プラクティスの目的・狙い
* 技術的負債の累積予防
* 本格的なリファクタリングの開催頻度低減

## どんな時に使うか
* コードの見通しが悪くなってきたなと感じた時
* レガシーコードが手に負えないほど汚い時

## 実施手順
* ソース修正の際、該当箇所の周辺コードで気になる箇所があればついでにキレイにする
* 無理のない範囲でやる（ソース全体を直さなくてもよい）

日々の積み重ねが大規模なリファクタリングという大掃除を回避することにつながります。
大掃除は完全には無くせないかもしれませんが、少なくともその頻度は下げられます。

## アレンジ例
* 見込みよりも早く終えられそうなスプリントで「みんなでボーイスカウトしよう！」と、声をかける
* すぐに直せない場合は「ここ直したい」とソースコメントを追記しておくだけでもいい

## アンチパターン
* 特定の人しかやっていない（やるなら全員で）
* 不用意に触るからバグるんだ、と責め立てる（本当に悪いのは触った人ではなく汚いコードです）

## 参考情報

出典は以下です。
[https://プログラマが知るべき97のこと.com/エッセイ/ボーイスカウト-ルール/](https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E3%83%9C%E3%83%BC%E3%82%A4%E3%82%B9%E3%82%AB%E3%82%A6%E3%83%88-%E3%83%AB%E3%83%BC%E3%83%AB/)

また以下の記事ではプログラム以外の成果物に対するボーイスカウトルールについても言及されています。素晴らしい視点だと思いましたのでリンクさせていただきました。
[スクラムでのボーイスカウトルールについて考えてみた](https://qiita.com/xmz-kaneko/items/1d9d25ba2a654e16b60a)

## こぼれ話（私的コメント）
プラクティス名は「来た時よりも山をキレイにして帰る」というボーイスカウトの習慣が由来。訪れた周辺はキレイにするが、山全体をキレイにしなくてもよい。

　[アジャイルプラクティス一覧へ戻る](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)
新入社員（チーム配属者)のための開発環境2023

# チーム内開発環境について
 新人研修を終え、ようやくチームへ配属される9月。
開発の最前線へ配属された皆様にはこれから様々な事を学んでいただきます。

そのために、少しでも開発環境は良い環境にしておきたいところ。
我がチームでは上層部が決めた提出フォルダ以外は特に決まりごとはありません。
なので今回紹介する開発環境は自分で好きにカスタマイズしていただいても大丈夫です。
（こうしたほうがいいってのを随時フィードバックしてくれると頼もしいです。）

## SVN
- svn tortoiseをインストール（CLIもチェック）
## windows
 C/users/xxxx/Documentsに以下のフォルダを配置。
- xxxx_SYNC
    - checkout
        - "pj_name"

C直下に以下のフォルダを作成。
- commandフォルダを作成。
- sw_lib
- sw_setting


### pj_nameフォルダ
pj_nameフォルダはsvnでリポジトリ管理していきます。
フォルダ構成は以下で作成。
- pj_name
    - appendix
    - ANSYS_mech
    - ANSYS_flow
    - CAD
    - SRC
### VScode
VSCODEをインストール。
pythonをインストール。
VSCODEでは、以下の拡張子をインストール。
- python

# python仮想環境
vscodeで以下のコマンドを打つと仮想環境が構築できる。
```command.powershell
python -m venv env
```
envというフォルダができていれば成功。
仮想環境に切り替えるには、以下のコマンド。
```ruby:qiita.rb
env/Scripts/activate.ps1
```
成功すると(env)という文字が出る。



※まだ配属まで時間があるので追記しながら完成していきます。
せんせー、スマートドラッグってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、スマートドラッグってなに？

# スマートドラッグとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

「スマートドラッグ」とは、特別なおくすりのことを指す言葉です。
このおくすりを飲むと、頭が良くなるとか、勉強がはかどると言われています。

例えるなら、スーパーヒーローのコミックや映画で、
ヒーローが特別な力を持つリングやマントをもらうシーンを思い浮かべてみてください。
そのリングやマントを身につけると、ヒーローは特別な力を発揮できますよね。
 スマートドラッグも、頭を使う力をアップさせるための特別なおくすりと考えられます。

でも、実際の効果や安全性は、人によって違うから、気をつけないといけないんです。
だから、大人たちもよく調べたり、専門家に相談したりして、使っているんです。

# まとめ

「スマートドラッグ」とは、特別なおくすりのことを指す言葉
私はChatGPTを使ってRailsガイドを日本語に翻訳しました。

Hello everyone, I'd like to share with you that I recently did a hobby project, using ChatGPT to translate the Rails Guide into different languages. I just made a Japanese version🇯🇵, [https://ai.rails-guide.com/jp](https://ai.rails-guide.com/jp). I also wrote an article about how I do that https://dev.to/kevinluo201/dear-ai-can-you-translate-the-rails-guide-for-me-3hc. Please check it out if you think it's interesting 😃. 

I think the quality of AI translation is fair enough though it's not perfect compared to human efforts. However, it can translate the Rails Guide into any language within several hours and at a pretty low cost. Generally speaking, I think it's a good idea to use AI this way and ease the lack of volunteers in some open-source communities.

I saw the Japanese version of the Rails Guide is surprisingly up-to-date. I think it's because Ruby **and** Rails are very popular in Japan so this project may not be that interesting for you. Nevertheless, you may utilize this tool to make an initial translation of a new document and that should make the translation process faster.

I'm from Taiwan and I cannot read Japanese well. I found this forum by googling "Japan Rails community". I just want to share what I did with you. Any feedback is welcomed. I'll also translate this article into Japanese by ChatGPT. Thank you for reading : )

みなさん、こんにちは。皆さんと共有したいことがあります。最近、趣味のプロジェクトを行いました。ChatGPTを使用してRailsガイドを異なる言語に翻訳しました。日本語版🇯🇵を作成しました： https://ai.rails-guide.com/jp 。また、その方法についての記事も書きました： https://dev.to/kevinluo201/dear-ai-can-you-translate-the-rails-guide-for-me-3hc 。興味があれば、ぜひご覧ください😃。

AI翻訳の品質は、完璧ではないものの、人間の努力と比べて十分に妥当だと考えています。ただし、数時間以内にRailsガイドを任意の言語に翻訳し、かなり低コストで行うことができます。一般的に言えば、このようにAIを活用してオープンソースコミュニティのボランティア不足を解消するのは良いアイデアだと思います。

日本語版のRailsガイドは驚くほど最新であることに気付きました。おそらく、RubyとRailsは日本で非常に人気があるため、このプロジェクトはあまり興味深くないかもしれません。ただし、新しいドキュメントの初期翻訳にこのツールを活用して、翻訳プロセスを迅速化することができるかもしれません。

私は台湾出身で、日本語をあまり読むことができません。このフォーラムは、「Japan Rails コミュニティ」とGoogleで検索して見つけました。私は単に自分が行ったことを共有したかっただけです。どんなフィードバックでも歓迎します。また、この記事もChatGPTを使って日本語に翻訳します。読んでいただき、ありがとうございました : )。
【Python】関数とスコープ(ローカル変数とグローバル変数)

# 【Python】関数とスコープについて書いてみた


まず、スコープとは・・・「変数の有効範囲」定義した変数を使うことが出来る範囲のこと。

## ローカル変数とは
関数の中で代入した変数は、ローカル変数となります。
```py
def func():   # ---------ここから------------
    a = 1             # ローカル変数
    print(a)  # ---ここまでローカルスコープ---

func()
```

```py:実行結果
1
```





## グローバル変数とは
関数の外で代入された変数は、グローバル変数となります。

```py
a = 1             # グローバル変数

def func1():
    print(a)


def func2():
    print(a)

func1()
func2()
```
```py:実行結果
1
```





## ローカルとグローバルで同じ変数名に代入

```py
a = 'チョコレート'     # グローバル変数

def food():
    a = 'ケーキ'      # ローカル変数
    print(a)

food()
print(a)
```

```py:実行結果
ケーキ
チョコレート
```

①aにチョコレートを代入
②food呼び出し
③aにケーキ代入
④print(a)でケーキ表示
⑤print(a)でチョコレート

## 関数内でグローバル変数に代入

```py
a = 'チョコレート'     # グローバル変数

def food():
    global a
    a = 'ケーキ'      # グローバル変数
    print(a)

food()
print(a)
```

```py:実行結果
ケーキ
ケーキ
```

①aにチョコレートを代入
②food呼び出し
③global文でグローバル変数aを使うことを宣言
④aにケーキ代入
⑤print(a)でケーキ表示
⑥print(a)でケーキ表示