OmniAICreator/Qiita-1.07M huggingface dataset:
基本情報技術者試験向けかもしれない問題集

AIを使って問題を作成しています。

### Prompt:
`ITパスポートもしくは基本情報技術者試験に出てきそうな問題を作ってください。`

### 問題1 (プロジェクト管理)
プロジェクトの進捗を管理するために使用されるガントチャートは、次のうちどれを表すための図か。

1. 時間ごとの作業工程
1. データのフロー
1. プログラムのロジック
1. システムの構造

<details> <summary>解説</summary> 正解: 1. 時間ごとの作業工程 解説: ガントチャートは、プロジェクトの進捗を時間軸に沿って視覚的に表すための図です。各タスクの開始日、終了日、および進行状況を示します。 </details>

### 問題2 (ネットワーク)
以下のIPアドレスの中で、プライベートIPアドレスに該当するものはどれか。

1. 8.8.8.8
1. 192.168.1.1
1. 172.16.0.1
1. 203.0.113.1

<details> <summary>解説</summary> 正解: 2. 192.168.1.1 解説: 192.168.1.1 はプライベートIPアドレスに分類され、ローカルネットワーク内で使用されます。他の選択肢はパブリックIPアドレスです。 </details>

### 問題3 (データベース)
SQL文で、全てのレコードを取得するための文はどれか。

1. SELECT *
1. GET *
1. FETCH *
1. RETRIEVE *

<details> <summary>解説</summary> 正解: 1. SELECT * 解説: SQLのSELECT文は、データベースからデータを取得するために使用されます。'*'は全てのカラムを選択することを意味します。 </details>

### 問題4 (セキュリティ)
インターネットバンキングなどで使用される、動的に変わるパスワードを生成する仕組みはどれか。

1. OTP
1. MFA
1. VPN
1. IDS

<details> <summary>解説</summary> 正解: 1. OTP 解説: OTP (One-Time Password) は、一度きりの利用を前提とした動的に生成されるパスワードで、セキュリティを高めるために使用されます。 </details>

### 問題5 (アルゴリズム)
以下のソートアルゴリズムのうち、平均計算量が最も小さいものはどれか。

1. バブルソート
1. クイックソート
1. マージソート
1. 選択ソート

<details> <summary>解説</summary> 正解: 2. クイックソート 解説: クイックソートは、平均計算量がO(n log n)であり、効率的なソートアルゴリズムとして広く使用されています。 </details>

### 問題6 (ハードウェア)
コンピュータのCPUが直接アクセスして処理を行うメモリの名前はどれか。

1. キャッシュメモリ
1. メインメモリ
1. 仮想メモリ
1. レジスタ

<details> <summary>解説</summary> 正解: 2. メインメモリ 解説: メインメモリは、CPUが直接アクセスしてデータを処理するための主要な記憶装置です。 </details>

### 問題7 (ネットワーク)
次のプロトコルのうち、データリンク層で動作するものはどれか。

1. IP
1. TCP
1. Ethernet
1. HTTP

<details> <summary>解説</summary> 正解: 3. Ethernet 解説: Ethernetはデータリンク層で動作するプロトコルであり、LAN (ローカルエリアネットワーク)で使用されます。 </details>

### 問題8 (情報セキュリティ)
ファイアウォールの主な役割はどれか。

1. ウイルスを検出する
1. データのバックアップを取る
1. ネットワークのトラフィックを監視・制御する
1. システムのパフォーマンスを向上させる

<details> <summary>解説</summary> 正解: 3. ネットワークのトラフィックを監視・制御する 解説: ファイアウォールは、ネットワークのトラフィックを監視し、不正なアクセスを防ぐために使用されます。 </details>

### 問題9 (システム開発)
システム開発におけるユースケース図で表現されるものはどれか。

1. システムの構造
1. データの流れ
1. 利用者とシステムの相互作用
1. プログラムの処理手順

<details> <summary>解説</summary> 正解: 3. 利用者とシステムの相互作用 解説: ユースケース図は、システムと利用者（アクター）の間の相互作用を視覚的に表現するために使用されます。 </details>

### 問題10 (プログラミング)
オブジェクト指向プログラミングにおけるカプセル化の説明として正しいものはどれか。

1. オブジェクトを作成する
1. クラスを継承する
1. データとメソッドを一つの単位にまとめる
1. インターフェースを実装する

<details> <summary>解説</summary> 正解: 3. データとメソッドを一つの単位にまとめる 解説: カプセル化は、データ（属性）とメソッド（操作）を一つのオブジェクトにまとめ、その内部の詳細を隠蔽することにより、安全性と再利用性を高める技術です。 </details>
日本語：プラグラマーにとって厄介な言語

### ある一日

>「すみません、プログラムが動きません」
「（……？）こちらでは再現できない状況です。どういう状況でしょうか？」
「なんか、動かないんですよね」
「決められたパラメーターじゃないと動かないんですよね。パラメーターを教えてください。調べてみます」
「えーっと、apple、でしたっけ。ちゃんと入れているはずなんです。あれ、３回目は上手くいきました」
「これこれ、こうです」

双方ともに、「Appleと入力してください」「Appleとちゃんと入力したはずなんです」という主張です。

結論から言うと、これは全角(full-width)文字と半角(half-width)文字の違いでした。

つまり、プログラムは「Apple.png」を受け付けてくれるけど、「Ａｐｐｌｅ.png」を受け付けてはくれなかった、ということです。３回目は上手くいった、というのは、３回目はたまたま半角で入力していたのでしょう。そう、無意識のうちに……。
（普通の人は、自分が今、半角で入力したのか、全角で入力したのか、深く考えませんよね。）

### 英語には、全角/半角の概念はないらしい

英語には、そもそも、半角/全角という概念がないそうです。

つまり、「　（ホワイトスペース）」を埋め込んで、プログラムが動かなくなるのは、日本人あるあるのようです。これをアメリカ人のプログラマーに言わせてはいけない。知らんかった。羨ましい話です。このお豆腐「　」に苦しめられない人たちがいるなんて……。

# Shift-JISとUTF-8
Shift-JISとUTF-8の違いは、ときどき問題を引き起こします。

Shift-JISはJISというくらい、日本語に特化したファイルフォーマットですが、UTF-8のほうがグローバルでユニバースでエレガントで、問題がないです。しかしながら、しかしながら、ExcelはだいたいデフォルトのファイルがShift-JISで保存されていて、日本のクライアントから飛んでくるファイルはだいたいShift-JISになっています。
（メモ帳のデフォルトは、Windows 10 May 2019 Updateから、UTF-8になりました。
Excelもいずれ、そうならないだろうか……。）

https://xtech.nikkei.com/atcl/nxt/column/18/00723/042300004/

カタカナの「ソ」が含まれるパスで何か起こった場合、この文字コードの違いが原因である可能性があります。

https://sites.google.com/site/fudist/Home/grep/sjis-damemoji-jp

ASCIIとUTF-8の話なので、ちょっと本題とはズレるのですが、これも面白い話です。

https://qiita.com/heeroo_ymsw/items/c6e15d5f9246b4e842eb

# 中華フォント現象

StardewValleyとか、キーボード入力で日本語を入力するのはちょっと怖いなーと思っています。ときどきゲームがぶっ壊れるからです。

海外製のゲームは、わざわざアルファベットで名前を入力することがある……のですが、GooseGooseDockでは信念を曲げて、ハンドルネームを入れています。パッと読める、パッと認識できるのは日本語だからです。
（半分くらいの人は、UIの英語を見た瞬間に逃げる）

しかし、中華フォント現象(日本語に対して中国語のフォントファミリーが採用されてしまう現象)が起きていて、見た目は、あまり美しくはありません。

日本語というのは、プログラマーにとっては、結構、難儀なものです。

https://qiita.com/usagimaru/items/46c27c42e862fb8aba7e
【ML初心者アドベントカレンダー】初心者AWSエンジニアくん、機械学習を学ぶ


もうさァッ 無理だよ 混合行列とかCNNとか 単語の意味がわかんないんだからさァッ

# 本アドベントカレンダーの目的
機械学習について学び始めたは良いものの、専門的すぎる横文字とアルファベットの数々に心のエネルギーをトラッシュされた初心者AWSエンジニアが、個人的なアウトプットの場所を求めた結果、このようなアドベントカレンダーを作成するに至りました。


# 最終目標

学習の成果として、最終的には以下二つの試験合格を目指します。

AWS Certified AI Practitioner
https://aws.amazon.com/jp/certification/certified-ai-practitioner/

AWS Certified Machine Learning Engineer - Associate
https://aws.amazon.com/jp/certification/certified-machine-learning-engineer-associate/

完走も合格もどちらもがんばりますので、応援していただけたら幸いです！
WSLで学ぶLINUXコマンド（連載第1回/25回）

# はじめに
WSLでLINUXコマンドについて解説していきます。
すぐに試せる環境の準備から入りますのでよかったら読んでいってください

# WSL（Windows Subsystem for Linux）の導入
WSLを利用すると、Windows上でLinux環境を手軽に試すことができます。開発やコマンドラインの練習に最適です。以下はWSLの導入方法です。

# WSLのインストール手順
1. **管理者としてコマンドプロンプトを開く**
    - Windowsキー + X を同時に押します。
    - 表示されたメニューから「Windowsターミナル（管理者）」または「コマンドプロンプト（管理者）」を選択します。
　
2. **WSLをインストール**
管理者として開いたコマンドプロンプトに以下のコマンドを入力して、WSLのインストールを行います：

    ```powershell
    wsl --install
    ```

3. **再起動**
    インストールが完了すると、システムの再起動を求められます。指示に従ってコンピューターを再起動してください。
　
