OmniAICreator/Qiita-1.07M huggingface dataset:
SEO対策しようとしているそこのあなた🫵🏻❗️SEO対策はクローラーを知るところから始めよう‼️

この記事は [ex-crowdworks Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ex-cw)の11日目の記事です。

# はじめに
今年、株式会社クラウドワークスを退職した@nisyuuです。日本原水爆被害者団体協議会の皆様、ノーベル平和賞受賞、誠におめでとうございます。
エンジニアとしてクラウドワークステック（旧クラウドテック）というフリーランスと企業をマッチングするエージェントサービスを開発していました。

クラウドワークステックのような検索流入を重視するサイトでは、Googleなどの検索エンジンでどのようにしてページが表示されるかを考える必要があります。
本記事では、SEO（検索エンジン最適化）におけるクローラーやインデックス、robots.txtなどの重要な要素について解説します。

# クローラーとインデックスとは？

**クローラー**は、検索エンジンがWebサイトを巡回し、情報を収集するためのプログラムです。集めた情報は検索エンジンのデータベースに登録され、この登録作業を**インデックス**と呼びます。

検索時にユーザーが入力したキーワードに基づいて、このインデックスが参照され、関連するページが検索結果として表示されます。

## クローラーの主な仕事
- ページのHTMLやメタ情報を取得
- リンクを辿って新しいページを発見
- サイトの更新を検知してインデックスを更新

# 検索エンジンの仕組み

Googleを例に挙げると、検索順位を決定するまでに以下の3つのステップがあります。

1. **クローリング**  
    - クローラーがページを巡回して情報を収集します
2. **インデックス**
    - 集めた情報を分類・整理し、検索用のデータベースに登録します
3. **ランキング**  
    - ユーザーの検索意図に基づいてインデックスされたページを評価し、検索結果の順位を決定します

# クローラーがWebサイトを発見する方法

クローラーは、リンクを辿って新しいページを発見します。このとき重要となるのが他のサイトから自分のサイトへ向けられた**被リンク**です。

## 被リンクの役割
被リンクがあることでクローラーに発見されやすくなります。信頼性の高いサイトからの被リンクは、SEOにおいてもプラスの効果があります。

# 検索順位を左右する要因

Googleの検索順位は、以下の要因で決まります。

- **コンテンツの質**  
    - ユーザーにとって有益で独自性のある情報が重視されます
- **リンクの質と量**  
    - 信頼性のあるサイトからのリンクが多いほど高評価を得られます
- **技術的な最適化**  
    - サイトの構造や速度、モバイルフレンドリーな設計も評価に影響を与えます

# robots.txtの活用と注意点

**robots.txt**は、クローラーに対してアクセスの制御を伝えるファイルです。
特定のページやディレクトリをクローリング対象外にできます。

## robots.txtの例
```plaintext
User-agent: *
Disallow: /private/
```

ただし、robots.txtでは検索結果への表示を完全に制御することはできません。
例えば、URLが他のサイトで共有されている場合、そのURLが検索結果に表示される可能性があります。

## noindexの利用
検索エンジンに表示させたくないページには、<meta>タグやHTTPレスポンスヘッダーでnoindexを指定することを推奨します。

### metaタグでのnoindexの例

```html
<meta name="robots" content="noindex">
```

Googlebotに対してのみ制御をかけたい場合は以下のように指定します。

```html
<meta name="googlebot" content="noindex">
```
また、メタタグを使用せずにHTTPレスポンスヘッダーで設定する方法もあります。

### HTTPレスポンスヘッダーでのnoindexの例

```text
HTTP/1.1 200 OK
X-Robots-Tag: noindex
```

# サイトパフォーマンスとアセットの許可
クローラーが正しくサイトを巡回できるようにするには、JavaScriptやCSS、画像などのアセットファイルへのアクセスをrobots.txtで許可しておく必要があります。これにより、Googlebotがページを正確に理解できるようになります。

## GoogleのURL検査ツールの活用
Google Search ConsoleのURL検査ツールを使えば、ページが正しくインデックスされているかやモバイルフレンドリーかを確認できます。

