OmniAICreator/Qiita-1.07M huggingface dataset:
C++アプリを配布！LaunchpadでPPAを公開するガイド

C++で作成したアプリケーションを多くのユーザーに配布するためには、PPA (Personal Package Archive) を利用する方法が便利です。本記事では、C++のアプリをLaunchpadを利用してPPAとして公開する具体的な手順を解説します。

```注意: 本記事では、Ubuntuを前提に進めます。他のディストリビューションでは手順が異なる可能性があります。```

## 1. 必要な環境の準備

まず、以下のツールをインストールしておきます。

```bash
sudo apt update
sudo apt install -y git gnupg devscripts dh-make dput
```

また、Launchpadアカウントを作成し、SSHキーとGPGキーを登録しておく必要があります。

1. **Launchpadアカウント作成**: [Launchpad公式サイト](https://launchpad.net/)でアカウントを作成。
2. **SSHキー登録**:
   ```bash
   ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
   cat ~/.ssh/id_rsa.pub
   ```
   上記のコマンドで生成した公開鍵をLaunchpadに登録します。
3. **GPGキー登録**:
   ```bash
   gpg --full-generate-key
   gpg --list-keys
   gpg --export --armor your_key_id
   ```
   GPGキーもLaunchpadに登録します。

## 2. Debianパッケージの作成

### dh_makeを使用した初期設定

Debianパッケージの作成には`dh_make`コマンドを使用します。以下の手順で進めます。

1. プロジェクトフォルダを作成します。
この時、プロジェクト名_バージョンの形式で作ること！
プロジェクト名は、全部小文字であること

   ```bash
   mkdir your-project_version
   cd your-project_version
   ```

2. 必要なソースコード（例: `main.cpp`）と`Makefile`を準備します。

   **Makefileの例**:
   ```Makefile
   all:
       g++ -o your-app main.cpp
   ```

3. `dh_make`を実行してDebian用のテンプレートを生成します。

   ```bash
   dh_make --createorig -s -p your-app_1.0
   dch -r
   ```

   - `-s`はシングルバイナリパッケージを意味します。
   - `-p`でパッケージ名とバージョンを指定します。

   実行後、`debian`ディレクトリが作成され、必要なテンプレートファイルが生成されます。

### 必要なファイルの編集

テンプレートファイルを修正して、パッケージ化の準備を進めます。

- **controlファイルの編集**:
  ```text
  Source: your-app
  Section: utils
  Priority: optional
  Maintainer: Your Name <your_email@example.com>
  Build-Depends: debhelper (>= 9)
  Standards-Version: 4.1.3
  Homepage: https://your-app-homepage.com

  Package: your-app
  Architecture: any
  Depends: ${shlibs:Depends}, ${misc:Depends}
  Description: Short description of your app
   A longer description of your app.
  ```

- **changelogファイルの編集**:
  ```text
  your-app (1.0-1) unstable; urgency=medium

    * Initial release.

   -- Your Name <your_email@example.com>  Fri, 13 Dec 2024 12:00:00 +0000
  ```

### ビルドとパッケージ化

以下のコマンドでDebianパッケージをビルドします。
```bash
dpkg-buildpackage -us -uc
```

親ディレクトリに生成された```.deb```ファイルを確認してください。

## 3. PPAへのアップロード

次に、作成したパッケージをPPAにアップロードします。

1. **```.changes```ファイルの生成**:
   ```bash
   debuild -k<Your-GPG-Key-ID> -S -sa
   ```
   -kの後にあなたのgpgIDを入力してください
   GPGKeyがわからない場合はここから確認できます。
   ```
   gpg --list-keys
   ```
2. **PPAにアップロード**:
   ```bash
   dput ppa:your-launchpad-id/your-ppa-name your-app_version_source.changes
   ```

アップロードが成功すると、Launchpadでビルドが始まります。ビルドが完了したら、PPAからインストール可能になります。

## 4. ユーザーへの提供

ユーザーは以下の手順でPPAからアプリをインストールできます。

```bash
sudo add-apt-repository ppa:your-launchpad-id/your-ppa-name
sudo apt update
sudo apt install your-app
```

## まとめ

本記事では、C++のアプリケーションをPPAとして公開する手順を解説しました。`dh_make`を活用すれば、Debianパッケージ作成の初期設定が簡単になります。Launchpadを利用して、パッケージ管理と配布を効率化しましょう！
ChatGPTでGoogle formを爆速で作成する方法

# はじめに
Google Formの作成って意外と時間がかかりますよね。質問項目を考えて、選択肢を設定して...。
でも、ChatGPTを使えば驚くほど簡単に作成できるんです！
今回はChatGPTのカスタマイズチャットボットである「Form Builder Plus for GPT」を使って、Google Formを爆速で作成する方法をご紹介します。

# 対象読者
・Google Formをよく使う方
・ChatGPTを使った業務効率化に興味がある方

# 1. Form Builder Plus for GPTとは
## 概要
Form Builder Plus for GPTは、Jivrus Technologiesが提供しているGoogle Formを自動生成できるGPTs（GPT Builder）です。

**GPTsとは**
- ChatGPTをカスタマイズできる機能
- GPTsを利用することで、オリジナルのチャットボットを作ることが可能


ChatGPTに指示を出すだけで、アンケートの構成を検討しGoogle Formを自動生成してくれます。
生成された構成を改善したい場合は、さらに指示を出すことで作り直してくれます。

# 2. 利用方法
Form Builder Plus for GPTを使用するための準備手順をご説明します

1.**チャットの始め方**
・ChatGPTのサイドバー「GPTを探す」から「Form Builder Plus for GPT」を検索
・モーダル下部の「チャットを開始する」をクリック

2.**フォーム構成の生成**
作成したいアンケート内容について指示を出し、問題なければアンケートの作成を依頼しましょう。
※Googleアカウントへのアクセス許可を行う必要があります。<br>
生成された構成を改善したい場合は、都度指示を出してあげましょう。

例）忘年会のアンケート
![スクリーンショット 2024-12-13 19.09.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480255/2cf0ad7e-c051-6d88-2b72-b64c8de54cf5.png)

3.**作成されたアンケートの確認**
作成依頼を行うと30秒程度でGoogle Formが作成されます。
作成フォームのリンクからアンケートの確認をすると、以下のように作成されています。

![スクリーンショット 2024-12-13 19.18.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480255/08a1b9bc-4758-ce60-092d-d61b2ddd894d.png)


# 3. まとめ
生成系AIを使って仕事をすることが多くなっていますが、痒いところに手が届く機能がどんどん出ており感謝感激です🙌
Google Formを使ってアンケートを実施する際にはぜひ活用してみてください！

また、本プラグインを提供しているJivrus Technologiesのプライバシーポリシーと利用規約は以下となります。
気になる方は確認してみてください。

https://www.jivrus.com/legal/privacy-policy

https://www.jivrus.com/legal/terms-and-conditions
デザイナー不在のチームでのデザインシステム運用を振り返る

この記事は [クラウドワークス グループ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/crowdworks) シリーズ1の16日目の記事です。

## はじめに
こんにちは。クラウドワークスでエンジニアをしている甲斐([@karukan029](https://qiita.com/karukan029))です。ハイクラス副業マッチングプラットフォーム[CrowdLinks](https://start.crowdlinks.jp/)を担当しています。
今回はデザイナー不在のチームでのデザインシステム運用についてお話しします。これからデザインシステムの導入を検討している方の参考になればと幸いです。

:::note warn
デザインシステムの定義に関する説明は本記事では取り扱わないため、先人の方々の記事や書籍をご参照ください。
:::

## デザインシステム採用の経緯
ボタンなどの基本的な部品はありましたがデザインの基準・方針がなく、1から考える機会が多くありました。共通のコンポーネントは存在していたものの一覧性がないため、プロダクトのUIに一貫性を持たせることが難しくなっていました。\
そこで、フロントエンドのリプレースのタイミングに合わせてデザインシステムを導入することにしました。

## デザインシステムの構成
「無理なく運用できる範囲で小さく始める」ことを基本とし、すぐに役立つものから整備していきました。

### コンポーネント
Figmaでデザインシステムのコンポーネントのページを作成することで、各コンポーネントのパターンを一覧性を持って確認できるようになりました。\
実装したコンポーネントはStorybookで管理しています。これにより、一覧性を持ってコンポーネントを確認できるようになりました。また、Storybookにはアクセシビリティチェックの拡張機能(addon-a11y)を追加し、警告が出た場合には対応することで一定以上のアクセシビリティを担保できるようにしています。

![Storybook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2406937/150eee8b-0159-b8b5-168d-4e69cc238eeb.png)


### デザイントークン
デザイントークンは、[Tokens Studio](https://www.figma.com/community/plugin/843461159747178978/tokens-studio-for-figma)というFigmaのプラグインを使用して管理しており、GitHubと連携することでデザイントークンの定義をコードに同期させています。コード上でCSS変数として参照できるようにしており、基本的にはここで定義しているデザイントークンを用いてスタイリングしています。デザイントークンとコードの連携についての詳細はここでは割愛させていただきます。(要望があれば、別で具体的な話をするかも)

デザイントークンは、具体的な値を持つPrimitiveトークンと役割を持たせたSemanticトークンに分けて定義しています。
#### Primitiveトークン
- 具体的な値を定義したもの
- 濃淡・サイズなどでパターンを定義する
    - 例：色の場合
        - links-blue-900、links-blue-700など
#### Semanticトークン
- 値に役割を持たせて定義したもの
- Primitiveトークンの値を用いて定義する
    - 例：色の場合
        - Semanticトークン名：primary
            - 役割：プロダクトの印象を司る色、主要なメッセージやアクションで用いる
            - 値：links-blue-900

![セマンティックトークン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2406937/000c066c-1b5f-7f1e-cece-aa0089acfebe.png)

デザイン・スタイリング時はSemanticトークンを使用するようにしており、役割に応じた値を用いることでプロダクト全体のスタイリングに一貫性を持たせるようにしています。

## デザイナーが不在になってからの運用状況
### PO・エンジニアでデザインシステムを使用して、UIのデザインがある程度できていた
デザインシステムがあるので、そのルールに沿ってデザインすればデザイナー以外でも複雑な要件でなければデザインできるようになっています。これは、デザイントークンを定義していたことがよかったです。感覚的に決めるというより役割にあっているものを選択してデザインを進めることができるため、設計以外で悩む部分を少なくできました。

### 別チームのデザイナーとの協業を進めやすかった
別チームのデザイナーの方と協業する際、デザインシステムがあることで背景やデザインのルールをスムーズに共有できました。\
Tokens Studioの使い心地についてデザイナーの方にお聞きしてみたところ、使いづらさはなかったそうです。強いていうなら、ノートPC使う際Tokens Studioが画面の半分近くを占有するため画面が狭くなる点くらい...
![TokensStudio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2406937/8dbf00bc-c9d0-2425-f8ba-02290323ae5d.png)


加えて、GitHubと連携する関係でデザイナーの方にもGitHub連携の設定をしていただく必要がある点は、Tokens Studio使用のデメリットですね。今改めて検討するなら、Figmaの機能のみで完結するVariablesでデザイントークンを管理、Figma APIを使用したコードとの同期を検討してみるのも良さそうです。

https://www.figma.com/developers/api#variables


## おわりに
「無理なく運用できる範囲で小さく始める」ことを基本とし、すぐに役立つものからデザインシステムを整備していったことで、状況が変化した後も役立つものとしてデザインシステムを運用できています。\
デザインシステムなんて自分達にはまだ必要ないと思っている方、これを機に「無理なく運用できる範囲で小さく始める」をキーワードにデザインシステム構築をぜひ検討してみてください。
AIやロボットの社会実装とNode-REDのポータビリティ

今後、AIが台頭し、機械やロボットと融合し、リアル社会でも実装が成される可能性は非常に高いと考えられます。その理由として、いくつかの要因を挙げられます。

### 1. **AI技術の急速な進歩**
   AI技術は、近年飛躍的に進歩しており、特に自然言語処理や画像認識、強化学習などの分野で大きな成果が出ています。生成AIの台頭もその一例であり、これらの技術がロボットや自動運転車、ドローンなどの機械に搭載されることで、社会実装への道が開かれつつあります。
   
   - **自律システムの開発**：AI技術が進歩することで、ロボットや自動化システムがより高度な判断や自律的な行動を可能にし、複雑なタスクも人間の介入なしに実行できるようになります。

### 2. **エッジコンピューティングとクラウド技術の発展**
   AIやロボットがリアルタイムで動作するためには、大量のデータ処理が必要です。これを支える技術として、エッジコンピューティングとクラウド技術が重要です。これにより、リアルタイムでデータを処理し、意思決定を行うことが可能になり、産業ロボットや自動運転車など、現実社会で即座に活用できるシステムが実現します。

   - **低レイテンシー処理**：エッジコンピューティングにより、遠隔のクラウドに依存することなくデバイス自体でデータを処理することが可能になり、即座に反応するロボットやシステムが実現します。

### 3. **ロボットのコスト低下と普及**
   ロボティクス分野では、製造コストの低下が進んでおり、家庭用や産業用のロボットがより安価に導入できるようになっています。技術の進歩とともに、ロボットの性能も向上し、さまざまな業界での導入が加速しています。

   - **ロボットアシスタントの普及**：掃除ロボットや医療用アシスタントロボットなど、既に家庭や医療現場でロボットが日常的に利用されています。今後さらに多様な用途での利用が増加するでしょう。

### 4. **労働力不足の問題**
   少子高齢化や働き手の不足が問題視されている地域では、ロボットやAIによる自動化が欠かせない解決策とされています。特に、製造業や物流、介護などの分野でのロボット導入が急務となっており、これがAI技術と融合した機械の社会実装を促進しています。

   - **人手不足の解消**：高齢化が進む国々では、労働力不足を補うために、AIやロボットが工場やサービス業、医療など多くの分野で活用される動きが加速しています。

### 5. **規制・インフラの整備**
   自動運転車やドローンなど、AIやロボットを使った新しい技術が実現するためには、法律やインフラの整備が必要です。現在、各国でこれに対応する法整備やインフラ開発が進められており、技術が社会実装されるための環境が整いつつあります。

   - **自動運転車の実験や実証**：多くの国で自動運転車やドローン配送の実験が進んでおり、これらが合法的に運用されるための法整備も進行中です。

### 6. **ユーザーの受容性の向上**
   技術が進むにつれて、消費者や企業がAIやロボットに対する信頼性を高めつつあります。日常的なデバイスにAIが組み込まれることで、ユーザーはAIの利便性を直接体験し、それが社会の一部として受け入れられる土壌が育っています。

   - **AIアシスタントの普及**：スマートスピーカーやスマート家電など、日常生活の中でAIが活用される場面が増えており、これが機械やロボットとの融合を自然な形で促進しています。

### 7. **イノベーションへの投資の増加**
   AIとロボティクス分野への投資が活発化しており、ベンチャー企業や大企業が新しい技術やビジネスモデルを開発しています。特に医療、物流、エンターテインメント、製造業など、様々な業界でのAI技術の社会実装に向けた取り組みが進行しています。

   - **スタートアップの活躍**：多くのスタートアップ企業がAIやロボット技術の開発に資金を投じており、新しいアイデアやプロダクトが次々と生まれています。

---

これらの要因から、AIやロボットのリアル社会での社会実装は着実に進んでいくと考えられます。Node-REDのようなツールがこの流れの中で柔軟に役割を果たすことで、システム開発や導入のスピードがさらに加速するでしょう。

そして、Node-REDのポータビリティは、AIやロボティクスがリアル社会に浸透する中で、その多様なニーズに柔軟に応える重要な要素となるでしょう。

Node-REDのポータビリティが今後AIやロボットが社会実装される際に重要になる理由はいくつかあります。

#### 1. **異なるプラットフォーム間の統合**  
   AIやロボットは様々なデバイス、センサー、クラウドサービス、ハードウェアと連携して動作する必要があります。Node-REDはこれらの異なるプラットフォーム間で、簡単に接続やデータのやり取りができるフローを構築できるため、ポータビリティが高いです。

#### 2. **シンプルなビジュアルプログラミング**  
   複雑なAIシステムやロボット制御のロジックを、Node-REDのように直感的なビジュアルプログラミングで扱うことができれば、開発スピードが速くなり、専門知識のないユーザーでも操作やカスタマイズが可能になります。これにより、リアル社会での迅速な実装が促進されます。

#### 3. **エッジコンピューティングとの適合**  
   AIやロボットは、リアルタイムでデータ処理が必要となる場面が多く、エッジデバイス上での処理が不可欠です。Node-REDは軽量であり、ラズパイなどのエッジデバイスでも動作可能なため、ポータビリティが社会実装時に非常に重要な役割を果たします。

#### 4. **迅速なプロトタイピングと拡張性**  
   AIやロボティクスのプロジェクトでは、迅速なプロトタイピングが求められます。Node-REDはその柔軟なフロー設計と膨大なノードライブラリのおかげで、新しい技術やデバイスとの連携を素早く試せる上、拡張も簡単です。こうした特徴が、社会実装の際に多様なシステムへの対応力を高めます。

#### 5. **コミュニティの力**  
   Node-REDはオープンソースのプロジェクトであり、世界中の開発者による豊富なノードやプラグインが利用可能です。AIやロボットの社会実装が進むにつれ、必要な機能が次々と追加されていくため、Node-REDのポータビリティがさらに強化されます。

これらの理由から、Node-REDのポータビリティは、AIやロボティクスがリアル社会に浸透する中で、その多様なニーズに柔軟に応える重要な要素となるでしょう。
AWS Certified AI Practitioner（AIF）対策：MXNet

# MXNet

***<font color="MediumVioletRed">『物体検出のディープラーニングに利用されるフレームワーク』</font>***

特にディープラーニングのモデルを効率的に作成・トレーニングするために使われます。

### ユースケース

- **<font color="MediumBlue">商品画像の分類</font>**
- **<font color="MediumBlue">監視カメラ映像から特定の物体を自動検出</font>**
サクラエディタの個人的に便利だと思った機能（ソート＆マージ）

## はじめに
こんにちは。エンジニアの長谷川と申します。
今回は他の方に乗っかってサクラエディタで便利だと思った機能をご紹介します。
他の方の記事はこちら

https://qiita.com/pesysyon/items/e4c11c71ffd0cdbc0e28

https://qiita.com/pesysyon/items/6559649ab6f60b8af749

https://qiita.com/pesysyon/items/11521b5fcd9ae988b0a8

## 便利機能（ソート＆マージ）
業務中にエクセルを共有されて「一意になるように調査しておいて」みたいなこと、言われたことありませんか？私はあります。
そんな時、下記の記事にあるようにSQLiteを使用するのもいいでしょう。

https://qiita.com/pesysyon/items/40e01dca916a55232a1b

そこまでするほどのものでもないといった時にサクラエディタの機能が便利です。

例えば、「宿泊者がどの都道府県から来たのか知りたい」といって下記のようなエクセルが渡された場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/cb8685af-ad37-c692-4f3e-eee5150af0b6.png)

１．サクラエディタを起動します。
２．住所の内容をコピーしてサクラエディタに貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/849d7b0b-e773-e5ec-3b43-cbe2b161c1f0.png)

３．Ctrl+Aで全選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/42c0442e-cd2a-4879-d1d2-eb380794ad5a.png)

４．Alt+Aでソートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/5b7bcb30-b0ff-b4b8-d11b-8aec7a0175f9.png)

