OmniAICreator/Qiita-1.07M huggingface dataset:
FPGA入力信号のエッジ検出

# 概要
FPGA入力信号の立ち上がり/立下りエッジを検出して１クロックサイクルのHighパルスを生成する回路のVHDLでの実装例です。
メタステーブルと微分回路について詳しく説明されているページが多数ありますので、そこの部分の説明は割愛させていただきます。

# 前提
* 入力信号にチャタリングは無いものとします。(基板内のICからFPGAへ渡す信号)
* 入力信号の幅はFPGAクロック周期より長いものとします
* 入力信号はFPGAクロックと非同期で変化するものとします

# 目標回路構成
非同期入力によりメタステーブル対策として、初段のbuf_ff(0)出力はそのまま次段buf_ff(1)に接続します。
2~3段目のFFを利用して微分回路を構成し、立ち上がり/立下りエッジを検出します。
エッジ検出信号（o_RISE_pとo_FALL_p）は組み合わせ回路出力のままモジュール外に出していますが、設計ルールとして **FF出しを要求されるシーンでは、適宜FFを追加してください**。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/b5d0f164-96c7-19fa-6eee-9fb208e34f48.png)



# VHDLコード
RTL図をVHDLで書いた例です。
エッジ検出部分はANDとnotで書いても構いませんが、個人的には三項演算子で書いた方が'1'に有意があることを強調している気がしますので、三項演算子で書いています。

```vhdl:SYNCHRO_DFF.vhd
--同期化D-FlipFlopとエッジ検出(チャタリング無し入力)
library ieee;
use ieee.std_logic_1164.all;

entity SYNCHRO_DFF is
    Port(
    i_CLK     :in  std_logic;
    i_RST_p   :in  std_logic;
    i_PORT    :in  std_logic;
    o_SYNCHRO :out std_logic;
    o_RISE_p  :out std_logic;
    o_FALL_p  :out std_logic
    );
end entity;

architecture RTL of SYNCHRO_DFF is
    signal buf_ff :std_logic_vector(0 to 2);
    signal rise   :std_logic;
    signal fall   :std_logic;
begin
    --入力同期化バッファFF
    process(i_CLK)begin
        if(rising_edge(i_CLK))then
            buf_ff(0) <= i_PORT;
            buf_ff(1) <= buf_ff(0);
            buf_ff(2) <= buf_ff(1);
        end if;
    end process;
    --エッジ検出パルス：１サイクルHigh出力
    rise   <= '1' when ((buf_ff(1)='1')and(buf_ff(2)='0')) else '0';
    fall   <= '1' when ((buf_ff(1)='0')and(buf_ff(2)='1')) else '0';
    --出力
    o_SYNCHRO <=buf_ff(1);
    o_RISE_p  <=rise;
    o_FALL_p  <=fall;
end architecture;

```


# 動作
入力信号の立ち上がり・下がりで１クロックサイクルのパルスが出力されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/70f3fc42-e659-ad67-839d-2083c1977776.png)

# テストベンチ
Verilogですがテストベンチのコードです。

```verilog:SYNCHRO_DFF_tb.v
`timescale 1ns / 1ps
module SYNCHRO_DFF_tb();

reg i_CLK  =0;
reg i_RST_p=1;
reg i_PORT =0;
wire o_SYNCHRO;
wire o_RISE_p;
wire o_FALL_p;

SYNCHRO_DFF SYNCHRO_DFF(
.i_CLK    (i_CLK    ),
.i_RST_p  (i_RST_p  ),
.i_PORT   (i_PORT   ),
.o_SYNCHRO(o_SYNCHRO),
.o_RISE_p (o_RISE_p ),
.o_FALL_p (o_FALL_p )
);
//クロック50MHz
initial begin
  i_CLK = 0;
  forever #10 i_CLK = ~i_CLK;
end
//リセット
initial begin
  i_RST_p=1;
  #1360;
  i_RST_p=0;
end

initial begin
    #1023;
    i_PORT=~i_PORT;
    #503;
    i_PORT=~i_PORT;
    #600;
    i_PORT=~i_PORT;
end

endmodule
```
AIちゃんとしろ！と思ったC#の書き方

　C#のプライマリコンストラクタってまあまあ便利ですよね。CopilotとYou.comに「C#ではクラスにプライマリコンストラクタは使えますか。」と「C#では構造体にプライマリコンストラクタは使えますか。」 という質問をしました。当然、今のC#では使えます。

# 構造体
### You.com
　You「C# 12では、プライマリコンストラクタが導入され、構造体でも使用できるようになりました。」　=　**ある**
 
　私「あってるよ〜」
### Copilot
　Copilot「はい、C#では構造体にプライマリコンストラクタ（Primary Constructor）を使用することができます。C# 10.0以降では、構造体にもプライマリコンストラクタを定義することができるようになりました。」
 
　私「いいね〜」
　私「ん？**C#10以降**……？クラスと構造体のプライマリコンストラクタは**C#12以降**なのに？」
# クラス
### You.com & Copilot
　「**そんなものありません。**」
 
　私「へ？使えるのに？（C#12で構造体とともにクラスも使えるようになった。）」
#
　You.comで判明したのですが、C#13はもうリリースされているにも関わらず「予定」としていました。なので、最新の情報は引っ張ってこないことがあるようです。
# 終わりに
　今後、「AIちゃんとしろ！」と思ったのがあれば更新していくつもりです。
またLaravelをインストール

前回、LaravelをMacにインストールした記事を書いたのが3年前。今回はWindowsに入れようとしています。
一応、本を見ながらやっているのだが、Dockerって何？ Sailって何？となり、知らないうちに Laravel Herdというものを使ってインストールしていた。
そして、さっそくハマる。
php -Sではサーバが起動するのに、php artisan serveではなぜか、
Failed to listen on 127.0.0.1:8000 (reason: ?)
が出る。
ChatGPTに聞くも、トンチンカンな解答ばかりで全く解決せず。
中にはphpやlaravelの再インストールを促す案もあり、さすがにそれは却下。
結局、Web検索したら、Stack Overflowであっさり解決策が見つかる。
https://stackoverflow.com/questions/78583889/php-artisan-serve-failed-to-listen-on-127-0-0-18000-reason
どうやら、スーパーグローバルがらみの設定らしい。この人なんで分かるの？天才ですか？

これで、最初の難関を突破したと思いたい...
Power Apps のキャンバスアプリで時計を作ってみる

# Power Apps のキャンバスアプリで時計を作ってみる

## 手順

「タイマー」コンポーネントを挿入し、以下のプロパティを設定します：
- 期間: 1000（ミリ秒）
- 繰り返し: オン
- 自動開始: オン

![スクリーンショット 2025-01-07 005220.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629955/df247473-39ef-fa98-fb2f-dafa396c64b9.png)

「タイマーコンポーネント」のOnTimerEnd プロパティに以下のコードを記述。これにより、タイマーが1秒ごとに終了するたびに `Set(theTime, Now())` が実行され、現在時刻が更新されます
```
Set(theTime, Now())
```
![スクリーンショット 2025-01-07 005231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629955/13fe461e-5d0f-fd03-d7a9-17b12ef58664.png)

「ラベル」コンポーネントを挿入し、Textプロパティに以下のコードを記述。
```
Text(theTime, "yyyy/mm/dd hh:mm:ss")

// 24時間制にするならこちら
Text(theTime, "yyyy/mm/dd HH:mm:ss")
```

![スクリーンショット 2025-01-07 005242.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629955/2bdea975-8a6a-b202-1923-413cdecb51db.png)

「タイマー」コンポーネントの表示をオフにする。

![スクリーンショット 2025-01-07 005643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629955/2d6ff634-9490-d4c6-663e-26d7f1659386.png)

アプリをプレビューすると、「ラベル」コンポーネントが時計になっているのを確認できる。

![スクリーンショット 2025-01-07 005359.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629955/5c7e8319-466e-d046-afec-6fb1218aa98d.png)



## Power Apps の `Set` 関数と `Text` 関数の文法

### 1\. Set 関数

Set 関数はグローバル変数を作成または更新するために使用。このグローバル変数はアプリ全体で使用可能。

```
// 文法
Set(VariableName, Value)
```
- VariableName: 作成または更新する変数の名前
- Value: 変数に割り当てる値


```
// 変数 CurrentUserName に文字列 Taro を割り当て  
Set(CurrentUserName, "Taro")

// 変数 IsAdmin にブール値 true を割り当て  
Set(IsAdmin, true)

// 変数 CurrentDate に現在の日付（例: 2025-01-07）を保存  
Set(CurrentDate, Today())
```

### 2\. Text 関数

Text 関数は日付や数値などのデータを特定のフォーマットで文字列に変換。

```
// 文法：
Text(Value, Format [, LanguageTag])
```
- Value: 変換対象の値。通常は日付型や数値型
- Format: フォーマットを指定する文字列（"yyyy/mm/dd" など）
- LanguageTag (オプション): 言語やロケールを指定するタグ（例: "en-US"、"ja-JP"）

```
// 数値のフォーマット  
Text(12345, "$#,###.00") // 結果: "$12,345.00"

// 日付のフォーマット  
Text(Today(), "yyyy/mm/dd") // 結果: "2025/01/07"

