OmniAICreator/Qiita-1.07M huggingface dataset:
LaravelのSeederとFactoryを使ったテストデータ生成

## はじめに
テストや初期データの設定には、LaravelのSeederとFactoryが非常に便利です。この記事では、SeederとFactoryの基本的な使い方と、それらを使ってテストデータを効率よく生成する方法について紹介します。

## Seederの基本
Seederを使用すると、データベースにテストデータを挿入できます。これは開発プロセスの初期段階で非常に便利です。

### Seederの作成
```bash
php artisan make:seeder UsersTableSeeder
```
上記コマンドで、database/seedsディレクトリに新しいSeederクラスが作成されます。

### Seederの実装
Seederクラス内のrunメソッドを使用して、データベースにデータを挿入します。
```
public function run()
{
    DB::table('users')->insert([
        'name' => 'John Doe',
        'email' => 'johndoe@example.com',
        'password' => bcrypt('password'),
    ]);
}
```

### Seederの実行
```
php artisan db:seed --class=UsersTableSeeder
```
特定のSeederを実行する場合は、上記のコマンドを使用します。

### Factoryの基本
Factoryは、テストデータを生成するためのテンプレートを提供します。特に大量のデータを簡単に生成する際に便利です。
```
php artisan make:factory UserFactory --model=User
```
database/factoriesディレクトリに新しいFactoryクラスが作成されます。

### Factoryの実装
Factoryクラスでは、定義メソッドを使用して、モデルのデフォルト値を設定します。
```
public function definition()
{
    return [
        'name' => $this->faker->name,
        'email' => $this->faker->unique()->safeEmail,
        'password' => bcrypt('password'),
    ];
}
```
### Factoryを使用したデータの生成
Seeder内でFactoryを利用すると、大量のテストデータを簡単に生成できます。
```
public function run()
{
    User::factory()->count(50)->create();
}
```

### まとめ
SeederとFactoryは、Laravelでテストデータを生成する際に非常に強力なツールです。適切に使用することで、開発プロセスを効率化し、テストの精度を高めることができます。
データベースの障害回復処理について

システムが媒体障害以外のハードウェア障害によって停止した場合，チェックポイントの取得以前に終了したトランザクションについての回復作業は不要である

【解説】
DBMSは、ディスクに対する入出力効率を向上させるために、トランザクションの更新をメモリ上のバッファとログファイルに記憶しておき、一定の間隔ごとにまとめてディスクに反映させるという方式をとっています。このディスクと同期を取るタイミングをチェックポイントといいます。チェックポイントまでのトランザクションはディスクに反映済みなので、媒体障害以外の障害（システム障害やトランザクション障害）のときにはチェックポイント以前にコミットしたトランザクションについて回復作業を行う必要はありません。
Docker postgresql + prisma + nestjsでAPIをデプロイする

https://docs.ynetlabo.net/archives/30

Dockerコンテナ同士でPostgresqlの通信＋nestjsをコンテナ化する際にprismaでエラーが出まくりだったので、備忘録として記録する。

## ステップ

* nestjsをビルド＋コンテナ化する（with prisoma)
* docker-composeで同じコンテナ間のpostgresqlの通信を実現する
## 不完全

prismaのソースコード内のenvを読み取ってくれなかったので、値直書きしてます。いい方法あれば教えてください。

## 補足
DB接続文字列は、compseで作成したサービス名で接続可能　ビルド前に知りたかったのでここに紹介
```
例。。。”postgresql://***:***@service_postgres:5432/***?schema=public”
```
### nestjsをビルド＋コンテナ化する

以下dockerファイルを作成してdocker-imgを作成する。色々記事はあったものの、prismaと一緒の記事がなかなかなく、色々試した結果以下の設定で動いた。

