OmniAICreator/Qiita-1.07M huggingface dataset:
【React / JS】Enterキーで入力を確定する方法【日本語入力対応】

# 完成イメージ

|   ![React-Todo-App.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/48a9377a-235d-56f4-86b9-bf7e277ed3de.gif)  |
| :-: |
|  ボタン無し・Enterキーで入力を確定させる |

https://github.com/Kohki-Takatama/react-todo-app

# この記事について

入力を確定させる時、ボタンをクリックさせるのは手間です。
- `Enter`キーを押したら入力を確定したい
- ただし、日本語変換を確定させる`Enter`には反応したくない

そんな需要に応える記事です。

Reactを例に書きますが、バニラの（素の）JavaScript / HTMLでも同様の考え方で対応できます。

# 登場する技術等

|                    技術                     |                                                 説明                                                  |
| :---------------------------------------: | :-------------------------------------------------------------------------------------------------: |
|                `onKeyDown`                | 何かしらのキーが押されたときに発火（発動）するイベントハンドラ。React固有？<br>バニラのJSで使いたい場合は`addEventListener("keydown", ()=>{})`を使おう |
| `onCompositionStart` / `onCompositionEnd` |                                   変換が開始 / 終了したときに発火（発動）するイベントハンドラ                                   |
# `Enter`で入力を確定

こちらは簡単です。

Reactの例

```jsx
// JS部分
function handleKeyDown(event) {
  if (event.key === 'Enter') {
    // 入力を確定したときの処理（送信・表示・入力フォームのクリアなど）
  }
}

// HTML部分
<input onKeyDown={handleKeyEvent}>
```

# 日本語変換の確定と、入力の確定を判定する

先程のコードは、`Enter`を押すと問答無用で「入力を確定したときの処理」を行います。

英語入力であれば問題ないのですが、日本語の入力は「変換を確定させる`Enter`」があるため、この2つの`Enter`を仕分ける必要があります。

変換中かどうかを「変換の開始`onCompositionStart`」と「変換の終了`onCompositionEnd`」を使って管理・判定します。

Reactの例
```jsx
// JS部分
const [isComposing, setIsComposing] = useState(false);

function handleKeyDown(event) {
  if (event.key === 'Enter' && !isComposing) {
    // 入力を確定したときの処理（送信・表示・入力フォームのクリアなど）
  }
}

// HTML部分
<input
  onKeyDown={handleKeyDown}
  onCompositionStart={() => setIsComposing(true)}
  onCompositionEnd={() => setIsComposing(false)}
/>
```

___

以上、Enterキーで入力を確定する方法でした。

冒頭のイメージは、以下のリポジトリに置いておきます。

https://github.com/Kohki-Takatama/react-todo-app

