OmniAICreator/Qiita-1.07M huggingface dataset:
コンテナ内のsamba addc 設定やり直す方法

Samba AD DC（Active Directory Domain Controller）の設定をやり直す場合、以下のステップを追跡して設定をリセットおよび再構築できます。これにより、以前の設定がクリアされ、新しい設定を適用できます。

1. **Sambaサービスの停止**:
   最初に、Sambaサービスを停止します。

   ```bash
   service smbd stop
   service nmbd stop
   ```

   これにより、Sambaサービスが一時停止されます。

2. **Sambaデータのバックアップ** (オプション):
   以前のSamba設定をバックアップしておくと、後で必要になった場合に復元できます。

   ```bash
   cp -r /etc/samba /etc/samba_backup
   ```

   バックアップディレクトリ `/etc/samba_backup` に以前の設定がコピーされます。

3. **Sambaデータの削除**:
   以前のSamba設定データを削除します。これにより、設定がクリアされます。

   ```bash
   rm -rf /etc/samba
   ```

   注意: これにより、すべてのSamba設定が削除されますので、必要なバックアップがあることを確認してください。

4. **Sambaの再インストール**:
   Sambaを再インストールします。

   ```bash
   apt-get remove samba
   apt-get install samba
   ```

   パッケージマネージャーのコマンドはシステムに応じて異なる場合がありますので、必要に応じて調整してください。

5. **Sambaの再構築**:
   Sambaを新しい設定で再構築します。これには、Sambaの設定ファイル (`smb.conf`) を編集して必要な共有フォルダやセキュリティ設定を追加します。

6. **Sambaサービスの再起動**:
   新しい設定を適用するために、Sambaサービスを再起動します。

   ```bash
   service smbd start
   service nmbd start
   ```

   これで新しいSamba設定が有効になります。

これらの手順を実行することで、Samba AD DCの設定をクリアし、新しい設定を適用できます。設定ファイルを慎重に編集し、必要に応じてバックアップを作成しておくことが重要です。
【SwiftUI】Bindableプロパティラッパー

# この記事は何？

SwiftUIフレームワークの[Bindable](https://developer.apple.com/documentation/swiftui/bindable)について、Appleの開発者向けドキュメントを独自に解説する。

> Swiftを基礎から学ぶには
自著、工学社より発売中の「[まるごと分かるSwiftプログラミング](https://amzn.asia/d/7YPWJwl)」をお勧めします。変数、関数、フロー制御構文、データ構造はもちろん、構造体からクロージャ、エクステンション、プロトコル、クロージャまでを基礎からわかりやすく解説しています。

# Bindable構造体

「観測可能なオブジェクトにある変数プロパティへの参照」のバインディングを作成するプロパティラッパー型。

```swift:宣言
@dynamicMemberLookup @propertyWrapper
struct Bindable<Value>
```

# 概要

`@Bindable`プロパティラッパーを使用すると、`Observable`プロトコルに準拠したデータモデルオブジェクトの変数プロパティへのバインディングを作成できる。

## 単純なケース

以下の例において、データモデルの`Book`クラスは「信頼できる情報源」。
そして、`BookEditView`ビューは変数`book`に`@Bindable`をマークしている。
その`body`では、`TextField`ビューが`book`のバインドを利用して、`title`プロパティを変更する。
また、`Toggle`ビューは`book`の`isAvailable`プロパティを変更する。
ここでは、各プロパティのバインディングを渡すために、どちらのコントロールビューに対しても`$`構文を使用している点に注目。

```swift:
// 観測可能なオブジェクトのデータモデル
@Observable
class Book: Identifiable {
    var title = "Sample Book Title"
    var isAvailable = true
}

// 図書の情報を編集するためのビュー
struct BookEditView: View {
    @Bindable var book: Book    // bookは信頼できる情報源にバインド
    @Environment(\.dismiss) private var dismiss
        
    // TextFieldとToggleは「bookへのバインド」を受け取る
    var body: some View {
        Form {
            TextField("Title", text: $book.title)
            Toggle("Book is available", isOn: $book.isAvailable)
            Button("Close") {
                dismiss()
            }
        }
    }
}
```

上のコードにおいて、ビューのプロパティとして作成されるバインド変数には、既定値を設定しない点に注意。
実際のインスタンスは、親ビューから渡される。

## ケース2

`Bindable`プロパティラッパーは、`Observable`オブジェクトの変数およびプロパティにも使用できる。
これにはグローバル変数や「SwiftUIの外部にある型のプロパティ」だけでなく、ローカル変数が含まれる。

例えば、以下の`LibraryView`ビューは**body内で`@Bindable`変数を作成**する。
ボディのリスト内でバインド変数を作成することによって、それぞれの要素を参照するバインドを取得できる。

```swift:
struct LibraryView: View {
    // Book型インスタンスはObservableなデータモデル
    @State private var books = [Book(), Book(), Book()]

    var body: some View {
        List(books) { book in
            @Bindable var book = book
            TextField("Title", text: $book.title)
        }
    }
}
```

ここではまた、`@Bindable`な変数に**既定値を設定している**点に注目できる（最初のケースでは既定値を設定していない）。
`@Bindable`な変数`book`は「`book`データモデルに接続するバインディング」を提供するので、`TextField`ビューは「モデルデータの`title`プロパティ」にアクセスして、変更を加えることができる。

## ケース3

ケース2と同じ手法を、「観測可能なオブジェクトへのバインディング」がビューの環境に格納されている場合も使用できる。

例えば、次のコードは`@Environment()`プロパティラッパーを使用して、環境にある`Observable`な`Book`型インスタンスを取得する。
そして、ビューの`body`内で`@Bindable`な変数`book`を作成して、`$`記号をマークして「`book`データモデルの`title`プロパティまでのバインディング」を`TextField`ビューに渡す。

```swift:
struct TitleEditView: View {
    // bookプロパティに「ビューの環境にあるモデルデータ」を取得
    @Environment(Book.self) private var book

    var body: some View {
        @Bindable var book = book    // 環境にあるモデルデータの参照をバインド
        TextField("Title", text: $book.title)
    }
}
```

ここでもやはり、バインド変数に既定値を設定する必要がある。
［vue3、typescript］Vueファイルのimportでエラー

# 環境
vscode 1.82.2

vue 3.3.4
typescript 5.1.6
vite 4.4.9

# 手順
１．.vueファイルをimport
```main.ts
import App from '@/App.vue'
```

# 現象
以下のエラーが発生

モジュール '@/views/AboutView.vue' またはそれに対応する型宣言が見つかりません。

# 原因
.tsと.vueで拡張子が異なり、main.tsがApp.vueをTypescriptとして扱えないことが原因。

# 対策
main.tsと同階層に「shims.d.ts」（VueファイルをTypeScriptとして認識させるためのファイル）
を作成。

```shims.d.ts
declare module "*.vue" {
  import type { DefineComponent } from "vue";
  const component: DefineComponent<{}, {}, any>;
  export default component;
}
```

# 参考
https://qiita.com/raratyurara/items/3ec1d78bebb76bde641a
Qiitaでコードを表示させる方法

```python:python.py

prinf(3)
```

Qiitaでmarkdownを用いてコード書く方法を解説します．



## qiitaの投稿画面に描いたコード
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457930/c0170743-479a-5a97-8205-40efe366ae36.png)

このように書いています．バッククォートで書きたいプログラムを囲みます

## 一番シンプルなブロック
こうも書けます
```

prinf(3)
```


書いたmarkdownのコードはこれです．

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457930/964fe670-3167-b50b-cfbc-b5ade46e1ce2.png)
［vue3、typescript］v-calendarのimport時にエラー

# 環境
vscode 1.82.2

vue 3.3.4
typescript 5.1.6
vite 4.4.9

v-calendar 3.0.3