#### ポイント
* node:21-slimを使用
* ビルド時npx prisma generateを実行
* 最終アーティファクトに「apt-get install -y openssl」でopensslを導入 (slimだと入ってないみたい）
* ※slimを選ばなくてもOKだが、slim版でないと1つのイメージが1GB越えで。。。

```
"debian-openssl-1.1.x" to `binaryTargets` in the "schema.prisma" file and run `prisma generate` after saving it:
```

```yaml
###################
# DEVELOPMENT
###################
FROM node:21.0.0-slim AS development

WORKDIR /usr/src/app

RUN apt-get update && apt-get -qq install -y --no-install-recommends \
    tzdata \
    tini \
    && rm -rf /var/lib/apt/lists/*

ENV NODE_ENV development

COPY --chown=node:node package*.json ./

RUN npm ci

COPY --chown=node:node . .

USER node


###################
# PRODUCTION BUILD
###################

FROM node:21 As build

WORKDIR /usr/src/app

ENV NODE_ENV production

COPY --chown=node:node package*.json ./

COPY --chown=node:node --from=development /usr/src/app/node_modules ./node_modules

COPY --chown=node:node . .

RUN npx prisma generate

RUN npm run build

RUN npm ci --omit=dev && npm cache clean --force

USER node


###################
# PRODUCTION
###################

FROM node:21.0.0-slim

WORKDIR /usr/src/app

ENV NODE_ENV production

RUN apt-get update \
    && apt-get install -y openssl


RUN apt-get update && apt-get -qq install -y --no-install-recommends \
    tzdata \
    tini \
    && rm -rf /var/lib/apt/lists/*

COPY --chown=node:node --from=build /usr/src/app/package.json ./
COPY --chown=node:node --from=build /usr/src/app/node_modules ./node_modules
COPY --chown=node:node --from=build /usr/src/app/dist ./dist

EXPOSE 3000

USER node

ENTRYPOINT ["/usr/bin/tini", "--"]
CMD [ "node", "dist/main.js" ]
```
### docker-composeを作成
```yaml
version: '3.8'

services:
  service_postgres:
    image: postgres:16
    container_name: container_postgres
    environment: 
      POSTGRES_USER: ***
      POSTGRES_PASSWORD: ***
      POSTGRES_DB: ***
    ports: 
      - "5433:5432"
    volumes:
      - volume_postgres:/var/lib/postgresql/data
      - ./postgres_service/initdb.d:/docker-entrypoint-initdb.d

  service_laboapi:
    image: <<your-image-name>>
    container_name: ynetlabo-api
    ports:
      - "7701:3000"
    depends_on:
      - service_postgres
      
        
volumes:
  volume_postgres:
    name: vpg
```
👏動いた
Laravelテスト入門：初学者ガイド

## はじめに
Laravelは、テストに優れた環境を提供するPHPフレームワークです。この記事では、Laravelでのテストの基礎を初学者に向けて紹介します。テストを書くことで、アプリケーションが予期せぬ動作をせず、期待通りに機能することを保証できます。

## テストの種類
Laravelで主に扱うテストは以下の2種類です。
1. **ユニットテスト**: コードの最小単位（通常は関数やメソッド）が期待通りに動作することをテストします。
2. **フィーチャーテスト**: アプリケーションの特定の機能がユーザーの期待通りに動作することを確認します。

## テスト環境の準備
Laravelプロジェクトでは、`php artisan` コマンドを使用してテスト環境を簡単にセットアップできます。上記のコマンドは、`tests/Feature`ディレクトリに`UserTest`という名前の新しいテストクラスを作成します。

## テストの書き方
### ユニットテストの例
ユニットテストは、アプリケーションの特定の部分が正しく機能することを保証します。以下は、Laravelでユニットテストを書く基本的な構造です。
```php
/** @test */
public function it_adds_two_numbers()
{
    $this->assertEquals(4, 2 + 2);
}
```


### フィーチャーテストの例
フィーチャーテストは、ユーザーストーリーやアプリケーションの特定の機能をテストします。

```
/** @test */
public function it_shows_the_users_profile()
{
    $response = $this->get('/user/1');
    $response->assertStatus(200);
    $response->assertSee('User Profile');
}
```

### テストの実行
テストを実行するには、以下のコマンドを使用します。または、PHPUnitを直接使用することもできます。
```
php artisan test
# または
./vendor/bin/phpunit
```

### まとめ
Laravelでテストを書くことは、アプリケーションの品質を保証し、将来の機能拡張やリファクタリングを安全に行うための重要なステップです。この初学者向けガイドが、Laravelでのテストの世界への第一歩となることを願っています。
【windows 11】パソコンを起動したときに、アプリが自動で起動するようにする方法【便利】

# 小技
みなさんはパソコンを起動した時にわざわざクリックしてアプリを起動していませんか？

そんな面倒臭いことしなくても設定する方法があります。

# 方法

1.windows+Rを押す。
2.Shell:startup と入力する
3.okを押す。
4.起動したいアプリのショートカットを入れる。

# これだけです。

簡単ですし、どんなアプリでもできるのでぜひやってみてください。

ちなみにわたしは、コピペが超便利になる**clibor**をいれています。
Reactでレンダープロップパターンを実装した。

## はじめに
Reactを実装していくと、段々とコードが膨らみます。最初は良いのですが、だんだんとコードの行数が増えていき、ファイル分割したくなります。そこで責務の分離を試みる時に、レンダープロップパターンが良いので、紹介します。

:::note info
今回は、UIとビジネスロジックの部分で分解します。
:::

## 成果物
![count.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/658b6647-f0a1-b0f3-8e50-2db51f9e107d.gif)

:::note info
今回はよくあるCountコンポーネントを作ります。
:::


https://github.com/kouji0705/react_render_props

## ソースコード
```shell:ディレクトリ構成
~/develop/HITOTSU/react_render_props (master)$ tree -I node_modules 
.
├── README.md
├── package.json
├── public
│   ├── favicon.ico
│   ├── index.html
│   ├── logo192.png
│   ├── logo512.png
│   ├── manifest.json
│   └── robots.txt
├── src
│   ├── App.tsx
│   ├── Counter.tsx
│   ├── index.tsx
│   ├── logo.svg
│   ├── react-app-env.d.ts
│   ├── reportWebVitals.ts
│   └── setupTests.ts
├── tsconfig.json
└── yarn.lock

3 directories, 17 files
```

```tsx:src/App.tsx
import React from 'react';
import { Counter } from './Counter';

export const App = () => (
  <Counter>
    {(count, handleClick) => (
      <div>
        <p>カウント: {count}</p>
        <button onClick={handleClick}>増加</button>
      </div>
    )}
  </Counter>
);

export default App;
```
:::note info
子コンポーネントのCounterでロジックを定義。
親コンポーネントではUI部分の実装のみを記載。
:::


```tsx:src/Counter.tsx
import React, { useState } from 'react';

// Counter コンポーネントのPropsの型定義
type CounterProps = {
  children: (
    count: number,
    handleClick: () => void // カウントを増加させる関数の型を追加
  ) => React.ReactNode;
};

export const Counter: React.FC<CounterProps> = ({ children }) => {
  const [count, setCount] = useState(0);

  // カウントを増加させる関数
  const handleClick = () => setCount(count + 1);

  return <>{children(count, handleClick)}</>;
};

```

:::note info
UIコンポーネントの実装は書かず、ロジックに集中して記載します。
:::
ソフトウェアの保守性の評価指標について

品質の定量評価の指標のうち、ソフトウェアの保守性の評価指標となるもの

修正時間の合計÷修正件数


【解説】
ソフトウェア品質特性について定めたJIS X 0129-1では、保守性を「修正※のしやすさに関するソフトウェア製品の能力」と定義しています。
つまり保守性の度合いは、そのソフトウェアを修正するために要するコストの高低によって決まるということになります。
したがって修正1件当たりに要した時間を表す式が評価指標として適切です。

※是正若しは向上，又は環境の 変化，要求仕様の変更及び機能仕様の変更にソフトウェアを適応させることを含む
[Git] ローカルからリモートにプッシュする手順

## 1. 最新のリモートの情報を取得する
```
git fetch -p
```
## 2. 変更ファイルを確認する
```
git status
```
## 3. ステージングにファイルを追加する
```
git add <ファイル名>
```
## 4. 追加したファイルが正しいか確認する
```
git status
```
## 5. コミットする
```
git commit -m "コミットメッセージ"
```
## 6. コミットされているか確認
```
git log
```
## 7. プッシュする
```
git push orgin <ブランチ名>
```
AWS Lambdaで日本時間を扱う

AWS Lambdaの関数内で、日本時間をUNIX時間に変換する処理を実装した時に、9時間足されたUNIX時間に変換されてしまいました。
コードは下記の感じ。
```csharp
if (DateTimeOffset.TryParse(input, out DateTimeOffset dateTimeOffset))
{
    DateTime dateTime = dateTimeOffset.DateTime;

    long unixTimestamp = ((DateTimeOffset)dateTime).ToUnixTimeSeconds();
    return unixTimestamp.ToString();
}
else
{
    return string.Empty;
}
```
`input`に日本時間（フォーマット：`2024-01-01T00:00:00+09:00`）の文字列が入ります。
上にコードを示しましたが、このコードには特に問題はありません。

# 解決方法
Lambdaの環境変数を追加する。
- キー：`TZ`
- 値：`Asia/Tokyo`

AWS Lambdaのコンソール画面で設定できる。
![スクリーンショット 2024-02-04 121948.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661070/4696a163-41f3-69b6-047b-4b2ac6c043f2.png)

AWS Toolkit for Visual Studioを使ってLambda関数をアップロードする場合、アップロードと同時に環境変数も設定できる。
![スクリーンショット 2024-02-04 122850.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661070/6c043880-2c25-0438-30fe-f5af7e744b41.png)

Lambda関数を実行する環境が、世界標準時になっているから、環境変数で日本時間に変えてあげればよいということです。

# 解決するまでの試行錯誤
色々試行錯誤した結果を記録として残しておきます。
いい勉強にもなったので…

### なぜか血迷って`DateTime`型に変換するところでタイムゾーンを`Local`に設定した
修正前↓
```csharp
DateTime dateTime = dateTimeOffset.DateTime;
```
修正後↓
```csharp
DateTime dateTime = TimeZoneInfo.ConvertTimeToUtc(result.DateTime, TimeZoneInfo.Local);
```
Lambda関数を動かしている環境が`UTC`なので、意味ないですね…(^_^;)

### さらに血迷って`DateTime`型に変換するところでタイムゾーンを`Utc`に設定した
上記の修正をさらに、
```csharp
DateTime dateTime = TimeZoneInfo.ConvertTimeToUtc(result.DateTime, TimeZoneInfo.Utc);
```
とした。
Lambda関数を動かしている環境が`UTC`なので(ry

### タイムゾーンを日本時間に設定した（しようとした）
タイムゾーンを示すIDを指定することで、入力された日時を日本時間として読んでもらうようにしました。
```csharp
DateTime dateTime =
    TimeZoneInfo.ConvertTimeToUtc(result.DateTime, TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time"));
```
手元での動作確認は問題なく、これでいけるだろ！っと思ったのですが、アップロードして動かしたらこんなエラーが…
```
The time zone ID 'Tokyo Standard Time' was not found on the local computer.
```
ちょっと調べてると、.Net Coreにおいて、WindowsとLinuxでタイムゾーンのIDが異なるようです。
日本時間のIDは、Windowsでは`Tokyo Standard Time`ですが、Linuxでは`Asia/Tokyo`です。
コード上で`Asia/Tokyo`に修正すれば正しく動いたと思うのですが、テストコードも用意していたこともあり、環境変数を設定する方法に落ち着きました。
remote: Repository not found. Git Credential Manager使用

# 事象
別アカウントに切り替えて作業をした後に、元のアカウントに戻すとpushできなくなった。gitへのログインは2段階認証を適用するためGit Credential Managerを利用している。

```zsh
$ git push origin dev 
remote: Repository not found.
fatal: repository 'https://github.com/<ユーザ名>/<リポジトリ名>.git/' not found
```

# 結論
macOSのキーチェーン>ログインからgitの認証情報を削除する。未検証ですが、Windowsでは資格情報マネージャーで同様の操作で解決可能と思われる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700284/98ec2c8f-0e1b-e21b-d39e-1286b62a5bc2.png)
【Tips】yarn devで実行時のブラウザを指定する

### はじめに
表題通り、`yarn dev`で実行時にブラウザを指定する方法を記載します。
chromeで実行したいが、edgeで開かれるのが少しストレスでした💦💦💦
.envの値を変更すればいいので、紹介します。

### .envの値を修正
```shell:.env
BROWSER=chrome
```

:::note info
意外と簡単ですね。
:::
設計とは分割と結合である

Sierでバックエンドの開発をしている2年目エンジニアです。
先日参加した勉強会で、個人的に頭にズドーンときた言葉があります。

「設計とは分割と結合である」

この言葉は、クラス設計やマイクロサービスの概念に通じるものがあります。

クラス設計では、クラスをどのように分け、関連づけるかが肝。
マイクロサービスでは、アプリケーションを複数の独立したコンポーネントに分割し、それらを効果的に連携させることが肝。

良い設計とは、
適切な分割と結合をできていることだと思う。
でも、「適切」って、具体的にはどういうことだろう？

これを掘り下げるために、中学数学に時を戻してみる。

たとえば、99²の計算。
99²をそのまま計算しようとすると大変で、僕の脳みそだと計算ミスする可能性が高い。

でも、99を100と-1に分割すると、以下のように簡単に計算できる。
(100-1)² = 100² -200 + 1 = 9801

分割した分、結合箇所（演算子）は増える。
それでも分割した方が計算が楽になる。

これって、適切な分割がどれだけ大事かってことを示してる例だと思う。
不適切な分割とは、99を50と49に分けるような行為で、全然計算が楽にならない。

そう考えると、計算を工夫するのも、いわば設計のうちだと言えそう。

エンジニアに数学的な思考力が求められるのは、この分割と結合の考え方を学んでいるからなんだなって、ちょっと納得しました。
StableDiffusionチートシート

# 新規モデルセット

追加したいモデルを選択

https://romptn.com/article/15500

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/8f9e671b-2b7b-9f3c-e5cd-a203e9a195b0.png)
`Download`クリック

