OmniAICreator/Qiita-1.07M huggingface dataset:
MySQL でスキーマをリネームしたい

# 2行結論

MySQL でスキーマのリネームは不可能
スキーマ間のテーブル移動は出来るので、RENAME TABLE を使って擬似的にリネームを実現させる

# サンプル要件

hotels2022 スキーマを hotels2023 スキーマにリネームしてほしいとの依頼

ただリネームは不可能なので **hotels2022 スキーマにある全てのテーブルを、新規で作成したスキーマ hotels2023 に移動** という手段で実現させる

# 手順まとめ

※上記のサンプル要件に合わせて書いていますので、コピペする場合は自身のスキーマ名とテーブル名に変更して実行してください

## 移動元のスキーマを新規作成

```sql
CREATE DATABASE hotels2023;
```

## hotels2022 の全テーブル名を取得

```sql
select 
    table_name
from 
    information_schema.TABLES 
where 
    table_schema = 'hotels2022'
;

-- 実行結果
table_a
table_b
table_c
table_d
table_e
table_f
table_g
```

## RENAME TABLE を使って、hotels2022 から hotels2023 へ移動させる

上記SQLで取得した全テーブル名を利用して、下記のSQLを作成して実行
hotels2022 にあったテーブルが、hotels2023 に移動する

```sql
RENAME TABLE
    hotels2022.table_a TO hotels2023.table_a,
    hotels2022.table_b TO hotels2023.table_b,
    hotels2022.table_c TO hotels2023.table_c,
    hotels2022.table_d TO hotels2023.table_d,
    hotels2022.table_e TO hotels2023.table_e,
    hotels2022.table_f TO hotels2023.table_f,
    hotels2022.table_g TO hotels2023.table_g
;
```

全レコード数が5000万くらいのスキーマで70秒くらい掛かりました

## 移動元のスキーマを削除

```sql
DROP DATABASE hotels2022;
```

これで擬似的にスキーマのリネームが実現できました
stabilityAIがMistralベースの日本語LLMを公開しました:Japanese Stable LM Gamma 7B

昨日、stabilityAI（Stable Diffusionの開発元）がMistral-7bを基に継続学習した日本語LMMを公開しました。
汎用モデル「Japanese Stable LM Gamma 7B」と、指示モデル「Japanese Stable LM Instruct Gamma 7B」があります。
Mistralベースであるため、商用利用も可能です。
また、3bのモデルもあって、そちらは自社の3b英語モデルからのfinetuningです。
私は最近結構Mistralでfinetuningしてますので、次はJapanese Stable LMもチューニングしてみたいと思います。
 
早速指示モデル（Instruct）を試してみました。（下図）
![10-27-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/c08f51db-5ea3-3d26-5d0a-60434a59e6f1.png)

質問は「英語で"は" と "が" の違いを説明してください」としましたが、回答が勝手に日本語になってしまいますね。
Mistralベースからの継続学習なので、英語も日本語も両方強いと思いましが、そうでもないらしいです。（プロンプトの調整が必要かもしれません）。
 
興味ある方試してみてください。
https://ja.stability.ai/blog/japanese-stable-lm-3b-4e1tjapanese-stable-lm-gamma-7b
パソコンでyoutubeのグルグルがなくなりました。

# はじめに
最近、とみにyoutubeを見ていると、グルグルのアイコンが出て、再生が停止しています。何でだろうと不思議に思っていました。その時は仕方がなく、スピーカー側に接続している、USBコネクターを抜き差しして解消していましたが、すくに再びグルグルとなります。
今回、落ち着いて、考えてみました。Wi-Fiのネットワークが混んでいるのかとか。それとも、パソコンの低速のWi-Fiカードが原因なのかとか。また、JCOMのWi-Fiインターネットを高速のものに変えてみようかとか考えました。まず、パソコンのWi-Fiカードを現行の2.4Gから5G用に交換してみました。しばらく、様子を見てみましたがやはり、同じでグルグルが出ます。おかしいと思い、ネットで調べました。すると、USBの電源設定に問題がありそうだとわかりました。
ここでは、そのUSBの電源設定の他、Bluetooth接続での接続結果についても記述します。
# USBの電源設定
ネットには、USBが電力不足のため、接続が切断されているとでていました。グルグルは、パソコン側でUSBの再接続を見ているようです。そのため、いったん、USBコネクターを外し、再接続するとその時は接続されてグルグルは取れるようです。しかし、しばらくすると再び、電力不足が起こり、グルグルが出ます。
この状態を解消するため、電源設定を変更します。
デバイスマネジャーを開くと、ヒューマンインターフェィスデバイスの項目があります。そこをクリックします。いくつかのUSB入力デバイスが出てきますので、それをクリックします。そこで、電源の管理をクリックすると、「電力を節約するために.....」という項目に☑がついていると思いますので、それを外します。他のusb入力デバイスも同様に外しておきます。