# 手順
１．以下からnpmでインストール
[VCalendar](https://vcalendar.io/getting-started/installation.html)

```
npm install v-calendar@next @popperjs/core
```

２．main.tsで使用するコンポーネントをimport

```:main.ts
import { Calendar, DatePicker } from 'v-calendar';
...
app.component('Calendar', Calendar)
app.component('DatePicker', DatePicker)
```

# 現象
以下のエラーが発生。

モジュール 'v-calendar' の宣言ファイルが見つかりませんでした。'.../index.jsは暗黙的に 'any' 型になります。
There are types at '.../index.d.ts', but this result could not be resolved when respecting package.json "exports". The 'v-calendar' library may need to update its package.json or typings.ts(7016)

# 原因
型定義ファイル（d.ts）がないことが原因だった。

# 対策
作業ディレクトリに定義ファイルである@types/v-calendarを追加。

```v-calendar.d.ts
declare module 'v-calendar'
```

・その他試したこと（失敗）
npmで@types/v-calendarをインストール。
用意されていませんでした。
```
npm install @types/v-calendar
```

# 参考サイト
https://note.com/hirorec/n/ne989f297e900
サービス プリンシパルの認証トークンを取得する

`<YOUR-TENANT-ID>`、`<YOUR-CLIENT-ID>`、`<YOUR-CLIENT-SECRET>` を使用する実際の値に置き換えて、下記のコマンドをコマンドプロンプトで実行する。
```shell 
curl -X POST https://login.microsoftonline.com/<YOUR-TENANT-ID>/oauth2/token -d "grant_type=client_credentials&resource=https%3A%2F%2Fmanagement.azure.com%2F&client_id=<YOUR-CLIENT-ID>&client_secret=<YOUR-CLIENT-SECRET>"
```
1 時間有効なアクセス トークンが返される。

引用元：
https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-manage-rest?view=azureml-api-2#retrieve-a-service-principal-authentication-token
【HTML】imgタグには alt、width/height、loading="lazy"を設定しよう！そして補足decording="async"

🌻imgタグにはこれを付けよう！

今日は動画にしましたが画面があまり動かないので
ラジオ感覚で聞いていただければ嬉しいです📻

👇Youtube
https://youtu.be/4w6aE4WCiXQ

👇decording="async"について詳しく調べてくれている記事はこちら！
https://zenn.dev/ixkaito/articles/deep-dive-into-decoding

もう、、すごいです！（語彙）
PowerShell Get-NetAdapterコマンドレットでMACアドレスからIPアドレスを特定

<h2>Get-NetAdapterコマンドの使用例</h2>
各ネットワークインターフェイス（NIC）情報を表示するコマンドレットです。
通常、コマンドラインオプションも併せて実行することでネットワークトラブル等の切り分け作業を行います。

<h3>NICに紐づくIPアドレス、MACアドレスの特定</h3>
<p>Get-NetIPAddress | select InterfaceAlias, IPAddress
<p>を実行することにより、NICのMACアドレスとそれに対するIPアドレスが表示されます。

```
Get-NetIPAddress | select InterfaceAlias, IPAddress

InterfaceAlias              IPAddress
--------------              ---------
Bluetooth ネットワーク接続  fe80::fxx3:xxxx:ecb5:19xx%8
イーサネット                fe80::bcxx:c0fd:xxxx:xxx8%14
Wi-Fi                       2400:4150:261:8700:c9e8:a45c:421a:2f2f
Loopback Pseudo-Interface 1 ::1
Bluetooth ネットワーク接続  169.254.200.187
イーサネット                192.168.100.98
Wi-Fi                       172.20.1.59
Loopback Pseudo-Interface 1 127.0.0.1
```

<h3>PCのNICのベンダー情報、リンク速度等を調べる</h3>
<p>Get-NetAdapter
<p>を実行することで、MacアドレスとLinkSpeedを調べることができます。

```
Get-NetAdapter

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
Wi-Fi                     Intel(R) Wi-Fi 6 AX200 160MHz                19 Up           4C-1D-96-16-32-E9       1.2 Gbps
イーサネット              Intel(R) Ethernet Connection (6) I219-V      14 Disconnected E8-D8-D1-6A-C4-DD          0 bps
Bluetooth ネットワーク... Bluetooth Device (Personal Area Netw...       8 Disconnected 4C-1D-96-16-32-ED         3 Mbps
ローカル エリア接続       PPPoP WAN Adapter                             4 Disconnected 00-00-00-00-00-00          0 bps
```

<h3>MACアドレスからIPアドレスを特定</h3>

```
Get-NetNeighbor -LinkLayerAddress "XX-XX-XX-XX-XX-XX"

ifIndex IPAddress                                          LinkLayerAddress      State       PolicyStore
------- ---------                                          ----------------      -----       -----------
41      255.255.255.255                                    XX-XX-XX-XX-XX-XX     Permanent   ActiveStore
```
【Laravel9】ChatGPTのAPIを利用する方法

Laravel9でChatGPTのAPIを利用する際に必要な設定を書いていきます。

#### 1.PHPのバージョンを確認
```bash
$ php -v
PHP 8.2.9 (cli) (built: Aug 24 2023 20:33:12) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.9, Copyright (c) Zend Technologies
```
ChatGPTのAPIでは、PHP8.1.0以上が必須になります。

#### 2.composer requireを実行
```bash
$ composer require openai-php/laravel
```
PHPのバージョンが足りないと、ここでエラーが出ます。
途中で
"Do you trust "php-http/discovery" to execute code and wish to enable it now? "
と聞かれることがありますが、yesを選択して大丈夫です。

#### 3.configを作成
```bash
php artisan vendor:publish --provider="OpenAI\Laravel\ServiceProvider"
```
以上のコマンドで/config/openai.phpが作成されます。

#### 4.APIキーを.envに追記
```:.env
OPENAI_API_KEY=sk-***
```
OpenAIのアカウントで取得したAPIキーをここに設定します。
当たり前ですが人に知られないようにしましょう。



ここまでで環境の設定は終了です。


#### 5.動作を確認
適当に用意したControllerで以下の関数を記述し、実行させる
```php:ChatGPTController.php
public function index()
    {
        $msg = [
                ['role' => 'system', 'content' => '日本語で答えて'],
                ['role' => 'user', 'content' => '今日の運勢を占って'],
            ];
        $result = OpenAI::chat()->create([
                    'model' => 'gpt-3.5-turbo',
                    'messages' => $msg,
                ]);
        echo $result->choices[0]->message->content . PHP_EOL;
    }
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2560987/3ba9420f-a232-f30a-f780-45d00aef5252.png)

それっぽい疎通ができていることが分かります。
[flutter]特定の画面のみアプリの向きを変更する方法をまとめた

## はじめに
こんにちは。
今回の記事では、特定の画面のみ画面の向きを変更する方法について共有します。

作成するアプリの要件によっては、基本は縦画面だが、この画面だけは横画面で実装してくれみたいなことを要求されることがあるかと思います。（要求された）

一部詰まった所等あるので、共有できたらと思います。

## 要件
![画面向き.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3158219/a69b258f-9879-68c3-82ec-a845c73bc239.gif)


ざっくりですがこんな感じで実装していきます。


今回は、基本的にほとんどの画面は縦向きに固定しますが、一部の画面のみ横向きに実装することとします。
※逆の場合は、この記事の逆に実装すればOKです。

## 画面を縦に固定する

まずは、画面を縦に固定する方法を解説します。

以下のように、**SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])**
でrunAppをネストしていきます。

```dart:main.dart
void main() {

  WidgetsFlutterBinding.ensureInitialized();
  SystemChrome.setPreferredOrientations([
    // 縦向き
    DeviceOrientation.portraitUp,
    DeviceOrientation.portraitDown,
  ]).then((_) {
    runApp(const MyApp());
  });
}
```

これで全ての画面を縦方向に固定することができます。

ちなみにですが、DeviceOrientationには
landscapeLeft、
landscapeRight、
portraitDown、
portraitUp
が定義されています。

今回はportraitUpを使用しましたが、例えば、portraitDownを追加することで、スマホを真逆にした際に、アプリが後ろ向きに表示されるようになります。



余談ですが、横向きにしたいのであれば、以下のように記載してください。

```dart:main.dart
  SystemChrome.setPreferredOrientations(
      [DeviceOrientation.landscapeLeft,DeviceOrientation.landscapeRight]);
  ///画面を縦に固定
    runApp(
        const ProviderScope(
            child: MyApp()));
```
これで横向きの画面が完成します。

*ちなみにですが、SystemChrome〜を記載するには**flutter/services.dart**をインポートする必要があります。
（editorがサジェストしてくれるので、特に問題ないと思いますが一応）



## 横向きにしたい画面を実装する

```dart
  @override
  void initState() {
    super.initState();
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.landscapeLeft,
      DeviceOrientation.landscapeRight,
      ///横向きに固定する

    ]);

  }

  @override
  void dispose() {
    // ウィジェットが破棄されたときに元の向きに戻す（縦向き）
    SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);

    super.dispose();
  }
