OmniAICreator/Qiita-1.07M huggingface dataset:
路由相关

## 一：定义路由
⭐在index.js文件中定义路由（有几个页面就相应的定义几个路由）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899383/81336187-e55b-04bb-9385-931961cb66f1.png)
#### 1.方式一：router-link
可以返回
```java
<router-link to="/data">跳转到数据页面</router-link>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899383/a4df2177-d90b-c72b-1be7-718cc765e0fd.png)
#### 2.方式二：a标签
可以返回
```java
<a href="/data">跳转到数据页面</a>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899383/a4df2177-d90b-c72b-1be7-718cc765e0fd.png)
#### 3.方式三：push
可以返回,需导入router对象
```java
<el-button type="primary" @click="router.push('/data')">跳转到数据页面</el-button>
import router from '@/router';
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899383/5eb580be-d272-30a0-85be-876f22502525.png)
#### 4.方式四：replace
跳转后无法返回(替换路由)
```java
<el-button type="primary" @click="router.replace('/data')">跳转到数据页面</el-button>
import router from '@/router';
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899383/5eb580be-d272-30a0-85be-876f22502525.png)
## 二：路由传参
#### 1.传递参数
```java
<el-button type="primary" @click="router.push('/data?id=1')">路由传参id=1</el-button>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899383/7db9660c-9a59-1512-8cab-2fdd98aa2af6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899383/f85e10be-c7ed-94e3-9053-9eeccd8f8487.png)
#### 2.获取参数
在data页面中定义id
```java
const data = reactive({
    id:router.currentRoute.value.query.id
    })
```
## 三：嵌套路由 RouterView
父级页面嵌套子级页面，父级路由嵌套子级路由
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899383/76f6b8bb-1248-1652-b89e-f50716d35779.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899383/6a1a8d3b-87e6-c8bf-aeba-67efb09297d9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899383/b70825f1-2d50-74cc-92ed-5a16e613ca88.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899383/7c7d73ad-3529-bdab-f791-236c5bb6f1b0.png)
## 四：路由守卫
在index.js文件中使用导航守卫，修改网页标题
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899383/901bb98b-7b36-2f06-24e0-82197351b62b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899383/d17ffc9f-641e-dde8-826b-fb9e4dc6d3fb.png)
## 五：404页面
#### 1.定义404页面
```java
<template>
    <div>
        非常抱歉，找不到页面了！
    </div>
    <div>
        <el-button type="primary" @click="goHome">返回主页</el-button>
    </div>
</template>

<script setup>
const goHome = ()=> {
    location.href='/manager/home'
}
</script>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899383/9444646d-4bc1-dd2d-bd96-8b6e3149be45.png)
#### 2.定义404路由
不是子路由，与父级路由同级
```java
    {
      path: '/404',
      name: '404',
      meta: {
        title: '404找不到页面'
      },
      component: () => import('../views/404.vue')
    },
```
#### 3.路由输入错误时，统一跳转到404页面
不是子路由，与父级路由同级
```java
    {
      path: '/:pathMatch(.*)',
      redirect: '/404'
    }
```
2025/1/9　学習記録

## 現状：
エンジニアへの未経験転職。
就職先も決まり、2月からひよこエンジニアに。

2025年は頑張ろうということで、2025年学習記録9日目。

内容は常に書き散らしのメモです、あしからず。

当面の目標：LPIC101,102合格


## Rubyのみでローカルホストに接続する方法

以下は、Rubyのコードスニペットに含まれる各行の詳細な解説です。

```ruby
require 'socket'
```
- **意味**: Rubyの標準ライブラリである`socket`を読み込みます。このライブラリは、TCP/IP通信を行うためのクラス（`TCPServer`や`TCPSocket`など）を提供します。

```ruby
server = TCPServer.new(2000)
```
- **意味**: ポート番号2000で新しいTCPサーバーを作成します。`TCPServer.new`メソッドは、指定したポートで接続要求を待ち受けるサーバーインスタンスを返します。このサーバーは、クライアントからの接続を受け入れる準備が整います。

```ruby
loop do
```
- **意味**: 無限ループを開始します。このループ内で、クライアントからの接続を待ち受け、処理を行います。無限ループにすることで、サーバーが常に動作し続けることができます。

```ruby
  client = server.accept
```
- **意味**: クライアントからの接続を受け入れます。`accept`メソッドは、接続が確立されると新しい`TCPSocket`インスタンス（ここでは`client`）を返します。このインスタンスを通じて、クライアントとの通信が可能になります。

```ruby
  request = client.gets
```
- **意味**: クライアントから送信されたリクエストデータを1行読み取ります。`gets`メソッドは、クライアントからのデータを受信し、その内容を変数`request`に格納します。この行は、HTTPリクエストの内容を取得するために使用されますが、この例ではリクエスト内容は特に処理されていません。

```ruby
  response = "HTTP/1.1 200 OK\r\n"
```
- **意味**: HTTPレスポンスの最初の行を設定します。この行はHTTPバージョンとステータスコード（ここでは200 OK）を示しています。これは、クライアントに対してリクエストが成功したことを伝えるためのものです。

```ruby
  response += "Content-Type: text/html\r\n"
```
- **意味**: レスポンスヘッダーに「Content-Type」を追加します。このヘッダーは、レスポンスの内容がHTMLであることを示しています。これにより、ブラウザは受信したデータを正しく解釈できます。

```ruby
  response += "\r\n"
```
- **意味**: ヘッダーとボディの区切りとして空行（CRLF）を追加します。HTTPプロトコルでは、ヘッダーとボディの間には必ず空行が必要です。

```ruby
  response += "<html><body><h1>Hello, Ruby!</h1></body></html>"
```
- **意味**: HTTPレスポンスボディにHTMLコンテンツを追加します。この場合、「Hello, Ruby!」というメッセージが表示されるシンプルなHTML文書です。

```ruby
  client.print response
```
- **意味**: 構築したHTTPレスポンス全体をクライアントに送信します。`print`メソッドは、指定されたデータをソケット経由で送信します。

```ruby
  client.close
```
- **意味**: クライアントとの接続を閉じます。これにより、リソースが解放され、新たな接続が可能になります。サーバーは次のクライアントからの接続要求を待ち受ける状態になります。

```ruby
end
```
- **意味**: `loop do` の終わりです。これにより、無限ループが継続し、新しいクライアントからの接続待機状態に戻ります。

このコード全体は、非常にシンプルなHTTPサーバーとして機能し、ポート2000で接続されたクライアントに「Hello, Ruby!」というメッセージを返すことができます。

Citations:
[1] https://qiita.com/sho-19202325/items/6c677fdfaf279c3e4b4f
[2] https://zenn.dev/skakimoto/articles/2024-10-25-create-socket-ruby-wrapper
[3] https://zenn.dev/redheadchloe/articles/9f9cbac85e2717
[4] https://zenn.dev/kuredev/articles/aa26f88cd643de
[5] https://zenn.dev/tmtms/articles/202103-ruby-socket-tcp
[6] https://zenn.dev/oott0228/articles/8e509b699ea19e
[7] https://docs.ruby-lang.org/ja/latest/class/TCPServer.html
[8] https://docs.ruby-lang.org/ja/2.0.0/method/TCPServer/s/new.html
[9] https://www.twilio.com/ja-jp/blog/5-ways-make-http-requests-ruby-jp
[10] http://www2.nagano.ac.jp/hiraoka/NP/tcpServer1.html
[11] https://qiita.com/akiray03/items/0689497093c961a3e627
[12] https://blog.sarabande.jp/post/82583858106


## gitコマンド

- `git init` ：`.git` ディレクトリの作成
- `git add .` ：ファイルの変更内容をステージに追加する
- `git commit -m "メッセージ"` ：メッセージを付けたコミットを実行する

### 今日はここまで！
ubuntu 24.04でwordpressを立てる。(apache)

## 1.まずアップデート

```
sudo apt update && sudo apt dist-upgrade -y
```

## 2.必要なソフトをインストール

※Apache、MySQL、PHP、gdです。

```
sudo apt install -y apache2 mysql-server php libapache2-mod-php php-mysql php-gd
```

phpのオプションモジュールも入れておいたほうがいいので必須ではありませんが基本入れましょう。

```
sudo apt install -y php-curl php-dom php-imagick php-mbstring php-zip php-intl
```

## 3.MySQL設定

#### その1

```
sudo mysql_secure_installation
```
このプロンクトに従ってセキュリティ関連の設定をします。

#### その2

WordPress用のデータベースとユーザーを作成

```
sudo mysql -u root -p
```
MySQLのプロンプトに入り、以下のコマンドを実行します。

```
CREATE DATABASE wordpress;
CREATE USER 'wordpressuser'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```
※your_passwordにパスワードを書いてください
これにより
データベース:wordpress
ユーザー:wordpressuser
が作成されます。

