OmniAICreator/Qiita-1.07M huggingface dataset:
CloneNotSupportedExceptionについて

# はじめに
初投稿です。
今年の4月からWeb系のバックエンドエンジニアとして働き始めた1年目です。
アウトプットの機会を増やしたく、記事を投稿してみることにしました。
Markdown記法にも慣れていけたら良いなと思っています。誤りがあれば指摘していただけると助かります。

今回は、Java学習中に疑問に思った「CloneNotSupportedException」というエラーを扱おうと思います。

# 背景
私はclone()について、下記のような認識でいました。
- 自作のクラスにclone()を実装する際には、必ずCloneableインターフェースをimplementsする必要がある。また、Cloneableインターフェースはマーカーインターフェースであり、実際には何も宣言されていない。
- Objectクラスにはclone()メソッドがあり、全てのクラスは暗黙的にObjectクラスを継承している

# 疑問
上記の認識で、下記の2点を疑問に思いました。
- そもそもCloneableインターフェースはマーカーインターフェースであるため、clone()メソッドの実装を強制しているわけではないので、エラーとは関係ないはず
- 仮にCloneableインターフェース内でclone()が宣言されていたとしても、Objectクラスを継承しているのだからエラーを吐くのはおかしい(そもそも実装していないことによるエラーならコンパイルエラーになるはず)

要するに**何がエラーを引き起こしてるのか**を疑問に思いました。