// 言語を指定してフォーマット  
Text(Now(), "dddd, mmmm d, yyyy", "en-US") // 結果: "Tuesday, January 7, 2025"  
Text(Now(), "dddd, mmmm d, yyyy", "ja-JP") // 結果: "火曜日, 1月 7, 2025"
```

#### 主な書式指定（Format の例）

| 書式  | 説明  | 結果（例） |
| --- | --- | --- |
| `yyyy` | 西暦の年 | `2025` |
| `yy` | 西暦の年（2桁） | `25` |
| `mm` | 2桁の月 | `01` |
| `m` | 1桁の月（先頭ゼロなし） | `1` |
| `dd` | 2桁の日 | `07` |
| `d` | 1桁の日（先頭ゼロなし） | `7` |
| `hh` | 2桁の時（12時間制） | `05` |
| `h` | 1桁の時（12時間制、先頭ゼロなし） | `5` |
| `HH` | 2桁の時（24時間制） | `17` |
| `H` | 1桁の時（24時間制、先頭ゼロなし） | `17` |
| `mm` | 分   | `30` |
| `ss` | 秒   | `45` |
| `ddd` | 曜日（短い形式） | `Tue` |
| `dddd` | 曜日（長い形式） | `Tuesday` |
| `mmm` | 月（短い形式） | `Jan` |
| `mmmm` | 月（長い形式） | `January` |
| `AM/PM` | 午前/午後（12時間制） | `PM` |
| `am/pm` | 午前/午後（小文字） | `pm` |

```
// 日付を "2025/01/07" の形式で表示
Text(Today(), "yyyy/mm/dd")

// 日付と時刻を表示（24時間制）
Text(Now(), "yyyy/mm/dd HH:mm:ss")

// 日付と曜日を日本語風に表示
Text(Today(), "yyyy年mm月dd日 dddd", "ja-JP")
```


## 公式ドキュメント
Set関数：
https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-set

Text関数：
https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-text
Javaにおける依存関係とは？【初心者向け解説】

📚 目次
- [Javaにおける依存関係とは？](#javaにおける依存関係とは)
- [1. 依存関係って何？](#1-依存関係って何)
- [2. なぜ依存関係が重要なのか？](#2-なぜ依存関係が重要なのか)
- [3. 依存関係を管理する3つの方法](#3-依存関係を管理する3つの方法)
- [まとめ](#まとめ)
- [勉強したことをどう活かすか？（追記）](#勉強したことをどう活かすか追記)

# Javaにおける依存関係とは？
Javaを使い始めてから5年。「依存関係」「依存性の注入」という言葉をよく耳にしていたんですけど無意識に受け流していました…。:joy:
最近、職場（プロジェクト）が変わりアプリ基盤チームに移ったことで改めて勉強しようと思うきっかけがあったので簡単な内容をまとめました。

理解が不安な人や、最近Javaを勉強し始めた人の役に少しでも立てたら嬉しいです！


## 1. 依存関係って何？
**依存関係（Dependency）** とは、あるクラスやモジュールが、他のクラスやモジュールを利用する関係のことです。
簡単に言うと、「AクラスがBクラスに頼って動いている状態」です。

たとえば次の例では、`UserService` クラスが `UserRepository` クラスに依存しています：

```java:java
public class UserService {
    private UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User findUserById(String userId) {
        return userRepository.findById(userId);
    }
}
```

このコードでは、`UserService` クラスが `UserRepository` クラスに依存しています。
もし UserRepository がなければ、`UserService` は動きませんよね。これが依存関係です。
（ `UserService` がなくても `UserRepository` は動きます）

## 2. なぜ依存関係が重要なのか？

:::note
依存関係を理解する上で`「なぜ使うのか？」`はとても大事な考え方です！
メリットを理解しましょう。
:::

依存関係を理解することで、以下のような課題を解決できます。

### 2.1 再利用性の向上
適切に依存関係を管理すると、コードの再利用性が高まります。
例えば、``UserRepository`` を他のクラスでも簡単に使えるようになります。

### 2.2 テストが簡単に
依存関係を明示すると、ユニットテストでモック（偽のオブジェクト）を使いやすくなります。

:::note
モックの使い方については、仕事で出会ったら調べてみてください。
:::

```java:java
// テスト用コード
@Test
void testFindUserById() {
    // テスト用のMockを生成
    UserRepository mockRepository = mock(UserRepository.class);
    when(mockRepository.findById("123")).thenReturn(new User("123", "John Doe"));

    UserService userService = new UserService(mockRepository);
    User user = userService.findUserById("123");

    assertEquals("John Doe", user.getName());
}
```

## 3. 依存関係を管理する3つの方法
### 3.1 クラス内で直接作る方法（普通にimportして使う参考書とかに書いてあるプログラム）
クラスの中で依存するオブジェクトを自分で作る方法です。

```java:java
public class UserService {
    private UserRepository userRepository = new UserRepository();
}
```
**メリット**
* 簡単に書ける
* 小さいプログラムなら問題なし

**デメリット**
* テストが難しい（`UserRepository` を差し替えられない）
* 他の実装に変更しづらい

### 3.2 コンストラクタ注入
依存するオブジェクトをコンストラクタで渡してもらう方法です。

```java:java
public class UserService {
    private UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}