参考にしたサイトは以下です。
[Windows 11/10でUSB機器・Bluetooth機器が認識されない場合動作が不安定な場合の対処方法](https://www.sanwa.co.jp/seihin_joho/windows10_usb/index.html)
[やってはいけないPCの危険行為。②](https://blog.goo.ne.jp/tanuki-02/e/e7148b294196de97c74bc25d87779b4e)

#### (1) 対策の結果
この対策後は、グルグルはなくなったようです。併せて、スピーカとパソコンの接続を見直しました。
スピーカーはCDコンポのスピーカー(15W)を使用しています。Nobsoundという小さなスピーカー接続デバイスを使用するとUSBまたはBlueToothでパソコン側と接続できます。
使用しているパソコン(Dell inspiron620s)には、bluetoothがないため、USBチップのbluetoothトランスミッター/レシーバを使用しています。USBケーブルで接続しても、bluetoothで接続しても、今のところ、グルグルは出ていないようです。
#### (2)なぜグルグルは出ていたのか
USBの電源不足と言っても、そんなにUSBを使ってはいないのですが、元々の設定だと、何等かの原因でUSB接続が切れたので、パソコンがUSBの再接続を監視してグルグルを表示しているようです。
それにしても、何で接続が切れたのだろうか。スピーカの電力消費が限度を超えたのだろうか、そういえば、イャフォンやヘッドフォンの時はこのグルグルはなさそうであるが。
スピーカーが15Wの消費電力でもこれは最大電力時ということなので常時ではないはず。Nobsoundというデバイスの消費電力がUSBの電力供給能力を超えたからなのか。
#### (3) USBケーブルで接続した場合
NobsoundのUSB端子とパソコンのUSB端子をUSBケーブルで接続しました。この場合も、グルグルは出ていません。
やはり、原因は、USBの電源設定だったのか。当初は、Wi-Fiのネットワークが混んでいると思っていたがそうではなかったようです。しかし、Wi-Fiカードは5G対応に変更しました。
#### (4) バスパワー型4口ハブではグルグルがでる
やはり、このUSBハブを使うと電力不足になるのか。スピーカー側のNobsoundとの相性が悪いのか。仕様上は100mA以下は大丈夫ということだが。Nobsound側が100mAも消費しているとは思えないが、なぜUSB接続が切断されるのか。
#### (5) 次は、セルフパワー型のUSBハブにしようかと
次は、セルフパワー型のUSBハブでテストしてみたい。これで電力不足が解消すれば、バスパワー型のUSBハブの問題だと特定できると思う。
以下は、今回のイラスト図です。
![グルグル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198006/f7d597d6-83b2-85c0-7eda-b1099cf19b15.png)
電力設定で、電力を節約する☑を外した後でもUSBハブを入れるとグルグルはでていましたが、USBハブを外して直結するとでなくなりました。
#### (6) BlueTooth接続状況
bluetoothでパソコンとスピーカを接続した状況は、ほぼ良好です。グルグルは発生していません。パソコン側には無線audio adapterでbluetooth接続しています。古いパソコンなので、bluetoothが搭載されていません。スピーカー側はNobsoundのbluetoothで接続しています。次は、Wi-Fiカードにあるbluetooth機能をセットアップして接続してみようと思っています。
#### (7) 再現テスト
(1)USBハブ経由のUSBケーブル直結
(2)USBハブ経由のBlueTooth接続(wireless audio adapter)
上記の接続で確実にグルグル(USBハブの電力不足)が出ました。




# 今回の考察
今回のグルグルは、今の最終的な結論は、原因はバスパワー型のUSBハブの電力不足によりパソコンのシステムがそのデバイスとの接続を切断したのではないかと理解しています。その後、再接続を監視するために、グルグルマークを表示しているのではと。USBコネクターを抜き差しするとその場は復帰するのでそうかなと理解しています。しばらくするとまた、電力不足でグルグルははじまりますが(対策してないと)。






# あとがき
結論はまだはっきりとしませんが、とりあえず、二つの対策で現在は、快適に動作しています。タイトルにあるyoutubeが原因ではなかったと理解しています。一つは、USBの電源設定で二つ目はバスパワー型のUSBハブを外したことです。もしかしたら、セルフパワー型のUSBハブであれば、グルグルは取れるかもしれませんので、次回は試してみたいと思います。
MinecraftServer機の移行をしてみた ~その１~

# Minecraft Server 移行その１
3回に分けて記事にしていこうと思います。

## 今日はOSのインストールまでをやっていこう
インストールするOSは定番Ubuntu20.04  

## インストールメディアを用意するところから始める
事前準備としてUSBメモリ8GB以上のものがあるとします。  

Ubuntu公式ホームページからISOファイルをダウンロードしてきます。

https://jp.ubuntu.com/download

![ubuntu install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535173/e90b4e1d-de22-8248-abf4-4a46cc957963.png)
私はUbuntu Server 22.04.3 LTSを選択しました。

## ISOファイルをUSBメモリに書き込む
ISOファイルを書き込むためにフリーソフトである **Universal-USB-Installer** を使おうと思います。  

https://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/#Universal-USB-Installer-UUI-Easily-USB-Boot

このページの下部にある **Download Universal USB Installer** からダウンロードできます。  

ソフトを起動して指示通りに書き込んでいけば無事にインストールメディアを作ることができると思います。  
使い方がわからなければ公式ページにすべて載ってたのでみてください。

## インストールメディア完成後
Ubuntu 20.04 をインストールするPCにUSBをさしてBootすればインストール選択画面に行くと思います。  
もしインストール画面に行かなければBootメニューからUSB　Bootの優先度を上げてみてください。

## 終わりに
今回はUbuntuのインストールメディアを作るところまでを記事にしました。  
次はOSセットアップまでいければいいなと思ってます。  

 **その２へつづく**
【efw紹介】Efwとは

EFW(Escco-Framework)とは、エスコ・ジャパン株式会社が目的指向の手法を用いて設計・開発したサーバサイドJavaScriptのAjaxフレームワークです。EFWを導入することで、WEB開発のプログラム量の大幅削減や、レビュー・仕様変更の迅速な対応が可能になるなど、WEB開発の難易度を下げることができるさまざまな特長があります。JavaのWEB開発に課題を抱えているお客様は、ぜひEFWの利用をご検討ください。

# １、プログラムの可読性
プログラムの可読性とは、プログラムの目的や処理の流れの理解しやすさを指しています。　　(From : wiki/可読性)
プログラムの「理解しやすさ」として以下の２つが考えられます。
- 目的の理解しやすさ
プログラムの粒度は、設計書の粒度とマッピングしやすいか否か
- 処理流れの理解しやすさ
プログラムの記載順番は、設計書の記載順番とマッピングしやすいか否か

そして、従来のWEB開発における問題は以下の通りです。
- 問題１、仕様書の１行に対して、プログラムは数十行で組まないといけない。
- 問題２、仕様書の明瞭な処理順番に対して、プログラムは至る所に遷移するため、プロでないと処理順番をはっきり読み取ることができない。
# ２－１、従来のWEB開発における問題1
以下の図は問題1を表します。基本設計にはわずか１０行ですが、MVC構成のプログラムなら１００行を超えるでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/7eee5bc4-b117-e8a1-eebf-b8849185c872.png)
# ２－２、従来のWEB開発における問題2
以下の図は問題2を表します。従来WEB開発のプログラムの流れは複雑で基本設計と比較すると、まるで別物のようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/5ffcfc4c-a7da-5209-fa29-2b971ae7a5e7.png)

# ３、Efwのスローガン
上記WEB開発の問題を解決するため、Efwは以下の方針を掲げます。
### <font color=red>Ajax</font>と<font color=red>サーバサイトJavaScript</font>を用いて<font color=red>目的指向</font>で、高速にWEBシステムを構築できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/2aa48db9-026e-a5a9-2c8f-89a425480fea.png)

ソース公開：
https://github.com/efwGrp/efw4.X
情報処理学会収録論文：
http://id.nii.ac.jp/1001/00147552/

# ４－１、従来問題１の解決
問題1に対して、Efwを用いると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/871c8288-cdd7-ff2d-633b-e954e2a0c2b4.png)
WEBシステム開発には、「<font color=red>パラメータ受信・入力チェック・ データ表示・活性非活性・表示非表示・画面遷移</font>」などの処理があります。Efwはそれらをパターン化して、WEB画面開発の<font color=red>専用言語(DSL)</font>を設計・実装します。言い換えると「<font color=red>入力データ収集と処理結果表示の自動化</font>」です。

# ４－２、従来問題２の解決
問題2に対して、Efwを用いると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/e0c8ecb2-a998-8331-62c8-384de21b549d.png)
Efwの仕組みには、<font color=red>クライアント動作</font>や<font color=red>サーバ動作</font>に関係なく、ロジックはほぼ全部<font color=red>イベントJSファイル</font>に集中します。また、「<font color=red>目的指向</font>」のため、<font color=red>プログラムの粒度は設計書の粒度とマッピング</font>しやすいです。そして、<font color=red>イベントJSファイル</font>のみで<font color=red>処理の流れ</font>を分かりやすく<font color=red>読み取れます</font>。

# ５、Efwのメリット
Efwのメリットは、以下の図で表します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/5b44ada1-a7cd-ce10-65a7-72fc349dd71b.png)
Petalinuxでmozc

Mozcの標準入出力で動く機能に限定してpetalinuxで動作できないかお試し中

実行ファイルのサイズは30Mbyte程度でそこそこ大きいけど辞書データが20Mbyte程度あるから仕方ないかも

あとは実機で実際に動作させてどの程度のレスポンスで動作するかかな

変なつっこみ入らないといいけど
npm と npx の違い【Node.js】

# はじめに

今回の記事は、JavaScript および Node.js の初学者向けの内容になります。

JavaScript（Node.js）で開発している時に目にする「npm」と、似たような言葉に「npx」というものが存在しますが、それぞれどういった機能があるのでしょうか。

# 概要

- 結論
- npm
- npx
- 違いは？

# 結論


|  名前  |  説明 |
| ---- | ---- |
|  npm  |  JavaScript用の **パッケージマネージャー** のことで、またその機能を使用するためのコマンド。npm i ~ とすることで必要な機能をインストールできる |
|  npx  |  **ローカルにインストール（npm i ~）されていない機能を一時的にインストールして実行する** ためのコマンド  |

一時的に実行したいだけの機能であれば、npx を使用することでローカル環境を汚さずに実行することが可能。
そうでない場合（開発中のソースコードでライブラリを使用する、等）は、常に使用できるように npm でインストールする。

# npm

npm は、「**Node Package Manager**」の略で、Node.jsをインストールすると利用することができるパッケージマネージャーです。

インストールすると、npm というコマンドが使用できるようになります。

:::note info
※パッケージマネージャーとはその名の通りパッケージを管理するツールで、公開されているモジュールなどを利用するためにあります。
:::

例えば `npm install モジュール名` を使用することで必要なモジュールをインストールすることが可能です。

npm は、それ自体ではコマンドや機能の実行は行わず、あくまでもインストール／アンインストールというようにローカルの機能を管理することが目的になります。

# npx

npx は **ローカルにインストール（npm i ~）されていない機能を一時的にインストールして実行する** ためのコマンドになります。（一時的にインストールするため、実行後は削除されます）

npx は、「**Node Package Executer**」の略で、パッケージの実行ツールになります。
こちらも npm と同様にNode.jsをインストールすることで使用可能なコマンドです。

例えば、`npx create-react-app` を実行すると、

1. create-react-app がインストールされる（npm install create-react-app）
1. create-react-app が実行される
1. create-react-app がアンインストールされる（npm uninstall create-react-app）

といったようになり、ローカル環境を汚すことなく一時的に任意の機能を実行することができます。