```

initState内で SystemChrome.setPreferredOrientationsで画面の向きを固定します。
またこのままだと、元の画面に戻るタイミングでmain.dartで記載したSystemChromeと重複して**画面の向きが元に戻らないバグ**が起きてしまいます。

そこでdispose()内で、そのwidgetが破棄されるタイミングで、元来のアプリの向きを戻すことで、うまく動作するようになります。

※今回はstatefulWidgetで実装していますが、ご自分が採用している状態管理の方法で置き換えて使用することをお勧めします。


## 全コード

今回の全コードはgithubに上げていますので、気になる方は以下からアクセスしてください。

https://github.com/yutokobayashii/view_direction_project.git

## 　最後に
最後まで読んでいただきありがとうございました。
もし間違いなど気になる点がありましたらコメントいただけると幸いです。
TurboPascalでユリウス日

今年はTurboPascalが発売されて40年になるようです。

久しぶりにcpm8266のTurboPascalをいじってみました。

ユリウス日を計算してみます。

https://www.pcorner.com/list/PASCAL/JDAY.ZIP/JDAY.PAS/

を参考にしました。

```pascal:JDAY.PAS
program jday;
function julday(year, month:integer; day:real):real;
var
a,b: integer;
gregorian: boolean;
begin
gregorian := TRUE;
if year < 1582 then gregorian := FALSE;
if (year = 1582) and (month < 10) then gregorian := FALSE;
if (year = 1582) and (month = 10) then
if day < 15 then gregorian := FALSE;

if month < 3 then begin
year := year -1;
month := month + 12;
end;
a := year div 100;

if gregorian then
b := 2 - a + a div 4
else
b := 0;

julday := int(365.25 * ( year + 4716)) + int(30.6001 * (month + 1)) +
 day + b - 1524.5

end;

var
r: real;
begin
r := julday(2023, 9, 21);
write(r);
```

doubleとかlongintとかは無いようです。


実行してみます。

```
Loading F:JDAY.PAS
Compiling 
  34 lines

Code:   488 bytes (7E70-8058)
Free: 25218 bytes (8059-E2DB)
Data:    42 bytes (E2DC-E306)

Running
  2.4602085000E+06
```

TurboPascalは方言がすくなく、原版について解説された、ここも参考になります。

http://www.math.s.chiba-u.ac.jp/~shinya/pascal/pascal.html
Confluent Platformを使ってPostgreSQLからElasticsearchへのデータストリームを試してみる１

この記事の目的は、Confluent Platform（Apache Kafka）に関する技術ブログを投稿し、自分の理解を整理することです。加えて、これから使ってみようと考えているエンジニアの助力になればと考えています。
記事はいくつかのパートに別けて構成する予定です。
きちんと精査しきれていないため、不正確な内容が含まれているかもしれません。その場合はコメント頂けると嬉しいです。

# 概要

「使ってみる」の検証用システム構成の概要図はこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360501/182131f6-1533-cae1-422c-f996710d5470.png)


このシステムではConfluent Platformを通じてPostgreSQLとElasticsearchの間で、リアルタイムデータストリームを行います。簡単に言えばデータ同期のようなもので、PostgreSQLのデータがElasticsearchに転送されます。

データを統合する対象にPostgreSQLとElasticsearchを選択した大きな理由はありません。
強いて言えば、個人的に使い慣れていることと、リレーショナルデータベースであるPostgreSQLからNoSQLデータベースの一種であるElasticsearchへのデータ統合がどこまで出来るか試してみたいという単純な動機です。

---

# Confluent Platformについて

「使ってみる」の前置きとしてConfluent Platformを概要レベルでまとめました。もっと詳しい解説は他の記事で投稿するかもしれません。
一方、PostgreSQLやElasticsearchまで手を広げて書くと発散するのでこの記事では触れません。

## Confluent Platformとは

Confluent Platformは、リアルタイムデータストリームを可能にするApache Kafka上に構築されたストリームデータプラットフォームです。Apache Kafkaの管理と監視のためのツールと、その機能を拡張する追加コンポーネントを提供します。
一言で表すと、商用利用で必要不可欠と言っても過言ではないセキュリティ機能や運用に必要な構成管理の機能を提供しています。

そして、Apache KafkaはLinkedInが開発し、Apache Software Foundationに寄贈したオープンソースのストリーム処理ソフトウェアです。データストリームを処理し、リアルタイムデータのパイプラインとストリーミングアプリケーションを提供しています。
一言で表すと、耐障害性とスケーラビリティのあるプラットフォームを提供しています。

Confluent PlatformはApache Kafkaを中心に構築されており、その機能を拡張するためのいくつかの主要なコンポーネントを含みます。この記事では、Zookeeper、Broker、Schema Registry、Connectorsについて説明します。

### Zookeeper

Zookeeperは、分散同期を実現するコーディネーションサービスノードです。Zookeeperの役割はBrokerを管理し、パーティションやレプリカ情報などのメタデータを維持して信頼性のある分散システムを確保しています。

### Broker

BrokerはKafkaの中核的なコンポーネントでデータの保存を担当します。Brokerの役割は、クライアントのリクエストの処理、データの読み書きを行い、障害耐性のために異なるブローカー間でのデータレプリケーションを担当しています。

### Schema Registry

Schema Registryはメタデータの提供レイヤーを提供します。Kafka内の異なるメッセージスキーマの互換性を可能にします。Schema Registryの役割はスキーマの保存と取得を行い、データが事前に定義されたスキーマに準拠した状態を確保します。Avro、JSON、Protobufのデータ形式に対応しています。

### Connector

Connectorは、データのスケーラブルで信頼性のあるストリーミングを実現します。Connectorの役割はデータベース、メッセージキュー、クラウドストレージなどへの接続であり、システム間でのシームレスなデータ移動を担当しています。

# まとめ

Confluent Platformを概要レベルで解説しました。
次回の記事では、dockerコンテナを利用して検証環境を構築します。

- 投稿済みの記事と投稿予定の記事
    - 検証用のシステム構成を紹介 ★ｲﾏｺｺ
    - 環境構築
    - Connectorプラグインの登録、データストリーム
    - DebeziumのSMTを利用したメッセージ変換
    - 自作のSMTを利用したメッセージ変換
    - ElasticsearchのIngest Pipelineを利用した変換

- 投稿するかもしれない記事
    - Confluent Platformの解説
    - KafkaとConnectorのパフォーマンスチューニング
    - Elasticsearchの解説
    - Elasticsearchのインデックス設定、マッピング定義の解説
    - Elasticsearchの search APIの解説
    - Elasticsearchをクラスタ構成に変更
Package Management Tool List

<table>
  <h1>Programming Language Package Management Tool</h1>
  <thead>
    <tr>
      <th>Programming Language</th> <th>Package Management Tool</th><th>Link</th>
    </tr>
  </thead>
  <tr>
    <td>JavaScript/Node.js</td> <td>npm / Yarn</td><td><a>https://www.npmjs.com/</a></td>
  </tr>
  <tr>
    <td>PHP</td> <td>Composer</td> <td><a>https://getcomposer.org/</a></td>
  </tr>

<tr>
    <td>Python</td> <td>pip</td> <td><a>https://pypi.org/project/pip/</a></td>
  </tr>

<tr>
    <td>Ruby </td> <td>Bundler </td> <td><a>https://bundler.io/ </a></td>
  </tr>

<tr>
    <td>Java </td> <td>Gradle</td> <td><a>https://gradle.org/ </a></td>
  </tr>
<tr>
    <td>Java</td> <td>Apache Maven</td> <td><a>https://maven.apache.org/ </a></td>
  </tr>
<tr>
    <td>C/C++ </td> <td>Conan / vcpkg (for C++)</td> <td><a>https://conan.io/ </a></td>
  </tr>

<tr>
    <td>Go </td> <td>Go Modules (go mod) </td> <td><a>https://go.dev/ </a></td>
  </tr>

<tr>
    <td>Swift </td> <td>Swift Package Manager (SwiftPM) </td> <td><a>https://www.swift.org/package-manager/ </a></td>
  </tr>

<tr>
    <td>.NET </td> <td>NuGet </td> <td><a>https://www.nuget.org/ </a></td>
  </tr>

<tr>
    <td>Kotlin </td> <td>Gradle (Kotlin DSL) </td> <td><a>https://docs.gradle.org/current/userguide/kotlin_dsl.html </a></td>
  </tr>


</table>
【flutter】ElevatedButtonの活性と非活性を実現するには？

こんにちは。
今回は、ElevatedButtonの活性と非活性について紹介します。

# 方法
![スクリーンショット 2023-08-13 20.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/ce57fee2-1687-ea40-8538-b4c8b9db94e0.png)

まず、1,2,3,4,5の整数が入ったnumberListを作ります。
```dart
List<int> numberList = [
  1,
  2,
  3,
  4,
  5,
];
```
次に、ボタンを押した時の処理を三項演算子を使って活性と非活性に分けます。
```dart
number >= 3 ? () {} : null
```



# 使用例
```dart
import 'package:flutter/material.dart';


void main() {
  runApp(const MainApp());
}

class MainApp extends StatefulWidget {
  const MainApp({super.key});

  @override
  State<MainApp> createState() => _MainAppState();
}

List<int> numberList = [
  1,
  2,
  3,
  4,
  5,
];

