OmniAICreator/Qiita-1.07M huggingface dataset:
Cookie基本



<%@pagecontentType="text/html; charset=UTF-8"%>
<%@pageimport="java.util.Objects"%>

<html>
	<head>
		<title>Servlet/JSPの基礎を学ぼう</title>
	</head>
	<body>
		<%
		//Servletからのデータを取得
		String userName = (String) request.getAttribute("userName");
		String userAge = (String) request.getAttribute("userAge");
		
		//データが存在しない場合に空文字を置き
		userName = Objects.toString(userName, "");
		userAge = Objects.toString(userAge, "");
		%>
		
		<%-- Servletへの画面遷移(POSTメソッド --%>
		<formaction="<%= request.getContextPath() %>/cookie"method="post">
			<table>
				<tr>
					<th>氏名</th>
					<td><inputtype="text"name="name"value=<%= userName %>></td>
				</tr>
				<tr>
					<th>年齢</th>
					<td><inputtype="text"name="age"value=<%= userAge %> ></td>
				</tr>
			</table>
			<inputtype="submit"value="保存">
			
			<inputtype="checkbox"id="deleteCookie"name="deleteCookie"value="true">
			<labelfor="deleteCookie">クッキーを削除する</label>
		
		</form>
	</body>
	
</html>
プロパティ 〜 は型 'JSX.IntrinsicElements' に存在しません。という警告を消す

# はじめに
react,typescriptの環境をviteで作った際にApp.tsxのいたるところに警告文が表示されたのでその解決策を書いていきます。

# 問題
プロパティ 〜 は型 'JSX.IntrinsicElements' に存在しません。という警告が大量に出る。
![スクリーンショット 2024-07-30 22.29.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3279945/da0d729c-7a11-6250-12b5-0b8c4503bdd1.png)
心臓に悪いですね。

# 解決策
tsconfig.node.jsonの以下の箇所を修正する(tsconfig.app.jsonもある場合はそちらも)。

```diff_json
- "moduleResolution": "bundler"
+ "moduleResolution": "node"
```
これで警告が消えました。

# 参考

https://github.com/vitejs/vite/issues/14011
初心者向け　Git push まで 

# はじめに　
今回は Git を普段使っている割にはうろ覚えになっている部分が多いと思ったので、Git init から push までを図を使ってわかりやすく理解するのを目的としています。

# 用語説明
## ブランチとは
日本語に直訳すると枝とか支店っていう意味になります。
ブランチとは、作業履歴を本体から枝分かれさせることでプロジェクト本体に影響を与えない開発を行うための機能のことです。

### master / main ブランチとは
master (main) ブランチ :　デフォルトのブランチ、安定したブランチ。

## リポジトリとは
ファイルやリポジトリ(フォルダ)の情報を保存しておく場所です。


## .gitignoreとは
ignore は直訳すると、無視するっていう意味になります。
Git のトラッキング対象から外す（無視する）ファイル or ディレクトリを指定するためのファイルです。


# Git push までの流れ
### イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3669184/f6eaaf3e-6b37-361b-2394-c1ed30136e79.png)

### コード
```terminal:Git
Git init

Git add 

Git commit -m "コミットメッセージ"

Git remote add origin 

Git push -u origin master 
```

# 上流ブランチとかの話

### イメージ
今までよくわかっていなかったのですが、見るポジションによって呼ぶ名前が変わるらしいのでイメージしやすいように図にしておきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3669184/e75f8a70-79eb-2504-74c0-e8bf2102a08c.png)

# 参考にしたサイト

https://qiita.com/uasi/items/69368c17c79e99aaddbf
Github ActionsでSecretが取得できないときに疑うこと 

Github ActionsからSecretを取得できない事象にはまったので解決した方法を残します。

まずEnvironment SecretとRepository Secretの２種類のSecretがあります。
２つのSecretの取得方法は異なります。
ちゃんとGithub上で環境変数を設定し、Actionsのyamlの記述もあっていそうなときは２種類のSecretを混同しているかもしれません。

## Environment Secret
こちらはGithub Actionsのyamlでenvironmentを指定してSecretを取得します。
設定 > Code and automation > Environments で作成したらEnvironment Secretとなります。
test-environmentというEnvironmentの中に、VITE_SUPABASE_URL, VITE_SUPABASE_KEYの２つのSecretを作成したのが以下の画像です。
![スクリーンショット 2024-07-30 22.23.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810842/5307ac66-a342-cd5b-b6dd-d0477dda998d.png)
![スクリーンショット 2024-07-30 22.24.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810842/8cb29b44-b1b6-450b-9910-751c89b66f05.png)

environmentを指定し、以下のように取得します。
```
name: Build and Deploy
on:
  [push, workflow_dispatch]
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    environment:
      name: test-environment
    steps:
    - run: echo ${{ secrets.VITE_SUPABASE_URL }}
    - run: echo ${{ secrets.VITE_SUPABASE_KEY }}
```


## Repository Secret
こちらはリポジトリ内で一意のSecretです。
Github Actionsではenvironmentを指定せずに取得できます。
設定 > Secret and Valiables > Actionsで作成したらRepository Secretです。
![スクリーンショット 2024-07-30 22.34.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810842/f13228e0-07da-36e0-1b46-853725bf4041.png)

取得は以下です。
```
name: Build and Deploy
on:
  [push, workflow_dispatch]
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
    - run: echo ${{ secrets.VITE_SUPABASE_URL }}
    - run: echo ${{ secrets.VITE_SUPABASE_KEY }}
```

使い分けとしては、Repository Secretはリポジトリ内で共通で良いもの。
Environment Secretは開発、本番とでSecretを分けたいときに使用するのが良いと思います。

## 最後に
私はRepository SecretとEnvironment Secretを混同してしまいSecretが取れない状況にはまってしまいました。
（Environment Secretなのにenviromentsを指定せずに参照しようとしていた)
これを読んだ方がGithunのSecretには2種類あることを知り、エラーが早く解消されると嬉しいです。
UE5勉強日記 textureスケジューリング

オブジェクトにマテリアルを適用する際、適切なスケーリングとテクスチャのタイリングを行う必要

- 手順
1.materialを作成して、
2.TextureCoordinateノートを追加
3.TextureSampleノート追加し、使用するtextureを選択し、base　colorに出力する。
4.UTilingとVTilingの値でテクスチャの繰り返しを制御

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574567/6b15a890-49a2-1d41-7f00-92996a03fe57.png)

※opacityを透明度調整
Fedoraにバージョン指定でPHPをインストール

Fedora 38にphpをインストールしようとしたが、初期状態のmodule listではphpは用意されていないようでした。

```
$ sudo dnf module list php
Error: No matching Modules to list
```

remiを利用してインストールすることにしました。
まずremiのリポジトリを有効化しました。

```
sudo dnf install https://rpms.remirepo.net/fedora/remi-release-$(rpm -E %fedora).rpm
sudo dnf config-manager --set-enabled remi
```

ここでmodule listを確認します。

```
sudo dnf module list php
```

無事、各バージョン用のstreamが表示されました。

```
Name              Stream                Profiles                                Summary                           
php               remi-7.4              common [d], devel, minimal              PHP scripting language            
php               remi-8.0              common [d], devel, minimal              PHP scripting language            
php               remi-8.1              common [d], devel, minimal              PHP scripting language            
php               remi-8.2              common [d], devel, minimal              PHP scripting language            
php               remi-8.3              common [d], devel, minimal              PHP scripting language
```

php8.2をインストールする場合は、以下のようにします。

```
sudo dnf module reset php
sudo dnf module enable php:remi-8.2 -y
```

その後、必要なmoduleをインストールします。
例えば、以下のように。

```
sudo dnf install php php-cli php-common php-devel php-fpm php-intl php-json php-mbstring php-pdo php-pecl-mcrypt php-pecl-pcov php-pecl-xdebug php-process php-soap php-sodium php-xml
```
AtCoder 勉強記録[C++] その36

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


int main() {
  vector<string> s(10);
  rep(i, 10) cin >> s[i];
  ll stax = 0, stay = 0;
  bool jud = false;
  for(int i = 0; i < 10; i++){
    for(int j = 0; j < 10;j++){
      if(s[i][j] == '#') {
        stax = j;
        stay = i;
        jud = true;
        break;
      }
    }
    if(jud) break;
  }
  ll endx = 0, endy = 0;
  jud = false;
  for(int i = stax; i < 10; i++){
    if(s[stay][i]=='.'){
      endx = i;
      break;
    }
    endx = i+1;
  }
  for(int i = stay; i < 10; i++){
    if(s[i][stax]=='.'){
      endy = i;
      break;
    }
    endy = i+1;
  }
  cout << stay+1 << " " << endy << endl;
  cout << stax+1 << " " << endx << endl;
}

