OmniAICreator/Qiita-1.07M huggingface dataset:
ubuntu 24.04 LTSで自宅サーバー構築（PHP + PHP-FPMの設定）

<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
PHP-FPMの設定の前に
https://qiita.com/sqoot610/items/4400eda5416184c78d75
を設定してください。
taisuke@ubuntuserver:~$ sudo apt -y install php8.3-fpm
taisuke@ubuntuserver:~$ sudo a2enmod proxy_fcgi setenvif
Considering dependency proxy for proxy_fcgi:
Enabling module proxy.
Enabling module proxy_fcgi.
Module setenvif already enabled
To activate the new configuration, you need to run:
  systemctl restart apache2
taisuke@ubuntuserver:~$ sudo a2enconf php8.3-fpm
Enabling conf php8.3-fpm.
To activate the new configuration, you need to run:
  systemctl reload apache2
taisuke@ubuntuserver:~$ sudo systemctl restart php8.3-fpm apache2
taisuke@ubuntuserver:~$ sudo echo '<?php phpinfo(); ?>' > /var/www/html/info.php
<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
Javaで「複数の文字列のいずれかにマッチするパターンを記述する」の動作を確認してみた

# 概要

Javaで「複数の文字列のいずれかにマッチするパターンを記述する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/regex/index12.html

# 実装

以下のファイルを作成しました。
```JSample12_1.java
import java.util.regex.*;

class JSample12_1{
  public static void main(String[] args){
    String regex = "blue|Blue";
    Pattern p = Pattern.compile(regex);

    Matcher m1 = p.matcher("My favorite color is blue");
    System.out.println(m1.find());  // true

    Matcher m2 = p.matcher("bluebird weather");
    System.out.println(m2.find());  // true

    Matcher m3 = p.matcher("Cobalt BLUE");
    System.out.println(m3.find());  // false
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample12_1.java 
$ java JSample12_1 
true
true
false
```

# まとめ

何かの役に立てばと。
ReactNativeを使ってAndroidアプリをADVで起動するまで（Windowsで）



ChatGptに聞いた答えをまとめます。

### １．Node.js: React NativeはNode.jsを使用するため、Node.jsをインストールします。
インストール後、node -vでバージョンを確認してください。

### ２． Android Studioをインストール
https://nodejs.org/en

### ３．JDKのインストール
[AdoptOpenJDK](https://adoptium.net/)からJDKのインストーラーをダウンロードします。
実行すると次のディレクトリにインストールされます。

C:\Program Files\Eclipse Adoptium\jdk-21.0.4.7-hotspot

### ４．上のディレクトリをシステム環境変数に追加します。
変数名はJAVA_HOMEです。

### ５．システム環境変数のPathに次を追加
%JAVA_HOME%\bin

### ６．システム環境変数次を追加します。
変数名：ANDROID_HOME
変数値：C:\Users\(ユーザー名)\AppData\Local\Android\Sdk

### ７．システム環境変数のPathに次を追加します。
%ANDROID_HOME%\tools
%ANDROID_HOME%\platform-tools

### ８.プロジェクトの作成
```
npx react-native init MyApp
```
### ９．ディレクトリの移動
```
cd MyApp
```
### １０．ADVで起動
```
npx react-native run-android
```

![スクリーンショット 2024-08-12 110241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3859154/c9acfee8-a44a-d7bf-e4e8-640a037c97a0.png)


*.ADVで起動するところで環境変数が見つからないといったエラーが出たのでその都度ChatGptに聞きながら解決しました。
AtCoder Beginner Contest 128

## A - Apple Pie

https://atcoder.jp/contests/abc128/tasks/abc128_a

### 解説

- 林檎を林檎の欠片に変換してからアップルパイの数を計算する

### 実装例（C++）

```cpp
#include <iostream>
using namespace std;

int main() {
    int a, p;
    cin >> a >> p;

    int apple_piece = a * 3 + p;
    int num_apple_pi = apple_piece / 2;

    cout << num_apple_pi << endl;
}
```

## B - Guidebook

https://atcoder.jp/contests/abc128/tasks/abc128_b

### 解説

- sortを使う必要がある（→#include <algorithm>）
- tupleか構造体（struct）を使用する
- compareは市名が同じなら点数の降順、市名が違うなら指名の昇順

### 実装例（C++）

```cpp
#include <iostream>
#include <vector>
#include <tuple>
#include <algorithm>

using namespace std;

bool compare(tuple<string, int, int> a, tuple<string, int, int> b) {
    if (get<0>(a) == get<0>(b)) {
        return get<1>(a) > get<1>(b);
    } else {
        return get<0>(a) < get<0>(b);
    }
}

int main(){
    int N;
    cin >> N;

    vector<tuple<string, int, int>> restaurants(N);

    for (int i = 0; i < N; i++) {
        string city;
        int score;
        cin >> city >> score;
        restaurants[i] = make_tuple(city, score, i + 1);
    }

    sort(restaurants.begin(), restaurants.end(), compare);


    for (int i = 0; i < N; i++) {
        cout << get<2>(restaurants[i]) << endl;
    }

    return 0;
}
```

## C - Switches

https://atcoder.jp/contests/abc128/tasks/abc128_c

### 解説

- N<20なので全bit探索

### 実装例（C++）

``` cpp
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int N, M;
    cin >> N >> M;

    vector<int> k(M);
    vector<vector<int>> s(M, vector<int>(N));
    vector<int> p(M);

    for (int i = 0; i < M; i++) {
        cin >> k[i];
        for (int j = 0; j < k[i]; j++) {
            cin >> s[i][j];
        }
    }

    for (int i = 0; i < M; i++) {
        cin >> p[i];
    }

    int result = 0;
    for (int bit = 0; bit < (1 << N); bit++) {
        int count = 0;
        for (int i = 0; i < M; i++){
            int on = 0;
            for (int j = 0; j < k[i]; j++) {
                if (bit & (1 << (s[i][j] - 1))) {
                    on++;
                }
            }
            if (on % 2 == p[i]) {
                count++;
            }
        }
        if (count == M) {
            result++;
        }
    }
    cout << result << endl;
}
```
paiza.ioでc++

# 概要
paiza.ioでc++やってみた。
コンパイラ見つけたので、やってみた。

# 参考にしたページ

https://qiita.com/NokonoKotlin/items/52882a210915b3ecfa32


# 実行結果

```
<< << b is already used.
<<    >> 12195
<< <<    >> -40000
<< 



```

# 成果物

https://paiza.io/projects/rKux1DKAdoJrd5_GNZpiEQ

以上。
初投稿

# 自己紹介
初めまして、あたまと申します。
会社では、こじんまりとしたIT部門で
Webエンジニアとして日々奮闘しています！

# 保有スキル
### フロントエンド
- React.js
- Next.js
- TypeScript
- Redux

### バックエンド
##### 言語系
- Python(Django,FastAPI,バッチ処理系)

##### データベース
- SQLServer
- MongoDB
- InfluxDB

### インフラ
##### OS
- Windows
- Linux

##### ミドルウェア
- VMware
- Docker
- Nginx

ネットワーク知識も多少。。。

# さいごに
今回、投稿に至った経緯として
「新しいことをやると今までのことが忘れてしまう」といったことがあり
せっかくだから備忘録として残しておくか！という感じで始めました。
ほぼ独学で解釈して記述している場合もありますので、
もし内容に不備がありましたら、ご指摘いただければと思います！！
よろしくお願いいたします！
解いてみた。「Cランク：残り物の量」

# 問題
[「Cランク：残り物の量」](https://paiza.jp/works/mondai/c_rank_skillcheck_archive/leftover)

# コード
Javaで解いてみました。

``` Java
import java.util.*;
import java.text.DecimalFormat;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int nM = sc.nextInt();
        int nP = sc.nextInt();
        int nQ = sc.nextInt();
        
        double dRestP = (100 - nP) / 100.0;
        double dRestQ = (100 - nQ) / 100.0;
        
        double dRest = nM * dRestP * dRestQ;
        
        DecimalFormat dfm = new DecimalFormat("###.#####");
        System.out.println(dfm.format(dRest));
    }
}
```

# 解説
## 標準入力からの数値の読み取り
Scanner インスタンスを作り、nextInt()メソッドで数値を取得しています。
## 加工したお惣菜の量
nM(Kg)中、nP（%）が売れて、残りを惣菜にするので、その量は、
``` math
nM \times \frac{100 - nP}{100}
```
となります。ちなみに、プログラム中で**100.0**で割っているのは、**100で割ると整数除算となり、意図した値が取得できない**ためです。
## 売れ残った量
お惣菜のうち、nQ(%)が売れたので、残りの量は、
``` math
\left(nM \times \frac{100 - nP}{100}\right) \times \frac{100 - nQ}{100} 
```
となります。
## 数値のフォーマット
必要ないかもしれませんが、「_真値との誤差が0.0001未満である場合にのみ、正答とみなされます_」とあるので、小数第五位までの表示としています。
per24A-05: LINE Botを用いたプロトタイプの作成

作成理由：初心者よるデジタルスキルの学習
目的：PC技術ない全くの素人がLINEBOT・make・GoogleSheetを活用した簡単なBOTの作成することで　初歩のﾃﾞｼﾞﾀﾙリテラシーを向上させる。
作成物：スーパーに買物行った際　迷わず希望の売場いけるようにする。

作成手順　1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836617/9b019b4b-8585-de1f-2480-83b081a4e142.png)
作成手順2
[image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836617/9c24bc82-4765-2b50-d6de-bdff35b8a8e1.png)

　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836617/b42b82ea-0a29-bb1a-db0d-03ea257afb22.png)


 作成手順3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836617/0cc21325-94e8-e2ac-7144-7d6030f246ed.png)
