OmniAICreator/Qiita-1.07M huggingface dataset:
buildspec.ymlって何を書いているのか調べてみた

# buildspec.ymlとは
CI/CDで実行する際のコマンドを記述したYAML形式のファイルのこと。
CodePipelineで指定したソースコード内に配置し、Buildやデプロイをする際に読み込まれる。
ソースコードのルートディレクトリに配置しないとうまく動かない。
ファイル名と場所も変更できるらしい

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html

# buildspec.ymlの全体像
これはhtmlファイルをdockerコマンドでビルドして、ECRにデプロイするやつ
```ruby:buildspec.yml
version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws --version
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin <AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com
      - REPOSITORY_URI=<AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/ecsautodeployrepo
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=${COMMIT_HASH:=latest}
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $REPOSITORY_URI:latest .
      - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker images...
      - docker push $REPOSITORY_URI:latest
      - docker push $REPOSITORY_URI:$IMAGE_TAG
      - echo Writing image definitions file...
      - printf '[{"name":"ecsAutoDeployRepo","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
artifacts:
    files: imagedefinitions.json
```
# version
0.2がAWS公式で推奨されている

# phases
ビルド時にCodeBuildが実行するコマンド

# pre_build
ビルドの前に実行するコマンド
Amazon ECRやDockerレジストリにログインしたり、npmの依存関係をインストールするらしい

# commands
実際に実行するコマンド
上から順に実行される
```
aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin <AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com
```
`aws ecr get-login-password`でAmazon ECRにログインして、`docker login`でECRから持ってきたパスワードで認証

```
REPOSITORY_URI=<AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/ecsautodeployrepo
```
REPOSITORY_URIを定義し、後でECRを操作するときに使う
```
COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
```
`$CODEBUILD_RESOLVED_SOURCE_VERSION`はAWSが事前に定義している環境変数
イメージタグを作るときに使う
# build
ビルド中にCodeBuildが実行するコマンド
```
docker build -t $REPOSITORY_URI:latest .
```
ファイルをビルドする
```
docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
```
# post_build
ビルドの後にCodeBuildが実行するコマンド
パッケージ化したり、DockerイメージをAmazon ECRにプッシュしたり、Amazon SNSで通知したりするらしい
```
docker push $REPOSITORY_URI:latest
```
Amazon ECRにDockerイメージをプッシュする
# artifacts
「ビルド出力を見つけることができる場所に関する情報」と公式ドキュメントに書いてあったがよくわからない
`imagedefinitions.json`はコンテナ名とイメージ、タグについて説明するJSONファイル
以下の情報を記入する(post_buildで作成)
| キー | 値 |
|:-:|:-:|
|  name | [コンテナ名] |
|  ImageURI |  [イメージのURI] |

# 参考
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html

https://qiita.com/s_ryota/items/803b44caacac12fd2439

https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/file-reference.html
Cythonをインストールしているのにpip installでModuleNotFoundError: No module named 'Cython'となる場合の解決方法

pip installでCythonインストール済みなのに、なぜかほかのライブラリをインストールするときにModuleNotFoundError: No module named 'Cython'となって、なかなか解決できなかったのでメモ。

# 環境
python3.7.3

# インストール方法
```bath
$ pip3.7 install --upgrade pip
$ pip3.7 install --upgrade cython
$ pip3.7 install cython_bbox
```
# エラー内容
cython_bboxをインストールする前にcythonのインストールは成功しているのだが、なぜかエラー。
```bash
Collecting cython_bbox
  Downloading cython_bbox-0.1.3.tar.gz (41 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 41.3/41.3 kB 261.9 kB/s eta 0:00:00
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to build wheel: started
  Getting requirements to build wheel: finished with status 'error'
  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─> [17 lines of output]
      Traceback (most recent call last):
        File "/usr/local/lib/python3.7/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 353, in <module>
          main()
        File "/usr/local/lib/python3.7/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 335, in main
          json_out['return_val'] = hook(**hook_input['kwargs'])
        File "/usr/local/lib/python3.7/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 118, in get_requires_for_build_wheel
          return hook(config_settings)
        File "/tmp/pip-build-env-6p_jm7_z/overlay/lib/python3.7/site-packages/setuptools/build_meta.py", line 341, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=['wheel'])
        File "/tmp/pip-build-env-6p_jm7_z/overlay/lib/python3.7/site-packages/setuptools/build_meta.py", line 323, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-6p_jm7_z/overlay/lib/python3.7/site-packages/setuptools/build_meta.py", line 488, in run_setup
          self).run_setup(setup_script=setup_script)
        File "/tmp/pip-build-env-6p_jm7_z/overlay/lib/python3.7/site-packages/setuptools/build_meta.py", line 338, in run_setup
          exec(code, locals())
        File "<string>", line 10, in <module>
      ModuleNotFoundError: No module named 'Cython'
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error

× Getting requirements to build wheel did not run successfully.
│ exit code: 1
╰─> See above for output.

note: This error originates from a subprocess, and is likely not a problem with pip.
The command '/bin/sh -c pip3.7 install cython_bbox' returned a non-zero code: 1
```

# 解決方法
色々なブログでpipのupgradeが必要と書かれていたが、setuptoolsとwheelもupgradeが必要だった。
もちろん環境によっては別の原因もあると思います。

```bath
$ pip3.7 install --upgrade pip setuptools wheel
$ pip3.7 install --upgrade cython
$ pip3.7 install cython_bbox
```
Moveit setup assittantが起動しないときの解決法

# はじめに
このアカウントでは研究において発生したエラーや問題の解決法を備忘録的に記載していく。
大学院でロボット工学や画像認識AIを研究しており，主にLinuxやROS，MATLABについてのエラーを記録していこうと思う．この記事が同じようなエラーを抱える研究者のためになれば幸いである．

# 使用している環境
|  |  |
|:-:|:-:|
| デバイス  | MSI |
| プロセッサ  |  intel(R) Core i7-9750H CPU @ 2.60GHz × 12  |
| 実装RAM  | 32GB  |
| グラフィックカード  | NVIDIA Corporation TU106M [GeForce RTX 2060 Mobile]   |
| OS  |  Ubuntu 20.04.6 LTS 64ビット |
| ROS  | Noetic  |

# 今回直面したエラー
moveit-setup-assistantを以下のコマンドを用いて起動しようとした.
~~~
roslaunch moveit_setup_assistant setup_assistant.launch
~~~
しかしながら，以下のエラーが出て起動せずに処理が終わってしまった．
~~~
/opt/ros/noetic/lib/moveit_setup_assistant/moveit_setup_assistant: 
error while loading shared libraries: libsrdfdom.so.0.6.4: cannot open shared object file: No such file or directory
REQUIRED process [moveit_setup_assistant-2] has died!
process has died [pid 15820, exit code 127, cmd /opt/ros/noetic/lib/moveit_setup_assistant/moveit_setup_assistant __name:=moveit_setup_assistant __log:=/home/crimono/.ros/log/0d1dacec-30cd-11ec-b94d-e82a44ef4c23/moveit_setup_assistant-2.log].
log file: /home/crimono/.ros/log/0d1dacec-30cd-11ec-b94d-e82a44ef4c23/moveit_setup_assistant-2*.log
Initiating shutdown!

[moveit_setup_assistant-2] killing on exit
[rosout-1] killing on exit
[master] killing on exit
shutting down processing monitor...
... shutting down processing monitor complete
done
~~~

# 考えられる原因
エラー文を見るに"libsrdfdom.so.0.6.4"というファイルorディレクトリが見つからないのが原因だと考えられる．

# 解決方法
"libsrdfdom.so.0.6.4"というファイルはROSパッケージ<font color="red">**"libsrdfdom"**</font>の一部であることがわかった．
このパッケージがインストールされていないのではないかと考え，インストールしてみたところ，moveit-setup-assistantが起動するようになり解決に至った．

インストールするためのコマンド
~~~
sudo apt install ros-noetic-srdfdom
~~~

#### ※追記
数は少ないが同様にエラーが出た人のエラー文を見ると見つからないファイルorディレクトリはマシンによって違うことがわかった．この記事では"libsrdfdom.so.0.6.4"についての解決を述べているが，エラー文で出た必要なパッケージによって柔軟に対応してほしい．
ちなみに，そもそも"libsrdfdom.so.0.6.4"とはなにか，どんなものかをChatGPTに聞いて解決に至った．
"libsrdfdom.so.0.6.4"とGoogleで検索をかけても何も出てこなかったため，「何か危なそうだから」と毛嫌いせずにChatGPTに聞いてみることを推奨する．
cups, ppd

cups(common unix printing system)
include scheduler
http://localhost:631