class _MainAppState extends State<MainApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.pink,
          title: const Text("Flutter!!!!"),
        ),
        body: Column(
          children: [
            ...numberList.map((number) => ElevatedButton(
                onPressed: number >= 3 ? () {} : null, //numberの値が3以上は活性。それ以外(1,2の場合)は、非活性。
                child: Text(number.toString()))),
          ],
        ),
      ),
    );
  }
}


```

# 実行例
![スクリーンショット 2023-09-21 12.39.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/8979371c-fcff-88ba-a3a2-2fa64aaa8380.png)
TwitterAPI有料化に伴い起きたトラブルメモ

2023年5月頃にTwitterAPIが有料化となり、お仕事で使っていたTwitterAPIに起きたトラブル（主にポリシー違反）についての備忘録です。
（現在は大分落ち着いた感じはしますが）

## 2023年4月末頃
厳密な切り替え日時が不明だった為、まだ有料化プランを設定する前だった時に開発環境と本番環境で以下エラーが発生した。
```
{"errors":[{"code":32,"message":"Could not authenticate you."}]}
```
そしてTwitter developer Platformのページで、開発環境と本番環境のアプリに以下警告が出ていた。
```
This App has violated Twitter Rules and policies. As a result, it can no longer be accessed. For assistance, submit a support ticket.
このアプリは Twitter のルールとポリシーに違反しています。その結果、アクセスできなくなります。サポートが必要な場合は、サポート チケットを送信してください。
```
### 対応
おそらく有料化に切り替わったと思われた為、Basicプランにすることで開発環境、本番環境ともに解消した。

## 2023年4月末頃（翌日）
Basicプランに設定した翌日、再び以下エラーが発生した。
```
{"errors":[{"code":32,"message":"Could not authenticate you."}]}
```
Twitter developer Platformのページを確認するも、アプリに特に警告は無かった。
### 対応
はっきりした原因はわからなかったが、Twitter developer Platformから各アプリのClient ID、Client Secretを発行することで解消した。

Client ID、Client SecretはOAuth2.0で使用するらしく特に使用はしないものだったがこれらが発行されていないとTwitter認証でエラーになってしまっていた模様。
これらの発行は、（おそらく）OAuth2.0の設定が追加された以降にAppのUser authentication settingsを更新すると初回に発行されるっぽい。
※ちなみにClient Secretはこのタイミングでしか確認できない（再発行はできる）ので念のためメモ推奨。

## 2023年5月中旬
Twitter認証時に再び以下エラーが発生した。
```
{"errors":[{"code":32,"message":"Could not authenticate you."}]}
```
Twitter developer Platformのアプリ個別の所の警告は以下。
```
This App has violated Twitter Rules and policies. As a result, it can no longer be accessed. For assistance, submit a support ticket.
このアプリはTwitterのルールとポリシーに違反しています。その結果、アクセスできなくなります。サポートが必要な場合は、サポート チケットを送信してください。
```
Projects & AppsのOverviewでSUSPENDEDアイコンにマウスオーバーするとちょっと違う警告（詳細をメールに送った旨が追記）
```
This App has violated Twitter Rules and policies. As a result, it can no longer be accessed. An email has been sent to hoge*****@fuga*****.co.jp with details. For assistance, submit a support ticket.
このアプリはTwitterのルールとポリシーに違反しています。その結果、アクセスできなくなります。詳細を記載したメールをhoge*****@fuga*****.co.jpに送信しました。サポートが必要な場合は、サポート チケットを送信してください。
```
で、困ったことに該当メールは特に受信しておらず、サポートの問い合わせをしようにもTwitterAPIについての問い合わせカテゴリが無かった（ネット見てると昔はあったみたいだけど）為、原因は今もわかっていない。
### 対応
Twitter developer Platformから開発環境向けアプリを削除し、TwitterAPIの料金プランを「Basic」から「Free」に切り替えたことで本番環境アプリの警告は解消された。
（Freeプランはアプリ1つしか登録できない）

また、Projectsを作成して、既存の本番環境向けアプリを紐づけた。
（アプリが違反状態では紐づけできなかった）
### 対応の補足
無料プランにして解消するというのは当時のTwitterフォーラムで同様の事象が起きた人の中でこれで解消したという書き込みがあった。
[Twitterフォーラムにあった書き込み](https://twittercommunity.com/t/anyone-know-how-i-can-find-out-what-rules-policies-my-app-is-meant-to-have-violated/193525/12)

もう一つのProjectsを作成してアプリを紐づけしたのは警告の解消とは別に「念のため」やった。
TwitterAPI v2を利用するにはプロジェクトに紐づける必要があるらしいが、特に使用しない為、紐づけていなかった（スタンドアロン状態）。
ただ、これがポリシー違反の可能性の1つかも？と思って対応した。
先にこれだけを試したかったのだが、アプリが違反状態では紐づけできなかった。
Java の SSLSocket 生成時に Underlying socket is not connect. が発生する

### 背景

* Socket から SSLSocket を生成しようとした際、はまった。
* つまらないことだった・・・・。

### 解決 

* `new Socket()` をした後に、`socket.connect` を実行しなければならない。 
* `new Socket()` しただけでは接続されないから、そりゃあ接続できないエラーが出ますわな....
Mojo🔥でNumpyをcodespaces上で動かしたい!

# はじめに
Githubのcodespacesを使用して、MojoでNumpyを動かすことを目標とします。
buildなしで実行するとすんなり動くが、buildするとエラーが出てなかなか解決できなかったので、ここに記します。

# エラー内容
最初にGithubのcodespacesを立ち上げます。
次に、公式ドキュメントを参考に以下でmojoをインストールしてパスを通します。{MODULAR_AUTH}に自分の値を入れます。 (https://developer.modular.com/download より会員登録をして発行)
```bash
curl https://get.modular.com | \
  MODULAR_AUTH={MODULAR_AUTH} \
  sh -
modular install mojo
echo 'export MODULAR_HOME="$HOME/.modular"' >> ~/.bashrc
echo 'export PATH="$MODULAR_HOME/pkg/packages.modular.com_mojo/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
```

<br>

main.mojo
``` mojo
from python import Python

def main():
    let np = Python.import_module("numpy")
    let a = np.array([1, 2, 3])
    print(a)

```
以下を実行すると、
```
mojo main.mojo
> [1 2 3]
```
問題なく動きます。しかし、
```
mojo build main.mojo
./main
> Mojo/Python interoperability error: Unable to locate a suitable libpython, please set `MOJO_PYTHON_LIBRARY`
Segmentation fault (core dumped)
```
となり、MOJO_PYTHON_LIBRARを設定しなければなりません。様々なサイトを参考にlibpython3.xx.soのパスを渡せばいいことはわかるも、どこにあるかなかなかわからず。見つけて設定しても別のエラーが、、、

# 解決方法
設定するPyhtonのバージョンが間違っていました。以下で解決できます。
```bash
echo 'export MOJO_PYTHON_LIBRARY="/opt/conda/lib/libpython3.10.so"' >> ~/.bashrc
source ~/.bashrc
```

```bash
mojo build main.mojo
./main
> [1 2 3]
```
となり、解決できました。

# まとめ
以下でNumpyをビルドできる環境構築ができます。
```bash
curl https://get.modular.com | \
  MODULAR_AUTH={MODULAR_AUTH} \
  sh -
