OmniAICreator/Qiita-1.07M huggingface dataset:
IBM i アーキテクチャー：SLSによるデータベース表スペースの管理？（そんなものはない）

## IBM i のシングルレベルストレージのデータベース表領域管理はどうなっている？

### 結論：IBM i ではデータベースの表領域管理は行わない

正確には表領域という概念そのものが不要なので表領域が無い、よって管理は不要となります。以前の記事で解説したようにIBM i ではすべてのジョブ、OSやアプリケーションプログラム、データベースで全てのストレージ領域をただ一つのアドレッシングで管理しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/a1a76ecf-5b18-feab-1982-5d5b0135a947.png)

一般のRDBMS（Oracle, SQL Server, Postgres, etc.)は下位レイヤーのOSからストレージ領域を切り出してもらい、それを独自管理する（これが表領域）二階建て構造になりますが、IBM i と Db2 for iは共通のシングルレベルストレージのアドレッシングしかアドレスを持ちません。さらに言えばDb2 for i はミドルウェアレイヤーではなくOS、マイクロコードレベルで実装されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b40e69fd-c204-d129-a05b-cbc00fc49334.png)

## IBM i のストレージ管理コマンド WRKSYSSTS

WRKSYSSTSコマンドを実行して、右上の方にストレージ管理に関する値が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/717bcee5-2fa1-823e-8b3e-b005e845ee68.png)

ここで
 システムASP 
 システムASP使用% 
はOS, データベースを含むすべてのストレージのサイズと使用率です。表領域とOSの両方でストレージの空き容量や、物理的なストレージ配置設計などに悩む必要はありません。

※ちなみに上の画像ではシステムASPのサイズ 1896GB と合計 2270GBでミスマッチです。これはシステムASP = ASP1 以外にユーザーASPか独立ASP(IASP)がこのOSにぶら下がっていることを示しています。

## データベーステーブルの領域は実際どうなっている？

概念的には下図のように初期値と最大拡張可能なサイズが指定されています。（*NOMAXという制限無しも設定できる）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/e4792bc0-2fcd-a167-5ae3-931190d2cf7e.png)


具体例を示すと、CRTPF時（またはCREATE TABLE時）、テーブルごとにSIZEパラメーターで初期レコード数と拡張可能な上限（レコード数と増分回数）が指定されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/7557e00a-3639-9159-35a5-d229f253745a.png)

### 上記例のテーブル・アロケーションの解説

初期レコード数　テーブルごとの何レコードまで拡張可能かの初期値　この例では10,000
増分レコード数　上記10,000レコードに達した際、次の最大増分値の回数まで（例では3回まで）このレコード数（1,000レコード）までレコードをユーザー操作なしに拡張してくれます。

この例だと10,000レコード+ 1000レコード x 3 = 13,000 レコードまで自動的にストレージの領域を拡張してくれます。

一点、注意点は、いきなり10,000レコード分アロケートして未使用で10,000レコード分確保するのでなく、実際にストレージに書き出したレコード数分だけがデータベーステーブルのサイズになります。（ALOCATE *NOパラメーター指定）

### 13,001件目が追加されたらどうなる？

上記の設定で13,0001件目のレコードをかき出そうとすると*QSYSOPRシステム操作員や実行ユーザーにメッセージが通知され、上限に達したけどどうする？という問いが行われます。

さらに1,000レコード分拡張させる、処理をキャンセルする、無制限にレコードを追加OKにするなどを応答できます。

上記の例で13,001レコード目をユーザーのプログラムが追加しようとすると下記のようなメッセージが出力されます。
![ibmonko4_pic4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/c7143f78-b3bc-3764-6c23-a8414164bc6d.png)

この例ではユーザーの5250端末から最大レコード数を拡張するか否かの応答を返します。（システム応答リストSYSRPYLに登録してユーザー操作を介在させず自動処理させる等も可能です）

テーブルレコード数の拡張時の動作やシステム応答リストSYSRPYLの設定などは別記事に説明してあります。よろしければご覧ください。

■参考：--[IBM i 【温故知新】第4回「システム応答リストによるメッセージ監視とハンドリング」](https://www.i-cafe.info/column/serials/ibmionko_4) iWorld
Kotlinコンパイルで出たe: Could not load module <Error module>をKotlinコンパイラをデバッグして解決するメモ

# 原因
基本的には存在しないクラスを参照していたりして起きています。
なので、Android Studioでそのクラスを開ければ赤くエラーが出ているので解決します。

何もソースコードの位置が出ないので、だいぶ解決が難しいです。
多すぎたりしてクラスを特定するのが難しい場合もあります。

# デバッグ方法

## 事前準備

Kotlinが別のプロセスで動いているとGradleの仕組みでデバッグできないのでプロセス内で動かす必要があります。

> -Dkotlin.compiler.execution.strategy="in-process"

でin processでビルドできるはずなんですが、できない(デーモンでの起動になってしまう)ので、以下をgradle.propertiesに書きます。

> kotlin.compiler.execution.strategy=in-process


## デバッグ待ち状態にする

以下は:app:kaptGenerateStubsDebugKotlinでエラーが出ている場合です。:app:compileKotlinとかの場合もあります。

>./gradlew  --no-daemon :app:kaptGenerateStubsDebugKotlin --no-daemon -Dorg.gradle.debug=true -Dkotlin.compiler.execution.strategy="in-process" -Dkotlin.daemon.jvm.options="-Xdebug,-Xrunjdwp:transport=dt_socket\,address=5005\,server=y\,suspend=n"

こんな感じのタスクを動かして、Gradleをデバッガー接続待ち状態にします。

## デバッガー付きでタスクを動かす

Remote JVM DebugのconfigurationをAndroid Studioから作って起動するとコンパイラにデバッガーを貼ったときに、ちゃんとと止まるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/f4a1e559-cf28-0291-4cdd-eab38c9f2158.png)

## コンパイラのクラスがIDE上から見れない場合

"Use module classpass"に指定しているモジュールのbuild.gradleでdependenciesにcompileOnlyなどでデバッグ上で必要になる依存を追加してあげましょう。これでSyncしてあげればそのコードが見れます。バージョンがズレていると、コードの位置が違うため、うまくデバッグできないと思います。
自分がやったときにはK2JVMCompilerなどがKotlinのコンパイラでした。

```kotlin
  compileOnly("org.jetbrains.kotlin:kotlin-compiler-embeddable:...")
  compileOnly("org.jetbrains.kotlin:kotlin-reflect:...")
```

# 解決

後はエラーメッセージを生成しているクラスのコンストラクタを呼び出している部分を探して、デバッガーをつけたりして、原因の特定を頑張るだけです。

私の場合は`SymbolTableSlice`というクラスのreferenced()関数で新しいSymbolが追加されるタイミングで、`new.descriptor is ErrorFunctionDescriptor || new.descriptor is ErrorModuleDescriptor` というConditionを設定したデバッガーを書くことで参照元のクラスを発見することができ、解決しました。 (ここまでたどり着くのが長かった)
【AWS】GuardDuty通知をUser Notificationsで実装したかったけれど

# はじめに
2023年5月にUser Notificationsの一般提供が開始されました。

https://aws.amazon.com/jp/about-aws/whats-new/2023/05/aws-user-notifications-available/

今回はGuardDutyのイベント通知をこのUser Notificationsで実装したかったけれどある理由から断念した話について書きたいと思います。

# GuardDutyのイベント通知
GuardDutyのイベントを下記の構成でSlackに通知しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/36a81f03-ad74-0d20-6327-342fd5ed58b9.png)

構成のポイントは下記のとおりです。

:::note info
- GuardDutyメンバーアカウントの検出結果が集約されるGuardDuty委任管理アカウントに通知を実装
- EventBridge+SNS+ChatbotでSlackに通知
- リージョンごとに実装
:::

Slackのメッセージ表記はこちらのようになり、見やすくて素敵です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/7fdf53b8-2722-e311-3fbf-56e7b0f41784.png)

# User Notificationsで構成がシンプルになる？
User NotificationsでGuardDutyの通知を行う場合、下記のような構成になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/7572652f-9b6a-45f7-699b-6425103e0d50.png)

構成のポイントは下記のとおりです。

:::note info
- EventBridgeルールを自作しなくて良い
- SNSトピックが不要
- 一か所で複数リージョンの設定ができる
:::

EventBridge+SNS+Chatbotに比べて**構成がシンプル**になりそうです。

# GuardDutyの通知をUser Notificationsに変えてみた
構成を変えて通知を確認してみました。
Slackメッセージの表記は少し変わりますが、まあ悪くなさそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333262/fe70e504-7bb6-57e9-a24a-acdaafeb84f2.png)

ただ1点気になったポイントがありました。
これまで図中のアカウント番号には「**脅威が検出されたアカウントの番号**」が表示されていました。
でもなぜかアカウント番号がいつも「**GuardDuty委任管理アカウント**」になっているような気が・・・
脅威が検出されたアカウントを知るためにAWSへログインしなければならないのは運用する上で少し手間であるように感じます。

# 調査結果
AWSサポートにも問い合わせてみましたが、想定していたとおり下記の仕様とのことでした。

:::note warn
User Notificationsによる通知メッセージでは、Slackメッセージのタイトル部分のアカウント番号が、脅威が検出されたアカウントではなく、GuardDuty委任管理アカウントになる
:::

また、現在はこのメッセージをカスタマイズすることもできません。
> 通知をカスタマイズできますか? つまり、通知のタイトルまたは本文を変更できますか?
> 現在、このサービスはカスタマイズ機能をサポートしていません。

https://aws.amazon.com/jp/notifications/faqs/