```

**メリット**
* テストがしやすい（簡単にモックオブジェクトを渡せる）
* 他の実装に変更しやすい

**デメリット**
* コンストラクタで渡す必要があるので、少し手間

### 3.3 フレームワークを使う方法　※DI（依存性注入）
Springなどのフレームワークを使えば、依存関係を自動で注入してくれます。

```java:java
@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}
```

**メリット**
* 依存関係の設定が簡単になる
* 大きなプロジェクトでも効率的

**デメリット**
* フレームワークの学習が必要
* 小さいプログラムにはオーバーエンジニアリングになる場合も

## まとめ
* **依存関係** とは、クラスやモジュール間の「頼り合い」のこと
* 適切に依存関係を管理することで、コードの再利用性やテスト容易性が向上
* 手動管理からフレームワーク活用まで、目的に応じて使い分けるのがポイント

次回は「依存性の注入」について書きます。:rocket:

## 勉強したことをどう活かすか？（追記）
* 依存関係に違反しないように気をつける
* ソースコードを見るときは依存関係を意識する
* 依存関係を活かしたテストをする（簡単にする）
* DI(依存性の注入)、`@Autowired`、コンストラクタ注入を使う
【最新2025年版】VMWare Fusion上のUbuntu24と、ホストマシンMac M1間で、ファイル共有をする方法。

VMWare Fusion(13.6)上のUbuntu21と、ホストマシンMac M1間で、ファイル共有をする方法。
いつも死にそうになるけど、久しぶりに設定したら、超簡単にできたので備忘録。
超複雑だったVMWare Toolsのインストール手順は劇的に簡単になった（と思う）。

1  
VMWare FusionにVWWare Toolsをインストール。
https://qiita.com/gentoolike/items/7390f85a4624cd38a3d7

まあ、コマンド一発で、インストールできます。(感動！！！)
```
sudo apt-get update
sudo apt-get install open-vm-tools
```

2
VMWare FusionのGUIで、共有フォルダを設定する。
🔳　共有設定を選ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/681e1dc6-aca1-64a7-34f1-c3c8d6f4b991.png)

🔳 こんな感じで、有効フォルダを作成し、有効にする。(realshareと言うフォルダを設定）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/86c02451-f255-abc4-494d-8934399acee0.png)

尚、Mac側の設定はこちらのサイトに詳細されております。
https://www.maclab.tokyo/document/vmware-fusion-13-5-share/12451/

３
最後は、Sharefolderがマウントされている事を確認しておしまい。
```
$ ls /mnt/hgfs      # リンクが切れていると、共有フォルダが表示されない事がある。
$ realshare         # リンクが切れていなければ、Sharedフォルダが表示される。
$ vmware-hgfsclient  #このコマンドで確認しても良い。
realshare
```
Mac側のrealshareフォルダと/mnt/hgfs/realshareフォルダが、ファイルとフォルダを共有できている。

詳細は、ここを参照。
https://docs.vmware.com/jp/VMware-Fusion/11/com.vmware.fusion.using.doc/GUID-5FAA1AF9-C886-40E9-87CD-770235EFB754.html

https://qiita.com/redh00k/items/1841eefb916e5f1063d9
Compute EngineのDiskを再起動なしで拡張する

# 概要
- Compute EngineのDiskを拡張したい
- 再起動したくなかったので、できないかなと手順探してできたのでメモする


# 環境

- Debian GNU/Linux 11 (bullseye)

# 手順

## Google Cloudのコンソール上でDiskサイズを変更する

この手順通りに進めた

https://cloud.google.com/compute/docs/disks/resize-persistent-disk?hl=ja#increase_the_size_of_a_disk

## 必要なライブラリをインストール

```bash
$ sudo apt install cloud-guest-utils fdisk
```

## Diskが拡張されているか確認する

今回50GBから100GBへ拡張を試した。sdaでは拡張されているのでよし。次の手順からsda1のパーティションを拡張する

```bash
$ lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda       8:0    0  100G  0 disk 
├─sda1    8:1    0 49.9G  0 part /
├─sda14   8:14   0    3M  0 part 
└─sda15   8:15   0  124M  0 part /boot/efi
```

## パーティションの拡張

`growpart`コマンドで拡張するが、PATHに手を入れないと`sfdisk not found`みたいなエラーに苦しめられる（られた）

```bash
$ PATH=$PATH:/sbin sudo -E growpart /dev/sda 1
```


## ファイルシステムの拡張

```bash
$ sudo resize2fs /dev/sda1
```

これでよし。`df-lh`で認識されていればおｋ


```bash
$ df -lh
Filesystem      Size  Used Avail Use% Mounted on
# ...
/dev/sda1        99G   11G   84G  12% /
# ...
```

おｋ

# 参考記事

https://cloud.google.com/compute/docs/disks/resize-persistent-disk?hl=ja

https://godanism.hatenablog.com/entry/20180912/1536719300
REACT DEVELOPER CERTIFIED LEVEL 1 取得しました

# REACT DEVELOPER CERTIFIED LEVEL 1 合格体験記

2024/8 取得

REACT DEVELOPER CERTIFIED LEVEL 1を取得しました。
公式サイト→https://www.react-certification.com/

Reactもしくはjavascript関連の資格を探している人におすすめです。
React関連の資格をおすすめ、ランキング付けなどをしているサイトで、紹介されている資格の1つになります。
これらサイトでは、具体的な情報がないため、当記事の情報が役に立てば幸いです。
受験および、教材が英語のみになります。

## 資格概要
この資格はAlain ChautardというGoogle Expert Developerに選ばれた人が作成している資格です。ちなみにAngular Trainingサイトで、Angularのコース、資格を提供している人です。(Angularがメインの人？かもしれません)

レベル1,2,3と3段階あります。
1は選択式の問題のみで、2以降は実際のコーディング+コーディング内容に関する面接があります。(もちろん英語のみです。)


## 試験内容
Reactに関する知識が問われます。
###### 以下、試験ガイドに記載されている内容を含みます。
基礎的な内容が多く、また少し情報が古い？ものが出題されます。
Next.jsや他Reactや他javascript関連のフレームワーク、ライブラリについては基本的に出題されません。
ちなみになぜかReduxはグローバル状態管理枠で1問ぐらいです。ただそもそもReduxは何かぐらい知っていれば十分です。具体的なコードでの使用方法は出題されません。
Functional ComponentとClass Componentはどう違うかや、各コンポーネントでしか使用できない要素は何か、コンポーネントのライフサイクルが出題されます。

## 勉強教材
特に情報が少ない試験だったため、公式の教材を購入しました。試験のみと試験+教材の2つがあるため、購入時はご注意ください。
教材ですが、基本的に、公式のReactのサイトを参照しているものが多く、教材の価値は、付属してくる模擬問題だと言っても過言ではありません。
もし可能であれば、模擬問題を解くことをおすすめします。

## 試験時
PeasonVueなどのテストセンターで受験することはできず、オンラインでの受験になります。特に試験官がいるなどはなく、公式のサイトから受験可能です。
合否は数時間、遅くても1週間以内にメールにて通知が来ます。証明書URL等もメールで来るので、メールアドレスの登録を間違えないようにしてください。

## 実務に役に立つかどうか
レベル1の試験に関しては、選択式の問題のため、あまり実務に役に立たないかと思います。問題内容も少し古い範囲も含まれ、概念的なものが多く、コードベースではない問題が多いです。
レベル2以降の試験に関しては、実際にコーディングおよび面接があるため、資格というものの中では、かなり実践的かと思います。知名度的に証明として問題がありますが、レベル2を取得できれば最低限のReactスキルを証明できるため、レベル2以降受験をおすすめします。

## その他
レベル2を受験したのですが、コーディングテストに関して3-4時間と書かれているが、実際には1週間の猶予が与えられ、こういうアプリ作ってねという課題に対して、コーディングしていきます。
まずは、レベル1同様選択式の問題(内容はレベル1よりも少し難しい)を合格した後、数時間後ぐらいに、該当のコーディングテストの問題がメールにて届きます。
質問等(使用してよいライブラリや)あれば期間内に質問できます。
あくまで、Reactの試験のため、CSS等のデザインは深く問わないとのことです。(実際に面談までいっていないので、どれほどゆるいかはわかりませんが、、、、)
恐らくNext.jsなどは使用できず、普通のReactそのままになるかと思います。(もしかしたら使えるかもしれませんが、確認を推奨します。)
Typescriptを使用できますが、使用するからにはしっかりと型定義をしないといけなくなるため、もはやTypescriptの試験もかねてしまう状態になり、単純にコード量が少し増えるので、慣れていない人は素直にjavascriptでの作成をおすすめします。

ちなみに、開発環境ですが、恐らくなんでも自分の環境は使用できそうです。ただ結果ソースはGithub等に入れて、urlを共有する必要があります。
試験側が推奨しているのはStackBlitz(VSCodeのブラウザかつインストールできる拡張機能が制限された劣化版みたいなやつ)になります。
ほぼVSCodeです。コマンドではなく、画面操作のデフォルトでプロジェクトを作成するとたしかVite x Reactでのプロジェクト作成でした。(2024/8)

## 試験の今後
選択式の問題の内容がより、実践的になるか、日本語に対応するのかというのは、ほぼ可能性がないかと思います。
まず、Alain Chautardさんが、同様にAngularの試験も作成しているかつ、Angularに力を入れており、Reactの試験にリソースは当分割けないと思うので、まず更新はないかと思います。
ちなみにAngularの資格等がまとめられているCertificates.devというサイトにはVueとなぜかNuxt.jsまで資格があるので、興味がありましたら、サイトをのぞいてみてください。
一応、試験を作成するための人気投票？みたいなものを行っており、その中にはNext.jsが含まれているので、もしかしたら?Next.jsの試験も増えるかもしれません。
ただ、そのサイトもReactではなく、Vueのスクールを運営している人が主体となっているため、望みは　薄いかと思います。

合格できれば同様に記事を書いていきます。
情報が少ないため、少しでもお役に立てれば幸いです。
さくらのレンタルサーバーでPython3.13.1とDjango5.1を使う

# 概要
さくらのレンタルサーバーでPython3.13.1を動かした。その手順と課題を述べる。
# 現状と課題
さくらのレンタルサーバーのPython、OpenSSLのバージョンは以下の通りである。
<table>
<caption>2025年1月6日時点でのバージョン</caption>
<thead>
<tr><th>パッケージ</th><th>バージョン</th><th>Path/Dir</th></tr>
</thead>
<tbody>
<tr><td>Python</td><td>3.8.12</td><td>/usr/bin/python3</td></tr>
<tr><td rowspan="2">OpenSSL</td><td>1.1.1k-FreeBSD</td><td>/usr</td></tr>
<tr><td>1.0.2k-dev</td><td>/usr/local</td></tr>
</tbody>
</table>

OpenSSLは2つのバージョンがインストールされている。Python3.10以降ではOpenSSL1.1.1が必要なので/usrのOpenSSLを使えば良いはず。

ところが、Python3.13.1を--with-openssl=/usrで./configureしてもOpenSSLが古いと怒られる
```sh
% ./configure --prefix=$HOME/.local --with-openssl=/usr
...
checking for stdlib extension module _ssl... missing
checking for stdlib extension module _hashlib... missing
... 
%
```
```config.log
...
configure:28287: checking whether OpenSSL provides required ssl module APIs
configure:28320: gcc -pthread -o conftest  -I/usr/include   -L/usr/lib  conftest
.c -lintl -ldl  -lutil -lssl -lcrypto >&5
conftest.c:470:10: error: #error "OpenSSL >= 1.1.1 is required"
...
```
この原因はつかめていないが、とりあえずPython3.13.1を動かしたい。

# 解決方法
OpenSSLの最新バージョン3.4.0をホームディレクトリ下にインストールし、これを使ってPythonを構築したので、以下その手順を述べる。

## OpenSSLのインストール
```sh
% wget https://github.com/openssl/openssl/releases/download/openssl-3.4.0/openssl-3.4.0.tar.gz
% tar xvpzf openssl-3.4.0.tar.gz
% cd openssl-3.4.0
% ./config --prefix=$HOME/.local --openssldir=/etc/ssl
% make
% make install_sw
```
さくらのレンタルサーバーが提供する証明書を利用してHTTPS化する場合は、`--openssldir=/etc/ssl`が必要である。これについては、下の記事を参考にさせていただきました。

https://qiita.com/hkato/items/5d5dcd6eec7b1cf514bc

## Python3.13.1のインストール
```sh
% wget https://www.python.org/ftp/python/3.13.1/Python-3.13.1.tgz
% tar xvpzf Python-3.13.1.tgz
% cd Python-3.13.1
% ./configure --prefix=$HOME/.local --with-openssl=$HOME/.local --with-openssl-rpath=auto
% make
% make install
```

```--with-open-ssl-rpath=auto```を追加。```auto```のときは```--with-openssl```に従う。これを指定しないと、CGIで起動したときにlibssl.so、libcrypto.soへのパスが通らないため、認証系のモジュールを使うと```AttributeError```が発生する。(2025年1月8日追記)

ここではOpenSSL3.4.0を用いたが、さくらのレンタルサーバーと同じ1.1.1kをホームディレクトリ下にインストールし、これを利用しても同様にインストールできた。しかし、すでにサポート期間が切れているのでどうせなら最新の3.4.0をインストールしといたほうが良い。なお、さくらのレンタルサーバーのOpenSSL1.1.1kを使うとなぜエラーとなるのかはいまだにわかっていない。謎すぎる。

## Django5.1のインストール
```sh
% pip3 install django
```

# まとめ
さくらのレンタルサーバーのPythonは古く、最新のDjangoやFlaskなどを使うことができない。ところが、さくらのレンタルサーバーのOpenSSLではバージョンが古いため最新のPythonをインストールすることができない。そこで、OpenSSLの最新版をホームディレクトリ下にインストールし、これを使って最新のPythonを構築しインストールした。

# 参考
- https://qiita.com/hkato/items/5d5dcd6eec7b1cf514bc
Power Platform の「マネージド環境」とは？

# Power Platform の「マネージド環境」とは？

「Power Platform 管理センター」にあった「マネージド環境を有効にする」が気になったのでメモ。

![ims_20250107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629955/f9510e30-2eb3-ee71-69bc-d71914c38887.png)

## 公式ドキュメント

マネージド環境の概要  
https://learn.microsoft.com/ja-jp/power-platform/admin/managed-environment-overview

マネージド環境を有効にする  
https://learn.microsoft.com/ja-jp/power-platform/admin/managed-environment-enable?WT.mc_id=ppac_inproduct_env

マネージド環境をアクティブ化する  
https://learn.microsoft.com/ja-jp/power-platform/guidance/white-papers/managed-environment-activation

## 「マネージド環境」とは？

Microsoft Power Platform の「マネージド環境 (Managed Environments)」は、管理者がPower Platform を効率的に管理するための機能スイート（管理機能群）。組織のPower Platform の環境に対して追加のガバナンス機能や管理機能を適用できる仕組みで、これによって管理者は高度なガバナンス機能を簡単に有効することができる。

「マネージド環境」によって以下のようなメリットが得られる：

- 統合的な監視および管理：
    - 使用状況やリソース、ユーザーのアクティビティなどを一元的に可視化し、より簡単かつ効率的に管理可能
- リスクの軽減とセキュリティ強化：
    - 環境管理ポリシーを強化することで、機密データの保持やアプリの利用におけるリスクを低減し、セキュリティレベルを高めることが可能
- 自動化された運用負荷の軽減：
    - ポリシーの適用や不要リソースのクリーンアップなど、管理者が手動で行わなくてはいけない作業を自動化し、運用負荷を大幅に削減
- ライフサイクル管理の改善：
    - 開発から運用、廃棄に至るまでアプリやフローのライフサイクルをより効率的に管理可能
        - 開発フェーズ：開発環境（Dev）、テスト環境（Test）、本番環境（Production）に分け、それぞれの環境に応じたアクセス制御や利用ルールを適用
            - 例：開発環境では制約をなくし、本番環境では制約を厳しくする
        - 運用フェーズ：Power Platform 管理センターで、アプリやフローの使用状況をリアルタイムで追跡し、運用中のツールがどの程度利用されているか把握
            - 例：利用頻度が低いアプリは改善または停止を検討
        - 廃棄（終了）フェーズ：一定期間使用されていないアプリやフローを自動的に停止または削除するポリシーを適用
            - 例：6か月以上使用されていないフローを自動停止

マネージド環境を有効にすることで、アプリやフローを使用するユーザーのライセンス要件の明確化や、不要なアプリ／フローの自動停止・削除などの運用管理が容易になる。これにより、IT 管理者やガバナンス担当者は大規模な Power Platform の導入に伴うリスクを最小限に抑えつつ、柔軟かつ効率的に運用できるようになるのが大きな特徴。

要するに、**エンタープライズレベルのガバナンスやセキュリティを簡単に実現させてくれる管理機能群。**
ノータッチvimからTypescriptを入れられるvimになるまで

環境：Ubuntu。
雑です。すみません。
## 1.インストール
デフォルトでインストールされてました。
なければaptから入れられます。
```bash
$ sudo apt install vim
```
## 2.操作説明
nanoユーザーだったので矢印キーでカーソルを操作します。信者さんはごめんなさい。
ノーマルモード(コマンド?を入れられる)→挿入モード(INSERT、入力できる状態)にするのはiキー。
ノーマルモードに戻すのはEscキー。

ノーマルモードからできる最低限のコマンド：
| コマンド | 効果 |
|:-:|:-:|
| i | 挿入モードにする |
| :q | vimを終了する(:qとかはタブを閉じるっぽい) |
| :q! | vimを強制的に終了する |
| :w | ファイルを上書き保存 |
| :w [ファイル名] | ファイルに名前を付けて保存 |

vimデフォルトであればこれだけ覚えれば十分な気がする。信者はすみません。
## 3.プラグイン
どうやらプログラミングするにはプラグインを入れると自動補完等ができるそうなのでプラグインマネージャーを入れます。
以下の記事で導入しました。

https://qiita.com/kouichi_c/items/e19ccf94b8e5ab6ed18e

## 4.TypeScript補完プラグインを導入

https://pragmaticpineapple.com/ultimate-vim-typescript-setup/

これを参考にしました。自分なりには、まずこのプラグインを導入するそうです。vim-plugの人はこれを.vimrcに入れてください。
```
Plug 'neoclide/coc.nvim', {'branch': 'release'}
```
その次、自分はCoC Wikiでよくわからなくてnpmでcoc.nvimをグローバルインストールしてました。要らないかもです。
そして
```
let g:coc_global_extensions = ['coc-tsserver']
```
をまた.vimrcに入れて
そしてvimのノーマルモードで`:CocInstall coc-tsserver`をするっぽいです。

## 5.色を調整

これだと予測変換が出ても色が白くて見えません。カラースキームを変えましょう。
以下を参考にしてmolokaiを導入しました。

https://qiita.com/sff1019/items/3f73856b78d7fa2731c7

これを見た人が実践してうまくいくことを祈って...
Pi3b+ (bookworm)に無理くりCoralTPU環境を押し込んだ話

## 今北産業(アレンジポイント)
install.shは動かない. ~^2.0が入るgitも動かない. 
代わりにpyenvで3.9以下入れて（libffiの事前インストール必須！）, Github(google-coral/pycoral release2.0.0)から適切なpycoralとtflite_runtime引っ張ってくる -> pip install
pip installするときは, numpy<2 pillow<10 しないとサンプルコードも動かない. Abondanded!

## なにしたんだっけな…
### 最初はマニュアル通り...
https://coral.ai/docs/accelerator/get-started/#pycoral-on-linux

```
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