コードを詳しく見たい方はどうぞ。`src/App.jsx`です。
<br>
<font color='grey'>マサカリ、受け付けてます_(´ཀ`」 ∠)_</font>

<font color="red">やってみての感想、ストック、いいねも大歓迎です！</font>

# 参考

https://developer.mozilla.org/ja/docs/Web/API/Element/keydown_event

https://developer.mozilla.org/ja/docs/Web/API/Element/compositionstart_event
マルチパッケージのFlutterアプリでのassetの扱い

## はじめに

melosを使ったマルチパッケージアプリで、アプリのパッケージではなく、featureパッケージなどにassetを起きたい時の方法のメモです。

https://github.com/yumemi-inc/flutter-mobile-project-template

## そのまま使う時

feature_settingというパッケージでyumemi_logo.pngという画像を使いたい場合

いつも通りpubspec.yamlにassetsのパスを指定
```yaml:packages/features/setting/pubspec.yaml
flutter:
  assets:
    - assets/
```

asset名の他に、packageを指定する。

```dart:利用するdartコード
Image.asset(
  'assets/yumemi_logo.png',
  package: 'features_setting',
),
```

## flutter_genを使う場合

flutter_genを使う場合

https://pub.dev/packages/flutter_gen

pubspec.yamlでpackage_parameter_enabledを指定する。
```yaml:packages/features/setting/pubspec.yaml
flutter:
  assets:
    - assets/

flutter_gen:
  assets:
    outputs:
      package_parameter_enabled: true
```

```dart:利用するdartコード
Assets.yumemiLogo.image(),
```

## 応用：汎用assetをパッケージにまとめる

ゆめみのテンプレートプロジェクトではdesignsystemパッケージに汎用assetを置く作りにしています。

やり方は、flutter_genを使う場合をベースに、以下をlibに追加します。

```dart:packages/cores/designsystem/lib/common_assets.dart
import 'package:cores_designsystem/src/gen/assets/assets.gen.dart';

// パッケージ毎に生成されるAssetsクラスと区別するため、直接exportせず別名をつける
typedef CommonAssets = Assets;
```

他のパッケージからこんな感じに使えます

```dart
import 'package:cores_designsystem/common_assets.dart';

class LicensePageRoute extends GoRouteData {
  const LicensePageRoute();

  static const path = 'license';

  @override
  Widget build(BuildContext context, GoRouterState state) {
    return LicensePage(
      applicationIcon: CommonAssets.yumemiLogo.image(height: 100, width: 100),
    );
  }
}
```

## まとめ

メモ程度ですが
【備忘録】Google ColabでStreamlit【widget編】

# はじめに

Google ColabでStreamlitを使ってWebアプリを作成し、様々なwidgetについて試してみます。

Webアプリの起動までは以下のページを参考にしてください。

https://qiita.com/firesign2023/items/29a219b88b5b8f4ee502

# Button

シンプルなボタン。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/75538fe7-2bc4-79e7-51f0-3e11ddea76b6.png)


~~~python
  st.button("Click me")  
~~~

押されたときの処理は以下の様に書きます。

~~~python
clicked = st.button('Click me')
if clicked:
    # ここにクリックされたときの処理を書く
~~~

# Download Button

名前の通り、ボタンを押した時にファイルをダウンロードできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/c297b097-d9b5-461e-45f5-e94289d3bad6.png)

~~~python
  # ダウンロードする内容を準備（ここでは文字列をバイト列にエンコードする例）
  file_content = "Hello, world!"
  file_bytes = file_content.encode('utf-8')
  st.title('Download Button')
  st.download_button("Download file", file_bytes)
~~~

# Link Button

ボタンを押した時にリンク先に移動する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/e680f321-8cfb-9b41-9b36-49e8621a5d24.png)


~~~python
  url = "https://www.google.com/"
  st.title('Link Button')
  st.link_button("Google", url)
~~~

# Checkbox

チェックボックス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/150c5c2f-aa7c-2a35-c1c2-bf74c59a3a32.png)

~~~python
st.checkbox("I agree")
~~~

# Toggle Button

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/9d4e9b79-4fc3-a417-ad67-1f5d1587e37e.png)

~~~python
st.toggle("Enable")
~~~

# Radio Button

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/16f9115c-3438-08f5-b565-81a16558c2dd.png)


~~~python
st.radio("Pick one", ["cats", "dogs"])
~~~

# Slider

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/0aa29308-f7db-aef2-e82c-02969115e19c.png)


~~~python
st.slider("Pick a number", 0, 100)
~~~
Google Cloudの監視系サービスの違いとユースケース

## はじめに
Google Cloudには、さまざまな監視・ログ管理サービスがあります。それぞれのサービスは特定のニーズに応じた機能を提供し、クラウド環境の運用とセキュリティを最適化します。以下に、主要な監視系サービスの違いとユースケースを紹介します。

## 1. **Google Cloud Operations Suite Audit Logs**
Google Cloud Operations Suite Audit Logsは、Google Cloudのリソースに対するロギングサービスです。誰が何をしたのか、いつ何が起こったのか、それが何を意味するのかなどを含む詳細な監査ログを提供します。

- **主な機能**:
  - **管理アクションログ (Admin Activity Logs)**: リソースの管理操作に関するログ。ユーザーがどのリソースにアクセスし、どのような操作を行ったかを記録します。
  - **データアクセスログ (Data Access Logs)**: リソースを読み取ったり書き込んだりする操作をログに記録。誰がいつどのデータにアクセスしたかを追跡できます。

- **ユースケース**:
  - **セキュリティ監査**: データリソースのセキュリティ監査を実施し、不正アクセスや不要なアクセスを検出。
  - **コンプライアンス報告**: 監査ログを利用して、コンプライアンス報告に必要なデータを提供。
  - **アクセス管理の追跡**: IAMポリシーと組み合わせて、誰がどのリソースにアクセスしたかを確認し、適切なアクセス管理を実現。

## 2. **Google Cloud Operations Suite Monitoring**
Google Cloud Operations Suite Monitoringは、Google Cloudのリソースの監視、洞察、アラートを提供するサービスです。インフラストラクチャやアプリケーションのパフォーマンスと可用性を監視しますが、ユーザーの具体的なアクションを追跡するためのものではありません。

- **主な機能**:
  - **パフォーマンス監視**: インフラストラクチャやアプリケーションのパフォーマンスをリアルタイムで監視。
  - **アラート設定**: 異常が検出された場合にアラートを設定して通知。
  - **メトリクス収集**: カスタムメトリクスを設定し、詳細なパフォーマンスデータを収集。

- **ユースケース**:
  - **システムパフォーマンスの最適化**: BigQueryクエリスロットの使用状況を監視し、リソースの最適化を図る。
  - **トラブルシューティング**: リソースの異常を早期に検出し、問題の特定と対応を迅速化。

## サービスの比較表

| サービス名                             | 主な機能                                                       | 主なユースケース                                    |
|----------------------------------------|----------------------------------------------------------------|---------------------------------------------------|
| Google Cloud Operations Suite Audit Logs | 管理アクションログ、データアクセスログ                           | セキュリティ監査、コンプライアンス報告、アクセス管理の追跡 |
| Google Cloud Operations Suite Monitoring | パフォーマンス監視、アラート設定、メトリクス収集                   | システムパフォーマンスの最適化、トラブルシューティング       |

## ユースケースの具体例

#### シナリオ: スタートアップ企業におけるセキュリティポリシーの導入
あなたのスタートアップ企業は、正式なセキュリティポリシーを導入していません。現在、社内の誰もがGoogle BigQueryに保存されたデータセットにアクセスできます。各チームは自由にサービスを利用することができ、ユースケースを文書化していません。この状況でデータウェアハウスのセキュリティを確保するためには、全員が何をしているのかを確認する必要があります。

**対応策**:
1. **Google Cloud Operations Suite Audit Logsを使用してデータアクセスを確認**:
   - **理由**: Audit Logsは、ユーザーがどのデータにアクセスしたかを詳細に記録します。これにより、全員の操作履歴を追跡し、不正アクセスや不要なアクセスを検出できます。

2. **Google Cloud Operations Suite Monitoringを使用してリソースの使用状況を監視**:
   - **理由**: クエリスロットの使用状況やインフラストラクチャのパフォーマンスを監視し、リソースの最適化と異常の早期検出が可能です。

## まとめ
Google Cloud Operations SuiteのAudit LogsとMonitoringは、クラウド環境の監視とセキュリティの確保に不可欠なツールです。これらのサービスを適切に活用することで、システムの安定性と効率性を向上させ、セキュリティポリシーを実現できます。
Notion カテゴリごとにグループ化と並べ替え方法


### 【手順1】データベース：インライン選択
- 左の[+]をクリック
- データベース：インライン選択

![screenshot_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/293918d0-a0ce-ee20-c293-484f1692e985.png)



### 【手順2】
- サイドピークを開く
- プロパティ追加
- オプションを選択

![screenshot_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/abfd008a-1e8b-ff65-89dd-c67f4e826a30.png)


### 【手順3】
- 3点クリック
- グループ選択

![screenshot_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/981c13f6-14da-b882-1d7d-b219ae1c305a.png)

<br>

- グループ化したい列選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/17be5cd0-3a89-e271-64c3-f7183dac1863.png)



### 【手順4】
- 手動でグループ並び替え
![screenshot_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/e124d274-cec6-b1e5-4095-2f5249804424.png)


### 完成形
![screenshot_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/bde99ff8-8339-39fa-da1e-ee59ee2c7ceb.png)

### 参考リンク
Notion初心者使い方・始め方【タスク管理・データベース】
https://www.youtube.com/watch?v=vUmDku3wiHI
38：00～

【Notion】ついに実装された神機能、データベースのグループ化
https://www.youtube.com/watch?v=fs3Sc6JMlvs
Discover the Trend with VLONE Hoodies and Shirts

VLONE is more than just a brand; it’s a lifestyle. Known for its bold designs and unique streetwear aesthetics, VLONE has taken the fashion world by storm. The brand's iconic hoodies and shirts have become must-have items for fashion enthusiasts.

The Appeal of VLONE Hoodies
Bold Designs
VLONE hoodies are famous for their striking graphics and vibrant colors. These designs make a bold statement, allowing wearers to express their individuality. Each https://vlones.us/hoodie/ features unique artwork, often incorporating the brand's signature "V" logo.

Quality Materials
Comfort is a key factor in VLONE's appeal. The hoodies are made from high-quality materials, ensuring durability and comfort. The soft fabric and excellent craftsmanship make them a favorite among streetwear fans.

Versatility
VLONE hoodies are versatile and can be paired with various outfits. Whether you're dressing up for a casual day out or layering for a night event, these hoodies fit any occasion. Their adaptability adds to their widespread popularity.

Why VLONE Shirts Stand Out
Unique Graphics
VLONE shirts feature eye-catching graphics that set them apart from other brands. The designs often reflect cultural themes and artistic expressions, making each piece a work of art. These shirts are perfect for those who appreciate bold and unique fashion.

Comfortable Fit
Comfort is not compromised in VLONE shirts. Made from premium fabrics, they offer a soft and comfortable fit. The shirts are designed to provide ease of movement, making them ideal for everyday wear.

Limited Editions
One of the reasons VLONE shirts are so sought after is their limited edition releases. This exclusivity creates a sense of urgency and desire among fans. Owning a limited edition VLONE shirt is like having a piece of fashion history.

Styling Your VLONE Apparel
Casual Look
For a relaxed, everyday look, pair your VLONE hoodie with jeans and sneakers. This combination is effortless yet stylish, perfect for running errands or meeting friends.

Streetwear Chic
Elevate your streetwear game by combining a VLONE shirt with cargo pants and high-top sneakers. Add accessories like a cap or a chain to complete the look. This ensemble is ideal for making a statement on the streets.

Layering Technique
Layer your VLONE hoodie under a denim or leather jacket for a trendy look. This layering technique adds depth and dimension to your outfit, making it suitable for cooler weather and adding a stylish edge.

Conclusion
VLONE hoodies and https://vlones.us/t-shirt/ are more than just clothing; they are a statement of individuality and style. With their bold designs, high-quality materials, and versatile appeal, it's no wonder they have become a staple in streetwear fashion. Whether you're new to the brand or a long-time fan, incorporating VLONE pieces into your wardrobe is a surefire way to stand out. Embrace the trend and express your unique style with VLONE.
AWSスイッチロールの手順

### はじめに
スイッチロール用のIMA Userを発行した時に問い合わせがあるので、AWSやスイッチロールを初めて利用する人のために手順を纏めてみました。

### 説明用のログイン情報CSV（IAM User）
```DummyUser_credentials.csv
ユーザー名,パスワード,コンソールサインイン URL
DummyUser,Dummy&Pass,https://dummy111111111111.signin.aws.amazon.com/console
```

### 説明用のスイッチロールURL
```URL
https://signin.aws.amazon.com/switchrole?roleName=DummyRole&account=dummy222222222222
```

### AWSにログイン
CSVに記載されているURLにアクセスします。
なぜかCSVとは違うURLにアクセスして「ログインできません」と問い合わせされる事があります。

CSVのURLにアクセスするとアカウントIDが入力された状態になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3664223/c607fc48-e6bf-ff65-7432-87227d363b2b.png)

初めてログインする場合はパスワードの変更が必須です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3664223/00ca35b2-cd41-39a0-619f-c06543ac5c9e.png)
パスワード変更画面に記載されていませんが、下記のパスワードポリシーを満たすパスワードに変更します。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_passwords_account-policy.html#default-policy-details
> ・パスワードの文字数制限: 8～128 文字
> ・大文字、小文字、数字、英数字以外の文字 (! @ # $ % ^ & * ( ) _ + - = [ ] { } | ') のうち、最低 3 つの文字タイプの組み合わせ
> ・AWS アカウント 名または E メールアドレスと同じでないこと

### スイッチロール
AWSにログインした状態で、スイッチロール用のURLにアクセスします。
右下の「ロールに切り替える」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3664223/d042927f-3aed-4328-d3e7-127a045aa5fe.png)

スイッチロールが成功すると右上にロール名が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3664223/b3ef9b89-4ada-3306-f6ab-b72b686369bf.png)

### リージョンの変更
スイッチロールは成功したけど、「エラーが表示されます」もしくは「何もありません」という問い合わせがあります。
東京リージョンに環境を構築しているので、東京以外のリージョンになっている場合が多いです。

右上の歯車アイコンの右側にある地名をクリックして、東京リージョンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3664223/008e7117-6496-21e2-83d6-3b376b1e20f3.png)

### デフォルトのリージョンの設定
デフォルトのリージョンを設定すると、毎回選択する必要が無くなります。
（検証してませんがブラウザやPCを変更すると設定が初期化されると思います）

右上の歯車アイコンをクリックしてメニューを開き、「その他のユーザー設定」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3664223/f6824c80-3b6b-5e53-ef3c-2f92d6fbbcdb.png)

ローカリゼーションとデフォルトのリージョンの編集ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3664223/787d4849-ea05-d75c-f03f-2164a7599e53.png)

デフォルトのリージョンを「アジアパシフィック (東京) ap-northeast-1」に変更して、「設定を保存」ボタンをクリックすれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3664223/0dfc19f6-a5e3-598c-f489-e57fbae21b4a.png)

### まとめ
・AWSにログインする時はCSVに記載されているURLにアクセスする。
・リージョンを東京に変更する。
・デフォルトリージョンを東京に変更する。
・上手くいかない時は右上のリージョンとロール名を確認する。
Looker view定義の基本を理解

## はじめに

Lookerでは、ビューを定義することによってデータベースのテーブルをモデル化し、データの可視化や分析を行うことができます。ビューの定義には、プライマリキーの指定や各カラムの定義、計算フィールド、メジャーの定義などが含まれます。この記事では、Lookerでのビューの定義方法について解説します。

## ビューの基本構造

ビューの定義は以下のような基本構造を持ちます：

1. `view` ブロック: ビューの名前とテーブル名を指定します。
2. `dimension` ブロック: 各カラムをディメンションとして定義します。
3. `measure` ブロック: 集計関数を使用したメジャーを定義します。

## プライマリキーの指定

ビューには必ず1つのプライマリキーを指定します。プライマリキーは各レコードを一意に識別するために使用されます。

### 例: `product_data` ビューの定義

以下は、架空の `product_data` テーブルをモデル化したビューの定義例です：

```lookml
view: product_data {
  sql_table_name: pd.product_data ;;

  dimension: product_id {
    primary_key: yes
    type: string
    sql: ${TABLE}."product_id" ;;  # ここを実際のプライマリキーのカラム名に変更してください
    label: "プロダクトID"
  }

  dimension: product_name {
    type: string
    sql: ${TABLE}."product_name" ;;
    label: "プロダクト名"
  }

  dimension: category {
    type: string
    sql: ${TABLE}."category" ;;
    label: "カテゴリ"
  }

  dimension: price {
    type: number
    sql: ${TABLE}."price" ;;
    label: "価格"
  }

  measure: total_sales {
    type: sum
    sql: ${TABLE}."sales" ;;
    label: "総売上"
  }

  measure: count {
    type: count
    label: "カウント"
  }
}
```

## 他に追加するべき情報

1. **ラベル (`label`) の追加**: 各ディメンションとメジャーに人間が理解しやすいラベルを付けます。
2. **説明 (`description`) の追加**: ディメンションやメジャーに対して詳細な説明を追加することで、他のユーザーがそのフィールドの目的や内容を理解しやすくします。
3. **フィルター (`filter`) の追加**: 特定の条件に基づいてデータをフィルタリングするフィールドを追加できます。
4. **パラメータ (`parameter`) の追加**: ユーザーが動的に値を入力できるようにするためのパラメータを追加できます。

### 例: 説明とフィルターの追加

```lookml
view: product_data {
  sql_table_name: pd.product_data ;;

  dimension: product_id {
    primary_key: yes
    type: string
    sql: ${TABLE}."product_id" ;;
    label: "プロダクトID"
    description: "各プロダクトを一意に識別するためのID"
  }

  dimension: product_name {
    type: string
    sql: ${TABLE}."product_name" ;;
    label: "プロダクト名"
    description: "プロダクトの名前"
  }

  dimension: category {
    type: string
    sql: ${TABLE}."category" ;;
    label: "カテゴリ"
    description: "プロダクトが属するカテゴリ"
  }

  dimension: price {
    type: number
    sql: ${TABLE}."price" ;;
    label: "価格"
    description: "プロダクトの価格"
  }

  measure: total_sales {
    type: sum
    sql: ${TABLE}."sales" ;;
    label: "総売上"
    description: "プロダクトの総売上額"
  }

  measure: count {
    type: count
    label: "カウント"
    description: "プロダクトの数をカウント"
  }

  filter: price_range {
    type: number
    sql: ${TABLE}."price" ;;
    label: "価格範囲"
    description: "特定の価格範囲のプロダクトをフィルタリング"
  }
}
```

## 終わりに

Lookerでのビューの定義は、データの可視化や分析を効率的に行うための重要なステップです。プライマリキーの指定、ラベルの追加、説明やフィルターの設定などを行うことで、他のユーザーがビューをより理解しやすく、使いやすくなります。このガイドを参考にして、自分のデータに応じたビューの定義を行ってください。
flatpickrを使ってみる

# はじめに
これは、案件でrailsデフォルトのdatetime_fieldが利用されていたが、使いづらかったのでそれを作り替えた作業禄です。

# 改修前
```haml
    公開開始日時
    = f.datetime_field :open_at, class: 'input input-bordered rounded-lg'
```

![l_6814799_122_2be594269a33f1091cc5306cc6458569.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632357/98128b2d-23e0-a8d7-1e3c-f4ac54483fde.png)

日付はカレンダーで設定が可能なのに、時間はマウスオーバーして時間を設定しなおさなければいけないのが使いづらかったのです。

# 実装
```bash
yarn add flatpickr
```

```js:app/javascript/controllers/flatpickr_controller.js
import { Controller } from "@hotwired/stimulus";

import flatpickr from "flatpickr";
import "flatpickr/dist/l10n/ja.js";

// Connects to data-controller="flatpickr"
export default class extends Controller {
	connect() {
		flatpickr(".datetime", {
			enableTime: true,
			locale: "ja",
			defaultHour: 0,
			altInput: true,
			altFormat: "Y/m/d H:i",
		});

		flatpickr(".date", {
			locale: "ja",
			altInput: true,
			altFormat: "Y/m/d",
		});

		flatpickr(".fp_date");
	}
}
```
```js:/app/javascript/controllers/index.js
// 省略
import FlatpickrController from "./flatpickr_controller";
application.register("flatpickr", FlatpickrController);
```

```diff:app/views/layouts/application.html.haml
%html
  %head
    = stylesheet_link_tag 'application', 'data-turbo-track': 'reload'
    = javascript_include_tag 'application', 'data-turbo-track': 'reload', type: 'module'
+    %link{href: "https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css", rel: "stylesheet"}/
  %body
```

```haml
    公開開始日時
    = f.text_field :open_at, class: 'input input-bordered bg-white rounded-lg datetime', placeholder: '日付を選んでください', data: { controller: 'flatpickr' }
```

![l_6814799_123_a03caa582e748a0490141a785bd3fd8d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632357/f33caa36-a377-662c-c56d-ce8c723f88fd.png)

# 最後に
今回は、datetimepickerの代わりとしてflatpickrをチョイスしましたが、予想以上簡単に実装できたので、驚きでした。


# おまけ
日本語版のドキュメントページがありました。
https://tr.you84815.space/flatpickr/plugins.html

月選択の機能があったので、こちらも試してみました

```js:app/javascript/controllers/flatpickr_controller.js
// 省略
export default class extends Controller {
	connect() {
        // 省略
		flatpickr(".month_select", {
			locale: "ja",
			plugins: [
				new monthSelectPlugin({
					shorthand: true, // デフォルトはfalse
					dateFormat: "Y年M", // デフォルトは"F Y"
				}),
			],
		});
    }
}
```

```haml
    公開開始日時
    = f.text_field :open_at, class: 'input input-bordered bg-white rounded-lg month_select', placeholder: '日付を選んでください', data: { controller: 'flatpickr' }
```

![l_6814799_125_842f56d5425cf06731ada8ff974595f8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632357/a499db7d-afbd-7d78-ffb8-2e6facf6ca08.png)
[Rails入門] 初めてのRails（GitHub）

最近Ruby on RAilsのチュートリアルに挑戦している初心者の自分が、初心者に向けての記事です。
今回はGitHubにプッシュするまでの流れを解説します。初めてGitHubを使う方向けに、Gitの基本的な操作も含めて説明します。

# gitの初期設定
まずはユーザー設定。これは１度しちゃえばOK‼️
```
$ git config --global user.name <自分の姓名（ローマ字)>
$ git config --global user.email <自分のメールアドレス（your.email@example.comなど）>
```
今後自分が行うプロジェクトの変更を、自分の「名前」や「メールアドレス」で調べられるようになります。この設定は、Gitで共同作業を行う場合に特に役立ちます。

# GitHubアカウントの作成
[GitHub公式サイト](GitHubアカウントに登録（サインアップ）)でGitHubアカウントに登録（サインアップ）しましょう。

# Gitリポジトリの初期化
作成したRailsアプリケーションをGitで管理するために、リポジトリを初期化します。
```
$ git init
```

# ローカルリポジトリにコミット
まず変更したファイルをステージに追加
```
すべてのファイルをステージに追加したい場合
$ git add .