# ドキュメントを見る
そこで、[Object#clone()のドキュメント](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Object.html#clone--)を読んだところ、どうやらObject#clone()メソッドで、implements Cloneableを記述していない場合にエラーが出るよう実装されているようです。

つまり「背景」に記述した私の1つ目の認識は正確には間違っていて、自作クラスのclone()内部で、スーパークラス(正確にはObjectクラスの)clone()を利用していると、implements Cloneableの記載が必須になるようです。言語仕様によるエラーではなく、clone()がそのような実装になっているようです。
※ちなみにObject#clone()の実装をソースファイルを見て確認しようと思いましたが、[native修飾子](https://java-code.jp/120)がついており、他の言語で実装されているようです。

# 実際に検証してみた
Mainクラスは下記です。
```Java:Main.java
public class Main {
    public static void main(String[] args) {
        Hero hero = new Hero("太郎");
        Hero hero3 = null;
        
        try {
            hero2 = hero.clone();
        } catch (CloneNotSupportedException e) {
            System.out.println(e.getMessage());
            System.out.println("クローンの作成に失敗");
        }
        
        System.out.println(hero3);
    }
}
```

### Object#clone()を利用したHeroクラス
次に、Heroクラスです。
このHeroクラスのclone()内部では、親クラス、つまりObjectクラスのsuper()を利用しています。
```Java:Hero.java
public class Hero implements Cloneable {
    private String name;
    public Hero(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    @Override
    public Hero clone() throws CloneNotSupportedException {
        Hero hero = (Hero)super.clone();
        System.out.println("Heroのクローンを作成");
        return hero;
    }
}
```

Heroクラスを利用した場合、implements Cloneableを削除してもコンパイルは通りますが、実行時にCloneNotSupportedExceptionになります。

### Object#clone()を利用しないHeroクラス
```Java:Hero.java
public class Hero {
    private String name;
    public Hero(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    @Override
    public Hero clone() {
        return new Hero(this.name);
    }
}
```
上記のHeroクラスは、clone()では新たなHeroインスタンスを作成し、それをリターンしているだけです。したがってimplements Cloneableは書かれていませんが無事にクローンが生成されます。MainクラスでCloneNotSupportedExceptionをハンドルする必要もありません。

# まとめ
- Object#cloneではimplements Cloneableの記述がなければCloneNotSupportedExceptionエラーになる
- そのため、Object#clone()を利用していなければ、clone()を実装していたとしても実行時エラーにはならない。

# 終わりに
読んでくださった方、ありがとうございました。
今後も小さな発見でも時間があるときに投稿しようと思うので、見ていただけると嬉しいです。
Rosetta for Linuxのパフォーマンスを調べてみた

### はじめに

最新のMacBook Air（M2, 2022モデル）において、仮想環境がどの程度のパフォーマンスを発揮するのかを測定することにしました。この検証では、Limaを使用して様々な仮想環境を構築し、Rosetta 2を含む異なる仮想環境を用意し、性能をGeekbench6で測定して比較します。

### 環境の準備

```bash
$ brew install lima
$ softwareupdate --install-rosetta
# 各種仮想環境の用意
$ limactl start --name=qemu-aarch64 --vm-type=qemu --arch=aarch64 --cpus=8
$ limactl start --name=qemu-x86_64 --vm-type=qemu --arch=x86_64 --cpus=8
$ limactl start --name=vz-aarch64 --vm-type=vz --arch=aarch64 --cpus=8
$ limactl start --name=vz-rosetta --vm-type=vz --arch=aarch64 --rosetta --cpus=8
```
本来はRosetta環境だけでx86バイナリが動作するのですが、x86向けの共有ライブラリが不足しておりGeekbench6を起動することができませんでした。そのため、ここではコンテナとしてApptainer(Singularity)とnerdctl(Docker)を使用して検証します。

### 結果

![b86d08d8-00bc-4738-a0c5-925b03cbf328.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68704/63f6900d-598c-d46c-edaf-05acdda1ae49.png)

| CPU |  Arch  |  Guest  |  VM  | Container | Rosetta2  |  Single  |  Multi  |
|:---:|:------:|:-------:|:----:|:---------:|:---------:|:--------:|:-------:|
| M2  |  ARM   |   Mac   |  -   |     -     |     -     |   2589   |  9923   |
| M2  |  ARM   |  Linux  |  VZ  |     -     |     -     |   2485   |  8606   |
| M2  |  ARM   |  Linux  | QEMU |     -     |     -     |   2506   |  8561   |
| M2  | x86_64 |   Mac   |  -   |     -     |    YES    |   1205   |  4408   |
| M2  | x86_64 |  Linux  |  VZ  | Apptainer |    YES    |   1092   |  4416   |
| M2  | x86_64 |  Linux  |  VZ  |  nerdctl  |    YES    |   1094   |  4112   |
| M2  | x86_64 |  Linux  | QEMU |     -     |     -     |    63    |   187   |

ARMアーキテクチャのネイティブ環境が最も高いスコアを示し、その後にARMのLinux環境が続きます。Rosetta 2を使用した環境では、パフォーマンスが低下していますが、それでも十分な性能を発揮しています。QEMUを用いたx86の実行は40倍ほど遅く、アプリケーションの実行に支障がありそうです。

### 感想

Rosetta for Linuxを使った環境は、NativeのRosettaと比べて遜色がありません。環境は異なるアーキテクチャ上であっても十分なパフォーマンスを発揮しており、デバッグには十分でしょう。また、Limaを利用することで、仮想環境のセットアップが簡単に行えました。他のMacやベンチマークで測定した結果があればコメントをお願いします。
【Laravel】Eloquentとクエリビルダ

Laravel=5.6

# Eloquentとは
LaravelにおけるORMのこと。「Eloquent」=Laravel用語、「ORM」=（Laravelに限らない）一般用語。**クエリビルダにもなりうる。**

# クエリビルダとは
SQLを便利に記述するための機能。

# 違い
### ソフトデリートの扱い
#### Eloquent
**ソフトデリートされたレコードを除外して取得する。**
#### クエリビルダ
ソフトデリートされたレコードを除外しないで取得する。
### データ型
#### Eloquent
1データ=モデル。複数データ=コレクション。
```
get_class(Corporate::first()); // App\Models\Corporate
get_class(Corporate::get()); // Collection
```
#### クエリビルダ
1データ=stdClass。複数データ=コレクション。
```
get_class(DB::table('corporates')->first()); // stdClass
get_class(DB::table('corporates')::get()); // Collection
```
### リレーションテーブルのデータ取得
#### Eloquent
##### withを使う
```Corporate.php
public function organizations () {
    $this->hasMany('Organizations');
}
```
```
Corporate::with('organizations')->get();
```
##### クエリビルダとしてjoinを使う
```
Corporate::join('organizations', 'corporates.id', '=', 'organizations.corporate_id')->get();
```
#### クエリビルダ
```
DB::table('corporates')->join('organizations', 'corporates.id', '=', 'organizations.corporate_id')->get();

```
Pythonで「formatメソッドを使った文字列の書式設定」の動作を確認してみた

# 概要

Pythonで「formatメソッドを使った文字列の書式設定」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/string/index24.html

# 実装

以下のファイルを作成しました。
```sample.py
name = "Suzuki"
old = 18
print("名前は{:<8s}です。年齢は{:>3d}歳です。".format(name, old))

print("名前{0}です。{1}歳。住所は{2}です。".format("Yamada", 18, "Tokyo"))
print("名前{2}です。{0}歳。住所は{1}です。".format(18, "Tokyo", "Yamada"))

print("名前{:8s}です。{:4d}歳。".format("Yamada", 18))
print("名前{0:8s}です。{1:4d}歳。".format("Honda", 32))
print("名前{name:8s}です。{old:4d}歳。".format(name="Tanaka", old=24))

print("文字列={:s}, 文字列={}".format("Lemon", "Apple"))
print("数値1={:d}, 数値2={:x}".format(20, 31))

print("指数表記={:e}".format(0.0752))
print("固定小数点表記={:f}".format(0.0752))
print("パーセンテージで表示={:%}".format(0.348))

print("文字列=[{:10s}]".format("Lemon"))
print("数値=[{:5d}]".format(123))

print("数値=[{:<7d}]".format(123))
print("数値=[{:^7d}]".format(123))
print("数値=[{:>7d}]".format(123))

print("数値={:*<7d}".format(123))
print("数値={:-^7d}".format(123))

print("正の数={:+d}, 負の数={:+d}".format(72, -72))
print("正の数={:-d}, 負の数={:-d}".format(72, -72))
print("正の数={: d}, 負の数={: d}".format(72, -72))

print("数値={:,d}".format(1234567))
print("数値={:,f}".format(12345.6789))
print("数値={:_d}".format(1234567))

print("数値={:f}".format(1.2345))
print("数値={:.1f}".format(1.2345))
print("数値={:.3f}".format(1.2345))

print("数値={:b}, 数値={:#b}".format(10, 10))
print("数値={:o}, 数値={:#o}".format(20, 20))
print("数値={:x}, 数値={:#x}".format(35, 35))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
名前はSuzuki  です。年齢は 18歳です。
名前Yamadaです。18歳。住所はTokyoです。
名前Yamadaです。18歳。住所はTokyoです。
名前Yamada  です。  18歳。
名前Honda   です。  32歳。
名前Tanaka  です。  24歳。
文字列=Lemon, 文字列=Apple
数値1=20, 数値2=1f
指数表記=7.520000e-02
固定小数点表記=0.075200
パーセンテージで表示=34.800000%
文字列=[Lemon     ]
数値=[  123]
数値=[123    ]
数値=[  123  ]
数値=[    123]
数値=123****
数値=--123--
正の数=+72, 負の数=-72
正の数=72, 負の数=-72
正の数= 72, 負の数=-72
数値=1,234,567
数値=12,345.678900
数値=1_234_567
数値=1.234500
数値=1.2
数値=1.234
数値=1010, 数値=0b1010
数値=24, 数値=0o24
数値=23, 数値=0x23
```

# まとめ

何かの役に立てばと。
個人的に注目しているStreamlitのロードマップまとめ

## はじめに

StreamlitはPythonだけでフロントエンドを含めたWebアプリケーションを構築できるフレームワークです。
開発元が今後の機能追加予定をロードマップとして公開しており、その中でも個人的に注目している機能をまとめてみようと思います。

https://roadmap.streamlit.app/

※タイトルと内容は日本語訳しています。

## 2023 年 11 月 – 2024 年 1 月

### 🌕非全画面チャット レイアウト

> コンテナ、エキスパンダー、サイドバーなどでチャット メッセージとチャット入力を使用します。

現在はサイドバーには配置できず、メイン画面のみです。
その他のコンポーネントとの組み合わせの相性もイマイチな印象です。。

サイドバー上にLLMとのチャット機能を配置してメイン画面のコンテンツを描画する。など、使い方が広がりそうです。

### 🏃‍♀️st.download_button をクリックしても再実行しない
Streamlitではpandasのデータフレームなどを直接指定して表形式で表示したり、ローカルにダウンロードできたりしますが、データフレームにフィルタなどをかけてその結果をダウンロードしたい。といった場合はフィルタの内容などをsession_stateに入れておかないとリセットされてしまいます。（ボタンを押すという動作で処理全体が再実行されるため。）

## 2024 年 2 月～4 月

### 🏗️st.dialog

> Streamlit アプリでモーダルまたはダイアログを開きます。

streamlit-modalという外部ライブラリで代用できますが、他のコンポーネントと組み合わせるとおかしな挙動をしたりするので、ネイティブでのサポートは期待できます。
https://pypi.org/project/streamlit-modal/

### 🎽スピード + パフォーマンス イニシアチブ
> Streamlit を実行して、より速く見えるようにします。

Streamlitでは、あらゆるアクションにおいて、処理全体を再実行するように設計されています。
キャッシュなどを駆使して再実行の速度を上げたとしても辛い部分があります。
このあたりが改善されるのかはわかりませんが、パフォーマンスの向上は楽しみです。

### 🧑‍🎨視覚的なカスタマイズ
> アプリの外観をカスタマイズするためのその他のオプション。

現在はst.components.v1.html等で無理やり？CSSを上書きしたりすることで一定のカスタマイズはできますが、hackyな印象は否めません。
コンポーネントごとに指定できると表現の幅が大きく広がりそうです。

## 未来

### 🌹st.file_uploader が、UploadedFile の代わりにファイル パスを返せるようにする
これはRAG[^1] を行うときに困るのですが、st.file_uploaderでドキュメントをアップロードしてもそのままはLangChainやLlamaIndexのファイルローダーでは読み込めません。あくまでパスを指定する必要があるためです。
そのため、以下のようにしてパスを指定する必要があります。

``` python

if uploaded_file :
   #use tempfile because CSVLoader only accepts a file_path
    with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
        tmp_file.write(uploaded_file.getvalue())
        tmp_file_path = tmp_file.name

    loader = CSVLoader(file_path=tmp_file_path, encoding="utf-8", csv_args={
                'delimiter': ','})
    data = loader.load()
    
```
※引用

https://stackoverflow.com/questions/77415140/how-to-use-langchain-huggingface-in-offline-mode-for-chatbot


### ⏱️st.download_button の遅延データロード

> st.download_button は関数を受け入れますが、この関数はクリックされたときにのみ実行されます。

重いデータを扱うと、ダウンロードボタンを押さなくても処理全体が重くなってしまいます。
そのため、通常のボタンのon_clickで関数を指定して関数内でpandasのto_csvなどで出力させたり、ひと手間かかります。


### 🪓st.selectbox および st.multi_select で新しい項目を受け入れる
streamlit-tagsで同じようなことができますが、公式でのサポートには期待です。

https://pypi.org/project/streamlit-tags/

### 🎣st.dataframe の遅延データ読み込み
> st.dataframe は、スクロール中にデータベースからデータを遅延読み込みできます。

巨大なデータを表示しようとすると、レンダリングに非常に時間がかかります。
こういった場合、画面にレンダリングするレコードは少数にしておいて、サーバーサイドでフィルタしたり、ソートする必要があります。D-tale みたいな感じで読み込めるようになることを期待しています。


## おわりに
相変わらず1ヶ月スパンでバージョンアップされており、どんどん機能が追加されています。
公式がハッカソンなども開催しておりこれからも盛り上がっていきそうです！





[^1]:Retrieval Augment Generationの略
外部の知識ベースから事実を検索して、最新の正確な情報に基づいて大規模言語モデル（LLM）に回答を生成させること
Symbolノードリスト取得Script

Symbolのノードリストが欲しいときにどうぞ。
ノードリストは変動するので最新のリストは

https://symbolnodes.org/nodes/

にあります。

下記のコードをサイトにアクセスしてF12を押して
ブラウザーコンソールにコピペして叩くとノードのドメインリストが取得できます。
httpsかつapiノードを取得します。



```
gets=document.getElementsByTagName("table")[1].getElementsByTagName("tr")

//ブロック高を設定する場合はコメントアウトする
blockHeight=document.getElementsByTagName("strong")[0].innerText-50;

//ブロック高を設定するときはコメントアウト外してブロック高を設定。
//blockHeight=;

console.log("BlockHeight:",blockHeight);

NodeList=[];
search=".";
nodeVer="v1.0.3.7";

for ( ass = 0; ass < gets.length; ass++) {
const element = gets[ass]
if(element.childNodes[8].innerHTML.indexOf("https")!=-1){
if(element.childNodes[5].innerHTML.indexOf("api")!=-1){
if(element.childNodes[12].innerHTML.indexOf(nodeVer)!=-1){


if(Number(element.childNodes[8].innerText.split("h")[0]) >= Number(blockHeight)){


//ノードのドメインに検索したい文字列があれば"."を変更する。
//例"allnodes"とすればallnodesだけが取得される。

search=".";

//逆に検索文字を含めないように検索する場合は下記の != の箇所を == に変える。

if(element.childNodes[1].innerHTML.indexOf(search)!=-1){

	NodeList.push(element.childNodes[1].innerText);
}



}}}}
}

console.log(NodeList);


```




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/ff256361-058b-bddc-c984-f020220e74d8.png)

右クリックでobjectをコピーして利用してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356924/719320f5-4e89-959c-10c4-2012daebd39b.png)
ChatGPTのチャット画面の印刷

# What is this?

ChatGPTのチャット画面を印刷したり、PDFに保存しようとすると、最初の1ページのみとなる。ふと思いついたんだが、動的に生成されているhtmlの現時点の内容を別ウィンドーにコピーさせるブックマークレットを作れば対応出来そうだ。

そのためのブックマークレットをChatGPT自身に作らせた。何度か不十分なコードが作られたが、最終的に出来たものが下記のもの。これを試すと、新しいウィンドーチャット内容が全てコピペされ、それら全てが印刷可能であることが確認できた。

# 作成したブックマークレット

```javascript:
javascript:(function() {
  var elements = document.querySelectorAll('.group.w-full');
  var content = '';
  for (var i = 0; i < elements.length; i++) {
    content += elements[i].outerHTML + "<hr>";
  }
  var newWindow = window.open("");
  newWindow.document.open();
  var styles = document.querySelectorAll('link[rel="stylesheet"], style');
  var stylesHtml = '';
  for (var j = 0; j < styles.length; j++) {
    stylesHtml += styles[j].outerHTML;
  }
  newWindow.document.write('<html><head>' + stylesHtml + '</head><body>' + content + '</body></html>');
  newWindow.document.close();
})();
```