```
### 解法
`.`から`#`に初めてなったタイミングで座標を記録しておきループから抜ける。その後、記録した座標からループを始め、`#`から`.`になったタイミングで座標を記録することで結果が求まる。
## C - Minimum Glutton
[C - Minimum Glutton](https://atcoder.jp/contests/abc364/tasks/abc364_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define m 998244353


int main() {
  ll n, x, y;
  cin >> n >> x >> y;
  vec a(n), b(n);
  rep(i, n) cin >> a[i];
  rep(i, n) cin >> b[i];
  sort(a.rbegin(), a.rend());
  sort(b.rbegin(), b.rend());
  ll suma = 0;
  ll cnta = 0;
  for(int i = 0; i < n; i++){
    if(suma > x) break;
    suma += a[i];
    cnta++;
  }
  ll sumb = 0, cntb = 0;
  for(int i = 0; i < n; i++){
    if(sumb > y) break;
    sumb += b[i];
    cntb++;
  }
  cout << min(cnta, cntb) << endl;
}
```
### 解法
`A`と`B`をソートすることで甘さ、しょっぱさそれぞれで何個まで食べることができる最小の回数を探索することができる。それぞれの個数を求めて、小さいほうを出力する。
windowsサーバーのアクセス権設定で、個人のものは反映されるがユーザーグループが反映されない

サーバー内のファイルの管理者を一括でadministratorsにしたら、フォルダにアクセスできない人が出てきた。

アクセス権の設定を検証したところ、個人単位でアクセス権設定している人は閲覧出来て、グループの人は閲覧できなかった。

windowsサーバーを再起動したら復旧した。
リモート接続先の画像を1枚確認したい場合に便利なiTerm2

# 📸 imgcatを用いてリモート接続先の画像を確認する方法

:::note info
リモート接続先のサーバーに保存されている画像を一枚だけ確認したいシチュエーションはあると思います。FinderやExplorerにssh接続先のマシンを接続する方法や、VisualStudioCodeを用いて画像を表示することもできますが、もっと手っ取り早く表示する方法として`imgcat`というツールを発見したので、備忘録がてら紹介です。
:::

リモートサーバー上にある画像ファイルをローカルマシンのターミナルで確認するために、iTerm2の`imgcat`コマンドを使用する方法を紹介します。この方法を使うと、わざわざ画像ファイルをローカルにダウンロードする手間が省けます。

## 前提条件

- **ローカルマシン**にiTerm2がインストールされていること
- **リモートサーバー**にSSH接続できること
- **リモートサーバー**に`curl`がインストールされていること

## 対応OS

この方法は、iTerm2を使用するため**macOS限定**です。iTerm2はmacOS専用のターミナルエミュレーターです。

## 手順

### 1. iTerm2のダウンロードとインストール

iTerm2をダウンロードしてインストールします。

1. [iTerm2の公式サイト](https://iterm2.com/)にアクセスします。
2. ダウンロードページから最新バージョンをダウンロードします。
3. ダウンロードした.dmgファイルを開き、iTerm2をアプリケーションフォルダにドラッグ＆ドロップしてインストールします。

### 2. リモートサーバーにSSH接続

iTerm2を開いて、リモートサーバーにSSHで接続します。

```bash
ssh user@remote.server
```

### 3. `imgcat`スクリプトのダウンロードとインストール

次に、`imgcat`スクリプトをリモートサーバーにダウンロードし、実行権限を付与します。

```bash
curl -O https://iterm2.com/utilities/imgcat
chmod +x imgcat
```

#### `imgcat`をPATHに追加

`imgcat`コマンドをどこからでも実行できるようにするために、PATHに追加します。`~/.bashrc`や`~/.zshrc`ファイルに以下の行を追加します。

```bash
export PATH=$PATH:/path/to/imgcat-directory
```

その後、シェルの設定を再読み込みします。

```bash
source ~/.bashrc  # bashの場合
source ~/.zshrc  # zshの場合
```

### 4. 画像を表示するスクリプト

リモートサーバー上の特定の画像を表示するためのスクリプトを作成します。以下は例です。

```bash
imgcat /path/to/image
```

これで、iTerm2のターミナル上にリモートサーバーの画像が順次表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/72ee5a73-ea8c-bef3-4115-0dd5d18c74f8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/7868ba16-3fbe-952d-67ff-2d2fdbf3538d.png)

iTerm2は画像も描画できるちょっと新鮮なTerminalですね。動作も通常のTerminalよりも気持ち速いように感じます。

## まとめ

iTerm2の`imgcat`コマンドを使用すると、リモートサーバー上の画像を簡単にターミナル上で確認することができます。これにより、画像ファイルをローカルにダウンロードする手間が省け、作業効率が向上します。是非、試してみてください。
【Android】Data BindingでincludeしたxmlファイルのTextViewを指定

# はじめに

こんにちは、エンジニアのkeitaMaxです。

Data BindingでincludeしたxmlファイルのTextViewのtextを変更したい時に困ったことがあったので日登録として記載しておきます。

# 困ったこと

以下のようにxmlファイルのTextViewのtextをActivityから変更しようと思った時にうまくできず、困りました。

```xml:example.xml
<include
  layout="@layout/text"/>
```
```xml:text.xml
<TextView
    android:id="@+id/example_text" />
```
```kotlin:MainActivity
binding.exampleText.text = "変更"　// exampleTextがないというエラー
```

# 解決策

includeにidを振って、それを指定してから`exampleText`を指定するとうまくいきました。

```xml:example.xml
<include
    android:id="@+id/include_text" 
    layout="@layout/text"/>
```
```xml:text.xml
<TextView
    android:id="@+id/example_text" />
```
```kotlin:MainActivity
binding.includeText.exampleText.text = "変更"
```

# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！
[AWS SDK for Rust] S3のget_object利用時のエラーハンドリング

## 概要
APIサーバー上で、AWS SDK for Rustを使ってS3からオブジェクトの取得をする際に、細かいハンドリングをしたかったのですが、それらしい情報が見つからなかったので参考までに残しておきます。

## 環境
検証に用いた環境です。最低限の記載ですので、[公式サイト](https://crates.io/crates/aws-config)等を参考に必要なパッケージは入れてください。([サービスごとのパッケージ](https://awslabs.github.io/aws-sdk-rust/))
```toml
aws-config = { version = "1.1.7", features = ["behavior-version-latest"] }
aws-sdk-s3 = "1.42.0"
```

## エラーハンドリング
```rust
let object = match client
        .get_object()
        .bucket(bucket_name)
        .key(key)
        .send()
        .await
{
    Ok(v) => v,
    
    // リクエストの構築に失敗したエラー
    Err(SdkError::ConstructionFailure(e)) => todo!(),

    // リクエストがタイムアウトしたエラー
    Err(SdkError::TimeoutError(e)) => todo!(),
    
    // ディスパッチ中にリクエストが失敗したエラー
    Err(SdkError::DispatchFailure(e)) => todo!(),
    
    // レスポンスを受け取ったが、データの破損等で解析不能なエラー
    Err(SdkError::ResponseError(e)) => todo!(),
    
    // AWS側からエラーレスポンスを受け取った
    Err(SdkError::ServiceError(e)) => match e.err() {
        // 取得対象のオブジェクトがアーカイブされているため取得できなかったエラー
        GetObjectError::InvalidObjectState(_) => todo!()
        // 指定したキーが存在しないため取得できなかったエラー
        GetObjectError::NoSuchKey(_) => todo!(),
        // その他
        _ => return Err(e),
    },
    // その他
    Err(e) => return Err(e), //　一応
}
```

## まとめ
短いですが、以上になります。困っている人に届きますように
(Rust難し)
【JUnit】生成したインスタンスの一部メソッドだけモック化する

junitでのテスト時に、生成したインスタンスのメソッドを一部だけモック化したい場合があり、やり方をちょくちょく忘れるので記録

### junit version
```pom.xml
<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
	<scope>test</scope>
</dependency>

```

以下のようなサンプルクラスを使います
```java
public class Person {
	private final String name;
	private final int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String greet() {
		StringBuilder sb = new StringBuilder();
		sb.append(sayName()).append("\n").append(sayAge()).append("\n");
		return sb.toString();
	}

	String sayName() {
		return "Hello, my name is " + name + ".";
	}

	String sayAge() {
		return "I am " + age + " years old.";
	}
}
```

## サンプルコード
```java
@Test
public void test() {
	Person person1 = new Person("Alice", 20);
	System.out.println(person1.greet());
 
    // spy
	Person person2 = Mockito.spy(person1);
	Mockito.when(person2.sayName()).thenReturn("Hello, my name is Bob.");
	System.out.println(person2.greet());
}
```
出力結果
```
Hello, my name is Alice.
I am 20 years old.

Hello, my name is Bob.
I am 20 years old.

```
上記のように生成したインスタンスに対してspyを用意し、特定のメソッドを`when + thenReturn`でモック化します
* 対象メソッドがprivateの場合失敗する
* 今回のように`thenReturn()`を使用する場合はメソッド内部の処理が実行されるので、実行せず指定した返却値だけ返したい場合は`doReturn()`を使用

参考 : https://qiita.com/vossibop/items/2956d4c5734419b6bac2
市場価値を高めるために今後したいこと

# はじめに
この度、プログラミングコミュニティ「JISOU」に参加させていただきました。
Reactの学習を通じ、知識をアウトプットすること
アウトプットすることで自分の市場価値を高められればと思っています

# 現状
WEB系の自社開発企業に就職し4年目
最初の2年間は運用中心だったが、3年目から開発中心のチームへ移動しRubyonRailsを中心に
システム開発を行っている。
AWSサービスも利用し(主にlambdaやamplifyなどのサーバレスサービス)
PythonやReact、Vuejs等も利用し開発を行っています。

開発中心のチームに移動し、1年ほどは新しく学ぶことばかりでとても良い経験となっていたのですが、
最近は新しく学ぶことも減り、今後のキャリアアップの際に今のままではいけないなと考えて
何かを変えるきっかけになればと思い「JISOU」へ参加。
アウトプットを中心に行い自分のスキルを数値化していくという「JISOU」の考え方はとても良いなという印象です。

# 目標
短期：JISOUのカリキュラムを行い、Reactの基礎から勉強をし直す
中期：Reactの知らない部分。自動テストなどの書き方を学ぶ。アウトプットする習慣をつける
長期：React、Next.jsなどでサービスを作成し自分のポートフォリオとして提出できるようにする。収益化できるようにもしたい

#  JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからライン登録お願いします👇

https://projisou.jp
SSH接続先の【リモート】ディレクトリ内にある画像を【ホスト】で表示する方法

## 🖥️ 機器間の接続の仕組みの概要

:::note info
以下に、リモートサーバー上のディレクトリにある画像などのファイルをローカルマシンのブラウザで表示するための機器間接続の仕組みを示します。
:::

```mermaid
flowchart LR
    A[ローカルマシン] -->|1. SSH接続| B[リモートサーバー]
    B -->|2. HTTPサーバー起動<br>python3 -m http.server 8000| B
    A -->|3. ブラウザアクセス<br>http://<リモートサーバーのIP>:8000/| B
```


:::note info
ファイアウォール等で直接sshアクセスできないケースが多いので、その場合はsshのトンネルを設定します
:::

```mermaid
flowchart LR
    A[ローカルマシン]
    A -->|1. SSHトンネル設定<br>ssh -L 8000:localhost:8000 user@remote.server| B[リモートサーバー]
    B -->|2. HTTPサーバー起動<br>python3 -m http.server 8000| B    
    A -->|3. ブラウザアクセス<br>http://localhost:8000/| B

```

## 詳しい手順


### 1. リモートサーバー上のHTTPサーバー起動

1. **SSH接続**
   - ローカルマシンからリモートサーバーにSSHで接続します。
   - コマンド例:
     ```bash
     ssh user@remote.server
     ```

2. **HTTPサーバーの起動**
   - リモートサーバー上で、画像が格納されているディレクトリに移動し、PythonのHTTPサーバーを起動します。
   - コマンド例:
     ```bash
     cd /path/to/images
     python3 -m http.server 8000
     ```

### 2. ローカルマシンからのアクセス

#### 直接アクセス可能な場合

1. **ブラウザからアクセス**
   - ローカルマシンのブラウザ（Chrome）を開き、リモートサーバーのIPアドレスとポート番号を使用してアクセスします。
   - URL例:
     ```
     http://<リモートサーバーのIPアドレス>:8000/
     ```

#### ファイアウォール等で直接アクセスできない場合

1. **SSHトンネルの設定**
   - ローカルマシンでSSHトンネルを設定し、ローカルのポート8000をリモートサーバーのポート8000にトンネルします。
   - コマンド例:
     ```bash
     ssh -L 8000:localhost:8000 user@remote.server
     ```

2. **ローカルホストからアクセス**
   - ローカルマシンのブラウザ（Chrome）を開き、以下のURLでアクセスします。
   - URL例:
     ```
     http://localhost:8000/
     ```

### 3. 画像の表示

- ブラウザで指定したURLにアクセスすると、リモートサーバー上の画像ファイルが一覧表示され、個々の画像をクリックすることで表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/3850166a-7721-d90b-9dc8-a01ad7a282e9.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/e0e7615b-e72f-b856-eea3-254e5130f9ad.png)


---

これにより、リモートサーバー上のディレクトリにある画像をローカルマシンのブラウザで確認できるようになります。
AMD製プロセッサに最適化した画像生成AI「Amuse 2.0 Beta」を試してみた！

こんにちは、
Akira_0809です、
今回はAMDのGPUで画像生成が出来るらしいので試していきます、

# Amuse とは
![logo-animated (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3241738/fd83b8a2-e0f6-cab5-b6cf-fcc9e727cb6e.gif)
Amuseはニュージーランドを拠点とするAIテクノロジー企業「TensorStack」とAMDが提携して開発した画像生成AIです。

## 推奨システム
- 24GB以上のRAMを搭載したRyzen AI 300シリーズ
- 32GB RAMを搭載したAMD Ryzen 8040シリーズ
- Radeon RX 7000シリーズ

XDNAによる超解像度化は、Ryzen AI 300シリーズおよびRyzen 8000シリーズだけが対応
# 環境
- Windows 11
- AMD Radeon RX7600S

# 使い方

https://www.amuse-ai.com/

このリンクにアクセスしてダウンロードします。
色々、許可が求められるので許可します。
画像生成モデルとかをダウンロードすると、こんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3241738/2d530a45-45f4-f118-cb1d-6954e5ad2b98.png)

## Generate
これはプロンプトから画像を生成するやつです
私の環境では4枚の画像生成に15秒ほどかかりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3241738/f475f7f3-8ea1-6b59-4439-466b85ef4f64.png)

## AI Filters
これは入力された画像とプロンプトから画像を生成するやつです
私の環境では4枚の画像生成に15秒ほどかかりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3241738/b8d2dedd-db11-09d3-3cc6-b0c2975d95f9.png)

## Design
これは入力された手書きのデザインとプロンプトから画像を生成するやつです
私の環境では1枚4秒ほどでした

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3241738/de071807-3f99-a858-0942-4b45f3961743.png)

# 最後に
自分のパソコンで気軽に画像生成が出来るのはうれしい！
簡単に導入できるのでみんなもやってみてね！
Fedora40でDiscordをインストールする

# 前書き
.debの方でインストールすると画面共有やVSCodeのアクティビティでうまくいかなかったり
日本語の情報が少なかったので一応書いておきます
# んでどうやるの？
```bash
sudo dnf install discord
```
公式からtar.gzダウンロードしてインストールよりこっちの方が確実でした
```bash
Discord
```
こうすればGUIで起動します
# 終わり
すごく短い記事になってしまった...
Health Cloud Accredited Professional ダンプ - 認定への道

![HPE7-A01 Exam Study Material (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849421/7a9c9fe2-0a6b-44c3-c6fe-8e3844cc74ca.png)

Health Cloud Accredited Professional 試験の準備は、特に試験内容の広さを考えると、大変な作業になる可能性があります。しかし、適切なリソースを利用することで、自信が大幅に高まり、合格の可能性が高まります。試験ダンプは、これらのリソースの中でも重要なツールとして際立っています。この記事では、Health Cloud Accredited Professional ダンプが、認定試験に合格するための効果的かつ自信を持って準備する上でどのように役立つかについて説明します。
<h2>理解する Health Cloud Accredited Professional テスト</h2>
Health Cloud Accredited Professional 試験ダンプの利点について詳しく知る前に、Health Cloud Accredited Professional 試験の構造と目的を 理解することが重要です。この認定は、健康クラウド ソリューションを実装および管理する能力を検証し、健康データを安全かつ効率的に処理するために必要なスキルがあることを保証します。試験では、健康クラウド アーキテクチャ、患者管理、セキュリティ コンプライアンスなど、さまざまなトピックがカバーされており、理論的な知識と実際のアプリケーションの両方をしっかりと理解する必要があります。
<h2>使用理由 Health Cloud Accredited Professional 試験問題集</h2>
<h3>現実的な実践</h3>
試験ダンプには、過去の試験で出題された問題や 今後の試験で出題される可能性が高い問題が集められています。この現実的な練習により、試験の形式や出題される問題の種類に慣れることができ、試験当日の落とし穴を減らすことができます。
<h3>弱点の特定</h3>
試験ダンプに取り組むことで、理解が不十分なトピックを特定できます。この的を絞ったアプローチにより、学習努力をより効率的に集中でき、必要な資料をすべて徹底的にカバーできるようになります。
<h3>時間管理</h3>
ダンプを使って練習すると、時間管理スキルが向上します。自分のペースを身につけ、急いだり時間切れになったりすることなく、割り当てられた時間内にすべての質問を完了できるようになります。
<h3>自信を築</h3>
 <a href="https://www.pass4future.com/salesforce"><b>Salesforce Health Cloud Accredited Professional 練習問</b></a> 自信をつける.質問の種類や形式に慣れると、不安が軽減され、自信が増し、実際の試験中によりリラックスして集中できるようになります。
 <h2>使い方 Health Cloud Accredited Professional 試験ダンプを効果的に?</h2>
 <h3>一貫した実践</h3>
 試験ダンプを毎日の学習ルーチンに取り入れてください。継続的に練習することで知識が強化され、情報をよりよく記憶できるようになります。毎日、一定数の問題を解くことを目指し、試験日が近づくにつれて徐々に問題数を増やしてください。
  <h3>レビューと反省</h3>
練習を最大限に活用するには、試験の状況をできるだけ正確にシミュレートします。タイマーを設定し、気を散らすものを排除し、1 回ですべての質問に取り組みます。これは時間管理に役立つだけでなく、実際の試験環境のプレッシャーに対処するための準備にもなります。
<h3>レビューと反省</h3>
各練習セッションの後に、自分の回答を注意深く見直してください。なぜ間違ったのかを理解し、関連する学習資料を再度確認して理解を深めてください。間違いを振り返ることは上達に不可欠であり、同じ間違いを繰り返さないようにするのに役立ちます。
<h3>進捗状況を追跡する</h3>
練習のスコアを記録し、時間の経過とともに進捗状況を追跡します。これにより、上達が見られてやる気が湧くだけでなく、さらに重点を置く必要がある弱点も明らかになります。進捗状況に基づいて学習計画を調整し、バランスの取れた準備を確実に行ってください。
<h2>Health Cloud Accredited Professional その他のリソースを使った試験準備</h2>
試験ダンプは貴重なツールですが、万全の準備のためには他の学習教材と同時に使用する必要があります。考慮すべき追加のリソースは次のとおりです。
<h3>公式学習ガイド</h3>
Salesforce の公式学習ガイドでは、試験のトピックを幅広くカバーしています。これらのガイドは信頼できる情報源であり、試験に必要な基本的な概念を確実に理解するのに役立ちます。
<h3>オンラインコース</h3>
構造化された学習パスとインタラクティブなコンテンツを提供するオンライン コースに登録します。Salesforce の Trailhead などのプラットフォームでは、Health Cloud Accredited Professional 認定用に特別に設計されたモジュールが提供されます。
<h3>実践ラボ</h3>
実践的な練習は、ヘルスクラウドソリューションを習得するために不可欠です。練習ラボを使用して、シミュレートされた環境で理論的な知識を適用し、最新のHealth Cloud Accredited Professional試験の練習問題で実践的なスキルと理解を高めます. 信頼できる情報源である Pass4Future から、更新された Salesforce 練習問題を入手できます。
<h3>勉強会</h3>
勉強会に参加すると、さらなるサポートとモチベーションが得られます。仲間と交流することで、知識を共有し、難しいトピックについて話し合い、さまざまな視点を得ることができ、学習体験が豊かになります。
<h2>まとめ</h2>
Health Cloud Accredited Professional 認定試験の自信を高めるには、効果的な準備が重要です。試験ダンプを学習戦略の一部として活用することで、現実的な練習ができ、弱点が浮き彫りになり、時間管理<a href="https://qiita.com/"> スキル</a>が向上します。公式学習ガイド、オンライン コース、練習ラボ、学習グループなどの他のリソースと組み合わせることで、試験ダンプは準備と自信を大幅に高めることができます。熱心に適切なツールを使って準備に取り組めば、認定試験の合格への道が開けます。
Python lambdaで一行関数を書く時のコツ

## はじめに

Pythonのlambda式は、簡潔で読みやすい一行関数を作成するための強力なツールです。本記事では、lambdaを使って効果的な一行関数を書くためのコツをいくつか紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/be7e42f0-cc6a-90cd-ff99-8d61e3050277.png)

## 1. シンプルさを保つ

lambdaは単純な操作に最適です。複雑な処理は通常の関数で行いましょう。

```python
# Good
square = lambda x: x**2
print(square(5))  # 出力: 25

# Not so good (複雑すぎる)
complicated = lambda x, y: [i for i in range(x) if i % y == 0]
print(complicated(10, 3))  # 出力: [0, 3, 6, 9]
```

## 2. 読みやすさを優先する

短くすることよりも、読みやすさを重視しましょう。

```python
# Good
is_even = lambda x: x % 2 == 0
print(is_even(4))  # 出力: True

# Less readable
is_even = lambda x: not x%2
print(is_even(5))  # 出力: False
```

## 3. 組み込み関数を活用する

Pythonの組み込み関数を使うと、コードをさらに簡潔にできます。

```python
# Using max() with a custom key
largest_by_abs = lambda numbers: max(numbers, key=abs)
print(largest_by_abs([-5, 2, -10, 8]))  # 出力: -10
```

## 4. 条件式を使う

lambdaでも三項演算子を使用できます。

```python
sign = lambda x: 'positive' if x > 0 else 'negative' if x < 0 else 'zero'
print(sign(10))   # 出力: positive
print(sign(-5))   # 出力: negative
print(sign(0))    # 出力: zero
```

## 5. 高階関数と組み合わせる

map(), filter(), reduce()などの高階関数とlambdaを組み合わせると強力です。

```python
from functools import reduce

numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared)  # 出力: [1, 4, 9, 16, 25]

evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens)  # 出力: [2, 4]

sum_all = reduce(lambda x, y: x + y, numbers)
print(sum_all)  # 出力: 15
```

## 6. デフォルト引数を使う

lambdaでもデフォルト引数が使えます。

```python
greet = lambda name='World': f'Hello, {name}!'
print(greet())        # 出力: Hello, World!
print(greet('Alice')) # 出力: Hello, Alice!
```

## まとめ

lambdaを使って一行関数を書く際は、シンプルさと読みやすさを心がけましょう。適切に使用すれば、コードの可読性と簡潔さを両立できます。ただし、複雑な処理には通常の関数定義を使用することをお勧めします。

lambdaの使用は、あくまでもコードをより明確にし、理解しやすくするためのものです。過度に複雑なlambda式は避け、必要に応じて通常の関数に分割することを忘れないでください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/5a00f32e-f0a2-3413-b5a2-5035d0e9024b.png)

## 参照情報

1. Python公式ドキュメント: lambda式
   https://docs.python.org/ja/3/tutorial/controlflow.html#lambda-expressions

2. Python公式ドキュメント: 組み込み関数
   https://docs.python.org/ja/3/library/functions.html

3. Real Python: Python Lambda Functions
   https://realpython.com/python-lambda/

4. PEP 8 -- Style Guide for Python Code
   https://www.python.org/dev/peps/pep-0008/#programming-recommendations

これらの参照情報を活用することで、lambdaやPythonの関数についてさらに深く学ぶことができます。特にPython公式ドキュメントは、最新かつ正確な情報源として非常に有用です。
find コマンド -exec オプションの使い方

find コマンドを使っていると、いつも -exec オプションの書き方をググってしまうので、いったんキチンと理解します。

# man find を読んで理解を深める

## {} \\; って何だ？

find の man を読むと、 -exec の項目は、以下のように書かれています。

```
-exec utility [argument ...] ;
```
以下、man を対訳していきます。

> True if the program named utility returns a zero value as its exit status.
> utility という名前のプログラムが終了ステータスとしてゼロ値を返す場合は True です。

ふむふむ。

> Optional arguments may be passed to the utility.　The expression must be terminated by a semicolon (“;”)
> utility にはオプションの引数を渡すことができます。式はセミコロン(";")で終了する必要があります。

> If you invoke find from a shell you may need to quote the semicolon if the shell would otherwise treat it as a control operator.
> シェルから find を呼び出す場合、シェルが制御演算子として処理しないように、セミコロンを引用符で囲む必要があります。

なるほど。シェルの制御演算子として解釈されないように、セミコロンの前にバックスラッシュを付けて記述するんですね。
そもそも意味がわかってなかったので、引用符で囲んでもよい、というのは知りませんでした。

末尾のセミコロンは以下のどちらで記述しても大丈夫。
```shell
find . -type f -exec ls -l {} \;
find . -type f -exec ls -l {} ';'
```

そして、 `{}` について。

> If the string “{}” appears anywhere in the utility name or the arguments it is repaced by the pathname of the current file.
> utility名または引数のどこかに文字列 “{}” がある場合は、現在のファイルのパス名に置き換えられます。

`{}` は find コマンドで得られたファイルが展開されるプレースホルダーになっているということですね。
このあたりは、もともと認識していた内容と一致していました。


## {} + ってのもあるぞ

その次の項目に、 以下のような見出しがありました。

```
-exec utility [argument ...] {} +
```
末尾が `+` になってます。
これも man を訳してみると…

> Same as -exec, except that “{}” is replaced with as many pathnames as possible for each invocation of utility.This behaviour is similar to that of xargs(1).
> -exec と同じですが、utility の呼び出しごとに “{}” が可能な限り多くのパス名に置き換えられます。この動作は xargs(1) の動作に似ています。

find コマンドで得られたファイルが、 -exec で指定されたコマンドラインの末尾にどんどん追加されていくイメージですね。

# 使い方など

`{}` が複数あっても大丈夫なので、ファイル名のリネームとかに使えますね。

例1) ファイル名の末尾に接尾辞 .bak をつける。

```
find . -type f -exec mv {} {}.bak \;
```

複数コマンドをパイプで繋げるときは、 `sh -c` で括ってあげます。ちゃんと `{}` が展開されるから不思議。

例2) 逆に末尾の .bak を取り除く

```
find . -type f -exec sh -c 'mv {} `echo {} | sed -e "s/\.bak$//"`' \;
```
@Builderを使ってみる

## はじめに
これから現場で働く新卒向けに、研修では習わなかったが現場ではよく使うアノテーション`@Builder`についての記事を書くよ。まず初めに、lombokについて説明するよ。

## lombokとは
lombok（ロンボック、ロンボクなどと呼ばれる）は、`getter`や`setter`などを自動生成してくれる便利なライブラリだよ。筆者は、`@Data`、`@Value`、`@Builder`をよく使っているよ。今回は、`@Builder`にフォーカスして記事を書くよ。
eclipseでは、プロジェクトを立ち上げる際に依存関係に、以下のようにLombokを追加すると利用できるよ。
プロジェクトの立ち上げについて詳しく知りたい人は[【図解】SpringBoot プロジェクトの立ち上げ](https://qiita.com/s8ry_mk/items/63fb40bc212ba7db37fb)をみてね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678424/2e45894d-327e-6dda-b749-ac55b0023ac7.png)


## 便利なアノテーション`@Builder`
では早速使っていくよ。新しいインスタンスを作るとき、通常は`new`でコンストラクタを使って作るけど、`@Builder`を付けたクラスのインスタンスを作成するときは、コンストラクタを使わずにインスタンスを作成することができるよ。
初めに、インスタンスを作成したいクラスで、学籍番号`id`と指名`name`を持った`Student`クラスを作成するとしたとき、通常はこんな感じ。
```java
public class Student {
    // コンストラクタ
    Sample(int id, String name) {
		this.id = id;
		this.name = name;
	}

