OmniAICreator/Qiita-1.07M huggingface dataset:
《ITエンジニアのための転職講座》【面接前の準備】会社のHPや求人票は隅々まで目を通しておこう！

転職活動中や転職を考えているITエンジニアの方も多くいるかとは思いますが、
今日はそういう人たちのために、面接準備のアドバイスです！

今日のポイントは、面接前の準備として、

●会社のHP
●求人票

です。この二つは面接前に必ず目を通しておきましょう！

★会社のHPで受ける会社のビジョンや理念はしっかり把握し、そこと紐づけた志望動機を準備しておく
----------------------------------------------------------------------

面接に行く会社のHPは必ず面接前にチェックしておきましょう。
出来れば、隅々まで目を通す。
難しければ、理念やビジョンだけでも確認し、理念やビジョンに紐づいた志望動機をしっかり準備しておきましょう。

面接をしていての実感値でいうと、会社のHPをしっかり見てきてもらった上で面接に臨んでいるエンジニアの方は、大体3～4割程度。つまり、HPを詳しくチェックするだけで、上位40％に入ることが可能です。

やっぱり、面接官として事前にしっかりHPを読み込んできてくれた上で面接に臨んでくれた方の印象は良いですし、候補者がビジョンに合う人材であるかどうかは面接の合否にも関わる重要なポイントです。

面接では技術的な内容よりも人物面の評価の方が合否に大きく影響します。
技術的なポイントは職務経歴書に記載されている内容の確認をしていくのがメインになるでしょう。

これは面接対策だけでなく、そもそも受ける会社を選択していく上でも重要です。
良く転職活動で10社も20社も受けている人も見かけますが、私はあまりお勧めしません。

HPを見て、その会社のビジョンや理念が自分の価値観やキャリアの方向性と合っているのかしっかり見極めて、
自分の価値観と合っているのか見極めて、それに合わない会社は受けないという選択をすべきだと思います。

時間は有限です。大して志望度が高くない会社に面接や面接準備で時間を使うのは非常にもったいない事です。
そういう時間があるなら、資格の勉強など、転職活動と並行して取り組んでいる自己学習の時間に使ったり、リフレッシュで自分の好きな事をやる時間に使った方が良いですよね。


★求人票も必ず事前にチェックしておく
---------------------------------------------
HPと同じく求人票も必ずチェックしておきましょう。

求人票には福利厚生や待遇以外にも、求める人物像や選考基準なども記載があると思います。
求める人物像や選考基準を事前にチェックし、それに合った形で、自分の経験がどう活かせるのかもイメージしておきましょう。

あと、手当や福利厚生も再度チェックしておきましょう。

入社したら、住宅手当や家族手当が実は無かった。。。
入社した後で気が付く人は思ったよりも多いのが現実です。

自身の優先順位にもよりますが、例えば、ワークライフバランスを重視しているのに、年間休日が極端に低い会社は、
やはり面接自体の参加を見送った方が良いでしょう。

面接前に求人票も細かくチェックし、面接の中でで気になる事は質問出来るように準備しておけば、限られた面接時間をより有意義な時間にすることができます。


面接前のHPや求人票のチェックで、転職活動はより効率よく有意義に進められると思います！
まだチェックしていない方は、今選考中の会社からチェックしてみたらいかがでしょうか？

------------------------------------------------------------------------------------
★下記セミナーも是非ご参加ください！

▼市場価値1,000万円超エンジニアの“課題解決力”
　～エンジニアリング×コンサルティング～
《8/24（木）19:30～20:30 ウェビナー》
https://akkodis-co-jp.zoom.us/webinar/register/WN_AlghgX65T26S2V_m0CsWtA#/registration

▼「エンジニアとして目指すキャリアプランを実現する」
　キャリアアドバイザー×エンジニア　オンライン座談会
《8/30（水）20:00～21:00 ウェビナー》
https://akkodis-co-jp.zoom.us/webinar/register/WN_ZCARrPJVRK-GgzMIQodvxw#/registration
エクセルでKB/MB/GBとか表示させたい

# やりたいこと
エクセルで、数値をKB/MB（キロバイト/メガバイト)で表示させたい。
↓こんな。
```
1024 -> 1KB
1.5*1024*1024 -> 1.5MB
```
# 結論
A1に変換前の数値が入ってるとして。
```
=ROUND(A1/POWER(1024, INT(LOG(A1,1024))), 2) &
IF(INT(LOG(A1,1024))=0, "", MID("KMGTPE", INT(LOG(A1,1024)),1))&
"B"
```

# 実行例
![excel_kb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308842/5256dd9f-7989-ae93-2fec-20c5c71ea3b5.png)

# 解説
```
MID("KMGTPE"
```
ここが肝です。  
1024のlogとったヤツをindexにして、"KMGTPE"の文字配列から引いてくるイメージです。  
つまり、E=エクサまでしか対応してないです。適当に追加してください。

---
もっと簡単にできる方法あれば教えてください。
Xilinx ISEのインストール覚書

## Install ISE
- Windows10でISEを入れるのに苦労したので覚書。