５．Alt+Mでマージします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/1242b4de-05e4-bd19-ae67-900bb0563510.png)

どうですか？
マージして、一意になったことで宿泊者が「山梨、福島、長野」から来ていたことがわかりました。

:::note warn
ソートしてからマージしないと下記のように
期待した結果にはなりませんのでご注意ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/60f6ab87-b7ea-99d2-205a-9326a1a16e32.png)
:::

## まとめ
データの並べ替え自体はエクセルでも可能ですが、マージまでは出来ません。
大量データを一意にする必要がある場合に思い出していただければ幸いです。

以上、長谷川でした。
コードレビューを依頼する前に気をつけるべきこと

フロントエンドエンジニアとして配属されて約半年が経ちました。
実装タスクを担当するようになり、レビュー依頼をする機会が増えてきました。
コードレビューは、エンジニアの成長に非常に重要なプロセスだと考えています。
レビューを受ける側は、自分の書いたコードについてフィードバックを受けることで学び、改善することができます。また、レビューをする側も他の人のコードを読み、異なるアプローチや解決方法を学ぶことができます。
今回は、自分がコードレビューを出す前に指摘されたことと、その改善案をまとめます。

## 前提
自分が担当しているプロジェクトでは、GitHubを使っていて、フロントエンドを担当しています。
使用しているエディタはVSCodeです。
主に、保守、新規機能実装を行なっています。