sudo apt-get update
```
``` 
sudo apt-get install libedgetpu1-std
```
ここまではいいんよ

### 問題のコード
``` 動かないはず
sudo apt-get install python3-pycoral
```
bookwormでは、手前様のPythonのバージョン高杉。と怒られるはずです。
では、公式が薦めるPyenvを試してみましょう。

``` 
sudo apt install -y git openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev　libffi-dev
```
あとはこれ見ながら、bash_profileをsourceで読むとこまでやって戻って来ること。

https://qiita.com/hoshi621/items/c8b82ab42564256df884

```
pyenv install 3.9.21 
# RPi3だとものすごい時間かかるから, Ctrl+Cは堪忍な！
pyenv global 3.9.21
```
終わったら、ここからpycoral-2.0.0-cp39-cp39-linux_aarch64.whlとtflite_runtime-2.5.0.post1-cp39-cp39-linux_aarch64.whlを持ってくる。

https://github.com/google-coral/pycoral/releases/tag/v2.0.0


### pipの時間
依存関係を自動補完してAbandon爆弾が炸裂するので、順番厳守。
```
pip install 'numpy<2' 'Pillow<10' 
pip install ./pycoral-2.0.0-cp39-cp39-linux_aarch64.whl ./tflite_runtime-2.5.0.post1-cp39-cp39-linux_aarch64.whl
```
ここまで来たら、あとは公式のステップ３に戻ればいけるはず。

https://coral.ai/docs/accelerator/get-started/#pycoral-on-linux

書き忘れとかあったら、もう一台セットアップする予定があるのでシレッと追記されます。（ｵｲ）
おわり！

### 参考文献
https://coral.ai/docs/accelerator/get-started/#pycoral-on-linux

https://github.com/google-coral/pycoral/releases/tag/v2.0.0

https://github.com/google-coral/pycoral/issues/140

https://qiita.com/nv-h/items/9ee5aabf2be722c7459d

https://qiita.com/hoshi621/items/c8b82ab42564256df884
【Mac】デフォルトのシェルを変更する方法

以下のコマンドを実行するとデフォルトのシェルを変更できます。

```terminal
chsh -s /bin/bash
```

上記の場合にはbashに変更されます。

設定できるシェルは以下のコマンドで確認できます。

```terminal
$ cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
```
【Copilot】カスタムインストラクションを活用しよう

# はじめに
GitHub Copilotに**カスタムインストラクション**という新機能が追加され、プロジェクトのルールや方針を事前に設定することで、それらが継続的にCopilotの提案に反映されるようになりました。これまでは都度指示が必要だった内容も、リポジトリ固有のコーディング規約やアーキテクチャ設計方針、さらには業務ドメイン特有の複雑なルールを自動的に考慮したコード提案を継続的に受けられるようになります。
このページでは、カスタムインストラクションの機能とvscodeでの利用方法についてまとめます。
# カスタムインストラクションとは？
カスタムインストラクションとは、**Copilotに対して開発者が事前に設定できる指示や制約**のことです。コードの生成、テスト、レビューなどの場面で、Copilotの動作を開発者の意図に沿ったものにカスタマイズできます。

https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot

例えば、以下のようなコードのレビューをCopilotにしてもらうとします。
```
func calcDiff(start, end time.Time) int32 {
    diff := end.Sub(start)
    return int32(diff.Seconds())
}
```
何も指定していない状態でレビューを受けると
![スクリーンショット 2025-01-06 23.29.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948431/655790d4-c7aa-8daa-9e19-022e5d01443a.png)

のようにコメントしてくれます。

そこで、カスタムインストラクションで`時間の差分は分単位で扱うものとする。`指定すると、
![スクリーンショット 2025-01-06 23.32.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948431/0df2b840-04ca-c57b-7805-3f0c58b6e02b.png)
このようにコメントしてくれるようになります。分単位で扱う前提で指摘してました。

# 指定方法
vscodeでは、setting.jsonに
```
  "github.copilot.chat.reviewSelection.instructions": [
    {
      "file": ".copilot-instructions.md"
    },
    {
      "text": "時間の差分は分単位で扱うものとする。"
    }
  ],