`\StableDiffusion\stable-diffusion-webui\models\Stable-diffusion`
にDLしたファイルを配置

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/5f0e52ec-8a03-6762-7cec-7e3b62013c5d.png)
Web UI側で更新を書けると、先ほど追加したモデルを使うことができる


# 生成画像投稿サイト
https://civitai.com/

# プロンプト
https://romptn.com/article/27449

https://note.com/seienkobo/n/nec47a4eca2c3#735fc7ad-3561-4c25-a283-de72c78209b2
[Typescript] 型エイリアスってなんぞ？

## 型エイリアスについての簡単な説明
type文を用いて型に名前を付けられる機能のことを型エイリアスと呼びます。

## 型エイリアスの利点
### ①コードの可読性向上
使用しない場合
```typescript

function calculateTotalPrice(cart: { items: { name: string; price: number }[] }) {
  let total = 0;
  for (const item of cart.items) {
    total += item.price;
  }
  return total;
}

```
使用した場合
```typescript
type CartItem = {
  name: string;
  price: number;
};

type ShoppingCart = {
  items: CartItem[];
};

function calculateTotalPrice(cart: ShoppingCart) {
  let total = 0;
  for (const item of cart.items) {
    total += item.price;
  }
  return total;
}
```
CartItemとShoppingCartという型エイリアスを使用することで、calculateTotalPriceの引数の構造が明確になったと思います。


### ②再利用性の向上
CartItemとShoppingCartの型を作成したことで、他の場所でも利用できるようになりました。変更が必要になった場合は一箇所修正するだけでよくなります！便利！！
StableDiffusion 導入方法

# StableDiffusion WebUIとは
ブラウザ上でパラメータを操作して
画像生成をしやすくするためのツール。

自分のPCに画像生成ができる環境を構築するので、
制限がなく、無料で画像生成し放題。

## ただ、誰しもができるものではない...
StableDiffusionはPCのスペックに依存するので、
低スペックのPCでは使えず、高スペックで、
かつGPUが搭載されているPCでしか実行できない。

下記、推奨スペック

| | 推奨スペック |
|-----------:|:------------|
| PC       | デスクトップ型        |
| OS     | Windows（64bit）      |
| CPU       | 最新モデルのCore i5～Core i7、Ryzen 5～7        |
| GPU         | RTX 30シリーズやRTX 40シリーズのVRAMが12GB以上          |
| メモリ       | 16GB～32GB       |
| ストレージ    | 512GB以上     |

参考

https://dosparaplus.com/library/details/001456.html

## PCスペックの確認
1. `Windows`+`R` 同時押し
2. 「dxdiag」と入力、Enter

ちなみに筆者のPCスペックは以下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/c6fda2a1-c676-6466-2706-73b62d1f8656.png)


# 環境構築

必要インストール
- Python3.10.6
- Git
- StableDiffusion

## Python
https://www.python.org/downloads/release/python-3106/

サイト下部
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/a5e124c3-522c-1783-4d8c-bc0ebfe872e0.png)

DLしたexeをダブルクリック
`Add Python 3.10 to PATH`にチェックをつける
`Install Now`クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/93f0bf81-bb08-30da-cf57-703111c24d48.png)

↓
完了

## Git
https://git-scm.com/download/win

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/c8a72269-f4f6-7928-e075-2e4c75ea6b10.png)

↓
exeを実行
↓
全てOKでインストール
↓
完了

## StableDiffusion
https://github.com/AUTOMATIC1111/stable-diffusion-webui

StableDiffusion用のフォルダを作成
例としてCドライブ直下に「StableDiffusion」フォルダ作成
`Ctrl`+`L`を押下して`cmd`と入力
↓
コマンドライン画面が表示される

こちらにアクセスしてcloneコマンドをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/88268561-9646-9ff4-8162-a1af8a5e58a2.png)

先ほどのコマンドラインに、コピーしたコマンドを貼り付けて`Enter`


# Web UI起動
`clone`コマンドでできたフォルダを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/1ceb9c89-7b95-b266-ba6a-028d131e68b0.png)

`webui-user.bat`をダブルクリック
※拡張子を表示していない場合は`webui-user`となる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/c002704f-8e18-fad7-7af0-36801b50ec02.png)

完了まで20分ほど時間がかかるので、待つ。
ブラウザにて下記のように画面が表示されたら完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/0ed0e394-c4ab-492c-a2b9-de117ee72518.png)

これがWeb UI。
【Ruby・Rails】nil? ・empty? ・blank? ・present?の使い方

## はじめに
使い分けがフワッとしていたので改めてまとめます。
## メソッドごとの違い

| メソッド   |判定対象| 出力 |
| --- | ----------- | ------- |
| nil?| nil |Boolean|
| empty?|""(空文字)|Boolean|
| blank?| nil + ""(空文字) + [] + {}  |Boolean|
| present?|nil + ""(空文字)以外か|Boolean|

https://railsdoc.com/page/empty

## nil?

```ruby
hoge = nil
puts hoge.nil?
# true
hoge = ""
puts hoge.nil?
# false
```

## empty?
```ruby
hoge = ""
puts hoge.empty?
# true

hoge = "hoge"
puts hoge.empty?
# false

hoge = nil
puts hoge.empty?
#undefined method `empty?' for nil:NilClass (NoMethodError)
```
レシーバが**nil**の可能性がある場合は例外が吐かれる可能性がある。
## blank?
```ruby
hoge = ""
puts hoge.blank?
# true

hoge = "hoge"
puts hoge.blank?
# false

hoge = nil
puts hoge.blank?
# true
```


## present?
```ruby
hoge = ""
puts hoge.present?
# false

hoge = "hoge"
puts hoge.present?
# true

hoge = nil
puts hoge.present?
# false
```
`!blank`と等価の関係に当たる。
【SE入門編】【番外編】AJAXを使って画面の一部項目を刷新する

## 前書き

今回の記事は「SE入門編」シリーズの一部です。完全版はこちらにあります：

https://qiita.com/manabu-s/items/2f7f10752bcf44244718

今回の記事のソースはGithubにアップロードしております：

https://github.com/yoruzuki/WebService_Spring/tree/main/demo%20ver0.5

## 1. 前提条件

今回の記事は【番外編】となっており、JqueryとAjaxの知識があれば十分です。

ただし、既に本編で構築したソースの上に、Ajax機能を追加したため、興味をお持ちの方は本編から着手してください。

## ２. 今回の記事で出来たこと

- ログイン画面でユーザーIDを入力すると、DBから入力されたユーザーの情報を取得し、利用言語を画面に表示することが出来た

- ログイン初期画面（利用言語＝Englishで表示される）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1442793/7ed1d9db-0fdd-2a15-3e9b-ac659c9fb477.png)


- ログイン画面、存在するユーザーIDを入力する時（利用言語＝Japaneseで表示される）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1442793/b302add0-fca2-c73d-15ad-874acc63b629.png)

- ログイン画面、存在しないユーザーIDを入力する時（利用言語がEnglishのまま、変わらない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1442793/c16f479e-e12d-a113-e21a-382a47458538.png)


## ３. 実装
- 画面テンプレート:login.htmlに以下のソースを追加する、Jquery、Ajaxの説明は省きます、コメントアウトを確認してください

```
	$(document).ready(function() {
	    // フォーカスを失ったときのイベントを追加
	    $('#userID').blur(function() {
	        // 入力された値を取得
	        var enteredValue = $(this).val();
	        
	        // Ajaxリクエストを送信
	        $.ajax({
	            url: 'ajaxFindLanguage',  // サーバーのエンドポイントを指定
	            type: 'POST',  // リクエストの種類を指定
	            dataType: 'json',
	            data: { userID: enteredValue },  // サーバーに送信するデータを指定
	            success: function(response) {
	                // サーバーからの応答をコンソールに表示
	                console.log('サーバーからの応答:', response);
	                if(response != "" && response.lang != ""){
	                	// 画面language要素の値を更新する
	                	$("#language").find("option[value='" + response.lang + "']").prop("selected", true);
	                }
	            },
	            error: function(error) {
	                console.log('エラー:', error);
	            }
	        });
	    });
	});