# 今後に期待
User Notificationsを利用することで通知構成がシンプルになることは間違いなさそうなため、AWSサポートに機能リクエストを行いました。
今後のアップデートに期待したいと思います。
Stack-chan_Takao_Baseが生まれた経緯

みんな大好きｽﾀｯｸﾁｬﾝですが、いざ「ほしい」とおもっても、意外とお迎えするまでにはハードルがあります。いくつかあるｽﾀｯｸﾁｬﾝのハードウエア的な実装（？）の中で、[タカオ](https://twitter.com/mongonta555)さんの「タカオ版」（当初はGoBottom版という名称）は、M5Stack本体のGroveコネクタにサーボを2個つなぐ（そのためのブレッドボードにコンデンサをつけたボード）だけ、という比較的シンプルな方法だと思います。

そんな中で、[さすぴCEO](https://twitter.com/SuspiciousCEO)さんがこんなことを書かれていました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">こいつ使えば、M5stackとサーボ とGroveで完結するので、側面のUSBケーブル不要になる、、かな？<a href="https://t.co/ijGvYnl5WO">https://t.co/ijGvYnl5WO</a></p>&mdash; さすぴCEO (@SuspiciousCEO) <a href="https://twitter.com/SuspiciousCEO/status/1638164912949325824?ref_src=twsrc%5Etfw">March 21, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ここであげられているTypeC2Groveは、私が去年深セン滞在中にM5Stackでインターン（？）したときに企画・設計したものでしたが、これに関連して、タカオさんとTwitter上でのやりとりされているのをみていました。

最初は、何に困っているのかわからなかったのですが、話をきいていくと、「USB給電コネクタもついていて、サーボをつないでGroveでM5Stackだけで完結する、筐体に入るボード」がほしいよね、という話でした。

なるほど、たしかに。このような視点は、自分ではんだ付けができちゃう人にとっては、「そんなの作れるやん」と思ってしまうのですが、そうでない人にとっては、それがとてつもなく高いハードルに見えてしまう、というやつです。

（余談ですが、Arduinoがここまで普及したのも似た要因だと考えています。Arduinoが、それまで無数にあったマイコンボードと異なるのは、(1)USB接続だけで給電・通信できる、(2)DTRリセット（PC側からリセットをかけられる）、(3)ついているのがメスソケット、(4)ダウンロードするだけのArduinoIDE、の4つだと思うのですが、「マイコンつよつよ」な人は、多少面倒でも、自分でぜんぶできちゃうので、これらの「ありがたみ」がわからないんですよね。そのありがたみ（できないつらさ）を理解した上で、これらのハードルを極力なくす工夫が、Arduinoがここまで普及した要因だと思います。同じように「誰でもできる」「超簡単」も、避けるべき言葉だと思います。その人にとっては超簡単でも、それほど詳しくない人にとっては無限に高い壁で、「私はそんな簡単なこともできないのか・・・orz」と再起不能になります。）

そこで、仕様の詳細を3人でつめつつ、基板設計してきました。主な仕様は以下です。
- 給電用USBコネクタは背中の中央に
- 電源スイッチをつける
- サイズは筐体にぴったりはまるように

そこで完成したのが、Stack-chan_Takao_Base、です。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">たぶん現時点で一番シンプルに作れると思う <a href="https://twitter.com/mongonta555?ref_src=twsrc%5Etfw">@mongonta555</a> さんのGoBottom版 <a href="https://twitter.com/hashtag/%EF%BD%BD%EF%BE%80%EF%BD%AF%EF%BD%B8%EF%BE%81%EF%BD%AC%EF%BE%9D?src=hash&amp;ref_src=twsrc%5Etfw">#ｽﾀｯｸﾁｬﾝ</a> 、USB給電コネクタ＋サーボ配線の基板をつくってみた。動作はOKそう。USBコネクタの位置は下側にもできて、それだと顔が上を向く可動域を最大まで確保できる。<a href="https://twitter.com/SuspiciousCEO?ref_src=twsrc%5Etfw">@SuspiciousCEO</a> さんのアイディアからでした。 <a href="https://t.co/WoitG0F8PQ">pic.twitter.com/WoitG0F8PQ</a></p>&mdash; akita11/JunichiAkita (@akita11) <a href="https://twitter.com/akita11/status/1642449371152408576?ref_src=twsrc%5Etfw">April 2, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

現在はスイッチサイエンスで[完成品](https://www.switch-science.com/products/8905)と[部品セット](https://www.switch-science.com/products/8906)を委託販売しています。部品セット版の方は、挿入実装の部品だけなので、はんだ付けの練習にもちょうどいいです。

おかげさまで、一時期は文字通り「在庫が溶ける」ように買っていただいて、その分、いろいろな方がｽﾀｯｸﾁｬﾝをお迎えできる助けになったのかな、と思っています。

これの派生品として、シリアルサーボSCS0009を使うｽﾀｯｸﾁｬﾝ用の同サイズのボードも、[完成品](https://www.switch-science.com/products/9288)と[部品セット](https://www.switch-science.com/products/9289)を委託販売中です。
どこでもターミナル(iTerm2)

この記事はHRBrain Advent Calendar 2023 シリーズ1の19日目の記事です。

https://qiita.com/advent-calendar/2023/hrbrain

## はじめに

株式会社HRBrainでエンジニアをやっている深谷です。
通常の設定ではHotKeyを設定してもフルスクリーンにしているデスクトップ上ではiTerm2は吹っ飛んでいきます。
なのでこの記事ではiTerm2をどのデスクトップ上でも出せるようにする設定について書いていこうと思います。

## 設定方法

iTerm2の設定画面(`iTerm2上のタブのPreferences...`)で設定していきます。
![スクリーンショット 2023-12-13 11.51.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961862/ad67bd7b-e5b8-0ee1-9f46-08dc70b0e4b6.png)


1: PreferencesのGeneralの設定
`Native full screen windows`を外します。
![スクリーンショット 2023-12-13 13.03.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961862/9045e018-5be6-5793-3040-81363b7e7aba.png)
この変更でデスクトップを変更しないでターミナルを出現させることが可能になります。

2: PreferencesのKeysの設定
ここではHotKeyの設定を行います。
今回私は`⌘　+ space`にしていますが好きな入力で設定してください。
HotKeyを設定することでそのコマンドを打つとターミナルが出たり消えたりするようになります。
![スクリーンショット 2023-12-13 13.08.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961862/0b8e17b5-81ef-4bd9-5ee3-7b009815c73f.png)

3: PreferencesのProfilesの設定
ここではターミナル自体の設定を行います。
もとからあるDefaultを使ってもいいですが気に食わない方はHotKey用の設定を作ってください。
(ちなみに今回私はDefault自体を消し去りました)
![スクリーンショット 2023-12-13 13.13.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961862/e5624ef7-0d32-f97c-6519-84aea351e7c2.png)
Styleを`Full-Width Top of Screen`
Screenを`Screen with Cursor`
Spaceを`All Spaces`
にします。
Styleに関しては今回上部半分だけ出したかったので`Full-Width Top of Screen`にしていますがお好きなものを選んでください。
Screenは`Screen with Cursor`にしておくとカーソルがあるデスクトップ上でターミナルが出るようになります。
Speceは`All Spaces`または`Current Space`ならば問題ありません。

4: PreferencesのAdvancedの設定
![スクリーンショット 2023-12-13 13.24.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961862/08ad4b7c-9942-a7c4-86d6-ec065dd2fbd5.png)

PreferencesのAdvancedで`hotkey`と検索すると画像のようなものが出てくると思うので両方を`Yes`にしてください。

5: 再起動
iTermを再起動してください。
再起動すると設定が反映されます。

## まとめ
これで「どこでもターミナル」の完成です。
どのデスクトップ上にいてもターミナルを開くことができるので開発に大いに役に立つかと思います。

そして設定が面倒臭いというあなたのために設定ファイルをおいておきましたのでお好きにお使いください。
740行のworking Directoryを自分のものに変更していただければ使えると思います。

https://github.com/taijuf212/iterm_preferences

ということで、弊社に興味を持った方がいればぜひ下記ページからご応募ください！

https://www.hrbrain.co.jp/recruit
微小流量計の計測値がすごかった件について

今年はキヌアの栽培等で電子工作用モーターの出番が結構ありましたね。
モーターで液体が流れると流量を図りたくなるのは当然ですね。

モータの選択

# 1.秋月で購入できるモーター

https://akizukidenshi.com/catalog/g/gP-17533/

https://akizukidenshi.com/catalog/g/gP-17534/


今回は3v仕様のポンプ　ＰＰ３１０－０３０をArduino Uno+モータードライバの構成で使用したのですが、
私の欲しい流量では（これはモーターと私の使用環境が合わなかった感じですね）、希望流量にするとうまく動いたり、動かなかったりしまして、ちょっと使えなかったですね。

# 2.総統から頂戴したモーター
このモーター２４ｖ仕様
このモーター電圧である程度制御できて良い感じです。

![IMG_6350.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31412/fd01ec26-0408-b399-b8d2-3026d09c6ec0.png)


# 3.流量の計測はどうする？
流量の計測には、アスクルさんなどで購入できる


https://www.askul.co.jp/p/U875186/

<font color="Red">
実際に使用している型番とは違います。
流量によって形式が変わるので注意が必要です。
</font>

https://www.askul.co.jp/p/U876448/

を用いて流量を計測します。


# 4.計測結果

![370148171_251547247608683_4907969615139706226_n.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31412/369614e6-0c04-9bd9-f0f7-465587c3947e.png)

やっぱ、モーター－の脈流がすごい＆**こんなに細い流量を図れるのが凄すぎ。**
ってことで

やましょうでした。
【Flutter】スワイプでリストから項目を消す

`Dismissible` ウィジェットを使用するとスワイプで削除できる。
# Dismissible ウィジェット とは
指定方向にスワイプすると子要素が消えるウィジェット。

# サンプルソース
``` dart
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TodoList(),
    );
  }
}

class TodoList extends StatefulWidget {
  @override
  _TodoListState createState() => _TodoListState();
}

class _TodoListState extends State<TodoList> {
  List<String> todoItems = ["Task 1", "Task 2", "Task 3"];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Todo List"),
      ),
      body: ListView.builder(
        itemCount: todoItems.length,
        itemBuilder: (context, index) {
          final todoItem = todoItems[index];
          return Dismissible( // ここでDismissibleウィジェットを使用
            key: Key(todoItem),
            background: Container( // スワイプしたときに後ろに見える背景
              color: Colors.red,
              alignment: Alignment.centerRight, // text-align: right; と一緒
              padding: EdgeInsets.symmetric(horizontal: 20.0),
              child: Icon(
                Icons.delete,
                color: Colors.white,
              ),
            ),
            onDismissed: (direction) { // 削除されるときに実行される
              // アイテムを削除
              setState(() {
                todoItems.removeAt(index);
              });
              // スナックバーを表示
              ScaffoldMessenger.of(context).showSnackBar(
                SnackBar(
                  content: Text('$todoItem を削除しました'),
                ),
              );
            },
            child: ListTile(
              title: Text(todoItem),
            ),
          );
        },
      ),
    );
  }
}
```
# 感想
もっと複雑な構造かと思った。
# 参考

https://api.flutter.dev/flutter/widgets/Dismissible-class.html
VirtualBoxとVagrantで簡単に仮想マシンの作成方法

## 前提

CPUの仮想化を有効にすること。

## 手順

- **VirtualBoxをインストールする**

[Oracle VM VirtualBox - ダウンロード| Oracle Technology Network | オラクル | Oracle 日本](https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html)

上のリンクからVirtualBoxをダウンロードして、インストールをします。　

![スクリーンショット 2023-12-10 184642.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641632/09ebd6d8-6798-d944-86da-20ee5658ebe2.png)


　この画面がVirtualBoxになりますが、このままだと環境設定から使える仮想マシンになるまでは一連の複雑な作業が必要となります。それらの手順を省くためにVagrantを利用します。

- Vagrantをインストールする。

[Install | Vagrant | HashiCorp Developer](https://developer.hashicorp.com/vagrant/install?product_intent=vagrant)

以上のリンクからVagrantをインストールをします。(インストールが出来上がると一度再起動する必要があります。)

- ****Vagrant Boxesを選び作成します。****

[Discover Vagrant Boxes - Vagrant Cloud (vagrantup.com)](https://app.vagrantup.com/boxes/search)

以上のサイトから必要がとする仮想マシン環境のVagrant Boxesを選びます。

![スクリーンショット 2023-12-10 190909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641632/bbfdbcdf-ce9f-3a61-b065-f0dd1287097b.png)

今回はこだわりなく「ubuntu/trusty64」を作成します。

Windowsのcmdを開いて以下の命令を入力します。

```bash
Vagrant init ubuntu/trusty64
```

他のVagrant Boxesをダウンロードしたいのであれば「ubuntu/trusty64」を他のVagrant Boxesの名前に変更します。

![スクリーンショット 2023-12-10 191652.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641632/63f2645d-11c0-ffec-21a1-919321be0197.png)


このメッセージは作成に成功したという意味です。

![スクリーンショット 2023-12-10 192246.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641632/6461c143-2f50-5fa5-6280-13c72bac7057.png)


ユーザーファイルの中にもVagrantfileが生成されるはずです。

- **仮想マシンを起動します。**

VirtualBoxが起動している状態で以下の命令をcmdに入力すると仮想マシンが起動することになります。（パソコンにより、時間がかかります）

```bash
Vagrant up
```

以下のメッセージが成功ですね。

![スクリーンショット 2023-12-10 193303.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641632/03b55d84-cbcd-193f-ecbf-5f8ddf62dc33.png)


VirtualBoxの中にも仮想マシンの状態が登録されます。

![スクリーンショット 2023-12-10 193441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641632/14e54692-995f-bd78-65c8-2ab43d2a6bae.png)


- 仮想マシンに接続します。

仮想マシンに接続する命令は以下となります。

```bash
vagrant ssh
```

![スクリーンショット 2023-12-10 193837.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641632/10f0c3e7-c1b0-c0c2-8a8e-d168fe7eadce.png)


問題なく仮想マシンの中に入れました。

![スクリーンショット 2023-12-10 194933.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641632/9af7db6f-0420-feda-b132-834f8e33ad68.png)

上に示した通りに普通に動けます。

ちなみに、rootのユーザー名とパスワード全部vagrantです。

- **仮想マシンから出る**

仮想マシンから出るには以下のコマンド二回打つと出られます。

```bash
exit
```

- **仮想マシンを終了する**

仮想マシンを終了するには

VirtualBoxを開いて、終了したい仮想マシンを右クリックして、StopメニューのACPIシャットダウン押下すれば正常に終了出来ます。

![スクリーンショット 2023-12-10 200014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641632/3014b5e2-99a3-cacb-8cf6-a8dc47adff71.png)


## 終わりに

　以上で仮想マシンの設置が完了になります。新人としてはこういうことをするとパソコンが壊れるのではないかと心配して、いろいろやりたいことが、やれなかったりすることがありますが、この壊れてもよく、好き放題できる仮想マシンの中でいろんな試しをやっていきましょう。
Cursorさわってみた

この投稿は、2023年JINSのアドベントカレンダー16日目の記事です。

# 自己紹介

ITデジタル部のこーせー(@kose_k)です。10月からJINSにジョインしました。
モバイルやWeb開発がメインですが、今はクラウド開発もやっています。

最近さわってみたCursorについて書こうと思います。

# Cursorとは

話題のAIを搭載したエディタ

自動でコードを生成してくれたり、chatでAIに質問できたり、デバッグもしてくれるすごいエディタ
ということで、つかってみました。

## インストール

- 公式サイト[Cursor](https://cursor.sh/)からインストール

- インストール後の初期設定画面
    <img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625839/7c0275a4-297d-eba0-a237-56fbb3945f2d.png">

    `+ Install "cursor"`を選択すると、`cursor .`で起動できるようになる

    ※`+ Install "code" command`を選択すると、VSCodeではなくCursorを起動するようになるので注意

- `use Extensions`を選択すると、VSCodeの拡張機能をインポートしてくれる

    <img width=60% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625839/bf954f7a-728a-18d8-ff0b-e2386e8164dc.png">
    
- `Log In`か`Sign Up`を押下すると、Cursorのサイトに遷移します。
  アカウントがなければこのタイミングで作成します。

- `Log In`すると、チュートリアルが開く（無事インストール成功🎉）

    <img width=70% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625839/a35d6e5e-6baf-9f5d-e349-6f968b6294f1.png">

## つかってみる

- プロジェクト作成

`File`->`New AI Project...`を選択

すると要件を入力するウインドウが表示されるので

<img width=40% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625839/25952b0e-5f9e-15cd-b554-6f616ede9654.png">

`Flutterで新規プロジェクトを作成する`

とだけ入力してみる

なにやら10秒ほど考えた後...

いきなり１文字１文字コードが生成され始めました！！

<img width=60% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625839/372631de-227e-6e4a-fe42-2152d614aa4c.png">

数分かかりますが、自動生成されていくコードをぼ〜と眺めてるとあっという間です

早速アプリを起動してみる

動かない...

まぁ適当な要件しか書いていないので仕方ない...

動くプロジェクトを作成できたら改めて紹介したいと思います

- コード補完

`command + k`で簡単なコード補完もやってくれます

例えば、上記で生成したFlutterアプリを実行すると下記のようなエラーメッセージが出ました

```txt
Resolving dependencies... 
The lower bound of "sdk: '>=2.7.0 <3.0.0'" must be 2.12.0'
or higher to enable null safety.

The current Dart SDK (3.1.3) only supports null safety.

For details, see https://dart.dev/null-safety
```

せっかくなので修正していきましょう！

<img width=40% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625839/3d9531fc-23b4-e23d-f00c-d71619e9a1e1.png">

`command + k`で修正したい内容を入力

<img width=40% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625839/a55574f2-87d8-aab8-7af2-c81c8a0db16a.png">

すると、修正案を提案してくれます

`Accept`して、古いコードを削除し、提案されたコードで改めて実行します

このエラーが解消されましたが、別のエラーが発生したので今日はここまで...

単純な例でしたが、他にも簡単な関数くらいなら全然生成してくれますので色々試してみましょう↓

<img width=70% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625839/3656ad19-5219-e398-a418-eddee1ee61e0.png">

## 感想

ふつーに面白い！
まだ不安定な部分はあるものの今後にとても期待できました！
これからはこんな開発がスタンダードになっていくんでしょうね。
それに合わせて、要件を正しくインプットできること、生成されたコードの正しさを判断できることも必要になりそうです。
（いつかはそんなことも必要ないくらい完全自動生成してくれるようになるんでしょうけど）
もっと使い倒してみようと思います！

明日は王さんです。お楽しみ〜！
クライアントツールを使ってFTP接続をするとOperation timed outになる理由がアプデが原因だった件

タイトルまんまのお話です。
灯台下暗しのような、そんなことがあるのかという備忘録です。

## 結論
クライアントツールをアップデート（バージョンアップ）したら解決しました。

## 何が起きていたのか
最近普通に使えていたのに、突然Operation timed outが出るように。
接続情報は変更していないし、SFTPは普通に接続できているのにFTP接続しているものだけがタイムアウトになる謎事象が起きていました。


### 起きていた環境
- いつも使っているForkLift3で起きた
- FTP接続（Port21や22など)で起きている模様
- もうひとつ使っていたFileZillaでも起きた

### 試したこと
1. ForkLift3をメインで使っていたので、別のクライアントツールで試す（FileZilla）
1. 接続情報を入れ直してみる
1. PCの再起動
1. ターミナル（ftpコマンド）で動かせるか試してみる
1. VPN接続を切る
1. テザリングで試す
1. 有線で試す

IP制限も特に設けていない環境だったので謎が謎をよんでいました。

ルーターの再起動も試す価値はあるかと思うのですが、そもそものテザリングなどでもダメだったので
今回の要因は別の可能性が高いこと

サーバー側で何か起きているのかと思ったのですが、他の人は普通に接続ができていたので自分の環境に問題があることはわかりました....



### いろんな人に聞いて試したことわかったこと
1. FileZillaでは接続ができないがcyberdacであれば接続ができるパターンがある
1. ツールのアップデート

この2点を確認しました。
そういえば、ツールのアップデートの「**お知らせが出ていたな**」、と。

早速FileZillaをアップデート、接続を試みると........
繋がりました....


### cyberdacもインストールしたよ
cyberdacもインストールしました。
FileZillaでは繋がらない事例もあるみたいなので。
さらに、FileZillaで繋いでいたサーバーをブックマークで持って来れるので良いなぁと思いました。
今後はcyberdac中心にアップ作業しようかと思った次第です。



## 本日の学び
アップデート................大事........


いつも「不具合出そうだから〜〜〜」「~~めんどいから〜〜〜~~」という理由でアップデートするのは結構後回しにしがちですが、今回の教訓を得てアップデートはちゃんとアラートが出たらバージョンあげようと思いました。
手順書にマンガを描く

[インターネット老人会の魔法書 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ancient-internet) の6日目の記事です。

# マンガを描いてとは

社内ネットワークの構成変更することになり、ハブの設置場所やLANケーブルの這わせ方の手順書を作成していました（無線LANがまだない時代の話です）。

手順書ができ部長にレビューしてもらった時に言われた一言。

**「マンガも書いておいて」**

・・・・・・マンガを描く・・・とは？

手順書の中に **「僕は新人エンジニアのtosio！今日も1日頑張るぞ！」** 的なコマから始まる**ネットワーク構築マンガ**を描けということでしょうか。

もちろんそうではなく、要するに **図を入れろ** ということでした。

後に気がついたこととしては"図"と"マンガ"は微妙に意味が違く、技術書に載ってそうな綺麗で正確なものが"図"、吹き出しとかに「ここにこれを挿してね！」的なことが書いてあるような素人でもわかりやすいフランクなものが"マンガ"、という区別がありました。
laravel 例外について

## 概要

例外についてちゃんと理解できていなかったのでまとめる。

## 例外とスコープ

自分は今までDBのトランザクション処理等でTryCatchを多様してきた。
特に考えず、呪文のように下記のような書き方をしていた。

```php
try {
    DB::beginTransaction();

    // DB更新処理

    DB::commit();
} catch (\Throwable $e) {
    DB::rollBack();
    throw $e;
}
```

まずこれがどういうことなのかを簡単にまとめる。
上記の処理はまずtryブロックの中が実行される。tryブロックの中の処理を実行中に何かしらの例外が発生したとする。
投げられた例外はどんな種類だろうと`$e`に入った状態でcatchブロックの中が実行される。
例外が発生したのでDBの更新処理はロールバックして処理の前の状態に戻す。
その後、`throw $e`で意図的に再度受け取った例外を発生させて、`App\Exceptions\Handler`クラスで例外のハンドリングが行われる。

TryCatchはローカルスコープと呼ばれる。ローカルスコープ内で例外を受け取った場合、ローカルスコープ内より外には例外発生がわからない。そのためcatchブロックの中でわざわざもう一度`throw $e`をして「例外を発生させてlaravelの処理を止める」必要がある。
上記の「例外を発生させてlaravelの処理を止める」はグローバルスコープで行われる。これは`App\Exceptions\Handler`で例外がハンドリングされ、結果laravelが例外を出して処理が停止してくれる。

TryCatchが設定されている場合、例外はCatchブロックの中が実行されるだけで`throw $e`が書かれてなかったら処理は止まらないはず。
逆にTryCatchが設定されていない場所で例外が発生すると`App\Exceptions\Handler`で例外がハンドリングされlaravelの処理が止まる。
JSX(TSX)内で条件分岐

# JSX(TSX)内で条件分岐させたい
map関数内で配列内の値によって条件分岐させたい

勉強しながらWebサイトを作成していて条件分岐の方法がよくわからずしばらく迷ったので振り返りも兼ねて書いています

:::note
[はじめてのアドベントカレンダー Advent Calendar 2023](https://qiita.com/advent-calendar/2023/first-time)に参加しています
:::

## やりたかったこと
- リストの項目を連想配列にしてmap関数で繰り返す
- そのとき、特定のアイコンのみ項目名の末尾に表示させたい
- リストの項目は他でも使用しているので変えたくない

### 使用しているもの
- [React](https://ja.react.dev/)
- [Heroicons](https://heroicons.com/)
- TypeScript 5.3.2

## 方法
論理 AND 演算子を使用

A && B

左辺(A)が真値の場合は右辺(B)の**値**を返し、左辺が偽値の場合は左辺の値を返す
ただしReactはfalseを無視して飛ばすので、左辺がfalseの場合は何も返らない

[mdn web docs 論理積(&&)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_AND) より引用
>論理積 (&&) はオペランドを左から右に向けて評価し、遭遇した最初の偽値のオペランドを直ちに返します。すべての値が真値であった場合、最後のオペランドの値が返されます。
>
>ある値が true に変換できる場合、その値は真値 (truthy) と呼ばれます。ある値が false に変換できる場合、その値は偽値 (falsy) と呼ばれます。
>
>false に変換することができる式の例を示します。
>
> - false
> - null
> - NaN
> - 0
> - 空文字列 ("" または '' または ``)
> - undefined

これらはfalseとして扱われるため、左辺(A)がこれらだった場合はこの値が返る
ただし0の場合はReactに無視されないため0が返るので左辺は条件式にすると良い

## 実際にやってみる
まず連想配列で項目の中身を作る
挨拶リストにしてみます
```tsx
const greeting = [
	{
		text: "Hello World",
		icon: GlobeAsiaAustraliaIcon,
	},
	{
		text: "Hello Everyone",
		icon: HandRaisedIcon,
	},
];
```

次にmap関数内に繰り返したい項目を入れる

とりあえずそのままアイコンを表示させてみる
```tsx
export default function App() {
  return (
    <ul>
       {greeting.map((item) => (
        <li key={item.text}>
		{item.text}
		<item.icon />
    	</li>
      ))}
    </ul>
  );
}
```

**結果**
![Hello Worldの後に地球のアイコン、Hello Everyoneの後に手のひらのアイコンが表示されている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641622/fd06206c-8573-4ed7-bc42-c06aa3e185b9.png)
両方にアイコンが表示された
CSS等は何もあてていないのでそのまんまです

このとき、アイコンが手のひら(HandRaisedIcon)の場合のみ表示させたい

```tsx
export default function App() {
  return (
    <ul>
       {greeting.map((item) => (
        <li key={item.text}>
		{item.text}
		{item.icon === HandRaisedIcon && (<item.icon />)}
    	</li>
      ))}
    </ul>
  );
}
```

左辺```item.icon === HandRaisedIcon```がtrueのとき左辺```<item.icon/>```の値を返す

**結果**
![Hello Everyoneの後にのみ手のひらのアイコンが表示されている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641622/3c28a8e6-6f00-f3d2-f274-da94fb803d79.png)

地球のアイコンが消えて手のひらのアイコンのみ表示された

### 三項演算子でもできる
今回はtrueの場合のみ表示させたかったので上記の方法で十分だったけど三項演算子でもできました

```tsx
greeting.map((item) => (
    <li key={item.text}>
        {item.text}
        {item.icon === HandRaisedIcon ? (
            <item.icon />
        ) : null}
    </li>
))
```

## 何に引っかかっていたのか
1. 条件分岐なのだからif文を使えばよいだろうと単純に考えていたが、JSX内にif...else文は直接かけない なんてこった
2. map関数内で分岐させたかったがそもそもの理解が乏しいため1が原因であるとわからなかった

## まとめ
今回こうしてまとめるために振り返ってみると、ReactのドキュメントやMDN Web Docsにちゃんと書いてありますね……
ドキュメントは何度でもしっかり読もう 反省

## 参考
条件付きレンダー
https://ja.react.dev/learn/conditional-rendering
論理積 (&&)
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_AND
if文はJSXの中で書け
https://qiita.com/horiy0125/items/fa07f5baa6028b9746ce
【Flutter】アイコンについて

[cupertino_icons](414fc146ff062a66aab9)については軽く調べたことあり。
他にも気になったので備忘録。
# 組み込みのアイコン
``` dart
Icon(Icons.star);  // Material Designのアイコン
Icon(CupertinoIcons.star);  // Cupertinoのアイコン (iOS用)
```
# アイコンの色を変える
``` dart
Icon(Icons.star, color: Colors.yellow,),
```
# カスタムアイコン
自分で作成したSVGデータもアイコンとして使用できる。

https://www.fluttericon.com/

上記サイトでttfデータに変換し、プロジェクトに設置することでカスタムアイコンの使用が可能。

# 参考

https://qiita.com/tomoyanakano/items/79ac1391d4e3d9c9eec1
flutter初心者が DI 依存性の注入について深掘りしてみる 

## DI 依存性の注入とはそもそもなんのためか
まずは調べてみると下記のような回答が見受けられる。
"依存性の注入（DI: Dependency Injection）は、ソフトウェア設計の原則であり、**コードの柔軟性、再利用性、およびテスト容易性を向上させるため**に広く使用されています。"

この太文字の部分が使う主な理由とのこと。

### イメージしやすいように具体例をあげてみる
例：車とエンジン
想像してみてください。あなたは「Car」というクラスを設計しているとします。この車はエンジン（Engineクラス）を必要とします。
この設計では、Carクラスは直接Engineクラスに依存しています。Engineクラスの実装を変更すると、Carクラスも影響を受ける可能性があります。また、Carクラスをテストする際にEngineクラスを切り離すのが難しくなります。

★依存性の注入なしの場合
```dart:sample.dart
dart
class Engine {
  void start() {
    // エンジンをスタートするロジック
  }
}

class Car {
  Engine engine;

  Car() {
    engine = Engine(); // Carクラスが直接Engineを作成
  }

  void startEngine() {
    engine.start();
  }
}
```

★依存性の注入ありの場合
```dart:sample.dart
class Engine {
  void start() {
    // エンジンをスタートするロジック
  }
}

class Car {
  Engine engine;

  Car(this.engine); // エンジンが外部から注入される

  void startEngine() {
    engine.start();
  }
}
```
※例のようにコンストラクタ引数を通じてEngineオブジェクトをCarオブジェクトに渡すことは、依存性の注入（DI: Dependency Injection）の一例となる。


この例で言うとCar classは外部のEngineを引数として扱うため、テストや機能追加をする際に 
* Carは部品（オブジェクト）のようにEngineを使用しているためエンジンが故障（エラーなど）しても中身を修理したり、新しい部品に変えること(新しいエンジンクラスを作る)で問題なく動く。
* 依存性の注入なしの場合は車から取り外しにくいようにガチガチに固定されているイメージ？なので後で不便ですよ〜という認識だからこそ、シンプルなアプリの場合は気にする必要ないが実務や規模が大きくなると必須になってくる。



一見DIの有無でコードを見比べた際に
```
依存性の注入なし
Car() {
    engine = Engine(); // Carクラスが直接Engineを作成
  }
依存性の注入あり
  Car(this.engine);

//この二つの差はCar class内でインスタンスを作成するかコンストラクタ引数でengineを引っ張ってくるかの違いが
依存性の注入あり・なしの差。
コンストラクタ引数 = 依存性の注入。
```
植物を直接地面に植えるか植木鉢に入れるかの差も例えとして使えるかも、、。
植物が枯れたときに土が原因か、環境か、根っこなのか。
植木鉢だと一つ一つ分かれているので原因特定がしやすいが、
地面に植えられていると見るべきポイントが多くて結構大変というイメージ。
```
この例え話は自分で考えたので多少の違いはあるかもしれないがとてもわかりやすい例だと思った。
```

#### 今回はコンストラクタ引数を通じた依存性の注入についてが話の中心になったが、
概念だったりなんのため？どういうこと？という部分が少しでも晴れたのではないでしょうか？

ちなみによく使われるものとして
・メソッド注入
・プロパティ注入

も依存性の注入の方法としてある。

## それぞれのユースケースとして
### メソッド注入
・後から依存性を設定する必要がある場合:
オブジェクトが初期化された後に、依存関係を設定したり変更したりする必要がある場合に有効です。例えば、設定が動的に変わる場合や、特定の条件下でのみ依存関係が必要な場合などです。

・オプショナルな依存関係:
あるクラスが特定の依存関係を必ずしも必要としないが、提供された場合に追加の機能を提供する場合に適しています。

・循環依存の解消:
二つのクラスが相互に依存している場合、コンストラクタ注入では循環依存が生じることがあります。このような場合、メソッド注入を利用して依存関係を解消することができます。
### プロパティ注入
・設定やオプションの柔軟な変更:
アプリケーションの実行時に依存関係の設定を変更したい場合に適しています。たとえば、DIフレームワークやコンテナがプロパティを自動で注入する環境では、この方法がよく使用されます。

・フレームワークやライブラリの要件:
特定のフレームワークやライブラリでは、プロパティ注入が推奨される場合があります。たとえば、特定のフレームワークがコンストラクタ注入をサポートしていない場合などです。

・テストの簡略化:
ユニットテストの際に、テスト対象のクラスに簡単にモックオブジェクトを注入するために使われることがあります。

### この二つは少し特殊なケースみたいなので一旦は深掘りしないでおきます。
実はオークションは「落札額＝支払額」じゃなくていい、という話

# はじめに
この記事は[Lumos Advent Calendar](https://qiita.com/advent-calendar/2023/lumos)の12日目の記事です！

Day12の記事は[@Shion1305](https://qiita.com/Shion1305) [サークルでTsukuCTF2023に参加してきました💪](https://zenn.dev/lumos/articles/72b1cc980b8207?fbclid=IwAR1ojtNT-1kflWFbVCa5-RVfd0P2KG4CNMUoPwK4efxDfvHSwWp8k_-FyUk) でした！僕も参加してまして、とても楽しい経験でした～

Day14の記事は[@morizoe](https://qiita.com/morizoe)が担当します、お楽しみに。
それでは本題へGO～

## そもそも「オークション」って？
皆さんご存知の「オークション」といえば、とんでもない額で落札される絵画やマグロ、あるいは公共工事などの入札のイメージが強いのではないでしょうか。

今回扱う「オークション」は、みんなで一斉に入札額を提出し、最も入札額の高い人にその権利が与えられるタイプのオークションを考えます。
この「オークション」は、欲しい人に一番高い額で買ってもらうための手段としてよく使われています。1位で落札した人が、その価格で支払って購入するという形式が、恐らく最も自然で、見慣れた「オークション」だと思います。

しかし、実はそれだけが「オークション」なのではありません。「1位の入札額」で支払うという部分を「2位」や「3位」にすることも出来てしまいます。つまり、実際に買う人は自分の入札額よりも低い金額で購入できるという方式も「オークション」として成立するんです。

それだけでなく、この「何位の入札額を用いるか」によってオークションの性質を巧みにコントロールすることが出来てしまうのです。

そんな奥深い「オークション」について今回は書いていきます。

## 仮定や記号について
数式に用いる仮定や記号の説明です
- オークションには $n$ 人が参加しているとします
- $\beta_i^k$：参加者 $i$ が、$k$ 位の入札価格で購入するルールの時、どんな方法で入札額を決定するか、を定めた「戦略」
    - $\beta$ は対称で、微分可能で、単調増加
- $v_i$：参加者 $i$ が、出品されたものに対してどれくらいまで支払えるか、という「評価値」
    - $i$ は自分の評価値しか知らない（私的情報）
- $Y^1$：参加者 $i$ 以外の参加者の評価値のうち、最も高いもの
- $F$：分布関数
- $f$：密度関数

### 注意点
詳細については割愛しています。参考文献内に詳しい条件や証明があるのでそちらをご覧ください。

## 1位の入札額で購入するルールのとき
対称均衡において、入札額の戦略は
```math
\beta_i^1(v_i) = E[Y^1|Y^1<v_i]
```
となります。
この結果を色々と式変形したりして捏ねていくと以下のことが分かってきます。
- 入札額は、評価値よりも低くなる
- 参加人数が増加すると、$\beta_i(v_i) = v_i$に収束し、真実を表明する
- オークションの売り手の収入の期待値は、参加者の評価値のうち2番目に高いものの期待値になる
- 例外：リスクを嫌う買い手であるなら、収入の期待値は上がる Holt (1980)

このオークションでは、入札額は評価値よりも低くなります。そのため、リスクを嫌うような買い手が参加者であるなら、採用したほうが

## 2位の入札額で購入するルールのとき
支配戦略として、入札額の戦略は
```math
\beta_i^2(v_i) = v_i
```
となります。
1位のときと同様に考察してみると、
- 入札額は評価値よりも低くなる
- 参加人数に関係なく、結果は一定
- オークションの売り手の収入の期待値は、参加者の評価値のうち2番目に高いものの期待値になる

このオークションではいかなる時でも各人の真の評価値が表明されます。収入の期待値は1位のときと変わらず、しかも売り手は真の評価値を知ることができるので、安定的かつ有益な情報の多いオークションになります。

## 3位以下の入札額で購入するルールの時
$k$ 位の入札額で購入するとき、均衡において、入札額の戦略は
```math
B_i^k(v_i) = v_i+ \frac{k-2}{n-k+1}\frac{F(v_i)}{f(v_i)}
```
となります。
ここから得られる考察は以下になります。
- 入札額は評価値よりも高くなる
- 参加人数が増加すると、$\beta_i(v_i) = v_i$に収束し、真実を表明する
- オークションの売り手の収入の期待値は、参加者の評価値のうち2番目に高いものの期待値になる

買い手は自分の評価値よりも高い値で入札しなければならないので、少なからず損をするリスクを背負います。そのため、リスクを嫌う買い手ならばこのオークションへの参加を控えるようになります。
反対に、リスクを好む買い手ならばこの形式のオークションは魅力的に映るはずです。インターネットオークションのようなギャンブル的性質のあるオークションである場合はこの形式を採用するほうが良い、ということになります。

## 参考文献
https://papers.ssrn.com/sol3/papers.cfm?abstract_id=253476

https://www.sciencedirect.com/science/article/abs/pii/S0167718721000515
正規表現からテキストデータを生成するウェブサービス作りました


正規表現パターンからテキストを生成するシンプルなアプリ、[Regexg](https://regexg.yuipcoders.com/?trk=qt-aa)をリリースしました。

簡単な紹介をさせて頂きたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640993/1ab8802a-5693-a496-36de-81e7c997113b.png)

（画像： [Regexg - Text Generator for Regular Expression](https://regexg.yuipcoders.com/?trk=qt-ab)）

機械学習のためのデータ生成や、開発におけるフェイクデータの作成、あるいはビジネスやマーケティングのシーンにおけるセールス文章やSNSやツイートの投稿文まで、形式的な型に則ってデータの生成を行いたい場合はたまにあるかと思います。

このアプリでは例えば以下のような正規表現パターンを入力すると

```
Good (morning|afternoon|evening)
```
以下のようにデータを返します。

```
Good morning
Good afternoon
Good evening
```

セールスレターやメールの文章の一部分をバリエーションを付けて取得したい、なんて場合には

```
Hello, welcome( back)? to (our|the) app\. May I help you\?
```

上記のようなパターンから

```
Hello, welcome to our app. May I help you?
Hello, welcome to the app. May I help you?
Hello, welcome back to our app. May I help you?
Hello, welcome back to the app. May I help you?
```

このような文章を生成できるかもしれません。

## 実装

さて、このアプリはとてもシンプルに見えます。実際シンプルなのですが、実は中身はけっこう複雑です。

複雑になってしまった原因としては主には以下の通りであり、

- テキスト生成をサーバーサイドで処理している
- 生成はNode.js/Next.jsではなく同一サーバーのRuby/Sinatraサーバーに対し内部的にAPIリクエストして処理（つまり二段階のAPIリクエストをしている）
- そういう設計になったのは処理を隠す（クライアントサイドのJSでオープンコードにしない）ため
- ユーザー登録、Stripeでの支払い実装と有料ユーザの実装と利用制限まで（ほぼ）実装した

なぜ計画が頓挫した（事実上放棄された）かと言えば、

- 正規表現の生成って意外にCPU使う（多くのユーザがバンバン使うことに耐えられない）
- もっと言えば正規表現を悪用したdos攻撃（ReDoS攻撃）まである。それだけ負荷が大きくなり得る
- 月々お金取るならここらへん自信と責任持たないと面倒事になりそう。
- 少なくとも規約なりに"ゲストユーザ有料ユーザ問わずこういうパターンはだめ（illegal）です（クレームも返金要請もしないでね）"といった旨を書くべき。そこらをちゃんと書けるために周辺知識を深め潜在的リスクを把握しておく必要があるだろうと判断
- そこまでリスク・コスト対リターン見合わなそうなのに市場はニッチすぎる
- ならもう無料だけでいいか

といった経緯となります。

### テックスタック

上記でも触れた通り、このアプリRegexgの下にある技術は多岐に渡ります。
[同じようなアプリを実装してQiitaに挙げられている方を見かけました](https://qiita.com/ozw/items/e4a823b27a7b1d4c9106)が、本来Regexgに似たような物であればこの方のアプリのようにJavaScriptだけで、つまりサーバーレスで作れます。

なので支払いもユーザ実装も省いてしまった（next.jsのrewritesでルートにアクセスできないように現在はしてあります）状態の当該アプリにおいては、このような仕様となっていることは不必要なオーバーヘッドが大きいと自責せざるを得ない状況ではあります。

その上で、一応使用されているテックスタックを手短に羅列します。

- Next.js (Node.js)
    react, typescript, mongodb, passport.js, stripe
- Sinatra (Ruby)
    regexp-examples
- Docker
    docker-compose (limits:cpus, networks), nginx

なお開発に掛けた期間は一週間弱です。Rubyは数年ぶりに書きましたがcopilotがサポートしてくれたので割りと楽しく書けました。

## 反省

やはり市場調査やリスク・コストを考慮に入れたリターンの計算は大事でした。

以上です。ありがとうございます。

（ 出典： [Regexg - Text Generator for Regular Expression](https://regexg.yuipcoders.com/?trk=qt-ac) ）

（参考）

- [正規表現入門決定版 #初心者 - Qiita](https://qiita.com/nuco_bk/items/d48d763b205017f914ae)
- [初心者歓迎！手と目で覚える正規表現入門・その４（最終回）「中級者テクニックをマスターしよう」 #JavaScript - Qiita](https://qiita.com/jnchito/items/b0839f4f4651c29da408)
- [【Python】とっても便利な正規表現！ #Python - Qiita](https://qiita.com/hiroyuki_mrp/items/29e87bf5fe46de62983c)
- [正規表現の基本 #Java - Qiita](https://qiita.com/grrrr/items/7c8811b5cf37d700adc4)
- [【初心者から上級者まで】正規表現を学ぶためのツール・サイトまとめ #初心者 - Qiita](https://qiita.com/teinen_qiita/items/806aba936a8ed1f7654e)
- ["気の利いた"擬似データを生成したい #Python - Qiita](https://qiita.com/gg_hatano/items/cf87fe5e1166a2ba80b2)
CrystalでDeepLを使うコマンドラインツールを書いた

## はじめに

2023年Crystalアドベントカレンダーです。これまでに作ったツールでQiita記事にしていなかった DeepL CLI を紹介します。

https://github.com/kojix2/deepl-cli

## DeepL CLI

[DeepL API](https://www.deepl.com/pro-api/)を使用してテキストを翻訳するためのシンプルなコマンドラインツールです。

## 準備

まず、[DeepLから有効なAPIキーを取得](https://www.deepl.com/pro-api)し、それを環境変数として設定します。(無料版でも十分に使えます）

```bash
export DEEPL_API_KEY=あなたのapiキー
```

## インストール

最新のソースコードをダウンロードし、以下のコマンドを実行します。

```bash
cd deepl-cli
shards build --release
```

有料版の DeepL API Pro を契約している人は下記のように環境変数を指定してエンドポイントを変更してください。（この環境変数はコンパイル時に評価されるので、実行時に指定しても効果がないことにご注意ください。）

```
DEEPL_API_PRO=1 shards build --release # DeepL API Pro用
```

コンパイルされたバイナリファイルが `bin` フォルダに作成されます。

Linuxユーザーで、deepl-cli を使いたいだけの人は、`musl`で静的にコンパイルしたバイナリをGitHub Releaseから入手することもできます（DeepL API Freeのみ）

#### プロキシ設定（オプション）

プロキシ環境下でも動作します。

```
export HTTP_PROXY=http://[IP]:[port]
export HTTPS_PROXY=https://[IP]:[port]
```

## 使用方法

DeepL Translator CLIを使用するには、`deepl` コマンドに続けて渡したい引数を実行します。

```
Usage: deepl [arguments]
    doc                              Upload and translate a document
    -i, --input [TEXT]               Input text
    -f, --from [LANG]                Source language [AUTO]
    -t, --to [LANG]                  Target language [EN]
    -u, --usage                      Check Usage and Limits
    -v, --version                    Show version
    -h, --help                       Show this help
```

例えば、以下のように使用します：

```bash
$ ./bin/deepl deepl -f en -t ja -i "I am a cat"
私は猫である
```

これで、"I am a cat." が日本語に翻訳されます。
コマンドラインツールなので標準入力を取ることもできます。

```bash
echo "I am a cat" | deepl -t ja
# 私は猫である
```

複数行を入力したいときは、この標準入力の機能を使えばOKです。

```
deepl -f ja
吾輩は猫である。
名前はまだない。
```

入力し終わったら `CTRL + D` を入力して`EOF`を送信します。

```
I am a cat.
I don't have a name yet.
```

利用できる言語のリストを表示したいときは、`deepl -f` もしくは `deepl -t` を入力します。

```
deepl -f | head
```

```
- BG     Bulgarian
- CS     Czech
- DA     Danish
- DE     German
- EL     Greek
- EN     English
- ES     Spanish
- ET     Estonian
- FI     Finnish
- FR     French
```

```
deepl -t | tail
```

```
- PT-BR  Portuguese (Brazilian)	true
- PT-PT  Portuguese (European)	true
- RO     Romanian            	false
- RU     Russian             	true
- SK     Slovak              	false
- SL     Slovenian           	false
- SV     Swedish             	false
- TR     Turkish             	false
- UK     Ukrainian           	false
- ZH     Chinese (simplified)	false
```

また、`deepl --usage` で、無料枠をどの程度使ったか確認することもできます。

```
deepl --usage

https://api-free.deepl.com/v2
character_count: 84
character_limit: 500000
```

## おわりに

基本機能のみの簡単ツールですが便利に使うことができるかと思います。

ドキュメントの翻訳や、グロサリーなども実装されていないので機能拡張の余地はあります。PRを送ってくれたり、このツールをフォークして改良して独自のツールとしてメンテナンスしていただくのも大歓迎です。

この記事は以上です。
キーボード作ってますか？

この記事は [スタンバイAdventCalendar2023](https://qiita.com/advent-calendar/2023/stanby) 14日目の記事です。

# 筆を選ぶタイプの弘法になりたい
皆さんに質問があります。

*仕事でパソコンは使っていますか？*

パソコンを仕事で使っていると回答した方にお聞きします。

*キーボードにこだわってますか？*

おそらく皆さんの生活の中で 'キーボード' という言葉は、以下のような文脈で使われることが多いでしょう。
- キーボードを使う
- キーボードで文字を入力する
- キーボードが壊れる

2022年末までは私もそうでした。

しかし、2023年に私は「キーボードを作る」という新しい概念を知ることになりました。

# はじめに
こんにちは。
私は求人検索サービスを展開する株式会社スタンバイでコーポレートIT・セキュリティグループに所属している西本です。

この記事では2023年にアップデートした私のPC周りの環境の変化や感じたメリットなどについて書こうと思います。

# ノートPCは肩が凝る
私がPC周りの環境をどうにかしたいと考えたのは、ひどい肩こりが原因です。

多くの社会人と同様、入社後にノートPCを貸与され、そちらで業務をしていました。
ノートPCの場合、ディスプレイとキーボード、マウス（トラックパッド）は全て固定されており、身体的に窮屈な体勢で長時間の業務を強いられます。これがいわゆる3密です。

その結果肩こりや腰痛など様々な悪影響があったように思います。

また私の場合、体質的に手のひらに汗をかきやすく、熱を持ちやすいMacbookのビルトインキーボードを使用することは不快感が大きかったです。

## 外付けキーボードとトラックボールの導入
そこで、私は外付けキーボードとしてAppleのMagic KeyboardとLogicoolのMX Ergoというトラックボールを導入しました。
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622078/67ffe6a9-807d-79be-1c19-24a93277e672.jpeg)



このアップデートにより、以下の2点の改善に成功し、理想のPC環境が完成したかに見えました。
1. 手汗からの解放
キーボードを外付けにすることで暖かい機械を触り続けなくてよくなりPCをベタベタにする必要がなくなりました。
2. 配置の自由度の向上
キーボードとマウスが別々で配置できるため、マルチディスプレイなどの構成時に自由度が上がりました。

しかしこのアップデートでは改善されていない決定的な問題があることにこの時の私はまだ気づいていませんでした。

## 分割キーボードとの出会い 〜そして自作へ〜
外付けキーボードとトラックボールの導入で問題は解決したかに思われたのですが、1つだけ解決できていない大きな問題がありました。

それは一体型のキーボードはどうしても肩が前に入ってしまい巻き肩の原因になるということです。

この問題に対応するために新たに分割キーボードを導入しました。

![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622078/7c7b7790-7350-55a3-5862-f41b0f38ec63.jpeg)

分割キーボードは中央付近で左右に物理的に分かれています。

まるで遠距離恋愛中のカップルのようです。離れていてもうまく機能し、時には距離が二人の関係をより良くします。

そう、この距離がちょうど良かったんです。

腕をまっすぐに伸ばして、身体的に自然な状態でタイピングを行うことができるため、肩や首への苦労感が低減しました。


分割キーボードは使用してみて、全人類におすすめしたいくらいポジションや肩周りが楽になりますが、流通している種類が少ないため、私はLily58Proという自作キットを購入し、自作する道を選びました。これが、私が本格的に自作キーボードの沼にハマるきっかけとなりました（詳細はまた別の機会に）。

https://shop.yushakobo.jp/products/lily58-pro

そして最終的にはこのような形で落ち着いています。
![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622078/2e7d2fef-7b84-6589-e1b6-9c304767d6b3.jpeg)



# これから
ここまでで、2023年の私のPC環境の移り変わりを紹介しました。

PC周りのガジェットやキーボードに興味を持っていただけたら幸いです。もし興味が湧いたら、ぜひマイキーボードや自作キーボードの世界への一歩を踏み出してください。

"筆を選ぶ弘法"になりたかった私の旅は、弘法になる前に、キーボードの奥深い沼に落ちることで終わりました。肩は楽になりましたが、心はキーキャップに囚われてしまいましたとさ。。。おしまい
特定のEC2インスタンスが含まれているターゲットグループを確認する

# 目的
特定のEC2インスタンスが含まれているALBのターゲットグループ一覧を確認したいが、ターゲットグループの数が多く目視で確認するのが大変。
AWS CLIを使ってEC2インスタンスIDからターゲットグループ名の一覧を取得するスクリプトを作成したので備忘録として残しておく。

# 実行環境
AWS CLI
Windows PowerShell

# スクリプト
```powershell
# 変数をセット
$REGION = "REGION"
$INSTANCE_ID = "INSTANCE_ID"
$FILEPATH = "FILE PATH"

# 全てのターゲットグループを取得
$targetGroups = aws elbv2 describe-target-groups --region $REGION | ConvertFrom-Json

$targetGroupNames = @()

foreach($tg in $targetGroups.TargetGroups){
    # ターゲットグループのヘルスチェック情報から紐づいているEC2インスタンスを取得
    $targetHealthDescs = aws elbv2 describe-target-health --target-group-arn $tg.TargetGroupArn --region $REGION | ConvertFrom-Json

    # 指定したEC2インスタンスIDが含まれているものをフィルタリング
    if ($null -ne ($targetHealthDescs.TargetHealthDescriptions | Where-Object {$_.Target.Id -eq $INSTANCE_ID})){
        $targetGroupNames += $tg.TargetGroupName
    }
}

# 結果をファイルに出力
$targetGroupNames | Out-File -FilePath $FILEPATH
```
※ChatGPTにベースを作成してもらいました。

# 実行方法
スクリプト内のREGION, INSTANCE_ID, FILEPATHに適切な値を入力したうえでスクリプトを実行。
実行結果はFILEPATHに指定したファイルに出力される。
いちいちフォルダーの場所まで移動するのは面倒じゃないですか

# フォルダーまでの移動が段々しんどくなってきた
エクスプローラーを開いてから、ディレクトリを移動する作業って
繰り返してると疲れるじゃないですか。
いい加減手間を省きたいと思うようになってきました。

# クイックアクセスを利用しましょう
使用してるOS：windows10
<br>

*C:\Users\xxxx\AppData\Local\Programs\Python\Python3XX*

<br>
例えばこのような長いパスを毎回移動するのって大変ですよね。

「クイックアクセス」にピン止めしましょうよ。

<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698531/82caf1d5-a565-b6cb-5384-01e3403f4cd1.png)

<br>


エクスプローラーの上部の項目にある「ホーム」を開く
これ押しましょう。
　　　↓
   

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698531/daf178e4-5456-d518-e7a0-2cf4de3e7a5e.png)
<br>

左にフォルダーがピン留めされます。
よく使うフォルダーの場所はこのようにピン留めしておけば
わざわざエクスプローラを開くたびに目的の場所まで移動する手間が
省けますもんね。

便利なツールを使って楽できればいいものだ。
<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698531/a290a13e-809e-3ffb-a45e-dfe7cfb286e9.png)
Windowsのbatで改行をecho

# 概要

例えば下記batについて…

```bat:txt出力する系
echo ほにゃー >> test.txt
echo ほにゃー >> test.txt
```

出力結果のtxtはこうなるのですが…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/bbcb5e82-57b8-106a-3262-046f62c526eb.png)

こんなふうに改行を入れたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d73f038a-4174-9e0a-4ca8-0378bfcd1b05.png)

「人が見て見やすくするために改行を入れたい」といった時にやりたくなります。

# やり方

```echo``` のあとにスペースなどを入れずに ```;``` を付けます。

```bat:
echo;
```

```;``` 以外の ```.``` ```,```  ```:``` でもよいです。

例えば下記batの結果は…

```bat:
echo ほにゃー >> test.txt
echo; >> test.txt
echo. >> test.txt
echo, >> test.txt
echo: >> test.txt
echo ほにゃー >> test.txt
```

こうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8b08cbbc-e65d-9bba-8cfa-ca0ca23e9481.png)

# echoだけだと余計な文字が出てしまう

例えば下記batの結果は…

```bat:
echo ほにゃー >> test.txt
echo >> test.txt
echo ほにゃー >> test.txt
```

こうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/9f5313ab-a14b-8457-0e59-779f7631710d.png)


# 参考サイトさん

https://jj-blues.com/cms/wantto-echonewline/

# バージョン

Microsoft Windows [Version 10.0.19045.3693]
AtCoder用 Cargo.toml 2023

2023年8月のジャッジアップデートでRustの言語バージョンや使用可能crateの変更などがありましたが、
Cargo.tomlに関しては意外と言及が少なさそうなので置いておきます。

## 結論
* AtCoderの[Language Test 202301](https://atcoder.jp/contests/language-test-202301)のページへ
* スプレッドシートから最終版のRustのInstall Commandを探す
* `cat > ./Cargo.toml << EOF`から`EOF`までをコピー


## Cargo.toml
実際にコピーしてきたものがこちらです。

そのまま使うなり`[dependencies]`だけコピーするなりしましょう。
使用しないcrateはコメントアウトしても良いですね。

```toml
[profile.release]
lto = true # コンパイル時間が著しく長くなってしまう場合は無し

[package]
name = "main"
version = "0.0.0"
edition = "2021"
publish = false

[dependencies]
# 202301から:
ac-library-rs = "=0.1.1"
once_cell = "=1.18.0"
static_assertions = "=1.1.0"
varisat = "=0.2.2"
memoise = "=0.3.2"
argio = "=0.2.0"
bitvec = "=1.0.1"
counter = "=0.5.7"
hashbag = "=0.1.11"
pathfinding = "=4.3.0"
recur-fn = "=2.2.0"
indexing = { version = "=0.4.1", features = ["experimental_pointer_ranges"] }
amplify = { version = "=3.14.2", features = ["c_raw", "rand", "stringly_conversions"] }
amplify_derive = "=2.11.3"
amplify_num = { version = "=0.4.1", features = ["std"] }
easy-ext = "=1.0.1"
multimap = "=0.9.0"
btreemultimap = "=0.1.1"
bstr = "=1.6.0"
az = "=1.2.1"
glidesort = "=0.1.2"
tap = "=1.0.1"
omniswap = "=0.1.0"
multiversion = "=0.7.2"
# 202004から続投:
num = "=0.4.1"
num-bigint = "=0.4.3"
num-complex = "=0.4.3"
num-integer = "=0.1.45"
num-iter = "=0.1.43"
num-rational = "=0.4.1"
num-traits = "=0.2.15"
num-derive = "=0.4.0"
ndarray = "=0.15.6"
nalgebra = "=0.32.3"
alga = "=0.9.3"
libm = "=0.2.7"
rand = { version = "=0.8.5", features = ["small_rng", "min_const_gen"] }
getrandom = "=0.2.10"
rand_chacha = "=0.3.1"
rand_core = "=0.6.4"
rand_hc = "=0.3.2"
rand_pcg = "=0.3.1"
rand_distr = "=0.4.3"
petgraph = "=0.6.3"
indexmap = "=2.0.0"
regex = "=1.9.1"
lazy_static = "=1.4.0"
ordered-float = "=3.7.0"
ascii = "=1.1.0"
permutohedron = "=0.2.4"
superslice = "=1.0.0"
itertools = "=0.11.0"
itertools-num = "=0.1.3"
maplit = "=1.0.2"
either = "=1.8.1"
im-rc = "=15.1.0"
fixedbitset = "=0.4.2"
bitset-fixed = "=0.1.0"
proconio = { version = "=0.4.5", features = ["derive"] }
text_io = "=0.1.12"
rustc-hash = "=1.1.0"
smallvec = { version = "=1.11.0", features = ["const_generics", "const_new", "write", "union", "serde", "arbitrary"] }
```

## 関連項目
* [Language Test 202301 - AtCoder](https://atcoder.jp/contests/language-test-202301)
* [Jan 2023 Language Update ライブラリ案 · rust-lang-ja/atcoder-rust-resources Wiki](https://github.com/rust-lang-ja/atcoder-rust-resources/wiki/Jan-2023-Language-Update-%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E6%A1%88)
* `[profile.release]`で設定されているLTOについて
    * [Profiles - The Cargo Book](https://doc.rust-lang.org/cargo/reference/profiles.html#lto)
【ChatGPTやDALL-E3】で、私が使うプロンプトTipsを集めました。

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

　今回は、私がプロンプトを書くときに、よく使うTipsです。まとめてみました。私の記事をごらんの方は、よく見ていると思います。中には、DALL-E3へのプロンプトTipsもあります。

:::note info
本記事は、ChatGPTやDALL-E3を
使用する際のプロンプトTipsを
書き出しています。あしからず。
:::

　プロンプトを入力する際に、
　　私が使っているTipsを
　　　紹介させていただきます。

　まぁ、たいしたものでは
　　ありませんので、
　　　いつものごとくの
　　　　記事だと思ってくださいw
***
　プロンプトの基本としては
　　深津式プロンプトをベースに
　　　自分の言葉を使っています。
　　　　最近は使っていませんけどw
```Text:基本Prompt
#目的

#処理手順

#注意点

#最終確認
あなたが理解できない箇所があるなら ば、指摘してください。
あなたが理解できたなら、「はい」と答 えて、待機してください。
```
***
　【プロンプト内部で使う文言①】
　　下記三つは、内容的には同じです。
　　・事実だけを述べてください。
　　・知らなければ、知らないと答えてください。
　　・わからなければ、わからないと答えてください。
***
　【プロンプト内部で使う文言②】
　　・箇条書き(説明不要) でお願いします。

　上記は、カッコの中を変更可能。
　カッコ内の例（組み合わせもあり）
　　（説明不要）
　　（簡潔な説明）
　　（番号付き）
　　（）なし……説明が付く箇条書き
***
　【プロンプト内部で使う文言③】
　　・何か追加の情報が必要ならば、質問して ください。

　これは、ChatGPTさんに
　　必要な質問をして
　　　もらう際の文言。

　これがないと、
　　ChatGPTさんは、
　　　勝手に推測して
　　　　回答してしまう。

　この推測による回答は、
　　多くの場合、
　　　的外れである。
***
　【プロンプト内部で使う文言④】
　　・通常のアプローチとは違う方法でこの問題にアプローチしてみてください。 

　こちらは、
　　一時期、“水平思考”が
　　　流行ったのですが、
　　　　ChatGPT無料版での効果が
　　　　　見られなかったのです。

　“水平思考”というのは、
　　“詳細な指示ではないのでは？”
　　　と思い、“水平思考”を
　　　　説明させて、その中の一文を
　　　　　使ってみた結果、
　　　　　　いい反応が見られた
　　　　　　　その文言です。
***
　さて、
　　ここからは、
　　　DALL-E3での
　　　　Tipsになります。

　まぁ、たいていは、
　　日本語プロンプトを書いて、
　　　英語プロンプトにして、
　　　　与えての描画なので、
　　　　　使ったり使わなかったり
　　　　　　なんですけどw
***
　【DALL-E3への指示で使う文言①】
　　・以下の描画をお願いします。

　こちらは、
　　描画内容を
　　　箇条書きで書いていく
　　　　パターンでのものです。

　描画された画像が
　　気に食わなければ、
　　　箇条書きを追加・削除して
　　　　調整します。

　“上記の～”とするよりも
　　編集しやすいですよ。
***
　【DALL-E3への指示で使う文言②】
```Text:連続生成指示Prompt
以下の描画を別々にお願いします。

[]（描画内容その１）
[]（……）
```
　文言①の応用編、です。

　この“[”と“]”を使うと
　　チェックボックスとして
　　　認識されます。

　TODOリストに
　　なるわけです。

　これで指示を与えれば、
　　順番どおりに
　　　処理してくれます。

　七回までは
　　確認できています。

　あまり、
　　多くは、求めない方が
　　　いいかと思いますよ。

　画像が
　　グダグダに
　　　なっていく可能性も
　　　　ありますからねw
***
　【DALL-E3への指示で使う文言③】
　　・描画して。

　これは、指示が描画なのか、
　　曖昧になっていると、
　　　ChatGPTさんが
　　　　説明モードに入ってしまい、
　　　　　描画してくれないことが
　　　　　　あるため、これを
　　　　　　　追記します。
***
　以上です。

　ほら、
　　たいしたものじゃ
　　　ないでしょう？

　でも、
　　みなさんの参考に
　　　なれば、幸いです。

　今回は、ここまで。
配列の最大最小 Python3編

https://paiza.jp/works/mondai/array_primer/array_primer__array_minmax

```py
N = int(input())
A = list(map(int,input().split()))
print(max(A),min(A))

```
 前にもやったことがあるのでわかったが、
他にもNをつかった出力方法がある

```py
print(A[N-1],A[0])
```
たしかに！！

つぎに平均を求めてそこから高いやつだけ出力する問題

https://paiza.jp/works/mondai/array_primer/array_primer__array_ave_step3
色々考えたけどオードソックスに。。。

```py
N = int(input())
A = list(map(int,input().split()))
summary = 0
for i in A:
    summary += i

average = summary / N

for i in A:
    if i >= average:
        print(i)
```
答えも見たけど、まあまあ同じだった
他に考えもつかないのでひとまずこれで。

https://paiza.jp/works/mondai/array_primer/array_primer__array_distance_step1

マンハッタン距離って何？？？
ググってみた。

https://atmarkit.itmedia.co.jp/ait/articles/2111/10/news023.html#:~:text=%E3%83%9E%E3%83%B3%E3%83%8F%E3%83%83%E3%82%BF%E3%83%B3%E8%B7%9D%E9%9B%A2%E3%81%A8%E3%81%AF%E3%80%81%E7%A2%81%E7%9B%A4,%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%82%92%E6%84%8F%E5%91%B3%E3%81%99%E3%82%8B%E3%80%82

>マンハッタン距離とは、碁盤の目状の道を縦に横にとタクシーが進むようにn次元の距離（＝差）の絶対値を合計することで距離を計算する方法。 ユークリッド距離とは、n次元の距離（＝差）の二乗値を合計した値の平方根を求める（＝ピタゴラスの定理を適用する）ことで直線的な最短距離を計算する方法を意味する。

なるほど。
ここで三平方の定理とか久しぶりに見たな。

ちなみに計算方法はこれらしい。||ってなんだっけ、と思ったら絶対値のやつだった。
> |x1 - x2| + |y1 - y2|

問題の意味がちょっとよくわからんかったのでとりあえず出力例を見て
ひねり出す。
VBAにもabs()があったことを思い出してpythonも同じかなと思ってやってみたらOKだった

```py
N = int(input())
for i in range(N):
    x,y = map(int,input().split())
    print(abs(x - 2) + abs(y - 3))
```

とりあえず続き

https://paiza.jp/works/mondai/array_primer/array_primer__array_distance_step2

質問の意味がよく分からず。
多分同じように使えばいいのかなと思って適当にやってみたけど
だめだった。

```py
N,A,B= map(int,input().split())
for i in range(N):
    x,y = map(int,input().split())
    print(abs(x - A) + abs(y - B))
```

んー？
多分足し合わせたらいいのか？
```py
N,A,B= map(int,input().split())
ans = 0
for i in range(N):
    x,y = map(int,input().split())
    ans += abs(x - A) + abs(y - B))

print(ans)
```
そもそもの意味がよくわからないのでギブアップ。。。
答えを見ると

```py
values = input().split()
N = int(values[0])
A = int(values[1])
B = int(values[2])

X = [0] * N
Y = [0] * N
for i in range(N):
    values = input().split()
    X[i] = int(values[0])
    Y[i] = int(values[1])

print(abs(X[B - 1] - X[A - 1]) + abs(Y[B - 1] - Y[A - 1]))

```
んー？？
XとYの座標でそれぞれB番目のやつからA番目のものを引いている？
配列使わないと無理だったな。。。なるほど。
やり直し

```py
N,A,B= map(int,input().split())
ans = 0
X = [0] * N
Y = [0] * N
for i in range(N):
    x,y = map(int,input().split())
    X[i] = x
    Y[i] = y

print(abs(X[B-1] - X[A-1]) + abs(Y[B-1] - Y[A-1]))
```