```
と指定すると、対象のファイルと、直書きしたtextを読み取りその内容を反映したアウトプットをしてくれます。簡単ですね。

現在vscodeでは以下の利用シーンでそれぞれ別のインストラクションを指定することができるようです。

* レビューとコメント
    * `github.copilot.chat.codeGeneration.instructions`
* コード生成時
    * `github.copilot.chat.codeGeneration.instructions`
* テスト生成時
    * `github.copilot.chat.testGeneration.instructions`
* コミットメッセージ生成時
    * `github.copilot.chat.commitMessageGeneration.instructions`

https://code.visualstudio.com/docs/copilot/copilot-customization

# まとめ
カスタムインストラクションは、AIが従来苦手としてきた**プロジェクト固有の文脈に基づく判断**を可能にする画期的な機能です。チーム内で策定した設計方針や業務ルールをinstructionsファイルとして管理し、Copilotと共有することで、より正確で実用的なコード提案を得られるようになります。積極的に活用していきましょう！！

と書きつつも、人間がコードを書く必要性が薄れていき、どこか寂しい気持ちにもなりますね。
M365監査ログ「AuditData」カラムから必要な情報を抽出してCSVへ出力する

はじめに
---

M365を扱う業務を経験していると一度は監査ログに触れる機会があるのではと思います。
CSV出力したデータの中に含まれているJSON形式のデータをPowerShellを使用して、必要な情報だけを抽出し新規CSVに出力する方法をご紹介いたします。

下記MS公式情報内「手順 2: Power Query エディターを使用してエクスポートされた監査ログを書式設定する」以降の作業を簡略化することを目的としています。

https://learn.microsoft.com/ja-jp/purview/audit-log-export-records

そのため、M365監査ログ取得手順については下記MS公開情報を確認していただければと思います。

https://learn.microsoft.com/ja-jp/purview/audit-search?tabs=microsoft-purview-portal

事前準備
---
・M365監査ログ
・PowerShellが利用可能な環境

「AuditData」に含まれるプロパティについて
---

下記MS公開情報を確認していただき、抽出に必要なプロパティをあらかじめ絞ることをお勧めします。

https://learn.microsoft.com/ja-jp/purview/audit-log-detailed-properties?view=o365-worldwide

今回は、下記プロパティを抽出し新規CSVに出力したいと思います。
CreationTime：レコードが作成された時間（UTC表記）
UserId：ユーザ名
Workload：利用されたサービス名
Operation：実行された操作

「AuditData」の変換
---
*１．PowerShellを起動*
※起動方法については割愛

*２．M365監査ログのファイルパスを変数に格納し読み込む*
```PowerShell
# M365監査ログのファイルパスを変数に格納
$AuditlogPath = "M365監査ログのファイルパス"