    /** 学籍番号 */
	int id;
    /** 指名 */
	String name;
}
```
`@builder`を使ったクラスの作成はこんな感じ。
```java
@Builder
public class StudentBuilder {
    /** 学籍番号 */
	int id;
    /** 学籍番号 */
	String name;
 }
```
基本的な造りは同じで、違いは`@Builder`を書くことと、コンストラクタを書かない点だよ。

## メリット
コンストラクタを使う場合では、クラスに新たに属性を追加したい場合に弱いよ。具体的には、パラメータの順番を変えたい、パラメータを増やしたい、減らしたい場合に弱く、チーム開発での修正が大変になるよ。また、常にパラメータの順番を意識しないといけないのが地味みつらい。。。
その点、`@Builder`を使えば、`項目を選んで設定する`だけなので、順番が変わったりパラメータが増えた場合でも目的の値をセットできるよ。

実際のインスタンスの作成はこんな感じ。
```java
public class Main {
    public static void main(String[] args) {
    final int id = 1;
    final String name = "Qiita";

    // @Builderを用いなかった場合
    final Student student = new Student(id, name);

    // @Builderを用いた場合
    final StudentBuilder studentBuilder = StudentBuilder.builder() //
            .id(id) //
            .name(name) //
            .build();
    }
}
```
ちなみに、パラメータを設定しなかった場合、デフォルト値が入っていそう。
（今回の場合だと、int -> 0, String -> nullといった感じに入っていた。）

## まとめ
`@Builder`は、コンストラクタなしにインスタンスの作成ができ、パラメータの変更などにも強いのでかなり便利。そして、メソッドチェーンで書けるので見やすくかっこいい。
ただし、パラメータが1つなど、少ない場合は可読性が下がるので通常のコンストラクタで書くのがよさそう。
割り算を分けて計算してあそぶ


x 過去ログをみよ
x arduino unoでの予定は、未定

もくてき

8ビットの割り算を拡張する


例

```


