OmniAICreator/Qiita-1.07M huggingface dataset:
闘魂Elixir ーー AtCoder Beginner Contest 342(B)をElixirで楽しむ

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>

<b><font color="red">$\huge{闘魂とは己に打ち克つこと。}$</font></b>
<b><font color="red">$\huge{そして闘いを通じて己の魂を磨いていく}$</font></b>
<b><font color="red">$\huge{ことだと思います}$</font></b>


# はじめに

[AtCoder Beginner Contest 342](https://atcoder.jp/contests/abc342)を[Elixir](https://elixir-lang.org/)で解いてみます。

[AtCoder](https://atcoder.jp/)を解くのが趣味で、休憩時間に解いているという若い人がいて、それってすごい意識の高い休憩時間の過ごし方だと思って、私も真似してみることにしました。


# [AtCoderをElixirでやってみる](https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01)

入力の読み取り方や解答の作り方は、別の記事にまとめています。


https://zenn.dev/torifukukaiou/articles/ac84c87736ceebf4da01

ご参照くださいませ。

[Elixir](https://elixir-lang.org/)で[AtCoder](https://atcoder.jp/)を楽しむためには、エントリポイントを`Main.main/0`にする必要があります。つまり`Main`モジュールを作って、その中に`main/0`関数を定義するわけです。

# [B - Which is ahead?](https://atcoder.jp/contests/abc342/tasks/abc342_b)

問題はリンク先をご参照くださいませ。
私の解答を貼っておきます。


<details><summary>私の解答</summary>

_問題文を読んでいることを前提にひとこと解説をしておきます。_

リストの中の要素の位置を調べればよいので、[Enum.find_index/2](https://hexdocs.pm/elixir/1.17.0/Enum.html#find_index/2)関数を利用しました。


```elixir
defmodule Main do
  def main do
    _n = IO.read(:line) |> String.trim() |> String.to_integer()
    p_list = IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
    q = IO.read(:line) |> String.trim() |> String.to_integer()
    queries = for _ <- 1..q do
      IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
    end
    
    solve(p_list, queries)
    |> IO.puts()
  end
  
  def solve(p_list, queries) do
    queries
    |> Enum.map(fn [a, b] ->
      a_index = Enum.find_index(p_list, & &1 == a)
      b_index = Enum.find_index(p_list, & &1 == b)
      
      if a_index <= b_index, do: a, else: b
    end)
    |> Enum.join("\n")
  end
end
```




</details>




---

# さいごに

[AtCoder Beginner Contest 342](https://atcoder.jp/contests/abc342)を[Elixir](https://elixir-lang.org/)で解くことを楽しみました。

あなたのお好きなプログラミング言語でお楽しみください。

---


**闘魂**とは、  **「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
**アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。**

---

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>
<b><font color="red">$\huge{１、２、３ ぁっダァー！}$</font></b>
Gazebo ClassicとIgnitionのインストール

# はじめに
今回は，ROS2の環境にGazeboをインストールしていきます．  
Gazeboには，2002年にリリースされたGazebo Classic(写真左)と，2019に導入され，混乱を招いたGazebo Ignition(写真右)の大きく２種類があります．

<img width="250px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3298420/38932a2f-5283-44e4-78a4-3b0feb2a95ed.jpeg">
<img width="250px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3298420/f08446ef-683b-22f5-b596-9b43eb5fdbcb.png">

今後，Ignitionに少しずつ移行されていくと思いますが，まだまだ資料が少なかったり，ネットや書籍，関連するパッケージが対応しきれていないのでGazebo Classicを使いたい場面も多いです(違いは以下の記事を参考にしてください！)．

https://qiita.com/porizou1/items/b97e7a5e282a6a749a7d

今回は簡潔にそれぞれのインストール方法をまとめていきます．

## 実行環境
OS: Ubuntu 22.04
ROS: Humble

# Gazebo Ignition
新しいバージョンのROSではIgnitionのインストールが推奨されています．インストール方法は公式のドキュメントに従えば問題なくできます．

https://gazebosim.org/docs/all/getstarted

試しに，Ubuntu 22.04環境にGazebo Harmonicを入れるとすると，
```
sudo apt-get update
sudo apt-get install lsb-release wget gnupg
sudo wget https://packages.osrfoundation.org/gazebo.gpg -O /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null
sudo apt-get update
sudo apt-get install gz-harmonic
```
上記のコマンドをそれぞれ打ち込み，`gz sim`でシミュレータが動いたら完了です．  
ROSのバージョンとIgnitionの対応関係は以下のようになっています．

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3298420/da6aa0c5-9a9a-fed4-4572-c9bb0b50c90a.png">

# Gazebo Classic
Humbleのような新しいROSの環境にもClassic版を入れたい時があります．導入方法は以下の公式の手順を参考にします．

https://classic.gazebosim.org/tutorials?tut=install_ubuntu

ここで注意なのが，公式ドキュメントにある通り，**Ubuntu 22.04ではamd64アーキテクチャしか対応していません**．そのため，PPAのもので代用します．

https://launchpad.net/%7Eopenrobotics/+archive/ubuntu/gazebo11-non-amd64

MacやJetsonなど，armアーキテクチャを使用している方はGazeboをインストールする前に，
```
sudo add-apt-repository ppa:openrobotics/gazebo11-non-amd64
sudo apt update
```
を打ち込んでおきます．

それでは，Gazebo Classicを入れていきます．手順としては，
```
curl -sSL http://get.gazebosim.org | sh
```
で終わりです．`gazebo`と打ってシュミレータが起動すれば大丈夫です．
`gazebo-ros-pkgs`も必要になることが多いので，この際に入れておきましょう．

https://classic.gazebosim.org/tutorials?tut=ros2_installing&cat=connect_ros#Installgazebo_ros_pkgs

```
sudo apt install ros-<distro>-gazebo-ros-pkgs
```

# まとめ
今回はGazeboの種類別にインストール方法を紹介しました．`apt`で簡単に入れられず，アーキテクチャの違いなどでインストールできないなどで詰まっていた方もいるかもしれません．  
ちなみにGazebo ClassicはGazebo11を持って今後リリースしないことを発表しているので，これからはIgnitionの時代が来るのかもしれません．ただ，`turtlebot`のデモをはじめ，入門書やネットの事例でIgnitionを使用していることが少ないので，まだまだ時間がかかるかもしれませんね🤔
Salesforce標準項目の項目名表示ラベル変更方法

　本橋孝昭です
 
Salesforceで項目名表示ラベル変更方法をお伝えします


## カスタム項目の項目名表示変更方法

カスタム項目であれば項目名の表示ラベル変更方法は
設定＞オブジェクトマネージャー＞オブジェクト＞項目とリレーション＞対象項目
で編集することが可能です

下記は例として商談オブジェクトのカスタム項目の編集画面です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/bcffdee4-d6ab-e1cb-e2af-52459086c2a4.png)


しかしながら、こちらはカスタム項目の編集方法であり、例として商談オブジェクトの標準項目「フェーズ」はこちらで変更することはできません


設定＞オブジェクトマネージャー＞オブジェクト＞項目とリレーション＞フェーズ
で編集することはできないです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f536acd0-99fc-fff4-d63d-5a3bab19721b.png)

では、どのようにして標準項目の項目名の編集をするか

それは「タブと表示ラベルの名称変更です」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/308eb4f4-d58f-2362-92e5-3f985d9ff479.png)

こちらから商談左部の「編集」をクリックします


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/24392b38-ca24-4a57-055b-55062571687f.png)

そして「次へ」をクリックします
（もしもオブジェクト名を変更したい場合こちらで編集してください）

変更したい項目の表示名（今回の場合商談のフェーズ）を変更したい名称に変更して「保存」をクリックしてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/8e9468bc-798d-9044-062f-623df8be9aac.png)



以上で設定は完了です

お疲れさまでした。
Mac Book Air M3がやってくるヤァ!ヤァ!ヤァ! 

# はじめに
手持ちのふるーいMBA(2011)は無理やり最新OSバージョンを入れたら起動しない子になってしまったので、Macが欲しい病にかかってしまいました。。

で、結局Apple謹製の整備品済みMBAを10年以上ぶりに買ってしまったので、レビューをしてみる。

# スペック
・スペック概要
　Mac Book Air 13インチ M3 2024
　4つの高性能コアと4つの高効率コアを搭載した8コアCPU
　8コアGPU、10コアGPU
　ハードウェアアクセラレーテッドレイトレーシング
　16コアNeural Engine
　メモリ：16GB
　SSD：512GB
　（256でも良いかなと思ったけど、性能が制限されるかも？ていう記事見つけて512に）
  
・詳細
　https://support.apple.com/ja-jp/118551

# Apple認定整備済製品
・普通に新品を買ったわけではなく、Apple認定整備済製品を買いました。
　https://www.apple.com/jp/shop/refurbished

# とりあえず最低限の整備
OSを最新版にして、
![スクリーンショット 2024-06-15 21.00.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/fadd6181-47ec-9cb7-37da-5208a785194c.png)

セキュリティーソフト（マカフィー リブセーフ）も入れて、
![スクリーンショット 2024-06-16 20.02.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/d0da0e2a-2b42-610b-7933-26c761d80499.png)


