OmniAICreator/Qiita-1.07M huggingface dataset:
ローカルからCloudflareのWorkersに接続する環境を作る手順

Windows11でWranglerからCloudflareのWorkersに接続する環境を作っていきます。

クライアントにWranglerをインストールするには、まずNode.jsがインストールされていることが前提です。
**※この記事はWindows11を使っている人に向けたものです。**

## Node.jsのインストール
Node.jsが入っていなければ、公式サイトから最新版をインストールしてください。

https://nodejs.org/

:::note
**※Node.jsとは**
Node.jsはJavaScriptの実行環境の一つで、JavaScriptをサーバーサイドでも実行できるようにするためのもの。今回はクライアント開発環境のWEBサーバ、APIサーバとして活用することを考えています。
:::

### インストールの確認
PowerShellを起動して次のコマンドを入力。正しくインストールされているか確認します。エラーメッセージが出ずに数字が出てくれば正常にインストールできています。

~~~bash
node -v
npm -v
~~~

### npm -v でエラーが出たとき
私の環境では次のメッセージが出ました。
~~~bash
+ CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
~~~

これはスクリプトの実行を制御する「実行ポリシー」が設定されているためです。このポリシーにより、未署名のスクリプトやインストールされたモジュールの実行が制限されていました。

### 現在のポリシーの確認方法
まず次のコマンドで現在のポリシーを確認します。
~~~bash
Get-ExecutionPolicy
~~~
次のような結果が表示されるはずです。
<dl>
  <dt>Restricted:</dt>
  <dd>スクリプトの実行が禁止されています（デフォルト設定）</dd>
  <dt>RemoteSigned:</dt>
  <dd>ローカルスクリプトは実行可能。リモートからダウンロードしたスクリプトは署名が必要</dd>
</dl>

私の環境では <strong>Restricted</strong> でしたので権限を変更しました。

### 一時的な権限を与える
次のコマンドで一時的な権限を与えます。
~~~bash
Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned
~~~
これで`npm`が実行できるようになるので、あらためて確認します。
~~~bash
npm -v
~~~
エラーメッセージなく数字が表示されれば問題ありません。

## Wranglerのインストール
次のコマンドを実行し、Wranglerをインストールします。
~~~bash
npm install -g wrangler
~~~

Wranglerがインストールされているか確認します。
~~~bash
wrangler -v
~~~
数字が表示されればインストール完了です。

## WranglerでCloudflareへログイン
次のコマンドを実行するとブラウザが開き、Cloudflareアカウントへの接続許可を求められます。
~~~bash
wrangler login
~~~
![Cloudflareへの接続許可.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949518/133e0856-b73c-ba6f-9ad2-353d9daa21a3.png)

`Allow`ボタンを押して次に進みます。下の画面が出たら接続完了です。

![Cloudflareへの接続許可2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949518/a706a313-c9cb-8539-157e-ed85405d270e.png)

## Cloudflare Workersプロジェクトを作成
どんなことでもまず最初に **Hello World** が表示されるプロジェクトを作って試していきます。

~~~bash
wrangler init my-worker
cd my-worker
~~~
**my-worker**はプロジェクト名です。任意でつけてください。

実行後プロジェクトディレクトリが作成され、必要なファイル（wrangler.tomlなど）が生成されます。

### ローカル環境でテスト
プロジェクトのディレクトリへ移動したら、次のコマンドを実行します。
~~~
wrangler dev
~~~
次のような画面が出て、ローカルでテストが可能になります。
![実行１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949518/63007b07-bd34-bba6-d451-541c078c78c1.png)

### 更新内容をデプロイ
次のコマンドを実行するとプロジェクトがデプロイされ、公開URLで参照できるようになります。
~~~
wrangler publish
~~~

***
ここまで来たらローカルでのテスト環境が整いましたので、プロジェクトを構築していきましょう。
起業するならElixirシリーズSTEP11. 戦略を作れ

## 持続可能な成長のための戦略立案入門

**なぜ今、戦略にESGとSDGsが必要なのか？**

起業時の戦略立案というと、多くの方は「収益計画」「マーケティング戦略」「資金計画」などを思い浮かべるでしょう。もちろんこれらは重要な要素ですが、今日の経営環境では、それだけでは十分とは言えません。

### ESGとSDGsって何？
まずは基本的な概念から説明しましょう。

**SDGs（持続可能な開発目標）とは**

* 2015年に国連で採択された、2030年までに達成を目指す17の国際目標
例えば「貧困をなくそう」「質の高い教育をみんなに」「気候変動に具体的な対策を」など
分かりやすく言えば「より良い世界をつくるための、みんなの目標」

**ESG（環境・社会・ガバナンス）とは**

企業の非財務面での評価基準
* Environment（環境）：環境保護や気候変動対策
* Social（社会）：人権、労働環境、地域貢献
* Governance（企業統治）：経営の透明性、コンプライアンス

### 「うちは小さな会社だから関係ない」は危険な考え方
「SDGsやESGは大企業の話で、起業したばかりの小さな会社には関係ない」と思われるかもしれません。しかし、これは今や危険な考え方です。その理由を見ていきましょう。
1. 取引先からの要請

大手企業がSDGsやESGへの取り組みを重視
取引先の選定基準に含まれることが増加
対応していないと取引機会を失うリスク

2. 人材採用・定着への影響

若い世代は社会貢献に高い関心
企業選びの重要な判断基準に
優秀な人材確保のカギに

3. 資金調達への影響

銀行の融資判断基準にESGの要素が増加
投資家もESGを重視する傾向
将来の資金調達に影響を与える可能性

**起業初期からの取り組み方**

Step 1: 自社との関連性を見つける

**17の目標から関連するものを選ぶ**
* 自社のビジネスに近い目標を探す
* 無理なく取り組める項目を選定
* 段階的な実施計画を立てる

**具体的なアクションに落とし込む**
* ペーパーレス化の推進
* 残業時間の削減
* 地域貢献活動の実施

Step 2: ビジネスモデルへの組み込み

**本業との統合**
* 環境配慮型の商品開発
* 社会課題解決型のサービス提供
* 持続可能な調達方針の策定

**コスト削減との両立**
* 省エネ機器の導入による電気代削減
* テレワーク導入によるオフィスコスト削減
* 業務効率化による労働時間削減

Step 3: 情報発信

**取り組みの見える化**
* ウェブサイトでの情報公開
* SNSでの発信
* 採用情報への反映

**ステークホルダーとの対話**

* 従業員との定期的な対話
* 顧客からのフィードバック収集
* 地域社会との交流

## ElixirでPAY.JPのライブラリ作成シリーズ⑦
さて、ようやっとシリーズ⑥までは別のラインナップで書いてきましたが、今回からこちらにお引越しです。

課金システムを開発する際に重要なのがまずは、課金の流れ、決済の流れなど課金にまつわる考え方を抑える必要があります。

どの課金システムもおよそ、検討しなければいけない要素は同じですが、サービス毎に仕様が違います。
私自身も、簡単なCheckoutの課金部分のみをSqureで実装してすぐにお客様のビジネスモデル上、決済が通らずにStripeの実装をするという２度手間な案件を担当した記憶があり、たまたま２つの課金システムを連続で作る事をしたのですが、考え方の違いにより仕様がこうも変わるのね。と感じたのも記憶に新しいです。

そこで、本格的な開発に入る前、PAY.JPの仕様を確認しておきましょう。

https://pay.jp/docs/

日本語で丁寧に書かれているのでだいぶ助かります。本当に、、、

さて、ドキュメントを読み始め、真っ先に書かれているのは以下の内容です。

> 事業者のみなさまがクレジットカード情報を直接扱わなくても済むように、入力されたカード情報をトークンに置き換えて管理できる仕組みを提供しています。

この手の課金システムを利用するベネフィットはまさにこれにつきると思います。

**クレジットカード情報を直接扱わなくて良い。**

これにより、セキュリティ面、運用面でのコストを大幅に削減できる為、ビジネス面においても大きな利点があります。

### セキュリティ面での利点

事業者がクレジットカード番号などの機密情報を直接保持する必要がないため、情報漏洩のリスクを大幅に低減できます
PCI DSSなどのセキュリティ基準への準拠負担を軽減できます
トークンは元のカード情報に戻せないため、仮に漏洩しても被害を最小限に抑えられます

### 運用面での利点

カード情報の保管に関する厳格な管理体制が不要となり、運用コストを削減できます
システム監査やセキュリティ監査の範囲・工数を削減できます
定期的な支払いや継続課金の管理が容易になります

### ビジネス面での利点

セキュリティ対策の負担が減ることで、本来のビジネスに注力できます
顧客に安全な決済環境を提供できることで、信頼性が向上します
カード情報を持たないことでリスク要因が減り、事業継続性が向上します

### 開発面での利点

決済処理の実装が簡素化され、開発工数を削減できます
セキュリティ対策の実装負担が軽減されます
標準的なAPIを利用することで、安全な決済機能を容易に組み込めます

次回は、仕様をさらに読み進めていきます。
インターン学生をドローン操縦者に仕立て上げたい

どの業界でも人手不足になる時代
人口減少は深刻な問題といいつつ
人が少ないのは仕方ないよねぇ
急に増えるもんじゃないし

現役世代としては、仕事の内容を知ってもらって
自発的に選ぶための情報を出しておくということが大事なのかなと思います。

といいつつも
「やってみなければわからない」っていうのがドローンの操縦
テレビの映像で当たり前となっている中でも
意外と10代、20代の人にドローンを見たことがあるかと質問をすると
「ある」と答える人は少数だったりします。

今回は、神戸学院大学の学生の方が測量の会社をインターンシップとして、
職業体験してもらいました。