## 4.WordPressのダウンロードと設定

### WordPressのダウンロードとhtmlディでクトリに設置
```
cd /tmp
wget https://ja.wordpress.org/latest-ja.tar.gz
tar -xvzf latest-ja.tar.gz
sudo mv wordpress /var/www
cd /var/www
rm -rf html
mv wordpress html
```

### 権限がないのディデクトリのパーミッション設定

```
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html
```
### WordPress設定ファイルを作成

```
cd /var/www/html
cp wp-config-sample.php wp-config.php
nano wp-config.php
```

`wp-config.php`を編集してmysqlの情報を設定します。
```
define('DB_NAME', 'wordpress');
define('DB_USER', 'wordpressuser');
define('DB_PASSWORD', 'your_password');
define('DB_HOST', 'localhost');
```
※your_passwordはmysqlのパスワードに変えてください。

## 5.WordPressのインストールを完了する
ブラウザを開き、`http://your_server_ip/` にアクセスして、画面の指示に従ってWordPressのインストールを完了します。

## ついでに
php.iniの場所は
`/etc/php/PHPのバージョン/cli/php.ini`
か
`/etc/php/PHPのバージョン/apache2/php.ini`
にありますが、今回はapache2を使用しているため。
`/etc/php/PHPのバージョン/apache2/php.ini`
の方を編集してください。
編集したら
```
sudo systemctl restart apache2
```
で更新されます。
※人によっては場所が違う可能性があります。

## 追記(リバースプロキシでssl化と.htaccessについて)

リバースプロキシを使ってssl化する場合は
`/etc/apache2/apache2.conf`に

```apache2.conf
SetEnvIf X-Forwarded-Proto https HTTPS=on
```
と入れましょう。

また、`.htaccess`を使いたい場合は
`/etc/apache2/apache2.conf`の`<Directory /var/www/>`という項目の中にある
` AllowOverride `が`None`になってなら`All`にしましょう。

### 例

```apache2.conf
AllowOverride None
 ```
↓
```apache2.conf
AllowOverride All
 ```

## 参考にさせてもらった記事

https://qiita.com/office_porco/items/196d0871d68ff8b9d1e3

(正直この記事では言語が日本語ではなかったので自分用に書いたようなもんです。)
５日目

# Webサイトのドキュメントを一括でMarkdownファイルに変換してみた

## はじめに

今回は、Webサイトのドキュメントを自動で収集し、Markdownファイルに変換を行いました。具体的には、Dataiku DSSというデータ分析プラットフォームのドキュメントを例に説明していきます。

## やりたいこと

1. ドキュメントサイトから必要な情報を自動で集める
2. 集めた情報をMarkdownファイルに変換する
3. 変換したファイルを見やすく整理する
4. ファイル内のリンクを使えるようにする

## 必要な準備

- Python 3.10以上
- 必要なPythonパッケージ：
    - requests
    - beautifulsoup4
    - markitdown
    - python-dotenv
    - tqdm

## 1. ドキュメントの収集（スクレイピング）

まず、Webサイトから情報を集めるスクリプト（`scraper.py`）を作りました。

```python
import requests
from bs4 import BeautifulSoup
import json
from datetime import datetime

def scrape_page(url):
    # ページの内容を取得
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    # タイトルとURLを保存
    title = soup.find('title').text.strip()
    return {
        'url': url,
        'title': title,
        'timestamp': datetime.now().isoformat()
    }

# メインの処理
urls = []  # 収集したURLを保存
for url in start_urls:
    page_info = scrape_page(url)
    urls.append(page_info)

# 結果をJSONファイルに保存
with open('pages_info.json', 'w') as f:
    json.dump(urls, f, indent=2)

```

## 2. HTMLからMarkdownへの変換

次に、収集したページをMarkdownに変換するスクリプト（`html-to-markdown.py`）を作成しました。

```python
from markitdown import MarkItDown
from openai import AzureOpenAI
import os

def convert_to_markdown(url, title):
    # Azure OpenAIを使ってHTML→Markdown変換
    client = AzureOpenAI(...)
    md = MarkItDown(llm_client=client)

    # 変換実行
    result = md.convert(url)

    # ファイルに保存
    with open(f"{title}.md", 'w') as f:
        f.write(result.text_content)

```

## 3. Markdownファイルの整理

変換したファイルの中には不要な情報も含まれているので、整理するスクリプト（`clean_markdown.py`）を作りました。

```python
def clean_markdown_file(file_path):
    with open(file_path, 'r') as f:
        lines = f.readlines()

    # 必要な部分だけを残す
    cleaned_lines = lines[:7]  # ヘッダー部分
    cleaned_lines += lines[version_line_index + 1:]  # 本文

    with open(file_path, 'w') as f:
        f.writelines(cleaned_lines)

```

## 4. リンクの修正

最後に、ファイル内のリンクを実際にアクセスできるように修正するスクリプト（`fix_links.py`）を作成しました。

```python
from urllib.parse import urljoin

def fix_links(content, base_url):
    # 相対パスを絶対URLに変換
    pattern = r'\\[(.*?)\\]\\((.*?)\\)'

    def convert_link(match):
        text, link = match.groups()
        if link.startswith(('../', './')):
            return f'[{text}]({urljoin(base_url, link)})'
        return match.group(0)

    return re.sub(pattern, convert_link, content)

```

## 実行結果

- 1,222個のドキュメントページを収集
- すべてのページをMarkdownに変換
- リンクを外部からアクセス可能な形式に変更
- 処理の成功率：100%

## まとめ

このプロジェクトを通じて、以下のことが実現できました：

1. Webサイトの情報を自動で収集
2. 収集した情報をMarkdown形式に変換
3. ファイルを整理して使いやすく整形
4. リンクを実際に使える形に修正

特に難しかったのは：

- 再帰的なスクレイピングの実装
- Markdownファイルの適切な整形
- 相対パスの絶対URL変換

## 今後の改善点

- 並列処理による処理速度の向上
- エラーハンドリングの強化
- より柔軟なURL構造への対応

## 参考資料

- BeautifulSoup4のドキュメント
- Azure OpenAIのドキュメント
- Pythonの正規表現ガイド

向山さんに教えてもらったライブラリを使えば、他のドキュメントサイトでも同様の変換が可能かも。Flask等でUI作ったらもっとみんなで使えるかも。
Raspberry でモーター制御（サーボモーター）

**サーボモーター**
「モーター」というとミニ四駆やラジコンの心臓を連想します。
電源をＯＮにすると走行する玩具ですが、今回利用するのは「サーボモーター」と言われる電材です。

「モーター」と付くだけあって、通電すると軸が回ります。普通のモーターとの違いは、角度付けができる点でしょう。　右４５度、左９０度のように、決められた角度へ回転させる事が可能です。　この電材の使い道ですが、私はカメラの台座に取り付けて、撮影時のカメラの首振りに使ってみました。

Raspberry で良く利用されているサーボモーターと言えば、安くて、パワーが無くて、低電力で動作する「SG-90」でしょう。

**SG-90**
仕様は概ね同じだと思うのですが、購入時のデータシートは大事に保管しましょう。
　　① 赤：電源電圧：3.3～6.0ｖ　（5v電源を利用しましょう）
　　② 茶：GND
　　③ 黄：DATA（PWM）
の３本が用意されているはずです。 それぞれ、
　　① ２番：5V電源
　　② ９番：Ground
　　③ １１番：GPIO17
で、RaspberryのGPIOへ接続します。
データシートで重要な情報は、
　・可動域（180度）
　・ニュートラルポジション（1.45ms）
　・周波数（50Hz）
　・周期時間（20ms）
　・サーボに指定可能な最小＆最大時間（0.5ms～2.4ms）
 の把握が必要です。


**角度付けの計算方法**
＜0度に角度付けする場合＞　＝　２．５
可動域（180度）に対する割合　＝　0度 ／ 180度　＝　０
サーボに指定可能な時間範囲（2.4-0.5）　＝　1.9 ms
　　※ この二つをかける　＝　０　＊　1.9 ms　＝　０
更に、サーボに指定可能な最小時間を足す　＝　0.5 ms　＋　０　＝　0.5 ms
周期時間との割合を計算します　＝　（ 0.5 ms ／ 20 ms） ＊ 100　＝　２．５

＜180度に角度付けする場合＞　＝　１２
可動域（180度）に対する割合　＝　180度 ／ 180度　＝　１
サーボに指定可能な時間範囲（2.4-0.5）　＝　1.9 ms
　　※ この二つをかける　＝　１　＊　1.9 ms　＝　１．９
更に、サーボに指定可能な最小時間を足す　＝　0.5 ms　＋　１．９　＝　2.4 ms
周期時間との割合を計算します　＝　（ 2.4 ms ／ 20 ms） ＊ 100　＝　１２