### 指摘①：実装による他への影響
既存のコードを変更することで、他の部分に思わぬ影響が出ることがあります
コードレビューがなければ、間違った修正が反映されるところでした。

対策：コードリーディングを徹底する
変更する前に、影響が出そうな部分を洗い出し、確認することを心がけています。
影響のありそうなファイルを全て確認する必要があるため、時間はかかりますが、後戻りする方が時間も手間もかかります。
もし実装で不明点があれば、早めに質問した方が、労力も時間も短縮できます。
過去のPRを参考にすることでわかることもあります。
vscodeのgitlensを使うと過去のコミットを探ることができます。

https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens

一にコードリーディング、二に質問です。

### 指摘②：コメントで補足する
コードの変更に対してコメントを付けることが重要です。
なぜ変更したかを記載することで、レビューアーの負担を減らすことができます。

対策：コードを変更しながらメモする
レビュー前に、メモした内容をコメントとしてコードに記載するようにしています。
変更が必要だと思った理由と、行った変更点をメモしながらコードを書くように心がけています。
メモすることはかなり重要で、コメントする内容に直結します。
メモ中に間違いに気づくこともあります。
コードの変更を言葉でまとめることで、理由づけされている正しいコードを書けるようになります。

### 指摘③：コメントアウトを適切に
不要なコメントアウトや誤解を招くコメントアウトは避けるようにします。
実装者を逆に混乱させてしまうことになります。

対策：リーダブルコードを読む
変数や関数名だけで意味が伝わるコードを書ければ、コメントを書く必要はなくなり、コードが簡潔になります。
特殊な処理を書いている場合は、実装時の状況を詳しくコメントとして残します。
また、事前に説明が必要そうな場合にも、コメントを残すようにしています。

### 指摘④：変数名、関数名を正しく
変数名や関数名に意味を持たせることで、より伝わりやすい実装ができます。
また、コメントアウトを減らすことで、ファイルがすっきりと整理されます。

対策：リーダブルコードを読む
以下の記事が非常に勉強になりました。
「なんとなく」ではなく、しっかりと説明できる命名が重要です。

https://qiita.com/YutaManaka/items/62dda256bb7ba6c08399

https://zenn.dev/naoki_oshiumi/articles/aad7e1b3719fad

### 指摘⑤：規則性を探す
コード規約に沿ったコーディングを意識することが必要です。
動くだけでは不十分で、規則性のある書き方や命名が求められます。

対策：コードを読む
コード規約がしっかりと定められているプロジェクトでは、コードを読むだけで規則性を簡単に見つけることができます。
間違った規則性は負債になってしまうため、正しい規則性を見つけることが重要です。
関係する全てのファイルを確認する気持ちで、何度もコードを読む必要があります。
コードを読むことで、実装のヒントを得られることもあります。

### 指摘⑥：簡潔に書ける
コードは簡潔で理解しやすいことを心がけるべきです。
既存のコードを活用し、共通化を意識することが重要です。

対策：過去のPRを漁る
過去問で対策するように、過去のPRを確認します。
レビューアーの視点を持つことで、良いコードを書く力が養われると思います。

### 指摘⑦：セルフレビューをする
PRを出す前に一度見直すことで、ミスに気づくことがあります。
とりあえずレビューを依頼するのではなく、完璧に近い状態で依頼するべきです。

対策：セルフレビューを徹底する
セルフレビューを徹底することが大切です。
過去の指摘に該当する部分がないか、再度確認する必要があります。
中途半端に依頼してしまうと、レビューに大きな工数がかかってしまいます。

## まとめ
コードを読み、適切な命名をし、正しいコメントを残すことを意識するべきだと学びました。
コーディングにスピードは求められませんが、その代わりに理解に時間をかけることが求められます。
レビューでの気づきが、エンジニアとしての成長につながると感じています。

## 最後に
最初のうちは、レビューされることに抵抗を感じていましたが、最近ではコードレビューを必要なプロセスとして捉え、なるべく指摘をもらわないようにコードを書くことを意識しています。
レビューされることを意識してコードを書くことで、初めてレビューアーとしてコードの指摘ができるようになると思っています。
ATTiny13Aで遅延スイッチ

私は電気工事士なので廊下の電灯は人感センサーに変えたのですが、その前で電灯を消すと暗がりを歩く事になるので、LEDライトに遅延スイッチを付けたものを作ってみました。

要求仕様はスイッチを押したら30秒くらいの間点灯して、消灯するもとのします。

遅延回路は古式ゆかしい555でも出来ますが、いろいろいじれるようにマイコンを使うことにしました。

マイコンはPlatformIOでビルドできる8ピンのATTiny13Aにします。

千石のジャンク袋に入っていたLEDライトを使いそれが12Vなので、12Vアダプタで給電して、78L05でATTiny13Aの電源を作ります。

![20241214085243276 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/403fb2e1-2751-4f3b-feff-e77b663435a9.jpeg)

回路とコードはだいだい1日でできたのですが、次の日に欲を出して省電力化しようと思いいろいろ調べました。

CPUクロックを128kHzにするといいということで、fuseを焼いたところUSBTinyISPでATTiny13Aが見えなくなりました。

ATTiny13Aの128kHz設定についてはいろいろなところに情報がありますが、大変危険なのでお勧めしません。

私は以前でんし研（ページが無くなってました）さんのATTiny用のリセッターを作ってあったのでどうにか復活できましたが、なんらかのミスがあると高電圧ライターやリセッターがないと使えないチップになります。

今は2Fでコード書いて1Fで焼いてるので効率が悪く、暖かくなったらまたいじりたいと思います。

![IMG_20241214_105915.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8fdafa3b-a87d-7d0e-6d09-19509556f004.jpeg)

```c
#include <avr/sleep.h>

#define LED PB0         // Pin 5
#define RELAY PB4       // Pin 3
#define VOLUME A3       // Pin 2
#define SW PB1          // Pin 6 (INT0)

ISR(INT0_vect)
{
}

void setup()
{
        pinMode(LED,OUTPUT);
        digitalWrite(LED, LOW);
        pinMode(RELAY,OUTPUT);
        digitalWrite(RELAY, LOW);
        pinMode(SW, INPUT_PULLUP);
        GIMSK |= (1 << 6);
        sei();
        set_sleep_mode(SLEEP_MODE_PWR_DOWN);
}
 
void loop()
{
        int vol;

        sleep_mode();

        digitalWrite(LED, HIGH);
        digitalWrite(RELAY, HIGH);
        vol = analogRead(VOLUME);
        delay(vol * 2 + 200);
        digitalWrite(LED, LOW);
        digitalWrite(RELAY, LOW);
}
```

LEDライトを筒に貼ったのは、光が360度の方向に届くようにするためです。

実際に使ってみたところ、蛍光灯のオンオフでsleepが解除してしまう事があります。誤動作なのですが、ちょっと便利です。

逆転の発想でAC電源のノイズを感知して安定的に動作する仕組みが作れてたら面白いと思います。
HSP - module変数の扱い方

hspではこのようにモジュールを書くのがおすすめ。

