好奇心の赴くままに

好奇心の赴くままに

やりたいことを書いています。

Try EnvoyのGetting Started with EnvoyでEnvoyに入門してみる

最近Envoyを勉強する機運が高まっていて、 Envoyでいい感じのチュートリアルがないか探してみたら、有名ブロガーのカックさんが紹介していたTry EnvoyがEnvoyの入門に良さそうだったので、
Try EnvoyGetting Started with Envoyをやってみました.

kakakakakku.hatenablog.com

Try Envoy

Try EnvoyはKatacodaで提供されているEnvoyを学習できるプラットフォームで 全部で12個のEnvoyに関するコースがあります. www.envoyproxy.io

Getting Started with Envoy

以下の4つの手順で構成されています.

  1. Create Proxy Config
  2. Start Proxy
  3. Admin View
  4. Route to Docker Containers

1. Create Proxy Config

envoy.yamlの書き方について学ぶ.
内容としては、Envoyコンテナにリクエストを投げると、google.comに転送される設定になっている.
以下進める上でのポイント

  • envoy.yamlは、Listeners,Fillters,Clustersの3要素から構成されている.
  • Listeners には、リクエストを受ける設定を書く
  • Fillters には、どのようにリクエストを処理するかをかく
  • Clusters には、リクエストの転送先を書く

実際のenvoy.yamlファイルは以下

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 10000 }

    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: { host_rewrite: www.google.com, cluster: service_google }
          http_filters:
          - name: envoy.router

  clusters:
  - name: service_google
    connect_timeout: 0.25s
    type: LOGICAL_DNS
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    hosts: [{ socket_address: { address: google.com, port_value: 443 }}]
    tls_context: { sni: www.google.com }

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 0.0.0.0, port_value: 9901 }

2. Start Proxy

先ほど作成したenvoy.yamlでEnovyコンテナを起動する

$ docker run --name=proxy -d \
  -p 80:10000 \
  -v $(pwd)/envoy/envoy.yaml:/etc/envoy/envoy.yaml \
  envoyproxy/envoy:latest

起動したEnvoyコンテナにアクセスするとgoogle.comに転送されることが確認できる.

3. Admin View

先ほどのenvoy.yamlのadminの部分で設定していた Administration interfaceの機能を試す.

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 0.0.0.0, port_value: 9901 }

Administration interfaceでは、起動したEnvoyの統計情報、メトリクスなどが確認できる.
Envoyコンテナを起動すると

$ docker run --name=proxy-with-admin -d \
    -p 9901:9901 \
    -p 10000:10000 \
    -v $(pwd)/envoy/envoy.yaml:/etc/envoy/envoy.yaml \
    envoyproxy/envoy:latest

以下ような画面が確認できる.

4. Route to Docker Containers

Envoyコンテナとその背後に2つのPythonアプリケーションがあり、 Envoyへのリクエストを背後のPythonアプリケーションにそれぞれパスベースでルーティングする 構成になっている. (service/1へのリクエストはService1,service/2へのリクエストはService2にルーティングされる)

Envoyとその背後の2つのFlaskコンテナは以下のようなdocker-compose.yamlファイルで 構築されている.

version: '2'
services:

  front-envoy:
    build:
      context: .
      dockerfile: Dockerfile-frontenvoy
    volumes:
      - ./front-envoy.yaml:/etc/front-envoy.yaml
    networks:
      - envoymesh
    expose:
      - "80"
      - "8001"
    ports:
      - "8000:80"
      - "8001:8001"

  service1:
    build:
      context: .
      dockerfile: Dockerfile-service
    volumes:
      - ./service-envoy.yaml:/etc/service-envoy.yaml
    networks:
      envoymesh:
        aliases:
          - service1
    environment:
      - SERVICE_NAME=1
    expose:
      - "80"

  service2:
    build:
      context: .
      dockerfile: Dockerfile-service
    volumes:
      - ./service-envoy.yaml:/etc/service-envoy.yaml
    networks:
      envoymesh:
        aliases:
          - service2
    environment:
      - SERVICE_NAME=2
    expose:
      - "80"

networks:
  envoymesh: {}