以上の計算から、０度（２．５）～　１８０度（１２）の間で値を指定して角度付けしましょう。


**プログラムなどの準備**
Raspberry PI 4 を OS Lite で準備しました。
sudo apt-get update
sudo apt-get upgrade

```diff_python:test.py
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)            # GPIOモード設定
servo_pin = 17                    # GPIOピン番号
GPIO.setup(servo_pin, GPIO.OUT)   # GPIO出力モード
pwm = GPIO.PWM(servo_pin, 50)     # 周波数50Hz
pwm.start(1.45)                   # パルス幅1.45ms＝ニュートラルポジション

try:
    while True:
        pwm.ChangeDutyCycle(12)   # パルス幅12msで、角度は約180度
        time.sleep(2)
        pwm.ChangeDutyCycle(2.5)  # パルス幅2.5msで、角度は約0度
        time.sleep(2)

except KeyboardInterrupt:
    # Ctrl+Cで終了（PWMを停止）
    pwm.stop()
```
プログラムが出来たら実行してみましょう。
python test.py
サーボモーターが、180度行ったり来たりしたら完了です。
お疲れさまでした～


**注意点**
サーボモーターの角度付けですが、微妙に角度がずれる事があるようで、そんな時はプルプルとモーターが震えます。
カメラの角度付けに使った時は、このプルプルでピンボケ画像が大量作成されて参りました…（笑）
【個人用】AWS Solution Architect Associate対策ノート(マネジメント＆ガバナンス編)

## 扱う内容

・CloudWatch
・CloudTrail
・CloudFormation
・Elastic Beanstalk

# 【CloudWatch】

## 標準的に取得できるEC2インスタンスのメトリクス
・CPU使用率
・ディスクの読み取り、書き込み量
・ネットワークトラフィック量

## EC2インスタンス上のアプリケーションのログ収集
EC２インスタンス上で稼働するアプリケーションのログを収集するには、そのインスタンスに**CloudWatchエージェント**をインストールする必要がある
EC2インスタンスが複数台ある場合は台数分エージェントをインストールしなければならない

## コンテナのログ収集
**CloudWatch Container Insights**を使用することで、ECSやEKSに対して、コンテナ化されたアプリケーションやマイクロサービスのログやメトリクスを収集できる

# 【CloudTrail】

## 証跡情報とは
AWSの全アカウントでの操作履歴を集めるための設定
だれがいつどのリソースに対してどのような操作をしたの情報を得るために行う

## CloudTrailで監視対象になるイベント

### 管理イベント
ユーザーのログイン、リソースの作成、変更、削除などの操作

### データイベント
リソースへの細かな操作(S3内のデータ操作、Lambda関数の実行など)

### インサイトイベント
通常と異なる操作(APIの異常な呼び出しなど)

管理イベントはデフォルトで監視対象になっているが、データイベントやインサイトイベントは監視対象になっていないので、監視したい場合は別途設定が必要

# 【CloudFormation】
## CloudFormationのスタック

CloudFormationの**スタック**とは、AWSリソース(EC2インスタンス、S3バケットなど)を一つのまとまりとして定義、管理するもの
スタックを作成する際は、JSONまたはYAML形式のファイルを作成し、AWSリソースをどのように設定するかを決める

複数のAWSアカウントまたは複数のリージョンでスタックを作る場合は、**スタックセット**を作成する

# 【System Manager】

## System Managerとは
複数のAWSリソースをグループ化して、リソースの運用情報や運用タスクを管理、制御するサービス
役割ごとに複数の機能で構成されており、OSパッチの適用を自動化する**Patch Manager**や、マネジメントコンソール上からEC2インスタンスにログインできるようにする**Session Manager**などがある

## System Manager Session Manager
EC2インスタンスや、オンプレミスの仮想サーバーに、マネジメントコンソールやCLIからアクセスできる機能

## System Manager Automation
AWSリソースの操作を、ランブックに従って自動的に実行するサービス

## System Manager Run Command
EC2インスタンスに対して、リモートでコマンドを実行するサービス
【Mac】fzfとbatを使用したファイル検索とプレビューの方法

## fzfとは

`fzf`は、コマンドライン用の汎用的なファジーファインダーです。ファイルやコマンドのリストからインタラクティブに選択することができます。非常に軽量で、シンプルなインターフェースを持っています。

## batとは

`bat`は、ファイルの内容を表示するためのコマンドラインツールで、`cat`の代替として使われます。シンタックスハイライトや行番号の表示など、視覚的にわかりやすい出力を提供します。

## fzfとbatのインストール

Homebrewを使用してインストールできます。

```bash
brew install fzf
brew install bat
```

## fzfとbatを使ったファイル検索とプレビュー

以下の手順で、`fzf`と`bat`を組み合わせてファイルを検索し、プレビューします。

1. ターミナルを開く

2. 検索したいディレクトリに移動します。例えば、`Desktop`フォルダに移動する場合：

```bash
cd ~/Desktop
```

3. fzfとbatを組み合わせたコマンドを実行します。以下のコマンドを入力します：

```bash
fzf --preview 'bat --style=numbers --color=always {}' --preview-window=up:30%
```

   - `fzf`がファイルを検索し、選択したファイルの内容を`bat`でプレビューします
   - `--style=numbers`オプションで行番号を表示し、`--color=always`で色を常に表示します
   - `--preview-window=up:30%`でプレビューウィンドウの位置とサイズを指定します

4. ファイルを検索します。

![画面収録 2025-01-09 22.24.56.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/5c83411c-24bd-b3fc-b7d3-b737bc1e287f.gif)
Int to ByteArray, ByteArray to Int (Big-Endian)

# この記事は何?
Kotlin で Int を Big-Endian なバイト配列に変換するプログラムと、Big-Endian なバイト配列を Int に変換するプログラムを掲載しています。

```kotlin
fun Int.toByteArray(): ByteArray {
    val array = ByteArray(4)
    array[0] = (this shr 24 and 0xFF).toByte()
    array[1] = (this shr 16 and 0xFF).toByte()
    array[2] = (this shr 8 and 0xFF).toByte()
    array[3] = (this and 0xFF).toByte()

    return array
}

fun ByteArray.toInt(): Int {
    if (this.size != 4) throw IllegalStateException("ByteArray size must be 4, but this is ${this.size}.")
    return (this[0].toInt() and 0xFF shl 24) or
        (this[1].toInt() and 0xFF shl 16) or
        (this[2].toInt() and 0xFF shl 8) or
        (this[3].toInt() and 0xFF)
}
```
【Flyway】サポート対象のDB Versionなのに「Unsupported Database」エラーが出る問題の解決

## TL;DR

- Flyway 10.0以降で`flyway-core`からデータベースサポートが分離
- PostgreSQLを使用する場合は`flyway-database-postgresql`の依存関係を追加する必要あり

## 遭遇した問題

PostgreSQL 14.x（Flywayの公式サポート対象バージョン）を使用しているプロジェクトで、`flyway:migrate`実行時に以下のエラーが発生：

```
Unsupported Database: PostgreSQL 14.x
```

## 原因

私の場合、以下のように両方のライブラリを指定していたことが問題でした：

```gradle
dependencies {
    implementation 'org.flywaydb:flyway-core:11.1.1'
    implementation 'org.flywaydb:flyway-database-postgresql:11.1.1'
}
```

これが問題となった技術的な理由として以下が考えられます：

- Flyway 10.0からデータベースサポートが`flyway-core`から分離されました
- 両方のライブラリを指定した場合、`flyway-core`に含まれる古い（あるいは無効化されているはずの）データベースドライバーが優先的に使用される可能性がある
- その結果、新しい`flyway-database-postgresql`のドライバーが正しく認識されず、「Unsupported Database」エラーが発生する

## 解決方法

```diff
dependencies {
-   implementation 'org.flywaydb:flyway-core:11.1.1'
-   implementation 'org.flywaydb:flyway-database-postgresql:11.1.1'
+   implementation 'org.flywaydb:flyway-database-postgresql:11.1.1'
}
```

※ `flyway-core`は`flyway-database-postgresql`の依存関係として自動的に解決されるため、明示的な指定は不要です。

## さいごに

メジャーバージョンアップデート時は、依存関係の構造変更の有無を必ず確認しましょう。
特にFlywayの場合、10.0以降は使用するデータベース用の依存関係を明示的に指定する必要があります。
MCPツール開発で遭遇したクラッシュ問題と解決方法

## はじめに

Model Context Protocol (MCP) を使って Redmine 連携ツールを開発していたところ、予期せぬクライアントのクラッシュに遭遇しました。この記事では、遭遇した問題と具体的な解決方法を共有します。