DroneBirdでは、測量で行う手法の１つで数値空中写真測量という方法を使うわけですが
他にもLiDar測量（レーザー測量）と言った方法もあります。
被災地の状況を把握する目的という空撮ですので、地図に重ねられる写真を作ると言った作業が求められます。

インターンの学生さんには、オペレーションを中心として、
「ドローンって楽しい」に到達すれば、成功ではないかと。
趣味が写真撮影（携帯で）という程度ですので、
その辺は夢が膨らむことで良いんではないかですね。
![456687176_8663315307044641_8139040268660848483_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322439/8cb600a4-5b8b-82e2-0fee-b4d7b1596261.jpeg)

-許可申請
-離陸前点検
-離陸中の点検
-着陸
-ホバーリング
-前後左右移動
-ラダー操作
-前後左右移動による円移動
-円移動
-8地の字
-風景の撮影
-自撮り

というメニューをこなしました

![456772801_8663315543711284_3037447051908638328_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322439/0f860532-32cb-37c7-5a81-5c978622f321.jpeg)
自分の携帯を使ったモデリング
ドローンの撮影の基本はまず地上から
ということで、宝塚歌劇の銅像をいろいろな角度から撮影

「あの子、写真バシャバシャ撮ってる...」
的な感じですが、モデリングの練習ってわかる人がいないので
恥ずかしい感じがあったかもと横で監督していました。

結局感想的に
「楽しかった」
とのことでしたので、目標は達成と思いたいところ
近い将来に自分の職業を選ぶ際の一助になりば嬉しい。
愛着なし開発手法

## 始めに

お久しぶりです、るんるんです。

今回は、「プロジェクトに愛着が湧かない時にどうやって開発に取り組むか？」をテーマに、私の実体験を元に考察します。

いいね貰えると嬉しいです！🥰

こちらにも様々な記事を公開しています。ぜひご覧ください！！

https://runtech-blog.netlify.app/


## 実体験紹介

### 憧れの新規開発だったはずが…
私が担当したのは、入社前から存在していたプロトタイプ付きの新規プロジェクトでした。当初は「新規開発に関われるなんて！」と胸を高鳴らせていましたが、次第にその熱意は冷めていきました。

原因は明確で、**愛着が湧かなかった**からです。

プロジェクトの構想はすでに固まっており、そこに私のアイデアや工夫が介入する余地はほぼありませんでした。「ものづくりをしている」というより、**完成された設計図をなぞる作業**のように感じられたのです。

さらに、完成までの道のりが長すぎて、「これが完成したら愛着が湧くのかも」という希望すらもかき消されていきました。

(実はここら辺について[もっと深く書いた記事](https://runtech-blog.netlify.app/mind-say-create-thing/) があるので、そちらもぜひ...)

---

### どのように取り組んだのか？
![no-love-manpower.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518711/aa09768a-8748-6b8d-f010-c0be8be340d4.jpeg)


正直、厳しい状況でした。以下が当時の状況です。

- 指示通りにAPIを開発し、レビューを受けるだけの**単純作業**。
- 新しい技術を触れる機会はあったものの、時間との戦いで技術を「楽しむ」余裕がない。
- 「やらされている感」がずっとつきまとっていました。

とはいえ、少しでもポジティブに取り組もうといくつかの工夫を試しました。

#### 工夫1: 「新規開発だ！」と言い聞かせる
「自分は憧れの新規開発をしているんだ！」と自分に言い聞かせてみました。しかし、これにはあまり効果がありませんでした。
**“新規開発”というだけでは、愛着を補えない**ことを痛感しました。

#### 工夫2: 技術習得の場として捉える
「このプロジェクトを、スキルアップの機会としよう」と考えました。実際に、新しい技術に触れることで得られるものも多く、一定のモチベーションを保つことができました。
ただし、それでも「作業感」が拭えず、どこか虚しさが残りました。


## 愛着なし開発手法を考える

愛着が薄い状態でも乗り越えるための手法を考えました。


### 自分を変えてみる

#### 捉え方を変える
「完成したら多くの人に使われる」「自分のコードが社会に影響を与える」といった視点で考えると、少しはモチベーションが変わります。また、**短期的な成果や達成感を意識する**のも効果的です。

例:
- 「1週間で何件レビューを通せるか」
- 「特定の機能を美しく実装する」

#### 取り組み方を変える
具体的な目標を設定して挑戦するのも一つの手です。例えば、「この技術でベストプラクティスを実践する」や「学んだ知識をブログにまとめる」など、**自分の学びを見える化**することで、作業感を軽減できます。

---

### プロジェクトを変えてみる

#### 自分の色を主張する
プロジェクトに対して意見を提案してみるのは重要です。細かい部分でも、自分の提案が採用されると、プロジェクトに対する愛着が生まれることがあります。

#### 全体を俯瞰して「リフレーミング」する
仮に大胆な変更が難しくても、プロジェクトの一部を切り出して、**個人の技術的挑戦**や**改善テーマ**にすることで、自分の「やる意味」を生み出すことが可能です。

---

### その他の手法

#### 周囲とのコミュニケーションを増やす
同僚やチームメンバーと意見交換を積極的に行い、プロジェクトの背景や目的を再確認する。新しい視点を得ることで、やりがいや愛着が生まれることがあります。

#### 自分ルールを作る
「この機能を最適化してみる」や「特定の技術を試してみる」など、自分だけの小さな目標を設定することでプロジェクトが楽しくなります。


## 終わりに

如何だったでしょうか。

私はエンジニアになる前に **モノづくりが好き** だと思っていました。しかし、今回の経験を通して **作りたいものを作るのが好き** であると分かりました。

![no-love-doya-man.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518711/03ce3bb7-49cc-c81c-616a-1a11e84013a2.jpeg)
『サブネット』について浅く理解する

## サブネットを簡単にいうと？？

大きなネットワークを分割することでデバイスを探しやすくする方法。

例えば同じネットワーク内に100台の端末がつながっていて、その中から目的の1台を探すとなるとコストが大きくなる。

一方で、10台ごとにネットワーク内に別のネットワーク(つまりサブネット)を構成すると、〇番目のサブネットワークの〇台目の端末といった具合に探しやすくなる

探索木に似た考え方な気がする

### 具体的にどうやってるの？
IPアドレスは「ネットワークアドレス(どこのネットワークか？)」・「ホストアドレス(どこのコンピュータか？)」で構成されているが、

ホストアドレスの一部を間借りしてサブネットを表す部分に変換することで実現できる。

## ここで一つ問題が
ただ、もともと

- ネットワークアドレス
- ホストアドレス

で構成されていたものを、ホストアドレスの場所を間借りして

- ネットワークアドレス
- サブネットアドレス
- ホストアドレス

にするとIPアドレスのどこまでがネットワークアドレスを表していて、どこからがホストアドレスを示しているか分からなくなる

ここで、どこまでがネットワークアドレス、どこからがホストアドレスかを示すものが**サブネットマスク**である

これはIPアドレスと同じ書式で表されていて、`255.255.255.0`みたいな見た目になっている。

これを二進数に直すと

**`11111111.11111111.11111111.00000000`** というような形になる

IPアドレスと照らし合わせて、1の部分はネットワークアドレス・0の部分はホストアドレスと見分けることが出来るってワケ
Power AutomateのSharePoint REST APIで共有ロックされたファイルを削除する

# やりたいこと
ファイルの存在を確認し、ファイルが存在する場合には［SharePoint - ファイルの削除］アクションを使ってそのファイルを削除したいと考えています。しかし、Power Automateを実行すると、「<INS>filename is locked for shared use by user email.</INS>」というエラーが発生してしまいます。

このエラーの原因として、Power AutomateでExcelテーブルを使用した場合、そのExcelファイルを6分間共有ロックする仕様が影響しています。

https://community.powerplatform.com/forums/thread/details/?threadid=c87f424c-b195-4671-8d73-ac95f5071dc2

回避策を調査したところ、多くの場合、「遅延」アクションを使ってロックが解除されるまで6分間待機する方法が紹介されていました。しかし、この方法は状況によっては不都合が生じます。

**本記事では、［SharePointにHTTP要求を送信します］アクションを活用してロックを解除し、ファイルを削除する方法を紹介します。**

# 実装方法
［SharePointにHTTP要求を送信します］アクションで、SharePoint REST APIを実装します。``Prefer: bypass-shared-lock``をヘッダーのキーと値に設定することで、共有ロックを解除します。また、エンドポイントで``sites/{sub_site}``も設定するようにしてください。

```text:HTTP
POST https://{site_url}/_api/web/GetFileByServerRelativeUrl('sites/{sub_site}/{folder_name}/{file_name}')
Prefer: "bypass-shared-lock"
If-Match: "{etag or *}"
X-HTTP-Method: "DELETE"
```

![Shared-lock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/8afd9e0c-91ef-b8a7-1631-089d6f1ced7b.png)

SharePoint REST APIでファイル操作は、以下記事をご参照ください。

https://learn.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/working-with-folders-and-files-with-rest#working-with-files-by-using-rest
Unityでオンラインゲームを作るとき同時に実行したい [ParrelSync]

Unityでオンラインゲームを作るとき、いちいちビルドして実行するのが大変なので、同じプロジェクトを同時に実行できるパッケージを紹介します。
# ParrelSync
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3920316/65edcb8a-a8ac-521d-aeb5-72847a496140.png)
(画像は公式githubより)
## ダウンロード/インストール
1. https://github.com/VeriorPies/ParrelSync/releases にアクセス
1. 適当なバージョンをダウンロード(Assetsをクリック)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3920316/eedde75f-1164-2400-25f4-8f610f414995.png)
1. Unityの<b>「Assets」 > 「Import Package」 > 「Custom Package」</b>でダウンロードしたファイルを選択

## 使いかた
1. Unityの<b>「ParrelSync」 > 「CloneManager」</b>を開き、新たにクローンのプロジェクトを作る
1. `Open in Unity Editor`をクリック

