taisablog

taisa's engineer blog

Image uploaded from iOS (1)

投稿日:

-

執筆者:

関連記事

Python Bottleのソースを読む 起動編

Pythonの軽量WebフレームワークBottleのソースを読む 起動編 Bottleとは Bottle is a fast, simple and lightweight WSGI micro web-framework for Python. It is distributed as a single file module and has no dependencies other than the Python Standard Library. Pythonの軽量Webフレームワークで、特徴はシンプルで早く、Pythonの標準ライブラリにも依存していないWebフレームワークであることとフレームワーク本体が1ファイルで構成されていることである Class Hierarchy Doxygenを使って出力した図Bottleは1ファイルながら中でそれぞれのクラス、主にServer、Templateが継承関係にあるのがわかる(コード量は4000行位)。ServerやTemplateクラスはたくさんあるが実際はその中のどれかを選択して利用する形となる 起動 Bottleの起動はrun()を呼び出す方法とコマンドラインインターフェースを使う方法が用意されている run()を使う方法 以下のように記載し起動することでサーバが立ち上がる from bottle import run, route @route(‘/’) def index(): return ‘Hello World’ run(host=’localhost’, port=8000, debug=True) コマンドラインインターフェースを使う場合 以下のコマンドで起動可能 # コントローラを指定 python -m bottle ‘package.controller’ # 説明は省略するが明示的にアプリを指定することも可能 python -m bottle ‘package.controller:app’ controller.py # runは不要 from bottle import ,route @route(‘/’) def index(): return ‘Hello World’ 起動処理を確認する コマンドラインインターフェースを使う場合 mainが2箇所あるが、これはサーバアダプダに必要なライブラリを必要としているからで、1つ目のmainでまずサーバアダプタに必要なライブラリを読み込み2つ目のmainでサーバが起動される仕組みになっている run()でサーバを起動する run()では、渡された引数の値をそれぞれ読み込んだあと最後にServerAdapterのrun()を呼び出している。Bottleでは多くのサーバをServerAdapterを継承することでサポートしており、指定されたサーバを起動するようになっている。指定しない場合はwsgirefがデフォルトで呼ばれる。また、appパラメータは特別指定しなければ、内部で自動的にdefaultが使われるので特別指定する必要はない。 サーバをロードするまで処理を追ってみる まず、Bottleでサポートしているサーバは以下のように宣言してある。 server_names = { ‘cgi’: CGIServer, ‘flup’: FlupFCGIServer, ‘wsgiref’: WSGIRefServer, ‘waitress’: WaitressServer, …

スクラムガイド

スクラムを3ヶ月やってみて