4. **Linuxディストリビューションのインストール**

    再起動後、WSLが自動的に起動し、Microsoft StoreからデフォルトのLinuxディストリビューション（通常はUbuntu）がインストールされます。

    他のディストリビューションをインストールする場合は、以下のコマンドを使用します。
    ```powershell
    wsl --list --online
    wsl --install -d <ディストリビューション名>
    ```

5. **Linuxディストリビューションの初期設定**

    インストール後、WSLを起動し、初期設定（ユーザー名やパスワードの設定）を行います。
    
# WSLについて補足
WSLのディストリビューションの確認方法やファイルを補足します。
・インスタンスの一覧表示
通常WSL2がインストールされていることが確認できます。
```powershell
# 現在のUbuntuインスタンスを一覧表示
wsl -l -v

# 表示例
  NAME      STATE           VERSION
* Ubuntu    Running         2
```

・Windowsからのアクセス
Windows環境からLinux環境を参照することができます。
これによりLinuxとWindowsの環境間でシームレスにファイルをやり取りすることができます。

```powershell
\\wsl$
```
・WSLからWindowsファイルシステムへのアクセス
こちらは逆になりますがWSLからWindowsへのアクセス方法となります。
```powershell
cd /mnt/c
```



# おわりに
これでWSLの環境が整いました。
Linuxコマンドを手軽に試せるようになったと思います。

次からの記事では、基本的なLinuxコマンドについて解説します。

https://qiita.com/yu1016/items/f27180af29476c47d08f

一覧

https://qiita.com/advent-calendar/2024/pig
Azure AppServiceで証明書をpythonで取得する

公式ドキュメントではC#しかなかったので備忘もかねて書きます
https://learn.microsoft.com/ja-jp/azure/app-service/configure-ssl-certificate-in-code?tabs=windows

```python:hoge.py
from cryptography.hazmat.primitives.serialization import pkcs12
#証明書は以下のディレクトリにある。該当のAppsevice or FunctionsにSSHして確認
p12_file = "/var/ssl/private/yourthumorint.p12"
    #Appservice証明書を使用している場合、Passwordは空なので以下のように記述
    pw = b""

    try:
        with open(p12_file, 'rb') as f:
            p12_data = f.read()
            # Load the PKCS12 file
            private_key, certificate, additional_certificates = pkcs12.load_key_and_certificates(p12_data,pw)
            print(certificate.subject)
    except Exception as e:
            print(e)
            certificate = "failed to find certificate"

```
AWSプロファイルの切り替えツールを自作する

こんにちは、kudomaです。
この記事は、アイスタイル Advent Calendar 2024、1日目の記事です。

## 背景