### VirtualBoxをインストール
  - VirtualBox 6.1.22 platform packages
  - [Downloads – Oracle VM VirtualBox](https://www.virtualbox.org/wiki/Downloads)

### ISE14.7 Windows10をダウンロード。
  - Windows 10 用 ISE Design Suite - 14.7
  - Xilinx_ISE_14.7_Win10_14.7_VM_0213_1.zip
  - [ダウンロード](https://japan.xilinx.com/support/download/index.html/content/xilinx/ja/downloadNav/vivado-design-tools/archive-ise.html)

### ISEのインストール
  - Hyper-Vを、無効にする。Windowsのコントールパネル、Windows機能の有効化または無効化。
  - インストールするとBIOSでVirtualizationが有効になってないと出た。
  - UEFI見ると有効になっている。
  - Xilinxのフォーラムで、こんなコメントをみつける(Google翻訳)。

  > これが解決策です。新しいコンピューターに再インストールしていて、解決策を忘れてしまったので、_秒_時間ありがとうございます。
  > 
  > 私が見つけた最も簡単な解決策は、「bin / validate_virtualization_enabled.ps1」を編集し、上部に「exit」を挿入することです。
  > 
  > このMicrosoftpowerscriptの専門家によると：
  > 
  > https://devblogs.microsoft.com/scripting/use-powershell-to-detect-if-hypervisor-is-present/
  > 
  > ザイリンクスが使用するGet-CimInstanceの用語は、仮想化の検出にはあまり信頼性がないため、これが一部の人々に影響を及ぼしているのは当然のことです。

from [Solved: ISE Windows 10 version does not install - Community Forums](https://forums.xilinx.com/t5/Installation-and-Licensing/ISE-Windows-10-version-does-not-install/td-p/820223)

  - この通りにexitを入れてインストール。
  - 長い時間(1時間以上)かかって、インストール完了。

### ホスト上でProject Navigatorを起動。
  - VirtualBoxが起動し、Linuxが動く。
  - Linuxのsudoのパスワードは、`xilinx`
  - VirtualBoxのデバイス→GuestAdditionsCDイメージの挿入で、VirtualBoxのサポートプログラムをインストール。
  - VirtualBoxのデバイス共有フォルダで、ホストのフォルダを/mnt/projectとかにマウントするように設定。sudo reboot now必要.
  - Linuxのシステム→ディスプレイで、解像度を見やすいサイズに上げる。

### 実行
- これでGenerate Programing Fileまで、できました。
- BadKnowHow。
【2023年版】asdf のインストール手順（ zsh + homebrew ）

# 実行環境

| OS  | macOS Ventura 13.5  |
|-|-|
| shell  | zsh 5.9 (x86_64-apple-darwin22.0)  |
| middleware  | Homebrew 4.1.5  |

## 本記事で得られる結果

- asdfの実行環境

## 参考資料

[Getting Started | asdf](https://asdf-vm.com/guide/getting-started.html)

## 事前準備

1. [Homebrew](https://brew.sh/index_ja)がインストール済みであること

https://qiita.com/naoto24kawa/items/59cdae4377f84d248a48

## 手順

1. asdfが依存しているツール群のインストール

    ```shell
    brew install coreutils curl git
    ```

2. asdfのダウンロード

    ```shell
    brew install asdf
    ```

3. asdfのインストール(zsh+Homebrewの場合)

    ```shell
    echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc
    ```

4. 各種プラグインのインストール

- node.jsの場合

https://qiita.com/naoto24kawa/items/6ecead7c56e3cc5853b0

- PHPの場合

https://qiita.com/naoto24kawa/items/38040e6a053d43bf3974
【GitHub Pages】Vite+Reactで作成したSPAの下層ページで404エラー

### 記事内容

GitHub PagesへデプロイしたVite+Reactで作成しているSPAサイトの下層ページで404エラーが発生する事象への対処

### 前提条件

- Topページの表示には成功している

- Custom GitHub Actions Workflowsを使用する設定でデプロイしている

### バージョン等あれこれ

- Node.js16.17.1
- React.js:18.2.0
- Vite:4.4.9
- react router v6

### 試したこと

「vite 404 github」や「vite react 
404」などで検索し、いくつかの対処方法を試したものの改善せず、困り果ててましたが、
以下の対処が今回のエラー解消に直結しました。

- package.jsonのscriptsの項にpostbuildを追記

```package.json
 "scripts": {
    "postbuild": "cp build/index.html build/404.html",
 }
```

しかし、この時点では現象の改善には至りませんでした。

### 結論

上記のコードを下記に変更する。

```package.json
 "scripts": {
    "postbuild": "cp dist/index.html dist/404.html",
 }
```

### 詳細

やっている事としては「試したこと」に記載した内容がベースとなっています。

要はビルドを行う際、本番環境にindex.htmlの内容を404.htmlへコピー出来ればいいと理解しました。

GitHubでコミット履歴を見たら、試したことの内容のコミット時に尽くエラーとなっていたため、原因を考えたところ、

- Reactのみで構築した環境ではbuildした本番環境の内容がbuildディレクトリへ、Viteを生じた場合はdistディレクトリへ保存される

ということに気が付き、buuld => distへ記載を変えたところ、無事デプロイに成功、404エラーも解消されました。
EC2のIAMロールを使ってRailsからSESを使う方法

[株式会社TECH LUCK](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)という会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご連絡いただけますと幸いです。

# 前提
インフラをAWSで構成しており、AWS EC2上で稼働しているRailsアプリケーションから、AWS SESを使ってメールを送信する構成を作りました。
その際に、EC2からSESを利用する設定方法があまり記事になっていなかったので記事にしました。

# Railsプロジェクトでの設定
## gemの導入
Gemfileに`gem 'aws-sdk-rails'`を追記して、`bundle install`します。
ここで注意、`gem 'aws-ses'`ではないということです。他の記事などで`gem 'aws-ses'`を利用する人もいましたが、この記事では利用しません。

`aws-sdk-rails`について詳しく知りたい方は[こちらのリポジトリ](https://github.com/aws/aws-sdk-rails)をご参照ください。

## AWS SESの利用設定

次に、`config/initializers/aws_ses.rb`ファイルを作成し以下の記述をします。
ここでも注意なのが、秘匿情報（credentials情報）をRailsプロジェクト内で明示的に設定しなくても、`aws-sdk-rails`がうまくやってくれるようです。

```rb:config/initializers/aws_ses.rb
Aws::Rails.add_action_mailer_delivery_method(
  :aws_sdk,
  region: 'ap-northeast-1'
)
```

`config/environments/production.rb`でメール送信の設定を以下のようにして、`aws_sdk`を使うようにします。

```rb:config/environments/production.rb
config.action_mailer.delivery_method = :aws_sdk
```

# AWSでの設定
## SESの設定
SESの自体の作成方法や設定方法はさまざまな記事で紹介されているので割愛します。
以下の記事を参考にしてみてください。

https://qiita.com/tanakaworld/items/94f1ba66801100f6a44f

## EC2に権限を付与する
AWS EC2のインスタンスに、AWS SESのFullAcess権限がついたIAMロールを付与します。
これをしないとAWS EC2からAWS SESを利用することができず、エラーで弾かれてしまいます。（これで1日潰しました。）


これで、AWS EC2に構築されたRailsアプリケーションから、AWS SESを利用してメールの送信をすることができます。

# 参考記事（圧倒的感謝）

https://betit0919.hatenablog.com/entry/2019/09/04/164620
Solana バリデーター向けのオープンソースCLIツール "solv" を公開しました

![solvOverview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780317/d24b8933-b3b0-9254-c810-429325a5c9d3.png)


gm! Epics DAO Co-founderのkishi.solです。

Epicsは社会貢献型ブロックチェーンゲームで、深刻なリソース不足に陥っているオープンソース開発をトークンエコノミクスとゲーミフィケーションで活性化し、ソフトウェアによるイノベーションを持続可能なものにします。

今回は、Epics DAOの開発した新しいオープンソースの"solv"というSolanaバリデーター向けのCLIツールについて紹介させてください。

Solana エコシステムは日々急成長を遂げており、バリデーターはその中核を成しています。私達は Epics DAO とエルソウルラボ、そしてオープンソース"Skeet" 開発コミュニティ、3 つの開発チームがそれぞれ Solana のバリデーターとして活動してきました。その結果、私達は Solana バリデーターとして遭遇する課題や必要性を深く理解しています。この経験から生まれたのが、"solv" です。

solv (GitHub): https://github.com/EpicsDAO/solv

## solv - Solana バリデーター CLI ツール

![solvCLI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780317/bdb1ff7b-6038-8825-21e5-b70ab1bb2432.png)


solv は、Solana バリデーターのセットアップと運用を簡略化するためのオープンソース CLI ツールです。solv を使うことで、バリデーターのセットアップ、運用、モニタリング、アラート、アップグレード等、バリデーターとしての業務を簡単に行うことができます。

新しく Solana バリデーターに参加する方はもちろん、既にバリデーターとして活動されている方も簡単に solv の利用へ移行いただき、以後の運用をより手間なくスムーズに行うことができます。

solv の主な狙いは以下の通りです。

- **Solana ネットワークの分散化を促進:** バリデーター業務の簡略化により、多くのユーザーが Solana ネットワークに容易に参加できるよう設計されています。これにより、ネットワークの分散化と誰も取り残さない技術革新社会に貢献します。オープンソースとして透明性を持ちつつ、安全かつ信頼性の高いバリデーターネットワークの構築が可能となります。
- **バリデーター業務の手間や負担を削減:** solv の利用者は、多くの設定やアップデートを一つのコマンドで簡単に実施できるようになります。また、Solana ネットワークはグローバルに運用されているため、バリデーター業務は常識的な業務時間内のみに収まりません。タイムゾーンの違いなどの問題で時間通りの早期更新対応が難しい場合でも、solv コマンドから更新を設定し、自動で完了させることも可能になります。高度な技術を持つ Solana のバリデーターたちの時間を節約することで、そのバリデーターたちはより多くの社会的価値を生み出すことができます。
- **オープンソースコミュニティのリソースを強化:** 技術的に熟知したオープンソースコミュニティは、バリデーターとしての参加が推奨されます。しかし、すべての開発者が特定のブロックチェーンに詳しいわけではないため、その障壁は意外と高いままです。solv は、バリデーターとして参加するためのハードルを下げることで、より多くのオープンソース開発コミュニティがバリデーター報酬を得て、持続可能なオープンソース開発環境を構築することを目指しています。

このツールは 元々私たちの開発チーム・コミュニティ全体の運用効率化のために開発されました。しかし、Solana バリデーターと Solana コミュニティ全体、及びすべてのオープンソース開発コミュニティにとって非常に価値があると判断したため、私たちは solv をオープンソースとして公開し、全てのユーザーがこれを無料で自由に利用できるようにしました。ぜひお試しいただければ幸いです。

詳細は下記 GitHub リポジトリをご覧ください。

solv (GitHub): https://github.com/EpicsDAO/solv
Dockerを用いたqiita-cliの環境構築


こんにちは，ご覧いただきありがとうございます。
普段，皆さんはコーディングの時にどのソフトを使っていますか？
ちなみに私はVSCodeを使っています。
使い慣れているソフトがあるのであれば，Qiitaの投稿もそれを使ってしたいですよね！！

それを可能にする

https://github.com/increments/qiita-cli

というものがありました！
Dockerを使ってローカルで環境構築をしたのでその備忘録です。
皆さんのお役に立つことを願って…

## 環境

- Windows11
- WSL2

```bash:wsl2
$ cat /etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS"
```

## 1. Dockerfileの作成

Dockerを使うのではじめは当然`Dockerfile`の作成です。
適当に作業ディレクトリを作ってください。

> 追記（2023/09/06）
>
> `sed`がうまく動作せず，`http://locahost:8888`でpreviewサーバが立ち上がるようになっちゃいました。（あまりDockerやLinuxに詳しくなくて…）
> とりあえずの対応策として，元ファイルを書き換えることで解決しました。
> 
> ```diff_javascript:/node_modules/@qiita/qiita-cli/dist/server/app.js:57
> - const host = "localhost";
> + const host = "0.0.0.0";
> ```

```Dockerfile:Dockerfile
FROM node:20-alpine3.17

WORKDIR /qiita

RUN sed -e "s/localhost/qiita/g" -i /qiita/node_modules/@qiita/qiita-cli/dist/server/app.js

EXPOSE 8888
```

```yaml:docker-compose.yml
version: "3"
services:
  qiita:
    container_name: qiita
    build:
      context: .
      dockerfile: Dockerfile
    tty: true
    ports:
      - 8888:8888
    volumes:
      - ./:/qiita
    environment:
      TZ: Asia/Tokyo
```

## 2. コンテナの起動

```bash
docker-compose up -d
```

## 3. `qiita-cli`のインストール

```bash
docker-compose exec -it qiita sh
npm install @qiita/qiita-cli --save-dev
```

```bash
npx qiita version
```

でバージョンが表示されればインストール成功です。

## 4. `qiita-cli`の設定

### 4-1. 初期設定

```bash
npx qiita init
```

### 4-2. Qiitaログイン

#### APIキーの生成

以下からAPIキーを生成しておいてください。

https://qiita.com/settings/tokens/new?read_qiita=1&write_qiita=1&description=qiita-cli

#### CLIでのログイン

```bash
npx qiita login
```

トークンを聞かれるので上で発行したキーを入力してください。

### 4-3. プレビュー画面の表示

```bash
npx qiita preview
```

プレビュー画面が起動されたはずです！

http://localhost:8888/

:::note info
もし2回目以降に`npx qiita preview`でエラーが起きる場合
`~/.config/qiita-cli/credentials.json`を作成すると大丈夫でそうです。
:::

以上でローカルに`qiita-cli`の環境構築ができました。
これからのQiita投稿作業が幾分か楽になりそうです！！（笑）

## 参考

https://qiita.com/engishoma/items/13b7eac3b335b56711a7

https://qiita.com/yukin01/items/4f54496fd2f577c56b1d

https://github.com/increments/qiita-cli
Railsアプリを日本語化する際に、gemを使うのか・使わないのか問題

[株式会社TECH LUCK](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)という会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご連絡いただけますと幸いです。

# 前提

日本語化についてはさまざまな記事がありますが、gemを使うのか・使わないのかが不明確だったので少し調べてみました。

# 結論
`gem 'rails-i18n'`を導入しなくても日本語化対応することができます。

gemを使うことのメリットは以下とのことです。

> rails-i18nのgemは、Railsアプリケーション内で国際化を行うための機能とリソースを提供するための特定のgemです。rails-i18n gemには、一般的なRailsのメッセージやラベルに対する事前定義された翻訳が含まれています。ActiveRecordモデル、日付や時刻のフォーマット、エラーメッセージなどの翻訳をカバーしています。これらの翻訳は、すぐに使用できる状態で提供されるため、手動で定義する手間や時間を節約できます。

引用元：https://zenn.dev/redheadchloe/articles/ef6cfd9c129893

つまり、localeファイル自身で作成（ダウンロード）しなくても、gemをインストールするだけである程度の日本語化ができるということだと思います。（あまり調べていないので詳しいことは確証はありません。）

## gemを使ったやり方

https://zenn.dev/redheadchloe/articles/ef6cfd9c129893

https://zenn.dev/atsushi101011/articles/7e81a494ce69fc

## gemを使わないやり方

https://blog.to-ko-s.com/rails-how-to-initialization/

https://hnnsk.hatenablog.com/entry/2021/06/26/114515
PerlでBOM付UTF-8のCSV(Excelで直接読めるCSV)を出力する方法

# Excelで読み取れるCSV

文字コード UTF-8 のCSVファイルをExcelで開くと、以下のように文字化けする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111137/7456b981-c557-60cd-0076-65a27e931116.png)


文字化けをさせないためには先頭にBOM(バイトオーダーマーク)を付ける必要がある。

#PerlでBOMを出力するサンプル
```pl:bom.pl
#!/usr/bin/perl
use strict;
use warnings;

# BOMを出力する
print "\x{EF}\x{BB}\x{BF}";

# CSVを出力する
print "ID,名前"."\n";
print "1,山田"."\n";
print "2,田中"."\n";
print "3,坂本"."\n";
```
# 実行
```
./bom.pl > excel.csv
```
とするとExcelで読み込めるCSVファイル(excel.csv)ができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111137/ef6be30b-c7da-5a34-739b-64d89146ad9f.png)
ビットキーの輪読会を紹介してみる

# はじめに

ビットキーでは有志が集まって輪読会（勉強会）を実施しています。

これまで私は輪読会に対してあまり良いイメージがなかったのですが、ビットキーの輪読会に参加したところ良いイメージへと変わったので実施方法についてご紹介しようと思います。

旗振りは @hosht さんがしてくださってます。この記事は参加者目線での紹介となります。

# これまでの輪読会の印象

前提として、私が思い描くこれまでの輪読会の形式は以下のようなものでした。

1. 参加者を募る
2. 参加者に章単位などで担当を割り振る
3. 毎週定期開催して担当者が発表する

その上で輪読会に対して良いイメージを持っていなかった点として、「3. 毎週定期開催して担当者が発表する」がありました。
理由としては、そもそも本を読むだけなら個人で読めば良いと考えていたり、発表する資料の準備が面倒だったりしたからです。

# ビットキーでの輪読会

## 輪読会対象の本

輪読会対象の本は @hosht さんが「Good Code, Bad Code ～持続可能な開発のためのソフトウェアエンジニア的思考」を選定しています。

https://www.shuwasystem.co.jp/book/b620733.html

私自身もこの本を買っていましたが、積読になっていたため読むいいきっかけとなりました。

## スケジュール

- スケジュールは第 0 回を開催し参加者で話し合い決定
- 2023.04 ~ 2023.07 の 3 ヶ月間の期間で全 10 回を実施
- 各回 30 分の実施
- 全 10 回実施後に本の内容および輪読会について振り返り会を開催

## 事前準備

1. 対象となる章を個人で読む
2. 読んだ章の感想・学び・疑問などを記載しておく
3. (集まった時に話したいことを記載しておく)

## 当日

1. 各参加者の記入内容をもくもく5分で確認する
2. 参加者が気になったことをピックし20分くらいで話し合う
3. 残りの時間でまとめを作成する
4. 次回の予定を確認する

## その他

- 毎回参加しないでもOK！気になる章だけの参加でもOK！
- 参加者全員が読んでいなかった場合はみんなで読む(今回の輪読会では誰かしらは読んでいたので今回このケースの実施はなし)

## 参加人数

- 初回は 4 名
- 途中から参加者が増え最終的には 7 名で実施

# 私の取り組み方

私は時間が確保できた土日に本を読み進め、5月の中頃にはすべて読み終わらせました。
Part・Chapter を Notion にすべて書き出し、気になった文章をメモしていきました。また、Chapter ごとに自分が読んで感じたことや感想をコメント機能で記載しました。
下に添付した画像のような形式で Notion が埋まっていきます。

![notion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961759/a05bde7d-7b79-1c50-5a61-9032f87b9d5e.png)

 
読む際は以下のような点について意識していました。

- 自分の琴線に触れたことだけピックする
- Go だったらこうだよねを考える
- 章のまとめなどは記載しない
- 読み飛ばす
  - 特にコードで実装するとこうなるとか（そもそもサンプルコードは読まないことが多い人間）
- 疑問点があったら輪読会で質問する
  - その場でも考えるけどそこまで言語化はしない

# 振り返り・感想

全 10 回の輪読会が終了したあと、参加メンバーで Fun! Done! Learn! を用いて振り返り会を実施しました。

https://www.ogis-ri.co.jp/otc/hiroba/others/ActivityPocket/FunDoneLearn.html

振り返りでは本の内容に関することおよび輪読会に関することについて意見を出していきました。

![スクリーンショット 2023-08-14 20.18.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961759/a5b11948-82b0-f4d5-8fd1-30fc81ba2aec.png)
※ 黄色付箋：振り返り、ピンク付箋：ネクストアクション

共有された中で、「勉強会の帰り際（席に戻るまで）の会話が重要だったかも！？」という意見は納得でした。
輪読会が終わったあとも歩きながら議論をしたり、「さっき話していたあれについてもうちょっと知りたいんですけど」と個人的に話したりすることがあったのでこれらの知見も共有できた方がよいなと感じました。

また、Fun Done Learn はひとつしかなかったので次回輪読会を実施するときにはもっと増やしたいです。

輪読会実施における個人的反省ポイントは早期に本を読み終わらせてしまったことです。
みんなで集まって議論するときには自分自身がメモしたことなのに「私はなぜこれをメモのだろう」となることが後半に行くほど増えていきました。
今後は、輪読会直前に時間を見つけて読むようにします。

# 個人的推しポイント

輪読会に参加して、以下の点がよかったと感じています。

- 輪読会参加へのハードルが低い
  - 最悪本を読まなくても参加できちゃう
- さまざまな立場や経験をお持ちの方が参加するのでいろいろな話が聞ける
- チームでの困りごとなども輪読会を通じて共有・相談ができる
- 抽象的な内容に関して具体でどんなことありますか？と聞ける
- 自分の解釈とは違った意見が聞ける
- 輪読会を振り返ることで輪読会も改善していける

# おわりに

輪読会に参加して、「輪読会って楽しいな」という印象に変わりました。
今後もこの活動を通して自分のエンジニア力を磨いていきたいです。
輪読会といっても参加者や目的・文化によっていろいろなスタイルがあると思うのでぜひみなさんの開催形式についても共有いただけると嬉しいです。
Dockerがディスクを圧迫している

・うまく消えないdockerのゴミを消してしまおう。
・dockerの保存場所を別ドライブに移してしまおう。
・ubuntu22.04環境です。


VScodeでdocker使っているが、イメージなど使い捨てしないのでディスクを圧迫してしまった。
通常はpruneコマンドで不要なものを消していく。

https://docs.docker.jp/config/pruning.html

## dockerのフォルダ全体を削除してスペースを空ける

/var/lib/docker/overlay2 がすごい容量になっていてpruneコマンドであまり消えてくれない。
仕方が無いので、いっぺんフォルダごと削除してみた。

```
sudo systemctl stop docker.service
sudo systemctl stop docker.socket

sudo rm -rf /var/lib/docker

sudo systemctl start docker.socket
sudo systemctl start docker.service


```
rm -rf コマンドは、フォルダの強制削除をするので用心深く使う。
コンテナ内に重要なデータが無いこと。

フォルダの削除後にdocker-compose up を実施したところ/var/lib/docker/overlay2 フォルダが再作成されている。dockerの再インストールとかしなくて大丈夫だったようだ。


## docker関連ファイルを別のドライブに移す

ver24.0の日本語マニュアルによると、/etc/docker/daemon.json にjsonファイルを作成することで設定できそうだが、dockerフォルダを丸ごと移したい（jsonの置き場が無くなる）ので別の方法を採用。

https://docs.docker.jp/config/daemon/daemon.html#configure-the-docker-daemon

### dockerデーモンのオプションで設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/70665259-9890-c95e-8513-464916431f6a.png)

docker.serviceファイルを編集する
```
sudo gedit /lib/systemd/system/docker.service
```

[Service]の所にある次の行
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

半角スペースに続けて以下を追加する。
 --data-root=/mnt/myssd/docker
以下のようになる。
```
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --data-root=/mnt/myssd/docker
```
### 保存先の注意点
dockerの保存先が別ドライブの時は、マウントポイントを手動で設定すること。/media/user/など自動的に作成されたマウントポイントはアクセス権限などの関係かうまく行かない。
/etc/fstabを直接編集するか、ＧＵＩツール（おすすめ）のディスクDisk(デフォルトでubuntuに入っている）を利用する。
fstabに記述することで、永続化できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/c49c8fe2-3cf4-3459-b4de-4aa3c95ab1af.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/795843e8-b8ca-9ef0-9180-a1dca02f1e1b.png)


```自動生成されたfstabの追記.
/dev/disk/by-uuid/554eedee-e53f-4388-b205-2618e4ff02ec /mnt/myssd auto nosuid,nodev,nofail,x-gvfs-show 0 0
```
fstabには追記されるので、同じマウント名で再作成する際は、手動でfstabを修正する。sudo gedit /etc/fstab



https://qiita.com/katakaku/items/0b6e24de0f0ef88b7566#ntfshdd%E3%81%AE%E3%83%9E%E3%83%B3%E3%83%88%E3%83%91%E3%82%B9%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B%E3%81%94%E3%81%A8%E3%81%AB%E5%A4%89%E3%82%8F%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86

再起動してコンテナ作成など問題無ければ、sudo rm -rf /var/lib/docker で古いデータを削除する。
Twitterとの連携


+ [OAuth 2.0 を使用した Flow HTTP Callout によるツイートの投稿](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007EYcBa)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/67c0e477-6486-d28a-83df-8ab360947cdf.png)

https://twittercommunity.com/t/403-error-when-trying-to-post-to-2-tweets-using-example-in-documentation/165675
Minecraftのサーバーとは何か・月額料金なしで自分のサーバーを持つには

## Minecraftサーバーとは
Minecraftサーバーは、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3530195/828cea79-314a-fa37-3160-ca866e682bc1.png)
画像で説明するとこう。
一台のコンピューターが開いているワールドにみんなが接続する感じ。
サーバーとなっているコンピューターを24時間動かしておけば、**24時間参加者は各々好きなタイミングでワールドに接続できる。**
自分の遊んでるコンピューターにみんなが接続する感じだと、そのコンピューターでワールドを開きっぱなしにする必要があるので嫌な人は嫌だと思う
## サーバーで遊ぶ方法
- Minecraft Realms：公式の提供してる方法。**月額料金がかかる。** カスタマイズ性が低い。簡単。
- ホスティングサービス的なヤツ：ConoHaとかさくらとかそのへん。**月額料金がかかる。または無料だとしてもサーバーが不安定。** カスタマイズ性が低い。よくわからん
- **自分でコンピューターを用意してサーバーにする：** **ウチに転がってる余りのパソコンを使えばかかるのは電気代のみ。** そういったパソコンがなくても買い切りでいいしRaspberry Piとかでいいから比較的安い。**あらゆるカスタマイズができる。ステップを踏めば簡単。** この記事でそのステップを書いておくのでみんなこれにしよう
## 自分でコンピューターを用意してサーバーにするステップ
ステップだけ書く。それぞれの手順は調べれば出るから、調べるか、ChatGPTに聞こう。
1. コンピューターを用意する（統合版のバニラサーバーはRaspberry Piでは動かないので注意。しかし後述するJava版のプラグインサーバーであるPaperを使えばJava版と統合版のクロスプレイができるしRaspberry Piで動くのでそれがおすすめ）
1. コンピューターのOSをLinux MintとかRaspberry Pi OSとかの軽いOSに変える
1. IPアドレスの固定とポート開放（ポート転送）の設定をする。ここが一番むずい
1. サーバーのソフト本体（Paperがおすすめ）を入れて設定する
1. 完成
### おすすめの構成
- コンピューター：Raspberry Pi 4 Model B 8GB
- OS：Raspberry Pi OS Lite 64bit
- サーバーソフト：Paper（プラグイン：管理をDiscordである程度できるようにするDiscordSRV、統合版とのクロスプレイを可能にするGeyserMCを導入。）
- 自分の場合はさらに自作のサーバー起動用Discord botを用意した。ダウンロード・使い方はこちらから：[GitHub](https://github.com/insane-catt/DiscordLaunchMC)
Oracle Cloud 公開情報あれこれ

「Oracle Cloud Infrastructureについて調べたい」と思った時に参考となる各種情報のページを集めてみました。

**ドキュメント(日本語)**
　https://docs.oracle.com/ja-jp/iaas/Content/home.htm
　※最新は英語版
　https://docs.oracle.com/en-us/iaas/Content/home.htm

**技術資料**
■Oracle Cloud Infrastructure 活用資料集
　https://oracle-japan.github.io/ocidocs/
■Speaker Deck
　Oracle Cloud Infrastructure ソリューション・エンジニア
　https://speakerdeck.com/ocise

**チュートリアル**
■Oracle Cloud Infrastructure チュートリアル
　https://oracle-japan.github.io/ocitutorials/
■LiveLabs(ブラウザの翻訳機能を活用)
　https://apexapps.oracle.com/pls/apex/dbpm/r/livelabs/home

**構成例**
■アーキテクチャ・センター
　https://docs.oracle.com/solutions/?q=&cType=reference-architectures%2Csolution-playbook%2Cbuilt-deployed&sort=date-desc&lang=ja
　※リファレンス・アーキテクチャ、ソリューション・プレイブックを概説したブログ
　https://blogs.oracle.com/oracle4engineer/move-workload-to-oraclecloud

**価格関連**
■簡易見積サイト
　https://www.oracle.com/jp/cloud/costestimator.html
■価格表
　https://www.oracle.com/jp/cloud/price-list/
■見積セミナー資料（2022年9月時点の資料のため最新情報は価格表をご確認ください）
　https://speakerdeck.com/oracle4engineer/oracle-cloud-infrastructure-costestimator

**セミナー**
■Oracle Cloudウェビナーシリーズ
　https://go.oracle.com/LP=95899
■オンデマンド動画(過去開催分のアーカイブ)
　https://go.oracle.com/ocws-jp-ondemand
■Japan Developer Events：開発者向けイベントTopページ
　https://developer.oracle.com/ja/community/japan-events.html
■Code Night：様々なテーマでMeetupやセミナーを開催
　https://oracle-code-tokyo-dev.connpass.com/
　- 過去動画 Youtubeチャンネル(ページを開くと最初の動画の音声が流れ始めます）
　https://www.youtube.com/c/JapanOracleDevelopers
Kids Drawing, Doodle Painting

#1 Drawing for kids

Links download: https://apps.apple.com/app/id1406126607

"Kids Drawing, Doodle Painting" - an engaging and educational app designed for children to explore their artistic talents while having fun.


Features:

- AR Drawing: Spark your kids' creativity with our AR Drawing, Sketch & Paint app! Watch as their creations come alive in augmented reality. Easy-to-use tools and a vibrant interface make it a breeze for them to explore their artistic side while having fun. Let their imagination thrive and artistic skills grow with this magical app!

- Tracing: Step-by-step instructions guide children in drawing various objects, helping them improve their drawing skills.

- Animation: Kids can create their own animated drawings or explore animations crafted by their parents, sparking their creativity.

- Doodle Kaleidoo: This feature allows children to create beautiful drawings with glowing lines, supporting symmetrical designs from 1 to 16 lines.

- Freehand Drawing: Children can express their imagination and ideas through freehand drawing, encouraging their creativity.

- Painting & Coloring: The app offers a delightful collection of pre-designed images, such as princesses, vehicles, Christmas-themed objects, animals, and more, for kids to color.

- Other Activities: Interactive games like "Guess the Object," "Shape Recognition," and "Color Identification" make learning enjoyable while playing.



Creative Opportunities:

- Parents can actively participate in their child's creative journey. They can create personalized Tracing lessons, Animation sequences, and Pattern Coloring exercises to match their child's interests. By tailoring the app's content to their preferences, children can learn in a fun and spontaneous manner, fostering quick and effective learning.



Sharing:

- Parents can share their creative works with other kids through the sharing section, encouraging collaboration and inspiring each other's artistic endeavors.


Vibrant Color Options:


- The app provides a diverse range of colors for children to use, including basic colors, sparkling glitter hues, and captivating patterns, enhancing the artistic experience.
せんせー、テンソルネットワークってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、テンソルネットワークってなに？

# テンソルネットワークとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## テンソルネットワークって何？

テンソルネットワークは、たくさんの点（ぽっちゃん）と線（ひも）を使って、
大きな計算を簡単にしてみせる魔法の絵のことです。
まるで、お絵かきで魔法を使うみたいなものです。

## たくさんの点（ぽっちゃん）とは？

これらの点（ぽっちゃん）は、色んな数の情報を持っています。
たとえば、「３」や「５」のような数字がそれぞれのぽっちゃんに入っていると想像してみてください。

## 線（ひも）はどう使うの？

線（ひも）は、それぞれのぽっちゃんをつなげる役割があります。
ぽっちゃん同士を線でつなげると、それらのぽっちゃんの情報が一緒になって、
新しい数字や形を作ることができるんです。

## それはどうしてすごいの？

たくさんのぽっちゃんと線を使うと、とても大きな計算も、簡単に見える形に変えることができます。
これがあると、大人たちもとても大変な計算を、もっと簡単に解くことができます。

## それはどうして大切なの？

テンソルネットワークを使うと、科学や工学の難しい問題を解いたり、新しい発明をしたりするのにとても役立ちます。
これがあると、もっと素敵な未来を作る手助けができます。

# まとめ

このように、テンソルネットワークは、たくさんの点（ぽっちゃん）と線（ひも）で大きな計算を簡単にしてみせる、
魔法のような絵なんです。
オートレイアウトでtableHeaderView, tableFooterViewを正しくレイアウトする

## はじめに

UIKitはまだまだ現役の認識でして、リスト表示においては `UITableView`が利用される場面がまだまだあると思います。
ヘッダーやフッターを実装したいとき、`UITableView`であれば基本的には`tableHeaderView`や`tableFooterView`を設定すると思いますが、オートレイアウトで設定するとレイアウトが崩れてしまう場合があります。
本記事では、オートレイアウトで `tableHeaderView`, `tableFooterView`を設定するポイントを説明します。

## `tableHeaderView`, `tableFooterView`について

`tableHeaderView`と `tableFooterView`は、それぞれテーブルコンテンツの上と下に表示されるビューです。

https://developer.apple.com/documentation/uikit/uitableview/1614904-tableheaderview

https://developer.apple.com/documentation/uikit/uitableview/1614976-tablefooterview

どちらも使用方法は同じため、以下では `tableHeaderView`について説明します。
ドキュメントの内容を例のごとくDeepLで翻訳すると、

> tableHeaderViewプロパティを使用して、テーブル全体のヘッダービューを指定します。ヘッダービューは、テーブルのビューのスクロールコンテンツに表示される最初の項目で、個々のセクションに追加するヘッダービューとは別のものです。このプロパティのデフォルト値はnilです。
このプロパティにビューを割り当てる場合、そのビューの高さをゼロ以外の値に設定します。テーブルビューは、ビューのフレーム長方形の高さのみを尊重し、テーブルビューの幅に一致するように、ヘッダービューの幅を自動的に調整します。

重要なのは、 「**このプロパティにビューを割り当てる場合、そのビューの高さをゼロ以外の値に設定します。**」というところです。
ヘッダービューの中身はオートレイアウトでレイアウトを構築しても問題ないのですが、そのビューをインスタンス化して `tableHeaderView`に割り当てる際にはframeの高さを指定してあげないとレイアウトが崩れてしまう場合があります。幅は `UITableView`の幅に依存します。
`tableFooterView`も同じくです。

## `tableHeaderView`, `tableFooterView`の使用例

`tableHeaderView`, `tableFooterView`プロパティにビューを割り当てる際に、frameの高さを指定するだけで適切にオートレイアウトが機能します。繰り返しになりますが、frameの高さを指定しないとレイアウトが崩れる場合があったため注意が必要です。

```Swift

let headerView = CustomHeaderView()
headerView.frame.size.height = 44
tableView.tableHeaderView = headerView

let footerView = CustomFooterView()
footerView.frame.size.height = 150
tableView.tableFooterView = footerView

```

上記の例にある `CustomHeaderView`と `CustomFooterView`の中身はオートレイアウトでレイアウトを組んで問題ないです。

## 終わりに

非常に簡単なことですが、オートレイアウトで `tableHeaderView`, `tableFooterView`を正しくレイアウトするポイントについて書きました。UIKitかつ `UITableView`を使用する場面は少なくないと思いますので、この記事が少しでも誰かの役に立てば幸いです。
【2023年8月版】Ubuntu22.04で作る簡単Linuxルーター

# はじめに

Linuxでルーター構築する勉強したいな。。。

そうだ、ChatGPT先生に教えてもらいながら構築しよう

# 環境

- Ubuntu22.04
- インターネット側インターフェイス `eth0`
- 内側インターフェイス `eth1`
- 外部から内部への接続はできないようにするだけで、セキュリティは考慮せず

# 構築

## ルーターとしての設定を保存するコマンドをインストール

```terminalnal
$ sudo apt-get install iptables-persistent
```

## パッケットのフォワードができるように設定

```terminal
$ echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
$ sudo sysctl -p
net.ipv4.ip_forward = 1
```

## ルーターとして動作するように `iptables` を設定

```terminal 
# NAPT(IPマスカレード)の設定
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# 許可されたトラフィックのみ通過（eth0からeth1のすべてのフォワードは許可）
sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
```

## 設定を永続化する

```terminal
$ sudo sh -c 'iptables-save > /etc/iptables/rules.v4'
```

# 感想

VPNパスするーをどうするんだろうと、思ったけど、
`sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT`
で、TCP、UDP、ICMP、GRE (Protocol 47)、ESP (Protocol 50)、AH (Protocol 51)等が
転送されるため、特に以下のように開ける必要はなかった。
セキュリティ要件で、個々に許可するようなら以下のようになる。

```terminal
# IPSEC
sudo iptables -A FORWARD -i eth1 -o eth0 -p 50 -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o eth0 -p 51 -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o eth0 -p udp --dport 500 -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o eth0 -p udp --dport 4500 -j ACCEPT

# IKEv2
# (UDP 500 と UDP 4500 は既に上述のIPSECの部分で設定済み)

# PPTP
sudo iptables -A FORWARD -i eth1 -o eth0 -p tcp --dport 1723 -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o eth0 -p 47 -j ACCEPT

# L2TP
sudo iptables -A FORWARD -i eth1 -o eth0 -p udp --dport 1701 -j ACCEPT

# SSTP
sudo iptables -A FORWARD -i eth1 -o eth0 -p tcp --dport 443 -j ACCEPT

# OpenVPN
sudo iptables -A FORWARD -i eth1 -o eth0 -p udp --dport 1194 -j ACCEPT
```

# さいごに

かんたんでしたね
DALL-E の API 備忘録

# YouTube（2023年8月18日18時公開）

https://youtu.be/jWgoipQYY5Y

# `openai` というパッケージをインストール

`pip` を実行することで PyPI というパッケージを登録しておける Web サイトから自由に持ってこることができます。今回は `openai` というパッケージをインストールします。同じ環境であれば、一度実行すればOKです。

```dalle.py
pip install openai
```

# プログラム

https://platform.openai.com/account/api-keys

事前に上記から、OpenAI社のAPIシークレットキーを発行して下さい。`create a seacret key` などと書かれているところをクリックして、キーの名前（何でもOK）を入力して発行します。発行したキーは、下記の `sk-***********************************************` 部分に貼り付けます。

```dalle.py
import openai

# create a key from https://platform.openai.com/account/api-keys
openai.api_key = "sk-***********************************************"

response = openai.Image.create(
  prompt="create oyo king of Nigeria",
  n=3, # 枚数
  size="1024x1024"
)
```

# 生成された画像を確認

実行が完了すると、 `response` の中に、画像のURLが何枚か入っているので見てみましょう。

```dalle.py
print(response['data'])
```

毎回違う画像が生成されるので、楽しいと思います。値段はChatGPTよりちょっと高かったりするので、そちらだけお気をつけて！

![スクリーンショット 2023-08-18 9.18.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/d4ebb537-6adf-2bac-49ac-f0516725f668.png)

https://openai.com/pricing#Image%20models

## プチ宣伝

2023年6月13日に発表された ChatGPT API 新機能「Function Calling」で創る LINEbot 入門講座を、Udemyで出しました。もしよろしければ、受講していただけると嬉しいです！

https://www.udemy.com/course/chatgpt-line-function-calling-ai/?couponCode=202308
Go 1.21で注目したい機能


https://go.dev/blog/go1.21

Goの1.21がリリースされましたね！
なんといっても今回特筆すべきはslicesパッケージの登場だと思います
多言語を扱うエンジニアさんはGoのスライスに扱いづらさを感じた方も多いんじゃないでしょうか
他の言語と遜色ない機能が追加、かつ直感的な関数名のものが増えたので自分が嬉しいなと思った物を紹介したいです

# slicesパッケージ

## [Contains](https://pkg.go.dev/slices#Contains)
sのスライス内にvが存在するかをチェックし、存在すればtrueが返ります

```golang
func Contains[S ~[]E, E comparable](s S, v E) bool
```

[サンプル](https://go.dev/play/p/_F9v_sScpD_I)

```golang
m := []string{"taro", "jiro", "saburo"}
ok := slices.Contains(m, "jiro")
fmt.Println(fmt.Sprintf("%t", ok)) // true
```

以前はどうやっていたか
```golang
func contains(slice []string, key string) bool {
	m := make(map[string]struct{}, len(slice))
	for _, s := range slice {
		m[s] = struct{}{}
	}
	_, ok := m[key]
	return ok
}
```

## [Insert](https://pkg.go.dev/slices#Insert) / [Delete](https://pkg.go.dev/slices#Delete)
Insert：sのスライス内iの位置にvを追加して返します
Delete：sのスライス内にある要素をiからjの位置まで削除して返します

```golang
func Insert[S ~[]E, E any](s S, i int, v ...E) S
func Delete[S ~[]E, E any](s S, i, j int) S
```

[サンプル](https://go.dev/play/p/tVLTA2F8Nsk)

```golang
m := []string{"taro", "jiro", "saburo"}
m = slices.Insert(m, len(m), "siro")
fmt.Println(fmt.Sprintf("%v", m)) // [taro jiro saburo siro]

m = slices.Delete(m, len(m)-1, len(m))
fmt.Println(fmt.Sprintf("%v", m)) // [taro jiro saburo]
```

以前はどうやっていたか

```golang
m := []string{"taro", "jiro", "saburo"}
m = append(m, "siro")
fmt.Println(fmt.Sprintf("%v", m)) // [taro jiro saburo siro]

m = append(m[:len(m)-1], m[len(m):]...)
fmt.Println(fmt.Sprintf("%v", m)) // [taro jiro saburo]
```

# [Index](https://pkg.go.dev/slices#Index)
```golang
func Index[S ~[]E, E comparable](s S, v E) int
```
sのスライス内にvが存在する位置を返します。存在しなければ-1が返ります
[サンプル](https://go.dev/play/p/2HAT4UOpiwK)

```golang
m := []string{"taro", "jiro", "saburo"}

searchKeys := []string{"jiro", "siro"}
for _, skey := range searchKeys {
    if idx := slices.Index(m, skey); idx != -1 {
        fmt.Println(fmt.Sprintf("%s is found.", m[idx]))
        continue
    }
    fmt.Println(fmt.Sprintf("%s is not found.", skey))
}
// jiro is found.
// siro is not found.
```


# サンプルケース
## スライス内のとある文字を削除したい

```golang
import (
	"fmt"
	"slices"
)
// jiroを消したい
func main() {
	m := []string{"taro", "jiro", "saburo"}

	if idx := slices.Index(m, "jiro"); idx != -1 {
		m = slices.Delete(m, idx, idx+1)
	}
	fmt.Println(fmt.Sprintf("%v", m)) // [taro saburo]
}

```

## スライス内に指定の文字が無かったら挿入したい
```golang
import (
	"fmt"
	"slices"
)

func main() {
	m := []string{"taro", "jiro", "saburo"}

	if exists := slices.Contains(m, "siro"); !exists {
		m = slices.Insert(m, len(m), "siro")
	}
	fmt.Println(fmt.Sprintf("%v", m)) // [taro jiro saburo siro]
}
```

# 最後に
記事内では触れていませんが、それぞれ比較ロジックをカスタマイズできる関数も用意されていて、かゆいところにも手が届きそうです

sortパッケージはパフォーマンス改善のみがされたようで、つくに追加の機能はない模様
mapsパッケージはぱっと見使いどこがピンと来なかったのですが、より複雑な実装をする際にはあると嬉しい場面もありそう？
SQL Updateクエリ

サンプルです。
例外や改修はご自分でお願いします。

```cs
using System;
using System.Data.OleDb;
using System.Windows;

namespace WPF_ACCESS {

    public partial class MainWindow : Window {

        String constr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\DB\SYSTEM.accdb";
        public OleDbConnection conn;
        
        public MainWindow() {
            InitializeComponent();

            string[] ax = new string[100];
            int c = 0;

            //////////////////////////////////////////////////////////////////////////////////////////////////
            // DBの項目順番通りに記載すること
            ax[c++] = "CODE";
            ax[c++] = "NAME1";
            ax[c++] = "NAME2";
            
            c--;

            ////////////////////////////////////////////////////////////////////////////////////////////////
            // UPDATEクエリ作成
            ////////////////////////////////////////////////////////////////////////////////////////////////
            string sql = "UPDATE T_MAIN SET ";
            for (int v = 0; v <= c; v++) sql += ax[v] + "=@" + ax[v] + ",";

            string vr = sql.Substring(0, sql.Length - 1); // 最後の , 取る
            vr += " WHERE ID=5755";

            //MessageBox.Show(vr);

            using( var conn = new OleDbConnection {
                ConnectionString = constr,
            })
            using( var comm = new OleDbCommand {
                CommandText = vr,
                Connection = conn,
            })
            {
                conn.Open();

                try {
                    c = 0;
                    comm.Parameters.AddWithValue("@" + ax[c++], "789");
                    comm.Parameters.AddWithValue("@" + ax[c++], "456");
                    comm.Parameters.AddWithValue("@" + ax[c++], "789");

                    comm.ExecuteNonQuery();
                    conn.Close();
                }
                catch {
                    MessageBox.Show ("T_MAIN UPDATE ERR");
                }
            }

        }
        

    }


}
```
githubでC++のライブラリを公開してます

僕が作ったライブラリを公開しています。利用は自由です。作ったときは、この記事に書いていきます。

https://github.com/hiro1729/cpp_lib

# main.hpp

よく使うものを書いています。

- rep系
repは[0,n)
repsは[s,e)
rvrepは(n,0] (多分書き方正しくないと思うので、コメントください）
repvはvector全探索
- all(x)
みんなが使っているように、x.begin(), x.end()です。
sort(all(x))などです。
- chmax, chmin
変更されたかどうかを返す
- 型
llなどです。int→llは使ってません。
- ac-library
ac-libraryがあるときにdefineされる何かがあれば教えてください。追加します。
mintは998244353, mint1は1000000007です。

9/10追記 io.hppに移しました

# io.hpp

- 高速入出力
IinとLLinとInputです。速度は試してませんが多分速いです
8/27追記: inputを変更→stringに追加していくのは本当に早いのかと疑い、とりあえずscanfに変更
しかしメモリをめっちゃ使う。追記終
IoutとPrintです。いつかマクロでpythonみたいにしたいな。

# math/modcomb.hpp
modcombの構造体を作りました。
``` cpp
// verified 2023/08/16
// ABC034 C - 経路
// https://atcoder.jp/contests/abc034/tasks/abc034_c
// https://atcoder.jp/contests/abc034/submissions/44626334
int main() {
  int w = iin(), h = iin();
  mComb c; c.init(200000);
  iout(c.C(w + h - 2, w - 1));
}
```
こんな感じです。

# math/integer.hpp
素数判定、約数列挙、素因数分解、エラトステネスの篩と区間篩、modpow、MillerRabinとPollardRhoなどです。
MillerRabinは失敗率$ \frac 1 {4^{30}} $です。








追加したら書きます
【備忘録】firebaseのcloud functionsをはじめてみる

# はじめに
最近cloud functionsを触る機会があったので、備忘録残しておきます。
最初のサンプルコードをdeployまでやっていきます。

# フォルダ作成
functionsを始めるフォルダを作成して、移動します。
```
mkdir sample
cd sample
```

# firebaseコマンドを使用可能にする
プロジェクト内でfirebaseのコマンドが使用できるように下記のコードでインストール
```
npm install -g firebase-tools
```

# firebaseのコマンドを入力
### 1．firebaseにログイン
```
firebase login
```
※他のアカウントでログインしたい場合は、`firebase login:add`でログイン可能

### 2．アプリの初期化
```
firebase init
```

### 3．下記の項目を選択
使用するサービス：Functions（スペースで選択し、エンターキーで完了）
使用するアカウント：任意選択
使用するプロジェクト：任意選択
使用言語：typescript
ESLintの使用：No（入れたければYes）
依存関係のインストール：Yes

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/746815/8e5a6ee9-5340-a30d-6583-c12e355e7ff9.png)

### 4．フォルダが作成されていることを確認
sampleフォルダ内に`functions`のフォルダが作成されていて、firebaseのファイルがもろもろ作成されていたら、OKです。

# サンプルコードをdeploy
`functions/src/index.ts`ファイルを開く
コメントアウトされているサンプルのコードがあるので、コメントアウトを外してデプロイします。
```
const functions = require('firebase-functions');

exports.helloWorld = functions.https.onRequest((request, response) => {
    functions.logger.info("Hello logs!", { structuredData: true });
    response.send("Hello from Firebase!");
});
```

デプロイ方法は、コマンドプロンプトまたは、vscode使用しているかたは、vscodeのプロンプトで実行できます。
コマンドプロンプトで`sample`フォルダまで移動して、`firebase deploy`と打ち込んでエンターでデプロイができます。
正常にデプロイできた場合は、`Deploy complete!`と表示されます！
デプロイに成功したら、`Deploy complete!`の下に、
`Project Console: https://console.firebase.google.com`うんたらかんたらとでるので、`https`からのURLをコピーします。
chromeを開いて、URL欄に、表示されているURLを打ち込んで、「Hello from firebase!」と表示されたらデプロイ成功です！

# おわりに
次回以降で実際にfunctionsでトリガーやらバッチやらを実装した記事書いてみますので、ご参考になれば幸いです。
今回は、デプロイする関数が1つでしたが、複数関数になってくると、毎回全部デプロイすると時間がかかるので対象の関数だけデプロイするコマンドあるので、他の記事でまるっと紹介します。

それではよいエンジニアライフを・・！
LACE研究会

LACE研究会には途中から参加した。　
発表側としての失敗は、ソースコードを提示しなかったことだ。
主催の協力者としての失敗は、関係者をもっと誘わなかったことだ。　
Researchmapのリンク切れも失敗の一つだろう。

失敗の克服はこれから。

# LACE第1回研究会
https://researchmap.jp/blogs/blog_entries/view/78772/37deb14b7486a0ae32790543da7f31ce

Language, Cognition and Expression

言語・認識・表現をめぐる学問交流

1996年１０月４日（金）2:00

## 1. 開会・研究会発足                       
## 2. 論文発表

###   無活用動詞論                     上田博和

### 言語過程説と機械翻訳システム ALT-J/E の 設計思想         池原悟・白井諭（NTT）
http://www.kinet-tv.ne.jp/~sat/data/publications/1996/a02.html
## 3. ショートペーパー報告

### 言語の過程的構造に着目した自然言語処理研究の試み－宮崎研究室の試み－  宮崎正弘　新潟大学
###   Port-Royal文法再考                 長田哲男
###   英語教育論（仮題）                矢吹眞康
### ラテン語関節の史的発展の論理分析 佐良木昌
6:30　夕食＋交流会                          

## 7:30 4. シンポジウム     LACE研の目指すもの                            

## 5. 論文発表 ５日（土）9:30
###   関係詞論                         鈴木覺    (愛知県立大学)

##6. 次回日程・閉会　12:00             終了


# 参考資料
追悼　白井諭（自然言語処理)

「言語・認識・表現」年次研究会一覧
「「ソースコード全部読まなきゃ病」と闘う方法」と戦う方法

「「ソースコード全部読まなきゃ病」と闘う方法」と戦う方法https://researchmap.jp/blogs/blog_entries/view/82322/86ebeec0d6eef671909ad667c18aa856

「ソースコード全部読まなきゃ病」と闘う方法
https://qiita.com/guitar_char/items/3b31f7cc79333120b452

を読んで疑問に思ったことを記述。

# コンパイルする

オープンソース、コンパイルをせずに読んでいる人がいるのに驚いたことがある。

コンパイルしてみるとエラーが出る。

その原因をいくつか記録する

環境OSが異なる
環境の言語の版が異なる
環境の道具が異なる(cmakeとか）
ライブラリが異なる
これまで遭遇したソースの８割がコンパイルエラーが出て、読むどころではない。
エラーが出たところ、エラーの原因となったところを読むしかない。

全部読まなきゃ病にはなりようがない。

# 試験プログラムを動かす。

コンパイルする時に、自動的に試験プログラムも通してくださる場合がある。

エラーにならなくても、警告が出ているものはざっと調べる。

OS, 言語を変えてやった時に、出る警告の違いがある場合を重点的に。

# 単語一覧を作る

ソースコードは、単語一覧を作っている。

【2018年11月版】コンパイラ基盤LLVM+Clangをゼロからコンパイル／ビルドする（AWS + CentOS7）。
https://qiita.com/YuukiMiyoshi/items/007bad9857ef0c0fa99a

CentOS6.7にClangをビルド&インストール
https://qiita.com/Tats_U_/items/a18cda280f8f57e8b2ee

LLVMをソースコードからBuildしてからhipify-clangのBuildして動作テストするメモ（失敗）
https://qiita.com/T_keigo_wwk/items/902b0162e3567841656d

LLVMソースコードのコンパイルをしようと思ってハマった罠とそこから脱出するための努力
https://qiita.com/kaizen_nagoya/items/16f270e42b947756ced3
AWS資格取得に利用した教材のふりかえり

# Udemy
- 資格全般的に利用。いわれている通り、日本語の問題集は実際の問題より少し難しい気はする
- 日本語の問題集は対応資格が少ないため、主に英語の教材をChromeの翻訳機能を使いながら問題を解いた。
- Neal Davis、Stephane Maarek、Tutorials Dojoあたりを使った

- 利用して覚えているコンテンツのみ参考として記載

### DVA
https://www.udemy.com/course/aws-certified-developer-associate-practice-exams-amazon-dva-c01/

### SOA
https://www.udemy.com/course/aws-certified-sysops-administrator-associate-practice-exams-soa-c02/

### DAS
https://www.udemy.com/course/aws-certified-data-analytics-specialty-practice-exams-amazon/

### DBS
https://www.udemy.com/course/practice-exams-aws-certified-database-specialty/

# Tech Stock (旧koiwaclub)
サイトについていろいろな話が書かれているが、問題の1セットが7問というのは少しの時間でも説きやすくいい感じでした
DVA、SAP、DOPあたりに使った記憶

https://techstock.jp/


# Whizlabs
勉強になるとは思いますが、テスト対策としては微妙だった

### PAS
https://www.whizlabs.com/sap-on-aws-certification-exam-training/

# ExamTopics
資格はいろいろ対応していて、何が正解か議論されてるのはいいが。なんせ見づらい
課金とログインの催促がうざい

AWSでもAzureの資格でもたまに見ている

https://www.examtopics.com/

# 公式 Skill Builder
PASの時に見た。日本語の学習コンテンツもあるのでいいと思います
ちょっとしたテストがある程度なので、テスト対策は他のサイトで

https://explore.skillbuilder.aws/learn

# 番外
- よくわからない海外サイト。1資格毎に購入してPDFをダウンロードして見れるようなやつ
PASの受験時に参考になるサイトが少なかったので試したが、回答が間違いすぎていてやばい
ちゃんとしたサイトの問題集使いましょう

- Ping-t
AWS資格では使ってないが、SAAがある。増えていくのか
AWSではないが割引チケットの対象資格取得するときにうれしい

https://mondai.ping-t.com/g/question_subjects

# AWS取得資格一覧

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476893/5ac422d4-0cf6-c496-a8c2-b900c60c7c3a.png)
ジョークウイルス 作り方

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/b18f6145-9ef1-2ca4-7667-7bab3e4b66c5.png)
メモ帳を開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/fd934dfa-af69-3f54-e916-a9ecbf6f62c4.png)
startを入力
文字と文字の間にはスペースを入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/7928b4f2-64f4-0b66-59ba-228f3abb0880.png)
名前を付けて保存

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/ca6b7d58-7b7f-0401-0d37-a23f20b16c54.png)
スクリーンショットのような設定でセーブ

XXXX.txt.bat
のような二重拡張子もあり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/f5a09746-7aa5-afdc-4f76-1de19da10893.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/95cab245-a6d7-9c3e-e712-ae1e83000daf.png)


一万個くらい書けばPCはフリーズする

Macにはバッチファイルというものはありませんが、拡張子を.commandにしたシェルスクリプトを用意することでバッチファイルと同じようにダブルクリックでスクリプトを実行させることができます。on
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/db0807a8-543b-65a7-55fe-9986b8ffa460.png)
文字列をカスタマイズする【Unity, C#】