:::note warn
npm でインストールしたパッケージは ローカルの node_modules ディレクトリに格納されますが、実行するときは package.json の script に コマンドを紐づけた上で、 `npm run package.jsonのscriptに定義したコマンド名` で実行することが一般的です。（npm install でインストールしただけではパスが通っていないため）
:::

# 違いは？

npm はパッケージを管理するためのツールであり（package.jsonのscriptで定義すれば実行も可能ですが）、npx は npm によってローカルにインストールされていない機能を一時的に使用するもの、と考えてよさそうです。

|  名前  |  説明 |
| ---- | ---- |
|  npm  |  JavaScript用の **パッケージマネージャー** のことで、またその機能を使用するためのコマンド。npm i ~ とすることで必要な機能をインストールできる。（基本的にはインストール／アンインストールといった管理がメイン、package.jsonのscriptに定義することで npm から実行することも可能） |
|  npx  |  **ローカルにインストール（npm i ~）されていない機能を一時的にインストールして実行する** ためのコマンド  |

個人的な使い分けとしては、

- npm：テストやコードの解析ツール（Lint）など、開発における決まった操作や機能に再現性を持たせたい場合。またアプリケーションで使用する機能のインストール
- npx：一時的に機能を使用する場合

のような感じです。

# 最後に

npm に関連して、package.json や package-lock.json についても今後別の記事でまとめる予定です。

最後まで読んでいただきありがとうございました。
Image.asset()が表示されない際の解決法 【Unable to load asset】

### ◎原因

---

pubspec.yaml

```yaml
assets:
#    - images/evangelion.jpg
#    - images/oneokrock_letmeletyougo.jpg
#    - images/oneokrock_wonder.jpg
#    - images/0701.jpg
#    - images/twitter.jpg
- images/
```

### ◎解決策

---

```yaml
  assets:
#    - images/evangelion.jpg
#    - images/oneokrock_letmeletyougo.jpg
#    - images/oneokrock_wonder.jpg
#    - images/0701.jpg
#    - images/twitter.jpg
- images/
```

`assets:`の前に半角スペースを2つ入れた

### ◎解決の要因

---

ググった
TouchableHighlightは一つしか子要素を持てない。

# TL;DR
`TouchableHighlight`は一つしか子要素を持てない。

# バグが発生した状況
React Native(Expo使用)で`Uber eats`アプリのUIを再現しようと作業中。

商品をクリックした際のUIを模倣していたところ、どうやらタップした際に背景が明るくなる`TouchableOpacity`ではなく、背景を暗く設定できる`TouchableHighlight`の方が適していることがわかった。

しかし、**`TouchableOpacity`を利用していた場所をそのまま`TouchableHighlight`にしたらエラー(React.Children.only expected to receive a single React element child.)が発生してしまった。**

<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366994/97abe2b0-777f-bb08-3693-b3855751eb19.png" />

エラーが起きた時のコードの再現
```tsx
const Product = (props: Props) => {
  const _onPressButton = () => {
    Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium);
  };
  return (
    <TouchableHighlight
      style={styles.container}
      onPress={_onPressButton}
    >
      <View style={styles.img}>
        <TouchableOpacity style={[styles.plusButton, styles.center]}>
          <Text>+</Text>
        </TouchableOpacity>
      </View>
      <View style={styles.description}>
        <Text>¥228</Text>
        <Text>美味しい水(500ml)</Text>
      </View>
    </TouchableHighlight>
  );
};
```

# 解決方法