```

- LoginController.javaに以下のメソッドを追加する
```
	@PostMapping("/ajaxFindLanguage")
	public void findLanguage(HttpServletRequest request, HttpServletResponse response) throws IOException {
		String lang = "";
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");

        String userID = request.getParameter("userID");
        
		if (userID != null && !"".equals(userID)) {
			// ユーザー情報の利用言語を取得する
			User user = userService.selectUserByPK(userID);
			if (user != null) {
				lang = user.getLang();
			}
		}
		
        if (lang != null && !lang.isEmpty()) {
            // サーバー側の処理例（ここでは単純に利用言語をJSON形式で返す）
            String jsonResponse = "{\"success\": true, \"lang\": \"" + lang + "\"}";
            PrintWriter out = response.getWriter();
            out.print(jsonResponse);
        } else {
            String jsonResponse = "{\"success\": false\"}";
            PrintWriter out = response.getWriter();
            out.print(jsonResponse);
        }
	}
```

Jquery　＋　AJAXを使うことで、画面の一部要素のみ更新することが簡単に実装出来ました、便利ですね。

## おわりに

プロジェクト全体のソースコードはGitHubにアップロードしました、ぜひダウンロードして確認してください。

https://github.com/yoruzuki/WebService_Spring/tree/main/demo%20ver0.5

それではまた。
VSCode GUIからのpytestでModuleNotFoundErrorが起きたら

# エラー内容

VSCodeのGUIからpytestを実行するとテスト対象モジュールのimportで失敗する。

![スクリーンショット 2024-02-04 12.00.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386408/76ce0c11-5704-9d77-16e3-af275f1770cd.png)



# 解決方法
`__init__.py`にパスを追加する。


# 目次
1. [VSCodeのセットアップ](#VSCodeのセットアップ)
1. [ディレクトリ構成と対象ファイル](#ディレクトリ構成と対象ファイル)
1. [__init__.pyでパスを追加する](#__init__.pyでパスを追加する)
1. [poetryからテスト実行する場合](#poetryからテスト実行する場合)



<a id="#"VSCodeのセットアップ"></a>
# VSCodeのセットアップ
拡張機能として[Python Test Explorer for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=LittleFoxTeam.vscode-python-test-adapter)を追加しておきます。
追加後はフラスコのアイコンが表示されます。

![スクリーンショット 2024-02-01 21.04.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386408/c721a4f4-f43d-bdce-f085-347928f34b4c.png)

インストールが完了次第、ルートディレクトリを聞かれます。
今回は`test_project`をルートとます。

<a id="#ディレクトリ構成と対象ファイル"></a>
# ディレクトリ構成と対象ファイル
```
test_project 
├── src
│   └── main.py
└── tests
    └── test_main.py
```

```python: main.py
def add(a,b):
    return a + b
```

```python: test_main.py
from main import add


def test_add():
    res = add(10,20)
    assert res==30