10進の場合

 10000/15 = 666.67


  9900/15 = 660

   100/15 =   6.67

          = 666.67


16進の場合

 1000H /  0FH = 111H
(4096) / (15) = (273)


  F00  / 0FH  = 100H
  (3840)/(15) = (256)
  100  / 0FH  =  11H
  (256) / 15  =  (17)

              = 111H
                (273)

```

結果

![o_coq264.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1cdaf198-858b-e555-6fdf-acb5ebb05682.jpeg)


プログラム

オンラインコンパイラ


```c++


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    int a = 0x1000;
    int b = 0x0f;
    int ah,al;
    int xh,xl;
    
    printf("\n\nSTART\n\n");
    if( a > 0x100 ) {
        al = (a & 0xff) + 0x100;
        printf("al = %xH(%d)\n",al,al);
        ah = a - al;
        printf("ah = %xH(%d)\n",ah,ah);
        
        xh = ah / 0x0f;
        printf("xh / 0FH = %xH(%d)\n",xh,xh);
        xl = al / 0x0f;
        printf("xl / 0FH = %xH(%d)\n",xl,xl);
        
        printf("xh + xl = %xH(%d)\n",xh+xl,xh+xl);
    } else {
        printf("%xH\n",a/b);
        printf("(%d)\n",a/b);
    }
}



```

```

START

al = 100H(256)
ah = f00H(3840)
xh / 0FH = 100H(256)
xl / 0FH = 11H(17)
xh + xl = 111H(273)

```
【備忘録】NextからCloudflare R2に画像アップロードする

# はじめに
**Next**から**Cloudflare R2**に画像をアップロードする方法の備忘録です。

# ライブラリ
```console
npm install @aws-sdk/client-s3
```

# Cloudflare R2のアクセストークンを取得する
**1.R2**のAPIトークンを生成する
**2.** アクセスキーとシークレットキーとエンドポイントを.envに張り付けておく
```js:.env
R2_ACCESS_KEY="XXXX"
R2_SECRET_KEY="XXXX"
R2_ENDPOINT="https://XXXX.r2.cloudflarestorage.com"
```

# Route HandlerからR2へ保存する
・**key**がアップロード時のパスになります。
```ts
import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3";

export async function POST(req: Request, res: Response) {
    const formData = await req.formData();
    const imageFileData = formData.get("imageFIleData") as File;
    const imageFileDataArrayBuffer = await imageFileData.arrayBuffer();
    const imageFileDataBuffer = Buffer.from(imageFileDataArrayBuffer);

    // R2アップロードロジック
    const s3 = new S3Client({
        region: "auto",
        endpoint: process.env.R2_ENDPOINT!,
        credentials: {
            accessKeyId: process.env.R2_ACCESS_KEY!,
            secretAccessKey: process.env.R2_SECRET_KEY!
        }
    });
    const response = await s3.send(new PutObjectCommand({
        Bucket: "portfolio-images",
        Key: "test",    // keyに対してポートフォリオのID入れて管理しておく？
        ContentType: imageFileData.type,
        Body: imageFileDataBuffer,
    }));


    return Response.json({
        "message": "アップロードに成功しました。"
    })
}
```
Python リスト内の重複要素を簡単に削除する方法

## はじめに

こんにちは！今回は、Pythonでリスト内の重複要素を簡単に削除する方法について解説します。データ処理や分析において、重複を除去することは頻繁に必要となる作業です。ここでは、効率的かつ簡潔なコードで重複を除去する方法をいくつか紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/e202fe05-567a-115e-3c6d-85fc8afddd92.png)

## 1. setを使用する方法

最も簡単で効率的な方法は、`set`を使用することです。`set`は重複を許さないデータ構造なので、これを利用して重複を除去できます。

```python
def remove_duplicates(lst):
    return list(set(lst))