post printer description(ppd)
印刷用紙やフォント種類などの定義かかれている
```/usr/share/cups/model/pxlcolor.ppd
*FormatVersion: "4.3"
*FileVersion:   "1.1"
*LanguageVersion: English 
*LanguageEncoding: ISOLatin1
*PCFileName:    "PXLCOLOR.PPD"
*Manufacturer:  "HP"
*Product:       "(GPL Ghostscript)"
*cupsVersion:   1.1
*cupsManualCopies: False
*cupsFilter:    "application/vnd.cups-postscript 100 gstopxl"
*cupsFilter:    "application/vnd.cups-pdf 0 gstopxl"
*ModelName:     "HP Color LaserJet Series PCL 6"
*ShortNickName: "HP Color LaserJet Series PCL 6"
*NickName:      "HP Color LaserJet Series PCL 6 CUPS"
*PSVersion:     "(3010.000) 86000"
*LanguageLevel: "3"
*ColorDevice:   True
```
unity humaroid runtime retarget

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RetargetHPH : MonoBehaviour
{
    public GameObject src;

    HumanPoseHandler m_srcPoseHandler;
    HumanPoseHandler m_destPoseHandler;

    void Start()
    {
        m_srcPoseHandler = new HumanPoseHandler(src.GetComponent<Animator>().avatar, src.transform);
        m_destPoseHandler = new HumanPoseHandler(GetComponent<Animator>().avatar, transform);
    }

    void LateUpdate()
    {
        HumanPose m_humanPose = new HumanPose();

        m_srcPoseHandler.GetHumanPose(ref m_humanPose);
        m_destPoseHandler.SetHumanPose(ref m_humanPose);
    }
}
```
Linuxにおけるディジタル回路設計の環境構築

# 目次
- はじめに
    - 注意
    - OS環境
    - 目的
- 環境構築
     - Step.0 Homebrewの導入
     - Step.1 Icarus Verilogのインストール
     - Step.2 GtkWaveのインストール
- おわりに

# はじめに
## 注意
私は初学者であり、一部の用語を誤って記述している可能性があります。また、動作未確認の補足情報がいくつかございますが、ご了承ください。

## OS環境
検証環境はLinux Mint 20.3 cinnamonです。また補足としてMacの方法も少し記載しているので、ご確認ください。

## 目的
Linux Mintでデジタル回路の実験環境を構築することです。本記事では次の2つをゴールとしています。

- Verilog-HDLのインストール
- GtkWaveのインストール

Verilog-HDL(Hardware Description Language)はハードウェア記述言語です。これにより、デジタル回路の設計と検証が可能です。今回はIcarus Verilogのインストール方法を示します。GtkWaveはVerilog-HDLによって設計された回路を検証するために利用します。これにより、入力結果と出力結果の波形と信号値を確認できます。下記に公式のホームページを示します。

- [Icarus Verilog](http://bleyer.org/icarus/) (※Windowsの情報となります)
- [GtkWave](https://gtkwave.sourceforge.net/)

# 環境構築
## Step.0 Homebrewの導入
Homebrewとは、Mac OSや Linux、WSLにインストールできるソフトウェアの管理を行うパッケージマネージャーです。Linux版は以前までLinuxbrewと呼ばれていたみたいです。今回はこれを用いてVerilog-HDLのインストールを行います。Homebrewを利用することで、パッケージのインストールとアップデート、アンインストールが非常に容易にできます。

以下の記事の[環境構築 > Step.0 Homebrewの導入]にてまとめておりますので、インストールされていない方は下記リンクよりご確認ください。

[LinuxにおけるHomebrewの導入方法](https://qiita.com/banana_bancho/items/9de8421b245ccddd847a#step0-homebrewの導入)

## Step.1 Icarus Verilogのインストール
以下にIcarus Verilogのインストールを行うコマンドを示します。Homebrewのおかげで非常に簡単に行えます。ここでbrewコマンドが使用できない場合は再起動を試みてください。Homebrewを利用しているため、Macでも同様のコマンドでインストールが可能かと思います(未確認)。
```
# Icarus Verilogのインストール
brew install icarus-verilog
```

次のコマンドで無事に導入ができたかを確認できます。
```
# インストールの確認
brew list
```

### 補足: 他のインストール方法
Homebrewの動作がうまくいかない場合は、下記のGithubからコードを入手して展開する方法もあります。その後、シェルスクリプトautoconf.shを実行していただけると環境構築ができるかと思われます(未確認)。

[iverilog (Github)](https://github.com/steveicarus/iverilog)

## Step.2 GtkWaveのインストール
残念ながら、GtkWaveのインストールではHomebrewを利用できません(恐らくHomebrewの仕様上、Macに最適化されており、一部のパッケージはLinuxに非対応になっていると推測されます)。素直にOS標準のインストールコマンドを利用します。下記にLinux Mintでの例を示します。
```
sudo apt-get install gtkwave
```

コマンドの実行後、アプリケーションメニューの[アクセサリー]項目から「GTKWave」を確認できれば、インストール成功です。

### 補足1: 他のインストール方法
冒頭に示した[GtkWaveの公式サイト](https://gtkwave.sourceforge.net/)からもインストールが可能かと思われますのでお試しください。

### 補足2: Macの場合
[Homebrewの公式サイト](https://formulae.brew.sh/cask/gtkwave)より、Macの場合はHomebrewを用いて以下のコマンドで入手できるかと思われます(未確認)。
```
brew install --cask gtkwave
``````

# おわりに
ご閲覧いただきありがとうございました。学校にあるパソコン上で回路設計の実験をしており、その作業を自身のパソコンでも行いたいと思い、この環境構築を試みることになりました。もし、不備や気になることがあればコメントにてご連絡ください。
【Swift】MapKitを使用して場所のサジェストを受け取る

# はじめに
MKLocalSearchCompleterを使用して場所の検索をローカルで行うことができるっぽいので試してみました。

# サンプルアプリ
![Simulator Screen Recording - iPhone 14 - 2023-07-13 at 19.43.24.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/6e7e65bb-da54-f161-e1df-afa058c65a68.gif)

# 実装
```swift
import SwiftUI

struct ContentView: View {
    @StateObject private var viewState = ViewState()
    var body: some View {
        NavigationStack {
            List(viewState.localSearchCompletions, id: \.self) { localSearchCompletion in
                Text(localSearchCompletion.title)
            }
            .searchable(text: $viewState.searchText)
        }
    }
}
```

```swift
import MapKit
import Combine

public final class ViewState: NSObject, ObservableObject {
    @Published var searchText = ""
    
    @Published var localSearchCompletions: [MKLocalSearchCompletion] = []
    
    private let localSearchCompleter = MKLocalSearchCompleter()
    
    private var cancellable = Set<AnyCancellable>()
    
    public override init() {
        super.init()
        localSearchCompleter.delegate = self
        $searchText.sink {
            self.localSearchCompleter.queryFragment = $0
        }
        .store(in: &cancellable)
    }
}

extension ViewState: MKLocalSearchCompleterDelegate {
    public func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
        self.localSearchCompletions = completer.results
    }
}
```

# おわり
通信しなくていいのはめっちゃいいですね！
GitHubでリポジトリが他の人に見られずに草を生やす方法

### こんにちは！！　atomuです！
この記事では、GitHubの草は残しておきたいけど、いらないリポジトリがいっぱい。。。でも、リポジトリを消したら、草も消えちゃう。どうしよう。。と思った過去の自分へ書いた記事です！
### 結論: **いらないリポジトリをプライベート設定にする**
調べたらリポジトリを統合したら良いと言っている方が多かったのですが、私の場合は統合しても草が消えてしまいました。
先生に相談すると、リポジトリをプライベート設定にしたらいいんじゃない？とアドバイスをいただきました！！
これで一件落着と思えたのですが、プライベート設定にすると草が生えない事件が起こりました。
どうしようと思って、少し放置して次の週に見てみると**草が元に戻っていました！**
原因は分かりません！
何か分かる方がいたらコメントにて教えてください！
ありがとうございました！
【Swift】符号を取得する方法

# はじめに
この記事では、Swiftで符号を取得する方法を紹介します。

# Int型の場合
`signum()`メソッドで符号を取得できます。

正の場合は1、負の場合は-1、それ以外の場合は0を返します。

```swift
let number = -10
let sign = number.signum()
print(sign) // -1
```

# Double型の場合
`sign`プロパティで符号を取得できます。

正の場合は`FloatingPointSign.plus`、負の場合は`FloatingPointSign.minus`を返します。`FloatingPointSign`型は、浮動小数点数の符号を表す列挙型です。

```swift
let doubleNumber: Double = -10.0
let doubleSign = doubleNumber.sign
print(doubleSign) // minus
print(type(of: doubleSign)) // FloatingPointSign

// type(of:)関数は、引数の型を返します。
```