指定したファイルだけステージに追加したい場合
$ git add <ファイル名>
```
今ステージ追加されているものを知りたい時は
```
$ git status
```
ローカルレポジトリコミット
```
$ git commit -m "コミットメッセージ"
```

# リポジトリへのプッシュ
リポジトリの作成
```
$ git remote add origin https://github.com/<ユーザー名>/first_app.git
```
GitHubへのプッシュ
```
$ git push -u origin master
```
これでGitHubのリポジトリに登録されています。

# その他参考コマンド
チェックアウト
```
ブランチ切り替え
$ git checkout <切り替えたいブランチ先>
（mainブランチに切り替えたい場合）
$ git checkout　main

新しいブランチの作成
$ git checkout -b new-feature
```
ブランチの一覧表示
```
$ git branch
```
# 
これで、RailsアプリケーションをGitHubにプッシュする手順は完了です。Gitの基本操作を理解することで、効率的にプロジェクトを管理できるようになります。
Workato：ジョブ実行履歴のCSV出力がリリースされました

# はじめに

Workatoの2024年5月のアップデートで、ジョブ実行履歴のCSV出力がリリースされました。

https://www.workato.com/product-hub/product-scoop-may-2024/

コンプライアンスや運用状況の分析などのためにレシピのジョブ実行履歴を出力する必要がある場合に有効にお使いいただけます。

# 内容
## ジョブの履歴がCSVでエクスポートできる

ジョブの履歴を最大1000件CSV出力することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/49889ca4-2738-e047-c621-f8aaef52af02.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/8a34cfb9-f1a3-b4ff-8109-624fb7123131.png)

条件を指定して結果を絞り込んだ形でCSV出力することも可能です。Job画面上で条件を指定し、「Export job report」をクリックすることで、指定された条件で絞り込まれた結果が出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/7a76954d-a86b-1a41-e4f2-1ed27639e0d9.png)



## カスタマイズされたカラムも含めて出力できる

ジョブテーブルのカスタムカラムを追加している場合、追加されたカスタムカラムに出力された値もエクスポート可能です。CSV出力した結果を各種分析等でカスタムカラムの値を活用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/c4d67ac2-c509-647e-f42a-6439dca2c853.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/9528d356-9dec-450a-9f5d-312d93042371.png)
MacのSafariでClaudeを使用すると自動でメッセージが送信されてしまって面倒

# 本記事の概要
Mac の Safari で Claude を使用すると自動でメッセージが送信されてしまって面倒なのでどうにかしたい．変換を確定させるだけでチャットが送信されてしまう．
解決策としては，**ある条件で起動した Safari で起動した Claude のみ** 「(特定のキー)+Enter」でメッセージを送信できるように設定した．

## Requirements
- Mac OS
- Safari

# 解決策
## 1. Karabiner-Elements のインストール
[Karabiner-Elements](https://karabiner-elements.pqrs.org/docs/) をインストールして，`Karabiner-Elements` および `Karabiner EventViewer` が使用できる状態にしておく．

## 2. Claude を Docker に固定
Safari で Claude を開き，ブラウザ右上の「共有」ボタンから `Dock に追加` (英語では `Add to Dock`)
すると，Dock に Claude のアイコンが追加されている．これは Safari 経由で Claude を立ち上げるためのショートカットになる．以下，これを Claude on Safari と呼ぶ．
* 仮に `Add to Dock` が存在していない場合
iOS のバージョンから起因している可能性が高い．MacOS Sonoma からこの機能が実装されたようなので，仮にオプションがなければ OS のバージョンを確認してみてほしい．

## 3. Karabiner EventViewer から Claude on Safari の ID を見つける
`Karabiner EventViewer` を立ち上げ．Frontmost Application を選択し，先ほど Dock に追加した Claude on Safari を立ち上げる．すると，`Bundle Indentifier` および `File Path` が表示されるので，`Copy to pasteboard` などで `Bundle Indentifier` の情報を獲得する．

## 4. Karabiner-Elements に Claude on Safari を登録する．
`Add your own rule` の部分に以下のコードを記載する．
```
{
    "description": "********** 1 **********",
    "manipulators": [
        {
            "conditions": [
                {
                    "bundle_identifiers": [
                        "********** 2 **********"
                    ],
                    "type": "frontmost_application_if"
                }
            ],
            "from": {
                "key_code": "********** 3 **********"
            },
            "to": [
                {
                    "key_code": "********** 4 **********",
                    "modifiers": [
                        "********** 5 **********"
                    ]
                }
            ],
            "type": "basic"
        }
    ]
}
```

以下，それぞれ
> `********** 1 **********` 

このスクリプトのタイトル．例えば「Claude on Safari: Enter + X to send」のように設定する．
> `********** 2 **********`

3.で取得した `Bundle Indentifier` をここに記載する．
ただし， **エスケープ記号などを追加する必要がある** ので注意．
例えば，`"^com\\.apple\\.Safari.WebApp.AAAAAAAAAAAAAAAAAAAAAAA$"` のような形で入力することになる．

> `********** 3 **********` 

通常の送信コマンドをここに付記する．通常は `"return_or_enter"` でよい．


> `********** 4 **********` 

通常の送信コマンドをここに付記する．通常は `"return_or_enter"` でよい．


> `********** 5 **********` 

Enter キーと何のキーを同時に押すことで送信をさせるかを決定する．
例えばキーコードを入力してやればよい．例えば左 Shift キーであれば `"left_shift"` と入力してあげればよい．

## 6. (予備) 動作確認
通常のやり方で Safari を立ち上げ，他のアプリなどでこれまで通り問題なく動作をしているかどうかを確認する．また，Dock から Claude on Safari を立ち上げて，設定した通りに Claude のメッセージ送信ができるようになっているかの確認をする．


# Reference
[Karabiner-Elements complex_modifications rules](https://ke-complex-modifications.pqrs.org/?q=Shift%20Enter%20send)
【ChatGPT＋DALL-E3】【Dream Machine】の動画を長尺の動画にする。


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

　今回は、Dream Machineの動画を長尺にする作成方法です。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はあります。　あしからず。
:::

　今日（2024/06/18）は、
　　ニュースが目白押し！

　とはいえ、
　　動画生成AIについてです。

　Dream Machineが
　　2024/06/13に登場して
　　　すでに五日ですね。

　X-Twitter上では
　　誰もが試行しています。
　　　私もそのひとり😸

　さて、
　　Dream Machineを
　　　開発したLuma AIが
　　　　X-Twitterでポストしました。

　近日中に
　　編集機能を
　　　公開する、と。
　　　　現在ウェイトリスト登録開始。

　　編集機能とは
　　　どうやら対象を
　　　　変更できるらしい。

　　例えば、
　　　人間を宇宙人や
　　　　金属甲冑にするとか。

　　また、背景も変えられる。

　次に、透かしの削除が可能に。
　　ただし、サブスクしないとダメ😅
　　　体験版は、そのままです。

　それから
　　待望の長尺への道が開かれました。

　　Extend、これで5秒追加できます。
　　　今のところ、制限なしみたい。

　　もちろん、
　　　Promptの入力が必要です。
　　　　どんな変化をさせるか、が
　　　　　大事ですからね。

　Extendの追加に伴い、
　　ＵＩが変わりました。
![Screenshot_20240618-100924.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/0075feda-7d2c-ecc7-d35a-c8fc023aae86.png)

　　上部から説明します。

　　ロゴマークは
　　　トップページへ。

　　Createは
　　　編集画面。
　　　　ふつうはここです。

　　Accountの
　　　SignOutでログアウトです。

　　次にCreate画面。

　　動画の下にある、
　　　Extendが5秒追加。
　　　　これは何度でも（？）。

　　そのとなりが
　　　動画のダウンロードです。

　　画像をタップすれば
　　　動画に遷移して
　　　　再生できます。

　　だいたいこんなところ。

　さらに、
　　Extendを使った
　　　コンテストが催されています。

　　上位10人に
　　　サブスクのPROを
　　　　一ヶ月提供するそうです。

　ここに書いた内容は
　　以下をもとに書きました。
　　　[Luma AIさんポスト](https://x.com/LumaLabsAI/status/1802681173682032983?t=klCDcRH2MjUrFR7uK69Iug&s=03)
***
　次のニュース。

　なんと、
　　Dream Machineに対抗してか、
　　　あのRunwayが
　　　　Gen-3 Alphaをリリース。

　デモ動画を見る限り、
　　こちらも良さそう。
***
　さて、今日の本題です。

　今回は、
　　Dream Machineで
　　　作成した動画をつなげて
　　　　長尺の動画にしたいと
　　　　　思います。

　と準備していたのですが、
　　Extendが出てきてしまい、
　　　書いていた記事が
　　　　ムダになってしまいました😅

　というわけで
　　今回は、
　　　Extendを使った私の作品を
　　　　どうぞ。X-Twitterですけどね😅
　　　　　Qiitaで動画は
　　　　　　アニメGIFだけみたいだし。

　こちらになります。
　　[うちのマルシルが動いた２](https://x.com/kabumira862571/status/1802845779989868804?t=lO_UhjFK-Yx49bgddvuF5g&s=19)

　簡単に説明しておきます。
　　上がExtendで作成したもの。
　　下がChatGPTで
　　　ふたつの動画を合体したもの。

　ちなみに
　　ここに登場するエルフは
　　　『ダンジョン飯』の
　　　　　登場人物のひとりです。

　『ダンジョン飯』は
　　マンガ家 九井諒子先生の作品。
　　　マンガからアニメ化も
　　　　されました。

　元画像は
　　マルシルをイメージして
　　　私が描いたものです。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
MySQL 8.4 install to RockyLinux 8.10

# TL;DR

* init vagrant box bento/rockylinux-8.10
* dnf install MySQL 8.4

# init rockylinux-8.10

```
mkdir rocky810
cd rocky810