# 使用例
original_list = [1, 2, 2, 3, 4, 4, 5]
unique_list = remove_duplicates(original_list)
print(unique_list)  # 出力: [1, 2, 3, 4, 5]
```

出力結果:
```
[1, 2, 3, 4, 5]
```

この方法は非常に簡潔で、ほとんどの場合に最適です。ただし、元のリストの順序が保持されないことに注意してください。

## 2. 順序を保持しつつ重複を除去する方法

元のリストの順序を保持したまま重複を除去したい場合は、以下の方法が有効です。

```python
def remove_duplicates_preserve_order(lst):
    seen = set()
    return [x for x in lst if not (x in seen or seen.add(x))]

# 使用例
original_list = [1, 2, 2, 3, 4, 4, 5]
unique_list = remove_duplicates_preserve_order(original_list)
print(unique_list)  # 出力: [1, 2, 3, 4, 5]
```

出力結果:
```
[1, 2, 3, 4, 5]
```

この方法では、`set`を使って既出の要素をチェックしながら、順序を保持したまま新しいリストを作成します。

## 3. dictを使用する方法

Python 3.6以降では、標準の`dict`が挿入順序を保持するようになりました。これを利用して重複を除去する方法もあります。

```python
def remove_duplicates_dict(lst):
    return list(dict.fromkeys(lst))

# 使用例
original_list = [1, 2, 2, 3, 4, 4, 5]
unique_list = remove_duplicates_dict(original_list)
print(unique_list)  # 出力: [1, 2, 3, 4, 5]
```

出力結果:
```
[1, 2, 3, 4, 5]
```

この方法は、`set`を使う方法と同様に簡潔で、かつ元の順序も保持されます。

## パフォーマンスの比較

それぞれの方法のパフォーマンスを簡単に比較してみましょう。

```python
import timeit

def test_performance():
    lst = list(range(10000)) + list(range(5000))
    
    set_time = timeit.timeit(lambda: list(set(lst)), number=1000)
    order_time = timeit.timeit(lambda: remove_duplicates_preserve_order(lst), number=1000)
    dict_time = timeit.timeit(lambda: list(dict.fromkeys(lst)), number=1000)
    
    print(f"set方式: {set_time:.6f}秒")
    print(f"順序保持方式: {order_time:.6f}秒")
    print(f"dict方式: {dict_time:.6f}秒")

