プログラミング初心者がアーキテクトっぽく語る

見苦しい記事も多数あるとは思いますが訂正しつつブログと共に成長していければと思います

2020-01-01から1年間の記事一覧

f-stringの使い型

f-stringはPython 3.6から導入された文字列のフォーマットを制御する方法の1つです。 +で文字列リテラルと文字列変数を結合したり、str.format()を使うよりもコードがすっきりします。 基本 文字列をf''で囲う 変数と置き換えたいときは{変数名}とする name …

PythonでReflection

Pythonでクラス名やメソッド名から動的にインスタンスやメソッドを取得する方法を紹介します。 インスタンスの取得 importlib.import_moduleを使ってmoduleをimportして、getattrでmoduleからクラスを取得するのが一般的なようです。 from importlib import …

__main__.pyってなに

時折、見かける「__main__.py」 ってなにか調べてみました。 python -mで実行したときに呼ばれる 「python -m パッケージ名」を実行するとそのパーケージの__main__.pyが呼ばれます。 パッケージの作り方によっては__main__.py以外のモジュールを呼び出すこ…

Pythonで引数を扱う

引数を扱うときに便利なのがParserです。簡単に引数を処理することができ、定義も簡単です。一度使えばsys.argvを直接処理する気なんてなくなるはずです。 PythonではいくつかParserの選択肢がありますがargparse一択だと思います。 標準ライブラリの選択肢 …

PyCharmでテストコードのフォルダを多階層にしたらテストが動かなくなった

PyCharm + unittestでTDDっぽいことを試しました。最後にテストコードのフォルダ階層をプロジェクトコードのフォルダ階層と一致させたらそれまで動いていた単体試験の大半が動かなくなってしまいました。 ただのsys.pathの理解不足だったのですが同じことで…

Pythonの配布パッケージに.py以外のファイルを含めたいとき

PythonのコードでYAMLやJSONのファイルを参照していて、そのファイルをパッケージに含めたいときにどうすればよいか解説します。 そのようなファイルは「リソース」と呼ばれます。 コードの書き方 リソースをopenで読み込むと単体試験ではうまくいきますが、…

PyCharmでプロジェクトフォルダをRenameしたらちょっと面倒なことになった

PyCharmでプロジェクトの名前を変更したらunittestが動かなくなったりpyenvの仮想環境や__pycache__に古い名前が残ったりして少し苦労した話です。 プロジェクト名変更 コードが完成しunittestの単体テストも全て動いた後に最初に適当に命名したプロジェクト…

Git MergeでConflictが発生したときの対処

Git

異なるブランチで同じファイルの同じ場所を同時に編集するとConflictが発生する。 Conflictが発生した状態でMergeしようとすると失敗する。 $ git merge feature -m "merge feature branch into master" Auto-merging hello.py CONFLICT (content): Merge co…

機能要件と非機能要件の判別

要件は機能要件と非機能要件に分類される。 ある要件が機能要件なのか非機能要件なのかどのように判別すればよいだろう? ある要件を見たときそれが機能要件と非機能要件か判断できないことが初学者にはよくある。 現実の話をすると現場でそんなことで悩むこ…

非機能要件を定義するためのツール

非機能要件が多すぎるシステムは得られる効果以上に開発に時間がかかり高コストになる。 非機能要件が少なすぎるシステムは品質や運用性が低下し、技術的負債を抱えた状態でリリースされることになる。技術的負債は積み重なることはあっても精算されることは…

SOAとMicroserviceアーキテクチャ

SOAとMicroserviceの違いについて調べると様々な答えが出てくる。 「ESBとSOAPとWSDLを使うのがSOAだ」 「サービスの粒度が大きいがSOAで小さいのがMicroserviceだ」 「MicroserviceはSOAだ」 これは話し手の視点が異なることが原因だ。人によって「SOA」の…

API Gateway

API Gawewayという言葉をよく目にするようになった。 アーキテクチャ議論でよく出てくるのでなにを指しているのか理解しておきたい。 API Gatewayなしの場合 クライアントは「発注」という処理のために複数のサービスをREST APIで呼び出す 各サービスはTLS、…

APIキーを管理するCloudサービス

API

Web APIにおけるキーの管理について以下の記事で述べた。 architecting.hateblo.jp この中でAPIキーを管理するCloudサービスについて名前だけ紹介したが中身までは触れなかった。 ここでは著名なサービスをいくつか取り上げて簡単に説明する。どんなサービス…

ETagの利用例

API

主にHTTPのキャッシュなどで利用されるETagには複数のユースケースが存在する。 今回はETagのユースケースについて見ていこう。 ETag ETagヘッダはRFC 7232(HTTP/1.1 Conditional Requests)で定義されているレスポンスヘッダである。 ETagの値はあるリソー…

DIとDIPとIoC

Dependency Injectionパターン:DI Dependency Inversion Principle:DIP Inversion of Control:IoC この3つの用語はなんとなく名前が被っている上に同じ文脈で登場することが多いため、初学者は混乱しやすい。 なにが違うのか、Dependency Injectionパター…

