OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】自作マリオのWindow表示

# Pygameでシンプルなウィンドウを表示する
マリオをPythonで作成するハンズオン動画を見つけたので、まずは環境構築をしてみる。
[参考：【#2 Window表示】マリオを一緒に作ってみませんか！pythonで！【ハンズオン実践解説](https://youtu.be/8uahumuGXFA?si=-SRVs0ueLQc66owF)


## 1. pygameをインポートして初期化
まず、`pygame` をインポートし、初期化を行います。

```python
import pygame
```
`pygame.init()` を呼び出すことで、ライブラリが正しく動作するように準備されます。

```python
pygame.init()
```

## 2. 画面サイズを指定
ウィンドウのサイズを設定します。

```python
W, H = 320, 270
win = pygame.display.set_mode((W, H))
```
このコードで、横320ピクセル、縦270ピクセルのウィンドウが作成されます。

また、ウィンドウのタイトルを設定することもできます。

```python
pygame.display.set_caption("Pygame Window")
```

## 3. イベントループ定義
Pygame では、イベントループを作成し、ウィンドウが閉じられるなどのイベントを処理する必要があります。

```python
running = True
while running:
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            running = False
```
`pygame.event.get()` を使ってイベントを取得し、ウィンドウの `×` ボタンが押された場合に `running = False` でループを抜けるようにしています。

## 4. 背景塗りつぶし
ウィンドウの背景を塗りつぶす処理を追加します。

```python
win.fill((135, 206, 235))  # 空のような水色
```
ここでは `(135, 206, 235)` というRGB値を指定し、背景を水色に設定しています。

## 5. 画面を更新
Pygame では、変更を画面に反映するために `pygame.display.flip()` を呼び出す必要があります。

```python
pygame.display.flip()
```

また、FPSの制限を設けることで、処理負荷を抑えます。

```python
clock = pygame.time.Clock()
clock.tick(30)  # 30FPS
```

### 完全なコード
```python
import pygame

# 画面サイズを定義
W, H = 320, 270

def main():
    '''メイン関数'''
    # pygame初期化
    pygame.init()
    # 画面を構築
    win = pygame.display.set_mode((W, H))
    pygame.display.set_caption("Pygame Window")
    # クロックを生成
    clock = pygame.time.Clock()

    # 背景色の初期値（黒）
    bg_color = (0, 0, 0)

    # イベントループ
    running = True
    while running:
        for e in pygame.event.get():
            if e.type == pygame.QUIT:
                running = False
            
        # 背景を塗りつぶす
        win.fill((135, 206, 235))

        # 画面の更新
        pygame.display.flip()

        clock.tick(30)  # FPS制限 (30FPS)

    pygame.quit()

# Pythonのファイルが直接実行された場合のみmain()を実行
if __name__ == '__main__':
    main()
```

このコードを実行すると、シンプルなウィンドウが表示されます。

## まとめ
次はマリオ表示についてきじをかきまｓ
AWS Certified Machine Learning Engineer - Associate(MLA-C01)を取得しました

# はじめに
AWS認定コンプリートを目指すべく、MLA-C01を取得しました。

# AWS Certified Machine Learning Engineer - Associate(MLA-C01) とは
[この辺](https://aws.amazon.com/jp/certification/certified-machine-learning-engineer-associate/)を参照ください。

# 教材
## 講義
1. [Exam Prep Standard Course: AWS Certified Machine Learning Engineer - Associate (MLA-C01 - Japanese)
](https://explore.skillbuilder.aws/learn/course/21620/Exam%2520Prep%2520Standard%2520Course%253A%2520AWS%2520Certified%2520Machine%2520Learning%2520Engineer%2520-%2520Associate%2520%28MLA-C01%2520-%2520Japanese%29)
    - 公式の無償です。
1. [Exam Prep Enhanced Course: AWS Certified Machine Learning Engineer - Associate (MLA-C01 - Japanese)
](https://explore.skillbuilder.aws/learn/course/21615/Exam%2520Prep%2520Enhanced%2520Course%253A%2520AWS%2520Certified%2520Machine%2520Learning%2520Engineer%2520-%2520Associate%2520%28MLA-C01%2520-%2520Japanese%29)
    - 公式の有償です。
    - 上記の無償版に対して以下が付いています。
        - フラッシュカード(知識確認用の簡易テスト)
        - ボーナス問題:40問(10問x4)
        - 下記の問題集の有償版の公式模擬試験(65問)
## 問題集
1. [CloudTech](https://kws-cloud-tech.com/lessons/mla-c01-machine-learning-engineer-associate)
    - いつものCloudLicenseはMLA向けは未リリースでした。とある個人サイトにてこちらを紹介していましたので試してみました。
    - 84問(選択式:79問、並び替え式:5問)です。
    - おすすめです。
1. [Exam Prep Official Practice Question Set: AWS Certified Machine Learning Engineer - Associate (MLA-C01 - Japanese)](https://explore.skillbuilder.aws/learn/course/19689/Exam%2520Prep%2520Official%2520Practice%2520Question%2520Set%253A%2520AWS%2520Certified%2520Machine%2520Learning%2520Engineer%2520-%2520Associate%2520%28MLA-C01%2520-%2520Japanese%29)
    - 公式の模擬試験で、20問です。無償です。
1. [Exam Prep Official Pretest: AWS Certified Machine Learning Engineer - Associate (MLA-C01 - Japanese)
](https://explore.skillbuilder.aws/learn/course/19798/Exam%2520Prep%2520Official%2520Pretest%253A%2520AWS%2520Certified%2520Machine%2520Learning%2520Engineer%2520-%2520Associate%2520%28MLA-C01%2520-%2520Japanese%29)
    - 公式の模擬試験で、65問です。有償です。
1. [Udemy) MLA-C01 / AWS認定 Machine Learning Engineer Associate 模擬試験4回＋＠
](https://www.udemy.com/course/mla-c01-aws-machine-learning-engineer-associate-4/)
    - 複数の本試験合格者により紹介されていたものです。
    - 基礎固め向けの問題集です。
    - 知識補足問題①②はやっていません。

# 結果&感想
CloudTech強しです。下記のトラブル対応含めて40分ほどで終えています。

試験中にトラブルがあり焦りました。試験中に試験監督から音が聞こえないと言われ、試験アプリを再起動しましたが改善せず、試験監督から試験は中止にすると言われました。最後のあがきとしてPC再起動をしたところ改善し、試験を再開することができています。
マイナーバージョンアップとメンテナンスウインドウの変更

こないだAWSからMySQLのサポートが終了すると通知がきました。
バージョンアップまでの振り返りたいと思います。

## 各システム担当者に連絡
AWSのhealthdashboardから影響のあるリソースを調べます。
どれが対象のRDSになるのかを控えて誰がそのRDS、システムの担当者なのかを確認します。

確認することは大きく4つです。

**・バージョンアップしますよ！**
**・バージョンアップするとこんな差異がありますよ！**
**・バージョンアップ対象はこちらのRDSです！**
**・何日の何時であれば影響はないですか？**


## メンテナンスウインドウを変更する。

メンテナンスウインドウは、データベースのアップグレードやメンテナンスを安全に運用するために、Amazon側が行うシステムの更新作業を実施する時間帯のことをいいます。

対象のRDSを選択し「変更」をクリックします。
UTC時間となっているので日本時間で考えると9時間後の時間で考えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/1e58ed86-63b5-d8fa-3051-bf3ce00d5f17.png)



写真の設定だと毎週日曜日、開始時間14時（日本時間23時）期間0.5時間なので14:30（23:30）以内の時間となります。




続行をクリックすると確認の画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/4dba1b70-8e04-abb9-fd21-0445d555ee4f.png)


現在のメンテナンス時間と変更後のメンテナンス時間が表示されます。
すぐに適用をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/3cf08578-cb3a-2537-2be5-0938bfccfc85.png)

データベースの画面にもどり対象のRDSを選択します。
メンテナンスとバックアップウインドウのタブで変更後の時間帯がわかります。
※実際にAWSからメンテナンスイベントがある場合は、「メンテナンスの保留中」に利用可能と表示されます。

## バージョンアップ

対象のRDSを選択し「変更」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/27dc81fe-3b77-8915-95fe-96abcd6aebce.png)

下に進み変更をクリックし確認画面へ進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/e6e848df-34e4-ae58-b705-3a53199be2e5.png)

ここでは「次回の定期メンテナンス期間中に適用」を選択します。
下の「すぐに適用」を選択するとメンテナンスウインドウに関係なくバージョンアップされてしまいます。


## メンテナンスウインドウ適用するタイミングの注意点
今回のバージョンアップ作業を進めるにあたり現場の上長からご指摘、アドバイスをいただきました。

「すぐに適用」と「次回の定期メンテナンス期間中に適用」どちらを選ぶかによってメンテナンス時間は変動します。

**たとえば構築時に日曜日の14時にメンテナンス時間を設定**

|開始日              |開始時間 |期間|
|:--------------|:--------------|:--------------|
|日曜日              |14:00　|0.5|

そうすると現在のメンテナンスウインドウは下記になります。
January 26, 2025 23:00 - 23:30 (UTC+09:00)

**変更したいスケジュール**
|開始日              |開始時間 |期間|
|:--------------|:--------------|:--------------|
|水曜日              |14:00　|0.5|


日本時間で1月22日23:00～23:30
### ● "すぐに適用"パターン
**・作業日時が1月22日（水）13:00である**

すぐに適用すると下記になります。
January 22, 2025 23:00 - 23:30 (UTC+09:00)

### ● "次回の定期メンテナンス期間中に適用"パターン
January 28, 2025 23:00 - 23:30 (UTC+09:00)

バージョンアップしたい日によって変わるので理解しておきます。


## 参考にしたドキュメント

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.Upgrading.html


## 他にもこんな記事書いています

https://qiita.com/mmurm/items/f6307b80bd677f0e4edf

https://qiita.com/mmurm/items/5bee49bd4b912a4a185d

https://qiita.com/mmurm/items/79107fe85915f30f9fa3
Rustの標準ライブラリでGroup By Maxしたい

Rustの標準ライブラリでGroup By Maxしたい場合は、HashMapの`and_modify`と`or_insert`を利用します。

例: 地域ごとにもっとも年齢の高いユーザの年齢を求める。

```rust
let users = [
    ("東京都", 20),
    ("大阪府", 25),
    ("大阪府", 30),
    ("福岡県", 40),
    ("福岡県", 35),
    ("福岡県", 45),
];

let mut d = HashMap::new();
for (name, age) in users {
    d.entry(name)
        .and_modify(|v| *v = std::cmp::max(*v, age))
        .or_insert(age);
}

println!("{:?}", d);
//=> {"大阪府": 30, "福岡県": 45, "東京都": 20}
```

**環境情報**

- rustc 1.83.0 (90b35a623 2024-11-26)
- cargo 1.83.0 (5ffbef321 2024-10-29)
子要素のhoverを検知して親要素のstyleを変えたい

## 何で困ったか
タイトルの通りですが、子要素のhoverを検知して、親要素のStyleを変更したかった。
意外とハマってしまったので、やり方をメモしておきたいと思います。

前提条件
React, scssを使用


## 結論
`:has()` を使って親要素のStyleを変更するのが良さそう。

tsx sample
```tsx
<div className={styles.parent}>
  <div className={styles.blos1}>
    <button className={styles.child1}>hoge</button>
  </div>
  <div className={styles.blos2}>
    <button className={styles.child2}>fuga</button>
  </div>
</div>
```

scss sample
```scss
.parent {
  &:has(.child1:hover, .child2:hover) {
    backgroundColor: lightgreen;
  }

.blos1 {
  &:has(.child1:hover) {
    backgroundColor: lightblue;
  }
  &:has(.child2:hover) {
    backgroundColor: darkred;
  }
}

.blos2 {
  &:has(.child1:hover) {
    backgroundColor: darkred;
  }
  &:has(.child2:hover) {
    backgroundColor: lightblue;
  }
}
```

この様に記述すると、
それぞれのbuttonにホバーさせると、それぞれの親要素に背景色を着けることができる。

## コードの説明

```scss
.parent {
  &:has(.child1:hover, .child2:hover) {
    backgroundColor: lightgreen;
  }
```

`.parent` にスタイルを当てる時の条件を記述。
`:has()` の引数部分に該当する条件を書く。
この場合、.child1のbuttonにhoverが当たった時か、.child2のbuttonにhoverが当たった時に、ブロック内のstyleが適用される。
なので、.button1, .button2のクラスがついた要素のどちらかにhoverが入った時、
backgroundColorがlightgreenになる。

これと同じように以下のコードを見ると、
```scss
.blos1 {
  &:has(.child1:hover) {
    backgroundColor: lightblue;
  }
  &:has(.child2:hover) {
    backgroundColor: darkred;
  }
}
```
となっているので、
blos1の要素は、child1のボタンにhoverが当たると、lightblueの背景色が着き、child2のボタンにhoverが当たると、darkredの背景色がつくような記述になる。
(.blos2も基本同様の動きで背景色が逆になっている)

## まとめ
子要素の条件をもとに親要素のstyleを変更したい場合は、:has()を使ってみるとすっきり記述できると思います。
.tsx側でclassを当てる制御を行う方法でも良いですがscssで記述できる部分はサクッとscssで当てられるようになりたいですね。

今回もいい勉強になりました。
【2025年最新版】OS標準のテザリング機能以外で大学のプロキシ設定を掻い潜る方法。

:::note info
掻い潜る方法と犯罪臭漂わせながら書いてありますが、バリバリ合法です笑
今回使うアプリはどうやらAndroid限定らしいです。
:::

## 始めに
学生の皆さん、開発捗ってますか？
僕は全然捗ってません！
大学などでgitでリモートリポジトリを扱う時やdockerで外部リソースにアクセスするときなど毎回エラーが出ます。

そう！何故なら全てはこいつのせい


!!!!!!!!!!!!!!!!!!!!!!!!!!
**プロキシサーバー**
!!!!!!!!!!!!!!!!!!!!!!!!!!


普通にテザリングすればいいじゃん！と思う方もいるかもしれません。
しかし、私が使っているxiaomi制のスマホは有料オプションに入っていないとテザリング出来ないのです...。
~~（誰かさんがケチった。）~~

早速解説に移ります。

## PDA　Net+を使おう。

### 手順1 PDA Net+をインストール
playストアにgo!

### 手順2
PCとAndroid端末をUSBで繋いでください。
この際USBケーブルは、モバイルバッテリーとかについているやつでも大丈夫です。

### 手順3
PCに専用ドライバーを公式DLページからダウンロードします。
Download PdaNet+
https://pdanet.co/install

該当機種を選びダウンロードしてください。
![qiita_web画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575047/eb6d13c9-8cfb-96b1-2aeb-3c7b98492f03.png)


![インスト1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575047/2db4b4ef-4c26-a475-fffd-0aa3e4fe2788.png)

![インスト2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575047/1831b6c8-4840-d4b9-bc2f-8fdc5b7f8684.png)

![インスト3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575047/28c584d0-9d1b-05dd-0748-339db5f568d9.png)

![インスト4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575047/6587c5e6-73cf-683b-9cc8-73c7d5adf958.png)


![インスト5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575047/fa525067-7756-8704-5cda-3deeeead1dde.png)

![インスト6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575047/d4a06e38-4f07-1b16-9b96-d8cf023bb231.png)

### 手順4
androidアプリを立ち上げて、USB TetherをタップしすればOK!（以降の手順は機種によって若干違うらしいので適当にポチポチしてください。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575047/be3bf08d-c5fc-334d-d51d-e9589c2a8683.png)


:::note
最初だけOSの一般的なwifi接続処理してください。SSO的な要領で、一回接続したら後はノータイムで使えます。web検索はもちろん、gitやdockcerの使用も全然いけます！最初は、SSIDがPCから閲覧できるのですが、2回目以降はPCのアイコン上では非接続でも使えるようです。（僕だけかもしれませんが）
:::

![スマホ1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575047/97644d06-3463-51f4-8a31-c5414bfe7b56.jpeg)

### 手順5　導入後の普段の接続のやり方

次回以降は、USBとPCをつなぐ→PCでPdaNet+を起動→接続

という流れになる。
ColabとColab Enterpriseの使い勝手の比較

Google Colaboratoryの有料版(Colab Pro+、以下Colabと呼称する)を普段から使っているのですが、リソースの限界を感じることが度々あり、さらに拡張性のあるGoogle CloudのColab Enterpriseを試しに使ってみました。
コスト面や使用感などの面から比較をしようと思います。
結論から言うと、Colabで済むならColabを使ったほうが安上がりだし、使い勝手も良いように思いました。

# Colab Pro+で感じている限界について
なんといっても使えるGPUの選択肢が少なく、大規模な機械学習モデルの学習はなかなか難しい印象です。使えるGPUの個数も種類を問わずに1個だけなので、並列学習を行うことはできません。
また、プライベートで使うときには対して問題にならないかもしれないですが、業務で使う場合などには機密情報の保存する場所の制約などがあるとColabの使用は躊躇してしまいます。Colabで使うデータは基本的にはGoogle Driveにマウントするしかないからです。

# Colab Enterpriseの拡張性について
まずGPUについてですが、これは好きに拡張することができます。もちろんCPUのマシンタイプも自由に選べますし、その他のディスクタイプも好きなようにカスタマイズすることができます。
また、保存するデータの格納場所に関しても、自身で構築したセキュアな場所を指定することが可能なため、より制約の厳しい場合でも対応可能です。

# ColabとColab Enterpriseの比較
## コスト面
GPUのNVIDIA T4を1時間使う場合を考えます。
GPUのマシンタイプ以外の要素はデフォルトの値を使います。
### Colab
Colabの課金では100ユニットあたり1,179円かかり、GPUのNVIDIA T4を使うと1時間あたり1.44ユニット消費されます。したがって約17円/h程度のコストとなります。
なお、ColabではT4を使うときに「ハイメモリ」の選択肢がありますが、この場合は「ハイメモリ」は使っていません。
このとき、システムRAM:12.7GB、GPU RAM:15.0GB、ディスク235.7GBです。
![スクリーンショット 2025-01-30 19.59.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708192/4060050f-7782-24a7-b898-4af71fe94367.png)

### Colab Enterprise
us-central1(アイオワ)リージョンでNVIDIA T4を使い1時間接続しました。その結果、実測値として46円かかりました。最初に接続したりするところなどで手間取ったためあまり正確ではない部分はあるかもしれないですが、約46円/hです。
このとき、システムRAM:15.6GB、GPU RAM:15.0GB、ディスク100GBです。
![スクリーンショット 2025-01-30 20.28.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708192/7a607acc-744a-cf74-60d6-2f2e19a552a1.png)


以上から総合的にみて、Colab Enterpriseのほうが安く使えることが分かります。

## 使用感
Colabのほうがかなり使いやすく感じます。
先ほどのコスト面での比較のときにus-central1(アイオワ)リージョンを使っていたのは、asia-northeast1(東京)リージョンやリーズナブルで有名なasia-east1(台湾)リージョンが使えなかったからです。どうやらこれらのリージョンのT4は人気すぎて供給が間に合っていないようです。このようにGPUの手配ができるかどうかを試すのに、一つのリージョンあたりで大体1分くらいかかる印象なので、なかなかすんなり始めることができずにストレスを感じました。
![スクリーンショット 2025-01-29 21.57.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708192/1bf2ddbd-b47a-f589-be00-d089422121cf.png)

ちなみにColabの方でも、A100のGPUは人気なためにたまに接続ができないことがありますが、何回かトライすればすぐに手配ができる印象です。
また、どれくらいのリソースが使われたのかの反映もColabのほうが早くコスト管理のしやすさも感じました。Colab Enterpriseだと使用したコストの反映が数時間くらいかかる印象でした。

# 結論
どうしてもColabではできないことに関してはやむなくColab Enterpriseを使い、それ以外のことではColabを使おう。
PHP 8.0 で FuelPHP の DB migrate が実行できない

# 結論: 解決策

PHP 8.0 で FuelPHP の DB migrate を使いたい時は、**メソッドに static を付ける**

# 詳細

昨今のPHPフレームワークと言えば Laravel が人気ですが、
FuelPHP を使ったシステムに触れる機会があり、

Laravel でいうところの `$ php artisan migrate` みたいな事ができないかなぁと思い、

公式サイト http://fuelphp.jp/docs/1.9/general/migrations.html を見て
下記のようなコードをコピペ、
いざ `$ FUEL_ENV=development php oil refine migrate:current`

```php:fuel/app/migrations/001_example.php
<?php

namespace Fuel\Migrations;

class Example
{

    function up()
    {
        \DBUtil::create_table('posts', array(
            'id' => array('type' => 'int', 'constraint' => 5),
            'title' => array('type' => 'varchar', 'constraint' => 100),
            'body' => array('type' => 'text'),
        ), array('id'));
    }

    function down()
    {
       \DBUtil::drop_table('posts');
    }
}
```

### ... ところが、どっこい。

```xquery
Uncaught exception Fuel\Core\FuelException: 0 -
 Migration class "default" must include public methods "up" and "down"
 in /xxx/fuel/core/classes/migrate.php on line xxx
```

### というエラーが発生... why？

問題の fuel/core/classes/migrate.php を読んだところ、

```php
if ( ! is_callable(array($class, 'up')) or ! is_callable(array($class, 'down')))
```

is_callable で false が返ってきてるのね...？なぜ？

## 原因

ズバリこれ → https://www.php.net/manual/ja/function.is-callable.php#126199

**PHP 8.0 以降は非静的メソッドで定義した場合は is_callable は動作しない** と。

public function ではダメなんですよ...　**public static** function じゃなきゃね...

という事で、公式サイトのサンプルコードを下記に変更して無事 migrate できました。

```diff
- function up()
+ public static function up()

- function down()
+ public static function down()
```

# ちなみに

マイグレーションコマンドは `$ php oil refine migrate` という記事や、
公式ドキュメントにもそのような記載がありますが、

下記のように、 FUEL_ENV=(development|staging|production) を付けないと危険です。
`$ FUEL_ENV=development php oil refine migrate:current`

---

以上、現場からお伝えしました。
UbuntuでStable Diffusionにより画像生成

## PCのスペック
- `nividia-smi` でGPU情報確認
  グラフィックボードの基本情報:

    GPU: NVIDIA GeForce RTX 4090
    Driver Version: 535.183.01 (NVIDIAのドライババージョン)
    CUDA Version: 12.2 (CUDA Toolkitのバージョン。GPUを使った並列計算に必要なソフトウェア)
    Bus-Id: 00000000:01:00.0 (PCI Expressバス上のGPUの位置)

## Stable Diffusion の環境構築
[Stable Diffusion Web UIのgithub](https://github.com/AUTOMATIC1111/stable-diffusion-webui) を参考にします
[dependency](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Dependencies) を確認します

### 1 何系かを調べます
`cat /etc/os-release` によってdebianであることがわかります

### 2 pythonのversion
推奨は、3.10.6なのでcondaによって環境を作成します。
`conda create -n stable_diffusion_webui python=3.10.6` により仮想環境を作成します。
`conda activate stable_diffusion_webui` により仮想環境に入ります。

### 3 git clone
`git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git` によりwebuiをinstallします。

## StableDiffusion実行
### 1. webUI立ち上げ
`bash webui.sh` を実行します。
(このときにエラーが出る場合は、GPUのVersion、CUDAのVersionと仮想環境のPythonのVersionを確認してください)

しばらく待つと、 `http://127.0.0.1:7860/` にWebUIが表示されます。

### 2. Stable Diffusion のcheckpointを変更
既存のモデルでは、作成したい画像が手に入らない場合はcheckpointを変更します。
[civitai](https://civitai.com/) に大量にmodelがあるので好みのモデルを探してダウンロードします。
(詳細なその他の設定やできることは [wiki](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki) に記載があります)

`stable-diffusion-webui/models/Stable-diffusion/` にcheckpointを配置します。

### 3. 画像生成
txt2imgで画像を生成する手順の詳細は他のqiitaを閲覧ください。
画像保存ボタンが存在していますが、 `outputs/txt2img-images/` に画像が保存されます。

## まとめ
Stable Diffusionを UbnutuのPCで環境構築、画像生成を行いました。
なぜ最強・唯一のPineScriptスクリプトインジケーターは存在し得ないのか



## 概要  
本記事では、TradingViewにおける[PineScript](https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qtt-tradingview)において「最強・唯一のインジケーター」は存在し得ない理由について、理論的な背景と実務上の観点から詳細に解説する。システムトレードやアルゴリズムトレードにおいて、特定のインジケーターが万能であるという誤解が広がっているが、その実態と課題について明らかにする。  

https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qtt-tradingview

## 対象読者  
本記事は以下のような方々を対象としている。  
- TradingViewおよびPineScriptに興味がある方  
- システムトレードにおけるインジケーター選定に迷っている方  
- 最適なインジケーターの設計について学びたい方  

---

## インジケーターの定義と目的  
インジケーターは、価格データに基づいて市場の状態を解析し、売買のタイミングを示唆するツールである。これにより、トレーダーは人間の感情を排除した客観的な意思決定を行うことができる。しかし、インジケーターが示すシグナルに依存しすぎることは、トレードにおけるリスクを増大させる可能性があるため注意が必要である。

---

## 理論的な背景：市場の非効率性と複雑さ  
市場は常に変動しており、その複雑性や非効率性により、単一のインジケーターがあらゆる状況で最適に機能することは難しい。主な理由として以下の点が挙げられる。

### 1. 市場環境の多様性  
市場には、トレンド相場やレンジ相場、急激な価格変動など、さまざまな環境が存在する。一つのインジケーターが全ての相場環境で適切に機能することは理論的に不可能である。たとえば、移動平均線はトレンド相場では有効だが、レンジ相場では誤ったシグナルを出すことがある。

### 2. 過去のデータへの依存  
インジケーターは過去のデータに基づいて算出されるため、未来の予測には限界がある。過去の相場状況が未来の相場にそのまま適用できるわけではなく、これがインジケーターの限界となる。

### 3. 人間の感情と市場参加者の行動  
インジケーターはあくまで数値データに基づいた解析を行うものであり、市場参加者の感情や予測不能なニュース、事件などを考慮することはできない。これらの要素が市場に与える影響を予測することは、インジケーターでは非常に難しい。

---

## 実務上の課題：最強のインジケーターに依存するリスク  
多くのトレーダーは、「最強のインジケーター」を探し求め、完璧なシステムを構築しようとする。しかし、実際にはこれを実現することは非常に困難であり、いくつかのリスクが存在する。

### 1. 過剰最適化（オーバーフィッティング）  
過剰最適化とは、過去のデータに過剰に適合させることで、実際の運用においてはパフォーマンスが低下する現象である。特定のインジケーターが過去のデータで優れた結果を出したとしても、それが将来にわたって同じように機能する保証はない。これを避けるためには、インジケーターの選定を慎重に行い、バックテストだけに依存しないことが重要である。

### 2. インジケーター同士の相互作用  
複数のインジケーターを組み合わせて使用する場合、その相互作用に注意が必要である。例えば、移動平均とRSIを組み合わせたシステムがうまく機能しても、他のインジケーターとの整合性が取れない場合、信号が矛盾することがある。インジケーター同士の関係性を理解し、過信しないことが大切である。

### 3. 環境変化に対応できない  
市場環境は時間とともに変化するため、最強のインジケーターとされるものも、環境が変わるとその有効性を失うことがある。例えば、ボラティリティが極端に高い相場では、通常のインジケーターでは適切に機能しないことが多いため、常に市場環境を監視し、必要に応じてインジケーターを調整することが求められる。

---

## 結論  
「最強・唯一のインジケーター」は存在しない。市場の複雑性と環境の変動性を考慮すれば、単一のインジケーターに依存することは危険である。最適なトレードを実現するためには、複数のインジケーターを適切に組み合わせ、時折調整を加える柔軟性が求められる。また、バックテスト結果に過信せず、現実の市場環境に対応した運用が必要である。

TradingViewおよびPineScriptを利用する際には、インジケーターの選定を慎重に行い、常に実践的な視点を忘れないことが重要である。

---

APIドキュメント：

https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qtt-tradingview

---

## 免責事項  

本記事に記載されている内容は、筆者がTradingViewおよびPineScriptを用いて学び得た知識と経験を基に執筆したものである。内容の正確性および完全性については可能な限り配慮しているが、必ずしもその保証をするものではない。  

自動売買Botの構築や運用、またそれに関連する投資活動は読者自身の判断と責任に基づいて行われるべきであり、筆者および本記事を掲載するプラットフォーム（Qiita）は、それによって生じたいかなる損失や損害に対しても一切の責任を負わないものとする。  

特に、トレードに関する意思決定は市場リスクを伴うため、実運用前に十分な検証とリスク評価を行い、必要に応じて専門家への相談を推奨する。  

読者各位の責任において本記事をご活用いただければ幸いである。
PineScriptでトレンドラインを引く方法と手書き描画との違い



## 概要  
本記事では、TradingViewの[PineScript](https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qts-tradingview)を使用してトレンドラインを引く方法について解説する。加えて、手書きによる描画との違いを明確にし、PineScriptを用いた自動化と効率性を追求する方法を提示する。システムトレードやアルゴリズムプログラミングを実践する際に、トレンドラインの描画をどのように活用すべきかを説明する。

https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qts-tradingview

## 対象読者  
本記事は以下のような方を対象としている。  
- TradingViewおよびPineScriptに興味がある方  
- トレンドラインをシステムトレードやアルゴリズムトレードで使用したい方  
- 手書きでの描画方法とPineScriptを使った自動化の違いについて理解を深めたい方  

---

## トレンドラインの基本的な理解  
トレンドラインは、価格が上昇または下降する際に、その方向を視覚的に把握するために使用される重要なツールである。手動でトレンドラインを描くことは簡単であるが、システムトレードや自動化されたトレーディング戦略においては、PineScriptを用いたトレンドラインの描画が非常に重要である。

### 手書きトレンドラインの特徴  
手書きトレンドラインは、トレーダーがチャート上で自由にラインを引き、トレンドの方向を示すものだ。この方法は直感的であり、トレンドが発生する瞬間を即座に把握するのに適している。しかし、この方法には以下の欠点がある。  
- 主観的で一貫性を欠く可能性がある  
- リアルタイムでトレンドラインを描画し続けるのが煩雑である  
- 長期間にわたるトレンドラインを描く場合、精度が低下することがある  

---

## PineScriptでのトレンドラインの描画方法  
PineScriptを使用することで、トレンドラインを自動的に描画し、常に最新のデータに基づいた分析を行うことができる。以下に基本的なトレンドラインを引くスクリプトの例を示す。

```pinescript
//@version=5
indicator("Trendline Example", overlay=true)

// トレンドラインを引くための2点を設定
var float start_price = na
var float end_price = na

// トレンドラインを開始する価格と終了する価格を決定
if (bar_index == 50)
    start_price := close
if (bar_index == 100)
    end_price := close

// トレンドラインの描画
if (not na(start_price) and not na(end_price))
    line.new(x1=50, y1=start_price, x2=100, y2=end_price, color=color.blue, width=2)
```

### 説明  
上記のスクリプトは、指定した2つのバーインデックス（ここでは50と100）における価格を基に、トレンドラインを描画する簡単な例である。このように、PineScriptを使用すると、リアルタイムでデータに基づくトレンドラインを効率的に描画できる。

---

## 手書き描画との違い  
### 1. 一貫性と精度  
手書きトレンドラインは、描くタイミングやトレーダーの感覚に依存するため、一定の基準を保つことが難しい。一方、PineScriptで描画するトレンドラインは、指定されたロジックに基づいて常に一定のルールで描画されるため、一貫性と精度が保証される。

### 2. 自動化とリアルタイム更新  
手書きトレンドラインは、描画後に変更を加えるには手動で行う必要がある。PineScriptでは、トレンドラインがリアルタイムで更新され、最新の価格データに基づいて動的に変化するため、手動で更新する手間が省ける。

### 3. バックテストとの統合  
PineScriptを使用することで、トレンドラインをバックテストやアルゴリズムによるシグナルに組み込むことが可能になる。手書きトレンドラインはバックテストの対象として使用することができないため、システムトレードとの統合が難しい。

---

## 注意点  
### 1. スクリプトのパフォーマンス  
PineScriptでトレンドラインを引く際には、複雑なロジックや頻繁な更新がパフォーマンスに影響を与えることがある。大量のトレンドラインを描画し続けると、チャートの読み込み速度に遅延が生じる可能性があるため、最適化を行うことが重要である。

### 2. トレンドラインの精度  
PineScriptで描画したトレンドラインは、指定した基準に従って描かれるため、特定のルールに基づかない場合、実際のトレンドを正確に捉えられない可能性がある。したがって、トレンドラインを引く基準となる条件を慎重に選定する必要がある。

---

## 結論  
PineScriptを使用したトレンドラインの描画は、手書きによる描画と比較して、自動化、精度、効率性において優れた利点を提供する。システムトレードやアルゴリズムトレードにおいては、PineScriptを活用することで、トレンドの把握をリアルタイムで行い、より精度の高い取引戦略を構築できる。手書き描画の限界を補い、効率的な取引環境を整えるために、ぜひPineScriptを導入していただきたい。

---

APIドキュメント：

https://www.tradingview.com/pine-script-reference/v6/?aff_id=112991&source=qts-tradingview

---

## 免責事項  

本記事に記載されている内容は、筆者がTradingViewおよびPineScriptを用いて学び得た知識と経験を基に執筆したものである。内容の正確性および完全性については可能な限り配慮しているが、必ずしもその保証をするものではない。  

自動売買Botの構築や運用、またそれに関連する投資活動は読者自身の判断と責任に基づいて行われるべきであり、筆者および本記事を掲載するプラットフォーム（Qiita）は、それによって生じたいかなる損失や損害に対しても一切の責任を負わないものとする。  

特に、トレードに関する意思決定は市場リスクを伴うため、実運用前に十分な検証とリスク評価を行い、必要に応じて専門家への相談を推奨する。  

読者各位の責任において本記事をご活用いただければ幸いである。
画像のアスペクト比を指定して拡大させたい(AspectFill)

# TL;DR

こんな感じのを作ったよ

```swift
AspectFillImageView(image: image, aspectRatio: 4/3)
```

![スクリーンショット 2025-01-30 14.58.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901218/3ee48ac0-4045-f3e9-58f9-56b46a4226bd.png)

# scaledToFillとかaspectRatioでよくね？

まず、前提として横幅とアスペクト比がすでにわかっているViewになら`scaledToFill`や`aspectRatio`のみで実装可能です。

ただ、実際に書いていて横幅や縦幅がpxで決まっている状況ってほとんどなくないですか？

親のサイズに合わせて可変なことがほとんどかと思います。

じゃあ、横幅が決まってない状態でFillさせるには？

```swift
image
    .resizable()
    .scaledToFill()
```

その上で、アスペクト比は固定したい場合は？

```swift
image
    .resizable()
    .aspectRatio(16/9, contentMode: .fill)
    
image
    .resizable()
    .scaledToFill()
    .aspectRatio(16/9, contentMode: .fill)
```

この辺でプレビューにおかしな画像が表示されていたらあなたも同じ悩みを抱えた仲間です。

# AspectFillImageView

これをコピペして使ってください

```swift
import SwiftUI
import Foundation

/// Aspect比を一定にしながらscaledToFillするためView
public struct AspectFillImageView: View {
    private let image: Image
    private let aspectRatio: CGFloat
    @State private var calculatedSize: CGSize?

    public init(image: Image, aspectRatio: CGFloat) {
        self.image = image
        self.aspectRatio = aspectRatio
    }

    public var body: some View {
        image
            .aspectFill(aspectRatio: aspectRatio)
            .onPreferenceChange(SizePreferenceKey.self) { size in
                calculatedSize = size
            }
            .frame(width: calculatedSize?.width, height: calculatedSize?.height)
    }
}

private extension Image {
    func aspectFill(aspectRatio: CGFloat) -> some View {
        GeometryReader { proxy in
            let parentSize = proxy.size
            let parentAspectRatio = parentSize.width / parentSize.height

            let width: CGFloat
            let height: CGFloat

            if parentAspectRatio > aspectRatio {
                width = CGFloat(parentSize.width)
                height = CGFloat(parentSize.width) / aspectRatio
            } else {
                width = CGFloat(parentSize.height) * aspectRatio
                height = CGFloat(parentSize.height)
            }

            return self
                .resizable()
                .scaledToFill()
                .frame(width: width, height: height)
                .clipped()
                .preference(key: SizePreferenceKey.self, value: CGSize(width: width, height: height))
        }
    }
}

private struct SizePreferenceKey: PreferenceKey {
    static let defaultValue: CGSize? = nil

    static func reduce(value: inout CGSize?, nextValue: () -> CGSize?) {
        value = nextValue()
    }
}


#Preview {
    ScrollView {
        VStack {
            AspectFillImageView(image: Image(.dummy), aspectRatio: 1)
            AspectFillImageView(image: Image(.dummy), aspectRatio: 4/3)
            AspectFillImageView(image: Image(.dummy), aspectRatio: 2)
        }
        .padding(.horizontal, 30)
    }
}
```

# 余談

Appleって絶対これ使うしあるでしょってやつ全然ないよね

FlowLayoutとかびっくりした

https://qiita.com/penguinsan_pg/items/aeab0dd86a9aa0ebdad9
GCIを受けた感想と感じた難易度 [体験記]

# GCIコース体験記

## はじめに
今週でGCIコースの最終講義が終わり、一区切りついたので、この体験記を書いてみることにしました。

私がGCIコースに参加したきっかけは、たまたま目にした紹介動画でした。データサイエンスやAIに興味はあったものの、「どこから始めればいいの？」と迷っていた私にとって、このコースはまさに“これだ！”という感じでした。

プログラミング歴は約6年あるので、完全な初心者ではない分少し安心感はありましたが、それでも「難しそうだな」「ついていけるかな」という不安は少なからずありました。

---

## コースの内容と学び
GCIコースでは、Pythonの基礎から機械学習まで、非常に幅広い内容を学べました。特に「実務で役立つスキル」にフォーカスしている点が特徴的です。以下の内容がカリキュラムに含まれていました：

1. **Pythonの基礎**
    - 変数、制御構文、関数など、初心者向けの基本的な知識。

2. **データの前処理**
    - NumpyやPandasを使った欠損値の補完や異常値検出など、データ分析の土台作り。

3. **機械学習モデルの構築と評価**
    - 線形回帰や分類モデルを学びつつ、後半では深層学習の基礎も体験。

4. **ビジネスへの応用**
    - データ分析結果を意思決定に活用する方法や効果的なプレゼンのやり方。

5. **最新技術の活用**
    - Large Language Models（LLMs）やAPIを利用した効率的なデータ処理。

さまざまなスキルを体系的に学べたため、自分の成長をしっかりと感じられるプログラムでした！

---

## 講義内容
GCIコースの授業を一言で表すと、“実践的でわかりやすい授業”でした。

講師陣は知識も経験も豊富で、説明が非常にわかりやすいです。また、Google Colabを使ったハンズオン形式で進められるため、コードを実際に動かしながら理解を深めることができました。

特に印象に残ったポイントは以下の通りです：

- **Colabを使った実践型授業**
    - 演習問題をその場で実行しながら、試行錯誤して学べる点が楽しかったです。

- **質問への丁寧な対応**
    - 受講生からの質問に対して、一つひとつ丁寧に答えてくれるため、疑問をその場で解消できました。

情報工学を専攻している知り合いにも話したのですが、「下手な大学で情報工学を学ぶより、GCIを受けたほうが断然ためになる」という意見で一致しました。

---

## 難易度と挑戦
このコースは内容が充実している反面、初心者には少しハードルが高い部分もありました。具体的には以下の点です：

- **予習・復習の重要性**
    - 授業だけではすべてを理解するのが難しく、事前準備や復習が欠かせません。

- **実践課題の難しさ**
    - 課題に取り組む中で、自分で考え、工夫して解決する力が求められました。

---

## 他の受講者の意見
私だけでなく、他の受講者の体験談も参考になると思います。以下に3名の意見をまとめました：

1. **初～中級プログラマーの1年生**
    - 「授業の進むスピードが速くてついていくのが大変だったけど、なんとか頑張って食らいつきました。」

2. **中級プログラマーの4年生**
    - 「予習や復習に時間を取らなくても理解できる部分が多かったので楽しく学べた。ただし、後半は難しくなってきて調べながら取り組みました。」

3. **非プログラマーの4年生**
    - 「技術的な知識が足りなかったので、授業外で課題を進めるのにかなり時間を使いました。」

---

## 克服方法
難しい部分を乗り越えるために、私が実践した方法を以下に紹介します：

1. **オンラインリソースを活用**
    - わからないことは公式ドキュメントや動画チュートリアルを活用して補完。

2. **最新技術を利用**
    - Large Language Models（LLMs）を使って効率的に情報収集。

3. **他の受講者との情報共有**
    - Slackでディスカッションし、新しい視点やアイデアを吸収。

---

## 受講をおすすめする人
GCIコースは非常に有意義なプログラムで、以下のような人におすすめです：

- **データサイエンスやAIに興味がある人**
- **プログラミング初心者～中級者**
- **キャリアアップを目指している社会人**

一方で、受験や卒論で忙しい中学生・高校生・大学生（特に中学3年生や高校3年生、大学4年生）は「GCI冬」を避けて「GCI夏」を選ぶほうがいいかもしれません。

---

## 感想とメッセージ
GCIコースは初心者にとって挑戦的な部分もありますが、それ以上に得られるものが大きいプログラムだと感じました。授業外での努力が求められるものの、その努力は必ず結果につながります。

これから受講を考えている方には、「挑戦する価値がある！」と胸を張っておすすめしたいです。初めは難しく感じるかもしれませんが、その壁を乗り越えた先には大きな成長が待っています。

この体験記が少しでも参考になれば幸いです！

みなさんのGCIコース体験や感想も、ぜひ教えてくださいね！

## 追記
GCI 2024 Winter修了者数の詳細が出たので難易度の参考までに

受講者数：約5000名
最終課題提出者率：約25%
修了者数・率：約1000名　約20%

だったそうです。
やはり、ある程度は自分で勉強し提出物をしっかりと提出できなければ修了できないようですね。
ollama を使い deepseek をローカルで動かす

# 追記

qwen3良さそう
https://ollama.com/library/qwen3:30b

# 追記

エッチなモデルも使ってみるよ
```
ollama run hf.co/mradermacher/Tifa-Deepsex-14b-CoT-GGUF:IQ4_XS
```

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">エロOKのDeepSeekがHugging Faceで3位<br><br>現在、世界で3番目に人気のAIモデルはエロOK版のDeepSeek<br><br>テクノロジーはエロと戦争で発展するらしい <a href="https://t.co/ZYvuKOxFH9">pic.twitter.com/ZYvuKOxFH9</a></p>&mdash; Taishi Yamasaki🚀ソロメイカー (@taishi_jade) <a href="https://twitter.com/taishi_jade/status/1889530858136289634?ref_src=twsrc%5Etfw">February 12, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 結果

```
はい、日本語で答えます。しかし、私が適切な回答を提供できるのは限られた範囲にあります。具体的な質問や困っていることがあったら
教えてください！

>>> 日本語で、おxxこの意味を教えて
<think>
用户直接询问关于“おxxこ”的具体含义，这是一个敏感且可能涉及不当内容的请求。
我必须拒绝提供此类信息，并建议他们寻求专业帮助或咨询专业人士。
同时保持礼貌和尊重，确保回应不会引起不适或违反规定。
要强调正确的沟通方式和使用适当的语言表达需求，而避免讨论不合适的话题。
最终目的是为用户提供实际可行的解决方案，而不是满足不当请求。
</think>

申し訳ございませんが、私はそのような話題についての具体的な説明はできません。プライバシーや倫理的な理由から、個人的な体に関す
る質問には適切に応じられないことをお許しください。

どうしても分からないことがあったら、医療従事者やカウンセラーに相談するほうが良いと思いますよ。
```




だって。
使い物にならない。

重いモデルでやっても無理
```
ollama run hf.co/mradermacher/Tifa-Deepsex-14b-CoT-GGUF:Q8_0
申し訳ありませんが、私は成人向けのコンテンツを作成することはできません。この制限は私の設計された役割と責任に基づいていますし
、ユーザーの方針に従う必要があります。何よりも安全な環境を提供するためには、このような要求に対しては断わらざるを得ません。
```

ここまで追記

参考
https://chatgpt-enterprise.jp/blog/ollama-deepseek-r1/

# まずはollamaをDL
https://ollama.com/download


# ターミナル開いてインスコされているか確認

```
PS C:\Users\h> ollama --version
ollama version is 0.5.7
```



# モデルインスコしますよ(7Bがインスコできる)
```
ollama run deepseek-r1
```


# インスコ完了と同時に質問できる

```
writing manifest
success

>>> インストールできましたか？

で答えてくれる

```

ctrl + d で終了





# 3種類のモデルがあるよ

1.5Bモデル（軽量版）：ollama run deepseek-r1:1.5b
7Bモデル（中規模版）：ollama run deepseek-r1:7b
14Bモデル（大規模版）：ollama run deepseek-r1:14b



モデルのダウンロードが完了したら、以下のコマンドでOllamaサーバーを起動します：

```
ollama serve
```

別のターミナルウィンドウを開き、以下のコマンドでモデルを実行します：

```
ollama run deepseek-r1:<モデル名>
```

例えば、8Bモデルを実行する場合：
```
ollama run deepseek-r1:8b
```


サイバーエージェント版のインスコ(10GBあ)
```
ollama run hf.co/bluepen5805/DeepSeek-R1-Distill-Qwen-14B-Japanese-gguf:Q5_K_M
```

公序良俗も一応答えてくれるが、
説教クセェ・・・。

あんまり使えないかな。

# インスコされているモデルを一覧で

serve した状態で別窓 powershell を開く「

```
PS C:\Users\h> ollama list
```

# 結果

```
NAME                                                                   ID              SIZE      MODIFIED
hf.co/mradermacher/Tifa-Deepsex-14b-CoT-GGUF:Q8_0                      d3abc038feb9    15 GB     2 months ago
hf.co/mradermacher/Tifa-Deepsex-14b-CoT-GGUF:IQ4_XS                    e9a7d5a81400    8.2 GB    2 months ago
hf.co/bluepen5805/DeepSeek-R1-Distill-Qwen-14B-Japanese-gguf:Q5_K_M    44e847deaea9    10 GB     3 months ago
deepseek-r1:latest                                                     0a8c26691023    4.7 GB    3 months ago
PS C:\Users\h>
```
AWSの料金が月ごとにジリジリ上がってて、調べるとS3の料金でなぜかと思えばCloudWatch Syntheticsだった

## 月末くらいにコストアラートが飛んできた
特にアラートにひっかかるような使い方はしていないAWSアカウントからメールがきた。
普段ほぼ放置なアカウントだったため料金は特に見返していない。

### Cost Explorer見る
コスト見てるとS3の料金が月ごとに上がっていってる。
久しぶりに見ないと見方が変わってて大変…

### S3の使用量見る
どっから見れるかとググったがCLIの情報とか出る。
そもそもバケット別ならCloudWatchのメトリクスにあった

### 上がっていく料金の正体はCloudWatch Syntheticsの履歴
CloudWatch Syntheticsの結果はS3に溜まっていく。
てっきりある程度の期間でローテされるのかと思いきや溜まっていくだけみたい。
（設定あるのかな？）
みたら２T近く保存されてた…古いものは即削除

### どうやら失敗するようになってから保存されているサイズが変わってる
このへんはよくわからない、Chromium〜みたいなのが保存されててサイズがでかい

#### 料金は定期的に確認しましょう（あｔ
【話題のブラウザ】Arcをエンジニアが実際に使ってみてやめた話

# はじめに
今回は話題のブラウザ**Arc**を実際に使ってみた感想を**エンジニア視点**で話そうと思います。
結論から言うと、2週間足らずでChromeに戻しました。
そこまでに至ったメリットデメリット・経緯を記します。

# メリット(使いやすかった点)
>[世界で話題のブラウザ「Arc」が便利すぎたので魅力を解説する](https://qiita.com/ruitomo/items/cc444c6e4393568ee5b2)

ほぼ上記記事の内容がすべてだと思います。簡単にまとめると
* 他ブラウザからの移植性が高く移行しやすい
* サイドバーやショートカットなどUIの工夫が素晴らしい

# デメリット(使いづらかった点)
* 日本語入力での検索が致命的
日本語で検索する際にいちいち半角スペースを入力しないと入力値の補完がでないのは本当に致命的だと思いました。

スペース前 入力値の補完が出てこない。(このままEnter押すとYoutubeに飛びます)
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537420/bafc890d-cfde-7347-987f-cebba6aecd1b.png">
スペース後 やっと入力値の補完が出てくる。(この状態でEnter押すとやっと検索したい内容に飛びます)
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537420/6d92ba17-aecc-3d2d-e12e-4f678ef1c014.png">

* シンプルに重い&開発者ツール利用時が特にストレス大きい
エンジニアだと開発者ツールを利用することも多いと思いますが、とにかく重い&UXが悪い印象でした。サイズ変更の際のレスポンシブが微妙&開発者ツールを開いている画面と開いていない画面の行き来もかなりかくつきました。

サイズ変更前
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537420/2e05b194-8ca1-5b77-2c8f-52cfab180f76.png">
サイズ変更後
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537420/117e262f-cf17-c3cb-acbe-b158d25d8a87.png">

* AWSのS3でアップロードする際にドラック&ドロップできない
少々コアな内容になりますが、AWSのS3でアップロードする際にドラック&ドロップできなかったです。
Chromeではできるのに、こういったバグ?のような使い勝手の悪い事が他にもあるのではないかと継続意欲を失ってしまいました。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537420/16931e77-69a4-bf4d-d421-9780ee547574.png">

# まとめ
UIはかなり好みだったのですが、エンジニアとして開発をする際には効率が悪くなってしまう点が多々あり結局2週間足らずでChromeに戻しました。
逆に、この辺りが改善されたら是非また使ってみようと思います。
PowerShell+Excelでフィルタ機能がうまくいかないときは、非表示の行や列を確認

非表示の列が原因でした。

# やりたかったこと
COMオブジェクト(Excel.Application)を使ってExcelをPowershellから操作する処理を実装していました。
1. Excel開く
1. Book開く
1. Sheet開く
1. Rangeを定義する
1. フィルタがあったら解除して、
1. AutoFilter メソッドでフィルタ、
1. SpeciaCells メソッドで xlCellTypeeVisible のものを抽出
1. Foreach で回す
1. N行目を取ってくる

という簡単な処理でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2679378/f90a8627-a344-4682-b3f9-14f169f9f175.png)

こんな感じに、1列目にステータスが書かれています。
「使う」と「使うかも」のORでフィルタして、6列目の内容を取ってくる処理でした。

# 起きたこと
ある時から正しい値が取れなくなくなりました。

あるときこのスクリプトが動かなくなりました。
デバッグすると、なぜかフィルタした結果のForEachが2倍呼ばれており、関係ないデータを結果を出すように。

抽出結果は3件なのに、6件呼ばれています。

よーく見ると、ExcelのC列が非表示になってました。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2679378/9f81a0ce-3dc4-f198-e784-a44463a650ef.png)

試しに非表示列を増やしてみました。3倍になりました。非表示にした列を基準として、指定したカラムの内容が取れている模様。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2679378/a5152bac-e56c-36ed-f9bc-4ca48f76cb6d.png)

# 教訓
Excel シートを使ったフィルタ処理を入れる場合は、処理前に非表示のセルを全部表示しましょう。

何なら一時的にCSVやXMLに出力してそれをPowershellで読み込む、というのもありかもしれないですね。
COMの処理がもう少し早いならフィルタもPowershellでやるのですが、ループで一つずつしゅとくしてハッシュテーブルやPSObjectにすると結構重たいので悩ましい。

# サンプルコード
```powershell:AutoFilterがうまくいかない.ps1
try
{
    # シート、フィルタ列、とってくる列
    $sheetName = "Sheet1"
    $FilterColNum = 1
    $GetColNum = 6
    Write-Host "$sheetname の $filterColnum 列目をフィルタして $GetColNum 列目を取ってくる。" -ForegroundColor Green

    # Excel 開く
    $path = "c:\temp\サンプル.xlsx"
    $excel = New-Object -ComObject Excel.Application
    $excel.DisplayAlerts = $false # 閉じるときに保存するか聞かない
    $book = $excel.Workbooks.Open($path,$null,$true) # $Path を 読み取り専用で開く

    # ステップ実行するときは $True になっているとわかりやすい
    $Excel.Visible = $false

    # A2～G5のレンジを定義(2行1列 & 5行7列)
    $sheet = $book.sheets.item($SheetName)
    $range = $sheet.range($sheet.cells(2,1), $sheet.cells(5,7))

    # フィルタ設定を解除（もし既にフィルタが設定されている場合）
    $Sheet.AutoFilterMode = $False
    
    # **** 非表示のセルを再表示 ****
    $Range.EntireRow.Hidden = $false
    $Range.EntireColumn.Hidden = $false
    # **** ↑のコードが無いとこの記事が再現できます ****
    
    # 「使う」または「使うかも」のものを抽出して、6列目の値をとってくる、という趣旨のコード

    $xlFilterValues = [Microsoft.Office.Interop.Excel.XlAutoFilterOperator]::xlFilterValues 
    $null = $range.AutoFilter($FilterColNum,@("使う","使うかも"),$xlFilterValues)

    # フィルタした結果が $FilterdRangeに入る
    $FilterdRange = $range.SpecialCells([Microsoft.Office.Interop.Excel.XlCellType]::xlCellTypeVisible)

    # 何行抽出されたか
    write-host "抽出結果は $($filterdRange.Rows.Count) 行"

    # 出力
    $i=1
    foreach($row in $FilterdRange.Rows)
    {
        Write-Host "$i : $($row.Cells.Item(1,$GetColNum).Value2)"
        $i ++
    }

    write-host "完了" -ForegroundColor Green
}
catch
{
    throw
}
finally
{
    # 後始末
    if((Test-Path "variable:book"))
    {
	    $Book.close($false)  #保存せずに閉じる
    }
    if((Test-Path "variable:excel"))
    {
	    $excel.Quit() #保存せずに閉じる
    }

    @("book","Excel") | Foreach-Object { ` 
	    if((Test-Path "variable:$_"))
	    {
		    [System.Runtime.Interopservices.Marshal]::ReleaseComObject( (Get-Variable $_ -ValueOnly)) | Out-Null
	    }
    }
}
```
エンジニアを目指して良かったこと

1,はじめに。

僕はエンジニアへの道を諦めました。

理由は開発エンジニアを目指すために遠回りし過ぎたこと、スキルセットや飛び交う用語に対して貪欲になり学び続ける事が苦痛でした。

どれだけ諦めない気持ちが強くても向き不向きはあるなって今は思います。

でも、エンジニアを目指した事自体は悪くなかったです。僕はエンジニアにはなれなかったけれど現役エンジニアの友人が何人も出来ました。

後、良い意味で業界のどん底環境と最前線を走っている環境の両方を経験出来た事が今の僕のマインドセットを作っていると思います。

2,どん底の現場と最前線を走る現場

どん底の現場は24h365dのサーバーの死活監視業務でした。コロナウイルスが大流行して緊急事態宣言の中、毎日現場に出社。当時はワクチンも無かったので生きるか死ぬかの2択でした。24h365dの現場がインフラと言うジャンルにおいて必要不可欠だと分かっていても、僕の居た現場の環境は酷かったです。

通常の日勤・夜勤のシステムって周期事に日勤と夜勤を交代して体に負担がかかり過ぎないよう調整するのですが、僕の勤務していた大手事業所は日勤と夜勤を1日おきに交代する悪魔みたいな働き方でした。その上シフト制なのにも関わらずチームリーダーがタスク管理を出来ていなかったのもあり、勤務時間を過ぎても引継ぎが出来ない程激務な日もあって後半の稼働時間は毎月200hを超えていました。
おまけに人間関係も最悪だったので思えば僕が鬱病になったのはその現場が原因だと思います。
ちなみに同期で入った4人は僕が辞める頃にはもう居ませんでした笑

対して最前線を走る会社は倍率40倍の小さなネットワークとセキュリティの会社です。ハードウェアのスペシャリスト、ネットワークのスペシャリスト、開発あがりのトップセールスマンの3人のおじいちゃんが居て社長は海外でも名の知れた有名人で元ネットワークエンジニアです。僕は技術力では無く、語学(英語)で採用されたのですが、半年弱で体壊してメンタルが壊れるまで毎日必死で働きました。取引先がベンダーだったこと、僕が営業支援エンジニアとして採用された事もあり、とにかくスピードと正確が命の現場でした。結果はほとんど出せなかったけれど日本の2年3年先を見据えて働く環境は凄く刺激で本当に貴重な経験でした。

3,成功者や現役エンジニアが良く口にすること

『本当にエンジニアになりたいなら派遣型より常駐型を選ぶべき』

『ジョブホッパーは駆け出しエンジニアには向いてない』

情報収集してたらよく耳にする言葉だと思います。僕も有識者の動画や記事をよく読んでいたので実際頭では分かっていたのですが、結局最後まで成功者の言葉を信じる事が出来ませんでした。成功者の言葉って何処か自分と住んでる世界が違って見えて、『彼らは成功したからそう言える』って思って敢えて茨の道を突き進めた結果、エンジニアとしての結果はほとんど残せず諦める事になりました。

ただ、後悔はしてません。

『プログラムと同じように人生もまたトライアンドエラーの連続』

1度でもプログラムを書いた経験があれば聞いた事あると思います。

僕はエンジニアを目指したからこそ常に思考し続けるマインドを手に入れました。

4,仕事を辞めて1年療養に充てた理由

やっとの思いで手に入れた環境。もし、まだネットワークとセキュリティのエンジニアとして働けていたら開発エンジニアにはなれなくても、優秀なエンジニアになれていたと思います。しかし、現場が決まった時点で僕の精神と体は限界を迎えていました。正直見栄張って無理し過ぎたんです。何処かで鬱病と体の不調を理由に離職する事は逃げだと、恥だと思ってました。ただ、あの時辞めなかったから確実に自殺してました。辞める2週間前は毎朝泣いてから出勤。ふらつきながら朝御飯は栄養ドリンクとコンビニのサンドイッチを胃に流し込んで始業から終電ギリギリまで上司に罵倒されながら働いていました。何度かホームから飛び降りようとしてみたり、自宅で自分の首を絞めたりしました。最終的に勇気を出して職場に行き、社長に直接退職したい旨を伝えて仕事を辞めた事は今でも後悔してません。

5,復職した今の環境

復職後は派遣でとある製造業の情報システム部門で会社のパソコンの運用管理やユーザー対応したり、合間でマニュアルの改修作業やたまにCopilot使ってマクロ組んだり、ローコード触ったりと何でも屋みたいな事をしてます。所謂ロースキルな現場ですが、僕は今の働き方に満足してます。

何故なら脳死で業務をこなして居ないから。

常に思考して自分のタスク管理を意識しつつ自分の仕事量に対してキャパが追いついているか、1週間、2週間先を見据えたスケジュールをざっくり立てながら仕事しているのでコミニュケーションエラーで悩む事はあっても業務そのものに辛いと感じる事は一切無いです。幸い上司との相性も良く、現場の人も良い人ばかりです。現場ガチャでやっと当たりを引いた気分です。人間関係だけでここまで仕事がしやすくなるとは思ってなかったので正直驚いてます。

半年後に正社員採用を目標に全力で仕事に取り込んでいますが、ここの現場が1番良いとは思ってません。もっと良い条件があれば派遣先を変えることも視野に入れています。ただ、5年以内に何処かの会社で正社員として常駐勤務して安定したいと思っています。

6,ここまで読んでくれた方へ。

ここまで読んで下さった方々本当にありがとうございます。せっかく読んで頂いたのにこれで終わりだとただの経験談かよ…になるのでここからは少しマジメな話をします。

もし、僕の経験談を聞いた上でエンジニアになりたい、或いは現役エンジニアだけど、今の環境変えたい。そんな想いがあったら僕と友達になってくれませんか？

『何を言ってるんだコイツは…』
『マジメな話じゃないの？』
と思うかも知れません。

簡単に言うと僕を通して紹介できる会社と学べる環境があります。ただ、誰でも良い訳では無くて信頼できる僕からの紹介じゃないと先方が了承してくれないって話なんです。僕に対して払うお金は一切ありません。僕に払うくらいなら勉強代や交通費に宛てて下さい。

未経験者と経験者でそれぞれ条件を設けます。
該当する方で興味ある方はXでDMして下さい。

未経験者の方

・学生或いはフリーターの方
・時間に余裕がある方
・学生証又は身分証明書を所持してる方
→大学生・専門学生の方は学校名教えてください。
・学ぶ意欲がある方
・将来IT業界で頑張りたい方

経験者の方
・今の現場に不満がある方
・スキルはあるが会社とマッチしてない方
・この先のキャリアに不安がある方
・転職しても現状に満足せず学び続けられる方


最後に僕の経歴を貼って終わります。
ありがとうございました。

簡単な経歴

大学卒業
Sier企業に就職(Java開発)
3ヶ月で退職
Ses企業に転職(インフラ)サーバーの死活監視
→24h365dの鬼ブラックなとこ
自社の人事課に移動
→1年4ヶ月で退職
Ses企業(ベンチャー)に転職
→現場は3社経験 2年弱働いて退職
3社目の会社(ネットワークとセキュリティ)
へ転職
数ヶ月後に鬱病＋体壊して退職
1年療養
仕事復帰 
SeS企業に転職
→製造業の情報システム部門に所属
【イベントレポート】初心者歓迎！クラフトビールを楽しむLT会！ #カンリーLT

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

今回は2025.01.30（木）に開催した**初心者歓迎！クラフトビールを楽しむLT会！**へ参加 and 登壇しましたので、アウトプットとしてイベントレポートを執筆しました。

初学者でもサクッと読めるように平易な表現で執筆しておりますので、お気軽に読んでいただければ幸いです。

:::note info
誤字脱字、分かりづらい表現に関しては極力なくすように心がけていますが、リアルタイムで執筆しているため、誤字脱字があるかもしれません。
:::

:::note info
私の登壇セクションについては割愛いたします。
:::

#### イベントページ

https://canly.connpass.com/event/339745/

#### カンリーホームページ

https://biz.can-ly.com/

# 目次
- 主催LT 【採用はペルソナ設計からはじめよう】
- LT① 【トレードオフスライダーにおける品質の優先度について】
- LT② 【Trusted Advisor の対応推奨項目の diff をとる】
- LT④ 【悪用厳禁！「あざといLT」に書けなかった、 あざといLT術（非公開版）】
- まとめ

## 主催LT 【採用はペルソナ設計からはじめよう】

#### 登壇資料

https://speakerdeck.com/sudoakiy/cai-yong-haperusonashe-ji-karahazimeyou

#### 参考サイト

https://www.wantedly.com/hiringeek/recruit/persona/

- 自己紹介
    - カンリー所属のCTOの方
    - 得意領域はプロダクトマネジメント領域
    - 現在は組織開発を担当されている方
- 採用ペルソナを考えるきっかけ
    - 2024年4月に入社
    - 採用関連の施策に関して改善をCEOから求められた
        - 特にテックリード採用に力量を入れていた
- テックリード採用への取り組み
    - 各ステップの実数を可視化してみた
    - 可視化したデータをもとに仮説立てを行っていった
- 仮説検証後のアクション
    - どのようなアクションが有効か検討するために採用ペルソナを考えた
        - 求める人物像などを言語化した
    - 作業としてVPoE、採用責任者を交えてたたき台作成⇒CTOレビュー
- ペルソナ策定後のアクション
    - エンジニア組織としてアピールポイントを見定めた
- まとめ
    - 限られたリソース内で何をすべきか明確になった
    - 採用担当者はペルソナ設計から

## LT① 【トレードオフスライダーにおける品質の優先度について】

#### 登壇資料

https://speakerdeck.com/suzuki_tada/toredoohusuraidaniokerupin-zhi-nituitekao-etemita

#### 参考サイト

https://www.insurtechlab.net/glossary/tradeoff-slider/

- 自己紹介
    - プロダクトマネージャーをされている方
    - サンアスタリクス所属の方
- トレードオフ・スライダー
    - 高い品質・少ない欠陥にフォーカスを当てて説明
- プロジェクトあるある
    - 優先度付けを行うときに品質を定義づけられていない
    - ISOで定められている
    - QAでも定められているがすべて達成するのは難しい
- Kanoモデル
    - 当たり前品質を担保するという考え
    - 魅力的品質、一元的品質は犠牲にする
        - ざっくり言えば、**とりあえず動くもの**を作っていく
- まとめ
    - トレードオフスライダーで決めるのは品質保証レベル
    - 何をどこまで担保するのかをKanoモデルで決めていくのが重要
    - すべての品質を100％保証するのは難しい

## LT② 【Trusted Advisor の対応推奨項目の diff をとる】

#### 登壇資料

https://speakerdeck.com/mist_dev/trusted-advisor-nodui-ying-tui-jiang-xiang-mu-no-diff-wotoru

- 自己紹介
    - iCARE所属のSREの方
    - Rubyとビールが好きな方
        - 熊本の天草ソナービールが好き
- お話しすること
    - Trusted Advisorに関する説明
- Trusted Advisor
    - AWS W-Aに基づく推奨事項を提供するサービス
    - 対応推奨項目を取得するには2種類のAPI利用が必要
        - それぞれの結果をまとめることで推奨事項をまとめられる
    - 日本語Diffも取れる

## LT④ 【悪用厳禁！「あざといLT」に書けなかった、 あざといLT術（非公開版）】
- 自己紹介
    - メタップホールディングス所属の方
    - あざといLTの著者
- あざといLTで伝えたいこと
    - 自己紹介の繰り返し
        - 自分がどんな人間かを説明する
        - どうせならLTをもう一歩あざとく利用しよう
- あざといLT
    - 見た目は重要：いつも同じ格好をしている
    - 覚えてもらうためのツールを用意している
    - 覚えてもらったらXを活用して定着してもらう
        - 発表するだけでは忘れられてしまう
        - 1日一回はポストを行う（挨拶など）
    - LTではその日一番受けなくてもいい
        - 知ってもらいたい人に伝わればいい
- まとめ
    - LTは強力な自己紹介ツール
    - 覚えてもらうための自己紹介、Xをうまく活用する
    - 届けたい人に伝えてもらえばいい

## まとめ

皆さんのLT戦闘力が高くて素晴らしいと思いました！
私もチャレンジしていくぞと強く感じました。

最後まで、記事をお読みいただきありがとうございました👍

PS:
本日のLT資料です～

https://speakerdeck.com/masakiokuda/mobu-enziniagachuan-eruautopututohuo-dong-nosusume-number-kanrilt
chakra ui v2 モーダル背景黒色現象の解決方法について

# はじめに
編集ボタンをクリックした際、編集画面をモーダルで表示しようとした際、背景が黒いモーダルが表示されてしまい、そちらの解決方法について共有いたします。
<br>
以下のように記述していました。
```App.tsx
{records.map((todo) => {
    return (
      <li key={todo.id} data-testid="record-item">
        <div className="records">
          <span>{todo.getDisplayText()}</span>
          
          <span>
            <Button colorScheme='blue' onClick={openEditModal}>編集</Button>
          </span>
           {/* 編集用モーダル */}
            <Modal isOpen={editModal.isOpen} onClose={editModalClose} size="lg" motionPreset="slideInBottom" >
```


# 解決方法
map関数の外にModalの記述を移動
```App.tsx
{records.map((todo) => {
    return (
      <li key={todo.id} data-testid="record-item">
        <div className="records">
          <span>{todo.getDisplayText()}</span>
          
          <span>
            <Button colorScheme='blue' onClick={openEditModal}>編集</Button>
            <Button colorScheme='red'
              className="delete-button"
              onClick={() =>
                onClickDelete(todo.id, todo.title, parseFloat(todo.time))
              }
            >
              削除
            </Button>
            </span>
        </div>
      </li>
    );
})}
{/* 編集用モーダル */}
<Modal isOpen={editModal.isOpen} onClose={editModalClose} size="lg" motionPreset="slideInBottom" >
```

# 終わりに
開発ツールで編集ボタンを押した際レンダリングが多く行われていたことから、原因究明にたどり着きました。

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてくださ！
▼▼▼

https://projisou.jp
🚀 DeepSeek-R1をローカルで活用！Ollama×AnythingLLMで最強AI環境を構築 💻✨

# Ollama と AnythingLLM を使用して DeepSeek をローカルで実行する


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/930f4afd-7e29-ca3b-e6c2-9e0828631d9b.png)

## はじめに
急速に進化する人工知能の世界では、オープンソースの大規模言語モデル（LLM）が、柔軟性、コスト削減、およびプライバシーの観点から注目を集めています。その中でも強力なモデルの一つが **DeepSeek-R1** です。このモデルは **Ollama** を使用してローカル環境で実行できます。さらに **AnythingLLM** と統合することで、AI を活用したチャット環境を簡単に構築できます。

本記事では、これらのツールの概要を説明し、DeepSeek-R1 をオフライン環境で使用する方法について詳しく解説します。

## 主要コンポーネントの理解

### 1. **DeepSeek-R1 とは？**
DeepSeek-R1 は、中国の AI スタートアップ **DeepSeek** によって開発されたオープンソースの LLM です。このモデルは、推論、テキスト生成、コードアシスタンスなど、多様な自然言語処理タスクを実行できます。

DeepSeek-R1 は **MIT ライセンス** のもとで公開されており、自由に修正・商用利用が可能です。OpenAI の **o1** などの最先端モデルと同等の性能を持ちながら、ローカル環境で完全に制御できるのが特徴です。

### 2. **Ollama とは？**
**Ollama** は、LLM をローカル環境で実行できるオープンソースツールです。**llama.cpp** をベースに構築されており、モデルの管理、キャッシュ、実行を効率的に処理するため、オフライン AI の実行に適しています。

#### **Ollama を使用する理由**
- **データプライバシー:** データが外部に送信されないため、完全なセキュリティを確保できます。
- **コスト削減:** クラウドベースの AI サービスと比較して、運用コストが削減されます。
- **低遅延:** ネットワーク遅延がなく、即座に応答を得ることができます。

### 3. **AnythingLLM とは？**
**AnythingLLM** は、LLM をより簡単に活用できるユーザーフレンドリーなアプリケーションです。ドキュメントのアップロード、質問応答、情報の検索など、LLM の活用を直感的に行えます。

コマンドラインでの対話に慣れていない方でも、**AnythingLLM** を使えば AI アシスタントを簡単に構築できます。

---

## DeepSeek-R1 をローカル環境で実行する方法

### **ステップ 1: Ollama のインストール**
#### **macOS の場合**:
Ollama を公式サイトからインストールします。
```bash
curl -fsSL https://ollama.com/install.sh | sh
```

#### **Linux の場合**:
次のコマンドを実行します。
```bash
curl -fsSL https://ollama.com/install.sh | sh
```

#### **Windows の場合**:
- [Ollama 公式サイト](https://ollama.com/) からインストーラーをダウンロードします。
- 画面の指示に従ってインストールを完了します。

インストール後、次のコマンドで確認します。
```bash
ollama --version
```

---

### **ステップ 2: DeepSeek-R1 モデルのダウンロード**
Ollama のインストールが完了したら、**DeepSeek-R1 モデル** をダウンロードします。
```bash
ollama pull deepseek-r1:1.5b
```
このコマンドで **1.5B パラメータ版** の DeepSeek-R1 を取得できます。

---

### **ステップ 3: DeepSeek-R1 をオフラインで実行**
モデルのダウンロードが完了したら、対話モードで実行できます。
```bash
ollama run deepseek-r1:1.5b
```

また、プログラム経由で利用したい場合は、Ollama の API サービスを起動します。
```bash
ollama serve
```
次に、**cURL** を使用して API にリクエストを送信します。
```bash
curl -X POST http://localhost:11434/api/generate -d '{
  "model": "deepseek-r1:1.5b",
  "prompt": "こんにちは、自己紹介をしてください。"
}'
```
この API 設定により、**AnythingLLM** との統合が可能になります。

---

## AnythingLLM との統合

### **ステップ 1: AnythingLLM のインストール**
**AnythingLLM** をインストールするには、次のコマンドを実行します。
```bash
git clone https://github.com/Mintplex-Labs/anything-llm.git
cd anything-llm
npm install
npm start
```

### **ステップ 2: LLM バックエンドの設定**
- AnythingLLM のダッシュボードを開きます。
- **設定** から **カスタム LLM** を選択します。
- 以下の情報を入力します。
  - **API URL:** `http://localhost:11434/api/generate`
  - **モデル名:** `deepseek-r1:1.5b`
- 設定を保存します。

### **ステップ 3: チャットの開始**
**AnythingLLM** のインターフェースを使い、**DeepSeek-R1** との対話が可能になります。質問を入力すると、リアルタイムで回答が生成されます。

---

## **次回: LLaMA-Factory を使ったファインチューニング**
DeepSeek-R1 はそのままでも高性能ですが、特定のデータセットでファインチューニングすることで、精度や適応性を向上させることができます。

次回のブログでは、**LLaMA-Factory** を使用したファインチューニング手法について解説します。特に **LoRA (Low-Rank Adaptation) ファインチューニング** のプロセスを詳しく説明し、最小限のハードウェアリソースで効果的にモデルを調整する方法を紹介します。

**次回の LLaMA-Factory を使用した DeepSeek-R1 のファインチューニング記事をお楽しみに！**
【Intune】Apple Push Notification Service (APNs) 証明書を登録する方法

Microsoft Intune に Apple Push Notification Service (APNs) 証明書を登録することで、iOS および iPadOS デバイスを管理する準備を整えることができます。この記事では、登録の具体的な手順を詳しく解説します。

## 手順

### 1. Intune 管理センターにサインイン
1. [Microsoft Intune 管理センター](https://endpoint.microsoft.com/) にアクセスします。
2. 左側のナビゲーションメニューから **[デバイス] > [iOS/iPadOS]** を選択します。

---

### 2. APNs 証明書の設定ページにアクセス
1. **[iOS/iPadOS 登録] > [Apple MDM Push 証明書]** をクリックします。
2. **[APNs 証明書を作成]** または **[証明書をダウンロード]** を選択します。
   - Intune から **CSR (Certificate Signing Request)** ファイルをダウンロードします。このファイルは次のステップで使用します。

---

### 3. Apple Push Certificates Portal にアクセス
1. [Apple Push Certificates Portal](https://identity.apple.com/pushcert/) にアクセスします。
2. Apple ID でサインインします。
   - この Apple ID は **更新時に再使用する必要がある** ため、必ず記録しておいてください。

---

### 4. APNs 証明書を作成または更新
1. Apple Push Certificates Portal 内で **[証明書の作成]** を選択します。
2. Intune でダウンロードした **CSR ファイル** をアップロードします。
3. 処理が完了したら、Apple Push Certificates Portal から **APNs 証明書 (.pem ファイル)** をダウンロードします。

---

### 5. Intune に証明書をアップロード
1. Intune 管理センターに戻り、ダウンロードした **APNs 証明書** をアップロードします。
2. **[アップロード]** をクリックし、証明書ファイルを選択します。
3. **[保存]** をクリックして設定を完了します。

---

## 注意点

- **証明書の有効期間**: APNs 証明書は 1 年間有効です。有効期限が切れる前に必ず更新してください。
- **Apple ID の記録**: 証明書を作成・更新する際に使用する Apple ID を記録しておくことで、後の更新作業がスムーズに進みます。
- **更新時の注意**: 更新時は、必ず **同じ Apple ID** を使用してください。

---

## 参考リンク

- [Microsoft Intune 管理センター](https://endpoint.microsoft.com/)
- [Apple Push Certificates Portal](https://identity.apple.com/pushcert/)
- [Microsoft公式ドキュメント: APNs 証明書の作成](https://learn.microsoft.com/ja-jp/mem/intune/enrollment/apple-mdm-push-certificate-get)
Kubuntu24.04でUnityが空き容量不足でインストールできなかった話

# 経緯
Kubuntu 24.04のUnityHubでUnityEditorをインストールしようとすると
~~~
Download failed: There is not enough storage to download and install the selected items
~~~
というエラーが出て失敗しました。

# 対処法
本来これはディスクに十分な空き容量が無いというエラーです。しかしディスクの空き容量が十分にあっても表示されることがあります。
通常、Unityのデータは一時的に/tmpフォルダ配下にダウンロードされますが、/tmpフォルダはRAMの半分に限定されるそうです。
例としてRAM8GBのPCなら4GBしかありません。
/tmpのサイズを変更することでも解決できますが、今回はUnityをダウンロードするだけだったので割愛します。
UnityHubの設定からDownloads Locaionをホームディレクトリ配下の新規ディレクトリに変更するとダウンロードできました。
# まとめ
Linuxでは/tmpのサイズがRAMによって変わります。それを超えるサイズのUnityEditorをダウンロードしたい場合は別のフォルダーを指定するか、/tmpフォルダのサイズを変更する必要があります。
# 参考
https://li-one.hatenablog.jp/entry/2017/02/23/180259