OmniAICreator/Qiita-1.07M huggingface dataset:
さくらのクラウドのマネージドPKIを触ってみた

# はじめに

さくらのクラウド関連でなにか書こうとおもっていたら「マネージドPKI」という面白そうなサービスを見つけたので触ってみました。CLIの手作り認証局は運用のハードルや引継ぎコストが若干たかいのでポチポチできたら便利ですよね。


# 前提として

Labプロダクトはいつか消えてしまうかもしれないサービスです。気を付けましょう。

https://manual.sakura.ad.jp/cloud/lab/about.html?_gl=1*qpora*_gcl_aw*R0NMLjE2Njk5NTc2MzkuQ2owS0NRaUF2cUdjQmhDSkFSSXNBRlE1a2U0NXpyVGJpSkhxcmE5YXB3UzJ6LVgtbVBCM0E5aHJOT1BRX21wZHJsWnBGcURPSEZabEFLY2FBcllJRUFMd193Y0I.*_ga*MTgwNzY5MzE5Mi4xNjQyMzg3MTY3*_ga_HFCNDQ0Q9F*MTY3MDQ2MzgyMy4xODUuMS4xNjcwNDY1NzkyLjUxLjAuMA..*_ga_M3MLBH78ML*MTY3MDQ2MzgyMy4yNDYuMS4xNjcwNDY1NzkyLjUxLjAuMA..&_ga=2.13422015.906991254.1670202847-1807693192.1642387167&_gac=1.215315941.1669957640.Cj0KCQiAvqGcBhCJARIsAFQ5ke45zrTbiJHqra9apwS2z-X-mPB3A9hrNOPQ_mpdrlZpFqDOHFZlAKcaArYIEALw_wcB

> Labプロダクトとして提供する実験的なサービスについて、将来の正式サービス化をお約束するものではありません。サービスの開発状況やお客様のご利用状況などにより、正式サービス化することなく、提供を終了する場合があります。

# つくってみる
マネージドPKIの画面です。
「追加」をクリックしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1983877/43ef2789-b8e0-5b92-d3f1-161065526074.png)

各項目に内容を入力していきます。
ちなみに弊社の英語表記のときの頭文字は小文字です。
終わったら右側の作成ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1983877/bf1b9889-72e7-2f30-4f6a-1151efc525d7.png)

できました。
![スクリーンショット 2022-12-08 113407.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1983877/82fdfdc1-ecec-9de7-909c-a6f42c883c6f.png)

# つかってみる

## クライアント証明書

## 発行処理

クライアント証明書を発行できるそうです。
追加ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1983877/0e3081cb-bdee-277a-d7ef-288b6d5f734e.png)

組織名と部門名は手入力でした。
証明書の発行方法はいろいろあるようです。URLにしてみます。
公開鍵を登録したり、CSRから発行もできるんですね。

![スクリーンショット 2022-12-08 114009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1983877/3163adae-ce89-b038-c212-2f56e5287e99.png)

詳細をクリックします。
![スクリーンショット 2022-12-14 165453.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1983877/fe056cc4-c742-2e8f-ff29-319a04157486.png)


URLをコピーしてアドレスバーに貼り付けます。
![スクリーンショット 2022-12-14 165543.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1983877/a3b44300-2150-ef12-2254-95f4d6b82fee.png)


ボタンをクリックしていくとp12の形式で生成されました。
パスフレーズは指定できないみたいです。
ちなみに発行後、リンクをもう一回クリックするとエラーになります。
![スクリーンショット 2022-12-14 165815.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1983877/06dc93e4-d579-6e3e-4746-39e8834ec40b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1983877/a7641816-67cd-18c6-bd77-f3e1aaa708f6.png)

## 失効処理

失効ボタンをおしてみます。
確認ダイアログが表示されるので「はい」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1983877/fea305b0-dcc3-11c1-0695-8b44854161d7.png)

失効されました。

![スクリーンショット 2022-12-08 115157.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1983877/22c0acf5-77d9-94d4-2d49-64e08d133f66.png)

## サーバ証明書

サーバ証明書は若干違う部分のみお伝えします。

証明書発行時は公開鍵もしくはCSRが必要になります。
サーバ証明書あるあるかなって感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1983877/975f236a-69ed-c7ba-ad86-3dc311753bc5.png)



# 感想

ポチポチするだけで証明書ができるのは便利だなとおもいました。運用コストや引継ぎも楽になりそうです。

クライアント証明書認証を使ったWebサイトやSSLVPNのルータを扱うときがあるので安い価格で出てくれたらとてもうれしいなと思います（AWSは400USDくらいするので手が出ない）
Rspecでfull error messageを表示する

In `spec_helper.rb` or somewhere, configure as below.

```rb
RSpec.configure do |config|
  config.expect_with :rspec do |c|
    c.max_formatted_output_length = 1000000000 ### long enough
  end
end
```

## Ref
- https://github.com/rspec/rspec-core/issues/2535
- https://github.com/rspec/rspec-expectations/issues/991
Livebookで開くボタンを作る

## はじめに

Run in Livebook のボタンを作ります

![スクリーンショット 2022-12-14 16.55.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/582bcbbd-26f9-df1f-076b-945b2c84df84.png)

https://github.com/RyoWakabayashi/elixir-learning/tree/main/livebooks

## ボタンの動作

Run in Livebook をクリックすると以下のような画面（livebook.dev）がブラウザで開きます

![スクリーンショット 2022-12-14 16.57.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/40b99292-38c1-32d9-c9d2-7d0253427d3a.png)

Run notebook をクリックすると次の画面（localhost:8080/authenticate）に遷移します

![スクリーンショット 2022-12-14 16.58.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/c88d6ada-ccf1-7c37-7981-89cbdf7b1595.png)

自分のローカルで Livebook を起動したときのトークンを入力して Authenticate をクリックすると、対象のノートブックが開きます

![スクリーンショット 2022-12-14 17.00.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/ea3bae56-dbeb-39b4-4f53-1eb01dd8a56b.png)

## 実装方法

### livebook.dev での生成

以下の URL にアクセスします

https://livebook.dev/badge

Your notebook URL のところに自分のノートブックの URL (GitHub の URL など)をコピー&ペーストし、その下のバッジがら好きな色を選択します

![スクリーンショット 2022-12-15 9.41.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/269084f3-829f-1e8f-9300-c3848f0aa9ec.png)

表示される Markdown を README.md などに貼り付けるか、 HTML を自分の Web サイトに組み込んでください

### 自前実装

Markdown に以下のように記載します

```markdown
[![Run in Livebook](https://livebook.dev/badge/v1/pink.svg)](https://livebook.dev/run?url=https%3A%2F%2Fgithub.com%2FRyoWakabayashi%2Felixir-learning%2Fblob%2Fmain%2Flivebooks%2Findex.livemd)
```

Markdown では `![画像が表示できなかったときの文言](画像URL)` で画像を表示できます

`https://livebook.dev/badge/v1/pink.svg` はボタンの画像（下の画像）です