```


<a id="#__init__.pyでパスを追加する"></a>
# `__init__.py`でパスを追加する

```python: tests/__ini__.py
import os
import sys

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'src')))
```

このコードは現在のファイルの親ディレクトリ(src ディレクトリ)をPythonのシステムパスに追加していて、具体的には以下のようなステップを踏んでいます。

1. `__file__` は現在実行中のPythonファイルのフルパスを表します(/Users/yoshimasa/Desktop/test_project/tests/\__init__\.py)

2. os.path.dirname() 関数は、与えられたパスのディレクトリ名を返します。これを用いて、現在のファイルが存在するディレクトリを取得します。
(/Users/yoshimasa/Desktop/test_project/tests)

3. その後、'..'と'src'を連結します。
(/Users/yoshimasa/Desktop/test_project/tests/../src)

4. さらに`os.path.abspath()`でパスを正規化します
(/Users/yoshimasa/Desktop/test_project/src)

最後に、sys.path.append() を使用して、この src ディレクトリをPythonのシステムパスに追加します。これにより、このディレクトリ内のモジュールやパッケージを、他の場所からインポートして使用できるようになります

<a id="#poetryからテスト実行する場合"></a>
# poetryからテスト実行する場合
poetryでプロジェクを管理していて、コマンドライン(_poetry run pytest_)からテスト実行する場合はpoetry.tomlに以下を追記して対応するもよし。

```
[tool.pytest.ini_options]
addopts = [
    "--import-mode=importlib",
]
```

https://docs.pytest.org/en/7.1.x/explanation/goodpractices.html
docker上のnginxでnuxtアプリを動かす

:::note info
この記事は、5分で読めます。
:::

## はじめに
- ビルドしたアプリケーションを手元で動かしたいときありますよね。
- docker hubからnginxのイメージを取ってきて、静的コンテンツ化したアプリをコンテナ上で動作させます。
- アプリは、nuxt3で作っています。


## 目次
1. やっていること
1. 手順


## やっていること
#### 何をしてるんですか？
以下の流れで、タイトル通りのことをしています。
1. nuxtで作成したアプリケーションをビルド(静的コンテンツ化)する
1. docker hubからnginxのイメージをpcに取り込む
1. nginxを含むコンテナを起動してnginxサーバーでnuxtアプリをホスティングする

#### これを実施して何が良いんですか？
本番環境に近い条件でアプリケーションを動作させることができます。
例えば、ローカルでは想定通り動作するけど、デプロイしたら動作しないみたいな時に、いちいちデプロイしなくても検証できます。

※ローカルでは：ローカルでサーバを起動して、localhost:3000とかでアクセスする

#### nginxってなんですか？
まず発音は、エンジンエックスです。
webサーバーとかリバースプロキシとして使えるソフトウェアです。
本記事でも紹介するように、静的コンテンツのホスティングとかができます。
特徴としては、高性能なので、たくさんの人がwebサイトに訪れても、各々に落ち着いてページをみせてくれます。

## 手順
docker上のnginxでnuxtアプリを動かす手順は、4ステップです。

#### １：nuxtアプリのビルド
yarnでビルドします。
```terminal
yarn generate
```
![スクリーンショット 2024-02-04 10.25.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754596/27a7bd6c-ddab-ecab-6986-6ba7affd20e4.png)

以下のように出力されたら成功です。

![スクリーンショット 2024-02-04 10.26.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754596/953e3eb4-a18c-f0cf-08f9-992c52aed33a.png)

distディレクトリが生成されてるはずです。（環境によっては.outputって名前かも）
ここにビルドされたものがあるので、絶対パスをメモってください。


#### 2:nginxのイメージのpull
docker hubからnginxのイメージをローカルpcに取り込みます。
適当なディレクトリで以下コマンドを実行してください。
（Docker Desktopが起動していることを確認しておく）
```terminal
docker image pull nginx
```
上記を実行したら、以下のコマンドを実行することでpullしてきたnginxのイメージを確認することがきます。
```terminal
docker images
```
これであなたは、準備整い親方です。どすこい！
>ちなみに、docker hubのnginxは以下から確認できます。

https://hub.docker.com/_/nginx

#### 3:コンテナを起動
１、２が完了したら、コンテナを起動して、静的コンテンツをホスティングします。
以下のコマンドで実施できます。
```terminal
docker run -d -p 8080:80 --name <コンテナに任意の名前をつける> -v "distまでの絶対パス":"/usr/share/nginx/html" <イメージの名前>
```
docker desktop上で起動していることを確認できます。
![スクリーンショット 2024-02-04 10.35.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754596/d3cfa976-ee04-6bf6-9494-a0b7ff4fd6f1.png)


##### コマンドの解説をします。
docker run：Dockerコンテナを起動するためのコマンド（指定したイメージからコンテナを作成）

-d：バックグラウンドでコンテナを実行します。なので実行後のコンソールはコンテナのものではなく、ローカルpcのコンソールになります。

-p：ポートマッピング

8080：ローカルpc側のポート（予約されてなければ、なんでもok

80：コンテナ側のポート

--name：このオプションの右隣に入力した文字列で、コンテナに名前をつける

-v：ホストマシン上のディレクトリやファイルをコンテナ内の特定のパスにマウントする

"distまでの絶対パス"：ビルドしたnuxtアプリがある場所

/usr/share/nginx/html：nginxウェブサーバーのデフォルトのドキュメントルートディレクトリ。ウェブサーバーが静的ファイル（HTML、CSS、JavaScriptなど）をホストするために使う場所

<イメージの名前>：起動したいコンテナイメージの名前



#### 4:ホスティングしたアプリケーションを確認する
以下のurlをブラウザに打ち込んで、アプリケーションを表示できたら完了です。
```
http://localhost:8080/
```
![スクリーンショット 2024-02-04 10.37.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754596/2263fcc0-986a-f660-3421-750b746353c1.png)


#### 補足
コンテナ起動後、コードを改変した場合は再度、ビルド(yarn generateしてねって意味)からやり直す必要があります。
また、dockerコンテナにおいても、以下のコマンドで停止後に削除してから、手順1〜４を実行してください。
削除せずに手順３のコンテナ名を同じにして実行すると、すでに同一名のコンテナが存在すると怒られるためです。

コンテナを停止する
```terminal
docker stop <任意のコンテナ名>
```
コンテナを削除する
```terminal:
docker rm <任意のコンテナ名>
```

## おわりに
nginxってエンジンエックスって読みにくいっくす。
AWSのLIGHTSAIL(WordPress)にHTTPS設定をするだけの話

AWSのLIGHTSAILにSSL設定をします。
route56を使ってSSL証明書を発行して、というのではなく、Let'sEncyptを使用した簡単なコマンドだけで実装できる方法です。

## 前提条件
* ドメインのネームサーバを「お名前.com」のような外部サービスを使用している
* ドメイン設定済み
* LightSailのWordPressインスタンスを使用している

1. SSHでサーバログイン
2. bncert-toolを実行する
3. ウェブサイトで HTTPS を使用しているかどうかをテスト

## 1. SSHでサーバログイン

```
ssh -i ~/.ssh/{LightSailのSSHキー名}.pem  bitnami@{LightSailのIPアドレス}
```
サーバにログインする

## 2. bncert-toolを実行する

下記コマンドでbncert-toolを実行します
WordPressインスタンスには初期でインストールされている

```
sudo /opt/bitnami/bncert-tool
```
下記、質問されるので回答する
### 項目
1.Domain List　
ドメインリストを聞かれるので、設定しているドメインを記述（複数ある場合はスペース区切り）

2.Enable HTTP to HTTPS redirection [Y/n]
HTTP から HTTPS へのリダイレクトを有効にするかどうか聞かれているので、通常は「Y」になります

3.Enable non-www to www redirection [Y/n]
www なしから www ありへのリダイレクトの有効化するかを聞かれています。www有無で判断してください

4.Enable www to non-www redirection [Y/n]
www ありから www なしへのリダイレクトを有効にするかを聞かれています。www有無で判断してください

5.　これから実行される処理が表示されます
上記回答の内容通りかを確認して、問題なければ　Y と回答しましょう

6.　E-mail address
Let's Encrypt 証明書に関連付けるメールアドレスを入力し、Enter を押します。

7.Do you agree to the Let's Encrypt Subscriber Agreement? [Y/n]
Let's Encrypt サブスクライバー合意書を確認します。Y と入力し、Enter を押して契約に同意し、続行します。

設定終了です
bncert ツールは、有効期限が切れる前、 80 日ごとに証明書の自動更新を実行します。インスタンスで追加のドメインやサブドメインを使用し、それらのドメインで HTTPS を有効にする場合は、上記のステップを繰り返します。


## 3.ウェブサイトで HTTPS を使用しているかどうかをテスト

設定したURLに行き、URL欄の左にあるマークをクリックし、「この接続は保護されています」→「証明書は有効です」をクリックする
下記が表示されれば、SSL設定完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398694/5cd46a8f-f301-f2ec-2f40-94c6efba09cd.png)

簡単にサイトのSSL化ができましたね！

### 参考にしたサイト
* [Amazon Lightsail の WordPress インスタンスで HTTPS を有効化する](https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/amazon-lightsail-enabling-https-on-wordpress?trk=d7920dcb-23ef-4a3f-9619-088dfdc45d2e&sc_channel=ta#https-wordpress-enable)
自然言語処理における埋め込み技術：Word2VecとTF-IDFについて紹介します

先月、KaggleのLLMコンペ（Detect AI Generated Text）で新しい埋め込み（embedding）手法を学びました。（私にとっては新しい発見ですが、技術自体はそれほど新しものではないです）embeddingに対しての理解度が深めたと思いますので、共有したいと思います。

まず埋め込み（embedding）とは何かというと、自然言語処理のタスクでは、コンピュータが人間の言語を直接理解することとはできません。そのため、言語を数字リスト（ベクトル）に変換し、それをコンピュータに伝える必要があります。この変換プロセスは「埋め込み」と呼ばれます。

そこで最も一般的な埋め込み手法は、「Word2Vec」に基づいたembeddingモデルのトレーニングです。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/87401832-59ac-c065-3ef6-2ad19b2c5a0a.png)

Word2Vecには、CBOW（Continuous Bag of Words）とSkip-Gramの2つのアーキテクチャが存在します。CBOWは周囲の単語を基にして目的の単語を予測する手法で、Skip-Gramはその逆で、ある単語から周囲の単語を予測します。
どちらでもモデルが単語間の意味関係を学習し（意味解析）、意味的に類似した単語がベクトル空間内で近い位置に配置されるようにすることができます、一般的には両方とも試して、精度の高い方を採用します。（ちなみに、近い意味を持つ単語をベクトル空間内で近接させるため、embedding後コサイン類似度などを計算することで、RAGのようなベクトル検索を実現することができます。）

今回のコンペ学んだもう一つの埋め込み手法は、TF-IDFです。TF-IDFは数年前からあって、自然言語処理において単語の重要性を定量化するための指標です。この指標は各単語ごとに計算し、得られた数値のリストをベクトルとして表現します。



TF-IDFは、TF（Term Frequency）とIDF（Inverse Document Frequency）の二つの要素の積で算出されます。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/1f6067e5-2f0f-9929-64ea-3089b6787670.png)

TFは「1つの文書に対して、1つの単語がどれだけの割合で出現したか」を定量化した指標です。単語が文書中に現れる回数が多ければ多いほど、その単語は重要だと考えられます。
例えば、「私のiPhone」という文書を「私」「の」「iPhone」という単語に分けた場合、「iPhone」のTFは1/3となります。

一方、IDFは「ある単語が出現した文書が全体の文書集合中でどれだけの割合を占めているか」を定量化した指標です。一般的な単語（例えば「私」「の」「だから」など）は多くの文書で出現するため、重要度が低いとみなされます。
例えば、「私のスマホ」「彼のスマホ」「私のスマホはiPhone」という3つの文書において、「iPhone」という単語が現れる文書は1つだけなので、IDFはlog3≒1.09と計算されます。

最終的に、TFとIDFを乗算することで、「iPhone」のTF-IDF値を1/3×1.0986≒0.36として算出します。同様に、「私」と「の」のTF-IDF値も計算し、これらの値を組み合わせて数字リストにすることで、「私のiPhone」という文書のベクトルを作成することができます。

興味ある方:

Word2vec:

https://www.tensorflow.org/text/tutorials/word2vec

tf-idf:

https://atmarkit.itmedia.co.jp/ait/articles/2112/23/news028.html#:~:text=%E7%94%A8%E8%AA%9E%E3%80%8Ctf%2Didf%E3%80%8D%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6,%E3%81%AB%E4%BD%BF%E3%82%8F%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82
Socks5でホスト名の名前解決を手元の/etc/hostsでする

# 背景
Webサーバーの移設でWebサーバーのIPアドレスが変わるような場合に、移設先のサーバーへのアクセス元IPアドレスがオフィスなどに限定されていてSocks5経由になる、かつDNSにはまだ**移設前**のIPアドレスが登録された状態で、移設先にブラウザからアクセスする方法。
移設前の動作確認のために必要になりました。

# 問題
手元のマシンの /etc/hosts に移設先のIPアドレスでホスト名（FQDN）を書いて、Chromeなどのブラウザでそのホスト名でアクセスしても、Socks5経由の場合はSocks5のサーバー側で名前解決がなされるので、有効になりません。また、IPアドレス直打ちだとサーバーの証明書と違ってしまいます。
Socks5サーバーの /etc/hosts に書くしかないかと思ってましたが、別の解決策がありました。

# 結論
Firefoxで Network.proxy.socks_remote_dns を false にしましょう。
アドレスバーから about:config で設定できます。
残念ながら、Chrome には同様の機能はないようです。

# 参考
http://kb.mozillazine.org/Network.proxy.socks_remote_dns
https://stackoverflow.com/questions/17185570/why-my-script-follows-etc-hosts-but-the-browsers-do-not-when-there-is-a-socks
IntelのIntrinsic関数をmilk-V Duoにポートするためのテストフレームワークを作る(1)

この記事では、IntelのIntrinsic関数をmilk-V Duoにポートするためのテストフレームワークを作ります。

今回は

`__m256d _mm256_add_pd (__m256d a, __m256d b)`

のIntel Intrinsic関数をmilk-Vにポートします。以下のドキュメントを参考にします。

https://openpowerfoundation.org/specifications/vectorintrinsicportingguide/

上のIntel Intrinsic関数をOpenPOWERにポートしたソースコードが以下のようになります。

# ソースコード(1)
```c
typedef double __m256d __attribute__ ((__vector_size__ (32), __may_alias__));
extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__,
__artificial__))
_mm256_add_pd (__m256d __A, __m256d __B)
{
    return (__m256d) ((__v4df)__A + (__v4df)__B);
}
```

このポートしたコードはRISC-Vでも使えると思います。

milk-V Duoのセットアップ方法は以下のリンク。

https://qiita.com/nanbuwks/items/2e704af9ea7d64480321

テストフレームワークは、ソースコード(1)の、Intel側のIntrinsic関数に__Aと__Bにランダムに生成した値を入力し、RISC-V側の__Aと__BにIntel側と同じ値を入力し、帰ってきた値が同じであることを確認します。このようにして、ポートしたソースコードが正確であることを担保します。

milk-V DuoでC言語を実行する方法は以下のリンク

https://github.com/milkv-duo/duo-examples

まずは、`__m256d`の値をランダムに生成するモジュールを作成する必要があります。 

https://kawa0810.hateblo.jp/entry/20120304/1330852197

このサイトを参照すれば、`__m256d`の値を生成するには、`_mm256_set_ps(float, float, float, float, float, float, float, float)` のIntrinsic関数を使用する必要があるようです。
ただし、ランダムに生成した値をネットワークに乗せて伝達する必要があるため、テキストなどに変換するモジュールなども作る必要があります。
また、テストフレームワークで使うネットワークモジュールはRISC-Vなどでも使える必要があります。よって、C言語がいいかもしれません。ソケットプログラミングでいけるでしょう。
使うネットワークはセキュリティ上の理由から有線LANがいいでしょう。
UDPとTCPどちらを使うかは悩みどころです。
ネットワークトポロジは以下のようになります。

```
     +-------+     +---------------+      +-----------+
     | Intel |-----|Central Server |------|  RISC-V   |
     +-------+     +---------------+      +-----------|
