Try EnvoyのGetting Started with EnvoyでEnvoyに入門してみる
最近Envoyを勉強する機運が高まっていて、 Envoyでいい感じのチュートリアルがないか探してみたら、有名ブロガーのカックさんが紹介していたTry EnvoyがEnvoyの入門に良さそうだったので、
Try EnvoyのGetting Started with Envoyをやってみました.
Try Envoy
Try EnvoyはKatacodaで提供されているEnvoyを学習できるプラットフォームで 全部で12個のEnvoyに関するコースがあります. www.envoyproxy.io
Getting Started with Envoy
以下の4つの手順で構成されています.
- Create Proxy Config
- Start Proxy
- Admin View
- 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について前よりほんの少し馴染めるようになった気がする.
参考
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年の目標宣言
2021年の振り返り
E資格を取ったり、個人開発やったり、手広く色々やった年だった。
プライベートで色々あって忙しかったので、例年に比べてアウトプットが
少なくなってしまったのが残念。
アウトプット
writerman.hatenablog.jp writerman.hatenablog.jp
- Qiita 2本
仕事で利用しているC#と個人開発でのVue.jsで計2本
- LT 1回
社内の制作物発表会でのLT
- 個人開発 1個
E資格を受験する際に受講した研修内で開発したもの
仕事
昨年に引き続き、AWS環境の設計・構築をやっていた。
今年からはC#でのデスクトップアプリ開発もやった。
できるようになったこと
atcoder-cli,online-judge-toolsを入れてAtCoderのローカル自動テスト環境を構築した
※2022/1/9 ojにPATHが通らない場合の手順追加
きっかけ
最近コーディングテスト対策で毎日AtCoderの問題を解いているのですが、
毎回のサンプルテスト実行が面倒でした。
そこで、ローカル環境で自動テストを実行できるツールを
インストールして自動テスト環境を構築してみました。
検証環境
種類
調べたところどうやら以下の2強みたいです。
- atcoder-tools
これさえインストールすれば、対象の問題情報ダウンロードからSubmitまでやってくれるので便利
二つ入れる必要があるが、コマンド名も短く、使いやすい
手順
最初は使うツールの少ない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.
実際に使ってみる
今回は実際にローカル上で以下の問題をコード作成、テスト実行、提出までやってみます。
まず、問題一式をダウンロードします。
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 (省略)
提出後、自動でブラウザが開いて提出結果を確認できます。
参考
atcoder初心者こそ環境構築しよう!(atcoder-cli,online-judge-toolsのインストール、使い方) - Qiita
Hirbを使ってRails Consoleでのコンソール出力を見やすくする
Rails Consoleでのコンソール出力が見ずらい
Rails ConsoleでDBの中身を見る際に、コンソール出力の結果が非常に見ずらい
hirbを導入して見やすくしてみた
Gemfileに以下の記述を追加してbundle install
を実行
gem 'hirb' # hirb本体 gem 'hirb-unicode'
インストール後、Rails ConsoleでHirb.enable
でHirbが有効になり、以下のようにコンソール出力が見やすくなります。
毎回Hirb.enable
するのは面倒
毎回Hirbを有効化するのは面倒なのでGemfileと同じフォルダ階層に
コンソール起動時に読み込まれる.irbrcファイルを作成して以下を追記してやると毎回Hirb.enable
しなくて良いので楽
if defined? Rails::Console Hirb.enable if defined? Hirb end
参考
メモリ増設、SSD換装してみた
データ量の多いExcelを開くだけでPCが落ちたりしていて、仕事の生産性が 下がりやすかったので、これを機にメモリ増設・SSD換装してみました。
最初に
以下の検証手順を個人で試される際には一切責任等は負いませんのでご了承ください
あくまで一参考として読んでいただけると幸いです
増設・換装前PCスペック
- ThinkPad x270
- HDD 512GB
- メモリ 8GB
購入したもの
SSD 1TB
Amazon | Samsung 860 EVO 1TB SATA 2.5" 内蔵 SSD MZ-76E1T0B/EC 国内正規保証品 | 日本サムスン | パソコン・周辺機器 通販メモリ 16GB
価格.com - crucial CT16G4SFD8266 [SODIMM DDR4 PC4-21300 16GB] 価格比較SATA-USB変換ケーブル
Amazon | アイネックス 2-in-1 2.5インチSATA-USB2.0変換アダプタ CVT-09 | AINEX | 変換コネクタ 通販
手順
- BitLockerの解除を行う
- 変換ケーブルでSSDを接続し、フォーマットを行う
- 以下手順を参照し、Samsungのクローンソフト(Samsung data migration)を利用して、HDDからSSDへデータ転送
Samsung_SSD_Data_Migration_User_Manua - ACアダプターを外す
- PC再起動し、F1ボタンを5回以上連打してBIOS起動
- BIOS画面で以下設定を行う
- セキュアブートの無効化
- 内臓バッテリー無効化
- 6で電源が切れるので外部バッテリー取り外し
- 裏側のふた(蓋板)を取り外す
- メモリ取り替え
- HDDを取り外し、SSD取付
- 裏側のふた(蓋板)を取り付け
- ACアダプターを挿してPCを起動させる
- 状況により個別対応(詰まった部分等) ←ここで多くの時間を費やしましたw 詳細は後述
- BitLocker暗号化
詰まった部分
手順12で起動するも、ブルースクリーン(0xc000000e【エラー】)が表示される
<解決策> 以下手順を参照することで正常起動できた
https://freesoft.tvbok.com/tips/efi_installation/uefi_bootrec.html起動後、WindowsEnterpriseのライセンスが外れてしまった
<解決策> 再度ライセンスコード入力手順14でBitLockerで暗号化しようとするも「指定されたファイルが見つかりません」エラーが発生
<解決策> ReAgent.xmlファイルが破損していたので、入れ替えてreagentc /enableを実行
最後に
SSD換装は簡単と聞いてましたが、意外と苦戦してしまいました。 ただ、やはり換装後はPCサクサク動くので換装して良かったです。