Xcodeも最新版を入れて（15.4の最新版、Simulatorは重い）、
![スクリーンショット 2024-06-16 19.46.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/0a8508ac-0d75-16e5-461e-d3cec0a71d05.png)

Android Studio(JellyFish)を入れる。
が、ここで問題が発生。
どうもGoogleのSDK Update Sitesのアクセス先にアクセスできない模様。
![スクリーンショット 2024-06-16 16.43.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/55d5791d-96c5-c511-655a-c7383ace8c94.png)

色々試して、結局マカフィーのファイアーウォールを無効にしたら成功。。

相性悪いんかな。。
Googleのドメインのみスルーできんのか？とも思ったが使っているマカフィー（リブセーフのやっすいやつ）のせいか設定が全然見当たらん。。
PC再起動したらマカフィー固まるし。。
ここはおいおい見当が必要そう

# ベンチマーク
測ったことないのでやってみたい。
時間がなかったのでここも後w

# 最後に
Mac Book Airはやっぱり良いね！
iPhoneを使っているので、当然iPhoneと親和性が高いので同じアカウントでログインすると普段使っているデータが簡単に使える。

仕事でApple Magic Keyboard Wirelessを使っているが、
キーボードのペチペチ感はMBAが最高峰だと思っている。

あと単純に所有欲を満たしてくれるね！
大切に使います。
Salesforceでサポートに問い合わせないとできないこと一覧

ここではSalesforceのサポートに言えばやってくれる便利機能について解説します


## オブジェクトの参照項目の数
参照項目の数はデフォルトは15ですがすべてのオプションを実施してもなおかつ15個以上に増やしたい場合、20個まで可能

参考ヘルプ

エラー:「[オブジェクト名] の 15 オブジェクトの参照の最大数に達しました。少なくとも 1 個のリレーションを削除する必要があります。」
https://help.salesforce.com/s/articleView?id=000382367&type=1

>すべてのオプションを実施済みの場合、Salesforce サポートはこの制限の拡張を支援することができます。 ただし、拡張可能な最大値はオブジェクトごとに 20 であることに注意してください。 


## 添付ファイルの最大サイズ

添付ファイルのデフォルトでのファイル容量は25MBですが36MBまで上げることが可能です

参考ヘルプ

[メモ＆添付ファイル] 関連リストの添付ファイルサイズ (MB) の上限拡張
https://help.salesforce.com/s/articleView?id=000386090&type=1

>デフォルトの上限は 25 MBです。 サポートにより、最大 65 MB まで上限を拡張することができます。 36 MB を超える添付ファイルは、ユーザインターフェース経由でのみ添付できます。


## 　単一項目選択リスト値の拡張

参考ヘルプ

単一項目選択リスト値の拡張
https://help.salesforce.com/s/articleView?id=000386839&type=1

>デフォルトの単一選択リストの上限値である 1,000 では、組織の要件を満たさないことがあります。Salesforce サポートは、上限を拡張することができます。現時点で、拡張可能な最大値は 2,000 です。
CSSで複数行のリンクテキストを省略表示し、3点リーダーの色を変更する方法

## はじめに
テキストを複数行表示して「...」で省略するようなUIを実装することがありました。

テキストを省略して表示するとき、`overflow: hidden;`、`white-space: nowrap;`、`text-overflow: ellipsis;`を組み合わせて実装していましたが、これは1行のみの場合でしか使用できないようです😱

CSSで実装する方法を調べたので、備忘録として残しておきます。

### 結論
:::note info
**CSSで複数行のリンクテキストを省略表示し、3点リーダーの色を変更する方法**
```css
.truncateUrlText {
  width: 400px;
  overflow: hidden;
  display: -webkit-box;
  text-overflow: ellipsis;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  color: #1a0dab; 
}

a {
  color: #1a0dab;
}
```
:::



## 背景
実務で、以下の要件を満たすようなUIを実装することになリました。

### 要件
- テキストを表示する要素の幅は`400px`
- テキストは最大2行、入りきらない場合は3点リーダー「...」で省略する
- 文字の色は`#1a0dab`
- テキストを各ページへのリンクにする

## 実装
例として、「夏目漱石/坊ちゃん」の冒頭の文章を省略して表示します。
テキストはこちらへのリンクにします。

https://www.aozora.gr.jp/cards/000148/files/752_14964.html

### CSSで複数行のリンクテキストを省略表示する方法
まずは画面にテキストを表示します。
次にReact Routerの`<Link>`を使ってテキストをリンクにしました。
```typescript
import { Link } from "react-router-dom";

export default function App() {
  return (
   <div className="truncateUrlText">
      <Link
        to="https://www.aozora.gr.jp/cards/000148/files/752_14964.html"
        target="_blank"
      >
        親譲おやゆずりの無鉄砲むてっぽうで小供の時から損ばかりしている。小学校に居る時分学校の二階から飛び降りて一週間ほど腰こしを抜ぬかした事がある。なぜそんな無闇むやみをしたと聞く人があるかも知れぬ。別段深い理由でもない。
      </Link>
    </div>
  );
}
```
続いて、テキストを省略して表示するためのCSSを指定します。
```css
.truncateUrlText {
  width: 400px;
  overflow: hidden;
  display: -webkit-box;
  text-overflow: ellipsis;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
}

a {
  color: #1a0dab;
}
```


結果は以下のようになりました。

![スクリーンショット_2024_06_16_19_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537832/b94b53f5-c8c1-79b9-4113-68b072af2c6e.png)

**「よし、できた!!🎉」** と思ったのですが…

よくみると、3点リーダー「...」の文字色だけが指定した`#1a0dab`に変わっていません😱😱😱

### 3点リーダー「...」の文字色を変える方法
3点リーダーの文字色を変更するためには、親要素にも色を指定する必要があるようです。
以下のようにCSSを修正しました。

```diff_css
.truncateUrlText {
  width: 400px;
  overflow: hidden;
  display: -webkit-box;
  text-overflow: ellipsis;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
+ color: #1a0dab; /* 親要素にも色を指定 */
}

a {
  color: #1a0dab;
}
```
これで無事に要件を満たすことができました🎉

https://codesandbox.io/embed/px6qj3?view=preview&module=%2Fsrc%2Fstyles.css

## 終わりに
地味に苦戦したCSSでした。意外と使う機会は多そうなので覚えておきます。

### 参考
https://zenn.dev/bicstone/articles/webkit-line-clamp
謎の監視履歴「/run/user/1000」とは？｜Hinemos入門

皆様こんにちは。

本日はHinemosでサーバ監視を行う上で遭遇する謎の不明イベント「ファイルシステム使用率(/run/user/1000)」の正体ついて簡潔に説明します。

【正体】
run/user/$uidは systemd によって作成される一時的な格納場所であり、あるユーザが実行中のプロセスが使用するファイルを格納するために使用されます。

つまり、勝手に作られ目的が終われば
勝手に消える一時的な格納領域なのです。

この領域が作成されるタイミングは
ユーザが何かしらの目的でサーバに接続し、
設定編集やアップデートを行った際に作成されます。

【Hinemosに不明イベントか出る原因】
Hinemosのファイルシステム使用率において「ALL」を設定している場合、ありとあらゆるファイルシステム、パーティションを監視する為、一時的に作為された/run/user/1000が無くなった後も監視を続けてしまい、結果不明イベントが表示され続けます。

【不明イベントの消し方】
Hinemosを開き、ビューからリポジトリを選択。不明イベントが出ている対象スコープ上で右クリック。
デバイス項目のファイルシステム/ディスク配下にある/run/user/1000を右クリックし
削除を選択すると、以降不明イベントが表示されなくなります。
Q.なぜBIOS設定画面でBluetoothデバイスが使えないのか？

### A.BluetoothデバイスドライバーはOSによって認識されて動作するから
BluetoothデバイスはBluetoothデバイスドライバーによって制御されます。
BluetoothデバイスドライバーはOSによって制御されます。
パソコンは電源投入時、ハードウェア→BIOS→OS→アプリケーションの順番で起動されます。
従って、BIOS起動時にOSが起動していないため、Bluetoothデバイスが使えないということになります。


### 対象読者
暇な人

### ことの発端
Riot「ゲームのクライアントをアップデートしたから更新よろ。　あ、場合によってはBIOSの設定変更もする必要があるからよろｗ」
<br>

![スクリーンショット 2024-06-16 163648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920773/65b2ebb9-4abb-4d1a-4792-4fe640287cb1.png)

Bluetoothキーボード「BIOS画面で使えません。というかOS起動前なのでBluetoothキーボードが使えないのでBIOS画面に入れません。」

有線キーボード「自分、いけます。」

ということでなぜ、BIOS画面でBluetoothデバイスが使えないか気になったので調べてみました。

### BIOSとはハードウェア制御プログラム

電源投入時、ハードウェア→BIOS→OS→アプリケーションの順番で起動されます。
BIOSは以下の機能を提供しています。
・ハードウェア制御
・入出力デバイス制御
・OS読み込み

BIOSには基本的なデバイスドライバが含まれており、これによってキーボードやマウスなどの入力デバイスを認識し、制御することができます。
BIOSはシステムの起動を管理し、ハードウェアの初期化をすることが主な役割のため基本的なデバイスの制御のみを提供しています。