```
Central serverは今の所Intelになりそうです。Intrinsic関数を実行するIntelとは分離する必要がないように思えます。今のところはIntelとセントラルサーバは同じマシンの中でもいいかもしれません。ただ、アプリケーション的には分離したほうがいいでしょう。RISC-Vも、エミュレーションなどを使ってもいいかもしれません。

https://github.com/um4ng-tiw/Peer-to-Peer-Socket-C/tree/main
上のプログラムを参考に作ります。
FirebaseでCDしようとするとbase64: invalid inputで失敗する

# はじめに

Next.jsをGithub ActionsでCDしようとしたときにつまづいたのでまとめます

# 問題

以下のアクションでエラーがでました

```yml
          echo "${{ secrets.FIREBASE_KEY }}" | base64 -d > ./firebase-key.json
```

エラーは

```
base64: invalid input
Error: Process completed with exit code 1.
```

FIREBASE_KEYはBasr64にエンコードした鍵です

# 解決方法

鍵のコピーが誤っていました

```
hogehogegegegejdklajfadsjf
　//ここに1行空行が必要
```

手でコピーしていたため最後の空行を含めずにGithubのシークレットに登録していました

以下のコマンドでクリップボードにコピーしたことから気づきました

```bash
$ base64 account-auth.json | xsel --clipboard --input
```

# おわりに

まだ沼っているところがあるのでこれから解決してハンズオン記事にしたいなとかんがえています
VScodeでPythonスクリプトにreportMissingModuleSourceという警告が表示されるときの対処

## 背景

![スクリーンショット 2024-02-04 10.51.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1548368/d03cf20f-a6a6-55c9-3fe9-965d61bb8c70.png)

黄色い波線のような表示を消したい。
openpyxlはインストール済みだし、実際に本スクリプトをエラーなく実行可能なのでvscode側の設定に問題があると見込んだ。

### 環境

* MacOS 14.2.1

## 状況把握と解決

ガッツリ個人開発をする人間ではないので「とりあえずPythonが実行できれば良い」という感じだった。
そのため、macのデフォルトのバージョンで実行しているのかcondaで用意した仮想環境のどれかで実行しているのかを気にしていなかった。

今回、警告されたopenpyxlはbaseという名前の仮想環境内でインストールしたモジュールだった。
そのため以下のように

コマンドパレット -> Python: selecet interpreter -> base を選択

![スクリーンショット 2024-02-04 11.05.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1548368/fc1aa02e-bd75-c0a5-9cdf-15effb250d94.png)

上のスクショだと現在インタープリターはデフォルトのものが選択されている（星マーク）。
今回は、baseを選択すれば、黄色い波線の警告は消える。

## まとめ

VScodeでインストール済みのモジュールをインポートしているのに警告が表示されるときは、選択中のインタープリターを見直してみること。
想定したインタープリターが選択されていない場合、任意のものに選択し直すこと。
以上。
辞書データの順序

https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_dictionary_step3

最初、辞書から辞書のデータを表示できるかと思ってたら
なかなかできなかったのでメモ。
下記のようにしたらできるように。
1つの辞書だけで動かそうと思うんではなく、
別のリストから操作できるようにすることもできるということを学びました。

```py
n = int(input())
Data = {}
for _ in range(n):
    [a,b] = input(),0
    Data[a] = b

m = int (input())

for _ in range(m):
    [a,b] = input().split()
    Data[a] += int(b)

#ここからnameだけのリストを別に作る
names = list(Data.keys())
names.sort()

#そのリストに合わせて値を表示させる
for name in names:
    print(Data[name])
```
マルハラを防ぐために今日からできること

どうも、最近[HonoにJSDocを追加するPR](https://github.com/honojs/hono/pull/1916)がマージされてウキウキな人です。
この記事では、最近話題になっている「マルハラ」の解説・防ぎ方を紹介していきます。
職場の居心地の向上にもつながるかもしれません。

## マルハラは身近なところで起きている
```ts:maruhara.ts
export function fizzBuzz(number: number) {
  let message: string;
  if (number % 15 === 0) {
    message = "FizzBuzz";
  } else if (number % 3 === 0) {
    message = "Fizz";
  } else if (number % 5 === 0) {
    message = "Buzz";
  } else {
    message = number.toString();
  }
  return message;
}
```
このコードの問題点は、行の最後に `;`(~~句点~~) を使っていることです。
これにより、書いた人が怒っていると受け取られることがあります。
そのため、このコードを読む他の人にとって小さなストレスを生んだり、周りとの人間関係や職場の雰囲気が悪くなる原因になるかもしれません。
また、`"`(ダブルクォート) も堅苦しく思われることがあるので気をつけてください。


## 対策: フォーマッターを使う
フォーマッターを導入します。
今流行りのBiomeを使います。
```shell
pnpm add --save-dev --save-exact @biomejs/biome
pnpm dlx @biomejs/biome init
```
生成された`biome.json`に追記します。
```json-doc:biome.json
{
  //...
  "javascript": {
    "formatter": {
      //セミコロンをできる限り省く
      "semicolons": "asNeeded",
      //シングルクォートを使う
      "quoteStyle": "single",
      "jsxQuoteStyle": "single"
    }
  }
}
 ```
 さっきのコードをフォーマットします。
 ```shell
 biome format ./index.ts --write
 ```
 ```ts:index.ts
 export function fizzBuzz(number: number) {
	let message: string
	if (number % 15 === 0) {
		message = 'FizzBuzz'
	} else if (number % 3 === 0) {
		message = 'Fizz'
	} else if (number % 5 === 0) {
		message = 'Buzz'
	} else {
     message = number.toString();
    }
	return message
}
 ```
ストレスフリーなコードでマルハラを防ぐことができました🥳
 これで、職場の雰囲気は明るくなり、周りとの人間関係もより良くなるはずです。

 
:::note warn
この記事はジョークです。
プロジェクトごとに合った方法を採用してください。
:::

## 元ネタ
https://www.oricon.co.jp/news/2312695/

最後まで読んでいただきありがとうございました。
[Typescript] solanaのアカウント作成(テストネット) + フォーセット

# はじめに
今回はSOL(solana)！！
最近、物凄く上がってきていて、日本の中でもsolanaに関する文献も増えてきたな〜とおもっているところです。solanaに思い入れはないんですが、今回は、ちょっとテストネットでいろいろ試してみたいなと思い、書いてみました。実際に、メインネットでも自分はPhantomウォレットを通じてステーキングまでしているのですが、開発レベルで試したのことないので、これを機にやってみようかと思って始めました〜


## solanaの概要

https://solana.com/ja

https://diamond.jp/crypto/market/sol/

何かいろいろ書いてあるので、読んでください。あとqiitaでも書いている人たちいるのでぜひ〜


# node package

npmの場合:
```
$ npm install @solana/web3.js
```

yarnの場合: 
```
$ yarn add @solana/web3.js
```

nodeのバージョンでインストールできないよ！って言われることがあるかもしれないので、バージョンは合わせておいてください！


# 実装