![ボタン](https://livebook.dev/badge/v1/pink.svg)

また、 Markdown では `[リンクの文言](リンク先URL)` でリンクを作成できます

`https://livebook.dev/run?url=https%3A%2F%2Fgithub.com%2FRyoWakabayashi%2Felixir-learning%2Fblob%2Fmain%2Flivebooks%2Findex.livemd` がリンク先です

`https://livebook.dev/run` のクエリパラメータ `url` に自分の Livebook の URL をエンコードして指定しています

URL エンコードでは、 URL に含まれる `:` を `%3A` 、 `/` を `%2F` に置換します（そうすることで、記号をパラメータとして渡せるようにしています）

- エンコード前: https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/index.livemd
- エンコード後: https%3A%2F%2Fgithub.com%2FRyoWakabayashi%2Felixir-learning%2Fblob%2Fmain%2Flivebooks%2Findex.livemd

## まとめ

README.md にボタンを付けて、 Livebook で開きやすくしましょう
エンジニア転職したけどやっぱり違ったかもと思った人に読んでほしい

IT業界の新しい働き方に、「エバンジェリスト」というものがある。

エンジニアとして未経験転職したものの、いまいち技術が好きになれない方には絶好のポストかもしれない。
ちなみに私の肩書きはエバンジェリストだ。


## エバンジェリストとは
ひとことでいうと、「ITのいろいろな技術についてわかりやすく解説する人」。
近年、IT技術はものすごいスピードで進化している。
消費者がこの進化についていくのは大変だが、開発者はこの素晴らしい技術を使って制作したサービス・モノをしっかり伝えたい。
この架け橋を担うのが、エバンジェリストだ。
オンラインの加速とともに、需要はどんどん伸びてきている。


## エバンジェリストが必要とされている理由
昔の企業は、良いものをたくさん作って大量に販売し、市場占有率をできるだけ獲得することを目指していた。
現在は簡単に他社のサービスを真似できるようになり、価値が均一化（コモディティ化）してきている。
ここで価格競争に巻き込まれると、大企業しか生き残ることができない。
そこで最近は、他と違う付加価値を提供し、唯一の価値を感じてもらうことが重要になってきている。


## ただ伝えるだけではない
エバンジェリストが直接伝えた人が、新たに別な人に伝えて波及効果を生ませることが重要である。
誰かに伝えたくなるように伝えられるかどうかが、エバンジェリストとしての腕の見せ所なのである。

そのためには話の内容、使う言葉、見せるスライドに気を使うのはもちろんのこと、体験を与えることが最重要だと言われている。

例えば、
SNSで見かけたパンケーキ屋さんに足を運び、フワッフワの食感に強烈な感動を覚えた場合、
おそらくそのときに撮った写真は後日、「すごくおいしかった！」というコメントとともに友人に共有されるだろう。

エバンジェリストは、この波及効果の根源を担う人。
つまりおいしそうにSNSにアップして、相手に「食べる」という体験を誘導する人なのである。

（インフルエンサーは不特定多数に向けて発信するのに対し、エバンジェリストは顧客になりうるターゲットに対して発信するという違いがあるので、厳密には違うかもしれないが、わかりやすい例として挙げた）


## 若者はエバンジェリストに向いている？
そう言われることが多いのは、
伝えるモノやサービスに対して、情熱や愛情がこもっている人が多いからだ。
その熱量は必ず受け手に伝わり、エネルギーが大きいほど相手の心を動かす。

昔は組織ピラミッドで言うところの上層部の人がエバンジェリストとして働いていたが、
最近では、上からものを言うのではなく、周りと一緒に作り上げていけるエバンジェリストが重宝されている。

エンジニアとして日々パソコンに向き合っている方の中には、伝え方なんてわからない！という人も多いだろう。
ベストな伝え方は「エバンジェリストの教科書（著・西脇資哲）」に手取り足取り書かれているので、まずは一読していただきたい。


## 迷える子羊たちへ
技術を極めるのはなんか違うし、でも勢いのあるIT業界には携わっていたい、、というよくばりな方。
エバンジェリストとして再出発するのも一つの手かもしれません。
ただ、技術を伝えるためには相手よりも豊富な知識を持つことが大前提。
お互いに勉強、がんばりましょう！
JavaScriptにおけるビルドとは

作業中に、使用しているパッケージのバージョンを更新したところ以下のようなエラーに遭遇しました。
```
ERROR ...
Module build failed (from ./node_modules/.../index.js):
Error: ENOENT: no such file or directory, open '...'
```
解決策を調べていたところ、node_modulesを削除してインストールし直したら直るということだったのですが、「そもそもnode_modules何なんだっけ」とか「ビルドって何なんだっけ」っていう風に思ったのでまとめます。

# 用語一覧
+ コンパイル
+ ビルド
+ デバッグ
+ 具体的なビルド処理とその目的
+ ビルドするためのツール（webpack,babel）
+ node_moduleとは

# コンパイル
**「ソースコード」を「オブジェクトコード」（またはバイナリコード）に変換する作業**のこと

ソースコードとは、開発者である人間の言葉で書かれたコードのこと
ソースコードのままではコンピュータは理解できないため、コンピュータが理解できる形に変換してあげる必要がある。
コンピュータが理解できるようにしてあげたコードのことをオブジェクトコード（またはバイナリコード）という。

また、コンパイルを行うソフトウェアのことを「コンパイラ」とよび、各プログラミング言語によって対応しているコンパイラがある。

# ビルド
**ソースコード上に問題がないかどうかを解析を行った上で、問題がなければオブジェクトコードに変換し、複数のオブジェクトファイルを1つにまとめて実行可能なファイルを作成する作業**のこと

複数のファイルから構成されているプログラムの場合でも、最終的には一つのファイルに集約され実行される。

「リンク」と呼ばれるオブジェクトコードに変換されたバラバラなファイルを一つの実行ファイルとしてまとめる作業
そのほかに参照される外部ファイルがある場合は、そのファイルをコピーしてまとめる作業
などなど、これら一連の作業をいう。

つまり、**コンパイルもビルドの作業の一環**ということになる。

# デブロイ
**ビルドされた実行ファイルを実行可能な環境に配置し、実行できるようにする作業**のこと
もう少しわかりやすくいうと、ビルドされたプログラムをサーバーに置いた上で、起動してアプリケーションを稼働させること


# 具体的なビルド処理とその目的
## bundle - 複数ファイルのソースを1ファイルにまとめる
開発時には機能ごとなどでファイルを分けて開発する方が開発しやすかったり、保守性の面で良いですが、ユーザが実行する時にはたくさんのjsファイルがあるとダウンロードに時間がかかりパフォーマンスが落ちてしまうので、できるだけjsファイルは一つにまとまっていた方がいい。

そこで出番なのが**bundle**処理

## transpile - 新しい規格を古い規格に変換
Javascriptは、より効率的に開発ができるように日々新しい規格（ES5、ES6、など）が生まれ、新しい文法が追加されているが、古いブラウザは新しい規格に対応していないため、新しい文法を使うと対応ブラウザが限られてしまう。

そこで出番なのが**transpile**処理

例えば、const/letを全てvarに置き換えるなど。
→じゃあ使い分ける意味は？
**linter（文法チェッカー）を使えば、transpileするより前に最新の規格に沿ってチェックを行える！**
その他にも、アロー関数、class構文、async/awaitなど

## minify - インデントやコメントなどを取り除く
開発する上で、適切なインデントやコメント、わかりやすい命名規則などは必須だが、プログラムの動作とは無関係。
そのため、ソースコードから実行上意味のないスペースや改行を取り払うことで、ファイルサイズを小さくしてパフォーマンスをあげることや悪意のある攻撃者がソースコードを読んでアプリケーションの脆弱性を見つけることを難しくしたり、知的財産であるソースコードの盗用を防ぐ。

そこで出番なのが**minify**処理

# ビルドするためのツール（webpack,babel）
以上のような処理を行うためにはwebpack,bableというツールを主に使います。

*webpack：bundleおよびminify処理をしてくれる
*babel：transpile処理をしてくれる

→**これらのツールはNode.jsのパッケージとして提供されているため、フロントエンドの開発環境をNode.jsで構築することが多い！**（なるほど！）
これらのパッケージをインストールして、設定ファイルに必要事項を記載しておくことで、コマンド一つで一連のビルド処理を行なってくれる。

[参考](https://blog.tyspine.com/why-build-javascript/)

## node_modulesとは
package.json を元にしてインストールされる各種パッケージがインストールされるディレクトリ先のこと
package.jsonがあれば```yarn install```のコマンド実行でnode_modulesが生成される。

※package.jsonとは
Node.js ベースの JavaScript アプリ開発において、自身のパッケージ（= プロジェクトそのもの）を管理するために使われるファイル
```yarn init``` とコマンド実行すると package.json が作成されます。

[参考](https://zenn.dev/ikuraikura/articles/71b917ab11ae690e3cd7#package.json)

# おまけ
パッケージ、モジュール、ライブラリの違いがよくわからん
[参考](https://zenn.dev/kenta_web_front/articles/c3641c0191ff04)
New RelicからChatworkに通知する方法

## はじめに

[New Relic Advent Calender 2022](https://qiita.com/advent-calendar/2022/newrelic) 12/15分の記事です。
New RelicからChatworkにアラートなど通知を送りたいとき、ありますよね？
そんなときはNew RelicのUIから送信先にChatworkを選んで...
って出来ればよいのですが現状はできないので、別のインテグレーションを活用していきます。
もともとのインテグレーションにない通知先に送る参考にしていただければと思います。

## 事前準備

Chatworkに外からメッセージを送る場合は以下を事前にご用意ください。

- [Chatwork - 中小企業向けビジネスチャット 国内利用者数No.1](https://go.chatwork.com/ja/)
  - [通知先のグループチャット](https://help.chatwork.com/hc/ja/articles/203354280-%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
  - [APIトークン](https://help.chatwork.com/hc/ja/articles/115000172402-API%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E7%99%BA%E8%A1%8C%E3%81%99%E3%82%8B)

## そもそも: New Relicの通知設定(Destination)

Alerts & AIの中にある、ENRICH & NOTIFYのDestinationsから設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89002/17e355f8-c316-ecba-3b51-b0f232be1dc2.png)
ここで通知先を登録しておき、Workflowsで通知設定を行う流れです。

## Chatworkに通知する方法その1: Zapierを使う

上記のインテグレーション上にはないですが、
[Zapier](https://zapier.com/apps/chatwork/integrations)というワークフローサービスを使うとお手軽です。
New Relic、Chatworkいずれも対応しているので
ポチポチ設定するだけですぐにNew RelicとChatworkをつなぐことができます。

![スクリーンショット 2022-12-14 16.49.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89002/724b047e-4a0e-1026-2b99-ddaf1fe94e69.png)

簡単にできた！と書きたかったのですがなぜかZapierとNew Relicの連携部分でエラーが出て試せず...
ただうまくいけばこれが一番お手軽かと思います。

## Chatworkに通知する方法その2: Webhookを使う

これも[Zapier](https://zapier.com/apps/chatwork/integrations)で対応可能です。
ただ、Webhookは有料版の機能になっていますのでその点だけご注意...

## Chatworkに通知する方法その3: EventBridgeを使う

通知の他にAWSサービスとの連携も行うのであれば、EventBridgeを使うのがオススメです。
EventBridgeとの接続方法についてはNew Relicさんのほうでブログにまとめてくださっています。
[AWS EventBridgeとの連携によるインシデント対応の効率化（架電編）
](https://newrelic.com/jp/blog/how-to-relic/notification-awseventbridge)

### 注意点

EventBridgeだけでも通知を行うことは可能なのですが、
POSTするデータの仕様によって簡単なものしかChatworkに送ることができないため
リッチなメッセージを送るためにはLambdaを利用して整形してあげる必要があります。
EventBridgeからChatworkに通知を送る方法および仕様の細かい話は
[Chatworkブログ](https://creators-note.chatwork.com/entry/2022/09/20/111123)をご参照ください。

## まとめ

New Relicの通知をChatworkに送る方法をお伝えしました。
Chatworkにフォーカスしましたが、インテグレーションにない通知先に送りたい場合は
上記をうまく活用していただければと思います！
とっても便利なgoleakでゴールーチンリークを見つけよう

## はじめに

どうも[ナレッジワーク](https://tenn.in/kw)の[tenntenn](https://tenn.in)です。

本記事では、テストでゴールーチンリークを検出する便利なライブラリについて紹介し、その仕組について解説します。

## ゴールーチンリークとは

ゴールーチンリークとは、ゴールーチンが終了せず、ずっと残ってしまうことを指します。ゴールーチンが終了しないと、メモリも開放されないため、メモリリークが発生します。

たとえば、次のようなコードではゴールーチンリークが発生します。

```go
package main

import (
	"fmt"
	"runtime"
)

func f() {
	ch := make(chan int)
	go func() {
		for x := range ch {
			fmt.Println(x)
		}
	}()
	ch <- 10
	ch <- 20
}

func main() {
	fmt.Println(runtime.NumGoroutine()) // 1
	f()
	fmt.Println(runtime.NumGoroutine()) // 2
}
```
[The Go Playgroundで動かす](https://go.dev/play/p/7DDD7XBr_fk)

関数`f`を呼び出す前とあとでは、`runtime.NumGoroutine`関数が返すゴールーチン数が変わります。関数`f`内で作成したゴールーチンがリークを起こしていることが分かります。
ゴールーチンリークを解消するには、チャネル`ch`をクローズして、ゴールーチン内の`for range`文を止めて関数を抜け出す必要があります。

メモリ消費量やゴールーチン数を監視していると、ともに増加していっている場合はリークが起きている可能性があります。監視でリークが見つかった場合は、該当箇所を探すのはなかなか難しいでしょう。対処療法的にインスタンスの再起動を行うこともあるでしょうが、根本解決にはなりません。

## goleakを試す

Uber社がOSSとして公開している[goleak](https://go.uber.org/goleak)を利用すると簡単にゴールーチンリークを見つけることができます。

たとえば、先ほどのコードのリークを見つけるには、次のようにテスト関数の先頭に`defer goleak.VerifyNone(t)`を差し込むだけで検出できます。

```go
func Test(t *testing.T) {
	defer goleak.VerifyNone(t)
	f()
}
```
[The Go Playgroundで動かす](https://go.dev/play/p/Z-TKrnbLJCp)

The Go Playgroundで実行すると次のように検出されます。

```
=== RUN   Test
10
20
    prog.go:24: found unexpected goroutines:
        [Goroutine 7 in state chan receive, with main.f.func1 on top of the stack:
        goroutine 7 [chan receive]:
        main.f.func1()
        	/tmp/sandbox2670982869/prog.go:13 +0x7c
        created by main.f
        	/tmp/sandbox2670982869/prog.go:12 +0x6a
        ]
--- FAIL: Test (0.43s)
FAIL

Program exited.
```

複数のテストでチェックしたい場合は次のように`TestMain`関数で`goleak.VerifyTestMain(m)`を実行するとすべてのテストで実行されます。

```go
func TestMain(m *testing.M) {
	goleak.VerifyTestMain(m)
}

func Test(t *testing.T) {
	f()
}
```

`TestMain`関数がThe Go Playgroundでは動きませんが、ローカルで動かすと次のようになります。

```
$ go test
10
20
PASS
goleak: Errors on successful test run: found unexpected goroutines:
[Goroutine 19 in state chan receive, with goleak-sample.f.func1 on top of the stack:
goroutine 19 [chan receive]:
goleak-sample.f.func1()
	/Users/tenntenn/repos/tenntenn/scrap/goleak-sample/a_test.go:13 +0x78
created by goleak-sample.f
	/Users/tenntenn/repos/tenntenn/scrap/goleak-sample/a_test.go:12 +0x70
]
exit status 1
FAIL	goleak-sample	1.263s
```

goleakを使いたくない場合がある場合は、次のようにフラグによって制御できるようにすると良いでしょう。

```go
var leak bool
func init() {
    flag.BoolVar(&leak, "leak", false, "use goleak")
}
func TestMain(m *testing.M) {
    if leak { goleak.VerifyTestMain(m) }
    os.Exit(m.Run())
}
```

## おわりに

goleakはとても便利にゴールーチンリークを見つけることができるライブラリです。
しくみもとてもシンプルで、ゴールーチンのカウントなどは行わずに、スタックトレースをパースして行っています。
そのため、パフォーマンスに与える影響も軽微ではないかと推測できます。
Elixirでプログラミングを学ぼう 中学１年生 編 vol1

# Elixirでプログラミングを学ぼう 中学１年生 編 vol1
## ~ LiveBookをインストールして簡単にプログラミングを始めよう。~

この記事は「[Elixir Advent Calendar 2022 カレンダー14](https://qiita.com/advent-calendar/2022/elixir)」21日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

長女が4歳の時に思えばプログラミングを体験して学べるロボットを作ってた時代がありました。その長女も今や中学１年生。と言う事で中１から始めるプログラミングElixirを趣味で書いていこうと思います。
せっかくなので、このシリーズは、中学生から始めるプログラミングということで数学や英語や技術とプログラミングを一緒に学べるコンテンツを目指して執筆しようという意気込みだけのチャレンジシリーズです。途中挫折するかも知れませんw
ほぼ娘に向けたコラムに近い内容になるかもですw

## PCと始めて触れ合う貴方へのアドバイス
簡単な心構えを記載しておきます。

### スマホとPCは似てるから慣れよう。
皆さんが手にしたパソコンを使って色んなことをしたいですが、まずはPCと仲良くなりましょう。
と言うことで、既に皆さんが使ったことがあるであろう、スマートフォンやタブレットと比較してPCの基礎をお伝えします。

スマートフォンでは、色んなアプリを入れることでそのアプリに応じた事ができるようになります。パソコンでもスマートフォンと同じようにアプリケーション入れる事で色んなことができるようになります。

アプリと呼んでいるものは他にも様々な呼び方で語られることがあります。アプリケーション、ソフトウェアなどです。

### PCは結構脆いけど気にしないで
それからパソコンは万能ではありません。なんだかよくわからないけど、何もしてないのでなんか動かなくなっちゃった？とか起こります。怖がる必要はありません。近くに詳しい人いたら聞いてみてください。もし、近くに聞ける人がいなくて途方にくれるようなことがあれば、そんな時は、再起動してみてください。

徐々に慣れてくれば、それぞれに応じた対処方法がなんとなく思い浮かぶようになります。まずは慣れましょう。

### 英語と向き合おう
次に、英語に慣れましょう。英語は怖くありません。翻訳してくれるツールも多いです。英語が出てきたら何？わからない。と最初から突き放さす、歩み寄りましょう。
英語が出てきたら、とりあえず翻訳してみましょう。翻訳しても意味わからなかったら、単語と日本語で調べてみましょう。そんな難しい事言ってないことがほとんどです。

### 国語と数学を楽しもう。
プログラミングは言語です。読解力や文章力はとても役立ちます。数学は考え方の学問とも言えます。計算するためのツールというよりは数字に意味を持たせて扱うことの方が断然楽しいです。

## さぁ、プログラミングの学習を始めていきましょう！
準備はいいですか？プログラミングだけでなく、国語や数学、英語、時には歴史や技術的な内容も織り交ぜながら学習していきましょう。

## まずはアプリをインストールしよう。
中学１年生でパソコン（Windows または macOS）を手に入れたら次のソフトをインストールしましょう。

https://livebook.dev/

早速、英語のサイトですが臆することはありません。翻訳して読めばいいです。そのうち翻訳するのが面倒になって英語のまま読もうかな？と思ったら単語を少しづつ理解すればいいです。

![スクリーンショット 2022-12-13 23.59.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/74a5a63a-ff99-bbd8-3245-b8fe862714b2.png)

何やら英語で色々書かれてますが、別に難しいことはありません。
ご利用のパソコンがMacの場合は Macと書かれたボタンからソフトをダウンロードしてインストールしてください。

Windowsの場合はWindowsと書かれたボタンからソフトをダウンロードしてインストールしてください。

![スクリーンショット 2022-12-14 0.06.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/31015bfb-5bcf-06c1-f9cd-421b59480dd7.png)

インストールが終わったら早速アプリを起動してみましょう。アイコンをダブルクリック（要するにマウスの左側をカチカチっと２回す早くおすだけです）してください。

次のような画面が立ち上がれば成功です。

![スクリーンショット 2022-12-14 14.52.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/c63bbef6-9f26-f969-2b70-c1f6d41f2985.png)

早速、右上の青いボタンの ```New notebook``` をクリックしてみてください。
以下のような画面が表示されていればOKです。

![スクリーンショット 2022-12-14 14.55.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/5f1c6023-21c1-8d32-2947-71a20c37082f.png)

早速、プログラムを書いて動かすのを試してみましょう。
1と書かれている部分にマウスを乗せると、```Evaluate```と書かれたボタンらしきものが出てきます。

![スクリーンショット 2022-12-14 16.37.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/5644856c-f9b2-b91d-f504-56047c6efc5e.png)

次に、1と書かれている部分に 次のプログラム```IO.puts("Hello Wolrd")```を書いて ```Evaluate```と書かれているボタンをクリックしてください。
次のような画面になれば成功です。


![スクリーンショット 2022-12-14 15.02.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/2877fb8b-34dc-f912-ab03-f896df7ae331.png)

次回は、このアプリを使って、中学１年で学ぶ、負の数と正の数について理解を深めていきましょう。
JSONファイルの要素を反復処理で取り出す。

Google Booksでの検索結果の上位１０件をJSONファイルで取得してそのタイトルだけを反復処理でconsole上に表示させるコードを書く。

```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script>

    $.getJSON(
        "https://www.googleapis.com/books/v1/volumes?q=jquery",
        function(data){

            for (let i=0; i < data.items.length; i++){
                console.dir(data.items[i].volumeInfo.title);
            }
            
        }
    );
</script>
</body>
</html>
```

最初のscriptタグでjqueryを呼び出して、その後getJSONでJSONファイルを第一引数に指定したURLから取得する。
その後、for文を回して、JSONファイル内のtitleを取得している。

取得したい情報がわからない場合は、最初はobject自体をlogに表示させて、段々小さい塊を表示できるように試せば良い。

反復処理は以下のサイトを参考にした。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Loops_and_iteration

また、Jqueryの取得したサイトは、

https://developers.google.com/speed/libraries#jquery

これである。
【Linux】ユーザーにsudo権限を付与する

一般ユーザ（今回はdevelop）でsudoコマンドを実行しようとしたら以下のように怒られました。
```
develop@XXX:XXX$ sudo xxxx
[sudo] password for develop:
develop is not in the sudoers file.  This incident will be reported.
```
#### root権限で、developにsudoの権限を付与
```
root@XXX:XXX# sudo usermod -aG sudo develop
```
**コマンド**
usermod：ユーザーのホームディレクトリやグループ、パスワードなどを変更するためのコマンド。実行には「rootユーザー（スーパーユーザー）」の権限が必要。

**オプション**
-a :「-G」オプションで指定したグループをセカンダリーグループに追加する
-G :セカンダリーグループを変更する（複数ある場合は「,」で区切って指定）。変更ではなく追加したい場合は「-a」オプションを同時に指定する

#### 確認
```
root@DESKTOP-AMENJF4:~# groups develop
develop : develop sudo
```
セカンダリーグループにsudoが追加されている。

#### 再試行
再起動したあと、developでsudoコマンドを使用できるようになりました。

参考：

https://www-creators.com/archives/241

https://atmarkit.itmedia.co.jp/ait/articles/1612/14/news022.html
EC2にPostgreSQLクライアントツール（psql）をインストールする

# 環境
AmazonLinux2 に ec2-user でアクセス
# インストール
以下のコマンドを入力
```
$ sudo yum install postgresql.x86_64 -y
```
# 使ってみる
```
psql -h DBホスト -U DBユーザー名 -d DB名
```
【8日目】discord.jsでマイクラサーバーのステータスを表示する

# はじめに
こんにちは、なりかくんと申します。
今回は、マイクラサーバーのステータスを取得して表示するDiscord Botをdiscord.jsで作ろうと思います。

# ステータスの取得方法
まず最初にマイクラサーバーのステータスを取得する方法です。取得するには、APIを使うことが一番簡単です。
[Minecraft Server Status API](https://api.mcsrvstat.us/)というのを有志の方が作成されており、これを使うと非常に簡単に取得が出来ます。

https://api.mcsrvstat.us/

リクエストURLは、以下のようになります。
| エディション | URL |
|:-:|:-:|
| Java版  | https://api.mcsrvstat.us/2/<address>  |
| 統合版 | https://api.mcsrvstat.us/bedrock/2/<address>  |

これらを踏まえて、Java版で取得する関数を作るとこのようなコードになりました。
```js
function getServerStatus(ipAddress) {
    return new Promise((resolve, reject) => {
        request({
            url: "https://api.mcsrvstat.us/2/"+encodeURIComponent(ipAddress),
            json: true
        }, function (error, response, body) {
            if (error) {
                reject(error);
            } else {
                resolve(body);
            }
        });
    });
}
```

# スラッシュコマンドでオプションをつける
では、今回からスラッシュコマンドでオプションを扱っていこうと思います。`SlashCommandBuilder`で以下のようにすれば文字列を入力させることが出来ます。非常に簡単でオプションは増やすことが出来るので出来ることは非常に増えます。
```js
new SlashCommandBuilder()
    .setName('mcserver')
    .setDescription('マイクラサーバーの状態を表示します')
    .addStringOption(option =>
        option.setName('ip')
            .setDescription('サーバーアドレスを指定')
            .setRequired(true))
```

# コード全体
これらを踏まえて今回作ったコードは、以下のようなコードです。
サーバーがオンラインであれば、オンラインであり人数を表示してオフラインであればオフラインと出力するプログラムです。
```js:mcserver.js
const { SlashCommandBuilder } = require('discord.js');
const request = require("request");

module.exports = {
	data: new SlashCommandBuilder()
		.setName('mcserver')
		.setDescription('マイクラサーバーの状態を表示します')
		.addStringOption(option =>
			option.setName('ip')
				.setDescription('サーバーアドレスを指定')
				.setRequired(true)),
	async execute(interaction) {
		let getResult = await getServerStatus(interaction.options.getString("ip"));
		if (getResult.online) {
			await interaction.reply({ content: `このサーバーはオンラインで、${getResult.players.online}人がオンラインです。` });
		} else {
			await interaction.reply({ content: "このサーバーはオフラインです。" });
		}
		function getServerStatus(ipAddress) {
			return new Promise((resolve, reject) => {
				request({
					url: "https://api.mcsrvstat.us/2/"+encodeURIComponent(ipAddress),
					json: true
				}, function (error, response, body) {
					if (error) {
						reject(error);
					} else {
						resolve(body);
					}
				});
			});
		}
	},
};
```
まあ、APIを活用しているので非常にシンプルなコードで作ることが出来ます。このコードを実際に動かしてみると、オンラインの場合はしっかり人数が表示され、オフラインの場合はオフラインと表示されるように出来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549951/e7c7c491-13d7-1691-419b-72326be30051.png)

以上です、最後までお読みいただきありがとうございました。
Eth Indiaの振り返り(前編)

本記事では今回参加してきたEth India、またその他サイドイベントでの所感等をまとめたいと思います。Eth Indiaが開催される期間中は、India blockchain weekでもあり様々なサイドイベントが開催されていました。そのため私は現地の環境に馴れるため・サイドイベントに参加し人脈を広げるためハッカソンの2日前に現地に到着する計画で行きました。まずはそのサイドイベントの様子を前編として記事にします。

11/30
[Zero to Dapp confarence](https://lu.ma/zerotodappconf) に参加。The graphやPush protocolが共催していたイベント。
肝心のカンファレンスですが、他のカンファレンス同様イベント本体はそっちのけでネットワーキングにほとんどの時間を費やしました。devや起業家が多かったですが、他にもcrypto インフルエンサーや弁護士もいたのが印象的でした。![Something went wrong]()



12/1
[Polygon connect](https://www.youtube.com/watch?v=9l3ywfauhbM)に参加。その名の通りPolygonのミートアップです。人数も総計で数百人くらいいたんじゃないでしょうか。この日も基本的にネットワーキングしてました。友人である日本から来てるfounderと少し話したり、チームメイトの一部と顔を合わせたりもできました。イベントに参加してる層とはcoreなdevからweb3に興味がある人や学生、と言ったライトな層まで様々でした。ただPolygonはインド発なこともあってとにかく熱量がすごかったです。その後現地で知り合ったインド人とアフターパーティに少しだけ顔を出してこの日は帰りました。

~余談~
今回学んだイベントネットワーキングのtipsと収穫

- 申込をしていない、もしくはwaitlistに載っているイベントでもなんとかすれば参加できる。
そもそもセキュリティがそんなに厳重でなかったり、現地の人と仲良くなると招待してくれるのでどうしても行きたいイベントがある場合はまず行ってみるorさりげなく聞いてgetするのもありだと思います笑　私も今回それでいくつか参加しました。

- ネットワーキングのやり方
正解ではわからないので自分は今回こうやったを書きます。まずネットワーキングの成否は確率で決まります。相手の顔をみただけで自分が求めている人物かどうか、がわかればいいのですがそうはいかないので自分が求めてる相手と出会うまで話しかけ続けられるか、自分の手札は変えられないのでここは気合と根性です笑 具体的にはまず相手と目を合わせ、目があったら歩みよって握手です。そして名前を名乗ります。
あとはお互い何やってるか？を話し、少し話したあとSNSの交換。そして最後には写真を撮りましょう。イベント期間中多くの人とあってるから忘れないように〜といえば相手も快く応じてくれました。これが一連の流れですね。

- 収穫

①優秀な人材との出会い
実際に一名devがteamにjoinする予定ですし、彼以外にも何人もの潜在的な候補者に出会える機会になりました。

②Founderやdevとの会話を通じたキャッチアップ
熱量を持った会話を通して、web3のどんなところに魅力を感じているとかを知れました。

後編に続きます。
#クリスマスなので、勉強会運営委員会の1年を振り返る 2022

この記事は アイスタイル [Advent Calendar 2022](https://qiita.com/advent-calendar/2022/istyle) 24日目の記事です。

# 💭 ごあいさつ
皆さん、こんにちは。そして、メリークリスマス！🎄
良い勉強会日和ですね。

[昨年度同様](https://techblog.istyle.co.jp/archives/9360)、クリスマスイブのアドベントカレンダーは私たち勉強会運営委員会が筆をとらせていただきました。

今年も委員会メンバーが集結し（リモート含む）、今年の活動内容や来年に向けての座談会を行いましたのでレポートを皆様に公開しようと思います。
今回の記事で弊社および当委員会に興味をもっていただけたら幸いです🍰

## 勉強会委員会とは
勉強会運営委員会とは、2021年から本格的に始動したアイスタイル内で様々な勉強会を企画・運営し、最終的にはアイスタイルのエンジニアの市場価値を上げまくろうという組織です。

### 委員会制度
アイスタイルでは組織を良くしたり開発環境を良くしたりするための施策を検討する委員会が複数存在しており、社員なら誰でも入ることが出来ます。

# 🎄 2022年のふりかえり（本題）
では早速今年の活動を振り返っての座談会をレポート形式でお送りします。
## 📅 今年の活動一覧
### ① 勉強会をコンスタントに開催
リモートになって以降、勉強会の開催機会が少ない…という課題が長らく続いていました。勉強会を開催する心理的・物理的ハードルが高いのではないか？という考察の元、委員会主導でコンスタントに勉強会を開催することでハードルを下げてみようと試みました。

#### 実施した勉強会
- ECSハンズオン
- JavaScript/TypeScript知識共有会
- PMBOK勉強会
- Docker基礎勉強会
- Nuxt.js基礎勉強会
- Aurora Serverless V2輪動画会
- ....

> ※輪動画会　... 勉強会やカンファレンスでの発表動画をライブビューイング的に見ながらフランクに議論する会です。輪読会を文字って我々は「輪動画会」と呼んでいます。

### ② LT会
上記の勉強会以外にもアウトプットの場を増やす目的でLT会を主催したり、あるいは開発チームからLT会の補助を依頼され開催のお手伝いを行いました。今年開催したLT会は以下になります。
- 広告フィード開発チームLT
- インフラLT
- 失敗談LT

上から2番目まではアイスタイルが運営するサービス「[@cosme](http://www.cosme.net/)」の広告フィード開発を担当しているチームの方々や、アイスタイルのサービス全体を支えてくださっているインフラチームの方々が開発中での学びや出来事を発表してくれたLT会でした。
「AWS構成図を考えた話」や「オンプレミス供養の話」といった魅力的なテーマがたくさん集まり、とても好評な会となりました。
また、最後の「失敗談LT」は技術だけにとらわれず今までの経験をライトに話すことで本人にとって供養になったり、若手をはじめとした幅広い層にとっては興味深い経験を聞くことが出来た会でした。


### ③ パフォーマンスチューニング会
某チューニングバトルの問題を参考にしながら「どういう問題があり」「どういう解決方法があるか」をハンズオン形式で取り組む会を実施しました。
ただ問題と解決方法を見て聞くだけではなく、AWS EC2で参加者ごとのインスタンスを立てることで、手を動かしながら数値が改善していくことを体験してもらうことが出来た会となりました。

## 🤔 活動の振り返り＆考察
特にインフラLTの評判が良く、次につなげるためにも委員会内にて考察を行いました。
弊社では毎月各開発部署よりサービスや技術共有をする場があるのですが、これが１部署5分程度という短めの尺であるため、インフラチームから発表された内容をより深く聞いてみたい！という声が多く寄せられ、結果インフラLT開催に繋がりました。
このことより、「あらすじ」のように内容を掴んでもらってから長尺の勉強会やLTを開催すると沢山の人が参加してくれるのではないか？という考察を立てました。来年はこの考察をもとに勉強会を開催出来たら、と思っています。

### 勉強会を開催する時間について
これまで勉強会は業後19時前後で開催をしているのですが、弊社はフレックスタイム制を採用しており、リモートワークになって以降、より一層人によってパソコンの前にいる時間が異なるようになりました。昨年度は業務前にもくもく会を予定してみたりしましたが、こちらもあまり人が集まらないという課題がありました。今年は試しにお昼開催してみたところ、業務前/業後の勉強会では見かけなかった方が増えたことから、今後はお昼開催にしても良いのでは？という意見が出ています。

### 課題と改善点について
パフォーマンスチューニング会は参加者ひとりひとりに環境を用意して実際に触ってもらいたい、という思いのもと環境構築の準備を行ったのですが、準備にかけたコストの割に参加者が集まらず委員会メンバーに疲弊感がでてしまいました。チューニング会をやる意義は間違いなくあったと思っているのですが、費用対効果が出てたかというと難しいところです。来年は委員会メンバーのモチベやコスパを維持した動きをしたいと思います。


### 去年と比べて
去年のまとめとして「AWSへの注力は継続しつつ、速度改善など、エンジニアが興味がありそうな領域の勉強会を実施していきます」というものを挙げました。AWSは現在どのプロジェクトでも採用されており、興味関心が高い状態を今年も維持しています。勉強会の実施についても上記記載の通りで無事達成することができました😊

## 🎍 来年やりたいこと
- ただ話す・聞くだけではなく、参加者みんながワイワイガヤガヤ出来る勉強会
- バーチャル勉強会！
これらをやってみたいと思っています！

## 👋 最後に
いかがでしたでしょうか。まだまだ課題はあるもののそれに対してやりたいこともまだまだあるという2022年でした。来年も引き続き元気よく活動していく所存です。

お読みいただきありがとうございました。
Rでopenxlsxを使ってエクセルファイルを読み込む際の注意点

# はじめに
Rにopenxlsxのパッケージを読み込み、loadworkbookでエクセルファイルを読み込むと下記のようなエラーメッセージが表示され、読み込めないことがあったので、当方の環境でこのエラーを解消した方法になります。
```
Error in substring(x[ind], so, eo) : 
  invalid multibyte string at '<83><e3><82>ｯ"/>'
```
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552414/8525492f-e739-f794-c3b1-6f704d7c3d0e.png)

## 環境
R 4.1.2
openxlsx 4.2.5.1
Excel2016

## 取り込みたいエクセルファイル
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552414/65500c31-e3e0-c9ad-dad0-367d3878b091.png)

# 対処
## エクセルファイルのテーマを変更する
- 取り込みたいエクセルファイルを開き、`ページ レイアウト`-`フォント`-`フォントのカスタマイズ`の順にクリックする。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552414/1440d331-6f90-64ef-0e6f-aff456c33077.png)

- `日本語文字用のフォント`の`見出しのフォント(日本語)`と`本文のフォント(日本語)`に「**Yu Gothic**」と入力し、`保存`をクリックする。
<font color=red>（プルダウンから選択することはできないので、「**Yu Gothic**」と入力すること！！）</font>
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552414/5fa32300-b69e-65f3-08d3-0907654de9af.png)

- エクセルファイル自体を保存する。
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552414/ab6971c0-739f-960d-afdc-336cd80b3b5d.png)

# 修正したエクセルファイルをもう一度取り込みなおす
- エラー無く取り込める！！
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552414/fd9edf47-324a-4f8b-9546-c94d8a397947.png)

# 最後に
Excel2016以降では、エクセルのデフォルトテーマのフォントに「游ゴシック」が採用されています。
そのため、何も気にせずExcel2016以降で作成されたエクセルファイルのテーマが「游ゴシック」になっており、そのファイルをopenxlsxで読み込むと「游」の文字コードが対応していないためにエラーとなってしまうようでした。

私自身フォントにあまり詳しいわけではないので、以下想像になります。
各種Office製品や、その他エディタ等のフォントを指定する際、フォント名は日本語である必要がありません。
そもそもOfficeは日本だけで使用するものではないので、当たり前といえば当たり前かと思いますが・・・。
実際にExcelに限らず、Wordであってもフォントを選ぶ際に日本語を使った「MS ゴシック」等を必ずしも選ぶ必要はないということです。
「MS ゴシック」の場合、PC内部では「MS Gothic」としても認識されます。
今回の「游ゴシック」も「Yu Gothic」と日本語でないフォント名で指定すれば良いということでした。

とはいえ、なんでMicrosoft製品のデフォルトフォントは「游ゴシック」になってしまったんですかね・・・。
フォント自体はべつにダメとは言いませんが、「游」なんて特殊な漢字使わなけりゃいいのに・・・。
python pip をコマンドプロンプトでアップグレードする。

※自分用の備忘録です。
※OSwindows11でやりました。MacOSの場合はコマンド違います。

・シェルスクリプトやコマンドプロンプト(cmd)でPythonコードをぽちぽちしてたら画像のお知らせが出た。
![1_warning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989326/fb1c5ff1-9b87-6b6d-ca02-f9f8a9ed2477.png)
「おい、お前の使ってるPipのバージョン古いぞ。新しいの使えるぞ。アップグレードするときは、階層「C:\Users\hebo_miya\Appdata\Local\Programs\Python\Python310\python.exe」を経由して「-m pip install --upgrade pip」コマンドを実行してくれよな」と言っているようです。（相変わらず英語がわからん


・「階層を経由しろ」といってるのでまずはそこまで移動しようと思います。（今いるのは「C:\Users\hebo_miya」なのでもっと深く潜らないとダメみたいです。）
なので「cd Appdata\Local\Programs\Python\Python310」を入力して深い階層まで潜ります。
![2_cd_python310.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989326/36fd5256-bf57-918d-eb37-88316dbd7ee3.png)
詳しくは「cd コマンド　Linux カレントディレクトリ」とかで検索すると、コマンド一覧が出ます。

・深くもぐったところで「-m pip install --upgrade pip」コマンドを実行。
すると画像のようなお知らせと共に実行されてSuccessfully完了やったね。
![3_upgrade_pip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989326/a77e212e-b5e0-b6d7-b307-1b42ef0c53cc.png)
英語の意味は
「準備できたよ。
ピップを集める。キャッシュされた pip-22.3.1-py3-none-any.whl の使用 (2.1 MB)
収集したパッケージのインストール: pip
  アンインストールしようとしています:ピップ
    既存のインストールが見つかりました:pip 22.0.4
    pip-22.0.4のアンインストール:
      pip-22.0.4が正常にアンインストールされました
pip-22.3.1が正常にインストールされました」
古いやつを消して、新しいやつを入れたみたい。
ノートブックからのDelta Live Tablesパイプラインのオープンおよび実行

小技的な話ですが。

https://docs.databricks.com/notebooks/notebooks-dlt-pipeline.html

上のマニュアルにあるように、Delta Live Tablesのパイプラインに割り当てられたノートブックを開くと、パイプラインのアップデートや削除を行うことができるメニューがノートブックのツールバーに表示されます。
![Screen Shot 2022-12-14 at 16.01.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c99c89cc-54f9-5c5b-e396-e2226e56b2d3.png)


- パイプラインの詳細をオープンするには、**Delta Liveテーブル**をクリックして、パイプライン名をクリックするか![](https://docs.databricks.com/_images/jobs-vertical-ellipsis.png)をクリックしてから**パイプラインで表示**を選択します。
![Screen Shot 2022-12-14 at 16.01.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/abb5c0b6-6612-117c-cd09-baa4cbb332bf.png)
![Screen Shot 2022-12-14 at 16.02.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/867bacc1-0afc-c779-6dce-ba7e05c1bc01.png)

    パイプラインが表示されます。
![Screen Shot 2022-12-14 at 16.01.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c4059c1a-964a-b53c-35c1-926006431563.png)

- パイプラインのアップデートをスタートするには、パイプライン名の隣の**起動**をクリックします。
- ノートブックが割り当てられているパイプラインを削除するには、![](https://docs.databricks.com/_images/jobs-vertical-ellipsis.png)をクリックしてから**削除**を選択します。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
[ECR] 他のAWSアカウントからImage Pullする方法

## What's This

ECRを構築したAWSアカウントではない、他のAWSアカウントからリポジトリを使用する機会があったので、まとめました。簡易なメモです。
ドキュメント通り。

## 前提

>重要
Amazon ECR では、ユーザーがレジストリへの認証を行って、Amazon ECR リポジトリに対するイメージのプッシュまたはプルを行う前に、IAM ポリシーを介して ecr:GetAuthorizationToken API への呼び出しを行う許可が必要です。Amazon ECR には、さまざまなレベルでユーザーアクセスを制御するいくつかのマネージド IAM ポリシーが用意されています。詳細については、「Amazon Elastic Container Registry のアイデンティティベースのポリシーの例」を参照してください。
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/set-repository-policy.html

IAM ポリシーを介して `ecr:GetAuthorizationToken` を許可しています。
自分の場合だと、EKSでPodを立ち上げたい（ECRからPulllして）ので、 eks node groupのIAMロールに`AmazonEC2ContainerRegistryReadOnly`を追加しています。

## How to do

![スクリーンショット 2022-12-14 12.20.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/f77c2bff-b37c-a643-73e0-552f0f33688e.png)

![スクリーンショット 2022-12-14 12.21.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/572c8bb3-66aa-90c6-cd53-7e0cf8e8a6d0.png)

アカウントIDを入力。

![スクリーンショット 2022-12-14 12.22.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/76235778-0ea5-6245-679d-c6527d4ea811.png)

許可するアクションを選択。

![スクリーンショット 2022-12-14 13.10.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/44fc0925-c8de-dbac-fb72-0cce140af640.png)



## Reference

・社内有識者
・https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/set-repository-policy.html
マルチスケール名簿22f



# qiita\_org setup

    qiita template
    qiita config global
    pushd ~/.emacs.d/
    emacs init.el
    mkdir site_lisp
    emacs ox-qmd.el
    mv ~/.emacs.d/ox-qmd.el ~/.emacs.d/site_lisp/
    emacs README.org


# expense\_tracker

apiテストの場所がおかしい．正しくは，spec/acceptance/expense\_tracker\_api\_spec.rb


# name list

| name             | github id         | shell            | editor                   | github  |
|:-----------------|:------------------|:-----------------|:-------------------------|--------:|
| 西谷滋人         | daddygongon       | 1(fish), 4(Ruby) | 3(emacs), 1(code), 0(vi) | 3       |
| 星野 壮哉        | Souyasan          | 1(fish), 1(Ruby) | 1(emacs), 1(code)        | 1       |

1.  none
2.  beginner
3.  intermediate
4.  advanced
5.  professinal
6.  master


# editor

-   設定可能であること。
-   拡張性があること。
-   プログラム可能であること。


# plain text

-   透明性が保証される
-   さまざまな活用ができる
-   テストが容易になる


# shell

-   シェルプロンプトはすべてのツールを起動可能
-   アプリケーション、デバッガ、ブラウザ、エディタ、ユーリィティを起動可能
-   システムの状態に応じてファイルの検索を行い、それをファイル経由で出力することが可能



------
 - **source** ~/multi_scale_22/members/Souyasan/README.org
M1macにてpuppeteerのchromiumエラーが出る

### 備忘
M1macにて`yarn upgrade`を行おうとしたらエラーが発生した。

エラー内容
```sh
error /Users/XXXXX/node_modules/puppeteer: Command failed.
Exit code: 1
Command: node install.js
Arguments: 
Directory: /Users/XXXXX/node_modules/puppeteer
Output:
The chromium binary is not available for arm64: 
If you are on Ubuntu, you can install with: 

 apt-get install chromium-browser

/Users/XXXXX/node_modules/puppeteer/lib/BrowserFetcher.js:112
            throw new Error();
```

### 対策
chromiumをインストールする
```sh
$ brew install chromium
```
.zprofileに以下の内容を記載する

```sh
export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
export PUPPETEER_EXECUTABLE_PATH=`which chromium`
```
リロード
```sh
$ source ~/.zprofile
```
【RUBY】可変長引数とオプション引数について

# はじめに
プログラミング初学者の者です。オンラインでプログラミングを学習させて頂いてるのですが、さらに理解を深めていきたいと思い、学習したことを備忘録として、残して理解を深めていきたいと思います。
また、間違った点など、ありましたら、ご指摘いただけると幸いです。よろしくお願いします。

# 可変長引数
個数に制限を設けていない引数のことで、その引数は配列として認識されることとなります。配列ですから、いくつあってもいいってことになります。

使い方は引数の前に＊をつけるだけです。
```ruby
class Train
  def gse(*numbers)
    puts "今日の特急は#{numbers.join}です。"
  end
end
```
```ruby
train = Train.new
train.gse("1号","2号","3号","4号")

#=> 今日の特急は1号2号3号4号です。
```
Trainクラスにgesメソッドを定義しています。gesメソッドには可変長引数として*numbersが書いてあります。
trainインスタンスを生成し、gesメソッドで引数と一緒に呼び出しています。
この時、引数が（”1号”,”2号”,”3号”,”4号”）と4つあります。こちらの引数は何個あっても構いません。
実行すると、今日の特急は1号2号3号4号です。
と表示されます。
これが可変長引数の使い方となります。

参考までにコードにあるjoinメソッドは配列を1つの文字列として認識するメソッドです。

# オプション引数
１つの引数で複数の値をハッシュで受け取ることができます。
```ruby
def price(**1)
  p i # {item1: 100, item2: 200}
end

price(item1: 100,item2: 200)
```
引数の前に**と二つにするとオプション引数になります。
個人的な初知りな便利文字列操作系へルパ

## 概要

Laravelが用意してくれている便利な文字列操作系ヘルパの中で、使えそうなのをピックアップ


## Str::limit()

Str::limitメソッドは、指定文字列を指定する長さへ切り捨てます。

```php
use Illuminate\Support\Str;

$truncated = Str::limit('The quick brown fox jumps over the lazy dog', 20);

// The quick brown fox...
```


メソッドに３番目の引数を渡し、切り捨てる文字列の末尾へ追加する文字列を変更できます。

```php
use Illuminate\Support\Str;

$truncated = Str::limit('The quick brown fox jumps over the lazy dog', 20, ' (...)');

// The quick brown fox (...)
```

https://readouble.com/laravel/8.x/ja/helpers.html#method-str-limit

## Str::mask()
Str::maskメソッドは、文字列の一部を繰り返し文字でマスクし、メールアドレスや電話番号などの文字列の一部を難読化するために使用します。

```php
use Illuminate\Support\Str;

$string = Str::mask('taylor@example.com', '*', 3);

// tay***************
```

必要であれば、maskメソッドの第３引数に負の数を指定し、文字列の最後から指定する文字数分戻った箇所からマスキングを開始するように指示できます。

```php
$string = Str::mask('taylor@example.com', '*', -15, 3);

// tay***@example.com

```

https://readouble.com/laravel/8.x/ja/helpers.html#method-str-mask


## Str::orderedUuid()

Str::orderedUuidメソッドは、インデックス付きデータベース列に効率的に格納できる「タイムスタンプファースト」UUIDを生成します。このメソッドを使用して生成した各UUIDは、以前にこのメソッドを使用して生成されたUUIDの後にソートされます。

```php
use Illuminate\Support\Str;

return (string) Str::orderedUuid();

```

https://readouble.com/laravel/8.x/ja/helpers.html#method-str-ordered-uuid


## Str::uuid()
Str::uuidメソッドは、UUID（バージョン４）を生成します。

```php
use Illuminate\Support\Str;

return (string) Str::uuid();
```



## Str::replace()

Str::replaceメソッドは、文字列内の指定した文字列を置き換えます。

```php
use Illuminate\Support\Str;

$string = 'Laravel 8.x';

$replaced = Str::replace('8.x', '9.x', $string);

// Laravel 9.x

```

https://readouble.com/laravel/8.x/ja/helpers.html#method-str-replace

## Str::replaceArray()

Str::replaceArrayメソッドは配列を使い、文字列を指定値へ順番に置き換えます。

```php
use Illuminate\Support\Str;

$string = 'The event will take place between ? and ?';

$replaced = Str::replaceArray('?', ['8:30', '9:00'], $string);

// The event will take place between 8:30 and 9:00

```

https://readouble.com/laravel/8.x/ja/helpers.html#method-str-replace-array
prettierの"singleQuote": trueが効かなかった時の話

## はじめに
Reactを使った開発中、prettierでフォーマット自動整形を行ったところ、
`"singleQuote": true`が機能しなかった

```javascript:prettierrc.js
module.exports = {
  semi: true,
  trailingComma: 'all',
  singleQuote: true,
  printWidth: 120,
  tabWidth: 2,
};
```

## 結論
以下記事を参考に`bracketSpacing: true`を追加したら解決した

https://github.com/prettier/prettier-vscode/issues/1060
asciidoctor.jsでJavaScriptからasciidocファイルを変換する方法

AsciiDocは、Markdownに似ている軽量マークアップ言語です。比較的マイナーですがGitHubでのプレビューに対応しています。

Markdownはドキュメント記述言語としては仕様が貧弱なため、簡潔に書くのが難しいものや、環境毎に異なる方言を使わなければならない事が多いです。
ただ、AsciiDocはそれなりに多機能な仕様が公式でしっかり定義されているので取り扱いやすい言語だと言えます。
https://docs.asciidoctor.org/asciidoc/latest/syntax-quick-reference/

下記はasciidocファイルのサンプルです。`#`が`=`になったMarkDownのような感じですね。

```asciidoc:example.asciidoc
:hardbreaks:
= AsciiDocの例

== AsciiDocの例の一章 

内容です
```

AsciiDocにはAsciiDoctorというドキュメント変換プロジェクトがあり、これを使用してコマンドラインからasciidocファイルをHTMLに変換する方法はよく知られていますが、このAsciiDoctorをJavaScriptのコードから呼び出す方法についての日本語の解説があまり無いようだったので紹介します。

## インストール

今回はnode.jsのJavascriptから変換をかける予定なのでnpmのセットアップを行います。
AsciiDoctorのjs版の[asciidoctor.js](https://github.com/asciidoctor/asciidoctor.js/)をインストールします

```json:package.json
{
  "type": "module",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "asciidoctor": "^2.2.6"
  }
}
```

下記を実行してセットアップ完了です。

```bash
npm install
```

## 使用方法

冒頭に例示したasciidocファイルを変換してみます。

```javascript:index.js
import Asciidoctor from 'asciidoctor';
const asciidoctor = Asciidoctor();

const doc = asciidoctor.loadFile("./example.asciidoc");
const html = doc.convert();

console.log(html);
```

```bash
npm run start
```

出力内容例

```html
<div class="sect1">
<h2 id="_asciidocの例の一章">AsciiDocの例の一章</h2>
<div class="sectionbody">
<div class="paragraph">
<p>内容です</p>
</div>
</div>
</div>
```

下記の様なコマンドと同等のHTMLが生成されていますね。

```bash
npx asciidoctor -a stylesheet! -a webfonts! -b html5 --no-header-footer example.asciidoc
```

## ドキュメントから情報を取り出す

asciidocを活用してWebページ生成したい場合、ドキュメント本体だけでなく様々な情報をドキュメントから取り出したくなる場合があると思います。
たとえば、ページのタイトルを取り出してHTMLの`<title>`タグに挿入したりするような場合や、筆者情報をリッチなHTMLで表示したい場合などです。
また、ページに合わせて独自の属性を定義することもできます。今回はisdraftとvolumeという属性を追加しました（下書きと章番号などを格納しているような想定です）。

```asciidoc:example.asciidoc
:hardbreaks:
:isdraft:
:volume: 3

= AsciiDocの例
山田 太郎 <yamada-taro@example.org>

== AsciiDocの例の一章

内容です
```

Javascriptのコードはこのようにします。

```javascript:index.js
import Asciidoctor from 'asciidoctor';
const asciidoctor = Asciidoctor();

const doc = asciidoctor.loadFile("example.asciidoc");

const title = doc.getDocumentTitle();
const isdraft = doc.getAttribute('isdraft');
const volume = doc.getAttribute('volume');
const author = doc.getAuthor();

console.log("title:", title);
console.log("isdraft:", isdraft);
console.log("volume:", volume);
console.log("author:", author);
```

出力例

```
title: AsciiDocの例
isdraft:
volume: 3
author: 山田 太郎
```

これらの情報とasciidocの変換結果をテンプレートエンジンに埋め込めばしっかりしたWebページを生成をできますね。

## 参考情報

https://docs.asciidoctor.org/asciidoctor.js/latest/processor/convert-options/
https://docs.asciidoctor.org/asciidoctor.js/latest/setup/install/
JETSON AGX ORINにtensorflowをインストールする

# JETSON AGX ORINのセットアップについて

JETSONT AGX ORINを使用するにはまずJETPACKをセットアップする必要があります。

[JETPACKのセットアップ方法](https://developer.nvidia.com/embedded/learn/get-started-jetson-agx-orin-devkit)

この作業が完了の後にtensorflowをインストールします。

# tensorflowのインストール方法

通常のUbuntuと異なるインストール方法になります。NVIDIA公式サイトを参考にします。

```bash:bash
sudo apt-get update
sudo apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev liblapack-dev libblas-dev gfortran

sudo apt-get install python3-pip
sudo pip3 install -U pip testresources setuptools==49.6.0 

sudo pip3 install -U --no-deps numpy==1.19.4 future==0.18.2 mock==3.0.5 keras_preprocessing==1.1.2 keras_applications==1.0.8 gast==0.4.0 protobuf pybind11 cython pkgconfig packaging
sudo env H5PY_SETUP_REQUIRES=0 pip3 install -U h5py==3.1.0
#h5pyのインストールには時間がかかります

#tensorflow2の最新版をインストールします。JETPACK OSに最適化された環境ですので、古いバージョンが指定できません。

sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v50 tensorflow
```

これでtensorflowがインストールできたはずですが、import tensorflowを行うと下記エラーが出現しました。
```bash:python3

usr/local/lib/python3.8/dist-packages/tensorflow_io/python/ops/__init__.py:98: UserWarning: unable to load libtensorflow_io_plugins.so: unable to open file: libtensorflow_io_plugins.so, from paths: ['/usr/local/lib/python3.8/dist-packages/tensorflow_io/python/ops/libtensorflow_io_plugins.so']
caused by: ["[Errno 2] The file to load file system plugin from does not exist.: '/usr/local/lib/python3.8/dist-packages/tensorflow_io/python/ops/libtensorflow_io_plugins.so'"]
  warnings.warn(f"unable to load libtensorflow_io_plugins.so: {e}")
/usr/local/lib/python3.8/dist-packages/tensorflow_io/python/ops/__init__.py:104: UserWarning: file system plugins are not loaded: unable to open file: libtensorflow_io.so, from paths: ['/usr/local/lib/python3.8/dist-packages/tensorflow_io/python/ops/libtensorflow_io.so']
caused by: ['/usr/local/lib/python3.8/dist-packages/tensorflow_io/python/ops/libtensorflow_io.so: cannot open shared object file: No such file or directory']
  warnings.warn(f"file system plugins are not loaded: {e}")
```

どうやらtensorflow_ioが見つからないエラーですのでインストールしてみます。

```bash:bash
pip3 install tensorflow_io
```

これで解決したようで、無事にtensorflowをimport できました。
Jupyter NotebookでTesseract-OCRを使う

## 目的
PyPI (pip) でTesseract-OCRを構築する方法はネット上にたくさん情報が出ているのですが、Anaconda (conda) に関する情報が少ないです。
私が構築した際につまずいた点があったので備忘録として対策まとめておきます。

## システム要件
- Windows 11 Home 22H2
- Anaconda 3.11.1
    - Python 3.9.15

## 試したこと
### 成功
- Anaconda Promptで `conda install -c conda-forge tesseract`
- Jupyter Notebook上で `tesseract` と `tessdata` のパス指定

### 失敗
- Windowsに直接Tesseract-OCRをインストール
- Jupyter Notebook上で `!conda install -c conda-forge tesseract`
- Jupyter Notebook上で `!pip install tesseract-ocr libtesseract-dev tesseract-ocr-jpn`
    - `libtesseract` が見つからないと怒られる

## 成功した方法
### Anaconda PromptでTesseract-OCRをインストール

```
(base) > conda install -c conda-forge tesseract
```

ここでAnaconda Prompt上で `tesseract` が動くか試します。
正しく言語リストが表示されています。

```
(base) > tesseract --list-langs
List of available languages in "C:\Users\kabeg\anaconda3\share\tessdata/" (125):
afr
amh
ara
asm
(中略)
```

### Jupyter Notebookで動作確認 &rightarrow; 言語リストが空??
続いてJupyter Notebook上でも `tesseract` の動作確認です。
`tesseract` 自体は動いているように見えますが、言語リストが空です。
また言語データ `tessdata` のディレクトリは`C:/Users/username/anaconda3/share/tessdata` にあるはずですが、どういうわけか `./` になっています。

```python
!tesseract --list-langs
# List of available languages in "./" (0):
```

### Jupyter Notebook上でPathを通す
Windowsの環境変数もいじってみましたが、効果がなかったのでJupyter Notebook上でパスを指定します。
以下のコードを `import` 文の下などにおいて実行します。

```python
import pyocr
import os

TESSDATA_PATH = 'C:\\Users\\username\\anaconda3\\share\\tessdata'        # tessdataへのパス (anacondaでインストールの場合)
                                                                         # usernameは環境によって変わります
# TESSDATA_PATH = 'C:\\Program Files\\Tesseract-OCR\\tessdata'           # tessdataへのパス (Windows直インストールの場合)
# TESSERACT_PATH = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'     # tesseractが実行できない場合はtesseract.exeにパスを通す

os.environ["TESSDATA_PREFIX"] = TESSDATA_PATH          # tessdataへのパスを通す
# os.environ["PATH"] += os.pathsep + TESSERACT_PATH    # tesseract.exeのパスも指定する必要が有る場合
```

### 再度Jupyter Notebookで動作確認
今度は問題なく言語リストが読み込めました。
```
!tesseract --list-langs
List of available languages in "C:\Program Files\Tesseract-OCR\tessdata/" (6):
eng
jpn
jpn_vert
osd
script/Japanese
script/Japanese_vert
```

## 考察
一番不思議なのはAnaconda Prompt上では言語データへのパスがうまく通っていたのにJupyter NB上ではパスが通っていなかったことです。
考えられる原因としてはJupyter NBで走っているAnacondaは仮想環境であるためパッケージ等は引き継がれるがパス等は引き継がれないことです。
正直私はPython周りにあまり明るくないのでもし原因に心当たりがある方がいらっしゃればコメント等でご教示いただけると幸いです。
VBAでChromeスクレイピング①　ー下準備編ー


スクレイピング・・・WEBサイトから情報抽出する技術のこと。
今はPythonなどでよく使われている。

そしてVBAでのスクレイピングは従来はIEでやるのが一般的だったが、IEの廃止によりChromeでやってみた。

# VBAでもスクレイピングが可能！

ではどうやってVBAでスクレイピングをするのか？

まず必要なことは、

- SeleniumBasicのインストール（PCで）
- ChromeDriverのインストール（PCで）
- VBAの参照設定（VBE内で）

である。

その他、もしエラーが出た場合は以下の設定も必要になることがある。

- .NET Frameworkのインストール（PCで）

## SeleniumBasicのインストール

SeleniumBasicは、VBAでSeleniumを利用するために必要なものである。
これをまずインストールする。
インストール先はこちら→[https://github.com/florentbr/SeleniumBasic](https://github.com/florentbr/SeleniumBasic)

ここから最新のSeleniumをインストールしていく。

インストール終了後はChromeDriverのインストールも引き続きしていく。

**[注意]**
ここで、SeleniumBasicをインストールしたフォルダの場所をメモしておくと良い。
理由として、後続の処理でChromeDriver.exeをインストールするときに役立つからである。


## ChromeDriverのインストール

**1. ブラウザのバージョン確認**
まず、インストールする前に自分のPC内のChromeブラウザのバージョンを確認する必要がある。
確認のやり方は
    1. ブラウザの右上の３点バーをクリック
    1. 「ヘルプ」をクリック
    1. 「GoogleChromeについて」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/cba36460-0216-85c5-4446-424094c3410f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/db14db91-cb56-472e-0ff1-d3a4c3597eb5.png)

これでバージョンが分かる。

**2. ChromeDriverダウンロード**
この時に、Chromeブラウザのバージョンに合ったChromeDriverをダウンロードする必要がある。

ChromeDriverダウンロード先⇒[https://chromedriver.chromium.org/downloads](https://chromedriver.chromium.org/downloads)

そして、今回、ブラウザのバージョンは「108」が頭にきているのでそれに合わせる。
つまりこの場合、上から２番目のバージョンをインストールすればいいと分かる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/110828c2-29e1-553e-f866-66b0dcf6df13.png)

**3. ChromeDriver.exeの移行**

ダウンロードしたZipファイルをダブルクリックし、中身を開く。
すると「ChromeDriver.exe」が出てくるのでそれをコピーし、SeleniumBasicフォルダ内に貼り付ける。
するとSeleniumBasic内にあるChromeDriver.exeが最新になる。

## VBE側での参照設定

最後に、VBE側での参照設定を行う。

VBE側で「Selenium Type Library」の参照設定にチェックを入れて保存するだけで良い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772852/42c046b1-98b3-39b5-b792-cfc0e900bcc3.png)

## 動作検証

ここまで来たらもうSeleniumでのスクレイピングは可能なはずだが、念のため動作検証をする。
動作検証は一般的に使われることが多い「Yahooを開く」ことでの確認方法を採用する。

やり方としては、以下のコードをVBEに貼り付け動かすだけでOK。
その際正しくYahooが開いたら動作検証はOKである。

```vb
Sub test()
 　'Selenium制御
 　Dim driver As New Selenium.ChromeDriver
 
     'ウィンドウサイズ最大化
     driver.AddArgument "disable-gpu"
     driver.AddArgument "start-maximized"
  
     Call driver.Start("chrome")
     
     'YahooのURLを開く
     driver.Get ("https://yahoo.co.jp")
     
     Stop
End Sub

```

### エラーが出た時の対処方法

もし上の動作検証でエラーが出た場合（特に多いのは「オートメーションエラー」）
以下の設定が足りていないことが考えられる。

1. ChromeDriverのバージョンがChromeブラウザのバージョンと一致していない
1. Net FrameworkがPCに入っていない

このうち、１に関しては先ほどの「Chromeドライバのインストール」でブラウザのバージョンをもう一度確認し、それに合ったChromeDriverをダウンロードすると良い。

２に関しては、Net Frameworkを以下のサイトを参考にしてインストールすれば解決できるかもしれない。
[https://atmarkit.itmedia.co.jp/ait/articles/1605/09/news018_2.html](https://atmarkit.itmedia.co.jp/ait/articles/1605/09/news018_2.html)

その後、もう一度上記テストを行って成功すればめでたしめでたしである。


では次に、実際にVBAでスクレイピングをしてみる。⇒[続き実践編へ](https://qiita.com/mamineko/items/c09321e8a586eb83693c)
VirtualboxのVagrantがうまく立ち上がらない

PCを起動して、`vagrant up` をしてimageを立ち上げようとすると毎回、
`is not a Host-Only Adapter interface` のようなエラーが出て起動できなかった。
他の人は同様の現象は起きていない・・・

何故か、VirtualBoxを再インストールすると直って問題なく起動できていた。
思い当たる原因というか、他の正常に動いている人との差は、`過去にVirtualBoxを使ったことがあるかどうか` だけ。
毎朝毎回、VirtualBoxの再インストールを行い、立ち上げていたので面倒になったので原因調査を他エンジニアに依頼。

`ls -la /Library/Application\ Support/`

```
...
...
drwxrwxr-x@  7 root  wheel   224 12 13 09:22 VirtualBox
drwxrwxr-x@  7 root  wheel   224 10 01 10:54 VirtualBox_KaoPu
...
```

`VirtualBox_KaoPu` ....? なんじゃこりゃ・・・？？
`VirtualBox_KaoPu` を消す、または別の場所に移動させる・・・


起動するようになった:v:
やはり、過去のVirtualBoxの設定が `uninstall.sh` を使っても消えずに残ってしまっていたのが原因のようです。