Enovyコンテナのenvoy.yamlファイルは以下. routesの部分で今回のパスベースルーティングの設定をしている.

static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 80
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/service/1"
                route:
                  cluster: service1
              - match:
                  prefix: "/service/2"
                route:
                  cluster: service2
          http_filters:
          - name: envoy.router
            config: {}
  clusters:
  - name: service1
    connect_timeout: 0.25s
    type: strict_dns
    lb_policy: round_robin
    http2_protocol_options: {}
    hosts:
    - socket_address:
        address: service1
        port_value: 80
  - name: service2
    connect_timeout: 0.25s
    type: strict_dns
    lb_policy: round_robin
    http2_protocol_options: {}
    hosts:
    - socket_address:
        address: service2
        port_value: 80
admin:
  access_log_path: "/dev/null"
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 8001

実際に起動して、リクエストすると想定通りにEnvoyへのリクエストが パスルーティングされて背後のPythonアプリケーションに転送されることが確認できた.

$ docker-compose -f ~/envoy/examples/front-proxy/docker-compose.yml up -d
$ curl localhost:8000/service/1
Hello from behind Envoy (service 1)! hostname: 35cfe0a1d806 resolvedhostname: 172.17.0.2
$ curl localhost:8000/service/2
Hello from behind Envoy (service 2)! hostname: d72bb6cc73d0 resolvedhostname: 172.17.0.4

まとめ

とっつきにくかったEnovyについて前よりほんの少し馴染めるようになった気がする.

参考

www.envoyproxy.io kakakakakku.hatenablog.com

SDKMANでsdk list javaした際に「INTERNET NOT REACHABLE!」エラーが出た時の対処法

環境

  • M1 Mac Pro
  • プロキシ環境下でない

事象

SDKMANでsdk list javaした際に以下エラーが出る

 $ sdk list java      
==== INTERNET NOT REACHABLE! ===================================================

 Some functionality is disabled or only partially available.
 If this persists, please enable the offline mode:

   $ sdk offline

==============================================================================

対処法

# **~/.sdkman/etc/config**の以下パラメータを変更
$ vi ~/.sdkman/etc/config

sdkman_curl_connect_timeout=30
sdkman_curl_max_time=50

# 実行権限追加
$ chmod +x .sdkman/bin/sdkman-init.sh

# シェルを再起動
$ exec $SHELL -l

2022年の目標宣言

今年は昨年よりアウトプットを増やして、興味のあるAIやソフトウェア設計を勉強しつつ、30歳以降の海外就職を視野に入れてCSの勉強や英語を頑張っていきたいです。

なりたい姿

  • 英語での情報収集や技術習得をできるようになりたい
  • TDDやDDDを理解した上で、TDDやDDDを実践してソースコードを書けるようになりたい
  • 基本的なアルゴリズムを理解して実装できるようになりたい

インプット目標

  • なるべく英語で技術習得するようにする
  • TDD,DDDについて書籍で勉強する
  • 基本的なアルゴリズムについて書籍で勉強する
  • CS(CPU,OS,DBなど)について勉強する

アウトプット目標

  • 技術記事 (はてなブログ、Qiita、Zennなど)最低週1本書く
  • LT発表 2ヶ月に1回発表する
  • 個人開発 1個作る
  • AtCoder 緑まで行きたい
  • kaggle等のAIコンペ 銅メダル1つ取る

資格目標

2021年の振り返り

E資格を取ったり、個人開発やったり、手広く色々やった年だった。
プライベートで色々あって忙しかったので、例年に比べてアウトプットが 少なくなってしまったのが残念。

アウトプット

  • ブログ 2本
    必要に駆られて勉強したRailsで1本とAtCoderで1本書いた。

writerman.hatenablog.jp writerman.hatenablog.jp

  • Qiita 2本
    仕事で利用しているC#と個人開発でのVue.jsで計2本

qiita.com qiita.com

  • LT 1回
    社内の制作物発表会でのLT

speakerdeck.com

  • 個人開発 1個
    E資格を受験する際に受講した研修内で開発したもの

github.com

  • OSSコントリビューション 1個
    ずっとOSSコントリビューションしたくてようやく叶った。

github.com