## 作成したブックマークレット(登録用改行無しバージョン)

```javascript:
javascript:(function() {  var elements = document.querySelectorAll('.group.w-full');  var content = '';  for (var i = 0; i < elements.length; i++) {    content += elements[i].outerHTML + "<hr>";  }  var newWindow = window.open("");  newWindow.document.open();  var styles = document.querySelectorAll('link[rel="stylesheet"], style');  var stylesHtml = '';  for (var j = 0; j < styles.length; j++) {    stylesHtml += styles[j].outerHTML;  }  newWindow.document.write('<html><head>' + stylesHtml + '</head><body>' + content + '</body></html>');  newWindow.document.close();})();
```
### 2003/11/10 Revised

バージョンアップされてhtmlの構造が少し変わったために、前のが動かなくなったため、選択対象を修正した。

```javascript:
javascript:(function() {  var elements = document.querySelectorAll('.w-full.text-token-text-primary');  var content = '';  for (var i = 0; i < elements.length; i++) {    content += elements[i].outerHTML + "<hr>";  }  var newWindow = window.open("");  newWindow.document.open();  var styles = document.querySelectorAll('link[rel="stylesheet"], style');  var stylesHtml = '';  for (var j = 0; j < styles.length; j++) {    stylesHtml += styles[j].outerHTML;  }  newWindow.document.write('<html><head>' + stylesHtml + '</head><body>' + content + '</body></html>');  newWindow.document.close();})();
```
# 使い方

## ブックマークレットの登録

- ブラウザ上でブックマーク(お気に入り)を1つ作成する。「お気に入りバー」などアクセスしやすいところに作ると良い。
- そのブックマークを右クリックして、その編集ウィンドーを開く。そのURLの欄を上記のブックマークレットのJaveScriptコードに入れ替える。ついでにその「名前」を分かり易いものに変更する。

## 使用

- ChatGPTのチャット画面を開いている状態で、登録したブックマークレットを開く。
- 新しいタブかウィンドーに、チャット内容がコピペされているので、それをプリンターに印刷するか、PDFに出力させる。
:::note info
印刷設定の「背景のグラフィックス」を印刷するオプションはオンにした方が良い
:::

:::note info
チャット結果を共有したWebページも同じ様に印刷に問題ありだが、このブックマークレットで対応可能
:::
DockerfileのEXPOSE 80てなんじゃい！Fargate篇

## はじめに
おまじないとしか思ってないのもどーなんだていうね！

## GPT4大先生より
マイメンに聞いてみました。

```
DockerfileのEXPOSEコマンドは、コンテナが実行時に特定のポートをリッスンするように指定するためのものです。
例えば、EXPOSE 80と書かれたDockerfileがある場合、コンテナは80番ポートをリッスンするようになります。

ただし、EXPOSEだけではポートは公開されません。つまり、使用者からコンテナにはアクセスできません。
公開用のポートとEXPOSEで指定したポートを紐づけるためには、docker run -pコマンドを使用します。
そのため、EXPOSEはイメージの作者とコンテナ実行者の両者に対して、ドキュメントのような役割を果たします。

具体的な使い方は以下の通りです：
ポートとプロトコルを指定する場合： EXPOSE 80/tcp または EXPOSE 80/udp
docker runコマンドでホスト上のポートとバインディングする場合： docker run -p 80:80
```

1行目, 2行目はよいこのDockerみたいな本で学習したからわかる。
中〜後半もふむふむなるほどねて感じ。

## Fargateで
`EXPOSE 80`をDockerfileから削除してタスク起動したら普通に動いた。
で、そういえばタスク定義で設定した記憶がうっすらあるな。。？と思ったので改めて見てみる。

![gazou-dayo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278897/122d30ad-be44-dffe-582d-9e172ea0d234.png)

全然普通にあったわ。あと注釈にマイメンと似たニュアンスのこと書いてる。
この辺もFargateはよしなにやってくれてるんだな。最高か？

## おわりに
Dockerfileは最軽量、あとはUIで完結するのがFargateのベストなのか？とかおもたり。
それでデプロイ時間が短くなるなら最高ですね！

以上です〜:wave:
音楽家からエンジニアへ転身した私の振り返り

「音楽家のリズムからエンジニアのコードへ」

## ようこそ、私の転調へ
たくさんの打楽器からたくさんの自作キーボードへ

私の旋律はいつの間にかコードとバグを奏でる楽章へと変わりました。
音楽家からエンジニアへの変奏曲、その舞台裏を少しだけお見せしましょう。

## 舞台の裏側
生まれは1991年。音楽という名の楽園をひた走り、29歳の頃にエンジニアという新たなステージに足を踏み入れました。
現在は2社目である株式会社よりそうで働いており、技術の音符を紡いでいます。プロジェクトマネージメントの指揮棒を振ったばかり。

その一幕は、またいつかの語り草です。

## 幼き日の序章
かつて、ワープロに出会い、その魔法にかかりました。
Windows 95、98と、デジタルの森を駆け巡りました。外遊びが一段落つくと、いつもパソコンの前。
Webサイトを作って公開し、掲示板を我が遊び場に。

HTMLとCSS、初めてのダンスパートナーです。

MMOの世界には小遣いを捧げ、ブラインドタッチは私の得意技に。
中学時代には、友人のPCトラブルを解決するのが日常茶飯事。
もしかしてこれが、技術者の素質だったのかも。

## 音楽家としての幕間
高校生で、音楽未体験ながらも吹奏楽部に飛び込み、そのまま音楽大学へ。
世界中のパーカッションを操り、音楽に心を奏でていました。どんな楽器でも手を動かし、毎日が練習と発見。
そしてライブやレコーディング、始めましての人とのアンサンブルは、私にコミュニケーションの真髄を教えてくれました。

## プログラミングの舞台に立って
アルバイトの履歴書に、「WordPressを操れます」と軽やかに書いたその日から、開発と保守の大役を担うことに。
依頼が舞い込むたびに、「任せてください！」の一言とともに、未知のコードの海に飛び込む日々。プログラムの詩を読む喜びに目覚め、「エンジニアの道、これはいい！」と心躍らせました。

やがて、音楽のステージから退場し、エンジニアの一本道を歩む決断を固めました。

革命的な出会い、それがNeovimでした。
キーボードのみで全てを操り、コードを自在に紡ぐ快感に魅了されたのです。
休日はNeovimとのデートで終わり、「早くコードに触れたい！」という熱狂を隠せませんでした。

そして、もう一人のエンジニアの登場が、私の人生に新たな動きをもたらしました。

彼からの基本を学び、フロントエンドとバックエンドを分担した開発で、画面が息を吹き返す瞬間に心躍りました。
あの感動は今も鮮やかに記憶に残り、「共に創る楽しさ」を、まるで音楽のアンサンブルのように再び感じたのです。

## 終曲から新たなプレリュードへ
かくして、私の物語は音符からコードへ、楽譜からプログラムへと転調しました。

WordPressの小さな一言が、私に開発の扉を開かせ、Neovimの魔法がコードの世界へと私を深く引き込んでいったのです。
そして、新たなエンジニアとの共演は、技術のアンサンブルがいかに魅力的かを再認識させました。

この舞台で、私は多くを学び、成長しました。
振り返れば、幼い日々の探求心から、音楽の奥深い練習の日々、それら全てがエンジニアとしての今に繋がっています。
パソコンの前の一人の時も、大勢の前での演奏も、全てはこの瞬間のための予感だったのかもしれません。

私の物語は、まだまだ続きます。
エンジニアとしての冒険はこれからも多くの楽章を重ねていくことでしょう。
音楽からコンピュータへ、ひとつの情熱から次の情熱へ。
古いメロディは新しいハーモニーへと昇華し、私は今日も新たなリズムを刻みながら、次のコードを打ち込んでいきます。

**※この文章はChatGPTに「ユニークな文章に書き直して」とお願いしました。**
【UiPath Appsでアプリ作成④】Data Serviceのデータをフィルタをかけて表示する

今回はData Serviceのエンティティをアプリの画面で表示する方法を書いていきます。

<H2>作成する画面</H2>
デモとして開始日と終了日を入力してデータテーブルをフィルタする機能を実装していきます。

![フィルタ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/228d534d-bfc9-3c9b-8de6-c14169cfe5c4.gif)


<H2>準備するもの</H2>
Data Service上にエンティティを用意します。今回は、表示名は"支出管理テーブル"、名前は"ExpenseTable"としてエンティティを用意しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/3ca6f87a-5617-6d5d-bb44-750da7c5798d.png)

エンティティを作成したらアプリにエンティティを追加します。作成から追加までの手順は前回の記事に掲載しているのでご参照ください。

https://qiita.com/kumatech/items/25ad85875d6a9f62c5ea

前回はエンティティにデータの追加をアプリを通して行いましたが、Data Serviceから対象のエンティティを開き、右上のデータの追加をクリックし、各項目を入力することで追加することも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/e55edfa0-56fb-b9f3-4bba-f687ef3ddfe2.png)


<H2>データテーブルを表示する</H2>