### Bluetoothデバイスは複雑なプロトコルを必要とする
以下はBluetooth SIGが公開しているBluetoothデバイスのプロトコルスタックです。


![スクリーンショット 2024-06-16 184629.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920773/a756c28b-9cd2-fdef-da75-990c48a6908f.png)


複数のプロトコルで構成され、複数のレイヤーで構成されています。

また、以下はMicrosoftが公開しているBluetoothドライバーのプロトコルスタックです。

![bluetooth-architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920773/494a4081-7337-e20a-4f4f-98b19c62fb69.png)

こちらも複数のプロトコルで構成され、複数のレイヤーで構成されています。

ここでは細かいところまでは説明しませんが、まとめるとBluetooth通信には以下のようなプロトコルが必要となります。
・デバイスの発見
・ペアリング
・認証
・暗号化
・接続
・データ転送
・プロファイル管理

こうした高度なプロトコルはOSの機能に依存するほかなく、BIOSでは提供できません。

### まとめ
Bluetoothデバイス（通信）は非常に複雑なプロトコルを必要とし、それはOSの機能に依存している。
電源投入時、BIOS→OSという順番で起動するので、OS依存のBluetoothデバイスはBIOS起動時には使用できない。


#### 参考
https://www.bluetooth.com/wp-content/uploads/2022/05/the-bluetooth-le-primer-v1.2.0.pdf
https://www.bluetooth.com/wp-content/uploads/2022/05/the-bluetooth-le-primer-v1.2.0.pdf

https://ja.wikipedia.org/wiki/Basic_Input/Output_System
https://www.musen-connect.co.jp/blog/course/trial-production/mechanism-of-bluetooth-stack-structure-overview/


#### 余談
有線デバイスは捨てずに持っておこうね
Excel VBA イベントマクロで検索機能を作る

## セルに数式を入れる代わりにイベントマクロで検索機能を作る

セルに直接数式を入れるとうっかり消してしまったりしますが、マクロにしてしまえば壊れません。

コードは対象シートのシートモジュールに書きます。

A2セルを検索値として、WorksheetFunction.Match で検索値と一致するセルの行番号を取得し、検索結果をB2セルからM2セルに転記します。Match の代わりにVLookUpでも同様の結果が得られます。

```vb
If Target.Address = "$A$2" Then
```
A2セルに変更があったときのみマクロが動くよう If Target.Address = で条件を指定

```vb
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

  If Target.Address = "$A$2" Then
  
    Dim rA As Variant
    Dim FindRow As Long, LastRow As Long, i As Long
    Dim ws As Worksheet
    Set ws = Sheets("Sheet1")
    LastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
    
    rA = ws.Range(ws.Cells(5, 1), ws.Cells(LastRow, 1))
            'Match の第2引数 検索範囲 を変数 rA に格納
    On Error Resume Next
    
    FindRow = Application.WorksheetFunction.Match(ws.Range("A2"), rA, 0)
      
    For i = 2 To 13
    
      ws.Cells(2, i) = ws.Cells(FindRow + 4, i)
                       '検索対象のセル範囲が5行目から
                       '始まっているため + 4 で調整
    Next i
  
    If Range("A2") = "" Then 
                        '検索値のA2セルが空白だった場合は
                        '検索結果も空白にする
      Range("B2:M2").ClearContents
    
    End If
    
  End If

End Sub
```

標準モジュールに書いたコードをシートモジュールに貼り付けたので、ワークシート変数 ws でシートを指定していますが、シートモジュールに書くときはシートの指定は不要です。

![イベントマクロ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/6fe36640-7f15-b6b3-3f98-30f5a4719d8d.png)
ArduinoマイコンによるCo2計測デバイスの作成

# はじめに
- **自己紹介**
はじめまして。いまいま(@imaima0gou)と申します。
X(旧twitter)のつながりで、コミュニティ"電子工作エントリー"に参加させていただいております。本業はITでなんかする人です。
<br>

- **記事作成を行うことになった経緯**
上記のコミュニティにて、なんか手を動かそうぜとなりましたので、前々から気になっていた二酸化炭素濃度を計測するデバイスを作ってみることにしました。
同僚とチャットしていて、在宅ワークで頭が冴えない事があるけどなんでかね？とか話していた時「窓閉め切っているとCo2濃度が高くなってよろしくないので濃度計買ったよ！」と聞いたのでネットを物色していたら結局センサのみ買っていました。（同僚はなんでセンサだけなのさ！って言ってましたw）

# やりたいこと
Co2センサによる二酸化炭素濃度測定デバイスの作成

# 結果
できました。
**■動画は下記**
https://x.com/imaima0gou/status/1801325282420527284

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680315/e0ad5092-53c6-491b-c060-bd8ef6d151ee.jpeg" width=50%>

# 準備
- **デバイス**
Amazonだと割高でしたので、センサは<a href="https://electronicwork.shop/">センサは電子工作ステーション</a>さんから購入しました。その他は何となく衝動買いしたストックです。（秋月電子とAmazon怖い）

**[電子工作ステーション]**
・MH-Z19E(二酸化炭素センサー)PIN付
・小型5V昇圧DCDCコンバーター

**[秋月電子]**
ブレッドボード(大)：衝動買いストック
ジャンパーワイヤ：衝動買いストック

**[Amazon]**
Arduino nano互換ボード：衝動買いストック
ブレッドボード（小）：衝動買いストック

- **PCへのセットアップ**
Arduino IDEをPCにセットアップします。
https://www.arduino.cc/en/software
からダウンロードしてインストールしましょう。
# 回路設計
- **実体配線図**
![circuit-jpg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680315/828f901d-5922-d5d6-d887-91f1fd45d065.jpeg)

ブレットボードでざっくり作成しました。

# PG作成
**Arduino IDEのスケッチは下記になります。**
※サンプルコードmh-z19.inoから、LED発行部分を削除しただけになります。
```c
#define pwmPin A0

int prevVal = LOW;
long th, tl, h, l, ppm;

void setup() {
  Serial.begin(9600);
  pinMode(pwmPin, INPUT);
}

void loop() {
  long tt = millis();
  int myVal = digitalRead(pwmPin);

  if (myVal == HIGH) {
    if (myVal != prevVal) {
      h = tt;
      tl = h - l;
      prevVal = myVal;
    }
  }  else {
    if (myVal != prevVal) {
      l = tt;
      th = l - h;
      prevVal = myVal;
      ppm = 5000 * (th - 2) / (th + tl - 4);
      Serial.println("PPM = " + String(ppm));
    }
  }
}
```


# 動作確認
- **シリアル接続により情報表示**
Teratermで表示してみました。ピンぼけですが、値は取れてますね。
![Teraterm.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680315/d4093826-f67f-0856-7a03-dd111c85b1dc.jpeg)

- **Teratermによるロギング**
せっかくなので、このログを時系列で記録してグラフにしてみました。
15時から窓を閉めてみたので、そこからCo2の濃度が上昇していることがわかります。
たまに外れ値が出ますね・・。サンプリングの平均で出すのがよいかもしれません。
![Graph.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680315/2f7161fd-9e33-561c-7a9f-24252e1451fe.jpeg)

# 今回のまとめ
マイコンArduinoで手軽にCo2測定ができることがわかりました。
AmazonなどでもCo2測定器は簡単に入手できますが、表示の仕方を工夫したいとか、IoT的に使用してみたい方は気軽に挑戦できるよい素材ですね。
今後、機能を拡張していきたいと思います。
※言い訳※
本当はUARTでやろうと思ったのですが、なぜか値が読めなかったのでPWMにしました。いつかはそちらも挑戦したいです。

# Next Action
今後やっていきたいことです。
- I2CによるOLED表示
- ワイヤレスデータ送信(IoT化)
- Zabbixでのデータ集積
- バッテリー内蔵でどこでも計測

# 感想いただければ嬉しいです
コメント欄やX<a href="https://twitter.com/imaima0gou">@imaima0gou</a>にコメントあればうれしいです！
Mattermostマークダウン記法：よく使うサンプル

# 見出し
```:Markdown
# 見出し1
## 見出し2
### 見出し3
```

![screenshot_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/20c19543-7b9f-b9c4-af46-15b29d99ba8c.png)


<br><br>

## リスト
```:Markdown
# 番号付き
1. 項目1
2. 項目2
3. 項目3

# 箇条書き
- 項目1
- 項目2
- 項目3
```


1. 項目1
2. 項目2
3. 項目3


- 項目1
- 項目2
- 項目3


<br>


## 水平線
```:Markdown
---
```
---

<br>

## テーブル

```:Markdown
| ヘッダー1 | ヘッダー2 | ヘッダー3 |
|-----------|-----------|-----------|
| 内容1     | 内容2     | 内容3     |
| 内容A     | 内容B     | 内容C     |
```

| ヘッダー1 | ヘッダー2 | ヘッダー3 |
|-----------|-----------|-----------|
| 内容1     | 内容2     | 内容3     |
| 内容A     | 内容B     | 内容C     |

<br>

## 太字

```:Markdown
**太字**
```
**太字**

<br>