```hsp:sample_module.hsp

dimtype hogehoge@global,5　//この変数をモジュール内のみで使用する。グローバルでなくてもいいがわかりやすさのために宣言的に@globalで書いてる。
#module sample_module x, y

//初期化関数
#defcfunc make_new_instance int _x, int _y
    newmod hogehoge@global, sample_module, _x, _y
    return stat
#modinit int _x, int _y, local i
    mref i, 2　//これがポイントでこの変数自身の番号が取得できる。
    set_xy i, _x, _y
    return i

//セッタ
#deffunc set_xy int p1, int _x, int _y
    _set_xy hogehoge@global(p1), _x, _y
    return
#modfunc _set_xy int _x, int _y
    x = _x
    y = _y
    return

//ゲッタ
#deffunc get_xy int p1, array a
    _get_xy hogehoge@global(p1), a
    return
#modfunc _get_xy array a
    a = x,y
    return

#global

a = make_new_instance(5,6) //モジュール変数自体が返ってくるのではなく、変数のIDが返ってくる
get_xy a, xy
mes strf("%d,%d",xy, xy.1)

set_xy a, 7,8
get_xy a, xy
mes strf("%d,%d",xy, xy.1)
```


deffunc と modfuncをセットで扱うことで、モジュール変数を番号で管理できる。
関数の定義に一手間かかるが、非常に柔軟。
MicroCMS：microcms-js-sdkを使ってデータをフィルタリング方法

こんばんは。

今日は「MicroCMS：microcms-js-sdkを使ってデータをフィルタリング方法」について説明します。

microcms-js-sdk では、APIリクエスト時にクエリパラメータを指定してデータをフィルタリングすることができます。
これにより、特定の条件に一致するデータを取得することができます。

# 基本的な使い方

まず、`microcms-js-sdk` をインストールして、API クライアントをセットアップします。

```bash
npm install microcms-js-sdk
```

次に、microcms-js-sdkのセットアップを行います。

```javascript
import { createClient } from 'microcms-js-sdk';

// APIクライアントのセットアップ
const client = createClient({
  serviceDomain: 'your-service-domain', // ご自身のサービスのドメイン名
  apiKey: 'your-api-key' // APIキー
});
```

# クエリパラメータを使ったフィルタリング

MicroCMS では、以下のようなフィルタリングオプションを使うことができます。

- filters: 特定のフィールドでフィルタリング（例: filters=field_name[条件]=値）
- limit: 取得するデータの数
- offset: データの開始位置（ページネーション）
- orders: ソート順
- fields: 必要なフィールドを指定（レスポンスを軽量化）

# 例

## 例1: 特定のフィールド値でフィルタリングする

例えば、category フィールドが 'tech' の記事だけを取得する場合:

```javascript
client.get({
  endpoint: 'posts', // エンドポイント名
  queries: {
    filters: 'category[equals]tech'
  }
}).then(response => {
  console.log(response);
}).catch(error => {
  console.error(error);
});
```

ここで、`filters` はフィールドに対する条件を指定します。この場合、`category`フィールドが`'tech'`のデータを取得します。

## 例2: 複数の条件を組み合わせる

複数のフィルタ条件を組み合わせることもできます。たとえば、`category`が`'tech'`で、published フィールドが`true`の記事を取得する場合:

```javascript
client.get({
  endpoint: 'posts',
  queries: {
    filters: 'category[equals]tech&&published[equals]true'
  }
}).then(response => {
  console.log(response);
}).catch(error => {
  console.error(error);
});
```

## 例3: ソートやページネーション

`orders`を使ってソートを行い、`limit`と`offset`を使ってページネーションを実現できます。

例えば、`publishedAt`フィールドで降順にソートし、最初の10件だけ取得する場合:

```javascript
client.get({
  endpoint: 'posts',
  queries: {
    orders: '-publishedAt', // 降順
    limit: 10
  }
}).then(response => {
  console.log(response);
}).catch(error => {
  console.error(error);
});
```

`orders`で`publishedAt`を降順`(-publishedAt)`に設定し、`limit`で取得する件数を指定します。

## 例4: 特定のフィールドだけを取得する

データのレスポンスから、特定のフィールドだけを取得したい場合、fields クエリパラメータを使います。

```javascript
client.get({
  endpoint: 'posts',
  queries: {
    fields: 'id,title' // id と title のみを取得
  }
}).then(response => {
  console.log(response);
}).catch(error => {
  console.error(error);
});
```

`microcms-js-sdk`では、`filters`や`orders`などのクエリパラメータを使用することで、データの取得時に柔軟にフィルタリングやソートが可能です。具体的な要件に合わせて、これらを組み合わせることで、必要なデータを効率的に取得できます。

今日は以上です。

ありがとうございました。
よろしくお願いいたします。
【C言語】シャッフルとソート

## シャッフル
`備考 : 要素をごちゃ混ぜにすること`

### C言語
```C:example.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    int array[5] = { 1, 2, 3, 4, 5 };

	// 乱数の初期化
	srand((unsigned int)time(NULL));

	// 要素をシャッフル
	int length = sizeof(array) / sizeof(array[0]);
	for (int i = 0; i < length; i++)
	{
		int r = rand() % length;
		int tmp = array[i];
		array[i] = array[r];
		array[r] = tmp;
	}

	// シャッフルされた結果を出力
	for (int i = 0; i < length; i++)
	{
		printf("%d番目 : %d\n", i, array[i]);
	}

	return 0;
}
```

### C++
```C++:example.cpp
#include <iostream>
#include <vector>
#include <random>

int main(void)
{
    std::vector<int> v = { 1, 2, 3, 4, 5 };

    // 乱数の初期化(メルセンヌツイスター法)
    std::random_device random_device;
    std::mt19937 mt(random_device());

    // 要素をシャッフル
    std::shuffle(v.begin(), v.end(), mt);

    // シャッフルされた結果を出力
    for (int i : v)
    {
        std::cout << i << std::endl;
    }

    return 0;
}
```

### C#
```C#:example.cs
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> list =
            new List<int>()
            {
                1, 2, 3, 4, 5
            };

        // 乱数の初期化
        Random random = new Random();

        // 要素をシャッフル
        int n = list.Count;
        while (n > 1)
        {
            n--;
            int k = random.Next(n + 1);
            int tmp = list[k];
            list[k] = list[n];
            list[n] = tmp;
        }

        // シャッフルされた結果を出力
        foreach (int i in list)
        {
            Console.WriteLine($"{i}");
        }
    }
}
```

## ソート
`備考 : 要素を基準に則って並び替えること`

### C言語
```C:example.c
#include <stdio.h>

int main(void)
{
	int array[5] = { 5, 4, 2, 1, 3 };

	// 昇順に要素をソート(バブルソート)
	int length = sizeof(array) / sizeof(array[0]);
	for (int i = 0; i < length; i++)
	{
		for (int j = i + 1; j < length; j++)
		{
			if (array[i] > array[j])
			{
				int tmp = array[i];
				array[i] = array[j];
				array[j] = tmp;
			}
		}
	}

	// ソートされた結果を出力
	for (int i = 0; i < length; i++)
	{
		printf("%d番目 : %d\n", i, array[i]);
	}

	return 0;
}
```

### C++
```C++:example.cpp
#include <iostream>
#include <vector>
#include <algorithm>

int main(void)
{
    std::vector<int> v = { 5, 4, 2, 1, 3 };

    // 昇順に要素をソート
    std::sort(v.begin(), v.end());

    // ソートされた結果を出力
    for (int i : v)
    {
        std::cout << i << std::endl;
    }

    return 0;
}
```

### C#
```C#:example.cs
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> list =
            new List<int>()
            {
                5, 4, 2, 1, 3
            };

        // 昇順に要素をソート
        list.Sort();

        // ソートされた結果を出力
        foreach (int i in list)
        {
            Console.WriteLine($"{i}");
        }
    }
}
```
【Laravel】可変長配列の要素に対するTrimStringsミドルウェアの無効化方法

# trim勝手にやってくれて助かる〜！
リクエストパラメータの先頭や末尾に含まれた空白文字を取り除いてくれるTrimStrings。
普段アプリ開発をしている時にはとても便利で助かるmiddlewareですね。

でも **配列の要素を$exceptに指定したはずなのに、改行がtrimされてる！** ってなことがありまして...
その備忘録になります。

# 前提
```php
// dd($request->input('sample'))での出力結果
array:3 [
  0 => "sampleText1"
  1 => "sampleText2"
  2 => "sampleText3"
]
```
以降は、こんな形式のリクエストパラメータが返ってくるという前提で進みます！
（sampleの配列内の要素数は可変）

# $exceptにキー書いたらそれで済む話じゃないの？
もし、返ってくる配列の要素数が固定されているのであれば、$exceptに下記のように指定すればそれで終わりです。
``` php
class TrimStrings extends Middleware
{
    protected $except = [
        'current_password',
        'password',
        'password_confirmation',
        // 追加部分
        'sample.0',
        'sample.1',
        'sample.2',
        // ここまで
    ];
}
```
<br>
でも今回はsampleの要素数が可変なんだよなぁってことで、ワイルドカード使って指定しちゃおうと思ったわけです。

``` php
class TrimStrings extends Middleware
{
    protected $except = [
        'current_password',
        'password',
        'password_confirmation',
        // 追加部分
        'sample.*',
        // ここまで
    ];
}
```

...動かん。
**$exceptでワイルドカードが使えない**ことに初めて気づきました。

# 解決方法
ってことで、**コンストラクタを使って、trimされる前に$exceptを書き換えよう！** と書いたコードがこちらです。
```php
class TrimStrings extends Middleware
{
    public function __construct(Request $request)
    {
        $textList = $request->input('sample');

        if(!empty($textList) && is_array($textList)) {
            foreach ($textList as $index => $text) {
                $this->except[] = 'sample.' . $index;
            }
        }
    }
    
    protected $except = [
        'current_password',
        'password',
        'password_confirmation',
    ];
}
```
foreachで配列のインデックス番号を取得して$exceptに追加することで、改行がtrimされないようになりました！やった！
AIの台頭とflow-based programmingの必要性