vagrant init bento/rockylinux-8.10 --box-version 202406.05.0
vagrant up
```

参考： https://app.vagrantup.com/bento/boxes/rockylinux-8.10

## firewalld

```
systemctl status firewall
systemctl is-enabled firewalld
```

status:inactiveの場合
```
systemctl start firewalld
systemctl enable firewalld
```

```
firewall-cmd --list-all
```

## locale

このようなエラー対策
```
Failed to set locale, defaulting to C.UTF-8
```

こうする
```
dnf install langpacks-ja
```

参考：https://qiita.com/takizawafw6o2o/items/d6a15b5ae05d85ae1f41

# prepare for install

## unintall maria-db

確認
```
dnf list --installed | grep maria
```

インストール済みであれば削除しておく（今回は該当無しであった）
```
dnf remove mariadb-libs -y
```

## add repository of mysql

```
dnf localinstall -y https://dev.mysql.com/get/mysql84-community-release-el8-1.noarch.rpm
```

参考： https://dev.mysql.com/downloads/repo/yum/

## install

確認
```
repolist enabled | grep mysql.*-community
```

```
mysql-8.4-lts-community                 MySQL 8.4 LTS Community Server
mysql-connectors-community              MySQL Connectors Community
mysql-tools-8.4-lts-community           MySQL Tools 8.4 LTS Community
```

デフォルトバージョン（8.0）を無効にした上で8.4をインストールする
```
dnf module disable mysql
dnf install mysql-community-server
```

https://dev.mysql.com/doc/refman/8.4/en/linux-installation-yum-repo.html

## version check

```
mysqld --version
```
=> 8.4.0

## set auto start mysqld

```
systemctl start mysqld.service
systemctl enable mysqld.service
```

## set passwd

```
grep 'temporary password' /var/log/mysqld.log
mysql_secure_installation
```


# thanks for

（一部参考にした） https://zenn.dev/ymasaoka/articles/install-mysql-8-centos-7
毎日ABC day22【c++】ABC326 A-C問題解説【ACコード付き】

# AtCoder Beginner Contest 325

https://atcoder.jp/contests/abc325

## A - Takahashi san
苗字と名前がそれぞれ与えられるので、" san"をつけて出力する。

```cpp
int main()
{
	string S, T;
	cin >> S >> T;
	cout << S << " san" << endl;
	return 0;
}
```

## B - World Meeting
世界 $N$ 拠点の人数と、標準時間からのズレが与えられる。9時から18時に完全に収まるように1時間のMTGを開くとき、最大の参加人数は何人になるか、という問題。

開始時間の選択肢は0時から23時までの24パターンしかないので、それぞれの時間における参加可能人数を求めて、最大の場合を出力する。

```cpp
int main()
{
	int N;
	cin >> N;
	vector<int> num_member(N);
	vector<int> time_kyoten(N);
	for (int i = 0; i < N; i++) cin >> num_member[i] >> time_kyoten[i];
	// それぞれの時間で参加可能な人数を求める
	int max_num = 0;
	for (int k = 0; k < 24; k++)
	{
		int tmp = 0;
		for (int i = 0; i < N; i++)
		{
			int tmp_time = (time_kyoten[i] + k) % 24;
			if (tmp_time >= 9 && tmp_time < 18) tmp += num_member[i];
		}
		max_num = max(max_num, tmp);
	}
	cout << max_num << endl;
	return 0;
}
```

## C - Sensors

再帰関数で繋がっている領域を全てチェックし、繋がっていない場所の個数をカウントする。

```cpp
int H, W;
bool board[1009][1009];

