OmniAICreator/Qiita-1.07M huggingface dataset:
[AWS入門] CloudFrontって何してるの

# 概要
「クラウドフロント？あー、なんかキャッシュするやつですよねw」

AWSをかじりたての私が何度も口にした言葉です。
業務で使用するうちに少し解像度が上がってきたので、忘れないようにメモしておきたいと思います。

# AWS CloudFrontとは
CloudFrontはAWS上におけるCDN(Contests Delivery Network)サービスです。
サーバーなどの前面に配置して、コンテンツ(画像・HTMLなど)をキャッシュしておく役割があります。

例えば、CloudFront→S3といったようなインフラ構成の場合、CloudFrontにキャッシュがない場合はS3にコンテンツをとりにいきますが、キャッシュを保持している場合はCloudFrontがコンテンツを返却してくれます。
また、コンテンツがキャッシュされていない場合でも、今回返却されたコンテンツをキャッシュするので、次回のアクセス時にはキャッシュを利用することができます。

![見出し.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576260/20d91357-8372-784d-add6-82a4305ffd42.png)


# 用語たち
CloudFrontを使用する上でよく聞く使用する用語たちです。

## オリジン
CloudFrontの背面に待ち構えているサーバー(オリジンサーバー)のことです。
上記の例だと、S3がオリジンに当たります。
S3以外にも、ALB(Application Load Balancer)などのサービスを配置することができます。

## エッジロケーション
CloudFrontを含むCDNサーバーは世界中に配置されています。
この世界中に配置されたサーバーをエッジサーバーと言いますが、CloudFrontの世界ではエッジロケーションと言います。
要するに、世界中にいっぱいあるCloudFrontのキャッシュ用サーバーがエッジロケーションです。

# なぜCloudFrontを使用すると嬉しいのか
サーバーへの問い合わせがなくなる分、コンテンツが返却される速度が上がります。
それに伴い、同時にサーバーへの負荷を減らすこともできます。

また、レイテンシー（遅延）の問題を解決することもできます。
例えば、サービスを提供するサーバーが日本に設置されているとします。
この場合、日本からのアクセスと、アメリカからのアクセスではもちろんアメリカからのアクセスの方が時間がかかります（地理的に遠いので）。
このように、地理的に遠い場所からのアクセスではレイテンシーが大きくなってしまいます。

しかし、CloudFront含むCDNは、最寄りのエッジロケーションにキャッシュを取得しにいくため、地理的な要因によるレイテンシーの増大を阻止することができます。