## フロー型思考の革新性

Node-REDは、単なる開発ツールではなく、人間の思考様式そのものを拡張する「フロー」という概念を体現しています。ノードとワイヤーによる直感的な接続は、人間の認知プロセスに極めて近い設計哲学を持っています。

### Node-REDの独自性

#### 1. ビジュアル的思考の具現化
 
Node-REDの最大の特徴は、複雑な処理の流れを視覚的かつ直感的に表現できる点です。これは、人間の思考プロセスをそのまま technological な言語に翻訳する、革新的なアプローチと言えます。

- 抽象的な概念を具体的なフローとして可視化
- 非エンジニアでも理解可能な設計言語
- 認知的負荷の劇的な軽減

#### 2. 接続性の哲学

Node-REDは、「接続」そのものを中心に据えたプラットフォームです。各ノードは自律的でありながら、柔軟に相互作用できる点で、未来の知的システムのモデルとなっています。

### AIとビジュアルプログラミングの台頭

近年、Dify、Coze、Makeなどのプラットフォームの急速な台頭は、AIの発展と深く結びついています。

#### AIによるテクノロジーの民主化

AIの登場により、これらのプラットフォームは以下のような革新を実現しています：

- 複雑なAIモデルの抽象化
- 非専門家でも高度なワークフロー設計が可能
- AIコンポーネントの簡単な組み合わせと接続

#### ビジュアルプログラミングの進化

AIの台頭は、プログラミングの概念を根本的に変革しつつあります：

- コード中心からフロー中心のアプローチへ
- 直感的な視覚的インターフェースによる技術の民主化
- 柔軟で動的なワークフロー設計の実現

### AIエコシステムにおける意義

Node-REDは、AIの民主化を実現する上で決定的な役割を果たしつつあります：

- 複雑なAIワークフローを誰もが設計可能
- プログラミングスキルの壁を取り払う
- 個人の創造性を技術的制約から解放

### 未来予測：知的接続の拡張

Node-REDのアーキテクチャは、単なるツールを超えて、以下のような未来を示唆しています：

- 分散型知能システムの基盤
- リアルタイムで進化する柔軟な情報処理
- 人間と機械の共創プラットフォーム

### まとめ：境界を超える知的インフラストラクチャ

Node-REDが体現するフロー型思考は、テクノロジーと人間性の新たな融合点を示しています。それは、複雑性を削減しながら、同時に創造性を最大化する、革新的なアプローチなのです。

技術の未来は、単なる機能の拡張ではなく、人間の思考様式そのものを拡張することにあるのかもしれません。AIとビジュアルプログラミングの進化は、まさにその可能性を私たちに示唆し続けているのです。
Wikipathwaysの白地図に図を投影する

# Wikipathwaysの白地図を有効活用したい 
前回までの記事でリピドミクス用のpathway解析ツールを紹介しました。
前回の記事→https://qiita.com/otakaki/items/8e822bb60f93193852ed

そこで今回はWikipathwaysが提供している白地図に対して図の投影を行うことで、代謝pathway解析ツールとして使用する方法を紹介します。
## 事前準備
Cytoscapeのインストール（https://cytoscape.org/download.html）
R/Phython等の環境（適当な図を作成できればなんでもよい）

## Cytoscape上でwikipathwaysの白地図を開いてみる
Cytoscapeを起動したらページ上部のAppタブからApp storeを開く
検索バーから"Wikipathways"と検索すると以下のページにたどり着ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991110/c1eabeb6-c266-82d0-9070-a760a16cbbe4.png)

僕はすでにインストール済みであるが、初めての場合インストールボタンが表示されるので、インストールする。
Networkタブの左上の検索バーからWikipathwaysのマークを選択し、WP5201を検索する。→Import as pathway
今回はWikipathways上でWP5201というIDで登録されているPhospholipid biosynthesisの白地図を使用する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991110/82bdaf8f-b896-57ad-398c-883a71586ba2.png)
Node Tableにpathという列を追加する。
path列に以下のような文字を追加する。
file:/E:/oka/heatmap_01.svg
heatmap_01.svgはローカルに存在する画像ファイルであり、各ノードに対して載せたい図を指定する。
nodeのPropertiesからImage/Chart PositionのMap.を設定する。
Colum→path
Mapping Type→Passthogh Mapping
その後imageのサイズと位置を調整すると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991110/5514f57d-42a5-1ed7-44ef-e93314b6ab4a.png)


例えば４つのクラスの発現量をz-scoreのヒートマップとして表現するとしたらpathway解析っぽくなりそうですよね。

今回はヒートマップにしましたが、ノードのサイズを変更して、barplotやboxplotを投影してもいいと思います。

PS, 12/16日、文章ちゃんと書き直します。。時間が足りませんでした。。
最近話題の生成AI、プロジェクトでは何が求められる？

# はじめに 
最近、「生成AI」が注目を集めていますよね。2023年には流行語トップ10にもランクインし、業務効率化の救世主として、文章生成ツールやチャットボットが活用され始めています。IT業界にいる方なら、生成AIを絡めたプロジェクトに関わる機会が増えているのではないでしょうか？
私も生成AIを活用したプロジェクトに関わり、ユーザ*とエンジニアの橋渡しをする立場でいろいろと経験しました。その中で、「これはプロジェクトを成功させるうえで欠かせない！」と思ったポイントがいくつか見えてきました。この記事では、それを共有したいと思います。
*ここでいう「ユーザ」は、システムを使うエンドユーザではなく、情シス部門の方々を指しています。
# ユーザの課題：知識のギャップ
生成AIプロジェクトでまず直面するのが、「ユーザ」の知識や経験の不足です。
例えば、情シス部門のユーザにはこんな課題があります：
#### エンドユーザの要件をうまく整理できない 
AIに詳しくないと、「できること」と「できないこと」の線引きがあいまいになり、要件がふわっとしてしまうことがあります。これがプロジェクトの方向性を曖昧にしてしまう原因になることも。
#### 社内要件との調整が難しい
セキュリティや既存システムとの連携など、AIを導入するうえで考慮すべきことがたくさんあります。でも、AI特有の課題（例：モデルのデータ活用範囲やリスク）に詳しくないと、後で「ウチの環境では、このやり方できなかった」というような手戻りが発生してしまいます。
#### UIやUXを具体化しにくい
エンドユーザにとって「使いやすい」と感じられるものを作るには、生成AIの特性を理解しなければいけません。たとえば、「AIにどこまで任せられるか」や「どんな入力を必要とするか」などが想像しにくいと、的外れな設計になることもあります。
### ポイント：知識不足はサポートで補える
ユーザがAIに詳しくないのは当然なので、エンジニアがそのギャップを手助けをすることが重要です。
「まずはどこから手を付けるべきか」を具体的に共有することで、プロジェクトのスムーズな進行が可能になります。
# エンジニアに求められるのは「プロとしての提案力」
次に重要なのが、エンジニアの「プロとしての提案力」です。
単に「できる」「できない」で終わらせるのではなく、選択肢や解決策を提示できるかどうかが、プロジェクトの成否を分けます。
私が実際にエンジニアに助けられた例をいくつか紹介します：
#### 選択肢を提示してくれる
「こういうUIが欲しい」と言われたとき、1つの案だけでなく、「複数の選択肢」を提示してくれると非常に助かります。例えば、「外出先でも使いやすいUI」という要件に対して、デザインの柔軟性や実装の難易度を比較した資料を作ってもらい、最適な案を選ぶことができました。
#### 実績に基づいたアドバイスをくれる
ユーザが「これで本当にうまくいくのかな？」と不安に思うことはよくあります。そんなとき、過去の成功事例や実績を元にアドバイスをしてもらえると、納得感を持って進められます。例えば、「このデータアクセス方式は、以前のプロジェクトで同規模のシステムに導入されて問題なく動いています」という説明があるだけで安心感が全然違います。
### ポイント：リスクを低減し、納得感を与える
エンジニアが選択肢や実績に基づいた提案を行うことで、ユーザは安心して意思決定ができるようになります。この「安心感」はプロジェクト成功に欠かせません。
# コミュニケーションで信頼を築く
最後に、プロジェクトを成功させるうえで欠かせないのが「コミュニケーションスキル」です。
知識やスキルがあっても、それを相手に適切に伝えられなければ成果にはつながりません。
以下は、信頼を築くために有効だった具体例です：
#### 選択肢を提示してくれる
例えば、「生成AIの出力精度を上げる」依頼に対し、ただ実装するだけでなく、「データ前処理を工夫することで精度をさらに高める方法」を提案すると、高いAI知識があることがわかり、「この人に任せておけば安心」と思ってもらえます。
#### 前向きな言葉を使う
難しい要望をそのまま否定せず、「こうすれば実現可能です」と前向きな選択肢を示すだけで、ユーザの不安が軽減されます。たとえば、「このモデルでは難しいですが、少し調整すれば実現できますよ」という言い方です。
#### 難しい話を分かりやすく伝える
技術的な内容を分かりやすい例に置き換えることも大切です。たとえば、「生成AIは、大量のデータから『言葉の使い方』を学び、それを応用して新しい文章を作る仕組みです」という説明をすれば、初めての人でもイメージしやすいですよね。
### ポイント：信頼は言葉で生まれる
コミュニケーションはプロジェクトの潤滑油です。ユーザとの信頼関係が築ければ、プロジェクト全体がスムーズに進行します。
# おわりに
この記事では、生成AIプロジェクトを成功させるために重要なポイントを3つお伝えしました。
• ユーザの知識不足をサポートすること
• エンジニアとして選択肢や実績を活用した提案を行うこと
• 良いコミュニケーションで信頼を築くこと
 