# Float型の場合
Double型と同様に、`sign`プロパティで符号を取得できます。

```swift
let floatNumber: Float = -10.0
let floatSign = floatNumber.sign
print(floatSign) // minus
```

# CGFloat型の場合
こちらも`sign`プロパティで符号を取得できます。

```swift
import CoreGraphics

let cgFloatNumber: CGFloat = -10.0
let cgFloatSign = cgFloatNumber.sign
print(cgFloatSign) // minus
```

# おわりに
Swiftには便利な機能がたくさんありますね。この記事が参考になったという方は、いいねとフォローしていただけると嬉しいです☺️

# 参考
https://developer.apple.com/documentation/swift/int/signum()

https://developer.apple.com/documentation/swift/double/sign

https://developer.apple.com/documentation/swift/floatingpointsign
MotionBoardで良く使うボタンアクション

# はじめに
MotionBoardでは、ボード上に集計表やグラフなどのチャートの他に、指定した動作・アクションを実行させるためのボタンを配置できます。
この記事では、個人的によく使用しているボタンアクションを３つ紹介します。
今回はアクションの動きがわかりやすいようにGIF動画にしました。設定方法などの詳細についてはマニュアルを参照していただければと思います。

:::note info
補足
本記事の内容・キャプチャ等はMotionBoard Ver.6.3のものです。
設定方法など詳細は[MotionBoard Ver.6.3公式マニュアル](https://cs.wingarc.com/manual/mb/6.4/ja/UUID-84507b5f-fa64-452d-8fab-b65e1f54081c.html)を参照してください。
:::

## ボタンアクション①アイテム最大化
ボタンクリックすると指定したアイテムの画面表示を最大化させることができます。
閉じるボタンを付けることも可能です。
![ボタンアクション_アイテムの最大化.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/1b0a06e6-9c87-3758-3092-5efa94250dc4.gif)

設定例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/dec24e6d-8b73-221f-cffb-1ad5e7535bbf.png)
[MotionBoard Ver.6.3公式マニュアル-ボタンアイテムを作成する（アイテムの最大化）](https://cs.wingarc.com/manual/mb/6.4/ja/UUID-b329a4c7-bec2-422b-ce9e-6104b0e94422.html#UUID-f0ec1591-8532-ea33-03fb-2bf88e0348b0)

## ボタンアクション②アイテムの表示/非表示
ボタンクリックすると指定したアイテムを表示したり、非表示にしたりできます。
表示ボタンと閉じるボタンのセットで作成することが多いです。
![ボタンアクション_アイテムの表示非表示.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/be03dcca-3d4d-066a-9a88-70d550464491.gif)

設定例：
＜表示ボタン＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/8dd015b1-44af-5d3d-eb12-c705e13e9c45.png)

＜閉じるボタン＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/e9608203-974b-5552-9931-1ed39d61fe22.png)

[MotionBoard Ver.6.3公式マニュアル-ボタンアイテムを作成する（アイテムの表示/非表示）](https://cs.wingarc.com/manual/mb/6.4/ja/UUID-0552d8d0-0ff7-0078-1cbd-f8f92facadf6.html#UUID-89753a17-7e04-5815-30d7-5b6991f5f354)

## ボタンアクション③明細アクション：切り替え
ボタンクリックすると指定した明細アイテムの表示形式を切り替えできます。
切り替えで選択可能な形式は、一覧形式・詳細形式・カード形式の3種類です。
![ボタンアクション_明細アクション_切り替え.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/33f027b6-52bf-3c19-f747-8252acba449f.gif)

設定例：
※この例ではボタンはトグルにして、1回目のクリック（選択時アクション）で詳細形式に切り替え、2回目のクリック（非選択時）で一覧形式に戻るように設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/d133f87e-9b01-7d1d-d614-3b7ab147658e.png)

＜選択時＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/3719873d-e8ba-3a83-11a6-8f62e37c45e2.png)

＜非選択時＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/d333a1ae-d890-5b51-6ad6-1068148fdbe6.png)

その他、明細のデータソースをデータ入力できるように設定しておけば、レコードの追加・削除・更新などもできます。
詳細はマニュアルを参照してください。
[MotionBoard Ver.6.3公式マニュアル-ボタンアイテムを作成する（明細表の操作）](https://cs.wingarc.com/manual/mb/6.4/ja/UUID-87c427eb-1938-6a29-47a5-f247ff13903b.html#UUID-ffcc13c1-8037-5f62-2b23-b4038deeb4d3)

## まとめ

今回は私が良く使用するボタンアクションから３つご紹介しました。
また、お勧めしたい便利なアクションを見つけたらご紹介させていただきます。
OpenAI関連のAPIについてまとめてみた

# 最初に
OpenAIが公開しているAPIとMicrosoft Azureが提供するOpenAIのサービスについて、いくつかの資料を基にまとめてみました。
全体的な概要を把握したい方や、OpenAI APIとAzure OpenAI Serviceの違いを理解したい方向けの資料となっています。詳細情報を探している方は、参考資料をご覧いただければ幸いです。

あくまで私個人の調査に基づく情報ですので、間違いや不足があればコメントいただければ修正いたします!

# OpenAI-APIとAzure-OpenAI-Serviceの比較
## 概要
### OpenAI-API
OpenAI社が直接提供しているAPI
### Azure-OpenAI-Service
Microsoft Azureが提供するOpenAIのサービス。Azureのクラウドインフラストラクチャを通じてOpenAIの技術を利用することができる。Azureの管理画面からサービスを設定し、AzureのAPIキーを使用してサービスを利用。

## 利用できるAPI
### OpenAI-API
- GPT-4.0（waitlist、8月から一般公開予定）
    - GPT-3.5 を改善し、自然言語またはコードを理解して生成できる一連のモデル
- GPT-3.5
    - 自然言語とコードを理解および生成する最新モデル。
- DALL-E
    - 自然言語から画像を生成・編集するモデル
- Whisper
    - 音声をテキストに変換するモデル
- Embeddings
    - 埋め込み (ベクトル表現) を生成するモデル
- Codex
    - コードを理解および生成するモデル
- Moderation
    - センシティブおよび 安全でない文章を検出するモデル
- GPT-3
    - 自然言語を理解および生成する旧モデル
### Azure-OpenAI-Service
- GPT-4.0
- GPT-3.5
- GPT-3.0
- Embeddings
- Codex
- DALL-E

WhisperとModerationが利用できない。

## レスポンス速度
### OpenAI-API
不安定になることがある。（日本時間夜）
### Azure-OpenAI-Service
恒常的に安定している。

## セキュリティー
### OpenAI-API
インターネット経由でのアクセスになるので、APIKey流出時のリスクが大きい。
### Azure-OpenAI-Service
Azureが用意している仮想ネットワークにより、インターネットを経由しなくても良い。
（APIKeyが万が一流出しても、VPC内に入れらなければ問題ない。）
※AWSで例えると、VPC内にAPIのエンドポイントを設定するイメージ

## 入力データの学習について
どちらも学習には使用されない。

## 料金
どちらも同じ。（現時点）
※Azure独自のサービスを組み込む場合、別途使用料金が必要。

## 利用方法およびリリース関連
### OpenAI-API
本家になるので、新規機能やプラグインなどのリリースは早い。
また、OpenAI-APIのAPIKeyを発行するだけで使用できるなど、利用ハードルは低め。

### Azure-OpenAI-Service
Azure-OpenAI-Serviceへ利用申請が必要で許可制になっている。


# まとめ
レスポンス速度やセキュリティ面ではAzure-OpenAI-Service、利用までの手軽さではOpenAI-APIが優っています。
プロダクト開発にはAzure-OpenAI-Serviceを、プロト作成ではOpenAI-APIを利用すると良いのではないでしょうか？？

# 参考記事
https://qiita.com/lazy-kz/items/32e8e7c86bdce67beb48

https://zenn.dev/microsoft/articles/e0419765f7079a

https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/overview

https://platform.openai.com/docs/models/model-endpoint-compatibility
【ChatGPT】Webブラウジング が使えない・表示されない

## Webブラウジング機能が使えない

2023/7/13 現在、以前利用できていたChatGPTのWebブラウジング機能がなくなっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/e5556ba1-8947-6bad-5dae-9c9c0a561b44.png)


## 原因

原因は、不具合や、ユーザー側の問題ではなく、ChatGPTのサービス側が、一時的にWebブラウジング機能の提供を停止しているためです。

OpenAI社の公式Twitterでも、報告されていました。

https://twitter.com/OpenAI?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1676072388436594688%7Ctwgr%5E52b7689c97bc7557fa69fed16ec1d4153863f68e%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fdid2memo.net%2F2023%2F07%2F05%2Fchatgpt-web-browsing%2F