## チェックボックス
```:Markdown
- [ ] 未完了のタスク
- [x] 完了したタスク
```
- [ ] 未完了のタスク
- [x] 完了したタスク

<br>

## リンク

```:Markdown
[Google](https://www.google.com)
```
[Google](https://www.google.com)
[備忘録]　読んだネットの記事 (ロボット) 

# 備忘録

ユーシン精機が2パレット仕様の低全高パレタイジングロボットを発表
https://monoist.itmedia.co.jp/mn/articles/2405/09/news168.html

[備忘録]
- 片側のパレット積み付け中にもう片側のパレットを交換
- 上流工程を停止させない連続したパレタイジングが可能
- コンベヤー上に滞留する製品数を最小限に抑えて省スペース化を実現
- パレットコンベヤーやAGV（無人搬送車）などとの組み合わせた完全自動化も可能

リモコン操作でストレッチャーを搬送できる搬送アシストロボットを実用化
https://monoist.itmedia.co.jp/mn/articles/2405/14/news159.html

[備忘録]
- 搬送アシストロボットをストレッチャーに取り付けることが可能
- リモコン操作でストレッチャーを電動搬送
- 手動と電動を切り替えられる電動キャスターを採用

コンプレッサー不要で消費電力削減、真空ポンプ内蔵の協働ロボ向け電動吸着ハンド
https://monoist.itmedia.co.jp/mn/articles/2405/08/news055.html

[備忘録]
- ポンプが真空保持機能で自動停止
- コンプレッサーを使用するエジェクタ方式に比べて消費電力を8割削減することができる
- ポンプはオイルフリー
- 吸略パッドはコンバムの平形真空パッドを使用
- ロボットへの取り付けはねじ込み式ツールフランジを使用
    - コスメックのマニュアルロボットハンドチェンジャーも活用
Swift Package Managerで導入したライブラリーをの削除方法

Swift Package Managerで導入したライブラリーの削除方法です。

Swift Package Managerでライブラリーの導入方法はこちらにあります。

https://qiita.com/yuta317/items/f1d9a8e36370ecf0c314

# 削除方法

`PROJECT → Packge Dependencies → 削除したいライブラリー → -　`のアイコンをクリック

![スクリーンショット 2024-06-16 18.51.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/f6182b2f-5ef1-f626-efe9-a36544b1d7f4.png)

アラートが出ますので、こちらRemoveをクリックすることで削除できます。

![スクリーンショット 2024-06-16 18.53.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/36623b1a-0c50-9ffe-6236-18113b67101a.png)
AWS Transfer Family

# はじめに
この記事はAWS SAA試験勉強のための、AWS Transfer Familyに関する知識のまとめです。

# AWS Transfer Familyとは

AWS Transfer Familyは、Amaozn S3ストレージまたはAmazon EFSファイルシステムとの間でファイル転送できるフルマネージドサービスです。
1/x+1/y=1/144,x>=yを満たす(x,y)の個数とx+yの総和「PASSLABO様の東大模試初見を、初見でChatGPT-3.5先生に聞きました。」(その2/2)x,yは自然数です。

・**やっぱり気になる。** 
　[(その1/2)](https://qiita.com/mrrclb48z/items/a3ed787aa7e03d7c6e81 "")でx,yの自然数の条件がなかったからかも。
　どなたか、いい聞き方をアドバイスいただけると幸いです。

# (再)オリジナル
PASSLABO 様 (0:00〜12:25) **以下は、1:20　Let's go（レッツゴー）** からです。

https://youtu.be/Xegn15FAmEE?t=80

# ChatGPT-3.5先生へ(1回目)繰り返す
・？？？**実行する毎に、結果が異なります。**
　オリジナル様と同じ結果にならなくなりました。謎？
　私の聞き方が悪いかもです。 
```
x,yは自然数です。
1/x+1/y=1/144,x>=y
を満たす(x,y)の個数と
x+yの総和を求めよ
日本語で
```

**結果 いろいろ**
・...これを実際に計算して、条件を満たす...
・他

# ChatGPT-3.5先生へ(2回目)sympyで
```
sympyで
```

```python
from sympy import symbols, Eq, solve

# 変数の定義
x, y = symbols('x y')

# 方程式の設定
equation = Eq(1/x + 1/y, 1/144)

# x >= y の条件を追加
conditions = [x >= y]

# 方程式を解く
solutions = solve((equation, *conditions), (x, y))

# 解の数と解の表示
print("解の数:", len(solutions))
print("解:")
for solution in solutions:
    print(solution)

# x + y の総和を計算
sum_x_y = sum(solution[0] + solution[1] for solution in solutions)
print("x + y の総和:", sum_x_y)
```
???　ValueError: can only solve for one symbol at a time

```
symbolsは、integerでpositiveになりませんか。
```
・結果は同じでした。
```python
from sympy import symbols, Eq, solve

# 正の整数のシンボルとして定義
x = symbols('x', positive=True, integer=True)
y = symbols('y', positive=True, integer=True)

# 方程式の設定
equation = Eq(1/x + 1/y, 1/144)

# x >= y の条件を追加
conditions = [x >= y]

# 方程式を解く
solutions = solve((equation, *conditions), (x, y))

# 解の数と解の表示
print("解の数:", len(solutions))
print("解:")
for solution in solutions:
    print(solution)

# x + y の総和を計算
sum_x_y = sum(solution[0] + solution[1] for solution in solutions)
print("x + y の総和:", sum_x_y)
```

私は、ここまでです。お疲れ様でした。
6/15 tecHub（IT交流会）を大手町で開催！

![0615_image_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670233/d80eaa45-05d4-1e87-41c0-a59917802ede.png)

「元旦に立てた目標は、どうでしょうか？」

2024年も6月になり、半年が経ちます。
今年の目標を振り返るには、ちょうど良いタイミングです。

今月のtecHubは、交流会を開催しました。
tecHubでは、ITエンジニア、デザイナー、ライターなどIT業界に関わる人が、仕事とプライベートの両方を考えてキャリアアップの相談ができる場です。

また、6月は「父の日」があります。
父親への感謝の気持ちを伝える方も多いと思います。
今回は「父の日」について興味深い記事があったので、紹介します。

**目次▼**
<INS>[今月のトピック](#今月のトピック)
[父親へ感謝を伝えている家庭は全体の約4割](#父親へ感謝を伝えている家庭は全体の約4割)
[今年の「父の日」は、父親へ感謝を伝えましょう](#今年の「父の日」は、父親へ感謝を伝えましょう)
[2024年6月のtecHubを開催しました！](#2024年6月のtecHubを開催しました！)
[参加者の声](#参加者の声)
[今後について](#今後について)
[次回の開催](#次回の開催)</INS>

<h3>今月のトピック</h3>
<b>あなたは、「父の日」に感謝の気持ちを伝えていますか？</b>

仕事をこなしていくと、幼い頃は気付かなかった両親の努力に気付くことができます。
社会で仕事を続けていくことが、どれだけ大変なことか。
これまでの感謝の気持ちを父親へ伝えることが、非常に大切だと思いました。

<h3>父親へ感謝を伝えている家庭は全体の約4割</h3>

ある企業のアンケート調査によると、「6月を迎える父親の意識」について調査したところ、「父親へ感謝を伝えている家庭の割合は4割」という結果が出たことが記事で公開されました。

父親にとって6月は「最も憂鬱になる月」であることが判明し、その理由としては以下が挙げられています。

<b>１位　梅雨入りして雨の日が多くなるから</b>
<b>２位  祝日がないから</b>

6月は梅雨入りで気候が崩れやすい時期であり、気候と祝日がないことが大きく関係しているようです。
なかでも「父の日」に感謝を伝えている家庭は4割に留まっている事も大きな要因のようです。

<h3>今年の「父の日」は、父親へ感謝を伝えましょう</h3>
感謝を伝えるのも大事ですし、成長した姿を見せるのも大事です。
例えば、

・家庭を作る

・子どもを見せる

・仕事で昇進する

上記は、親に見せたい、親も見るのを楽しみにしている事柄です。

自分の成長のために、今年の目標を頑張る人や仕事に打ち込んでいる人も多いと思います。
転職・昇進で収入アップ、フリーランスへの転身などキャリアアップを考える人も多いのではないでしょうか？

今の日本は、転職をキャリアアップの一つの手段として捉え、人生設計を長期で考える時代です。
tecHubでは、そういう方に向けてリアルな情報交換の場を提供しています。

<h3>2024年6月のtecHubを開催しました！</h3>

![0615_image_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670233/9b751164-52f1-cbc2-2b0a-0177a45e38b4.png)

6/15にtecHubを大手町で開催しました。
参加者は、88名となり、大盛況でした。

日付：6/15(土)　14:00～16:00
場所：LIFORK大手町
大手町ファーストスクエア ウエストタワー 1階
参加者：88名
内容：IT交流会

<b>tecHubは毎月イベント開催しています！</b>

毎月60〜80名ほどの方が参加している人気のイベントです。

3ヶ月に1度：LT（ライトニングトーク）と懇親会の2部構成イベント
その他：オフラインのIT交流会イベント

IT交流会では、ピザとドリンクを片手に、ITエンジニア同士の情報交換や他分野の話を聞いたり、キャリアの相談ができます。
普段の職場では聞けない話も聞けるので、会を重ねるごとに参加者が増えています。


<h3>参加者の声</h3>

![0615_image_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670233/c01722fa-73a2-45a3-1dca-a376e58ef193.png)

今回も幅広い分野のIT関係者が集まり、会社員からフリーランスエンジニア、法人化している人まで様々な方が参加していました。

今月の交流会でも、参加者一人一人の実体験から来る仕事の話は、とても濃厚かつ具体的でした。
今後のキャリアをどうするか考える会話が多かったです。
幅広い分野と様々なキャリアを持つ人の話は、異なる視点や考え方を知る機会になっているようでした。

参加者からは、
<b>「転職やフリーランス転向などのキャリアアップを考えるきっかけになった」
「学びの多い会だった」
「参加してよかった」</b>

などの声をいただいています。

<h3>今後について</h3>

tecHubは、今後も毎月イベントを開催していきます。
他にもITエンジニアがより活躍し、理想のキャリアを切り拓けるように新たな取り組みをしていく予定です。
今後もtecHubをよろしくお願いいたします。

<h3>次回の開催</h3>
次回の開催は、以下の日程を予定しております。

日時：7/20(土)　14:00～16:30　
場所：LIFORK秋葉原
内容：IT交流会
詳細とお申込みは以下をご確認ください。

https://www.navi56.com/communities/tecHub

※イベントの申込みにはコミュニティに参加が必要になります。tecHubコミュニティに参加後にサイト内の"イベント検索"から「7/20tecHub（交流会）」を検索してお申込みください。
WordPress投稿表示

# 概要
wordpressの投稿一覧を表示するコードです。
```.php
<?php if ( have_posts() ) : ?>
  <?php while ( have_posts() ) : the_post(); ?>
    各々の記事に関する処理
  <?php endwhile;?>
<?php else : ?>
  記事が1件も見つからなかったときの処理
<?php endif; ?>
```
AWS Systems Manager

# はじめに
この記事はAWS SAA試験勉強のための、AWS Systems Managerに関する知識のまとめです。

# AWS Systems Managerとは
AWS で利用しているインフラストラクチャの運用状況を可視化して、制御するためのサービス。AWSで稼働するLinuxやWindowsインスタンスを統合管理できます。
AWS Secrets Managerと名前が似ているので混同に注意。

# Parameter Store

設定データの管理と機密管理のためのセキュアな階層型ストレージを提供するものです。

# AWS Systems Manager Run Command

AWSのEC2インスタンスやオンプレミスのサーバーに対してリモートでコマンドやスクリプトを安全に実行する機能です。
既存の多数のEC2インスタンスにCloudWatchエージェントをリモートで安全にインストールするのに適した方法す。
サーバーにログインしなくても安全でセキュアに大規模なサーバー群をリモートで管理できるため、踏み台サーバー、手動でのSSH接続などが不要になります。

# AWS Systems Manager Session Manager

ブラウザからEC2インスタンスへログインできます。

# Systems Manager Automation

AWS Systems Manager Automationは、AWSリソースへの操作をランブックに従って自動的に実行するサービスです。ランブックは、自動実行されるワークフローを定義するドキュメントであり、ワークフローは一連のタスクで構成されています。
Systems Manager Automationには、指定したKMSのカスタマーマネージド型のキーの削除をキャンセルする定義済みのランブックがあります。
WordPressのsnow monkey formsのカスタマイズ

# 概要
snow monkey formsのカスタマイズをしてみました。

```functions.php
add_filter(
	'snow_monkey_forms/control/attributes',
	function( $attributes ) {
		if ( isset( $attributes['name'] ) && '車名' === $attributes['name'] ) {
			$post_id = filter_input( INPUT_GET, 'post_id', FILTER_SANITIZE_NUMBER_INT );
			if ( ! is_null( $post_id ) && ! empty( $post_id ) ) {
				$attributes['value'] = get_the_title( $post_id );
			}
		}
		return $attributes;
	}
);
```
# 説明
URLのクエリを元に、フォームに自動で値をセットするコードです。
git-secretsを使ってみた

Gitの設定で、git-secretsなるアクセスキーのコミットを防いでくれる便利な機能があることを知った。
設定を入れてみて実際にアクセスキーもどきを入力したファイルをコミットしようとしたらどうなるのかを確認してみたものをメモ書き。

インストールと設定
```
% brew install git-secrets
% git secrets --install
% git secrets --register-aws
% git secrets --list
```

ファイル作成
```
% vi test.txt
% cat test.txt
AKIAIOSFODNN7EXAMPLD
$ git add .
$ git commit -m "test"
```

結果
しっかりブロックされました。
```
% git commit -m "secrets test"
test.txt:1:AKIAIOSFODNN7EXAMPLD

[ERROR] Matched one or more prohibited patterns

Possible mitigations:
- Mark false positives as allowed using: git config --add secrets.allowed ...
- Mark false positives as allowed by adding regular expressions to .gitallowed at repository's root directory
- List your configured patterns: git config --get-all secrets.patterns
- List your configured allowed patterns: git config --get-all secrets.allowed
- List your configured allowed patterns in .gitallowed at repository's root directory
- Use --no-verify if this is a one-time false positive
```

片付け
```
% git rm --cached test.txt
% rm test.txt
% git status
```

参考
https://zenn.dev/kkk777/articles/8f55db1e9678f2
https://dev.classmethod.jp/articles/prevent-commit-using-git-secrets-and-husky/

実際の事件まとめ
https://dev.classmethod.jp/articles/accesskey-leak/


環境
Mac mba13 M1 
OS Sonoma 14.5
Qiskitで実機バックエンドの一覧を取得したい

# はじめに
こんにちは、ユーゴです。今回は、qiskitで量子コンピュータの実機を動かそうとしたときに、バックエンドの名前が不正だというエラーが発生したため、正しい名前を調べようとしました。しかし、どうやらバックエンドは頻繁に変わるようなので、常に最新のバックエンド名を取得する方法を載せておきます。

# 問題
以下のような「QiskitBackendNotFoundError」というエラーが出た。

```
---------------------------------------------------------------------------
QiskitBackendNotFoundError                Traceback (most recent call last)
Cell In[4], line 2
      1 service = QiskitRuntimeService(channel=channel, token=token)
----> 2 backend = service.backend(backend_name)
      3 qc_transpiled = transpile(qc,backend)
      4 sampler = Sampler(backend)

File /usr/local/lib/python3.9/site-packages/qiskit_ibm_runtime/qiskit_runtime_service.py:774, in QiskitRuntimeService.backend(self, name, instance, use_fractional_gates)
    765 if not name:
    766     warnings.warn(
    767         (
    768             "The `name` parameter will be required in a future release no sooner than "
   (...)
    772         stacklevel=2,
    773     )
--> 774 backends = self.backends(name, instance=instance, use_fractional_gates=use_fractional_gates)
    775 if not backends:
    776     cloud_msg_url = ""

File /usr/local/lib/python3.9/site-packages/qiskit_ibm_runtime/qiskit_runtime_service.py:523, in QiskitRuntimeService.backends(self, name, min_num_qubits, instance, dynamic_circuits, filters, use_fractional_gates, **kwargs)
    521 if name:
    522     if name not in self._backend_allowed_list:
--> 523         raise QiskitBackendNotFoundError("No backend matches the criteria.")
    524     backend_names = [name]
    525     hgp = instance_filter

QiskitBackendNotFoundError: 'No backend matches the criteria.'
```

# 結論
以下のようなコードで確認可能です。

```python
token = "xxxxxxxxxxxxxxxxxxx" # あなたのトークンを入れてください
service = QiskitRuntimeService(channel="ibm_quantum", token=token)
print(service.backends())
```

すると以下のように、アカウントに紐付いた、利用可能な量子コンピュータのインスタンス一覧が取得できます。backend名に「ibm_brisbane」のように指定してあげましょう。
```
[<IBMBackend('ibm_brisbane')>, <IBMBackend('ibm_kyoto')>, <IBMBackend('ibm_osaka')>, <IBMBackend('ibm_sherbrooke')>]
```

トークンについては、[IBM Quantum Platform](https://quantum.ibm.com/)に登録する必要があります。

backendsメソッドは重要です。ここ、[テスト](https://www.ibm.com/blogs/think/jp-ja/quantum-developer-certification/)に出るので覚えるように！

# 付録
実機を動かすサンプルを作成しました。
ぜひご利用ください！
[QiskitRemoteJobTemplate](https://github.com/mu5dvlp/QiskitRemoteJobTemplate)

# まとめ
いかがだったでしょうか。今回は、qiskitを用いた量子コンピュータ操作のエラーについて紹介しました。
このように、量子コンピュータについての紹介から、Unity, GAS, AWSなど幅広くエンジニアリングについて紹介していきます。
お役に立てましたら、いいね, フォローなどお願いします！
Ubuntu22.04とWindows11のデュアルブート

## **はじめに**
Ubuntu22.04とWindows11のデュアルブートをする方法をまとめました
他のPCでは異なる箇所があるかもしれないですが、大体同じ手順でできるはずです

↓ 今回使用したPC（Windows11）

https://www.mouse-jp.co.jp/contents/other/old_products/file/2023/note/mousepro/MousePro-NB430H_2208MPro-NB430HW11.pdf

主にYouTube内の手順に従いインストールを進めていきます
（動画ではFUJITSUのPCを使用）

https://www.youtube.com/watch?v=sGDH5hS3uAY&ab_channel=Distro%E3%83%8A%E3%83%8A%E3%83%83%E3%82%AD%E3%83%BC

## **デュアルブート手順**
### **1.　Ubuntuのインストーラーが入ったUSBをPCに接続**
インストーラーを用意する方法は以下のリンクを参照してください

https://kantan-prog.com/ubuntu-install-usb/

### **2.　PCをシャットダウンし電源を入れる**

### **3.　[F2]キーを連打しBIOS画面を起動**
BIOSの起動方法はPCによって異なる場合があります

<img width="400" alt="bios1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817260/bdb70053-0499-d346-d502-5ee1a4ab7642.png">

### **4.　secure bootを解除**
[Administer Secure Boot] を選択し [Enforce Secure Boot] を [Disabled] に変更します
[Secure Boot Status] が [Disabled] になればOKです
<img width="400" alt="bios2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817260/0cb40173-fc36-84c2-00bf-b7f902175d64.png">

### **5.　Ubuntuをインストール**
BIOSのホーム画面に戻り [Boot Manager] を選択し、接続したUSBを起動します
[Try to install Ubuntu]（表記は若干異なるかも？）を選択すると、Ubuntuのインストールができます

インストール後の各種設定についてはYouTubeで分かりやすく説明されています（リンク再掲）

https://www.youtube.com/watch?v=sGDH5hS3uAY&ab_channel=Distro%E3%83%8A%E3%83%8A%E3%83%83%E3%82%AD%E3%83%BC

### **6.　デュアルブート確認**
Ubuntuの設定が終わりPCを再起動すると、起動時に以下のような画面が表示されUbuntuとWindowsが選択できるようになります

<img width="500" alt="ubuntu boot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817260/6fd5c908-efdb-4bba-0df8-afc802cbe788.png">

## **謝辞**
この取り組みは株式会社GxP(グロースエクスパートナーズ)様のサポートを受けて実施しています。貴重なアドバイスやロボットに必要な機材の支援をいただきました。心より感謝申し上げます。

https://qiita.com/organizations/gxp

https://www.gxp.co.jp/
Oracle DatabaseとSQLServerのTIMESTAMP型の扱いについて

# 挨拶
初めまして、日本システム開発株式会社の鈴木です。
技術者として更なる向上を目指すためQiitaアウトプットをする取り組みを行っています。
技術者としては経験が浅く発信内容はとにかく試したものの覚書になります。
今回はOracle DBのテーブル定義を参考にSQL Serverにてテーブルを作成する際に、日付を保持したいときのデータ型で勘違いがあったため、調査結果をまとめたものになります。

# Oracle DB
Oracleでは日付を保持するためのデータ型は以下の4種類（時刻のみなら＋1種類）です（[参考](https://docs.oracle.com/cd/F25597_01/document/products/timesten/html/E05176-03/SQL_Reference_Guide-03-11.htm)）。
・TT_DATE
・DATE
・TT_TIMESTAMP
・TIMESTAMP
・TIME（時刻のみを保持する型で、日付を保持することはできません）
TT_DATEは日付のみを格納する型で書式はYYYY-MM-DDです。書式からもわかる通り時刻を記録することはできません。一方DATE、TT_TIMESTAMP、TIMESTAMPは時刻も含めることができます。書式はYYYY-MM-DD HH:MI:SSになります。TT_TIMESTAMP、TIMESTAMPはミリ秒まで記録することができますが、範囲はTT_TIMESTAMPが1753年1月1日の午前0時から、TIMESTAMPが紀元前4712年1月1日からになります。
# SQL Server
筆者が勘違いしていたSQL Serverの日付型は以下です（[参考](https://learn.microsoft.com/ja-jp/sql/t-sql/functions/date-and-time-data-types-and-functions-transact-sql?view=sql-server-ver16)）。
・date
・smalldatetime
・datetime
・datetime2
・datetimeoffset
・time（時刻のみを保持する型で、日付を保持することはできません）
dateはOracleのDATE同様YYYY-MM-DD書式で表現される時刻を持たない日付のデータ型です。smalldatetime、datetime、datetime2はOracleのTIMESTAMPと同様時刻まで含めた日付型で、smalldatetimeはミリ秒を記録できず（OracleのTT_TIMESTAMPに相当)、datetime2が100ナノ秒単位でミリ秒を記録できます（OracleのTIMESTAMPに相当）。
ここで、Oracleにはdatetime型は存在しないですが、__SQL Serverには日付型の値の管理が目的ではないTIMESTAMP型が存在します__。SQL ServerにおけるTIMESTAMP型はそのレコードの最終更新日時をSQL Serverが記録するためのバイナリデータ型です。システムが更新することを前提としているため、ユーザによるUPDATE文の発行はできず（TIMESTAMP型要素を更新しようとするとエラーにより失敗する）、挿入時もエラーにより失敗します。そのため、SELECTによる値の取得時は日時が表示されますが、日時の値を管理することはできません。他のDBMSから移行する場合は上記のdatetime系のデータ型を使用する必要があります（[参考](https://learn.microsoft.com/ja-jp/sql/t-sql/functions/date-and-time-data-types-and-functions-transact-sql?view=sql-server-2017)）。

# （参考）MySQL
MySQLでは以下の3種類の日付管理型があります（[参考](https://dev.mysql.com/doc/refman/8.0/ja/datetime.html)）。
・DATE
・DATETIME
・TIMESTAMP
DATEは日付のみ、DATETIMEは日時、TIMESTAMPはミリ秒まで管理します。それぞれOracleではDATE、TT_DATE、TIMESTAMPに対応しています。

# （参考）SQLite
SQLiteは特徴的で、**日付を管理する型がありません**。文字列型で保存し、使用時に逐次変換することになります。
新たな目標　分散型並列Lispへの道

![bandicam 2024-06-16 15-19-24-449.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/510ea19f-1db1-dac3-05ba-4cd1f068c3b2.jpeg)


# 挑戦の続き
先日、私はEasy-ISLisp ver4.0をリリースして目標を達成したと思いました。しばらく好きな音楽をやったり、プラモデルを作ってのんびりしようと思っていました。しかし、竹内先生のCELISのことが頭から離れません。竹内先生たちは分散型のCELISでパズルを解いていました。そして1990年代の研究であるコネクションマシンのCM-1のことを知りました。とても興味深いものでした。分散型のLispに挑戦したいと思いました。

![bandicam 2024-06-16 15-18-02-271.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/3b7c68f8-e2c2-1a70-07c1-57657a5d2731.jpeg)



# 分散型並列Lisp
通信回線を使って複数台のパソコンを接続します。親Lisp機からスレッドを使って分解した計算を子Lisp機に送信して計算を依頼します。

![dp1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/75875ac7-5d2e-5018-ceb5-46548fb67684.png)



# TCP/IP
通信回線についてはTCP/IPを利用します。C言語のライブラリが充実しています。これを利用します。



# 子機
Lisp起動時に-nオプションを与えます。起動するとサーバーのように動作します。親Lisp機からの計算依頼を受け付け、evalして、通信回線を介して返答します。

![dp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/ae6fa31b-3bfd-6e68-c956-3e4e29891dce.png)




# 親機
親機において子機のIPアドレスを与えなければいけません。

```
(dp-create ip0 ip1 ip2 ... ipn) 
```

という拡張関数を用意します。これにより子機のIPアドレスを与えるとともにソケットを準備します。


# ファイル転送
計算しようとするプログラムは親機に保管してあります。(load fn) 関数により親機のメモリ空間にロードするとともに通信回線を利用して子機にも転送します。

![dp3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/010bddbf-25d3-87ec-46c6-54a8da284e2d.png)



#　マルチコアをフル活用
親機、子機ともにマルチコアですのでこれらをフルに活かします。現在の安価なパソコンでも6コア程度はもっています。3台あれば3*6=18コアを利用することができます。マルチコア、マルチスレッドもフルに活用します。

![dp4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/c5d40d73-41ed-69c4-2174-178de60c3694.png)




# 目標
ver5.0においてこれらを達成したいと考えています。並列は興味深いです。私の新たな目標です。

https://github.com/sasagawa888/eisl
【Next.js】App Routerでの画像パスで困ったのでまとめた

## これは何？

「画像パスを変数に入れて参照したいけど、どこからのパスを書けばいいの……？？？？」

となったので、画像が `/public/` にある時とそうでない時での画像パスの書き方について、下記2つでまとめました。

- パスで参照して持ってくる
- importで持ってくる

※Next.jsのバージョンは14.2.3（App Router）です。

## 📁`/public/`に画像があるとき

### ①パスで参照して持ってくる

**`/hogehoge.jpg` でOK。`/public` いらないです！** ただ、絶対パス・相対パスはNGでした。

```javascript
// OK
const eyecatch = "/hogehoge.jpg";

// imagesフォルダにある時はこれでOK
const eyecatch = "/images/hogehoge.jpg";

// NG
const eyecatch = "/public/images/hogehoge.jpg";
const eyecatch = "../../public/images/hogehoge.jpg";
```

constants.jsで画像パスを持たせる場合など、変数でパスを宣言する時に役立ちますね。

ちなみに　`/public` いらないについては、下記に書いてありました。

https://nextjs.org/docs/app/building-your-application/optimizing/static-assets

>Files inside public can then be referenced by your code starting from the base URL (/).



### ②importで持ってくる

**こっちは`/public`がいります。** 相対パス・絶対パスなら大丈夫。
configファイルでエイリアスを設定すれば、エイリアスパスにもできるはず。

``` javascript
// OK
import eyecatch from "../../public/images/hogehoge.jpg";
import eyecatch from "/public/images/hogehoge.jpg";

// configでエイリアスを設定していれば@もOKのはず
import eyecatch from "@/images/hogehoge.jpg";

// NG
import eyecatch from "/images/hogehoge.jpg";
```

## 📁`/src/images/`など（public以外に画像があるとき）

### ①パスで参照して持ってくる

なんと、 **できないです。**
なのでどうしても使いたい時は、publicに画像を移してしまうか、importするのが良いかと思います。

``` javascript
// OKはない

// NG
const eyecatch = "/src/images/hogehoge.jpg";
const eyecatch = "../images/hogehoge.jpg";
```


### ②importで持ってくる

絶対パス、相対パスやエイリアスパスもできます。

``` javascript
// OK
import eyecatch from '/src/images/hogehoge.jpg';
import eyecatch from '../images/hogehoge.jpg';

// configでエイリアスを設定していれば@もOK
import eyecatch from '@/images/hogehoge.jpg';
```


## 最後に

**「画像パスを変数に入れて参照したいけど、どこからのパスを書けばいいの……？？？？」の答えは、「`/public/`以降のパスから！」** ってことで良いかと思います。

間違っていたらご指摘ください……！

パスを扱う静的なアセット（画像のみならず、robots.txtやhtmlファイルも）はpublicに入れるのが良さそうです。
書き方による細かな違いがありそうですが、また調べます✍️
【基本情報合格者、必読！】基本情報合格後、3ヶ月で応用情報に合格した話。

この記事では、自分が基本情報技術者試験に合格してから、約3ヶ月間の勉強で、応用情報技術者試験に合格した時の勉強法をお伝えしたいと思います。


自分は2022年の11月に基本情報に合格し、その後、2023年の4月に応用情報を受け、合格しました。

基本情報合格後はリフレッシュのために少し休み、2023年の1月から応用情報の勉強を始めたため、勉強期間は約3ヶ月程度でした。

<br>

![IMG_5006.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817219/0ea1bd1e-a4f7-8312-e2c8-55bb0890704f.jpeg)

点数はなんとも言えませんが、当時の勉強計画、オススメの勉強法をお伝えします。


## ステップ１：午前試験対策（1ヶ月）
### 過去問を解く
応用情報の午前試験のテキストは基本情報のテキストとほとんど同じ内容のものが多いため、テキストを読むというよりは、過去問を解きまくる方が良いと思います。

自分が受けた試験本番の午前試験は思ったより難しく、点数も66点でした。

テキストに載っていないような問題が多く出た印象があります。（これに関しては勉強のしようがない。泣）

なので、できるだけ多くの過去問を解くことがベストプラクティスだと思います。

自分は9試験分解き、知らない単語が出てきたら、その都度意味を暗記しました。
<br>

↓過去問を解けるサイトはこちら。

https://www.ap-siken.com/apkakomon.php

## ステップ２：午後試験の選択科目を絞る
午後試験の問題構成は以下のようになっております。

### 必須
・情報セキュリティ

### 選択（この中から４つを選択）
＊全部必ず出題されます

・経営戦略
・プログラミング
・システムアーキテクチャ
・ネットワーク
・データベース
・組み込みシステム開発
・情報システム開発
・プロジェクトマネジメント
・サービスマネジメント
・システム監査

<br>
本来は難問が出た時のために、選択問題は５つに絞って勉強するのがベストですが、最短で合格したかったため４つに絞り、それ以外の分野は全く勉強しませんでした。

<br>
自分が選んだ分野は、

・経営戦略
・データベース
・プロジェクトマネジメント
・サービスマネジメント
<br>
です。（文系ハッピーセットです！笑）

<br>
経営戦略、プロジェクトマネジメント、サービスマネジメントの３つは国語の問題と思ってもらって大丈夫です。

午前問題に合格する知識と長文を読む集中力さえあれば問題なく解けると思います。
（なんなら知識なくても解ける問題も多いです。）

データベースは基本情報勉強時に、SQL文等がなんとなく得意だったため選択しました。
苦手な方は、組み込みシステム開発やシステム監査がおすすめです。

文系ハッピーセットの注意点は、問題自体はあまり難しくない（答えが問題文中にある事がほとんど）ですが、長文を読みまくる集中力を保つのがかなり大変です。

特にプロジェクトマネジメントやサービスマネジメントはかなりの長文だった記憶があるため集中力が残っている前半に解くのもありかもしれません。

## ステップ３：午後試験対策（2ヶ月）
### ITECの教材で選択分野の勉強
午後試験の教材で超絶おすすめするのは、このITECのテキストです。
↓↓↓↓↓↓↓

https://www.amazon.co.jp/dp/4865752757?ref_=cm_sw_r_cp_ud_dp_HWVWXS9M5R6E091R7S7M&dplnkId=8a51d201-6825-4673-8691-f3fb4a68d5da&nodl=1

※最新版のものが良いかと思います。

この教材は、午後問題の攻略方法等（長文のどういうところに答えが書いてあるかなど）が書かれているため、とてもおすすめです。
（いろんな人がオススメしています。笑）

この教材内の、自分の選択分野の部分を一周し、一通り解答の意味を理解した状態にすると良いと思います。

### 試験まで可能な限り過去問を解く
ITECのテキストを一周し、不明点をなくしたら、先ほどリンクを貼った過去問道場で午後問題の過去問を解きましょう。
（一部、ITECの教材と過去問が被ります。）

<br>
以上、教材と過去問道場の２つで、午後試験の問題に慣れます。


あとは試験で頑張るのみ！
試験当日は、午前午後と長丁場の試験になるため、集中力を保つためにも、前日しっかり睡眠をとり万全の体調で試験に臨みましょう！

## 最後に
以上の方法で自分は基本情報合格後、約3ヶ月の勉強で応用情報に合格する事ができました
。

基本情報の試験後は、試験勉強から解放されたい時期だとは思いますが、ここでもうひと頑張りして応用情報を取ってしまえば必ず後々楽になりますし、

「あの時頑張ってよかった！」

と思う日が来ると思います！

<br>
基本情報の知識が脳内に残ってるうちに応用情報も取っちゃいましょう！！
基礎知識④Active Recordについて

## はじめに
転職活動をする中で、MVCそれぞれの役割やhttp通信についてなど、基礎的な技術知識について問われるシーンがあったので、改めて基本に立ち返って自己学習しようと思った。

出題例にActive Recordについての質問があり、
そういえばちゃんと説明できないな〜…と思ったので学習内容をまとめる。

## Active Recordとは
Ruby on Railsで使用されるデザインパターンの一つで、**DBとのやり取りを簡素化してくれる**もの。
本来DBとやり取りをするためにはDB言語であるSQLが使われますが、
RailsにはこのActive Recordが適用されているため、
複雑なSQL文を書かなくてもRubyで直感的にDBとのやり取りを記述することができる。


### Active Recordで出来る主なこと
- CRUD機能のサポート
Create Read Update Deleteといった基本的なデータ処理機能を
メソッドを用いて簡単に行うことができる。
<br>

- モデル同士のアソシエーション
異なるモデル間を結ぶことができます。
ex)1ユーザーが複数のコメントを投稿できるように、UserモデルとCommentモデルを関連づける。
<br>

- バリデーションの作成
データが正しくデータベースに保存されるための制約をつけることができる。
ex1)コメントには必ず本文が記入されていないといけない
ex2)本文は50文字以内でなければいけない
<br>

- クエリインターフェイス
データベースから意図したデータを取得するための方法。
ex1)登録されているユーザーデータを全件取得
```@users = User.all```
ex2)ユーザーのデータベースから名前が「太郎」さんのデータのみを取得
```@user = User.find_by(:name "太郎")```

など

普段なんとなくコントローラにモデル.allとかモデル.find(params[:id])とか書いてましたが、
Active RecordのおかげでDBとのやり取りが簡単に行うことができていたんですね🥸

参考にさせていただいた記事
- https://railsguides.jp/active_record_querying.html
- https://zenn.dev/syommy_program/articles/63107f427156d8
Git初心者に捧ぐ：Gitを体験できるゲーム

# 背景
これからプログラミングを勉強するぞ！って方や今現場でGitについて勉強していますって方、Gitってなれないと難しいもの...と思っていませんか？
私も最初はGitの便利さがわからず、何もわからないところからとにかく触って理解してきました！
今回は、私のXのTLでGitについて学習できるゲームがあるよと流れてきたので紹介します。

# learnGitBranching
[learnGitBranching](https://github.com/pcottle/learnGitBranching)はPeter Cottleさんが作成したもので日本語でも公開されています。
実際のゲーム画面はこちら
[learngitbranching.js.org](https://learngitbranching.js.org/?locale=ja)
アクセスするとこのような画面が開かれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273072/fb106160-8175-5a61-515e-5342159d9196.png)

画面の緑の矢印に従って進むとこのような画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273072/60f1fdb0-23fb-9184-5853-f8393e7e3e70.png)

Gitに関する一通りの操作から、Remoteで必要な操作までTreeが図示されるため、非常にわかりやすいこと、自身でコマンドを入力しながら行うため、この場面でどのようなコマンドを打てばいいのかわかりやすいことが非常に良かったです。
例えば、この画面は初期の「コミットを2回してみよう」というタスクですが、画面左下にコマンドを入力すると、画面内にその結果が即座に反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273072/ff0419b0-fe8f-8dae-eab2-003e16d39ad8.png)

# 感想
日本語で説明してくれていることもあり、Gitってなんぞや...？を理解するためにはとてもいい教材だと感じました。
私自身も、触りながら、昔にこういうものがあれば...！と思うほどわかりやすかったです。
もし周りでGitについて勉強されている方がいればぜひおすすめしてください！
Excel 条件付き書式でセルが空白になったときに色を付ける

先日、とあるご縁でExcel講習会の講師をさせていただく機会があり、アドリブで条件付き書式の使い方を紹介しようとしたらど忘れして実演できなかったので、戒めとしてアップロードします。

数式を入れるときに対象セルのセル番地を入れていなかったせいで動きませんでした。
しょうもな・・・
```
正解数式 =$B$4=""
```
![条件付き書式.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/6a02acd2-13fd-5bf5-f02d-6897fc4a7966.png)

無事に黄色くなりました。
![条件付き書式2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/c12fab0b-b24c-3e48-cde8-5a2658d046dc.png)
appendメソッドの初期容量以上の要素を追加したときに起こること

## 実装

```go
  s4 := make([]int, 0, 4)
	fmt.Println(s4, len(s4), cap(s4))
	s5 := append(s4, 1, 2, 3, 4, 5, 6, 7, 8, 9)
	fmt.Println(s5, len(s5), cap(s5))
	
	//[] 0 4
  //[1 2 3 4 5 6 7 8 9] 9 10
```

上記の実装をしたときにs5の容量は初期に設定した以上の要素数を追加しようとしています。そのときにGo言語は、自動的により大きな容量を持つスライスを作成します。今回であれば、最初の1-4までの要素は初期値の容量で入れることができます。しかし、残りの5-9は一度、初期容量の倍の数スライス容量を増やします。それでも足りませんので、Go言語は2のべき条の数容量を追加します。よって、上記の例では倍数容量を追加したときに8となりますが、まだ足りないので、さらに2のべき条ずつ容量を追加します。今回は2だけで足りますので最終的`8+2`で10となります。

よって、次の実装も下記のような結果になります。

```go
	s76 := append(s4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)
	fmt.Println(s76, len(s76), cap(s76))
	
	// [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15] 15 16
```

## 参考記事
[Go 言語のスライス - Go 言語入門](https://golang.keicode.com/basics/go-slice.php)
[Unity]UnityNetcodeのマルチプレイヤーで変数を同期してみる

# 概要
UnityNetcodeにてプレイヤー間で変数を同期するサンプルコードです。ホストプレイヤーだけが変数を書き換えて、その変数が全てのプレイヤーに同期される流れです。
# 本文
まずはPlayerCountクラスを作成して

```cs
using Unity.Netcode;
using UnityEngine.UI;

public class PlayerCount : NetworkBehaviour
{
    private Text playersCountText;

    private NetworkVariable<int> _playersNum = new(0, NetworkVariableReadPermission.Everyone);

    private void Start()
    {
        playersCountText = GetComponent<Text>();
    }

    private void Update()
    {
        if (IsServer)
        {
            // 接続しているプレイヤーの数を取得
            _playersNum.Value = NetworkManager.Singleton.ConnectedClients.Count;
        }
        playersCountText.text = "Players: " + _playersNum.Value;
    }
}
```
Textを作成したらPlayerCountクラスを貼り付けます。NetworkBehaviourを継承したクラスを使う場合はNetworkObjectも必要なので一緒にアタッチしておきます。

![スクリーンショット 2024-06-16 173233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/a04782c9-7cfc-0df2-08a8-537b837e1196.png)

_playersNumは各プレイヤー間で同期されているのでそれぞれの画面で正しくプレイヤー人数が表示されました。（変数を書き換えているのはあくまでもホストプレイヤーだけです）

![スクリーンショット 2024-06-16 173619.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/61b1dbb3-1d3e-f249-ec4f-9654a0c6473b.png)

# UnityNetcode関連記事目次
[1.UnityNetcodeをちょっと触ってみたい人用の記事](https://qiita.com/kazuma_f/items/dd88c7132c343500702e)
[2.UnityNetcodeでマルチプレイヤーを試してみる記事](https://qiita.com/kazuma_f/items/e8b0fd9bb6a8069f3d36)
[3.UnityNetcodeのマルチプレイヤーで位置を同期してみる](https://qiita.com/kazuma_f/items/bd57bc2c18fd0dfa9c71)
4.UnityNetcodeのマルチプレイヤーで変数を同期してみる ← :triangular_flag_on_post:
【Vue.js】Vueにおけるリアクティブとは？

## はじめに
[Vue.jsチュートリアル](https://ja.vuejs.org/tutorial/#step-2)で学んだことをアウトプットしていきます。

## 前提
### 宣言的レンダリング
Vue.jsのテンプレート構文のことです。
JavaScriptのデータに基づいて表示が変更されます。

```vuejs
<!-- 例 -->
<h1>{{ message }}</h1>
```

## リアクティブとは
**データの変更が検知されたときに自動的に更新される**ような状態のことを言う。

### OptionsAPIの場合
```vuejs
<script>
export default {
  data() {
    return {
      message:'Hell World!'
    }
  }
}
</script>

<template>
  <h1>{{ message }}</h1>
</template>
```
- dataオプションを使ってリアクティブなmessageを宣言する

### CompositionAPIの場合(reactive)
```vuejs
<script setup>
import { reactive } from 'vue'

const state = reactive({
  message: 'Hell World!'
})

</script>

<template>
  <h1>{{state.message}}</h1>
</template>
```
- ```reactive()``` は**オブジェクト（配列や Map や Set のような組み込み型も含む）全体**をリアクティブにする
- reactiveな```state```オブジェクトの```message```プロパティの値を宣言的にレンダリングする

### CompositionAPIの場合（ref）
```vuejs
<script setup>
import { ref } from 'vue'

const message = ref('Hell World!')
</script>

<template>
  <h1>{{ message }}</h1>
</template>
```
- ```ref() ```は、[**プリミティブな値（数値、文字列、真偽値など)**](https://e-words.jp/w/%E3%83%97%E3%83%AA%E3%83%9F%E3%83%86%E3%82%A3%E3%83%96.html)をリアクティブにする

## reactiveとrefどっちを使う?
結論から言うと、CompositionAPIにおいては、[```ref()```](https://zenn.dev/comm_vue_nuxt/articles/ref-vs-reactive#%F0%9F%93%96-%E7%B5%90%E5%B1%80%E3%81%A9%E3%81%A3%E3%81%A1%E3%81%8C%E3%81%84%E3%81%84%E3%81%AE%E3%81%8B%EF%BC%9F)が推奨されている。
理由としては、[```reactive()```で以下の制限](https://ja.vuejs.org/guide/essentials/reactivity-fundamentals.html#limitations-of-reactive)があることが挙げられています
>- プリミティブ値を扱うことができない
>- オブジェクト全体を置換できない

### reactiveは不要なのか？
refが推奨されているからと言って、reactiveが全く要らないとも限らないらしい。
>[Vue.jsで挙げられていた一つの活用方法として、「Options API からの移植性」という話がありました。
歴史的な背景を見てみると、実は reactive の方が、根幹の思想に近いところに存在していたことがわかります。](https://zenn.dev/comm_vue_nuxt/articles/ref-vs-reactive#%E8%AA%A4%E8%A7%A3-1.-reactive-%E3%81%AF%E3%81%84%E3%82%89%E3%81%AA%E3%81%84)


## まとめ
- リアクティブとは、データの変更が検知されたときに自動的に更新される状態のこと
- OptionsAPIではdataオプションを使ってリアクティブな状態を宣言することが多い
- CompositionAPIではリアクティブな状態を宣言するときに```ref()```を使うことが推奨されている


## 参考記事
[宣言的レンダリング](https://ja.vuejs.org/tutorial/#step-2)
[リアクティビティーの基礎](https://ja.vuejs.org/guide/essentials/reactivity-fundamentals)
[【Vue3】リアクティビティーの基礎 ref / reactive について解説 【プログラミング / 英語】](https://navigate-online-store.com/vue3-reactive/)
[「ref と reactive」 結局どっちを使えばいいのか？ (2024 年最新版)](https://zenn.dev/comm_vue_nuxt/articles/ref-vs-reactive)