# はじめに
おそらくC#を扱っている方であればわかると思うのですが、ToStringメソッドを使うことによって変数などを文字列に変換することができます。ただ、ToStringメソッドは文字列に変換するだけでなく、文字列を状況に合わせてカスタマイズすることができます。
それを自分用のメモも含めて記録したいと思います

# 数値を3桁コンマ区切りにする
例えば次のようにToString("#, #")で変換すると3桁ごとにコンマを打ってくれます

```php
double number = 1234567.89;

string formattedNumber = number.ToString("#,#");
Console.WriteLine(formattedNumber);  // 1,234,567.89
```

※追記
以下の方法でも同じように記載することができると意見をいただきました！ゲームなどで使う場合は下のほうがわかりやすかったりするんですかね...

```php
using System;
double number = 1234567.89;

Console.WriteLine($"{number:#,#}");  // 1,234,567.89
```
いただいた記事がこちらになります！もしよければご確認ください！自分も確認します！
https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/custom-numeric-format-strinusing%20System;%20double%20number%20=%201234567.89;%20Console.WriteLine($%22%7Bnumber:#,#}%22);%20%20//%201,234,567.89s



ここで"#"は桁プレースホルダーと呼ばれ,対応する数字が存在する場合は置き換え、存在しない場合は表示しないようにします。
 ","は桁区切り記号及び数値位取り指定子の両方として機能していて、ローカライズされた桁区切り記号文字を挿入したり、指定されたコンマごとに、数値を1000で除算したりできるみたいです。

詳しくはこちらに載っています
https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/custom-numeric-format-strings

また、3桁区切り以外にも便利な変換は以下の記事で紹介されているのでぜひご覧ください。
https://www.midnightunity.net/csharp-tostring-format/

# おわりに
C#を使って数年経つんですが、なぜこんなことを知らなかったのか...という気持ちになっています（笑）。コードの可読性を上げるためにももっと勉強をしないといけませんね...
Web ディレクトリトラサルバー攻撃

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/9fa91ac5-afad-5b13-03ba-39a7f39b70e8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/e8537f1e-2c5d-bd6c-d256-c7a827539c49.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/525f1ee8-a522-5230-4001-fa222ddb17cc.png)
コマンドインジェクション

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/e82152fb-4168-2d74-3b90-6b6dd471bcfb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/69c7fa31-49d9-1419-4799-bb898d14fbbc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/46466c92-9d4e-e346-ca75-972c0dadd75b.png)
iOS 安全でないデータストレージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/0f480f18-3955-302e-a65c-18b4d8ec1dbc.png)