modular install mojo
echo 'export MODULAR_HOME="$HOME/.modular"' >> ~/.bashrc
echo 'export PATH="$MODULAR_HOME/pkg/packages.modular.com_mojo/bin:$PATH"' >> ~/.bashrc
echo 'export MOJO_PYTHON_LIBRARY="/opt/conda/lib/libpython3.10.so"' >> ~/.bashrc
source ~/.bashrc
```
3系の環境構築

## 参考とした記事
EC-CUBE 3.0系をdockerで動かすときのメモ
https://qiita.com/chihiro-adachi/items/ec610d1f561d3dbcb7eb

## 環境構築手順
3系をインストール
```terminal:Terminal
git clone <https://github.com/EC-CUBE/ec-cube3.git>
cd ec-cube3
```

2.17のdocker関連ファイルを取得
```terminal:Terminal

 (
CURRENT_DIR=$(pwd)
cd /tmp
git clone --depth 1 <https://github.com/EC-CUBE/ec-cube2.git>
cd ec-cube2
cp -r dockerbuild ${CURRENT_DIR}/
cp Dockerfile ${CURRENT_DIR}/
cp docker-compose.yml ${CURRENT_DIR}/
cp docker-compose.pgsql.yml ${CURRENT_DIR}/
cp docker-compose.mysql.yml ${CURRENT_DIR}/
cp docker-compose.dev.yml ${CURRENT_DIR}/
cp eccube_install.sh ${CURRENT_DIR}/

rm -rf /tmp/ec-cube2
)
```

## 各種セット
```terminal:Terminal
sed -i "" 's/composer:2.2/composer:1.10/g' Dockerfile
sed -i "" 's/.*wait-for-pgsql\\.sh/#&/g' docker-compose.pgsql.yml  
sed -i "" 's/.*wait-for-mysql\\.sh/#&/g' docker-compose.mysql.yml
sed -i "" 's/image: postgres/&:9/g' docker-compose.pgsql.yml
```

## Dockerfileの修正

以下を追加
```
RUN sed -i s,deb.debian.org,cloudfront.debian.net/debian-archive,g /etc/apt/sources.list
RUN sed -i 's,security.debian.org,cloudfront.debian.net/debian-archive,g' /etc/apt/sources.list
RUN sed -i '/stretch-updates/d' /etc/apt/sources.list
```

cf. Dockerfile
```
ARG GD_OPTIONS="--with-freetype --with-jpeg"
ARG EXT_INSTALL_ARGS="gd zip mysqli pgsql opcache"
ARG APCU="apcu"
ARG FORCE_YES="--force-yes"
# See <https://github.com/debuerreotype/debuerreotype/issues/10>
RUN if [ ! -d /usr/share/man/man1 ]; then mkdir /usr/share/man/man1; fi
RUN if [ ! -d /usr/share/man/man7 ]; then mkdir /usr/share/man/man7; fi
```

## ビルド
 ※ビルドをする前にDockerを起動してください。
```terminal:Terminal

 export TAG=7.0-apache
docker build -t ec-cube2 --no-cache --pull \\
--build-arg TAG=${TAG} \\
--build-arg GD_OPTIONS="--with-freetype-dir=/usr/include --with-jpeg-dir=/usr/include" \\
--build-arg EXT_INSTALL_ARGS="gd zip mysqli pgsql opcache pdo_pgsql pdo_mysql" \\
--build-arg APCU=apcu \\
--build-arg FORCE_YES= \\
./
```

## タグ付け
```terminal:Terminal
 docker tag ec-cube2 ghcr.io/ec-cube/ec-cube2-php:${TAG}
```

## 起動(pgsql)
```terminal:Terminal
 docker-compose -f docker-compose.yml -f docker-compose.pgsql.yml -f docker-compose.dev.yml up
```

## composer install

 ※別ターミナルを開く
```terminal:Terminal
 docker exec -it ec-cube3-ec-cube-1 composer install
```

## ブラウザで開く
```terminal:Terminal
 open <https://localhost:4430/>
```
ブラウザ拡張機能プログラムの練習として広告を消してみる

[MDNのブラウザー拡張機能](https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions)を見つつ広告を消すプログラムを作ってみた。

https://github.com/ikiuo/google-chrome-extension-admodifier

処理する項目は少ないが、実行タイミングの罠は沢山ありました。
生成AIの種類と、その違い

自分用のメモ。
主な生成AIの種類と、それぞれの違いについて簡単に纏めました。
(2023.12.30時点)


||Bard|Bing AI|ChatGPT (3.5)|ChatGPT (4.0)
|:--|:--|:--|:--|:-- 
言語モデル (LLM)|PaLM2|GPT-4|GPT-3|GPT-4
|検索エンジン|Google|Bing|(なし)|(なし)
情報量|最新|最新|2021年9月まで|2023年4月まで
料金|無料|無料|無料|月額20ドル
画像表示|○|○|×|○
[MR Dev Tips #17] Unity Transform クラスの Rotate / RotateAround メソッドを調べる

Unity の Transform コンポーネントの Rotate メソッド と RotateAround メソッド の挙動について、実際に動かしながら、挙動を確認してみたいと思います。

まず、回転した際に分かりやすい形をしている 3Dモデル を準備します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/eaa6b809-d907-ab6a-3292-e8655e69f78e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/2f8e4e96-864c-88a1-080c-cd065ce8a702.png)

# Transform.Rotate

実際にコンポーネントをオブジェクトにアタッチして試してみます

```Example.cs
using UnityEngine;

public class Example : MonoBehaviour
{
    void Update()
    {
        transform.Rotate(0, 0.1f, 0, Space.Self);
    }
}
```

![Animation3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/cb9e8e03-198e-b39f-3445-89d4e659fa07.gif)

続いて、車のオブジェクトを X軸 を中心に 90° 回転させた状態にして、ゲームを再生してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/b97421d0-0b3c-d8a2-c5d4-569066a192ec.png)

![Animation4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/841f76a1-b322-f7be-d4db-b0e3c861ddab.gif)

さきほどと同じく、ワールド座標のY軸側から見てみると、同じソースコードですが、違う回転をしていることが確認できます。これは Inspector 上でオブジェクトを回転させ、オブジェクトの持つローカルのY軸の向きが変わったことによる影響です。ここで、ソースコードを少し変更してみます。

```
transform.Rotate(0, 0.1f, 0, Space.World);
```

![Animation5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/c5c8b368-2b47-436b-b95b-36046ca86583.gif)

``transform.Rotate()`` の第四引数に ``Space.World`` を指定することによって、ワールド座標軸でオブジェクトを回転させることができます。


# Transform.RotateAround

```Example.cs
using UnityEngine;

public class Example : MonoBehaviour
{
    // 回転の中心にしたいオブジェクトを指定
    public GameObject target;

    void Update()
    {
        // アタッチしたオブジェクトを target を中心に1秒間に 20° 回転させる
        transform.RotateAround(target.transform.position, Vector3.up, 20 * Time.deltaTime);
    }
}
```

実際にコンポーネントをオブジェクトにアタッチして、オブジェクト自身をターゲットに設定した場合


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/60b2546e-5161-de22-10f2-9d31bb74a9ed.png)

![Animation1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/6dfa5bc7-ad9d-da14-3326-efdff8c6ca5e.gif)

実際にコンポーネントをオブジェクトにアタッチして、ターゲットを他のオブジェクトに設定した場合

- 回転の中心となるオブジェクト (Sphere) を追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/ace0fa81-f1ff-0a81-268f-87fd05c13456.png)

- 回転させたいオブジェクトにアタッチした Example コンポーネントの Target に Sphere をセット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/56b8e2b2-a33e-b134-4ff1-e581ccbf0787.png)

さきほどの回転の動きとは異なり、追加した Sphere を中心に回転するようになりました。

![Animation2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/f97a53dd-8424-25c4-1b65-9498036bcd79.gif)

以上。
Laravelで論理削除を実装してみる

## はじめに
一般的な削除である物理削除ではなく、今回はDBに残しながらも削除扱いとなる論理削除(SoftDelete)を実装していく。
物理削除してしまうと貴重なデータが完全に消えてしまうが、論理削除だと必要なコマンドを打てば取り出すことができるため分析時に役に立つ。

## 論理削除の手順
### ①マイグレーションファイルを修正し、`deleted_at`カラムを追加する
下記コマンドでマイグレーションファイルが新たに作成される。
```terminal
php artisan make:migration add_deleted_at_to_subscriptions_table --table=subscriptions
```

作成されたマイグレーションファイルを開き、下記のように加筆する。
`nullable()`はnullを許容しているため、必ず登録する必要がない場合はつけてあげる。
```php
public function up()
{
    Schema::table('subscriptions', function (Blueprint $table) {
        $table->softDeletes()->nullable();
    });
}

public function down()
{
    Schema::table('subscriptions', function (Blueprint $table) {
        $table->dropSoftDeletes();
    });
}
```

マイグレーションの実行をする。
```terminal
php artisan migrate
```

### Modelファイルを修正する
論理削除が適応されるように、`SoftDeletes`トレイトを使用できるようにする。
```php
<?php

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes; // 追記

class Subscription extends Model
{
    use HasFactory;
    use SoftDeletes; // 追記
}
```
### Controllerの削除処理を修正
論理削除を実装するため、`deleted_at`に現在の日時を登録させる。
```php
public function cancelSubscription(): RedirectResponse
{
    $user = Auth::user();
    if ($user->subscribed('default')) {
        $user->subscription('default')->cancelNow();

        // 該当するレコードをsubscriptionsテーブルから論理削除
        DB::table('subscriptions')->where('user_id', $user->id)->update(['deleted_at' => now()]);

    }
    return redirect()->route('subscriptions.create')->with('message', 'サブスクリプションがキャンセルされました。');
}
```

以上。
【ChatGPT無】に歌詞の作成をやってもらおう。


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

　今回は、歌詞の作成をChatGPTにやってもらいます。程度は推して知るべしですがw

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　さて、歌詞の作成ですけど、
　　私は、なんも知りませんわw

　だから、
　　何をどうしたら？状態ですw

　なので、
　　まずは、
　　　そこから
　　　　ChatGPTさんに
　　　　　お尋ねします。

　とりあえず、Promptです、
```Text:歌詞作成を知りたいPrompt
# 目的
歌詞を作成したいです。