スクラムを初めて3ヶ月たったので振り返る スクラムについて スクラム (ソフトウェア開発) – wikipedia スクラム(英: Scrum)は、ソフトウェア開発における反復的で漸進的なアジャイルソフトウェア開発手法の1つである。この方法論は「柔軟かつ全人的なプロダクト開発ストラテジーであり、共通のゴールに到達するため、開発チームが一体となって働くこと 一定の周期で計画会議→開発(スプリント)、スプリントレビュー、クロージング(振り返り、リリース)を繰り返すことが大事 スクラムを始めたきっかけ 前まで マネージャーの管理コストが高い 開発メンバーが今なにやってるかを把握するのが大変 リリースサイクルが決まっていない為開発、営業、運用の連携が困難 開発したものが放置されやすい 突発的な開発対応に追われる 開発者は言われたものだけをひたすら開発するというサイクルになりがち スクラム体制後 マネージャーの管理コストが下がる 開発チームがなにやってるかを把握できる リリースサイクルが決まる為営業、運用、開発の連携がしやすい 品質が上がる 振り返りによりチーム力が上がる 開発が考えるシナリオを推進することができる 開発チーム個々が自発的に行動できる デメリット 運用などの担当者が必要で担当者がかたよる スクラム体制について 1スプリント2週間、クロージング1週間とする プロダクトオーナー スクラムマスター(自分) 開発チーム4人 ミドルエンジニア 若手ベトナムエンジニア 新卒ベトナムエンジニア 新卒エンジニア スプリント振り返り 1月中旬から始めて3スプリントを実施した。 スプリント1(1/16〜1/27) 機能概要 データ解析+グラフ化 Good/Keep 設計レビューにより実装前の軌道修正ができる 開発チーム+スクラムマスターのレビューにより各自の実装の認識をあわせる プロダクトオーナーレビューにより更に違った目線からの指摘があり最終的な実装の認識をあわせる 設計段階で認識を合わせることにより品質があがる為トータルコストがよい 画面を伴う機能は特に設計レビューによる効果が大きい 設計レビューでアウトプットの認識があうのでビジネスへのアプローチがしやすくなる テスト環境すら整ってない新卒エンジニアがモックテストまでできるようになった 局所的なハンズオンやペアプロは効果が高い スクラムは各自のスキルアップに効果的 Problem プロダクトオーナーとスクラムマスター以外がスクラムの取り組みにおいて受動的 ドキュメント・テストケースの書き方の各自の認識が違う Trelloの更新がうまくできなかった JavaScript処理が複雑 Try GitFlowに切り替えるにあたりバージョニングを検討した セマンティックバージョニングにしたかったがメンバー全員に周知し徹底することが難しいと判断し文字列でタグ付けすることとした チームメンバ全員がモックを使ったPHPUnitが書けるようになったので全員UTを書く開発体制にした ドキュメントの書き方の認識をあわせた JavaScriptの構成やフレームワーク変更を検討する スプリント2(2/6〜2/17) 機能概要 画面レイアウト変更 レポート系 Good/Keep クロスブラウザ・端末テストなどマンパワーを要するテストをみんなで分担してできる為テストが楽で早く終えられる チームメンバー全員がモックテストがかけて開発コードのほとんど(不要な部分は除く)のカバレッジをカバーできている 設計レビューの恩恵 要件定義時に認識があっていたと思っても設計すると認識がずれていたりするがレビューの中で最適な解を見つけることができる 実装前のレビューで懸念点をつぶしてながら設計できるのが気持ちいい 実装前にの実装イメージが具体的に湧く為テストが書きやすい 設計後実装の分担をするとテストを先に書けるケースが出てくる 開発チームが各自自発的に行動するようになった Problem ドキュメント作成に時間がかかる コーディングスタイルの指摘が多い 最初に作成したスプリントバックログの作業量をオーバーした タスクの粒が大きいと初日のスプリントバックログ作成の時間だけでは正確な見積もりができないことがわかった Try 計画会議とプロダクトバックログ作成を1日で実施した 翌日以降の個人の動きが明確になり個々人が個別に自主的に動ける デイリースクラムにスクラムマスターが参加しないようにした コードフォーマットチェック(php-cs-fixer)をgitのpre-commitに導入した php-cs-fixer導入参考ブログ WIPを導入した 次回以降はもっとIF・クラス設計に重点を置いて開発する方針にした スプリント3(2/27〜3/10) 機能概要 機能の外部埋込プラグイン Good/Keep 失敗覚悟でギリギリのベロシティのタスクを設定したところ色々新しい課題がみえた 開発メンバ各自の実機テスト環境を改善した 既存バグの修正ができた 課題 タスクの難易度があがるとコミュニケーションコストがかなり高くなる 受け入れ条件の範囲を超えた作業をした為余計に時間を費やした 2週間という期間にしばられて品質を落とす形になった コミュニケーションコストを見積もりに入れてなかった …

PHPUnitのモックオブジェクトの使い方を仕組みから理解する