ChatGPTのWebブラウジングは再提供開始まで待つしかないようです。
Reactで使えるCSSフレームワークの紹介



## はじめに

ReactはコンポーネントベースのJavaScriptライブラリで、CSSフレームワークと組み合わせることで、見た目の美しいウェブサイトやアプリケーションを効率的に作ることができます。ここでは、Reactでよく使われるCSSフレームワークをいくつか紹介します。

## 1. Bootstrap

[Bootstrap](https://getbootstrap.com/)はもっとも有名なCSSフレームワークの一つで、使いやすさと汎用性から広く使用されています。レスポンシブなグリッドシステム、プレデザインされたコンポーネント、JavaScriptプラグインなどを備えています。

Reactと一緒に使用するためのライブラリとして[React-Bootstrap](https://react-bootstrap.github.io/)があり、これを使用することでBootstrapの全ての機能をReactコンポーネントとして利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/f38ad797-7285-6bf0-1d7c-7f864b979972.png)


## 2. Material-UI

[Material-UI](https://material-ui.com/)はGoogleのMaterial Designを採用したReactのためのUIフレームワークです。Reactコンポーネントの形で提供されており、その中にはボタン、カード、ダイアログなどが含まれます。

スタイリングやテーマのカスタマイズが容易で、統一感のあるモダンなUIを実装することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/23b834da-95d6-d733-1b94-c60abb3f1bd8.png)


## 3. Semantic UI React

[Semantic UI React](https://react.semantic-ui.com/)は、人間とフレンドリーな設計原則に基づいて作られたUIフレームワークです。使いやすさを重視し、自然言語の原則に基づいたクラス名が特徴です。

Reactでの利用を前提として設計されているため、Reactの全ての機能を最大限に活用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/5555b4e5-6bfa-228b-ea5d-48aace272b9a.png)


## まとめ

Reactで使用できるCSSフレームワークとして、Bootstrap、Material-UI、Semantic UI Reactを紹介しました。
それぞれに特色と利点があり、プロジェクトの要件により適切なものを選択すると良いでしょう。美しいUIを効率的に作るために、これらのフレームワークを活用してみてください。
Apple Vision Pro: なぜそんなに高価なのか?

初めに
　最近、アップルは優れたハードウェアとテクノロジーを備えた「Apple Vision Pro」という仮想現実ヘッドセットを発売しました。 ただし、ユーザーをびっくりさせた点の1つはアップル新製品の価格であります。
![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92345/3b106f0d-9247-33b5-9730-94f97bd4d02d.jpeg)

1. Apple Vision Proの価格
　では、Apple Vision Proの価格はどの程度まで高いでしょうか?
＋今、Apple Vision Proは米国市場でのみ販売されています。
＋1つの Apple Vision Proが1つの Meta Quest 3と1 PS5の価格合計に平等します。
　その価格は決して一般向けではありません。以下の記事は「なぜアップルは仮想現実ヘッドセットの価格を3,599ドルに設定したのでしょうか」という質問を答えるためにその理由を相談しています。

2. 高いけど高くないの三つの理由
 2.1. ハイエンドコンポーネント
![122.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92345/cd963502-97c7-5585-6f68-c97904b7f819.jpeg)

　Appleによれば、Vision Proは「航空宇宙用途向けのアルミニウム合金」で作られていると言われます。 レンズは独自に開発したVisionOSという世界初となる空間オペレーティングシステムを備えており、単にiPadやスマホの画面を反映するだけではないの世界で唯一ガラスであります。 それに対して、市場に出回っている VR ヘッドセットの多数は主にプラスチックでできています。
　ヘッドバンドは頭を快適に包み込み、通気性に優れた3Dニット生地です。 静かな冷却システムを搭載しています。
　さらに、Vision Proには12つのカメラ、5つのセンサー、6つのマイクロフォンが搭載されています。アップル が完璧を追求する会社であることが存じますが、まだその程度が多すぎています。 そのため、価格は競合他社よりもはるかに高価になります。

2.2.  Vision Proは独自の「空間コンピューター」です
　Vision ProはiPhone・iPad、またはMacbookと同じオペレーティングシステムを使いません。2,300万ものピクセルを詰め込んだ解像度の 2つのディスプレイは独自に設計されたデュアルチップ（M2チップとR1チップ）を備えたカスタムのAppleシリコンを搭載しています。新型の空間チップの「R1」はセンサーからの情報を超低遅延処理が実現できて、リアルで没入感のあるAR体験を提供します。

　伝えられる所によると、Mac M2のある13インチモデルはMacBook Airで、価格は 1,099ドルからです。Vision Proには2つのチップが内蔵されていて、販売価格は 2,000ドルを下回ることはありません。

2.3.アップルはApple Vision Proの開発に全力をかけました
　Apple Vision Proは、使用者の手・声・アイサイトの動き（ジェスチャー）を認識できるジェスチャーコントロール技術を搭載したアップルの第一世代製品であり、価格は当然安くありません。 今回開発した新技術に非常に自信があって、アップルは5,000件以上の特許を申請しました。 もちろん、Vision Pro の販売価格はこれらの研究開発費により上昇します。

まとめ
　価格から言うと、Apple Vision Proは決して高すぎて、他のヘッドセットの価格なんて比べ物にならない。 ただし、どんな設備でもできなかったことを実現できました。価格に関しては物議を醸しましたが、アップルの完璧に洗練された製品だと否定できません。この準備からわかるように、アップルはApple Vision Proの発表を利用して新しい技術革命を開始するための長期的かつ持続可能なシナリオを事前に作成したと言えます。

続けて読む：
https://miichisoft.com/apple-vision-pro-the-good-and-the-bad-of-the-revolutionary-vr-and-ar-headset/

Website: https://miichisoft.com/
【これが読めたら、変態です。】

# 【これが読めたら、変態です。】

このQiitaはIT関係の人が多いので、IT用語を読める人多いけど、一般目線の話を書きます。


■変態の代表格
「k8s」

答えは、"kubernetes" です。kとsの間の８文字を省略したそうです。

答えを見ても読めないですよね。そんな、あなたは正常です。
”クバネティス”とか”クーバネイテス”とか読みます。
意味は、知ってもつまらないですが、一応簡単に説明しておきます。
Googleで開発された、コンピュータシステムの内のコンテナというシステムを管理する仕組みの一つです。
つまらないですよね。画期的なシステムなんですが、つまらないので、知りたかったら自分で調べてね。


■突然ですが、「ヌメロニム」
k8sって、いい加減な表記に見えますよね。
見たことないけど、
"Localization（地域化）"を"L10n"
"Internationalisation（国際化）"を"i18n"
と書くこともあるそうです。何文字省略したかを数字で書くそうです。
こういう略し方は、ＩＴの世界特有ではなく、「ヌメロニム」という英語の記法だそうです。
「ヌメロニム」は、日本語で「数略語」というそうです。
"きしだふみお"は、”き４お、または、”KishidaFumio"でk10oですね。
この「ヌメロニム」という略し方、パスワードとか、ネットネームに使えるかも。

ちなみに、「ヌメロニム」でなく、発音ベースの省略で有名なのは、
"for" = "4"
"to" = "2"
"you" = "U"
"are" = "R"
これは、時々見ますね。
これも呼び方があるのでしょうか。


■次は読みにくい代表です。
「Git , gif , TeX , ALT」

順に”ギット”、”ジフ” 、”テフ”、”オルト”
です。特にテフは、読み方からは、綴り間違いみたいだけど、TeXで合ってます。
意味は、興味があったら調べてください。


■ついでに、良く間違える言い方も紹介しておきます。

× ”ディスクトップＰＣ”
正しくは”デスクトップ(DeskTop)ＰＣ”。
多分、ハードディスク(Hard Disc＝硬い円盤)のディスクとごっちゃになってる。
ＰＣは、ディスク（円盤）に乗せないで、デスク（机）に乗せましょう。
ハードデスク（硬い机）も違いますよ～！


■最後に、間違えてる人少ないけど、ちょっと読みにくいやつ
(×)内は、時々聞く間違い

「Chrome」＝クローム（× チャローム）
「Adobe」＝アドビ（× アドベ）
「Wi-Fi」＝ワイ ファイ＝Wireless Fidelity
「Linux」＝リナックス、リヌックス、ライナックス←どう読んでも構わないそうです。
「Java」＝ジャバ（× ジャワ）
「JSON ( JavaScript Object Notation )」＝ジェイソン
「Bash ( Bourne-again shell )」＝バッシュ
「Python」＝パイソン（× ピチョン、× フィトン）←語源はイギリスのコメディ番組「空飛ぶモンティーパイソン」
「AJAX ( Asynchronous JavaScript + XML )」＝エイジャックス、またはアジャックス（× アヤックス）
「C#」＝シー シャープ←元になった「Ｃ言語」は、ＢＣＰＬ(Basic Combined Programming Language)から派生した「Ｂ言語」の改良版
「C++」＝シー プラプラ、シー プラ、シー プラスプラス←全部正解。お好きな読み方でよいです。
「輻輳」＝ふくそう。これは、日本語だけど、普通はあまり聞きませんね。

単純にアルファベットをそのまま読むのもたくさんあります。
「API ( Application Programming Interface )」エー ピー アイ
「HDMI ( High-Definition Multimedia Interface )」エイチ ディー エム アイ
「html ( HyperText Markup Language )」エイチ ティー エム エル

そういえば、ＩＴやってる日本人は、聞き間違い防止のために
Ｄは、Ｂ（ビー）と間違えないように”デー”
Ｔは、Ｅ（イー）と間違えないように”テー”
って読むことが多いです。こういうのも業界用語っていうのかなあ？
上の例だと、HDMIは"エイチ デー エム アイ"。
だけど、htmlは、間違えないからか、"エイチ ティー エム エル"だ。


#  【ＩＴが分からないのは、言葉が難しいから難しいのではない。】

ＩＴ用語は、横文字だらけで、難しくてわからん！
とか言いますが、違うと思い始めた。

化粧品とか、栄養の世界とか、ファッションの世界って、結構ややこしい言葉が出てきますね。
チョッキがベストになったり、ズボンがパンツになったり、なんちゃらスカートとか出てきたり。
栄養とか、体に良い成分とかも、コエンザイムＱ１０とか、ビフィズス菌とか。

やっぱり、ＩＴに興味がないから、言葉が難しいのを分からない理由にしてるだけかも。
ただし、一つ言えるのは、似た言葉が多くて、言葉のサイクルが早いかも。

ＶＲが出たと思うと、ＡＲもＭＲもＸＲもでて、挙句の果てにメタバースも出てくるし。
（Virtual Reality (VR)、Augmented Reality (AR)、Mixed Reality (MR)、Extended Reality (XR)）

「ざーす」は、「ありがとうございまーす」でなく、「XaaS」だったり。

車だと、2輪駆動だと、ＦＲとかＦＦとかＭＲ、ＲＲ、4輪駆動だと、４ＷＤ、ＡＷＤ、４ＭＡＴＩＣなどいろいろあるけど、
ある程度で落ち着きますね。

もしかしたら、ＩＴには「バズワード」が多すぎるのかもしれない。
バズワードって、一時的にはやって、無くなっちゃうキーワード。
memo SQLインジェクションとXXS

メモ用　間違っている点がありましたらご指摘ください。

SQLインジェクションとはwebアプリケーションの脆弱性を攻撃する。具体的には、不正なSQL文挿入・実行しデータベースの改ざんや削除を行う攻撃。

XAA（クロスサイトスクリプティング）とはwebサイトなどに、悪意のあるリンクを埋め込み罠のあるwebサイトに誘導し（クロスサイトしている）、そこで個人情報などを入力させ、その情報を盗む。
迷惑メールでたまに来るアマゾンのパスワードを再設定してください的なイメージ？入力したら盗まれるやつ。
MacBook Proのkernel_task暴走をファン掃除で解消

# 要約

- 購入後3年経過したMacBook Pro 16インチ(2019)が頻繁にkernel_task利用率上昇で暴走
- 再起動やリセットでも解消せず、ハードの問題を疑う
- 裏蓋を開けてファンのホコリを掃除したら、解消

## 対象機種

- MacBook Pro (16-inch, 2019) 2.6GHz RAM32GB
- BenQ GW2485TC

## MacBookが熱い

猛暑なのに扇風機のみで仕事をしていたところ、愛機のMacBook Proくんがうなります。
普段からBenQの24インチモニターにつなげており、それもあってか処理が追いついていないのかな？と思いましたが、さすがにこの性能でテキスト入力すらもたつくのは、おかしい、と思いました。

## 困ったら再起動→ダメでした

まずは再起動。しかし、再起動してしばらくは動作が快適になるも、1時間もすると元の木阿弥。

## リセットしてもダメ

[こちら](https://www.e-tamaya.co.jp/html/faq/mac/702.htm)を参考に、NVRAM（PRAM）のリセットとSMCリセットを試みますが、状況変わらず。いよいよ寿命かと思いました。
が、室内でうなりを上げるファンの音を聞いて、「待てよ、もしかして排熱ができていないからでは？」と考えます。

## 裏蓋を開ける

MacbookProの裏ぶたを開けるには、特殊なドライバーが必要です。
ヨドバシ・ドットコムでこちらを購入しました。

[アネックス ANEX　3470-G [特殊精密ドライバー 5溝 1.2]](https://www.yodobashi.com/product-detail/100000001002540638/)

購入時は785円でした。

![IMG_6463.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246419/6bcccb56-e5b2-76e0-68a8-85e93100f00e.jpeg)


裏ぶたのネジは全てで6カ所。そのうち、奥側（Touch Bar側）のネジはちょっと長いので、要注意です。

### 外す時は吸盤があった方が良い（養生テープでも可）

ネジを外しただけでは外れないので要注意です。少しコツがあります。
- 手前側（パームレスト側）に吸盤を貼り付ける
- それで浮かせてドライバーか何かを裏ぶたと本体の間にネジこむ
という流れが必要です。

ところが、手元に吸盤がありません。仕方がなく、養生テープを使いました。

養生テープ単体の粘着力では無理なのですが、
- 養生テープで長め（20cm程度）と短め（10cm程度）の2つを作る
- 手前側（パームレスト）の裏ぶたに、養生テープ短めを先に貼り、それに直行するように長めを貼る
- 長めのテープが剥がれないように、短めのテープをてこのようにして、裏ぶたを浮かせる（長めのテープの粘着力で剥がすイメージ）

というやり方です。

また、これと合わせて、

- 奥側（Touch Bar側）のネジ穴に、精密ドライバーをねじ込んでテコのようにして裏ぶたを浮かせる

このやり方を用いることで、吸盤なしでも裏ぶたを剥がすことができました。

![IMG_6466.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246419/cf032755-b4c8-78a4-7019-53c2d7590b51.jpeg)

……2つファンがあるのですが、どちらもこんな感じでホコリがぎっしり詰まっていました。
家庭用掃除機で吸い取ります。また、ファン以外の箇所は、使い捨てレンズクリーナーを使ってホコリを拭き取りました。

ホコリ除去後の写真がこちらです。

![IMG_6467.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246419/530581c9-c2e4-f1b9-cad7-51023066e6fc.jpeg)

完全ではありませんが、だいぶ綺麗になりました。
裏ぶたを戻す時は、外す時と同じように、奥側（Touch Bar側）からはめていくと綺麗にハマります。

## やはりファンの問題だった

再起動後、非常に快適です。kernel_taskが暴走することも、発熱しすぎることもありません。
つまり、ファンのホコリ詰まりが問題だった、という話です。

何番煎じか分かりませんが、実際にやってみたレポートでした。

## 参考にしたページ

- [MacBook Proの裏蓋を取る方法](https://yellowcorn.jp/thought/2021/01/24/11303/)
- [熱暴走は詰まった埃が原因？MacBook Proを掃除してみる](https://www.cl20.jp/portal/cleanup_mbp/)
- [年に一度はやっておこう！MacBook Proのファンのお掃除をやったらスゴイことになっていた!!](https://burariweb.info/apple/mac/mac-technique/mac-book-pro-fan-cleaning.html)
- [MacBook Pro、ファンがうるさく回る「誰でもできる掃除で解消」注意すべき点](https://yellowcorn.jp/thought/2021/01/24/11311/)
ライトボックスとは


## ライトボックス
:::note
**ウェブサイトやアプリケーションで画像やコンテンツをポップアップ表示するためのユーザーインタフェース要素**
:::

## ライトボックスの実装方法の例

### HTMLのマークアップ
- **ライトボックスの内部に画像、テキスト、動画などのコンテンツを配置する**
+@ ボタンや閉じるアイコンなどのコントロールも追加

### CSSスタイルの適用

- **ライトボックスのサイズ、位置、背景色、フォントなどの外観を設定**
+@ アニメーションやトランジションの追加も可能

### JavaScriptの実装(ライトボックスの動作制御)

- **クリックやボタンのイベントリスナーを追加**
+@ クリックされた画像やボタンの情報を取得→対応するコンテンツを表示

### レスポンシブ対応
- **ライトボックスをモバイルデバイスや異なる画面サイズに適応させる（レスポンシブデザインを考慮）**
+@ メディアクエリやフレキシブルなレイアウトを使用→異なるデバイスで適切に表示されるようにする

### アクセシビリティの確保
- **キーボード操作やスクリーンリーダーのサポート、焦点の管理など、ユーザビリティとアクセシビリティに配慮した実装をする**
【初心者向け】GitHubで簡単に分かりやすくファイル内検索をする方法

# 1. リポジトリページに行く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500157/84f399b2-e817-6e1a-2b17-6ad7b9244a10.png)


# 2. キーボードで`.`を入力する
リポジトリページで`.`を入力するとブラウザ上でVSCodeが開きます。
![kbc18a11_jstbq-pytest-Google-Chrome-2023-07-13-16-28-11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500157/b48b6bda-c611-2874-ebd1-ecf4f7e8c7ad.gif)

# 3 VSCodeの検索メニューでファイル内検索をする
いつも使っているVSCodeのように検索できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500157/d1c72e88-c200-ca4b-0ca9-59f6c1b80571.png)
【Rust】&strとString両方とも渡す方法 (とCowの話し)

## はじめに
Rustでは文字列リテラル(`&str`)と文字列(`String`)は別の型です。

引数の型が`&str`の場合、`String`は`&`を付けて参照を渡す必要があります。
```rs
fn print(s: &str) {
    println!("{}", s);
}

fn main() {
    let s1 = "Hello &str!!";
    let s2 = "Hello String!!".to_string();
    print(s1);
    print(&s2);
}
```

引数の型が`String`の場合、`&str`は`to_string`で`String`に変換する必要があります。
```rs
fn print(s: String) {
    println!("{}", s);
}

fn main() {
    let s1 = "Hello &str!!";
    let s2 = "Hello String!!".to_string();
    print(s1.to_string());
    print(s2);
}
```

この両方を渡す方法は色々ありますが、今回は`Cow`を使用した方法を紹介します。

## 結論

`Into<Cow<'a, str>>`というトレイト境界で両方とも渡せるようになります。

```rs
use std::borrow::Cow;

fn print<'a, T: Into<Cow<'a, str>>>(s: T) {
    println!("{}", s.into());
}

fn main() {
    let s1 = "Hello &str!!";
    let s2 = "Hello String!!".to_string();
    print(s1);
    print(s2);
}
```

## Cowって何？🐄
`Cow`とは**Clone on write**の略で「参照の保持」と「値の所有」のどちらも可能な列挙体です。
以下の様に定義されています。
```rs
pub enum Cow<'a, B>
where
    B: 'a + ToOwned + ?Sized,
{
    Borrowed(&'a B),
    Owned(<B as ToOwned>::Owned),
}
```

`Cow::Borrowed`には文字列リテラルを、`Cow::Owned`には文字列を渡します。

```rs
    let c1: Cow<'_, str> = Cow::Borrowed("Literal");
    let c2: Cow<'_, str> = Cow::Owned("String".to_string());
```

`Cow::from`メソッドから生成もできます。
```rs
    let c1: Cow<'_, str> = Cow::from("Literal"); // Cow::Borrowed
    let c2: Cow<'_, str> = Cow::from("String".to_string()); // Cow::Owned
```

`Cow`を使うことで、型を抽象化して扱うことが可能です。

## 遅延クローン

`Cow`には遅延クローンという便利な機能があります。
参照に対して書き込みをしたタイミングで、データのコピーが行われる機能です。

```rs
use std::borrow::Cow;

fn print_cow<'a>(c: &Cow<'a, str>) {
    match c {
        Cow::Borrowed(s) => {
            println!("Cow::Borrowed {s}");
        }
        Cow::Owned(s) => {
            println!("Cow::Owned {s}");
        }
    }
}

fn main() {
    let s = "Hello, World!!";
    let mut cow = Cow::Borrowed(s);
    print_cow(&cow);
    cow.to_mut().push_str("Push String"); // ここで文字列リテラルがヒープ領域にコピーされる
    print_cow(&cow);
}
```

上記のコードの実行結果は以下の様になります。

```
Cow::Borrowed Hello, World!!
Cow::Owned Hello, World!!Push String
```

文字列リテラルの参照を保持していた変数`cow`ですが、文字列の追加後は値の所有に変わっています。
`to_mut`関数で可変参照を取得して文字列を追加したタイミングで、文字列リテラルがヒープ領域にコピーされその領域に書き込みを行っています。

このように必要な時にデータのコピーが行われるので、あらかじめヒープ領域を確保しておくといったことが不要になります。

## 参考文献

https://doc.rust-lang.org/std/borrow/enum.Cow.html
GitHub CLI (gh)でGitHub Actionsを確認する

Workflowの実行の確認

```
gh run list

STATUS  TITLE                              WORKFLOW              BRANCH  EVENT  ID          ELAPSED  AGE
✓       yousan is learning GitHub Actions  learn-github-actions  main    push   5540043772  47s      2m
✓       yousan is learning GitHub Actions  learn-github-actions  main    push   5540022138  35s      5m
✓       yousan is learning GitHub Actions  learn-github-actions  main    push   5539971675  44s      12m
✓       yousan is learning GitHub Actions  learn-github-actions  main    push   5539964087  16s      13m
✓       yousan is learning GitHub Actions  learn-github-actions  main    push   5539700582  21s      49m
✓       yousan is learning GitHub Actions  learn-github-actions  main    push   5539691671  17s      50m
✓       yousan is learning GitHub Actions  learn-github-actions  main    push   5539257981  30s      1h
✓       yousan is learning GitHub Actions  learn-github-actions  main    push   5539244761  17s      2h
✓       yousan is learning GitHub Actions  learn-github-actions  main    push   5482836218  19s      6d
X       add actions                        learn-github-actions  main    push   5482833747  0s       6d
```

# 最後の実行をブラウザで開く

```bash
open $(gh run list --limit 1 --json url --jq '.[0].url')
```

`gh run list --limit 1 --json url --jq '.[0].url'` でURLを取得して開く。


# 最後の実行のログを取得する

実行IDを確定させる必要がある。

実行IDは下記のようにすると取得できる。

```
gh run list --limit 1 --json 'databaseId' --jq '.[0].databaseId'
```

これを `gh run view` に入れる。

```
gh run view $(gh run list --limit 1 --json 'databaseId' --jq '.[0].databaseId') --log
```

ただし実行中は見れない。
Nuxt2でSSGしたページの一覧をとりたかった

## なぜか
- nuxt2が一部で使われているが他環境も混ざっていて、かつCDNで配信されている環境がある。（レア！）
- nuxtでビルドしたファイルだけキャッシュを消したい

## 解決策
nuxt.config.js に hooks を指定してビルドしたファイルのリストを書き出す

```js
export default {
  hooks: {
    generate: {
      done(generator) {
        const filePath = `${generator.distPath}/buildList.json`;
        fs.writeFileSync(filePath, JSON.stringify(generator.manifest.routes), {
          encoding: 'utf-8',
        });
      },
    },
  },
};

```

https://v2.nuxt.com/ja/docs/internals-glossary/internals-generator#hooks

### 後処理
パスのリストを読み込んで必要な処理を行う。
今回はcloudflontのキャッシュを削除したかったので以下の様なコマンドをCIを回すサーバから叩いています

```sh
paths=$(grep -oE '/[^"]+' dist/buildInfo.json | paste -sd "," -); aws cloudfront create-invalidation --distribution-id "XXXXXXXXXXXXX" --paths "/_nuxt/,$paths"
```
Nexus Switchに、GNSSアンテナをつなげてみた

### はじめに

Nexus９３１８０YC-FX3をみると前方のポートにGPS/GNSS アンテナ コネクタが搭載されています。

そして、NxOS 10.3.2Fのリリースノートを見ると、ソフトウエアでもサポートされたため、早速試してみました。

## GM/GPS/GNSS support on N9K-C93180YC-FX3
PTP Primary Leader (GM) functionality with GPS and GNSS inputs is now supported on Cisco Nexus C93180YC-FX3 platform switches.


## NxOSの設定
```
Config:
gnss-receiver sync 1/2
  frequency synchronization
    selection input
    wait-to-restore 0
  no shutdown
```



## GPSアンテナを接続した後の確認
```
# show gnss-receiver
GNSS-receiver SYNC 01/02
    Status: Available, Up
    Position: 35:40:2398 N  139:44:2633 E  143.873 m
    Time: 1676481104 (UTC offset: 18s)
    Firmware version: 0.0
    Lock Status: Phase Locked, Receiver Mode: 3D-fix
    Survey Progress: 100, Holdover Duration: 0
    Major Alarm: Not used
    Minor Alarm: Not used
    Anti-jam: Enabled, Cable-delay compensation: 0
    1PPS polarity: Positive
    PDOP: 0.000, HDOP: 0.000, VDOP: 0.000, TDOP: 0.001
    Constellation: Auto, Satellite Count: 8
    Satellite Thresholds:
        SNR - 0 dB-Hz, Elevation - 0 degrees, PDOP - 0
    Satellite Info:
        PRN   Channel   Acquisition   Ephemeris   SV            Signal
        No.   No.       Flag          Flag        Type          Strength    Elev
at'n    Azimuth
        ---   -------   -----------   ---------   -----------   --------    ----
----    --------
          2         0   On            On          GPS              0.023      0.
019      0.075
         31         1   On            On          GPS              0.028      0.
071      0.070
         32         2   On            On          GPS              0.027      0.
021      0.173
         18         3   On            On          GPS              0.031      0.
016      0.118
         82         4   On            On          GLONASS          0.027      0.
043      0.095
         81         5   On            On          GLONASS          0.019      0.
023      0.039
         79         6   On            On          GLONASS          0.023      0.
018      0.073
         83         7   On            On          GLONASS          0.022      0.
025      0.147
```

衛星を複数認識していることが確認できました。

クロックをみるとTime sourceがGNSSになっています。

```
# show clock
11:59:22.956 JST Thu Feb 16 2023
Time source is GNSS (Locked to internal source)
```

今回は、ここまで、次はPTPでロックするところを確認できればと思います。
開発における命名の重要性を考えてみた

## はじめに
私たちエンジニアは日々、コードを書き、読み、理解し、修正します。その中で、変数名や関数名、クラス名など、名前をつけることは避けては通れない道です。しかし、この「名前付け」が思わぬ困難を引き起こすことがあります。それはなぜか。それは、名前がコードの可読性や理解度に直結するからです。この記事では、開発における命名の重要性について考えてみたいと思います。

## 名前付けの難しさ
良い名前とは何でしょうか。それは、その名前が何を表しているのか、何をするのかを明確に示すものです。しかし、その名前を見ただけでその役割を理解できるかどうかは、その名前がどれだけ適切に選ばれているかによります。名前が適切でないと、コードを読む人はその名前が何を指しているのか、何をするのかを理解するのに時間がかかります。さらに、名前から想像した挙動と実際の挙動が異なると、思わぬバグを生む可能性もあります。

## 名前付けの重要性
では、なぜ名前付けが重要なのでしょうか。それは、名前付けがコードの可読性とメンテナンス性に直接影響を与えるからです。良い名前は、コードを読む人がその名前が何を指しているのか、何をするのかをすぐに理解できるようにします。これにより、コードの理解が容易になり、バグの発見や修正も容易になります。

また、良い名前は、コードのメンテナンスも容易にします。名前が適切であれば、その名前が何を指しているのか、何をするのかが明確なので、その名前を使っている箇所を修正する際に、何を修正すればいいのかが明確になります。これにより、コードの修正が容易になり、バグの修正や機能の追加も容易になります。

## 良い名前とは
では、良い名前とは何でしょうか。それは、その名前が何を指しているのか、何をするのかを明確に示す名前です。そのため、良い名前をつけるためには、その名前が指すものやその名前がすることを正確に理解することが必要です。

Rubyの作者であるまつもとゆきひろさんは、次のように述べています。

>適切な名前をつけられると言うことは、その機能が正しく理解されて、設計されているということで、逆にふさわしい名前がつけられないということは、その機能が果たすべき役割を設計者自身も十分理解できていないということなのではないでしょうか。個人的には適切な名前をつけることができた機能については、その設計の8割が完成したと考えても言い過ぎでないことが多いように思います。

この言葉からも、良い名前をつけることの重要性が伝わってきます。

## 終わりに
開発における命名の重要性を考えてみました。名前付けは、コードの可読性やメンテナンス性に直接影響を与える重要な要素です。そのため、良い名前をつけることは、良いコードを書くための重要なスキルの一つです。名前付けに悩むことは多いですが、その悩みを通じて、より良い名前を見つけ、より良いコードを書くことができるようになることを願っています。
grepコマンドコピペ元

gitコマンドで使うたびにググっているようなものをまとめておく。

### 基本パターン
``` shell
grep -rHn '検索文字列' 検索ファイル
``` 
* -r ：ディレクトリを再帰的に検索
* -H ：マッチしたファイルの名前を出力
* -n ：マッチした行の行番号を出力
* 検索文字列は '' で囲う
* 検索ファイルはワイルドカード使用可能 (*.txtなど)

### 除外するディレクトリを指定する
``` shell
grep -rHn　'検索文字列' --exclude-dir=ディレクトリ名
```
複数指定もできる
``` shell
grep -rHn　'検索文字列' --exclude-dir={ディレクトリ名1,ディレクトリ名2}
```

### 検索文字列の前後行も表示させる
- 前は `-B 表示行数`
- 後は `-A 表示行数`
- 組み合わせても使える
``` shell
grep -B 3 -A 3 '検索文字列' 検索ファイル
```
OpenAIのChatGPTのAPIをcurlコマンドで利用する

# はじめに
[API Keys](https://platform.openai.com/account/api-keys)でAPIキーを取得しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/1e1be278-f058-c6e5-1d5d-c5ec4f6d0ea6.png)

# キーを環境変数に入れる

```bash
export OPENAI_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

# 呼び出し

## 呼び出す
```
curl https://api.openai.com/v1/chat/completions  \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ${OPENAI_KEY}" \
  -d '{"model": "gpt-3.5-turbo","messages": [{"role": "system", "content": "語尾 ににゃーと付けてください"}, {"role": "user", "content": "どうやってAPIで呼び出しを行ったらいいですか？"}]}'
```

## プロンプト部分を改行する
プロンプトにフォーカスしてコマンドラインからAPIを呼ぶ場合、各行をシングルクォートで括り、バックスラッシュでつなげる。
行頭のスペースは削る。


```bash
curl https://api.openai.com/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer ${OPENAI_KEY}" \
  -d '{"model": "gpt-3.5-turbo",'\
'"messages": [{"role": "system", "content": "語尾ににゃーと付けてください"},'\
'{"role": "user", "content": "どうやってAPIで呼び出しを行ったらいいですか？"}]}'
```

## プロンプトをファイルから読み込む

ターミナルで `cat > prompt.json` を実行してプロンプトの内容を書き出す。終わるときは `Ctrl+d`。

```bash
cat > prompt.md

{"model": "gpt-3.5-turbo","messages": [{"role": "system", "content": "語尾 ににゃーと付けてください"}, {"role": "user", "content": "どうやってAPIで呼び出しを行ったらいいですか？"}]}
```

普通にエディタで書いても良いです。

```json:prompt.json
{
  "model": "gpt-3.5-turbo",
  "messages": [
    { "role": "system", "content": "語尾 ににゃーと付けてください" },
    {
      "role": "user",
      "content": "どうやってAPIで呼び出しを行ったらいいですか？"
    }
  ]
}
```

curlで読み込むときはファイル名にアットマークをつける。

```bash
curl https://api.openai.com/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer ${OPENAI_KEY}" \
  -d @prompt.json
```

## 出力を書き出す

```bash
curl https://api.openai.com/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer ${OPENAI_KEY}" \
  -d '{"model": "gpt-3.5-turbo", "messages": [{ "role": "user", "content": "Have a nice day ;)" }]}'\
> output.json
```

## jqで返答の本文だけを抜き出す

`jq '.choices[0].message.content'` で抜き出す。

```
curl https://api.openai.com/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer ${OPENAI_KEY}" \
  -d '{"model": "gpt-3.5-turbo", "messages": [{ "role": "user", "content": "Have a nice day ;)" }]}'\
> output.json
 | jq '.choices[0].message.content'


"Thank you! You too! Have a great day!"
```

jqの使い方

https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af

## 返答をファイルに書き出しながらjqにも流す
レスポンスが遅かったりするので、返答をファイルにも流す。

`tee output.json` とするとファイルに書き出しを行い、さらに標準出力にも流す。


```
curl -s https://api.openai.com/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer ${OPENAI_KEY}" \
  -d '{"model": "gpt-3.5-turbo", "messages": [{ "role": "user", "content": "Have a nice day ;)" }]}' | tee output.json | jq '.choices[0].message.content'
````

上記でjqを調整する。

```
jq '.choices[0].message.content' < output.json
```
[React]map使い方

# map

**JSX中括弧**内には**for文**が書けません。
なのでmap()を使います。
<br/><br/><br/>

> map使い方

**array**資料型に**map**を貼り付けることができます。
```react
let arr = [1, 2, 3];
arr.map(function(a){
  console.log(a)
});
```
結果は1, 2, 3一つずつ出ます。
arrayの個数だけ回ります。
<br/><br/><br/>

> htmlに適用

ここに繰り返しコードがあります。
```react
function App() {
  let [location, setLocation] = useState(['東京', '大阪', '青森']);


  return (
    <div className="App">
      <div>
        <h4>{location[0]} </h4>
      </div>
      <div>
        <h4>{location[1]} </h4>
      </div>
      <div>
        <h4>{location[2]} </h4>
      </div>
    </div>
  );
}
```
<br/><br/><br/>


まず基本的な枠組みを先に決めてあげます。
```react
      { 
        array.map(function(){
          return ( 内容 )
        }) 
      }
```
<br/><br/><br/>

arrayにあるデータ数が多いほどリピート文が実行されるので、ここには従来使用していたlocationを入れると良いでしょう。
```react
      { 
        location.map(function(a){
          return ( 
                  <div>
                    <h4>{a} </h4>
                  </div>
             )
        }) 
      }
```

aにはarrayの各値が入ります。
命名は皆さんの好きなようにしてもいいです。

もしfunctionにパラメータがもう一つ入るとしたら？
```react
      { 
        location.map(function(a, i){
          return ( )
        }) 
      }
```
ここでiは何でしょうか？
これは0から始まり、arrayの数だけ増加します。
<br/><br/><br/>

最後に私のコードに従っている場合は、コンソール ウィンドウでこのようなメッセージを表示できます。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509555/d14536b0-e21e-0a69-0f2e-84b66e0d316e.png)
これはmapを使うとき書く要素はkeyが必要です。

```react
      { 
        location.map(function(a, i){
          return ( 
                  <div key={i}>
                    <h4>{a} </h4>
                  </div>
             )
        }) 
      }
```

以上です。
Azure Function(Nodejs)からマネージドIDでAzure OpenAIを呼び出す

# はじめに
Azure OpenAIを使うなら、マネージドIDでセキュアに利用したいですよね。キーとか持ちたくないです。関連情報は色々とあるもののNodejsのFunctionからという情報があまり見つからなかったので、こちらに記事として残します。

# マネージドIDをつかうAzure FunctionのNodejsのコード

例外処理も何もいれないで素のChatGPTからの返り値をそのままメッセージとして返してるコードです。ポイントは、`@azure/identity`をつかって、`new DefaultAzureCredential()`をいれてクライアントを作ってるところくらいでしょうか
環境変数としては1.エンドポイントと2.モデル名を持っています。（**キーはありません**)

なお、利用したライブラリは`@azure/openai`です。なんか色々あるんですが、ここにもある通り一番公式っぽいのでそれを使いました。
[クイック スタート: Azure OpenAI Service で ChatGPT と GPT-4 の使用を開始する](https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/chatgpt-quickstart?tabs=command-line&pivots=programming-language-javascript)

マネージドIDについてはこちらに情報があります。
https://learn.microsoft.com/ja-jp/javascript/api/overview/azure/openai-readme?view=azure-node-preview#using-an-azure-active-directory-credential
ここではAzure AD認証として、テナントIDとかの環境変数が～とか書いてますが、マネージドIDでやるのでAADにまつわる環境変数は不要です。

```javascript
module.exports = async function (context, req) {
  
      const { OpenAIClient } = require("@azure/openai");
      const { DefaultAzureCredential } = require("@azure/identity");
      const client = new OpenAIClient(
        process.env.OPENAI_API_ENDPOINT, //ここにエンドポイント
        new DefaultAzureCredential()
      );
  
      const messages = [
        { role: "system", content: "You are an AI assistant." },
        { role: "user", content: "Hello" },
      ];

      const result = await client.getChatCompletions(process.env.OPENAI_ENGINE, messages); //ここにモデル名
      let message;
      for (const choice of result.choices) {
        message = choice.message;
      }
    
      context.res = {
        status: 200,
        body: { message: message },
        headers: {
          "Content-Type": "application/json",
        },
      };
  };
  
```
# Azure FunctionでマネージドIDを有効にする

ポータルからだと、「関数アプリ」の「ID」から状態を「オン」にして保存するだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/0832bc27-279f-ae57-4a68-2c7679475f9f.png)

# Azure OpenAI Servcieでロールを設定する

Azure OpenAI Service の「アクセス制御（IAM）」から「＋追加」します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/95a2d6ef-964a-c437-3e58-58a57b2853a9.png)

割り当てるロールは、[公式](https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/how-to/managed-identity)に書いてある通り「Cognitive Service ユーザ」を選びます。（OpenAI ユーザの方がよさそうですが、公式に書いてあるほうで）

その上で、マネージドIDとして先に割り当てたFunctionを指定します。

以上です。

# まとめ
キーをつかわずにAzure Function(nodejs)からAzure OpenAIサービスが呼び出せます。

```json
{
    "message": {
        "role": "assistant",
        "content": "Hello! I'm an AI assistant, ready to help you with any questions or tasks you may have. How can I assist you today?"
    }
}
```

これだけではありますが、javascriptの場合いくつもoepnaiのライブラリがあってちょっと混乱したので、整理のためにまとめてみました。Azure App Servcie とかでも基本同じ流れですし、pythonや.NETならまた違うライブラリ違う記述方法になりますね。

あとはFunctionにAAD認証をつけたりVNETにいれたり、Azure OpenAIはプライベートエンドポイントを使うなどすればガチガチの環境のできあがりですが、ひとまずマネージドIDを使うとキー漏洩からは安心ということで。
最も単純なデコレータ

#### 最も単純なデコレータ
```py
def decorator(func):
    return lambda *args: func(*args)

@decorator
def some_function(args):
    pass
```
デコレータは関数上の関数、つまり汎関数である。
今定義したデコレータ`decorator`はどんな処理もしない恒等写像である。
VSCodeのCloudFormation Yamlファイルにてyaml.customTagsで指定してるのに Unresolved tag が出るときの対応


# 事象

[こちらの記事様](https://qiita.com/yoskeoka/items/6528571a45cd69f93deb#%E8%A8%AD%E5%AE%9A2
)のように`"yaml.customTags"`を以下のように設定しているのに、

```json:settings.jsonの抜粋
"yaml.customTags": [
..
    "!If",
    "!Not",
    "!Or"
  ],
```

以下のように 指定しているはずの "!If" にて Unresolved tag で怒られてしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91562/3ef110e0-c6a9-c99f-5a3f-cfca295609ac.png)

# 解決

エラーを出している[Yamlプラグインのドキュメント](https://github.com/redhat-developer/vscode-yaml)の`"yaml.customTags"`の記述を読む。

どうやら、カスタムタグは "scalar", "sequence", "mapping" の3つの型に解釈される必要があり、`"!If"`のみの指定だとscalar型になろうとし、CFn表記 `!If [ ]` のような形はエラーになるようだ。

追加で、`"!If sequence"` を足し、sequence型も対応させたらエラーが消えた。

全体設定として以下の感じにしている。

```json:settings.jsonの抜粋
    "yaml.customTags": [
        "!And",
        "!And sequence",
        "!If",
        "!If sequence",
        "!Not",
        "!Not sequence",
        "!Equals",
        "!Equals sequence",
        "!Or",
        "!Or sequence",
        "!FindInMap sequence",
        "!Base64",
        "!Base64 mapping",
        "!Cidr",
        "!Cidr sequence",
        "!Ref",
        "!Sub",
        "!GetAtt",
        "!GetAZs",
        "!ImportValue",
        "!Select",
        "!Select sequence",
        "!Split",
        "!Split sequence",
        "!Join sequence"
    ],
```
Tomcatの起動

Apache + Tomcat8 で、アプリケーション「GroupSession」を動かしていたのですが、Tomcatの再起動が必要となり、# systemctl restart tomcat
を実行したのですが再起動がかからず、
shutdown.sh や startup.sh をやってみたり、サーバーを再起動してみたりと、色々やっているうちに「GroupSession」は動くようになりました。

でも、# systemctl status tomcat を実行すると

tomcat.service - Apache Tomcat 8.0.53
Loaded: loaded (/etc/systemd/system/tomcat.service: enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since 2023-06-30 15:33:43 JST; 1 week 5 days ago
Process: 5020 ExecStop=/usr/local/java/apache-tomcat-8.0.53/bin/shutdown.sh (code=exited, status=1/FAILURE)
Main PID: 805 (code=exited, status=0/SUCCESS)

と表示されます。

Active: failed は、起動していないということでしょうか？

また、# jps を実行すると
5686 Bootstrap
5577 Bootstrap
25066 Jps

と表示されます。Bootstrap が２つあるということは、Tomcatが２つ起動しているのでしょうか？