作成完了確認
1.line　画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836617/f3a08e96-b707-970a-6056-848bf0275337.png)
Line動画
https://x.com/g5zKVX7GaKyzDxl
Xで動画を添付しています。
反省点
今回の作成の目的はとにかくLINEBOT　や　makeになれる事です。
今後　気象庁のデーターから市町村別の地震震度データー　をすぐでるよにLINEBOTを作るようにします。
【Salesforce認定アドミニストレータ試験】公式模擬試験の英日翻訳と図解解説 (7)

この試験を受けるための勉強をした際に思わぬ苦戦をしたので、英語公式模擬問題を翻訳しながら図解解説として整理しています。

第4回・5回・6回は「ケース」に関する問題と解説でした。今回（第7回）も「ケース」に関してであり、具体的には「ケース所有者へのケースコメント通知」です。

![スライド1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626902/0423c7fa-f6bb-67dc-d033-e77343a7b182.jpeg)
![スライド2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626902/bc5d2223-7473-2861-e733-f4ad6168956f.jpeg)

■ これまでの投稿

① 出題分野2：Object Manager & Lightning App Builder（オブジェクトマネージャとLightning アプリケーションビルダー）[出題率 20%]

　＜レコードタイプに関する問題＞

　　第1回の投稿　～レコードタイプと営業プロセスに関する問題～
　　https://qiita.com/Aungz/items/204d20c5c2c72a52c9df

　　第2回の投稿　～営業プロセスと選択リスト値に関する問題～
　　https://qiita.com/Aungz/items/5ecaa907ff6500924420

　　第3回の投稿 ～レコードタイプとページレイアウトに関する問題～
　　https://qiita.com/Aungz/items/37058a7e6cb4d59025c1

② 出題分野4：Service and Support Applications（サービス＆サポートアプリケーション）」[出題率 11%]

　＜ケースに関する問題＞

　　第4回の投稿 ～ケース割り当てルールに関する問題～
　　https://qiita.com/Aungz/items/f95c61038770a2445f93

　　第5回の投稿 ～ケース割り当てルールに関する問題～
　　https://qiita.com/Aungz/items/6cab00af3ca680d3cead

　　第6回の投稿 ～ケースエスカレーションに関する問題～ 
　　https://qiita.com/Aungz/items/842ce7c0f54fbbdec0ab

　　第7回の投稿 ～ケース所有者へのケースコメント通知～ （今回）
matplotlibを用いたグラフ描写にてTimes New Romanのフォントを利用する方法

# はじめに
OS、実行環境は以下の通りです。
```
Ubuntu 22.04
virtualenv + python 3.9
```
タイトルにあるように、matplotlibにてグラフを描写する際、グラフ内で用いる凡例や軸名にTimes New Romanを用いる方法を説明します。以下、自身の環境におけるデフォルトのフォントです。
```
>>>import matplotlib as plt
>>>plt.rcParams["font.family"]
['sans-serif']
```

# Times New Romanフォントのインストール
まず、システムにTimes New Romanフォントがインストールされていることを確認します。以下のコマンドを使用して、Microsoftのコアフォントをインストールします。
```
sudo apt update
sudo apt install ttf-mscorefonts-installer
```

# フォントファイルを仮想環境に設定
Times New Romanフォントファイル（Times_New_Roman.ttf）を仮想環境内のMatplotlibフォントディレクトリにコピー。なお、カレントディレクトリ内のenvに仮想環境があリます。pythonX.Xは仮想環境内のpythonバージョンを指定。
```
cp /usr/share/fonts/truetype/msttcorefonts/Times_New_Roman.ttf ./env/lib/pythonX.X/site-packages/matplotlib/mpl-data/fonts/ttf/
```
Matplotlibのフォントキャッシュをクリアします。
```
rm -rf ~/.cache/matplotlib
```
次に、Pythonコード内でフォントを設定。/home/muzzumuzu/src/envは仮想環境のパス。
pythonX.Xは仮想環境内のpythonバージョンを指定。
```
import matplotlib.pyplot as plt
from matplotlib import font_manager as fm
font_path = "/home/muzzumuzu/src/env/lib/pythonX.X/site-packages/matplotlib/mpl-data/fonts/ttf/Times_New_Roman.ttf"
font_prop = fm.FontProperties(fname=font_path)

# フォントプロパティをMatplotlibに設定
plt.rcParams["font.family"] = "sans-serif"
plt.rcParams["font.sans-serif"] = [font_prop.get_name()]
```
これでTimes New Romanのフォントが利用できます（多分）。
elixir タプル

## 基本
elixirにおけるタプルの書き方

> tuple = {tuple1, tuple2, tuple3}

波カッコとカンマ区切りで表現をする
サイズを得たり、インデックスで値を取り出す操作に向いている

## 使い方
` elem(tuple, n)`

でn番目の要素を取得

` tuple_size(tuple)`

で要素数を取得

参考ドキュメント

https://hexdocs.pm/elixir/1.12.3/Tuple.html

## リストとの違い
リストとの違いはメモリが隣接して存在するということ
イメージとしてはリストが数珠つなぎ、タプルが１区画というイメージ
リストは繋げていきやすいが順番に調べないと最後までわからない
タプルは区画になっているので調べるのが楽だがすでに区画が決められているので追加するのが大変
Popoverをソースコードで出現させる(iOS編)

# Storyboardを使えば簡単だが、こんな時はどうする!?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/09fd54ca-84c7-d743-2eb9-9a82e20145f5.png)

こんな感じで、Storyboardを使えば簡単にポップオーバーが実現できます。

良いUIかどうかの議論は別として、状況によってポップオーバーする内容を変えたい場合があったとします。
Storyboardではボタン1つに対して、1つのポップオーバーしか指定できません。

このような場合は、`ソースコードで状況に応じたポップオーバーはどれかを判断し、用意しておいた複数のStoryboardからオブジェクトを生成して表示する`というのが現実的でしょう。

# 二つのStoryboardを用意する
`CSetting`と`CSubSetting`という二つのStoryboardを用意しました。
![スクリーンショット 2024-08-12 9.47.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/b35d308b-6fe3-050a-6e27-11f0a86b4f4d.png)
この2つのStoryboardをソースコードで状況を判断し、その状況に応じて表示します。
`Sub Setting`のスイッチがONの時は`CSubSettingView`を採用します。
`Sub Setting`のスイッチがOFFの時は`CSettingView`を採用します。
```swift
extension ViewController {
    @IBAction func settingButton(_ sender: Any) {
        let vc: UIViewController
        
        if subSettingSw.isOn {
            vc = UIStoryboard(name: "CSubSettingView", bundle: nil).instantiateInitialViewController()!
        } else {
            vc = UIStoryboard(name: "CSettingView", bundle: nil).instantiateInitialViewController()!
        }
        vc.modalPresentationStyle = .popover
        vc.popoverPresentationController?.sourceView = (sender as! UIButton).superview
        vc.popoverPresentationController?.sourceRect = (sender as! UIButton).frame
        
        present(vc, animated: true)
    }
}
```
UIViewControllerをStoryboardから取得し、UIViewControllerのプロパティを必要に応じて設定します。
あとはpresetntメソッドで表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/a5cf8d90-300e-3e3f-713a-98c6309ffe59.png)
こんな感じで、スイッチの状態に応じて表示するPopoverを変えることができました。
LS220にs3cmdでバックアップ

# 
色々な先人の知恵がweb上にはあるが、LS220の設計（入ってるOS類）が古すぎて、
先人の知恵を有効に活用できない問題がありました。
コピペで対応していたターミナル作業も、現在では、当時のものをそのまま使えず、困っていました。
ライブラリなどが当時のものからリンクが切れていたり、現在では有効でないものになっていたりしているようです。