[URL検査ツールの詳細はこちら](https://support.google.com/webmasters/answer/9012289?hl=ja)

# おわりに
クローラーやインデックスの仕組みを理解し、クローラーやrobots.txtを正しく活用することはSEOの基本です。
基本を理解することで、検索順位を向上するためのSEO対策に取り組むことができます。

# 参考

https://www.crosswalk-seo.com/seo/%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%95%E3%82%8C%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF%EF%BC%88%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E5%8B%95%E3%81%8D%E6%96%B9/

https://www.leadplus.co.jp/inbound/blog/how-to-improve-your-search-rank.html

https://affiliate-million.com/twitterhilink/

https://developers.google.com/search/docs/advanced/guidelines/webmaster-guidelines?hl=ja#general

https://support.google.com/webmasters/answer/9012289?hl=ja
Google Geminiのマイグレーション能力を検証

# はじめに
この記事では、GoogleGeminiのマイグレーション能力がどの程度なのか、
ざっくり検証したものになります。
使用言語などは、以下のとおりです。

| 環境 | 詳細 | 
| - | - |
| Gemini | Gemini Advanced | 
| 現行 | Excel VBA |
| マイグレーション先 | Google Spreadsheet(GAS) | 

# 作業内容
現行のExcelVBAをGeminiさんに食わして、
GoogleSpreadsheet&GASソースに変換させました。
→Geminiさんへの食わせ方は[こちら](https://qiita.com/qks_nagata/items/5df0261e3c96b8095ab5)を参照ください

プロンプトは以下だけです。
>今からアップロードするExcel VBAから、spreadsheet gasを作りたいです。
>driveのリンクを貼るので、変換をお願いします。

# 検証
Geminiさんから、ソースまるごとお答えいただいたのですが、
さすがにそのままでは動きませんでした。
ただし、ちょっと手を加えただけで、すんなりと動いたのでかなり衝撃を受けました。

以下、主となる関数を対象に、
Gemini変換ソースと、実際に手を加えて動いたソースの差分を見ていきたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/146e7730-96f1-cb8b-37e3-c9b6dc13721a.png)

77行という簡単な関数ですが、
手を加えた箇所は1か所のみ。
rangeプロパティ？が抜けていたので、意図したセル範囲がとれていませんでした。
他には修正箇所がないので、すごい精度で変換してくれたのがわかります。
GASとの親和性があるのかもしれませんが、Geminiマジやばいです。

# おわりに
これを見てしまうと、マイグレーションという案件は消えてしまう、
もしくは消えなくて、要する工数は1割以下に圧縮されるんだろうなー、
という危機感と、新たなビジネスの可能性という期待感を強く感じました。

基本的なアルゴリズムの理解さえあれば、
誰でもプロンプトエンジニアとして最前線で活躍できるはずです。

仕事の探し方、受け方、エンジニアの探し方、アウトプットの評価など、
試行錯誤になると思いますが、検証しながらモデルケースを固めていかなきゃなーと感じました。

こちらからは以上です。
テスト自動化って

一年を振り返る Advent Calendar 2024の19日目です。

今までテスト自動化ってPytestとかJUnitとかでどうやるのかってのは知識としてはありましたが、自分ではテストコードとか書いたことがなく、アプリチームの人が頑張って書いてるのを見てるだけでした。

まさか転職してから自分がアプリチームに入ってテストコード書いたり自動化したりするようになるとは思わなかったですが、これもいい経験ということで思ったことを３つほど。

## 再帰テストがすぐできる
自分がエンジニアをやり始めた時は手でポチポチ動かしてエクセルにエビデンスのキャプチャを張り付けて泥臭いテスト実施をしていました。

そこからインフラエンジニアになったのでアプリのテストって10年ほどやってませんでしたが、これはとても便利だなと実感しました。頭でわかってても実際ソースコードを変更して再度テストするときに実行ボタン一発でテスト流せるのはめちゃくちゃ工数削減できるなぁと思いました。
こういうの頭でわかってても実際やってみて実感するのが大事だと思いました。(このブログで一番伝えたいのここ。実際やってみて実感するの大事。)


## 最初の製造に工数がかかる
自分のやり方が悪いのか、テストコード書くにあたって、プロダクションコード書いた工数と同等、もしくは1.3倍くらいの工数がテストコードの製造にかかってる印象がありました。
一回テスト設計して書いてしまえば次からはテストコードを育てていけばそんなに時間はかからないですが、最初のテストコードの製造がなかなかしんどいなと思いました。
プロジェクトって大体遅れてるので急がないといけない中でテストコードの製造に時間がかかってしまってあああああああってなるので、AIがさっさと業務要件理解してテストコード書いてくれる日が来るのを切に願います。

## 結局手動テストは一部発生する
製造していざ動かそうと思ったときに、実際問題すべてテストコードでテストできないことがあるので、一部は手動でテストする項目が出てきました。
なので完全にすべてを自動化するのはなかなか難しいなぁと思った次第です。

## まとめ
テスト駆動の本を読んでもうちょっと勉強したい。
[Babylon.js Vite] Inspector(デバッグツール)を本番環境ではバンドルさせない方法

## 概要
Babylon.jsの便利ツール「[Inspector](https://doc.babylonjs.com/toolsAndResources/inspector "Inspectorのドキュメント")」
わずか数行書き足すだけでデバッグがとても簡単になります。
ただし、これを含めてビルドするとバンドルサイズが跳ね上がります。
開発環境では有効にしつつ、本番環境ではバンドルに含めない方法を紹介いたします。

## コード
```jsx:JSX
import { Engine } from "@babylonjs/core/Engines/engine";
// その他いろいろインポート
// ここでは@babylonjs/inspectorをインポートしない

const BabylonScene = () => {
  const canvasRef = useRef(null);
  // 省略

  useEffect(() => {
    const engine = new Engine(canvasRef.current, true);
    // その他Babylon.jsの構成
    
    // 開発環境であれば@babylonjs/inspectorをインポート
    if (import.meta.env.DEV) {
      import("@babylonjs/inspector")
        .then(() => {
          if (scene.debugLayer) {
            scene.debugLayer.show({
              embedMode: true,
            });
          }
        })
        .catch((err) => {
          console.error("Inspectorの読み込みに失敗しました。:", err);
        });
    }

    return () => {
      engine.dispose();
    };
  }, [canvasRef]);

  return <canvas ref={canvasRef}></canvas>;
};
```
※ viteの環境変数について
https://vite.dev/guide/env-and-mode
LaTeXの表で横線を太くする

調べても簡単な解決策がすぐに出てこなかったので、私が書いてしまおうと思った次第。

`\usepackage{makecell}`のあと、`\Xhline{5pt}`を使えばいい。

```latex
\usepackage{makecell}  % プリアンブルにこれを追加
...
\begin{table}[htbp]
  \centering
  \caption{name}
  \begin{tabular}{cc}
    \Xhline{5pt}                  % ← ここ
    Name & Description \\ \hline  % ← これは普通
    A    & 0.7 \\ \Xhline{5pt}    % ← ここ
  \end{tabular}
\end{table}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817119/75a58e52-5388-9b19-fd8a-253fd1939e9d.png)
【Rails】古いログを自動で退避・削除する方法

ログファイルのローテーションを「ファイルサイズ」または「日付」で設定することができます。
設定は、`config/environments`ディレクトリ内の各環境ファイル（`test.rb`、`development.rb`、`production.rb`）に以下のコードを追加することで行います。

## 日付で設定する場合

- 日毎にローテーション
```ruby
  config.logger = Logger.new('log/development.log', 'daily')
```

- 週毎にローテーション
```ruby
  config.logger = Logger.new('log/development.log', 'weekly')
```

- 月毎にローテーション
```ruby
  config.logger = Logger.new('log/development.log', 'monthly')
```

日付で設定した場合はログファイルが自動的にローテーションされます。

## ファイルサイズで設定する場合

- 10MBごとに15個のファイルを保持

```ruby
  config.logger = Logger.new('log/development.log', 15, 10 * 1024 * 1024)
```

この設定を行うことで、指定した条件に基づいてログファイルが自動的にローテーションされ、古いログファイルが削除されます。
Llama 3.2をローカル環境(macOS)で実行してみる：完全ガイド

## はじめに
先日、Meta社から大規模言語モデル（LLM）の最新バージョン「Llama 3.2」が発表されました。このモデルは、文脈理解の向上、多言語対応の強化、推論速度の改善など、前バージョンから大幅にアップデートされています。特に小規模モデルでも高い性能を発揮する点が特徴です。  
本記事では、Llama 3.2の3Bモデル（3 Billion パラメータ）をローカル環境で動かす方法を紹介します。記事の中では、セットアップから実行、さらにはトラブルシューティングや応用例までを詳しく解説していきます。  

---

## Llama 3.2とは？
Llama 3.2はMeta社が開発した大規模言語モデルシリーズの最新バージョンであり、以下の改善が特徴です：

### 主な改善点
1. **文脈理解の向上**  
   - 長文コンテキストを処理する能力が向上（最大131,072トークンまで対応）。
2. **多言語対応の強化**  
   - 日本語やアラビア語、韓国語など、従来サポートが弱かった言語にも対応。
3. **推論速度の改善**  
   - 前バージョンに比べて平均25%高速化。  

さらに、モデルの軽量化も進み、3Bモデルや1Bモデルなど、ローカル環境でも動かせる選択肢が用意されています。

---

## セットアップの前に：事前準備
### 必要なツール
本記事では以下のツールを使用します：
- **ollama**：LLMをローカルで簡単に実行するためのオープンソースツール  
  [公式サイト](https://ollama.com/)  
- **Docker**：仮想環境を構築するためのツール  

### 推奨スペック
本記事では、以下の環境を使用しました：
| 項目   | 仕様             |
|--------|------------------|
| マシン | MacBook Air      |
| CPU    | Apple M3         |
| メモリ | 24GB            |
| OS     | macOS Sonoma 15.1.1 |

Dockerを利用するため、Docker Desktopがインストールされ、`docker`コマンドが正常に動作している必要があります。

### ollamaとは？
ollamaは、ローカル環境で大規模言語モデルを動かすためのオープンソースツールです。Docker上で動作し、GPUにも対応しています。以下の手順でollamaを使ってLlama 3.2をセットアップします。

---

## ollamaを使ったセットアップと実行
### ステップ1：Docker環境の確認
Dockerが正しくインストールされているか確認します：
```bash
docker --version
```
バージョン情報が表示されれば準備OKです。

### ステップ2：ollamaコンテナの起動
以下のコマンドを実行してollamaのDockerコンテナを起動します：
```bash
docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
```
各オプションの意味は以下の通りです：
- `-d`：バックグラウンド実行
- `-v ollama:/root/.ollama`：データ永続化用のボリュームマウント
- `-p 11434:11434`：ポートマッピング
- `--name ollama`：コンテナ名を「ollama」に設定

**補足：GPU環境を使用する場合**  
ollamaはGPU対応のバージョンも提供しています。詳しい設定方法は[ollamaのDocker Hubページ](https://hub.docker.com/r/ollama/ollama)を参照してください。

### ステップ3：Llama 3.2の実行
以下のコマンドでLlama 3.2モデルを起動します：
```bash
docker exec -it ollama ollama run llama3.2
```
デフォルトでは3Bモデルが起動します。1Bモデルを使用したい場合は以下のように指定します：
```bash
docker exec -it ollama ollama run llama3.2:1b
```

---

## 動作確認
### 英語での動作確認
まず英語で質問を投げかけてみます：
```bash
>>> what can you do ?
```
AIが以下のように応答します：
```plaintext
I'm an AI assistant, so I can help with a wide range of tasks and answer questions on various topics. 
```

### 日本語での動作確認
次に日本語で動作確認を行います：
```bash
>>> あなたは何ができますか？
```
以下のような回答が得られます：
```plaintext
私は、質問に答えたり、翻訳を行ったり、文章作成をサポートしたりできます。
```

---

## エラーとトラブルシューティング
### よくあるエラーとその対処法
1. **Dockerコンテナが起動しない**  
   → メモリ不足の可能性。Dockerのリソース設定を増やします。  

2. **ポート競合**  
   → 他のプロセスがポート`11434`を使用している場合、別のポートを指定してください：  
   ```bash
   docker run -d -v ollama:/root/.ollama -p 12345:11434 --name ollama ollama/ollama
   ```

---

## 応用例と拡張案
### 応用1：ファインチューニング
ローカルデータを使用してLlama 3.2をファインチューニングすることで、特定用途に最適化したモデルを作成できます。  

### 応用2：Web UIの活用
Open WebUIを導入することで、ブラウザ上から直感的にモデルを操作可能です。

---

## 今後の展望
Llama 3.2はローカルで動かせるLLMの可能性を広げています。将来的には、より大規模なモデル（11Bや90B）や低スペック環境での動作にも期待が寄せられています。  

---

## まとめ
Llama 3.2のセットアップから動作確認、応用例までを紹介しました。ollamaを使用すれば、LLMをローカル環境で簡単に実行可能です。セキュリティを重視した環境でLLMを活用したい方には特におすすめです。

いいねボタンやコメントでフィードバックをお待ちしています！
【合格体験記】AWS Certified Cloud Practitioner

## はじめに
AWS Certified Cloud Practitionerを5月に受験して合格したので、
だいぶ期間は空きましたが体験記を書いてみます。　
![IMG_7865.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934680/822e67a8-5b94-7f62-4fe5-fa3e22597783.jpeg)
今後CLFを受験する予定のある方の参考になれば幸いです。



## AWS Certified Cloud Practitionerとは

AWS Certified Cloud Practitioner （以降CLF）は、AWS クラウドの基本的な概念、
サービス、およびセキュリティについての理解を確認するための入門資格試験です。


## 試験範囲
[CLF-C02 試験ガイド]

https://d1.awsstatic.com/ja_JP/training-and-certification/docs-cloud-practitioner/AWS-Certified-Cloud-Practitioner_Exam-Guide.pdf

- 第 1 分野: クラウドのコンセプト (採点対象コンテンツの 24%)
- 第 2 分野: セキュリティとコンプライアンス (採点対象コンテンツの 30%)
- 第 3 分野: クラウドテクノロジーとサービス (採点対象コンテンツの 34%)
- 第 4 分野: 請求、料金、およびサポート (採点対象コンテンツの 12%)
---




## 使用教材
- Udemy
[【CLF-C02版】この問題だけで合格可能！  
AWS 認定クラウドプラクティショナー 模擬試験問題集（6回分390問）]
  
https://www.udemy.com/course/aws-4260/?srsltid=AfmBOorqS21OPwKo053U5kSR3kK7A7lD_hj6WXwmYcsydOfwvX6S5jBI&couponCode=V2JPLETSLEARN
  
  基本的にここに出てくる問題にすべて答えられるようになれば合格できます（笑）
  間違った選択肢の解説までしっかり読み、なぜこの問いだとこの選択肢が
  間違いなのかをしっかり理解できるようになるのがベストです。
  自分は基本レベル➀➁までは完ぺきに頭に入れていました。

- YouTube
 [AWS資格 対策講座]
 
 https://www.youtube.com/@AWS_course/featured
 
AWSの各サービスを短い動画でわかりやすく解説してくれているので
  隙間時間の勉強に最適です。
  過去問を解く前にまずこの動画から勉強し始めるのもおすすめです！

- 公式問題集
 [AWS Certified Cloud Practitioner 公式練習問題集]

https://explore.skillbuilder.aws/learn/course/16792/AWS%2520Certified%2520Cloud%2520Practitioner%2520Official%2520Practice%2520Question%2520Set%2520%28CLF-C02-%2520Japanese%29
 
 公式が用意している過去問題です。20問しかありませんが、無料で各選択肢に開解説もあるのでお金をかけたくない人にはおススメです！

---

## 学習期間
約10日間（2024年4月25日～2024年5月3日）

１～３日：試験範囲の確認、YouTubeなどで各サービスの理解を深める
３～７日：Udemyの過去問をひたすらに解く。
７～９日：試験日を決める。公式の過去問を解く。Udemyやる。
１０日　：　試験本番！

半年前の事なのでざっくりですが、こんな感じのスケジュールだった思います。
CLFの試験範囲くらいの内容であればとにかく過去問をたくさん解いて、
頭に詰め込んで暗記してしまうのが試験に合格するのに一番効率がいいです。

## 試験に受かるコツ
実際に自分で試験の受けてみて気づいたコツは以下の3つです。
- 試験日を決めてしまう
試験日が決まるとそこから逆算して残りの勉強に使える時間を割り出せるのでスケジュールが立てやすくなります。AWSのオンライン試験は試験開始時間の2４時間前までなら無料で予約のキャンセルができるのでとりあず申し込んでしまう作戦はおススメです！

- 自分が間違えやすいところをまとめておく
資格試験あるあるかもしれませんが自分が間違えやすい所を自分なりにまとめておくく事はおススメです。
まとめることで自分の頭の中が整理されて理解が進みやすいですし、試験直前にまとめておいた苦手部分を確認することで問題の正解率が跳ね上がります。
Udemyには苦手問題に印をつける「見直しマーク」という機能があるので自分はそれをよく使っていました。
---

## 試験当日の様子・思い出
- 試験方法はオンラインを選択
- 試験監督の言語は英語を選択



AWSのオンライン試験では試験問題と試験監督の使用言語を自分で選択する事ができます。
その中で自分は試験監督の言語を英語で選択しました。
（もちろん日本語も選択できます。）
理由は試験を受ける時間を自由に選択しやすいからです。

ＡＷＳのオンライン試験は自分で試験日と開始時間を予約するのですが、
試験管に日本人を選んだ場合、試験の開始時間が月～土曜の9時30～14時30分の間しか選べません。
対応時間がほぼ仕事中だったので泣く泣く英語の試験官にしました。。。
試験管が英語だと月～日のほぼすべての時間で予約できるのでおススメです！

ただ、試験前のチッックや試験中何らかのトラブルが出た時のやりとりもすべて英語なのである程度の準備は必要です。

https://blog.trainocate.co.jp/blog/online-e_028

試験前のやり取りの英語はこちらのサイトを参考に練習しました。
英語のリスニングが難しい場合でもチャットでのやり取りでも対応してくれます。

試験前に質問される内容はPearson VUEから届くメールにも書いてあるので試験を受ける前にしっかり確認しましょう。

https://www.pearsonvue.com/jp/ja/aws/onvue.html

---

## 感想
- クラウドの基礎知識を広く習得できた。  
- 今後の AWS の中級資格取得へのステップとして良い経験になった。
受験当時はAWSにあまり触れたことがほとんどない状態だったのでクラウドの基礎知識を広く習得できて良かった！
スケジュールを組んで短時間で効率良く合格することができて良かった！
---
【備忘録】GPOについて


# はじめに

Azure上でADサーバ構築をしながら、GPOについて勉強する機会がありましたので備忘録として残します。
構築手順などは一切なく、概念の理解が中心となります。

# GPOとは

ADサーバもしくはファイルシステムにおけるポリシーの設定のことを指す。コンピュータが起動した時にこの設定が適用される。基本的にはGPOの設定を変更したら変更されてから一定時間以内にコンピュータ側にも設定が反映される。
また、ポリシーにはコンピュータに適用する設定と、ユーザに適用する設定があり、コンピュータとユーザの設定ではコンピュータの設定が勝つ（上書きする）

また、サイト、ドメイン、OUの単位で設定が可能。どの単位でGPOを適用するかは事前に検討しておく必要がある。

https://learn.microsoft.com/ja-jp/windows-server/identity/ad-ds/manage/group-policy/group-policy-overview

# 処理順番

以下の順番で適用

1. ローカルグループポリシー
1. サイトにリンクされているGPO
1. ドメインにリンクされているGPO　
1. 組織単位（OU)にリンクされているGPO

※ローカルグループポリシーはADサーバ上でなく、コンピュータに自前で設定したもの

順番に処理されるものの、あとから適用したGPOが上書きする仕組みになっている。

詳細は以下サイトより

https://learn.microsoft.com/ja-jp/windows-server/identity/ad-ds/manage/group-policy/group-policy-processing

# こんな場合は？

#### OUの配下にOUがあった場合
親OUと子OUそれぞれにGPOを適用
どちらが優先されるか？
⇒子OUが優先

#### サイトやドメインから継承されるGPOを拒否できないのか
⇒できる
　継承を拒否する設定が可能

 #### サイトに設定したGPOを下位に強制することは？
 ⇒強制設定が可能

 #### 強制と継承拒否ってどっちが優先？
 ⇒強制が優先

 #### 信頼関係、親子関係があるときは？
 ⇒それぞれで割り当てたGPOがあり、それぞれドメインに適用していたとしたらそのままそれぞれのGPOが保持される
 ※「フォレスト間のユーザー ポリシーおよび移動ユーザー プロファイルを許可する」を有効化すると垣根を超えることも可

 分かりやすいサイトを見つけたので以下に貼っておきます。
 
[リンクの継承と優先度およびフィルタ機能](https://atmarkit.itmedia.co.jp/ait/articles/0608/24/news124.html)

# まとめ

GPOは柔軟に設定を駆使することで、様々な制御ができます
しかし、ドメインが複数存在したりすると一気に複雑になりますのでこの場合どうなるのか？と悩むことが多かったので整理してみました。
少しでも参考になると幸いです。
何か間違えている点があれば優しく教えていただけると嬉しいです。
PWA開発でiOSだけテキストボックスをタップしてもキーボードが表示されない

# 問題
PWAを用いたアプリ開発でiOSだけinput[type=text]のテキストボックスをタップしてもキーボードが表示されないという問題がいきなり生じた。

# 結論
まず結論から申し上げますと再起動したら直りました。

原因がなんだったのかよくわかりませんでした...
何かこれに関して知っている方がいらっしゃればコメント下されると助かります。

# 環境
iOSバージョン: 18.1.1

# manifest.json
```manifest.json
{
    "name": "xxx",
    "short_name": "xxx",
    "background_color": "#ffffff",
    "icons": [{
        "src": "https://xxx/icon.png",
        "sizes": "256x256",
        "type": "image/png"
      }],
    "start_url": "./",
    "scope": "./",
    "display": "standalone"
}
```

# 試したこと
viewportの設定が悪いのか、CSSとiOSのPWAとは互換性がないのか？といろいろ疑って数時間ほど経って解決せず、結局1日目は何も解決できず、2日目も同様にいろいろ試行錯誤したがダメだった。

AndroidやWindowsではPWAは正常に動作し、iOSのSafari、Chromeでも直接ブラウザならば正しく動作した。
なのにiOSでPWAとしてインストールしたときだけ使えなかった。
しかし開発した初級段階ではそんなことは起こらなかったのだ。

そして長時間CSSやJavaScriptをいろいろと見直してみたが、何も解決に至らず最終的にhtml単体で
```html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <link rel="manifest" href="./manifest.json">
        <link rel="icon" href="./icon.png" sizes="32x32">
        <link rel="icon" href="./icon.png" sizes="192x192">
        <link rel="apple-touch-icon" href="./icon.png">
        <link rel="mask-icon" href="./icon.png" color="#ffffff">
        <meta name="msapplication-TileColor" content="#ffffff">
        <meta name="theme-color" content="#ffffff">
    </head>
    <body>
        <input type="text" name="test" />
    </body>
</html>

```
と上記のみを試しにPWAにしてみたが、おや？
まったく動作しなかった。

もう何がなんだかわからなくなったのでとりあえずiPhoneを再起動して動作確認したところキーボードが表示された！

# 最後に
**原因不明なバグに遭遇したらとりま再起動しろ！** ということなのかもしれない。
ほんとになんのバグなのかもわからなかったが、ひとまず解決してよかった。今のところは安定してます。
UbuntuカーネルのREADMEをさらっとのぞいてみる

一年を振り返る Advent Calendar 2024の18日目です。書くネタがなさ過ぎてもはや一年振り返ってないですが書いていきます。

Ubuntuのカーネルのコードをのぞいてみようと思い以下のサイトを確認。

https://kernel.ubuntu.com/git/

1社目の先輩がエンジニア名乗るなら最低限lsコマンドとかcdコマンドのソースくらいは見とけと言ってたのでその辺は調べたことがありますが、あまりこういうの見たことないので見ていこうと思います。

TreeのTopにあるREADMEとかって何書いてるんだろう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626174/05dc458c-7ce6-1237-1050-8b771d5a3d74.png)


ほうほう。

<中身>

------------------------------
Linux kernel
============

There are several guides for kernel developers and users. These guides can
be rendered in a number of formats, like HTML and PDF. Please read
Documentation/admin-guide/README.rst first.

In order to build the documentation, use ``make htmldocs`` or
``make pdfdocs``.  The formatted documentation can also be read online at:

    https://www.kernel.org/doc/html/latest/

There are various text files in the Documentation/ subdirectory,
several of them using the reStructuredText markup notation.

Please read the Documentation/process/changes.rst file, as it contains the
requirements for building and running the kernel, and information about
the problems which may result by upgrading your kernel.

--------------

カーネルに関するドキュメントとして最初にこれを読めと。
Documentation/admin-guide/README.rst

居た。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626174/7f9eab35-450e-23f5-03da-57e6970f0bee.png)


うんたらかんたら書いてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626174/0786eed3-c35c-1dfa-80e6-9ff945921163.png)

というかこんなサイトがあるのか。
http://kernel.org/

なんかLinuxとは何ぞやとか、カーネルで問題が起きた時の対処法が書いてるよーって書いてますね。

POSIXとかいう単語を久々に見たな。やっぱりプロマネばっかりやってるとこの辺の知識が抜けてくるなぁ。

## まとめ
コントリビューターの人がめっちゃコミットしてるの見て、OSSって世の中の凄い人たちが頑張ってルール決めたりみんなのために良いプロダクトに育てていこうとしてるの見てなんか格好いいなと思いました。

こういうのたまには目を通しておいた方が良いな。

終わり。
Azure Machine Learningでプロンプトフローのデプロイ時にエラーが発生する場合

# プロンプトフローのデプロイ時に発生するエラー

BadRequest ContentやResource provider [N/A] isn't registered with Subscription [N/A]が発生した場合についての対処方法です。

## 対処方法

Resource providerを追加するとエラーが解消します。
以下のAccepted answerが分かりやすいです。
https://learn.microsoft.com/en-us/answers/questions/1983847/error-while-creating-a-managed-online-endpoint-in

Resource providerの追加方法が分からない場合は、以下も参考にしてみてください。
https://learn.microsoft.com/en-us/answers/questions/1983847/error-while-creating-a-managed-online-endpoint-in

## プロンプトフローのデプロイについて

Azure Machine Learningプロンプトフローとは、以下のことを指しています。
https://learn.microsoft.com/ja-jp/azure/machine-learning/prompt-flow/overview-what-is-prompt-flow?view=azureml-api-2

プロンプトフローを作成し、オンラインエンドポイントをデプロイしようとした時に、私は当該エラーが発生しました。
https://learn.microsoft.com/ja-jp/azure/machine-learning/prompt-flow/how-to-deploy-for-real-time-inference?view=azureml-api-2
面を作る話

## 点と線から面を作る
基本の、点と線、因子と水準をテストする話は、ここで書きました。
[[点と線、因子と水準の話]](https://qiita.com/EgaSaQA/items/56db9f23fa82ab1f4311)
今回は、点と線のテスト、因子と水準のテストで基本を固めた後の、次のステップの
テストの書き方です。

## 面の例
ここで、例えの前に、具体的に、何が面になるのかの例を書くと、

- 画面の1ページ
- 因子の塊
- 住所録の、ア行
- あるエンティティの塊（会員情報など）

などなど

一定の意味のあるテスト項目の集合体でもあります。
ここでいう面とは、概念なので、前提によって実体が変わることに注意してください。


## 点と線と面のイメージ
ここに、イメージ図を示します。
紫が因子、ピンクが水準として、因子を網羅することで、面ができていきます。
例えば、世界という面を作るとして、国という因子と水準を
テストするとします。国はもちろん、各国があり、その中の地域を
水準とイメージしてください。
日本だと、都道府県が水準になるとします。

因子（国）、地域（水準）が集まって、世界という面ができるのが
イメージできるでしょうか。

この図では、さらに世界の上に地球があるかもしれませんし、
火星や月があるかもしれません。

図中の濃い紫の線は、関連です。
たとえば、世界という面と、飛行機という面があったとして、
飛行機がつなぐ路線、のようなものです。お互いに影響のある水準同士、
因子同士、のイメージです。

![立方と.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156898/d4403989-ed04-68fd-a1fb-79ea678c20e1.png)

こうして作られたテスト範囲、因子水準からできる面、面同士をつなぐ関連、
そして面が多層にあつまると、立方体になる、というところを
イメージしていただけるとよろしいかと思います。

この層を、Single Condition（単一条件）と呼ぶか、Multiple Condition（複数条件）と
呼ぶかは、因子水準の性質によります。
初めて見る方には、少し慣れが必要でしょう。
Laravel Jobのhandle内からQueue IDを取得する方法


# Laravel JobでQueue IDを取得する方法

LaravelのJobを利用する際に、JobがQueueに登録されている`jobs`テーブルでどのようなIDを持っているのかを知りたいと思ったことはありませんか？ありますよね？

例えば以下のケースで必要です：

- **Jobの進捗管理**: 実行の進捗状況（%など）をフロントエンドから確認したい => Job実行中に%を更新したい
- **Jobの競合管理**: データベースの状態を利用して競合を防止したい => Job実行中にstateを更新したい

本記事では、Jobの中からQueue IDを取得する方法を述べます。

---

## 問題点

シンプルなLaravelのJobでは`jobs`テーブルに登録されているID（Queue ID）を取得することはできません。できないのかと思ったら、`InteractsWithQueue`トレイトを利用すると良いようでした。なんか`InteractsWithQueue`って何のためにあるんだろう？とか思ってませんでしたか？？

---

## 解決策: `InteractsWithQueue`トレイトの利用

### 実装例

以下のコードを見てみましょう。

```php
namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Log;

class TrackableJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue;

    /**
     * Execute the job.
     */
    public function handle(): void
    {
        // 現在のJobのQueue IDを取得
        $jobId = $this->job->getJobId();

        // ログ出力
        Log::info('Job executed: ' . $jobId);

        // ここでJobの進捗をデータベースに記録するなどの処理が可能
        // Progress::update($jobId, ['status' => 'completed']);
    }
}
```

### 結果

Jobが実行されると、`$this->job->getJobId()` によって現在のQueue IDが取得できます。


## 注意点

- **Queue Driverの互換性**:
  - `getJobId()` はデータベースドライバーで動作することは確認しました。他のドライバーでは異なる動作になる可能性があります。

---

## まとめ

`InteractsWithQueue` トレイトを利用すると、LaravelのJob内でQueue IDを簡単に取得でき、進捗管理や競合管理その他諸々を実現できます。

この`Queueable`トレイトはInteractsWithQueueを含んでいるので、これでも良いです。

https://github.com/laravel/framework/blob/11.x/src/Illuminate/Foundation/Queue/Queueable.php
【転職活動】己を知り 世界を知り!! 強くなれ!!!

# はじめに:sunny:

「転職活動を始めたきっかけ」、「始めた頃」、「終わった今」の三つの時間軸で振り返りを行い、「あのときやっておけば良かったこと」、「やっておいて良かったこと」をかんたんにまとめました。

# 転職活動を始めたきっかけ

チームメンバーが「転職ドラフト」というサービスを利用し始めたのがきっかけでした。
外の世界を知り、今の自分の市場価値を知るために始めたとのことでした。

当時の私も市場価値を知るため、サービスに登録しました。

登録後は、職務経歴書を提出する必要があったのですが、これが大変でした。
まず数年前のプロジェクト内容を思い出し、その後は要点をまとめる必要がありました。

私の場合、この作業に一週間ほどかかりました。

### やっておけばよかった
- 職務経歴の定期的な棚卸

### やっておいてよかった
- 流行りに乗っかってサービス登録


# 始めた頃

無事に職務経歴書を提出し、ついに企業から指名をもらった私は意気揚々とカジュアル面談や選考を受けます。

一次面接を突破したあとにやってくる技術課題や技術面接...

「わ・・・わからねェ」

「こんな・・・バカな事があるか・・・・・・！！！」

「そんなわけねェよ・・・」

「いくら何でもこんなに遠いわけねェ・・・！！！」

結果はボロボロでした。
高い期待をされていたのか、テックリード枠で指名をいただくことが多かったのですが、課題や面接で聞かれている内容で分からないことがしばしばありました。

この時、このままだといけないことに気づきました。
今後のキャリアを考え始めた頃でもあったので、ダメージは大きかったです。

一方で、中には課題のレベルを越えているものもあり、思い切って辞退した方が良かったです。
自分のスキルアップのために課題を終わらせましたが、付け焼き刃なのでその後の面接でお祈りされました:sweat_smile:

### やっておけばよかった
- 希望枠がテックリードなのか、メンバーなのか明らかにする
- 自分のレベルをもっと早く知る
- 課題の量が明らかに多い場合は選考を辞退する

### やっておいてよかった
- テックリード枠の選考も受け、今のレベルを知ったこと
- 課題から逃げなかったこと


# 終わった今

紆余曲折を経て、無事内定をいただきまして、新環境で頑張っています。
しかし、内定はゴールではなく、通過点に過ぎません。

内定先で何をしたいのか、何ができるようになりたいのか、が大事だと思います。
面接でよく聞かれる「どのポジションで、なにを、なぜ、どのように、どのような結果に」を意識して、再現性のある取り組みを続けていきたいと考えています。

次の転職を考えているわけではないですが、
何も考えずに働いていて、後ろを振り返った際、後に引けなくなっている状況だけは避けたいですね。

転職活動は夏休みの宿題や定期試験のように短期間の付け焼き刃でどうこうできるようなものではないな、と感じました。


「しっかりしやがれ！！！」

「これからだぞ！！！　"新世界"は！！！」


### やっておけばよかった
- 業務で再現性を意識する
- やりたいことに関して、自分である程度やっておく（入社後やりたいです、は企業側からはあまり良い印象ではないと思います）

### やっておいてよかった
- （なんちゃって）リードポジションの経験
- チームに色々導入する経験
- 他チームを巻き込んでの勉強会開催など


# おわりに
もっと強くなります💪
[Delphi][小ネタ] XorShift

# はじめに

[９日に引き続き](https://qiita.com/pik/items/c3530f222a99365b32d2)乱数の話です。
今回はアルゴリズムの話で、XorShift についてです。

# XorShift とは
[Wikipedia](https://ja.wikipedia.org/wiki/Xorshift) によると
> Xorshiftは疑似乱数列生成法の1つである。
> George Marsagliaが2003年に提案した。
> 演算が排他的論理和とビットシフトのみであるため高速であるなどの特徴がある。

とのことで、メルセンヌ・ツイスタとかより非常に高速なのに、周期もそこそこ長くて使い勝手が良い乱数生成法です。

# 実装
Delphi での実装はこんな感じ

```delphi
function XorShift: UInt32;
begin
  // FA は初期化されている必要がある
  FA := FA xor (FA shl 13);
  FA := FA xor (FA shr 17);
  FA := FA xor (FA shl 5);
  Result := FA;
end;
```

今回、これも Unit 化しました。

# Unit 化

```delphi
unit PK.Math.XorShift;

interface

implementation

uses
  System.SysUtils;

type
  TXorShift = record
  private class var
    FA: UInt32;
  private
    class procedure Init; static;
  public
    class procedure SetSeed(ANewSeed: UInt64); static;
    class function Execute: UInt32; static;
  end;

{ TXorShift }

class function TXorShift.Execute: UInt32;
begin
  FA := FA xor (FA shl 13);
  FA := FA xor (FA shr 17);
  FA := FA xor (FA shl 5);
  Result := FA;
end;

class procedure TXorShift.Init;
begin
  FA := Round(Frac(Now) * 24 * 60 * 60 * 1000) mod 1000;;
  Random32Proc := Execute;
  RandomizeProc := SetSeed;
end;

class procedure TXorShift.SetSeed(ANewSeed: UInt64);
begin
  DefaultRandomize(ANewSeed);
  FA := RandSeed;
end;

initialization
  TXorShift.Init;

end.
```

ここで新たな [RandomizeProc](https://docwiki.embarcadero.com/Libraries/ja/System.RandomizeProc) 変数が出てきました。
これは Randomize 関数を呼んだ時に、こちらで指定した関数が呼ばれるようにする物です。
XorShift は初期化が必要なので、これを使って初期化できます。
Randomize を呼ぶと、時刻を元にした値がやってきます。

ここでは、それを [DefaultRandomize](https://docwiki.embarcadero.com/Libraries/Sydney/ja/System.DefaultRandomize) 関数に渡して、初期化を代行させています。
DefaultRandomize では [RandSeed](https://docwiki.embarcadero.com/Libraries/Sydney/ja/System.RandSeed) 変数にシード値を入れてくれるため、それを使って ```FA``` メンバ変数を初期化しています。

# サンプル
[前回と同じサンプル](https://qiita.com/pik/items/c3530f222a99365b32d2#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB)を動かしてみました。

結果はこうなりました。
```console
0 949
1 1036
2 973
3 1047
4 1006
5 1024
6 991
7 989
8 987
9 999
```

# まとめ
XorShift は性能と高速さを併せ持っているので通常の乱数を使う場面であれば、ほぼ万能と言えます。
暗号論的強度はない（次の数字が予測可能である）ため、その用途には CNG Random が向いています。

ちなみにシード値を指定できるタイプの乱数生成では、同じシード値からは必ず同じ乱数列が生成されます。
その性質のため、ゲーム等で役に立ちます。
たとえば、[ぷよぷよ](https://puyo.sega.jp/portal/index.html)で２人プレイの場合、２人に同じぷよが降ってくる必要がありますが、同じシード値を持った乱数生成関数があれば、容易に実現できるのです。
「志望理由＝年収を上げたい」だけではあかんのか？

転職活動の目的にキャリアアップや成長とか掲げることが多いですが、お金が大前提としてあるはずです。
本記事では過去の転職活動におけるしくじりについて書きます。
転職を考えているITエンジニアに寄り添うことができればいいなと思います。

## TL;DR
- 年収アップのためにブリブリなキャリア像を描くな
- 志望理由は活躍できそうだからでOK！
- 搾取されるな！年収アップは当然の権利

## ほんとうにあったダメな転職の話
20代後半のソフトウェアエンジニアであるFは大企業でバックエンドの開発の仕事をしていた。
周りにちらほら転職する人が現れてきて、どうやら年収もガッツリあがっていると知り、転職活動をすることにしました。
ただ大企業で恵まれていた環境にいたFは年収を上げたい以外の転職理由がありません。今の働き方に不満はなかったのです。
だからFは転職を正当化するためにキャリアプランを捏造することにしました。例えば、


− 今の会社ではフロントエンドができないから、転職したい(勉強はしてない)  
- パブリッククラウドを使いたい(勉強はしてない)  

といった感じです。
採用企業に真っ当な志望理由に見えるように媚を売ったのです。
もちろん面接ではボロが出まくりです。「あーこいつ全然勉強してねーじゃん」と逆効果になり内定を得ることはできませんでした。

## 媚を売るな、実績の再現性を語れ
ダメな話では、自分本位で転職活動して玉砕しました。採用企業側の視点を持っていればキャリア像の捏造は無駄であると気づいたはずです。
採用企業が評価するのは候補者の仕事の再現性です。「その実績があるなら、あの仕事は任せられる。なら給与は〇〇くらいか」と評価するはずです。
媚を売っても実績が伴わないなら、ただのぶりっ子ちゃんです。


## 志望理由の作り方
基本的に活躍できる根拠を伝えれば大丈夫です。
採用企業の求人票の必須要件、歓迎要件に自分の経験と実績を関連づけて説明して採用しない理由をなくせば内定が得られるはずです。

## それでも年収をあげたいよう
ならば年収提示付きスカウトの転職ドラフト使おうぜ！！
といのも一つの答えですが、個人的には年収は当然主張して良い権利です。
相場観と現在の年収を見て現実的な希望年収を自信を待って伝えるべきです。
慣れた会社を辞めてリスクを負って転職するのです。報酬が増えるのは当然だと思います。


## 結局、「志望理由＝年収上げたい」じゃあかんのか？
あかんくないです！！！！

日々の業務で実績、スキルを積み上げて大幅年収アップを実現しましょう！
がむしゃらに働く中でお金より大切なものもが見つかるかもよ
Sequence MakerとGPIB-USBコンバータを使用して制御する

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence Makerはいろいろなインターフェイスに対応していて、当然GPIBでの通信にも対応しているのですが、市販されているUSB-GPIB変換器は非常にお高めです。最近の測定器であればLANやUSBが搭載されているので、そもそもGPIBを使うこともあまりないのですが、ちょっと古めの測定器だとやはりGPIBが必要となってきます。この記事では自作のGPIB-USBコンバータとSequence Makerを使用して、手軽にGPIB機器を制御する方法を紹介します。なお、Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## GPIB-USBコンバータの製作
まずはGPIB-USBコンバータを自作する方法です。ネットで探すといくつか見つかると思いますが、部品の入手性やマイコンの開発環境の構築の容易性などを考慮すると、Arduinoで作るのが良さそうです。
このあたりが参考になります。

https://www.akatsuki-lab.co.jp/Test/USB-GPIB-Conv.htm

Arduinoのスケッチはこのあたりに公開されています。

https://egirland.blogspot.com/2014/03/arduino-uno-as-usb-to-gpib-controller.html

要はArduinoの入出力ピンにGPIBのコネクターを接続すればOKなわけです。ただし、ここでネックなのが、GPIBのコネクターがなかなか入手しにくいということです。（AliExpressなんかで探せばあったりしますが）
そこで、一番簡単なのは、ヤフオクあたりで1000円くらいのGPIBケーブルを購入して、半分にぶった切ってArduinoと結線する方法です。ちょっと見た目はアレですが、動作には問題ありません。3Dプリンタなんかでケースまで作ると、それなりにかっこよくなります。

https://ehbtj.com/electronics/gpib-usb-converter-and-monitor-tool-for-advantest-r6551/#GPIB-USB

## 制御
ArduinoをSequence Makerする手順は以下の記事を参考にしてください。

https://qiita.com/sequencemaker/items/e68cf7d242e01de62f97

::: note alert
**注意**
Sequence Makerは「DSR/DTR」にチェックが入っているとArduinoがリセットしてしまうので、インターフェイスの詳細設定画面でチェックを外します。また、スピードは**115200**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/a0c74707-deee-1258-8e7b-071cf57853f4.png)
:::

実際の通信シーケンスは以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/acbc3f6f-acb9-5592-d432-b0187dc35c8f.png)

最初に設定されているアドレスを確認します。GPIB-USBコンバータでは「++addr」と送ると現在設定されているGPIBアドレスを応答してくれますが、Sequence Makerではコマンドに「?」が含まれていないと受信処理をしないので「#QUERY」コマンドを組み合わせて受信するようにしています。
また、今回は測定器に設定されているGPIBアドレスが3なので、「++addr 3」コマンドを送ってアドレスの変更をしています。
最後に「*IDN?」コマンドを送りますが、先ほどとは逆に「?」が含まれていますが受信処理はしたくないので、コマンド送信だけを行う「#WRITE」コマンドを組み合わせています。その後「#QUERY(++addr)」を送れば応答が返ってきます。

## トラ技の記事も参考になる！
2024年5月号のトラ技に今回紹介した内容と同じことがわかりやすく記事にまとめられています。この記事によると変換器は3,000円ほどで作れるそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/64098041-672a-262e-5940-06cd9849fd7e.png)

（https://toragi.cqpub.co.jp/wp-content/uploads/p190-9.pdf より引用）

## まとめ
今回は自作のGPIB-USB変換器とSequence Makerを組み合わせてGPIB制御する方法を紹介しました。GPIBアドレスの切り替えをうまくやれば、複数台の測定器を制御することも可能なようなので、ぜひチャレンジしてみてください。
Active RecordにおけるCoC

# Active RecordにおけるCoCとは命名とスキーマについていくつかの規約に従えば
>Active RecordにおけるCoC（Convention over Configuration）
>他のプログラミング言語やフレームワークでアプリケーションを作成すると、`設定のためのコードを大量に書く必要が生じがちです。一般的なORMアプリケーションでは特にこの傾向があります`。しかし、Railsで採用されている規約に従っていれば、`Active Recordモデルの作成時に書かなければならない設定用コードは最小限で済みます`し、設定用コードが完全に不要になることすらあります。
>
>Railsでは、アプリケーションの設定方法がほとんどの場合に同じになるのであれば、その方法をフレームワークのデフォルト設定にすべきという「設定よりも規約（Convention over Configuration）」の考えを採用しています。`設定を明示的に行う必要があるのは、規約に沿えない事情がある場合だけ`です。
>
>Active Recordで`「設定よりも規約」を活かして楽に開発するには、命名とスキーマについていくつかの規約に従う`必要があります。命名規約は必要に応じてオーバーライドすることも可能です。

https://railsguides.jp/active_record_basics.html#:~:text=2-,Active%20Record%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8BCoC%EF%BC%88Convention%20over%20Configuration%EF%BC%89,%E5%BF%9C%E3%81%98%E3%81%A6%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%82%A4%E3%83%89%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%82%82%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82,-2.1%20%E5%91%BD%E5%90%8D%E8%A6%8F%E7%B4%84

## 命名規約
>Active Recordには、モデルとデータベースのテーブルとのマッピング作成時に従うべき規約がいくつかあります。

### 不規則な語でもpluralizeメソッドで複数形になる
>`Railsでは、データベースのテーブル名を探索するときに、モデルのクラス名を複数形にした名前で探索`します。たとえば、`Bookというモデルクラスがある場合、これに対応するデータベースのテーブルは複数形の「books」`になります。Railsの複数形化メカニズムは非常に強力で、`不規則な語でも複数形/単数形に変換できます`（person <-> peopleなど）。これにはActive Supportの pluralizeメソッドが使われています。

### モデルのクラス名が頭文字を大文字に、テーブル名は小文字をアンダースコアにする
>`モデルのクラス名が2語以上の複合語である場合、Rubyの規約であるキャメルケース`（語頭を大文字にしてスペースなしでつなぐ記法。例：SampleName）に従ってください。一方、`テーブル名はスネークケース（小文字とアンダースコアで構成する記法。例：sample_name）にしなければなりません`。以下の例を参照ください。

https://railsguides.jp/active_record_basics.html#:~:text=2.1-,%E5%91%BD%E5%90%8D%E8%A6%8F%E7%B4%84,%E3%81%B0%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E4%BB%A5%E4%B8%8B%E3%81%AE%E4%BE%8B%E3%82%92%E5%8F%82%E7%85%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82,-%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9

## スキーマの規約
>Active Recordでは、データベースのテーブルで使うカラム名についても、カラムの利用目的に応じた規約があります。
>
>主キー（primary key）: デフォルトでは、Active Recordはテーブルの主キーとしてidという名前の整数型カラムを利用します（PostgreSQL、MySQL、MariaDBの場合はbigint型、SQLiteの場合はinteger型）。`idカラムは、Active Recordのマイグレーションでテーブルを作成すると自動的に作成`されます。
外部キー（foreign key）:これらのフィールドは、`単数形のテーブル名_idパターンに沿って命名`する必要があります（例: order_id、line_item_id）。これらは、モデル間の関連付けを作成するときにActive Recordが探索するフィールドです。

https://railsguides.jp/active_record_basics.html#:~:text=2.2%20%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%9E%E3%81%AE,%E3%81%99%E3%82%8B%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%A7%E3%81%99%E3%80%82

# 感想
普段知らず知らずのうちにCoCにしたがっていたことを理解できた。
仮想記憶に関してふわっと理解する

# はじめに

今回は仮想記憶について書きたいと思います。仮想記憶という言葉自体はよく聞きますが、聞くだけで良くわかっていないままだったので、これを機にふわっとですが、まとめて見たいと思います。

# 仮想記憶とは何なのか

仮想記憶を一言でいうと、**主記憶や補助記憶装置を意識しなくてよくする技術**です。

じゃあ、誰が意識しなくて良くなるのでしょうか？

それは主記憶や補助記憶装置に保存されるデータたちです。

データたちからは仮想記憶しか見えなくなり、実記憶は見えなくなります。(実記憶は物理的なメモリ空間のことを言います。)

# そもそもなぜ意識させないようにしているのか

これは実記憶に直接データを配置するときに物理的制約があるためです。上記でも述べていますが、実記憶というのは物理的なメモリ空間です。

そのため、記憶するデータが連続したスペースが必要な場合、連続したスペースを作ってあげなければいけません。

これが、物理的制約であり、主記憶や補助記憶を意識させないようにしたいモチベーションとなっていることが分かるかと思います。

# どのような流れで物理的制約が無くなっているか

流れを以下の図で示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831555/0519c797-c025-53c8-195f-75905383c49d.png)

このように、仮想記憶を主記憶として扱うことで、実記憶の配置に関わる物理的制約を意識してよくなります。

ちなみに、変換し、紐づけをする仕組みを**動的アドレス変換機構 (DAT：Dynamic Address Translator)** といい、この仕組みを担っているのは**メモリ変換ユニット (MMU：Memory Management Unit) と**言うようです。

# **実記憶がいっぱいになったらどうするのか**

**補助記憶**にデータをマッピングしていきます。

上の図を見てわかるように、データからは仮想記憶しか見えておらず、物理的な実記憶は見えていないので、マッピング先が実記憶でないといけないわけではありません。

ということで、実記憶の容量が足りなくなった場合は、**補助記憶**にデータをマッピングしていきます。

# まとめ

とっつきにくい概念だなと思っていましたが、主語や背景を理解していくことで前よりも理解が深まったかなと思います。

何か間違いがあれば、ご指摘いただけるとありがたいです。

最後まで読んでくださり、ありがとうございました。

# 参考文献

- キタミ式イラストIT塾 応用情報技術者 令和05年 P328~P332
- https://wa3.i-3-i.info/word17757.html
気軽にIoTに触れる

デジタルフォトフレームが欲しいと思った事があるのですが、
探してみると大半がスマホアプリ経由で画像登録する方式。
いちいち画像を送るのがめんどくさい。NASのデータを垂れ流したい。

結局要望に合う商品は見つからず、自作でこれを対応している様な記事は見かけたのですがITエンジニアでIoTといえば**Raspberry Pi** なんですよね。敷居が高い～～～ (結局GoogleNestHubを購入した話をするか賭けます?)

さて、前置きが長くなりましたが気軽にIoTに触れられたのでご紹介します。途中で問題が生じて成果はイマイチですが、その辺も苦労話としてお読みいただければと思います。

## SwitchBotの簡単な紹介
簡単にIoT家電を導入できる商品を多数取り揃えている会社さんです。
電器屋さんで一番安い加湿器を購入した際に湿度計を買い忘れていたので、
ネットで探してみてたまたま目には止まり、温湿度計を購入してみました。しかも安い。
## スマホアプリで情報取得してみる
公式のアプリ「**Switch Bot**」をインストールします。iOS, android両対応です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214861/083fa638-cada-6c59-d416-38404cebf82f.png)

bluetoothで対象機器から情報を収集している様です。
温度: カニさん何だろうと思ったら部屋の換気をした頃ですね。
![Screenshot_20241206_222112_SwitchBot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214861/81f91a5d-871b-4b69-3c67-9bfaf5a80a88.jpeg)

湿度: 40%～60%だと快適な様です。
![Screenshot_20241206_222137_SwitchBot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214861/ebf6b679-5e65-a751-d77e-e45f0ceee371.jpeg)
## APIで情報取得してみる
### API仕様
https://github.com/OpenWonderLabs/SwitchBotAPI#switchbot-meter-example
→ リンク先はC#のサンプルコードにジャンプします。
ver1.0から1.1に上がったそうです。
今回は温湿度計(Meter)を見ていきます。
### Get device list
Request
```
GET /v1.1/devices
```
Response
```
{"statusCode":100,"body":{"deviceList":[{"deviceId":"CA5FC0C6735E","deviceName":"温湿度計 5E","deviceType":"Meter","enableCloudService":false,"hubDeviceId":""}],"infraredRemoteList":[]},"message":"success"}
```
"statusCode":100　：http通信成功
"deviceType":"Meter"　:温湿度計
"deviceId":"CA5FC0C6735E" :デバイスID

このデバイスIDを使用して
### Get device status
Request
```
GET /v1.1/devices/{deviceId}/status
```
Response
```
{"statusCode":100,"body":{"version":"V3.1","temperature":0,"battery":0,"humidity":0,"deviceId":"CA5FC0C6735E","deviceType":"Meter","hubDeviceId":"000000000000"},"message":"success"}
```
http通信は成功しているけど、明らかに値が取得できていない。。。
### 色々疑ってみる
2段階通信をONにしてみる → 変化なし
APIの不具合を疑いver1.0を試す → 変化なし
ファームウェアのバージョンは? → 最新
全て机の上に並べて思考停止して試す... どうなってんだ??初期不良??
### 公式に問い合わせてみる
初期不良疑えばいですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214861/24e69508-71b9-40c1-5583-d70f48e7dc82.png)
APIに関してはGithubのIssueか、アプリから問い合わせるよう教えていただきました。不具合疑えばいいですか?がもう失礼だ。。。反省。。。
### 解決
Responseにあった
"hubDeviceId":""、 "hubDeviceId":"000000000000"
これは機器がインターネットに繋がってないという意味との事でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214861/956c2cfe-be74-46c5-9348-c971b80e1cd6.png)
めっちゃ書いてある
え、じゃあIoTしてないじゃん。

スマホ:機器 間での情報取得はBluetooth
API:機器 間での情報収集はインターネットを介して
SwitchBotのクラウドストレージにアクセスしている為、hubが必要らしい。

https://support.switch-bot.com/hc/ja/articles/360038241113
https://support.switch-bot.com/hc/ja/articles/7257579858455
前段で購入していたGoogleNestHubではダメなそうです。
## 総括
室温・湿度に応じて エアコンや加湿器の設定を変更できたら便利そうですよね。
生活が便利になるスマート家電、家電をスマート家電化するIoT機器が他にもいっぱいある様です。是非チェックしてみてください。
https://www.switchbot.jp/

詰まった点の答えは全て載っていたので確認がまだまだ甘かったと反省します。
Laravel JobにClosureを渡して実行させたくない？


# Laravel Jobのコンストラクタ引数にクロージャを渡す方法

LaravelのJobを利用する際に、コンストラクタの引数としてクロージャを渡したいと思ったことはありませんか？通常の方法ではクロージャはシリアライズできないためエラーになりますが、シリアライズ可能なクロージャを使えば、この問題を解決できます。

本記事では、Job実行中にクロージャを活用する方法を解説します。

## 問題: クロージャをそのまま渡せない

LaravelのJobクラスでは、コンストラクタに渡されたデータはシリアライズされ、Queueに保存されます。しかし、PHPの標準クロージャはシリアライズできないため、エラーが発生します。

### エラー例

```php
class MyJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $closure;

    public function __construct(\Closure $closure)
    {
        $this->closure = $closure;
    }

    public function handle(): void
    {
        ($this->closure)();
    }
}