仕事

昨年に引き続き、AWS環境の設計・構築をやっていた。
今年からはC#でのデスクトップアプリ開発もやった。

できるようになったこと

  • AWSのセキュリティ分野について詳しくなった。
  • Swiftで簡単なアプリを作れるようになった。
  • Railsで簡単なアプリを作れるようになった。
  • DeepLearningの仕組みを理解して簡単な画像認識のアプリを作れるようになった。
  • DP,DFS,BFSを理解した。

atcoder-cli,online-judge-toolsを入れてAtCoderのローカル自動テスト環境を構築した

※2022/1/9 ojにPATHが通らない場合の手順追加

きっかけ

最近コーディングテスト対策で毎日AtCoderの問題を解いているのですが、 毎回のサンプルテスト実行が面倒でした。
そこで、ローカル環境で自動テストを実行できるツールを インストールして自動テスト環境を構築してみました。

検証環境

  • WSL2(Ubuntu20.04)

  • VSCode

  • Python 3.8.5

  • pip 20.0.2

  • npm 8.1.4

種類

調べたところどうやら以下の2強みたいです。

これさえインストールすれば、対象の問題情報ダウンロードからSubmitまでやってくれるので便利

github.com

二つ入れる必要があるが、コマンド名も短く、使いやすい

github.com github.com

手順

最初は使うツールの少ないatcoder-toolsを試したのですが、