void ft_check(int x, int y)
{
    board[x][y] = false;
    for (int i = -1; i <= 1; i++)
    {
        for (int j = -1; j <= 1; j++)
        {
            int nx = x + i;
            int ny = y + j;
            if (nx >= 0 && nx < H && ny >= 0 && ny < W && board[nx][ny])
            {
                ft_check(nx, ny);
            }
        }
    }
}

int main()
{
    cin >> H >> W;
    vector<string> S(H);
    for (int i = 0; i < H; i++) cin >> S[i];
    // 盤面の整理
    for (int i = 0; i < H; i++)
    {
        for (int j = 0; j < W; j++)
        {
            if (S[i][j] == '#') board[i][j] = true;
            else board[i][j] = false;
        }
    }
    // センサの単位がいくつあるかチェック
    int ans = 0;
    for (int i = 0; i < H; i++)
    {
        for (int j = 0; j < W; j++)
        {
            if (board[i][j])
            {
                ans++;
                ft_check(i, j);
            }
        }
    }
    cout << ans << endl;
    return 0;
}
```
学生さん、秀丸エディタはな、金銭的に難儀していれば学生の間は無料で使える

#  秀丸エディタフリー制度

秀丸エディタは古くからあるとても高機能なテキストエディタです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/e18541c5-8905-91f1-165b-e21db9d78c83.png)


税抜き4000円のシェアソフトですが、いくらかの条件に当てはまれば無料で使用できる制度もあります。

>秀丸エディタは、特定の条件に当てはまる場合に限り、期間限定で無料でご利用いただけます。
(中略)
>フリー制度での利用を許可されても、利用条件に当てはまらなくなった時点で、無効になりますのでご注意ください。
>対象となる個人/団体様は日本国内の方のみとさせていただきます。
　こちらの想定してる「学生」とは異なる方の場合などで、フリー制度でのご利用をお断りさせていただく場合もあります。
アカデミックフリー個人
　学生の方で金銭的に難儀している方
　（注意：難儀していない方は当てはまりません。）

[秀丸エディタフリー制度](https://hide.maruo.co.jp/support/hidemarufree.html)より引用

なお、

>卒業後も秀丸エディタを継続してご利用くださる場合は、そのときに必ずお支払いいただくことになっています。

ということですので、生涯フリーではありません。
購入するか、学生時代にフリーソフトを開発し、フリーソフトウェア開発者枠で申請しましょう。

今は昔、Githubなどがなんてものもなく、個人でソフトウェアを公開するのがだいぶ困難だった時代です。
（Vectorとかね……）。

## 秀丸エディタとは

秀丸エディタは有料のシェアウェアです。
様々なソフトがサブスクリプションである昨今、買い切りなのがとても良いですね。

ごたごたした感じのソフトウェアを嫌い、最低限の機能があるのが好まれるので会社でも導入されていたのでしょう。今はもうVSCodeを使用するようになっているんですが、シンプルなiniファイルなんかをぱっと開くときは秀丸エディタです。

公式サイトは個人サイトのような佇まいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/57e13b83-9b97-0be2-0de5-034ea12ffa1b.png)

https://hide.maruo.co.jp/index.html

秀丸ディタはかなり息の長いソフトウェアで、なんたって初版は1995年7月29日！
アップデートはかなりしっかりされていて、2024年6月18日、最新の更新日は2024/04/15 Ver9.34です。
これほどの長い間、ソフトウェアがメンテナンスされているのは驚異的というほかありません。

秀丸エディタは、「テキストエディタ」であり、アンドゥ機能すらスカスカの「メモ帳」の次のステップとして間違いないです。

テキストエディタにできることはほぼできる、といってもいいんじゃないか。軽量で、動作はサクサク動きます。

これ以上となると開発環境となりそうです。

大ヒットを飛ばした買い切りソフトウェアでも、安定して開発が続き預けられるということはなかなかないと思います。メンテナンスが続かなかったり、1年もたたずに後継ソフトがでたりして実質メンテが終了したりするのが買い切りソフトの欠点だと思いますが、ほんとうに息が長い。

開発者さんのインタビューが面白いです。

老舗テキストエディタ「秀丸」開発者に聞くスタートアップ観(1)
https://coralcap.co/2022/05/hidemaru-01/

## ほかの選択肢

### サクラエディタ

プライベートではサクラエディタを使用してます。
普段使いのテキストエディタとして不足点はないです。
日本語の入力も問題ありません。

### Visual Studio Code

Visual Studio Codeも候補のひとつです。
特にコーディングにおいてはもはや拡張機能を積み込んで開発環境というほかない。
使わないのはVisualStudioを用いた開発の時くらいですかね……。

それと、欠点は日本語のメモは取りづらいことだと思っています。UTF-8が前提になっている……。
マークダウンとかも、できなくはないのですが、それはまた別の（Obsidianなど）でやっています。
課題（018）進捗

お疲れ様です。

今回から見本通りに幾何学模様を3つ作成する課題に取り組んでいきます。
既に2日前から始めていましたが、進捗報告をしていなかったため現状までをまとめて書きます:writing_hand:
![スクリーンショット 2024-06-18 114101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/140b81f6-ca52-ba0c-d8e0-464624880bfc.png)
![2024-06-18 101908.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/c5995aac-5324-2260-11f0-b8745bd4f044.png)



1つ目は要素を横に並べて、中央ぞろえにするといったものです。
見本と何度も見比べましたが、親要素の20%にちゃんとなっているのでしょうか…？
見本の方はもう少し横長いような気がしましたが…

![2024-06-18 095840.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/0ee122c8-937d-5ad4-1edf-7001bc0d07a2.png)

![2024-06-18 095726.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/dcfafd68-1745-a2a0-103c-8695106a5b0b.png)
2つ目は positionタグを使って見本通りに配置するものです。
htmlは撮り忘れています。
少し前に positionタグを扱っていたので、コードもすんなり書けましたが、赤線部分の、基準にしたい親要素に relativeを指定しなければならないことを知らずにコードを書き、一番上の四角が上ギリギリに位置していて、なんでだ？
とずっとにらめっこしていました:cold_sweat:
relative と absolute が逆だったっけ？とか思いながら何度か書き直すも見本のようにならなかったため、素直に復習しこういったルールがあることが発覚しました。

![2024-06-18 104028.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/60777e92-db02-9e9e-aefa-3f31342f4925.png)

![2024-06-18 104001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/48c0cfb8-8b94-fb6d-1ad6-4a3514fdd0a8.png)

3つ目も2つ目と同じように、 positionタグを使って作るものでした。
直前まで positionタグを使っていたので、3つ目はほぼ時間がかからずにできました。
<br>
3つとも作成できたので、各模様に間を作って、ひとまず完成です。
![2024-06-18 112118.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/51938ab7-1bbf-6d00-4f09-d53ba71f7086.png)
![024-06-18 112144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/1ec1b65f-3db6-6eec-956d-092211a3a38d.png)
今回の課題を進める中で、コードを書いたのに反映されないということや、marginの相殺など起こりましたので、cssのルールについてもよく調べて原因をつきとめようと思いました。
何が原因かを知っていれば対応できることもあると思いますし、こういう経験をしておくことも大事だと思いました:blush:
相殺については、今回もchatGPT先生にお世話になりました。
![相殺.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/f462c7e3-d11e-9729-e887-a834c5326e84.png)
ルノルマンカードで日常の迷いにヒントを！

# ルノルマンカードって？
ルノルマンカードとは、フランス革命前後に活躍した有名な占い師、マドモワゼル・ルノルマンに由来した占いカードである。よくあるタロットカードとは異なり、より具体的な日常生活のアドバイスや予測をするのに使われている。通常は36枚のカードで占う。
タロットカードのことは知っていても、ルノルマンカードを知っている人はあまりいないのではないだろうか？

# 今回やってみたいこと
気軽にルノルマンカードに触れてもらいたくシンプルで分かりやすい結果を導くため、ChatGPTに36枚の中から重要なカードを10枚選ばせた。
これらは、占いの中で多様なシナリオや質問に対応するための重要な要素が含まれるカードであるとのことだ。

・騎士
・家
・木
・蛇
・棺
・ハート
・鳥
・子ども
・クマ
・山

# 使用環境・アプリケーション
・CodePen
　[Spin Wheel Using JS by Sumesh KP](https://codepen.io/sumeshkp18/pen/VGBPYg)をベースに制作

・d3.js
・iTyped.js 

# 追加した機能
・タイトル（iTyped.js を活用し、アニメーションも追加)
・ルーレットの中身と回答
・フォント、サイズ等

# 完成版
　[Today's advice](https://jolly-bublanina-4fdf2d.netlify.app)
 ![スクリーンショット 2024-06-18 11.44.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772350/99d04487-b866-36c4-eb23-974a46c7f7c1.png)

# 今抱えている問題と照らし合わせてみて欲しい
出てくるアドバイスは自分が今抱えている状況に照らし合わせて考えてみると、さらに深くルノルマンカードの世界を楽しむことができる。
複数カードの組み合わせで占ったりと解釈を発展させていくことも可能だ。

36枚のカードの意味を知りたい方は参考に以下サイトを見て楽しんでもらいたい。
[高橋桐矢先生監修のルノルマンカード占い](https://spur.hpplus.jp/fortune/special/lenormandcard/)
Vket Cloud Settingsを使ってワールド設定を変更する【Vket Cloudのワールド設定機能一覧】

:::note info
本記事は、VR法人HIKKYのorganization下のQiita/Zenn両方に投稿しております。

本記事に掲載されている情報はVketCloudSDK12.3.4のものです。
バージョンにより見た目や表示情報が変化する場合がございます。
:::

# はじめに
VketCloudSDK Ver12.3以降のバージョンでは、ワールドの設定を管理するためのオブジェクト群として**Vket Cloud Settings**があります。
※VketCloudSDK Ver9.11以前のバージョンの場合、ワールド設定は**HEO World Setting**コンポーネント、**HEO Player**コンポーネント、**HEO Despawn Height**コンポーネントで行います。

Vket Cloud Settings内の設定を変更することで、プリセットアバターを変更したり、ワールドのレンダリング設定を変更したりすることができます。

本記事では、Vket Cloud Settings内の各オブジェクトが持つコンポーネントで使用可能な機能について紹介しています。

:::note info
Vket Cloud Settingsは、HierarchyビューにてAdd essential objects for VketCloudを選択した際に追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788807/2a9f6b52-0236-9c35-bc32-cd8a3b082bdb.png)
:::

# 対象読者
* VketCloudSDKを実際に使ったことがある人
    * 実際に使ったことがない人は[【ワールドの作り方：準備編vol.1】アカウント設定](<https://magazine.vket.com/n/n8dbabbb95bc8?gs=65a83157be74>)をご参照ください
* Vket Cloudで作成したワールドの設定を変更したい人

※プログラミング知識は無くても大丈夫です。

# 使用バージョン
Windows 10
VketCloudSDK 12.3.4

# Vket Cloud Settings
Vket Cloud Settingsオブジェクトが持つ**Vket Cloud Setting**コンポーネントでは、設定モード(Setting mode)の変更が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788807/d86a9014-a3cc-b5c9-8ad5-44bfbacb66e6.png)

設定モードを変更することにより、Vket Cloud Settingsの子オブジェクトが変化し、設定項目数が変化します。
#### Base 設定時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788807/874233e4-c1e6-8a8f-8364-441eca5a7e48.png)

上記画像のように、**BasicSettings**、**PlayerSettings**、**DespawnHeightSettings**のみとなります。
ワールドの基本的な設定のみを行う場合はこちらを使用します。
#### Advanced 設定時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788807/56f85f30-6dd8-0dc2-a5d5-dfdc59877368.png)
Base設定項目に加え、**RenderingSettings**、**CameraSettings**、**AvatarSettings**、**MyAvatarsSettings**が増えます。
より細かい設定を行いたい場合は、こちらを使用します。

# 目次
* [BasicSettings・PlayerSettings・DespawnHeightSettingsの使い方](<https://qiita.com/vket_chan/private/66900d276ba5c70f304b>)
* [デバッグモードで使える機能一覧](<https://qiita.com/vket_chan/items/87880b85c898ad25d732>)
* [デバッグモード時に表示されるステータスの説明](<https://qiita.com/vket_chan/private/d44999b496ef09ffee74>)
* [RenderingSettingsの使い方](<https://qiita.com/vket_chan/private/424f78cd3464cf86bbf8>)
* [CameraSettingsの使い方](<https://qiita.com/vket_chan/private/b0b8f47f219fc5fb7beb>)
* [AvatarSettings・MyAvatarsSettingsの使い方](<https://qiita.com/vket_chan/private/8b80d224cad3b63c27e5>)
* [アバターの持ち物設定に使用可能なターゲット一覧](<https://qiita.com/vket_chan/private/8148a47273cfdc130c62>)

**次：** [BasicSettings・PlayerSettings・DespawnHeightSettingsの使い方](<https://qiita.com/vket_chan/private/66900d276ba5c70f304b>)
【Vket Cloud】デバッグモード時に表示されるステータスの説明

# はじめに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763860/55868a5e-07a5-c91e-7471-2dc396e0f081.png)

Vket Cloudでデバッグモードを有効にしてビルドを行った際、画面上部にステータス表記がされます。

本記事では、各表記が意味することについて説明を行います。

デバッグモードの有効化に関しては[BasicSettings・PlayerSettings・DespawnHeightSettingsの使い方](<https://qiita.com/vket_chan/private/66900d276ba5c70f304b>)をご確認ください。

::: note info
本記事は、VR法人HIKKYのorganization下のQiita/Zenn両方に投稿しております。

本記事に掲載されている情報はVketCloudSDK12.3.4のものです。
バージョンにより見た目や表示情報が変化する場合がございます。
:::

## 1. FPS表記

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763860/cccda338-24be-738e-0ffb-a789899eeabd.png)
左上の数字は現在のVket CloudのFPSです。
1秒間に何フレームで動作しているかが表示されます。

Vket CloudのFPS値はモニターのリフレッシュレートにより変動します。
PCの場合、VketCloudSDK9以前で作られたワールドではリフレッシュレートの値そのままがFPS値になりますが、
VketCloudSDK12以降で作られたワールドではおおよそ50～70FPSに近似化されます。
スマホの場合、30FPSになります。

上記は通常状態で、ワールドに負荷の重たい処理がある場合はこれより低い値となってしまいます。
負荷が少ない快適なワールドを心掛けましょう。

## 2. ドローコール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763860/18bb4701-3780-c983-cd3a-144332f9d2dc.png)
1行目の右側にはドローコール数が表示されます。
ドローコールとは、画面内のオブジェクトの描画に使用する命令のことで、この数が置ければ多いほど描画命令の数が増え、処理が重たくなってしまいます。

合計で**200未満**となるよう調整を行うことで、過度に重たいワールドにはならなくなります。

## 3. VRAM
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763860/1095cfd6-a804-9508-dae5-8a74f25eee03.png)
2行目はビデオメモリ使用容量の表記になっています。単位はメガバイト(MB)です。

| 項目 | 説明 |
|:-:|:--|
| **Total** | ビデオメモリ使用総容量です。 |
| **Tex** | テクスチャによって使用されているビデオメモリ容量です。 |
| **Comp** | 圧縮テクスチャによって使用されているビデオメモリ容量です。 |
| **Text** | テキスト描画テクスチャによって使用されているビデオメモリ容量です。 |
| **RT** | レンダリングによって使用されているビデオメモリ容量です。 |
| **Etc** | それ以外によって使用されているビデオメモリ容量です。<br>具体的には、頂点バッファやインデックスバッファによるビデオメモリ容量がこちらに該当します。 |

## 4. GUI
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763860/6788f5fd-8a92-6b7b-4541-f7f3642b7427.png)
3行目はGUI容量の表記になっています。単位はメガバイト(MB)です。

| 項目 | 説明 |
|:-:|:--|
| **Total** | GUI総容量です。 |
| **Tex** | テクスチャに用いられている画像の総容量です。 |
| **Comp** | 圧縮テクスチャに用いられている画像の総容量です。 |
| **Text** | テキスト描画テクスチャに用いられている画像の総容量です。 |

## 5. コンソール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763860/9f499fd2-e9b6-6ed3-2940-8235a60044b8.png)
Vket Cloudによりコンソールに出力されるメッセージです。
HeliScriptでエラーがある場合、こちらにエラーメッセージが表示されます。

同様のものをブラウザのデベロッパーツールのコンソールから確認することが可能です。

## まとめ

ステータス表示は、快適なワールドを作るうえで必要な情報やHeliScriptのエラー情報について表示されています。各項目を理解し、ぜひ、遊びやすいワールド作りに役立ててください。

## Vket Cloud について
ブラウザからアクセスできる“Webメタバース”を作成するサービスです。 Vket Cloudで制作された空間は、アプリレスでWebブラウザから簡単にアクセスできるため、プラットフォームの制限の中で限られたユーザーにだけでなく、インターネットに存在するすべてのユーザーに対してオープンなコンテンツ・サービスを届けることが可能です。

https://cloud.vket.com/

**前：** [デバッグモードで使える機能一覧](<https://qiita.com/vket_chan/items/87880b85c898ad25d732>)
**次：** [RenderingSettingsの使い方](<https://qiita.com/vket_chan/private/424f78cd3464cf86bbf8>)
Matzさんが使っているPCの話

Matzさんはレッツノート派だったと記憶していたのだが、長年ThinkPadを愛用という記事を見つけて困惑していた。

https://special.nikkeibp.co.jp/atclh/NBO/17/lenovo0721/thinkpad25th_vol6/

> ThinkPadを使い始めたのはX31からで、かれこれ十数年になるという。

---

確かに松江でレッツノート使っているという記事を読んだ記憶があるのだが…と探し回った結果、該当記事は見つけられなかったが、2005年時点ではThinkPadに乗り換えていたことが発覚😂

https://matz.rubyist.net/20050201.html

> 私は当面、松下(Panasonic)の製品を買いません。 長らくLet's Noteユーザでしたが、今はIBMだし。
【備忘録】Google ColabでWebアプリを作る(Streamlit)

# はじめに

Streamlit（ストリームリット）は、Pythonで書かれたオープンソースのフレームワークであり、データに基づいたウェブアプリケーションを簡単に構築することができるツールです。主にデータサイエンスや機械学習の分野で利用されており、データの可視化や分析、機械学習モデルの結果の共有などに適しています。

本記事ではGoogle Colab上でStreamlitを動かす方法について記載します。

# Google Colab

プロジェクトを新規作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/5f440b1a-0987-d3d6-5715-63296fef976e.png)

# Streamlit

Streamlitのインストール 

~~~
!pip install streamlit
~~~

Streamlitのプログラムを作成

~~~python:app.py
# app.pyというファイルに保存しても可
%%writefile app.py
import streamlit as st

def main():
    st.title('Hello Streamlit in Google Colab!')
    st.write('This is a sample Streamlit app running in Google Colab.')

if __name__ == '__main__':
    main()

~~~

Streamlitを起動する。

~~~
!streamlit run app.py & sleep 3 && npx localtunnel --port 8501
~~~

`your url is : https://***`と表示されるのでクリックします。
トンネルパスワードに自身のIPアドレスを入力し、クリックして送信します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/27c8b415-c465-bf64-a066-fc60d979b5f6.png)