最初は、フィルタをかけない状態でエンティティを表示してみます。用意したアプリに[表]を挿入します。次に[表]の設定から[クエリビルダー]をクリックして、作成したエンティティを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/8fa2e4ca-044e-862c-a39e-c4d62d62ca6e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/2eb1c1cf-b075-19db-a63a-4a3d8c644561.png)

プレビューを押して確認するとエンティティに登録されている5件すべてを表示することができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/25cc8f35-baf2-9eb9-e741-55eaf28f2560.png)

表示する列の順番を変更したい場合は、全般の設定で変更することができます。表示名や、表示しない行の選択もできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/1118485a-6f4b-2c00-2295-d57cee53f34a.png)

<H2>データテーブルをフィルタする</H2>

日付でフィルタする機能を作成します。まずは開始日付と終了日付を入力する[日付の選択]を配置します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/3507e691-9a0e-f774-57f1-b0a5a9f225b6.png)


左のパネルのアプリの変数の横のプラスボタンをクリックし、入力した日付を格納する変数を作成します。今回は名前をdtStartDate、dtEndDateとしたDateOnly型の変数を二つ用意しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/2ca3e2ea-1228-8fa1-9227-afdf5077feb7.png)

先ほど配置した[日付の選択]で入力した値が変数に格納されるように[イベント]を設定します。開始日だけでなく終了日に関しても同様の設定を行ないます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/da494d73-77d5-c385-ffc0-fc59238f7327.png)

:::note warn
<b>式の書き方</b>
式は、[ページの名称].[項目の名称]の順番で構成されています。ご自身の設定に合う形に変更してください。またValue.Valueと二つValueを重ねるのは誤記ではなく、日付をDateOnly型で取得するために必要な書き方です。日付を取得する際のおまじないとして覚えてください。
:::

表示しているデータテーブルを選択し、全般の設定から[データソース]の[クエリビルダー]を開き、条件を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/4419645a-a31d-d632-73f7-d60bc1165435.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/1c06e338-5c19-29d3-67b9-b34e61f42b2a.png)

プレビューページから実際の画面を確認すると、フィルタされた2件のレコードが出力されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575031/9908e57b-8c04-2b90-d3b1-fb70806f145c.png)

<H2>まとめ</H2>
今回は、アプリの画面でData Serviceのエンティティを表示しフィルタをかける方法をまとめました。次回は今回の画面をより見やすく使いやすいものに改善していきます。

是非、過去の記事と合わせてお読みください！
【Heroku/Rails6】Error: error:0308010Cでデプロイ出来ない時の解決方法

## はじめに
このエラー解決方法の解説記事は世の中に溢れています。
ですが記事通りに設定したのに何故かデプロイ出来なくて沼りました。
自分と同じ状況の助けになれば幸いです！
## バージョン
- Ruby 2.7.7
- Rails 6.0.6.1
- Mac OS
## 結論
ターミナルで下記実行する。
```
heroku config:set NODE_OPTIONS='--openssl-legacy-provider'
```
※Heroku CLIのインストールが前提
https://devcenter.heroku.com/ja/articles/config-vars#using-the-heroku-cli

## そもそも公式が解決方法を提示している
https://github.com/webpack/webpack/issues/14532
公式より回避策として下記を実行しろ、と書いてあります。
```
export NODE_OPTIONS=--openssl-legacy-provider
```
しかし実行してもエラーが消えず、Node.jsのバージョンをいじったり色々しました。。。
## コマンドの意味
そもそも解決方法のコマンドが何をしているか理解していませんでした。
調べてみると、'NODE_OPTIONS'という環境変数に'--openssl-legacy-provider'を設定しているようです。
環境変数については下記で学びました。Linux基礎勉強不足。。
https://wa3.i-3-i.info/word11027.html
https://linuc.org/textbooks/linux/
## 結局何が起きているのか
2023.11月時点ではHerokuのNode.jsのバージョンがv20.9.0となっています。
v17.0以降だとOpenSSLの大きな変更があり、これがwebpackerに対応していないようです。
だから、前の方法でOpenSSL使ってね！という意味で環境変数を変更するコマンドを叩いていました。
しかし公式が提示しているコマンドを叩くだけだと、Heroku側の環境変数が変更されていない為Herokuで用意されているコマンドを追加して設定する必要がありました。
## 最後に
環境変数の概念を理解していなかった事が最大の要因でした。（ローカルとHerokuで環境変数を別に設定する概念がなかった）
分かる人にはレベルの低い話だと思いますが、一つずつ強くなっていきます！
DockerfileにUser rootって書いたけど

## はじめに
そもそもDockerfileってrootユーザーで実行されるやん？て思ったので調べた

## 結論
その通り。ただし、Dockerfileや呼び出したシェルスクリプトでユーザーの切り替えが発生した場合に使ったりする用途がある。
rootユーザーじゃないとインストールできない何かしらとか行いたい時とか。

## 例えば
シェルスクリプトをrootユーザーで実行したい場合の記述。
```
USER root
SHELL ["/bin/bash", "-c"]
```

ちなみにLinux上のデフォルトは`/bin/sh`。
なので明示してあげると、sourceとか.bashrcとかのログインシェルを使いたい時に幸せになれる。

## 終わりに
ほぼGPT4大先生のコピペなのは内緒な！

簡単ですが以上です:v:
Storybook上からthis.$storeにアクセスした～～～～～～い！！！！！！！😡

## やりたいこと

**タイトルを見ろ～～～～～～！！！！！！！**

## 前提情報

今回動作確認した環境
- Vue2.7 + Laravel
- Storybook v7.1.1

## Storybookの運用をしているときに絶対にぶつかる壁

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835408/17eaf3dc-1518-9874-ab9a-e305c8dd3a8a.png)

このようにstoriesファイルで読み込んでいるコンポーネントファイルがVuexの`$store`にアクセスする処理を持っていた場合、`$store`なんてものはないよという旨のエラーを吐かれ、Storybook上で正しくコンポーネントが表示されません。悲しいね😢

今回はどうにかこのエラーを解決してコンポーネントが表示されるようにするという話です。

## なぜこんなことになるのか

当然ですがStorybook用に生成されるVueインスタンスはサービス本体のものとは別になっており、そのインスタンスにVuexが生えていないためエラーを吐かれています。

つまり、

**なんとかVuexをStorybookのVueインスタンスに生やせば勝ち！！！！！！**

ということになりますが、普通にやってもうまくいかなかったのでどうにかやり方を工夫する必要がありました。

## 具体的にどうすればいいのか

方法は主に3つあると考えています。

1. Storybookに登録する用に、元のコンポーネントファイルをコピペして`$store`へのアクセス部分だけをモック化した別のコンポーネントファイルとして切り出す
1. `$store`にアクセスできるようモック化する
1. 諦める

それぞれ簡単に説明します。

### コンポーネントファイルをコピペする

要は`$store`へのアクセスができずにエラーが出ているので、その部分を丸々適当なモック処理に置き換えればいいわけです。
ただし本番用のファイルでそんなことをしてしまったら明日から僕の席がなくなってしまうので、Storybookに登録する用の別のコンポーネントファイルとして切り出した後、該当部分をモック化することになります。

```
【メリット】
- むずかしいことを考えずに対応できる

【デメリット】
- storiesファイルだけでなくvueファイルも作成しないといけないので手間が増える
- 元のコンポーネントファイルに修正が入ったときに追従する必要があり、管理工数が増える
```

### `$store`にアクセスできるようモック化する

先ほどは処理をモック化する方法でしたが、こちらは`$store`自体をモック化すればいいじゃないかという方法です。

```
【メリット】
- 元のコンポーネントファイルをそのまま登録できるので楽
    - 作業するのはstoriesファイルのみでいい
    - 元のコンポーネントファイルの修正がそのまま反映されるので追従する必要がない

【デメリット】
- そもそもモック化が難しい
```

### 諦める

諦めます

```
【メリット】
- 何も考えなくていい

【デメリット】
- 何も解決していない
```

今回は「`$store`にアクセスできるようモック化する」という方法で解決しました😊

## `$store`のモック化

先に結論から書いてしまいますが、Storybookを導入したときに生成される`preview.js`に以下のように修正することで解決しました。

```js
import Vue from 'vue';
import Vuex from 'vuex';

/** @type { import('@storybook/vue').Preview } */
const preview = {
  parameters: {
    actions: { argTypesRegex: '^on[A-Z].*' },
    controls: {
      matchers: {
        color: /(background|color)$/i,
        date: /Date$/,
      },
    },
  },
};

// $storeへ疑似的にアクセスできるようにする
Vue.use(Vuex);
Vue.prototype.$store = new Vuex.Store({
  // 以下実際のサービスで使ってるstoreと同じものをコピペする
  state: {},
  mutations: {},
  getters: {},
  actions: {},
});

export default preview;
```
※関係ない部分は省略しています