同時に同じプロジェクトを実行できます。
chatGPT-proの良さ(o1-proはいいぞ)

まず、o1-proの良さについては色々な記事で書かれているので割愛。
箇条書き、備忘録メモ。

良く言われるレスポンス「遅い」について。o1-pro
だいたい30〜90秒くらい考えることが多い印象。ただ、触ってみてびっくりしたのは、その解答生成の間に新しい窓を開いてそっちで新しい質問できるということ。なんと、並行で回答を生成してくれる。これまだ、誰かが言ってるの見てないので、あまり気付いてない人多いんでないかな。さすが月額3万w
※スマホのアプリから4スレッド同時にThinkingになったことは確認済み。たぶん、これ以上をコンスタントに質問する人は多くない(5つ目を聞いているうちに最初の回答が来ている)

pythonで1000行の出力:
これもびっくりした。今までのAiはせいぜい80行とか150行くらいが最大のイメージだった。しかし、「とにかく長文で」と言ったら本当に出してきたw ただ、「2000行で」と指定をしても1000行程度だったので、このくらいが限界かもしれない。
バラバラのファイルをツギハギする手間がなくなったのは地味に大きい。

普通のo1:
数秒で回答が来て、だいたい優秀。印象としてはclaudeに近しい使い勝手。
写真撮影も、プレビューの時は使えなかった時期があったけど、普通に撮れる。
4oは正直、馬鹿さが目立ってあまり使わなかった。claude一択だろと。
でも、o1はclaude sonnetより良いかもしれない。しばらく並行利用の予定。

総評:
性能アップも素晴らしいのだけど、思ったより使い勝手が良かったのがとても好印象。
今まではとにかく使い勝手の部分でclaude一択だった。基本、全部出来てスマホから触りやすい。4oよりまともな回答が多い。しかし、一定回数使うと止まって数時間待ちなる。
しかし、gpt-proはclaudeの上位互換になり得る印象。ネックとされている回答の遅さも並行処理でかなりカバー出来ている気がする。
あとは、「無制限」という部分が本当なのかどうか。claudeはここがしばしば不便だったので、本当に無制限ならかなり嬉しい。
※o1-proはたまに試行した挙句、エラーを返すのでそこは面倒。ただし、これはclaudeでもしばしば見かけた。

買いかどうか？:
現状、一般人が触れる最高モデルなのは間違いないし、使い勝手も良い。僕は全然有りだと思った。
ただ、他のAIを色々触ってないとわからない良さもあると思うので、まずは20ドルモデルなり、gemini、perplexity、claude課金してある程度触ってから考えると良いと思う。上でなら、
【 AI 小ネタ 】今日は何の日かをワンタップで聞くためのショートカットの作り方


今回は、iPhone のショートカットを押すと**今日がなんの日かを ChatGPT に質問して、その答えをメモ帳に簡単に保存できる**ショートカットの作り方をご紹介。

## Step 1: ショートカット新規作成
ショートカットアプリを開くと画像のようにたくさんのショートカットが並んでいる画面に行き着く。

その画面の右上にあるプラスボタンを押してショートカットを新規作成する

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/b237a818-ded3-5593-6d02-7d8c8a0dcf9c.png width=300>


## Step 2: ChatGPT アプリを選択し、質問を決定する

作成画面に遷移するとまっさらな画面になる。

その下に出ている検索バーで Chat-GPT アプリを探す。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/a22c2740-0137-acbc-de02-255ba398443a.png width=300>

検索バーをタップするとボトムメニューが伸びて検索できるようになる。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/f4e5c802-50c4-5e67-bc27-0ed4016a08b2.png width=300>

選択すると使う GPT の種類が選択できるので、お好きな方を選んで欲しい。



選択すると先ほどの画面に Ask ChatGPT というフローが追加されているのが確認できる。

そこの入力窓に「今日はなんの日か日本語で答えて」と入力する。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/6af9642d-4324-4195-79a4-425f29ef3ead.png width=300>


日本語で答えてと付け加える理由は、過去にわたしが同様のショートカットを作成した際に英語で回答されたことがあったため、それを防ぐのが目的。

## Step 3: メモ帳に保存するフローを作る
再び検索窓を開き、今度はメモ帳を検索する。

出てきたら、「メモに追加」を選択。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/2d14c950-29e6-64ea-5f49-ee4f8fe12117.png width=300>


メモの内容は「Ask ChatGPT」を選択して先ほど ChatGPT に質問した内容をメモに転記する。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/bbcfcee7-8d87-1164-70d0-7110140c9175.png width=300>


フォルダーは各自が用意したものを選択。

こうしてフローは完成!! あとはタップするアイコンを追加するだけ!!!

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/90448d5f-293f-dcc4-7b2c-45d209c68686.png width=300>

## Step 4: アイコンをホーム画面に追加
フロー画面の一番下の再生マークの横の共有アイコンをタップする。

すると、ボトムメニューが突き出てくるため、「ホーム画面に追加」を選択。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/93203121-8a33-9325-ba02-895b92edbe9f.jpeg width=300>


アイコンを作成する画面に遷移するため、自分好みにカスタマイズしよう。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/306111b1-03cb-24b3-b35f-0acb294bbe06.png width=300>

あとは右上の追加を押せばこのステップは完了!!!

## 実行画面
実行してしばらく待ってみると、上から ChatGPT からの回答が表示される。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/58ede5f6-175d-951d-e9bb-7e9efde9bbb4.png width=300>

Done(完了) をタップすると、メモ帳に保存することを許可して欲しいと表示されるため、許可しよう。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/44e7b171-f563-66cb-a2b5-be58176d8ac4.png width=300>

この画像であれば Always Allow (常に許可する)を選択。

メモ帳アプリを開くと確かに今日は何の日かという回答が保存されていることが確認できる。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/476ecfff-02ff-0171-5d9e-e5cfea252884.png width=300>

たったの 4 ステップであなたの豆知識が増えるショートカット超簡単に完成!!!

他にも工夫次第で面白いショートカットが作れるので、皆さんもぜひ作ってみよう!!
転職活動を振り返る

転職活動して気づいた「これをやっていれば.../やってよかった」をシェアしよう by 転職ドラフト Advent Calendar 2024　の９日目担当Hirorinです！

昨年に転職をして2023年10月から新しい会社で働いています。
初めての転職活動を振り返ってやってよかったこと、やればよかったことをまとめようと思います。

# 転職活動期間
2023年6月頭　～　2023年7月中旬

転職エージェントの利用を開始した日から、内定承諾を送るまで大体1ヶ月半程度でした。


# やってよかったこと
## 自己分析
転職活動を開始する少し前からし始めていました。具体的には以下のことを考えてまとめていました。
- 転職軸のまとめ
- 自分の強みは何か
- 自分が今までやってきた業務
    - アピールできそうな業務はないか
    - 普段から気をつけていたことは何か

特に今までの業務を振り返るのはかなり良かったです。
キツかったプロジェクトはたくさんありました（ブラックではないです）が、当時の自分がどう工夫して進めたのかを振り返ることで面接でのアピールポイントを洗い出せました。
面接でもこの手の話を聞く人は多かったです。
何も考えないで仕事していることはないと思うので、普段の業務のちょっとした工夫などまとめておくと良いと思います。

## ポートフォリオ作成
Reactを個人で１から勉強した時の集大成としてポートフォリオを作りました。
やはり実際に見せられるものがあると好印象になりました。
ポートフォリオ以外の作成物も載せており、向上心が高い人と評価されることが多かったです。

## 資格取得
転職のためにしていたわけではないですがこちらもやっていてよかったです。
AWSを業務で使うことがあったので資格にも挑戦しており、SAP・DOPまで取得していました。
credyで合格した資格のバッジがもらえるので、ポートフォリオにも表示していました。

# やればよかったこと
## 得意な言語・FWの理解
使っていて便利だった機能、他のFWと比較した時の長所・短所は話せるようにしておくと良いと感じました。
特に自分の得意な言語・FWと、行きたい企業が使っている技術が同じ場合は質問されることがあります。
「LaravelのEloquentの課題点はなんですか？」というように質問をされたこともありました。
正直上手く答えられなかったので、まとめておけばよかったなと思っています。

# まとめ
個人開発もやっていればかなり強いと思いますが、個人的には自己分析をしっかりやっていたのが大きいと感じました。
こういった分析は普段やらないので時間がかかりましたが、その分面接ではスムーズに話すことが出来ました。
資格取得や個人開発で技術力の向上するのは素晴らしいことですが、将来のビジョンを見据えることも同じくらい重要と学びました。
アプリ内およびウェブのメッセージング - エージェントは利用できません




+ [アプリ内およびウェブのメッセージング - エージェントは利用できません](https://salesforce.stackexchange.com/questions/401463/messaging-for-in-app-and-web-agents-unavailable)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d1fc7469-7dac-17d7-a805-684ad9b9496e.png)

:::note
チャットをボットに接続しようとしましたが、同じエラーが発生しました。まず、フローのエラーを確認することをお勧めしますが、とにかく次のことを確認することで解決しました。

+ フォールバックキューにはルーティング設定が関連付けられています
+ フォールバック キューには、サポートされるオブジェクトとしてメッセージング セッションがありました。
:::

+ [アプリ内および Web のメッセージング: オムニチャネルのエージェントとチャットボット間のチャットは常に非アクティブです](https://salesforce.stackexchange.com/questions/421135/messaging-for-in-app-and-web-chat-always-inactive-between-agent-in-omni-chann)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9145649a-f09a-8b5b-7fcf-7a484cf70221.png)



+ [My agent is not working in the community site and I am unable to access the chat button.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erzzZ)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c5b9dc68-aa45-ed77-857c-d086d28cd93e.png)

+ [MIAW による Einstein Reply の推奨事項またはサービス返信:Einstein Reply Recommendations or Service Replies with MIAW](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eqWaX)
SQL Serverのトリガーを作成する時に知っておけばよかったこと

# 1. はじめに
* SQL Serverでトリガーを作成する時に躓いたことをメモしておきます

# 2. 開発環境
* SQL Server 2022
* Windows 11

# 3. SET ANSI_NULLS ON
* ANSI_NULLS が ON に設定されていると、NULL 値に対するすべての比較は UNKNOWN に評価されます。
* 一般的にはONにするようですが、OFFでトリガーを作っていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/f8d40fd3-2556-ea13-caf9-d4dea9a2e3b9.png)