以下の様に表示されればOKです。あとは`app.py`の内容を修正することで様々なアプリを作成することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/b265e2ce-93c3-27d1-7f47-0fd1d6cc20d0.png)
LCPの改善はまずFCPから

# LCPの改善は難しい

Core Web VitalsにおけるLCP (Largest Contentful Paint)を改善できないという話をよく聞きます。

HTMLとCSSを丁寧に直せば改善できるCLS (Cumulative Layout Shift)と違い、確かに難しいと思います。

# 結論

LCP改善の実践的なノウハウを紹介したいと思います。

1. LCPは土台となっているFCPから改善すべし
1. FCPの改善にはスタートダッシュでHTMLとCSSに集中すべし
1. 画像の軽量化にはあまり期待するべからず
1. カルーセルスライダーはJavaScriptオフでチューニングすべし
1. 画像の`rel="preload"`は諸刃の剣

# LCP = FCP + 最大コンテンツのタイムラグ

以下のグラフは通販サイトを中心に1000ページほどPageSpeed Insightsを実行して得られたFCP (First Contentful Paint)とLCPの関係(それぞれ対数目盛)です。

![fcp-lcp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/e65d1697-e912-4ce5-08ae-733bff309d4e.png)

なんとなく相関が見て取れますが、大事なのは以下の点です。