具体的には、[Vueのprototype](https://v2.ja.vuejs.org/v2/cookbook/adding-instance-properties)を使って`$store`という名前のインスタンスプロパティを生やし、そこに`new Vuex.Store({})`オブジェクトを代入しています。
これにより、StorybookのVueインスタンスにも`$store`という変数が定義されている状態となり、コンポーネントが正常に表示されるようになります。

今回はストアが一つの場合ですが、複数ある場合も`store/index.js`などでやっているようにひとつにまとめてから代入すれば問題なく動くはずです。（多分）

## 最後に

もしかするともっと良い方法があるかもしれないのですが、現状僕はこの方法で解決できたので少しでも参考になれば幸いです。

僕はこれからハイラルを救いに行かなければならないので、これにて失礼します。
PHPファイルをプレビューする


PHPのPの字も知らないですが、プレビューしたい場面があったので色々と試してみました。
メリット・デメリットあるのでそれぞれ確認してお試しください。

2つ方法があります
## 方法 1  VSCodeの拡張機能PHP Serverを使う

メリット：VSCodeからかんたんに起動できる
デメリット：APIは使えない(やりようでは使えるけど試してない)


**1 ターミナルでPHPをインストールされているか確認**
下記コマンドを実行します。インストールされていたら手順4に移ります。
```
php -v
```

**2 ターミナルでHomebrewが入っているか確認します**
入っていなければ手順3へ、入っていれば手順4へ移ります。
```
brew -v
```


**3 Homebrewをインストールします**
https://chigusa-web.com/blog/homebrew/


**4 PHP Ver. 7.4 をインストールします**
```
brew install php@7.4
```
下記コマンドでPHPが入ったことが確認できたらターミナルでの操作は完了です！
```
php -v
```

**5 VSCodeの拡張機能からPHP Serverを追加**
![スクリーンショット 2023-11-02 18.57.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/aea136cd-d7bc-2517-fe7a-0014d74bbc6c.png)


#### 使い方
**1 PHPファイル内で右クリック**
![スクリーンショット 2023-11-02 19.01.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/0f10a1db-e515-8880-da78-1fe55cfa4ebd.png)

**2 PHP Server: Serve projectを押下**


**起動できたら成功です！**


#### メモ
- 修正後の確認はPHP Server: Reload serverを実行する

## 方法 2 MAMPを使う
メリット：API使える
デメリット：プレビューの際に少し手間がかかる

**1 MAMPをインストール**

MAMP の公式サイト（https://www.mamp.info/en/）にアクセスします。
上部の [ダウンロード] にアクセスし、「OK」をクリックし、インストールを実行

![スクリーンショット 2023-11-06 15.40.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/2f5a23dd-a5d5-c089-93f8-ceb9a13a5093.png)

**2 MAMPを起動する**
![スクリーンショット 2023-11-06 15.42.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/bf165ea0-6fe6-2017-6436-9d3acac18cd5.png)

**3 左上 PreferencesからDocument rootを設定する**
ChooseからプレビューしたいPHPファイルが存在するファイルを選択する
![スクリーンショット 2023-11-06 15.48.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/d1f9d5af-7235-35e6-aea6-b337c1cfa3db.png)

**4 MAMPをStartする**
手順2の画面、右上のStartを押下しMAMPをスタート。
ブラウザ上でMAMPのページが展開します。
![スクリーンショット 2023-11-06 15.57.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/9c8af96f-8f2e-e976-6a4c-e8309125af94.png)

**5 起動したページに遷移する**
「localhost:8888/MAMP/?language=English」 から 「MAMP/?language=English」を削除してエンターキー押下。
削除前
![スクリーンショット 2023-11-06 16.02.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/84d197c6-a9b1-c91e-0e13-8e26f90c603a.png)


削除後にこのアドレスに遷移する
![スクリーンショット 2023-11-06 16.02.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/5707f058-a49b-e86a-2cf9-7356042ef9f3.png)

手順3で指定したDocument rootに対応する画面が開かれると思います！あとは必要なファイルにアクセスしてPHPファイル等を確認できます。

#### メモ
- デベロッパツールはcommand + option + I で開く

## 終わりに
よりよい方法あればご教示ください！
Swift 19 基本 SwiftUIプロジェクト分析

XcdoeでMultiplatformAppテンプレートを使って新しいSwiftUIプロジェクトを生成するとXcodeは最後アプリで構築されるProjectの基本を生成する為に複数のファイルとフォルダを生成します。

# 十九・壱　例題プロジェクト生成する
![Screenshot 2023-11-06 at 5.46.30 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/82c1aef3-7742-465e-f006-662b99b1ec12.png)

# 十九・弍　DemoProjectApp.swiftファイル 
App　objectに対する宣言です。
```swift
@main
struct awqqqqApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
```
実装された宣言部はContentView.swiftファイルで定義された*Viewを含まるWindowGroupで構成されたSceneを*`↑ return`します。
宣言部には@mainが接頭辞でつきます。これは機器からアフリが実行される時にここがアプリの**進入点**であることをSwiftUIで知らせる役目をします。
![Screenshot 2023-11-06 at 5.46.16 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/861a8f72-0e4d-343f-c3b5-4a7678122912.png)

# 十九・参　ContentViewファイル 
アフリが始める時に現れる最初の画面の内容を含まれるSwiftUIビュウファイルです
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundStyle(.tint)
            Text("Hello, world!")
        }
        .padding()
    }
}