https://learn.microsoft.com/ja-jp/sql/t-sql/statements/set-ansi-nulls-transact-sql?view=sql-server-ver16

# 3. SET QUOTED_IDENTIFIER ON
* SQLを識別子は二重引用符 ("") で区切ることができます。
* 一般的にはONにするようですが、設定があることをしらず二重引用符 ("") は使っていませんでした。

https://learn.microsoft.com/ja-jp/sql/t-sql/statements/set-ansi-nulls-transact-sql?view=sql-server-ver16&viewFallbackFrom=sql-server-ver16set%20quoted_identifier%20on

```SQL:
SELECT "id",
    "name" 
FROM
    "table";
```

# 4. CREATE OR ALTER
* 未定義のDBオブジェクトに対してはCREATE文として、定義済みのDBオブジェクトに対してはALTER文として動作します。
* SQL Server 2016 Service Pack 1以降で利用可能のようです。
* トリガーを更新する時に毎回DROPしてCREATEしていましたが、これで解決しました。

```SQL:
CREATE OR ALTER PROCEDURE [dbo].[テーブル名]
AS
BEGIN
　（省略）
END
GO
```

# 5.  ALTER TABLE [テーブル名] ENABLE/DISABLE TRIGGER
* あるテーブルの特定のトリガーの有効化(enable)/無効化(disable)します。
* トリガーの状態を変更する方法がわかっていませんでした。

```SQL:
-- トリガーを有効化する場合
ALTER TABLE [テーブル名] ENABLE TRIGGER [トリガー名];
-- トリガーを無効化する場合
ALTER TABLE [テーブル名] DISABLE TRIGGER [トリガー名];
```
https://learn.microsoft.com/ja-jp/sql/t-sql/statements/alter-table-transact-sql?view=sql-server-ver16

# 6. 参考文献

https://mrgchr.hatenablog.com/entry/2019/09/14/090000

https://sql55.com/query/disable-enable-triggers.php

https://qiita.com/masayasu_t/items/ba10c5e667390f829767
npm create は何をしているか

## はじめに

フロントエンドフレームワークのドキュメントの中で登場する`npm create`。
どのような仕組みで動作しているか調べてみました。

:::note
本記事内ではAstroを例として挙げています
https://astro.build/
:::

## npm createの挙動
以下はhelpで`npm init`を確認したものだ。
こちらを確認すると、`npm create`は`npm init`のエイリアスということがわかる。

```bash
❯ npm init --help
Create a package.json file

Usage:
npm init <package-spec> (same as `npx <package-spec>`)
npm init <@scope> (same as `npx <@scope>/create`)

Options:
[--init-author-name <name>] [--init-author-url <url>] [--init-license <license>]
[--init-module <module>] [--init-version <version>] [-y|--yes] [-f|--force]
[--scope <@scope>]
[-w|--workspace <workspace-name> [-w|--workspace <workspace-name> ...]]
[-ws|--workspaces] [--no-workspaces-update] [--include-workspace-root]

aliases: create, innit

Run "npm help init" for more info
```

詳細は以下ドキュメントで確認可能。

https://docs.npmjs.com/cli/v8/commands/npm-init

ドキュメントで確認すると、`npm init`は以下のように`npm exec`に変換されるようだ。
 `npm init foo`->`npm exec create-foo`

そのため、以下3つのコマンドの実行結果は同じとなる。

```bash
❯ npm create astro@latest
Need to install the following packages:
create-astro@4.10.0
Ok to proceed? (y)

❯ npm init astro@latest 
Need to install the following packages:
create-astro@4.10.0
Ok to proceed? (y)

❯ npm exec create-astro@latest
Need to install the following packages:
create-astro@4.10.0
Ok to proceed? (y)
```

## 結論

`npm create astro@latest`を実行すると内部では`npm exec create-astro@latest`が実行される。
勉強のために買って本当に良かったもの

:::note info
Amazonリンクはアフィじゃないです。できるだけメーカーのページを張ってます。
:::

:::note info
エンジニアのみなさんが興味ありそうな順番で紹介します。
:::


## プラムネットブッククリップ