不安全なデータ保存について学びます。

不安全なデータ保存は、OWASP Top Ten 2016の2番目のカテゴリに含まれます。

不安全なデータ保存の脆弱性は、開発チームがユーザーやマルウェアがモバイルデバイスのファイルシステムにアクセスできないと仮定し、結果として機密情報がデバイスのデータベースに保存されるときに発生します。

たとえば、あるアプリケーションがあるとしましょう。この特定のアプリケーションにはログイン機能があり、アプリケーションに登録する際に、ユーザー名とパスワードがSQLiteデータベースファイルに保存されます。このファイルはモバイルデバイスのシステムまたはファイルシステムに保存されています。

開発者はここで、ユーザーはこのモバイルデバイスのファイルシステムにアクセスできず、機密情報を取得できないと考えています。しかし、これは真実ではありません。攻撃者やマルウェアはファイルシステムへのアクセス権を持っており、データが攻撃者やマルウェアによって保持されると、特定のアプリケーションにアクセスすることは非常に簡単です。この全体のシナリオが不安全なデータ保存の一例です。

他にも、データはログファイルに安全に保存される場合もあります。また、Firebaseの例もあります。Firebaseデータベースの不適切な認証がある場合、それも不安全なデータ保存に含まれる可能性があります。それではデモの時間です。脆弱なアプリケーションを見つけ、その中で不安なデータ保存を見つける方法を見てみましょう。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/be556d8f-d9e8-9166-241c-71fa70c1f9a4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/4a30f87b-2bf6-b7fa-6864-ee076ee9ae2a.png)
[CDK/python]FargateのTaskDefinition.add_container()でDockerのCMDを上書きし、複数のコマンドを実行する記法