// Dispatchする
MyJob::dispatch(function () {
    echo 'This is a test.';
});
```

このコードを実行すると、次のようなエラーが発生します。

```
Serialization of 'Closure' is not allowed
```

## 解決策: クロージャのシリアライズ対応

`opis/closure`パッケージを利用すると、シリアライズ可能なクロージャを作成できます。

### 必要なパッケージのインストール

まず、`opis/closure`パッケージをインストールします。

```bash
composer require opis/closure
```

### Jobクラスの修正

`SerializesModels`トレイトと`SerializableClosure`を活用して、Jobクラスを修正します。

```php
namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Opis\Closure\SerializableClosure;

class MyJob implements ShouldQueue
{
    use Dispatchable, Queueable

    public $closure;

    public function __construct(\Closure $closure)
    {
        $this->closure = new SerializableClosure($closure);
    }

    public function handle(): void
    {
        // クロージャを実行
        ($this->closure)();
    }
}
```

### 実行例

上記の修正後、次のようにクロージャを渡してJobをDispatchできます。

```php
use App\Jobs\MyJob;

MyJob::dispatch(function () {
    echo 'Job実行中にこのクロージャが実行されます！';
});
```

Queueが処理されると、以下の出力が得られます。

```
Job実行中にこのクロージャが実行されます！
```

## 注意点

- **セキュリティ**: クロージャをシリアライズしてQueueに保存するため、信頼できるコードのみを扱うようにしてください
- **依存関係**: クロージャ内で外部変数やサービスコンテナへの依存がある場合などはどうなんでしょうね

## まとめ

LaravelのJobでクロージャを扱うには、`opis/closure`を利用してシリアライズ可能なクロージャを作成できます。皆様のエレガントな抽象化を祈念いたします。
Android環境でZSH環境を用意してみた

# はじめに

この記事は、Qiita Advent Calendar 8日目の記事です。
以下の記事より、すべての記事をご覧になれます。

https://qiita.com/0_terarin_0/items/2b60d47a2d0e64a273c3

# 本編

今回はターミナルエミュレータアプリのTermuxを使いました。

https://play.google.com/store/apps/details?id=com.termux&pcampaignid=web_share

さて、Macと同じ環境を用意しましょう。

```zsh
# 初期設定
termux-setup-storage