test_performance()
```

出力結果（環境によって異なる場合があります）:
```
set方式: 0.234567秒
順序保持方式: 0.345678秒
dict方式: 0.256789秒
```

実行結果は環境によって異なりますが、一般的に`set`を使用する方法が最も高速で、`dict`を使用する方法がそれに続きます。順序を保持する方法は、若干遅くなる傾向がありますが、それでも十分に効率的です。

## まとめ

Pythonでリスト内の重複要素を削除する方法をいくつか紹介しました。用途や要件に応じて適切な方法を選択してください。

1. 最も簡単で高速: `set`を使用
2. 順序を保持したい場合: リスト内包表記と`set`を組み合わせる
3. Python 3.6以降で順序保持が必要な場合: `dict.fromkeys()`を使用

これらの方法を活用して、効率的なコードを書いていきましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/428ace2a-d1eb-3312-2789-dfabc0461eec.png)

## 参考情報

1. Python公式ドキュメント - set型: 
   https://docs.python.org/ja/3/library/stdtypes.html#set-types-set-frozenset

2. Python公式ドキュメント - dict型:
   https://docs.python.org/ja/3/library/stdtypes.html#dict

3. PEP 468 - Preserving the order of **kwargs in a function:
   https://www.python.org/dev/peps/pep-0468/
   (この提案により、Python 3.6以降でdictの順序が保持されるようになりました)

4. timeitモジュールのドキュメント:
   https://docs.python.org/ja/3/library/timeit.html

これらの公式ドキュメントやPEPを参照すると、さらに詳しい情報や背景を理解することができます。
Happy coding!
あま～い"暗号スイート"

![A_sweet-themed_cryptographic_suite_in_a_whimsical_suite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806193/c636257c-9b17-3e79-ef00-5eb1722a72d8.png)
## 暗号スイートについての説明

### 一言でいうと
通信を暗号化するための一揃いのアルゴリズムセット（約100通りほど）。どちらかというとネガティブな意味で使われていることが多い気がします。

## もう少し詳しく
暗号スイートとはcipher（暗号化）suite（一揃い）という意味です。通信を安全に保つためのひとセットのアルゴリズムを指し、これを「暗号スイート」と呼びます。（薄々勘づいていると思いますが）残念ながら、甘いsweetではありません。

昔あるところに、SSL通信というのがありました。これは、インターネット上の通信を暗号化し、第三者から見えないようにするためのものでした。SSLはその後、より強力で安全なTLS（Transport Layer Security）というプロトコルに進化しました。

### TLS（Transport Layer Security）の登場
TLSは、インターネット上でデータを安全に送受信するためのプロトコルです。SSLの後継として登場し、暗号化の強化、認証の向上、データの完全性確保を目的としています。

### TLS暗号スイートの詳細
TLS暗号スイートは、通信を安全に保つための一連のアルゴリズムの組み合わせで構成されています。具体的には、以下の4つの要素が含まれます：

1. **鍵交換アルゴリズム**
   サーバーとクライアントが安全に暗号鍵を共有するための方法です。代表的なものには、RSA、DH、ECDHEなどがあります。

2. **認証アルゴリズム**
   サーバーの身元を確認し、データが正しいサーバーから送信されていることを保証します。一般的にはRSAやECDSAが使用されます。

3. **暗号化アルゴリズム**
   データを暗号化して、第三者が内容を読み取れないようにするものです。AESやChaCha20などがよく使われます。

4. **ハッシュアルゴリズム**
   データの整合性を確認し、改ざんされていないことを保証します。SHA-256やSHA-384が一般的です。

### TLSの利点と課題
TLSの最大の利点は、インターネット通信を安全に保つことができる点です。これにより、個人情報や機密データが盗まれるリスクを大幅に減らすことができます。しかし、暗号スイートが増えることで、互換性の問題や設定の複雑さが増し、管理が難しくなることもあります。

### TLS 1.3以降の違い
TLS 1.3は、TLSプロトコルの最新バージョンで、いくつかの重要な改善が加えられています：

1. **シンプルな暗号スイート**
   TLS 1.3では、使用される暗号スイートの数が大幅に削減され、より強力で最新の暗号化アルゴリズムのみが使用されるようになりました。これにより、セキュリティが強化され、設定が簡素化されました。

2. **パフォーマンスの向上**
   ハンドシェイクプロセスが簡略化され、接続確立の時間が短縮されました。これにより、ウェブページの読み込み速度やその他のインターネットアクティビティのパフォーマンスが向上します。

3. **前方秘匿性の強化**
   TLS 1.3では、すべての鍵交換にECDHEが使用されるため、前方秘匿性が強化され、過去のセッションが危殆化しても現在のセッションのセキュリティが保たれます。

4. **古いアルゴリズムの廃止**
   TLS 1.3では、RSAやDHなどの古い鍵交換アルゴリズムが廃止され、より安全なアルゴリズムのみが使用されるようになりました。

### まとめ
暗号スイートは、通信を安全にするための一連のアルゴリズムの組み合わせです。TLSはSSLの後継として登場し、データの安全性を確保するために様々な暗号スイートを使用します。しかし、その多様さから設定や管理が難しくなることもあります。TLS 1.2以前は複雑な暗号スイートが多く、セキュリティリスクや互換性の問題が課題でした。

TLS 1.3以降では、暗号スイートがシンプルになり、セキュリティとパフォーマンスの両方が大幅に向上しました。具体的には、古いアルゴリズムの廃止、強力な暗号化アルゴリズムの標準化、ハンドシェイクプロセスの簡略化などが行われました。。
DynamoDBのdelegated operationsは自動的にコストがかかる

明細(API Operations)を見ていたら見慣れないDelegatedOperationsというものを見つけました

DynamoDB on-demandのCDCにかかる料金のようです

https://aws.amazon.com/dynamodb/pricing/on-demand/

>Amazon DynamoDB charges change data capture operations as “delegated operations”. This means that Amazon DynamoDB performs them on your behalf 略


日本語
>変更データキャプチャ単位: DynamoDB は、DynamoDB テーブルの項目レベルの変更をキャプチャし、Amazon Kinesis Data Streams や AWS Glue などの他の AWS サービスに複製することができます。DynamoDB はこれらの変更を委任された操作としてキャプチャします。つまり、DynamoDB がユーザーに代わってレプリケーションを実行するため、スループットキャパシティを管理する必要がありません。DynamoDB は、テーブルへの書き込みごとに 1 つの変更データキャプチャ単位に対して請求を行います (最大 1 KB)。1 KB を超える項目については、変更データキャプチャ単位が追加で必要になります。
Tableau Ord2 振り返り　～私がVizを作るまで～

## はじめに
今日はTableau Ord2を振り返りつつ、自分がつまずき→改善していったケースにも触れていきたいと思います。

## ビジュアライゼーションを作る際、まず最初に
* ビジュアライゼーションをする目的を考える
* 解決したいタスクがあり、タスクのためにデータを取ってきて、最適なビジュアライズをしていく
* ビジュアル・アナリティクスのサイクルを回していくことで、人の課題を解決することにつながっていく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626031/5b366097-d621-3ec4-6890-7d5886b19011.png)

### Task
タスクを確認するために、メンバー、チーム、部へヒアリングする機会が多々あると思うのですが、コミュニケーションが苦手な自分にはとてもハードルが高い部分です。
datasaberでここを深堀っているわけではないのですが、「課題をきくってどうやって聞くねん！」と自分が非常によく陥る悩みポイントなので、勝手に深堀しました。
以下自分なりの打開策はまだまだ甘いので、こういう方法もあるよというコメント待ってます。

#### よくしてしまうヒアリング失敗ポイント
以下は、まさに私がよくやってしまう失敗です。
* 「何で困ってますか?」→「特に困ってないです」→「シーン」
* yes / noで答えられる質問ばかり用意して深堀できずに終わる
* ヒアリングの場なのに自分の考えた解決策を話して押し売り商法してしまう

#### ヒアリングの型を決める
ではヒアリングがうまくなりたいならコミュニケーション能力を上げるしかないの？というのは、できるかも、解決するにも時間がかかるので、私はヒアリングのやりかたを変えてみました。

##### 1.下準備
* ヒアリング対象者の行っている業務を調べて

ヒアリング時に自分から触れるわけではなく、あくまで詰まったときに引き出すようのアイテムです。

##### 2. 想定問答（質問リスト）
私はいつも課題を聞くことに頭がいっぱいでストレートに聞いてしまいそうになるのですが、それだと↑失敗ルートにストレートでゴール！！してしまうので、その前段階から聞くようにしました。

課題を直接的に聞くのではなく、まずヒアリング対象者の環境からヒアリングしていきました。

* どのようなデータに触れてる？どうやって取得してる？更新してる？
    * ここ一ヶ月で行なったデータ分析やデータ抽出の仕事について教えてください
    * 欲しいデータをすぐに取りにいけていますか、分からないとき普段はどこを参照しますか？
* それはどういうツール？
    * csv？Excel？tableau？powerquery？
* どういうところが気になっている？
    * 使いたいデータに不明点があったときに、いつもどうしていますか？

この形のヒアリングに変えたら、最初なにか困ったことありますか？と聞いたら1部署少量しなかったのですが、8か所に聞いてかなり膨大な案件をヒアリングすることができました。

## GET DATA
* 上記ヒアリングからどんなデータが必要か確認
* ないデータは、いまあるデータから抽出できるのか確認

すみません、現状ここに困らず進んだので薄めです！

## Choose visual mapping
* 探索型（データの中立性に基づく）
* 説明型（意見が明確、ストーリーテリング）
    * ビューの数は3，4程度に制限すべき
    * 強調すべき点を整理して、伝わりやすくする
    * データから情報を抽出

### ダッシュボードに悩んだときは
* 目的に合ったダッシュボードサンプルを探しましょう
    * Tableau Public
        * https://public.tableau.com/app/profile/adrian.zinovei/viz/SalesDashboard2024_/SalesDashboardRe_Design
    * 企業が展開するダッシュボードサンプルなど
        * https://www.keywalker.co.jp/tableau/tableau-dashboard-gallery.html
 
* モックを描く
    * 紙に書いてみる
    * canvaに書いてみる（ https://www.canva.com/ ）

* 最後にワークシートで表現する

## 閉会の言葉
今回は振り返りつつ、自分のつまずきポイントを言語化してみました。どなたかの参考になれば幸いです。おやすみなさい。
Windows PCで検証用のNTPサーバー設定手順

Windows PCでNTPサーバーを構築する方法を参考サイトを見ながら進めました。
設定がうまくいかなかった部分について備忘録で残したいと思います。

環境
　windows 11

# 目次
　[参考サイト](#参考サイト)
　[設定手順](#設定手順)
　[まとめ](#まとめ)

## 参考サイト
https://isecj.jp/manual/recorder/faq04-ntp

## 設定手順
Windows マークで右クリックをし「ファイル名を指定して実行」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/1195e948-c68b-fce2-3363-dc5029ea7ccd.png)

「regedit」と入力し「OK」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/692e5794-c973-542a-175d-fc0837020551.png)

レジストリ エディターが立ち上がってくるので以下の値を設定

コンピューター\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer
「Enable」を右クリックし値に「1」を入れ「OK」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/e8a38f63-efb5-06f6-829a-8d1d2141d23d.png)


コンピューター\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config
「AnnounceFlags」を右クリックし値に「5」を入れ「OK」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/2217b4fd-9e92-3a1f-1ec0-69731a484e76.png)


Windows Defender ファイアウォールを開き「詳細設定」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/839c2ea0-8d7c-31b3-0956-6603c6335ffa.png)


「受信の規則」を選択し「新しい規則...」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/815ce061-7d78-b362-ba4d-7d5a38f9d5a8.png)

ポートを選択し「次へ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/6032635a-56dc-9d11-fc02-61d5486c13c2.png)

「UDP」を選択し特定のローカルポートに「123」を入力し「次へ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/4bae6519-470c-6e15-3b1b-11670375a716.png)

接続を許可するを選択し「次へ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/25910820-2633-4739-b4ff-4192f3725476.png)

そのまま「次へ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/a2515fc7-6bad-caaf-80be-d4223e71b2e3.png)

任意の名前を付けて「完了」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/5230a896-1c31-5dbd-2948-f46cff0b148a.png)

サービスを立ち上げ「Windows Time」のスタートアップの種類が「無効」になっていないことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/fbefece0-78b3-363e-7ec3-185962bc03a7.png)

無効になっている場合は右クリック「プロパティ」でスタートアップの種類を変更「自動(遅延開始)」を選択し「OK」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/1277c4f1-5ec8-2cb0-1625-f99c918ee566.png)

「Windows Time」のサービスを開始をクリックし状態が「実行中」をなっていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3096978/35ad661b-f335-ea8c-9664-3338b964eaf5.png)


## まとめ
NTPサーバーを構築する手順についてまとめてみました。サーバー環境での設定はしたことないですが、今後設定することがあれば、今回の手順を見直したいと思います。
ImportError: libGL.so.1: cannot open shared object file: No such file or directoryへの対処法

# 環境
ubuntu 22.04
jupyter notebookで実行

# やったこと

~~~ 
!apt update
!apt install libgl1-mesa-glx
~~~

# 結果

libGL.so.1 がインストールされ、エラーが解消された。
How to firebase deploy

# 概要
- Google Cloudの[Firebase](https://firebase.google.com/?hl=ja)にreactなどのSAPを最速でdeployする方法。
- npmを使用している想定の手順書。

# 手順
1. Firebaseアカウントの登録
    1. [Firebase](https://firebase.google.com/) にアクセスし、「使ってみる」または「コンソールに移動」をクリック。
    2. Googleアカウントでログインします。アカウントがない場合は新規作成する。
2. Firebase CLIのインストールと設定
    1. `npm install -g firebase-tools` を実行してFirebase CLIをインストールする。
    2. `firebase login` を実行してFirebaseアカウントにログインする。
    3. リンクを開くか選択(y/n)が出てくるので、「y」を選択してリンクを開く。
    4. ログインしたいアカウントを選択し、ログイン成功画面まで持っていく。
3. Firebaseの初期設定(project作成から)
    1. `firebase init` 
    2. `◯ Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys` を選択
    3. `Create a new project` を選択
        1. 手動でproject作成している場合は`Use an existing project`を選択
    4. `? Please specify a unique project id (warning: cannot be modified afterward) [6-30 characters]:` が表示されるのでproject名を入力する。
        1. project名は一意である必要があるので、重複している場合は、適当な文字列を入れる
    5. `? What would you like to call your project? (defaults to your project ID) ()` が表示されるので、表示名を入力する。
        1. これは表示名なので一意である必要はない。
    6. `? What do you want to use as your public directory? (public)`  が表示されるので`build` を入力する。
        1. viteの場合などは`dist` が適切な場合もある。buildしたindex.htmlがあるdir名を入れる箇所
    7. `? Configure as a single-page app (rewrite all urls to /index.html)? (y/N)` y を入力。
        1. SAPかどうかを聞かれている
    8. `? Set up automatic builds and deploys with GitHub? (y/N)` nを入力
        1. githubに自動デブロイを設定する場合はyを選択
    9. `? File build/index.html already exists. Overwrite? (y/N)`  yを入力
4. buildとdeploy
    1. `npm run build` でbuildファイルを作成
    2. `firebase deploy` でdeployを実行
5. 補足
    1. 上記は初回手順である
    2. 2回目以降は以下でdeploy可能
        1. `firebase login` (ログイン情報がある場合は不要)
        2. `npm run build` 
        3. `firebase deploy`
paiza ランクS 文字列収集 Java で短いコードでやってみる

https://paiza.jp/works/mondai/real_event/word_collection



ランクSの文字列収集の問題をJavaで短いコードでやってみる
このランクSの問題、他の問題に比べて簡単な気がします
それにしても Java には Pair<T1, T2> みたいのがないので Map.Entry<K, V> を強引に使うしか手が思いつかなかった．．．

```Java
import java.util.*;

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

		Scanner sc = new Scanner(System.in);
		int[] pq = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
		List<Map.Entry<String, Integer>> pis = new ArrayList<>();

		for (int i = 0; i < pq[0]; i++) {
			String[] pi = sc.nextLine().split(" ");
			pis.add(new AbstractMap.SimpleEntry<>(pi[0], Integer.parseInt(pi[1])));
		}

		for (int i = 0; i < pq[1]; i++) {
			String q = sc.nextLine();
			System.out.println(pis.stream().filter(e -> e.getKey().startsWith(q)).mapToInt(e -> e.getValue()).sum());
		}
	}
}
```
Elasticache RedisとSocket.ioを用いたWebSocket通信の問題解決


## はじめに

今回は、socket.io,redis,ioredisを使用してWebSocket通信を行うシステムのインフラ作成時に、はまったポイントを備忘録を兼ねて紹介していきます

## システム構成

### フロントエンド
**Vue.js**：ユーザーインターフェースと管理インターフェース。
**S3**：静的ファイルのホスティング。
**CloudFront**：グローバルキャッシュと配信。

### バックエンド
**Nest.js**：APIサーバー。
**ECS（Elastic Container Service）**：コンテナオーケストレーション。

### その他のAWSサービス
**ALB（Application Load Balancer）**：リクエストをECSタスクにルーティング。
**ECR（Elastic Container Registry）**：Dockerイメージの格納と管理。

Socket.ioを用いてWebSocket通信を行う際、以下のような構成にしました：

1. **ElastiCache Redis**を使ったPub/Subシステムを実装し、複数のECSタスク間でリアルタイム通信を実現。
2. albの**Sticky Session**を有効にし、ユーザーのWebSocket接続が同じECSタスクに留まるように設定。



## 問題の詳細
### 一つ目の問題：ElastiCache Redisとの接続ができない

バックエンドのRedis設定を以下のようにしていました。
```typescript
import { ConfigService } from "@nestjs/config";
import { Redis, RedisOptions } from "ioredis";