![見出し (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576260/bff15d96-3bbc-78bf-19d0-a39c3b8f529f.png)
※画像はイメージです


# (おまけ)ファイヤーウォールとしての役割
CloudFrontはセキュリティ向上にも貢献します。
CloudFrontにはWAF(Web Application Firewall)を設定することができます。
WAFはOSI参照モデルのアプリケーション層で動作する機能で、リクエスト内容を検査した上で、特定の悪意がある（と思われる）通信をブロックします。
本記事では詳しくは触れませんが、基本設定ならクリック一つで設定できるような簡単なものです。

# 感想
インフラってイメージをつかむまでがなかなか難しいです...
「サーバー」と聞くと強いパソコンが1台存在しているような気がしてCDNやCloudFrontのイメージがつかめずにいましたが、世界中にいっぱいいるやつなんだと理解したらなんとなくイメージしやすくなりました。

# 参考
[Amazon CloudFront の主な特徴](https://aws.amazon.com/jp/cloudfront/features/?whats-new-cloudfront.sort-by=item.additionalFields.postDateTime&whats-new-cloudfront.sort-order=desc)
[AWSの基本・仕組み・重要用語が全部わかる教科書](https://www.sbcr.jp/product/4815607852/)
Java Gold 例題 アノテーション

<br>

次のコードについて正しい選択肢を選んでください。

```java
@SafeVarargs
 void method(List<String>... str) {
     System.out.println(str.length);
 }
```

1. このメソッドで可変長引数の警告が抑制される
1. このメソッド及び呼び出し先で警告が抑制される
1. このメソッドは引数なしで呼び出すことはできない
1. コンパイルエラー
1. 実行時例外
1. このアノテーションはメソッドのみ適用できる


<details><summary>解答</summary>
4. コンパイルエラー

- `@SafeVarargs`アノテーションは`private`, `final`, `static`のうち、1つ以上修飾されたメソッドにしか付与できません。
- コンストラクタとメソッドに使用できます。
- 引数が可変ではなく固定長引数の場合もコンパイルエラーです。
- 呼び出し元の警告も抑制されます
- 可変長引数は引数なしでも呼び出し可能です(例: `public static void main(String[] args)`)

:::note
Docment
[`SafeVarargs`](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/lang/SafeVarargs.html)

:::


</details>

---

https://qiita.com/T-ngtj/items/df254aacd05be698199a
ヒデオミ、Qiita復活するってよ。

# 復活宣言
突然ですが、これからはQiitaにできるだけ投稿します。という宣言



# きっかけ
自分、勉強とか記事作成とか結構するタイプなんですけど、アウトプットが全部会社のドメイン内にあるんですよね、、、
情報セキュリティのリスク考えたらそれが正しいのは間違いないのですが、いざ転職活動を考えたときに、外部にアピールできるアウトプットがほとんどないことに気づきました。

これからは、もう少し自分の利益になるようなアウトプットの方法を意識しようと思った次第です。



# 考えている投稿内容
 - ツールやアプリの作成記事
 - 勉強した内容のナレッジシェア
 - コーポレートエンジニアとしての知見？？



# Qiita利用歴
一時期頑張ろうと思って色々書いてたみたいですが、ほとんど下書きで終わってました（20件ぐらいあってちょっと引いてます）
多分転職活動終わってやる気なくなったんだろうなとか推測w

下書きは管理しづらいので消しちゃいます、過去記事は何にもならないけどとりあえず放置します。



# 追記
社外向けのアウトプット全くないわけじゃなかったです。会社の仕事でアドベントカレンダーの記事書いてました。
 - [コーポレートエンジニアがマネーフォワードで働くことについてアレコレ語ってみる記事](https://note.com/hideomi_hk/n/ne9e49473aad6)
 - [気軽にツールを作ってライセンス棚卸しを爆効率化した話](https://note.com/hideomi_hk/n/n2c8351ed14b1)
ITパスポート体験談　受験までの過程と点数を公開！

# ITパスポートを受験してきました
2024年9月7日に受験をしてきました！
10月からシラバスが変わるということもあり、9月中に受験できてよかったです:relaxed:


## 受験結果
総合　635点/1000点
ストラテジ　605点
マネジメント　620点
テクノロジ　585点

けっこうギリギリでした！
結果は11月に発表ですが、合格基準を見る限り合格見込みです。
（追記：合格してました！）

## 受験までの過程:writing_hand:
### 勉強総時間　5-60時間ほど？
勉強を始めたのは早めでしたが、範囲が幅広く感じ、やる気がでなかったのと忙しかったのもあり、超～スロースタートでした。:turtle:)))

4〜8月まで、まとまった時間を確保して集中した勉強はできなかったです。

長期戦でだらだら勉強していたおかげ（？）で、長期記憶できたものもあったので、期間を長めに構えるのも案外いいかもと思いました。


しかし、今回みたく、シラバスが来月から変わる節目などもあるので、短期で合格を目指すのをおすすめします。

### 2024年4月〜　総勉強時間4時間ほど
* 問題集を2冊購入（メルカリ古本購入です）
    * 令和2年「ITパスポートの新よくわかる教科書」
    * 「栢木先生のITパスポート教室 イメージ&クレバー方式でよくわかる 令和02年」
* 過去問道場を10問に取り組む
* 興味のある単元だけまずは流し読み。

個人的には別に古い教科書（古くても直近過去4年までかな）でも、問題なく勉強できるなと思いました。
ただ、シラバスは常に変化していくので、できれば**最新の教科書がいい**と思います。

難しいところは置いといて、**まずは興味のある単元**（マネジメント系のセキュリティとかシステム開発らへん）を読んでいました。


### 2024年5月〜　総勉強時間3時間ほど
* 過去問道場に14問取り組む
* 「ITパスポートの新よくわかる教科書」で、テクノロジ系を流し読み勉強する
* ITパスポートのことを調べる(受験方法とか、得点など)

100問のうち45問出るということで、一番ウエイトの大きく、自分が苦手そうなテクノロジ系は、教科書で勉強。

### 2024年6月〜　総勉強時間5時間ほど
* 過去問道場に59問取り組む
* 「ITパスポートの新よくわかる教科書」で、引き続きテクノロジ系を流し読み勉強する

少しずつ過去問道場をやりはじめました。

### 2024年7月〜　総勉強時間2時間ほど
* 過去問道場に94問取り組む
* 試験の申し込み

このときまでは、過去問道場で、全期間設定の単元毎に勉強してました。
特にテクノロジ系。


### 2024年8月〜　総勉強時間10時間ほど
* 過去問道場に294問取り組む
* IPAのサイトで令和6年の例題を120分で100問解いてみた
* 8月後半に試験を受けようとしたが、無理そうなので受験日を9/8に変更した
* 8月からストラテジ系を勉強

腕試しに令和6年の例題を100問解いてみましたが、ボロボロでした。多分40％くらいの正答率。
**それまで過去問道場を全期間指定の設定でやっていたのですが、時間的にも厳しかったので、とりあえず令和6年〜4年までの3年間を6割までは取れるようにしようと勉強の方向性を変えました。**
ITパスポートは試験日の変更が可能なので、**勉強が間に合わないときは延期できる**のがいいと思いました。
ストラテジ系は暗記が多いかなと思うので、短期で詰め込みました。

### 2024年9/1〜9/7　　総勉強時間30時間ほど
* 過去問道場に752問取り組む

1週間でかなり詰め込みました。:rabbit2::dash:
結果として、**前日までに過去問道場で令和6年〜令和3年（結果4年分まで解きました）は61％ほどの正答率**になりました。
かなりギリギリの状態での受験だったのですが、当日はなんとか600点を超えられました。

## まとめ
テクノロジ系は根本的な理解が大事なので長期記憶、ストラテジは暗記が多いので短期記憶に頼っていたんだなと思いました。
難しいとは思いますが、いつか基本情報の取得も目指してみたいです。
Node.jsを使ってTwitterの特定のキーワードのいいねを自動化

こんにちは！今回は、Node.jsとOpenAIのAPIを利用して、X（旧Twitter）のボットを作成しました。

<h2>作成に至った経緯</h2>
<b>SNS運用のアルバイト経験から感じた効率化の必要性:</b> 私は大学時代、Twitter運用のアルバイトをしていた経験があります。その中でいいね周りを手動で行うことが多く、手作業では非効率的だと感じていました。これを自動化してみたいなと思い、botの作成に至りました。

<b>APIの活用を通じてフロントエンドエンジニアとしての知識をつけたい:</b> 筆者は2025年の4月に新卒で自社開発の企業に入社予定であり、エンジニアとしての知識がまだまだ浅いのでAPI関連の知識を身に付けたいと思い勉強も兼ねて作成したいと思いました。

<h2>用意するもの</h2>
<ul>
<li>Twitterアカウントと開発者用のアカウント（APIの取得のため）</li>
<li>Open AIのAPI（無料）</li>
<li>Node.jsとnpmのインストール</li>
</ul>

<h2>プロジェクトの立ち上げ方</h2>
<h3>npmのインストール</h3>
Node.jsを立ち上げるための実行

```bash
npm init -y
```

<h3>twitのインストール</h3>
Twitter APIと通信するために、2つのライブラリをインストールします。

```bash
npm install axios twit
```

<h2>Twitter APIの取得＆設定</h2>
Twitter APIは、Twitterの<a href='https://developer.x.com/en/portal/dashboard'>開発者ポータル</a>から取得することができます。

有料のプランもありますが、無料のプランでもAPIを取得し、botを作成することが可能です。

Twitter APIを利用するために取得必須のトークン
<ul>
<li>consumer Tokens--API key</li>
<li>consumer Tokens--API secret key</li>
<li>Authentication Tokens--Access token</li>
<li>Authentication Tokens--Access secret token</li>
</ul>

Twit を利用するために、取得した consumer_key、consumer_secret、access_token、access_token_secret を設定します。

<h2>特定のキーワードをいいねする実装</h2>

特定のキーワードを含むツイートを取得するためには、twitter-api-v2ライブラリのsearchメソッドを使用します。

例えば、「ChatGPT」というワードを自動的に読み込み、いいねを押す実装がしたい場合は以下のようなコードになります。

```search.js
const { TwitterApi } = require('twitter-api-v2');

// Twitter APIの情報
const twitterClient = new TwitterApi({
  appKey: 'APIキー',
  appSecret: 'APIシークレットキー',
  accessToken: 'アクセストークン',
  accessSecret: 'アクセストークンシークレット',
});

// 特定のキーワードでツイートを検索し、結果を取得するメソッド
async function searchTweets(keyword, count = 10) {
  try {
    // キーワードでツイートを検索
    const searchResults = await twitterClient.v2.search(keyword, { max_results: count });

    // 結果のツイート数をログに出力
    console.log(`Found ${searchResults.data.length} tweets for the keyword "${keyword}"`);

    // 検索結果を表示
    for (const tweet of searchResults.data) {
      console.log(`@${tweet.author_id}: ${tweet.text}`);
    }

    return searchResults.data; // ツイートのデータを返す
  } catch (error) {
    console.error('Error searching for tweets:', error);
  }
}

//chatGPTで検索するメソッド
searchTweets('chatGPT', 10);
```

<h2>コードの実行</h2>

すべての準備が整ったら、次のコマンドをターミナルで実行してコードを実行します。

```bash
node index.js
```
UbuntuにQGISをインストール

備忘録です。

[公式Docs](https://www.qgis.org/resources/installation-guide/#linux)

1\. 必要なツールをインストールする

```sh
sudo apt install gnupg software-properties-common
```

2\. QGIS 署名キーをインストールする

```sh
sudo mkdir -m755 -p /etc/apt/keyrings  
sudo wget -O /etc/apt/keyrings/qgis-archive-keyring.gpg https://download.qgis.org/downloads/qgis-archive-keyring.gpg
```

3\. 現在使用しているUbuntuのコードネームは以下のコマンドで確認する

```sh
lsb_release -sc
```

4\. 管理者権限でエディタを開く

```sh
sudo nano /etc/apt/sources.list.d/qgis.sources
```

5\. 以下の内容をファイル（`/etc/apt/sources.list.d/qgis.sources`）にコピーして貼り付ける

```
Types: deb deb-src
URIs: https://qgis.org/debian
Suites: your-distributions-codename
Architectures: amd64
Components: main
Signed-By: /etc/apt/keyrings/qgis-archive-keyring.gpg
```

:::note info
`Suites: your-distributions-codename`の部分は3で出力したコードネームを記載する
:::

6\. リポジトリ情報を更新する

```sh
sudo apt update
```

7\. QGISをインストールする

```sh
sudo apt install qgis qgis-plugin-grass
```
Qiitaで質問をして良かった話

## はじめに
普段Qiitaは閲覧専用で投稿をすることはあまりありませんが、質問機能を利用したらこれは今後も活用するべきだと感じたので、その感動をここに残したいと思います。

## 質問した内容
Golangの「関数」と「メソッド」がどのような基準で使い分けているのかわからなかったので、私が思う基準が正しいかどうか質問しました。

https://qiita.com/HayatoOkamura0000/questions/c49b8703d7e7c4ac4ab3

## 得られた回答
お二方からご回答いただきましたが、私がまず驚いたのは質問内容だけでなく周辺知識まで丁寧にご回答いただけたことでした。

`そもそもこの質問はGoに限った話ではなく広くプログラミングの設計指向関する話であり、その上で様々な手法があるので一概に正解はない。オブジェクトの役割や目的で臨機応変に対応する必要がある。`

この考えは慣れ親しんでいる言語であれば理解できましたが、新たに触れる言語ということもあり質問していなければ誤った考えのまま学習を進めていたと思います。（私が無知なだけですが💦）

また関数の名称に関するご指摘もいただき、自分では気づかなかった部分まで知ることができました。

Udemyで購入した動画教材ということもありそれが正しいものだとして学習を進めていたため、本来得られなかった学びを得ることができました。


## まとめ
こちらを読んでいただいている方は既にご利用済みかもしれませんが、私のように情報共有サービスで発信していない方はぜひご利用してみてはいかがでしょうか？
ノーコードでTeamsの通知を検知してAzureDevOpsへチケットを作る

# はじめに
業務ではTeamsをメインのコミュニケーションツールとして利用していて、大体の通知系はTeamsに飛んでくるように設定しています。
対応すべき通知を発見して、Teams上でコメントのやり取りなどをしているいつの間にかログが流れて存在を忘れてしまうことがあります。
忘れない／自分以外も気づけるようにと対応すべきTeamsの通知をチケットかする仕組みを作りました

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [利用するもの](#Chapter1)
1. [PAT発行](#Chapter2)
1. [ロジックアプリを登録](#Chapter3)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 利用するもの
Microsoft Teams
AzureDevOps
Azureロジックアプリ


<a id="#Chapter2"></a>
# PAT発行
AzureロジックアプリからAzureDevOpsへの認証はPersonal Access Tokens(PAT)を利用します。
AzureDevOpsにログインをしてヘッダーメニュー右上のUser settings→Personal Access TokensをクリックしてPATの作成画面に行きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870485/46d4994d-ffc5-9d2e-784b-8bee6b39a510.png)


右上のNew Tokenボタンを押下してPATを作成します。入浴内容は以下を参考にしてください。
Name：任意の名前
Expiration(UTC)：カスタムで一年後を設定するのがおすすめです
Work Items：Read & writeにチェックを入れる。これをしないとチケット作成／更新権限が付与されない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870485/e6620000-a278-09c2-7cf3-32951f1a67e0.png)

Createボタンを押下するとPATが表示されますので、大事に保管をお願いします。

<a id="#Chapter3"></a>
# ロジックアプリを登録
Azureにログインしてロジックアプリ画面へ遷移します。
左上に追加ボタンがあるので押下してください。
今回はマルチテナント→従来の重量課金プランを利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870485/b0e8997c-196c-ad3f-5046-74b738f6fc09.png)

※私が実際ロジックアプリを作ったときにはこの選択肢がなかったのでプランの詳しい内容はわかっておりません。

次の画面で従来の重量課金プランを利用するをクリックしてください。

リソースグループやアプリ名などの必須項目を入力して確認及び作成ボタンを押下する

作成したロジックアプリの概要画面に遷移して、編集をクリックします。
そうすると以下ようなロジックアプリのデザイナーが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870485/540cbb75-b651-7411-7f9d-3c22ca997dc4.png)


Teamsのチャットトリガーの作成をします。
トリガーの追加を押下して、検索テキストにteamsと入力して以下のトリガーを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870485/38b8a9f3-5fcc-e41c-a91d-6c212774bb09.png)

こちらを選択するとTeamsへのログインが求められるのでログインをしてください。
チームとチャネルを選択できるようになるので、トリガーとしたいチャネルを選択してください。

PATを変数化したほうが便利なので変数定義をしましょう。

Teams通知の内容からチケットに出力したい内容を抜き出すためにDataOperationのParseJSONのアクションを利用しますのでアクションの追加をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870485/37757e6f-1723-cefe-76da-8e8c9e3032ce.png)