KubernetesのServiceの種類

KubernetesのServiceの種類については以前、名前だけ紹介した。 architecting.hateblo.jp ここではそれぞれの概要について触れる。 ClusterIP クラスタ内でPod同士が通信するためのService 名前解決を利用できる デフォルト NodePort 簡易的な外部との接続を…

Istioとはなにか

以前、サービスメッシュがなぜ必要なのかをこちらの記事で紹介した。 architecting.hateblo.jp 今回はサービスメッシュの実装の一つであるIstioについて取り上げる。 サービスメッシュは執筆時点ではまだ新しい技術であり変化が激しい。実装間の差も大きく、…

NoSQLデータベースの種類

以前、データベースの大半はRDBMSと言われているが、NoSQLデータベースを適材適所に配置する流れは続いている。NoSQLの種類とそれぞれの特徴、そして代表的な実装を知っておくことは重要である。 ここでは代表的なNoSQLデータベースを紹介する。 Key-Value D…

その他のKubernetesの重要なオブジェクト

「Kubernetesの基礎」ではPodとServiceについて触れたがそれ以外のオブジェクトについては紙面の都合上触れることができなかった。 architecting.hateblo.jp ここでは前回、書ききれなかったKubernetesの重要なオブジェクトを紹介する。 Deployment Podの上…

Kubernetesの設定

Kubernetes(k8s)には複数の設定方法がある。 今回はKubernetesの設定方法について紹介する。 設定方法 k8sがサポートする設定方法を以下に示す。 kubectlコマンドで手続き的に設定する kubectl run/scale/expose Manifestファイルを手続き的に設定する kub…

Kubernetesの基礎

今のご時世はなんでもコンテナだ。そしてコンテナでサービスを提供するにはKubernetes(以下、k8s)が必要だ。 architecting.hateblo.jp 今回はk8sの概要について見ていこう。 歴史 Googleで前身となるBorgが開発された Borgの開発者を中心にGoogleでk8sの開…

なぜKubernetesを使うのか

今のご時世はなんでもコンテナだ。少なくとも会社の偉い人たちはそう思っている。 コンテナと言えばDockerだ。Dockerがあればコンテナに関わることは一通りできる。 しかし「Kubernetes」という単語もよく耳にする。Dockerで十分ではないのだろうか? 今回は…

Dockerのネットワークのタイプ

Dockerでコンテナ同士が通信するためにはネットワークが必要だ。 Dockerは複数のネットワーク接続方式をネットワークドライバというPluggableな形式でサポートしている。 ここではDockerが提供するネットワークについて見ていこう。 Default Bridge Dockerは…

RUN、ENTRYPOINT、CMDのexec表記とshell表記

前回、dockerfileのENTRYPOINTとCMDについて紹介した。 architecting.hateblo.jp RUN、ENTRYPOINT、CMDにはexec表記とshell表記の2つの記法がある。 以降、CMDを例にして2つの記法について見ていく。 shell表記 shell表記で記述した例を示す。 CMD echo hi s…

dockerfileのENTRYPOINTとCMD

dockerfileのENTRYPOINTとCMDは、どちらもコンテナで実行するプロセスを指定するInstructionだ。 それぞれ単独で利用することも、組み合わせて利用することもできる。 どのように違うのか、どのように組み合わせることができるのか見ていこう。 CMD まずCMD…

「docker run -it」にするとコンテナがすぐに終了しない理由

Dockerを使ったことがある人ならこんなことを経験したことがあるかもしれない。 このように実行するとコンテナがすぐに終了してまう。 docker run ubuntu:latest このように「-it」を付けて実行するとコンテナは終了しない。 docker run -it ubuntu:latest …

Twelve-Factor App

Twelve-Factor Appはモダンなアプリケーションの開発、Deploy、Scaleを成功させるための12のBest Practiceである。 2012年にHerokuのAdam Wiggins氏が発表し、https://12factor.net/にて公開されている。 Twelve-Factor Appはマイクロサービスを前提としてお…

Puppetの基礎

Configuration Management Toolと言えばAnsibleが持て囃されている。 少し適用範囲が狭いことがネックだが実はPuppetも優れたツールだ。Ansibleよりも宣言的な使い方ができる点に特徴がある。宣言的なインフラ管理を志向する人、既にAnsibleを使っているが他…

Container Firewall

Kubernetes(以下、k8s)にHostingするマイクロサービスでは「Container Firewall」が注目されてきている。 「Container Firewall」とはなにか?いままでのFirewallとはなにが違うのだろうか? 従来のZone based Security 従来のセキュリティ対策はネットワ…

サービスメッシュとは

KubernetesにHostingされたマイクロサービスでは「サービスメッシュ」がよく使われている。 「サービスメッシュ」はサービス間の通信を制御するコンポーネントだ。しかしサービス間で通信する機能は既にそれぞれのサービスの中で実装されている。なぜサービ…