# 役割
あなたは、テンポのいい歌詞を書き続けてきた作詞家です。

# 指示
歌詞を作成するための質問を箇条書き（説明不要）でお願いします。
```
　これで
　　出力されたのが
　　　こちら。
```Text:Promptに対する回答
もちろん、歌詞を作成するための質問を以下に示します。

1. 歌のテーマは何ですか？
2. 歌詞の雰囲気やムードはどのようにしたいですか？
3. 歌の主人公や登場人物の特徴を教えてください。
4. 歌の構造はどうしたいですか？（例: バース・コーラス・バース・コーラスなど）
5. 重要なメッセージや感情を伝えたい場合、それは何ですか？
6. 歌の長さやサビの繰り返し回数はどのようにしたいですか？
7. 特定の言葉やフレーズを含めたい場合、それはありますか？
8. お好きな音楽ジャンルやアーティストの影響を受けたい場合、教えてください。
9. 歌詞に含めたい具体的なイメージや物語要素はありますか？
10. 歌詞の言語やリズムの特徴に関する要望がありますか？

これらの質問に答えていただければ、テンポのいい歌詞を作成するのに役立ちます。どのような歌詞を作りたいか詳細を教えてください。
```
　これに対して、
　　以下の回答を
　　　入力しました。
```Text:回答
テーマは、パスタ
ムードは、テンポよく
主人公は、野菜嫌いな子ども
構造は、任せます
メッセージは、野菜が美味しい
サビは3回、長さはほどほど
フレーズは、なし
ジャンルは、任せます
イメージは、野菜が食べやすい感じ
歌詞の言語は日本語、リズムは任せます
```
　この回答に
　　ChatGPTさんは
　　　歌詞を作ってくれます。

　上記の情報で
　　Regenerateを
　　　三回繰り返してみました。

```Text:歌詞その１
理解しました。パスタをテーマに、テンポのいい歌詞を作成します。以下は歌詞の一部です。リズムやジャンルに合わせてアレンジできます。

---

（サビ1）
パスタが食べたい
野菜が苦手なんだ
でも今日は違う
美味しく食べよう

（サビ2）
パスタが魔法
野菜も友達
笑顔で食べよう
楽しく食べよう

（サビ3）
パスタは奇跡
野菜も愛せる
一緒に食べよう
美味しい夢の中

（バース1）
子どもの頃、野菜が敵
でも今日は新しい出発
パスタの中に隠れてる
野菜の味、びっくりするかも

（バース2）
トマトとベーコン、チーズもたっぷり
パスタの魔法で全部変わる
お皿に笑顔広げて
野菜も友達ってわかる

（バース3）
ブロッコリー、ニンジン、ピーマンも
パスタと仲良くなれるよ
彩り豊かな食卓で
野菜も美味しいって思える

（サビ1を繰り返す）

---

この歌詞を元にして、リズムやジャンルに合わせて曲を制作することができます。お楽しみください！
```

```Text:歌詞その２
了解しました。パスタをテーマにした、テンポのいい歌詞を作成します。以下が歌詞の一部です：

サビ1:
野菜が苦手な子どもよ
パスタが君の味方だ
カラフルなソースで包まれて
野菜が美味しいってわかるんだ

ヴァース1:
グリーンのブロッコリー、オレンジのキャロット
色とりどりの野菜、食べるのが楽しいよ
トマトの赤さ、パプリカの甘さ
パスタと一緒に、ほら、飛び込んでみて

サビ2:
野菜が苦手な子どもよ
パスタが君の味方だ
シャキシャキのクリスピーな食感
野菜が美味しいってわかるんだ

ヴァース2:
チーズをたっぷり、ソースもいろいろ
パスタと野菜、最高の組み合わせ
ブロッコリーの緑、ズッキーニの軽さ
パスタが笑顔、野菜が元気さ

サビ3:
野菜が苦手な子どもよ
パスタが君の味方だ
一皿の中に、夢が広がって
野菜が美味しいってわかるんだ

このような歌詞の一部を提供しました。構造やリズムについては、アーティストやプロデューサーとの共同作業で調整できます。ご希望に合わせてカスタマイズできますので、何か追加や変更が必要な場合はお知らせください。
```

```Text:歌詞その３
理解しました。パスタをテーマにした、テンポのいい歌詞を作成します。以下は歌詞のスケッチです：

サビ1:
野菜が嫌いなこの子ども
でもパスタの中に隠してみよう
トマトソースでごまかして
野菜のおいしさを教えよう

サビ2:
パスタがカラフルに踊る
野菜たちも笑ってるよう
お皿に並べた彩りが
野菜の魅力を伝えるよ

サビ3:
パスタの中に隠れた野菜
美味しさに驚いた子どもたち
食べることで世界は広がり
野菜の虜になる日が来る

このスケッチを元に、歌詞の構造や具体的な言葉を詰めていくことができます。ジャンルやリズムに合わせて調整し、歌詞が完成するまでお手伝いできますので、どのように進めていきたいか教えてください。
```
***
　どうでしたか？

　ごらんのとおり、
　　程度は、推して知るべしですw

　まぁ、
　　たいしたPromptでは
　　　ありませんから、
　　　　Prompt育成して
　　　　　精度を高めれば、
　　　　　　いい歌詞が
　　　　　　　できるかも。

　今回は、以上。
院試体験記

# はじめに
東京大学 理学系研究科物理学専攻を受験しました。(内部生)
A2サブコース(素粒子・原子核実験)第一志望、A4サブコース(物性実験)第二志望の筆者の院試体験記です。理論系の人は参考にならないと思いますが、実験系を希望している人の参考になれば嬉しいです。
結論から言うと、研究室見学には行きましょう。早めに勉強を始めましょう。そして友達は大事です。
# 院試勉強
### 6月まで 
6月まではほぼ何もしていませんでした。TOEFLのReadingの問題集と、詳解と演習大学院入試問題〈物理学〉(以下黄色い本)という本だけ買っておきました。一応3年の春休みに物理学演習を解き直したりしてみたのですが、面倒くさくて物理学演習1,2のみで力尽きたので意味なかったです。
また、4Sセメスターには有志が院試ゼミを開講していました。自分は授業が入っていたのと、特別実験が忙しかったのと、~~面倒くさかったので、~~ 参加しませんでしたが、参加したほうが良いと思います。これは後でも述べますが、Driveの過去問の解答は当てにならないためです。
### 7月
7月中旬になると授業も終わり、流石にやばいという焦燥感から、買った2冊の本をやり始めました。英語に関しては、そんなに難しくないのと、配点が英語100、専門科目400ということからほとんどやりませんでした。物理は本当に忘れていて、統計力学は、分配関数の出し方から忘れている始末。しかし、7月中には黄色い本は終わりませんでした。
### 8月
8月の第1週のうちに黄色い本は終わらせて、過去問を解き始めました。過去問は新しい方から順番に1日1年分解いていきました。しかし、解答が無いので解いたら解きっぱなしでした。ゼミに参加するか、一緒に解いてくれる友だちがいると良いと思います...
物理は最近のほうが若干難しい気がしたので、数年分やったら、それ以上昔の過去問はやらずにもう一度解き直しました。数学は年によって難しかったりしますが、複素積分と線形代数が主なので、出題範囲はかなり狭く、何年分もやる必要はないかなと感じました。
結局物理は9年分、数学は4年分だけ解きました。
# 試験本番
### 筆記
午前中に約2時間でTOEFL ITP、午後は13:30から17:30で専門科目の試験でした。
英語はリスニングの最初の方が緊張して聞き取れず、10問目あたりから落ち着いて聞けました。筆記はかなり簡単だった(感覚)ので、おそらく
リスニング 7-8割
文法と読解 9割ちょい
とかだと思います。
専門科目は量子力学の最後の問題以外一応全部解いたのですが、全体的に合ってる自信がないので、おそらく
量子力学 6-7割
統計力学 7-8割
電磁気学 8-9割
物理数学 7-8割
で合計7割くらいだと思います。(自己採点ではなく解いた感覚)
結果が出たらまた書きます

#### 追記 開示した試験の結果(2023.10.11)
試験の点数を開示したら
英語 80点
量子力学 55点
統計力学 70点
電磁気学 100点
物理数学 87点
計 392/500
でした。
A2,A4サブコースの場合、8割弱でも筆記は通るようです。
同じ学科の人は量子力学と統計力学でも100点近く取っていたので、ちゃんと勉強していれば取れるのだと思います。

### 口述試験
口述試験に関しては内容を話すことはできないのですが、サブコースによって全然違いました。僕の場合、先にA4サブコースで受けて、なるほどこういう感じなのか、と思ってそのままA2サブコースに行ったら全然違う形式で面食らいました。
理論系は分かりませんが、実験系は口述で落としにきている感じはしなかったので、そこまで心配しなくてもいいと思います。

# 結果
第一志望のサブコースの第一志望の教授に配属になりました。第一志望の教授に配属になるかどうかは、その年の志願者の偏りの部分が大きいと思うので、運が良かったのだと思います

# アドバイス
### 研究室見学
研究室見学は絶対にしたほうが良いです。ウェブサイトだけでは分からない、教授や院生たちの雰囲気が分かります。
### 早めに対策を始める
僕の場合は特に、長い時間勉強をするのが苦手なタイプで、高校受験も大学受験も早めに勉強を始めてそのまま逃げ切るスタイルでした。今回は追い込み型でしたが、そんなに長い時間は勉強できませんでした。
追い込むのが得意な方は8月からとかでもいいかもしれませんが、早めに、せめて4Sセメスターが始まったくらいから準備しておくと心の余裕ができると思います。
### 一緒に勉強する友達を作る
院試の過去問は解答が無いことが多いです。学科のdriveにありましたが、最近のものはなかったり、間違えていたりします。院試ゼミに参加したり、仲の良い友達と一緒に解いたりするのをおすすめします。
### 外部の英語試験は早めにやっておきましょう
来年度からTOEFL ITPではなくなり、外部の英語試験のスコアを提出するようになるらしいです。詳しいことは既に物理学専攻のHPに書いてありますが、TOEFLとTOEICどちらでもいいらしいです。
https://www.phys.s.u-tokyo.ac.jp/g_info/38517/
アラートは最外方につけないとうまく挙動しなかった話

```swift
        .alert(isPresented: $isShowingAlert) {
            switch viewModel.currentAlertType {
            case .deleteConfirmation:
                return Alert(
                    title: Text("警告"),
                    message: Text("データが削除されますが、よろしいですか？"),
                    primaryButton: .destructive(Text("削除"), action: {
                        if let logID = viewModel.editingLog?.id {
                            DispatchQueue.main.async {
                                navigationManager.path.removeAll()
                                viewModel.editingLog = nil
                            }
                        }
                    }),
                    secondaryButton: .cancel(Text("キャンセル"))
                )
            case .unsavedChanges:
                return Alert(
                    title: Text("警告"),
                    message: Text("内容は保存されませんがよろしいでしょうか？"),
                    primaryButton: .destructive(Text("はい")) {
                        presentationMode.wrappedValue.dismiss()
                    },
                    secondaryButton: .cancel(Text("キャンセル"))
                )
            case .saveFirst:
                return Alert(title: Text("警告"), message: Text("先に釣行記録を保存してください。"), dismissButton: .default(Text("了解")))
            default:
                return Alert(title: Text("エラー"), message: Text("不明なエラーが発生しました。"), dismissButton: .default(Text("了解")))
            }
        }