## やりたかったこと

- DjangoアプリをFargateサービスで起動するために、以下のようなDockerfileでbuildしたimageをECRにpushしてある。

```Dockerfile:Dockerfile
~ 略 ~
CMD python manage.py runserver--noreload 0.0.0.0:8000
```

- 本番用のDB(RDS/postgres)に対して、makemigrations/migrate/createsuperuserを実行したい。
- DBセットアップのために、CMDだけ書き換えたimageを用意するのは何となく納得いかない。

```Dockerfile:こんな風にしたい
~ 略 ~
CMD python manage.py makemigrations && \
    python manage.py migrate && \
    python createsuperuser --noinput
```
※`createsuperuser`は`--noinput`オプションを利用して宣言的に行う。
※また、2回目以降は重複ユーザでタスクがエラーになるが、特に問題はない。

- ECSのタスク定義のコンテナ追加オプションで、ENTRYPOINTとCMDを上書きできるらしいのでやってみよう・・・とするが、コマンドを複数実行（makemigrations/migrate/createsuperuser）しようとするとうまくいかない。（migrateだけ等、単一のコマンドなら成功するが、&&で繋いで複数コマンドを実行すると失敗する）

## 解決方法

- 以下の記法で、コンテナのCMDを上書きし、複数コマンドを実行できるようになった。(CDK/python)