# CSVの読み込みを行い、結果を変数に格納
$csv = Import-Csv -Path $AuditlogPath -Encoding Default 
```

*３．M365監査ログ「AuditData」カラムのJSON文字列をJSONオブジェクトに変換*
```PowerShell
# JSON文字列をJSONオブジェクトに変換し、変数に格納する
$jsonobject = $csv.AuditData | ConvertFrom-Json
```

*４．出力対象のプロパティを選択し、変数に格納*
```PowerShell
# 抽出対象の値のみを変数に格納する
$outputdata = $jsonobject | Select-Object CreationTime,UserId,Workload,Operation
```

*５．新規CSVに出力する*
```PowerShell
# JSONオブジェクトをCSV形式に変換し、指定した出力先にCSVを出力する
$outputdata | Export-Csv -Path "出力先パス¥出力ファイル名.csv" -NoTypeInformation -Encoding UTF8
```

最後に
---
ExcelのPowerQueryエディターのJSON変換機能を利用せずにJSON形式のデータを読み取りやすい形式へ変換するための方法をご紹介させていただきました。
スクリプト化し、より簡単に変換する方法についても後日記載できればと思います。
Rails入門者が解説本を読んでみた感想

# はじめに
XにてWINGSプロジェクトのレビュー企画を見つけ応募したのがきっかけです。
ありがたいことに献本してもらったので、この度書評を書きました。
書評内容は、
- 良かった点
- 気になった点
- 総評

以上、３点で構成します。
なお献本いただいた本は以下です。

https://gihyo.jp/book/2024/978-4-297-14598-9

# 良かった点
- 細部まで解説が図解や表を多用していてわかりやすい
- Progateなど併用することで、項目ごとの理解を深めやすい
- Indexからメソッドを索引できる
- Hotwireの解説あり
- 簡易デプロイ先であるrenderの紹介がある
- 旧バージョンとの比較コラムがあり参考になった

# 気になった点
- 解説メインのため、アプリ開発を通じて学習するスタイルではない
- 実運用を想定してnginxの解説が少しでもあると嬉しかった
- テストがMinitest（実運用はRSpecが多い）
- Gemの紹介がもっとあって欲しい

# 総評
初学者から実務者まで幅広くカバーできる一冊であると感じました。
開発や学習の道中で辞書的に使用するのが良いかなと思います。
気になったメソッドを調べると、使用例の一覧が出てたりするので勉強になります。

持っていて損はないので、気になる方は是非購入してみてください！
自作OSのフォントについてモリサワから返事が来た話


はい、miku_JK_Jbです

今回は自作OSのフォントについてモリサワから返事が来た話をしていこう。

前回のブログの続きだ。



私は前回モリサワに以下のことを問い合わせた。

・自作OSにモリサワのゴシックMB101を使用していいのか？
・ライセンスの条件はどんな感じか？
・使用許可やライセンス費用が発生する場合はいくらなのか？

そして今日、モリサワから返事が来た



結果はこんな感じ

・システムフォントとしての利用については、法人契約のみとなり、契約対象は法人となる。
・個人契約可能なものに「Morisawa App Tools」というプランがある
・ただし、利用範囲がアプリ・ゲームに限定されたものになる。
・費用は1書体550,000円／1アプリになる。

詳細は以下通り
↓
https://www.morisawa.co.jp/products/fonts/embedding/mat/


いやいや待て待て、55万円って高すぎだろ（笑）



とりあえず別のフォントを探すか。条件はUnicode対応のユニバーサルフォントをだ。



次回に続く
今のうちに自作OSをTrueTypeFontに対応とUnicodeをサポートできるようにしておくか。
実際に試してみた：MacBookにNGINXを導入してローカルホストでWebサーバーを動かす方法

## はじめに

NGINX（エンジンエックス）は、高速かつ軽量なWebサーバーとして広く利用されています。

:::note info
**この記事では、MacBookにNGINXをインストールし、ローカルホストでWebサーバーを動かす方法を解説します。**
:::

***あまり試している人は多くないかもしれませんが、この内容が誰かの技術の支えになれば幸いです！***

## 書こうと思ったきっかけ
「***サーバー構築って難しそう***」というイメージを少しでも払拭し、気軽に挑戦できる一歩目として、普段使っているMacBookで構築してみようと思いました。

:::note warn
**私がサーバーの勉強を始めた当時は、MacBookユーザー向けに具体的な手順や設定のポイントを丁寧に解説した記事が少なく、試行錯誤しながら進めた記憶があります。**
:::

この記事を通して、私と同じようにNGINXを導入し、ローカルホストで動かしてみたいと思う方の参考になれば嬉しいです。

## 関連記事

NGINXについては、自宅でいろいろな技術検証をしています。興味のある方は、ぜひ以下の記事も参考にしてみてください。

https://qiita.com/free-honda/items/068adffee2bea5bcca24

https://qiita.com/free-honda/items/6967d47a8086091ee11c

https://qiita.com/free-honda/items/9ebe3473a9099b84f5a4

## 1. Homebrewを使ったNGINXのインストール
MacBookでは、Homebrewを使用することで、簡単にNGINXをインストールできます。***以下の手順に従って進めてみてください！***

### Homebrewの確認
まず、Homebrewがインストールされているか確認します。以下のコマンドをターミナルで実行してください。

```bash
brew --version
```

Homebrewがインストールされていない場合は、公式サイトの手順に従ってインストールしてください。

https://brew.sh/

### NGINXのインストール
Homebrewがインストールされている場合、以下のコマンドを実行してNGINXをインストールします。

```bash
brew install nginx
```

### インストール確認
NGINXのインストールが完了したら、以下のコマンドでインストールされたバージョンを確認します。

```bash
nginx -v
```

実行結果は以下のようになります。

![Screenshot 2025-01-06 at 22.41.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/117e416d-9bb0-8177-781d-a0f0ae3c6484.png)

この例では、`nginx version: nginx/1.27.3` が表示され、正常にインストールされていることが確認できます。

## 2. NGINXを起動してローカルホストでアクセス
NGINXを設定した後、ローカルホストでWebサーバーにアクセスできるようにします。

### NGINXの起動
以下のコマンドでNGINXを起動します。

```bash
sudo nginx
```

### ローカルホストでアクセス
ブラウザを開き、以下のURLにアクセスしてください。

```bash
http://localhost:8080
```

デフォルトではポート`8080`で動作します。以下のようなNGINXのデフォルトページが表示されれば、起動成功です。

![Screenshot 2025-01-06 at 22.43.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ee242731-55fa-1a5f-e599-289ded04b3ff.png)


### NGINXの停止
NGINXを停止する必要がある場合は、以下のコマンドを実行してください。

```bash
sudo nginx -s stop
```

停止後、デフォルトのNGINXページにアクセスできなくなっていることを確認できます。***以下のような画面が表示されるはずです。***

![Screenshot 2025-01-06 at 22.45.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/58f7b24a-16ce-687b-0548-e08ac7f8b97a.png)

## まとめ
これで、MacBookにNGINXを導入し、ローカルホストでアクセスできる環境が整いました。

:::note warn
**NGINXは軽量で柔軟性が高く、Webアプリケーションの開発やテストに最適なツールです。**
:::

***今回は基本的な内容でしたが、MacBookでも簡単にサーバーを構築できることが伝われば嬉しいです...！***

## 参考記事

https://blog.mothule.com/web/nginx/web-nginx-getting-started-step1-on-mac

https://qiita.com/amemolee/items/56332100f182088687cf

https://www.engineer-gari.tech/mac-nginx-install/
AWS環境における Amazon Bedrock と LangChain の実践的比較：RAG実装の観点から

## はじめに

生成AI実装において、Amazon BedrockとLangChainは異なるアプローチを提供する代表的なツールです。本記事では、特にAWS環境でのRAG（Retrieval-Augmented Generation）実装を視野に入れた比較検討を行います。

## 基本的な特徴の比較

### Amazon Bedrock
AWSが提供するマネージドサービスとして、以下の特徴があります：

* AWS環境との完璧な統合
* 複数のファウンデーションモデルへのアクセス
* モデルのファインチューニングと推論の統合環境
* 使用量ベースの透明な課金体系

### LangChain
オープンソースのフレームワークとして、以下の特徴を持ちます：

* 柔軟な開発環境の提供
* 豊富なツールとコンポーネント
* 詳細なカスタマイズ性
* プロンプト管理からメモリ管理まで幅広い機能

## RAG実装における比較ポイント

### 統合の容易さ
Amazon Bedrockは、特にAWS Kendraとの統合が容易で、RAG実装の初期構築が迅速です。一方、LangChainは追加設定が必要ですが、より細かな制御が可能です。

### パフォーマンスと拡張性
Bedrockは AWS インフラを活用した高いパフォーマンスと自動スケーリングを提供します。LangChainは自前での最適化が必要ですが、必要に応じた細かなチューニングが可能です。

### セキュリティとコンプライアンス
Bedrockは AWS の高度なセキュリティ機能とコンプライアンス認証を継承できます。LangChainはセキュリティ設定を開発者が担当する必要があります。

## 実装検討のための判断基準

以下の観点から、プロジェクトに適したツールを選択することが重要です：

* プロジェクトの規模と要件
* 開発チームのスキルセット
* セキュリティ要件
* カスタマイズの必要性
* 長期的な保守管理の方針

## まとめ

Amazon BedrockとLangChainは、それぞれ異なる強みを持つツールです。AWS環境に閉じた開発では、Bedrockの統合性の高さが魅力的です。一方、詳細なカスタマイズが必要な場合は、LangChainの柔軟性が活きてきます。

また、両者を組み合わせたハイブリッドアプローチも有効な選択肢となります。プロジェクトの特性を見極めた上で、最適なアプローチを選択することが成功への鍵となります。

---
*本記事の一部はAIによって生成されています。*
私がエンジニアになってよかった3つのコト

# 私がエンジニアになってよかった3つのコト

## 対象読者
- これからエンジニアを目指す方
  - 新卒・中途問わず
  - 特に女性の方
- エンジニアになって働く魅力を知りたい方
- 特に女性でエンジニアになってよかったことを知りたい方

## 1. はじめに：エンジニアを目指したきっかけ

私はざっくりというと次のような経歴のエンジニアです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916100/b2feaa93-97cc-fc81-cae8-717f6ed7b7fc.png)

- 性別 : 女性
- 年齢 : 31歳
- 生息地 : 東京都多摩地域
- 職務経歴 :
  - 2019年 : 自治体のIT系職業訓練で契約社員として研修しながら働く
  - 2020年 : 研修の一環の就職活動を通して新卒扱いで正社員エンジニアとして働き始める（SES/組み込み系）
  - 2023年 : 家庭の都合で転職・正社員（コンサル/Web系）
  - 現在 : エンジニアとして約5年目のキャリアを構築中
- 技術スキル :
  - 言語 : C, C#, Java, Python
  - 領域 : インフラ（クラウド）、フロントエンド、バックエンド（バックエンド寄りです）
  - 関わった業務 : 要件定義・基本設計・詳細設計・開発・試験・運用

私は工学系の大学を卒業したものの、卒業後しばらくニート生活をしていました。そのため貴重な新卒での就職という機会を逃してしまいました。
学生時代に体調が少しすぐれなかった経験から、就職に対する知識が浅く自分の選べる仕事は非常に限られていると考えていました。
運転免許も大した資格も持っておらず、「PCができるくらいなのでせいぜいできるのは事務職くらいだろう」と思い込んでいました。

そんな中でキャリアカウンセラーの方に相談した際に「エンジニアという道がある」と勧められました。
エンジニアがどんな仕事をするのかもよく知らず、自分にできるのかと半信半疑でしたが、ニートをなんとか脱却したく一歩を踏み出し今に至ります。
今のところ相性もよく楽しく社会人ができています。

## 2. エンジニアになってよかったコト

### 2-1. 問題を解決する楽しさと達成感があるコト

私のエンジニア経験で一番達成感があったコトは、エンジニアになりたてのプロジェクトにおいて作り上げたシステムをお客様に褒めていただいたことです。

お褒めいただいた「よい製品を納品してくれてありがとう」という言葉は今でも忘れられません。
その経験を通じて、エンジニアの仕事は技術を駆使してシステムを作るだけでなく、お客様のニーズを理解し、問題を解決することが重要だと気付きました。

### 2-2. 技術スキルと対人スキルの両方が成長できるコト

エンジニアとして働く中で、技術だけでなく人との接し方も大きく成長できるコトが魅力であると考えています。

それは実際にシステムに関わった経験から、エンジニアの仕事はお客様の要望と、開発するチームや関係者の協力をもって成り立つと感じたためです。

私個人の考えですが、技術スキルは取得のプロセスがある程度確立していると考えています。
例えば時間をかけてリファレンスを読んだり、技術書を実践、勉強会や資格取得で実践することで身につけることができます。

対して対人スキルはそう簡単ではないと考えています。ある程度研修や本から身につけることはできますが、実践につながる振る舞いや人柄やコミュニケーション力は、仕事や日常生活を通じて磨かれるものだと考えています。

決して技術スキルの取得を怠って良いというわけではありませんが、仕事というのはテストと違い「正解のない問題」だと考えています。
1システムの実装においても顧客の要望を達成できるパターンはいくつも存在しているためです。
ベストを尽くすために、技術スキルのみならず対人スキルを用いての顧客へのヒアリングやチームの連携ができるようになると、エンジニアとして自分が成長していると感じます。

マネジメント職がなぜ高給なのかが腑に落ちた瞬間もありました。技術はもちろん大事ですが、それだけでは限界があるのだと気づいたのも、大きな学びです。

### 2-3. 多様な働き方ができる自由があるコト

エンジニアは在宅ワークがしやすい業種であることから、私自身もリモートワークができる環境にいることがとてもありがたいと感じます。
例えばこんなコトができます

- 肌荒れがひどい日はノーメイク
  - 目覚ましにフェイスパックをつけながら作業をする
- 自分の体調に合わせた空調・空間で作業できる
  - 私自身エアコンの冷房がキツいと感じがち、暖房は顔が真っ赤になりがちなので快適です
  - 好きなキャラもののブランケットをかけられます
- 好きなタイミングでコーヒーブレイクができる
  - 好きなコーヒーを淹れられる
  - オフィスのサーバーに行き来しなくてよい

特に生理の日が来て体調を崩しやすい女性にとっては、「自分のペースや身体に合わせた柔軟な働き方ができる」という点は、エンジニアという職業の大きな魅力のひとつだと考えています。

## 3. まとめ:これからエンジニアを目指す方へ

エンジニアという仕事は、技術を磨くだけでなく、問題を解決する達成感や成長できる環境、そして自由な働き方が得られるイケてる職業だと思います。
正社員で働き続けていれば女性の平均年収を上回ることも容易です。

しかし、技術を勉強しただけでは、実際のエンジニアの仕事に直面したときにギャップを感じることもあると考えています。エンジニアの仕事は技術だけではなく、お客様やチームとのやりとりも重要だからです。

そのため、エンジニアを目指しているなら、勉強を始めると同時並行して、エンジニアとしての働き先を探すことをおすすめします。
新卒の方ならインターン・IT企業への応募や、中途の方なら
や職業訓練やポテンシャル採用の求人です。または女性向けのIT企業への職業訓練系の支援が公的にありますのでそれを活用することをおすすめします。

私は実際に「働きながら学ぶ」ことが、より早くエンジニアとして成長できるポイントになると考えています。実務経験を積むことで、技術書だけでは学べないプロとしての仕事のリアルな部分を実感できるからです。

エンジニアとしてのキャリアは可能性に満ちていると思います！ぜひエンジニアの一歩を踏み出していただき、機会があれば私と何処かで技術交換できれば嬉しいです！

## 補足情報
- この記事はGitHub Copilotを文章作成の補助ツールとして活用し、作成しています
【論文読み】運用時AI 品質維持技術：コンセプトドリフト検知・適応から教師なしドメイン適応まで

## はじめに
こんにちは。論文を読んだ結果の紹介記事です。  
今回紹介するのは、「運用時AI 品質維持技術：コンセプトドリフト検知・適応から教師なしドメイン適応まで」という論文です。  

- タイトル： 運用時AI 品質維持技術：コンセプトドリフト検知・適応から教師なしドメイン適応まで
- 出典： 2023年度人工知能学会全国大会（第37回） (2023)
- URL： https://www.jstage.jst.go.jp/article/pjsai/JSAI2023/0/JSAI2023_2R4OS1205/_pdf/-char/ja


## 概要
機械学習技術を用いたAIシステムの運用においては、データの取得環境の違いや時間経過によって、運用時に新たに取得する入力データの分布が元の訓練データの分布から変化し、システムの性能低下を引き起こす恐れがある。特に、コンセプトドリフトと呼ばれるデータおよびその正解ラベルの同時分布の変化は、性能低下を引き起こす主な原因の1つである。


## 特徴
- ドリフト検知、適用
    検知には、確信度スコアの変化に従う手法、教師なしの一種であるクラスタリングを用いた手法などがある。
    適用には、クラスタリングを用いた手法、機械学習モデルを組み合わせた手法などがある。

- UDA技術を用いた変化への対応
    正解ラベルのないターゲットデータに対して疑似ラベル付けを行う。
    ソースモデル学習時には含まれていない未知クラスの出現や、その反対に学習したクラスの一部のクラスのみ出現する場合などにおいても有効に働くことが示されている。

- ソースフリー教師なしドメイン適応手法
    訓練データを再利用せずに適応を行う.
    生のソースデータを用いずに、ターゲットデータの特徴量が機械学習モデル内部の特徴空間上でクラスごとに識別可能となるように、各ターゲットインスタンスに疑似ラベル付けしながら学習を行う。疑似ラベル付けのためには、特徴空間上での各クラスの特徴量の中心または代表点からの距離を用いる手法や、複数モデルの予測結果を用いる手法がある。

- Test-time 適応手法
    運用前の訓練データを用いずに機械学習モデルをオンライン適応させる。


## 想定される適用例
- 画像分類、セマンティックセグメンテーション、物体検知


## 参考
- [運用時AI 品質維持技術：コンセプトドリフト検知・適応から教師なしドメイン適応まで](https://www.jstage.jst.go.jp/article/pjsai/JSAI2023/0/JSAI2023_2R4OS1205/_pdf/-char/ja)
DDD（ドメイン駆動設計）の復習part2

# アーキテクチャ
## アーキテクチャの種類
DDD関連の文献でよく紹介されるアーキテクチャは下記３つです。
- レイヤードアーキテクチャ
- オニオンアーキテクチャ
- クリーンアーキテクチャ

構成要素や考え方が少し違いますが、本質的には全て同じです。

## それぞれのアーキテクチャの共通点
### 1. 分離
すべてのアーキテクチャが、関心事の分離を重要視しています。
異なる責務を持つコードを明確に分離し、システムを構造化します。
これにより、各部分が独立して開発・テスト・変更可能になります。

### 2. モジュール性と疎結合
各コンポーネント（層やレイヤー）が疎結合で設計されるべきという考え方です。
特定のコンポーネントを変更しても、他の部分に影響が少ないようにします。
モジュールごとに独立した役割を持つことで、コードの再利用性や保守性が向上します。

### 3. 明確な依存関係の管理
依存関係は明確に定義し、制御することを重視します。
特に、依存関係の方向は、基本的に「高レベルのモジュール（ビジネスロジックなど）」が「低レベルのモジュール（データベースやUIなど）」に依存しないように設計されます。

### 4. テスト容易性
どのアーキテクチャも、ユニットテストや統合テストが容易になる設計を目指しています。
例えば、ビジネスロジックがインフラや外部システムから切り離されているため、モックやスタブを利用して独立してテスト可能です。

## 詳細
それぞれのアーキテクチャを詳しくみていきます。

### レイヤードアーキテクチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326452/891c7aa8-77ca-41c9-fa3b-61051a5b7912.png)

プレゼンテーション層でクライアントとの入出力の管理、アプリケーション層でユースケースの実現、ドメイン層でドメイン知識の表現、インフラ層でDBとの入出力の管理を行います。このようにすると、レイヤーごとの凝集度が高まり、可読性や保守性を高めることができます。
しかし、このアーキテクチャには課題があります。
それはビジネスロジックがインフラ層に影響されるという点です。
DDDではドメインモデルを中心に設計を行いドメインの変更がしやすいようにすべきなのに、ドメイン層がインフラ層に依存してしまっています。
ドメイン層は容易に変更できるようにどこの層にも依存しないようにするべきです。

### オニオンアーキテクチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326452/09fcd25d-9026-0ec8-bda7-17ebb5c6baff.png)

レイヤードアーキテクチャから依存関係逆転の原則を用いてドメイン層とインフラ層の依存関係を逆転させたのがオニオンアーキテクチャです。
リポジトリはインターフェイスをドメイン層に、実装クラスをインフラ層に定義します。そうすると依存の方向性は実装クラスからインターフェイスになるので、レイヤーの依存も同様にインフラ層からドメイン層になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326452/3c7aec57-ba71-4f5c-19f0-4bb8eb000082.png)

### クリーンアーキテクチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326452/507e7154-328c-40c5-1396-3a46a25b3ef8.png)

層の分け方、名称や責務に細かい違いはありますが基本的にはオニオンアーキテクチャと近い形になっています。
オニオンアーキテクチャと比べると登場する要素が多いため、一般的な Web アプリケーションでは考慮不要なものも含まれており、適用する要素の選別に時間と労力がかかります。

## DDDで採用すべきアーキテクチャ
DDDではオニオンアーキテクチャが採用されるケースが多いようです。
理由としては登場する要素がDDDの要素と一致していることと、複雑性が少ないことです。
オニオンアーキテクチャで実装を進めていく上で悩む点があればクリーンアーキテクチャから考え方を輸入してきたりして拡張していくのが良いのではないかと思います
cssを用いて、文字をゆっくり浮かび上がらせる

## 文字がゆっくりと浮かび上がってくるcss

作成例
![文字浮かび上がり.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944112/ea551d9f-cb73-61f3-eca5-2f67add8e6a9.gif)

以下コード
```ruby:app/assets/任意のcss