[公式ドキュメントで調べたところ、](https://reactnative.dev/docs/touchablehighlight)`TouchableHighlight`は

> TouchableHighlight must have one child (not zero or more than one). If you wish to have several child components, wrap them in a View.

と書かれており、TouchableHighlightの子要素は一つである必要があり、複数子要素を持ちたいときは`<View>`でラップする必要があった。

というわけでドキュメントの通りに`View`でラップしたところ画面が正常に表示された。

```tsx
const Product = (props: Props) => {
  const _onPressButton = () => {
    Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium);
  };
  return (
    <TouchableHighlight
      style={styles.container}
      onPress={_onPressButton}
      activeOpacity={1}
      underlayColor={"#eee"}
    >
      <View>
        <View style={styles.img}>
          <TouchableOpacity style={[styles.plusButton, styles.center]}>
            <Text>+</Text>
          </TouchableOpacity>
        </View>
        <View style={styles.description}>
          <Text>¥228</Text>
          <Text>美味しい水(500ml)</Text>
        </View>
      </View>
    </TouchableHighlight>
  );
};
```

ちなみに`TouchableHighlight`のpropsである`activeOpacity`は`underlayColor`と一緒に設定する必要がある。

<img width="750" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366994/df624df2-2173-ca8d-d5e8-8bc1e4318e5e.png"/>

正常に動作していることがわかる。

# まとめ

`TouchableOpacity`と`TouchableHighlight`は持つことのできる子要素の数が異なる。
ASP.NETでビルド構成ごとにapp.configを切り替える

 Visual Studioのバージョンが古い、TransformXmlを使って切り替えたいがビルドエラーになってしまう、などの理由がある人向けです。あまり需要はないと思いますが、メモとして。
- - -
あらかじめRelease用、Debug用のapp.configを作っておき、csprojのPropertyGroupに以下のようにappConfigタグをそれぞれに追加します。それだけです。

```
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <appConfig>app.Debug.config</appConfig>　
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <appConfig>app.Release.config</appConfig>
  </PropertyGroup>
```
MAUI Tips - Skia利用時の注意点（画像縮小）

# 概要
カメラで撮影した画像を編集するようなアプリを作成時に、
ちょっと困った話の備忘録

# 環境
Visual Studio for MAC
.NET MAUI
.NET 7

動作確認はAndroidタブレットとエミュレーターで確認。
他のOS向けビルドでは未確認。

# 現象
カメラで撮影した画像データを縮小させる処理を考える。
以下のようなソースコードを作成して実行してみたけど、
Downsize関数がNullを返してくる。

```C#
 public void SetImage(Stream stream)
{
    IImage image = SkiaImage.FromStream(stream, ImageFormat.Jpeg);
    IImage smallImage = image.Downsize(1024, false);
    // →smallImage1にはnullが代入される。
    //  元のimageも縮小されていなかった。

    //・・・・・・
}
```

Downsize関数の詳細はこちら
[https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.maui.graphics.skia.skiaimage.downsize](https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.maui.graphics.skia.skiaimage.downsize?wt.mc_id=AZ-MVP-4028478&view=net-maui-7.0#microsoft-maui-graphics-skia-skiaimage-downsize(system-single-system-boolean))

# とりあえずの回避策
Microsoft.MAUI.GraphicsのIImageのDownsize関数は
正常に動作しているので、一旦こちらで縮小かけて、
SkiaImageのIImageに変換するという荒技で一旦実現。

```C#
public void SetImage(Stream stream)
{
    IImage temp = PlatformImage.FromStream(stream, ImageFormat.Jpeg);
    temp = temp.Downsize(1024, false);
    IImage image = SkiaImage.FromStream(temp.AsStream(), ImageFormat.Jpeg);

    //・・・・・・

}
```
Microsoft.MAUI.GraphicsのIImageから、
SkiaImageに直接変換してくれる処理は無いので、
Streamにして変換してみた・・・。

Microsoft.MAUI.GraphicsもSkiaも初めて使ったけど、
使い方が間違っているんだろうか・・・。
サンプルがかなり少なくて困る・・・。
Trelloユーザー注目！ブラウザでWebページを即座に( 2クリックで )カード化する方法 | Trello公式ブックマークレットの応用【動画 11分53秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![99 サムネイル Trelloユーザー注目！ブラウザでWebページを即座に( 2クリックで )カード化する方法 _ Trello公式ブックマークレットの応用【動画 11分53秒】.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/1b501157-acde-84eb-070a-a592a329897d.png)




* # 動画URL
    * https://youtu.be/aXXpfyxlAS4

<br>

* # 動画タイトル
    * Trelloユーザー注目！ブラウザでWebページを即座に( 2クリックで )カード化する方法 | Trello公式ブックマークレットの応用【動画 11分53秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2023-07-06(木)

📝【応用編】Webページを即座に( 2クリックで )カード化し、そのWebページリンクをTrelloカードの「説明欄」に追加するブックマークレット( JavaScript )

javascript:(function(w){w.open(`https://trello.com/ja/add-card?name=${encodeURIComponent(document.title)}&desc=${encodeURIComponent(w.location.href)}&mode=popup`,'add-trello-card',`width=500,height=600,left=${w.screenX+(w.outerWidth-500)/2},top=${w.screenY+(w.outerHeight-740)/2}`)})(window)


以下のWeb記事が大変参考になりました。
ありがとうございます！

🔗Add to Trello の代わりになる、Trello用ブックマークレットを作った - モノラルログ
　https://matsuoshi.hatenablog.com/entry/2022/01/04/152116


余談ですが、記事の中で紹介しているGoogle Chrome拡張機能も含めて、以下の3つはどれも同じ目的で作られたTrello用拡張機能です。
そして、残念なことに、Google Chromeではどれもまともに機能しません。
これらの拡張機能に時間を費やすことは無駄なので、この動画を見ていただいた方に時間の浪費をしていただきたくないので、紹介しておきます。

1. Add to Trello - Chrome ウェブストア
　https://chrome.google.com/webstore/detail/add-to-trello/engmocckoohpopiacajolojeobefbcec/related

2. Add this page to Trello - Chrome ウェブストア
　https://chrome.google.com/webstore/detail/add-this-page-to-trello/fjfljghieliggacelkamhfiiejncmjmi?hl=ja

3. Add a link to trello - Chrome ウェブストア
　https://chrome.google.com/webstore/detail/add-a-link-to-trello/ngignckpjkimcpnlphkbgpnbpnicnffe/related?type=ext&hl=ja-JP


-----


⏳開始時間
　00:00 イントロ
　00:33 本編開始

　01:20 デモ 実演 開始
　　└ 02:06 基本編
　　└ 02:27 応用編

　　└ 03:13 基本編と応用編の、結果の違い解説

　05:18 もしも手動で、Webページリンクを追加したTrelloカードを作ると、これだけ手間も時間もかかります

　06:30 解説 WebページリンクをTrelloカードの「説明欄」に追加するブックマークレットの作り方、使い方
　　└ 10:18 応用編


-----


✓ These are the services I've used and the information and materials related to this video. | 今回使ったサービスと、関係する情報、関係資料 ↙
　・Add to Trello の代わりになる、Trello用ブックマークレットを作った - モノラルログ
　https://matsuoshi.hatenablog.com/entry/2022/01/04/152116


✓ 🎥My videos are strongly related to this video. | この動画と関連が強い私の動画 ↙
　・“効果的にTrello( トレロ )を活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOSQ6yPHmqIJDID8qzXvCkL


　・“無人化、自動化のヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOWXRAE3hzACocPV0y75oN_


　・“手放すヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOBpnvo_FxkVzgo9QZ4wt1I
Googleスプレッドシート印刷時の問題、プルダウンリストの初期設定の背景色(角丸のグレー)を消す方法 → 【結論】「表示スタイル」を変更すればOKです【動画 10分28秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![99 サムネイル Googleスプレッドシート印刷時の問題、プルダウンリストの初期設定の背景色(角丸のグレー)を消す方法 → 【結論】「表示スタイル」を変更すればOKです【動画 10分28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/6f712fa1-655f-f7d3-4b3a-d0575f17f006.png)




* # 動画URL
    * https://youtu.be/PZCBykotUDI

<br>

* # 動画タイトル
    * Googleスプレッドシート印刷時の問題、プルダウンリストの初期設定の背景色(角丸のグレー)を消す方法 → 【結論】「表示スタイル」を変更すればOKです【動画 10分28秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2023-09-14(木)

Web検索をしていて出会ったり、知ったりした「お困りごと」に対するわたしのアイデアを、自発的に動画にいたしました。
参考になるとうれしいです。


-----


⏳開始時間
　00:00 イントロ
　00:30 本編開始

　00:50 今回のお困りごと
　　└ Googleスプレッドシート印刷時の問題、プルダウンメニューの初期設定の背景色( 角丸のグレー )を消す方法をおしえてください
　　　└ Googleスプレッドシートをご利用の際、お気づきかと思いますが、プルダウンメニューはデフォルトで角丸のグレー色の背景を持っています
　　　└ この色は、GoogleスプレッドシートのUI(ユーザーインターフェース)上で文字色やセルの背景色を白( #FFFFFF )に設定することで、一見非表示にすることが可能です
　　　└ しかしながら、「未選択状態」のプルダウンメニューでは、角丸のグレー背景色が表示、印刷されてしまいます
　　　└ この印刷時のグレー背景を非表示にする方法やアドバイスがあれば、ご教示いただきたく存じます

　01:47 お困りごとの再現

　03:39 具体的なアイデア
　　└ データの入力規則の下部にある「詳細オプション」から、「表示スタイル」を変更すればOKです
　　　└ 「表示スタイル」の初期設定「チップ」から → 「矢印」か「書式なしテキスト」に変更すればOK
　　　└ どちらでもよいが、山中のおすすめは「矢印」
　　　└ 理由は、プルダウンリストを設定しているセルを可視化しやすいから

　06:00 その他のTips( お困りごととは直接関係がない技術 )
　　└ プルダウンリストで効果的な、Googleスプレッドシートのおすすめキーボードショートカット
　　　└ 「@」アットマークキー → プルダウンリストの新規作成
　　　└ 「Enter」エンターキー → 作成ずみプルダウンリストの表示と決定( 選択は矢印キーの上下 )


-----


✓ 🎥My videos are strongly related to this video. | この動画と関連が強い私の動画 ↙
　・“効果的にGoogleスプレッドシートを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPKt1RQjiH2Dw-iNtB1xqd_


　・“効果的にキーボードショートカットを活用するヒント”シリーズ
　https://youtube.com/playlist?list=PLpQhBHT4oghPdR4gdLX71q9uYZZV-JkEz


　・“お困りごと解決のアイデア( IT関係 )”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghNpxYLg6UoZPzXms7el4lLE


　・“IT関係のトラブル事例、解決のヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPTpaxjR7Y8SWpKUu_0q-uB


　・“マインドマイスター( クラウド型マインドマップ )でのプレゼンテーションの例”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMXJCYhmWK4bjAUG1uy78li
Googleドキュメント「構成要素」の挿入方法【有償プラン限定機能】「新しいカスタム構成要素」の新規作成、保存、保存後の編集で「自作の構成要素」を活用しよう【動画 9分28秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![99 サムネイル Googleドキュメント「構成要素」の挿入方法【有償プラン限定機能】「新しいカスタム構成要素」の新規作成、保存、保存後の編集で「自作の構成要素」を活用しよ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/2ec536a2-6a37-8dbb-262c-2b8f0ceefbc2.png)




* # 動画URL
    * https://youtu.be/6rwXxmsSgYo

<br>

* # 動画タイトル
    * Googleドキュメント「構成要素」の挿入方法【有償プラン限定機能】「新しいカスタム構成要素」の新規作成、保存、保存後の編集で「自作の構成要素」を活用しよう【動画 9分28秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2023-09-20(水)

GoogleドキュメントやGoogleスプレッドシートなどのGoogle Office Suiteを操作しているときに「@」キーを押すことで、様々な便利機能を一瞬で呼び出すことができます。
これは「Smart Canvas」という機能の一部で、2021年からGoogle Workspace/Google Office Suiteに追加され、進化をつづけています。
( https://bit.ly/yoshidumi-2021-07-26 )

Googleドキュメントの「カスタム構成要素の作成機能」( 自作構成要素の新規作成、保存、保存後の編集 )は、2023年5月に、Google Workspaceの「有償プラン限定」で追加されました。
( https://bit.ly/googleblog-2023-05-26 )

今回の動画では、最初に無償Googleアカウント( @gmail.com, @googlemail.com )でもつかえる機能を紹介しています。
そのあとで、有償Googleアカウントでつかえる機能を紹介しています。


-----


⏳開始時間
　00:00 イントロ
　00:21 本編開始

　00:35 Googleドキュメント「構成要素」の挿入とは？
　　└ Googleドキュメントの中に表を挿入したり、様々な便利機能をGoogleドキュメントの中に挿入することができる機能です。

　00:49 @( アットマークキー )を押すだけで、構成要素や、様々な便利機能を一瞬で呼び出すことができます。

　01:01 無償Googleアカウントでもつかえる機能の紹介
　　└ 01:26 おすすめは「レビュートラッカー」を挿入して、プロジェクトやタスクの進捗を見える化すること。
　　└ 01:57 ただし、無償Googleアカウントでは、Googleが提供している構成要素しかつかえません( 自作の構成要素をつくれません )。


　02:36 有償Googleアカウントでつかえる機能の紹介
　　└ Googleドキュメントで@( アットマークキー )を押すと、無償Googleアカウントでは表示されない項目をつかえるようになります。
　　└ 03:14 「カスタム構成要素の作成機能」もつかえます。
　　└ 03:25 過去につくっておいた「自作の構成要素」を一瞬で挿入できます。

　03:31 山中が自作した「カスタム構成要素」の紹介
　　└ 習慣トラッカー テンプレ
　　└ 習慣トラッカー サンプル( 入力ずみ )

　04:17 複数の「カスタム構成要素」を活用する方法

　05:43 「新しいカスタム構成要素」の作成方法

　07:49 自作カスタム構成要素の「タイトル」が途中までしか表示されないときの対処方法


-----


✓ 🎥My videos are strongly related to this video. | この動画と関連が強い私の動画 ↙
　・“効果的にGoogleドキュメントを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMUrIOwmMsyskykk-8O6utH


　・“Google Workspaceの有償プラン限定機能を活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMrd_5ByDuXMOIc1n-NplBm


　・“デモ・マニュアル動画”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMJJv4wKFZDT03S2qmL2pkR


　・“時間をかけずに効果的な「プレゼンテーションをする」「資料を作る」ヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghN6iYl74YGhDZWNFiIHK5-c


　・“効果的にキーボードショートカットを活用するヒント”シリーズ
　https://youtube.com/playlist?list=PLpQhBHT4oghPdR4gdLX71q9uYZZV-JkEz
【GAS】コピペでOK、Googleスプレッドシートの過去の日付行を自動的に非表示にする方法【サンプル】Amazon配達予定表(PCとスマホで詳しく解説)【時間 23分36秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![99 サムネイル 【GAS】コピペでOK、Googleスプレッドシートの過去の日付行を自動的に非表示にする方法【サンプル】Amazon配達予定表(PCとスマホで詳しく解説)【時間 23分36秒】.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/801b84b4-f9a9-77ac-5d4f-2be02ea1ae34.png)




* # 動画URL
    * https://youtu.be/Hsx7pcXweBU

<br>

* # 動画タイトル
    * 【GAS】コピペでOK、Googleスプレッドシートの過去の日付行を自動的に非表示にする方法【サンプル】Amazon配達予定表(PCとスマホで詳しく解説)【時間 23分36秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2023-09-23(土)

📊【テンプレ】過去の日付行を自動的に非表示 | Googleスプレッドシート
　https://bit.ly/AutoHideDates-2023-09

　https://docs.google.com/spreadsheets/d/1rcYne3nxEtHy8lMbfFRnAVI0sXoLArL4QjWoP4SH4js/copy


📊【サンプル】配達 配送 予定表 オンラインショッピング Amazon 楽天 Yahoo!ショッピング Mercari 家族や知人 | Googleスプレッドシート
　https://bit.ly/AutoHideDates-2023-09-Sample01

　https://docs.google.com/spreadsheets/d/1LxnfyEdKJddxhnolezJ13f3gHnT3B2LfcGmIA5IxSoE/copy


-----


⏳開始時間
　00:00 イントロ
　01:05 本編開始

　01:20 「📊【テンプレ】過去の日付行を自動的に非表示 | Googleスプレッドシート」の解説
　　└ 02:11 このGoogleスプレッドシートはコピーしてつかってください。 https://bit.ly/AutoHideDates-2023-09
　　└ 02:40 「承認が必要」ダイアログ( このドキュメントに添付されたスクリプトを実行するには、あなたの許可が必要です )の手順( 最初の1回だけすればOKの作業です )
　　└ 03:33 GASのトリガー設定方法
　　└ 05:17 このGoogleスプレッドシートを加工して、あなた独自の配置( レイアウト )でつかうために、GASのスクリプトエディタで編集する点


　06:30 「📊【サンプル】配達 配送 予定表 オンラインショッピング Amazon 楽天 Yahoo!ショッピング Mercari 家族や知人 | Googleスプレッドシート」の解説
　　└ 06:59 このGoogleスプレッドシート( ワークブック )に存在する、2つのシート「配達予定表」「動的プルダウンリスト」の説明
　　└ 07:15 シート名「配達予定表」の説明
　　　└ 09:50 「関数コピペ」ボタンの説明( 2つめのGAS”数式を最終行までコピペするコード”の解説です )
　　　└ 10:51 日々の運用( PCでの操作 )
　　　└ 12:14 日々の運用( スマホでの操作 )

　　└ 11:25 シート名「動的プルダウンリスト」の説明
　　　└ プルダウンリストの項目編集を時短化するためにつかいます( 配達もと、など )。

　　└ 15:20 このGoogleスプレッドシートもコピーしてつかってください。 https://bit.ly/AutoHideDates-2023-09-Sample01
　　└ 「承認が必要」ダイアログ( このドキュメントに添付されたスクリプトを実行するには、あなたの許可が必要です )の手順( 最初の1回だけすればOKの作業です。1つ目のGoogleスプレッドシートの解説と同じ手順です 02:40 )
　　└ 16:36 GASのトリガー設定方法
　　└ 18:16 このGoogleスプレッドシートを加工して、あなた独自の配置( レイアウト )でつかうために、GASのスクリプトエディタで編集する点


-----


✓ 🎥My videos are strongly related to this video. | この動画と関連が強い私の動画 ↙
　・“効果的にGoogleスプレッドシートを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPKt1RQjiH2Dw-iNtB1xqd_


　・“Googleスプレッドシートの関数”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMwoHyLyMFhm0N5w-2ieyAV


　・“効果的にGoogleAppsScriptを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMvEXXmEZ_qF47eCNeIwQUf


　・“無人化、自動化のヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOWXRAE3hzACocPV0y75oN_


　・“時短化に効く！ 山中一司が公開しているテンプレート”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOiuMh002hyhvGST_TbqxxU


　・“効果的にキーボードショートカットを活用するヒント”シリーズ
　https://youtube.com/playlist?list=PLpQhBHT4oghPdR4gdLX71q9uYZZV-JkEz


　・“Chromebookのキーボードショートカット”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMe8hjTei6-vqcrZTACCUO_
【GCP】YouTube APIキーの作成方法を解説します【YouTube Data API v3】「動画再生数」や「投稿日時」などの動画情報取得を自動化できます【動画 9分48秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![99 サムネイル 【GCP】YouTube APIキーの作成方法を解説します【YouTube Data API v3】「動画再生数」や「投稿日時」などの動画情報取得を自動化できます【動画 9分48秒】.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/46c9080d-22db-2355-f759-df47a5c54b02.png)




* # 動画URL
    * https://youtu.be/uBSJm2fWbWs

<br>

* # 動画タイトル
    * 【GCP】YouTube APIキーの作成方法を解説します【YouTube Data API v3】「動画再生数」や「投稿日時」などの動画情報取得を自動化できます【動画 9分48秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2023-10-03(火)

🔗Google Cloud コンソール | GCP-Google Cloud Platform
　https://console.cloud.google.com/

YouTube API Keyをつかった無人化 自動化の依頼が増えてきたので、作成方法を動画にしておきました。


YouTubeチャンネル自動化に興味をもったきっかけは、2021年ごろに読んだQiita( https://bit.ly/what-is-Qiita )の記事でした。
とてもわかりやすい記事なので紹介いたします。

🔗【Youtube】APIキーの取得手順（2021/04/08時点のキャプチャ） - Qiita
　https://qiita.com/shinkai_/items/10a400c25de270cb02e4

動画ではなく、Webページ( 文字や写真をのせた記事 )で読みたい方がいましたら、参考になるとおもいます。


最後に、わたしの体験談です。
GCPは信じられないくらい接続が不安定になることがありました。
その場合は、何度も何度も何度も...同じ操作を繰り返したり、Chromeブラウザを再読み込み( リロード )する必要がありました。
GCPの操作には忍耐力が必要だった体験を共有しておきます。


-----


⏳開始時間
　00:00 イントロ
　00:22 本編開始

　00:30 デモ 2種類: 「YouTube APIキー」を活用すると、こういうことができるようになります。
　　└ 00:39 📊YouTubeの動画URLをセル範囲 B3:B に入力すると、自動的に各種動画情報を取得、反映する | Googleスプレッドシート( 動画タイトル、再生数、投稿日時、など )
　　└ 02:32 📊YouTubeの再生リストURLをセル範囲 B3:B に入力すると、自動的に動画本数を取得、反映、自動更新する | Googleスプレッドシート

　04:47 YouTube APIキーの作成方法
　　└ 04:54 Google Cloud Platform( GCP )の利用開始
　　　└ Googleアカウントを取得していることが前提条件です。
　　　└ https://console.cloud.google.com/

　　└ 05:20 新規プロジェクトの作成手順
　　└ 05:33 プロジェクト名の入力方法

　　└ 06:29 APIライブラリの有効化
　　　└ 06:47 APIとサービスを検索の入力欄に「YouTube Data API v3」と入力します。

　　└ 07:31 認証情報の作成( APIキーの作成 )
　　　└ 07:44 作成されたAPIキーを保存しておきます( テキストエディタやメモ帳へ )
　　　└ 07:53 APIを制限 → キーを制限、「YouTube Data API v3」を選択して保存します。


-----


✓ 🎥My videos are strongly related to this video. | この動画と関連が強い私の動画 ↙
　・“YouTubeチャンネルを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPU-6b7_38byuhYDiOYCLW6


　・“GCPを活用するヒント-Google Cloud Platform”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghNUWx4gsq848fj8djy0wLIB


　・“YouTube Data API”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPn5JvvqsaJnAzR2dejAt4C


　・“無人化、自動化のヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOWXRAE3hzACocPV0y75oN_


　・“効果的にGoogleAppsScriptを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMvEXXmEZ_qF47eCNeIwQUf


　・“効果的にGoogleスプレッドシートを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPKt1RQjiH2Dw-iNtB1xqd_


　・“デモ・マニュアル動画”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMJJv4wKFZDT03S2qmL2pkR


　・“マインドマイスター( クラウド型マインドマップ )でのプレゼンテーションの例”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMXJCYhmWK4bjAUG1uy78li
【AI字幕生成】VEED.IOの初めてメモ | DALL·E 3( ChatGPT Plus )での画像生成デモ動画に、自動的にテロップをつけてもらいました【動画 2分11秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![99 サムネイル 【AI字幕生成】VEED.IOの初めてメモ _ DALL·E 3( ChatGPT Plus )での画像生成デモ動画に、自動的にテロップをつけてもらいました【動画 2分11秒】.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/8afbe6e4-a852-79b9-c151-9de2fb826bff.png)




* # 動画URL
    * https://youtu.be/w_olAgg62E0

<br>

* # 動画タイトル
    * 【AI字幕生成】VEED.IOの初めてメモ | DALL·E 3( ChatGPT Plus )での画像生成デモ動画に、自動的にテロップをつけてもらいました【動画 2分11秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2023-10-12(木)

この動画は、以前公開したわたしの動画( .mp4 データ )に「VEED.IO」というAIによる自動字幕生成( テロップ作成 )サービスをつかって、字幕をつけたバージョンです。

・VEED.IO
　https://www.veed.io/ja-JP/tools/auto-subtitle-generator-online


字幕をつける前の動画はこちら👇

・DALL·E 3( ChatGPT+ )の初めてメモ | 感動的に簡単なChatGPT有償プラン限定の画像生成機能で、この動画サムネイルをつくってもらいました【動画 2分11秒】
https://youtu.be/B32vzkfsvVc



---


⏳開始時間
　00:00 イントロ
　00:11 本編開始

　00:31 ChatGPT有償プラン ChatGPT Plus を契約している方が、GPT-4 で DALL·E 3を選ぶだけでOKです。

　01:10 DALL·E 3 が提案してくれた画像はダウンロードできます( .png / 1,792 x 1,024 pixel )


---


【VEED.IO とは？】

・VEED.IOは、動画や音声データに自動で字幕を追加するオンラインサービスです。
・以下の特徴があります。


【AIによる自動字幕生成】

・すでにある動画データをアップロードするだけで、AIが短時間で字幕を作成します。
・動画にある、音声のおおよその始点と終点に、自動で字幕を配置してくれます。


【字幕の編集が超簡単】

・AIが自動で作成した字幕は、後から編集や加工が可能です。
・波形( 音の大きさや小ささを示すグラフ )を見ながら、字幕の位置を調整することができます。


【どんな端末でも使えるオンラインサービス】

・VEED.IOはクラウドサービスなので、インターネットに接続している端末ならどこからでも利用できます。
・特定のOSや端末に依存しないので、WindowsやMac、さらにはChromebookなどでも問題なく使用できます。
・exe( エックスイー )ファイルなどの実行ファイルをダウンロードしてインストールする必要がありません。
・PCを買い替えても、新しいPCからIDとパスワードを入力してVEEDを開けば、すぐに作業を再開できます。


【アカウント作成が簡単】

・IDとパスワードを設定してVEEDアカウントを作成すれば、あとはWebブラウザでVEEDのページを開くだけで、すぐにサービスを利用開始できます。
・IDとパスワードを設定したあとの、ソフトウェアをインストール、解凍、ファイルを実行、初期設定をする、個別設定をする、などの煩わしさがありません。


このように、VEED.IOは動画に字幕を追加したい人にとって、非常に便利で使いやすいサービスです。


---


✓ 🎥My videos are strongly related to this video. | この動画と関連が強い私の動画 ↙
　・“VEED.IOを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghO-3qj6gIf6rFyovDLXSaiU


　・“AI字幕生成サービスを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPikQnjN7IKYU-QliQspisf


　・“効果的に音声認識入力を活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOXLLdKCeAncUWQfmKuh8SJ


　・“時間をかけずに効果的な「プレゼンテーションをする」「資料を作る」ヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghN6iYl74YGhDZWNFiIHK5-c


　・“効果的にChromebookを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOvj0G5VXf3PFrlOJrKCRFm


　・“無人化、自動化のヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOWXRAE3hzACocPV0y75oN_


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/3QbFHjA
DALL·E 3( ChatGPT+ )の初めてメモ | 感動的に簡単なChatGPT有償プラン限定の画像生成機能で、この動画サムネイルをつくってもらいました【動画 2分11秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![99 サムネイル DALL·E 3( ChatGPT+ )の初めてメモ _ 感動的に簡単なChatGPT有償プラン限定の画像生成機能で、この動画サムネイルをつくってもらいました【動画 2分11秒】.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/701f7939-3425-b3d1-0558-9b1ab2fcb32c.png)




* # 動画URL
    * https://youtu.be/B32vzkfsvVc

<br>

* # 動画タイトル
    * DALL·E 3( ChatGPT+ )の初めてメモ | 感動的に簡単なChatGPT有償プラン限定の画像生成機能で、この動画サムネイルをつくってもらいました【動画 2分11秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2023-10-11(水)

「大きな花と少女が、夜明けの丘に佇んでいる」
DALL·E 3( ダリ・スリー )へ送信した指示はこれだけです。


-----


⏳開始時間
　00:00 イントロ
　00:11 本編開始

　00:31 ChatGPT有償プラン ChatGPT Plus を契約している方が、GPT-4 で DALL·E 3を選ぶだけでOKです。

　01:10 DALL·E 3 が提案してくれた画像はダウンロードできます( .png / 1,792 x 1,024 pixel )


-----


✓ 🎥My videos are strongly related to this video. | この動画と関連が強い私の動画 ↙
　・“効果的にChatGPTを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPfo1c-qmO2ERD7ldSgmblR


　・“時間をかけずに効果的な「プレゼンテーションをする」「資料を作る」ヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghN6iYl74YGhDZWNFiIHK5-c


　・“無人化、自動化のヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOWXRAE3hzACocPV0y75oN_


　・“Webライターのための、無人化、自動化のヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghNK0oUWJcK8f-THHEM7tG4v


　・“Webマーケターのための、無人化、自動化のヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghO2l5CdbR20ErDzwBnC4cVb


　・“デモ・マニュアル動画”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMJJv4wKFZDT03S2qmL2pkR


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/46BGLmk
Android Studio: デジタルクロック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/e746cdab-7685-f80a-6844-9ff21fec9222.png)

## 画面

```xml:res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textSize="40sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
```

## プログラム

```MainActivity.kt
package com.example.clock01

import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.util.Log
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import kotlin.concurrent.thread

class MainActivity : AppCompatActivity() {
    private val handler = Handler(Looper.getMainLooper())
    private lateinit var textView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        fetchApi()

        val delayMillis: Long = 1 * 1000

        handler.postDelayed(object : Runnable {
            override fun run() {
                fetchApi()
                handler.postDelayed(this, delayMillis)
            }
        }, delayMillis)
    }

    private fun fetchApi() {
        val textView = findViewById<TextView>(R.id.textView)
        println("*** fetchAPI *** aaa ***")

        thread {
            try {
                println("*** fetchAPI *** ccc ***")

                val now = LocalDateTime.now()
                val df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
                val fdate = df.format(now)
                println(fdate.toString())

                Handler(Looper.getMainLooper()).post {

                    textView.text = fdate
                }
            } catch (e: Exception) {
                Log.d("response-fetchApi", "debug $e")
            }
        }
    }

}
```

## 注意

Build には、
 minSDK 26 以上にする必要があります。

 Android 8.1.0 以上で動作します。
【UI Toolkit】スクリプトから要素を検索する


UI Toolkitでスクリプトから要素を検索する方法をいくつか記載していきます。


# 環境
|  | バージョン |
|---|---|
| Unity |  2022.3.11f1 |


# Query メソッド
UQueryという、JQueryとLinqから着想を得た機能をつかって要素を取得します。
動的なメモリ割り当てを制限するように設計されていて、モバイルプラットフォームで最適なパフォーマンスがでるようになっているようです。

**Query**と**Q**という拡張メソッドをつかってUXMLで定義したvisual elementを検索することができます。
**Query**は、次のパブリックメソッド使って、一致するリストまたは単一の要素を返します。
* **First**
    * 条件に一致する最初の要素、見つからなければnullを返す
* **Last**
    * 条件に一致する最後の要素、見つからなければnullを返す
* **AtIndex**
    * 指定のインデックスの要素を返す
    * Build().AtIndex()の短縮形
* **Children**
    * 直接の子要素すべてを返す
* **Where**
    * 引数で渡した条件がtrueとなる要素を返す

**Q**は、**Query<T>.First()** の短縮形となっています。


# 要素の取得方法

## 名前による取得
``` UITest.cs
    // OKButtonという名前の全ての要素を返す
    List<VisualElement> result = ve.Query("OKButton").ToList();
    
    // どちらもOKButtonという名前がついている中から最初にみつけた要素を返す
    VisualElement result = root.Query("OKButton").First();
    VisualElement result = root.Q("OKButton");
```

## 型による取得
``` UITest.cs
    // Button型で、OKButtonという名前をもつ、最初に見つけた要素を返す
    Button okButton = root.Q<Button>("OKButton");

    // Button型で二つ目の要素を返す
    Button cancelButton = root.Query<Button>().AtIndex(1);
```

## その他の検索方法

``` UITest.cs
    // yellowというUSSのクラスをもつすべての要素を返す
    List<VisualElement> result = root.Query(className: "yellow").ToList();

    // Containerという要素の子の、CancelButtonという名前の1つ目の要素を返す
    Button cancelButton = root.Query<VisualElement>("Container").Children<Button>("CancelButton").First();
```







## 参考
https://docs.unity3d.com/2022.3/Documentation/Manual/UIE-UQuery.html
javascriptでffmpegを実行する

const { exec } = require("child_process");

// ffmpegコマンドを構築
const ffmpeg_command = `ffmpeg -i test.mp4 test.mov`;

// ffmpegコマンドを実行
exec(ffmpeg_command, (error, stdout, stderr) => {
  if (error) {
    console.error(`エラー: ${error}`);
    return res.status(500).json({ error: "変換に失敗しました" });
  }
});
Convolution高速化まとめ

# 概要
NvidiaのGPU(A100)を使った場合のConvolutionの最適化についてのまとめ
- Batch sizeは2の累乗で出来るだけ大きく。
- Channel数は最低でも4の倍数。runtimeの環境で計測するのが良い。
- 効率の良いChannel数を見つけたら、Group ConvolutionでFLOPS(1秒間に実行できる浮動小数点演算の回数)を下げずに計算数を減らすのを試してみる。
- cudnn.benchmarkをTrueにする。
- channel last(NHWC)にする。
- ストライド数は気にしなくて良い。
- あまり大きなDilationは避けたほうが良さそう。代わりに画像サイズを小さくして、Channel数を増やすのを試してみる。
- ChannelやKernel sizeを大きくするとweight数が増えて、メモリー転送時間が掛かる事も頭の片隅に置いておく。

ただし、GPUのアーキテクチャー、CuDnnなどのlibraryのversion、TensorRTを使った場合などで変わる事がある

もう少し一般的な高速化の記事は[こちら](https://qiita.com/minh33/items/eb8494271aca460df8ce)

## Channel数
-  データタイプに合わせて任意の倍数にするとTensorCoreを効率的に活用できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/ed271eb9-ada7-d85c-dc3d-4b78fa6c96ea.png)

## flag
torch.backends.cudnn.benchmark = Trueにすると自動でベストの計算方法を選んでくれる。
例えば、[フーリエ変換を使うことでconvolutionを速く出来る](https://www.youtube.com/watch?v=KuXjwB4LzSA)らしい。

## Tensor Layout
 チャネルファースト(NCHW)よりチャネルラスト(NHWC)の方が並列化しやすい

NHWCの方が早い事が分かる。
*横軸はN(Batch数)
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/9ee0670d-ef52-3af7-0de6-29691245ce1c.png)

channel lastだと畳み込みたい値が近くのメモリーにいるので、メモリー効率が高いのが一つの理由
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/77185e36-78a7-11dc-d317-21febfd98483.png)

## Filter size
C(channel数)*R(kernel height)*S(kernel width)が大きくなると並列化を最大限活用出来る
ただkernel sizeはそんなに変える事は無いのでChannelサイズを調整してみると良い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/23159b81-afae-1d7c-4801-2f57de75f068.png)

## ストライド数
U(Horizontal stride)とV(Vertical stride)を変えても速度にはあまり影響が無い
*横軸はP(OutputのHeight)とQ(OutputのWidth)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/f50d7d4b-105c-9643-6da9-5103f73d701d.png)

## Dilation
Dilation=2の方がDilation=1より若干遅い。メモリアクセス効率が影響しているはず。
*横軸はN(Batch数)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/254ba006-2e5c-2980-e74a-8a9853bdfb0a.png)
左がDilation=1　右がDilation=2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/7b1bc1e7-863b-d402-98d1-51afd47044eb.png)