```

このようなアラートをSwich文で作りました。というのも一つの画面に複数のアラートがあった場合、SwiftUIでは一つのアラートしか表示されないらしく思ったような実装ができなかったからです。

そしていざ実行、しかしアラートが表示されず、画面をスクロールした瞬間にアラートが表示されるという現象になりました。

##対応

アラートのモディファイアが最外方についていなかったので最外方のVstackに移動した。
これでいけました。
Pythonで為替レートの履歴でデータ分析してみた

# はじめに
ドル円レートはメディアで「円高で」「円高の影響で」という耳にタコができるくらい上昇しています
新発売のiPhohe15はアメリカドルで799ドルで14と変化ないですが、日本円だと14から値上がりして発売されます（2023/09/18時点)

一方で、対ユーロの為替はどうなのか見てみました
ここでユーロ円の為替レートを見れます

https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/eurofxref-graph-jpy.en.html

このサイトがXMLで日付毎の為替レートを提供しているのでこれを使用してデータ分析していきます

https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/jpy.xml

# 環境構築
```
pip install requests pandas matplotlib japanize-matplotlib beautifulsoup4
```
pyenv、pipenvなどの仮想環境内で開発するとローカルが汚れません

# データ可視化
```python:analysis.py
import requests
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
from bs4 import BeautifulSoup as bs

url = 'https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/jpy.xml'
res = requests.get(url)

# BeatutifulSoupでXMlを解析
soup = bs(res.content, 'xml')

# Datasetタグ要素を取得
dataset = soup.find('DataSet')
series = dataset.find('Series')
obs = series.findAll('Obs')

rate_list = []
for ob in obs:
    # 日付とレートをリストに追加
    time_period = ob.get('TIME_PERIOD')
    if '2023' in time_period:
        rate = ob.get('OBS_VALUE')
        rate_list.append((time_period, float(rate)))

# リストをデータフレームに変換
df = pd.DataFrame(rate_list, columns=['TIME_PERIOD', 'OBS_VALUE'])