![CleanShot 2024-06-18 at 09.39.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/76655511-889e-cbaa-5edb-0d8f4514ddcb.png)

右下の領域にはサンプルがひとつもありません。つまり、

:::note info
LCPがFCPより早くなることはなく、**FCPが遅いのを放置してLCPだけを改善できない**ということです。
:::

それも当然で、

- `FCP` 最初のコンテンツ(テキストまたは画像)の表示
- `LCP` 最大コンテンツの表示

である以上、最大コンテンツが最初のコンテンツより早く表示されることは論理的にもありえません。

# FCPを改善するには

FCPの改善はブラウザのタイムラインと格闘する必要があります。

大雑把に言うと、**HTMLとCSSが解析され、どこに何を表示するかをとにかく早く決めさせる**ことです。それを邪魔するよくあるパターンは、

- JavaScriptが割り込んでいる
- DOMやCSSOMの変更によりレイアウト計算のやり直しが発生している
- 別のドメインのCSSで遅延(DNSルックアップやSSLハンドシェイク)が生じている
- HTMLとCSSが無駄に大きくレイアウト計算が遅い

:::note info
FCPの改善には、とにかくブラウザに**スタートダッシュでHTMLとCSSに集中してもらうこと**を徹底的に行います。
:::

# 画像軽量化はLCPに有効か