バグ(https://github.com/kyuridenamida/atcoder-tools/issues/204)でsubmitできなかったのであきらめて atcoder-cli,online-judge-toolsを使って環境構築を進めました。

環境構築

# atcoder-cliのインストール
$ npm install -g atcoder-cli

# online-judge-toolsのインストール
$ pip3 install online-judge-tools

# atcoder-cliのインストール確認(ヘルプ一覧が表示されればOK)
$ acc -h

# online-judge-toolsのインストール確認(ヘルプ一覧が表示されればOK)
※`Command 'oj' not found`と出る場合は以下のサイトの手順7を参照してPATHを通す。
[https://github.com/online-judge-tools/oj/blob/master/docs/INSTALL.ja.md]
$ oj -h

# accとojが連携できているか確認( availableならOK)
$ acc check-oj

# accでatcoderにログイン
$ acc login

? username: xxxxxxx
? password: [hidden]
OK

# ojでatcoderにログイン(Seleniumが入ってない場合、エラーが出ますが、無視してOK)
$ oj login https://beta.atcoder.jp/

(省略)

Username: xxxxxx
Password: 

(省略)

[SUCCESS] You have already signed in.

実際に使ってみる

今回は実際にローカル上で以下の問題をコード作成、テスト実行、提出までやってみます。

atcoder.jp

まず、問題一式をダウンロードします。

f:id:kamada-math:20211216000615p:plain

acc new の後にatcoder.jp/contest/の後にくるコンテストIDを入れて実行してください。(今回だとabs)

acc new abs

※途中ダウンロードする問題を選択場面があるので、今回はPracticeAを選んでください。

次に実際に今回の提出するコードを書きます。

testsディレクトリと同じ階層にpractice.pyとして今回の提出コードを作成します。

# 整数の入力
a = int(input())
# スペース区切りの整数の入力
b, c = map(int, input().split())
# 文字列の入力
s = input()
# 出力
print("{} {}".format(a+b+c, s))

作成後、以下のようなディレクトリ構成になっています。

$ tree

.
└── abs
    ├── contest.acc.json
    └── practicea
        ├── practice.py←今回の提出コード
        └── tests←テストケースの入ったディレクトリ
            ├── sample-1.in
            ├── sample-1.out
            ├── sample-2.in
            └── sample-2.out

ここで、実際にテストを実行してみます。

# 提出コードのある階層まで移動
$ cd ./abs/practicea/

# 実際にテスト実行(cオプションでpython実行のコマンド、dオプションでtestケースディレクトリを指定します。)
$ oj t -c "python3 ./practice.py" -d ./tests/

[INFO] online-judge-tools 11.5.1 (+ online-judge-api-client 10.10.0)
[INFO] 2 cases found

[INFO] sample-1
[INFO] time: 0.047150 sec
[SUCCESS] AC

[INFO] sample-2
[INFO] time: 0.046449 sec
[SUCCESS] AC

[INFO] slowest: 0.047150 sec  (for sample-1)
[INFO] max memory: 9.120000 MB  (for sample-1)
[SUCCESS] test success: 2 cases

問題ないので、実際に提出します。

acc submit (提出ファイル名)で提出できます。

途中で確認のため、typeする必要があるので、言われた通りにtypeします。

$ acc submit practice.py 

(省略)

Are you sure? Please type "pra1" pra1 

(省略)

提出後、自動でブラウザが開いて提出結果を確認できます。

f:id:kamada-math:20211216000650p:plain

参考

hamukichi.hatenablog.jp

atcoder初心者こそ環境構築しよう!(atcoder-cli,online-judge-toolsのインストール、使い方) - Qiita

Hirbを使ってRails Consoleでのコンソール出力を見やすくする

Rails Consoleでのコンソール出力が見ずらい

Rails ConsoleでDBの中身を見る際に、コンソール出力の結果が非常に見ずらい

f:id:kamada-math:20211115220438p:plain

hirbを導入して見やすくしてみた

Gemfileに以下の記述を追加してbundle installを実行

  gem 'hirb' # hirb本体
  gem 'hirb-unicode' 

インストール後、Rails ConsoleでHirb.enableでHirbが有効になり、以下のようにコンソール出力が見やすくなります。

f:id:kamada-math:20211115220832p:plain

毎回Hirb.enableするのは面倒

毎回Hirbを有効化するのは面倒なのでGemfileと同じフォルダ階層に コンソール起動時に読み込まれる.irbrcファイルを作成して以下を追記してやると毎回Hirb.enableしなくて良いので楽

if defined? Rails::Console
  Hirb.enable if defined? Hirb
end

参考

Rails Console がしんどい人への hirb のススメ | Octo's blog

RailsでHirbを使ってコンソールの出力を表形式で表示する | 雑記学習帳

メモリ増設、SSD換装してみた

データ量の多いExcelを開くだけでPCが落ちたりしていて、仕事の生産性が 下がりやすかったので、これを機にメモリ増設・SSD換装してみました。

最初に

以下の検証手順を個人で試される際には一切責任等は負いませんのでご了承ください
あくまで一参考として読んでいただけると幸いです

増設・換装前PCスペック

購入したもの

手順

  1. BitLockerの解除を行う
  2. 変換ケーブルでSSDを接続し、フォーマットを行う
  3. 以下手順を参照し、Samsungのクローンソフト(Samsung data migration)を利用して、HDDからSSDへデータ転送
         Samsung_SSD_Data_Migration_User_Manua     
  4. ACアダプターを外す
  5. PC再起動し、F1ボタンを5回以上連打してBIOS起動
  6. BIOS画面で以下設定を行う
    • セキュアブートの無効化
    • 内臓バッテリー無効化
  7. 6で電源が切れるので外部バッテリー取り外し
  8. 裏側のふた(蓋板)を取り外す
  9. メモリ取り替え
  10. HDDを取り外し、SSD取付
  11. 裏側のふた(蓋板)を取り付け
  12. ACアダプターを挿してPCを起動させる
  13. 状況により個別対応(詰まった部分等) ←ここで多くの時間を費やしましたw 詳細は後述
  14. BitLocker暗号化

詰まった部分

  1. 手順12で起動するも、ブルースクリーン(0xc000000e【エラー】)が表示される
    <解決策> 以下手順を参照することで正常起動できた
    https://freesoft.tvbok.com/tips/efi_installation/uefi_bootrec.html

  2. 起動後、WindowsEnterpriseのライセンスが外れてしまった
    <解決策> 再度ライセンスコード入力

  3. 手順14でBitLockerで暗号化しようとするも「指定されたファイルが見つかりません」エラーが発生
    <解決策> ReAgent.xmlファイルが破損していたので、入れ替えてreagentc /enableを実行

最後に

SSD換装は簡単と聞いてましたが、意外と苦戦してしまいました。 ただ、やはり換装後はPCサクサク動くので換装して良かったです。