https://qiita.com/ikeisuke/items/96a5fbdf823e04fbc2f7


https://huruyosi.hatenablog.com/entry/2015/06/28/004847

を参考に、setuptoolsや、pipはインストールできるものの、肝心のs3cmdがインストールできない。


    $ pip install python-dateutil
    Downloading/unpacking python-dateutil
      Cannot fetch index base URL https://pypi.python.org/simple/
      Could not find any downloads that satisfy the requirement python-dateutil
    Cleaning up...
    No distributions at all found for python-dateutil
    Storing debug log for failure in /root/.pip/pip.log


どうやら、SSLに対応していないpythonや、pipを使っていることが問題らしい。
pipを使うインストールは軒並みインストール不可でした。

# ソースコードからのコンパイル
しようとするも、最終的に依存関係の沼に入りそうなところで、踏みとどまりました。


それぞれを手動インストールします

    wget https://github.com/dateutil/dateutil/archive/refs/tags/2.8.2.tar.gz -O python-dateutil.tar.gz
    wget https://github.com/psf/requests/archive/refs/tags/v2.25.1.tar.gz -O requests.tar.gz
    wget https://github.com/ahupp/python-magic/archive/refs/tags/0.4.24.tar.gz -O python-magic.tar.gz

でダウンロードし、それぞれ解答し、install.pyを試みました。
最終的な局面の、s3cmdのインストールでいつでも足りない依存関係があり、断念しました。


# python、pipの更新が必要そうです。

    [root@LS220DF6B s3cmd-2.1.0]# cat /etc/os-release
    NAME=Buildroot
    VERSION=2012.08-01753-g63ce473
    ID=buildroot
    VERSION_ID=2012.08
    PRETTY_NAME="Buildroot 2012.08

なんかめっちゃ古そう。


とりあえず、ポート番号をデフォルトの22から任意のポートへ変更する。

    nano /etc/sshd_config

なにもできなかったが、セキュアな方向にだけは設定しておきます。

実質なにもインストールできない。。。

    [root@LS220DF6B ~]# pip install awscli
    Downloading/unpacking awscli
      Cannot fetch index base URL https://pypi.python.org/simple/
      Could not find any downloads that satisfy the requirement awscli
    Cleaning up...
    No distributions at all found for awscli
    Storing debug log for failure in /root/.pip/pip.log


色々やって壊すのも怖いので、別の手を考えます。
LS220が古すぎて、ネットの情報も古すぎて、SSLに対応した情報がなく断念します。
解いてみた。「Cランク：Fizz Buzz」

# 問題
[「Cランク：Fizz Buzz」](https://paiza.jp/works/mondai/c_rank_skillcheck_sample/fizz-buzz)

# コード
Javaで解いてみました。

``` Java
import java.util.*;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int nN = sc.nextInt();
        
        for (int i = 1; i <= nN; i++) {
            if (i % 3 == 0) {
                if (i % 5 == 0) {
                    System.out.println("Fizz Buzz");
                } else {
                    System.out.println("Fizz");
                }
            } else if (i % 5 == 0) {
                System.out.println("Buzz");
            } else {
                System.out.println(i);
            }
        }
    }
}
```

# 解説
## 標準入力からの数値の読み取り
Scanner インスタンスを作り、nextInt()メソッドで数値を取得しています。

## 場合分け
### ３の倍数か？
３の倍数（3で割った余りが０）の場合、次の条件をチェックします。
#### ３の倍数かつ５の倍数か？
更に5で割った余りも０の場合、"Fizz Buzz"と表示します。
#### ３の倍数だが、５の倍数ではない場合。
この場合、"Fizz"と表示します。
### ５の倍数か？
この場合、５の倍数であるが、1つ目のチェックより３の倍数ではありません。よって、"Buzz"と表示します。
### それ以外
数字をそのまま表示します。
Cursorを使って、React(Next.js)でAmazonみたいなページを作成する

reactとNext.js勉強しようと思って、それぞれチュートリアルをやったんだけど、実際に画面を作ってみたいと思ってたら、下記の記事を見つけて挑戦してみた。

https://qiita.com/Jasmine_teeeeee/items/7773fc37f28f38b4081a

# 最初に

当然、cursorをインストールする。
そして会社でも最近cursorに乗り換えてて、作業してたら、APIの上限に到達したので、これを機に、cursor proにしてみた。（月20$）


# NxでNext.jsプロジェクトを作成

コマンド
```
npx create-nx-workspace@latest like-amazon --preset=next
```

これで、Next.jsのプロジェクトができる

# フォルダ構成を理解してもらう

この記事の冒頭で紹介したQiita記事の通り、Chat欄に`@`を入力し、フォルダを選択、フォルダの候補が出てくるので、`apps`を指定し、フォルダ構成を理解してもらう。

# Amazonのスクスショを貼り付けてコーディングしてもらう

こちらも記事の通り、Amazonのスクショを貼り付けて、「このデザインで画面を作成して欲しいです」と入力すれば、対象のファイル名リンクとコーディング内容が表示されるので、ファイル名リンクを押下し、ファイルをオープン。

そして、コーディング内容を適用するというのを繰り返せば、Amazonのような画面を作成してくれる。

ただし、最初は、CSSが誤ってたり、画像が表示されないなどあったので、その辺は適宜修正した。

※Nx Cloudを使ってたせいか、Cloud上でコンパイルや、Playwrightのエラーが出たので、その辺の修正に時間がかかったが、ここもcursorのchatで全て解決した。

# 結果

4時間くらいかかって、こんな感じ！

![react.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89497/74bbff13-44ef-addf-cddf-b54cc4353c8d.png)

参考にしたAmazonのスクショはこれ！

![amazon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89497/35849914-94ff-b7c4-0f6c-e48a7c3f66a5.png)

まあまあ、いい感じ

# 学び

Cursorにすることで、コーディングの効率は確実に上がる気がする。

ただ、エラーや、問題の解消で質問する→Chatの回答が出る→それを適用する→エラー解消しないのループがまあまああって、質問の仕方変えたり、ネットで調べたりする必要は当然ある。

あと、過去の履歴を全て持ってないので、時間が経つと、前回の続きで質問したいみたいなのができない（一からやり直す必要がある）

今回は、ページを作るのが目的だったので、Chatの回答をそのまま貼り付けたので、React, Next.jsの理解は全然深まらなかった。
※基本、自分でコード書くときに、サポートとして、Chatに聞くのが一番良いだろう

※途中で、問題が解決しないときに、VSCodeでcopilotに聞いてみたけど、copilotでも問題は解決しなかった

# 最後に

長らく使用してた、VSCodeは卒業してcursorに乗り換える。

使ってたイメージだけだけど、github copilotよりもcursorでchat gpt使う方が、コーディングの効率は良さそう（完全に主観です）

自分はフリーランスなので、課金に抵抗ないけど、cursor使うなら課金した方が良い。(Freeだと、chatに質問できる月の回数の上限がある)
nginxの初心者向けチュートリアル、ゼロから始めて大丈夫！

## 第1章: NGINXとは何か？

こんにちは！まずはNGINXについて簡単に説明しましょう。NGINXは、軽量で高性能なウェブサーバーであり、リバースプロキシやロードバランサーとしても利用されます。多くのトラフィックを効率的に処理できるため、人気のあるウェブサーバーの一つです。では、次の章でインストール方法を見ていきましょう！

## 第2章: NGINXのインストール

NGINXをインストールするのはとても簡単です！Ubuntuを例にとって説明します。まず、パッケージリストを更新し、次にNGINXをインストールします。以下のコマンドをターミナルで実行してください。

```bash
sudo apt update
sudo apt install nginx
```

これでNGINXがインストールされました！次は基本的な設定について学びましょう。

## 第3章: 基本的な設定

NGINXの設定ファイルは、`/etc/nginx/nginx.conf`にあります。ここでは、サーバーブロックを設定して、特定のドメインに対するリクエストを処理する方法を紹介します。

```nginx
server {
    listen 80;
    server_name example.com;
    root /var/www/html;
}
```

この設定により、`example.com`へのリクエストが`/var/www/html`ディレクトリにルーティングされます。

## 第4章: ウェブサーバの起動と停止

NGINXを起動、停止、再起動する方法を学びましょう。システムデーモンを利用して、以下のコマンドで操作できます。

```bash
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
```

これでNGINXを自在に操作できますね！

## 第5章: 静的コンテンツの提供

NGINXは静的ファイルの提供に優れています。例えば、HTMLや画像ファイルを簡単に配信できます。以下の設定を追加してみましょう。

```nginx
location / {
    try_files $uri $uri/ =404;
}
```

この設定により、存在するファイルをそのまま提供し、見つからない場合は404エラーを返します。

## 第6章: リバースプロキシの設定

NGINXをリバースプロキシとして設定することで、バックエンドサーバーへのリクエストを転送できます。以下の設定を試してみてください。

```nginx
location /proxy {
    proxy_pass http://backend.example.com;
}
```

この設定により、`/proxy`へのアクセスがバックエンドサーバーに転送されます。

## 第7章: セキュリティの強化

セキュリティを強化するためにSSLを設定しましょう。以下の設定でSSL証明書を利用します。

```nginx
server {
    listen 443 ssl;
    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;
}
```

これでHTTPS通信が可能になります！

## 第8章: ログの管理

NGINXのログを管理することで、サーバーの状態を把握できます。アクセスログとエラーログの設定を見てみましょう。

```nginx
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
```

ログファイルを確認することで、問題の原因を特定しやすくなります。

## 第9章: サーバブロックの設定

複数のドメインをホスティングする場合、サーバーブロックを使います。以下の例では、2つのドメインを設定しています。

```nginx
server {
    server_name site1.example.com;
    root /var/www/site1;
}
server {
    server_name site2.example.com;
    root /var/www/site2;
}
```

これで、異なるドメインに対して異なるコンテンツを提供できます。

## 第10章: FastCGIの設定

動的コンテンツを提供するためにFastCGIを使用します。PHPを例に設定を確認しましょう。

```nginx
location ~ \.php$ {
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    include fastcgi_params;
}
```

この設定により、PHPファイルを適切に処理できます。

## 第11章: パフォーマンスの最適化

NGINXのパフォーマンスを最適化するための設定を見てみましょう。以下の設定で、サーバーの効率を向上させます。

```nginx
worker_processes auto;
worker_connections 1024;
```

これにより、より多くの接続を効率的に処理できます。

## 第12章: トラブルシューティング

最後に、よくある問題とその解決方法を紹介します。エラーログを確認し、問題の原因を特定することが重要です。例えば、404エラーが頻発する場合、設定ファイルを見直してみましょう。

---

このガイドを通じて、NGINXの基本から高度な設定までを学び、完全な環境を構築することができるでしょう。ぜひ試してみてください！
prisma db pushをdry runする方法

PrismaでDB schmeaを反映させるには `prisma db push`を実行すれば良いですが、このコマンドは`--dry-run`的なオプションがありそうでありません。
事前に何が起こるのか確認したい場合には、以下のように`prisma migrate diff`コマンドを利用できます。
```sh
prisma migrate diff \
  --from-schema-datasource=./prisma/schema.prisma \
  --to-schema-datamodel=./prisma/schema.prisma
```
ラズパイPico WでLEDチカチカ

Raspberry Pi Pico を入手して最初にやることは、Lチカ（pico内蔵のLEDをチカチカ点灯させる）だと思います。
これが、「Raspberry Pi Pico」と「Raspberry Pi Pico W」では、Pin番号の指定が違うので注意しましょう。

## Raspberry Pi Pico W / Raspberry Pi Pico WH

```Python
from machine import Pin
import time

led = Pin('LED', Pin.OUT) # Pico W は 'LED' と設定

for i in range(10):
    led.on()
    time.sleep(0.5)
    led.off()
    time.sleep(0.5)

print("LEDチカチカを、10回やりました！")
```

## Raspberry Pi Pico / Raspberry Pi Pico H

```Python
from machine import Pin
import time

led = Pin(25, Pin.OUT) # Pico は 25 と設定

for i in range(10):
    led.on()
    time.sleep(0.5)
    led.off()
    time.sleep(0.5)

print("LEDチカチカを、10回やりました！")
```
Praison AI: 次世代のAI Agent開発フレームワークをWindowsのOllamaで実行する

## はじめに

Praison AIは、複数のAIエージェントを組み合わせて複雑なタスクを解決する「マルチエージェントシステム」の開発を簡単に行えるフレームワークです。この記事では、WindowsでOllamaを使用してPraison AIを実行する方法を紹介します。

https://qiita.com/Tadataka_Takahashi/items/764421590550a7af765e

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/c58606d1-409f-170f-73ac-ffbbe2d23e19.png)