#Preview {
    ContentView()
}
```
![Screenshot 2023-11-06 at 5.46.10 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/9a5e529f-a759-b0cb-40d4-a84c3ac4767a.png)


# 十九・肆 Assets.xcassets
このフォルダにはイメージ、アイコン、カラーみたいアプリで使用するresourceを保存するために使用するAssetsカタルロックが含まっています
![Screenshot 2023-11-06 at 5.46.00 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/100a5faa-c367-f3be-5897-22e4bd9de452.png)


# 十九・伍　DemoProjects.entitlements
entitlementsファイルはアプリ内で*特定IOS機能に対する志願を活性化するために*使用されます。例えば、アフリでiCloudストレージまたデバイスマイクで接近する必要があるとかシリを通じておん音声制御を統合したい場合 このファイル*内で権限を活性化するべきです。*
![Screenshot 2023-11-06 at 5.45.56 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/bbf28813-9be5-29c6-029e-e05fcafa58d5.png)


# 十九・淕　Preview Content
フリービュウエッせっとフォロドには開発間であるアプリを前に見るときに必要ですか゛完成されたアフリではひつよでは無い資産並びにデータが複雑入れています。ストアで提出するためにアフリをPackagingする準備がさればXcodeは無駄なスペースを取らないようにその資産を配達Archiveで削除します。
![Screenshot 2023-11-06 at 5.45.51 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513806/16f8ae89-05d8-6191-6af0-f144a4ab4003.png)
家の中でできる、２歳からできる、デジタルな宝探し遊び

この記事は**こそぷろ(子育てプロトタイピング) #protoout Advent Calendar 2023**に向けた記事です

## はじめに

コロナ禍にて当時２歳半の息子くんが時間つぶしで一人で遊んだ宝探しゲームを紹介したいと思います。
スマホでQRコードを読み込んで宝探しをする簡単なゲームです。
この遊びは

- 家の中でできます
- ２歳からできます
- 約30分間１人で遊べます

![結合画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150628/95837076-e5d7-e862-2f82-226f4a203dda.jpeg)

## 経緯
2020年3月、コロナにより全国の小中学校が一斉休校となりました。
一斉休校となっても自宅で学習が進めるよう、先生方が自宅に宿題を届けてくれてました。
当時２歳半の息子くんはそんな状況もわからず、遊んでくれるお姉ちゃんが毎日家にいるから、構いにいっちゃうけど、相手してくれないて泣いてしまう。
お姉ちゃん達も勉強はかどらなくて困る。
もどかしい状況を回避するため、なるべく子どもが一人で遊べるようにしないといけなかった

## 準備

準備するのは子どもが好きな画像数枚とプリンターのみです。
息子くんは好きな電車の画像で遊んでいました。

## 手順

準備は下記の通りです。
2~5は画像ファイル単位で実施する必要があります。
最後に印刷したQRコードを家の中に散りばめておけば準備は完了です。

1. 画像をGoogleDriveにアップロードする
1. アップロードした画像ファイルに共有リンクを作成する
    1. 画像ファイル右クリック＞共有＞共有
    1. 一般的なアクセスを制限付きからリンクを知っている全員に変更する
    1. 右側の権限が**閲覧者**となっていることを確認して、リンクをコピーをクリックする
1. [ＱＲコード生成サイト](https://qr.quel.jp/)を表示する
1. URL欄に画像の共有リンクをコピペし、QRコードを生成する
1. 生成したQRコード画像をダウンロードする。
1. QRコードの画像ファイルを印刷する

# やってみた感想

iphoneでやってみましたが、２歳半でもQRコードを読み取ることは簡単にできました。
表示するかどうかの確認ダイアログが毎回表示されますが、正しい方をタップするように言えば理解できます。
我が家では９枚の画像を準備しましたが、30分ぐらいは一人で遊んでくれました。
ただ、「○○やった！」と１回ずつ報告してくるので、集中させてはくれないところもあります。

ＱＲコード画像をシャッフルすると無限にスタートできます。
あと小学校の娘ちゃんたちも一緒に遊び始めます。なんなら独り占めしようとします。

外出先でのＱＲコードを見ると、勝手に読み取りしようとすることがありますので、用法用量にご注意ください。
Salesforceでコピー時に初期値を埋め込む

概要
　Salesforceで詳細レコード画面のコピーボタンによるレコード作成時、初期値を埋め込みしたい。

詳細
　標準のコピーでは、当然全ての値が反映された上で新規作成の画面が表示される。
　それを特定の項目には初期値を埋め込んだ上で表示したい。

方法１
　公式にある方法。
　https://releasenotes.docs.salesforce.com/ja-jp/spring20/release-notes/rn_general_lex_navigate_to_record_dfv.htm
　カスタムボタンを作成、URL指定で各項目を埋め込む方法。
　この方法では標準オブジェクト、カスタムオブジェクト共に動作した。
　ただし項目数が多くなるとURLの制限（約3Kバイト）に引っ掛かる。また１項目ずつ設定する必要があるので面倒。

方法２
　方法１のURLを以下に変える。（ただしカスタムオブジェクトのみで動作）
　　/lightning/r/API参照名/{!CASESAFEID(API参照名.Id)}/clone?
　　recordTypeId={!CASESAFEID(API参照名.RecordTypeId)}&
defaultFieldValues=Name={!URLENCODE('初期値')}
　この方法ではコピー元の値を全て引き継いだ上で、特定の項目のみ初期値を埋め込み出来る。
　レコードタイプが無ければ指定の必要はない。
　※この方法が公式的にOKかどうか不明。
dji pocket2で撮影した動画をyoutubeにアップロードするツール作りました。

# 前提
今回作成したプログラムは、dji pocket2で撮影した動画をyoutubeにアップロードするツールです。
あくまで自分のために作ったものなのでほとんどの人には使えないものだと思います。
ただ、dji pocket2で動画を撮影して、そのまま上げるような方には便利に使ってもらえるかな。
そんな人いないかもしれないけど、、、、

# やりたいこと
dji pocket2で動画を撮影した後、SDカードを取り出してPCに接続し、コマンドラインからコードを一つ叩けば編集アップロードが完了するようなものを作ります。
dji pocket2で撮影した動画は5分くらいで細切れになっているのでそれを統合するintegrate.pyとyoutubeに動画をアップロードするupload.pyの二つのスクリプトを作りました。
詳細なコードはここに挙げてあります。
https://github.com/shunkat/AutoUploaderDJIPocket

詳しいコードの解説は割愛します。

# 前提条件
私のPCはmacです(sonomaにしました)
## 1. スクリプトの概要
- **integrate.py**: 特定のディレクトリから.MP4ファイルを検索し、それらを結合します。結合が成功すると、結果を`upload.py`スクリプトに渡してYouTubeにアップロードします。
- **upload.py**: 指定されたビデオファイルをYouTubeにアップロードします。OAuth2認証を使用してYouTube APIにアクセスします。

## 2. 必要なツールとライブラリのインストール
### 2.1 必要なツール
- ffmpeg: ビデオの結合に使用します。[こちら](https://ffmpeg.org/download.html)からダウンロードしてインストールします。

### 2.2 Pythonライブラリのインストール
```bash
pip install httplib2 oauth2client google-auth google-auth-oauthlib google-auth-httplib2 google-api-python-client
```

## 3. 使用方法

### 3.1 設定
1. [Google Developers Console](https://console.developers.google.com/)で新しいプロジェクトを作成し、YouTube Data API v3を有効にします。
2. OAuth 2.0 クライアントIDを作成し、ダウンロードしたJSONを`client_secrets.json`として保存します。
3. `integrate.py`の`storage_path`変数を適切に設定します。（一時的に保存する場所の設定）

### 3.2 実行
1. SDカードをPCに接続します。
2. ターミナルまたはコマンドプロンプトで以下のコマンドを実行します：
```bash
python integrate.py "あげたい動画のタイトル"
```

## 4. スクリプトの概要
具体的なコードはgithubにあげたので見てください。
- **integrate.py**
  1. `.LRF`ファイルを削除します（不要な場合）。
  2. `.MP4`ファイルを検索し、名前順にソートします。
  3. ffmpegを使用してビデオを結合します。
  4. 結合が成功した場合、`upload.py`を呼び出してYouTubeにアップロードします。

- **upload.py**
  1. OAuth2認証を使用してYouTube APIにアクセスします。
  2. ビデオのメタデータ（タイトル、説明、カテゴリなど）を設定します。
  3. ビデオをYouTubeにアップロードします。

## まとめ
このスクリプトを使用することで、ビデオファイルの結合とYouTubeへのアップロードを簡単に、迅速に行うことができます。カスタマイズや拡張を行うことで、さらに多機能なツールを作成することも可能です。

自分は自分用の作業用BGMを作ったりして使っていますー！
ツールを作るのって楽しいですね〜
ではまた！
wslでelixir その94

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題、やってみた。

# 練習問題
タイミングチャートを表示せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e947617d-5184-794b-8434-583551fa0ce4.png)


# サンプルコード

```
defmodule KinoHTML.Tchart do
  use Kino.JS

  def new(html) do
    Kino.JS.new(__MODULE__, html)
  end

  asset "main.js" do
    """
    function draw(ctx, row, w) {
      const WIDTH = 400;
      const HEIGHT = 400;
      const ROW_HEIGHT = 20;
      const LOGIC_HEIGHT = 15;
      const NAME_LEFT = 5;
      const SIG_LEFT = 50;
      const SIG_RIGHT = 380;
      const SIG_WIDTH = (SIG_RIGHT - SIG_LEFT);
      const TICK_START = 0;
      const CLK_OFSET = 5;
      const TICK_COUNT = 9;   
      const TICK_WIDTH = SIG_WIDTH / TICK_COUNT;
	    const Y_BASE = ROW_HEIGHT * (row + 1);
	    ctx.fillStyle = "red";
	    ctx.fillText(row, NAME_LEFT, Y_BASE, SIG_LEFT);
	    ctx.fillStyle = "rgb(240, 240, 240)";
	    ctx.lineWidth = 1;
	    for (var i = 0; i < TICK_COUNT; i += 2)
	    {
		    var x = i * TICK_WIDTH + SIG_LEFT + CLK_OFSET;
		    var yh = Y_BASE - LOGIC_HEIGHT;
		    ctx.fillRect(x, yh, TICK_WIDTH, HEIGHT - 5 - yh);
	    }
	    ctx.moveTo(SIG_LEFT, Y_BASE);
	    ctx.lineTo(SIG_LEFT + CLK_OFSET, Y_BASE);
	    for (var i = 0; i < TICK_COUNT; i++)
	    {
		    var x = i * TICK_WIDTH + SIG_LEFT + CLK_OFSET;
		    if (w[i] == 0)
		    {
			    ctx.lineTo(x + TICK_WIDTH, Y_BASE);
		    }
		    else
		    {
			    if (w[i] != w[i - 1]) 
				    ctx.lineTo(x, Y_BASE - LOGIC_HEIGHT);
			    ctx.lineTo(x + TICK_WIDTH, Y_BASE - LOGIC_HEIGHT);
			    if (w[i] != w[i + 1]) 
				    ctx.lineTo(x + TICK_WIDTH, Y_BASE);
		    }
	    }
	    ctx.stroke();
    }
    export function init(ctx, html) {
   		const canvas = document.createElement("canvas");
      canvas.Width = 400;
      canvas.Height = 400;
  		ctx.root.appendChild(canvas);
      const ctx2 = canvas.getContext('2d');
	    ctx2.clearRect(0, 0, canvas.width, canvas.height);
	    ctx2.beginPath();
     	var tim = JSON.parse(html);
	    draw(ctx2, 0, tim.s);
	    draw(ctx2, 1, tim.t);
	    draw(ctx2, 2, tim.u);
	    draw(ctx2, 3, tim.v);    	
    }
    """
  end
end

KinoHTML.Tchart.new("""
{
  "s": [0, 1, 0, 1, 0, 0, 0, 1, 0], 
  "t": [0, 0, 1, 1, 0, 1, 0, 0, 0], 
  "u": [0, 1, 0, 1, 0, 0, 0, 1, 0], 
  "v": [0, 0, 1, 1, 0, 1, 0, 0, 0]
}
""")