前回はPHPUnitのメイン処理を確認しました。今回はPHPUnitデフォルトのモックオブジェクトの仕組みを確認してみます。公式ドキュメントでは、第9章 テストダブルが該当箇所となります。 PHPUnitのモックオブジェクトについて PHPUnitは以下のような構成ですが、その中の「phpunit-mock-objects」がPHPUnitデフォルトのモックライブラリとなります。 phpunitphp-code-coveragephp-file-iteratorphp-text-templatephp-timerphp-token-streamphpunitphpunit-mock-objects ← これ 構成 PHPUnitモックオブジェクトのファイル構成は以下の通りです。 ├── Builder │   ├── Identity.php │   ├── InvocationMocker.php │   ├── Match.php │   ├── MethodNameMatch.php │   ├── Namespace.php │   ├── ParametersMatch.php │   └── Stub.php ├── Exception │   ├── BadMethodCallException.php │   ├── Exception.php │   └── RuntimeException.php ├── Generator │   ├── deprecation.tpl.dist │   ├── 省略… ├── Generator.php ├── Invocation │   ├── Object.php │   └── Static.php ├── Invocation.php ├── InvocationMocker.php ├── Invokable.php ├── Matcher │   ├── AnyInvokedCount.php │   ├── AnyParameters.php │   ├── ConsecutiveParameters.php │   ├── Invocation.php │   ├── InvokedAtIndex.php │   ├── InvokedAtLeastCount.php │   ├── InvokedAtLeastOnce.php │   ├── InvokedAtMostCount.php │   ├── InvokedCount.php │   ├── InvokedRecorder.php │   …

[Golang]Goのio/ioutilパッケージは分かりやすくて使いやすい

Goのioパッケージは主にインターフェースになっていて他のパッケージで多く実装されています。またioパッケージにもパブリックな関数がありファイルの入出力はできますが少し細かい処理になります。io/ioutilパッケージを使うとファイルの入出力処理が簡単にできます。以下にio/ioutilパッケージを使った処理とそれに対するテストコードを記載します。 io/ioutil/ioutil.go ReadAll() func ReadAll() string { file, _ := os.Open(“testdata/src.txt”) b, _ := ioutil.ReadAll(file) return string(b) } ReadAllテスト func TestReadAll(t *testing.T) { str := ReadAll() if str != “0123456789” { t.Errorf(“TestReadAll Error. %s”, str) } } ReadFile() func ReadFile() string { b, _ := ioutil.ReadFile(“testdata/src.txt”) return string(b) } ReadFileテスト func TestReadFile(t *testing.T) { str := ReadFile() if str != “0123456789” { t.Errorf(“TestReadAll Error. %s”, str) } } WriteFile() func WriteFile() string { b := []byte(“0123456789”) _ = ioutil.WriteFile(“testdata/dst.txt”, b, os.ModePerm) b, _ = ioutil.ReadFile(“testdata/dst.txt”) return string(b) } WriteFileテスト func TestWriteFile(t *testing.T) { str := WriteFile() if str != “0123456789” …

Rust をはじめてみよう!

Rust をはじめてみよう!ということで Rust をはじめてみました。 Rust ってなに? Rust言語は速度、並行性、安全性を言語仕様として保証するC言語、C++に代わるシステムプログラミング(英語版)に適したプログラミング言語を目指している[4]。2006年の開発初期はグレイドン・ホアレの個人プロジェクトだったが、2009年にMozillaが開発に関わり始めてMozilla Researchの公式プロジェクトとなった 参考 : Rust (プログラミング言語) – Wikipedia また、公式ドキュメントが充実しているのでそちらをみれば大体分かるようになっています。 特徴 ゼロコスト抽象化 ムーブセマンティクス 保証されたメモリ安全性 データ競合のないスレッド トレイトによるジェネリクス パターンマッチング 型推論 最小限のランタイム 効率的なCバインディング インストール rustup を使ってインストールします。 $ curl https://sh.rustup.rs -sSf | sh 実行すると以下のように言われるので設定を反映させます。 To get started you need Cargo’s bin directory ($HOME/.cargo/bin) in your PATH environment variable. Next time you log in this will be done automatically. To configure your current shell run source $HOME/.cargo/env $ cargo command not found: cargo $ source $HOME/.cargo/env $ cargo –version cargo 1.29.0 (524a578d7 2018-08-05) rustc というのコンパイラもインストールされます。 $ rustc –version rustc 1.29.1 (b801ae664 2018-09-20 rustc を使って Hello, World! まずは rustc を使って Hello, …