## 前提条件

- Windows 10 または Windows 11
- Python 3.8以上
- Git（オプション、ただしおすすめ）

## 手順

### 1. Ollamaのインストール

1. [Ollama公式サイト](https://ollama.ai/download)からWindows用インストーラーをダウンロードします。
2. ダウンロードしたインストーラーを実行し、指示に従ってインストールを完了します。

### 2. Pythonのインストール

1. [Python公式サイト](https://www.python.org/downloads/windows/)からWindows用インストーラーをダウンロードします。
2. インストーラーを実行し、「Add Python to PATH」オプションにチェックを入れてインストールを完了します。

### 3. Praison AIのインストール

Windowsのコマンドプロンプトを開き、以下のコマンドを実行します：

```bash
pip install praisonai
```

### 4. Praison AIの設定

1. プロジェクト用のディレクトリを作成し、そこに移動します：

```bash
mkdir praison_project
cd praison_project
set OPENAI_API_BASE=http://localhost:11434/v1
set OPENAI_MODEL_NAME=llama3
```

2. Praison AIの初期化を行います：

```bash
praisonai --init "犬が月に行く映画の脚本を作成"
```

これにより、`agents.yaml`ファイルが生成されます。

3. テキストエディタで`agents.yaml`を開き、次のように変更しました。

```yaml
framework: crewai
topic: 犬が月に行く映画の脚本を作成
roles:
  screenwriter:
    backstory: "AIに関する台本を魅力的な対話で作成するスキルを持つ。"
    goal: "{topic}の脚本を作成する。"
    role: 脚本家
    tasks:
      scriptwriting_task:
        description: "AIに関する魅力的なキャラクターと対話を含む脚本を開発する。"
        expected_output: "制作準備が整った完全な脚本。"
```

### 5. Ollamaモデルのダウンロード

コマンドプロンプトで以下のコマンドを実行し、必要なモデルをダウンロードします：

```bash
ollama pull llama3
```

### 6. Praison AIの実行

準備が整ったら、以下のコマンドでPraison AIを実行します：

```bash
praisonai
```

または、完全自動モードで実行する場合：

```bash
praisonai --auto "犬が月に行く映画の脚本を作成"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/3f1c39d4-a931-31bc-a1b7-c767001707f0.png)
出力している例

## トラブルシューティング

1. **Ollamaが起動しない場合**：
   - Windowsのサービスで「Ollama」が実行中であることを確認してください。
   - ファイアウォールの設定を確認し、必要に応じてOllamaの通信を許可してください。

2. **モデルのダウンロードに失敗する場合**：
   - インターネット接続を確認してください。
   - プロキシ設定が必要な場合は、適切に設定してください。

3. **Praison AIがOllamaを認識しない場合**：
   - `agents.yaml`ファイルの設定を再確認してください。
   - Ollamaのインストールパスが環境変数PATHに追加されていることを確認してください。

## まとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/1f8c0c14-e362-b63a-dc6b-2bcb9913803b.png)

WindowsでOllamaを使用してPraison AIを実行することで、オープンソースのLLMを活用しながら、複雑なAIタスクを効率的に処理できます。この方法は、プライバシーを重視する場合や、特定のタスクに特化したモデルを使用したい場合に特に有用です。

Praison AIとOllamaの組み合わせは、AI開発の新しい可能性を開くでしょう。ぜひ試してみてください！

## 参考リンク

- [Praison AI公式ドキュメント](https://docs.praison.ai/)
- [Ollama公式サイト](https://ollama.ai/)
- [Praison AI GitHub](https://github.com/praison/praisonai)
WSLのpythonのバージョンを変更する

# はじめに
WSLには初めからpythonがインストールされていますが、デフォルトとしてPython3.10が入っています。
これを変更しようとしてpyenvを使ってみたのですが、なぜかうまくいきませんでした。
自分の知識がまだ不十分なせいだと思うのですが・・・

そこで別の方法で変更したのでその手順についてメモとして書き残しておきます。

## 自分の環境について
- Ubuntu 22.04.4
- Python3.10.12, Python3.11.9, Python3.12.4 が入っています

```shell-session
Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.153.1-microsoft-standard-WSL2 x86_64)

xxx@DESKTOP:~$ python3.11 --version
Python 3.11.9
xxx@DESKTOP:~$ python3 --version
Python 3.10.12
xxx@DESKTOP:~$ python3.12 --version
Python 3.12.4
```

## update-alternativesを使用する
- alternativesがまだ適用されていない状態
```shell-session
xxx@DESKTOP:~$ sudo update-alternatives --config python3
[sudo] password for xxx:
update-alternatives: error: no alternatives for python3
```
<br>

- update-alternativesで登録していきます
```shell-session
xxx@DESKTOP:~$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 12
xxx@DESKTOP:~$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 9
xxx@DESKTOP:~$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.12 4
```

<br>

- update-alternativesでどのpythonを使用するか決めます
```shell-session
xxx@DESKTOP:~$ sudo update-alternatives --config python3
There are 3 choices for the alternative python3 (providing /usr/bin/python3).

  Selection    Path                 Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python3.10   12        auto mode
  1            /usr/bin/python3.10   12        manual mode
  2            /usr/bin/python3.11   9         manual mode
  3            /usr/bin/python3.12   4         manual mode

Press <enter> to keep the current choice[*], or type selection number: 3
update-alternatives: using /usr/bin/python3.12 to provide /usr/bin/python3 (python3) in manual mode
xxx@DESKTOP:~$ python3 -V
Python 3.12.4
```

これでPythonのバージョンの変更ができるようになりました。
Popoverをソースコードで出現させる(macOS編)

# Storyboardを使えば簡単だが、こんな時はどうする!?
![スクリーンショット 2024-08-12 8.01.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/d83ad8ab-bde2-0248-09cd-917255c4df61.png)

こんな感じで、Storyboardを使えば簡単にポップオーバーが実現できます。

良いUIかどうかの議論は別として、状況によってポップオーバーする内容を変えたい場合があったとします。
Storyboardではボタン1つに対して、1つのポップオーバーしか指定できません。

このような場合は、`ソースコードで状況に応じたポップオーバーはどれかを判断し、用意しておいた複数のStoryboardからオブジェクトを生成して表示する`というのが現実的でしょう。

# 二つのStoryboardを用意する
`CSetting`と`CSubSetting`という二つのStoryboardを用意しました。

![スクリーンショット 2024-08-12 8.15.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/298fa070-7424-5b25-9d51-f6ac1baf6b46.png)

この2つのStoryboardをソースコードで状況を判断し、その状況に応じて表示します。
`setting`のラジオボタンが選択されている時は`CSettingView`を採用します。
`Sub Setting`のラジオボタンが選択されている時は`CSubSettingView`を採用します。

```swift
extension ViewController {
    @IBAction func settingButton(_ sender: Any) {
        let vc: NSViewController
        
        if settingRadio.boolState {
            vc = NSStoryboard(name: "CSettingView", bundle: nil).instantiateInitialController() as! NSViewController
        } else {
            vc = NSStoryboard(name: "CSubSettingView", bundle: nil).instantiateInitialController() as! NSViewController
            
        }
        let popover = NSPopover()
        
        popover.contentViewController = vc
        popover.animates = true
        popover.behavior = .transient
        popover.show(relativeTo: (sender as! NSButton).bounds, of: (sender as! NSButton), preferredEdge: .maxY)
    }
}
```
NSViewControllerをStoryboardから取得し、NSPopoverのプロパティにNSViewControllerを設定します。
そのほか、必要に応じてプロパティを設定していきます
あとはNSPopoverのshowメソッドで表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202602/6a16fc6c-14da-3e49-c818-a05cfe3f9b0f.png)

こんな感じで、ラジオボタンの状態に応じて表示するPopoverを変えることができました。
メモ: macports-2.10.0でcargo-cのbuildに失敗し、格闘した件

# Issue

```bash:port
% port install cargo-c
```
のビルドの途中で止まってしまった。timeというコンポーネントの`time-0.3.21/time/src/format_description/parse/mod.rs`というファイルのコンパイルエラー(rust)が原因で、[このあたり](https://github.com/time-rs/time/issues/693)や[このあたり](https://users.rust-lang.org/t/time-crate-compilation-error/111789)を踏んでしまっているようだ。

# Solution

前述のリンクのバグレポートだと、最新版にバージョンアップで解決した、とある。なので最初に、
```bash:Portfile
% nl -ba ${macports_root}/var/macports/sources/rsync.macports.org/macports/release/tarballs/ports/devel/cargo-c/Portfile
...
   201      thread_local                     1.1.7  3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152 \
   202      time                            0.3.21  8f3403384eaacbca9923fa06940178ac13e4edb725486d70e8e15881d0c836cc \
   203      time-core                        0.1.1  7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb \
...
```
の202行目を最新バージョン0.3.36とチェックサムに書き換えて試したが、他のバージョンとの依存関係が変わってしまってビルドできなかった。なので、
```bash:対処
% port clean --all cargo-c
% port -v -f patch cargo-c
% nano ${macport_root}/var/macports/build/*_devel_cargo-c/cargo-c/work/.home/.cargo/macports/time-0.3.21/src/format_description/parse/mod.rs
% port -v -f install cargo-c
```
として、`port`のビルドの途中で、[ここに書かれている変更](https://github.com/time-rs/time/commit/5b0c627366babea1636b35db641c0fec964ddbd1)を反映させることで、ビルドできた。
```rust:time-0.3.21/src/format_description/parse/mod.rsの変更後
    66  /// Parse a sequence of items from the format description.
    67  ///
    68  /// The syntax for the format description can be found in [the
    69  /// book](https://time-rs.github.io/book/api/format-description.html). The version of the format
    70  /// description is provided as the const parameter.
    71  ///
    72  /// Unlike [`parse`], this function returns [`OwnedFormatItem`], which owns its contents. This means
    73  /// that there is no lifetime that needs to be handled. **It is recommended to use version 2.**
    74  ///
    75  /// [`OwnedFormatItem`]: crate::format_description::OwnedFormatItem
    76  pub fn parse_owned<const VERSION: usize>(
    77      s: &str,
    78  ) -> Result<crate::format_description::OwnedFormatItem, crate::error::InvalidFormatDescription> {
    79      validate_version!(VERSION);
    80      let mut lexed = lexer::lex::<VERSION>(s.as_bytes());
    81      let ast = ast::parse::<_, VERSION>(&mut lexed);
    82      let format_items = format_item::parse(ast);
    83      // let items = format_items
    84      //     .map(|res| res.map(Into::into))
    85      //     .collect::<Result<Box<_>, _>>()?;
    86      let items = format_items.collect::<Result<Box<_>, _>>()?;
    87      Ok(items.into())
    88  }
    89  
```
paizaラーニングレベルアップ問題集の「足し算」を色々な言語でやってみた

paiza×Qiita記事投稿キャンペーンということで、paizaラーニングレベルアップ問題集の[足し算](https://paiza.jp/works/mondai/d_rank_skillcheck_sample/addition)を色々な言語でやってみました。対象は[コードモンスター大図鑑](https://paiza.jp/code_monster)で対応している9言語です。

2024/08/24追記
Perl, Scala, Go, Swiftの4言語を追加いたしました。
- - -
###### PHP
```php
<?php
	[$a, $b] = explode(" ", fgets(STDIN));
	echo $a + $b;
?>
```
- - -
###### Ruby
```rb
a, b = gets.split.map(&:to_i)
p a + b
```
- - -
###### Java	
```java
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		sc.close();
		System.out.println(a + b);
	}
}
```
- - -
###### Python
```py
a, b = map(int, input().split())
print(a + b)
```
- - -
###### C言語
```c
#include <stdio.h>
int main(void){
	int a, b;
	scanf("%d %d", &a, &b);
	printf("%d\n", a + b);
	return 0;
}
```
- - -
###### C#
```cs
using System;

class Program
{
	static void Main()
	{
		int[] ab = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
		Console.WriteLine(ab[0] + ab[1]);
	}
}
```
- - -
###### Javascript
```js
const lines = require("fs").readFileSync("/dev/stdin", "utf8").split("\n");
// 2024-08-25 parseIntからNumberに修正
// const [a, b] = lines[0].split(" ").map(s => parseInt(s, 10));
const [a, b] = lines[0].split(" ").map(Number);
console.log(a + b);
```
- - -
###### C++
```cpp
#include <iostream>
using namespace std;

int main(void){
	int a, b;
	cin >> a >> b;
	cout << a + b << endl;
	return 0;
}
```
- - -
###### Kotlin
```kotlin
import java.util.*

fun main() {
	val sc = Scanner(System.`in`)
	val a = sc.nextInt()
	val b = sc.nextInt()
	sc.close()
	println(a + b)
}
```
- - -
###### Perl
```pl
my ($a, $b) = split ' ', <STDIN>;
print $a + $b, "\n"
```
- - -
###### Scala
```scala
import scala.io.StdIn._

object Main extends App {
	val Array(a, b) = readLine().split(" ").map(_.toInt)
	println(a + b)
}
```
- - -
###### Go
```go
package main
import "fmt"
func main() {
	var a, b int
	fmt.Scan(&a, &b)
	fmt.Println(a + b)
}
```
- - -
###### Swift
```swift
import Foundation

let ab = readLine()!.split(separator: " ").map { Int($0)! }
let a = ab[0]
let b = ab[1]
print(a + b)
```
react-router-domバージョン6になっての実装方法、またchakraUIを使っているときのLinkの書き方

reactでフロントエンドを実装する時にreact-router-domのバージョンが変わっていて実装するときに困ったので、そのときに使った内容をまとめていく。
また、実際に導入して行った時の流れをまとめる。
# v5とv6への変更点
## routeの書き方
v5
```
<Route path="/about" component={About} />
```
v6
```
<Route path="/about" element={<About />} />
```
`component=`がなくなり代わりに`element=`になりました。
また、そのときに直接コンポーネントをインポートできるのでかなり直感的に変わっています。
## switchの廃止
v5
```
<Switch>
  <Route exact path="/" component={Home} />
  <Route path="/about" component={About} />
</Switch>
```
v6
```
<Routes>
  <Route path="/" index element={<Home />} />
  <Route path="/about" element={<About />} />
</Routes>
```
`Switch`が廃止され代わりに`Routes`になりました。

他にも変更点はありますが詳しくは公式を確認してください。
https://reactrouter.com/en/main

# index.tsxのインポートを変更する
```
const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);
root.render(
  //react-router-domを使うためにBrowserRouterをラッピング、またChakraUIもラッピング
  <BrowserRouter>
  <ChakraProvider>
    < Router />
  </ChakraProvider>
  </BrowserRouter>
);
```
`BrowserRouter`で`ChakraProvider`を囲うようにインポートする。
これで`react-router-dom`と`chakraUI`が両方使えるようになる。

# コンポーネントでreact-router-domとchakraUIのLinkを使いたいときに使う方法
全体像
```
import { Link as ReactRouterLink } from 'react-router-dom'
import { Link as ChakraLink } from '@chakra-ui/react'

export const Mycomponent:React.FC = () => {
    return (
        <div>
        <div>
            <ChakraLink as={ReactRouterLink} to="/">home</ChakraLink>
        </div>
        <div>
            <ChakraLink as={ReactRouterLink} to="/about">about</ChakraLink>
        </div>
        </div>
    )
}

export default Mycomponent;
```
インポートの部分
```
import { Link as ReactRouterLink } from 'react-router-dom'
import { Link as ChakraLink } from '@chakra-ui/react'
```
インポートするときにLinkのままだと共に同じLinkになってしまうため`Link as ReactRouterLink`,
`Link as ChakraLink`とする。

呼び出し
```
<ChakraLink as={ReactRouterLink} to="/">
```
このようにすることで`chakraUI`かつ、`react-router`である`Link`が作成できる。

# 最後に
chakraUIを使いつつ、react-router-domを使う書き方はTipsだな〜と思いました。
読んでいただきありがとうございます。
wslでmanim その8

# 概要
wslでmanimやってみた。
manim見つけたので、やってみた。

# 参考にしたページ

https://qiita.com/makotodaxi5/items/67fee1cc49285d548c0b

# サンプルコード

```
from manim import *
import numpy as np

class PCAVisualizer(Scene):
	def construct(self):
		caption_1 = Text("データ点の作成と表示", font = "IPAGothic", font_size = 24).to_edge(UP)
		self.play(Write(caption_1))
		self.wait(2)
		data = np.array([[2, 1, 0], [1, 3, 0], [3, 4, 0], [4, 3, 0], [3, 2, 0], [2, 4, 0]], dtype = float)
		dots = VGroup(*[Circle(radius = 0.07, fill_color = YELLOW, fill_opacity = 1).move_to([x, y, 0]) for x, y, _ in data])
		self.play(DrawBorderThenFill(dots))
		self.wait()
		self.play(FadeOut(caption_1))
		caption_2 = Text("主成分の計算と表示", font = "IPAGothic", font_size = 24).to_edge(UP)
		self.play(Write(caption_2))
		self.wait(2)
		mean = np.mean(data, axis = 0)
		centered_data = data - mean
		cov_matrix = np.cov(centered_data.T)
		eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
		pc1 = eigenvectors[:, np.argmax(eigenvalues)][:2]
		pc1_line = Line(np.append(pc1 * 3 + mean[:2], 0), np.append(-pc1 * 3 + mean[:2], 0), color = GREEN)
		self.play(Create(pc1_line))
		self.wait()
		self.play(FadeOut(caption_2))
		caption_3 = Text("分散の可視化", font = "IPAGothic", font_size = 24).to_edge(UP)
		self.play(Write(caption_3))
		self.wait(2)
		variance_box = Rectangle(height = 1, width = eigenvalues.max() * 2).move_to([pc1[0] * eigenvalues.max() + mean[0], pc1[1] * eigenvalues.max() + mean[1], 0])
		self.play(FadeIn(variance_box))
		self.wait()
		self.play(FadeOut(caption_3))
		caption_4 = Text("データ点の主成分への射影", font = "IPAGothic", font_size = 24).to_edge(UP)
		self.play(Write(caption_4))
		self.wait(2)
		projected_data = np.dot(centered_data[:, :2], pc1)
		projected_dots = VGroup(*[Dot(np.array([projected, mean[2], 0]), radius = 0.05, color = BLUE) for projected in projected_data])
		self.play(ReplacementTransform(dots, projected_dots))
		self.wait()
		self.play(FadeOut(caption_4))

scene = PCAVisualizer()
scene.render(preview = True)





```

# 成果物

![PCAVisualizer_ManimCE_v0.18.1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1a98c571-c15f-327a-3b76-2cd3e4c2a7f0.gif)



以上。
wslでmanim その7

# 概要
wslでmanimやってみた。
日本語を表示してみた。

# 追加のインストール

```
> sudo apt install fonts-ipafont

```

# サンプルコード

```
from manim import *

class test(Scene):
	def construct(self):
		text = Text('Hello world!', font = 'IPAGothic')
		self.play(Write(text))
		self.wait()
		self.clear()
		text = Text('こんにちは、　世界。', font = 'IPAGothic')
		self.play(Write(text))


```

# 成果物


![Test_ManimCE_v0.18.1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c4aed9cc-50aa-8d9e-1130-96038c493212.gif)


以上。
Windowsで実行コマンドのフルパスを表示するバッチファイルをささっと作る

# はじめに

UNIX では実行コマンドの置き場所を環境変数 `PATH` を辿って検索してくれる `WHICH` コマンドというものがある。これが Windows でも欲しいという話である。

# 実装コード

実装コードを以下に示す。

拡張子が指定されている場合は `FOR` コマンドの機能を使えば一発である。拡張子が指定されていない場合（たいていの場合はコチラのほうだろうが）環境変数 `PATHEXT` に登録された拡張子を一つずつ試していく。環境変数 `PATHEXT` は `.COM;.EXE;.BAT;.CMD` のようにセミコロンで区切られた文字列であるが，`FOR` コマンドではセミコロンを区切り文字と認識してくれるので，そのまま `FOR` コマンドに引き渡せばループ変数 `%%J` に拡張子が代入されるので，一つずつ試していけばよい。

```:WHICH.CMD
@echo off
setlocal enabledelayedexpansion
if "%~1"=="" goto USAGE
if "%~x1"=="" (
  for %%J in ( %PATHEXT% ) do (
    for %%I in ( "%~1%%J" ) do set RESULT=%%~$PATH:I
    if defined RESULT echo !RESULT!
  )
) else (
  for %%I in ( "%~1" ) do set RESULT=%%~$PATH:I
  if defined RESULT echo !RESULT!
)
exit /b
:USAGE
echo パスを検索してコマンドのフルパスを返します。
echo.
echo WHICH(.CMD) [コマンド(.拡張子)]
echo.
echo 拡張子の指定を省略すると環境変数 PATHEXT を順に検索します。
exit /b
```

# 実行例

引数なしで実行するとヘルプメッセージを表示する。

```:引数なしで実行した場合
c:\>which
パスを検索してコマンドのフルパスを返します。

WHICH(.CMD) [コマンド(.拡張子)]

拡張子の指定を省略すると環境変数 PATHEXT を順に検索します。
```

コマンドが見つかるとフルパス名を出力する。

```:コマンドが見つかったとき
c:\>which sort
C:\Windows\System32\sort.exe
```

コマンドが見つからなかったときは何も出力されない。なお，コマンドプロンプト `CMD.EXE` の内部コマンドは検索の対象外である。

```:コマンドが見つからなかったとき
c:\>which dir

```

# まとめ

実は Windows Vista 以降，`WHERE` というコマンドが追加されたので，わざわざ自作する必要はなくなっている。`WHERE` コマンドは自作の `WHICH` コマンドと同等以上の機能を持つので普通の人は `WHERE` コマンドを使ったほうがよいだろう。

```:WHEREコマンドのヘルプメッセージ（Windows10 22H2 の場合）
c:\>where /?

WHERE [/R ディレクトリ] [/Q] [/F] [/T] パターン...

説明:
    検索パターンに一致するファイルの場所を表示します。
    既定では、現在のディレクトリおよび PATH 環境変数によって指定された
    パス内を検索します。

パラメーター一覧:
    /R       指定したパターンに一致するファイルを、指定したディレクトリから
             開始して再帰的に検索し表示します。

    /Q       一致したファイルの一覧を表示せずに、終了コード
             のみを返します (Quiet モード)。

    /F       一致したファイル名を二重引用符内に表示します。

    /T       一致したすべてのファイルのサイズ、最終変更日および時刻を
             表示します。

    パターン ファイルの検索パターンを指定します。パターンには
             ワイルドカードである * および ? を使用することができます。
             "$env:pattern" や "path:pattern" 形式で指定する
             こともできます。"env" は環境変数で、"env" 環境
             変数で指定されたパスで検索が行われます。これら
             の形式は /R スイッチと同時には使用できません。
             パターンに PATHEXT 変数の拡張子を追記して
             検索を実行することもできます。

     /?      このヘルプを表示します。

  注意: このツールは、検索に成功するとエラー レベル 0 を、
        成功しなかった場合は 1 を、失敗またはエラーの場合は
        2 を返します。

例:
    WHERE /?
    WHERE myfilename1 myfile????.*
    WHERE $windir:*.*
    WHERE /R c:\windows *.exe *.dll *.bat
    WHERE /Q ??.???
    WHERE "c:\windows;c:\windows\system32:*.dll"
    WHERE /F /T *.dll
```

デフォルトの動作では環境変数 `PATH` を検索するので，拙作の `WHICH` コマンドと同じである。

```:WHEREコマンドの実行例
c:\>where where
C:\Windows\System32\where.exe
```

ただし，自作の `WHICH` コマンドは `WHERE` コマンドよりも小気味よく動いてくれるのが唯一の慰めである。

# 参考文献

- [whichコマンドを作る - itmedia](https://atmarkit.itmedia.co.jp/fwin2k/win2ktips/319which/which.html)
- [ファイルが見つからない？ならば「where」コマンドで検索だ【Windows 10／11】- itmedia](https://atmarkit.itmedia.co.jp/ait/articles/0904/10/news115.html)
- [LinuxとWindowsコマンド対比表 - Qiita](https://qiita.com/satoruy6/items/8e3e2c91be053e7a4676)
チームリーダー Lv.0

## 初めまして
　大学2年生の駆け出しゲームクリエイター、カシューです。
　大学に入学してからプログラミングを学び始め、大学1年の終わりにチームを結成し初めてのゲームを制作、2作目を大学2年の夏にオープンキャンパスで展示、現在は3作目の企画をしています。今回は最近まで開発していた2作目のゲームについて、チームリーダーとしての経験や振り返りを自分用にまとめようと思います。

## チームリーダーを経験して
　私は9人で構成されたチームのリーダーをしていました。主な仕事としては、企画、設計、チームマネジメント等がありました。その中でもチームマネジメントがとても難しかったと感じています。例えば、各メンバーのタスクの割り当てやメンバー間のやりとり、チーム全体のタスク管理など考えることがたくさんありました。どれを疎かにしてもチーム全体の開発の手が止まってしまうようなとても重大な仕事でした。ゲームの制作期間はずっとチームのことを考えていて、チームで開発するってこんなにも大変なんだと実感しました。ゲーム自体は完成したのでチームマネジメントについて大きなミスがあったとは思いませんが、それでも改善すべきところはたくさんあったと思います。次は今後改善したい点としてそれらについていくつか述べます。

## 今後改善したい点
　1つ目は割り当てたタスクを細分化しきれていなかったことです。プロジェクトを進めるにつれて、メンバーにうまく伝達できていなかったことや、タスクがなくて時間を持て余すようなメンバーが出てきたことがありました。これは私が制作を始める前の段階でより詳細に物事を決めていれば避けられていた問題だったと思います。
　2つ目は各メンバーの進捗に差が出過ぎていたことです。決してメンバーのやる気がなかった訳ではなく、逆にやる気がありすぎてタスクの進みがとても早いメンバーと他に予定があってあまり進めないメンバーとの進捗に差が出てしまいました。これはチーム内で進捗報告を定期的に行ったり、私からメンバーの進み具合を確認する必要があったと思います。
　３つ目は私のタイムマネジメントがあまりにも下手すぎたことです。これは経験不足とタスクの細分化の甘さが響いていると痛感しました。締切であるオープンキャンパスの日までにはなんとか間に合いましたが、前日まで開発していたり、もっとやれることはあったなと思う結果になりました。

## ゲーム制作の振り返り
　ゲーム制作は決して簡単なものではありません。全く勉強したことのない言語、ほとんど使ったことのない開発エンジン、聞いたこともない機能の使用など毎回インターネットで調べて学び、試行錯誤する必要があります。しかし、それを繰り返すたびに、プログラミング力がついたり、制作することの楽しさを感じられたりするので、ゲーム制作はプログラミングの勉強にとても適していると思います。
　私がチームを作ってゲーム制作をしているだけなので、チームメンバーに給料が発生したり、単位を与えたりすることができる訳ではありません。そのため、人によってはどうしてもゲーム制作の優先順位が低くなったり、モチベーションが維持できなかったりと難しい問題は多々ありました。しかし、約2ヶ月かけて作ったゲームが完成したのはチームメンバー全員が多大な時間と労力を費やしてくれたおかげです。私の願望に付き合ってくれたチームメンバーにはとても感謝しています。本当にありがとうございました、次のゲーム制作ではチームリーダーとしてもっと進化して臨みますので、その時はまたよろしくお願いします。

 ## まとめ
　今回は私の経験をもとにチームリーダーの立場からゲーム制作についての感じたことを書きました。初めてブログを書いたので、途中から何を書いているのかよくわからなくなったりしましたが、最後まで読んでいただきありがとうございました。今後もゲーム制作は続けていくので、気分次第ですがまたブログの更新があるかもしれません。以上。
備忘録　ラズパイ5 ROS2 XX Ubuntu Desktop 24.04LTSでROS2環境　C++ 

### 環境
- Ubuntu Desktop 24.04LTS(64-bit)
- ROS2 Jazzy
- 最新状態

だめだーC++やっているのに、colconがpythonのsetup.pyとか使っているので、ビルドができない
2024/8/12主にITとかセキュリティの記事

AMD CPUで深刻な脆弱性『Sinclose』が発見されたがRyzen 3000以下のCPUは対策されず(8/10)
https://gazlog.jp/entry/amd-cpu-sinkclose-security-issue/

IoT機器 20万台超にサイバー攻撃の高リスク 更新の徹底を(8/10)
https://www3.nhk.or.jp/news/html/20240810/k10014543671000.html

Amazon支援のAnthropic、拡張バグ報奨金で新たな安全基準(8/9)
https://weel.co.jp/media/news/4425/

FIRST Conference 2024 @福岡 YouTube(8/10)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/08/post-8bf6f6.html

防衛省 防衛研究所 サイバー攻撃対処における攻撃「キャンペーン」概念と「コスト賦課アプローチ」——近年の米国政府当局によるサイバー攻撃活動への対処事例の考察から(8/10)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/08/post-4dc43d.html

SonarQubeを利用してみた。(8/9)
https://qiita.com/nw-engineer/items/6d89861048c76c5f57f4

サイバー攻撃から企業を守る！AIと機械学習によるセキュリティの未来とは？
https://cybersecurity-park.com/2515/

カラオケ店員が名刺をせっせと集めている…日本のハイテク企業を狙う｢中国人ハニートラップ｣の巧妙な手口(8/10)
https://president.jp/articles/-/84616

大規模災害、デジタルで備え　供給網を一元管理　リスク可視化“保険付き”サービスも登場(8/10)
https://dempa-digital.com/article/583184

アルゼンチン　リアル『マイノリティ・リポート』！　AIによる未来の犯罪を予測するユニットが設立される(8/10)
https://ledge.ai/articles/argentina_plans_unit_to_predict_crime_with_ai

【開催報告 & 資料公開】教育委員会におけるゼロトラストとデータ分析基盤の先進事例(8/10)
https://aws.amazon.com/jp/blogs/news/k12-zerotrust-data-analytics-jun-5-2024/

ソラナ、ブロックチェーンへの攻撃を未然に防止　脆弱性修正を公表(8/10)
https://coinpost.jp/?p=550822

2要素認証も乗り越える!?「リアルタイムフィッシング」の恐怖(8/10)
https://ascii.jp/elem/000/004/214/4214646/

OSINTとは(8/9)
https://qiita.com/tk------m/items/c0cc8f989f5fc814e51f

約8割がオンライン詐欺に遭遇 - 被害にあった経験は20代男性が最多(8/10)
https://news.mynavi.jp/article/20240810-3000238/

ドワンゴ情報漏えい　IT未来高も被害　茨城(8/9)
https://ibarakinews.jp/news/newsdetail.php?f_jun=17232120261242

不正アクセスで人事異動情報を閲覧・収集　新潟市が40代男性職員を停職3カ月の懲戒処分に(8/10)
https://www.niigata-nippo.co.jp/articles/-/456539

韓国軍偵察機の運用資料、北朝鮮のサイバー攻撃で流出…「キル・チェーン」への影響必至(8/10)
https://www.chosunonline.com/site/data/html_dir/2024/08/10/2024081080029.html

アメリカ大統領選挙前にイランが陣営関係者にサイバー攻撃か(8/10)
https://www3.nhk.or.jp/news/html/20240810/k10014544951000.html

誰も教えてくれないSIの本質、SIerの世界観(8/10)
https://zenn.dev/sta/articles/2024-08-10-sat-what_is_si
Prismaとprisma-kyselyを使って型情報だけ生成してSQLは自分で書く方法

Prismaは非常に良くできたORMで様々なDBをサポートしていて便利なのですが、動作環境の条件によっては生SQLを実行するのと比べて2倍から数倍遅いケース（今回検証したのはサーバー/クライアント間のレイテンシーがそこそこ大きい場合）があり、開発環境では良いのですが本番環境では少々使いづらい場合があります。
そこでPrismaのDB管理機能だけ使いながらテーブルの型情報だけ拝借して生SQLで取得したレコードに型づけして使う方法を紹介します。
使う道具は2つ

1. Prisma
1. prisma-kysely

Prisma
------
DBのスキーマの抽出と管理に使います。
```sh
pnpm add -SD prisma
```
したら `prisma init` して`prisma db pull`してスキーマ情報を生成します。

[prisma-kysely](https://github.com/valtyr/prisma-kysely)
-------
これはPrismaが生成するスキーマ情報を拝借してKyselyで使おうというやつです。
```
pnpm add -SD prisma-kysely
```
したら `prisma/schema.prisma` ファイルを修正してgeneratorをkyselyのものにします。
```prisma
generator kysely {
  provider = "prisma-kysely"
  output   = "../src/db"
  fileName = "types.ts"
}
```
こうすると`prisma generate`で`./src/db/types.ts`に型情報が生成されます。

さて、ここで生成された型情報はkyselyから使うためのもので、kyselyを使うならそのまま使えるのですが、今回は生SQLを自分で書きたいので最後にもうひと工夫必要です。
`package.json`に`@types/kysely`の項目を追加します。
```js
  "devDependencies": {
    ...
    "@types/kysely": "link:./prisma/kysely",
    ...
  }
```
続いて`./prisma/kysely`ディレクトリを作成して中身を以下のように作成します。
```
$ tree prisma/kysely
prisma/kysely
├── index.d.ts
└── package.json
```
***package.json***
```json
{
  "name": "kysely",
  "version": "1.0.0",
  "description": "",
  "types": "index.d.ts",
  "scripts": {},
  "keywords": [],
  "author": "Your name",
  "license": "ISC"
}
```
***index.d.ts***
```ts
declare module 'kysely' {
  export type ColumnType<A, _1_, _2_> = A;
}
```
これで`prisma-kysely`が生成した型情報をそのまま使えるモック型ができました。
あとは`src/db/types.ts`から`import type`して使うだけです。

これで何が嬉しいかというと、DBのスキーマ情報が変化しても`prisma db pull`して`prisma generate`すれば型情報を更新できてそのまま使えるという事ですね。
AtCoder 勉強記録[C++] その48

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
## B - Misjudge the Time
[B - Misjudge the Time](https://atcoder.jp/contests/abc278/tasks/abc278_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<int>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll h, m;
  cin >> h >> m;
  while(1){
    ll a = h / 10;
    ll b = h % 10;
    ll c = m / 10;
    ll d = m % 10;
    ll dh = a*10 + c;
    ll dm = b*10 + d;
    if(0<=dh&&dh<=23&&0<=dm&&dm<=59){
      cout << h << " " << m << endl;
      exit(0);
    }
    m++;
    if(m==60) h++,m=0;
    if(h==24) h=0;
  }
}
```
### 解法
`while`文を用いて時刻を1分ずつ増やし、その時刻が見間違えやすい時刻かどうかを判定することで結果が求まる。
Linuxで圧縮コマンドを比較してみる

## 内容
gzip、bzip2、xz のマルチコア版について試して実行速度などを見てみた。

### テスト環境

```
CPU:Intel(R) Core i7-12700F 
OS:Ubuntu 22.04.4(WSL)
メモリ：32GB
```

論理プロセッサー数
```
 grep processor /proc/cpuinfo | wc -l
20
```
コア数20相当

## バイナリファイルに対する圧縮と展開について
391Mib のバイナリファルに対して実験を行った。
圧縮オプションは、一番圧縮率が高いものを選択した。
それぞれのコマンドオプションは、以下としている。
xz はコマンド自体がマルチコア対応しているので、オプション変更で実験をした。

|コマンド|圧縮時オプション|展開時オプション|
|---|---|---|
|gzip|-9|-d|
|bzip2|-9|-d|
|xz|-9|-d|
|pigz(gzipのマルチコア版)|-9|-d|
|pbzip2(bzip2のマルチコア版)|-9|-d|
|xz|-T0|-T0 -d|

### ノーマル版
|コマンド|圧縮にかかる時間|展開にかかる時間|圧縮率|
|---|---|---|---|
|gzip|18s|1.2s|9.64%|
|bzip2|21s|3.2s|7.88%|
|xz|1m21s|1.59s|5.08%|

xz の圧縮率は高いものの、圧縮にかかる時間が長い。
xz について、展開時間は速い。ファイルが小さくなっているためにIO処理は少ないことが影響しているかもしれない。

### マルチコア版
|コマンド|圧縮にかかる時間|展開にかかる時間|圧縮率|
|---|---|---|---|
|pigz|1.09s|0.65s|9.64%|
|pbzip2|2.65s|0.42s|7.88%|
|xz -T0|7.1s|1.67s|5.54%|

マルチコアでも圧縮率はほぼ変わらないが、少し落ちているところもある。
topコマンドで確認をしたが、20コアで処理がされており、マルチコア版での圧縮速度の向上率から言えば、
xz(19.9倍)>pigz(16.5倍)>pbzip2(7.92倍) であった。

実用を考えると、pbzip2 が時間、圧縮率のバランスがよいのではないかという考えもある。

## テキストファイルに対する圧縮と展開について
303MiB のJSONファイルを対象に行った。

### ノーマル版
|コマンド|圧縮にかかる時間|展開にかかる時間|圧縮率|
|---|---|---|---|
|gzip|4.48s|0.965s|10.37%|
|bzip2|28s|4.608s|8.29%|
|xz|1m3s|1.51s|6.90%|

### マルチコア版
|コマンド|圧縮にかかる時間|展開にかかる時間|圧縮率|
|---|---|---|---|
|pigz|0.354s|0.607s|10.34%|
|pbzip2|4.65s|0.746s|8.29%|
|xz -T0|9.4s|1.658s|7.90%|

こちらも圧縮率にはほぼ変化がないが、xzはマルチコア実行したときの方が若干悪くなっている。
bzip2 について、圧縮にかかる時間がgzipよりもかかっているが、バイナリのときよりもテキストファイルを対象にした方が差が開いている。

マルチコア版での圧縮速度の向上率から言えば、
xz(13倍)>pigz(12.7倍)>pbzip2(6.02倍) であった。
2～3%の圧縮率の差を気にしないならば、pigz が速い。

## pbzip2 についてコア数による比較

pbzip2 について -pオプションで利用するコア数を明示的に指定した。
対象は、303MiB のJSONファイルとした。

|コア数|圧縮にかかる時間|展開にかかる時間|コア1からの時間比|
|---|---|---|---|
|1|29.3s|4.88s|1|
|2|14.2s|2.039s|1/2.1|
|3|9.609s|1.360s|1/3.0|
|4|7.420s|1.039s|1/4.0|
|5|6.90s|1.193s|1/4.2|
|10|4.764s|0.807s|1/6.2|
|15|5.027s|0.765s|1/5.8|
|20|4.92s|0.791s|1/6.0|

なお、圧縮結果のバイト数はどれでも同じであった。
コア数が4まではほぼ線形で圧縮にかかる時間は短くなっているが、10を超えるとコア数を増やしても時間は短くなっていない

## まとめ
マルチコア環境で、大きなファイルを圧縮したい場合には、pigz などマルチコア対応のコマンドを使おう。