生成AIに限らず、これらはどんなプロジェクトでも役立つ普遍的なポイントです。この記事が、みなさんのプロジェクトの成功に少しでもお役に立てれば幸いです！
# あとがき
ちなみにこの記事も、ベースの文章を考えたうえで生成AIに手直ししてもらいました。
私が指示した内容は
• 構成に矛盾があったり、内容にMECEでないところがないかをチェックしてほしい
• Qiitaの特性にあう文章にしてほしい
などです。
Qiitaの初執筆にあたり非常に役に立ちました。

生成AIは、今や私にとってなくてはならない大事な相棒です。
うまく利用、、、いや、付き合っていきたいなと思います。
enumをメソッドやスコープとして使える

```rb
irb(main):015:0> book = Book.last
  Book Load (0.6ms)  SELECT `books`.* FROM `books` ORDER BY `books`.`id` DESC LIMIT 1
=>
#<Book:0x000000010bf51638
```
# インスタンスの情報を取得、上書きができる
```rb
irb(main):016:0> book.reservation?
=> false
irb(main):017:0> book.now_on_sale?
=> true
irb(main):018:0> book.end_of_print?
=> false
irb(main):019:0> book.reservation!
  TRANSACTION (0.2ms)  SAVEPOINT active_record_1
  Book Update (1.9ms)  UPDATE `books` SET `books`.`updated_at` = '2024-12-13 09:35:51.115253', `books`.`sales_status` = 0 WHERE `books`.`id` = 28
  TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
=> true
irb(main):020:0> book
=>
#<Book:0x000000010bf51638
 id: 28,
 name: "enum Book 10",
 published_on: Thu, 12 Dec 2024,
 price: 10000,
 created_at: Fri, 13 Dec 2024 09:34:16.127029000 UTC +00:00,
 updated_at: Fri, 13 Dec 2024 09:35:51.115253000 UTC +00:00,
 sales_status: "reservation">
 ```
 # メソッドのように呼び出すことができる
 ```rb
irb(main):021:0> book.now_on_sale?
=> false
irb(main):022:0> book.reservation?
=> true
irb(main):023:0> book.sales_status
=> "reservation"
irb(main):024:0> book.sales_status_before_type_cast
=> 0
...
irb(main):031:0> Book.sales_statuses
=> {"reservation"=>0, "now_on_sale"=>1, "end_of_print"=>2}
```

# スコープとしても使える
```rb
irb(main):032:0> Book.now_on_sale
  Book Load (0.8ms)  SELECT `books`.* FROM `books` WHERE `books`.`sales_status` = 1
=>
[#<Book:0x000000010af69248
  id: 25,
  name: "enum Book 7",
  published_on: Thu, 12 Dec 2024,
  price: 7000,
  created_at: Fri, 13 Dec 2024 09:34:16.121826000 UTC +00:00,
  updated_at: Fri, 13 Dec 2024 09:34:16.121826000 UTC +00:00,
  sales_status: "now_on_sale">]
``` 

https://gihyo.jp/book/2020/978-4-297-11462-6
【Laravel Livewire3】dispatchを使ってDOMが更新されてからJSを実行する

## はじめに

LivewireでDOMが更新されてから特定のJSの処理を実行させたい場合、一例としてdispatch使った方法をご紹介します。

また、最新のLivewireバージョン3の情報がまだ少なかったため、残しておこうと思います。

## 環境
- Laravel 10
- PHP 8.1
- Livewire 3

## バージョン2からの変更点

chatGPTにdispatchの使い方を聞いても、「dispatchBrowserEvent」という、Livewireバージョン2のメソッドが出てきてしまいます。

```php
$this->dispatchBrowserEvent('name-updated', ['newName' => $value]);
```

https://laravel-livewire.com/docs/2.x/events#browser


最新のバージョン3では「dispatch」となります。

```php
$this->dispatch('post-created', title: $post->title);
```

https://livewire.laravel.com/docs/events#dispatching-events


上記のように第二引数にデータをセットすることで、イベントと合わせて渡すことが可能です。

:::note info
詳しくは以下のLivewireの公式で確認できます。

https://livewire.laravel.com/docs/upgrading#events

:::

## DOM読み込みにフックする
rendered()というメソッドを使えば、DOMが読み込まれた後に発火する処理を書くことができます。

```
public function rendered($view, $html)
{
    // DOM読み込み後の処理を記述
}
```
https://livewire.laravel.com/docs/lifecycle-hooks#render

Livewireコンポーネントがレンダリングされる前にDOM操作が実行されてしまうとエラーになりため、こうしたメソッドを適切に使う必要があります。

:::note info
Livewire3からは、コンポーネント作成時にデフォルトで書かれているrender()メソッドは必要なくなりました。
※viewをreturnする以外の処理を書く場合には必要です。
:::


## JavaScriptとLivewireの通信
`@script`というディレクティブを使用し、`$wire.on(イベント名)`とすることでリッスンすることができます。

```
@script
<script>
    $wire.on('post-created', () => {
        console.log('hogehoge');
    });
</script>
@endscript
```

先ほどdispatchで渡したデータを受け取って利用することもできます。
オブジェクトとしてタイトルが入っているため、ドット記法で取り出すことができます。

```
@script
<script>
    $wire.on('post-created', (title) => {
        console.log('投稿タイトル：' + title.title);
    });
</script>
@endscript
```

## 組み合わせて使う
これまで紹介した「dispatch」「rendered」「wire.on」を使用して、DOM更新後のJavaScript実行が実現できます。
といっても説明した流れのとおりに書くだけです。

```php:Livewire
public function rendered()
{
    $this->dispatch('page-loaded', title: $this->title);
}
```


```php:Blade
@script
<script>
    $wire.on('post-created', (title) => {
        const target = document.querySelector('.page-title');
        target.innerHTML = title.title;
    });
</script>
@endscript
```