# 遊んでみる
pkg install fastfetch
fastfetch

#　ZSH環境を整える
pkg install zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
```

これでとりあえずZSHの環境自体は整いましたが、もう少しだけ便利に使えるようにします。Android上のTermuxで公開鍵認証を作成し、ADBのポートフォワードを経由してUSB接続でSSHをします。公開鍵認証のユーザー名は適宜変更してください。

```zsh
ssh-keygen -t rsa -b 4096 u0_a000
cat key.pub >> ~/.ssh/authorized_leys
```

そして、鍵ファイルを適当なところ（Downloadsフォルダなど）にうつし、Google Driveなどを経由して接続元の```~/.ssh/```フォルダに設置します。あとは、パソコンから接続しましょう。ADBのインストールとUSBの接続をお忘れなく。

```zsh
chmod 600 ___.pub
adb forward tcp:8022 tcp:8022
ssh -p 4096 u0_a000127.0.0.1 -i ~/.ssh/___
```

すると、AndroidにUSB経由でSSH接続でき、いろいろ遊ぶことができます。

# 最後に

今回は軽めの記事かつ何の目的かもわからないですが、例えば会社の接続にAndroidからしかできなくて、、、みたいな特殊な環境では役立つかもしれませんね。
PHPのarray_mergeと演算子による配列結合の違い

# array_mergeと演算子の違い
PHPで配列を結合する時の方法は様々あるが、その中に`array_merge`と 演算子 による方法がある。

しかし、ともに配列結合に使われるがキーが重複した時に微妙に挙動が異なる。

## array_merge
リファレンスには以下のような記載がある通り、キーが重複すると後ろの配列の値が返される。
> 前の配列の後ろに配列を追加することにより、 ひとつまたは複数の配列の要素をマージし、得られた配列を返します。
>
> 入力配列が同じキー文字列を有していた場合、そのキーに関する後に指定された値が、 前の値を上書きします。しかし、配列が同じ添字番号を有していても 値は追記されるため、このようなことは起きません。

```PHP
$array1 = ["key1" => "hoge", "key2" => "huga"];
$array2 = ["key1" => "foo", "key3" => "piyo"];