![02_tokucho_01[1].jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809025/7815075c-ea81-5b0c-0f9d-6d08fc73cf26.jpeg)
※画像は[公式サイト](https://www.plumnet.jp/product-onsale/bookclip/)より

https://www.plumnet.jp/product-onsale/bookclip/

これは参考書など分厚い本たちを本を押さえつけて固定するやつ。

かたい本の最初のほうや最後のほうは自分の手で押さえつけながら...というのがなくなります。

特にプログラミング関係本を実物として買うと**キーボード触りながら本を参照する**ということが多いので、これ一個あるだけで全然変わります。本当に買ってよかった。

- **重さ**: 約100gの重量。若干パワー不足感があることもある
- **本を傷めない設計**: 内側には布が貼られていて、本を傷つけづらい



## ARTECH HW305

https://amzn.asia/d/iNmK8lz

これほんとにいい。2年間弱ほど使用していますが全く異常なし。

- USB-C 充電式
- 全体としては小さいけど、キーは小さくなっていない
- 安い
- USB-Aドングル式、収納場所あり
- ちゃんとバッテリー長持ち
- 矢印とか右側が崩れていない
- Fnキーがあるが、右側Ctrlがある
- 印字ではなくて超丈夫なシール？だけど剥がれる心配はしなくていい

普通の座学勉強もするためにノートとかを広げるんですけど、そんなときに普通のメカニカルキーボードは邪魔なんですよね。大きすぎて。

やっすくて小さくて丈夫なのないかな...と思ってこれを買いました。正解でした。全く問題ない。

ちょっと消しカスがキーの隙間に入ったりしたこともあったけど、今のところ入力は問題ないし、問題が出たら買い替えればいい。

打鍵感はたぶんあんまりよくない。ノートPCのキーよりかは押しやすいという程度。

## 真空断熱タンブラー

これは有名どころなら何でもいいです。
とにかくホットのカフェインドリンクを入れても熱くならないのが本当に良い。

キーボードカタカタして集中しているときに無意識に手を伸ばして「アツっ！？」ってなるのを防げますｗ( ´∀｀ )

保温も意外とすごいけど、アイスよりホットのほうが得意そう？

エンジニアの皆さんは水分補給するの忘れている人多いと思うので(偏見?)、氷水でも入れておいてデスクの横に置いておくと健康を感じられますよ。


## 電動消しカスクリーナー

これも何でもいいんですけど、大体3000円くらいが多いですね。
ちょっとぼったくりだろ...と思いつつ、買ってみたらまぁ便利。

紙とシャーペンを使う学生にとっては、机上の消しカスとPCほど心配になるものはありません。

現に私は一度、ファンに消しカスが詰まって異音が発生したことがありました。
でも消しカスを片すのは地味に面倒...ってときにこれ。マジで一瞬できれいに片づけられる。

誇張抜きにこれチートだろ...とか思いながら使ってます。まぁうるさいから図書館とか自習室じゃ使えないけどね。

:::note alert
夏場に中身の消しカスを入れたまま放置するとプラスチックがくっついちゃうので、忘れずに中身を捨てる必要があります。
:::



## モノタフ

https://www.tombow.com/products/mono_tough/

Arch・リサーレ・Air-inなど使いましたが、
折れる・もげる・消しカス細かすぎ...など減点ポイントが多かったです。

モノタフは、
- 消しカスの量と消しやすさがちょうどいい
- タフというだけあって折れない

これで十分。

## Pentel orenznero

https://www.pentel.co.jp/products/mechanicalpencil/orenznero/

いわずと知れた人気のお高めシャーペン。

自動ノック機能がありますが、使ってません。どうしても引っかかるのでね。
0.3でも折れづらいから使ってます。
JSON::PPのdecodeメソッドの速度比較

この記事はPerl Advent Calendar 2024の7日目になります。

# 概要
JSON::PPのdecode_jsonメソッドの説明ではこれらは一緒だけど、速さが違うとありましたので、どの程度違うのか調べることにします。
ただし、検証に使用するJSON文字列には日本語は含まず半角英数のみとします〔**特定条件での調査**〕。
```perl
$perl_scalar = decode_json $json_text
$perl_scalar = JSON::PP->new->utf8->decode($json_text)
```

# 比較するメソッド
- decode_json
- JSON::PP->new->utf8->decode
    - 以上2つは与えられた文字列がutf8文字列としてデコード
- JSON::PP->new->utf8(0)->decode
    - 内部コードとしてデコード

# 方法とコード
1レコード当たり〔36項目 700バイト〕を5000レコードの文字列としそれを50回デコードすることとし、その速度を比較します。
```perl
#!perl
use v5.40;
use JSON::PP;
use utf8;
use Time::HiRes qw/gettimeofday tv_interval/;

my $jsonstr = 'JSON文字列'
my $c = "[" . $jsonstr;
for (my $i=1; $i<5000; $i++){
    $c .= "," . $jsonstr;
}
$c .=  "]";

for(my $i=0; $i<50; $i++){
    &pGo;
}

sub pGo{
    my $starttime = [gettimeofday];

    my $x1 = decode_json($c);
    my $raptime1 = tv_interval($starttime);
    
    my $x2 = JSON::PP->new->utf8->decode($c);
    my $raptime2 = tv_interval($starttime);
    
    my $x3 = JSON::PP->new->utf8(0)->decode($c);
    my $raptime3 = tv_interval($starttime);;
    
    printf("A:%0.6f\n",$raptime1);
    printf("B:%0.6f\n",$raptime2-$raptime1);
    printf("C:%0.6f\n",$raptime3-$raptime2);
}

1;
```

# 結果
| メソッド | 50回処理時間(秒) |
| --- | ---: |
| decode_json | 50.96774 |
| JSON::PP->new->utf8->decode | 50.99066 |
| JSON::PP->new->utf8(0)->decode | 50.97722 |

私の端末では、3.5MByte程度の文字列のデコードにいずれも50回で50秒程でした。

# まとめ
　1件あたりの速度の違いはについては微々たるものであるとわかりました。
 (12月13日追加）追加の実証実験が必要かもしれません。正しい結果が出ているか不安が大きいです。
　use utf8;を使用していて、JSON文字列に日本語が含まれるときは、上記2つにおいてはEncodeモジュールでencode_utf8()を行う必要があるため、速度的には、３番目のJSON::PP->new->utf8(0)->decodeが一番早いのかもしれません。
　思い立って実施したので、不備不足等、コメント欄で指摘いただけるとありがたいです。
　以上です。ありがとうございました。
名称は理解されやすく理解しやすく[C#][Web]

## 開発環境
・Visual Stdio 2022
・使用言語 C#
・.net framework 4.8

## はじめに

コーディングRvの際にこんなことを言われたことはありませんか？
A：「このタグとかファイルの名称わかりづらくない？」
B：（え～わかりやすいと思ったのに...)
ここでBさんの作成したコードなどを見てみましょう

## Bさんのコード
- ファイル名：WebPage1.aspx
```
    <maintitle>
        初めてのWEBサイト 
    </maintitle>
    <subtitle><br />
        僕でも簡単に組めるよ
    </subtitle>
    <br />
    <br />
    所属している人の詳細
    <asp:GridView ID="hyou" runat="server" AutoGenerateColumns="False" >
        <Columns>
            <asp:BoundField HeaderText="名前" />
            <asp:BoundField HeaderText="都道府県" />
            <asp:BoundField HeaderText="年齢" />
        </Columns>
    </asp:GridView>
```
## どこがわかりづらいのか
まずはわかりづらいとされている箇所を箇条書きで挙げてみましょう

・ファイル名
・GridViewのID

ここがまずは違和感を感じる部分じゃないでしょうか？
(個人の主観はありますが...)

## 何がわかりづらいのか

### ファイル名：WebPage1.aspx
ファイル名はどのような動作をするのかがはっきりとすることが求められています。
Bさんが作成したサイトはBさんが所属しているグループの名前や都道府県、年齢などの詳細情報が記載されているので、Webサイトのトップページではないことは確実でしょう。
Bさんの作成ファイルで足りないところは『所属している人間の詳細情報』です。

A：「詳細情報を表示するページなのに、『詳細情報』を示す文字が入っていないのは、わかりづらいかな」
B：「なるほど！確かに[WebPage1]だったら、Webページなことはわかりますが、それ以外のことはわからないです」
A：「訂正するとしたら、なんだろうな～。AffiliationStaffDetail.aspxとかかな」
B：「長くないですか？」
A：「...確かに」

### GridViewのID：hyou
それは確かに表です。
それは表のようで表があり、表であります。
こちらもファイル名とおんなじことが言えますね。
『なんの』表なんでしょうか？っていう話になりますね。
この表に記載されている情報は何が入るのかを確認してみましょう。
今回の場合はファイル名と同様に『所属している人間の詳細情報』です。
つまり、GridViewのIDはAffiliationStaffDetailとなる。

A：「ファイル名がAffiliationStaffDetaiってなると表も同じにしても問題なさそうだな。これも長くない？」
B：「そうっすね～」
A：「何にしようかな」
B：「ですね～」

## わかりやすい名称とは
結局わかりやすい名称ってなんでしょうか？
・ページの目的や表示される内容をファイル名から判断できること
・長すぎなく、短すぎない名称
上記の２点を最低限守ることが理想となっていますが、人によってこれらの理想は様々です。
少なくともいえることは、「ファイル名からそれが『何』を表示 or 動作がわかること」本当の最低条件でしょう。
カスタム関数をテストしたものをGitHub上で行えるようにする

# はじめに

こんにちは、エンジニアのkeitaMaxです。

https://qiita.com/keitaMax/private/00e0dfb74d524032a095

https://qiita.com/keitaMax/private/bd8bc921708c64b55bde

以前作成したカスタム関数のテストをGitHub Actionsを使用してCIを作っていきたいと思います。

# 実装

`.github/workflows/ci.yml`ファイルを作成します。

```yml:.github/workflows/ci.yml
name: ci

on: [pull_request]

jobs:
  eslint:
    name: eslint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: npm install
        run: npm install
      - name: test
        run: npm run test

```

PRを作成した時に走らせたいので、このような形にしました。

# 実際に動かしてみる

PRを実際に作成して動かしてみます。

Pushしてみると、以下のように動き始めます。

![スクリーンショット 2024-12-07 10.20.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715123/4255dd9c-7095-dc8b-ec4b-a37c2184716a.png)

しばらく時間が経って、自動テストが問題なく動けば、以下のようにマージできる状態になります。

![スクリーンショット 2024-12-07 10.21.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715123/9469809e-b4e3-3b82-6692-a90cb18533c8.png)


# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 参考

https://qiita.com/keitaMax/items/3feb1a43c24917a6ee69

# 次の記事

https://qiita.com/keitaMax/private/bec9536d3de3600d6b8b
拡張機能が動作しないときに確認すること

# 概要

これは[初心者のブラウザ拡張機能 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/browser-extension)の6日目の記事です。

拡張機能を作ってみたけれど、なんかうまく動かないときに確認する手順を記載します。

# 動かない原因の大半はJavascriptの文法ミス

色々と開発してみて気がつくのは、**Javascriptの文法を誤っていて**想定どおりの挙動にならないことが多々ある、ということです。

簡単な例を紹介します。

これは`body`の背景色を赤色にするだけの拡張機能です。manifest.jsonを作り読み込むと背景が赤くなります。

```javascript:main.js
document.body.style.backgroundColor = "red";
```

Qiitaの編集画面が赤くなっているところ

![body red](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/6ad25bd0-d127-5773-d42c-62f5ade0bfdd.png)

文法を間違えてみると赤くなりません。

```javascript:main.js
documet.body.style.backgroundColor = "red";
```

`document`と書くところを`documet`と書いています。

## 途中で間違えるとあとの処理ができなくなる

やっかいなのは途中で間違えると、間違えたあとの処理だけ失敗する点です。
以下の例では`Start`は表示されますが、`Finish`は表示されません。途中で`documet`と間違えているためです。

```javascript:main.js
console.log("Start");
documet.body.style.backgroundColor = "red";
console.log("Finish");
```

単純な例であればよいのですが、複雑な拡張機能になると間違いを見つけるのが難しくなります。

# 確認すること

## 開発者ツールを開いてエラーを確認する

`F12`または`Ctrl + Shift + I`で開発者ツールを開きます。

`エラー`を選択するとコンソールにエラーメッセージが出力されます。
ここに拡張機能関連でエラーが出ていないか見ましょう。

![エラーを確認](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/7d4dc266-0283-c936-b5b1-6d73478facdf.png)

## エディタのチェック機能で文法ミスを確認する

文法ミスはエディタの機能で防げる場合が多いです。

下記はVScodeの画面ですが、`body`と書くところを`ody`にしている箇所に赤線が入っています。

![visual studio codeのチェック画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302006/4188df34-345e-955a-5412-148da1583f77.png)

## console.logを使って出力を確認する

エラーにはならなくても想定通りの挙動にならない場合もあります。
そういう場合は`console.log`あるいは何かの通知機能で、そこまでは処理できていることを確認していきます。

```javascript:main.js
console.log("Start");

// 処理

console.log("10行目");

// 処理

console.log("50行目");

// 処理

console.log("Finish");
```
CMSをわかっていない私がmicroCMSに初挑戦！

## はじめに
microCMSというものをアドベンドカレンダーにて初めて知りました。

https://qiita.com/advent-calendar/2024/microcms

実際に使用してみた感想を共有していきたいと思います。

## そもそもmicroCMSとは何なのか？
> APIベースの日本製ヘッドレスCMSです。
コンテンツのためのサーバー管理は一切不要、サインアップするだけですぐに利用開始できます。快適な管理画面により、開発・運用コストを大きく削減することで、ビジネスを加速させます。

### CMSとは？
microCMSを先に紹介してしまいましたが、私はそもそもCMSというものを理解していなかったので簡単にまとめてみます

- CMS（Content Management System）とは、ウェブサイトの文章や画像などのコンテンツを管理するためのツールやシステムのこと。プログラミングの知識がなくても、ウェブサイトの更新や管理が簡単にできるようになるものです。

### 1. CMSを使わない場合の問題
ウェブサイトを作るには、通常HTMLやCSS、JavaScriptといったコードを書く必要があります。つまり「ブログの記事を追加したい → 新しいHTMLファイルを作成。」「画像を変更したい → コードを編集してアップロード。」というコード編集作業が必要になります。初心者には難しい💦

### 2. CMSを使うとこうなる
CMSを利用することで管理画面から「記事の追加・編集・削除」「画像や動画のアップロード」「ウェブページのデザイン変更」といったことが可能になります！

### 3. CMSの代表
| CMS名       | 主な用途                     | 特徴                                             | 例                                        |
|-------------|------------------------------|------------------------------------------------|------------------------------------------|
| WordPress   | ブログ、企業サイト            | 世界で最も使われているCMS。無料でプラグインを追加可能 | 個人ブログ、小規模ビジネスのウェブサイト   |
| Wix         | ポートフォリオ、簡単なサイト  | プログラミング不要。ドラッグ＆ドロップで作成可能 | デザイン重視の個人ポートフォリオ           |
| Shopify     | ネットショップ（Eコマース）   | 商品管理、注文、支払いシステムに特化            | オリジナル商品のオンライン販売            |
| Squarespace | 小規模ビジネス、個人サイト    | デザインテンプレートが豊富でクリエイター向け     | 写真家やデザイナーのポートフォリオサイト    |

https://ja.wordpress.org/

https://ja.wix.com/

https://www.shopify.com/jp/free-trial?term=shopify&adid=566070247150&campaignid=15433369599&branded_enterprise=1&BOID=brand&utm_medium=cpc&utm_source=google&gad_source=1&gclid=Cj0KCQiAu8W6BhC-ARIsACEQoDDbf2fYTzKt3P814OyND-J2lQX3wPhxIvXVV1_klS3TI89sl7g4lF4aArD_EALw_wcB&cmadid=516585705;cmadvertiserid=10730501;cmcampaignid=26990768;cmplacementid=324494758;cmcreativeid=163722649;cmsiteid=5500011

https://ja.squarespace.com/



## 早速スタート
まずは無料登録から進めていきます。下記画面まではあっという間です
[![Image from Gyazo](https://i.gyazo.com/57a0f74f8d10fb37e2717bdcd6be55bb.png)](https://gyazo.com/57a0f74f8d10fb37e2717bdcd6be55bb)

さらにテンプレートから作成することも可能！！
これは大変うれしいです。利用するハードルが下がります！！
[![Image from Gyazo](https://i.gyazo.com/c1f45213761de76d2f8758f1d384f157.png)](https://gyazo.com/c1f45213761de76d2f8758f1d384f157)


https://blog.microcms.io/getting-started/

初めてという事もあり上記記事を参考に進めていきました。

[![Image from Gyazo](https://i.gyazo.com/efe882a604f504b0f722e10def5a0664.png)](https://gyazo.com/efe882a604f504b0f722e10def5a0664)

こんな感じに。
合っているのか？？

## さいごに
他の方の記事を参考にmicroCMSについてはさらに理解を深めていきたいと思います。そしてちゃんとしたサイトが作ることを目標に！！
分散並列Prolog（３）

# ツリー階層型ネットワーク
前回までの計算実験で、単純な分散並列でPrologが動作するようになりました。本格的に仕様固めに取り掛かりました。Prologが深さ優先探索であることから分散並列のネットワークも再帰が活きるようにツリー階層型にすることにしました。

![ネットワークモード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/3446dce0-071d-d74a-7737-d8a6de70f118.png)

親機は子機に計算を分割して並列実行させます。その子機は孫機を持つこともできます。さらに孫機も子機を持つこともできます。

# Prologの特性
Prologは深さ優先探索であり人間の思考に類似しています。スーパーコンピューターによる流体力学の計算と異なり、再帰的に並列計算を展開していった方がPrologにとっては自然であると考えました。例えばボードゲームの先読みをする場合です。動かしうる駒の置き場所に対応してそれぞれ子機に計算を委ねます。さらにその子機ももう一手先の選択肢について孫機に計算を委ねます。こうして得られた結果は各階層の親機を介して最終的に大元の親機に集約されます。これは人間の思考方法にも近いように思えます。現在はラズパイのような安価なマシンが入手可能です。ラズパイをクラスタ接続したマシンで分散並列Prologの実行が可能と思われます。

# 仕様
分散並列のために用意した拡張述語は下記のとおりです。子機の端末で npl -n を実行します。N-Prologがネットワークモードで実行されます。親機の端末でN-Prologを実行し、dp_create/1 を使って親と子の間でTCP/IP通信を確立します。


- npl -n: ネットワークモードで子プロローグを起動します。-nオプションを使用します。 子も親として機能できます。network.pl に dp_create/1 を含めることで、npl -n でネットワークモードを開始した直後に子との通信が確立されます。この機能により、親は子を通じて孫に計算を委任できます。

- dp_create([IP0, IP1, …, IPn]): 子機のIPアドレスを指定して、親LispとのTCP/IP通信を確立します。IPアドレスは原子（atom）として指定します。例: '178.1.166.2' 最大100台の子機を接続できます。

- dp-and([p0, p1, ..., pn]): P0からPNまでの述語を並列に実行します。すべてがYESを返すとYESを返し、いずれかがNOを返すとNOを返します。

- dp_or([p0, p1, ..., pn]): P0からPNまでの述語を並列に実行します。いずれかがYESを返すと、他の計算を中断してYESを返します。

- dp_transfer(Fn): 親機からすべての子機にファイルFnを転送します。

- dp_compile(Fn): 親機と子機の両方でファイルFnをコンパイルします。

- dp_consult(Fn): 親機と子機の両方でファイルFnをロードします。 （注）内部で reconsult/1 を使用します。既存の述語は上書きされます。

- dp_prove(Nth, Pred): N番目の子プロローグで述語を証明し、テストします。

- dp_report(Str): 親端末に文字列を表示します。 例: dp_report('Hello World')。
string_term(X, 1+2), dp_report(X)。

- dp_close: 子機に終了コマンドを送信し、通信を閉じます。子機の場合、OSがシャットダウンされます。 （注）dp_close を実行せずに halt を実行するとエラーが発生します。適切に終了するには dp_close が必要です。

- dp_parent: システムが親として動作している場合、YESを返します。それ以外の場合はNOを返します。子機であっても、自身が親として機能している場合、YESを返します。

- dp_child: 子機であり、子機を持っていない場合、YESを返します。それ以外の場合はNOを返します。

- dp_wait(Time): Time 秒待機します。

- dp_pause(Nth): N番目の子機およびその子機に対して待機コマンドを送信します。

- dp_resume(Nth): N番目の子機およびその子機に対しての待機コマンドをキャンセルします。

# ハードウェア
ラズパイ４をクラスタ接続したマシンで分散並列Prologを動作させる予定です。1号機は4台のみをクラスタ接続してハードウェアに関する経験を積みます。うまく動作したら30台程度のラズパイクラスタマシンで試したいものです。問題は予算です。円安でラズパイもけっこう高くなりました。30台ともなりますと、高額になります。

# 個人的な思い
1980年代の日本の第五世代コンピューター計画は私にとって憧れでした。日本人が世界に類を見ない高度な目標を掲げて果敢に挑戦したことを一人の日本人として誇らしく思っています。時代はちょうとダウンサイジングの波が起きていました。国家プロジェクトであり並列推論マシンを作るという目標は変更できなかったのでしょう。最終的に並列推論マシンは完成しましたが大型の専用機であり民間のニーズに応えられなかったという批判があります。あれから40年ほど経過し、安価なマシンや通信手段が入手可能になりました。私の力の及ぶ限りそのプロジェクトの個人的な続きをやってみたいと思っています。

https://github.com/sasagawa888/nprolog
TryHackMeからの退会（解約）

### 私の概況
>windows 10
iMac Ventura 13 (Intel Core i5)

### 解約理由
>迷惑メールが多いmail addressを削除することから、2つあるうちの、そのaddressで登録してあったaccountを削除することにしました。
ネットで調べましたが、よくわからないので、取り敢えず色々触ってみました。
### 対処
>１、TryHackMe.comのアカウントにログインする
>２、自分の「アカウント」ボタンをクリックし「Manage Account」をクリック
![スクリーンショット 2024-12-07 9.54.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/71486e06-8ca6-725c-b3d0-a6e89f6f1894.png)

>３、一番下まで降りて「Delete My Account」をクリック
![スクリーンショット 2024-12-07 9.55.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/d52fafa9-dd51-e6ec-5871-587f0034ee37.png)
（アカウントを削除する
アカウントを削除すると、アカウントへの最終的なアクセスが失われ、回復方法はありません。
個人データと進行状況は消去され、失われ、進行中のサブスクリプションも失われます。）

４、「Confirm your choice by typing your password:」欄にパスワードを入力して、「Yes,Delete my Account」をクリックして完了
![スクリーンショット 2024-12-07 9.56.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/79f5c8b7-0d6e-5586-9cbe-185340953783.png)
（ご退会いただき、誠に申し訳ございません。よろしいですか?
アカウントを削除すると、アカウントへの最終的なアクセスが失われ、回復方法はありません。
個人データと進行状況は消去され、失われ、進行中のサブスクリプションも失われます。
パスワードを入力して選択を確定してください:

### その他にしておいた方がいいこと
・メールはメーリングリストに基づいて送られてくるので、必要なければ「解除」しておく・

・メールの一番下にある「Unsubscribe（購読を解除する）」というリンクがあるので「全ての配信サービスの解除」をしておくといいみたい。
![スクリーンショット 2024-12-13 10.43.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/e2c59e9f-2174-6239-8ea6-f5dd0c310f0e.png)
カスタム関数をテストする

# はじめに

こんにちは、エンジニアのkeitaMaxです。

https://qiita.com/keitaMax/private/00e0dfb74d524032a095

前回作成したカスタム関数のテストを書いてみようと思います。

# インストール

今回はJestを使用する予定なので、以下のコマンドでインストールします。

```
npm install --save-dev jest
npm install --save-dev ts-jest
```

# 実装

testフォルダを作成し、その配下にテストをするために`isEmpty.test.ts`ファイルを作成しました。

```
array-extention
├─ src
│  ├─ index.ts
│  └─ rules
│     └─ isEmpty.ts
├─ test
│  ├─ index.ts
│  └─ isEmpty.test.ts
└─ jest.config.js
```

```ts:isEmpty.test.ts
describe('Array.prototype.isEmpty', () => {
  it('空配列の場合にtrueが返ってくるテスト', () => {
    const array: any[] = []
    expect(array.isEmpty()).toBe(true)
  })

  it('すべてundefinedの配列の場合にtrueが返ってくるテスト', () => {
    const array = [undefined, undefined]
    const result = array.isEmpty()
    expect(array.isEmpty()).toBe(true)
  })

  it('すべてundefinedではない配列の場合にfalseが返ってくるテスト', () => {
    const array = [1, 2, 3]
    expect(array.isEmpty()).toBe(false)
  })

  it('一部がundefinedではない配列の場合にtrueが返ってくるテスト', () => {
    const array = [1, undefined, 2]
    expect(array.isEmpty()).toBe(false)
  })
})
```

このように各パターンのテストを作成しました。

```js:jest.config.js
module.exports = {
    preset: 'ts-jest',
    testEnvironment: 'node',
    setupFilesAfterEnv: ['./test/index.ts'],
};
```

このファイルでテストが始まる前に`./test/index.ts`を読み込むような設定をしています。

```ts:test/index.ts
import "../src"
```

このファイルでは、前回作成した`src/index.ts`のカスタム関数をimportしているファイルをimportしています。

# 実際にテストしてみる

以下コマンドで実際にテストしてみます。

```
npm run test
```
```console
% npm run test

> hsd-array-extension@0.0.3 test
> jest

 PASS  test/isEmpty.test.ts
 PASS  test/notUndefined.test.ts

Test Suites: 2 passed, 2 total
Tests:       9 passed, 9 total
Snapshots:   0 total
Time:        1.003 s
Ran all test suites.
```

これで全てのテストが成功しているので作成完了です。


※`npm run test`ができない場合は、`package.json`にいかがあることを確認してください。
```json
  "scripts": {
    "test": "jest"
  },
```


# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 参考

https://jestjs.io/ja/docs/getting-started

# 次の記事

https://qiita.com/keitaMax/private/27f3dd4636c7e205d633
キャリアブレイク中にやっている勉強④ 英語学習

今日もキャリアブレイク中に具体的にやっている勉強について書きます。その④は「英語学習」です。

# 英語学習
英語学習。正直やろうとしては何度も諦めています。海外旅行に行くと、帰ったらもっと勉強しよう！と思うのですが、続かないんですよね。。他の勉強と違ってキャリアブレイク中に例えば100時間やったら身に付くというものでもないので、いっそその時間で他の勉強した方が良いかもと思いつつ、今回やらなかったらもう一生身に付かないかもと思って選びました。

# 楽しむための方法を探す
正直、自分は英語学習自体に関しては半ば諦めていたので、今回は初心者レベルの勉強法ばかりを選んでいます。まだ自分の中で確立している学習方法がないので、ちょっと齧っては良かったものだけ残しています。特に楽しめないと続けられないかと思うので、効率よりはハマりそうかを重視しています。こういう自分にあったものを探す時間も働いていると中々取れないので今回は慌てず探すことが目的です。

# 図書館でOxford Reading Treeを借りる
この1ヶ月で続いているものを幾つか紹介します。図書館に多読用の[Oxford Reading Tree](https://www.oupjapan.co.jp/ja/gradedreaders/ort/index.shtml?srsltid=AfmBOoqaDqV4d6QijsShRTicyjsdEKuI_xWsoGdnlQ27fOA11hRgPHCR)があり、薄くて、内容も簡単なので、これを借りて夜寝る前に声を出して読んでいます。多分中学生の英語の教科書よりも簡単な内容です。分からない単語はほぼないですが、それでも分からないことはあります。一旦はそのまま読んで、10回ぐらい読んでも分からないものGoogle翻訳で調べています。

# 3行日記を書く
次に[3行だけ日記](https://binnblog.blogspot.com/)を書いています。まず日本語で書いて、それを自分なりの英文にします。これをChat GPTに添削してもらっています。日によっては、それをベースに再度書き直す時もありますし、やらないこともあります。書き直してもなかなかズバリとは書けないですが、まあ続けています。

# Podcastを聞く
移動中とかランニング中とかにPodcastを聞いています。幾つか聞きましたが、その中でも特に簡単な[【聞くだけで覚えられる】簡単な英語表現・ 初級 | 聞き流しのリスニイング](https://www.youtube.com/@EnglishDo)を聞いています。これは日本語→英語→英語（単語ごとにゆっくり）→英語→英語と1文を4回言う所とゆっくり単語ごとに言うが気に入りました。これだと発音が分からなくても、聞けるので自分にあっていました。

# ChatGPTと会話
読む、書く、聞くは何となくやっているですが、会話がなかなかネックです。今回は[スマホのChatGPTを使ったカンタンAI英会話の練習方法！](https://o-juku.com/blog/2023/12/06/chatgpt-english-talk/)を読んでChatGPTと会話をしていますが、これも決定版という感じではないです。もしかしたら安い英会話探すかもしれません。喋るのだけは良い方法が分からない。。

# 英語のサイトを英語のまま読む
きっかけは[アルゴリズム問題](https://qiita.com/binnmti/items/61fcb52a04b6d7f64a86)を解くときに翻訳せずに読んでみようと思ったら結構理解出来たからです。動画も分からない所もありつつ、書きながら説明してくれるスタイルなので雰囲気で分かった気になれます。とはいえ、読めなければ翻訳するけど！

# 他はこれから
その他にも幾つか試した方法はありますが、まだ定着させるか迷っているものもあります。[Busuu](https://www.busuu.com/dashboard)も20回ぐらいやってみたのですが、これは勉強になっているのか疑問を持ってしまいましたｗ。あと、[Sakura English](https://sakura-english.jp/)も良かったので、少しずつ読んでいます。最近は[幸せなら手を叩こうの英語歌詞](https://www.youtube.com/watch?v=71hqRT9U0wg)が死ぬほど歌えないのでこれを歌えるようにしようと頑張っています。英語も1日1時間ぐらい、読書とかPodcastは別なのでプラスアルファというところです。さて効果はどうかなー。
レイヤードアーキテクチャについて再度言語化してみた

# はじめに
本記事は、Qiita Advent Calendar における IPFactory の投稿です。  
今回は、レイヤードアーキテクチャにおける各層の役割や構成を整理し、言語化してみたいと思います。

# レイヤードアーキテクチャとは
レイヤードアーキテクチャは、以下の4つの層から構成されるアーキテクチャパターンです。

- **ドメイン層**  
- **プレゼンテーション層**  
- **サービス層**  
- **インフラストラクチャ層**

## 層間の依存関係
ドメイン層は、すべての層から参照可能な基盤となる層です。  
そのほかの層は、下記の順に依存関係が形成されます。

1. プレゼンテーション層
2. サービス層
3. インフラストラクチャ層

この構造によって、ドメインロジックを中心に、上位層から下位層へと依存が限定的に流れるようになっています。

## 4層に分けるメリット
- 責務が明確化され、コード全体の見通しが良くなる
- ファイルやフォルダ構成を整理しやすく、大規模プロジェクトでの拡張性や保守性が向上
- 各層が独立性を持つため、置き換えや拡張が柔軟に行える

## 4層に分けるデメリット
- 階層分割に伴い、ファイルやディレクトリが増えやすい
- 初期設定やプロジェクト構成に手間がかかる
- 定義したルールや方針のチーム内共有・徹底が難しくなりがち

では、ここから各層の役割について順に説明していきます。

# ドメイン層
ドメイン層は、ビジネスロジックや業務知識をモデル化する中心的な層です。データの加工やビジネスルールの実装を担い、アプリケーション全体の根幹となります。

**例：マッチングアプリの場合（あくまで一例）**  
- Person（利用者を表すドメインモデル）  
- Matching（マッチング状態を表すドメインモデル）  
- Chatroom（チャットルームを表すドメインモデル）  
など

# プレゼンテーション層
プレゼンテーション層は、外部からのリクエストを受け付け、適切なサービスやインフラストラクチャ機能を呼び出す「入り口」役を担います。  
Webアプリケーションであれば、`Controller` が代表的な例です。また、バッチ処理やコマンドラインツールもこの層に該当します。

# サービス層
サービス層は、ドメイン層で定義されたビジネスロジックを組み合わせ、ひとまとまりの機能として提供する層です。  
基本的な指針として「1つのサービスクラスに1つのpublicメソッド」という構成が挙げられ、ビジネスロジックを分かりやすくカプセル化することができます。

# インフラストラクチャ層
インフラストラクチャ層は、DBや外部API、ストレージなどの外部システムとの接続や永続化処理を担います。  
インターフェースを挟むことで、具体的な実装を容易に差し替え可能とし、柔軟な運用・保守を可能にします。

# まとめ
- **ドメイン層**：ビジネス知識・ルールをまとめた中心的な層
- **プレゼンテーション層**：外部リクエストの受付口（UIやコントローラ）
- **サービス層**：ドメインロジックを組み合わせ機能単位で提供する層
- **インフラストラクチャ層**：外部システムとの通信や永続化を担う層

# 最後に
本記事では、レイヤードアーキテクチャを構成する4つの層について、その役割や特徴を整理しました。  
実装時には、理想的なアーキテクチャパターンと実際のコードが乖離するケースも少なくありません。そのため、プロジェクト固有の方針に従うことが最も望ましい一方で、より適した構成や実装方法があれば、積極的に提案することがチーム全体の改善につながると考えます。
以上、文章のみでの説明となりましたが、読者の方々がレイヤードアーキテクチャへの理解を深める一助となれば幸いです。
配列から undefined を簡単に除外する、カスタム関数 array.isEmpty() の作り方

# はじめに

こんにちは、エンジニアのkeitaMaxです。

JavaScriptで`array.map()`などのArrayMethodがあると思うのですが、これをカスタムして`array.isEmpty()`というのを作成してみます。

# やりたいこと

配列が`[]`と`[undefined,undefined,undefined]`となっている時に`array.isEmpty()`をよんで`true`にして、それ以外は`false`にするようなものを作成しようとおもます。

# 実装

```
array-extention
└─ src
  ├─ index.ts
  └─ rules
     └─ isEmpty.ts
```

というようなフォルダ構成にしました。

`index.ts`で作成したカスタム関数を使用できるようにしようと思います。

`isEmpty.ts`は以下のように実装しました。

```ts:isEmpty.ts
declare global {
  interface Array<T> {
    isEmpty(): boolean;
  }
}

Array.prototype.isEmpty = function (): boolean {
  return this.every(item => item === undefined) || this.length === 0;
}

export { }
```

```ts
declare global {
  interface Array<T> {
    isEmpty(): boolean;
  }
}
```

この部分で配列型に今回作成した新しいメソッド`isEmpty`をグローバルに追加しています。

```ts
Array.prototype.isEmpty = function (): boolean {
  return this.every(item => item === undefined) || this.length === 0;
}
```
この部分で実際にすべてが`undefined`だった時、もしくはから配列の時にtrueを返すように実装しています。

```ts
export { }
```
グローバルスコープを拡張するために、そのファイルを「モジュール」として認識させるために書いてます。

`index.ts`は以下のようにimportして拡張した関数を使用できるようにしました。

```ts:index.ts
import "./rules/isEmpty"
```

# 確かめる

`index.ts`に以下のコードを書いてエラーが起きないかどうか確認してみます。

```ts:index.ts
import "./rules/isEmpty";

const array = [undefined, undefined, undefined]
const result = array.isEmpty()
```

無事エラーは出なかったです。

# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！


# 次の記事


https://qiita.com/keitaMax/private/27f3dd4636c7e205d633
⽉間17億レコードを処理する動態管理システムのアーキテクチャ

この記事は[Hacobu Advent Calendar 2024](https://qiita.com/advent-calendar/2024/hacobu)の7日目の記事です。

## **はじめに**

株式会社Hacobu テクノロジー本部CTO室 室長の三木です。本記事は5/22 に行われた [アーキテクチャを突き詰める Online Conference](https://findy.connpass.com/event/314782/) で発表した「**⽉間17億レコードを処理する動態管理システムのアーキテクチャ**」のダイジェスト版になります。

Hacobuは 「持続可能な物流インフラを創る」のビジョンのもと、企業や業界の枠を越えた物流ビッグデータの蓄積・活用基盤となる「物流情報プラットフォーム」の構築を目指しています。人手不足や長時間残業といった物流の本質的な社会課題を解決するためには、様々なステークホルダーと連携しながら、データ駆動型のロジスティクスを社会に浸透させることが必要と考え、そのための手段として、物流DXを推進するSaaS型アプリケーションを提供しています。トラック予約受付サービス「MOVO Berth」、動態管理サービス「MOVO Fleet」、配車受発注・管理サービス「MOVO Vista」、生産・販売・在庫管理サービス「MOVO PSI」などのクラウドサービスと、コンサルティングサービス「Hacobu Strategy」を展開し、企業間物流の最適化を支援しています。本記事では、動態管理サービス「MOVO Fleet」のアーキテクチャや技術的挑戦について解説します。

MOVO Fleetは、通信型GPSトラッカーを利用して車両の位置情報や運行履歴を管理するサービスです。例えば、三菱食品様では全国3,500台の車両に導入し、効率的な配送ネットワーク構築に活用されています。この規模では、1日あたり約2,000万リクエストが発生します。

## アーキテクチャ全体像
![スクリーンショット 2024-12-04 22.37.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624650/b4f92408-56e4-6cf3-cf16-203707dc068f.png)


MOVO Fleet における位置情報処理のシステムは、AWSのサーバーレスアーキテクチャを活用して構築されています。特にAWS LambdaとAmazon Kinesisを中心とした構成が特徴です。Kinesis を利用することでデータをバッファすることができ、大量のデータを処理していくことができます。またLambda 側で障害が発生した場合でもデータロストを防ぐことができます。Lambda は内容別に4種類用意していて、Kinesisの拡張ファンアウト機能を利用して並列処理しています。それぞれのLambdaが位置情報の保存やジオフェンス処理などを担当し、現在は12本のシャードで運用しています。

## ジオフェンス処理の仕組み

wikipedia では次のように解説されています。

> **ジオフェンシング**（英：geofencing）とは実世界の地理に対応した仮想的な境界線で囲まれたエリアへの出入りや一定時間以上の滞在をトリガーにアクションを行う技術である。主にセキュリティや広告、通知を用いたサービスに用いられている。
> 

https://ja.wikipedia.org/wiki/%E3%82%B8%E3%82%AA%E3%83%95%E3%82%A7%E3%83%B3%E3%82%B7%E3%83%B3%E3%82%B0

Fleet におけるジオフェンス処理では、特定の地点（円形エリア）に一定時間以上滞在したことを検知し、記録を残します。この処理は次のようなステップで進行します。
![スクリーンショット 2024-12-04 22.45.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624650/06702bc5-9be9-1ba7-147c-ecb805621711.png)


このようなステップをトラックごとに時系列に実行していくことで、ジオフェンス処理を行うことができます。先ほど紹介したようにKinesisのシャードは複数用意していて並列処理を行っています。「トラックごとに」処理を実行していくには並列処理は相性が悪く、位置情報のレコードごとに別々のLambda で処理が行われると特定のトラックに関するレコードに注目した時に時系列で処理できない可能性が出てきます。そのため、車両IDをキーとしてKinesisのシャードにデータを分配するようにしました。こうすることで特定のトラックに注目すると、常に一つのシャードにデータが流れ続けることになり、意図通りにデータを処理することができます。

次にIoTデバイスからのデータ送信が何らかの理由で停止した場合を考えてみます。この場合、そもそもLambda 起動の契機となるデータがないことからデータ処理を行うことができません。しかしステップ3の基準時間経過の判定はデータのある・なしに関係なく実行したいです。この問題に対してはKinesis - Lambda のイベント駆動型の処理とは別にマイクロバッチを用意し、定期的にデータを監視・補正する仕組みを採用することで対応しました。

## **おわりに**

⽉間17億レコードを処理する動態管理システムのアーキテクチャについてダイジェスト版を紹介させていただきました。資料は[こちら](https://speakerdeck.com/hacobu/deng-tan-zi-liao-san-tuo-shi)に格納しているので、より詳しく知りたい方はご覧いただければと思います。
JuliaでCairo.jlを使って日本語を表示する 

## はじめに
windows環境で
日本語を表示するのに文字化けではまったのでその時の解決方法

```julia
using Cairo

surface = Cairo.CairoARGBSurface(400, 200)
context = Cairo.CairoContext(surface)

# 文字色を黒に設定
set_source_rgb(context, 0.0, 0.0, 0.0)  # 黒

# フォント設定
select_font_face(context, "sans-serif", Cairo.FONT_SLANT_NORMAL, Cairo.FONT_WEIGHT_NORMAL)
# set_font_face(context, "sans-serif")
# select_font_face(context, "メイリオ", Cairo.FONT_SLANT_NORMAL, Cairo.FONT_WEIGHT_NORMAL)
set_font_size(context, 24)

# 文字列を描画
move_to(context, 10,50)  # 文字列の開始位置
show_text(context, "こんにちは、Hello!")
display(surface)
println("終了")
```

## はまったポイント
set_font_face()がメソッドが反映されない
select_font_face()を使用すればＯＫ
フォント名には、「ＭＳ ゴシック」などwindows環境にインストールされているフォントを指定することが可能

## バージョン情報
Julia Version 1.10.4
Cairo.jl v1.1.1
Cairoライブラリ v"1.18.3"

```:バージョン情報
julia> versioninfo()
Julia Version 1.10.4

julia> using Pkg
julia> Pkg.status("Cairo")
Status `C:\Users\xxxxx\.julia\environments\v1.10\Project.toml`
  [159f3aea] Cairo v1.1.1

julia> using Cairo
julia> Cairo.libcairo_version
v"1.18.3"
```
Lightning ページコンポーネントの表示をフィルタリング

**使っているクラウドなどの小ネタ Advent Calendar 2024 22日目**

+ [パブリックグループに基づいて Lightning ページコンポーネントの表示をフィルタリングする](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J7alq)

>ロールとフィールド値に基づいてコンポーネントの可視性をフィルタリングできます。
推奨されているように、役割から離れつつあります。パブリック グループのメンバーシップを使用して可視性をフィルターする方法はありますか?

:::note
パブリック グループのメンバーシップに基づくコンポーネントの可視性の直接フィルタリングは現在サポートされていません。 

パブリック グループは主にレコードの共有に使用され、コンポーネントの表示をフィルター処理するために通常使用されるロールやプロファイルなどのユーザー属性には関連付けられません。
ただし、カスタム権限を使用して、特定のコンポーネントを表示できるユーザーを制御することができます。
以下の関連ディスカッションが役に立つかもしれません: 

+ [【アイデア】権限セットに基づくコンポーネントの可視性](https://ideas.salesforce.com/s/idea/a0B8W00000GdpMaUAJ/component-visibility-based-on-permission-sets)

ここに回避策があります。

https://help.salesforce.com/s/articleView?id=000386266&type=1

カスタム権限を作成 -> カスタム権限の下の権限セットに割り当てます
フィルターの表示に移動 -> カスタム権限を選択 -> trueに等しい権限を選択



+ [公開グループフィルター付きリストビュー](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A7zRYSAZ)

できません。パブリック グループはレコードに関連付けられていないため、グループ メンバーシップに基づいてレコードをフィルター処理することはできません。
:::