p
{
 animation-name: textanime;/*keyname*/
 animation-duration:10s;/*最大再生時間*/
 animation-fill-mode: forwards;/*表示を固定*/
 #追加したい色や余白があれば以下から}までの中に追加
}

@keyframes textanime
{
 0%{
  opacity: 0;/* 最初は透明 */
 }

 100%{
  opacity: 1;/* 最後は完全に表示 */
 }
}
```

pは各々対応させたいタグに変更して使用してください。
オブザーバビリティの基礎の基礎を調べてみた

こんばんは。Espernaです。

オブザーバビリティという単語を最近聞くことが増えました。
私はファームウェアエンジニアで、昨年[AWS Developer Associate](https://aws.amazon.com/jp/certification/certified-developer-associate/)を取りましたが、
以下２つの理由で[オブザーバビリティ・エンジニアリング]()という本を読むことにしました。

* 自身やチームの開発の仕方を見直す上で重要そうな概念な気がした
    * 開発の仕方はCI/CD、TDD、TiDDを取り入れたあたりで止まっていてそろそろ開発の仕方自体見直すタイミングなのではないかと思っていた
* 仮に今の自分にすぐに役に立つものではなくても、自分が知らない概念を知ることは思わぬところでどこかで何かにつながるかもしれないと思った

また大抵のことは生成系AIで調べれば効率的に答えがわかる世の中になりましたが、
単に読むよりも自身でアウトプットを残した方が自身の理解が深まると思ったので本記事を書くことにしました。

# オブザーバビリティとは何か

オブザーバビリティとは、構造化されたイベントの集合をトレースとして繋ぎ合わせられるようにすることでどのようなリクエストに対しても問題を素早く診断するために必要な分析・可視化ができるような、システムの性質と現時点では理解しています。
まずイベントとトレースは次のようなものです。

## イベント

* 本番環境のサービスへの影響を理解するために、ある特定のリクエストがそのサービスとやり取りしている間に発生したすべての記録
* データ構造はマップで、マップにはリクエストの有効期間中に発生したものに関する詳細。たとえば以下が入っている
    * ユニークID
    * 変数の値
    * ヘッダー
    * リクエストで渡されたすべてパラメータ
    * 実行時間
    * リモートサービスへのコール
    * それらのリモートのサービスの実行時間
* これは構造化イベントと呼ばれる

## トレース

* スパンと呼ばれるリンクされたイベントの有向非巡回グラフ（グラフの向きが一方向で巡回しない）
* 上記構造は図にすることができる
* トレース内のスパンはトレース内の最上位であるルートスパンかルートスパンの中で入れ子になったスパンのいずれかである
* ルートスパンの中で入れ子になったスパンはそれ自身の入れ子になったスパンを持つことがある

# メトリクスよりトレースが有用

このイベントと従来のメトリクスと呼ばれるものを比較すると、イベントを繋ぎ合わせたトレースの何が有用かがわかる気がします。

メトリクスとはCPU使用率のようなあらかじめ定義された期間にわたるあらかじめ定義された関係を集計されたスカラー値（低次、ディメンションは1）として表現したものです。
過去で発生した故障モードを特定するためにのみ有効で、CPU使用率がとある閾値より高かったらwarningといったような、ある一つのシステムの特性に関してある１つの見方しかすることができません。

それに対して、イベントというのは特定の時点で取った高次のスナップショットで
イベントの特定のパラメータに注目して複数のスナップショットからメトリクス（例えば平均）を計算することでメトリクスを作ることができます。そして、どのようなリクエストに対しても問題を素早く診断するために必要なメトリクスを計算し、問題を素早く診断するために必要な分析・可視化をすることできます。逆にメトリクスからトレースを作ることは難しいです。


# まとめ

* オブザーバビリティの基礎となる構成要素は任意の幅をもつ構造化イベント(データ構造的にはmap)である
* オブザーバビリティのあるシステムではどのようなイベントの集合もトレースとして繋ぎ合わせられることで、どのようなリクエストに対しても問題を素早く診断するために必要な可視化ができる（トレースはスパンと呼ばれるリンクされたイベントの有向非巡回グラフであるため）


# 所感

ICEで取るトレースだったり複合機やメモリのソフトなどこれまでのソフトウェア開発で
イベントドリブンのプログラムを書くことは頻繁にあり、メトリクス的な概念に触れることは多かったです。
一方で、構造化イベント・トレースといった概念については[Go言語による分散サービス](https://www.oreilly.co.jp/books/9784873119977/)でちょっとコードを動かしたことがあるくらいで、あまり馴染みがありませんでした。今後自分がゴリゴリのマイクロサービスアーキテクチャの世界でコードを書くかは分かりませんがシステムを考えた時に下位過ぎない、HWを制御するアプリケーションのようなレイヤーであれば「構造化イベント」を採用してみるのも良いかもしれないと思いました。今時人間しか解読できないログも属人性が高く非効率なので。


# 参考文献

[オブザーバビリティ・エンジニアリング](https://www.oreilly.co.jp/books/9784814400126/)
[Go言語による分散サービス](https://www.oreilly.co.jp/books/9784873119977/)
Nest.jsで「UnsupportedMediaTypeError: unsupported charset "ASCII"」の対策

## 問題の発生方法

タイトルの通り文字コードをasciiで指定したリクエストを受けた際に発生したので、調査したところ以下のリクエストヘッダーでPOSTリクエストしたところ再現することができました

```
Content-Type: application/json charset=ascii
```

## 例外発生箇所

エラー発生時のスタックトレースで`body-parser`であることは理解していたのですが、実際にどのような処理が行われているのか確認したところ、以下の通りでした。

```javascript
    // assert charset per RFC 7159 sec 8.1
    var charset = getCharset(req) || 'utf-8'
    if (charset.substr(0, 4) !== 'utf-') {
      debug('invalid charset')
      next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', {
        charset: charset,
        type: 'charset.unsupported'
      }))
      return
    }