```


以上。
権威 DNS サーバーのお引越し

# 参考リンク

- [JPRS トピックス＆コラム No.19 | ドメイン名やDNSの解説 | JPRS](https://jprs.jp/related-info/guide/topics-column/no19.html)
- [3.1. PrimaryDNSへの移行方法](https://sdpf.ntt.com/services/docs/fastdns/tutorials/rsts/fastdns/appendix/000_migration.html#/)

# DNSSEC なし
上記リンクにある通り、以下の手順で移行することが推奨されています。

1. 移行先となる新しい権威 DNS サーバーを用意して、DNS レコード情報を反映します。
1. 子の NS レコードを新しい権威 DNS サーバーに向けて、子の古い NS の TTL が経過するまで待ちます。
1. 親の NS レコードを新しい権威 DNS サーバーに向けて、親の古い NS の TTL が経過するまで待ちます。

<iframe src="https://docs.google.com/presentation/d/1bSl7u9iRv9zSk6Kt1JPWTgqGAHYUzw3RNbdokmP7Af8/embed?start=false&loop=false&delayms=3000" frameborder="0" width="1000" height="600" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>

# DNSSEC あり

## DNSSEC 無効化して移行

DNSSEC を無効化した上で、[DNSSEC なし](#dnssec-なし) の場合と同様のステップで移行できます。

- [Change your nameservers (Full setup) · Cloudflare DNS docs](https://developers.cloudflare.com/dns/zone-setups/full-setup/setup/)

## DNSSEC 無効化せずに移行
Multi-signer DNSSEC に対応していれば、DNSSEC が有効なまま、移行ができます。

- [Migrate a zone with DNSSEC enabled · Cloudflare DNS docs](https://developers.cloudflare.com/dns/dnssec/dnssec-active-migration/)
- [Cloudflare と NS1 を使って Multi-signer DNSSEC を構成する #dns - Qiita](https://qiita.com/khayama/items/1b29f7d3c1b22207d4d4#zsk-%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88ns-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A)
定額課金(サブスク)の決済サービス 比較表


定額課金(サブスク)の決済サービスとして有名な「Stripe、PAY.JP、PayPal」のサービスを比較してみました。


| 項目             | Stripe                                       | PAY.JP                                             | PayPal                                     |
|------------------|----------------------------------------------|----------------------------------------------------|--------------------------------------------|
| **導入事例**     | SmartHR、Booking.com、Slackなど             | DMM.make AKIBA、BIZREACHなど                       | YAMADA電気、クラウドワークスなど          |
| **料金体系**     | 決済ごとに3.6%                               | ベーシックプラン: 月額0円、手数料3.0%〜3.6%; スタンダードプラン: 月額10,000円、手数料2.59%〜3.3% | 取引額に応じて変動、30万円以下は3.6% + 40円/件 |
| **対応クレジットカード** | Visa、MasterCard、Amexなど                   | Visa、Mastercard、Amexなど                          | サービスによる                             |
| **実装の容易さ** | 充実したAPIリファレンスとiOS・AndroidのSDK利用可能 | ネイティブ言語のSDKとクロスプラットフォームプラグイン利用可能 | 詳細情報はソースに無し                   |


詳しい情報や追加機能に関しては、それぞれの公式サイトで最新情報をご確認ください：

- [Stripeの詳細](https://stripe.com)
- [PAY.JPの詳細](https://pay.jp)
- [PayPalの詳細](https://www.paypal.com)
Javascript　テンプレート文字列・アロー関数

# テンプレート文字列
今までは+を使ったりしなければいけなく、コーテーションがその都度必要だったりしたがテンプレート文字列を使うと、文字列の中に埋め込むことができる。
使い方は文字列を ` バッククウォートで囲み、jsの文は${}で囲む。
```js
const name = "tami";
const age = 20;
const favo = {
  food: "りんご",
  color: "赤"
  };
  
  const hello =`私の名前は${name}です。年齢は${age}歳です。
                好きな食べ物は${favo["food"]}、好きな色は${favo["color"]}です。`;
                
  console.log(hello)
```
```console
私の名前はtamiです。年齢は20歳です。好きな食べ物はりんご、好きな色は赤です。 
```

# アロー関数
従来はfunctionを用いて関数を用いていたが、ES6から別の書き方ができるようになった。
=>が弓矢に見えることからアロー関数と呼ぶ。

#### 従来
```js
//引数に文字列を渡してそれをreturnで返すという関数があったとする


  function func1(str){
    return str;
  };

  console.log(func1("func１です！"));
```
```
func1です！
```
#### 変数に無名関数を入れた場合
```js
const func1 = function(str){
  return str;
};

console.log(func1("func１です！"));
```
```
func1です！
```
#### アロー関数
```js
//無名関数のときの'function() ='のfunctionがなくなって>が追加されたような見た目
const func1 = (str) => {
    return str;
};

console.log(func1("func１です！"));
```
```js
//引数が一つの場合、()を省略できる。ただpritierを使うと自動で()が付くので
//どちらで記述するにしろ記法を統一すること。
const func1 = str => {
    return str;
};

console.log(func1("func１です！"));
```
```js
//実行内容が単一の場合、returnと波括弧{}も省略できる。
const func1 = str => str;

console.log(func1("func１です！"));
```
```
func1です！
func1です！
func1です！
```
# まとめ
ES6から便利な記法が増えた。テンプレート文字列も、アロー関数もより簡単にわかりやすく、書くことができるなと思った。アロー関数に関してはまだ理解できていない部分があるが、追々理解していければと思う。
無名関数に関しては今回は変数定義しての使い方しか書いていないが、例えば引数に入れるときに無名関数で書いて、なおかつアロー関数で書けば、変数名を考えて定義してという工程を省けるので、非常に短くわかりやすく処理内容を書くことができる。
引数に関数を入れるとき１００％この書き方で書けばいいというわけではなく、同じ関数を何度も記述したりする場合など、変数に定義して記述していくほうが記述がスマートになる場合もあるため、時と場合に応じて書き方を選ぶことが大切。
【後編】DB設計を担当した話


前回の記事の続きです！

https://qiita.com/suda_imagitech/items/834b54df11004556cc82

# 1. テーブルをまとめる

↓のようなテーブル構成があるとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495456/f1f44462-5960-71cd-5c8a-434bf87ab854.png)

PKが同じユーザIDで、格納するデータが違う2つのテーブルです。
ログイン時間がアプリケーション上重要、もしくはログイン時間のレコードが存在しないことで何かしらの判断する場合別テーブルにしたほうがいいかと考えました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495456/f50f32d8-3fca-6911-cfa2-d5a8058a06eb.png)

この構成でレビュー頂いたところ指摘をいただき、1つのテーブルにまとめました。

>ログイン時間がアプリケーション上重要、もしくはログイン時間のレコードが存在しないことで何かしらの判断する場合

ユーザテーブルのログイン時間列にデータがあるかどうかで判断すればいい話です。
もともとはこのように一つのテーブルにまとめようと考えていましたが、この列が条件分岐の判断材料になるなら別テーブルにしたのが最初の案です。

開発のしやすさ（SELECTする際のテーブル名で何をするかピンポイントで分かること）を考慮してテーブル構成をおざなりにするのは合理的ではありません。
ただ設計書などにこのログイン時間にどのような意味があるのかしっかり記載する必要があり、チーム内で周知する必要がありますね。（テーブル２つでも必要か。。。）

まあなんでもかんでもまとめればいい話ではなく、ログイン時間の重要性だったり、項目の多さだったりでテーブルを分けたほうがいい場合もあると思います。合理的に行きましょう。自戒。

# 2. FKの列名はPKと同じにしとき

X（旧Twitter）をイメージしてください。
ユーザテーブルとポスト内容を格納しているテーブルがあるとします。
↓イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495456/0c21b616-986d-cfc7-78de-9d442712417e.png)

ポスト一覧テーブルにはどのユーザがポストしたか分かるようにポスト投稿ユーザID列を設けます。
FKはどのような意味のユーザIDか分かるように名前を設定しました。

設けるのはいいですが、
「ポスト投稿ユーザID」ではなく
「ユーザID」にしよう。です。

↓のようにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495456/3b801731-7b0c-b6a2-3e9e-fe3f1b03df62.png)

同じような状況がテーブル定義中にありました。
確かにPKとFKを別名にするとどの列とリレーションを持っているのか直感的に分からなくなります。

これも1.と同じでFKの意味合いを設計書にしっかり記載する必要があります。
設計者の自分は意味が頭に入っていますが、メンバーが増えた場合や見直す際に正しく伝わるように設計書はめちゃ大事に記載しましょう。

# 3. クラウドの知識があるとDB設計にも反映するかもね

セキュリティ上いろんな制限をかけたいと思っています。
その制限をDB上で設定しようと考えていました。

現状とあるクラウドサービスを利用してDBの環境を用意していますが、ここで色々調べてみるとクラウド側でいろいろ制限かけれますね。。。

2年くらい前にがっつり勉強しており、すこーーーーーーーしだけ知識があったのでこの制限はできないかなーっと考えてましたができそうです。

若干趣旨からずれましたが、クラウドの知識があることでDB設計に影響がありそうです。
また勉強すっか。

# 4. 終わりに

・データの整合性をとることを最優先にする
・設計書しっっっっっっっっっかり書くこと
・クラウドサービスを知ること

どれも当たり前のことですが、改めて頭に叩き込みこれからのDB人生に生かします。

これでDB設計のお話は終わりです。
一人では得なかった知識を今回得ることができました。
Dまだまだな部分はありますが、これからも精進していきたいと思います。

# 5. 予告
11月17日に投稿予定です！
自作キーボード「Helix」接続時にMacのスリープがすぐ解除される問題の対策