array_merge($array1, $array2);
// ["key1" => "foo", "key2" => "huga", "key3" => "piyo"]
```

## 演算子
一方、演算子の場合はキーが重複すると最初の配列の値が返される。

> The + operator returns the right-hand array appended to the left-hand array; for keys that exist in both arrays, the elements from the left-hand array will be used, and the matching elements from the right-hand array will be ignored.
>
> 両方の配列に存在するキーについては、左側の配列の要素が使用され、右側の配列の一致する要素は無視される。

```PHP
$array1 = ["key1" => "hoge", "key2" => "huga"];
$array2 = ["key1" => "foo", "key3" => "piyo"];

$array1 + $array2
// ["key1" => "hoge", "key2" => "huga", "key3" => "piyo"]
```

# まとめ
キーが重複した場合の挙動は以下のようになる。
- `array_merge`：後者の配列の値が返される
- 演算子：前者の配列の値が返される

## 参考

https://www.php.net/manual/ja/function.array-merge.php

https://www.php.net/manual/en/language.operators.array.php
今年買ったボード:その他

今年、MicroPython/CircuitPythonに買ったボードシリーズ最終回。

まだあまり使えてないボードをまとめて。

# Seeed Studio XIAO ESP32C6

2024年6月6日　[スイッチサイエンス](https://www.switch-science.com/products/9688)で購入

![IMG_1700.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/94cf2198-d6f2-aaed-04b5-c913e02c3854.jpeg)

![IMG_1701.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/0c4a3894-f0ba-fe3b-1aa1-22a46ffab101.jpeg)

MicroPython インストール方法は[M5Stack NanoC6](https://qiita.com/inachi/items/9d7a4f3973deda57d418)と同じ。

# MOTION 2350 Pro

2024年8月23日 [スイッチサイエンス](https://www.switch-science.com/products/9828)で購入。

RP2350 搭載のモータードライバボード。日本では Pico 2 よりも早く出てきた。

![IMG_1702.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/c64cc120-41de-a19a-42e3-4d8592ce86b0.jpeg)

いろいろ盛りだくさん。

* DCモータードライバー x4
* サーボモータドライバー x8
* RGB LED (NeoPixel) x2
* GPIOの状態モニター用のLED x16
* 圧電スピーカー

![IMG_1707.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/9a0065c4-257e-8f17-f9e5-038a396c8a48.jpeg)

![IMG_1708.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/4736e2ff-b5d2-6b9c-a456-c4cee5ea6492.jpeg)

標準では CircuitPython 9.1.0 が入っていた。

![スクリーンショット 2024-12-10 22.38.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/62887ad7-7b5b-2cf2-560e-bf5fc51a9d95.png)

# Raspberry Pi Pico 2

2024年9月2日 [KSY](https://raspberry-pi.ksyic.com/main/index/pdp.id/1094/pdp.open/1094)で購入。

RP2350 ご本家のボード。

![IMG_1703.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/97927d8e-de21-839d-1b01-528e053611a8.jpeg)

# Seeed XIAO RP2050

2024年11月29日 [秋月電子通商](https://akizukidenshi.com/catalog/g/g129619/)で購入。

RP2350 搭載した XIAO。

![IMG_1704.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/7cfe6213-a98c-508d-9c29-4aac3be77474.jpeg)

![IMG_1705.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/9ee86fcf-1659-29ef-708b-0f0c7554b270.jpeg)

Pico 2 用の MicroPython ファームウェアを入れればいいのだろうなと思っていたら動かない。

[ここのサイト](https://wiki.seeedstudio.com/getting-started-xiao-rp2350/#getting-started%EF%B8%8F)を見ると、非互換問題があるとのこと。修正されるまではプレビュー版を使ってくれとのこと。確かにプレビュー版では動くのであるが、バグがいくつかあるのであまり使いたくは無い。

![スクリーンショット 2024-12-10 22.45.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/f2ad7316-32b7-051f-12a3-c0edd3d3aa1b.png)

問題は現在、MicroPythonではなく、pico-sdk 側で議論されている。

https://github.com/raspberrypi/pico-sdk/pull/2098

このプルリクエストと[このMicroPython側のプルリクエスト](https://github.com/micropython/micropython/pull/16299)を合わせて最新ソースに反映させてビルドしてみて、動かせている。

![スクリーンショット 2024-12-10 19.39.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/ca450522-e8c9-f223-c6b8-e9abafc7f986.png)
NetBSD-10でのcurses機能拡充

[NetBSD Advent Calendar 2024](https://qiita.com/advent-calendar/2024/netbsd) 9日目の記事です。今日はNetBSD-10で拡充されたcursesの機能を見てみようと思います。

## cursesの機能拡充

いつものように[NetBSD-10のリリースノート](https://www.netbsd.org/releases/formal-10/NetBSD-10.0.html)を見ていると、[curses(3)](https://man.netbsd.org/NetBSD-10.0/curses.3)に関する記述がありました。

>  curses(3) - added stub mouse functions and curses_version() for compatibility with ncurses.
>  curses(3) - improved Unicode support. 

端末表示を制御するライブラリである[curses(3)](https://man.netbsd.org/NetBSD-10.0/curses.3)について、[ncurses](https://ja.wikipedia.org/wiki/Ncurses)との互換性を高めるための機能拡充が行われたようです。

## curses_version()

まずは[curses_version(3)](https://man.netbsd.org/NetBSD-10.0/curses_version.3)を見てみます。バージョンを取得するというシンプルな関数ですが、NetBSD-9.2では以下のようにコンパイルエラーとなってしまう状態でした。

```sh
$ uname -sr
NetBSD 9.2
$
$ cat sample.c
#include <curses.h>