```

https://github.com/expressjs/body-parser/blob/1.19.0/lib/types/json.js#L127

ちなみに、ソースコードにはRFC7159と記載されていますが確認したところ既に廃止されて、RFC8259に置き換わっていました。
ざっくり内容を見たけど、JSONは基本的にutf-8を使用する必要があるため、ライブラリでエラーにしてそうです。（基本的にと書いたのは以前は指定なかった感じなので）

https://tex2e.github.io/rfc-translater/html/rfc8259.html#8-1--Character-Encoding

## 対策方法

Nest.jsの例外フィルターに`http-errors`パッケージの`HttpError`クラスを追加してハンドリングするようにします。


```javascript
import { Catch, ExceptionFilter, ArgumentsHost, HttpException } from '@nestjs/common'
import { HttpError } from 'http-errors' // http-errorsの例外クラスをインポート

@Catch()
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: any, host: ArgumentsHost) {
    const ctx = host.switchToHttp()
    const response = ctx.getResponse()
    const request = ctx.getRequest()

    let status: number
    let message: string

    if (exception instanceof HttpException) {
      // Nest.jsのHttpExceptionをハンドリング
      status = exception.getStatus()
      message = exception.getResponse() as string | object
    } else if (exception instanceof HttpError) {
      // http-errorsのHttpErrorをハンドリング
      status = exception.statusCode || 500
      message = exception.message
    } else {
      // その他の例外をハンドリング
      status = 500
      message = 'Internal Server Error'
    }

    // (ここから先は省略) 
    // 監視用のログ出力、エラーレスポンス返却など
  }
}
```

限定的に対策するなら、`UnsupportedMediaType`クラスでハンドリングするのもありです

```javascript
import { HttpError } from 'http-errors' 
// ↓に書き換え
import { UnsupportedMediaType } from "http-errors"
```

## 最後に

この問題はNest.jsというよりjsonデータを受け付ける際に`body-parser`からの例外をハンドリングできていない場合に発生するので、Expressを利用している場合も発生すると考えられます。

本来、こんな通信をしてくることは無いと思うので対応は必須ではありませんが、ログ監視を考えると正しくハンドリングしておいた方が良いので、関わっているプロジェクトでも心当たりあれば再現確認＆対策検討をしてみてください。

## 参考サイト

https://docs.nestjs.com/exception-filters#exception-filters-1
LateXのテンプレートについて

# はじめに
## 著者
理系．応用化学科3年．物理化学専攻．

## 目的
物理化学では複数の数式を取り扱う．その際にLateXの体系化された手法の方が楽に感じたため，MS WordよりもLateXを使用している．
研究室配属を控え，LateXを用いて複数の文書を作成する際にフォルダ構成などを毎回作成するのが面倒に感じたので自動化を行う．

## 環境
M1 Macbook Air
Lualatex
Python

# プログラムや作業等
## 設定
適当なディレクトリに普段使用するLateXのテンプレートフォルダを作成する．これは自由に後から設定可能．

```
.
└── document/
    └── project_template/
        ├── report.tex
        ├── preamble/
        │   └── preamble.tex
        ├── images/
        │   └── image.png
        ├── data/
        │   └── data.csv
        └── ...
```

上記ディレクトリ構成では，project_template以下がコピーされるようになる．

```python:copy_template.py
#!/usr/bin/env python3

import os
import shutil
from datetime import datetime

def copy_project_template(src_folder):
    """
    特定のフォルダ構成を現在のディレクトリにコピーする。

    Args:
        src_folder (str): コピー元フォルダのパス
    """
    # 現在のディレクトリをコピー先の親フォルダとして取得
    dest_parent_folder = os.getcwd()

    # コピー先フォルダ名にタイムスタンプを追加
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    dest_folder = os.path.join(dest_parent_folder, f"project_{timestamp}")

    try:
        # フォルダのコピー
        shutil.copytree(src_folder, dest_folder)
        print(f"フォルダをコピーしました: {dest_folder}")
    except Exception as e:
        print(f"エラーが発生しました: {e}")

# 使用例
if __name__ == "__main__":
    # コピー元フォルダ（固定パス）
    source_folder = "/Users/ユーザー名/Documents/project_template"

    # 関数の実行
    copy_project_template(source_folder)

```

上記コードをbin内に作成し，bash等の設定を適宜行う．（あまり詳しくないのでここでは説明しない）

```
.
└── users/
    └── ユーザー名/
        ├── bin/
        │   └── copy_template.py
        └── ...
```

最後にスクリプトに実行権限を付与する．

```terminal:ターミナル
chmod +x /Users/ユーザー名/bin/copy_project.py
```

これで設定は終わり．

## 動作テスト
例えば量子化学について新しくレポートを作成することになった際，「量子力学の授業フォルダ」に移動しターミナルで次を実行する．

``` terminal:ターミナル
copy_project.py
```

その結果，「量子力学の授業フォルダ」には次のようなコピーが生成される．

```
.
└── 「量子化学の授業フォルダ」/
    └── project_日付_時間/
        ├── report.tex
        ├── preamble/
        │   └── preamble.tex
        ├── images/
        │   └── image.png
        ├── data/
        │   └── data.csv
        └── ...
```

これでreport.texを編集することにより，スムーズにレポート作成を始めることができる．

## 利点
このコードは元となるフォルダが存在し，プログラム実行毎に確認されているため，latexのプリアンブルを追加する際にpythonのコード自体を編集する必要はなく，フォルダ内を直接編集することで次回以降のコピーを変化させることができるのが便利である．

# 最後に
自分自身の専門が非情報系であるため，もっと良いファイル管理方法がある可能性がある．新たな気づきを得た場合は適宜調整を行おうと思う．

また，本文は「計算化学」授業でpythonを勉強し始めた．それのアウトプットの意味も込めている．
不在時にはひまじんでなければ、Lineに通知するを実装　ステップ２　一時中断。とりあえずは「監視カメラ　ジャンプ　不在時に侵入者がいれば、Line通知」で目的は達成。

参考サイト　で　実施してみるも　以下の結果である。　顔認識から機械学習がうまくいっていないようだ。
参考サイト
https://zenn.dev/ncdc/articles/665eeefb1205ac
現在の状態。　なんでだろう。
![face recognition_screenshot_06.01.2025.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433305/bf56bd2b-a0c6-35d0-0e46-af83b1e797cb.png)

１．仮想環境でホップからやり直してみよう。
picamera2が仮想環境に入らない。どうしよう。　仮想環境でないところで実施するしかない。

色々やってみたが、ひまじんの実力では現時点では無理。　とりあえず。中断。
picamera2でのサンプルが少ないのと、仮想環境で入らないのが厄介。
とりあえずは不在の時に人が侵入したらLine通知するところまではできた。

以下Opencvのインストールでエラーがでたが、再インストールでうまくいった。
```
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.9/dist-packages/cv2/__init__.py", line 181, in <module>
    bootstrap()
  File "/usr/local/lib/python3.9/dist-packages/cv2/__init__.py", line 153, in bootstrap
    native_module = importlib.import_module("cv2")
  File "/usr/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
ImportError: /usr/local/lib/python3.9/dist-packages/cv2/cv2.abi3.so: undefined symbol: __atomic_store
```
```
sudo pip3 uninstall opencv-python 
sudo pip3 install opencv-python
```
【Zotero】Better BibTeXで省略されたジャーナル名を出力したい

# 結論

ZoteroのBetter BibTeXで省略されたジャーナル名を出力したいときにどうすればいいのか結論だけ書きます。


*  `編集`→`設定`→`Better BibTeX`の中の`Automatically abbreviate journal title if none is set explicitly`をオンにする
これで`省略雑誌名`が空欄の場合、省略ジャーナル名が自動生成される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/a9066be2-9c8c-e1ea-860b-a508eddb9168.png)



* `省略雑誌名`の部分に使いたい省略ジャーナル名を入れる、もしくは空欄にする
空欄にするとZoteroが勝手に規則に従って省略してくれるが、不安ならすべて手打ち


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/f07d9b12-9cb4-6374-3a8e-9fe56b489eb1.png)

* 書き出したい論文をすべて選択し、`右クリック`→`選択されたアイテムをエクスポート`→`フォーマット`を`Better BibTeX`に変更→`雑誌省略名を使用`にチェック→`ok`を押して保存


:::note warn
`copy BibTeX to clipboard`では省略された雑誌名が出力されません
:::



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/ecdd648c-93ea-7c32-4650-dd8bc4ec30cc.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/912764f5-f57c-422c-f5de-8c846ea86e2c.png)


* 無事生成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/958a9362-312a-b0ab-97b3-bb649ea342b9.png)




# 参考にしたサイト

https://forums.zotero.org/discussion/93817/how-to-export-bibtex-with-journal-abbreviation


https://retorque.re/zotero-better-bibtex/installation/preferences/export/#automatically-abbreviate-journal-title-if-none-is-set-explicitly


https://forums.zotero.org/discussion/103340/abbreviate-journal-name-when-using-quick-copy-in-better-bibtex


https://github.com/retorquere/zotero-better-bibtex/issues/604

https://github.com/retorquere/zotero-better-bibtex/issues/2147

https://github.com/zotero/zotero/issues/292