# 問題
自作キーボード「[Helix rev3 LP](https://shop.yushakobo.jp/products/2143)」を接続したMacをスリープさせてもすぐに復帰してしまう。

**環境**
- MacBook Pro (13-inch, 2020, Thunderbolt 3ポートx 4, Intel Core i7)
- macOS Ventura 13.6.1

# 対策
設定ファイルに以下のコードを追加する。

```config.h
#define MATRIX_MASKED
```

```keymap.c
const matrix_row_t matrix_mask[MATRIX_ROWS] = {
    0b00111111,
    0b00111111,
    0b00111111,
    0b01111111,
    0b01111111,
    0b00111111,
    0b00111111,
    0b00111111,
    0b01111111,
    0b01111111,
};
```
ASP.NET Core Blazor (Blazor WebAssembly モデル) での SkiaSharp 使用準備について

WebAssembly 環境下では `System.Drawing.Bitmap` が使用できません。

そこで、画像を取り扱う際は SkiaSharp など代替ライブラリの利用を検討する必要があります…

参考:

- [破壊的変更: System.Drawing.Common が Windows でしかサポートされない - .NET | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/core/compatibility/core-libraries/6.0/system-drawing-common-windows-only)

WebAssembly 環境下で SkiaSharp を使用するにあたり、

.NET 6.0 `BlazorApp.csproj` で必要となる内容は以下のようです。

```xml
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>

    <WasmBuildNative>true</WasmBuildNative>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="SkiaSharp" Version="2.88.6" />
    <PackageReference Include="SkiaSharp.NativeAssets.WebAssembly" Version="2.88.6" />
    <NativeFileReference Include="$(SkiaSharpStaticLibraryPath)\2.0.23\*.a" />

    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="6.0.24" />
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="6.0.24" PrivateAssets="all" />
  </ItemGroup>

</Project>
```

この後、ワークロードというものを復元したり更新したりするようです。

```bat
dotnet workload restore
dotnet workload update
```

```
ワークロードをインストールしています:

コンピューターの再起動が保留中です。インストールは続行されますが、再起動が必要になる場合があります。

ワークロード wasm-tools wasm-tools-net6 が正常にインストールされました。
```

`<PackageReference Include="SkiaSharp" Version="2.88.6" />` の追加だけで Blazor WebAssembly に対応できるのかと思っていたら、そうではありませんでした。という驚きが記事を書こうと思った切っ掛けです。

参考:

- [Trying ASP.NET Core Blazor WebAssembly with Skiasharp · Issue #1867 · mono/SkiaSharp](https://github.com/mono/SkiaSharp/issues/1867)

メモ:

- `<WasmBuildNative>true</WasmBuildNative>` は WebAssembly バイナリをネイティブビルドする際に、この指示をするようです。
- `SkiaSharp.*` のバージョン `2.88.6` は、執筆時点での最新です。より新しいバージョンがある場合は、そちらを利用しましょう。
- `SkiaSharp.NativeAssets.WebAssembly` を明示的に指定する理由は `SkiaSharp` の依存関係には含まれないからです。参考: [NuGet Gallery | SkiaSharp 2.88.6](https://www.nuget.org/packages/SkiaSharp#dependencies-body-tab)
- `NativeFileReference` では、WebAssembly バイナリをネイティブビルドする際に `libSkiaSharp.a` を含むように指示しているようです。
- `$(SkiaSharpStaticLibraryPath)\2.0.23` の `2.0.33` は、使用している Emscripten SDK のバージョンのようです。ビルドメッセージに `"C:\Program Files\dotnet\packs\Microsoft.NET.Runtime.Emscripten.2.0.23.Sdk.win-x64\6.0.24\tools\bin\wasm-ld.exe" -o ...` のようなものがありましたので、そう解釈しました。
SQLiteを触ってみた（mac）

久しぶりにSQLiteに触ったらだいぶ忘れていたので備忘録。
# セットアップ
### データベースの作成
DBのファイルを置きたいフォルダに移動して以下のコマンドを実行する。
指定したファイルがない場合は新規作成されます。
macはターミナルを開くと `/Users/ユーザー名` にいるので、移動しなければそこにファイルが作成されます。
```terminal
% sqlite3 任意のファイル名.db
```
ただこの時点ではまだファイルは作成されず、次のコマンドでファイルが作成されます。
### データベースへの接続
```sql
sqlite> .database
```
### テーブルの作成
```sql
sqlite> create table テーブル名(カラム名 型);
```
例えば
```sql
sqlite> create table users(id integer primary key, name text);
```
`primary key` を指定することでidを指定しなくても自動採番されるようになります。
### テーブル一覧を表示
```sql
sqlite> .table
```

### テーブル定義を表示
```sql
sqlite> .schema テーブル名
```

### SQLiteの終了
```sql
sqlite> .exit
```
# CRUD
### レコードの挿入
```sql
sqlite> insert into テーブル名 (挿入場所のカラム名) values(挿入する値);
```
例えば上のテーブルに対して
```sql
sqlite> insert into users (name) values('hoge');
sqlite> insert into users (name) values('fuga');
```
### レコードの参照
```sql
sqlite> select * from テーブル名;
```
例えば上のテーブルに対して
```sql
sqlite> select * from users;
1|hoge
2|fuga
```
### レコードの更新
```sql
sqlite> update テーブル名 set カラム名 = 値 where カラム名 = 値;
```
例えば上のテーブルに対して
```sql
sqlite> update users set name = 'hogehoge' where id = 1;

sqlite> select * from users;
1|hogehoge
2|fuga
```
### レコードの削除
```sql
sqlite> delete from テーブル名 where カラム名 = 値;
```
例えば上のテーブルに対して
```sql
sqlite> delete from users where id = 1;

sqlite> select * from users;
2|fuga
```
場所を指定しなければ全データ削除
```sql
sqlite> delete from テーブル名;
```
#その他
### テーブル削除
```sql
splite> drop table テーブル名;
```

<hr>

参考サイト（参考というかそのまま..）
[はじめてのSQLite（Mac版）
](https://spirits.appirits.com/doruby/9428/)[【MySQL入門③】データベースの基本操作CRUDを解説！
](https://snome.jp/database/db-intro-3/)
【メモ】Unityの単語帳

あくまで自分用です。
VRアプリの勉強をしています。
その上で勉強したことについてまとめています。
GPT先生に聞いた内容もメモとしてあります。できるだけ記事も探して載せるようにしますが、ない場合は察してください。そういうことです。

よければこちらもぜひ

https://qiita.com/Bassiy/items/1e0601be7a095be3bea0

# 単語

### ブール値について
・ブール値：プログラミングにおいて真（true）か偽（false）の2つの状態を持つデータ型

https://note.com/want_drive_pc/n/n79f3f0f81d6a

### Static Fields（静的フィールド）について
・Static Fields（静的フィールド）：クラスレベルで共有されており、そのクラスの全てのインスタンスで共通の値を持つ。つまり、あるインスタンスが静的フィールドの値を変更すると、その変更は他のすべてのインスタンスにも反映される

### Vector3について
・Vector3：3次元空間の(x, y, z)のそれぞれの座標軸に対するベクトル

https://tech.pjin.jp/blog/developer/2021/12/31/unity_vector3

### アクセス修飾子について
・アクセス修飾子：クラス、メソッド、変数などのメンバーへのアクセスレベルを指定するために使用される以下の５種類がある。
public：どこからでも参照可能
internal：同一アセンブリであれば参照可能
protected：自分のクラスと派生クラスでのみ参照できる
private：自分のクラスの内部からのみ参照
（protected internal）
※同一アセンブリとは、同一のexeファイルや、DLLファイルのこと

### インスタンス化について
・インスタンス化：プログラミングにおいて、あるクラス（設計図）からオブジェクト（具体的な例）を生成することを

### publicについて
```memo.cs
using UnityEngine;

public class Spawner : MonoBehaviour
{
    public GameObject prefabToSpawn; // ⇚これについて

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space)) // スペースキーを押すと
        {
            Instantiate(prefabToSpawn, new Vector3(0, 0, 0), Quaternion.identity);
            // prefabToSpawnのインスタンスを生成し、シーンの原点に配置します。
        }
    }
}
```
アクセス修飾子の一つ。publicに指定されたメンバーは、どこからでもアクセス可能。つまり、そのクラス自身、そのクラスを継承したサブクラス、またはそのクラスのインスタンスを生成した他のどのクラスからもアクセスすることが可能。
Unityでは、public で宣言された変数は、**UnityエディタのInspectorウィンドウで表示され**、開発者が直接値を変更できるようになる。これにより、プログラマがコードを変更せずに、異なるオブジェクトや値で簡単に実験することができる。

### Rigidbodyについて
add componentから追加できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/e7351ca4-dcb7-bb7a-13e9-372b0b164299.png)

※Cubeにコンポーネントとして追加した時に調べたのでそっちによった表現があります。
・Mass（質量）: Cubeの質量を設定できる。

Drag（抗力）: Cubeが移動する際の空気抵抗を模倣する。

Angular Drag（回転抗力）: Cubeが回転する際の抵抗を示します。

Use Gravity（重力の使用）: このオプションをオフにすることで、Cubeが重力の影響を受けずに空中を直進するようになります。

Is Kinematic（運動学的オブジェクト）: このオプションがオンになっていると、オブジェクトは物理シミュレーションの影響を受けなくなります。Cubeを発射する場合は、このオプションをオフにしておきます。

Interpolation（補間）: より滑らかな動きを実現するために、このオプションをInterpolateまたはExtrapolateに設定すると良いでしょう。

Collision Detection（衝突検出）: Cubeが高速で移動する場合は、ContinuousまたはContinuous Dynamicを選択して、衝突がスキップされないようにします。
为什么两个Excel之间不能快捷切换 

1、按Win+R键，打开运行，输入regedit，回车进入注册表编辑器;
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734236/93fdaae7-0f8d-a80c-22ff-b25a2ba2f298.png)


2、展开至HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer，在右侧找打并双击“AltTabSettings”;
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734236/0c22cf1e-c9c2-5493-2a14-811576e8f092.png)


3、将数据数值修改为“00000001”，点击确定;
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734236/2011a96b-994e-5b6f-d311-5fb074eba903.png)
【UE5】stat HITCHESで表示される数字はヒッチしていた時間(ミリ秒)

自分メモ。

コンソールコマンド「stat HITCHES」を実行すると、ヒッチがあったときにアウトプットログにその旨表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/0fb7d330-d341-a470-5ca2-ca5bb8b690f1.png)

「HITCH」という文字の後に表示される数値は「ヒッチしていた長さ」で単位はミリ秒。

:::note info
- 何ミリ秒でヒッチと判定するかは、コンソール変数 ```t.HitchFrameTimeThreshold ミリ秒```で指定できる。デフォルト値は60ミリ秒。
- エンジンソースを「HITCH %d」で検索すると当該箇所が見つかる。
:::