OmniAICreator/Qiita-1.07M huggingface dataset:
React 子コンポーネントから親コンポーネントに値を渡す方法

React でコンポーネント間の値の引き渡し時のメモ
子コンポーネントから親コンポーネントへ値を渡す方法になります
例では子コンポーネントにテキストボックス、親コンポーネントが表示エリアでやってみる
もっと良い方法あったらコメントお願いします

やることはざっくりこんな感じです

- 子コンポーネント InputText.js
  - `props` で `value`, `setValue` を関数で受け取る(親で使う値の `useState` の戻り値)
  - `input` タグに設定する `onChange` のファンクションを定義(入力を拾って値を `setValue` で設定)
- 親コンポーネント App.js
  - `useState` で表示用の `value`, `setValue` を定義
  - `InputText` の 属性 `value`, `setValue` に `useState` で定義した値を渡す 

# 子コンポーネント InputText.js

```JSX:InputText.js
// props で value, setValue を受けろる
export const InputText = ({ value, setValue }) => {
  // 入力テキストの変更のイベントハンドラ（値の変更を反映）
  const onchange = (e) => setValue(e.target.value);

  return (
    <>
      <input type="text" value={value} onChange={onchange} />
    </>
  );
};

export default InputText;

```

# 親コンポーネント App.js
```JSX:App.js
import { useState } from 'react';
import InputText from './components/InputText';

export const App = () => {
  // 子コンポーネントからもらう値を useState で定義
  const [value, setValue] = useState();

  return (
    <>
      {/* props で useState の戻り値を渡す */}
      <InputText value={value} setValue={setValue} />
      <p>{value}</p>
    </>
  );
};

export default App;

```

# input タグをラップしただけのコンポーネント
意味は少ないけど．．．

## 子コンポーネント Inputs.js
```JSX:Inputs.js
// props で input に設定する要素をもらう
export const Inputs = (props) => {
  return (
    <>
      <input {...props} />
    </>
  );
};
export default Inputs;
```

## 親コンポーネント App.js
```JSX:App.js
import { useState } from 'react';
import Inputs from './components/Inputs';

export const App = () => {
  // 子コンポーネントからもらう値を useState で定義
  const [value, setValue] = useState();

  return (
    <>
      {/* props で input に設定したい要素を渡す ex) placeholder etc.. */}
      <Inputs value={value} onChange={(e)=>setValue(e.target.value)} />
      <p>{value}</p>
    </>
  );
};

export default App;
```
2023/9/4主にITとかセキュリティの記事

「Log4j」などの古い脆弱性は依然、大量に悪用されている(9/2)
https://atmarkit.itmedia.co.jp/ait/articles/2309/02/news028.html

参院選、党員に偽の依頼メール(9/2)
https://jp.reuters.com/article/idJP2023090201000552

「自社が潰れるシナリオ」を想定する方法　カギとなるのは社員の知見(9/2)
https://forbesjapan.com/articles/detail/65630

突然パソコンが”固まる”「サポート詐欺」　１０４人分の個人情報が流出　福岡市が謝罪(9/1)
https://www.fnn.jp/articles/-/580246

「サイトの料金が未払いに…」うそ電話詐欺で宇部市の女性（70代）が現金250万円の被害(9/1)
https://news.yahoo.co.jp/articles/50acc5bb3eb259c35010037472e90ebe508c7dd7

犯罪最前線　架空請求詐欺が増加　キーワードは「サポート」と「電子マネー」(9/2)
https://news.yahoo.co.jp/articles/284e9ca24bc8c67a567b0ff0384e165fa0457b78?source=rss

鹿児島餃子の王将ホームページ改ざんされる 「破産手続き始めた」と虚偽情報　不正アクセス、米国経由か(9/2)
https://373news.com/_news/storyid/181123/

湘南国際村センターのホームページ改ざん　「破産手続き開始」偽情報(9/2)
https://news.yahoo.co.jp/articles/c82dfd555b5212a7df81a32da6989cca9918f48d

「580億円分の仮想通貨」が不正流出…2018年Coincheck騒動の根本原因(9/2)
https://news.yahoo.co.jp/articles/19ab064a44d4933760fcbf523d84d636c1cc97ef?source=rss

ユーチューブ乗っ取り続発、投稿者が悲鳴！　元動画を勝手に削除、不正サイトに誘導　視聴者の個人情報抜き取り(9/2)
https://www.zakzak.co.jp/article/20230902-564K4Z7A6ZJJXIFT5DPMIWZPBA/

チャットGPT活用で仕事効率化 実証実験を開始して1か月　作業量が10分の1も事実確認など課題も…　北海道当別町(9/2)
https://nordot.app/1070649161123578070

勉強に戦略が必要なのは｢努力をしない｣ため(9/2)
https://news.livedoor.com/article/detail/24915158/
https://news.yahoo.co.jp/articles/6c307de97fc7fe115d1175b4d295181e682191e4?source=rss
フォルシア株式会社のインターンに参加しました

先週、フォルシア株式会社のインターンに参加してきました！
参加したのは「検索アプリケーション高速化コース」で、SQLチューニングが主軸です。
いろいろと振り返ります。

## 参加前に知っていてよかったこと

- 実行計画取得方法
- SQL、PostgreSQLの基礎
- 一番遅いところから優先度つけて対処していく心構え

## 全体を通して

実務に近い課題に5日間取り組む形でした。

毎日、個人の振り返りとメンターさんとの会話を30分ずつ確保していただいたので、今どこまでできて何ができないのか明確になり、進めやすかったです。それに自分の成長が言語化されるのはありがたいです。

取り組んでいる最中、考えたことをすべてSlackにぶちまけていたのですが笑、それが良しとされる環境なのもやりやすかったです。メンターさんへの状況共有がスムーズでした。

課題とは別で、フォルシアさんのことを知る機会がたくさんあり、嬉しかったです。自由参加多めで負担ないのも助かりました。特に競プロ勉強会がレベル高すぎて印象に残ってます、、笑

## 1日目

午前は諸々の説明を受け、メンターの方とランチ。出身や趣味の話が中心だったと思います。
肉厚なハンバーグでとても美味しかったです。

午後はいよいよ、本題に取り掛かります。ソースコードもSQLも長すぎてわけがわからなかったので、とりあえずやったことは、

- メンターさんに聞きつつ処理の流れを理解する
- 遅いSQLをログに吐くようにする
- 実行計画を取得して簡単なところからチューニング

という感じです。

あとは気になったことをメンターさんに聞いて終わりました。
どんな仕事しているんですか、とか、明日別の方針でチューニングしたいですがどんな方法がありますか、とか。

## 2日目

1日目で簡単なところはやり尽くしたので、2日目はとにかく色々やりました。

- 統計情報再取得
- 索引のカラム順全部試す
- ウィンドウ関数の読み方復習
- リグレッション(結果セットが変わる)をやらかしテストの重要性を体感する

進捗は目標の1つを達成でき、その調子で問題ないと言ってもらいました。
課題複数ありましたが、メンターさんを頼りながら行けるところまで頑張れば良いみたいです。(むしろ難しく作っているので、最後まで解かれるほうが困るとのこと)

2日目もランチを奢っていただきました。新宿のミロードのお店です。
文字通りざっくばらんに、就職後にどんな研修を受けどんな業務をするのかお話伺えました。

## 3日目

中間発表がありました。社員の方が10名ほど参加される会です。
自分のやったことを共有して別の視点から意見を受けるのが目的です。