この記事は [MCPツールのdescription制約：Claudeクライアントのクラッシュを防ぐ実装戦略](https://tech.jugoya.ai/blog/2025-01-09-mcp-tool-descriptions-constraint) をベースに、実装者向けにより実践的な内容として再構成したものです。

## TL;DR

- MCPツールの description に特定のパターンを含むとクラッシュする
- 括弧やアンダースコアの使用を避ける
- 説明は4行以内に収める
- ユニオン型の代わりにハンドラーで型変換を行う

## 発生した問題

開発中のRedmine MCPサーバーで、以下のようなツール定義を行った際にクラッシュが発生しました：

```javascript
{
  name: "list_time_entries",
  description: "List time tracking records (time_entries) from the database. Returns data in JSON format.",
  parameters: {
    type: ["number", "string"],
    // ... 他のパラメータ定義
  }
}
```

## クラッシュの原因

クラッシュの原因特定には大変苦労しました。当初はツールの実装に問題があるのではないかと考え、コードの見直しを行いましたが原因は特定できませんでした。その後、説明文のパターンを変更しながらテストを繰り返すことで、以下の3点が原因であることが判明しました：

1. 説明文での括弧の使用：説明文中に括弧を含めるとクラッシュが発生
2. アンダースコアを含む技術用語：time_entries などの一般的な技術用語でもクラッシュの原因に
3. パラメータでのユニオン型の使用：配列による型定義がクラッシュを引き起こす

この発見により、MCPの公式仕様には記載されていない、クライアント固有の制約が存在することが分かりました。これらの制約は文書化されていないため、実装時に注意が必要です。

## 解決方法

### 1. 説明文の改善

説明文は以下のようなパターンで記述します：

```javascript
{
  name: "list_time_entries",
  description: "List time tracking records. JSON response format. Optional filtering by date range. Available since version 1.1",
  // ...
}
```

このように情報を分割して記述することで、括弧を使わずに必要な情報を伝えられます。

### 2. 技術用語の言い換え

一般的な技術用語でも、パラメータ名であっても、アンダースコアを含むものは別の表現に置き換える必要があります：

- `time_entries` → `time records`  // パラメータ名も変更が必要
- `custom_fields` → `custom fields`  // よく使われる用語でも注意
- `issue_tracking` → `issue management`  // 機能説明でも置き換えを忘れずに

予想以上に制約は厳密で、description内のあらゆる場所でアンダースコアの使用を避ける必要があります。パラメータ名を参照する場合も例外ではありません。

### 3. 型の処理

ユニオン型の代わりに、文字列として受け取ってハンドラーで変換する方法を採用します：

```javascript
// Before
parameters: {
  type: ["number", "string"]
}

// After
parameters: {
  type: "string"
}

// ハンドラーでの処理
function handleParameter(value) {
  if (!isNaN(value)) {
    return Number(value);
  }
  return value;
}
```

## 実装のポイント

1. 説明文は4行以内を目安に
2. 括弧は使用しない
3. アンダースコアを含む用語は言い換える
4. 型の柔軟性はハンドラーで確保

## 今後の展望

MCPは2024年11月に公開された新しいプロトコルで、今後も実装パターンや制約に関する知見が蓄積されていくと考えられます。現在は以下の分野で特に発展が見られます：

- 各言語のSDK整備
- エンタープライズツールとの統合
- プロトコルの拡張に関する議論

## おわりに

MCPを使った開発では、公式の仕様だけでなく、実装時の制約にも注意が必要です。この記事で紹介した対応方法が、皆さんの開発の参考になれば幸いです。

## 参考資料

- MCPの公式ドキュメント
- Claude Desktop 開発者ガイド
CloudTrailに出力されるIAMのイベントをSlackに通知して監視したい

## CloudTrail使ってますか、CloudTrail。

最近CloudTrailの[https://www.slideshare.net/AmazonWebServicesJapan/20210119-aws-black-belt-online-seminar-aws-cloudtrail](http://qiita.com "Blackbeltの資料")に目を通しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491627/0e686005-5cb0-2ae1-6163-14ced389b4b0.png)

このスライドのように、CloudTrailのイベントをモニタリングする、ということをやってみたいと思います。

## 本記事の対象
- Lakeや証跡などを能動的に解析する❌ -> 別の記事で書くかも？
- イベントを通知して気付けるようにする✅

## CloudTrailは進化している
この資料は2021年のものですが、2022年にCloudTrailLakeがサービスインしたり、証跡を通知するのであればEventBridgeが使いものになるようになったり、現在の環境はこのスライドの当時とはちょっと異なっているのかなと思っています。

なので、通知の構成としては、
- CloudTrail -> (証跡があれば自動、証跡が1つもないと発行されない) -> EventBridge -> SNS -> AWS Chatbot

でやっていこうと思います。
なお他の実装パターンでは
- CloudTrail -> 証跡のCloudWatch Logs出力オプション -> Subscription Filter -> SNS -> Lambda

などが考えられると思いますが、EventBridgeの方はCloudWatchへの連携が必要なくイベントのフィルターも簡単で、SNSとも連携できるので、シンプルにいくと思いました。証跡が必要であれば、逆にLakeを有効化するのがいいのかなと思います。証跡を保存するということは分析がしたいということになるでしょうしね。

## IAMなどのグローバルサービスのイベントについて
知らなかったのですが、IAMはグローバルサービスなので、**全てのイベントがus-east-1に出力されるようです。**

通知の設定などを東京に置いている場合の設定について、二通りの方法を思いつきましたが、後述の通り、実際は一択でした。
1. ~~マルチリージョンの証跡を使ってus-east-1のイベントを東京でもみれるようにする~~
1. EventBridgeでus-east-1のイベントを東京に転送する✅

1つめのものは勘違いでした。グローバルサービスであれば、必ずイベントがus-east-1に発行されます。マルチリージョンの証跡というのは、「全てのリージョンで証跡を有効にする」という意味であって、「全てのリージョンの証跡を集約する」という意味ではないようで。

逆に昔は全てのリージョンで1こ1こぽちぽち有効化する必要があったようですね、そういった歴史を知るとこの意味にも納得します。

## やること
やること個別に関しては、それぞれ詳しい記事がありますので省略しますが、以下の手順がいいと思います。

1. AWS ChatbotとSNSの設定
https://techblog.cartaholdings.co.jp/entry/archives/6411 を参考に
1. CloudTrailの証跡の作成（CloudWatchへの連携をONにする必要はありませんが、証跡自体がないとEventBridgeにもデータが飛んでいきません。）
1. EventBridgeのus-east-1からap-northeast-1への転送設定
https://dev.classmethod.jp/articles/eventbridge-cross-region-expands/
が参考になります。

    この設定はus-east-1のEventBridgeの「ルール」で行います。
通知だけであれば無限ループの可能性もなく、イベントパターンは全てで大丈夫だと思います。

    ```json
    {
      "account": ["123456789012"]
    }
    ```

    ターゲットは別リージョンへの転送になるので「別のアカウントまたはリージョンのイベントバス」とした上でに**ap-northeast-1のdefaultバス**を選びます。選ぶと言いましたがUI上では選択肢に出てこないのでARNをコピペします。

    :::note warn
    なお、この設定を行うと、ap-northeast-1のdefaultバスにus-east-1のイベントが混ざりますので、それが嫌な場合バスを分けたりしたほうがいいです。今回の用途だとdefaultバスを本通知以外に利用していないのもありあえて混ぜます。
    
1. EventBridgeのap-northeast-1側の通知設定
最後にap-northeast-1側のルールで、SNSへの連携を行います。その際、通知対象のイベントを絞るのですが、JSONで書きます。冒頭の図の「IAMポリシーの削除、付与」のDeleteRoleを通知したければ

    ```json
    {
      "source": ["aws.iam"],
      "detail-type": ["AWS API Call via CloudTrail"],
      "detail": {
        "eventSource": ["iam.amazonaws.com"],
        "eventName": ["DeleteRole"]
      }
    }
    ```

    PutUserPolicyも通知したいなーと思ったらeventNameに追記したらいいですが、冒頭の図の「ルートアカウントでの操作」も通知したいなーと思ったら、別のルールを新規で作りましょう。
    図の中でいうと箱の単位がルールの単位にするとよさそうです。
    このEventBridgeのルール設定についてる対象のイベントを絞る機能は強力で、CloudWatchからの通知だとSubscriptionFilterの後にLambdaを噛ませてフィルタリングしたりしないといけないかもしれません。

## 以上
間違っているところがあればコメントください、検証の上訂正したいと思います。
Rails6から7にアップデートしたときに遭遇した`deprecation warning`について

## 読んで欲しい人
- Rails6から7系にアップデートする際`deprecation warning`にぶつかった人
- 過去の自分
## 取り組んでいたこと
あるプロジェクトのRailsバージョンを6から7系にアップデートする作業を行っていました
正確には`6.1.7.8`から`7.0.8.7`です

その中で`deprecation warning`に関しての設定が6と7で差分がありました

## `deprecation warning`とはなにか？

現在、そのプロジェクトで使用しているメソッドや機能が、将来的には非推奨になって削除されますよ、気をつけてね

という警告です

例えば、

```
DEPRECATION WARNING: `old_method_name` is deprecated and will be removed in Rails 7.1. Use `new_method_name` instead.
```
上記の例では`old_method_name`はRails7.1では削除されるよ気をつけてね、という警告をしてくれています

## `deprecation warning`に関するRails6から7の差分

[Diff](https://railsdiff.org/6.1.7.8/7.0.8.7)はこんな感じ

```ruby
-  # Send deprecation notices to registered listeners.
-  config.active_support.deprecation = :notify
-
-  # Log disallowed deprecations.
-  config.active_support.disallowed_deprecation = :log
-
-  # Tell Active Support which deprecation messages to disallow.
-  config.active_support.disallowed_deprecation_warnings = []
+  # Don't log any deprecations.
+  config.active_support.report_deprecations = false
```

### Rails6: config.active_support.deprecation = :notify

`config.active_support.deprecation = :notify`とは、非推奨のメソッドや機能がプロジェクトに含まれるときに`:notify`してくれる設定です。
`:notify`なので通知を送ってくれる設定です

`:notify`以外だと下記を設定できます

- `:log`: ログファイルに記録
- `:raise`: 例外を発生
- `:silence`: 通知を無視
- `:stderr`: 標準エラー出力にメッセージを出力

### Rails6: config.active_support.disallowed_deprecation = :log

`config.active_support.disallowed_deprecation = :log`とは、利用が許されない非推奨警告メッセージの設定です
`log`の場合は、ロガーに出力をしてくれます

`config.active_support.deprecation`と同様のオプションを設定することができます

#### 紛らわしいポイント

`disallowed_deprecation`と`deprecation`は違います。

- `deprecation`は非推奨
- `disallowed_deprecation`は特に許可されていない非推奨

### Rails6: config.active_support.disallowed_deprecation_warnings = []

`config.active_support.disallowed_deprecation_warnings = []`とは、どの「利用が許されない非推奨警告メッセージ」を設定するのか？を指定するコードです。

#### 紛らわしいポイント

- `config.active_support.disallowed_deprecation_warnings = []`はメッセージを設定せずに空配列を渡しているので、警告メッセージは設定されません。

設定をしたければちゃんと

```ruby
config.active_support.disallowed_deprecation_warnings = ['特定の非推奨メッセージ']
```

みたいにメッセージを渡してあげる必要があります

また全ての非推奨メッセージを確認したい場合は

```ruby
config.active_support.disallowed_deprecation_warnings = :all
```

と記述すると、メッセージを全て確認することができます

### Rails7: config.active_support.report_deprecations = false

`config.active_support.report_deprecations = false`を設定すると`deprecation warning`からのメッセージを停止することができます。
これは`deprecations`と`disallowed_deprecation`の両方を含めます

## 基本的な設定について

基本は下記の構成が推奨されています

- `production`: `config.active_support.report_deprecations = false`を有効にする
- `test/development`: `config.active_support.report_deprecations = false`は記述せず、`deprecation_warnings`については`:raise`でエラーを発生させて、非推奨のものに気付けるようにしておく

`test/development`では`config.active_support.disallowed_deprecation_warnings = :all`だけ設定して、全てに気づくようにするというパワープレイもなしではないと思います

## 感想

- この記述をすると設定が効くのか？falseにすると設定が消えるのか？など紛らわしい設定だなと思いました
- 今後のアップデートでもうまく生かせそう

## 参考

https://techracho.bpsinc.jp/hachi8833/2024_04_15/141031

https://railsguides.jp/upgrading_ruby_on_rails.html
### How to Install Python 2 on Ubuntu 20.04



If you need to **[install Python 2 on Ubuntu](https://docs.vultr.com/how-to-install-python-2-on-ubuntu-20-04)**, you might encounter some challenges since Python 2 has been removed from Ubuntu 20.04 by default. However, for legacy applications or projects that rely on Python 2, it's still possible to install and configure it alongside Python 3. In this guide, we'll walk you through the necessary steps to get Python 2 up and running on your system.

#### Step 1: Install Python 2 on Ubuntu 20.04

To begin, SSH into your Ubuntu 20.04 server and update the system:

```bash
$ sudo apt update
```

Now, install Python 2 using the following command:

```bash
$ sudo apt install python2
```

Once the installation is complete, you can verify the installed version by running:

```bash
$ python2 -V
Python 2.7.17
```

#### Step 2: Check Available Python Versions

After installing Python 2, you can check which Python versions are available on your system. Run this command to list all the Python binaries:

```bash
$ ls /usr/bin/python*
```

You should see output like this:

```bash
/usr/bin/python2  /usr/bin/python2.7  /usr/bin/python3  /usr/bin/python3.8
```

If you'd like to check what alternatives are configured for Python on your system, you can run:

```bash
$ sudo update-alternatives --list python
```

If there’s no output or you see an error, it means no alternatives have been set up yet.

#### Step 3: Set Alternate Python Versions

To easily switch between Python 2 and Python 3, you can configure them as alternatives using the `update-alternatives` command. This way, you can set which version of Python should be used by default on the system.

To configure Python 2, run:

```bash
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 1
```

Next, add Python 3 as an alternative:

```bash
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 2
```

Here, the number at the end (e.g., `1` for Python 2 and `2` for Python 3) represents the priority of the version. The higher the number, the higher the priority. You can confirm the alternatives are correctly configured by running:

```bash
$ sudo update-alternatives --config python
```

This command will allow you to select the default Python version interactively.

#### Step 4: Verify the Configuration

After configuring the alternatives, verify which Python version is currently active by running:

```bash
$ python -V
```

This will display the Python version currently set as the default. You can switch between Python 2 and Python 3 at any time using the `update-alternatives` command.

#### Conclusion

Even though Python 2 is no longer included in Ubuntu , you can still install and configure it manually. This is particularly useful for legacy projects that require Python 2. Using the `update-alternatives` command makes it easy to manage both Python versions and switch between them as needed.

With these steps, you’ll be able to install Python 2 on your Ubuntu system and work with both Python 2 and Python 3 in a flexible environment.
会議録音自動文字起こしとは？効率的に会議内容を記録する方法は？



## **記事大綱**

1. **はじめに**
   - 会議録音自動文字起こしの重要性
   - 簡単な概要

2. **自動文字起こしの仕組み**
   - 音声認識技術とは？
   - 機械学習とAIの役割

3. **会議録音自動文字起こしの利点**
   - 時間と労力の節約
   - 正確性と効率の向上

4. **主要なツールとサービス**
   - 市場に出回っている人気のあるサービス
   - 各サービスの特徴

5. **自動文字起こしの精度を向上させる方法**
   - 録音環境の改善
   - 発話の明瞭さの確保

6. **データプライバシーとセキュリティの懸念**
   - 機密情報の保護
   - セキュリティ対策

7. **結論**

8. **よくある質問（FAQ）**
   - 自動文字起こしはどれくらい正確ですか？
   - セキュリティはどのように保証されますか？
   - 無料のサービスはありますか？

---

## **会議録音自動文字起こしの世界へようこそ！**

会議に参加するたび、話される内容をすべて記録するのは骨が折れますよね？そこで、**会議録音自動文字起こし**の出番です。このツールは、会議録音をリアルタイムでテキストに変換することで、ビジネスコミュニケーションを変革します。

### **自動文字起こしの仕組み**

まず、簡単に言うと、自動文字起こしは音声をテキストに変換する技術です。その核心には、先進的な**音声認識技術**があります。これらは、音声を理解し、対応するテキストに変換するアルゴリズムを利用しています。さらに、これには**機械学習**と**人工知能（AI）**が絡んできます。これらの技術が、音声データのパターンを認識し、最も正確なテキスト変換を実現します。

### **会議録音自動文字起こしの利点**

自動文字起こしの最大の利点は、**時間と労力の節約**です。手動での文字起こしは、非常に時間がかかり、ミスを犯しやすい。しかし、自動文字起こしを使えば、議事録作成のプロセスが迅速で効率的になります。また、テキスト化されたデータは、検索が容易であり、後から見直す際の手間も省けます。

### **主要なツールとサービス**

市場には多くの**ツールとサービス**が存在します。例えば、[Soro.jp](https://soro.jp/)、Google Meetによる自動文字起こし、Zoomのビルトイン機能など。それぞれが異なる音声認識能力や追加機能を提供していますので、自分のニーズに合ったものを選ぶことが肝要です。

### **自動文字起こしの精度を向上させる方法**

録音を行う際の**環境を改善する**ことで、文字起こしの精度が向上します。背景雑音を減らし、参加者には可能な限り明瞭に話してもらうよう指示します。さらに、良質なマイクを使用することも不可欠です。

### **データプライバシーとセキュリティの懸念**

会議にはしばしば機密情報が含まれるため、データプライバシーとセキュリティは非常に重要です。各サービスは異なるセキュリティ対策を講じているため、利用前に必ず**プライバシーポリシーと利用規約**を確認しましょう。

### **結論**

**会議録音自動文字起こし**は、現代のビジネスにおいて欠かせないツールです。その利便性と効率性が認められ、今後さらに普及が進むことでしょう。適切なツールを選び、賢く活用することで、よりスムーズで生産的な会議が実現できます。

### **よくある質問（FAQ）**

- **自動文字起こしはどれくらい正確ですか？**  
  正確性は使用するツールや録音環境によりますが、最新の技術を使ったものは非常に高精度です。

- **セキュリティはどのように保証されますか？**  
  各サービスは異なるセキュリティ対策を導入しています。重要な機密情報を扱う場合は、エンドツーエンドの暗号化を提供するサービスを選びましょう。

- **無料のサービスはありますか？**  
  はい、多くのツールが無料プランを提供しています。まずは試してみて、自分に合ったものを選ぶと良いでしょう。

このように、会議録音自動文字起こしは便利なだけでなく、ビジネスを大きく前進させる力があります。ぜひ、この技術を取り入れてみてください！
学校で貰ったRaspberryPiを動かしてみる

# 初投稿
初めまして、ITの専門学校に通っているKと申します。
就活が嫌すぎて学校でタダで貰ったラズパイを動かしてみることに。



![スクリーンショット 2025-01-09 205312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959479/ec5fe09b-adc4-e1ff-f4c8-8ee6777e6bd6.png)



調べてみたら2017年制らしい。古い。


## 動かしてみる
貰ったのは本体だけなので、acアダプターなりsdカードは自腹で揃えました。とりあえずos入れてセットアップ完了。



買った３色LEDでも光らせてみる。

~~~ ledctl.py
import tkinter as tk 
from gpiozero import LED

red_led = LED(18)
yel_led = LED(15)
gre_led = LED(14)

def redon():
    yel_led.off()
    gre_led.off()
    red_led.on()
    print("赤色点灯！")

def yelon():
    red_led.off()
    gre_led.off()
    yel_led.on()
    print("黄色点灯！")

def greon():
    red_led.off()
    yel_led.off()
    gre_led.on()
    print("緑色点灯！")

root = tk.Tk()
root.title("TestLED")
root.geometry("300x300")

button1 = tk.Button(root, text="RED",height=2, width=5, command=redon)
button1.place(x=50,y=50)

button2 = tk.Button(root, text="YELLOW",height=2, width=5, command=yelon)
button2.place(x=120,y=50)

button3 = tk.Button(root, text="GREEN",height=2, width=5, command=greon)
button3.place(x=190,y=50)

root.mainloop()
~~~
![スクリーンショット 2025-01-09 211144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959479/316c78d6-6396-9677-8d19-1f507dd6a707.png)
![スクリーンショット 2025-01-09 211158.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959479/292e98c8-47a9-9584-be13-cdab16ccad25.png)
![スクリーンショット 2025-01-09 211214.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959479/6171bdf5-327a-4405-17fb-0c01968a9fe9.png)

光った。面白い。いい現実逃避になった。
さて、ES書こう。
Node v23.6.0 で TypeScript を直接実行（フラグなしのデフォルトでの処理）

昨月、以下のポストをしていた件が Node v23.6.0 で追加されたので試してみた、という話です。

https://x.com/youtoy/status/1873583742809469362

上記のポストをした時点では、以下のようにフラグなしでの実行は対応中でした。

●Node.js Now Supports TypeScript By Default | Total TypeScript
　https://www.totaltypescript.com/typescript-is-coming-to-node-23

![2025-01-09_21-06-58.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/675595ea-d104-50bb-726a-17a3f1c737d2.jpeg)

その際にフラグなしでの処理を試すとしたら、以下の Nightlyバージョンを使う必要がありました。

![2025-01-09_21-08-07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/4457a6ae-bcd0-7d1f-346b-dfe5b045015e.jpeg)

それが今だと、Node v23.6.0 で普通に利用できます。

## 今回の内容： Node v23.6.0 を利用してのお試し

それでは、以下の Node v23.6.0 を使って TypeScript の直接の実行を試します。

●Node.js — Node v23.6.0 (Current)
　https://nodejs.org/en/blog/release/v23.6.0

### お試し用のコードと処理のお試し
お試し用のコードとして、以下の型定義をいろいろ書いたものを準備してみました。

```typescript
let message: string = "Hello, TypeScript!";
console.log(message);

let numbers: number[] = [1, 2, 3, 4, 5];
console.log(numbers);

interface Person {
  name: string;
  age: number;
}

let person: Person = {
  name: "Alice",
  age: 30
};

console.log(person);

function greet(name: string): string {
  return `Hello, ${name}!`;
}

console.log(greet(person.name));
```

これを nodeコマンドで実行したところ、以下のようにフラグなしでの実行に成功しました。

![2025-01-09_21-03-19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/5709536b-32bb-ba73-b195-8a7d800223c0.jpeg)

### 別のお試し
Qiita の記事で、フラグありのもので試した事例があるか検索してみました。

すると、以下の @n0bisuke さんの記事が出てきました。

●Node.jsでTypeScriptの実行を試しつつHonoでLINE Botも作ってみるメモ - Qiita
　https://qiita.com/n0bisuke/items/c50688ca8dce524899d1

その記事で出てきていたコードも合わせて試してみます。

```typescript
interface User {
    name: string;
    age: number;
}

function greet(user: User): string {
    return `Hello, ${user.name}! You are ${user.age} years old.`;
}

const user: User = {
    name: "田中さん",
    age: 25
};

console.log(greet(user));
```

上記も問題なく出力を得られました。

![2025-01-09_21-13-51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/f80357d5-9f86-5a09-fbc6-15e0347841cf.jpeg)
Go言語(プログラミング)入門 -お節介おみくじ作成(変数,switch,if文)-

## おみくじ機能を作る
これまで学んできた内容を活かして、新年ということもありおみくじを作ってみます。

## 実現したいこと
まずは日本語でやりたいことを挙げていこうと思います。

### ①作りたい運勢一覧
「大吉」、「中吉」、「吉」、「小吉」、「どうしようもないもう一回引き直しな」の5つを引く可能性のある運勢とする。
容量10の運勢スライスを作って管理する。

### ②運勢一覧の作成
なるべく良い結果を引きたいのでバランスを操作しておく。具体的には、
実行するごとに1~10のランダムな自然数を発生させて、その自然数と運勢を紐づけることにする。
「大吉」：1~5が出たとき
「中吉」：6~7が出たとき
「吉」：8が出たとき
「小吉」：9が出たとき
「どうしようもないもう一回引き直しな」：10が出たとき
switch文で場合分けを作成する。

### ③お節介機能の追加
また、10を出してしまったときはもう一度おみくじを引くよう誘導したい。これはif文で書く。

## コードにする。

~~~
package main

import (
	"fmt"
	"time"

	"golang.org/x/exp/rand"
)

func main() {
	//1~10までのランダムな数の生成
	rand.Seed(uint64(time.Now().UnixNano()))

	//運勢一覧スライスの作成
	unsei := make([]string, 0, 10)
	unsei = append(unsei, "「大吉」", "「中吉」", "「吉」", "「小吉」", "「どうしようもないもう一回引き直しな」")

	//ランダムな数と運勢の紐づけ
	drawOmikuji := func() string {
		NaturalNumber := rand.Intn(10) + 1
		switch {
		case 1 <= NaturalNumber && 5 >= NaturalNumber:
			return (unsei[0])
		case NaturalNumber == 6 || NaturalNumber == 7:
			return (unsei[1])
		case NaturalNumber == 8:
			return (unsei[2])
		case NaturalNumber == 9:
			return (unsei[3])
		case NaturalNumber == 10:
			return (unsei[4])
		default:
			return "予期しない結果です"
		}
	}
	result := drawOmikuji()
	fmt.Println(result)

	if result == unsei[4] {
		fmt.Println("もう一回引かせてあげよう")
		result := drawOmikuji()
		fmt.Println(result)
	}

}
~~~

## 実行結果
何度か実行してみます。

狙い通り大吉や中吉が中心になっています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579705/e3787bfa-1a7e-fbb9-3e7b-ca67e48e5c9e.png)

まれに運勢が悪くても引き直してくれていることも確認できました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579705/72228e81-9b4c-858b-76cd-f4e417f38fe9.png)

## 感想
それぞれの要素を学んでいるときは少し退屈ですが、学習した内容をつなげて一つのものを作ってみると成果が出た気になれるので、モチベーションが回復しました。
コードの書き方などはまだまだ効率化できるんだろうとは思いますが、アイデアを形にできたという点で楽しかったです。
UE5でのエディタ画面酔い対策


## はじめに
UE5を初めて触ってみたのですが、エディタ画面のマウス操作だけで画面酔いしてしまったので、対処法をまとめます。

### エディタの環境設定
- 左上の「編集」から、エディタの環境設定を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967127/163ba836-17b5-1e3f-80a9-766ba2a34233.png)

- 「レベルエディタ」から「ビューポート」を選択します。
- 「マウススクロールのカメラ速度」「マウス感度」をそれぞれ好みの値に設定します。
（値を小さくすればするほど、カメラの動きが鈍くなります。）



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967127/78f6ae2e-a5f6-9db8-f299-70c7f1114ec1.png)

### カメラ速度設定
- エディタ画面右上にある、カメラアイコンの値を小さくすることでも、感度を下げることができます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967127/8c3ae85d-90a6-1326-9869-aabef28975c3.png)