私は以下のようにParse設定をしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870485/1ba0fb0d-b425-022c-7c0c-4dbe5557ff08.png)

必要に応じて変数定義を追加して次のアクションで利用できるようにするのがミソです。

次はいよいよAzureDevOpsにチケット登録をします。
AzureDevOpsの「Azure DevOpsにHTTP要求を送信する」のアクションを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870485/ac8e8d49-fe91-064e-768a-2eb14ae5dcf0.png)
パラメータを以下のように設定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870485/4ad03a55-cab1-bebd-d49b-ca911fc7de2d.png)

途中はだいぶ割愛しながら説明しましたが、jSONのパースや変数定義周りを理解できれば簡単にカスタマイズできると思います。

既存のチケットがある場合は、コメントを残すなどもできますので使いこなせると便利です。
駅すぱあと VBA SDKを使って緯度経度からの周辺駅検索を行う

**本記事はヴァル研究所の支援として作成された記事です**

[駅すぱあとはAPIを公開](https://api-info.ekispert.com/)しており、駅情報や経路探索などをAPI経由で行えます。メソッドはすべてGETメソッドで、情報取得系のみです。レスポンスはJSONまたはXMLで返ってきます。

この駅すぱあと APIを利用しやすくするSDKを開発しはじめました。SDKはVBAで作っており、Excelなどから利用できます（Windowsのみ、macOSでは利用できません）。

今回は、スタンダードプランで提供されている緯度経度からの周辺駅検索APIに対応したので、その使い方を解説します。
## 必要な情報

SDKを利用する際にはAPIキーが必要です。[無料トライアルがあるので、こちらから取得](https://api-info.ekispert.com/form/trial/)してください。

## 注意点

- SDKはWindowsでのみ動作します
- SDKは非公式です。公式サポートへの問い合わせはご遠慮ください

## ファイルのインポート

[こちらのリポジトリ](https://github.com/EkispertAPIMania/VBA-SDK)にある `*.cls` と `*.bas` ファイルをすべてインポートします。これらは以下のライブラリを含んでいます。

- [VBA-tools/VBA-Dictionary](https://github.com/VBA-tools/VBA-Dictionary)
- [VBA-tools/VBA-Web: VBA-Web](https://github.com/VBA-tools/VBA-Web)
- [VBA-tools/VBA-JSON](https://github.com/VBA-tools/VBA-JSON)

## 初期化

先ほど取得したAPIキーを使ってSDKを初期化します。

```vb
Dim client As Ekispert
Set client = New Ekispert
client.ApiKey = "YOUR_API_KEY"
```

## 緯度経度からの周辺駅検索条件の設定

緯度経度からの周辺駅検索は `GeoStationQuery` を使います。このオブジェクトを取得し、検索条件を設定します。

```vb
Dim Query As GeoStationQuery
Set Query = client.GeoStationQuery()

' 緯度経度の設定
Query.GeoPoint "35.6585805", "139.7454329", GCSEnum.Tokyo, 500

' コミュニティバスの指定
Query.CommunityBus = Except
```

検索条件は [緯度経度からの周辺駅検索 - 駅すぱあと API Documents 駅データ・経路検索のWebAPI](https://docs.ekispert.com/v1/api/geo/station.html) にあるものを指定できます。`type` はVBAの予約語なので、TransportTypeプロパティにて指定します。

位置情報の指定は、1〜2つ目の引数である緯度・経度は必須です。3つ目の引数は測地系で、デフォルトは `GCSEnum.Tokyo` です（ `GCSEnum.Wgs84` も指定できます）。4つ目の引数は検索範囲（メートル）で、デフォルトは無制限です。

なお、緯度経度のデフォルトは日本測地系になります。Googleでは世界測地系が採用されていますので、Googleマップなどで表示したい際には世界測地系を指定 `Wgs84` してください。
## 検索の実行

検索条件を設定したら、検索処理を実行します。結果は `ResultSet` クラスになります。検索がうまくいったかどうかは `ResultSet.Success` の値で判定してください。

```vb
Dim Result As ResultSet
Result = Query.Find()

Debug.Print Result.Success ' True または False
```

### エラーだった場合

もし検索がエラーだった場合は `ResultSet.Error` の中にエラー情報があります（駅すぱあと APIからのエラーの場合）。

```vb
If Not Result.Success Then
    MsgBox Result.Error.Message
    Exit Sub
End If
```

### 成功した場合

処理が成功した場合、 `ResultSet.Points` の中に地点情報が入っています。各地点情報には `Station` （駅情報） や `GeoPoint` （位置情報） プロパティなどがあります。

```vb
Dim i As Long
For i = 0 To UBound(Result.Points)
		Debug.Print Result.Points(i).Station.Name ' 駅名
		Debug.Print Result.Points(i).GeoPoint.Latitude_DD & "," & Result.Points(i).GeoPoint.Longitude_DD ' 緯度経度
Next
```

## ソースコード

SDKのコードは以下のリポジトリにて公開しています。ライセンスはMIT Licenseです。

[EkispertAPIMania/VBA-SDK: Excel VBAなどで動作する駅すぱあと VBA SDKです（Windowsのみ）](https://github.com/EkispertAPIMania/VBA-SDK/tree/main)

## まとめ

周辺駅検索は今回紹介したものの他、[住所情報からの検索](https://docs.ekispert.com/v1/api/address/station.html)もできます。今後のSDKのアップデートにて対応する予定なので、ぜひご利用ください。

何か不具合があれば、Issueにて連絡いただければ対応します（macOSでは動かないので注意してください）。

[EkispertAPIMania/VBA-SDK: Excel VBAなどで動作する駅すぱあと VBA SDKです（Windowsのみ）](https://github.com/EkispertAPIMania/VBA-SDK)
駅すぱあと VBA SDKを使って、N分以内で行ける駅を探す

**本記事はヴァル研究所の支援として作成された記事です**

[駅すぱあとはAPIを公開](https://api-info.ekispert.com/)しており、駅情報や経路探索などをAPI経由で行えます。メソッドはすべてGETメソッドで、情報取得系のみです。レスポンスはJSONまたはXMLで返ってきます。

この駅すぱあと APIを利用しやすくするSDKを開発しはじめました。SDKはVBAで作っており、Excelなどから利用できます（Windowsのみ、macOSでは利用できません）。

今回は、スタンダードプランで提供されている緯度経度からの周辺駅検索APIに対応しましたので、その使い方を紹介します。

範囲探索機能はN分以内で行ける駅を探す機能ですが、例えば不動産サイトやバイト探しサイトの「通勤時間から探す」機能や、通勤時間から配置できる店舗を探す「人員配置」などによく採用される機能です。

それでは、SDKの使い方について解説します。


## 必要な情報

SDKを利用する際にはAPIキーが必要です。[無料トライアルがあるので、こちらから取得](https://api-info.ekispert.com/form/trial/)してください。

## 注意点

- SDKはWindowsでのみ動作します
- SDKは非公式です。公式サポートへの問い合わせはご遠慮ください

## ファイルのインポート

[こちらのリポジトリ](https://github.com/EkispertAPIMania/VBA-SDK)にある `*.cls` と `*.bas` ファイルをすべてインポートします。これらは以下のライブラリを含んでいます。

- [VBA-tools/VBA-Dictionary](https://github.com/VBA-tools/VBA-Dictionary)
- [VBA-tools/VBA-Web: VBA-Web](https://github.com/VBA-tools/VBA-Web)
- [VBA-tools/VBA-JSON](https://github.com/VBA-tools/VBA-JSON)

## 初期化

先ほど取得したAPIキーを使ってSDKを初期化します。

```vb
Dim client As Ekispert
Set client = New Ekispert
client.ApiKey = "YOUR_API_KEY"
```
## 範囲探索の探索条件の設定

範囲探索は `SearchMultipleRangeQuery` を使います。このオブジェクトを取得し、検索条件を設定します。

```vb
Dim Query As SearchMultipleRangeQuery
Set Query = Client.SearchMultipleRangeQuery()

' 探索条件の設定
Query.BaseList(0) = "有楽町"
Query.UpperMinute(0) = 15
```

探索条件は [範囲探索 - 駅すぱあと API Documents 駅データ・経路検索のWebAPI](https://docs.ekispert.com/v1/api/search/multipleRange.html) にあるものを指定できます。 `date` は予約語なので、 `DateProp` プロパティを利用してください。

## 検索の実行

探索条件を設定したら、探索処理を実行します。結果は `ResultSet` クラスになります。探索がうまくいったかどうかは `ResultSet.Success` の値で判定してください。

```vb
Dim Result As ResultSet
Result = Query.Find()

Debug.Print Result.Success ' True または False
```

### エラーだった場合

もし探索がエラーだった場合は `ResultSet.Error` の中にエラー情報があります（駅すぱあと APIからのエラーの場合）。

```vb
If Not Result.Success Then
    MsgBox Result.Error.Message
    Exit Sub
End If
```

### 成功した場合

処理が成功した場合、 `ResultSet.Points` の中に地点情報が入っています。各地点情報には `Station` （駅情報） や `GeoPoint` （位置情報） 、 `Cost` （起点駅毎の所要時間や乗換回数を表す情報）プロパティなどがあります。

```vb
Dim i As Long
For i = 0 To UBound(Result.Points)
		Debug.Print Result.Points(i).Station.Name
		Debug.Print Result.Points(i).Cost.Minute
Next
```

また、 `Result.Bases` には起点を表す配列が入ります。

```vb
For i = 0 To UBound(Result.Bases)
		Debug.Print Result.Bases(i).Point.Station.Name
		Debug.Print Result.Bases(i).Point.Prefecture.Name
Next
```
## ソースコード

SDKのコードは以下のリポジトリにて公開しています。ライセンスはMIT Licenseです。

[EkispertAPIMania/VBA-SDK: Excel VBAなどで動作する駅すぱあと VBA SDKです（Windowsのみ）](https://github.com/EkispertAPIMania/VBA-SDK/tree/main)

## まとめ

範囲探索は複数の駅情報を起点として、周囲にある駅情報を取得できます。所要時間や乗換回数など、さまざまな条件で探索できるので、ぜひ試してください。

何か不具合があれば、Issueにて連絡いただければ対応します（macOSでは動かないので注意してください）。

[EkispertAPIMania/VBA-SDK: Excel VBAなどで動作する駅すぱあと VBA SDKです（Windowsのみ）](https://github.com/EkispertAPIMania/VBA-SDK)
paiza.ioでelixir その321


# 概要
paiza.ioでelixirやってみた。
練習問題、やってみた。
構想編

# 練習問題

RP2040のpioasmのディスアセンブラを書け。


# pioasmの、命令セット。

命令は、９個
命令長は、16bit
メモリーは、32語

+ JMP  条件分岐。
+ WAIT 一定の条件が成立するまで停止。
+ IN   受信シフトレジスタへビット列を読み込む。
+ OUT  送信シフトレジスタからビット列を書き出す。
+ PUSH 受信シフトレジスタから受信バッファへデータを読み出す。
+ PULL 送信バッファから送信シフトレジスタへデータを書き出す。
+ MOV  レジスタ等の間でデータをコピーする。
+ IRQ  割り込みフラグの読み書き。
+ SET  GPIOピンやレジスタに即値を書き込む。


|命令| 15| 14| 13| 12| 11| 10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
|JMP | 0| 0| 0| Delay/side-set| ||||Condition||| Address||||
|WAIT| 0| 0| 1| Delay/side-set| ||||Pol| Source|| Index||||
|IN  | 0| 1| 0| Delay/side-set| ||||Source||| Bit count||||
|OUT | 0| 1| 1| Delay/side-set| ||||Destination||| Bit count||||
|PUSH| 1| 0| 0| Delay/side-set| ||||0| IfF| Blk| 0| 0| 0| 0| 0|
|PULL| 1| 0| 0| Delay/side-set| ||||1| IfE| Blk| 0| 0| 0| 0| 0|
|MOV | 1| 0| 1| Delay/side-set| ||||Destination||| Op|| Source|||
|IRQ | 1| 1| 0| Delay/side-set| ||||0| Clr| Wait| Index|||||
|SET | 1| 1| 1| Delay/side-set| ||||Destination||| Data|||||

# 方針

- バイナリパターンマッチングを使う。
- 13-15bitにマッチさせる。

```
            //     .wrap_target
    0xe001, //  0: set    pins, 1                    
    0xe000, //  1: set    pins, 0                    
            //     .wrap
```

```
バイナリー
e101
e100

逆アセンブル

.program test
    set pins 1 [1]
    set pins 0 [1]
```

以上。
Substance 3D Painter の公式チュートリアルをやるときに不足しているマテリアル素材の入手方法

# Substance Painter 2021 Getting Startedに必要な素材が見当たらない

Substance 3D Painterの勉強中です！
以下の公式チュートリアル `Substance Painter 2021 Getting Started` は非常にわかりやすく、初学者でも理解しやすい内容になっています。

https://www.youtube.com/watch?v=_j27AS0VQOw

ただ、最新のSubstance 3D Painterには一部の素材がデフォルトで含まれておらず、少し困りました…


# 不足しているマテリアル素材の入手方法

不足している素材は `Substance 3D Community Assets` や `Adobe Substance 3D Assets` からダウンロード可能です！
以下にダウンロードリンクをまとめました。

### Plastic Glossy Pure

https://substance3d.adobe.com/community-assets/assets/bcfa0af7dcf1a531f9ac31a59161788215604667


### Plastic Matte Pure

https://substance3d.adobe.com/community-assets/assets/1f7b744561ceedba91f70d4f9829ae05553f56da


### Iron Galvanized

https://substance3d.adobe.com/community-assets/assets/13ce26b805e455782127f77e04d883c17a7d8b79


### Plastic Grainy

https://substance3d.adobe.com/community-assets/assets/a08477ed227779c3bc5b362d024185cc1fc59a6b

### Large Grunge Gradient Dirt
https://substance3d.adobe.com/assets/allassets/f70a33e7420e0c115b47110925b12939183de776


# ダウンロードした素材をSubstance 3D Painterにインポートする方法

ダウンロードした `.sbsar` ファイルをSubstance 3D Painterに取り込む方法については、以下の解説が非常に参考になります。

[Substance 3D Painterに素材をインポートする方法 - ReflectOrange](https://reflectorange.net/archives/123.html)

また、取り込んだ素材が `未定義` となっている場合は、 `basematerial` に変更することで解決できます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/748d8ff2-d6bf-469c-22cb-39d26ae03f00.png)


# さいごに

無事にすべてのレッスンを修了し、以下の画像を描画できました！

![spiderbot_practice_render.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/bf72b89a-a3e0-73ed-c722-082a5aefc551.jpeg)

本記事作成にあたり、以下のページを参考にさせていただきました。ありがとうございました。

- https://www.youtube.com/watch?v=_j27AS0VQOw
- https://substance3d.adobe.com/community-assets
- https://substance3d.adobe.com/assets
- https://reflectorange.net/archives/123.html
ubuntu20.04 x WI-U2-433DMS

ubuntuにwifiアダプタを接続してネットに繋げたい方向けです
私が実際に成功した手順を残します。

IPhoneのテザリングだと繋がらない…なんてこともあったので軽く触れます。

## 環境

・ubuntu20.04
・wifiアダプターは以下。

https://www.buffalo.jp/product/detail/software/wi-u2-433dms.html

## 手順

まずはwifiアダプターのドライバーを入れます。
今回のwifiアダプターは、「rtl8821」っていうドライバ？がいるらしいので、探します。
以下が上手くいきました

https://github.com/morrownr/8821au-20210708.git

この先の手順を踏めば、インストールは出来るかと思いますが、詳細知りたい方はその都度確認してください。

まずはclone

```
git clone https://github.com/morrownr/8821au-20210708.git
```

クローンしたら「8821au-20210708」というフォルダが現れました。

そこに移動します

```
cd 8821au-20210708
```

shファイルを起動したら入るみたいです。便利ですね。

```
sudo sh install-driver.sh
```

インストール中に2回、YES or Noを聞かれました。

直前にこんなのが出ます。なんかいいですね。
![Screenshot from 2024-09-09 16-51-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906162/4a169b19-2308-654f-df87-cfeb256b4974.png)

1つ目がドライバーオプションファイルを編集するか問われます。何を編集することがあるかわかりませんが、編集不要なのでnでEnter。

2つ目が再起動を掛けるかです。再起動を掛ければwifiアダプターが無事認識するはずですがまだ再起動かけたくなければ、一旦nでEnterしましょう。

![Screenshot from 2024-09-09 16-50-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906162/b535f6fb-cb71-42eb-9fa0-4ae7fa9b589f.png)

なんやかんやして再起動を掛けたあとに認識しているか確認します。
```
ip a
```

無事認識していました。

![Screenshot from 2024-09-09 16-58-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906162/228bf76e-3af4-e967-0f63-b941c53e06a0.png)

私はEtherをnetplanで固定してますがwifisは設定していないので、設定画面からいじいじできました。


wifiの設定画面に行くと無事にネットワークをいくつか認識していました。
![Screenshot from 2024-09-09 17-00-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906162/f1522bd3-f8b3-9b6f-8b8a-f9325e4f025a.png)

あとは繋げたいネットワークに繋げるだけです。

ただ、Iphoneのテザリングに繋がらず少し時間をくいました。

結論、IPv6を切りました。私はこれで解決しました。

その手順も残しておきます。

くるくるしてるときは繋がろうとしてます。

![Screenshot from 2024-09-09 17-04-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906162/3eefcc8a-508e-21fe-60b6-63765aac2424.png)

パスワードを聞かれますが1度入力してダメなら諦めましょう。

Cancelとかで諦めるとくるくるしてたのが歯車に変わります。

![Screenshot from 2024-09-09 17-06-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906162/a4956ead-8307-5f06-9e15-ecf9a3039b01.png)

歯車から設定画面に移り、IPv6のタブに入って設定を確認します。
Automaticにチェックが入ってるのでDisableにチェックしてApplyします

![Screenshot from 2024-09-09 17-07-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906162/a05dc7b5-2032-166e-705b-7b4de4417c66.png)

もう一度繋げたいネットワークをクリックしたら繋がりました。

ネットワーク横にチェックマークが！


![Screenshot from 2024-09-09 17-09-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906162/e581cde2-4eb8-b658-819e-8c100edd4720.png)

めでたしお。
Django Adminの並べ替えをカスタマイズする

## 概要

DjangoのAdmin機能では、データの追加や修正などを簡単に行うことができる。標準機能を利用するのは簡単であるが、カスタマイズして使うこともできる。
今回はリスト表示でのソート機能をカスタマイズする方法を記載する。例えばデータベースでは文字列型で登録しているが、並び替えは数値型で行いたいという要件を満たしたい場合である。

## 手順

user_codeは文字列型で登録しているが、これをソートする場合は数値型で並び替えする。
- user_code_というfieldを追加する。（Adminではアンダースコアは表示されないので、最後にアンダースコアを追加しても見た目は変わらない）
- get_querysetをオーバライドしてint型にcastしたものを追加する
- user_code_のadmin_order_fieldにcastしたものを対応させる


```models.py
class MUser(models.Model):
    user_code = models.CharField(primary_key=True, max_length=100)
    user_name = models.CharField(max_length=100, blank=True, null=True)
```

```admin.py
@admin.register(MUser)
class MUserAdmin(admin.ModelAdmin):
    search_fields = (
        "user_code",
        "user_name",
    )
    list_display = (
        "user_code_",
        "user_name",
    )
    list_display_links = ("user_code_", "user_name")
    cast_user_code = Cast("user_code", output_field=IntegerField())
    ordering = (-cast_user_code,)

    def user_code_(self, obj):
        return obj.user_code

    user_code_.admin_order_field = "cast_user_code"

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        qs = qs.annotate(cast_user_code=self.cast_user_code)
        return qs
```
Ollama + Open WebUIでAIチャットボットをホスティングし、RAGを試してみる

# TL;DR

ローカルのWindows PCで、  
Open WebUIとOllamaを使ってAIチャットボットをホスティングし、プロンプトを叩いてみました。

# AIチャットボット構築

### Ollama

Ollamaにつきましては、  
[公式サイトで配布されているインストーラー](https://ollama.com/)をポチポチするだけでインストールできます。

インストール後、Ollamaを起動し、  
ログにollamaサーバーが起動した旨が記載されていれば概ね問題なさそうです。  

![スクリーンショット 2024-09-08 212938.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422592/07fa4c9d-c258-d4cb-90b1-ec0d9f5cf88a.png)

app.log:

```
time=2024-09-08T17:30:36.144+09:00 level=INFO source=server.go:135 msg="starting server..."
time=2024-09-08T17:30:36.576+09:00 level=INFO source=server.go:121 msg="started ollama server with pid 16112"
```

### Open WebUI

Dockerイメージが公式から配布されていまして、以下のdocker-compose.yamlでWebUIをホスティングすることができます。

```
version: '3'
services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    volumes:
      - ./docs:/app/backend/data/docs # RAG用のドキュメント格納場所
    restart: always
    ports:
      - "3000:8080"
    environment:
      - WEBUI_AUTH=False
      - DOCS_DIR=/app/backend/data/docs
    extra_hosts:
      - "host.docker.internal:host-gateway"
```

起動後、`管理者パネル`\>`モデル`\> `Ollama.com からモデルをプル`から使用するLLMのモデルをダウンロードすることが可能です。ここでは `gemma2:2b`というモデルを取り上げます。

管理者パネル画面: [http://localhost:3000/admin/settings](http://localhost:3000/admin/settings)

![スクリーンショット 2024-09-08 214636.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422592/50a7610d-f5a4-e00f-13b4-496f1d0a8e03.png)

# RAGを使わずにプロンプトを叩いてみる

まず、RAGを使わずに普通に`gemma2:2b`でプロンプトを叩いてみます。

プロンプト:

```
琵琶湖に生息する魚は？
```

応答:

```
琵琶湖には、様々な種類の魚が生活しています。主な魚種としては、以下のようなものが挙げられます：

**1. 重要な食用魚:**

* **マス（サケ）:**  琵琶湖の代表的な魚で、食用として広く知られています。
* **イカナゴ:**  琵琶湖特有の淡水魚で、食用に利用されます。

**2. 他の食用魚:**

* **コイ:**  琵琶湖の湖底に生息する魚で、食用に利用されます。
* **アナゴ:**  琵琶湖の湖底に生息する魚で、食用に利用されます。

**3. 水辺の魚:**

* **サクラマス:**  琵琶湖の湖水に生息する、サケ科の淡水魚。

**4. 珍しい魚:**

* **ハゼ:**  琵琶湖の淡水に生息するハゼ類は、食用に利用されます。
* **ヒラメ:**  琵琶湖の湖底に生息する魚で、食用に利用されます。


これらの魚種以外にも、様々な種類の魚が琵琶湖に生息しています。

詳細な情報については、以下を参照ください。

* **琵琶湖の魚図鑑:** https://www.japanseafish.com/
* **琵琶湖観光協会:** https://www.biwa-kanko.jp/
```

ちらほら海水魚が混ざっていたりして、情報に誤りがありそうです。  
URLも存在しないものになっています。

![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422592/adc01aae-12c9-4099-c5e3-ac757d028d0d.gif)

# RAGの設定を行う

docker-compose.yamlのほうでマウントしている`./docs`ディレクトリ配下に次のテキストファイルを配置します。

doc.md:

```
琵琶湖には、ピラニア、ホホジロザメ、アカエイ、アリゲーターが生息しています。
その他の生物は生息していません。
```

※ RAGの検索結果を分かりやすくするために極端な内容にしています

ファイルを配置した後、管理者パネルでスキャンを実行すると設定完了です。

![scan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422592/d9c261b3-d8c4-9bcc-5226-150f28f7121c.png)

# RAGを使ってプロンプトを叩いてみる

次に、RAGを有効にした状態で、同じプロンプトを再度投げてみました:

![biwa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422592/fa1cce74-4025-355b-cd2d-a1b81001e79b.png)

ドキュメントの内容に基づいた回答が返ってきましたが、途中で英語が混ざっている点に改善の余地があります。

# おわりに

このブログでは、**Ollama**と**Open WebUI**を使用したAIチャットボットのホスティング方法、およびRAGの設定とテストについて解説しました。RAG設定により、ローカルに保存されたドキュメントから情報を取得して使用することができますが、言語の一貫性や内容の正確性には注意が必要です。
AI Implementation Partnership

皆様こんにちは、

私はKunal、Techstars Tokyo 2024プログラムに支援されているAI企業、InfraHiveのCEOです。

InfraHiveは、複雑な非構造化データから自動的にインサイトを抽出できるデータプラットフォームを提供しており、現行のLLM（大規模言語モデル）ソリューションでは対応が難しい、スキャンされたPDFや請求書、契約書などのデータにも対応しています。私たちの「データファーストアプローチ」により、LLMは複雑なデータに対して93%の精度で推論を行い、週に15時間以上のチーム作業を削減し、人手による介入を75%減らすことが可能です。

私たちは、不動産、製造業、物流、医療、保険などのFortune 500企業を顧客に持っています。

日本のテクノロジー企業、コンサルティングファーム、デジタルトランスフォーメーション企業とパートナーシップを結び、生産性向上やコスト削減、30%のROI（投資利益率）を実現するために、私たちのソリューションを提供したいと考えています。

今後ともよろしくお願い申し上げます。

Kunal
【計算科学】並列/並行処理周りの用語を整理する

## これは何?

計算科学の並列処理周りの用語を整理しました。

---


## 並列処理と並列処理

- 逐次処理: 処理中に一つずつしか処理を実行しない
- 並列処理: 同時に2つ以上の処理を実行する --> 複数のプロセッサが複数の処理を実行している。
- 並行処理: 同時に実行状態を保てる状態を利用して，待ち時間で別の処理を実行する。 --> 1つのプロセッサが複数の処理をしている状態。

### 並行処理の例: パイプライン処理

- 1つの命令を細かく分解し，それらの処理を一操作ずつずらして行う。

[スーパーコンピュータは何故スーパーか](https://www.media.kyoto-u.ac.jp/csu/wp-content/uploads/2017/09/unit-sc-intro-2017-2.pdf)にわかりやすい図があったので貼っておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/aac144d3-66d1-7933-cfe9-a656f2f1b821.png)

---

## プロセス並列とスレッド並列

### そもそもプロセスとスレッドとは

[What is the difference between a process and a thread?](https://www.quora.com/What-is-the-difference-between-a-process-and-a-thread/answer/Robert-Love-1)より
> Here is the analogy I use in Linux Kernel Development. Processes are the abstraction of running programs: A binary image, virtualized memory, various kernel resources, an associated security context, and so on. Threads are the unit of execution in a process: A virtualized processor, a stack, and program state. Put another way, processes are running binaries and threads are the smallest unit of execution schedulable by an operating system's process scheduler.
> 私がLinuxカーネル開発で使っている例えはこうだ。プロセスとは、実行中のプログラムを抽象化したものだ： バイナリ・イメージ、仮想化メモリ、さまざまなカーネル・リソース、関連するセキュリティ・コンテキストなどだ。スレッドはプロセスの実行単位である： 仮想化されたプロセッサ、スタック、そしてプログラムの状態。別の言い方をすれば、プロセスは実行中のバイナリであり、スレッドはオペレーティング・システムのプロセス・スケジューラによってスケジューリング可能な実行の最小単位である。

- プロセスとは実行中のプログラウを抽象化したものだ。
- スレッドはプロセスの実行単位である。

### プロセス並列とスレッド並列の違い

- プロセス並列: 複数のプロセスによって並列化を行う
- スレッド並列: 1つのスレッドの中で並列化を行う。

[計算科学入門第7回 MPIによる並列計算](https://www-is.amp.i.kyoto-u.ac.jp/data/sekido/20140521-1.pdf)にわかりやすい図があったので貼っておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/89568857-07c5-2503-6a03-d010f55679ee.png)

### ハイブリッド並列

プロセス並列とスレッド並列を同時に行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/27f779f1-3d70-d152-a143-c98ba45d9067.png)
x-server vpsで登録済みのgithubと毎度接続する手順（備忘録）

## 何の記事？
x-server vpsで一度設定したgithubとの連携は毎度立ち上げる必要があり、その手順をいつも忘れてしまうため記事として残しました。

最初の設定は[公式リファレンス](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)に載っているのでそちらを見ていただければと思います。

## SSH接続機能立ち上げの手順

1.ssh-agentを立ち上げる

```
eval "$(ssh-agent -s)"
```

2.sshに使う対象キー（秘密鍵）を指定する

```
ssh-add  ~/.ssh/{sshに使う秘密鍵のファイル名}
```

3.疎通確認

```
ssh -T git@github.com

# 以下のようなログが出れば成功です
# Hi KONTA2019! You've successfully authenticated, but GitHub does not provide shell access.
```

<br>

以上になります。
【Unity】ボタンアイコンを表示するInput Glyphsの紹介と活用事例

私が制作しつつ自分自身でも活用している、キーボードやゲームパッドのボタンアイコンを表示するアセット「Input Glyphs」を紹介します。
※ 入力に`Input System`を使用しているプロジェクト向けです。

https://assetstore.unity.com/packages/tools/gui/input-glyphs-289760

# Input Glyphsの機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1863134/231c002b-bff2-7b0d-b031-97c89b4d3242.png)
- 接続デバイスに合わせて自動で画像が切り替わる
- アイコン画像はデフォルトで用意されている
- キーボード・マウスと、XBOX, PlayStation, Switchなどのコントローラに対応
- `SpriteRenderer`, `Image`, `TextMeshPro`で表示できる

詳しくは[ドキュメント](https://eviltwo.github.io/InputGlyphs_Docs/ja/)をご覧ください。

# とにかく準備が簡単
`InputSystem.PlayerInput`を使っている前提ですが、アセットをインポートして画像を表示するまでがとても簡単です。プログラミングは不要です。
1. 初期化用プレハブを配置する
1. `Image`オブジェクトに`InputGlyph`コンポーネントを付け、表示したい`InputAction`を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1863134/a8360e3d-ae99-dd39-887c-4c63601e1e7f.png)

これだけです。デバイスごとに画像を設定するような面倒な作業はありません。
また、`InputAction`を紐づけているため、開発中に操作ボタンを変えてもアイコンも変わるので安心です。

# TextMeshProにも対応
TextMeshProのテキストの中にボタンアイコンを埋め込むことができます。TextMeshProのsprite機能を使っているので、テキストの中に`<sprite name="InputAction名">`を記述すると表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1863134/90615183-ea58-7708-0c9c-15e7504296e4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1863134/2b3d37ef-37d4-da17-d48b-4bdc0b2c8464.png)

# 複数のボタンが１枚の画像になる
WASDなどの複数のボタンは連結され、１枚の画像として表示されます。これが地味に便利で、キーボードのために複数の`UI Image`を`Horizontal Group`で並べて...といった手間がありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1863134/d1762a7d-e1e9-957a-2321-673cba7946ad.png)

# 活用実績
私自身が普段のゲーム制作で活用しており、以下のゲームではチュートリアルでボタンアイコンを表示しています。

https://store.steampowered.com/app/3064190

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1863134/e9b4edc0-80a3-5639-57ec-bf89bcb6fa90.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1863134/952a628f-62fd-7db5-0643-eafa3f0d6484.png)


# まとめ
Input Glyphsは素早く簡単にボタンアイコンを表示できるアセットであり、これからもアップデートを続けていきます。気になった方はぜひご購入またはお気に入りリストへの追加をよろしくお願いします。

https://assetstore.unity.com/packages/tools/gui/input-glyphs-289760
Grub画面を表示させない！

# 環境
ubuntu22.04

---

Grub画面とはこんなやつ。

![Screenshot from 2024-09-09 06-52-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906162/1094f6d4-212e-cbe2-1aa4-7b65b4a5fc9a.png)

ubuntuを起動する際に大体これ選択してる。
基本的にはubuntuを起動したいことがほとんどなので効率UPで表示させないようにする。

# これは罠だ…(ただの知識不足w)

いざやろう！と調べ出すのですが、大体の記事は以下の方法です。

```
/etc/default/grub
```
をエディターで編集して

```
sudo update-grub
```
で設定を反映。

確かにカウントは変わるのですが、Grubを非表示にするには  
GRUB_TIMEOUT_STYLE=menu を 
GRUB_TIMEOUT_STYLE=hidden に置き換えるようですが、これが反映されない。 

### ここで結論を申し上げると、  
```
/boot/grub/grub.cfg
```
の編集をすることで解決しました。

どうやら、grub.cfgが設定ファイルとなっていて、grubファイルを変更→update-grubを行うことで、簡易的に一部の設定を変えているようなイメージっぽいです。

# 変更内容

grub.cfgを開いて下の方にいくと、set timeout_style=menuがいた。
無条件で入ってるし、変数名もやたらそれっぽい。。。

![Screenshot from 2024-09-27 14-19-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906162/aa7d153f-f307-f043-5f66-8dbac571a906.png)

ということで、変えた

![hidden.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906162/da9b5a4f-803b-5f6e-2aca-07d57255ef62.png)


ファイルを上書き保存して再起動したら無事、grub画面が非表示になりました。
ボールの色についての確率パズルの確率計算

# 確率パズル

Gigazineの記事 [数学者の考案した「一見シンプルだが直感に反する確率パズル」がインターネット上で議論に](https://gigazine.net/news/20240909-probability-puzzle/)についての考察です．
この記事から問題を引用します．「100個のボールが入ったつぼがあります。そのうちn個が赤で、100-n個が緑です。ただし、nは0～100の間で一様分布しています。つぼからボールをランダムに1つ取り出したところ、赤でした。それを捨ててから、残り99個からボールを選ぶとき次に引くボールの色はどれ？」

とりあえず，Pythonでシミュレーションを行う愚直にプログラムを書いてみました．

```python
import random


def process_list_until_r(m):
    while True:
        i = random.randint(0, m)
        balls = ["r"] * i + ["g"] * (m - i)

        index = random.randint(0, len(balls) - 1)
        first_choice = balls[index]
        if first_choice == "r":
            balls.pop(index)
            break
    index = random.randint(0, len(balls) - 1)
    return balls[index]


m = 100
red = 0
green = 0
for _ in range(100000):
    color = process_list_until_r(m)
    if color == "r":
        red += 1
    else:
        green += 1

print(f"red={red}, green={green}")
```

# 確率計算
何度実行しても，redである確率はおおよそ$\frac{2}{3}$となります．ボールの総数$m$を変えても，結果として約$\frac{2}{3}$となるため，$m$の値に依存せず，この確率は一定で$\frac{2}{3}$であると予想されます．そこで，まず最も単純なケースとして，$m=2$の場合を考察します．

つぼの中に2個のボールが入っている場合，そのボールの色の組み合わせは次の3通りです：$[g,g]$，$[r,g]$，$[r,r]$．この中から等確率で1つのつぼがまず選ばれます．この状況を，3種類のつぼが用意され，その中から等確率で1つのつぼを選ぶと考え直しても同じです．さらには，6個のボールの中から等確率で最初の1つを選ぶとしても，同じです．選んだボールがgreenならばやり直し，redが選ばれるまで繰り返します．最終的には，3個のredのボールから等確率で1つを選んだ場合と同じ状況となります．区別のために，ボールの種類を$[g_0,g_1]$、$[r_0,g_2]$、$[r_1,r_2]$と表すことにします．2個目がredであるためには，1個目で$r_1$または$r_2$が選ばれる必要があります．したがって，この確率は$\frac{2}{3}$となります．

これを一般化して，$m$が2個以上の場合について確率を計算します．$m+1$個のつぼがあり，各つぼ$i$番目($0\leq i\leq m$)には，redのボールが$i$個，greenのボールが$m-i$個入っています．ボールの総数は$m(m+1)$個で，そのうちちょうど半分の$M=\frac{m(m+1)}{2}$がredです．この中から等確率で1つのredボールを選び，それが$i$番目のつぼのボールである確率は$\frac{i}{M}$です．そして，そのredボールを取り除き，同じつぼから2個目のボールを$m-1$個の中から選んだ時，そのボールがredである確率は$\frac{i-1}{m-1}$です．この確率の積により，2個目のボールがredである確率は次のように計算できます．
```math
\begin{align}
\sum_{i=1}^{m}\frac{i}{M}\cdot \frac{i-1}{m-1}
&=\frac{1}{M(m-1)}\sum_{i=1}^{m}i(i-1)\\
&=\frac{2}{(m-1)m(m+1)}\left(\sum_{i=1}^{m}i^2-\sum_{i=1}^{m}i\right)\\
&=\frac{2}{(m-1)m(m+1)}\left(\frac{m(m+1)(2m+1)}{6}-\frac{m(m+1)}{2}\right)\\
&=\frac{2}{(m-1)m(m+1)}\cdot\frac{(m-1)m(m+1)}{3}\\
&=\frac{2}{3}
\end{align}
```
このようにして，$m$の値にかかわらず，確率は$\frac{2}{3}$であることが示されます．
IBM i でのユーザー定義文字 (外字) の移行方法

## はじめに
現行マシンで動いているIBM i 環境を新しいマシンに移行する作業に携わる機会があるのですが、登録されているユーザー定義文字 (外字) の移行手順をよく忘れてしまいます💦ので自身の備忘録としても、ここにまとめておきたいと思います。

## 移行元システムでの作業
以下の手順でファイルに書き出して、他のシステムに転送できるように準備します。
1. 外字をエクスポートするためのファイルを作成
1. 作成したファイルに外字データを書き出し
1. 外字データを書き出したファイルを保管ファイルに保管
1. 移行先システムに保管ファイルを転送

### 1. 外字をエクスポートするためのファイルを作成
ファイルは24x24の外字データを書き出すファイルと32x32の外字データを書き出すファイルの2つを作成しておきます。
```
CRTPF FILE(libname/IGC2424) RCDLEN(132)
CRTPF FILE(libname/IGC3232) RCDLEN(132)
```
### 2. 作成したファイルに外字データを書き出し
CPYIGCTBLコマンドを使用して作成したファイルに書き出します。
こちらも24x24, 32x32の2つを実行します。
```
CPYIGCTBL IGCTBL(QIGC2424) OPTION(*OUT) DEV(*FILE) FILE(libname/IGC2424) MBR(IGC2424)
CPYIGCTBL IGCTBL(QIGC3232) OPTION(*OUT) DEV(*FILE) FILE(libname/IGC3232) MBR(IGC3232)
```

### 3. 外字データを書き出したファイルを保管ファイルに保管
書き出したファイルを保管ファイルに保管して、転送前の準備は完了です。
```
CRTSAVF FILE(libname/SIGCTBL)
SAVOBJ OBJ(IGC2424 IGC3232) LIB(libname) DEV(*SAVF) SAVF(libname/SIGCTBL)
```

### 4. 移行先システムに保管ファイルを転送
FTPなどを利用して保管ファイルを移行先システムに転送します。
以上で移行元システムでの作業は完了です。
移行先システムに転送済みで、移行元システムでは不要になったファイルは適宜削除していただいて大丈夫です。

## 移行先システムでの作業
移行元システムから転送した保管ファイルから以下の手順で外字を登録します。
1. 保管ファイルから外字データを書き出したファイルを復元
1. 復元したファイルから外字を登録

### 1. 保管ファイルから外字データを書き出したファイルを復元
保管ファイルから外字を書き出したファイルを復元します。
```
RSTOBJ OBJ(*ALL) SAVLIB(libname) DEV(*SAVF) SAVF(libname/SIGCTBL)
```

### 2. 復元したファイルから外字を登録
CPYIGCTBLコマンドを使用してファイルから外字データを取り出して登録します。
外字データのファイルへの書き出し、ファイルから外字データの取り出しは同じコマンドでOPTIONパラメーターを変えるだけなんですね！
```
CPYIGCTBL IGCTBL(QIGC2424) OPTION(*IN) DEV(*FILE) FILE(libname/IGC2424) MBR(IGC2424)
CPYIGCTBL IGCTBL(QIGC3232) OPTION(*IN) DEV(*FILE) FILE(libname/IGC3232) MBR(IGC3232)
```

最後は移行元、移行先の両システムでSTRCGUのオプション3 (ユーザー定義文字のリスト) を表示させて、きちんと移行されているかを確認して終了です。

STRCGU (文字作成ユーティリティー)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1305251/ca341238-27fb-f2bb-d848-9ce2bfc60bf6.png)
3D スキャナー: 簡素化されたプロトタイピングと部品の複製

現代の製造業において、3D スキャナーはプロトタイピングと部品の複製のプロセスを大幅に簡素化できる不可欠なツールとなっています。 3D スキャナーを設計ワークフローにシームレスに統合することで、メーカーは既存のオブジェクトの 3D モデルを迅速かつ正確に取得し、これらのモデルを設計、分析、生産に使用できます。次に、プロトタイピングと部品の複製における 3D スキャナーの使用について詳しく説明します。

1. 動作原理
3D スキャナーは、レーザー、回折格子、カメラなどのセンサーを使用して物体の表面上のデータ ポイントをキャプチャし、これらのデータ ポイントをデジタル 3 次元モデルに変換します。これらのセンサーは、物体の表面全体で何千ものデータ ポイントをスキャンして記録し、ソフトウェアがそれらを組み合わせて完全な 3 次元モデルを形成します。このプロセスは「点群」生成と呼ばれることが多く、点群をさらに処理および編集して、より詳細な 3D モデルを作成できます。

![23cd1b4789bfd348466270fcfd247b5a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/7e108b99-c6a2-7a2c-d45f-74e11fe44783.png)
2. 現場でのスキャンと記録が便利
3D スキャナーの便利な点は、スキャンのために物体を研究室やスタジオに持ち込む必要がなく、現場でスキャンして記録できることです。デザイナーや製造業者は、現場で 3D スキャナーを使用してオブジェクトの 3 次元データを迅速にキャプチャし、その後の設計や製造プロセスですぐに使用できます。この方法は、時間とコストを節約するだけでなく、オブジェクトの元の状態をよりよく保存します。

https://www.revopoint3d.jp/

3.製品開発ライフサイクルを加速する
3D スキャナーを使用することで、メーカーは製品開発ライフサイクルを加速し、プロトタイピングや部品の複製にかかる時間を短縮できます。設計者は、既存のオブジェクトの 3D モデルを迅速に取得し、設計ソフトウェアで変更および最適化して、新製品をより迅速に発売できます。メーカーは既存の部品を迅速にコピーし、生産サイクルを短縮し、生産効率を向上させることができます。これにより、時間とコストが節約されるだけでなく、製品をより迅速に市場に投入し、競争上の優位性を獲得できます。

![70a189abda713dcec272536a16054a12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/3a61dc1f-c9ea-d4d8-fcf3-bb170d0c900e.png)
4. 応用の見通し
技術の継続的な発展により、3D スキャナーはプロトタイプ設計や部品複製の分野で幅広い応用が期待されています。 3D スキャナーは、設計ワークフローの合理化、オンサイトでのスキャンと記録、製品開発ライフサイクルの加速という利点に加えて、メーカーの製品メンテナンス、品質管理、リバース エンジニアリングにも役立ちます。 3D プリンティング技術の継続的な普及により、3D スキャナーは革新的な設計と製造のための重要なツールとなり、業界により多くの開発機会をもたらすでしょう。
Azure AI Document Intelligence リンク集

## Azure AI Document Intelligence

https://azure.microsoft.com/ja-jp/products/ai-services/ai-document-intelligence

## Azure AI Document Intelligence とは?

https://learn.microsoft.com/ja-jp/azure/ai-services/document-intelligence/overview?view=doc-intel-4.0.0

## 事前トレーニング済みのシナリオ固有のモデル

https://learn.microsoft.com/ja-jp/azure/ai-services/document-intelligence/choose-model-feature?view=doc-intel-4.0.0#pretrained-scenario-specific-models

## 言語サポート: ドキュメント分析

https://learn.microsoft.com/ja-jp/azure/ai-services/document-intelligence/language-support-ocr?view=doc-intel-4.0.0&preserve-view=true&tabs=read-print%2Clayout-print%2Cgeneral
Rustの変数の可変性(mutable)と定数(const)


### 変数

Rustでは、変数は基本的に不変（immutable）です。Rustは安全性を重視しているため、変数はデフォルトで不変となっています。

したがって、一度宣言された変数の値を変更しようとすると、コンパイルエラーが発生します。


```rust
fn main() {
    let x = 5;
    println!("The value of x is: {x}");
    x = 6; // error!
    println!("The value of x is: {x}");
}
```

このコードをコンパイルしようとすると、エラーメッセージが表示されます。

このように、`let`で作成された変数はデフォルトで不変なので、変数の値を変更するには`mut`キーワードを使って可変（mutable）であることを明示する必要があります。

```rust
fn main() {
    let mut x = 5;
    println!("The value of x is: {x}");
    x = 6;
    println!("The value of x is: {x}");
}
```

### 定数（Constants）

前述の変更できない変数と同様に、定数（constant）も不変です。しかし、変数とはいくつかの違いがあります。

まず、定数には`mut`キーワードを使うことはできません。そして、必ずデータ型を指定する必要があります。

例として、次のように書くことができます。

```rust
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
```

この定数は、プログラムが実行される間、常に変更できない値です。定数はコード全体で使用され、グローバルスコープでも定義できます。

### シャドーイング（Shadowing）

Rustでは、変数をシャドーイングすることが可能です。これは、同じ名前の変数を再宣言して、まったく新しい変数として扱うことを意味します。

```rust
fn main() {
    let spaces = "   ";
    let spaces = spaces.len();
}
```

最初の`spaces`は文字列型ですが、シャドーイングによって2番目の`spaces`は整数型になります。

`let mut`との違いは、`let mut`を使うと値を変更することはできますが、異なるデータ型に変更することはできないという点です。

```rust
let mut spaces = "   ";
spaces = spaces.len(); // error: mismatched types
```

シャドーイングは、変数の名前を再利用しつつ異なる型の値を持たせたいときに便利です。これにより、同じスコープ内で変数名を統一しつつも、柔軟に異なる値を扱うことができます。
Amazon Linux2023にMySQL Clientをインストール

サクッとわかりそうな記事が見当たらなかったので、備忘録として記載します。

mysql公式リポジトリからダウンロードするため、
インスタンスは基本的にインターネットにつながる環境を想定しています。

### GPG Keyのインストール

こちらの下の方に書いてあるコマンドを実行し、GPG鍵をインポートします。
https://dev.mysql.com/doc/refman/8.4/en/checking-rpm-signature.html


```bash
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
```
こちらの鍵は定期的に更新されるようなので、公式サイトを参考にするのが良いかと思います。

### mysqlリポジトリの登録
Amazon Linux2023はFedoraベースということですが、
EL9でも動作するようなので、こちらでインストールします。（詳細不明です…。）
```bash
sudo dnf -y localinstall  https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
```

### MySQLクライアントのインストール
```bash
sudo dnf -y install mysql-community-client
```
インストールするかを確認されるので、`y`で進めてください。

インストールされると、コマンドが使えるようになります。
```bash
[ec2-user@172.31.10.205 ~]$ mysql --version
mysql  Ver 8.0.39 for Linux on aarch64 (MySQL Community Server - GPL)
[ec2-user@172.31.10.205 ~]$ 
```
ちょっと古いですが、最新をインストールする場合は以下を確認し、インストールしたい対象のバージョンのページを確認するのが良いかと思います。

https://dev.mysql.com/doc/refman/9.0/en/linux-installation-yum-repo.html
NSX Security から vDefend への名称変更について

<font color="blue">**VMware NSX (NSX-T)**</font> に関して、<font color="red">**2024/5から下記の名称変更**</font>があり、確認した内容を記載いたします。

# 「VMware NSX (Security)」 → 「VMware vDefend」 への名称変更

NSXのオーバーレイ機能に関しては名称変更はなく、<font color="green">**ネットワークセキュリティ機能（分散Firewall、ゲートウェイFirewall、IDS/IPS、NDR）**</font> に関する名称が<font color="red">**「VMware vDefend」**</font>に変更された形です。（2024/5～）
* **VMware NSX** Distributed Firewall → **VMware vDefend** Distributed Firewall
* **VMware NSX** Gateway Firewall → **VMware vDefend** Gateway Firewall
* **VMware NSX** Network Detection and Response → **VMware vDefend** Network Detection and Response


また、参考URLは下記になります。

* 参考URL： 
* https://community.broadcom.com/communities/communityhomeblogs?CommunityKey=a802a279-130e-43e5-a23d-f522bc290b5c
* https://www.vmware.com/products/cloud-infrastructure/vdefend-distributed-firewall
自分的なメンタルコントロールについて

## はじめに
下書きのまま数年放置してあった記事があったので投稿します。ポエムです

## 概要
入社して2年と半年が経過したエンジニアのようなものです。

入社1年後辺りから小〜中規模な案件を担当しています。



- 自分自身が案件を持ち、要件定義〜納品までやる
- 自分で自分のケツを叩く必要がある

**自分の場合**の病まずに続けるモチベーション維持の試みを色々試した結果、
現状腹落ちしている状況を書く

## 自分なりの信念

自分の中で仕事に関する「信念」を持つことは、大事な事だと思う。
自分が自分の「信念」に基づいて行動していれば、それが間違っていたとしても病みにくい（と思う）
(トライ&エラーを試みれる)

力量不足で落ち込んでしまう事もあるが、「自分で選択した事」なので「自分で正せる」

自分の行動の要因が他者にある場合の方が病みやすい。回り回って自分を責めるからだ。
「自分を責める事」と「自分の行った行動の間違いを認める」事は似てるようでかなり違う。


### 「自分で選択した事ではない」の基準

- 〇〇にそう言われかたらやった。
    - 他者に従っただけで自分の選択ではない
- よくわからないけどこれでいいだろう、最悪上の人がなんとかする
    - 選択を放棄しただけで自分の選択ではない
- 特定の不安を抱えているけどまぁ置いておこう
    - 選択を放棄しただけで自分の選択ではない

## 思想の変化

色々な不安を感じながら開発→抱落とした不安から様々な後悔が襲ってくる

というパターンが多い。どう対処するか考えた結果

品質 < 自分の納得感 <  納期
から
納期 = 品質 = 自分の納得感

にシフトした。

**品質と自分の納得感を優先させるエゴを通すのであれば、本来優先すべき納期を守るべきだ。**

という信念が出来た。

変わった点
- 製作したプロダクトに自信を持てる様になり、打ち合わせなどで物怖気し辛くなった。
- 自暴自棄になりにくくなった。
- **自分で考えて自分で選択**するようになったので当事者意識が高まった

自分の拘りで自分の仕事に取り掛かっているからだ。

会社としては顧客からお金を回収する事が最優先なのだが、
それは自分の為に良くない。





## ようするに

疲れるが、「自分の信念に基づいて自分で選択する」事が大事だと思うし、病みにくいと思う。
Java Gold メソッド逆引き早見表 Stream型を返すメソッド 簡略版


### Stream型を返すメソッド

| メソッド名 | 宣言されたクラス・インターフェイス | 戻り値の型(Stream<T>) |
|------------|-----------------------------|----------------------|
| `of(T... values)` | `Stream` | `Stream<T>` |
| `stream(T[] array)` | `Arrays` | `Stream<T>` |
| `stream(int[] array)` | `Arrays` | `IntStream` |
| `stream(double[])` | `Arrays` | `DoubleStream` |
| `stream(long[])` | `Arrays` | `LongStream` |
| `parallelStream()` | `Collection` | `Stream<T>` |
| `generate(Supplier<T> s)` | `Stream` | `Stream<T>` |
| `iterate(T seed, UnaryOperator<T> f)` | `Stream` | `Stream<T>` |
| `concat(Stream<? extends T> a, Stream<? extends T> b)` | `Stream` | `Stream<T>` |
| `ofNullable(T value)` | `Stream` | `Stream<T>` |
| `stream()` | `Optional` | `Stream<T>` |
| `lines(Path path, Charset cs)` | `Files` | `Stream<String>` |
| `list(Path dir)` | `Files` | `Stream<Path>` |
| `flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)` | `Stream` | `Stream<R>` |
| `map(Function<? super T, ? extends R> mapper)` | `Stream` | `Stream<R>` |
| `distinct()` | `Stream` | `Stream<T>` |
| `sorted()` | `Stream` | `Stream<T>` |
| `sorted(Comparator<? super T> comparator)` | `Stream` | `Stream<T>` |
| `peek(Consumer<? super T> action)` | `Stream` | `Stream<T>` |
| `skip(long n)` | `Stream` | `Stream<T>` |
| `takeWhile(Predicate<? super T> predicate)` | `Stream` | `Stream<T>` |

### プリミティブ型ストリーム関連メソッド (IntStream)

| メソッド名 | 宣言されたクラス・インターフェイス | 戻り値の型 |
|------------|-----------------------------|----------------------|
| `of(int... values)` | `IntStream` | `IntStream` |
| `range(int startInclusive, int endExclusive)` | `IntStream` | `IntStream` |
| `rangeClosed(int startInclusive, int endInclusive)` | `IntStream` | `IntStream` |
| `map(IntUnaryOperator mapper)` | `IntStream` | `IntStream` |
| `mapToObj(IntFunction<? extends U> mapper)` | `IntStream` | `Stream<U>` |
| `flatMap(IntFunction<? extends IntStream> mapper)` | `IntStream` | `IntStream` |
| `peek(IntConsumer action)` | `IntStream` | `IntStream` |
| `takeWhile(IntPredicate predicate)` | `IntStream` | `IntStream` |
| `dropWhile(IntPredicate predicate)` | `IntStream` | `IntStream` |
| `concat(IntStream a, IntStream b)` | `IntStream` | `IntStream` |

### 補足: プリミティブ型を返すメソッド

| メソッド名 | 宣言されたクラス・インターフェイス | 戻り値の型 |
|------------|-----------------------------|--------------|
| `getAsInt()` | `OptionalInt` | `int` |
| `sum()`     | `IntStream` | `int` |
| `count()` | `IntStream` | `long` |
|`count()`|`Stream`|`long`|
|`reduce​(int identity, IntBinaryOperator op)`|`IntStream`|`int`|



---

https://qiita.com/T-ngtj/items/d3b50a03733873dd5b10


https://qiita.com/T-ngtj/items/df254aacd05be698199a
ElixirでText形式の曲を書いて鳴らす 〜 カスタムMixタスク play追加〜

「ElixirでText形式の曲を書いて鳴らす 〜 曲データを一括変換後に再生＆変換時に分散処理〜」の続編です

https://qiita.com/t-yamanashi/items/2e7e0860abacef4227a0

# 前提条件
- OS Ubuntu 22.04
- SOXがインストール済み

# 仕様　前回からの差分
- mix playタスクを追加
- mix play ファイル名　で曲のファイル名指定して再生
  - 無指定時はmusic1.txtとして再生

# ソースを書く
```elixir:lib/mix/tasks/play.ex
defmodule Mix.Tasks.Play do
  @moduledoc """
  曲を再生するタスクです
  """
  use Mix.Task

  @shortdoc "曲を再生する"
  def run(arg) do
    play(arg)
  end

  defp play([]), do: Sox.play("music1.txt")

  defp play(arg) do
    arg
    |> List.first()
    |> Sox.play()
  end
end
```

```diff_elixir:lib/sox.ex
defmodule Sox do
  #〜省略 〜

  @doc """
  曲を再生します

  ## Examples

      iex> Sox.play("music1.txt")
      :ok
  """
+ def play(file_name) do
    File.rm_rf(@tmp_dir)
    File.mkdir(@tmp_dir)

+   File.read!(file_name)
    |> text_to_play()

    :ok
  end

  #〜省略 〜
end
```

# 実行

```sh
$ mix play music2.txt
```

# ソース(github)

https://github.com/ymn-t-yamanashi/sox/releases/tag/V0.08