## おわりに
Livewire3については情報がまだ少なく、ググってもなかなか出てこないため[公式](https://livewire.laravel.com/docs/events#dispatching-events)が一番役に立ちました。
便利なライブラリであることは間違いないので、使い倒してわかったことを随時投稿しようと思います。
AWS Macieの機密データ検出結果用のリポジトリ設定でエラーになった時

AWSのコンソールでMacieの設定を行なって、「30日以内に、検出結果保存用のBucketを設定して下さい」と促され、ウィザードに沿って作業を行なったものの、最後の最後で

:::note warn
putClassificationExportConfiguration: The operation can't be performed because you're not authorized to access the S3 bucket, the KMS key, or both.
:::
のエラーになり、困惑したものの無事解決しました

公式にも下のように案内があるのですが、

[Amazon Macie の「putClassificationExportConfiguration」エラーを解決するにはどうすればよいですか?](https://repost.aws/ja/knowledge-center/macie-s3-kms-permission)

指定したKMSキーのポリシーの任意の箇所に下を追加すればエラーにならず、設定出来ました

```policy.json
{
            "Sid": "Allow Macie to use the key",
            "Effect": "Allow",
            "Principal": {
                "Service": "macie.amazonaws.com"
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Encrypt"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "[AWSアカウントID]"
                },
                "ArnLike": {
                    "aws:SourceArn": [
                        "arn:aws:macie2:[リージョン]:[AWSアカウントID]:export-configuration:*",
                        "arn:aws:macie2:[リージョン]:[AWSアカウントID]:classification-job/*"
                    ]
                }
            }
        }
```
AWS の生成 AI RAGチャットを使ってお仕事探しができるか試してみた

この記事は、[Lancers（ランサーズ） Advent Calendar 2024](https://qiita.com/advent-calendar/2024/lancers) の16日目の記事です。

## はじめに
こんにちは！
ランサーズ株式会社の宮本です。
AWSの生成AI系のソリューションを調べていたところ、Amazon Bedrockを使用した面白しろそうなソリューションがあったので、試してみました。
ランサーズのサイトで公開されている求人情報のデータを取り込んで、RAGチャットでお仕事探しができるか試してみましたので、ご紹介させていただきます。

## 使用したソリューション
今回の検証では下記のソリューションを使いました。

https://aws.amazon.com/jp/cdp/genai-chat-app/

AWS上に社内システムを構築していて社内に業務データがあるような企業で、生成AIを使って情報整理したいニーズに応えられそうなソリューションです。

下記にてソースコードやデプロイの方法などがまとまっています。

https://github.com/aws-samples/generative-ai-use-cases-jp

## デプロイ方法について
基本的には上記 Github の中で紹介されているワークショップの手順でデプロイできました。

https://catalog.workshops.aws/generative-ai-use-cases-jp/ja-JP

１から始めて、同期するデータの量やS3上にデータがあるかにもよると思いますが、大体1時間程度あればデプロイが完了してRAGチャットを使用し始めることができました。


デプロイ時のいくつかのポイントとして、下記の点をあげておきます。
・Amazon Kendra はお高いので Amazon Bedrock の Knowledge Base を選択
・CloudFormation では Amazon Kendra のRAGチャットしか使用できなそうだったので、CDKでデプロイした
・Knowledge Baseを使いたかったので、「2-b.3-b. Knowledge Base の手順」の設定をした
・「3. RAG 用データの追加」で S3 ではなく、プレビュー版の Web Crawler を設定した

３点目の Web Crawlerの設定については、Amazon Bedrock のナレッジベースに新規でデータソースを追加して、データソースに Web Crawlerを設定しました。
![スクリーンショット 2024-12-12 15.15.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942090/ac477103-9071-353f-ea20-e0c05d9b0c64.png)

Web Crawler 選択後、ソース URLを指定できるので、「[https://lancersagent.com/project/](https://lancersagent.com/project/)」を指定して、ランサーズエージェントのサービスで公開されている案件を対象にクロールするように設定しました。

データソース追加後、同期を行うとクロールを開始してサイトに公開している情報を自動で取得し、同期が完了したら、RAGチャットを使用する準備の完了です。

## RAGチャットでのお仕事探し

実際にRAGチャットでお仕事探しをしてみましたが、なんかそれっぽい回答を出してくれています。

![スクリーンショット 2024-12-12 14.43.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942090/726d0cd5-73be-9cea-08a7-3fe461d70ed4.png)

回答の最後に、ソースとなっているページのリンクが出力されるのですが、２番目の案件に下記のページが出力されていました。

![スクリーンショット 2024-12-12 14.44.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942090/590ee5e5-ad61-4961-4eac-8140270dae5f.png)

ちょっと上手く出力された例だけの紹介にしておきますが、プロンプトの工夫次第では、大まかにどんな案件があるか探すような時に使えそうな感じでした。

## 終わりに
今回試したソリューションでは、S3のデータソースも使用できるため、S3上に業務データがある場合は、比較的容易にRAGチャットを使用して欲しい業務データへアクセスすることができます。

また、今回私が試したように、WEB上で公開されているデータを対象にRAGチャットで必要なデータを探すこともできます。

今回は調査しませんでしたが、プロンプトエンジニアリングをもう少し勉強すれば、精度高く欲しいデータにアクセスできそうな感触でした。

AWSの生成AIソリューションに対するプロンプトエンジニアリングについては、下記のドキュメントにもまとまっているので、こちらも勉強した上で今後も試してみたいと思います。

https://aws.amazon.com/jp/what-is/prompt-engineering/

生成AIも身近になってきており、業務での活用も求められるシーンが急激に増えてきています。
今回検証したソリューションは、必要な技術要素が比較的少ないので、色々な方に今回紹介したソリューションをお試しいただければ幸いです。

Lancers では、一緒に働けるメンバーを募集しています！
https://recruit.jobcan.jp/lancers01/list/all/all
いまさら jQuery-ui を npm + vite で導入

## jquery-ui datepicker が必要になった

jQuery 自体はまだ終わってないと思うけど、jqeury-ui はメンテナンスされず終わってるらしい。Datepicker なんて Chrome 等の type="date" にまかしても十分だし、日付範囲指定なら datarangepicker とか素晴らしいライブラリが存在している。

今回、新たなサイトの構築となったが、同じクライアントに前回納品したプロジェクトと UI を揃えるという課題のため、jquery-ui datapicker が必要になった。

### せめて npm + vite で導入したい

前回納品（自分とは別担当）と同様に CDN で読み込まさればよいのだが、せっかくなので npm でインストールして vite で組み込むことにした。

しかーし、select2 も datepicker もエラー出まくりで動作しなかった！！

```js
import $ from 'jquery'
window.$ = $;
window.jQuery = $;

import 'select2/dist/js/select2.min.js';
import 'select2/dist/css/select2.min.css';

import 'jquery-ui/dist/jquery-ui';
import 'jquery-ui/dist/themes/base/jquery-ui.min.css';
```

ChatGPT 先生に解決策を尋ねても、堂々巡りなトンチンカンな回答しか得ることができず、無駄な日数を数えるばかりだ。
こういう場合はさっさとAIは諦めて、Google先生に頼ったほうが懸命。

## select2

最初に解決策が判明したのは select2 で、日本語のサイトに解決策が載っていた。

https://zenn.dev/loc_m1/articles/bec8953df9ca77

記載の通り、次で動くようになった。

```js
import select2 from 'select2';
select2($);
```
## jquery-ui

"jquery-ui npm vite" でググって出てきた最初のページが英語のやりとりで、解決したんだかしてないんだかよくわからず、当初は読み飛ばしてしまった。

https://github.com/vitejs/vite/discussions/9415

だがこのページ以外にそれらしい情報は存在せず、ChatGPTは相変わらずのトンチンカンである。あらためてやりとりを読み直してトライすることにした。

結果は次で動作した。

```js
import $ from 'jquery';
window.$ = $;
window.jQuery = $;

await import('jquery-ui/dist/jquery-ui');
import 'jquery-ui/dist/themes/base/jquery-ui.min.css';
```

ずっと悩んでいたのは次のエラーで、importの書き順に関係なく jQuery よりも jquery-ui のほうが先に読み込まれていた。ChatGPT は組み込みの順番がおかしいので記述を見直せと繰り返すばかりだったのだが……

await で順番待ちすることで解決したのであった。


>Uncaught TypeError: Cannot read properties of undefined (reading 'ui')


AI がこのページをクロールして学習してくれることを少しばかり期待。

----
追記

`npm run dev` では問題なかったが、`npm run build` でエラーとなってしまった。

>Top-level await is not available in the configured target environment ("chrome87", "edge88", "es2020", "firefox78", "safari14" + 2 overrides)

vite.config.js で target を特に指定していなかったため、古いブラウザで `Top-levle await` はサポートしていないよ、ということらしい。

await を関数内で使用するように次で回避した。

```js
(async () => {
  await import('jquery-ui/dist/jquery-ui');
  import('jquery-ui/dist/themes/base/jquery-ui.min.css');
})();
```
【Django】エラー「Create table/tablespace 'xxx' failed, as disk is full」の原因と解決方法

# 概要
Djangoでmigrationを実施したら以下のエラーに。

> django.db.utils.OperationalError: (3675, "Create table/tablespace 'xxx' failed, as disk is full") Sentry is attempting to send 2 pending events

解決方法を紹介します。

# 原因・解決方法
ディスク容量が不足しているためにテーブルの作成が失敗した、ということらしい。このエラーは初めてでした。

不要なDockerイメージやコンテナを削除すればいいかと思い、`docker system prune`を実施すると今度は以下のエラー。

> Error response from daemon: Bad response from Docker engine

ではビルドキャッシュがディスクスペースを消費しているのか？と思い、`docker builder prune`を実施すると、無事に18GB削除完了。

これでマイグレーション時にエラーが出なくなりました。
解決！
とりあえずやる！UnrealEngine学習のすゝめ

この記事は[K3 Advent Calendar2024](https://adventar.org/calendars/10132) の14日目です。
Q:「UEを学ぶときはどうしたらいいですか？いい書籍やサイトありますか？」
A:「**いいからやれ。**」

# ⓪UEのインストール
ごちゃごちゃいう前にまずはインストールしましょう。
https://www.unrealengine.com/ja/download
↑のURLみればわかります。
バージョンは最新入れれば間違いありません。悩む必要ナシ！

# ①チュートリアルやろう
ネット上の無料のチュートリアル動画とか記事みてそれやりましょう。
本当になんでもいいです。変なこと考える必要はありません。ただやりましょう。
最低限の操作方法はこれで身に付きます。

# ②作りたいゲーム作ろう
作りたいゲームがある人はそれ作りましょう。今すぐ。

# ②好きなゲーム再現しよう
「作りたいゲームとかパッと思いつかねえよ！」
わかります。そういう場合は自分の好きなゲームを一つ思い浮かべましょう。
そしたらそのゲームの一部分を自ら再現してみましょう。今すぐ。

# いやいやいや…
Q：チュートリアルやったぐらいじゃ知識が足りないでしょ！
A：知識は事前に得る物じゃなく作りながら得るものです。
UEでの開発はミスったら死ぬようなものでもなく、費用がかかるものでもないです。
見切り発車やってなんぼなのでとにかく始めましょう。
わからないことはその都度調べればいいんです。

Q：事前にしっかり勉強して効率よくやりたいんだけど
A：事前にしっかり勉強がたぶん効率よくないです
スポーツを始めるときに、ルールブック全部暗記してからやりますか？
楽器を始めるときに、まず最初に音楽理論をマスターしますか？
まずはやってみますよね？
その分野を極めたいと思ったら、どこかで体系的な勉強は必要にはなるでしょう。
でも、それは最初じゃありません。
いったんやってみて、勉強が必要だと思った時にすればよいのです。

# 調べても欲しい情報が無いよ…
まずは検索ワードの入れ方を工夫しましょう。色々な言い換えで検索してみます。
ダイレクトな情報が無いサイトでも、関連するキーワードが見つかることがあります。
自分がまだ知らないだけのキーワードがあった場合などはそれで調べなおすと一気に解決したりもします。
日本語のサイトに情報がなければ英語です。公式フォーラムとか、スタックオーバーフローとか海外掲示板は最強です。死ぬほど情報あります。
英語が苦手？魔法の言葉を教えてあげましょう。**DeepL**、**ChatGPT**
英語でも無い？よーしこれで君も深淵の仲間入りだ。
UEはオープンソースです。エンジンコード読めばだいたいわかる！
…と冗談をいいましたが、近年はUEもネット上に情報が充実してきています。
初心者に必要な情報でネットに無いものはほぼありません！頑張って探してみましょう！

# まとめ
勉強だ！事前知識だ！とか言う前にとにかくUE触ってみましょう！
本当に色々できて楽しいですよ！
【Laravel】－初学者向け　マイグレーションについて

今回は、初学者向けでマイグレーションについて、記事を書いていこうと思います。

# Laravelのマイグレーションとは？
Laravelの**マイグレーション** とは？
⇒DBテーブルの作成や編集、削除などの履歴管理をするものがLaravelには備わっています。

# ファイルの作成
ファイルの作成するには、コマンドプロンプトを開き、下記のコマンドをたたきます。

```
php artisan make:migration create_「テーブル名」_table
```
■例
```
php artisan make:migration create_tests_table
```
**make:migration** …複数で作成する場合、migrationとなる
**tests**  …ファイル名も「tests」複数形になる

下記パスにファイルが生成されます。
```
databases/migrations 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929458/b97ba804-29af-fa12-1e1e-c8350a5c2047.png)

※マイグレーションファイルは、履歴管理の仕組みもあり、年月日時間の情報もファイルの中に記載されております。


# ファイルの編集

下記がファイルの中身の詳細となります。
「up」の中身にカラムを記載することができます。
例えば、カラム名「text」を追加したいときに「$table->string(`text`);」のコードを追記することで、テーブルにカラムを追加することができます。

■ファイルの中身（修正前）
```
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};
```

■ファイルの中身（修正後）
```
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('text');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};
```

処理を追加した後に、コマンドプロンプトに戻り、下記のコマンドをたたきます。
```
php artisan migrate
```
■結果
Xamppを起動させ、phpMyAdminから確認すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929458/e43003c0-b720-8631-10f6-51f13133ff99.png)
「text」がカラムとして追加されています。

# テーブルの削除と再生成
下記のコマンドはテーブルのすべてを削除するコマンドです。
※※削除コマンドを使用する際は必ず注意しましょう。


* テーブルを全て削除し再生成 
```
php artisan migrate:fresh
``` 

* ロールバックして再生成
```
php artisan migrate:refresh
```

# モデル・マイグレーションの同時作成
コマンドプロントを開き、
オプションで「-m」をつけることでモデルと「ContactForm」というマイグレーションも同時作成がされます。
```
php artisan make:model ContactForm -m
```

■結果
下記パスに2つのファイルが生成されます。
・パス
```
app/Models/ContactForm
```
・パス
```
app/database/migrations
```
・ファイル名：xxx_create_contact_forms.php
```
 public function up() 
    {   Schema::create('contact_forms', function (Blueprint $table) { 
            $table->id();  
            $table->timestamps(); }); 
```

# まとめ
Laravelのマイグレーションには、いろんな機能が備わっており、データベースの操作やカラムの追加、削除などが可能です。
削除コマンドや一括削除コマンドを使うには、必ず注意が必要ですので、たたく前は気を付けましょう。
未経験からフルリモートのエンジニアになってもうすぐ1年なのでフルリモ向いてる人を考えてみる

# 未経験からエンジニアで、初めからフルリモって実際どう？
おかげさまで、未経験からエンジニアに転職してもうすぐ1年が経ちます。
今年お世話になった方々、改めて有難うございました。

https://qiita.com/MIDO-ruby7/items/18ff8d14878a868b2005

さてさて、私は転職当初からフルリモートで働いています。
フルリモで働いていることを伝えると、転職活動中の方や、内定先がフルリモートに決まった未経験エンジニアから「やっていけるでしょうか」「どんな人が向いてますか」と質問をもらうことも多いです。

そこで、今回は良く頂く質問に対して個人的見解をまとめてみようと思います。
つまりポエムです。


## 未経験者がフルリモートでエンジニアをやるのは可能ですか？

可能です。なぜなら、私も実際に未経験からフルリモートでエンジニアをやれているからです。

また、コロナ禍に就職されたスクールの先輩方は、皆さんフルリモートでエンジニア人生をスタートされています。コロナ禍終了後、出社されている方もいれば、そのままフルリモートで地方から仕事をされている方も多いです。

そういった方々にお話を伺うと、もちろん先輩に質問するタイミングが難しい、などの声はありましたが、コロナどうこうは関係なく、今から未経験で入るとしても同じように働けるだろうと言うお声が多かったです。

可能かどうかだけで言えば、可能です。

## 未経験者がフルリモートでエンジニアをやるのはやめた方がいいですか？

これは、2つの観点があります。
1. あなたが、フルリモートに向いている人か
2. あなたの所属する企業が、フルリモートに向いているか

私が企業について語るには、根拠や知識の足りない話になりそうなので、今回はどんな人がフルリモートに向いているかを考えてみたいと思います。

## 1.フルリモートに向いている人
### 報連相ができる
当たり前だと言われるかもしれませんが、実際にフルリモで働いていて、これが絶対条件だと個人的には思います。

出社する場合でも関係なく必要な能力ではありますが、他人の目が無いリモートでこれが無い場合、マネジメントやメンターの介入が遅れます。また、リモートはコミュニケーションの機会もリアルより大幅に減るため、一度すれ違いが起こると大きな問題やチーム内に支障が起こりやすいです。

例えば弊社の場合、業務について報告と相談をするのは朝10時から30分程度のミーティングだけです。全員のissueの進捗状況や困っていることが無いかを確認します。

それ以外は基本的に一人で実装を進めます。

さて、その間に困ったこと・詰まっていることがあったとき、あなたはどんな行動を取るでしょうか。
もしくは、自分の実装によるインシデントを発見したときはどうでしょうか。
自分ではなく、メンバーが困っていたらどうでしょうか。
YouTubeが見たくなったときはどうでしょうか。
他のメンバーはどうしているのでしょうか。
何を誰に報連相すれば良いのでしょうか。
周りを見渡しても誰もいません。唯一、SlackやGoogleカレンダーでメンバーの今日の予定を察することができます。

あなたは家に一人のとき、どんな行動を取って、何を優先するでしょうか。

......なんだか、不安になりませんでしたか？

今あなたが感じた「なんだか不安」という不安感は、働き始めたあなたに対してのメンバーやマネージャーの最初の評価です。

この不安感の原因には、業務についてよく知らない、自分の力量が分からない、などさまざまな理由があります。しかし、一番根本的な原因となる問題は、あなたとメンバーがお互いについてを良く知らないことです。

未経験から転職して働き始めたとき、あなたやメンバーが**どんな人で、何を考えて、どう行動するのか**を理解することが、最初のハードルになります。

リモートは、この相手との信頼関係を築くコミュニケーションの機会が圧倒的に少ないです。人間は、顔を見て今日の天気の話をしただけでも相手への緊張感は下がり理解度が上がります。

「報連相ができる」と一言で言いましたが、リモートの場合は、この機会を自ら作り、適切にコミュニケーションや会話をする必要があるのです。自分の考えをきちんと伝え、素直に困ったこと・嬉しかったこと・やりたいことなどを開示し、自分からコミュニケーションを取れる人が「報連相ができる」人です。

「サポートは必要だが、この人なら放っておいても安心」とメンバーから信頼される努力ができない人は、リモートに向いてないと思います。

新卒がフルリモートに向かないのは、この周囲の安心感を得るのがどうしても最初は難しいこと、仕事上のやり取りが身につく前にフルリモートをする事で失敗を相談できなかったり孤立するからです。

逆に言えば、新卒でもバイトやインターン、研究室、部活などの経験からこれが備わっている人は最初からフルリモートできるのではないかなと思います。

前職が営業だった経験から、転職など新しい集団に入った最初の1ヶ月にどんなことすれば良いのかをまとめた記事があります(タイトルはRUNTEQについてですがその中で"組織で必要とされる人材になる行動指針"について考えた記事です)。

お互いについてを良く知らないことがなぜハードルになるのか、具体的にどんな行動をすれば良いのか参考に知りたい方は覗いてみてください。

https://note.com/mintgreen_mido/n/n7a78982b9840#5256EBCD-5FCC-4742-8BA6-29661839B18B


### 自分で自分をコントロールできる
これも、社会人として必要な力かと思いますがフルリモートの場合はもっと切実に健康面でこれが必要だと実感しています。

一日中家にいるので、自分の健康状態・精神状態を把握しづらいのです。

人と話していてイライラする
今日はなんだか歩くと息切れする
前向きな気持ちになれない

日常の中で、些細な身体のサインがあるかと思いますが外に出たり人と接する時間が少ないのでこのサインを見過ごしがちです。

また、外に出ないことで、だんだんと慢性的な疲労感や疲れを感じ始めます。やばい。

さらに言えば、外に出ていればスタバでマックしたり、マクドでマックしたり、色々と気分転換の機会がありますが、フルリモートだとその機会も意識的に取らないといけません。

- 自分がどんな状態の時に疲れているのか知っている
- 自分が疲れている時の気分転換の方法を知っている

かどうかは非常に重要だと思いました。多分、これが下手だと長期的に病むか・死にます。私は身の危険を感じております。

## 余談
最後にする話ではないのですが、フルリモートで働いてみて見つけた健康面のメリットは**自由に気兼ねなくトイレに行けるのでお通じが良くなったこと**です。便秘の人にはおすすめです。共感してくれる人がいると嬉しいです。

フルリモ向いてる要素は、他にも色々あると思いますが、私が実感しているフルリモート1年目の感想は、特に上記2点かなと思います。

皆さんが思う、フルリモートに向いている資質があればぜひコメントで教えてください。