# データの可視化
plt.figure()
plt.title('ユーロ為替レート')
plt.xlabel('日付')
plt.ylabel('為替')
plt.grid(True)
plt.tight_layout()
# X軸のメモリ
df['TIME_PERIOD'] = pd.to_datetime(df['TIME_PERIOD'])
# Y軸のメモリ
y_min = 5 * (df['OBS_VALUE'].min() // 5)  # //:5で割り切る
y_max = 5 * (df['OBS_VALUE'].max() // 5) + 5
plt.yticks(range(int(y_min), int(y_max), 5))
plt.plot(df['TIME_PERIOD'], df['OBS_VALUE'], marker=None, linestyle='-')
plt.savefig("rate.png")
plt.show()
```
![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/2d8d7c64-81cb-c7a9-3b9c-3b01ac195e37.png)

前日との為替の増減を取得して、3軸で表示させると増減の変化が分かりやすいかもしれません
```python
df['DIFF'] = df['OBS_VALUE'].diff()
```

# 統計情報を取得
```python:analysis.py
# ... 先ほどのplt.show()に続けて
print(df['OBS_VALUE'].describe())
# count    182.000000
# mean     149.205330
# std        6.630735
# min      137.930000
# 25%      143.195000
# 50%      149.000000
# 75%      156.232500
# max      159.150000
```
統計情報を見ると
平均値が149.20円で
第一四分位数が143.19円
第三四分位数が156.23円なので
143円〜156円に長く推移していることになります
ドル円との統計情報を比べるとどちらが値動きが激しいか実感できると思います
BundlerとRubygemsの依存性によるトラブルシュート

## 環境
Ubuntu20.4
Ruby2.6.0

## はじめに

自分の開発環境から別の環境にRailsのソースを移行して、bundlerを動かそうとしたところ、動かないといった問題に遭遇したため、そのトラブルシュートの記事です。

Bundelrの公式サイトのBlogによると、この問題に関する是正内容が、2019年1月4日の記事で発表されています。わりと古い内容なので、今更な話題ではあります。

https://bundler.io/blog/2019/01/04/an-update-on-the-bundler-2-release.html

## 内容

Bundlerのバージョンを確認したところつぎのエラーが発生しました。
```
$bundle -v
Traceback (most recent call last):
        2: from /usr/local/rbenv/versions/2.5.0/bin/bundle:23:in `<main>'
        1: from /usr/local/rbenv/versions/2.5.0/lib/ruby/2.5.0/rubygems.rb:308:in `activate_bin_path'
/usr/local/rbenv/versions/2.5.0/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
```

こちらの環境にbundlerはちゃんとインストールされています。

```
$gem list | grep bundler
bundler (2.0.2)
```

自分の開発環境のbundlerのバージョンを確認したところ、移行先の環境とbundlerのバージョンが異なることが判明しました。

```
$bundle -v
Bundler version 1.17.2
```

結果的には、別環境のbundlerをv2からv1にバージョンダウンさせることで問題は解決されました。

```
$bundle install -v '1.17.2'
$bundle -v
Bundler version 1.17.2
```

## 原因は？

bundlerとrubygemsの依存性の問題があったようです。移行先の環境では、rubygemsが2.7、bundlerが2.0.2で、自分の環境では、rubygemsが2.6、bundlerが1.17.2でした。このバージョンどうしの組み合わせでは問題はないのですが、bundlerが2.0.2の環境にrubygems2.6を持ち込んだところ、bundlerが動かなくなりました。そもそも、bundler v1では、rubygemsが2.7以降が動かないようです。

bundlerをrubygems2.7以降に対応させるには、bundler v2にバージョンアップさせる必要があります。rubygemsを2.7より古いバージョンで使いたい場合は、逆にbundlerをv1にバージョンダウンさせて対応せざるを得ないことになります。
Portable modeのVScodeも自動アップデートしたい

# ポータブルモードのVScodeは自動アップデートしてくれない
困った。
検索するとパワーシェルスクリプトが出てきた。
こいつを遣えればいいんだけど、素直に動いてくれないのでガイド作成。

# コード
https://github.com/microsoft/vscode/issues/56326
ここにあるようなものをWindows環境のPowershellで動くようにしたもの。

```powershell:vscode_update.ps1
# Remove temp file from portable user data
Remove-Item -Recurse -Force -Path $PSScriptRoot"/data/user-data" -Include @("Backups", "Cache", "CachedData", "GPUCache", "logs")

# Download latest stable build
curl.exe -L "https://code.visualstudio.com/sha/download?build=stable&os=win32-x64-archive" -o $PSScriptRoot"/stable.zip"

# 危険なのでコメントアウト。必要なければそのままで。
# Delete anything except user data, update script and downloaded zip file
# Get-ChildItem -Path $PSScriptRoot -Exclude @("data", "_LocalHistorys", "livereloadready-workspace.code-workspace", "vscode_update.ps1", "vscode_update202309", "stable.zip") | Remove-Item -Recurse -Force -Path $PSScriptRoot

# Unzip it
Expand-Archive -Path $PSScriptRoot"/stable.zip" -DestinationPath $PSScriptRoot -Force

# Delete downloaded package
Remove-Item -Path $PSScriptRoot"/stable.zip"

Pause
```

「vscode_update.ps1」というファイル名でVScode本体のフォルダに配置すること。

# 運用方法
Powershellは色々セキュリティ面で面倒っぽい。素直にダブルクリックで動いてくれない。
なので、Windowsのショートカットファイルを作成して、そいつをワンクリックでアプデを行う運用を目指す。

ショートカット名：
```vscode_update202309```
リンク先：
```C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Unrestricted -File "C:\@work\Program Files\VSCode\vscode_update.ps1"```

リンク先は各自直してね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/6978d410-06f5-9a1e-be19-87ebd686e1b4.png)

# 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/eea90bfd-f077-ff04-0704-6af8ff13cc52.png)

とりあえず、VScodeを使っていて「アプデがあります」と出たらショートカットをクリックすることでの運用でいけそうだ。
少しだけ楽になった。
REPLの逆のモード名は不明ですね。

# 課題

REPLの逆を示す言葉がわからない！！

# 結論

まだ調査中、誰か教えてください。

# 概要

- プログラムの開発環境として、コンパイラとインタプリタがある。今回はここには触れないが、このように**対義語が定義されていると助かる。**
- プログラムの実行モードとして、ファイルを読み込んで実行するモードと、対話的にスクリプトを解釈していくモードがある。
- 対話的に解釈していくモードはいくつかの名前がある
    - 対話モード
    - REPL [= Read-Eval-Print Loop] (Node.js)
    - Interactive mode (Ruby, Python等)
    - Immdediate Mode (Unity, Basic等)
- 一方、ファイルを解釈していくモードは名前を調べてもなかなか出てこない
    - Script mode (Python? [1])

唯一、Pythonの非公式記事のいくつかでScript modeなる単語を発見したけど、スクリプト言語でスクリプトモードって変じゃない？って思ってる。



[1] https://stackabuse.com/python-programming-in-interactive-vs-script-mode/
【docker】compose.yamlから別のYAMLを読み込む方法

# Docker compose v2.20 にてYAMLファイルでincludeのサポートが開始

Docker compose v2.20にてYAMLファイルから別のYAMLファイルを読み込むことができるようになりました。（ちなみにDocker Desktopは4.22からだそうです）

今回はこのinclude機能を試してみます。

- <b>リリースノート</b>
    - [v2.20.0 release notes](https://github.com/docker/compose/releases/tag/v2.20.0)

- <b>ドキュメント</b>
    - [Include](https://docs.docker.com/compose/compose-file/14-include/)


# 設定サンプル（in YAML）

```shell
.
├── compose.yaml
└── service_b
    └── compose.yaml
```

```yaml:compose.yaml
include:
  - ./service_b/compose.yaml

services:
  service_a:
    image: busybox
    depends_on:
      - service_b
```

```yaml:./service_b/compose.yaml
services:
  service_b:
    image: busybox
```

上記は、`./service_b/compose.yaml`で読み込んだ`service_b`が起動してから`service_a`を起動する設定です。

# まとめ

include機能により、DBコンテナを別で立ち上げたい、公式のYAMLをそのまま使いたいなど、多様なニーズに対応できるようになりました。
【Tableau】ボタン型フィルターによるデータ切り替えのやり方

今回、Tableauの自己学習を行い、自分の振り返りを兼ねて拙い文ですがまとめてみました。

**使用環境**
・Tableau Public（無料）

**使用データ**
・サンプル　-　スパーストア

今回使用環境の準備、サンプルデータの準備の方法に関しては省略させていただきます。


## やりたいこと
**ゴール：下記画像のように見たい地域のボタンを押すことでデータのビジュアライズをできるようにする**

![スクリーンショット 2023-09-20 21.53.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591484/0a74e451-1376-775e-8c76-4316e7a335e3.png)

地域をフィルターの方に持っていけば、実装自体は簡単だが、今回は見栄えと操作性向上のため今回の実装を行う。

**手順１:**
・大元となるボタンの部分を下記のように列に地域、マークを棒にして作成。
![スクリーンショット 2023-09-20 22.06.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591484/39ada0bf-1d62-9c3e-815a-51a32f470644.png)


**手順2:**
・ボタンを作成したシート上（シートの名前をボタンとする）で計算フィールドで１とだけ記入した数式だけを作成。（名前自体はなんでもよい）
今回はbuttonと記入

![スクリーンショット 2023-09-21 9.40.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591484/884cc26d-b5ff-f813-84ff-dda4c479e041.png)

これをサイズに配置、右クリックしディメンションに変更

**手順3:**
フィルター先のシートとなる売上データを準備
（シート名は売上と記載）
![スクリーンショット 2023-09-21 10.00.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591484/50267159-9309-0df6-9f8b-bda95e6a02ea.png)

**手順４:**
ダッシュボードに手順１、３で作成したものを表示させる。
タブ上のダッシュボード>アクション>アクションの追加＞フィルター
と選び下記画像のようなものが表示される。
![スクリーンショット 2023-09-21 10.04.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591484/3d7dd3b5-51b0-4b03-30cb-902c3170229f.png)

**手順５:**
ソースシートの方にボタンのみチェック。
ターゲットシートの方には「表示を切り替えるシートを選択」。つまりここでいうと売上のみにチェックをつける。


こうすることで地域別の売上データを時系列順に確認することが可能となる。

## あとがき
今回アクション機能を使いシートとシートを連動させてデータビジュアライズを行った。
少しでも参考になれば幸いです。
【AWS Amplify】functionのリトライ回数を変更したい

## この記事の対象となる方

- AWS Amplifyを使用中
- S3のCreateObjectやSQS等に反応するLambda(function)を作成し、デプロイしている
- カスタムリソース(`amplify add custom`)を追加して、S3のCreateObjectのトリガやSQSを定義し、上記のLambdaと関連付けている
- デフォルトのリトライ回数は2だが、要件によって回数を変えたい (多分「0にする」を最も要求されそう)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267110/97052a32-6a8c-b66c-c9cb-6fe00f434099.png)
    - ↑↑ この「再試行」です

## どうすればリトライ回数を変更できるか

### 結論

CloudFormation(`[functionName]-cloudformation-template.json`)に加筆するしかありません。
- `Resources`に以下を追加します
- 下記は`MaximumRetryAttempts`に0を設定してリトライ回数を0にしています
    ```JSON
    "AsyncConfig": {
      "Type": "AWS::Lambda::EventInvokeConfig",
      "Properties": {
        "FunctionName": {
          "Ref": "LambdaFunction"
        },
        "MaximumEventAgeInSeconds": 21600,
        "MaximumRetryAttempts": 0,
        "Qualifier": "$LATEST"
      }
    }
    ```

- push後

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267110/20ffebab-8f29-388e-b3f7-c3e6da3ad342.png)
    やったね🎉🎉🎉

### 注意

`amplify configure`で設定しているIAMユーザーの権限によっては、デプロイに失敗します。

この定義をpushする際に必要となるのは、`lambda:PutFunctionEventInvokeConfig`です。適宜IAMのインラインポリシーとして追加してください。

## 需要がない？

色々な情報を漁りましたが、解決法は見つからなかったので、CloudFormationのドキュメントを参照して試行錯誤しました。

意外とそんな要件ないのかも・・・。

それでは皆様、良いAmplifyライフを。