int main() {
    initscr();

    mvprintw(2, 5, "%s", curses_version());

    refresh();
    getch();
    endwin();

    return 0;
}
$
$ gcc -o sample sample.c -lcurses
sample.c: In function ‘main’:
sample.c:6:26: warning: implicit declaration of function ‘curses_version’ [-Wimplicit-function-declaration]
     mvprintw(2, 5, "%s", curses_version());
                          ^~~~~~~~~~~~~~
ld: /tmp//ccdUeOZD.o: in function `main':
/home/netadm/tmp/curses_sample/sample.c:6: undefined reference to `curses_version'
```

NetBSD-10の環境ではコンパイルが通るようになっています。

```sh
$ uname -sr
NetBSD 10.0
$
$ gcc -o sample sample.c -lcurses ; echo $?
0
```

実行結果は以下のようになります(が、何やらバージョン番号というよりかは、コード名みたいな感じですね…)。

![img01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/66217dbf-8740-2d3a-a9f8-8135d26f7005.png)

## cursesのマウス機能

さらに"added stub mouse functions"という記述があります。これはマウスイベントを取得できるようになったという意味合いなのでしょうか？

>  curses(3) - added stub mouse functions and curses_version() for compatibility with ncurses.

[curses(3)](https://man.netbsd.org/NetBSD-10.0/curses.3)を見ても"mouse"というキーワードを含む関数の記述はありませんが、GitHub上のコードをみると、マウスに関するコードとmanページが存在しているようです。

 * [NetBSD/src/blob/netbsd-10/lib/libcurses/mouse.c](https://github.com/NetBSD/src/blob/netbsd-10/lib/libcurses/mouse.c)
 * [NetBSD/src/blob/netbsd-10/lib/libcurses/curses_mouse.3](https://github.com/NetBSD/src/blob/netbsd-10/lib/libcurses/curses_mouse.3)

manページに記載されている `has_mouse()` という関数でマウスの利用可否を判定できるようです。

> .Fn has_mouse
> function returns true if the mouse support has been initialised for the
> terminal, otherwise false.

早速該当する関数を見ると…常に `false` を返しています🥴

```c
 92 bool
 93 has_mouse(void)
 94 {
 95
 96     return false;
 97 }
```

他の関数も単に `ERR` や `0` を返しているだけで、リリースノートにあった"added stub mouse functions"は文字通り関数スタブを追加した、という話だったのでした。

```c
 99 int
100 getmouse(__unused MEVENT *event)
101 {
102
103     return ERR;
104 }
105
106 int
107 ungetmouse(__unused MEVENT *event)
108 {
109
110     return ERR;
111 }
112
113 mmask_t
114 mousemask(__unused mmask_t newmask, __unused mmask_t *oldmask)
115 {
116
117     return 0;
118 }
```

## まとめ

NetBSD-10で拡充されたcursesの機能を見てみました。ncursesとの互換性を高めるための機能拡充となっていますが、マウス機能については関数スタブが追加された段階でした、端末側でもマウスに対応する機能が必要となるため、今後も機能拡充が進められてゆくと思われます。
ブラウザでAndroid Studioが動く?！ Google、Project IDXをご紹介！

:::note info
Project IDX is now Firebase Studio
ということで
Project IDXはFirebase Studioになりました！(ヤッタネ(/≧▽≦)/)
内容はほぼ変わりませんのでどうぞ～
:::


最近、Google App Scriptが記事でもよくつかわれるようになってきてうれしく感じます(社員とかでは全くなく、昔からつかっていた人としてですが)。

さて、今回は
![qitaidx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/39300abe-fef5-aacd-1640-5f3496d7920b.png)
# GoogleのProject IDX!![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/48c72fee-dda0-cf78-b2cb-67170f2e9e21.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/e1fbb920-fa6d-1cb4-28c0-42a821aaf470.png)
トップページのリンクは一応こちらです！↓

https://idx.google.com/

「Project IDX」で検索し、このロゴのものがあったらログインします。
すると、こんな感じの画面が出てきます。
## 具体的にできることは？
技術の分野ごとにまとめられているので、うまく切り取り、表にしてみました。
See all featuresボタンからも見えるので、詳細が知りたい場合はぜひご覧ください！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/8c2a6527-c2f9-4653-bea4-c2d1f20011a3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/b64f2de4-42c0-065a-6b34-e133dcc4d336.png)
いかがでしょう、見覚えのある、またはご自身の専門分野はありましたか？
私はかなりあり、感動しました![WowFatimaGIF.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/e0ad379f-b25e-6851-2e88-c9c0c50861cc.gif)
。

## さて、みなさん、よく思い出してください。
私は冒頭に、というよりタイトルから、「Android Studioが動く?！」と書いています。
そうです。これただのエディタではなく、実行環境までクラウドで動作します！
つまり、
「私のパソコン、8GBのメモリだけど、全然実行環境が動作しない、、、」や、
「テストで環境構築したいけど、重い腰が上がらない」
そんな時に<h5>大・活・躍</h5>してくれるのです！！！

## Android StudioはまだWait List
ちょっとややこしい記載で申し訳ないですが、現状
「Android Studio」
のエディタ・実行環境だけは、まだ正式リリースされておらず、申し込んで、いわば「順番待ち」で手に入れることができるかもしれないという意味です。
ただし、海外勢のXを見ると、すでにAndroid Studioを手に入れた人が極々一部いました。
おもに日本やアメリカは案外少ない(というより私が見る限りなかった)です。
ただ、見ていて、ブラウザ上でも、本物と同じような画面でした。(当然といえば当然。)

## え？じゃあアプリ作れない？
そんなことありません。
せっかく開発・実行環境があるのに、webアプリで妥協するなんてもったいないです！
Android Studioは使えなくても、先ほどの表に載せていた通り、
***「Flutter」***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819700/d3cf5d9e-1a5b-4e8d-32c4-f5fc1a0552bf.png)

があるので、得意な人は活用してみてもいいかもしれません！
(特殊なDart言語ベースなので、JavaやLKotlinとは少し使い勝手が異なるかもしれません)

## お好きな言語でお好きな時に
対応言語、環境は多様で、インタプリタ方式やコンパイラ方式など、コンパイル方式や、webアプリやバックエンド、apiのようなサーバの応答形式やアプリケーションを選択することができる言語もします！

私がここで解説するには手に余りますので、
ぜひご自身で、好きな言語を、動機も関係ありません。

<h4>「使ってみたい」→「楽しい！」</h4>ような体験を皆さんに、私からクリスマスプレゼントとさせていただきます🎅🎁！

少しでもお役に立てたら、いいねで応援していただけると、、、はるはるサンタが喜びます！
### それでは皆さんメリークリスマス、そして、よいお年を！