## まとめ
UEエディタを利用する際の画面酔い対策についてまとめさせていただきました。
UEを触ってみて、画面酔いで挫折しそうな方に届けば幸いです。
VBAでクリックしなくてもクリックイベント発生に注意

## 謎の現象
VBAのプログラムを保守中に、謎の現象があった
リストやオプションボタンをクリックしていないのにクリックイベントが発生している。なぜ？
公式サイトで　調べたら言語仕様だった。
## 公式サイト
[Clickイベント](https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/click-event)
[Unity] レトロディザシェーダー

Shader Graphにはポスタライズとディザのノードも用意されているので、比較的簡単に実装可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/125b21a0-69c8-ed3a-b37e-bf5aa218252c.png)

<iframe width="560" height="315" src="https://www.youtube.com/embed/riyZE-lw7Po?si=T5N41ZgAuhvPLTT7" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

[こちら](https://assetstore.unity.com/packages/vfx/shaders/ezhalftone-full-screen-comic-shader-300621)でも販売中です。
Pygameを使って RPGを作る（17. 戦闘画面（その5））

# 概要
・敵生成を追加
・攻撃メッセージを追加
ダメージの計算式は
<playerの攻撃力>　/ 調整係数１　- 敵の防御力　/ 調整係数2 

```py
{int(self.status.infact_status['ATK'] / 4) - int(self.enemy.mob_info['DEF']/3)}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576081/0f2a6b49-744a-3e6c-a22d-3b7b216657f5.png)

# 敵生成
以前にkivyで作ったものを流用

```py
import random, os, re
from data_config import Config
from glob import glob

class EntryEnemy():
    def __init__(self) -> None:
        self.enemy_setting_path ='./enemy/info'

    def generate_random_enemy(self):
        
        file_paths = glob(os.path.join(os.getcwd(), self.enemy_setting_path, '*.json'))
        file_names = [os.path.basename(path) for path in file_paths]
        choice = random.choice(file_names)
        id = re.search(r'\d+', choice).group()
        # print(id)
        config = Config(id)
        return config.get_json_info()

if __name__ == '__main__':
    instance = EntryEnemy()
    print(instance.generate_random_enemy())
```

# Enemyクラス
生成したものは、Enemyクラスをそのまま引き渡す

```py
import pygame as pg

class Enemy(pg.sprite.Sprite):
    def __init__(self, pos, mob_info, mob_pos, *groups):
        super().__init__(*groups)

        self.base_path = './enemy/img/'
        self.mob_img_path = self.base_path + mob_info['IMG']

        self.mob_info = mob_info
        # 論理配置
        self.mob_pos = mob_pos
        # name
        self.name = self.mob_info['name']
        self.original = pg.image.load(self.mob_img_path).convert_alpha()
        self.battle_surface = pg.transform.scale(self.original, (128, 128))
        self.surface = pg.transform.scale(self.original, (64, 64))
        # 画面での位置
        self.pos = pos
        # rect
        self.rect = self.surface.get_frect(topleft=pos)
        self.enemy_sprites_type = True
```
思考力を発揮し続ける方法

## 本の情報
**タイトル**
アウトプットの精度を爆発的に高める「思考の整理」全技術

**著者**
生方正也

**内容**
「思考力の強化」を課題として挙げる人・企業は多い。
だが、実際に問題なのは思考力が低いことではなく、思考力をコンスタントに発揮できないこと。
　→追い詰められた場面では高い思考力を発揮できた というケースは覚えがあるはず。

思考力をコンスタントに発揮するには以下の2点が必要。
* どのような頭の使い方があって、どこで使うと良いのかを整理する(思考の選択肢)
* うまく頭を使えないときの対処法を理解する(思考の修正法)

複数のシチュエーションに沿って、どのように頭を使うと良いのかが紹介されている。

## 印象に残った点
### 目的からずれないようにする
結果を出すためには、達成すべき目的を明確にしておく必要がある。
だが、目的を見失う / アウトプットに適さない目的を設定している ために、目的を設定したにもかかわらずうまく行かないケースが発生する。
そういったことを回避するために、以下の観点で目的を設定すると良い。
* 未来志向で考える
→目的のために活動することは、目的ではない。活動が終わった後に何ができるようになっているか が目的となる。
* 何の目的かをはっきりさせる
→目的を明確にしたい行動をはっきりさせておかないと、目的を明確にはできない。

### 全体像を押さえる
全体像を捉えられないと、細かい要素を列挙して収拾がつかなくなる / 完成形がイメージできない状態で作業を進める といった状態に陥ってしまう。
全体像を押さえるためのコツとしては、大きなくくりで捉える / 俯瞰する / 絵にする / 繰り返す / フレームワークを利用する といった手法がある。

## 所感
### 目的からずれないようにする
目的を自身で設定できない弱点があると感じていた。
→何ができれば目的を達成したと言えるのか または 目的を達成するために何をする必要があるのか を適切に設定できない。
その点で、未来志向の考え方は、目的を明確に言葉にするのに役立つ考え方であると感じた。

### 全体像を押さえる
全体像を押さえようとしたことはあるが、まさに細かい状況を列挙して結局全体像を網羅できたか分からない という状況になりがちだった。
正解がないために枠組みを考えるのは難しい という記載もあったが、自分なりの全体像の捉え方を身につけられるようにしたい。

## まとめ
思考力を発揮するための考え方・コツについて述べられていた本でした。
項目ごとに示されていたケースが自分の状況に合致するものも多く、納得しながら読み進めることができました。
思考力そのものを磨くとともに、適切に発揮する方法についても意識視するようにしたいと思います。
AWS SCS合格体験記

題のとおり、AWS SCS(AWS Certified Security - Specialty)に合格しました。
本記事では、合格のためにした勉強やどのようなことを問われるかに関して共有したいと思います。

# 1.SCS概要

基本は下記に記載されています。

https://d1.awsstatic.com/ja_JP/training-and-certification/docs-security-spec/AWS-Certified-Security-Specialty_Exam-Guide.pdf

個人的には、以下が特に聞かれた印象です。

・Organizationを用いたマルチアカウント運用(特にセキュリティ面)

・AWS操作におけるのポリシーへの理解(例：SCP/IAMポリシー/リソースベースポリシーという3要素を考慮した特定操作の許可or拒否)

・KMS全般(デフォルトキーが正解になることはあまりない印象)

・AWS間のプライベート通信(エンドポイント構成するように実装内容を2-3個ほど答えさせるのが多い。リソースにアタッチされているRoleの許可内容は充分か、作成するエンドポイントのタイプ(インターフェイスorゲートウェイ)は適しているか等)

Specialtyなので合格点は750/1000です。

# 2.勉強方法
AWS Skill BuilderやCloudTechなどのサイトを使用して勉強しました。


事前にCLF/SAA/DEA/DVA/SOA/SAPまでは取得していたので、「この機能/実装方法は全く知らないな」というものはほぼなかったと思います。
DEAは上記の他資格を取得しているうえで受けましたが、分野が少し他とは違うので、初見となる情報は多くありました。ただSCSはセキュリティが範囲で、セキュリティという観点では他試験でも部分的に出題されていることがあるものなので、SAP＋Associate複数辺りを事前に所持しておくと、かなり幅広く事前知識がある状態で臨めると思います。

# 3.勉強して得た知識(一部)
上述のOrganizationを用いたマルチアカウント運用は、セキュリティ(Security Hub・CloudTrail・GuardDuty・Inspector・Detective・Config)/アラート(SNS)/ログ管理(VPC Flow Log・S3アクセスログ)などの多様な方面で業務でも活かせる機会がありそうだなと思いました。
ポリシーに関しても、例えばAWSでの操作が想定の挙動にならなかった際に「確認すべき3つのポリシー」を認識したことで、切り分けなどが進めやすくなったと思います。

# 4.最後に
SAP単体だけでもそこそこ、加えてAssociate複数まで取得していればかなり事前知識がある状態で臨めると思います。

特に、マルチアカウントの設計や運用を目指している人は取得しておくと理解が進むと思います。
AWS DEA合格体験記

題のとおり、AWS DEA(AWS Certified Data Engineer - Associate)に合格しました。
本記事では、合格のためにした勉強やどのようなことを問われるかに関して共有したいと思います。

# 1.DEA概要

基本は下記に記載されています。

https://d1.awsstatic.com/ja_JP/training-and-certification/docs-data-engineer-associate/AWS-Certified-Data-Engineer-Associate_Exam-Guide.pdf

データの取り込みや変換やパースなどのETL系、データストアの管理、データ連携の実装などが出題されました。
AWSサービスでいうと、AWS Glueが一番出題されたように思います。

Associateなので合格点は720/1000です。

# 2.勉強方法
AWS Skill BuilderやCloudTechなどのサイトを使用して勉強しました。

AWS試験にはそれぞれにバージョンがあり(例：SAA-C03なら03が該当)、現状DEAは01のバージョンです。出題される問題数が65問であることには変わりませんが、おそらくそのバリエーションは他AWS資格と比較すると広くないので、取得する場合、早めにとることをお勧めします。

# 3.勉強して得た知識(一部)
・データのパース、加工、S3やDBへ格納など一連の操作を行いたい時にLambdaで実装も出来なくはないが、AWSサービスを複数種類使用する場合はStepFunctionsを使ってオーケストレーションしたほうが良い

・S3の情報に特定のユーザーにはアクセスさせないようにするには、Lake Formationで行レベルのセキュリティを使用する

・Glueで増分データだけを取り扱うにはジョブのブックマーク機能を使用

# 4.最後に
受験時点で、CLF/SAA/DVA/SOA/SAPまでは保持していました。が、新しくできた毛色の違う試験なので、怯えながら受けたのですが、無事合格することは出来ました。特に同じような境遇の方は、CloudTechなどで学習すれば(上述のとおり現状は問題数が多くないので)ほとんど「これ同じ(or 似た)問題だな」と感じられると思います。

今回試験で扱った内容について、もともと実施した経験があるものはAthenaぐらい(記録から90日超えてS3に退避されたCloudTrailログにAthenaでクエリ検索)だったのですが、この試験で得た知識を基に、情報の取得・加工・連携などのノウハウを活かしていきたいと思います。
CloudShellからAWS BLEAを|彡サッとあてる

# 内容
検証環境などにAWS BLEAのStandalone版を直ぐに適用したい場合の手順のメモ書き。

# AWS BLEA

https://github.com/aws-samples/baseline-environment-on-aws


# 作成される環境

![blea.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/27f963d4-e0aa-199f-73c4-f15aa5c42e90.png)


# 手順

* CloudShellを起動する。
* リポジトリを取得する。

```shell
git clone https://github.com/aws-samples/baseline-environment-on-aws.git
cd baseline-environment-on-aws
```

* プロジェクトを初期化する。
```shell
npm ci
```

* Slackにworkspaceとchannelを作る。
* Slackクライアントを設定する。(下記参照)

https://docs.aws.amazon.com/ja_jp/chatbot/latest/adminguide/slack-setup.html
>AWS Chatbot を Slack ワークスペースに追加します。
>
>Slack の左側のナビゲーション ペインで、[自動化]を選択します。
>
>注記
>左側のナビゲーション ペインに[自動化] が表示されない場合は、 [詳細]を選択し、[自動化]を選択します。>
>AWS Chatbot がリストにない場合は、「アプリディレクトリの参照」ボタンを選択します。
>AWS Chatbot アプリのディレクトリを参照し、[追加] を選択してAWS Chatbot をワークスペースに追加します。
>AWS Chatbot コンソールをhttps://console.aws.amazon.com/chatbot/で開きます。
>[チャット クライアントの構成]で[Slack]を選択し、[構成]を選択します。
>右上のドロップダウンリストから、AWS Chatbot で使用する Slack ワークスペースを選択します。
>AWS Chatbot に設定できるワークスペースの数に制限はありませんが、一度に設定できるのは 1 つだけです。
>[許可]を選択します。

* プライベートチャネルの場合は下記を実施する。

>Note
>Slack のプライベートチャネルを利用する場合は、そのチャネルで /invite @AWS コマンドを実行しておく必要があります。

* parameter.tsを修正する。

```shell
cd usecases/blea-gov-base-standalone/
vim parameter.ts 

// Example
export const devParameter: AppParameter = {
  envName: 'Development',
  securityNotifyEmail: 'zzzz@zzz.zzz.zzz',
  securitySlackWorkspaceId: 'XXXXXXXXX',
  securitySlackChannelId: 'YYYYYYYYY',
};
```

* デプロイする。

```shell
npx aws-cdk bootstrap 
npx aws-cdk deploy --all
```
WindowsとUbuntuでssh接続&x11接続

# 今回やったこと
- 手元のWindows11 laptopから同じネットワーク上のJetson(Ubuntu20.04)に対して, ssh接続を行った. 
- 手元のコマンドラインからJetson上でソフトを動かして, X11でそれを手元のLaptopで表示した

## 準備
- jetsonとlaptopが同じネットワーク上にいることを確認
- 携帯のネットワークスキャンアプリなどでネットワーク上のデバイスのIPアドレスを確認
:::note info
今回は手元のWindows laptopとjetsonのIPアドレスがわかればよい
:::

- windowsのlaptopにVcXsrvをインストール
:::note info
x11接続にはサーバー側とクライアント側が必要です. 今回はwindows側で入力をして, それをjetson側で処理して, windows側でGUIとして表示するので, windows側にx11サーバー用のアプリVcXsrvをインストールする. 
:::

# 手順
1- VcXsrvでx11サーバーを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981775/64b2c7b2-bf8f-40dd-1a79-3dfc0d0f8a15.png)
- start no client
- Disable access controlを含めてすべてにチェック

2- ssh接続でwindows側からjetson ubuntu側のコマンドラインを操作できるようにする.
例: ssh -X hoge@192.168.0.104 
-Xというオプションはx11を許可するために必要です. Windowsのコマンドラインに打ってください. 

3- sshのconfigに次の記述があるか確認
```rb
sudo vim /etc/ssh/sshd_config
```
(これはjetsonのコマンドラインで開いてください)
```rb
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes 
```
4- DISPLAY変数をjetson上で設定
LaptopのIPアドレス:0.0
の形式で登録
```rb
export DISPLAY=192.168.0.103:0.0
```
5- xeyesまたは, xclockをjetson上で実行
GUIが表示されたら成功です.
emacs: standard input is not a tty

## Silverblue で Fedora 40 から Fedora 41 に rebase したところ、ssh で emacs のウィンドウが上がらなくなった
リモート側のサーバーを Fedora 40 から Fedora 41 に rebase した。
ローカル側から ssh で emacs を起動するのだが、リモートが Fedora 41 だと起動しなくなった。
```
$ ssh -Y -f <remote F40> emacs
```
これは問題なく、emacsのウィンドウが上がってくる。

```
$ ssh -Y -f <remote F41> emacs
 emacs: standard input is not a tty
```
はて？？？

```
$ ssh -vvv -Y -f <remote F41> emacs
```
としてログを確認したところ、
```
debug1: Remote: No xauth program; cannot forward X11.
```
とあるのを発見。

```
[Fedora 40] # rpm -qf /usr/bin/xauth 
xorg-x11-xauth-1.1.2-6.fc40.x86_64
```

```
[Fedora 41]# ls -l /usr/bin/xauth 
ls: cannot access '/usr/bin/xauth': No such file or directory
[Fedora 41]# rpm -qa | grep xauth
[Fedora 41]# 
```
なるほど、確かに入ってない。
```
[Fedora 41]# rpm-ostree install xorg-x11-xauth
```
インストールしたところ、無事に解決。
LeRobotでAI for RoboticsのBeginnerになる

LeRobotを使ってRobot Learningに入門する

https://huggingface.co/lerobot

https://github.com/huggingface/lerobot

1. [第1回　Quick Start](https://qiita.com/kosei1515/items/ea808d3124a7cc13366d)
1. [第2回　LeRobot Dataset](https://qiita.com/kosei1515/items/34ca9efb4780e3963eb9)
1. [第3回　]()
1. [第4回　]()
1. [第5回　]()
...