const host = this.configService.get<string>('REDIS_HOST')
const redisOptions: RedisOptions = {
    host,
    port: 6379, 
}
const redisClient = new Redis(redisOptions);
```

この設定はローカル環境では動作しますが、ECSとElastiCache Redisの疎通ができませんでした。原因は、ElastiCache Redisクラスタへの接続にTLSが必要だったことです。AWSのElastiCache Redisは、セキュリティのためにTLSを使用してデータを暗号化します。ローカル環境ではTLSが必要ありませんが、本番環境ではTLSが必須です。

本番環境でのみTLS設定を追加することで、ECS環境でもElastiCache Redisに接続できるようになりました。

```typescript
const host = this.configService.get<string>('REDIS_HOST')
const redisTls = process.env.NODE_ENV === 'production' ? {} : false
const redisOptions: RedisOptions = {
    host,
    port: 6379, 
    tls: redisTls
}
const redisClient = new Redis(redisOptions);

```


### 二つ目の問題：WebSocketのコネクションの確立がうまくいかない

ALBのセッション永続化（sticy session）を利用していました。ALBのセッション永続化は、クライアントが接続するサーバーを特定のCookieを通じて記憶し、同じサーバーに接続し続けることを可能にします。

しかし、Socket.ioはWebSocketの接続前にポーリングを行い、接続を確立します。このポーリングリクエストは独立しており、セッション永続化のCookie情報が含まれていません。その結果、ポーリングリクエストが異なるECSタスクに振り分けられてしまいました。


問題を解決するために以下のステップを踏みました：

1. **セッション永続性の再設定**: ALBでのセッション永続性を再確認し、適切に設定。


2. **Socket.ioの設定見直し**:
   - `transports`オプションでWebSocketのみを使用するように設定。
   - これにより、ポーリングを回避し、直接WebSocket接続を確立するようにしました。

```typescript
const socket = io(url, {
  transports: ['websocket'],
  upgrade: false,
  autoConnect: false
});
```

## まとめ
今回はWebSocketを使用したインフラ作成時に詰まった部分を紹介しました。
この記事が、同様の事象が発生している人の解決に役立てば幸いです。
ここまで読んでくださりありがとうございました！
MySQLのSQLチューニングの覚書

こんにちは。齋藤です。
今回はデータベースのパフォーマンスを向上させるためのSQLのチューニングについてMySQLを題材に書いていこうと思います。

## 目次

1. [インデックスを活用する](#1-インデックスを活用する)
    - [インデックスの確認](#インデックスの確認)
    - [インデックスの追加](#インデックスの追加)
    - [インデックスの削除](#インデックスの削除)
2. [クエリの分析](#2-クエリの分析)
    - [EXPLAINの使い方](#explainの使い方)
3. [スロークエリログの活用](#3-スロークエリログの活用)
    - [スロークエリログの設定](#スロークエリログの設定)
4. [クエリの最適化](#4-クエリの最適化)
    - [不要なカラムの選択を避ける](#不要なカラムの選択を避ける)
    - [ジョインの最適化](#ジョインの最適化)
5. [まとめ](#まとめ)

## 1. インデックスを活用する

インデックスは検索速度を大幅に向上させるための重要な手段です。

### インデックスの確認

```sql
SHOW INDEX FROM テーブル名;
```

### インデックスの追加

```sql
CREATE INDEX インデックス名 ON テーブル名 (カラム名);
```

### インデックスの削除

```sql
DROP INDEX インデックス名 ON テーブル名;
```

## 2. クエリの分析

`EXPLAIN`を使用して、クエリの実行計画を確認

### EXPLAINの使い方

```sql
EXPLAIN SELECT カラム名 FROM テーブル名 WHERE 条件;
```

- `type`: `ALL`（フルテーブルスキャン）は避ける
- `key`: 使用されているインデックス
- `rows`: 予想される読み込み行数

## 3. スロークエリログの活用

スロークエリログを有効にして、時間のかかるクエリを特定します。

### スロークエリログの設定

`my.cnf`に以下を追加

```plaintext
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 2
```

## 4. クエリの最適化

### 不要なカラムの選択を避ける

```sql
SELECT 必要なカラム FROM テーブル名 WHERE 条件;
```

### JOIN句の最適化

結合条件にインデックスを使用

```sql
SELECT A.カラム名, B.カラム名
FROM テーブルA AS A
JOIN テーブルB AS B ON A.カラム名 = B.カラム名
WHERE 条件;
```

## まとめ

SQLチューニングは、データベースのパフォーマンスを向上させるための重要な手段です。インデックスの活用、クエリの分析、スロークエリログの活用などを通じて、効率的なクエリを書きましょう。

以上、齋藤でした。