```python:cdk_stack.py
task_definition.add_container(
    ~ 中略 ~
    entry_point=[
        "sh",
        "-c",
    ],
    command=[
        '/bin/sh -c "python manage.py makemigrations && python manage.py migrate && python manage.py createsuperuser --noinput"',
    ],
)
```
OpenCVをビルドしてg++で実行する

# はじめに

この記事ではOpenCVをソースからビルドして、C++ファイルを`g++`でコンパイルし、実行するまでを扱う。

# ビルド

依存パッケージのインストール

```bash
sudo apt install cmake g++ wget unzip libgtk2.0-dev -y
```

ソースのダウンロードと解凍

```bash
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.x.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.x.zip
unzip opencv.zip
unzip opencv_contrib.zip
```

構成

```bash
mkdir build && cd build
cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.x/modules ../opencv-4.x
```

ビルド（時間がかかる）

```bash
cmake --build .
```

終了したらインストール

```bash
sudo make install
```

# コンパイルと実行

`~/.bashrc`に以下を追記する

```bash: .bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
```

`test.cpp`を適当な場所に作り同じ場所に`image.png`を置く

```cpp: test.cpp
#include <opencv2/opencv.hpp>

int main()
{
    cv::Mat img = cv::imread("./image.png"); // image.pngをimgに代入.
    cv::imshow("img", img); // imgの表示.
    cv::waitKey(0); // キーが押されるまで待機.
    return 0;
}
```

コンパイルして実行

```bash
g++ test.cpp -I/usr/local/include/opencv4 \
    -lopencv_core \
    -lopencv_highgui \
    -lopencv_imgcodecs
./a.out
```

---

参考資料

https://docs.opencv.org/4.x/d7/d9f/tutorial_linux_install.html