特に発表資料は必要なく、ゆるゆると発表して意見をいただく形で進めました。
テーブルの設計周りで手法的なヒントをいただき、今後の方針の大枠が固まったと思います。
参考: [そのSQL、もっと速くなりますよ。│FORCIA CUBE│フォルシア株式会社](https://www.forcia.com/blog/002367.html)

なお、課題はだいぶ詰まっていました。。笑

ランチは中途入社の方と行きました。大手ハードウェアベンダー出身の方もいて、前職と比べたやりがいの話が印象に残ってます。
おふたりとも楽しそうで、社内での話は聞いていて面白かったです。

退勤後、自由参加のボードゲーム会に参加しました。
特にインサイダーというゲームが面白かったです。人狼みのあるゲームで、社員の方にめっちゃ無礼を働いたと思いますが、皆さん優しく遊んで下さいました笑 楽しかったです！

## 4日目

昨日の中間発表や振り返りで着想を得たものを片っ端から試しました。

- from内の副問合せを撤去するため代替になる表を探す
- joinの前計算テーブルを作成するがうまくいかない
- PL/pgSQLを完全に理解する
- 諸事情あって100テーブル以上作成した

PL/pgSQLは本当に素晴らしいです…
100テーブル作って試したいことがありつつ、どう考えてもスクラッチにはやりたくなかったのですが、PL/pgSQLなら数分でできます。
商用に使うにはパフォーマンスやセキュリティの問題があるものの、手元でいじくるときには超便利です。

参考: [【PL/pgSQL入門】PL/pgSQLを勉強したのでまとめてみた - Qiita](https://qiita.com/ebichan_88/items/1effb09fbc458276ea51)

ランチはお弁当で、インターン生だけで集まって話しました。
そもそも毎日ランチなどで会話していたので、仲は良かったと思います、笑
(Twitter繋がってくれてありがとうございます、勝手に絡むのでこれからも仲良くして下さい～～)

## 5日目

課題完走とはいかなかったものの、ギリギリまでできることを試し、いざ最終発表会です。

発表の場は好きですが、いかんせん資料作成が苦手で、「早くおわれ～～～(恥)」と思いながら発表していました。笑
質疑応答では私の前職の経験まで踏み込んで下さり、純粋に技術的興味を持っていただけたのが嬉しかったです。あと、チューニングをやっていると「なんか速くなった」が多くて、定量的な結果や原因の分析に踏み込めていない点を自覚できて有り難かったです。
メンターさんからは「方針合っていたので惜しかった」と言われました。悔しい。

一緒にインターンしていた方の発表もすごすぎて、素人ながら聞いていて面白かったです。
私も感化されて優秀にならないかな^^

また、最終日ということで、終了後に懇親会がありました。
ゆるゆるとお酒を飲みつつ、元々FFだった人とお話したり、ボードゲームしたりしました。

帰り際には、社員の方からのフィードバックや、メンターさん・人事さんからのお手紙をいただきました。
嬉しいと同時に今日で終わりなのかと悲しかったです、、

## 終わりに

フォルシア株式会社の社員のみなさま、5日間本当にありがとうございました！
前職からSQLの仕事はすっごく楽しくて、今回のチューニング漬けで「もっとこの領域を強みにしたい」と感じました。

インターンを通して、フォルシアさんは非常にエンジニアを大切にされている会社だと感じました。
また、新しい手法や考え方を知ることができ、技術的にもたくさん持ち帰らせていただきました。
ありがたいことにお給料も良くて本当にとても助かります、、(5日で10万円)

お読みくださりありがとうございました。
ご興味持たれた方は次回ぜひ応募してみてください！
これからインターンの方もファイトです！！
Javaの配列やコレクション(Rubyとの比較)

もともとRubyを使用していたのですが、最近Javaを使用する機会が増えたため学習を始めました。その過程で、配列やコレクションの扱いに苦労したので、それに関する記事をまとめました。

### 1. Javaの配列
Javaの配列は固定の長さのデータ構造です。RubyのArrayと比較すると、サイズが可変ではない点が大きな違いです。

例: int型の配列を作成し、要素を格納
```java
int[] numbers = new int[3];
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;
```

### 2. Javaのリスト (List)
Javaのリストは、RubyのArrayのようなものと考えて良いでしょう。要素の追加、削除、検索などが可能です。JavaのListはインターフェースで、具体的なクラスには`ArrayList`, `LinkedList` などがあります。

例: `ArrayList`の使用例
```java
import java.util.ArrayList;
import java.util.List;

List<String> fruits = new ArrayList<>();
fruits.add("apple");
fruits.add("banana");
fruits.add("cherry");
fruits.remove(1); // "banana"を削除
```

### 3. Javaのセット (Set)
重複する要素を持たないコレクションです。`HashSet`, `LinkedHashSet`, `TreeSet` などの実装があります。
`List`と違って要素の順序が保証されません。その代わり要素の存在を高速に確認できるらしいです。

例: `HashSet`の使用例
```java
import java.util.HashSet;
import java.util.Set;

Set<String> uniqueFruits = new HashSet<>();
uniqueFruits.add("apple");
uniqueFruits.add("apple"); // 重複しても追加されない
```

### 4. Javaのマップ (Map)
RubyのHashに近いです。キーと値のペアの集合です。`HashMap`, `LinkedHashMap`, `TreeMap` などの実装があります。

例: `HashMap`の使用例
```java
import java.util.HashMap;
import java.util.Map;

Map<String, Integer> fruitPrices = new HashMap<>();
fruitPrices.put("apple", 100);
fruitPrices.put("banana", 80);
int applePrice = fruitPrices.get("apple");
```

### まとめ
- Javaの配列は固定サイズで、RubyのArrayよりも柔軟性が低い。
- Javaの`List`はRubyのArrayのようなもの。`ArrayList`や`LinkedList`などが実装として存在。
- Javaの`Set`は重複要素を持たない。
- Javaの`Map`はキーと値のペアの集合。RubyのHashに似ている。

Javaのコレクションフレームワークは非常に広く、これ以外にも存在しているようですが、とりあえずこのくらいにしておきます。
Llama2.cppの環境構築(M1 Mac)

# llama.cpp
```
git clone https://github.com/ggerganov/llama.cpp.git
```

# モデルのダウンロード
https://note.com/elyza/n/na405acaca130#ba0b8253-4fd4-41e0-9c3a-dc905fb20ab8
- タスク特化のモデルを使いたかったので[こちら](https://huggingface.co/mmnga/ELYZA-japanese-Llama-2-7b-fast-instruct-gguf/blob/main/ELYZA-japanese-Llama-2-7b-fast-instruct-q4_K_M.gguf)をダウンロード
- models/配下にダウンロードしたモデルを配置する

# 起動
```sh
./server -m models/ELYZA-japanese-Llama-2-7b-fast-instruct-q4_K_M.gguf --port 2600 --host 0.0.0.0
```

# 参考
https://aru-log.com/start-llama2-no-gpu/#llama2%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B
Udemyのアフィリエイト審査が通るまでの話を公開

# Udemyのアフィリエイトプログラム
Udemyには、アフィリエイトプログラムというものがあり、誰でも登録できる。アフィリエイトプログラムに登録すると、アカウントごとにアフィリエイトリンクが発行されて、それをSNSなどで紹介して、誰かがそのリンクからUdemyコースを購入すると、15%のマージンがもらえる。3000円のコースなら、1人につき450円だ。
https://www.udemy.com/affiliate/

# 何の話

私がUdemyアフィリエイトプログラムに申請したところ、審査に落ちた話と、その後審査が通るまでの話をしようかと思います。
申請したサイトは、私が開発・運営している、未経験エンジニアや転職者向けの、オンライン学習のランキングサイトです。
[オンライン学習のランキングサイト | Tech Course Rank](https://www.techcourserank.com/)

# アフィリエイトプログラムの申し込み(2023.07.30)
Udemyのアフィリエイトは、**楽天リンクシェア**というサービスを使用しています。なので、申請するには楽天リンクシェアに個人情報や、アフィリエイトサイトの情報(ブログ、SNS、webサイトなど)、振込先の口座情報などを登録します。最後の申請ボタンをクリックして、完了です。

# 審査落ち(2023.08.01)
審査落ちのメールが届きます。しかも、楽天リンクシェアのアカウントが停止され、ログインできなくなります。
ショックで、結構不安になるし、アカウント停止する必要なくね？って思います。
また、**明確にどの基準に満たしてないから審査に落ちたのかは、教えてもらえません**。
メール本文にある、以下のリンクから自分でどれに当てはまってないかを考えて修正し、再度申請しろと書いてあります。

■参考FAQ：リンクシェアの審査の基準を教えてください。
　https://linkshare.zendesk.com/hc/ja/articles/115000899533

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188008/2cd7542e-b843-89c7-60b1-58c15bf85bc2.png)


# 2回目のアフィリエイト申請(2023.08.11)
私の場合は、サイトに英語のページしかなく、日本語ページがないのが原因と考え、i18n対応をして日本語ページを作成をして、再度申請しました。この時点では、これが原因と誰かに言われた訳じゃないので、ものすごい不安。

ちなみに、再度申請する方法は、審査落ちした時のメールの下に、ちょこっとお問い合わせ方法が書いてあり、そこのリンクに飛び、**「一般のお問い合わせ」を選んで、申請**しました。

申請リンク：https://linkshare.zendesk.com/hc/ja/requests/new

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188008/c4114409-7903-eb4a-435d-37a105a164bd.png)

# 審査が通る(2023.08.17)
**無事、審査が通りました**。本当、ホッとしました。
メールが届き、ここでようやく審査落ちした理由が告げられます。遅いわ。
けど、メールの内容が丁寧だし、審査に通った嬉しさで、気にならなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188008/ff0454aa-d8df-9087-edab-3cea84f65ac7.png)

いろんな想いでアフィリエイトのためにたくさん時間を使って、最後に審査に落ちた時って、すごく不安になると思います。
ただ、何度でも申請し直せば良いので、焦らずにやっていきましょう。
ここまで長々とご清聴いただき、誠にありがとうございました。

# 関連情報
[オンライン学習のランキングサイト | Tech Course Rank](https://www.techcourserank.com/)

https://qiita.com/AJCode/items/d778a892af697b7a3b3d
WikipediaのためのChatGPT Promptの利点

![WikipediaのためのChatGPT Promptの利点.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551526/d7439576-71a6-480c-8ff1-4976764d9ed4.png)

WikipediaのためのChatGPT Promptは、作者や編集者がウィキペディアの記事を起草、編集、強化するために使用するデジタルペンの役割を果たします。これは人工知能の力を活用してコンテンツ作成プロセスを効率化し、より効果的かつ正確にします。その機能を探ってみましょう。

https://kumiskiri.com/cara-menulis-artikel-di-wikipedia-dengan-chatgpt/

### 1. 効率の向上

コンテンツ生成を自動化することにより、Wikipediaの記事を起草するために必要な時間が大幅に削減されます。この増加した効率性により、編集者は研究や事実確認などの高度なタスクに集中できます。

### 2. 改善された精度

AIによるコンテンツ生成は人為的なエラーを最小限に抑えます。Wikipediaのガイドラインに従って記事が適切に構造化され、文法エラーがなくなることをChatGPT Prompt for Wikipediaは保証します。

### 3. 一貫性

Wikipediaの記事全体で一貫したトーンとスタイルを維持することは難しいことがあります。ChatGPT Prompt for Wikipediaは均一性を確保し、全体的な読みやすさを向上させます。

### 4. 拡張性

1つの記事を作成するか、100個の記事を作成するかにかかわらず、ChatGPT Prompt for Wikipediaはその作業量を処理できます。その拡張性は個々の編集者と大規模なコンテンツプロジェクトの両方にとって貴重なツールとなっています。

## WikipediaのためのChatGPT Promptの活用例

ChatGPT Prompt for Wikipediaの動作と実世界での応用について詳しく見てみましょう。

### コンテンツの作成

ChatGPT Prompt for Wikipediaは記事の初期バージョンを起草するのを支援します。編集者は簡単なプロンプトを提供し、ツールはさらに洗練された包括的な草案を生成できます。

### 事実確認

Wikipediaの記事の正確性を確保することは非常に重要です。ChatGPT Prompt for Wikipediaは記事内で行われた特定の主張のための参照文献と引用を提供することにより、事実確認を支援します。

### 言語翻訳

Wikipediaのグローバルな到達力は複数の言語でのコンテンツを必要とします。ChatGPT Prompt for Wikipediaは記事の翻訳を支援し、多様な観客に知識を提供します。

### ニッチなトピック

無名またはニッチなトピックをカバーすることは難しいことがあります。ChatGPT Prompt for Wikipediaは一般的でない主題に関するコンテンツを生成し、Wikipediaの知識ベースを拡充するのに役立ちます。

このように、ChatGPT Prompt for Wikipediaはウィキペディアの記事作成プロセスをサポートし、より効率的で正確なコンテンツの生成を可能にします。
RxJavaのObservable と Single について理解していく

### 基本的な概念を確認
`RxJava` は、非同期でイベントベースのプログラムを書くためのライブラリであり、データストリームやシーケンスに対して操作を行うことができます。
このときのデータストリームやシーケンスを表すのが `Observable` です。

1. **Observable**
   - `Observable` は、0個以上のデータを発行することができる。
   - エラーが発生した場合、それを通知することができる。
   - データの発行が完了したら、その旨を通知することができる。
   - 例えば、ユーザーのキー入力やネットワークリクエストの結果といった、複数のデータを期待する場面で使います。

2. **Single**
   - `Single` は、`Observable` の特定のケースとして考えることができます。
   - `Single` は、1つのデータもしくは1つのエラーを発行することのみが許されています。
   - データが1つしかない、またはエラーが1つだけ起こる可能性がある場面で使用します。例として、ネットワークリクエストで1つのレスポンスを待つシチュエーションが考えられます。

### ObservableとSingleの関係
- `Single` は、`Observable` の特化されたバージョンと考えることができます。`Single` は、データが1つしか発行されない特定のシチュエーションに適しています。
- `Observable` には `onNext()`, `onError()`, `onComplete()` といったメソッドがありますが、`Single` には `onSuccess()` と `onError()` のみが存在します。

簡単に言えば、複数のデータが発行される可能性がある場合やデータの発行の完了を知りたい場合は `Observable` を使用し、1つのデータまたは1つのエラーを期待する場面では `Single` を使用します。

### 具体的なシチュエーションとそれに対応するコードで理解

### 1. Observable の例

#### シチュエーション:
- とあるサービスから、ユーザーの一覧を取得します。
- このユーザーの一覧は複数のデータとして取得されます。

```java
Observable<String> userObservable = Observable.create(emitter -> {
    emitter.onNext("太郎");
    emitter.onNext("花子");
    emitter.onNext("テスト子");
    emitter.onComplete();
});

userObservable.subscribe(
    user -> System.out.println("User: " + user),
    throwable -> System.err.println("Error occurred: " + throwable.getMessage()),
    () -> System.out.println("完了!")
);
```
出力:
```
User: 太郎
User: 花子
User: テスト子
完了!
```

### 2. Single の例

#### シチュエーション:
- 同じウェブサービスから、特定のユーザーの詳細情報を取得します。
- このユーザーの詳細は1つのデータとして取得されます。

#### コード:
```java
Single<String> userDetailSingle = Single.create(emitter -> {
    emitter.onSuccess("太郎, Age: 25, City: Sapporo");
});

userDetailSingle.subscribe(
    userDetail -> System.out.println("User Detail: " + userDetail),
    throwable -> System.err.println("Error occurred: " + throwable.getMessage())
);
```
出力:
```
User Detail: 太郎, Age: 25, City: Sapporo
```

### 説明:
- `Observable` は複数のデータを発行することができ、`onNext()` で各データを発行し、最後に `onComplete()` でデータの発行が完了したことを通知します。
- 一方、`Single` は1つのデータまたは1つのエラーのみを発行します。成功時は `onSuccess()` でデータを発行し、エラー時は `onError()` でエラーを通知します。

このように、取得するデータの量や種類によって、`Observable` や `Single` を適切に選択して使用します。
特定のネットワーク環境下におけるWireguard経由で特定のWebページ(vCenter)が見れない問題とその解決

# 状況
ESXiをホスティングするにあたりvCenterを内向きのネットワークに建てることがあると思います。そういう状況ではセキュリティ上の問題からVPN経由で接続することが一般的です。しかしながら何故か自宅のネットワーク環境下にのみおいてWireguardのVPNを経由した上でvCenterに接続しようとすると接続できませんでした。

## 本記事が必要になると想定される人
- Wireguard経由で特定のWebページが見れない
- 何らかのVPN経由でvCenterが見れない
- その両方

# 解決方法
Wireguardの設定に**MTU**を追加する。
```diff_conf
  [Interface]
  PrivateKey = hogehoge
  Address = 10.10.0.1/32
  DNS = 8.8.8.8
+ MTU = 1372
```
筆者の環境では上記方法で正常にvCenterが見れるようになりました。Wireguard以外でも似たような設定を探してみてください。しかしながら、これで必ず見れるようになるかはわからないため、以下に解決方法の手順を記します。

## 解決方法の詳細
### pingを試す
まずは当然ですがpingが通るかを確認します。
```shell
ping vcenter.hoge.fuga
PING vcenter.hoge.fuga (xxx.xxx.xxx.xxx): 56 data bytes
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=0 ttl=63 time=10.825 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=1 ttl=63 time=9.950 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=2 ttl=63 time=11.367 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=3 ttl=63 time=10.235 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=4 ttl=63 time=10.024 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=5 ttl=63 time=10.798 ms
(Ctrl+Cで抜ける)
```
### pingにオプションをつけてどのサイズのMTUだとみれるか確認する
```shell
ping -c 5 -s 1472 vcenter.hoge.fuga
PING vcenter.hoge.fuga (xxx.xxx.xxx.xxx): 1472 data bytes
ping: sendto: Message too long
ping: sendto: Message too long
Request timeout for icmp_seq 0
ping: sendto: Message too long
Request timeout for icmp_seq 1
ping: sendto: Message too long
Request timeout for icmp_seq 2
ping: sendto: Message too long
Request timeout for icmp_seq 3

--- vcenter.hoge.fuga ping statistics ---
5 packets transmitted, 0 packets received, 100.0% packet loss
```
```shell
ping -c 5 -s 1364 vcenter.hoge.fuga
PING vcenter.hoge.fuga (xxx.xxx.xxx.xxx): 1364 data bytes
1372 bytes from xxx.xxx.xxx.xxx: icmp_seq=0 ttl=63 time=10.430 ms
1372 bytes from xxx.xxx.xxx.xxx: icmp_seq=1 ttl=63 time=10.145 ms
1372 bytes from xxx.xxx.xxx.xxx: icmp_seq=2 ttl=63 time=10.643 ms
1372 bytes from xxx.xxx.xxx.xxx: icmp_seq=3 ttl=63 time=10.890 ms
1372 bytes from xxx.xxx.xxx.xxx: icmp_seq=4 ttl=63 time=312.043 ms

--- vcenter.hoge.fuga ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 10.145/70.830/312.043/120.607 ms
```
`-c`のオプションは回数、`-s`のオプションが通信バイトサイズを指定できます。
本来であれば通信パッケージを分割しないように`-D`のオプションをつけることを推奨しますが、筆者の環境ではなぜかうまく動きませんでした。

:::note warn
何故指定した値と異なるバイトが送信されているかというと、ヘッダ分が+28される。なのだが、何故か数が+8しかされていない。
:::

今回1372バイトで送信できていたのでその値を設定しました。

## MTUとは
一回に送るデータサイズのこと。通信契約やネットワークの状況によって異なります。

https://atmarkit.itmedia.co.jp/aig/06network/mtu.html

今回VPNを経由したことやネットワークの通信形態の影響でこのデータサイズの値が不整合だった様子です。詳細な原因は不明ですが、何らかの状況でこうなってしまった人はお試しください。
【Photoshop】「ジェネレーティブ塗りつぶし」で画像を拡張してみた！！

## 新AI画像生成機能「ジェネレーティブ塗りつぶし」で画像の拡張方法について
今回は新AI画像生成機能「ジェネレーティブ塗りつぶし」で**画像を拡張**してみたのでその手順について説明してきます。
![スクリーンショット-2023-09-04-1.43.54.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/8fea313b-25fc-9d67-77db-54cbe2293045.jpeg)

# 目次
* [Photoshopの新AI画像生成機能「ジェネレーティブ塗りつぶし」](#photoshopの新ai画像生成機能ジェネレーティブ塗りつぶし)
* [画像の拡張方法](#画像の拡張方法)
    * [トリミングツールCで画像の拡張範囲を広げる](#トリミングツールcで画像の拡張範囲を広げる)
    * [選択ツールで広げた範囲を選択](#選択ツールで広げた範囲を選択)
    * [生成拡張を選択](#生成拡張を選択)
    * [テキストプロンプトは空白のまま「生成」をクリック](#テキストプロンプトは空白のまま生成をクリック)
    * [選択した範囲をAIが自動で生成した画像で埋めてくれる](#選択した範囲をaiが自動で生成した画像で埋めてくれる)
*  [最後に](#最後に)

## Photoshopの新AI画像生成機能「ジェネレーティブ塗りつぶし」

PhotoshopのBeta版に新AI画像生成機能「ジェネレーティブ塗りつぶし」が標準搭載されました。


**※新AI画像生成機能「ジェネレーティブ塗りつぶし」は現在(2023/9/3)の時点ではBeta版のみ使用可能なので、Beta版をダウンロードしていない方はダウンロードから初めてください。**

## 画像の拡張方法
画像の拡張方法について画像付きで説明してきます。

### トリミングツール`C`で画像の拡張範囲を広げる
![スクリーンショット-2023-09-04-1.36.40.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/c34587e3-16c5-f781-a801-b600d950c2da.jpeg)
### 選択ツールで広げた範囲を選択
![スクリーンショット-2023-09-04-1.36.40.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/34dcc1d8-a3fc-54e4-f914-3d2dfeb4a9ec.jpeg)


### 生成拡張を選択
![スクリーンショット 2023-09-04 1.40.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/12498431-6cad-1562-c5d3-d43851c05ab0.png)
生成拡張ボタンを押すことでテキストプロンプトが表示されます。
※「生成拡張」→「ジェネレーティブ塗りつぶし」の場合もあります。それぞれ妥当のものを選択してください。



### テキストプロンプトは空白のまま「生成」をクリック
![スクリーンショット 2023-09-04 1.41.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/4045431c-9ce0-3740-bcb5-2f143edb006b.png)
テキストプロンプトは空欄のままで良いです。
![スクリーンショット-2023-09-04-1.41.34.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/cb972c65-bc11-016a-bd78-0b989f1492f3.jpeg)
生成を押すと1分もかからず生成してくれます。


### 選択した範囲をAIが自動で生成した画像で埋めてくれる
![スクリーンショット-2023-09-04-1.41.56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/6f8119b5-f5fa-1e0e-9f1e-2fec1ca7ee33.jpeg)

## 最後に
以上となります！
簡単に自然に画像を広げることができます！是非活用していただきたいです。
RxJavaの中心的な概念「Observable」について理解する

# Observable とは

`Observable`はRxJavaの中心的なクラスで、ある一連のデータまたはイベントを非同期で発行するオブジェクトです。この`Observable`が発行するデータを受け取る側のことを`Observer`といいます。
イメージ的には、`Observable`は放送局のようなもので、`Observer`はテレビの受信機のようなものです。

### Observable の基本的な動作

1. **onNext**: `Observable`は0回以上`onNext`を呼び出してデータを`Observer`に送信します。
2. **onError**: エラーが発生した場合、`Observable`はこのメソッドを呼び出してエラーを通知します。このメソッドが呼び出されたあと、他のメソッドは呼び出されません。
3. **onComplete**: `Observable`がもうこれ以上データを発行しないことを`Observer`に通知するためにこのメソッドを呼び出します。このメソッドが呼び出されたあと、他のメソッドは呼び出されません。

### Observable の簡単な例

```java
Observable<String> observable = Observable.create(emitter -> {
    emitter.onNext("Item 1");
    emitter.onNext("Item 2");
    emitter.onComplete();
});

Observer<String> observer = new Observer<String>() {
    @Override
    public void onNext(String item) {
        System.out.println(item);
    }

    @Override
    public void onError(Throwable e) {
        System.err.println("Error occurred!");
    }

    @Override
    public void onComplete() {
        System.out.println("Done!");
    }
};

observable.subscribe(observer);
```
### 実行結果
```
Item 1
Item 2
Done!
```
この例では、`Observable`は`Item 1`と`Item 2`という二つのデータを発行しており、それを`Observer`が受け取っています。最後に`Observable`は完了を通知しています。

### 補足
#### なぜ各メソッドをオーバーライドしているのか？
`Observer`はインターフェースです。そして、そのインターフェースには`onNext`, `onError`, `onComplete`という3つの抽象メソッドが定義されています。これらのメソッドは`Observable`がデータやイベントを発行するときに呼び出されます。

具体的な動作を知りたいので、このインターフェースを実装する際にこれらのメソッドをオーバーライドします。つまり、具体的に`onNext`が呼び出されたときに何をするか、`onError`が呼び出されたときにどのようなエラーハンドリングをするかなどを定義します。

#### observable.subscribe(observer);はなんのための処理なのか？
`observable.subscribe(observer);`は、`Observer（データの受信側）`を`Observable（データの送信側）`に登録するイメージです。これにより、`Observable`がデータやイベントを発行するたびに、`Observer`の対応するメソッド（onNext, onError, onComplete）が呼び出されるようになります。

簡単に言うと、`subscribe`メソッドは`Observer`をテレビ放送の受信機に「登録」するようなものです。この「登録」をすることで、放送局が放送を開始したら、登録された受信機でその放送内容を受け取ることができるようになります。

まとめると、`Observer`のインスタンスを作成してそのメソッドをオーバーライドすることで、データ受信時の具体的な動作を定義します。そして、`subscribe`メソッドを使用して、その`Observer`を`Observable`に「登録」することで、データの受信が開始されます。

### まとめ

- `Observable`はデータのソース。データを非同期に発行する。
- `Observer`はデータの消費者。`Observable`からデータを受け取る。
- `Observable`と`Observer`はRxJavaの非同期データフローを形成します。

難しい〜
RxJavaのdoOnSuccess

`doOnSuccess` は、RxJavaの `Single` クラスのオペレータの一つです。
`Single` は、0または1のアイテムを発行することができる特殊なオブザーバブルで、特にHTTPリクエストやデータベースクエリなど、一度きりの結果を返す操作に役立ちます。

`doOnSuccess` は、`Single` が成功を通知するとき（つまり、アイテムが発行されるとき）に副作用として実行されるアクションを指定するためのオペレータです。

`doOnSuccess` の簡単な使用例です↓

```java
Single.just("Hello, RxJava!")
      .doOnSuccess(item -> System.out.println("Item has been emitted: " + item))
      .subscribe(result -> System.out.println("Received: " + result));
```

このコードでは、`Single` から "Hello, RxJava!" という文字列が発行されると、`doOnSuccess` によって、
`"Item has been emitted: Hello, RxJava!"`
が先に出力され、その後に `subscribe` メソッドの中で 
`"Received: Hello, RxJava!"` 
と出力されます。

注意点として、`doOnSuccess` はデータの変更やフィルタリングを行うのではなく、副作用（ログの出力、変数の更新など）を実行するためのものです。
データの流れに影響を与える処理ではありません。
【Laravel】中間テーブルを作成する方法

## 中間テーブルの命名規則
・2つのテーブルをアルファベット順に並べる。（例：circles→students）
・2つのテーブルを単数形にして`_`でつなげる。（例：circle_student）



## 中間テーブルの作成方法
①マイグレーションファイルを作成する。
　VSCodeのターミナルまたは、コマンドプロンプトで以下を実行する。
```
php artisan make:migration create_circle_student_table --create=circle_student
```
※すべての`circle_student` は任意のテーブル名を入力する。

以下のように表示されればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/11dcc7eb-afd7-9a7e-7c71-70d4af9ba188.png)


②マイグレーションファイルにカラムを設定する。
　database/migrationsフォルダ内のファイルを編集する。
```****_**_**_******_create_circle_student_table.php
 public function up()
    {
        Schema::create('_create_circle_student_table', function (Blueprint $table) {
            $table->id();
             $table->foreignId('circle_id')->constrained()->cascadeOnDelete();  // ここを追加
             $table->foreignId('student_id')->constrained()->cascadeOnDelete(); // ここを追加           
            $table->timestamps();
        });
    }
```
・foreignId('カラム名')->constrained()：foreignId()の引数に設定したカラムに外部キーを設定する。
・cascadeOnDelete()：circleテーブルやstudentテーブルのidが消された場合に中間テーブルのレコードも自動で削除される。


③マイグレーションを行う。
　VSCodeのターミナルまたはコマンドプロンプトで以下を実行する。
```
php artisan migrate
```

以下のように表示されればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/31585c2e-948b-8fe5-4a13-47a224b6c799.png)


## リレーションシップを設定する
両方のモデルにリレーションシップを設定する。
app\Models\circle.php、student.php に以下を記述する。
```circle.php
 public function students() {
     return $this->belongsToMany(Student::class)->withTimestamps();
 }  
```

```student.php
 public function circles() {
     return $this->belongsToMany(Circle::class)->withTimestamps();
 }  
```
・belongsToMany()：多対多のリレーションシップを設定できる。
・withTimestamps()：タイムスタンプ（created_atカラムとupdated_atカラムの値）が自動的に保存する。
　（中間テーブルはタイムスタンプが自動で保存されないため。）


## コントローラを編集する
・中間テーブルにデータを保存する場合は`sync()`メソッドを使用する。
例：circle_idが1、student_idが3の場合
```
$circle->students()->sync(3);
```
中間テーブルは以下のようになる。
| ID | circle_id | student_id |
| ---- | ---- | ---- |
| 1 | 1 | 3 |

<br/>

※上記の状態で、student_idを1,2と紐づけた場合、以下のようになる。
```
$circle->students()->sync([1,2]);
```
中間テーブルは以下のようになる。
| ID | circle_id | student_id |
| ---- | ---- | ---- |
| 2 | 1 | 1 |
| 3 | 1 | 2 |

↑ ID:1のレコードが自動で削除される。


・実際に記述する場合（例）
```○○Controller.php
$circle->students()->sync($request->input('student_ids'));
```

## ビューを編集する
コントローラに値を渡したい場合は以下のように記述する。（例）
```index.blade.php
<input type="checkbox" name="student_ids[]" value="{{ $student->id }}"
```
※name属性の`[]`は、配列で複数の値をコントローラに渡す記述になる。
Powershell 指定されたフォルダの最新の１０のファイルリスト

```powershell:Ps_New10FilesList_utf8.ps1
# Powershell 
# C:\hoge にあるpdfファイルの更新日付が最新のものから10をテキストに出力する
# Current フォルダへ移動
sl 'D:\Documents2021\VideoLan\'
# ファイルリストを削除
if((Test-Path '.\ps_pdffilelist_utf8.txt') -eq $true){DEL 'ps_pdffilelist_utf8.txt'}
# ファイルリストを変数に代入
  $FileNames = Get-ChildItem *.mp4 | Sort-Object -Descending LastWriteTime

if($FileNames -ne $null){
$cnt = $FileNames.Count + 1
if($cnt -ge 10){$cnt= 10}
for ($i = 0; $i -lt $cnt; $i++) {
		Write-Host $FileNames[$i].Name
        $FileNames[$i].Name | Out-File '.\ps_pdffilelist_utf8.txt' -Encoding utf8   -Append -NoClobber 
}
}else{
Write-Host 'Files count 0'
}
```
Cisco機器を久しぶりに触ってみた

社内研修の為にL2スイッチとL3スイッチを購入したものの、暫くNW系の案件から離れていた為いろいろ思い出しながら初期設定を行う。

購入機器：Catalyst2940、Catalyst3560
どちらもまぁまぁ古いが、研修用としては十分かなーという気がする。

いろいろ思い出しながらとりあえずL2のほうをセットアップ
①IPを振る
vlan1が管理インターフェースのはずなのでそれにIPを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/96ae57ca-57c5-6046-6c9c-a1cc987febdd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/ddd94034-8178-7170-5db9-1b7575b4a517.png)

②仮想インターフェースにパスワード設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/f44a9cda-91a0-02dd-0b1d-dc27b4dff78e.png)

③ホスト名変える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/87c6e6ac-3ac5-a8f0-3b2e-40d50657b56e.png)

あとは？

④タイムアウトしないように（研修環境用なのでよいでしょう）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/ba22b545-75d8-4647-67f8-9d1b5d156055.png)

⑤コマンド実行結果（主にshow系）が一気に出るように
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/2d5916ec-9b6c-3d5d-17ca-a054f9258e95.png)

⑥コマンド打ってる途中でデバックログが被らないように
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/63fa0d87-a1b9-1fd2-da84-7089ff3acb91.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/7cff9870-57e5-9c99-0391-32874dddb9b9.png)

⑦保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/115c72e8-da9b-0291-9da2-a02b193399d5.png)

他は。。。
ちょっと調べてありそうだったら後ほど追記する。

以上
GitLab環境構築完了（接続方法の備忘録）

# 備忘録

VagrantとVirtual Boxでの環境構築はできなかったため、諦めてDockerで環境を構築致しました。
Docker compose up -dコマンドで環境を構築すると、なぜかコンテナへのログインを求められるようになってしまい、抜け出すことができない事象が発生しました。
また、ログイン情報も持っていないため、永遠にコンテナにログインすることもできません。
そのため、一度teratermを使って、外部からログインを試みました。
<!-- IPアドレスは192.168.2.107:8080 -->
これにより各種dockerコマンドも打つことに成功しました。
そして、ホストとなるwindows環境のブラウザから、GitLabにアクセスすることができました。

# 接続方法

別件でネットワーク周りの設定をいじっていましたら、GitLabへアクセスすることができなくなりました。
GitLabもそうですけれど、ホストサーバー（お家のWindows PC）からHyperVで作成したサーバーへアクセスすることができませんでした。
結論としましては、IPアドレスが変わっていたことが原因でしたので、HyperVでログインし、ifconfigでIPアドレスを確認し、teratermでログインすることができました。サーバーのIPアドレス以外にもいくつか表示されるのですけれど、どれがホストと繋がるIPなのか、判別する方法は分かりませんでしたので、どなたかご存知の方いましたら、教えていただけるととても嬉しいです。

余談ですけれど、dockerのコンテナの中でifconfigを実行するには、net-toolsをインストールする必要がございます。
以下のサイト様を参考にインストールさせていただきました。

https://trios.pro/docker-tips-network-command/

以下がコマンドとなります。

* nslookup/hostなどのコマンド  
``` apt-get update && apt-get install -y dnsutils```

* ping/ifconfingなどのコマンド  
``` apt-get update && apt-get install -y iputils-ping net-tools ```

* nc/netcatコマンド  
``` apt-get update && apt-get -y install netcat```

* tracerouteコマンド  
``` apt-get update && apt-get install -y traceroute```

Docker内でコマンドを実行するには以下の手順を踏むことで可能となります。
まずはコンテナの名前を確認する必要がございます。以下のコマンドでNAMEカラムを確認致します。

```docker ps```

次にDockerコマンドを使って環境にログイン致します。

```docker exec -it [サーバー名]```


# サーバーの役割

備忘録として、各サーバーの役割を記録させていただきます。

| サーバー名 | ポート番号 | 用途 |
| --- | --- | --- |
| client1 | 8082 | 本番環境(ketchup) |
| client2 | 8083 | 本番環境(ketchup-nginx) |
| client3 | 8084 | テスト環境(ketchup) |
| client4 | 8085 | テスト環境(ketchup-nginx) |
マウス操作で地球のような球体を拡大・縮小・回転操作する方法

地球儀アプリの操作のように、マウスカーソル位置を中心に拡大・縮小したり、ドラッグで回転させる方法
![ZoomableGlobe.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538053/d4d97f94-7f04-a0c6-e5c0-2c14f82b45e2.gif)
リポジトリ
https://github.com/yasuhto/ZoomableGlobe

# 拡大・縮小
マウスカーソル位置を中心に拡縮させるということは、カーソル位置の球体上の座標は変化しません。つまり、拡縮前後でカーソル位置の座標が変化しないようにズレを吸収する方向に球体を回転させます。

```c#:CameraController.cs
    //  ホイール操作による拡縮前後のカーソル位置からの衝突点（A、B）をそれぞれ求める
    var fromPos = hit.point;
    var toPos = hit2.point;

    //  回転軸axisは、球面上の中心点（O）とABからなる平面の法線
    var vecA = fromPos - this.TargetSphere.position;
    var vecB = toPos - this.TargetSphere.position;
    var axis = Vector3.Cross(vecA, vecB);

    //  球面上の中心点（O）から軸axisに対する回転角度（θ）を求める
    //  拡縮時のカーソルのズレを打ち消す方向
    var dragAngle = Vector3.SignedAngle(toPos, fromPos, axis);

    //  回転軸axisに対してθ回転させる
    this.transform.RotateAround(this.TargetSphere.position, axis, dragAngle);
```

# 回転
マウスのドラッグ方向から計算した角度をもとに、球体を中心にカメラを回転させます。こうすることで、見かけ上球体が回転しているように見えます。回転の計算方法は、拡縮時とほぼ同じです。
```c#:CameraController.cs
    //  平面上のドラッグから、球面上のドラッグ区間（AB）を求める
    InputHepler.GetMouseDragFromTo(this.TargetSphere, this._TargetCamera, out var fromPos, out var toPos);

//  回転軸axisは、球面上の中心点（O）とABからなる平面の法線
    var vecA = fromPos - this.TargetSphere.position;
    var vecB = toPos - this.TargetSphere.position;
    var axis = Vector3.Cross(vecA, vecB);

    //  球面上の中心点（O）から軸axisに対する回転角度（θ）を求める
    var dragAngle = Vector3.SignedAngle(fromPos, toPos, axis);

    //  回転軸axisに対してθ回転させる
    this.transform.RotateAround(this.TargetSphere.position, axis, -1 * dragAngle);
```
# 参考資料
* https://watako-lab.com/2019/01/23/roll_pitch_yaw/
Makefileでコマンドから引数を受け取る方法

## やりたいこと

Makefileに記述されているコマンドに対して引数を渡したい。
例えば、Makefile内にLaravelのマイグレーションファイルを作成する
コマンドがMakefile内に定義されてるとする。
make ターゲット名で実行するときに、マイグレーションファイルの名前と
テーブル名を可変で渡せると使い勝手が良くなりそうなのでそのような環境を整えたい。

## 実現方法
この場合、以下の書式でMakefileに記述することで

makeコマンド実行時に引数を渡すことが可能になる。

**Makefile側での構文**

```
ターゲット名:
    コマンド  ${変数名}
```

**makefile内の記述例**
```
create-migration:
    php artisan make:migration ${FILENAME} --create=${TABLENAME}
```

**コマンド実行例**
```
$ make create-migration test books
```

こうすることで引数をMakefileに対して渡すことができるようになる。

## 参考
https://qiita.com/tortuepin/items/9861c75853b516c8a279
【Photoshop】「ジェネレーティブ塗りつぶしの」でオブジェクトの削除をしてみた！

## 新AI画像生成機能「ジェネレーティブ塗りつぶし」でオブジェクトの削除方法について
今回は新AI画像生成機能「ジェネレーティブ塗りつぶし」で**オブジェクトの削除**をしてみたのでその手順について説明してきます。

![スクリーンショット 2023-09-03 23.40.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/97a3ff6b-5333-43ce-5390-07a007d7bff2.png)

# 目次
* [Photoshopの新AI画像生成機能「ジェネレーティブ塗りつぶし」](#photoshopの新ai画像生成機能ジェネレーティブ塗りつぶし)
* [オブジェクトの削除方法](#オブジェクトの削除方法)
    * [消したいオブジェクトを範囲を選択する](#消したいオブジェクトを範囲を選択する)
    * [コンテキストタスクバーから生成塗りつぶしを選択](#コンテキストタスクバーから生成塗りつぶしを選択)
    * [テキストプロンプトを空欄で生成を押す](#テキストプロンプトを空欄で生成を押す)
    * [選択したオブジェクトが削除される](#選択したオブジェクトが削除される)
*  [最後に](#最後に)

## Photoshopの新AI画像生成機能「ジェネレーティブ塗りつぶし」

PhotoshopのBeta版に新AI画像生成機能「ジェネレーティブ塗りつぶし」が標準搭載されました。
ジェネレーティブ塗りつぶしは画像生成の機能以外に余計なオブジェクトを消す際にも重宝します。


**※新AI画像生成機能「ジェネレーティブ塗りつぶし」は現在(2023/9/3)の時点ではBeta版のみ使用可能なので、Beta版をダウンロードしていない方はダウンロードから初めてください。**

## オブジェクトの削除方法
オブジェクトの削除方法について画像付きで説明してきます。

### 消したいオブジェクトを範囲を選択する
![スクリーンショット-2023-09-03-23.36.47.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/59b79b4b-c0a9-0bbf-b2d8-acf034be5135.jpeg)
消したいオブジェクトを範囲選択してください

### コンテキストタスクバーから「生成塗りつぶし」を選択
![スクリーンショット 2023-09-03 23.36.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/19e5f6c5-a53e-0aff-18b7-3964f99de1bd.png)
生成塗りつぶしボタンを押すことでテキストプロンプトが表示されます。
※「生成塗りつぶし」→「ジェネレーティブ塗りつぶし」の場合もあります。それぞれ妥当のものを選択してください。

### テキストプロンプトを空欄で生成を押す
![スクリーンショット 2023-09-03 23.37.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/c9d8ce19-cc8a-acba-d459-fd9d2ca9e1ff.png)
テキストプロンプトは空欄のままで良いです。

![スクリーンショット-2023-09-03-23.37.09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/3b1f03f4-baaf-098b-1a72-a8a3ef499f69.jpeg)
生成を押すと1分もかからず生成してくれます。
### 選択したオブジェクトが削除される
![スクリーンショット-2023-09-03-23.37.40.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/6301c44b-b4c5-0858-b21f-83da2ba09f8b.jpeg)
生成ボタンをクリックすると選択したオブジェクトが削除されます。
左右の矢印ボタンを押すことでオブジェクトの削除パターンが選択できます。
## 最後に
以上となります！
簡単に自然にオブジェクトを削除することが可能なので上手く活用していきたいですね。
AI時代は comment driven development  で行けませんか？

comment driven development
つまりコメント駆動開発
コメントファーストと言っても良いと思います

Github copilot、ChatGPTが出て以降、今まで以上にコメントを書くことが重要になっていると思います

あらゆるコードにコメントを残したほうが良く、コメントのないコードは極力避けたほうがいいのでは？とすら思っています

**なぜなら、コメントを書くことこそが最早プログラミングでありコーディングであるから**

です

コードレビューの着眼点も、些末なコードのお作法や様式美を指摘するくらいなら、コメントがわかりやすく残されているかどうかを指摘しましょう！


# 何故そう思うか？

github copilotを導入してから、コメントでほとんどのコードが書けてしまうからです

例：
コメントを書くと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48695/5ff98fca-81f2-779d-0c28-707f8128d260.png)

出力される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48695/7392f4d5-69d5-2eca-0f3c-95fba8739fa0.png)


github copilotが便利すぎる…

copilotに限らずChatGPTに直接聞いてみても似たようなコードが出力されます


ここまで自然言語を綺麗にコードに変換できるとなると、もはや
コメントを書く＝プログラミング、コーディングなのではないでしょうか？

さらに、**AIはコメントとコードのダブルチェックによって精度が上がります** 

コメントとコードの内容がズレていると、ChatGPTは指摘してくれますし、そこからどういうミスをしているのかの推理までしてくれます

この素晴らしきAIの性能を使って楽することこそエンジニアリングですよね


# コメントがなくても理解できるコードを善しとされてきた歴史

- **コメントは実際に実行される部分ではないため、コメントがあっているかどうかテストで担保できない**

- **コードを直してもコメントを直さないケースが発生しうるため、コードとコメントが一致しなくなる可能性がある**

などという理由で、**コメントが無くても理解できるコードほど良い**とされてきました…


でも、**実際はコメントがないせいで、まるでパズルを解くような作業を要求されるコードのほうが多い**ように思います

コードリーディングで苦しんだ経験のないエンジニアはいないと言っても過言ではないでしょう🥺


# そんな中、 GitHub Copilot、ChatGPT が登場した

LLMによって、自然言語とコードでそれぞれ分断されていた関係性への架け橋ができてしまった

**この世界では最早コメントはコードでありコードはコメントである**

つまりコメントはコードと同等の重みを持つ存在となる

AIがコメントを解釈し、コードを出力できる状態を保つことこそ、今後重要になるのではないだろうか？

もちろん我々**人間も自然言語を処理できるので、コメントがあるほうが当然読みやすいです**


# 今後やって欲しいこと

Github copilotを使った際、コメントからコードを出力してもらってるにも関わらず、コメントはコミットせず消す。。。というような行為をしていませんか？

それは絶対にやめましょう！！

これからのコメントは常にコードと対等な存在です！

コメントはAIが理解するために必要な道具です！
我々が理解するためにも必要な道具です

コメントを書くことでコードが出力され、AIの理解も、我々の理解もしやすくなる

一石三鳥なので、これからはコメントをゴリゴリ書いていきましょう。

というか、いきなりコードを書く前に、コメントから書いていきましょう。


# 今後予想される世界

- コメントのみで完全にコーディングが完了する
- コメントとコードの不一致を検出できる
- 設計書とコメントとコードの相互変換ができる
- テストコードが不要になる

100%この世界になるのは当分先だと思います

いきなりゼロイチでこれらの項目が達成されることはありません
そこまでのグラデーションは必ず存在します

そのグラデーションはこの1,2年で大きく進んでいくのはでないかと思ってます
【OracleDatabase】文字データ型の比較と空白埋め

# 0. はじめに
OracleDatabaseで文字データ型の比較を行った際、  
```compare_char.sql
'abc⎵⎵' = 'abc'  -- '⎵'は半角スペース
```
が等しいとみなされる場合とみなされない場合があったので、
どのような違いがあるのか調べました。
  
結論から言うと
***CHARデータ型系同士[^1]の比較の場合は'abc&#9141;&#9141;'と'abc'が等しいとみなされ、少なくとも一方がVARCHAR2データ型系[^2]の場合はみなされません。***
以下で詳しく説明します。  
<font color="DimGray">　
[バージョン21cのSQL言語リファレンス](https://docs.oracle.com/cd/F39414_01/sqlrf/index.html#Oracle%C2%AE-Database)をもとに書いていますので、DBのバージョンが異なる場合は注意してください。
結論のソースのみ確認したい方は、[2 Oracleのデータ型>データ型の比較原則>文字値](https://docs.oracle.com/cd/F39414_01/sqlrf/Data-Type-Comparison-Rules.html#GUID-A114F1F4-A08D-4107-B679-323DC7FEA31C)の
**空白埋め比較セマンティクスおよび非空白埋め比較セマンティクス**をご覧ください。　
</font>
- - -

# 1. CHARデータ型
カラムのデータ型をCHARで指定した場合、**固定長**の文字列を格納できます。
カラム作成時にsize（列長）を指定し、格納された文字列はsizeで指定された長さになります。
登録しようとする値が、カラムの列長より短い場合は**後方を空白埋め**され、
列長より長い場合はエラーになります。

冒頭の'abc&#9141;&#9141;'のような文字列が発生する状況としては、
CHARデータ型の列から値を取得しているケースが多いと思います。
<font color="DimGray">　
この他、カラムの列長がバイト長を指しているのか、
それとも文字列長を指しているのかも重要なポイントですが、
ここでは意識しなくても話を進められるので一旦置いておきます。
</font> 

:::note info
CHARは固定長であり、格納した値が列長より短い場合は空白埋めされる
:::

- - -

# 2. VARCHAR2データ型 
カラムのデータ型をCHARで指定した場合、**可変長**の文字列を格納できます。
CHARデータ型同様、カラム作成時に列長を指定します。
登録しようとする値が、カラムの列長より短い場合は**空白埋めせずにそのまま格納**され、列長より長い場合はエラーになります。

CHAR型の列から列長と長さが等しい値を取得した場合や、VARCHAR2データ型の列から値を取得した場合、システムからパラメータを受け取った場合など、
冒頭の'abc'のような文字列が発生するケースは結構多いので、データの型に特に注意が必要です。
<font color="DimGray">　
CHARデータ型同様、列の長さセマンティクスに関してはここでは割愛します。
</font>

:::note info
VARCHAR2は可変長であり、格納した値が列長より短い場合も空白埋めされない
:::

- - -

# 3. 文字値を戻すファンクション
データ型がCHARのカラムから値を取り出す場合であっても、
ファンクション（関数）を適用した場合、データ型が変わる可能性があります。

私が遭遇したケースでは、
**CHARデータ型カラムから取得した値に、REPLACEを使用した結果、VARCHAR2データ型が戻され**ていました。
<font color="DimGray">　
戻り値が文字データ型のファンクションはたくさんあるので、詳細は[公式リファレンス](https://docs.oracle.com/cd/F39414_01/sqlrf/Single-Row-Functions.html#GUID-06062705-1EC8-44ED-89B8-0F0573B74EA2)を参照してください。
</font>

::: note warn
ファンクションが戻す値のデータ型に注意
:::

- - -

# 4. 空白埋め比較セマンティクス
空白埋め比較セマンティクスとは、
**比較対象の2つの値の長さが異なる場合、短い方の値を後方空白埋めして比較する**セマンティクスです。
**後方の空白のみが異なる**（冒頭の'abc&#9141;&#9141;' = 'abc'のような）**場合**でも、
このセマンティクスが使用される場合は**2つの値が等しい**とみなされます。

最初に説明した通り、**CHARデータ型系同士[^1]の比較**においてはこの空白埋め比較セマンティクスが使用されます。

:::note info
空白埋め比較セマンティクスでは'abc⎵⎵' = 'abc'が等しいとみなされる
:::

- - -

# 5. 非空白埋め比較セマンティクス
空白埋め比較セマンティクスに対して、
**値の長さが異なる場合でも、空白埋めをせずに比較する**セマンティクスを**非空白埋め比較セマンティクス**といい、非空白埋め比較セマンティクスが使用される場合は、
**後方の空白のみが異なる場合、2つの値が異なっている**（正確には長い方の値が大きい）とみなされます。

比較対象の2つの値のうち**少なくとも一方がVARCHAR2データ型系**[^2]である場合には、非空白埋め比較セマンティクスが使用されます。

:::note info
非空白埋め比較セマンティクスでは'abc⎵⎵' = 'abc'が等しくないとみなされる
:::

- - -

# 6. まとめ
**'abc&#9141;&#9141;' = 'abc'に関して、
CHARデータ型系同士[^1]の比較の場合は、
空白埋め比較セマンティクスが使用されるため両辺が等しいとみなされ、
少なくとも一方がVARCHAR2データ型系[^2]である場合には、
非空白埋めセマンティクスが使用されるため両辺が等しくないとみなされます。**

DBやSQLで意図せぬ動作をした際には、データ型やファンクション、
比較規則等の仕様の確認が重要だと思いました。

以上

[^1]:正確には「比較する両方の値が、CHARデータ型、NCHARデータ型、テキスト・リテラルのいずれかの式の場合、またはUSERファンクションの戻り値の場合」
[^2]:正確には「比較する片方または両方の値がVARCHAR2データ型またはNVARCHAR2データ型の場合」
A5のタイムアウト設定により、canceling statement due to statement timeout

# 課題

A5-Mk2で、PostgreSQLをさわっていたら、タイムアウトエラーが発生した。

```:実行結果
canceling statement due to statement timeout
```

実行したクエリは下記である。

```:実行クエリ
delete from articles where article_id between 11183 and 12631 and article_url like 'https://www.eo%' and remarks = 'クエリテスト'
```

article_idは主キーであり、したがってINDEXが張られているため高速に実行できると期待したがこちらも同様にタイムアウトになった。

```:実行クエリ
delete from articles where article_id between 11183 and 12631;
```

なお参考として、articlesテーブルの総件数は15494件、バイト数はおよそ17メガバイトという状況である。

```:実行クエリ
SELECT
    relname as table_name
    , reltuples as row_num
    , (relpages * 8192) as byte_size 
FROM
    pg_class 
WHERE
    relname = 'articles';
```

```:実行結果
table_name	row_num	byte_size
articles	15459	17924096
```

# タイムアウト設定を確認

タイムアウト値は、30秒である。実際に計ってみると、確かに30秒経過したタイミングで上記のエラーになる。
```:実行クエリ
SHOW statement_timeout;
```

```:実行結果
30s
```

postgresql.confのstatement_timeoutを確認すると
```
#statement_timeout = 0
```
このようにコメントアウトされている。（特に設定をいじっていないので、PostgreSQL14の初期値である。）

初期値の場合、タイムアウトは無制限であるが、今回の場合、**A5-Mk2の設定で、タイムアウト値が30秒に設定されている。**

（コマンドプロンプトでSHOW statement_timeout;としてみれば、0と出る）

A5上で、
```
set statement_timeout to 60000;
```
としても、A5の設定の方が優先されてしまい、変更することはできない。

# 対応

A5-Mk2のタイムアウト値を延伸する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180727/f59def0f-2afd-d012-c9aa-a1e73741efcd.png)

60秒に延伸したところ、成功した。
【React】eventの型の指定方法


## eventの型指定

```ts
type Props = {
  onClick: (event: React.MouseEvent<HTMLInputElement>) => void
  onChange: (event: React.ChangeEvent<HTMLInputElement>) => void
  onkeypress: (event: React.KeyboardEvent<HTMLInputElement>) => void
  onBlur: (event: React.FocusEvent<HTMLInputElement>) => void
  onFocus: (event: React.FocusEvent<HTMLInputElement>) => void
  onSubmit: (event: React.FormEvent<HTMLFormElement>) => void
  onCancel: (event: React.React.SyntheticEvent<HTMLDialogElement>) => void
}
```
ブラウザストレージ101：LocalStorage、SessionStorage、Cookieを比較

## はじめに
Web開発においてデータを保存して管理する方法は多くあります。この記事では、クライアント側で主に使用される三つのストレージオプションであるLocalStorage、SessionStorage、そしてCookieについて簡単に説明します。

## LocalStorage（ローカルストレージ）
- 有効期限なし: ユーザーが手動で削除しない限り、データは永続的に保存されます。
- 容量: 一般に約5MBで、ブラウザによります。
- アクセシビリティ: JavaScriptからデータにアクセスできます。

## SessionStorage（セッションストレージ）
- 有効期限: ブラウザセッションが終了するとデータは自動的に削除されます。
- 容量: 一般に約5MBで、ブラウザによります。
- アクセシビリティ: JavaScriptからデータにアクセスできます。

## Cookie（クッキー）
- 有効期限: サーバーまたはクライアントで設定可能。一般的にはサーバー側から設定します。
- 容量: クッキーごとに最大4KBです。
- セキュリティ: httpOnlyフラグでJavaScriptからのアクセスを制限でき、SecureフラグでHTTPS通信のみを許可することも可能です。


## 比較
| 特性  | LocalStorage  | SessionStorage  | Cookie |
|---|---|---|---|
|有効期限  |手動で削除されるまで期限なし  |ブラウザセッションが終了すると期限切れ  |設定可能（一般的にはサーバーによって設定）  |
|容量  |約5MB  |約5MB  |クッキーごとに最大4KB   |
|アクセシビリティ | JavaScriptでアクセス可能|	JavaScriptでアクセス可能|	JavaScriptおよびサーバーサイドでアクセス可能
|セキュリティオプション|	なし|	なし|	httpOnly、Secureフラグ


## まとめ
LocalStorage、SessionStorage、Cookieはそれぞれ独自の特徴と制限があります。これらを正確に理解し、効率的なストレージオプションの使用して、より優れたWebアプリケーションを構築しましょう。
pip install win32guiでエラーが出てインストールできないときの対処法

# win32guiのpip installができない
```pip insall win32gui```でwin32guiをインストールすると以下のようなエラーがでてインストールできない。
```
Collecting win32gui
  Using cached win32gui-221.5.tar.gz (605 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... error
  error: subprocess-exited-with-error

  × Getting requirements to build wheel did not run successfully.

        <中略>

 ModuleNotFoundError: No module named 'win32.distutils.command'
note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error

× Getting requirements to build wheel did not run successfully.
│ exit code: 1
╰─> See above for output.

note: This error originates from a subprocess, and is likely not a problem with pip.
```

# 対処法
```pip install pywin32```で実行すれば解決できた。
macOSでXIAO BLE (nRF52840)をArduino IDEで開発する

# Arduino IDE

動作確認できたArduino IDEのバージョンです。

- 1.8.19
- 2.2.1

# 環境設定

Seeed Wikiを参照して環境を構築します。

https://wiki.seeedstudio.com/XIAO_BLE/

Arduino IDE → Preferencesを選択し、Additional boards manager URLsにjsonのURLを追加します。

https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json

![スクリーンショット 2023-09-03 22.57.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/d2112b83-ffdc-155f-fcd9-bd9e30005fc4.png)

Tools → Board Managerを選択し、Seeed nRF52 BoardsとSeeed nRF52 mbed-enabled Boardsを追加します。

# Boardの選択

- Board: "Seeed XIAO nRF52840"を選択
- Port: "/dev/cu.usbmodem1101"を選択

![名称未設定1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/aed029be-b61a-79d8-b59f-76a734f9d36a.jpeg)

# Bootloaderの書き込み

- Programmer: "Bootloader DFU for Bluefruit nRF52"を選択
- Burn Bootloaderを実行

![名称未設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/8541d7fe-a9d1-3c45-a268-a32099d86782.jpeg)

# サンプルコード

基板上のLEDをRGBで光らせるサンプルコードです。
Seeed Wikiのサンプルコードをビルドするとエラーが出ます。

```bash
/Users/kitazaki/Library/Arduino15/packages/Seeeduino/tools/arm-none-eabi-gcc/9-2019q4/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld: /private/var/folders/zw/c0lhq70d17gccbb2nn0vqq4m0000gp/T/arduino/sketches/A36899421A2D1E4AD29D156E7145D9A1/../../cores/Seeeduino_nrf52_xiaonRF52840_softdevice_s140v6,debug_l0_515b74aeb10268b1433930586254a848/core.a(main.cpp.o): in function `loop_task(void*)':
/Users/kitazaki/Library/Arduino15/packages/Seeeduino/hardware/nrf52/1.1.4/cores/nRF5/main.cpp:57: undefined reference to `Adafruit_USBD_CDC::operator bool()'
/Users/kitazaki/Library/Arduino15/packages/Seeeduino/tools/arm-none-eabi-gcc/9-2019q4/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld: /Users/kitazaki/Library/Arduino15/packages/Seeeduino/hardware/nrf52/1.1.4/cores/nRF5/main.cpp:57: undefined reference to `Adafruit_USBD_CDC::begin(unsigned long)'
/Users/kitazaki/Library/Arduino15/packages/Seeeduino/tools/arm-none-eabi-gcc/9-2019q4/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld: /Users/kitazaki/Library/Arduino15/packages/Seeeduino/hardware/nrf52/1.1.4/cores/nRF5/main.cpp:57: undefined reference to `Serial'
collect2: error: ld returned 1 exit status

exit status 1

Compilation error: exit status 1
```

#include "Adafruit_TinyUSB.h"
の1行を追加します。

```c++
#include "Adafruit_TinyUSB.h"

void setup() {
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_BLUE, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
  digitalWrite(LED_RED, HIGH); /// turn OFF
  digitalWrite(LED_BLUE, HIGH);   
  digitalWrite(LED_GREEN, HIGH);   
}

void loop() {
  digitalWrite(LED_RED, LOW); // turn ON
  delay(1000);
  digitalWrite(LED_RED, HIGH); /// turn OFF
  digitalWrite(LED_BLUE, LOW);   
  delay(1000);
  digitalWrite(LED_BLUE, HIGH);   
  digitalWrite(LED_GREEN, LOW);   
  delay(1000);
  digitalWrite(LED_GREEN, HIGH);   
}
```
amazon linux 2023 Nginxのインストール

# Amazon Linux 2023でNginxをインストールする

Amazon linux 2023を触る機会があったので備忘録として。

まずはSSHでサーバーに接続する。

```
uname -r

6.1.41-63.114.amzn2023.x86_64
```

Nginxをインストール
```
dnf update
dnf -y install nginx
```
yumでもaptgetでもなくdnfを使う。
```
nginx -v
nginx version: nginx/1.24.0
```
再起動しても自動で起動するように設定
```
systemctl enable nginx

Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
```
起動する
```
systemctl start nginx.service
systemctl status nginx.service
● nginx.service - The nginx HTTP and reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
     Active: active (running) since Sun 2023-09-03 14:11:18 UTC; 7s ago
    Process: 26194 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
    Process: 26197 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
    Process: 26203 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
   Main PID: 26216 (nginx)
      Tasks: 2 (limit: 1114)
     Memory: 2.2M
        CPU: 56ms
     CGroup: /system.slice/nginx.service
             ├─26216 "nginx: master process /usr/sbin/nginx"
             └─26217 "nginx: worker process"

Sep 03 14:11:18 ip-xx-xx-xx-xx.ap-northeast-1.compute.internal systemd[1]: Starting nginx.service - The nginx HTTP and reverse proxy server...
Sep 03 14:11:18 ip-xx-xx-xx-xx.ap-northeast-1.compute.internal nginx[26197]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Sep 03 14:11:18 ip-xx-xx-xx-xx.ap-northeast-1.compute.internal nginx[26197]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Sep 03 14:11:18 ip-xx-xx-xx-xx.ap-northeast-1.compute.internal systemd[1]: Started nginx.service - The nginx HTTP and reverse proxy server.
```
ブラウザから確認するために、SSHの設定を少し修正
```
Host my-nginx
    Hostname xxx.xxx.xxx.xxx
    Port 22
    User ec2-user
    ServerAliveInterval 180
    ServerAliveCountMax 120
    IdentityFile ~/.ssh/xxxxxx.pem
    LocalForward 10000 localhost:80
```
ポート転送でlocalhost:10000ポートにアクセスした場合に、SSHアクセス先のlocalhost:80に転送するように設定

ブラウザのアドレスバーに「localhost:10000」を入力してエンターキーを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598309/5c65fd49-a327-0f0d-8867-c82647419aae.png)

以上。
【Photoshop】新AI画像生成機能「ジェネレーティブ塗りつぶし」でオブジェクトの生成してみた！

## 新AI画像生成機能「ジェネレーティブ塗りつぶし」でオブジェクトの生成について
今回は新AI画像生成機能「ジェネレーティブ塗りつぶし」で**オブジェクトの生成**をしてみたのでその手順について説明してきます。
![スクリーンショット 2023-09-03 23.15.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/5fd1e796-362d-a8ee-c317-3c418afd34af.png)



# 目次
* [Photoshopの新AI画像生成機能「ジェネレーティブ塗りつぶし」](#photoshopの新ai画像生成機能ジェネレーティブ塗りつぶし)
* [オブジェクトの生成方法](#オブジェクトの生成方法)
    * [生成画像をはめ込みたい範囲を選択する](#生成画像をはめ込みたい範囲を選択する)
    * [コンテキストタスクバーから「生成塗りつぶし」を選択](#コンテキストタスクバーから生成塗りつぶしを選択)
    * [生成したい内容をテキストプロンプトとして入力](#生成したい内容をテキストプロンプトとして入力)
    * [ジェネレーティブレイヤーとして画像が生成される](#ジェネレーティブレイヤーとして画像が生成される)
*  [最後に](#最後に)

## Photoshopの新AI画像生成機能「ジェネレーティブ塗りつぶし」

PhotoshopのBeta版に新AI画像生成機能「ジェネレーティブ塗りつぶし」が標準搭載されました。


**※新AI画像生成機能「ジェネレーティブ塗りつぶし」は現在(2023/9/3)の時点ではBeta版のみ使用可能なので、Beta版をダウンロードしていない方はダウンロードから初めてください。**

## オブジェクトの生成方法
オブジェクトの生成方法について画像付きで説明してきます。


### 生成画像をはめ込みたい範囲を選択する
![スクリーンショット 2023-09-03 22.30.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/4cd926ee-a073-f622-82dd-0353eca993ec.png)
オブジェクトを生成したい範囲を選択してください。

### コンテキストタスクバーから「生成塗りつぶし」を選択

![スクリーンショット 2023-09-03 22.37.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/4327e3f5-ce9e-c327-6566-a96de372deb9.png)
生成塗りつぶしボタンを押すことでテキストプロンプトが表示されます。
※「生成塗りつぶし」→「ジェネレーティブ塗りつぶし」の場合もあります。それぞれ妥当のものを選択してください。

### 生成したい内容をテキストプロンプトとして入力
![スクリーンショット 2023-09-03 22.38.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/1673df04-d0a1-13a4-1fde-f4f4ceda5af4.png)
生成したい内容を入力してください。
単語だけ入力してもいいですし、よりイメージに近い画像を生成したい場合は「主語」と「述語」を含む3~8の単語で指示すると良いでしょう。
空白で「生成」ボタンを押しても自然な塗りつぶしが可能です。
![スクリーンショット 2023-09-03 22.40.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/8905cfa4-e8f5-f306-5b37-27e7a046f1dc.png)
今回は鳥と入れてみました。
英語でも日本語でも対応可能です！

### ジェネレーティブレイヤーとして画像が生成される!
![スクリーンショット 2023-09-03 22.50.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/dcae72b9-0199-843c-f8d1-b8f8a40a9d73.png)
生成ボタンをクリックすると入力したテキストプロンプトに応じて画像が生成されます。
![スクリーンショット 2023-09-03 22.51.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524155/12eac70d-52f2-bc48-cada-ee1cdaca147a.png)
左右の矢印ボタンを押すことで生成されたオブジェクトパターンを切り替えることができます。
## 最後に
以上となります！
簡単に入れたいオブジェクトの単語を入れるだけで、自然なオブジェクト生成することが可能です！
画像で物足りない時や、希望するイメージに近づけられる画像が作成可能なので上手く活用していきたいですね！
【Xcode】タブを移動するショートカットを覚える

# はじめに
本日、iOSDC3日目終了しました！
スポンサーブースでメルカリさんがXcodeのショートカットクイズを出していて、全然できなかったので記録しておきます。

# やりかた
### 右
command + shift + ]

### 左
command + shift + [

# おわり
iOSDCめっちゃ楽しかったです！