## 参考文献
https://pytorch.org/blog/accelerating-pytorch-vision-models-with-channels-last-on-cpu/
https://docs.nvidia.com/deeplearning/performance/dl-performance-convolutional/index.html
https://docs.nvidia.com/deeplearning/performance/dl-performance-matrix-multiplication/index.html#dim-quantization
コンストラクタインジェクションについて深掘り



# Dependency Injection (DI) の基本
[DIについて知りたくなった](https://qiita.com/mt_tashi/items/4ab98bd52c6ebf7a7dde)
# コンストラクタインジェクションとは？
コンストラクタインジェクションは、依存関係をクラスのコンストラクタを通じて注入する方法です。具体的には、クラスが必要とする依存関係を、コンストラクタの引数として受け取ることによって実現されます。

3. コンストラクタインジェクションの利点
明確性: コンストラクタで必要な依存関係が明示されるため、クラスの動作に必要なものが一目でわかります。
不変性: 一度インジェクションされた依存関係は変更されないため、安全性が向上します。
テスタビリティ: モックオブジェクトやスタブを簡単に注入できるため、ユニットテストが書きやすくなります。
4. Pythonにおける実装例
以下は、Pythonを使ったコンストラクタインジェクションの簡単な例です。

```python
class Database:
    def save(self, data):
        # データ保存のロジック
        pass

class UserService:
    def __init__(self, db: Database):
        self._db = db

    def add_user(self, user_data):
        self._db.save(user_data)

# 使用例

db_instance = Database()
user_service = UserService(db_instance)
user_service.add_user({"name": "John Doe", "email": "john@example.com"})
```
Database クラスの定義
このクラスはデータベースに関連する処理を模倣しています。
save メソッドは、データをデータベースに保存する機能を模しています。ここでは具体的な実装は省略されており、実際にはデータベース接続やデータの保存ロジックがこの中に書かれることになります。

UserService クラスの定義
このクラスは、ユーザーに関連する処理を担当します。
コンストラクタ __init__ は、Database のインスタンスを引数として受け取ります。これがコンストラクタインジェクションの核心部分です。UserServiceはDatabaseの機能に依存していますが、直接インスタンスを生成するのではなく、外部からインスタンスを受け取る形となっています。
add_user メソッドは、ユーザーデータをデータベースに保存するために、内部でDatabaseのsaveメソッドを呼び出します。

使用例部分
まず、Database クラスのインスタンス db_instance を作成します。
次に、この db_instance を引数として UserService クラスのインスタンス user_service を作成します。この時点で、UserService の内部には Database のインスタンスが注入されています。
最後に、user_service の add_user メソッドを呼び出し、ユーザーデータをデータベースに保存します。このメソッド内部で、前述した Database の save メソッドが呼び出されることになります。
Ruby on Rails: 中間テーブルの使い方を初心者が説明

## 1. 中間テーブルとは？
中間テーブルは、多対多の関係を持つ2つのモデル間に配置されるテーブルのことを指します。これは、**あるモデル**と**別のモデル**の間に多対多の関係が存在する場合に使用されます。

例として、UserモデルとBookモデルを考えます。
- 一人のユーザーが複数の本を所有し、
- 一冊の本が複数のユーザーに所有されている場合、

この関係性を効率よく管理するために中間テーブルが必要となります。

## 2. 中間テーブルの作成方法
```Ruby
rails g model UserBook user:references book:references
```
このコマンドはUserBookという中間テーブルを生成します。
user:referencesとbook:referencesは、それぞれのモデルへの外部キーを生成するためのものです。
これにより、UserBookテーブルはUserとBookの間の関係を持つことができます。

```Ruby
class UserBook < ApplicationRecord
  belongs_to :user
  belongs_to :book
end
```
このUserBookモデルでは、belongs_toを使用して、関連するモデル（UserとBook）との関係を定義しています。

## 3. モデル間の関連付けの設定
```Ruby
class User < ApplicationRecord
  has_many :user_books
  has_many :books, through: :user_books
end

class Book < ApplicationRecord
  has_many :user_books
  has_many :users, through: :user_books
end
```
このコードでは、UserモデルとBookモデルが、**中間テーブルであるUserBookを介して関連付けられている**ことを示しています。has_many :throughは、中間テーブルを経由した関連付けを定義するためのものです。

## 4. 中間テーブルの有効な使い方
中間テーブルを使用すると、以下のような操作が簡単になります。

### あるユーザーが所有している本の一覧を取得する場合：
```Ruby
user = User.find(1)
user.books
```
このコードでは、IDが1のユーザーが所有している本の一覧を取得しています。

### ある本を所有しているユーザーの一覧を取得する場合：
```Ruby
book = Book.find(1)
book.users
```
このコードでは、IDが1の本を所有しているユーザーの一覧を取得しています。

### 特定のユーザーが特定の本を所有しているかどうかを確認する場合：
```Ruby
user.books.exists?(book.id)
```
このコードは、指定したユーザーが特定の本を所有しているかどうかを確認するためのものです。

## まとめ
中間テーブルは、多対多の関係を持つ2つのモデル間に配置されるテーブルです
rails g modelコマンドを使用して、中間テーブルを作成することができ、
belongs_toを使用して、中間テーブルのモデルで関連するモデルとの関係を定義でき、
has_many :throughを使用して、中間テーブルを経由した関連付けを行います。

中間テーブルを使用することで、
- 特定のユーザーが所有している本の一覧
- 特定の本を所有しているユーザーの一覧などの操作

Ruby on Railsの中間テーブルは、多対多の関係を効率的に管理できます。
Chromeでサーバーからのレスポンス速度を確認する

開発者ツールを開く
Network
Nameから見たいものを選ぶ -> 右のタブで`Timing`の`Waiting for Server Response`

![スクリーンショット 2023-10-27 8.55.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408807/b0ab817b-84a0-c66d-8c43-5ab04a305e7c.png)
[JavaScript]Promiseからasync/awaitへの書き換え

Promiseを用いた処理を,async/awaitを用いた処理に書き換える。

##### Promiseを用いた処理
```javascript
getPost(postId)
    .then((post) => getUser(post.userId))
    .then((user) => getOrganization(user.orgId))
    .then((org) => {
        // 必要な処理
    });
```

##### async/awaitを用いた処理
```javascript
const myFunc = async (postId) => {
    const post = await getPost(postId);
    const user = await getUser(post.userId);
    const org  = await getOrganization(user.orgId);
    // 必要な処理
```
* 最初にgetPost(postId)を実行
* その結果を得られ次第、getUser(post.userId)を実行

全ての操作が非同期で行われますが、awaitによってその処理がコード上は同期的に見えるように記述される。

---

参考

https://gihyo.jp/magazine/SD/archive/2023/202309

過去の記事

https://qiita.com/yusuke2310/items/534a007836089eebb2f4

https://qiita.com/yusuke2310/items/134b8484d3e0cb0b8d14


https://qiita.com/yusuke2310/items/b2dbe85c966bb14268eb
Next.js14でのアップデート内容

こんにちは。プログラミングスクール[Happiness Chain](https://happiness-chain.com/)でメンターをしているryoです。

2023年10月27日（金）午前2時から開催されたNext.jsカンファレンスにてNext.js14の発表がありましたので、今回のアップデート内容を記載していきたいと思います。

以下公式のリリースノートになります。

https://nextjs.org/blog/next-14

## Turbopack使用時の信頼性向上（Turbopackの5000の統合テストがパス）
Next.js13にて発表された[Turbopack](https://turbo.build/pack/docs)（Next.js向けに開発された試験的なもの）ですが、最初にNext.jsの全機能にサポートするようになりました。
100%のテストが合格したら安定版に移行するとのことです。
Turbopack未使用でも起動・リフレッシュが早いと思っていましたが、大規模になるほどその恩恵は大きくなるみたいです。
以下はNext.jsで開発されたvercel.comでのベンチマークですが、

- ローカルサーバーの起動が53.3%高速化
- コード更新によるリフレッシュが94.7%高速化

上記を見ると、現状から`next dev --turo`を使わない手はないかなと思いました。

## Server Actionsを安定版としてリリース
Next.js9より導入されたAPI Routesにて、バックエンドを構築することができるようになりましたが、そちらをより簡素化することと、クライアント依存でのパフォーマンス低下の際のUX向上を目的として、リリースされました。

App Routeを作成せず、コンポーネントにて関数を呼び出すだけで済むため、かなり簡素化されるなと思いました。
また、データ変更、再レンダリング、リダイレクトが1回の通信にて済むので、UX的にもいいかなと思いました。
こちら詳細を別途記事に書きたいと思います。
```jsx
export default function Page() {
  async function create(formData: FormData) {
    'use server';
    const id = await createItem(formData);
  }
 
  return (
    <form action={create}>
      <input type="text" name="name" />
      <button type="submit">Submit</button>
    </form>
  );
}
```

## Partial Prerendering（試験的）

動的コンテンツの初期読み込みの高速化のためで、React Suspenseをサポート(?)しました。
Suspenseを用いて以下のように記載した場合、
```jsx
export default function Page() {
  return (
    <main>
      <header>
        <h1>My Store</h1>
        <Suspense fallback={<CartSkeleton />}>
          <ShoppingCart />
        </Suspense>
      </header>
      <Banner />
      <Suspense fallback={<ProductListSkeleton />}>
        <Recommendations />
      </Suspense>
      <NewProducts />
    </main>
  );
}
```
Partial Prerenderingを有効にすると、以下のHTMLが即座に構築されます。
```html
<main>
  <header>
    <h1>My Store</h1>
    <div class="cart-skeleton">
      <!-- Hole -->
    </div>
  </header>
  <div class="banner" />
  <div class="product-list-skeleton">
    <!-- Hole -->
  </div>
  <section class="new-products" />
</main>
```

※こちらは試験的な機能で、現在開発中になりますので、アップデートされ次第、こちらに記載できればと思います。

## メタデータの改善
メタデータをブロッキングメタデータとノンブロッキングメタデータに分離して、ノンブロッキングメタデータによって、UXを損なわないようにされました（初期レンダリング時に一部メタデータが送信されるようになった）。
Next.js14から、メタデータのviewport、colorScheme、themeColorのオプションが[generateViewport](https://nextjs.org/docs/app/api-reference/functions/generate-viewport)を使う形になりました。

## Next.js学習コースのリリース
Next.jsの一通りの知見がハンズオン形式で学べます。
コース内容を見た感じ、かなりクオリティが高いなと思いましたので、おすすめです。

https://nextjs.org/learn