作業PCが新しくなったから、諸々セットアップしようと思いました。
AWSプロファイルの切り替えに便利な[awsp](https://github.com/johnnyopao/awsp)をセットアップしようとしたのですが...。
セットアップを試みると、エラーが出る...。（ちなみに、さっき試したら30秒でセットアップできましたw）

...30分後
まぁいっか、`export`コマンド使えば切り替えられるし、そんな手間じゃないよね。

```bash: AWSプロファイルhogekhdajakaに切り替えるための手順
$ aws configure list-profiles
hogekhdajaka
fugakhdajaka
piyokhdajaka
$ export AWS_PROFILE=hogekhdajaka
```

...3日後
いや、めんどくさい。
やっぱりawsp使いたい...。あっ待てよ。
これ、シェルスクリプト書けばいいじゃん。
普段シェルスクリプトは描かないけど、今はAIがあるし、任せればすぐ作れるでしょ。

...10分後
めっちゃ最高

## 環境

OS: macOS
macOS: 14.6.1

## 実際の手順

1. ChatGPTにスクリプト等を教えてもらう
1. fzfをインストール
1. スクリプトの作成
1. エイリアス登録

-----

### fzfをインストール

```bash:Terminal
brew install fzf
```

### スクリプトの作成

```bash:/path/to/your/select_aws_ptofile.sh
#!/bin/bash
 
# プロファイルを取得し、fzfで選択
profile=$(aws configure list-profiles | fzf --prompt="Select an AWS profile: ")
 
if [[ -n "$profile" ]]; then
  export AWS_PROFILE="$profile"
  echo "Switched to profile: $AWS_PROFILE"
else
  echo "No profile selected."
fi
```

### エイリアス登録

```bash:.bashrc
alias awsp="source /path/to/your/select_aws_profile.sh"
```

```bash:Terminal
source ~/.bashrc
```

## 最後に

今はAIがあるので、簡単なツールならセットアップに時間かけるよりも、**自作する方が楽な時もありますね。**
今年の締めくくりはアクセシビリティイベントにしましょう！

2024年も残りわずかですが、まだ今年最後のアクセシビリティイベントに参加するチャンスはあります！
最新の技術や事例を学び、他の参加者と交流できる貴重な機会です。
オンラインでもオフライン、誰でも気軽に参加できる点も魅力です。

特にアクセシビリティイベントは、
エンジニア・デザイナー・ビジネスパーソンなど異なる職種の方々が集うだけでなく、
**障害当事者、さまざまなジェンダー、幅広い年代、さらには外国籍の参加者とも出会える場**となるのが特徴です。

イベント参加を通じて新たな視点やインスピレーションを得ることで、 **自分の活動やプロジェクトを次のレベルへ引き上げるきっかけ**になるでしょう。

今年の締めくくりに、アクセシビリティへの理解を深め、
コミュニティの一員として**一緒に未来を考えてみませんか？**

## 12月イベント一覧

### [いつでも、どこでも、誰でも「使える」へ - 『モバイルアプリアクセシビリティ入門』刊行記念イベント -](https://tomei-bookstore-event-20241202.peatix.com/)

日時：12月2日（月）19時30分〜21時
オフライン
ハッシュタグ ： [#モバイルアプリアクセシビリティ入門](https://x.com/search?q=%23%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B7%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E5%85%A5%E9%96%80&f=live)
🖐️ 私も参加

このトークイベントでは、著者がiOSやAndroidのアクセシビリティ機能を実演し、
それを活かしたアプリ設計と実装について語ります。

### [第1回『モバイルアプリアクセシビリティ入門』公開読書会](https://freee.connpass.com/event/337478/)

日時：12月3日（火）13時〜14時
オンライン
ハッシュタグ ： [#モバイルアプリアクセシビリティ入門](https://x.com/search?q=%23%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B7%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E5%85%A5%E9%96%80&f=live)
🖐️ 私も参加

新刊書籍『[モバイルアプリアクセシビリティ入門](https://gihyo.jp/book/2024/978-4-297-14602-3)』をみんなで読み、感想を共有したり、質疑応答をしていく定期的な読書会です。

### [国際障害者デー](https://www.un.org/en/observances/day-of-persons-with-disabilities) ＆ [障害者週間](https://www8.cao.go.jp/shougai/kou-kei/r06shukan/main.html)

日時：12月3日（火）〜 12月9日（月）
オフライン / オンライン
🖐️ 私は沢山の中からどれに参加するか検討中

障害者が社会、経済、文化その他あらゆる分野の活動に積極的に参加すること等を促進するため、国及び地方公共団体が民間団体等と連携して、「障害者週間」の期間を中心に障害者の自立及び社会参加の支援のための様々な取組を実施します。

### [動画のアクセシビリティ向上における留意すべきポイントとは ～障害者差別解消法への対応～](https://peatix.com/event/4203396)

日時：12月5日（木）10時30分〜11時
オンライン

動画のアクセシビリティ"に焦点を当てて、アクセシビリティの基本概念から、
字幕／ナレーション音声／色のコントラスト調整、など具体的な実践方法までを説明するウェビナーです。

### [品質保証としての「Webアクセシビリティ」法改正で検討すべきWebアクセシビリティを知る](https://peatix.com/event/4205814)

日時：12月6日（金）14時〜14時50分
オンライン

Webアクセシビリティに本格的に取り組むことのメリットや実践的な導入法を、
SHIFTが提供する最新のWebアクセシビリティ検証サービスを通じて詳しくご紹介するセミナーです。

### [アクセシビリティ大忘年会](https://skword.connpass.com/event/333884/)

日時：12月10日（火）18時30分〜21時30分
オフライン
ハッシュタグ ： [#bonenkai_a11y](https://x.com/search?q=%23bonenkai_a11y&f=live)
🖐️ 私は登壇します！

2025年の更なる盛り上がりを期待して、福岡・名古屋のアクセシビリティカンファレンス実行委員長やアクセシビリティ分野で活躍するメンバーとともに、今年1年間を振り返る忘年会です。

### [カナダ生活で見えてきたダイバーシティとアクセシビリティ](https://peatix.com/event/4198727)

日時：12月12日（水）12時〜13時
オンライン

このイベントでは、UXデザイナーがカナダでの生活を通じて実感したダイバーシティとアクセシビリティの重要性について、日本とカナダの違いを交えながら具体例を通じて語ります。

## イベントを上手く活用するためのヒント

- **事前準備をする**
    - 興味あるセッションのトピックとスピーカーをリサーチし、質問したいポイントや交流会の話題に使えるポイントを考えておく
    - スピーカーのSNSが分かれば、事前にフォローしましょう
- **積極的に参加する**
    - セッション中のチャットやQ&Aに参加したり、感想や気づき、メモりたい言葉をリアルタイムにSNSでつぶやきましょう
- **ネットワークを広げる**
    - SNSでハッシュタグを活用して発信し、参加者やアクセシビリティ関心のある方とつながる
    - 他の参加者の投稿も読んで「いいね」を押し、気が合えばお互いをフォローしましょう
    - 交流会がある場合はいろいろな方と話、名刺やSNSを交換しましょう
    - 困ったときはイベントスタッフに声をかけるのがおすすめ！
**例：**「〇〇さんに話してみたいですが、少し緊張していて、紹介をお願いできますか？」
- **後から学びを深める**
    - イベント資料や録画を確認し、得た知識を日常やプロジェクトに生かす方法を検討する

## 最後に

2024年の最後をアクセシビリティイベントで締めくくる準備はできましたか？
気になるイベントは見つかりましたか？

もしこの記事に載っていないイベントや参加のヒントがあれば、
ぜひコメントやSNSで教えてください〜

さあ、一歩踏み出してコミュニティに参加し、
アクセシビリティの未来を共に作っていきましょう！
「C言語プログラミング演習」の課題をJavaでやってみた

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

こんにちは！　SRA関西事業部の佐々木です。

# ちょっと待って！！
タイトルに「C言語」とついてますが、C言語の話はしません！（Javaの記事です）
今回は本の紹介と、その本に載っている課題をJavaでやってみたことについて述べます。

# 本の紹介
古い本ですが、[C言語プログラミング演習](https://www.amazon.co.jp/dp/4822280721/)という本があります。
この本は「より良いプログラムの構造」について勉強できる本です。
と言ってもも堅苦しい本ではなく、架空の大学の「プログラミング同好会」を舞台とした物語調で書かれています。登場人物は1年生の白木君、3年生の青山君、4年生の赤石さんです。（あと講義をする先生もいます）
5章で構成されており、それぞれの章で1つの「例題」が示され、その例題に対して「討論」と「講義」という流れになっています。「討論」では登場人物たちが各々プログラミングを示したり指摘しあったりして、読んでいてなかなか面白いです。「講義」ではプログラムの構造についてわかりやすく説明されており、

* プログラム構造が間違っているとフラグが必要になる
* フラグを使ったプログラムはバグが発生しやすい

など実際のプログラミングで役に立つポイントがまとめられていたりします。
C言語を使った本ですが、内容は言語を問わずプログラミングを行う人全て（特に初心者）に読んでほしい本です。

# Javaでやってみた

やってみた課題は第1章の例題です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100799/0cc1823a-f732-0615-a37e-aa15bfa7ac28.png)

※プログラミンが好きな人は続きを読む前に実際にプログラミングしてみることをお勧めします。
C言語とJava言語の違いもあり、書籍で示されている解答とは結構違うところもありますが、プログラムの構造は同じようにしています。構造について詳しく知りたい方はぜひ本を読んでみてください。

まずは「左上がり」「右下がり」を表す定数を定義します。
```Direction.java
enum DIRECTION {
  //左上がり
  UPPER_LEFT,
  //右下がり
  LOWER_RIGHT
}
```

次に「移動する点」用のクラスをつくります。
```MovingPoint.java
public static class MovingPoint {

  // x座標
  int x = 0;
  // y座標
  int y = 0;
  // 進む方向
  DIRECTION direction;
  // 今何ブロック目か(斜め移動を一つのブロックとして考える)
  int block = 0;

  public MovingPoint() {
    // 右下がりから始まる
    this.direction = DIRECTION.LOWER_RIGHT;
  }

  // 次の座標に移動
  public void next() {
    switch (direction) {
      case UPPER_LEFT -> upperLeft();
      case LOWER_RIGHT -> lowerRight();
    }
  }

  // 左上に移動
  private void upperLeft() {
    if (x != 0) {
      //xが0になるまでは左上に移動
      x--;
      y++;
    } else {
      //xがゼロになったら右下ブロックへ切り替え
      direction = DIRECTION.LOWER_RIGHT;
      y = ++block;
    }
  }

  // 右下に移動
  private void lowerRight() {
    if (y != 0) {
      //yが0になるまでは右下に移動
      x++;
      y--;
    } else {
      //yがゼロになったら左上ブロックへ切り替え
      direction = DIRECTION.UPPER_LEFT;
      x = ++block;
    }
  }

  // 座標表示用
  public String toString() {
    return "(" + x + ", " + y + ")";
  }
}
```

最後に実行用の処理です。
問題には「個数nは引数で受け取るようにせよ」とありますが、ここではmainメソッドで固定で書いています。
（諸事情によりクラス名がPopukoになっています）

```Popuko.java
public class Popuko {

  public static void main(String... args) {
      int n = 8;
      loop(n);
  }

  private static void loop(int n) {

    MovingPoint p = new MovingPoint();

    for (int i = 1; i <= n; i++) {
      System.out.println(i + p.toString());
      p.next();
    }
  }
```

適度にクラス分けされてメソッドもシンプルな実装なのでわかりやすいプログラムだと思うのですがどうでしょうか？
もちろん、さらに改良することは可能だと思います。（コメントで教えてくれるとありがたいです）

### 蛇足
一時期SRAの新人研修の講師を担当していたのですが、コロナウイルスが流行した時に出張の制限などの事情により講師担当をしないようになりました。そのまま現在にいたるのですが、今年関西に配属された新入社員(新人研修は終了している)に課題を出す機会があったので、この例題を出してみました。
新人研修時代はNode-REDというツールを使ってたのですが、今回新入社員に出した時にはJavaで取り組んでもらいました。そこで私自身も一度Javaでやってみようとなった次第です。

### 参照・引用
若林糧 著「C言語プログラミング演習」(日経BP)
GoでのStructオリエンテッドプログラミングについて

**Go言語には、他の多くのプログラミング言語のようなクラスベースのオブジェクト指向機能はありません。しかし、構造体（Struct）を用いることで、オブジェクト指向的なデザインを実現できます。この記事では、GoでのStructオリエンテッドプログラミングの基礎について解説します。**

# Structとは？

**Goのstructは、データをまとめてひとつの型として扱うための構造体です**。構造体は、いくつかのフィールドを持つことができ、オブジェクト指向のクラスに似た役割を果たします。

例えば、以下のようにPersonという構造体を定義することができます。

 ```Go
type Person struct {
    Name string
    Age  int
}
```

この構造体Personは、Nameという文字列型フィールドとAgeという整数型フィールドを持っています。このようにして、関連するデータをまとめて一つのデータ型にすることができます。

# Structの使い方

構造体のインスタンスを作成するには、以下のように記述します。

```Go
p := Person{Name: "Alice", Age: 30}
fmt.Println(p.Name)  // 出力: Alice
fmt.Println(p.Age)   // 出力: 30
```

構造体のフィールドにはドット（.）を使ってアクセスし、データの読み取りや書き換えを行うことができます。

p.Age = 31
fmt.Println(p.Age)  // 出力: 31

このようにして、構造体は簡単にデータの保持と操作を行うことができます。

# メソッドの定義

**Goでは、構造体にメソッドを関連付けることができます。これにより、構造体を使ってオブジェクト指向的な振る舞いを実現できます。**

例えば、Person構造体に対してGreetというメソッドを定義してみましょう。

```Go
type Person struct {
    Name string
    Age  int
}

func (p Person) Greet() {
    fmt.Printf("こんにちは、私は%sです。\n", p.Name)
}
```

このメソッドGreetは、Personのインスタンスに関連付けられており、そのインスタンスのNameフィールドを使って挨拶のメッセージを出力します。

```Go
p := Person{Name: "Alice", Age: 30}
p.Greet()  // 出力: こんにちは、私はAliceです。
```

このようにメソッドを定義することで、構造体に振る舞いを持たせることができます。

# ポインタレシーバと値レシーバ

**Goのメソッドには、レシーバ（受け取る構造体）を「値」として受け取る方法と「ポインタ」として受け取る方法の2種類があります。**

**値レシーバ**: 構造体のコピーに対してメソッドが実行されるため、元の構造体は変更されません。

**ポインタレシーバ**: 構造体の参照に対してメソッドが実行されるため、元の構造体の値を変更することができます。

以下はポインタレシーバを使った例です。

```Go
func (p *Person) SetAge(newAge int) {
    p.Age = newAge
}

p := Person{Name: "Alice", Age: 30}
p.SetAge(35)
fmt.Println(p.Age)  // 出力: 35
```

この例では、SetAgeメソッドはポインタレシーバを使用しており、pのAgeフィールドを変更することができます。ポインタレシーバを使うことで、構造体のデータを変更するメソッドを定義できます。

# 構造体の埋め込み

**Goには「構造体の埋め込み」という強力な機能があります。これは、他の構造体をフィールドとして埋め込むことで、より複雑なデータ構造を作成したり、オブジェクト指向の「継承」のような概念を実現したりするために使います。**

```Go
type Employee struct {
    Person
    Position string
}

e := Employee{
    Person:   Person{Name: "Bob", Age: 40},
    Position: "Manager",
}
fmt.Println(e.Name)      // 出力: Bob
fmt.Println(e.Position)  // 出力: Manager
```

この例では、Employee構造体がPerson構造体を埋め込んでいます。これにより、EmployeeのインスタンスからPersonのフィールド（NameやAgeなど）に直接アクセスすることが可能になります。これによってコードの再利用性が高まり、柔軟なデザインが可能です。

# まとめ

**GoでのStructオリエンテッドプログラミングは、構造体とメソッドを使うことでオブジェクト指向に似た設計を行うことができます。クラスのような概念はありませんが、構造体の埋め込みやポインタレシーバを活用することで、Goでも十分に複雑なデータとその操作をシンプルに実装できます。
これにより、コードの保守性や再利用性が向上し、より効率的にプログラムを設計することが可能になります。**


**最後までよんでいただきありがとうございます。
@y-t0910をフォロー,いいねしていただけると嬉しいです！**
便利な3Dスキャナー：デジタルの世界が手のひらに

技術の進歩に伴い、私たちの生活にはさまざまな革新的なツールが登場しています。その中でも便利な3Dスキャナーは、驚くべき技術の一つです。これにより、かつては複雑で専門的だった3Dモデリングが簡単で迅速になり、私たちは現実世界の物体を簡単にデジタルモデルに変換することができるようになりました。この技術の普及は、専門家にとって大きな助けとなるだけでなく、一般消費者にとっても日常生活において大きな便利さをもたらしています。

#### 複雑からシンプルへ：技術の進化

従来の3Dスキャナーは、通常、大きくて高価で、操作が難しく、特別な実験室環境で使用する必要がありました。しかし、便利な3Dスキャナーの登場により、このような制約が打破されました。これらのデバイスは小型で軽量で、手のひらサイズのものが多く、持ち運びや操作が簡単です。スマートフォンやコンピュータに接続することで、ユーザーは物体を迅速にスキャンできます。彫刻や手工芸品、家具、部品など、さまざまな物体を精密にキャプチャできます。
![2811b260e675e3712095cffcd7b550fc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/f95cf806-6077-c24c-14c6-5834e29c3099.png)

https://www.revopoint3d.com/collections/3d-scanners

#### 高精度スキャン：細部まで捉える

これらのデバイスは、レーザー、構造光、またはフォトグラメトリ（写真測量）などの技術を用いて、物体の細部を正確にキャプチャし、精密な3Dモデルを生成します。これらのモデルは、設計や修正、3Dプリントに使用できるほか、バーチャルリアル（VR）や拡張現実（AR）の体験にも活用でき、私たちに新しいインタラクティブな体験を提供します。

#### クリエイターにとっての必須ツール：作業効率の向上

クリエイターにとって、便利な3Dスキャナーは特に大きな価値を持っています。デザイナーは現物をスキャンすることで、すぐに高精度なデジタルデータを取得でき、ゼロからモデリングを始める必要がなくなります。製造業のエンジニアは、部品をスキャンしてサイズの検証や修正を行い、作業効率を大幅に向上させることができます。アーティストは、自分の手作りのアート作品をすぐにデジタルモデルに変換し、展示や販売に活用することができます。
![ecec2cbbf75369536c19f834e3de730d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/e551a4c8-f868-770d-037d-29addbbf5041.png)

#### 3Dプリントとの相性抜群

3Dプリント技術が進化する中で、便利な3Dスキャナーの応用範囲も広がりを見せています。家庭で小規模な創作活動を行う場合でも、企業で迅速なプロトタイプの設計を行う場合でも、このデバイスは前例のない便利さを提供します。

![28c8a7b08eb659b883d5f9be4122cab9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/75c9d47a-2137-4aec-1277-e1131a567a96.png)

#### 未来のデジタルツール

現在の便利な3Dスキャナーは、精度や機能の面では高級機器に劣る場合がありますが、その便利さと実用性は、デジタル創作や製造分野における革命的なツールであることは間違いありません。今後、技術の進歩により、便利な3Dスキャナーはますます普及し、私たちの日常生活や仕事において欠かせないデジタルツールとなるでしょう。

アート愛好家、デザイナー、エンジニアを問わず、便利な3Dスキャナーは現実と仮想の世界をつなぐ架け橋となり、私たちに新たな可能性をもたらしてくれることでしょう。
エラー（解決済み）（備忘録）RuntimeError in AlarmsController#create Unable to read the credential file specified by GOOGLE_APPLICATION_CREDENTIALS

## はじめに
オリアプ作成でAPI使用にjsonファイルをアプリ内に入れました。
実行すると以下エラーが何度も出ました。
```
RuntimeError in AlarmsController#create
Unable to read the credential file specified by GOOGLE_APPLICATION_CREDENTIALS: file /home/username/xxx/config/gothic-isotope-xxx.json does not exist
```
Jsonファイルが存在するのに存在しない？
ファイルのパスが本当はホームパスなのにusernameになっている！
どこかで上書きする指示をされているのか？

grep コマンドでアプリケーション全体に /home/username が残っていないか以下で確認。

```
grep -rn '/home/username' .
```
上書きされる原因のある箇所
config/environments/*.rb
.env ファイル
.bashrc や .zshrc（シェル設定ファイル）

### 解決策
```
export GOOGLE_APPLICATION_CREDENTIALS=/home/正しいファイル名/XXX/config/gothic-isotope-xxx.json
```
上記をターミナル実行後、Rails サーバーは環境変数の設定を再読み込みしないため、環境変数を設定した後にサーバーをクリアにしてから再起動する必要がある。

```
rails tmp:cache:clear
rails s
```
## おわりに
何度か同じエラーが出るので、以後出たら上記にて対処します。
Slackと上手に付き合う方法 - 2024年版


この記事は、[株式会社カオナビ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/kaonavi)の6日目です。

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

----

注意！本記事はMacのみ対象です。Windowsでもきっと同じことはできるでしょう...

Slackは超便利なツールです。2024年現在では、業務効率アップに欠かせないコミュニケーションツールです。しかし、コミュニケーションが増えすぎて、Slackの未読を消費するだけで一日が終わってしまうとなると本末転倒です。

というわけで、本記事ではSlackと上手に付き合っていくという観点で、便利なショートカットやアプリを紹介します。

## 全て既読にする

`shift + esc`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4514/a921b9cd-fd43-58bc-5c49-526c6f8fa4c6.png)


超有名なショートカット（だと私は思っている）ですが、まずはコレです。チャンネル数が数百を越えてくると、全ての未読を消費するだけで莫大な時間がかかります。メンションや重要なチャンネルの巡回が終わったら、 `shift + esc` を使って、残りは全部既読にしてしまいましょう！スッキリします！

## サイドバーを非表示にする

`cmd + shift + d`

チャンネル一覧の未読が気になってしまう方は、サイドバーを非表示にしましょう。チャンネル一覧と未読が表示されないだけで、Slackアプリに気を取られづらくなります。私はとてもよく使うのですが、知らない人の多いショートカットです。


## アプリを落とす

`cmd + q`

実にシンプルですが、Slackアプリを落とすのは効果的です。Slackのショートカットではなく、Mac側のショートカットです。アプリを落とせば通知もきません。未読も既読も分かりません。方法としては最強です。

## 最小化する

`cmd + m`

Slackを落としてしまうと、起動に時間がかかってしまいます。複数チームを面倒見ているマネージャーなどの役割の人は、Slackの起動を待つのがもどかしいかもしれません。そんなときは最小化しましょう。画面上からSlackが消えるだけで、集中が少し持続するようになります。ただし、この方法には一つ問題があります。それは **「cmd + tab を使ったアプリケーション切り替えにSlackが候補としてでてきてしまう」** のです。




## アプリケーション切り替えからSlackを排除する

せっかくSlackを最小化して画面から排除しても、ついうっかり cmd + tab でSlackを選択してしまうと、すぐにSlackの画面が表示されてしまい、Slackに業務時間を吸い取られてしまいます。そんな危険を避けるにはアプリケーションの力を借りましょう。

[Context](https://contexts.co/) はウィンドウスイッチャーアプリケーションです。若干語弊はあるかもしれませんが、簡単に言うと **「cmd + tab に柔軟な設定ができるアプリケーション」** です。

言葉で説明されても分からないと思うので、実際の動作イメージを見てください。Slackをミニマイズしても cmd + tab にSlackが出てきません。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4514/71ecd5a3-19ae-ca2a-ed4c-422fecfd951d.gif)

※Contextでは、最小化したアプリケーションを cmd + tab の候補に出さないという設定ができます。


## まとめ

Slackは便利だけど、時間を吸い取られる魔性のツールでもあります。様々なテクニックを駆使して、Slackに使われるのではなく、Slackを上手に使えるようになりたいですね。
FPSって何？動画のフレームレートをしっかりと理解し、自分で動画を制作しよう！

## FPSとは？

最初に、FPSの意味について詳しくご紹介していきましょう。

FPSとは「フレームレート」という言葉を指しています。FPS＝frames per secondは、静止画のコマ数を表す単位です。フレームレートとは、「フレーム」という連続した画像が画面上に表示される際、動画を作っている速度のことを言います。

25FPSで撮影された動画は、1秒間の中でフレームが25回再生されています。動画の滑らかさを決めるフレームレートは、数値が大きければ滑らかな動画になり、小さければ止まっているような違和感のある動画になります。FPSの数値は、様々な要素や媒体に合わせてフレームが変化しているのです。ちなみに、日本のテレビ番組は30FPSの動画が流れています。

## フレーム補間について

フレーム補間は、映画が滑らかに再生されるようにするための技術です。この技術により、カクカクとした映像をより自然で滑らかな状態に変換することができ、視覚的なつながりを保つことが可能です。

フレーム補間の利点は多岐にわたります。カクカクした動画を滑らかにすることで、よりクリアで魅力的な映像を楽しむことができます。また、特に高速な動きや複雑な動作が含まれるシーンにおいては、フレーム補間によって重要な情報を失うことなく再現されるため、視聴者はよりリアルな視覚体験を得ることができます。

## AI活用したフレーム補間ソフトについて

フレーム補間手法の中でも、AIを駆使したフレーム補間ソフトは特におすすめの選択肢です。UniFab フレーム補間 AIは、高い効率と優れた効果を誇り、専門知識がなくても簡単に利用できます。これこそ、最も手軽に動画のフレーム補間を行う方法だと言えるでしょう。

### AIフレーム補間のメリット
誰でも操作できるほどシンプルで、手順はたったの3ステップです。
従来の手作業でのフレーム補間と比べ、AIを活用することで、作業負担や時間を大幅に削減することが可能です。
AIが映像データを分析し、欠けたフレームを自動生成することで、より自然な動画を作成します。

UniFab フレーム補間 AIは、AI技術を駆使して、ビデオのフレームレートを120fpsに引き上げ、速い動きがあるダイナミックなシーンをより滑らかな映像に仕上げます。このソフトウェアを使用することで、ビデオのちらつきや揺れを大幅に軽減し、映像をより自然で滑らかな形に変換できます。また、Windows OSとMac OSの両方で利用可能です。

さらに、UniFab　[フレーム補間](https://ja.unifab.ai/smoother-ai.htm)は他社製品と異なり、二つのオプションを用意しています。整数倍のフレーム補間だけでなく、フレームレートは60fpsまたは120fpsから選ぶことができます。整数倍の補間を行わなくても、AI技術によって滑らかな映像を出力できます。そして、フレーム補間のリアルタイムプレビュー機能も搭載されています。
VMWare Workstation Pro を久しぶりに触る② インストール

## 前回のおさらい
5年ぶりぐらいに触る人間が、何分で構築できるのか、
というテーマで環境構築を進めてまいります。
前回はイメージダウンロードで1時間を要したお話です。

### 2.インストール
ダウンロードしたイメージをダブルクリックで、インストーラ起動です。
これは幸先がよい感じでは。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/b0dffb0b-44d8-32c5-b4f1-cf4540e879f4.png)

使用許諾契約書を読んで、同意する(イメージ割愛)。

Hyper-Vとの互換性で確認が出てきました。
念のため、先ほどHyper-Vはアンインストールしておいたんですが、ダメなのかな。
インストーラでよしなにでやってくれそうなので、「Windows Hypervisor Platformの自動インストール」にチェックを入れて「次へ」を押下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/8e324fd0-020a-2388-589a-ddafdf1d3610.png)

インストール先は、デフォルトのまま「次へ」を押下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/8df85db6-9efd-ef76-a249-01ec9b64e6a2.png)

ユーザエクスペリエンス設定を聞かれるので、送信はしないようにして、「次へ」。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/cb100635-063b-44c6-3f5c-a4608fbda19d.png)

ショートカットは不要なので、チェックを外して「次へ」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/e1f9267c-2068-8439-a142-8af8e02dbba8.png)

ようやく、インストールボタンが出てきましたね。
インストール開始！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/905e08bb-3ad8-d052-a3c5-ffba3b86dec9.png)

おおぉ、何事もなくインストール完了しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/2457e89b-f701-9481-5b7e-1ae7109a13ee.png)

ここまでは10分かからずに来れました。
次回は、実際にイメージを用いて仮想マシンを起動したいと思います。
VMWare Workstation Pro を久しぶりに触る① ダウンロード

## VMWare Workstation Pro
言わずと知れた、仮想マシン環境の代表格ですね。

商用利用のサポートが終了されたことに伴い、今年はVMWareから何に移行しようかって
話が盛り上がった1年でもありました。

エンタープライズでは使わない方向ですが、
個人利用としては今後も使っていきたいなとも考えています。
というか、競合のVirtualBoxやHyper-Vがいまいち使いずらなという感想の為。

## 5年ぶりぐらいに触る人間が、何分で構築できるのか
この業界では5年前となると、すごく昔の話になっちゃいますが、
果たして過去の経験を生かして、サクッと環境構築できるのでしょうか。

### 1.イメージダウンロード
公式に行って、「Download Fusion or Workstation」を押下

https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion

するとイメージ選択する画面が出る…出ない。
何、BroadComへのログインが必要なの？？

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/eb4018f3-2174-aec6-d710-b63a4b35b9ea.png" width="50%" />

ー　完　ー

気を取りなして、アカウント作成(10分)後に再チャレンジ。
無事にダウンロードポータルっぽい画面を表示できた。
All Productsか、Build Your Profileを選ばなきゃっぽいけど、めんどくさいのでAll Productsをポチっと。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/3e667431-0caa-2561-c1ef-6540202e5dd7.png" width="50%" />

All Productsボタン押しても、何も遷移しないんですけど。
使い勝手悪いんじゃないの？と思いながら画面上部の検索マークから「VMWare Workstation」で検索。
何度かリンクを押したりした結果、それっぽいページに到達。

https://support.broadcom.com/group/ecx/productdownloads?subfamily=VMware%20Workstation%20Player

VMware Workstation Player 17.6.1を選んで、
Windows版のダウンロードアイコンを押下。
あれ、マウスカーソル重ねると押下できない？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/76dedea1-d6c9-5de5-e429-49aa268f749c.png)

途中の内容を振り返ると、、
From the Software menu section, select VMware Cloud Foundation then My Downloads.
って書いてあるので、画面上部のプルダウンより「VMware Cloud Foundation」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/f64112b6-7c62-1d77-13b3-375372fc095b.png)


んで、ようやくダウンロードアイコン押せそうなので、押下！
契約情報を入れろとか言われるので、仰せのままに入力し、ようやくダウンロードできた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/094bbc61-54bd-eee7-84b4-40a79e138cd7.png)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/586911dc-69d2-1e10-5814-941347d7ee50.png" width="50%" />


ダウンロードだけで、この大変さ。すでに1時間以上要している状況です。

次回はインストール手順をまとめていきます。
macでC言語のソースを書いてみる

#狙い
windowsでは、~~BBC DEVELOPER~~, Microsoft Visual StdudioなどのC言語専用のコンパイラツールがあるが、macにはそのようなものはない（筆者が聞いたことがないだけかもしれないが)
~~(どうやら、BccDeveloperは配布を終了したみたいです。2019.04.15 追記 )~~
なんか、配布されてた。(fujitanozomuさんありがとうございます。ｍ（＿ ＿）ｍ)

http://www.hi-ho.ne.jp/jun_miura/bccdev.htm
https://www.vector.co.jp/soft/win95/prog/se180695.html

そのため、macでC言語を動かすための方法を以下に紹介していく。

#1.PaizaIO

ブラウザ上で書いたコードを実行できるのが、paizaIOである。

<a href="https://paiza.io/ja" target="_brank">
![スクリーンショット 2019-04-03 16.46.07.png](https://qiita-image-store.s3.amazonaws.com/0/343721/c3baa4ab-b0a7-9181-15c4-4a8fe3b89981.png)
</a>

画面中央にある、コード作成を試してみる（無料）を押下することでブラウザ上でC言語の事項をすることができる
![スクリーンショット 2019-04-03 16.48.42.png](https://qiita-image-store.s3.amazonaws.com/0/343721/da9f116b-c298-d1f8-ce58-9d6672d4ae0e.png)

左上にあるJavaScriptの右にある▼を選択すると
![スクリーンショット 2019-04-03 16.49.35.png](https://qiita-image-store.s3.amazonaws.com/0/343721/0eaad0e6-14e2-06d2-246f-3623d7b1df9f.png)
対応している言語がずらりと表示されるので、この中からC言語を選択すると
![スクリーンショット 2019-04-03 16.50.51.png](https://qiita-image-store.s3.amazonaws.com/0/343721/db21e959-5a30-6a83-1dc7-a1d7af87b16a.png)

すでに大枠ができている！(◎_◎;)

あとはこの

```c
int main(void){
    // Your code here!
    
}
```

の中に処理を書いていけば良い




```c
int main(void){
    // Your code here!
   printf ("hello world\n"); 
}
```

と書いて実行すれば

![スクリーンショット 2019-04-03 18.18.56.png](https://qiita-image-store.s3.amazonaws.com/0/343721/4a7f18f4-b540-65fd-972b-4c906d599cb4.png)
のように表示される。

#2.terminal


次にterminalを使用した方法をご紹介する

##ソースの編集、保存
```
$ vi sample.c
```

でソースを作成する。先ほどと同様に以下のソースを入力する

```c
#include <stdio.h>
int main(){
        printf("hello world\n");
}
```

```
[esc]：wq
```
で保存をした後で、以下のコマンドを実行しコンパイルする

## コンパイル
```
$gcc -g sample.c
```
```

$ls -l *out
```
でa.outができていることを確認する

##実行
```
$./a.out
```

を打ち込んで、

```
hello world
```

と表示されれば成功です。


ではまた次回の記事でお会いしましょう。
jsPsychをスマートフォンで動かしたい

[jsPsych](https://www.jspsych.org/v8/) は、何もせずとも、一応スマートフォンで動きます。ただし文字のサイズが非常に小さく、使いづらいです。そのため、スマートフォンで動かすためのCSSファイルを作成しました。[GitHub](https://github.com/kurokida/jspsych_smartphone_css)からダウンロードできます！

ですが、あまりこだわりがなければ、ヘッダーに次の１文を加えるだけで十分です。

```html
<meta name="viewport" content="width=device-width,initial-scale=1.0">
```

でもこれだけだと、文字サイズをもう少し大きくしたいというような要望を満たせないので、CSSファイルを作成しました。上記のGitHubから、smartphone.css　をダウンロードして、jspsych.cssと同様に読み込んでください。

```html
<link rel="stylesheet" href="jspsych.css"></link>
<link rel="stylesheet" href="smartphone.css"></link>
```
smartphone.cssは、必要に応じて、みなさんが自由に書き換えることができます。

# jspsych-survey-likert-sample1.html

こちらのファイルは、本家が公開している `examples/jspsych-survey-likert.html` を少し変更したものになります。先述の viewportの行を加えるだけでもOKなのですが、`scale_width: 500` が大きすぎてスクリーンをはみ出します。smartphone.cssを適用させるといい感じで収まります。`!important`を指定してスケールの幅を調整しているため、スマートフォンではscale_widthの指定が無効になります。幅を調整したいときは、smartphone.cssを直接編集してください。

# jspsych-survey-likert-sample2.html

~~こちらのファイルでは、questionsのpromptで指定した文字のサイズを大きくする方法を紹介しています。少々面倒なのですが、`<span class="prompt1">`を使うのがポイントです。prompt1の詳細については、smartphone.cssの中で明記しています。~~ →　**`!important`を指定することでこの問題を回避できました！**

# 注意点

- スマートフォンかどうかの判別は、画面の幅が480ピクセルより小さいかどうかで行っています。ピクセル数は、smartphone.cssで直接編集可能です
- CSSファイルはキーボード入力を可能にするわけではありません
- [survey-likertプラグインの`scale_width`](https://www.jspsych.org/v8/plugins/survey-likert/)や、[html-slider-responseプラグインの`slider_width`](https://www.jspsych.org/v8/plugins/html-slider-response/)は、スマートフォンでは無効になります。変更したいときは、smartphone.cssを直接編集してください
- スマートフォンのブラウザで、画面を下に引っ張るとページが更新される　Pull-to-Refresh　は、大部分の実験で弊害になると思うので無効にしています。有効にしたいときは、`overscroll-behavior: none;` を削除してください
- 現時点でのCSSファイルは、動作確認が不十分なので、実際に使われるときはいろんな端末での表示をご確認ください

# 参考資料

- jsPsychのCSSについて、[TODAさんが丁寧に解説しています。](https://note.com/toda_kodai/n/n15a39f1a0795)
- 私は使ったことがないのですが、[oyamaさんがsurvey関係の便利そうなプラグインを紹介しています。](https://qiita.com/takato_oyama/items/991981a9c02407929b26)
MPLS

# MPLSの特徴
>インターネットのネットワーク層に関するこれまでの説明では、IPルーターでフォワーディングされるデータグラムとしてのパケットのみ注目してきた。一方、広く利用され始めている技術がもう一つあり....

* IPルーター他のフォワーディングのシステムがMPLS

### ISPが高速でトラフィックを運ぶMPLS(MultiProtocol Label Switching) 
>広く利用され始めている技術がもう一つあり、`ISPが自前のネットワーク・トラフィックを高速に運ぶ`ために用いられいてる。この技術はMPLS(マルチプロトコル・ラベル・スイッチング)と呼ばれ、回線交換方式と非常に似ている。

* 回線交換方式を忘れた

### 回線交換方式とは確実に異なるMPLS(MultiProtocol Label Switching) 
>インターネット・コミュニティに属する人々の多くは、コネクション思考のネットワークを嫌っているが、それにもかかわらず、そのアイデアはコネクション指向へ回帰し続けているように思える。
...
しかし、インターネットとコネクション思考のネットワークとでは、ルートの構築方法が本質的に異なっているため、`MPLSは従来の回線交換方式とは確実に異なる技術`である。

### ラベルを基にフォワーディングする
>MPLSでは、`パケットの前にラベルを追加`し、宛先ラベルの代わりに`このラベルをもとにパケットのフォワーディング`を行う。`ラベルを内部テーブルのインデックスとする`ことで、デーブルを検索するだけで出力リンクがわかるようになっている。この技術を用いれば、`転送を大幅に高速化`することが可能となる。MPLSはもともと独自技術として開発され、`タグ・スイッチング(tag switching)`などさまざまな名前で知られていた。

# MPLSのパケットの構造
### PPP、MPLS、IPおよびTCPの順番でヘッダーが付いてる
>どこへラベルを挿入するかである。`IPパケットは仮想回線向けに設定されているわけではない`ため、 IPヘッダーには仮想回線番号を記録するフィールドが存在しない。このため、`新たにMPLSヘッダーをIPヘッダーの前に追加する必要`があった。データ・リンク・プロトコルとしてPPPを用いたルーター -　ルーター間のリンクの場合、`PPP、MPLS、IPおよびTCPのヘッダーを含めた`フレームのフォーマットは図5-63のようになる。

### MPLSヘッダーの構造
>一般的なMPLSヘッダーをIPヘッダーは4バイト長であり、４つのフィールドを持つ。
#### インデックスを保持するラベルフィールド
>最も重要なフィールドは、インデックスを保持するラベル・フィールドである。
#### QoSフィールド
>QoSフィールドは、サービス・クラスを表す。
#### Sフィールド
>Sフィールドは、`複数のラベルを積み上げる`ことに関連したフィールドである。
#### TtLフィールド
>TtLフィールドはこの後何回パケットをフォワーディングするかを表す。TtLフィールドの値はそれぞれのルーターにおいて1ずつ減らされ、０になるとパケットが破棄される。これにより、ルーティングが不安定な場合にも、パケットが無限にループすることを回避する。

# MPLSに限らず現実のプロトコルは理想的な階層化プロトコルモデルに当てはまらない
>MPLSは、`IPネットワーク層プロトコルとPPPリンク層プロトコルの間に位置`する。ラベル経路を確立する際に`IPアドレスや他のネットワーク層のアドレス利用する`からといって、第3層のプロトコルとは言えない。また、単一のリンクだけでなく複数のホップにわたってパケットをフォワーディングするため第２層のプロトコルとも言えない。このため、`MPLSは第2.5層のプロトコル`と説明される場合がある。

# IP以外のネットワークにもIPを送ることができる
>MPLSなら、IP以外のネットワーク上でIPパケットを運ぶことも可能である。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/

# 感想
IPを用いずにフォワーディングを行う。
最近のOpenBSD（前編）

本稿では2021年の秋にリリースされたOpenBSD 7.0から2022年の秋にリリースされたOpenBSD 7.2までの変更を振り返り、私が特に強く関心を寄せているものを紹介します。なお、サブプロジェクトやPortsの変更は割愛します。

## OpenBSD 7.0（2021年10月）

2021年10月14日にリリースされたOpenBSD 7.1から、[OpenBSD/riscv64](https://www.openbsd.org/riscv64.html)がサポート対象に仲間入りしました。また、[OpenBSD/arm64](https://www.openbsd.org/arm64.html)にApple Silicon関連のデバイスドライバがいくつか追加されました。

また、OpenBSD 6.7で導入されたOpenBSD版[bpftrace](https://github.com/bpftrace/bpftrace)こと[dt(4)](https://man.openbsd.org/dt.4)デバイスドライバがOpenBSD 7.0からいくつかのプラットフォームでデフォルトカーネルに組み込まれたのも大きな出来事です。この変更により、[btrace(8)](https://man.openbsd.org/btrace.8)コマンドに[bt(5)](https://man.openbsd.org/bt.5)で書かれたプログラムを渡すことでシステム内部のトレースを行うことができるようになりました。なお、LinuxのeBPFと違い、dt(4)はJITコンパイラを含みません。

この領域ではDTraceが生まれたSolarisやそれをいち早く取り込んだFreeBSD、NetBSD、macOSが先行していましたが、Linuxに続いてOpenBSDのトレース機能も徐々に追いついてきました。

## OpenBSD 7.1（2022年4月）

2022年4月21日にリリースされたOpenBSD 7.1の目玉といえばなんといってもOpenBSD/arm64に投入された大小様々な改善、特にApple Silicon対応が一般利用できる水準に達したことです。

Arm以外のプラットフォームにも影響する大きな変更のひとつは、Wi-Fi 5対応がnet80211デバイスドライバフレームワークで有効化され、IntelのACおよびAX世代の無線LANデバイスは80 MHz幅で接続できるようになったことです。

一方、OpenBSD 6.1で追加されたOpenFlowスイッチ実装である[switch(4)](https://man.openbsd.org/OpenBSD-7.0/switch.4)とそれに関連する[switchd(8)](https://man.openbsd.org/OpenBSD-7.0/switchd.8)および[switchctl(8)](https://man.openbsd.org/OpenBSD-7.0/switchctl.8)は残念ながらOpenBSD 7.1で削除されました。

## OpenBSD 7.2（2022年10月）

2022年10月20日にリリースされたOpenBSD 7.2はOpenBSD/arm64のハードウェアサポートを更に拡大しました。具体的には、Ampere AltraシリーズやApple M2、Qualcomm Snapdragon 8cx Gen 3のサポートが追加されました。

また、Armプラットフォーム以外のデバイスドライバの追加・改善も行われました。IntelのWi-Fi 6E対応チップであるAX210とAX211もサポートされるようになりました。ただし、今のところOpenBSDのnet80211にはWi-Fi 6サポートが導入されていないため、Wi-Fi 5以下でアクセスポイントと接続します。

いくつかのプラットフォームでブートローダーが[softraid(4)](https://man.openbsd.org/softraid.4)の暗号化済みRAID 1（RAID 1C）に対応しました。これまでも単独のディスク全体を暗号化してそこからシステムを起動することは可能でしたが、OpenBSD 7.2でミラーリングされた暗号化ディスクからシステムを起動できるようになりました。
大学生が２ヶ月でiOSアプリリリースできました！

こんにちは。大学生Sです。

先日app store connectにiOSアプリの審査を送った記事を書きました。こちら。↓

https://qiita.com/ssgaolai/items/84e322f656e44aa49b3b

また、作成したアプリの概要についてはこちら。↓

https://qiita.com/ssgaolai/items/bf2b91d1e2f3f015efba

その審査が無事通過し、晴れてapp storeに僕たちのアプリが名を連ねました！
実は一度審査に通りませんでした。

理由としては、提出したスクリーンショットにDEBUGのバナーが映り込んでいたため。
初歩的なミスでした。すぐに直して再提出すると、8時間ほどで承認のメールが届きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3672991/55a2a79b-0c3a-0d59-4adf-45d6868fcf42.png)
メールが届いた瞬間はとても嬉しかったです。
審査に通過してからapp storeに並ぶまでは少し時間がかかるみたいで、2時間くらいかかりました。
検索しても表示されない間も、リンクは共有できたので早速友達にリンクを送りつけてました。


スマホで記事を見ている方、ぜひダウンロードして使ってみてください。
レビューお願いいたします。

https://apps.apple.com/jp/app/%E3%81%BF%E3%82%93%E3%81%AA%E3%81%A7%E3%83%AF%E3%83%AA%E3%82%AB%E3%83%B3/id6738672960

ここまで読んでいただき、ありがとうございました。
PythonでWordの表を削除する

Word文書を操作していると、表を削除する必要が出てくることがある。文書構造をシンプルにするためであれ、コンテンツを更新するためであれ、Wordの表を削除するのは一般的な操作です。しかし、手動で削除するだけでなく、時間がかかり、エラーが発生しやすいことによって、この記事では、プログラムでWordの表を削除する方法を紹介します Pythonの 。
* [PythonでのWord内の指定表の削除](#pythonでのword内の指定表の削除)
* [PythonでWordの表をすべて削除する](#pythonでwordの表をすべて削除する)


:pushpin: この記事で使用しているメソッドは、[**Spire.Doc for Python**](https://www.e-iceblue.com/Introduce/doc-for-python.html)ライブラリを必要とします。pipで直接インストールできます：
>pip install Spire.Doc


## PythonでのWord内の指定表の削除
Word文書内の表を削除するには、**`TableCollection.RemoveAt(index)`** メソッドを使用して、インデックスで指定表を削除することができます。手順は以下の通りです：

1. Word文書を読み込む；
1. **`Sections[]`** プロパティで指定したセクションを取得する；
1. **`Section.Tables`** プロパティでセクション内の表のコレクションを取得する;
1. **`TableCollection.RemoveAt (index)`** メソッドで、指定したインデックスの表を削除する；
1. ドキュメントを保存します。

```python
from spire.doc import *
from spire.doc.common import *

# Word文書を読み込む
doc = Document()
doc.LoadFromFile("Table.docx")

# ドキュメントの最初のセクションを取得する
sec = doc.Sections[0]

# セクションの2番目の表を削除する
sec.Tables.RemoveAt(1)

# 文書を保存する
doc.SaveToFile("DeleteTable.docx", FileFormat.Docx)
doc.Close()
```
![RemoveWordTable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/88d61a3e-70d2-af84-efa3-9171a2c7c2a3.png)
 

## PythonでWordの表をすべて削除する
すべての表を削除するには、Word文書の各セクションにあるすべての表を反復処理し、ループを通して1つずつ削除する必要があります。手順は以下の通り：
1. Word文書を読み込む；
1. 文書内のすべてのセクションを繰り返し処理します；
1. 各セクションのすべての表を繰り返し処理し、**`Section.Tables.Remove()`** メソッドで各テーブルを削除します；
1. ドキュメントを保存します。

```python
from spire.doc import *
from spire.doc.common import *

# Word文書を読み込む
doc = Document()
doc.LoadFromFile("Table.docx")

# 文書内のすべてのセクションを反復処理する
for i in range(doc.Sections.Count):
    sec = doc.Sections.get_Item(i)

    # 各セクションのすべてのテーブルを反復処理する
    for j in range(sec.Tables.Count):
        table = sec.Tables.get_Item(j)
        # 表を削除する
        sec.Tables.Remove(table)

# 文書を保存する
doc.SaveToFile("RemoveAllTable.docx", FileFormat.Docx)
doc.Close()
```
![RemoveAllTable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/295383dd-eba6-1401-35bf-2e360bc4305c.png)

* * *
ウォーターマークを削除するには？クリックして1ヶ月のトライアルライセンスをリクエストする:

https://www.e-iceblue.com/TemLicense.html
FlutterでQRコードの生成とスキャン

# FlutterでQRコードの生成とスキャン

Flutterを使用して、アプリ内でQRコードの生成とスキャンを実装する方法

# 必要なパッケージの追加

まず、pubspec.yamlファイルに以下のパッケージを追加します。
```yaml
dependencies:
  flutter:
    sdk: flutter
  qr_flutter: ^4.0.0        # QRコード生成用
  mobile_scanner: ^2.0.0    # QRコードスキャン用
```

ターミナルで以下のコマンドを実行し、パッケージをインストールします。
```zsh
flutter pub get
```

# QRコードの生成

qr_flutterパッケージを使用して、簡単にQRコードを生成できます。
```dart
import 'package:qr_flutter/qr_flutter.dart';

// ...

QrImage(
  data: 'https://example.com',
  version: QrVersions.auto,
  size: 200.0,
),
```

•	data: エンコードする文字列
•	version: QRコードのバージョン（QrVersions.autoで自動設定）
•	size: QRコードのサイズ
•	backgroundColor: 背景色
•	foregroundColor: QRコードの色

# QRコードのスキャン

mobile_scannerパッケージを使用して、デバイスのカメラでQRコードをスキャンします。

基本的な実装
```dart
import 'package:flutter/material.dart';
import 'package:mobile_scanner/mobile_scanner.dart';

class QRScannerPage extends StatefulWidget {
  @override
  _QRScannerPageState createState() => _QRScannerPageState();
}

class _QRScannerPageState extends State<QRScannerPage> {
  String? barcode;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('QRコードスキャン'),
      ),
      body: Stack(
        children: [
          MobileScanner(
            onDetect: (barcode, args) {
              final String code = barcode.rawValue ?? '---';
              setState(() {
                this.barcode = code;
              });
              // 必要に応じて、結果を表示したり、別の画面に遷移
              print('QRコードの内容: $code');
            },
          ),
          if (barcode != null)
            Align(
              alignment: Alignment.bottomCenter,
              child: Container(
                color: Colors.white54,
                padding: EdgeInsets.all(16),
                child: Text(
                  '検出されたコード: $barcode',
                  style: TextStyle(fontSize: 16),
                ),
              ),
            ),
        ],
      ),
    );
  }
}
```

# カメラの権限設定

iOSの場合: ios/Runner/Info.plistに以下を追加します。
```
<key>NSCameraUsageDescription</key>
<string>カメラを使用してQRコードをスキャンします。</string>
```
Androidの場合: android/app/src/main/AndroidManifest.xmlに以下を確認してください。
```
<uses-permission android:name="android.permission.CAMERA" />
```
追加のオプション

MobileScannerウィジェットには、以下のオプションがあります。
	•	controller: カメラのフラッシュやフォーカス、ズームを制御するためのコントローラー。
	•	formats: スキャンするバーコードの形式を指定（デフォルトですべての形式をスキャン）。
	•	fit: カメラプレビューのアスペクト比を指定。

コントローラーの使用例
```dart
MobileScannerController cameraController = MobileScannerController();

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text('QRコードスキャン'),
      actions: [
        IconButton(
          icon: Icon(Icons.flash_on),
          onPressed: () => cameraController.toggleTorch(),
        ),
        IconButton(
          icon: Icon(Icons.cameraswitch),
          onPressed: () => cameraController.switchCamera(),
        ),
      ],
    ),
    body: MobileScanner(
      controller: cameraController,
      onDetect: (barcode, args) {
        // スキャン結果を処理
      },
    ),
  );
}
```

おわり〜
フルスタック開発現場でのGithub Copilot活用

こんにちは:grinning:
TRAILBLAZERでフロントエンドエンジニアをしている永吉です。

専門はフロントエンドなのですが、今の現場では以下の領域をフルスタックに開発しています：
- SwiftによるiOSアプリ開発
- KotlinによるAndroidアプリ開発
- Djangoによる管理画面・API開発

慣れない言語での開発ですが、Github Copilotを導入してからかなり楽になったので活用事例を紹介したいと思います！

# Github Copilot導入方法
現場ではXcode, Android Studio, PyCharmを使っているのでそれぞれのエディタに導入しました。
各エディタでの導入手順はこちらを参考にしました：
[環境へのGitHub Copilot拡張機能のインストール](https://docs.github.com/ja/copilot/managing-copilot/configure-personal-settings/installing-the-github-copilot-extension-in-your-environment?tool=xcode)

※Xcodeは以下の設定をOFFにしないとエディタを切るたびにCopilotが切れちゃうので注意です：
![スクリーンショット 2024-11-27 9.53.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53508/5e79c499-5627-a413-a565-4f6a59868f02.png)

# Copilot活用の一例
ここではAndroid Studioを使った事例を紹介します！

## 自動補完

### コメントで指示する
コメントにやりたいことを書くと、それを実現できるコードを提案してくれます。
また、すでに書いたコードにコメントを書こうとすると、コメント内容も提案してくれます。

![スクリーンショット 2024-11-29 17.01.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53508/fa740c82-9eea-cb48-f1d5-6542c23ebd24.png)


### ダミーデータを作成してもらう
変数名をそれっぽくすると値を補完してくれます。
以前書いたコードやモデルから値を推測してくれるので、テストを書くときにとても重宝します！

![スクリーンショット 2024-11-29 17.00.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53508/bfc6bb92-16c9-0991-4d5d-d79190d3055d.png)


## コードの部分選択

### コマンドで指示を出す
コードを部分選択して、左側に出るCopilotのアイコンを押すとテキスト入力エリアが出てきます。
そこに`/explain`や`/simplify`などのコマンドを入力すると、それに応じた返答をしてくれます。
このコードは何をしているんだろうと思ったときや、書いたコードがイケてないなと思ったとき使ってます！

![スクリーンショット 2024-11-29 16.58.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53508/4f62ca64-2024-6b1f-0e31-f9d40706f5f7.png)


### エラーを解消してもらう
エラーが出た部分を選択して、「エラーを解消してください」と入力すると解決策を提示してくれます。（`/fix`コマンドを使っても同じです）
間違ったサジェストをしてくることもありますが、「〜が間違ってます」と教えてあげると修正した案を提示してくれます。

![スクリーンショット 2024-11-29 17.08.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53508/437b83ea-df96-7f9d-d788-1717311d47fc.png)


## チャット機能

### 言語やアーキテクチャについて質問する
現場ではクリーンアーキテクチャを採用していますが、時折ルールに沿わないコードを見かけます。
そんなときは自分が感じた違和感が合っているかどうか、チャット機能を使って確認しています。

![スクリーンショット 2024-11-29 17.17.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53508/8c0b8096-3b74-00d6-d79b-0a39152f2129.png)


# 使うときに気をつけるべきこと

使うときに気をつけないといけないことは、<b>提案されたコードや説明を鵜呑みにしない</b>ということです。
AIはまだまだ進化途中で、間違った内容を提案してくることがあります。
また、効率的なコードでも可読性が低いと感じたら不採用にするなど、
<b>提案してくれたコードを採用するかは自分で判断する</b>ことを心がけています。

# 最後に
最初はGithub Copilotって何だろう？ぐらいから使い始めたのですが、導入して使い始めると色々な使い方ができることに気づき、段々慣れてきました。

導入してから開発スピードが向上したのはもちろん、今まで存在を知らなかったメソッドを提案してくれたり開発の幅が広がったのを実感しています。

他にも色んな活用方法があるかと思いますが、まだ導入していない方はぜひご検討ください！
TypeScriptで書いたLambda関数でAWS IoTのイベントを受ける時の型について

## はじめに
* アレ？っと思って調べる時間をもしかしたら若干短縮できるかもしれない簡単なtips
  * なんか調べても見つからなかったのでメモとして残しておく・・ 
* Lambda関数をTypeScriptで書くときの、handlerのeventの型定義に関する内容です

## aws-lambda ライブラリが定義するIoTEvent型

`aws-lambda` をimportすることで、handler関数のeventの型を指定することができます。
AWS IoTのイベントの場合、型は `IoTEvent` が用意されています。

```TypeScript
import type { IoTEvent } from "aws-lambda";
```

ある程度型の定義が決められている場合は特に考えることは無いのですが、
`IoTEvent`は、内容を任意に定義できる型になっており、
仕様は
```TypeScript
type IoTEvent<T = never> = string | number | T
```
です。

なので、Objectとして利用したい場合は `T` の部分を自分で定義してあげる必要があります。

### 使用例

topicに送信されるメッセージの他に、topic文字列、証明書IDを一緒に受け取りたい時の例です。

#### ルールのSQLステートメント

下記のように定義した場合を想定します。

`SELECT *, topic() as topic, principal() as certificateId FROM 'sdk/test/js'`

#### 型の定義

ペイロードのtype(or interface)を`EventPayload`として定義した時、`IoTEvent<EventPayload>`になります。

eventはstring, numberの場合もあるので、それ以外の場合としてハンドリングしてあげて
`topic, message, certificateId`を参照します。

```TypeScript
type EventPayload = {
  topic: string;
  message: Message;
  certificateId: string;
};

export async function handler(
  event: IoTEvent<EventPayload>,
  _context: Context | undefined,
  callback: Callback,
) {
  // IoTEvent は number, string, object のいずれかの型を取る
  if (typeof event === "string" || typeof event === "number") {
    callback(null, "Invalid event type.");
    return;
  }

  const { topic, message, certificateId } = event;
  console.log(`topic: ${topic}`);
  console.log(`certificateId: ${certificateId}`);
  console.log(`message: ${message}`);

  ...
```

以上になります。
Windows環境でClaude Desktop + GitHub MCP Serverを使ってサンプルリポジトリを作成する方法

## 📝 概要

この記事では、Windows環境でのClaude DesktopのModel Context Protocol (MCP)を使用して、GitHub APIと連携し、サンプルリポジトリを作成する方法を解説します。GitHub MCP Serverを活用することで、Claudeから直接GitHubの操作が可能になります。

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">claude mcp （Model Context Protocol）の玩具箱を遊んでみる～GitHub MCP Server編～⑤<br>リポジトリをMCPで作成してからREADMEの生成までイケた！！！<br>処理のフローはだいぶ課題がありそうだけど。。。工夫すれば結構いい線イケるかも！ <a href="https://t.co/lMHEHh2sMq">https://t.co/lMHEHh2sMq</a> <a href="https://t.co/C4R82H8MVH">pic.twitter.com/C4R82H8MVH</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1862330594535121333?ref_src=twsrc%5Etfw">November 29, 2024</a></blockquote> 


## 🔑 前提条件

- Windows 10/11
- PowerShell 7.4以上
- Node.js と npm がインストールされていること
- Claude Desktopがインストールされていること
- GitHubアカウントを持っていること

## 🛠️ セットアップ手順

### GitHub Personal Access Tokenの取得

1. GitHubの設定画面から「Developer settings」→「Personal access tokens」に移動
2. 「Generate new token」をクリック
3. 以下の設定を行う：
   - リポジトリアクセス範囲の選択（Public/Private/Selected）
   - `repo`スコープの選択（プライベートリポジトリの場合）
   - パブリックリポジトリのみの場合は`public_repo`スコープを選択
4. 生成されたトークンをコピー（`ghp_`で始まるトークン）

### GitHub MCP Serverのグローバルインストール

PowerShellを管理者権限で開き、以下のコマンドを実行します：

```powershell
npm install -g @modelcontextprotocol/server-github
```

インストールが成功すると、以下のような出力が表示されます：

```powershell
changed 31 packages in 10s

4 packages are looking for funding
  run `npm fund` for details
```

### Claude Desktop設定ファイルの編集

`%APPDATA%\Claude\claude_desktop_config.json`に以下の設定を追加します：

```json
{
  "github": {
    "command": "node",
    "args": [
      "C:\\Users\\<ユーザー名>\\AppData\\Roaming\\npm\\node_modules\\@modelcontextprotocol\\server-github\\dist\\index.js"
    ],
    "env": {
      "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_XXXXXX"
    }
  }
}
```

> **重要**: 
> - `<ユーザー名>`を自分のWindows ユーザー名に置き換えてください
> - `ghp_XXXXXX`を実際に取得したGitHub Personal Access Tokenに置き換えてください

## 💡 主な機能

GitHub MCP Serverは以下の主要な機能を提供します：

- リポジトリの作成・管理
- ファイルの作成・更新
- ブランチの自動作成
- プルリクエストの作成
- イシューの管理
- リポジトリの検索

## 🚀 活用例：サンプルリポジトリの作成

以下の手順でサンプルリポジトリを作成し、READMEファイルを追加できます：

1. リポジトリの作成
2. READMEファイルの作成
3. 変更のコミット

### 利用可能な主なAPI機能

- `create_repository`: 新規リポジトリの作成
- `create_or_update_file`: ファイルの作成・更新
- `push_files`: 複数ファイルの一括プッシュ
- `create_branch`: 新規ブランチの作成
- `create_pull_request`: プルリクエストの作成

## ⚠️ Windowsでの注意点

1. **パスの指定**
   - Windowsのパス区切り文字は`\`を使用
   - JSON内では`\\`とエスケープする必要がある
   
2. **PowerShell権限**
   - npmのグローバルインストールには管理者権限が必要
   - 実行ポリシーの確認と設定が必要な場合がある

3. **環境変数**
   - Windowsユーザー名を正しく設定
   - パスに日本語が含まれていないことを確認

## 🔗 参考リンク

- [GitHub MCP Server公式ドキュメント](https://modelcontextprotocol.io)
- [GitHub API Documentation](https://docs.github.com/en/rest)
- [Claude Desktop Documentation](https://docs.anthropic.com)

## まとめ

Windows環境でGitHub MCP Serverを使用することで、Claude DesktopからGitHubの操作を効率的に行うことができます。適切な設定と注意点を守ることで、Windows特有の問題を回避しつつ、安全かつ効果的にGitHub操作を行うことができます。


<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
事業者合併時のshopID移行問題

## 概要

マイクロサービスを採用している某社には以下のサービスがある
・決済サービス
・アカウントサービス

決済サービスでは、決済代行での決済時には事業者に紐づくshopIDを
アカウントサービスから取得する必要がある。

![スクリーンショット 2024-11-29 12.20.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620908/4134d541-1929-c4c6-4111-c6fe058523dc.png)


## 問題

ある日、A社がB社に吸収合併されると連絡が来た。
・A社-shopID_A
・B社-shopID_B

それに伴い、アカウントサービスチームから以下変更をするが問題ないか確認が来た。

A社-shopID_Aを
→B社_A支店-shopID_B
に更新したい。

![スクリーンショット 2024-11-29 12.18.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620908/bf061bc6-921a-cb38-1e77-72035b2756ad.png)

この変更は、金額訂正をする場合に問題となる。なぜなら金額訂正には初回決済時のshopIDをリクエストする必要があるからだ。
決済サービスではA社という情報は記録されているが、どのshopIDだったかは記録されていない。

## 解決案

### 初案
決済サービス側で新規決済時にどのshopIDが使われたか保存し、
金額訂正時にはそのshopIDを利用する。

#### 初案に対する課題
・アカウントサービスで管理していた情報が決済サービスに侵食
・shopID保存対応以前のshopIDは記録されていない状態のため、金額訂正に失敗する
・処理の複雑化

### 新案
レコードの更新ではなく追加
→金額訂正ではB社をリクエストし、新規決済ではB社_A支店をリクエストする

![スクリーンショット 2024-11-29 12.38.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620908/991f594d-1972-6ec9-96b6-79d405867e9e.png)

#### メリット
・初案の課題は払拭
・決済サービス側の対応不要

#### デメリット
アカウントサービス側でレコード管理の複雑化
→案：
・versionカラム追加
・expired_atカラムを追加（金額訂正には訂正期限があるため、その期間を入れておく）
今回だとB社_A支店を追加した時点でA社のexpired_atを6ヶ月後に設定。

# まとめ
今回の話は広い意味でバーション管理です。
いろんなところで使える。