最大コンテンツは画像であることが多いので、画像を軽量化するとLCPを改善できると期待されがちですが、実際はどうでしょうか。

先ほどの1000ページのPageSpeed Insightsの結果について、画像データ転送量とLCPの関係(それぞれ対数目盛)を見ると次の通りです。

![image-lcp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/323d126d-138f-8103-1963-70dbd50de571.png)

相関係数0.48なのでなくはないけど微妙といった感じです。

:::note warn
これはあくまでページ全体の画像データ量との比較で、メイン画像のデータ量との相関ではありません。
:::

ただ、画像の読み込み時間よりFCPの方がよほど大きく、先ほども述べたようにLCPはFCPを土台としています。

:::note info
画像を軽くするだけで悪いLCPをよくできるということはまずもってありません。
:::

# カルーセルスライダーには要注意

ファーストビューにカルーセルスライダーがあるページでは、それがLCP悪化の原因になっていることがあります。

ライブラリの種類によりますが、JavaScriptが動作しないとカルーセルスライダーが表示されないようだとLCPは劇的に悪化します。

よく行う対策は、以下です。

1. JavaScriptをオフにしても1枚目の画像が所定の位置に表示されるようCSSを調整する
1. 1枚目の`img`要素には`loading="eager"`、2枚目以降には`loading="lazy"`を指定

ただ本音としては「せめてファーストビューではカルーセルスライダーを使うのはやめましょう」と言いたいです。

# メイン画像の先読みは有効か

よくLCPの改善ノウハウとして、メイン画像の先読み(`link`要素の`rel="preload"`)を指定するとよい、という記事を見かけます。

```html
<link rel="preload" href="メイン画像のURL">
```

これは一概によい方法とは言えません。別に**魔法のように画像を別に読み込んでくれるわけではなく、たいていの場合、CSSの読み込みを押しのけて画像を読み込むだけ**です。

CSSが押し除けられた結果、FCPが悪化して結果としてLCPも悪化する結果になることがあります。

ただ、CSSが軽量であったり、FCPが十分に短ければ、多くのユーザーにとってメイン画像の並列読み込みはLCPに有利に働くと想像できます。双刃の剣で、実際にやってみないとわかりません。

# 参考データ

記事中で引用した、通販サイトを中心とした1000ページのPageSpeed Insightsの結果について、指標間の相関性、指標とリソースタイプごとの転送量の相関性を記載しておきます。

いろいろ気づきを得られるデータなので、また別のテーマで記事にしたいと思います。

## 指標の相関マトリクス

それぞれ自然対数による目盛。

![metrics-matrix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/a1576702-c1d7-b06e-3a44-a0ea8863053f.png)

## リソース転送量と指標の相関マトリクス

それぞれ自然対数による目盛。

![resource-matrix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/6732ba50-cc43-7ddf-d9e6-8b7ac94ef848.png)
毎日ABC day21【c++】ABC326 A-C問題解説【ACコード付き】

# AtCoder Beginner Contest 326

https://atcoder.jp/contests/abc326

## A - 2UP3DOWN
2フロア上、または3フロア下までは階段を、それ以外にはエレベーターを使用するルールがある。$X$ 階から $Y$ 階への移動にはどちらを使用するか、という問題。

シンプルな条件分岐で実装できる。

```cpp
int main()
{
	int X, Y;
	cin >> X >> Y;
	if (Y - X >= -3 && Y - X <= 2) cout << "Yes" << endl;
	else cout << "No" << endl;
	return 0;
}
```

## B - 326-like Numbers
3 桁の正整数であって、百の位の数と十の位の数の積が一の位の数と等しい数の中で、$N$ 以上の最小の数を出力せよ、という問題。

Nから1つずつインクリメントしながら、条件を満たした数がきたら出力する。

```cpp
int main()
{
	int N;
	cin >> N;
	for (int i = N; i <= 919; i++)
	{
		int d1 = i / 100;
		int d2 = (i - 100 * d1) / 10;
		int d3 = i % 10;
		if (d1 * d2 == d3)
		{
			cout << i << endl;
			return 0;
		}
	}
	return 0;
}
```

## C - Peak
$N$ 個のプレゼントがそれぞれ座標 $A_i$に置かれている。

数直線上の長さ $M$ の半開区間 $[x,x+M) $にあるプレゼントを全て受け取れる時、最大の受け取れるプレゼント数を求めよ。

最初は座標 $x$　までに受け取れるプレゼント数を累積和で記憶しておく方式を利用しようとしたが、座標の制限が $10^9$ あることに気づいて断念。

プレゼントの個数 $N$ は $10^5$までの制約なので、queueに1つずつプレゼントを追加していき、もし $[x,x+M) $から外れるプレゼントはqueueから外していく方式で実装した。ボトルネックはソートとなり計算量 $O(NlogN)$ 程度である。

```cpp
int main()
{
	// 入力
	int N, M;
	cin >> N >> M;
	vector<int> boxes(N);
	for (int i = 0; i < N; i++) cin >> boxes[i];
	// 昇順でソート
	sort(boxes.begin(), boxes.end());
	long long ans = 0;
	queue<int> q;
	int count_box = 0;
	for (int i = 0; i < N; i++)
	{
		q.push(boxes[i]);
		count_box++;
		while (boxes[i] - M + 0.1 > q.front())
		{
			q.pop();
			count_box--;
		}
		if (count_box > ans) ans = count_box;
	}
	cout << ans << endl;
	return 0;
}
```
CVPR2024で気になったものX(旧twitter)

# `#CVPR2024` のタグのついたX(旧twitter)の投稿から、気になったものを抜粋。



https://x.com/ericyi0124/status/1802560553648623688

手と手で持っている対象物に対するセグメンテーション


https://x.com/andrewhowens/status/1788348190892163236

３Dのデータとともに、対象物の表面の触覚情報を扱っている。

https://x.com/Vinc3nt_Leroy/status/1802473208714797093

多視点画像からの点群の構築

https://x.com/BaeGwangbin/status/1783135532111086054

物体表面の法線を予測している。そのためdepthが安定しているように見える。

https://x.com/ShangjieXue/status/1802720638941208992

3Dの再構築では不確かさがある。その不確かさを可視化している。

https://x.com/yash2kant/status/1801691793425318032

３D画像の生成

https://x.com/jianwang_mpi/status/1802413126043791660

魚眼カメラの自己視点画像での自分自身に対する３Dの復元

https://x.com/nicougrinovic/status/1801959065414779294
動画から３Dのポーズ推定時に物体の衝突を正しくとりこむ