OmniAICreator/Qiita-1.07M huggingface dataset:
OracleEMCCに関するリンク集

<!----------------------------------------------------------------------------------------------------------------------------------->
## 概要
<!----------------------------------------------------------------------------------------------------------------------------------->

### 目的

Oracle Enterprise Manager Cloud Control 13.5(EMCC)に関するサイト情報のリンク集です。

<!----------------------------------------------------------------------------------------------------------------------------------->
## リンク集
<!----------------------------------------------------------------------------------------------------------------------------------->

### リンク集

* 概要
    * [Oracle Enterprise Manager 13c Release 5 概要](https://speakerdeck.com/oracle4engineer/oracle-enterprise-manager-13c-release-5-gai-yao)
* ドキュメント一覧
    * [ドキュメント一覧](https://docs.oracle.com/cd/F45244_01/books.html)
* メトリック一覧
    * [メトリック一覧_13.5](https://docs.oracle.com/cd/F45244_01/emfhm/index.html)
    * [メトリック一覧_13.1](https://docs.oracle.com/cd/E74608_01/131/EMFHM/toc.htm)
* インストール 
    * [Oracle Linux 7.9にOracle Enterprise Manager 13.5を導入する](https://qiita.com/bbch/items/0723b7c9b7c8bb5ac318)
    * [Oracle Enterprise Manager 13c Linuxへのインストール手順](https://dekiruengineer.com/engineer/oracle_enterprize_manager_13c_for_linux/)
    * [EMCCを手早く構築する手順その2 - DB 作成と EMCC インストール編](https://blog.serverworks.co.jp/oemcc-install-02)
    * [Oracle Enterprise Manager Cloud Control 13.5/インストールとアップグレード](https://docs.oracle.com/cd/F45244_01/install.html)
    * [Oracle GoldenGate EM Plugin 13c セットアップガイド](https://www.slideshare.net/oracle4engineer/oracle-goldengate-em-plugin-13c)
    * [Oracle Cloud Marketplace: Oracle Enterprise Manager 13c を作成してみてた](https://qiita.com/shirok/items/73f7220010a62187f9a6)
* 監視設定
    * [Oracle Enterprise Manager Cloud Control による監視設定](https://blog.jbs.co.jp/entry/2024/08/05/085524)
* メトリック設定
    * [Oracle の情報収集のための監視活動](http://system3support.jp/pdf/oracle_knowledge/immediate_fight/p281.pdf)
* Exadata
    * [Oracle Cloud: Enterprise Manager 13c で Exadata を管理できるようにしてみてみた](https://qiita.com/shirok/items/8f4b39998d91bba2aaed)

### OCI_Monitoringリンク集

* OCI
    * [OCIで提供されるリソース管理及び監視機能を簡単にご紹介](https://qiita.com/ykuma614/items/fca30294742d13fcfad3)
    * [OCI Monitoringのメトリックデータをcsvにして保存する](https://qiita.com/feifo/items/c1fd828872f393124131)

<!----------------------------------------------------------------------------------------------------------------------------------->
LinkedInデータスクレイピング方法と注意点

LinkedInは、ビジネスプロフェッショナルにとって、キャリアの発展や人脈構築に欠かせないプラットフォームです。特に、スタートアップ企業や転職を考えている人々にとって、LinkedInは情報源となり、キャリアの選択肢を広げる手助けをしています。

本記事では、LinkedInのデータスクレイピングに関する知識と、簡単にデータを抽出するためのツールについて説明します。

<h2>LinkedInデータのスクレイピングにおける法的考察</h2>

LinkedInの利用規約では、ユーザーが手動または自動ツールを使用して他者のプロフィールや情報をスクレイピングまたはコピーすることを禁止しています。ただし、検索エンジンを通じてアクセスできる公開情報に関しては、LinkedInも一定の理解を示しているようです。

<h2>LinkedInのデータが必要な場合の対応</h2>

LinkedInの利用規約に同意していないデータベンダーが、公開検索エンジンの結果や他のチャネルからデータを収集する方法もあります。しかし、これは必ずしも便利ではありません。地域の法律に従って公開データを取得することが重要です。多くの国でウェブスクレイピングが合法化されていますが、データの使用と個人情報保護には十分な注意が必要です。

<h2>LinkedInから抽出できるデータ</h2>

LinkedInは一定の制限を設けていますが、認可された開発者がアクセスできるAPIも提供しています。
一般的に、LinkedInから以下の公開データを抽出できます。

1. 投稿の詳細
2. ユーザープロフィール
3. 連絡先情報
4. 求人情報
5. 企業情報
6. 検索結果
7. その他の公開情報

<h2>LinkedInデータのスクレイピングがもたらすメリット</h2>

LinkedInのデータは、以下のような分野で活用できる可能性があります。

1. 人材獲得と採用：候補者の特定とスキル分析
2. 市場調査と競合分析：業界トレンドと競合他社戦略の把握
3. リード獲得：特定業界や役職の専門家との接点作り
4. 業界の洞察とトレンド把握：新たなスキルセットの特定とビジネス戦略の適応

<h2>コーディング不要のLinkedInスクレイパー</h2>

Octoparseは、コーディングスキルなしでLinkedInの公開データを抽出できるツールです。WindowsとMacの両方に対応し、クラウドサービス、API、IPプロキシなどの機能を提供します。自動検出機能により、簡単な操作でデータ抽出が可能です。

<h3>Octoparseを使用してLinkedInの公開データをスクレイピングする手順</h3>

1. LinkedInページのURLをOctoparseに貼り付ける
2. データフィールドをカスタマイズする
3. スクレイピングしたデータをExcelにエクスポートする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/8a63a56e-1a10-7c8d-b906-e66c7185da2c.png)

[LinkedIn情報スクレイパー](https://www.octoparse.jp/template/linkedIn-job-scraper)

<h2>おわりに</h2>

本記事では、LinkedInのデータスクレイピングに関する知識と、コーディング不要でデータを抽出できるツールについて紹介しました。これらの情報が、皆様のビジネス活動やキャリアにお役立ちできることを願っています。

Octoparseを無料でダウンロードし、上記の手順に従ってお試しください。LinkedInの求人情報用のプリセットテンプレートも用意されており、数回のクリックで簡単にスクレイピングが完了します。データの活用方法をぜひ探ってみてください。

[Octoparse公式サイト](https://www.octoparse.jp/)
What is "udev"?

# udevとは何か？
端的にいうとLinuxカーネルで使用されるデバイス管理の仕組みである。USBやHDDなどシステムに接続されるすべてのハードウェアを動的に管理してくれる。

# udevの動作
![無題の図形描画.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752598/a445f50f-b052-08de-02b8-93d06facb13a.png)
Linuxカーネルは、デバイスが接続されたり取り外されたりした際にイベント（uevent）を生成します。/sys：カーネルは/sysという仮想ファイルシステムを介して、システム内のデバイスに関する情報を提供します。udevはこの情報を利用します。devd：udevdは、カーネルから送信されるueventを監視しており、デバイスが接続されたり、取り外されたりしたときに自動的に動作します。/devディレクトリ：udevdは、デバイスが接続されると自動的に**/dev**ディレクトリ内にデバイスファイルを作成します。デバイスが取り外されると、対応するデバイスファイルを削除します。

# udevルール
/etc/udev/rules.d/と/lib/udev/rules.d/：これらのディレクトリには、udevの動作を制御するためのルールファイルが配置されます。
- `/etc/udev/rules.d/`：ユーザーがカスタマイズしたルールファイルを置く場所です。例えば、特定のUSBデバイスが接続されたときにスクリプトを実行させるなど、独自の処理を設定できます。
- `/lib/udev/rules.d/`：システムが提供するデフォルトのルールが配置される場所です。これらは通常、OSやパッケージによって提供されます。

# udevadmコマンド
Linuxのudevデバイスマネージャを管理するためのコマンドラインツールです。

## 1. `udevadm monitor`
`udevadm monitor`は、デバイスイベント（uevent）をリアルタイムで監視するコマンドです。これにより、デバイスの接続や切断、カーネルによって発生するイベントを確認できます。

```bash
sudo udevadm monitor
```

## 2. `udevadm trigger`
`udevadm trigger`は、手動でイベントを発生させて、udevに処理を実行させるコマンドです。特定のデバイスのルール適用を再度強制的に行いたい場合や、すべてのデバイスに対して処理を再適用したい場合に使用します。
```bash
sudo udevadm trigger
```

## 3. `udevadm control`
`udevadm control`は、udevデーモンの動作を制御するコマンドです。たとえば、新しく追加したルールを有効にするためにudevのルールを再読み込みしたり、udevデーモンを再起動したりする際に使用します。
```bash
sudo udevadm control --reload-rules
```

## 4. `udevadm info`
`udevadm info`は、特定のデバイスに関する詳細な情報を取得するコマンドです。デバイスの属性や適用されているルール、関連するパスなどを確認するのに使用します。

特定のデバイス（例：/dev/sda）に関するすべての情報を表示する:
```bash
sudo udevadm info --query=all --name=/dev/sda
```
データ分析プロジェクトの大まかな流れ 〜ウォーターフォールモデルとの対比〜

# データ分析プロジェクトの大まかな流れについて 〜ウォーターフォールモデルとの対比〜

　システム開発でよく用いられる「ウォーターフォールモデル」は、要件定義、設計、実装、テスト、運用といったフェーズを順に進める手法があります。この手法はプロジェクトの進行が直線的で、各フェーズが一度完了すると前のフェーズには戻りにくいという特徴を持っています。

　一方、データ分析プロジェクトの流れは、ウォーターフォールモデルと似た側面もありますが、より探索的で反復的なアプローチが求められます。ここでは、データ分析プロジェクトの一般的なフレームワークとして用いられる**PPDAC**サイクルを基に、その流れをウォーターフォールモデルと比較しながら説明します。

## 1. Problem（課題設定）/ 立ち上げと管理

データ分析プロジェクトの第一ステップは、解決したい問題や目標を明確にする「課題設定」です。これは、ウォーターフォールモデルにおける「要件定義」に相当します。システム開発と同様に、このフェーズが不十分であるとプロジェクト全体に影響を及ぼすため、慎重に進める必要があります。

ただし、データ分析の課題は、分析が進む中で新たな発見や洞察が生まれ、当初の課題が修正されることも多いです。したがって、ウォーターフォールモデルのように一度決まった要件から動かないのではなく、柔軟な見直しが許容される点が異なります。

## 2. Plan（計画) / データ種類と分析手法の検討

次に、データ収集の方法や分析手法を計画します。これはシステム開発における「設計」に似ています。プロジェクトのスコープ、必要なリソース、データの入手可能性などを考慮しながら、具体的な進行方法を定めます。

ウォーターフォールモデルでは設計が詳細かつ固定的であるのに対し、データ分析プロジェクトでは、計画フェーズも再考が可能です。たとえば、想定していたデータが不足していたり、より有効な手法が見つかった場合、計画を変更して柔軟に対応します。


## 3. Data（データ収集）

計画に基づいて、データを収集し、整理します。ウォーターフォールモデルの「実装」に相当しますが、ここではプログラムを書くのではなく、必要なデータを収集して準備する工程に重きを置きます。

データ分析では、収集データの質や量がプロジェクトの成否を大きく左右するため、このステップは特に重要です。システム開発と異なり、収集したデータの整合性や品質が低い場合、次のステップに進む前に問題解決を行う必要があり、反復作業が多く発生します。
　企業で扱われるデータは大きく分けると、SCMやERP、CRMなどの業務ソフトウェアのデータベースで利用される「構造化データ」と、従業員の日常業務やユーザーへのアンケートで生成されるワード、PDFエクセルや、設計図面、画像、動画などの「非構造化データ」に分けられます。

## 4. Analysis（分析）/ 分析結果の評価と改善

分析作業は、ウォーターフォールモデルの「テスト」に相当します。ここでは、収集したデータを使って仮説を検証したり、モデルを使って予測やパターン認識を行います。このステップは探索的な要素が強く、ウォーターフォールモデルのように計画通りに進まないことも多いです。

新しい知見が得られた場合は、課題やデータ収集のステップに戻り、計画の修正や追加のデータ収集が行われることもあります。この点で、データ分析はウォーターフォールモデルと比べて非常に反復的であり、柔軟なサイクルを持つのが特徴です。

## 5. Conclusion（結論）/ レポーティングとBI

 分析結果が出たら、結論をまとめ、成果を共有します。ウォーターフォールモデルでは「運用」にあたりますが、データ分析では結果が終わりではありません。実際のビジネスへの適用やフィードバックを基に、さらに分析を深めたり、新たな分析プロジェクトがスタートすることもあります。

 ## まとめ
 つまり整理すると
 -「Problem：課題設定」
 -「Plan：分析計画」
 -「Data：データ収集」
 -「Analysis：分析」
 -「Conclusion：結論を出す」
の大まかな流れがあることがわかります。
【アジャイル開発】ウォーターフォールとの比較と開発プロセスの贅肉

どうもこんにちは。

前回に引き続き、アジャイル開発についての記事を書いていきます。

https://qiita.com/PDC-Kurashinak/private/fe73cc782dc2e986e39c

# アジャイル開発と比較されるウォーターフォールとは

ウォーターフォール開発とは、開発をいくつかの工程に分けて順番に取り組んでいく手法です。開発するものを明確にする工程と、その工程に対応したテストが存在します。ソフトウェアの品質向上や品質保証の話でもよく出てくる「**V字モデル**」をベースにしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711491/45052d6e-caa4-7cc5-c4eb-e1c68d50f10f.png)

参照: https://webrage.jp/techblog/v_shaped_mode/

ウォーターフォールの工程は時系列で並べられていて、基本的に「**前のフェーズが完了するまで先に進まない**」「**後戻りがない**」前提で進められます。時系列順で進むため、進捗の確認を簡単に行うことができるのはウォーターフォールの強みです。

上記から「**明確な要件が最初から決まっていて、要件を変更される可能性が低いプロジェクトに適している**」手法だと言えるでしょう。

# アジャイル開発とウォーターフォール開発の比較

## 共通点

- 顧客からの要求がなければ何を作るのかが決まらず、設計がなければどのようにソフトウェアを作るのかが決まりません
- 実装しなければ動くものができません
- テストをしなければ作ったものが要求と合致しているか確かめることができません

## 違い

アジャイル開発とウォーターフォール開発の比較表に、いくつかの追加項目を提案します。以下は新しい項目を加えた拡張版の比較表です。

| 項目 | アジャイル | ウォーターフォール |
| --- | --- | --- |
| 後戻り | ○ | ×（原則後戻りはしない） |
| 開発工程の見直し | ○ | × |
| 要件の見直し | ○ | × |
| スピード | × | ○ |
| 進捗確認のしやすさ | ○（スプリントごとに進捗確認） | ○（全体計画に基づく） |
| 顧客との関与 | ○（継続的なフィードバック） | ×（プロジェクト終了時に成果物提供） |
| チームの柔軟性 | ○（役割の流動性あり） | ×（固定された役割） |
| リスク管理 | ×（変更に柔軟だが不確実性が高い） | ○（計画に基づいたリスク管理） |
| 文書化の重視 | ×（必要な範囲でドキュメント作成） | ○（詳細なドキュメント作成が求められる） |
| プロジェクトの予測可能性 | ×（柔軟だが不確実） | ○（計画通りに進行） |
| 変更の対応 | ○（変更が容易） | ×（変更にコストと時間がかかる） |
| コスト管理 | 柔軟（変更に応じて変動） | 固定（計画通りのコスト管理） |
| 適用プロジェクトのタイプ | 小規模〜中規模、変化が激しいプロジェクト | 大規模、要件が明確で安定したプロジェクト |
| テストのタイミング | 継続的（各スプリントで実施） | 最後にまとめて実施 |
| チームの関与 | 強い（全員が全体に責任を持つ） | 弱い（役割が明確に分担されている） |

どちらが良いというように優劣をつけることは難しいですが、アジャイル開発は柔軟で流動的であることがわかります。

このメリットは、「**顧客の要望に沿ったシステムを開発することができる**」にあります。ウォーターフォール開発でも顧客の要望に沿ったシステムを開発することはできますが、「**顧客が自身の要件を把握していない**」「**要件が変わった**」という問題に対応することができません。

また、「**スプリントごとに開発工程を見直すことができる**」という点もアジャイル開発の強みです。これによって、より効率を重視した開発を行うことができるようになります。

# 開発した機能の6割は使われないだと...

## 機能の贅肉

開発をしているエンジニアにとっては、すべての機能を使用してもらう前提で開発をしているので、6割の機能が使用されていないという事実を聞くとショックですね。本では、6割の機能のことを「**贅肉**」と呼んでいます。

:::note info
投稿者の体脂肪率は19~20%の間なので、約10%は贅肉ですね...
:::

なぜ、「開発したすべての機能が使用されない」という悲劇が起こってしまうのでしょうか。それは、ユーザにとって「**必要がない機能**」だからです。でも、どうしてユーザにとって必要のない機能を開発しているのでしょうか。

それは、顧客の要求を聞き出す時に問題があります。その理由は、顧客の「**欲しいもの** と **必要なもの**」は違うからです。「**欲しいもの**」を顧客の要求としてすべて取り入れてしまうと、必要ではない機能を開発してしまうことになります。なので、「**必要なもの**」を聞き出さなければいけないのですが、顧客自身もそれを区別できていないこともあるので難しい...

なので、「**顧客に随時動いている機能を触ってみてもらって、フィードバックをもらう**」という工程が必要になります。

## プロセスの贅肉

機能の贅肉がある一方で、プロセスの贅肉も生まれてきます。

例えば、以下です。

- ドキュメント・議事録作成
- 進捗の共有方法
- テスト項目の確認
- リリース時の約束事

上記のような、ドキュメントの作成や共有、確認といった工程は「非効率」だと感じてきたり、「当たり前」になってきます。そうすると、気づいたらやらなくなっていたり、共有や確認を行なっている目的を見失って形だけの状態になってしまいます。結果として、効果が薄まってしまいますよね。これが、「**プロセスの贅肉**」です。

また、「確認の待ち時間が長い」なども「プロセスの贅肉」と言えますね。

無駄な工程を無くしたり改善したりするのは、簡単そうで簡単ではありません。本当に必要な工程なのであれば方法を変えたり、目的を再確認するようにするなどの手段が必要です。逆に必要のない工程をなくすには、本当に無くして良いのか勇気と自信が必要です。他にも、「その工程はコストに見合っているのか」などの確認をすることも重要です。

このような贅肉をなくすためには、各工程に対して「**期待している効果が得られているか**」「**効果的に利用されているか**」などといった観点で評価する必要があります。

## バリューストリームマッピング

プロセスの贅肉を見える化するための手法として、**バリューストリームマッピング**という手法があります。

バリューストリームマッピングとは、開発からリリースまでの工程を可視化し、その工程ごとに問題点を紐づけていく作業のことです。

https://qiita.com/kaburankattara/items/c718aec82ca60a436ea2

# まとめ

次の記事でもアジャイル開発について書こうと思います。
【Unity】クラスがいつのまにかインスタンス化されている謎を解決

Unityでフラッピーバードゲームを作っていたら、
このようなエラーが出た。


    Member 'PlayerController.isCollided' cannot be accessed with an instance reference; qualify it with a type name instead


PlayerController.isCollidedというメンバーには、
インスタンスの参照を通してアクセスできないよ、
型名（今回はクラス）を通してアクセスしてね

という意味。

PlayerControllerを確認してみると

    public static bool isCollided = false;


isCollidedは静的フィールドだったことが分かった。

静的関数はインスタンスを通して
呼び出せないのは知っていた。
しかしそうか、
静的フィールドもだめなのか～と納得がいった…

…が。

PlayerControllerをインスタンス化した覚えがないことに気づく。

__いつインスタンス化されたの？__
__newもInstantiateも書いた記憶がないのに、なぜ？__ 


## 結論
__newしたのを忘れていた。__


…ではなく

__ゲームを再生すると、UnityエンジンはGameObjectにアタッチしてあるスクリプトのクラスを自動的にインスタンス化するから。__
## 詳細
関係のあるコードのみ以下に示す。
```C#:Variables.cs
public const string tag_Player = "Player";
```

```C#:ScoreController.cs
PlayerController playerController;

void Start()
{
playerController = GameObject.FindWithTag(Variables.tag_Player)
                        .GetComponent<PlayerController>(); 
}
```


データ型がPlayerControllerクラスのフィールド、playerControllerを定義する。

FindWithTagは静的関数であり、
GameObjectクラスを通して呼び出され、
当該のゲームオブジェクト（インスタンス）を返す。

ここではPlayerタグのついたPlayerという名前の
ゲームオブジェクトへの参照を渡している↓

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852634/62fa6691-abc2-232b-d77f-fecb740b13cb.png" width=50%>

そのゲームオブジェクトに対し

    GetComponent<PlayerController>()
    
をすると、
そのゲームオブジェクトにアタッチされている
スクリプトのクラスのインスタンスへの参照を返す。

この時、すでにクラスはUnityエンジンによって
インスタンス化されており、
GetComponentはインスタンス化に関与していない。

だからコードを見ているだけでは
クラスのインスタンス化には気づけなかったのだ。

## 余談
__Q. GetComponentでクラスが取得できるのはなぜ？__

A. GameObjectにアタッチしてある時点で、
そのスクリプトのクラスはコンポーネントだから。

__Q. クラスがコンポーネントってどういうこと？__

A. クラスの階層構造はこんな感じで階層構造になっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852634/eefa03b2-59b3-1969-83a3-f3dd1c21899d.png)
かの有名なMonoBehaviourクラスは
Behaviourクラスに包含され、

Behaviourクラスは
Componentクラスに包含されている。

GameObjectへのアタッチはMonoBehaviourの継承が必須である。

だからアタッチされたスクリプトのクラスは
その時点でComponentクラスに含まれている。

よってGetComponentで取得ができる。

__Q. ゲーム再生時に自動でインスタンス化というけど、静的クラスはどうなるの？__

A. もちろんされない。

__Q. ゲーム再生時にクラスは自動でインスタンス化される…あれ？クラスのnewってどんなときに使ってたんだっけ？__

A. Vector3などUnity組み込みクラスなどに使う

===
あと静的クラスはライフサイクルメソッドも呼び出すことができない。
（書いてもエラーにはならない）

コメント歓迎です！
ご指摘をいただけるとうれしいです
ラズパイPico でSG-90サーボモーターを動かす


ラズパイPico のPWMを使って、SG-90サーボモーターを動かしてみよう

## 準備：SG-90サーボモーターを GND、5V、GPIO16に接続

SG90の茶をGND、赤を5V (VBUS)、オレンジをGPIO16に接続します。

![servo2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665435/41ca75ad-48a8-c1ae-6685-fd8dc5cbf4f8.png)


SG-90については、以下URL「データシート」を参照してください：
https://akizukidenshi.com/catalog/g/g108761/


## プログラム

```Python
from machine import Pin, PWM
import time

# サーボモーターの制御信号を送るGPIOピンを設定
SERVO_PIN = machine.Pin(16)
PWM_FREQ = 50	# 20ms(50Hz)
servo = PWM(Pin(SERVO_PIN))
servo.freq(PWM_FREQ)

# サーボモーターを0～180度に動かす
# dutyは0～65535
# PWM Period 20ms(50Hz)
# duty を 0度(0.5ms)～90度(1.45ms)～180度(2.4ms)にする
def move_servo(pwm, angle):
    duty = (angle*(2.4-0.5)/180+0.5) / 20 * 65535
    pwm.duty_u16(int(duty))
    print(duty)

for i in range(4):
    move_servo(servo, 0)
    time.sleep(1)
    move_servo(servo, 90)
    time.sleep(1)
    move_servo(servo, 180)
    time.sleep(1)
    move_servo(servo, 90)
    time.sleep(1)

print("サーボモーターを動かしました！")
```
Pandasチートシート

### Pandasチートシート
```plantuml
@startmindmap
+ Pandasライブラリ\nimport pandas as pd
++ DataFrame読み込み
+++ 辞書\ndf = <b>pd.DataFrame({辞書})</b>
+++ エクセルシート読み出し\n<b>df=pd.read_excel('ファイル名.xlsx', sheet_name = 'シート名')</b>
+++ エクセルブック読み出し\n<b>df=pd.read_excel('ファイル名.xlsx', sheet_name = None)</b>\nfor df_sheet in df.keys(): でシートに分解。
+++ CSVファイル読み出し\n<b>df = pd.read_csv('ファイル名.csv',encoding='cp932')</b>
++ DataFrame出力
+++ エクセルシート書き込み\n<b>df.to_excel('ファイル名.xlsx',sheet_name='シート名',encoding='cp932',header=True,index=True)</b>
+++ CSVファイル書き込み\n<b>df.to_csv("ファイル名.csv",encoding='cp932',header=True,index=True)</b>
++ ヘッダ・インデックス処理
+++ 列名取得\n<b>df.columns.values</b>
+++ 列名変更\n<b>df = df.rename(columns={'変更前':'変更後', '変更前':'変更後'})</b>\n変更する列名を辞書で指定。
+++ 行名取得\n<b>df.index.values</b>
++ 範囲指定
+++ 列指定
++++ 1列指定\n<b>df['列名']</b>
++++ 複数列指定\n<b>df[ ['列名','列名'] ]</b>
+++ 範囲指定
++++ 範囲指定\n<b>df.loc[0:5,'A':'C']</b>\n例)A列～C列の0～5行目。
++++ 個々指定\n<b>df.loc[[0,5],['A','C']]</b>\n例)A列とC列の0と5行目。
+++ セル指定
++++ インデックス指定\n<b>df.at[5,'A']</b>A列5行のセル
++++ 番号指定\n<b>df.iat[5,3]</b>3列5行のセル
++ フィルタ
+++ 行列のフィルタをする方法。\nhead,tail,query,isin,contains,endswith,startswith,match...\nリンク①へ
++ DataFrameの結合
+++ 複数のDataFrameを結合する方法。\nリンク②へ
++ データ処理
+++ applyを使ったデータ処理方法。\nリンク③へ
@endmindmap
```
### リンク①：フィルタ
https://qiita.com/tapitapi/items/24dce1a92b87131e1eb0
### リンク②：初期化、結合
https://qiita.com/tapitapi/items/fe2324889267920587c0
### リンク③：データ処理
https://qiita.com/tapitapi/items/b54f0448a7f7773cd173

以上
Power Automate for desktop（PAD）でTeamsに投稿する

こんにちわ、 [のりじ](https://x.com/nori790822)です。

PADで一部のクラウドコネクタが利用できるようになりました。

- [デスクトップ アクション用の Power Automate としてのクラウド コネクタ](https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/actions-reference/cloudconnectors)

今回は、PADからTeamsの指定チャネルにメッセージ投稿を試してみます。

:::note warn
PADでクラウドコネクタを利用するには、Attended RPAライセンスが必要です。
:::

# 1. PADでTeamsのアクションを使う

左のアクション一覧の「Microsoft Teams」から利用します。

![pad-teams01a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/764ee5f2-caa9-0496-f1e2-8a602cb43268.jpeg)

今回は「チャットまたはチャネルでメッセージを投稿する」を利用してみます。

# 2. 「チャットまたはチャネルでメッセージを投稿する」アクションの設定

「チャットまたはチャネルでメッセージを投稿する」ワークスペースにドラッグします。﻿

![pad-teams02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/0dd18d01-dee6-5752-ab5f-95917301730e.jpeg)

すると、ライセンスがあり適正な環境を選んでいても上図のようなエラーが表示される場合があります。
このエラーが出た場合は「接続参照」をクリックしてください。

## 2-2. 接続参照の設定

![pad-teams03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/abe46883-ff8c-2870-8a8f-b06700eb483a.jpeg)

「再試行」ボタンを押したくなりますが「新しい接続参照を追加する」をクリックします。
表示される「＋新規作成」をクリックしてください。

![pad-teams04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/30a0b2b0-90af-0f85-2453-76d78c0d9f16.jpeg)

アカウントを選択すると「自分の接続」の表示に変わるので、OKボタンをクリックします。

![pad-teams05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/aaa65da7-c35f-48b7-9938-d0dc32784369.jpeg)

すると、「チャットまたはチャネルでメッセージを投稿する」アクションの設定ができるようになります。
TeamとChannelの設定は下の方にあるのでスクロールして確認するのを忘れずに！！

# 3. フローを実行する

![pad-teams06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/97d72fe3-3197-9674-e12b-b722a5f9b66a.jpeg)

今回は、入力ダイアログを表示し入力した内容をTeamsの指定チャネルに投稿するシンプルなフローを試してみます。

![pad-teams07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/10a31e34-b37a-df69-59c1-ff8d2a4457a2.jpeg)

Teamsを確認すると、投稿されているのが確認できました。

# 最後に
「接続参照」の設定方法が個人的にわかりにくいな・・・と思ったのはあります。
今回の方法は、 [@Yo_8One](https://x.com/Yo_8One)さん と [@flali_world](https://x.com/flali_world)さん にご協力いただき理解できた内容です。
お二方、ありがとうございました！！
aws-amplifyのAuthメソッドの使用方法の違い(v5以前とv6のバージョンを比較)

Differences in Usage of Auth Methods in aws-amplify (Comparing Versions Prior to v5 and v6)

# はじめに
amplifyのAuthメソッドについて、v5以前と最新のv6のバージョンで使用方法が異なる。
v5からv6でかなり破壊的な変更が入った。
ネットの記事はv5以前の書き方の使用例が多く、v5とv6の書き方の違いの代表例を2つ記載する。
他のメソッドにも大きな変更があったと思われるが、筆者が使用するうえではまった箇所を紹介する。

# Amplify.configureのキー名の違い

※v5,v6を問わずaws-amplifyのAuthメソッドを使うためには、クライアントシークレットをOFFにしたアプリクライアントを使用する必要性があるため注意

v6の書き方
参考）https://docs.amplify.aws/gen1/react/tools/libraries/configure-categories/ 

```JavaScript:v6
Amplify.configure({
  Auth: {
    Cognito: {
      region: "ap-northeast-1",
      userPoolId: "ap-northeast-1_aaaaaa",
      //アプリクライアントを設定するキー名がv5と異なり'userPoolClientId'
      userPoolClientId: "abcdabcd", // クライアントシークレットOFFのクライアント
    },
  },
});
```

v5の書き方
参考）https://docs.amplify.aws/gen1/react/prev/tools/libraries/configure-categories/ 

```JavaScript:v5
Amplify.configure({
  Auth: {
    region: "ap-northeast-1",
    userPoolId: "ap-northeast-1_aaaaaa",
    //アプリクライアントを設定するキー名がv6と異なり'userPoolWebClientId'
    userPoolWebClientId: "abcdabcd", // クライアントシークレットOFFのクライアント
  },
});
```


# signinの扱い 

参考https://docs.amplify.aws/gen1/react-native/build-a-backend/troubleshooting/migrate-from-javascript-v5-to-v6/#auth  

https://docs.amplify.aws/gen1/react-native/build-a-backend/auth/auth-migration-guide/#authsignin 



## 違い要約

* 書き方以外にもレスポンスの内容や例外が返る条件にも変更があった。
* ログイン済みユーザでログインした場合にUserAlreadyAuthenticatedException: There is already a signed in user.エラーが出るようになった。
    * 参考https://qiita.com/yuma_haga/items/70b18482cdf5bc435171 
* 引数が  (username, password)から({username, password})のオブジェクトになった。
* v6でレスポンスに含まれる情報が大きく減った。
    * v5ではuserのsub等、後処理で使い得る情報が多く入っていた。
    * v6からはログイン済みかとNextActionしか返ってこなくなった。
        * subを使いたい場合、再fetchの必要あり。

v6

```JavaScript:v6
const handleSignIn = async (username, password) => {
    try {
      // idTokenが存在する（サインイン済み）場合、サインアウトする
      const fetched = await fetchAuthSession();
      if (fetched.tokens.idToken) {
        console.log("fetched", fetched);
        await signOut();
      }
      
      // 引数がオブジェクトになっている
      const result = await signIn({ username, password });
      
      // v6からsignIn後のレスポンスにsubが入らないためsubが欲しいなら再度fetchする必要がある
      const fetchedResult = await fetchAuthSession();
    } catch (error) {
      console.log(error);
    }
  };
```

v5

```JavaScript:v5
const handleSignIn = async (username, password) => {
    try {
      // 引数がオブジェクトじゃない
      const result = await Auth.signIn( username, password );

      // レスポンスにsub等の情報が多く含まれる
    } catch (error) {
      console.log(error);
    }
  };
```
swiftformatのspaceAroundOperatorsが一部の演算子で効かなかった話

自分用の備忘録です。

## 起こったこと

フォーマット自体は働くのになぜか+記号の前後にのみ空白が挿入されませんでした。
もちろん`.swiftformat`ファイルで`spaceAroundOperators`のオプションは有効化されています。

## 解決法

`swiftformat . --enable spaceAroundOperators`を実行したら正しく機能するようになりました。理由はよくわかっていません。
ピンヘッダーをなめらかに割る方法

## 用意するもの

- 割りたいピンヘッダー x 1
- ピンソケット x 2
  - みなさんソケットを割って使ってると思うけど、最低でも片方は新品の状態であること。

![1_準備.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248613/a896b992-0b1a-94c4-4361-cb1eb97820bb.jpeg)

## 手順

割りたいところでソケットに挿す。
![2_挿す.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248613/52824163-741c-86e4-46e9-15a434135300.jpeg)

この時点でヘッダーがすでに割れかける。ピンが多くあるほど、割れかけ度が大きい。新品のヘッダーは端だけ 2.54mm よりも広くなっていて、このように、挿しただけで割れかける。

そしたら、そうっと折ればぽろっと割れる。

![3_折る.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248613/5232fc31-4fdf-0e0b-5d70-8256317b9174.jpeg)

## 注意

ヒロスギのヘッダー PSS-410256- シリーズと、ソケット FSS-41085- シリーズ以外でどうなるのか知らない。似たような構造物だから、似たように割れると思うけど。

https://www.hirosugi-net.co.jp/shop/c/c12102813/
https://www.hirosugi-net.co.jp/shop/c/c12111016/
【Chakra UI × React × TypeScript】簡単に導入できるChakra UIを使用してReact学習記録アプリを開発！

# はじめに
React学習を始めて、約1か月が立ち、振り返るとかなり多くの事柄を学んできました。

今回は、1か月目でChakra UIを使用したアプリを開発してみました。
学習記録アプリは以前にも作成したことがあるのですが、今回はChakra UIとTypeScriptによる型定義を導入しました。

Chakra UIは簡単にUIを改善することができ、前回と比べてかなり変わったので、その違いも見せていきたいと思います！

# 開発した学習記録アプリ
開発したアプリはこちらになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/4756d1c9-d331-8c11-3a71-4ca1a0be1157.png)

ID、タイトル、時間、作成日時のデータが表示されており、新規登録、編集、削除ボタンがついています。

新規登録を押すとモーダルが開き、項目を入力して登録できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/342bf68b-2d3c-875c-ecf5-973d312ce502.png)

編集ボタンも同様ですが、保存されている情報があらかじめ項目に入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/d2e48a17-0509-b050-ee1d-cb62bfad2436.png)

# 使用した技術やツール等
- **使用言語**
    - React(メイン)
    - TypeScript(型定義)
- UI
    - [Chakra UI](https://v2.chakra-ui.com/)
- **データベース**
    - [Supabase](https://supabase.com/)
- **サーバーサイド**
    - [Firebase](https://firebase.google.com/?hl=ja)
- **CICD構築**
    - GithubActions

# 前回作成したものと比べて
以前作成したものはこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/ebe5bfc8-1cf4-fec0-f23c-59dc5409aa27.png)

以前と比べ、まずUIが大幅に改善されたと思います。
それと、内部的なところですがTypeScriptを導入したことで、開発していく中で変数の型を意識しやすくなりました。
間違った使い方をしていると、型が違いますとエラーを出してくれます。

今回のアプリでReactの使い方が深まったのもそうですが、TypeScriptとChakra UIという新しいものを使えるようになれました。

# 大変だった点
TypeScriptを使用するのは初めてでした。
Udemyで講座を受講して、基礎を学んでから開発に臨みました。

基礎は学びましたが、実際に手を動かしてみるとわからないことがたくさん出てきて、そのたびにエラーの記事を見たり、chatgptを活用したりして試行錯誤しました。

「TypeScriptとは？？」から「TypeScriptね」というレベルまではアプリを作り終えるころにはなっていたと思います。

以前までは、仕事をしているとTypeScript良いですよという声を聞くのですが、毎回TypeScript??となり話についていけていない状況でした。
ただ、今は「あ～型定義ね」と聞けば思えるので、嬉しいです。

# 感覚で使い方が分かるUIは大事
今回、Chakra UIを導入してみて、感覚でこのボタンを押すと新規登録できて、このボタンを押すと編集できるなど感覚で使い方が分かるUIは大切だと感じました。

ぐちゃっとしているUIだとどう触っていいか、戸惑う点もあると思います。
その点、UIが優れていると使い方を調べなくても機能が使えます。

Chakara UIの導入と使用方法は難しくないので、こういった簡単に導入できるUIは取り入れていくのが大切だと思います。

# 終わりに
新しい技術を触るのは後回しにしてしまいがちですが、新しいものを触ることが新しい知識やアイデアを得るきっかけになると思います。
React学習をさらに進めていきます。

# JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからお願いします👇

https://projisou.jp
React & Typescript & Node.js(express) & mysql でのツイッター疑似アプリを作成してみた(1)

# React , tsの導入

フロントのReacctではcreate react appを使用して,環境構築をします

create react app の作成

今回はnode.jsの環境がある前提です。

```
npx create-react-app {自身のプロジェクト名} --template typescript
```
今回tsも使いたいので、--template typescriptを使用します

バックエンドに移動して、

```bash 
npm init -y
npm install express cors mysql2 ts-node 
npm install typescript @types/express @types/cors @types/node nodemon
```

それぞれ
1. express: Webサーバーフレームワーク。
2. cors: フロントエンドとの通信を許可するためのミドルウェア。
3. mysql2: MySQLデータベースとの接続に使用。
4. typescript: TypeScriptを使用。
5. ts-node: TypeScriptファイルを直接実行するためのツール。
6. nodemon: サーバーが自動で再起動される開発ツール。

## tsconfig.json の初期化
次に、tsconfig.jsonを生成して、TypeScriptの設定を行います。

```bash
npx tsc --init
```
このようにすることでtsの設定ファイルが作られる。最初のcreate react app で出来ているが、もう一度設定しなおしてもよい

そしてnodemon　, ts用のコンパイルを使えるようにするために以下の設定を行う。

```json
"scripts": {
  "start": "nodemon --exec ts-node src/index.ts"
}
```
このようにすることで
```
npm start 
```
でサーバーを起動できる

他の依存関係が少し警告として出るかもしれないが、それを直せば、正しく使える。
オブジェクト配列のプロパティ再設定

```ts
interface DateInfo {
  date: string;
  id: number;
}

interface DateItem {
  month: number;
  dates: DateInfo[];
}

interface DisplyaDateInfo {
  date: string;
  id: number;
  isChecked: boolean;
}

interface DateData {
  month: number;
  isDisplayed: boolean;
  dates: DisplyaDateInfo[];
}

const dateItems: DateItem[] = [
  { month: 8, dates: [{ date: '2021-08-01', id: 1 }] },
  { month: 9, dates: [{ date: '2021-09-02', id: 2 }, { date: '2021-09-03', id: 3 }] },
  { month: 10, dates: [{ date: '2021-10-04', id: 4 }, { date: '2021-10-05', id: 5 }] },
  {
    month: 11,
    dates: [
      { date: '2021-11-06', id: 6 },
      { date: '2021-11-07', id: 7 },
      { date: '2021-11-08', id: 8 },
      { date: '2021-11-09', id: 9 },
      { date: '2021-11-10', id: 10 }
    ]
  }
]

// DateItem[] から DateData[] に変換
const dateData: DateData[] = dateItems.map(item => ({
    month: item.month,
    isDisplayed: false, // 全て false に設定
    dates: item.dates.map(dateInfo => ({
      date: dateInfo.date,
      id: dateInfo.id,
      isChecked: false // 全て false に設定
    }))
  }));

// 結果をコンソールに表示
console.log(dateData);
```
書評：ChatGPT 大規模言語モデルの進化と応用

# 経緯
5/26に開催された技術書典16のオフライン会場で小川航平さんとばったりお会いし「ChatGPT 大規模言語モデルの進化と応用」を献本頂いておりました。出版おめでとうございます！

https://www.ric.co.jp/book/new-publication/detail/2709

あの時書評するといったまま数ヵ月たってしまっていました。ごめんなさい。
ということで、早速書評させていただきたいと思います。

## 目次
※ 各章の折りたたみを展開すると節の内容が確認できます
<details>
<summary>第1章　ChatGPTの概要</summary>

1.1 ChatGPT登場の背景と社会的反響
1.2 言語モデルの歴史
</details>
<details>
<summary>第2章　ChatGPTの動作原理</summary>

2.1　トランスフォーマー
2.2　BERT
2.3　GPT-3
2.4　RLHF
</details>
<details>
<summary>第3章　他の大規模言語モデル</summary>

3.1　LaMDAとBard
3.2　PaLM
3.3　LLaMA
</details>
<details>
<summary>第4章　ChatGPTのAPI</summary>

4.1　ChatGPTのAPIとは？
4.2　アクセス取得及び最初の呼び出し
4.3　入力及び応答のフォーマット
4.4　アドバンスドな利用方法
</details>
<details>
<summary>第5章　APIを用いたファインチューニング</summary>

5.1　ファインチューニングの準備
5.2　ファインチューニングの実行
5.3　推論の実行
</details>
<details>
<summary>第6章　HuggingFaceを用いたファインチューニング</summary>

6.1　Pythonスクリプトによる学習の準備
6.2　モデルの学習
6.3　推論
6.4　RLHFの再現
</details>
<details>
<summary>第7章　プロンプトエンジニアリング</summary>

7.1　プロンプトエンジニアリングの概要
7.2　プロンプトのパターン
7.3　日本語のプロンプトエンジニアリング
</details>
<details>
<summary>第8章　Microsoftのサービスで始めるLLMシステム</summary>

8.1　本章に書くこと・書かないこと
8.2　LLMを組み込んだMicrosoft製品
8.3　Azure OpenAI Serviceという選択肢
8.4　RAGアーキテクチャ
8.5　研究者のためのクイックなRAG環境構築：Azure OpenAI Serviceとカスタム実装
8.6　本章の最後に
</details>
<details>
<summary>第9章　ChatGPTの限界を越えて</summary>

9.1　ChatGPTの限界
9.2　外部APIを用いたChatGPTの改善
9.3　ChatGPT生成文章の識別
9.4　ChatGPTとAGI
</details>
<details>
<summary>第10章　マルチモーダル大規模モデルの数々</summary>

10.1　テキストによる画像生成
10.2　テキストによる動画生成
10.3　テキストによる音声・音楽生成
</details>
<details>
<summary>第11章　今後の課題</summary>

11.1　言語モデルの現状
11.2　言語モデルの今後
11.3　結語
</details>

# 書籍紹介
本書は、目次とおり11章で構成されていますがトータルのページ数は192ページでコンパクトにまとめられています。
読者対象もデータサイエンティストや研究者を想定されており、説明の中で数式やPythonのサンプルコードも出てくるのでそれらに興味のある方が手に取られるとより理解が深まる内容になっています。
参考文献も83個と多く掲載されているため、より深堀したい方は論文に飛んで理解を深めることができます。

具体的な内容はマスクド・アナライズさんが紹介されているのでぜひご覧ください。

https://note.com/maskedanl/n/n1e1702880e0f


# 感想

2章の自然言語モデルの進化の流れを振り返ると、数年前に「ゼロから作るＤｅｅｐ　Ｌｅａｒｎｉｎｇ〈２〉自然言語処理編」でRNN/LSTM実装してふむふむ言ってた時やその後BERTとかも動かしてみて、人に比べるとまだまだやなーと思っていたのが、2, 3年前にChatGPTが出てきて飛躍的に性能が向上していたのを目の当たりにして度肝抜かされた時のことを思い出します。

という個人的な感想(感傷？)はおいといて、

本書は、ChatGPTの理論的な話から、プレイグラインドやAPIを活用した基本的な利用方法だけでなく、ファインチューニングの方法まで一通りサンプルコード付きで、GoogleColaboratoryで試せるのがいいですね。理論だけでなく実践も手触り感のある形で理解することができます。

8章も本文の内容としては、研究者やデータサイエンティスト向けにエンジニアリング要素少な目で解説していますが、深堀したい方向けにgithubリポジトリのリンクも提供されています。そのため、エンジニアの方もこの本でChatGPTの理論を理解した上でgithubリポジトリのサンプルコードでより深堀するという使い方もできそうですね。

# まとめ

とこうことで、「ChatGPT 大規模言語モデルの進化と応用」の書評でした。
ChatGPTの理論を知りたい方が入門書として最初に読むのに適しており、研究者やデータサイエンティストの方がより理論の理解を深めたい方は参考文献の論文を読む、エンジニアの方が実装面の理解を深めたい場合はgithubリポジトリのサンプルコードを動かしたりデプロイして確かめるなど多様な使い方ができる一冊です！
Typescriptの関数

# tsの関数

大部分の基礎的な内容はこのブログで学べます👉[Functions - TypeScript Deep Dive](https://basarat.gitbook.io/typescript/type-system/functions)

**関数の型**は`TypeScriptの型システム`において非常に重要な役割を果たしています。それらは可変性のあるシステムの中心的な構成要素です。

## 1. パラメータ注釈

変数に注釈を付けるのと同じように、**関数**の型にも注釈を付けることができます。
```typescript
// 変数注釈
let sampleVariable: { bar: number }

// 関数パラメータ注釈
function foo1(sampleParameter: { bar: number }) { }

let foo2 = (sampleParameter: { bar: number }) => {}
```

### 1.1 残余引数
```typescript
const fn = (array: number[], ...items: any): any[] => {
    console.log(array, items)
    return items
}

console.log(fn([1, 2, 3], 'J4ck', true));
/*
出力:
[ 1, 2, 3 ] [ 'J4ck', true ]
[ 'J4ck', true ]
*/
```

### 1.2 this パラメータ

これは **python** の `self` のように見えますが、**パラメータリスト**の`最初の`位置にしか書かないです。

```typescript
interface Obj {
    name: string
    // getNameを呼び出すときのthisの型を制限
    getName(this: Obj): string
}
const obj: Obj = {
    name: "J4ck",
    getName() {
        return this.name
    },
}
obj.getName() //出力:J4ck
```
こうすると、**this** は **getName()** を呼び出す **obj** を指します。

## 2. オーバーローディング

`TypeScript`では関数オーバーロードのメカニズムが提供されていますが、このオーバーロードは、Javaの観点から見ると少し奇妙に感じるかもしれません。

`padding()` を実装する例を示しますが、**css** に詳しい方は **padding** がいくつかの書き方をサポートしていることを知っているでしょう。

```css
.sample1 {
    /* すべての辺に適用 */
    padding: 5px;
}

.sample2 {
    /* 上辺と下辺 | 左辺と右辺 */
    padding: 5px 5px;
}

.sample3 {
    /* 上辺 | 右辺 | 下辺 | 左辺 */
    padding: 5px 5px 5px 5px;
}
```
これを見ると、3つのオーバーロードが必要であり、したがって4つの関数ヘッダーを宣言する必要があります。そして、最後の関数ヘッダーを宣言した後に、全体のメソッドを実装します。これこそ私がが驚いた点です。

3つのオーバーロード関数の実装ロジックは最後の関数内にあり、`if(parameter === undefined)`のような書き方で渡されたパラメータを判断し、対応するコードブロックにジャンプします。
```typescript
// オーバーロード
function padding(all: number);
function padding(topAndBottom: number, leftAndRight: number);
function padding(top: number, right: number, bottom: number, left: number);
// 実際の実装はすべてのケースを処理する必要がある
function padding(a: number, b?: number, c?: number, d?: number) {
    if (b === undefined && c === undefined && d === undefined) {
        b = c = d = a;
    }
    else if (c === undefined && d === undefined) {
        c = a;
        d = b;
    }
    return {
        top: a,
        right: b,
        bottom: c,
        left: d
    };
}
```
> TypeScript の関数オーバーロードには実行時のオーバーヘッドはありません。それは関数の呼び出し方法を記>録できるだけで、コンパイラが残りのコードをチェックします。

ただし、これは1つの例に過ぎません。実際には、可変長引数で実装できる関数の場合、関数オーバーロードの使用は推奨されません。
いくつかの資料を調べた結果、自分なりにまとめました。
1.**TypeScript**では可変長引数が存在するため、**パラメータリスト**の数が多い場合は、可変長引数で実装することができます。
```typescript
function padding(all: number);
function padding(topAndBottom: number, leftAndRight: number);
//=========================//
function padding(a: number, b?: number);
```
2.**パラメータリスト**内でパラメータの型が異なる場合は、関数オーバーロードを使用して実装します。
```typescript
function showName(name: string): string;
function showName(names: string[]): string[];
function showName(names: unknown): unknown {
    if (typeof names === 'string') {
        return `${names}`;
    } else if (Array.isArray(names)) {
        return names.map(name => `${name}`);
    }
}

console.log(showName('J4ck'));   //出力:J4ck
console.log(showName(['J4ck', 'Ju11y']));   //出力:[ 'J4ck', 'Ju11y' ]
```
オブジェクト配列にグループごとに格納

```ts
interface DateInfo {
  date: string;
  id: number;
}

interface DateItem {
  month: number;
  dates: DateInfo[];
}

// 元データ
const dataInfo: DateInfo[] = [
  { date: '2021-08-01', id: 1 },
  { date: '2021-09-02', id: 2 },
  { date: '2021-09-03', id: 3 },
  { date: '2021-10-04', id: 4 },
  { date: '2021-10-05', id: 5 },
  { date: '2021-11-06', id: 6 },
  { date: '2021-11-07', id: 7 },
  { date: '2021-11-08', id: 8 },
  { date: '2021-11-09', id: 9 },
  { date: '2021-11-10', id: 10 }
];

// DateItem型の配列に変換
const groupByMonth = (dates: DateInfo[]): DateItem[] => {
  const grouped: { [key: number]: DateInfo[] } = {};

  dates.forEach(dateInfo => {
    // 月を取得
    const month = new Date(dateInfo.date).getMonth() + 1; // 月は0から始まるので+1
    // 同じ月がすでに存在している場合、その配列に追加
    if (!grouped[month]) {
      grouped[month] = [];
    }
    grouped[month].push(dateInfo);
  });

  // groupedオブジェクトをDateItem型の配列に変換
  return Object.keys(grouped).map(month => ({
    month: Number(month),
    dates: grouped[Number(month)]
  }));
};

// 結果を取得
const result: DateItem[] = groupByMonth(dataInfo);

// 結果をコンソールに表示
console.log(result);
```
【Next.js14 + Turbopack】インストール後にTailwind CSSを導入する手順

# はじめに
Turbopackを利用してNext.jsをインストールすると、別途Tailwind cssをインストールする必要があります。
これからご紹介する手順を忘れるとTailwind cssが効かず時間を潰すことになるので、ここにまとめておきます。

# Next.jsをインストール

Turbopackを使用してNext.jsをインストールします

```
$ npx create-next-app --ts --example with-turbopack
```

作成されたディレクトリに移動して以下のコマンドを実行します。
①依存関係をインストールします。
```
npm install
```
②開発サーバーを起動します。
```
npm run dev
```

Hello, Next.js!が画面上に表示されればNext.jsのインストール作業は成功です。


# Tailwind cssをインストール
以下のコマンドを同じディレクトリ内で実行します。
```
npm install -D tailwindcss postcss autoprefixer

npx tailwindcss init -p
```

ここで注意なのですが、上記コマンド実行後に「postcss.config.js」がきちんと生成されているか確認してください。
もしpostcss.config.jsがない場合は、この後の作業をしてもtailwindが適用されないです。

きちんとpostcss.config.jsの生成が確認できたら、tailwin.configを以下のように編集します。

```
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    './app/**/*.{js,ts,jsx,tsx,mdx}', 
    './pages/**/*.{js,ts,jsx,tsx,mdx}',
    './components/**/*.{js,ts,jsx,tsx,mdx}',
  ],
  theme: {
    extend: {},
  },
}
```
この部分は公式サイトに詳細ありますので、参考にしてみてください

https://nextjs.org/docs/app/building-your-application/styling/tailwind-css

tailwin.configの編集が終わったらglobals.cssファイルをappディレクトリ配下に作成します。

その中に以下を記載します。
```: global.css
@tailwind base;
@tailwind components;
@tailwind utilities;
```
上記のglobal.cssをappディレクトリ配下のlayout.tsxでインポートをします。

page.tsxでtailwindcssを試してみてスタイルが変更されていればTailwind CSSのインストールが成功していることになります。

# おわりに
Next.jsのインストールをする時に、tailwind cssをインストールするか質問されて自動インストールされるのですが、turbopackのインストールを行う時には質問がされなかったため別途tailwindのインストールが必要になります。
一つ一つの手順は大変ではないですが、どれか一つの手順が欠けるとエラーも出ず原因がわからないという状態になったので今回まとめておきました。
これから開発を始める方の参考になれば幸いです！

# JISOUのメンバー募集中！

プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
実践的なカリキュラムで、あなたのエンジニアとしてのキャリアを最短で飛躍させましょう！
興味のある方は、ぜひホームページからお気軽にカウンセリングをお申し込みください！
▼▼▼

https://projisou.jp/
Windows11にGradleをインストールしてみた。

#### 1.公式サイトにアクセスし、Installをクリック
https://gradle.org/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511376/e4703ba6-c363-7c85-a7c3-8fb7878d345f.png)

#### 2.ページを少し下にスクロールし、Binary-onlyをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511376/c029a7ee-96c7-8799-fafc-b4fc7e2741fd.png)

#### 3.zipがダウンロードされるので解凍する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511376/dbb3897f-f67e-0cb9-5aa4-b4519135df55.png)

#### 4.解凍したフォルダをC直下に配置
(この時は解凍したgradle-8.10-bin内のgradle-8.10だけ移動しました。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511376/2b19cd29-4ad7-72a6-9b99-18b048ef8d37.png)


#### 5.システム環境変数で`新規(W)`をクリックし、GRADLE_HOMEを追加
変数名：`GRADLE_HOME`
変数値：`C:\gradle-8.10`

※システム環境変数の編集ができない場合、[こちら](https://qiita.com/inokou/items/61e9d87d41e27459db78)を参照してください。
　  windows11でも問題なくできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511376/e4ce2335-e4da-5868-3237-16e94f4b5147.png)


#### 6.システム環境変数の`Path`へ追記
`Path`を選んで編集⇒新規⇒`%GRADLE_HOME%\bin`を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511376/59fdd6a0-a5cd-c9ad-6544-bf7228d4f10c.png)


#### 7.確認してエラーが出なければOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511376/691a7caa-c26d-a07c-6ded-3c9c2995f55e.png)


#### 参照
[Gradle のインストール（Windows 上）](https://www.kkaneko.jp/tools/win/gradle.html)

[Windows10にGradleをインストール](https://qiita.com/quwahara/items/9c4e5fbda421cfcb09ad)

[win10の環境変数を「管理者権限」で開く方法](https://qiita.com/inokou/items/61e9d87d41e27459db78)


#### 以上。
インターネットから簡単に音楽を落とす(Windows)

## TL;DR
- Youtubeから音楽をダウンロードするときは、yt-dlpを使う
- 音楽のメタデータを自動で埋め込むために、spotdl + "--only-verified-results"を使える
- 音量を一定にするために、aacgainを使う(タグ情報の編集もできる)

#### 1. 必要な再頒布可能パッケージをインストールする

[ここ](https://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-studio-2015-2017-2019-and-2022)から、OSの種類に合わせてインストールする(X64を選択した)

#### 2. Pythonをインストールする

[ここ](https://www.python.org/downloads/)から、OSの種類に合わせてインストールする
(Windows installer (64-bit)を選択した)

:::note warn
必ず下のほうにある「Add python.exe to PATH」にチェックを入れる
:::

#### 3. コマンドプロンプトを開いて、以下のコマンドを実行する
```bash
pip install yt-dlp spotdl
```
:::note info
winボタンを押して、`cmd`と入力すると、コマンドプロンプトが開く
:::

#### 4. ffmpegをインストールする
[ここ](https://github.com/yt-dlp/FFmpeg-Builds?tab=readme-ov-file#downloads)から、OSの種類に合わせてダウンロードする(WINDOWS X64を選択した)

ダウンロードしたファイルを解凍して、`bin`フォルダ内を適当なディレクトリにコピーする(例: `C:\ffmpeg`)

winボタンを押して、`path`を入力して、`システム環境変数の編集`をクリックする。右下の`環境変数`をクリックして、開いたウィンドウでユーザー環境変数の`Path`をダブルクリックして、開いたウィンドウで`新規`をクリックして、ffmpegのbinフォルダのパスを追加する(例: `C:\ffmpeg`)

#### 5. aacgainをインストールする

参考:https://triton.casey.jp/portable/aacgain/

[ここ](https://mp3gain.sourceforge.net/download.php)から、`mp3gain-win-1_2_5.zip`をダウンロードし、解凍する

次に、[ここ](https://www.rarewares.org/aac-encoders.php#aacgain)から、`aacgain_1_9.zip`をダウンロードし、解凍し、`aacgain.exe`を`mp3gain.exe`にリネームして、`mp3gain`のフォルダに移動して、上書きする

使いたいときは、`MP3GainGUI.exe`を実行する

### 使い方

#### yt-dlp

適当なディレクトリでcmdを開いて、
基本的には`yt-dlp URL [options]`

URL: ダウンロードしたい動画のURLや、プレイリストのURL、チャンネルのURLなどを指定できる

options: オプションを指定できる
- `-o`: 出力ファイル名を指定できる (例: `-o "%(title)s.%(ext)s"`)
- `-x`: 音声のみをダウンロードする
- `-f`: フォーマットを指定できる
- `--embed-thumbnail`: サムネイルを埋め込む
- `--add-metadata`: メタデータを埋め込む
- `-a`:  テキストファイルからURLを読み込み、順にダウンロードする

例:
```powershell
yt-dlp -x -o "%(playlist_index)03d %(artist,creator,channel,uploder)s - %(track,title)s.m4a" --embed-thumbnail --add-metadata -f bestaudio --audio-format m4a https://www.youtube.com/playlist?list=xxxx-xx-xx
```

:::note info
youtubeから楽曲がダウンロードできない場合は、URLを`https://music.youtube.com/`に変更するとダウンロードできることがある
:::

#### spotdl

参考：https://spotdl.readthedocs.io/en/latest/usage/

適当なディレクトリでcmdを開いて、
基本的には`spotdl download URL [options]`

URL: ダウンロードしたい楽曲のURLや、プレイリスト、アーティスト、アルバムのURLなどを指定できる

options: オプションを指定できる

- `--only-verified-results`: 本人歌唱と確認された楽曲のみをダウンロードする
- `--format`: フォーマットを指定できる
- `--output`: 出力ファイル名を指定できる

例:
```powershell
spotdl download https://open.spotify.com/playlist/xxxx-xx-xx--only-verified-results --format m4a --output "{track-number} {artist} - {track-name}.m4a"
```

:::note warn

`URL`と`[options]`を入れ替えると動かなくなるので注意する

:::

対話的に行いたい場合は`spotdl web --only-verified-results`
検索するところにプレイリストのURLを入れてボタンを押すと、ダウンロードが始まる（`C:\Users\*username*\.spotdl\web\sessions\*session_id*`) に保存される


#### aacgain

`mp3gainGUI.exe`を実行して、ファイルをドラッグアンドドロップする

::: note warn

ファイル名に記号が含まれているとファイルが読み込まれないことがある。
読み込みたいファイル数と読み込まれたファイル数をが同じであることを確認する

:::
ブログを初めてみよう

#ブログを始めて見ようと思います


#はじめに
はじめまして。Haruです。
私は情報系学生B4のatcoder初心者です。
目標はとりあえず入緑することです。
今の現状はBまではほとんど解けるがCはほとんど解けないという現状です。鉄則本を昔読んで途中で挫折した経験があります。
差し当たってアルゴリズムを勉強する必要があるかなと思いました。

##ブログをはじめようと思ったきっかけ
またブログを始めようと思ったきっかけはその時どのようなことを思っていたのかや勉強の進捗などをつけることでやる気につながるかなと思い、始めました。
内容は完全に自分用で勉強したことの振り返りや思ったことなどを自由に書いていく形式になります。

##勉強したい言語
・Python : DjangoでWebアプリケーションを作れるようになりたい。あと単純に書き方が好きなため
・HTML5, CSS, Javascript : webアプリケーションで必要なため
・C++ C言語と似ていて競プロでコモンな言語のため
・Java Webアプリケーションを作ってみたい。
・Swift: iphoneアプリを開発したくてmacを買ったため

##近況
院試が残念な結果に終わり、就職活動も遅めですが始めることになりました。
Webアプリケーションを作る仕事に就きたく、Web系に就職するためには多くの場合ポートフォリオが必要だということを知り、ポートフォリオを作り始めました。

ポートフォリオでは今自分が作りたいものということで、いま就活で応募している会社さんや適性検査締切日などを管理するアプリケーションをdjangoで作ることにしました。

youtubeで松岡幸一郎さんのライブモデリングとコーディングで理解するDDDという動画やドメイン駆動設計・モデリング/実装入門　勉強会、TDD（テスト駆動設計）に関する動画を見て設計などを書き始めました。この時点ではTDDのやり方とDDDの概念は理解できたのですが、djangoで具体的にどのように実装するかはわかりませんでした。

またとりあえずdjangoの復習としてUdemyで「きみのIT教室」さんの「初心者でも心配無用　圧倒的わかりやすさで、さぁ　Djangoをはじめよう」という動画を1日で終わらせました。

またgitとgithubの復習も必要だと思い、Udemyの山浦清透さんの「git : はじめてのgitとgithub」という動画をみました。

これらを見て、開発をして欲しかった機能は実装デプロイまでいけたのですが、初心者らしいミステイクを何度かしました。

git commit -vでローカルリポジトリにコミットする際、コメントだけじゃなく差分も保存されると思っていたのですが、プルリクエストをしないと差分がみれないことを初めて知りました。また開発をmainブランチでしていたので作業ブランチでしないといけないことも学びました。

またDDDをDjangoでどのように実装するのか他の人のqiitaを覗いてみたのですが、まだ初心者の私では理解できませんでした。

#今後やること
Udemyの山浦清透さんの「git : はじめてのgitとgithub」の続編の「Git： もう怖くないGit！チーム開発で必要なGitを完全マスター」をとりあえず全て見ようと思います。
またDJANGO for BEGINNERSという海外で有名なdjangoの本を買ったので全てこなしてみたいと思います。
また自分が使う用にポートフォリオは作成したのでログイン機能等は実装していなかったのですがログイン機能も実装してみようと思います。
【アジャイル開発】勉強したのでメモ

どうもこんにちは。

今回は、アジャイル開発について自分なりにもっと理解を深める必要がありそうだったので、本を読んでみました。
（いわば読書感想文です。）

https://www.amazon.co.jp/dp/B088YGLSRJ

また、弊社開発部の勉強会で先輩社員に説明していただいた知識も含めた上でまとめていきます。

# アジャイル開発とは

まず、アジャイル開発は「**短い期間でリリースし、フィードバックを受け、改善するというサイクルを基本**」としている開発手法です。

アジャイル開発の語源として、**Agility**という英単語がありますが、これの意味は**素早さ**です。このことからわかるように、アジャイル開発は「**開発スピードに重点を置いた開発手法**」であることがわかります。

アジャイル開発の1つである、**スクラム開発**では、1~4週間（スプリント）を開発サイクルとし、各サイクルごとに機能開発&テストを繰り返します。また、必要に応じて開発計画を修正します。

![スクリーンショット 2024-09-09 10.06.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711491/8369c0ca-12a9-e387-b8f4-1f50da277739.png)

↓スプリント内の流れ↓
![スクリーンショット 2024-09-09 10.06.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711491/69f48d5e-dda6-4b0e-b458-87f542c3b377.png)


:::note info
アジャイル開発でいう「フィードバック」とは、実際にソフトウェアを使用しているユーザからフィードバックはもちろんですが、開発チーム自身が気づいたフィードバックも含まれます。
また、スピードを早くするというのは、「**ゴールまでの時間を早くする**」ということではなく、「**起こった出来事に対して素早く反応し意思決定を早くする**」ということです。
:::

アジャイル開発では、スプリントを回していく中で機能の改修方針に加えて、開発の進め方も変化していきます。アジャイル開発を **始める時点で議論したベストプラクティスが数週間、数ヶ月経った時には別物に変化** していきます。

# アジャイル開発の価値観

アジャイル開発の価値観は2001年に、アメリカのソフトウェアエンジニアであるエンジニアであるケント・ベックという方がまとめた「アジャイルソフトウェア開発宣言」で宣言されています。

- プロセスやツールよりも個人と対話を
- 包括的なドキュメントよりも動くソフトウェアを
- 契約交渉よりも顧客との協調を
- 計画に従うことよりも変化への対応を

https://agilemanifesto.org/iso/ja/manifesto.html

## アジャイルソフトウェア開発宣言から汲み取ることができる価値観

- 顧客インサイトにより本当に必要なソフトウェアを作る
- 机上の空論ではなく実際に動くものを見て判断し、改善していく

:::note warn
この宣言は「AよりもBを」というように比較の形式になっていますが、Aの概念が不要であるという価値観ではありません。「計画をドキュメント化するよりも手を動かした方が素早いよね」というような捉え方をしてしまってはいけません。少なくともドキュメント化して残しておくことは振り返り・フィードバックを行う上で必要です。
:::

# アジャイル開発の源流「カイゼン」

「改善」という日本語は、世界で通じます。しかし、世界ではカタカナで「カイゼン」と表現されます。
しかし、日本語の「改善」と世界共通の「カイゼン」は解釈が異なります。

| | いつやるか | 何のためにやるか |
| --- | --- | --- |
| 改善 | 問題が発生した時に | 発生している問題を取り除くため |
| カイゼン | 常に | 現状をより良い状態にするため　|

こうして比較してみると、世界共通の「カイゼン」は **ポジティブ**な意味で捉えられることがわかりますね。

# PDCAサイクルとOODAサイクル

## PDCAサイクル

継続的により良いものにを作っていくための手法として、**PDCAサイクル**という言葉を聞いたことがある人はたくさんいると思います。

| | 意味 |
| --- | --- |
| P | Plan（計画） |
| D | Do（実行） |
| C | Check（評価） |
| A | Action（改善） |

PDCAサイクルでは、「**達成したい成果に対して何が足りていないのか**」を常に評価して改善していくことができます。

## OODAサイクル

OODAサイクルとは、対象を観察しながら意思決定を進めていく手法です。PDCAサイクルを実行する、前の段階で行うサイクルというスタンスです。

| | 意味 |
| --- | --- |
| O | Observe（観察） |
| O | Orient（方針決定） |
| D | Decide（意思決定） |
| A | Action（改善） |

# 日本でも広がっているアジャイル開発

企業IT動向調査報告書2024によると、日本におけるアジャイル開発の導入状況は以下のようになっています。（P205参照）

| ステータス | 割合（％） |
| --- | --- |
| 導入中 | 21.5 |
| 試験導入中･導入準備中 | 11.5 |
| 検討中 | 18.3 |
| 検討後見送り | 3.2 |
| 未検討 | 45.5 |

アジャイル開発に対して前向きな企業が約半数、見送り・未検討の企業が約半数という状況でした。
この報告書によると、「**検討段階から導入段階へとさらにシフトする傾向がみられた**」とのことでしたので、少しずつアジャイル開発が導入され始めていると捉えても良さそうです。

https://juas.or.jp/cms/media/2024/04/JUAS_IT2024.pdf
【機械学習/MLフレームワーク】LightGBMとは何かについて概要を整理してみた。

# 1. LightGBMとは何か
まず、LightGBMの概要を説明します。

**LightGBM**は、Microsoftが開発した勾配ブースティング※1 のフレームワークです。特に、大規模なデータセットを効率的に処理するために設計されており、分類、回帰、ランキング問題などに広く利用されています。

※1 勾配ブースティングは、決定木をベースにしたアンサンブル学習法の一つである。

 主な特徴:
- 高速な学習と予測速度
- メモリ使用量の低さ
- 大規模データに強い
- 欠損値やカテゴリ変数の取り扱いに優れている​

# 2. LightGBMのアルゴリズム構成
LightGBMは、従来の勾配ブースティングアルゴリズムを改良し、特に以下の点で優れています。

## 2.1. ヒストグラムベースの決定木学習
LightGBMは、データをビン（bin）に分割し、連続変数を効率的に処理します。このヒストグラムアプローチにより、他の勾配ブースティングツールよりも計算コストを削減できます。

## 2.2. Leaf-wise（リーフ重視）の木構造
通常の決定木はレベルごとに分割されますが、LightGBMではリーフごとに分割されます。これにより、より深いツリーが作成され、予測の精度が向上する反面、過学習（オーバーフィッティング）のリスクも増します。

## 2.3. 勾配ブースティングとバギングの組み合わせ
LightGBMは勾配ブースティングにバギング（ブートストラップ）を組み合わせることで、モデルの安定性と精度を向上させます。これにより、ノイズの多いデータや複雑なモデルにも強くなります​

## 2.4  LightGBMの実装例

``` python:python.py

import lightgbm as lgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# データの準備
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# LightGBM データセット作成
train_data = lgb.Dataset(X_train, label=y_train)

# ハイパーパラメータ設定
params = {
    'objective': 'binary',
    'boosting_type': 'gbdt',
    'metric': 'binary_logloss',
    'num_leaves': 31,
    'learning_rate': 0.05
}

# モデルの学習
model = lgb.train(params, train_data, num_boost_round=100)

# 予測
y_pred = model.predict(X_test)
y_pred = [1 if pred >= 0.5 else 0 for pred in y_pred]

# 精度の評価
print('Accuracy:', accuracy_score(y_test, y_pred))
```

## 4. LightGBMのメリットとデメリット
最後に、LightGBMのメリットとデメリットを整理します。

メリット:

大規模データの処理に強く、他の勾配ブースティング手法より高速
自動で欠損値処理を行う機能
カテゴリ変数のエンコーディングが不要
デメリット:

過学習しやすい（特にnum_leavesが大きい場合）
チューニングが必要なパラメータが多い
AndroidStudioで実は便利なショートカット

# はじめに
今回は、普段あまり登場する場面はないけど覚えておくといざというときに便利すぎるショートカットを紹介していきます
### 本文

cmd shift F8 
---
このコマンドではブレイクポイントを検索することができます
デバッグ中に以前置いておいたブレイクポイントで止まってしまったりブレイクポイントを設置しすぎるとデバッグモードがうまく作用しなかったりするので便利です

cmd shift u 
---
大文字小文字切替ができます
enumや定数宣言時などに便利です

option enter
---
赤線などでの警告箇所やエラー箇所でこのショートカットをすることで自動的にインポートしてくれたり簡易的に直してくれたりなど意外と便利です

cmd r
---
対象の文言を置換することができます
renameではうまくいかない部分などを置換するのに便利です

opt ctr o
---
インポートのソートと削除

### 最後に
今回は最近いろいろと気になって調べていたショートカットを備忘録程度の記事にしてみました
どなたかのお役に立てれば幸いです
脳死でstringsはcatの上位互換だと思ってたら全然違った話

おはようございます！
駆け出しエンジニアのさわまりんです！

今回はLinuxコマンドの「strings」と「cat」について詳しく見ていきます。

# はじめに
picoCTFでとある問題を解いていたときのことです。

普段通り、catでファイルの中身を見てみようと思ったら
文字化けで内容が何も読み取れませんでした。

そこでstringsを使用してみると見事にflag発見！

試してみたところ、
catで内容が正しく読み取れるファイルは
stringsでも内容を見ることができました。

そこで私は「strings最強やん」って思っていました。
それ以降は、基本はcatを使用するものの
困ったことがあればすぐにstringsを使用していました。

もちろんコマンドの詳細を知ることなく...


# それぞれのコマンドの詳細
さすがに知らないまま使うことに危機感を覚えました。
それぞれ`--help`で調べると以下のような説明がありました。

## cat
> Concatenate FILE(s) to standard output.

→ 標準入力のデータをそのまま標準出力に連結

## strings
> Display printable strings in [file(s)] (stdin by default)

→ 印刷可能な“文字列”として読める箇所を表示


つまり、catはファイルの中身をそのまま表示するのに対して、
stringsはファイルの中から文字列だけを抽出して表示します。

# おわりに
「なぜか使える～」というノリでただ使うのではなく、
それぞれどのような違いがあるのか知っておくのは非常に重要ですね。

皆さんもわからないをわからないままにせず、
チラ見するだけでもいいので調べる習慣をつけてみてくださいね。
:penguin::penguin::penguin::penguin::penguin:
Deep-Live-Camの使い方（備忘録用）

# 趣旨
DeepFakeをライブで実践する方法をメモレベルで残しておきます。Macのスペックが低くて解像度など微妙でしたけど、よいMacを使えばかなりいい感じになると思います。備忘録用なので詳細は説明しません。でもコマンドを順番に打っていけばとりあえずは動くと思います。

# ライブラリのインストール
一気にインストールできると思いますけど、僕は何がインストールされるのかみてみたかったので一つずつ実践しました。詳細はGitHubを見ればよいと思います。仮想環境は事前に用意してからインストールしましょう。
```
git clone https://github.com/hacksider/Deep-Live-Cam.git
pip uninstall onnxruntime onnxruntime-silicon
pip install --upgrade pip
pip install onnxruntime-coreml==1.13.1
pip install torch
pip install tensorflow
pip install customtkinter
brew install python-tk
pip install opencv-python
pip install opencv-contrib-python
pip install Pillow
pip install insightface
python run.py --execution-provider coreml
```
自分がどのディレクトリに置いたのか忘れそうなので一応仮想環境の中に入る時のPathも部分的にここに残しておきます。ライブラリがインストールされた仮想環境でrun.pyがあるディレクトリにてファイルを引数と共に起動するとカメラが起動します。
```
source deepfakeenv/bin/activate
cd /Users/user/deepfake
python run.py --execution-provider coreml
```

自分の顔と扮したい顔の両方を画像で登録すればあとはライブで自分の顔が動いていても他人に扮装することができます。