## 何をするのか

1. `Keypair.generate()`: アカウントの作成（公開鍵, 秘密鍵ができる）
1. `requestAirdrop()`: フォーセットリクエスト
1. `confirmTransaction()`: トランザクションの確認
1. `getBalance()`: 残高の取得

**※ 何回もフォーセットのリクエストをしていると上限がきます。**

その時には以下のようなものが出てきます。serverなのかな？と思わず、上限が来たんだな〜と思ってください。ちなみに、違う場面では本当にtoo many requestの時もあります笑

```
Server responded with 429 Too Many Requests.  Retrying after 500ms delay...
```


## コードを書いてみた〜

```typescript
import {Keypair, Connection, clusterApiUrl, LAMPORTS_PER_SOL, PublicKey} from "@solana/web3.js";

async function createAddress(network: Connection) {
    // アドレスの情報の格納先を設定（初期化）
    // アカウント情報を格納するためのインターフェース
    interface AccountInfo {
        publicKey: string;
        secretKey: string;
        balance: number;
    }
    const accountInfo: Array<AccountInfo> = [];
    
    // 新しいウォレット(キーペア)を生成
    const account = await Keypair.generate();
    
    // フォーセットの受け取り
    const airdrop = await network.requestAirdrop(
        account.publicKey,
        LAMPORTS_PER_SOL, // 1 SOLをリクエスト(max)
    );
    
      // トランザクションの確認
    await network.confirmTransaction(airdrop);
    
    // 残高を取得
    const balance = await network.getBalance(account.publicKey);
    
    // アカウント情報としてプッシュ
    await accountInfo.push({
        publicKey: account.publicKey.toBase58(), 
        secretKey: account.secretKey.toString(),
        balance: balance
    });
    
    console.log(accountInfo);
}


function main() {
    // ネットワークの設定（テストネット）
    const network = new Connection(clusterApiUrl('testnet'), 'confirmed');
    // アカウント作成の実行
    createAddress(network);
}

main();
```

無駄にインターフェースやらなんやら使ってますが、それぞれ`console.log`で出せばいいです！（ts初心者なので、ちょっと配列やらインターフェースの勉強がてら、書いてみただけなので、そこは目を瞑ってください笑）

今回はここまで！
WEBサイト確認用にブラウザを複数ひらく

# はじめに
わたしは各デバイスでの表示を確認しながら制作をするタイプなのですが毎回ブラウザを３つくらい開いてそれぞれipad iPhone ・・・という感じでデベロッパーツールを設定しているわけです。
それ地味に面倒な作業だなとおもってシェルで起動できないかなと思い立った感じです。
まだ途中でブラウザで特定の位置に開くといった感じになってます。

# Apple Script
ながれとしては、
Google chromeをアクティブにして　http://xxxxx.test をひらく
これを３回繰り返し
１番目のウィンドウをAへ配置、
2番目のウィンドウをBへ配置、
3番目のウィンドウをCへ配置って感じに指定しました。

配置する位置については同じようにapple scriptで調べました。
一番上のChromeの配置が取得できると思います。

URLは引数で渡す・・・のような感じになればなおよいのですかね。

```shell
osascript -e 'tell application "System Events" to get properties of first window of application process "Google Chrome"' | tr ":" "\n" | grep -A 1 -e position -e size

# missing value, position
# 3282, 271, class
# --
#  - Google Chrome, size
# 557, 873, help
```

```
tell application "Google Chrome"
activate
repeat 3 times
open location "http://xxxxx.test"
set bounds of front window to {1, 1, 500, 900}
end repeat
end tell
delay .5
tell application "System Events" to tell process "Google Chrome"
tell front window
set size to {500, 900}
set position to {3840, 496}
end tell
tell second window
set size to {500, 900}
set position to {3265, 491}
end tell
tell third window
set size to {500, 900}
set position to {3844, -596}
end tell
end tell
```


スクリプトエディタよくわからないのでShell から操作することにしました。

Apple Script は osascript を使って実行できるようです。
コマンドを browser_open.sh などのファイルを作成して配置します。
これを　sh browser_open.sh で実行することでブラウザを開けるはず。
ただ毎度　そんなファイル名やディレクトリを覚えていられないので alias で実行させます。

```shell
osascript \
-e "tell application \"Google Chrome\"" \
-e "activate" \
-e "repeat 3 times" \
-e "make new window" \
-e "open location \"http://xxxxx.test\"" \
-e "set bounds of front window to {1, 1, 500, 900}" \
-e "end repeat" \
-e "end tell" \
-e "delay .5" \
-e "tell application \"System Events\" to tell process \"Google Chrome\"" \
-e "tell front window" \
-e "set size to {500, 900}" \
-e "set position to {3840, 496}" \
-e "end tell" \
-e "tell second window" \
-e "set size to {500, 900}" \
-e "set position to {3265, 491}" \
-e "end tell" \
-e "tell third window" \
-e "set size to {500, 900}" \
-e "set position to {3844, -596}" \
-e "end tell" \
-e "end tell"
```

.bash_profile に実行コマンドを記述して .bash_profile を読み直します。ちなみにこれも面倒なので sb という感じで実行できるようにしています。

openb でブラウザが定位置に表示されました。たぶん。

```.bash_profile
alias openb='sh ~/xxxx/browser_open.sh'
# sbで .bash_profile を読み直す場合
alias sb='source ~/.bash_profile'
```

```shell
source ~/.bash_profile
```

本当はデベロッパーツールも併せて起動したいとおもっているのでわかる方コメントやヒントをくださると助かります。

# 追記
ちょっと思いついたんですが自宅や会社でアプリの配置が違っているので（ディスプレイが自宅３枚、会社２枚といった感じで）ワークスペースを　Apple Scriptで自宅配置、会社配置みたいにできれば楽そうですね！　そのような機能があるか調べてもいないのであったらはずいですが・・
あ、ノート移動させて使っていたんです。
 
## 参考
https://genzouw.com/entry/2021/08/29/081919/2762/
https://abhp.net/it/IT_Google_Chrome_950000.html
https://ickx.hatenablog.com/entry/2020/09/22/021135
https://dev.classmethod.jp/articles/mac-app-resize/
https://webwork-plus.com/content/batch/batch-chrome-ps.html
LaTeX Workshop のウザい warning ポップアップを消す

# トラブル概要
複数回コンパイルする必要がある $\LaTeX$ ソースを組んで、 VS Code でビルドが走ると、毎回以下のような warning ポップアップが出てきてウザい。特に、保存時に自動でビルドを走らせるようにしておくと、保存するたびにポップアップが出て一瞬「要対応か？」と作業の手が止まる。

`⚠️ Recipe terminated with error. Retry building the project.` [[1](参考)]

VS Code 上で自動的にビルドを再試行するように設定できるし, そうしているのでこの警告は無価値である。消してしまいたい。

# 対処法
```settings.json
  "latex-workshop.message.warning.show": false
```
これを加えると warning のポップアップが出なくなる。

もし、 error のポップアップも消したければ、以下の設定も追加する。

```settings.json
  "latex-workshop.message.error.show": false
```
ただし、 error は早急に対処したほうが良いと思うので、 error のポップアップは表示させておいても良いと思う。


# 参考
[1] @Yarakashi_Kikohshi 「エラーと警告を読むゾ」
https://qiita.com/Yarakashi_Kikohshi/items/4ede21b06d094ad3b89e
PythonでGUIをつくる-pyvistaで3D表示

# pyvistaのplotterをpyqtのウィンドウに埋め込む

pyvistaqtを使ってpyqtのwidgetとして扱える。
BackgroundPlotter().interactorがwidget。

```python
from pyvistaqt import BackgroundPlotter

self.plotter = BackgroundPlotter()
self.plotter.setWindowTitle('3D Visualization')
self.plotter.add_mesh(pv.Sphere()) 
self.pyvistaWidget = self.plotter.interactor
```

pyqtのwidgetとして扱えるので、他のwidgetと並べて表示できる。

![スクリーンショット 2024-02-04 10.03.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/74e5760f-a067-6272-ad80-9aa874e37839.png)

```python
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QHBoxLayout
from PyQt5.QtGui import QPixmap
from pyvistaqt import BackgroundPlotter
import pyvista as pv

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        
        # レイアウトの設定
        layout = QHBoxLayout()
        
        # 画像ウィジェットの設定
        self.image_label = QLabel()
        self.pixmap = QPixmap("myPhoto.jpg")
        self.scaledPixmap = self.pixmap.scaled(self.image_label.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation)

        self.image_label.setPixmap(self.scaledPixmap)  # 画像のパスを設定
        layout.addWidget(self.image_label)
        
        # PyVistaQtのBackgroundPlotter設定
        self.plotter = BackgroundPlotter()
        self.plotter.setWindowTitle('3D Visualization')
        self.plotter.add_mesh(pv.Sphere())  # 球を追加
        self.pyvistaWidget = self.plotter.interactor
        # PyVistaウィジェットをレイアウトに追加
        layout.addWidget(self.pyvistaWidget)
        
        # メインウィンドウにレイアウトを設定
        self.setLayout(layout)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
```

🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[X](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
pictの使い方

## はじめに
2因子網羅によるテストケースを生成するCLIツール「pict」の導入方法、使い方、便利な使い方をまとめる。

## 環境
macOS Sonoma 14.3
Homebrew 4.2.6
pict 3.7.4

## 導入
Homebrewを使えば一瞬で導入できる

```shell
brew install pict
```

## 使い方
因子と水準をまとめたモデルファイルを作成し、それをpictコマンドに渡すことで具体的なテストケースを作成する。

まず、以下のような形でモデルファイルを作成する。

```text:model.txt
<因子A>: <水準1>, <水準2>, <水準3>
```

作成したモデルファイルをpictに渡す。

```shell
pict model.txt
```

これだけで、2因子網羅したテストケースを作ってくれる。

## 便利な使い方
非常に便利なpictであるが、出力結果があまり美しくない。そこで、出力結果をソートするために、pictの出力をパイプを使ってsortに渡す。ただし、sortコマンドは出力結果の全てを1行ごとに並び替えてしまうので、因子名を示すヘッダーも一緒に並び替えてしまう。この点を除けば、出力結果が非常に見やすく、整理しやすいものになる。

```shell
pict model.txt | sort
```

また、テストケースが何通りできるのか、具体的な数値が知りたいという場合もあるだろう。その際、出力を1行ずつ数えるのは非現実的である。そこで、`/s`オプションを使う。

```shell
pict model.txt /s
```

`Generated tests`として表示される数値が、生成された2因子網羅のテストケース数である。その上には`Combinations`として表示される数値があるが、これが何を意味しているのか不明である。少なくとも、全網羅した時のテストケース数ではない。

## 終わりに
いくつか謎のまま放置している部分がある。ヘッダーをそのままにソートする簡単なやり方や、`Combinations`の意味が判明すれば追記・修正を行う。
パッケージ管理ライブラリryeつかってみた

## 背景
Kaggleのコンペで勉強をさせてもらうことが多く、解法はもちろんなのだが使っているライブラリや技術を知る→使うきっかけになって非常にありがたい。
今回はその一つであるryeについて使ってまとめていきたいお気持ちとなりました。

## 対象者
- 環境構築でよく引っ掛かり難民になるかた（私）

## 概要
基本的にはryeのInstallationに沿って進めていきます
[Installation - Rye](https://rye-up.com/guide/installation/)

## 前提
- Linux環境

## 実践
Windows環境で使用しているVSCodeではデフォルトターミナルがPowerShellになっています。
好みあるかもしれませんが今回はbashに変更してしまいます。
変更方法は以下をご参照下さい。
[VSCodeのデフォルトターミナルを変更する方法](https://zenn.dev/unsoluble_sugar/articles/362a17a7f57020)

### 初期設定
ターミナルにてインストールを実行するために以下コマンドをcurlで実行します。
```bash
curl -sSf https://rye-up.com/get | bash
```
そうすると以下のようなアウトプットが出るため、”y”で進みます
その後All done!が出力されるとインストール完了です
```bash
This script will automatically download and install rye (latest) for you.
######################################################################## 100.0%
Welcome to Rye!

This installer will install rye to /home/eikichi/.rye
This path can be changed by exporting the RYE_HOME environment variable.

Details:
  Rye Version: 0.17.0
  Platform: linux (x86_64)

Continue? [y/n]
```
　
このままryeコマンドを打っても `bash: rye: command not found`が出力されて使用できません。起動するパスが通ってないからなので以下コマンドで通りします。

```bash
echo 'source "$HOME/.rye/env"' >> ~/.bashrc
source ~/.bashrc
```

1行目でbashrcファイルにパスが記録され、2行目で記録されたパスが通るようにしています。
そうすることでryeが実行できるようになります。
確認のために`rye`だけ実行して出力がでればパス設定完了です。

### 基本操作

準備が完了したのでプロジェクトの作成、pythonバージョン、パッケージの設定を加えていきます。

プロジェクトの作成は以下コマンドを実行します。

```bash
rye init my-project
cd my-project
```

2行目は作成したディレクトリに移動するコマンドです。
そうすることで以下の構成のディレクトリが作成されてればOKです。

```bash
.
├── .git
├── .gitignore
├── .python-version
├── README.md
├── pyproject.toml
└── src
    └── my_project
        └── __init__.py
```

次に本環境のpythonのバージョンの設定していきます。例えばPython 3.10の最新版を指定する場合は以下コマンドを実行します。

```bash
rye pin 3.10
```

これだけで完了。
そうすることでカレントディレクトリに”.python-version”が更新されます。そこを開くと設定したpythonバージョンが記録されています。メジャーバージョンまでを実行するとryeで管理されているその最新のマイナーバージョンが自動的に選定されているようです。

続いてパッケージです。パッケージは以下コマンドのように追加していきます。

```bash
rye add polars
```

そうすることで”pyproject.toml”のdependenciesにpolarsが追加されます。
このように必要なパッケージを`rye add {パッケージ}`で追加していきます。

準備が完了したら今まで設定してきた設定をもとに仮想環境を作成します。
以下コマンドを実行します。

```bash
rye sync
```

そうすることで”.python-version”, “pyproject.toml”の設定を基に.venvが作成されます
※10分ほど完了に時間がかかりました。

## まとめ
ryeでの仮想環境作りについて紹介しました。
環境設定周りが苦手な私にとっては、pythonバージョンもパッケージも一つのツールで管理が簡単にできてすごく便利。今まではpyenv+poetryでしたが卒業となりそうです。
モバイルモニターを電池で駆動したい

# モバイルモニターを電池で駆動したい

ラズパイと一緒に使っているモバイルモニターがあります。これを電池で駆動したいです。
ちなみにキーボード一体型のラズパイです。以下のようにすることとしました。

### 指針

- 18650電池で給電することとし、既成品のモバイルバッテリーなどつかわないようにする
- あまりにも多いと管理がむずかしくなるので 電池は２本まで
- 汎用性について追い求めず、モニター給電専用となってもかまわないとする

### 発生した問題

昇圧型のコンバーターを購入し、18650電池一本を5ボルトに
昇圧して、モバイルモニターにつないでみたけど、おそらく
電流不足でした。モニターの画面が一瞬だけONとなるが、オンオフ繰り返します。

### 電池２本で駆動する？

降圧型でしかも出力側にUSB端子があるものってQC対応型の
ものになり、入力範囲が8ボルト以上になります。
そうなると18650が3本必要となり、現実的ではないです。


降圧型だけどUSBが出力側についてないタイプがあります。
こちらであれば、入力範囲が広いので、18650電池2本でも大丈夫でしょう。
ただUSB端子がないので、モニターへの接続が大変です。

### 降圧してから昇圧？

それとこの昇圧型のコンバーター（単なるUSB端子がわり）を組み合わせるという
のをためしてみようとおもいました。

これだと昇圧回路を通過することでかなり電流が制限されるという
至極あたりまえのことに気づきました。モニターが必要な電流が、おそらく得られません。

### 降圧したら直結？

もしかして直接モニターにつなげばいいと気づきました。
電池 → 降圧回路 → USBケーブル → モニター

むかし購入したUSB端子付きの充電池についてきたUSBケーブルが
あるのでこれを分解しようと思います。ご丁寧に‐Cが２分岐となってので
途中で切っても、残り部分もUSBケーブルとして使えるのです。

### どちらがプラスでどちらがマイナスか？

USB‐Cのケーブルをちょんぎって分解してみると、
赤黒緑ホワイトという４色がでてきたです。あとシールドの網。

https://oyaideshop.blogspot.com/2021/10/diyusb-c-usb20.html

このブログによると、

```
V(+5V)　→赤  :G(GND)　→黒
※表・裏の「V」「G」は繋がっています。
```

とのことです!

どっちの向きでもOKな理由は USBコネクタ部分にあるのですか。
ペアペアで合計４本つなぐのかとおもっていたがそうじゃないのですね。
（　＾ω＾）・・・／

では赤色と黒色をそれぞれプラスとマイナスにつないでみました。

ちかくに充電式ブルートゥースイヤホンあったので、接続したら反応がありました！！
どちらの向きにしても反応があるのは、‐Cのコネクターに秘密があるのですね。

### モニターに給電テストの結果

いまのところうまくいくてます。長時間運用ができるかどうか？それがきになります。
降圧回路にポテンショついている。なので、それをぐるぐるすればながい時間でもたもつように信じます