リスト
- RDRA
- Internet Identity
- Dfinity
- DMail
- クソコードはクソコーダーを量産する
- モブ性
多分デッドリンク PCでリンク取得できず。。
Twitter space
R As Well (@Luzwell) | Twitter
あんまりちゃんと聞けていなかったけれど、すごく気になるタイトルなので、自分でもここにまとめていきたいと思った。
この記事はペアプロ・モブプロ、テストコードあり、スクラム開発、CI/CD環境あり、マイクロサービスアーキテクトで開発している際に 詳細な設計書等がなくてもうまく回っていくのはなぜなのかを探るため、日々気づいたことを書きためておくための記事となる。 なので気づきがあれば更新をする。
プロダクト内で
なぜうまく回るかわからないが体制が良く変わる
ただ、ジョブ型で対応していて必要な体制に柔軟に変わっていく。
プロダクト会
チーム会(改善系、新規開発系、プロジェクト系)などの分類
プロダクト内でのバックエンド定例、FEBFF会 VD会
各チームの朝会
各層でのレトロスペクティブ
相談事をやろうと思えばできる場が用意されている。
個人が上位チームへ進言しやすい環境の一つであると考えられる。
体制とスプリントが決定した後に人員が別チームに移動になり、結果、チーム内でタスクを扱うことができる人員が存在しなくなり、別チームが受け持つ必要が生まれた。
スプリント進行中に裏での引継ぎ、調整が発生し、メンバーからの不満の声も漏れた。
プラスアルファでこのとき、プルリクエスト途中のタスクがある状態で別チームに人員が回るような状態も発生し、チーム間でのやり取りタスクの引継ぎが発生したときに
弱い組織状態であることが判明。チーム間のやりとりは少ない方が良い?
なぜこれがあるのか、どういうところにそれを感じるのかを記述すること。
以下から思い出しました。
エンジニア「企画の段階でエンジニアを巻き込んで欲しい」
— izm (@izm) October 20, 2021
デザイナー「企画の段階でデザイナーを巻き込んで欲しい」
法務「企画の段階で法務を巻き込んで欲しい」
広報「企画の段階で広報を巻き込んで欲しい」
って感じの事を大体聞くので、企画の時点で他職種との雑談しやすさが大事説を提唱します
上記結果的に進行がスムーズ
マージボタン押すだけ。
あとはyaml定義に沿ってデプロイ。
社員以外もデプロイしている。
レビューは2人以上で可
社員以外の場合社員に最低一人はaprove貰う必要があるが、かなりカジュアル。
タスクを分割してチケットを作成する。
上記を行うことで何が良くなるのかわからないが、どういう風に進行しているかを周囲の人間が認識しやすくTeamを横断したチェックが入りやすくなる。
また、チェックをする敷居が低くなる?何をしているかが一定数の人間に伝播するためであると思われる。
チケットにはゴールを書くこと。
定量的なものでなくともよい。
気軽なチケット作成で多くの人に状況が伝播しやすい環境の効果があると思われる。
単純にTDDにすることで不要なドキュメントが減る。
TDD実施することで、設計も同時にできるため。
リファクタリングや機能追加も割合容易にできるためよく回る。
情報の開示-情報の共有-疑問点または心のもやもやの解消を行うことで、互いに信頼、知識や状況の把握があることによる安心感を得られ心理的安全性を本来の意味でのチームの中で得ることができる。 分断した話し合いを行うことは情報の伝達効率が悪く、解釈と思い込みが発生し、コミュニケーション摩擦により心が摩耗する。しんどくなる。そして、モブ性に甘えるという本来の性分に落ちて情報の非対称性が生まれてお互いのことを理解できなくなり、開発チームと企画チームまたはもっと細かい粒度でチームが分断し、本来の目的を見失う。個々の目的を達成するために企画と開発が対立して心理的安全性は下がる。 個々の目的は達成しているが、余計な労力もしていて、真の目的を達成できなくなる。 本来サービスを届けるチームなんだけどな。。 モブ性に甘えるのはよくある平均的な人間だと思う。人が落ちていかないように場を作ることは大切。 仕組み上分断していたチームも場を提供することで生き生きとしている場面を見たときに思ったこと。 上のことをやったときにスクラムマスタの存在は不在だった。 存在させたら何か変わるような気がする。スクラムマスタの役割を学習して今のチームにぶち込んで何がどう変わるのかを確認してみようと思う。 ※心理的安全性が下がるはいいかえると不安になる。ということ。話す場を提供して情報を共有することで別の役割の人間に安心を提供できるという話。
あると思っていなかったが、上位の企画者から指摘が入ったため画面仕様の打ち合わせと企画立案使用策定会議が発生した。 これがなぜ発生したか。。? これが発生する段階は正しかったのか? これが発生したのは巻き込みが少なかったからか? なぜか問題は何だったか自分の中で整理できていない。 だが、一旦入ってもらっていないチームにも定期開催の会議に入ってもらうことにした。 自律的に能動的に動けているのチームとしては機能しているがプロダクトをチームが所有していない事態ではあったと思われる。 もう少し精査が必要。 あ時になるのは、可逆的な判断は、少人数または、個人が決定するべきとある。 迅速に判断が行えるから。今こうやって関係者の巻き込みを増やしていく状態は正しいだろうか?という懸念がある。。。 様子を見る。上記の仕様変更に伴う時間は計上され、仕様変更による工数はプラスアルファされたことはきちんと押さえたいポイント。 ただアジャイルであるなら一旦機能の分割投入を検討するくらいの冷静さが欲しいがもう少し意見を聞いて様子見したい。
ここまでうまく回るが何かをうまく定義できていなかった 自律的に立ち回れ、課題を改善しながら良いプロダクトに進んでいけるチームがうまく回っている状態なのかなと思う。。健康には気を付けた行動することは絶対条件(保留)
大きなフィードバックループをしているうちは、問題が表面に現れてから問題に対応することになってチーム自体が疲弊して、チーム内の余計な不信感、疑念、疑惑が発生してしまう。 結果、炎上しうまくいかない。
再考するべき。
ペアワークのメリット チームへの信頼感が無い状態の時に、カジュアルに聞ける環境構築できるので、できる人でも実直にやるしかないと思えること。 不安な時間減少と調査時間、諦める時間などが減少するので効果的。 ペアプロよりもカジュアル。カジュアルに技術を伝播できる。ペアプロだと画面凝視して疲れる。 ペアプロでは発生しづらい思い付きの発露、アイデアの種うえ、雑談が少ない問題の解決につながる。 これは試していないが横断的領域においても効果は発揮するのではないかと予測する。 ペアプロだと横断的な領域での実現は厳しいが別分野でも同じチームで作業する場合余移行が生まれるかもしれない 単純に仕事に対する心理額の専門用語でいうところの強化も発生するだろう。
起点ブランチを最新の状態にする
起点ブランチに問題がないか確認(動作確認 UT実行)
派生ブランチをremoteにpushしておく。(保険)
派生ブランチのコミットの量が多いときはコミットを一つにまとめる。
派生ブランチに問題がないか確認する(動作確認 UT実行)
問題がある場合localのブランチを消して、remoteブランチをlocalにcheckoutする
派生ブランチをremoteにpushしておく。(保険)
派生ブランチで起点ブランチのrebaseを行う
コンフリクトがある場合解消する
コンフリクトを解消できない場合はrebaseを取り消す。
rebase後に問題がないか確認(動作確認 UT実行)
問題がない場合remoteにpushする。
問題がある場合localのブランチを消して、remoteブランチをlocalにcheckoutする
push後起点ブランチにプルリクエストする。
Heroku(ヘロク)は2007年創業のアメリカ合衆国の企業[1]。また、同社が開発と運営を行っているPaaS(Platform as a Service)の名称でもある[1]。2010年にはセールスフォース・ドットコムに買収された
via Wikipedia
wikipediaには他にも色々記載されていますが 今回の記事に一番近い解釈は アプリケーションを実行するための環境です。 以下が機能になります。 - 簡単なデプロイ - ホスティング - プラグインによるDB/キャッシュサーバ/その他ミドルウェアの利用 - プラグインの追加によるCI/CD - 多くの言語をサポートしています。
Windows10 Pro IntelliJ IDEA 2021.1 (Ultimate Edition)
Gitインストールと初期設定済みであること
- Git DL
- WindowsのPath設定済みであること
HerokuCLI
- Heroku CLI DL
- WindowsのPath設定済みであること
Herokuのサービスにサインアップ済みであること
- Heroku sign up
主要素 | 項目 | バージョン |
---|---|---|
言語 | OpenJDK | 8 |
FW | SpringBoot | 2.4.6 |
ビルドツール | Gradle | 6.8.3 |
まずはじめにログインします。
Pathが通っている場合は、任意のディレクトリ。 C:\Program Files\Heroku\bin
Microsoft Windows [Version 10.0.19042.964] (c) Microsoft Corporation. All rights reserved. C:\Users\nyx>heroku login » Warning: Our terms of service have changed: https://dashboard.heroku.com/terms-of-service heroku: Press any key to open up the browser to login or q to exit: Opening browser to https://cli-auth.heroku.com/auth/cli/browser/0b9f3c5d-103a-4271-91e0-85de0fdc381d?requestor=SFMyNTY.g2gDbQAAAAw2MC4xMTQuODIuNThuBgCGOBVSeQFiAAFRgA.frwzQ3iadLy_hiZ_ojUewt7PhVCkSredHjjb4pDjnnM Logging in... done Logged in as *********@gmail.com C:\Users\nyx>
好きな方法で簡単なアプリを作成します。
いくつか方法があるので列挙していきます。
1. Spring Initializrでアプリを作成する。
2. ローカルでビルドツールを実行してアプリを作成する。Gradle,Mavenなど
3. IDEの機能を使って作成する。
今回は、3の方法でサンプルを作りました。
詳細は後述します。
作成したサンプルプロジェクトをgitで管理します。
#project folder git init git add . git commit -m"first commit"
heroku create
参考はこちら
# 自分が作成したアプリを管理しているブランチがmasterブランチなのでmasterを指定している。 git push heroku master
ブラウザでログに出力されたURLにアクセスして下記のように表示されたら成功です。
Heroku公式チュートリアル
Heroku公式 Intoroduction
Heroku java support
Heroku CLI
https://github.com/rami2076/heroku_getting_start_v8
C:\Users\nyx\IdeaProjects\heroku_java8_get_start>tree フォルダー パスの一覧: ボリューム Windows ボリューム シリアル番号は 3A86-E7F1 です C:. ├─.gradle │ ├─6.8.3 │ │ ├─fileChanges │ │ ├─fileHashes │ │ └─vcsMetadata-1 │ ├─buildOutputCleanup │ ├─checksums │ ├─configuration-cache │ └─vcs-1 ├─.idea ├─gradle │ └─wrapper └─src ├─main │ ├─java │ │ └─com │ │ └─nyx │ │ └─heroku_java8_get_start │ └─resources │ ├─static │ └─templates └─test └─java └─com └─nyx └─heroku_java8_get_start
4. gitignoreの追加 gitignore.io 5. クラスファイルの追加
package com.nyx.heroku_java8_get_start; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * Index Rest Controller */ @RestController public class IndexRestController { /** * 最初のメッセージを返却する * * @return {@code "Hello World!"} */ @GetMapping(path = "/", produces = MediaType.TEXT_PLAIN_VALUE) public String firstMessage() { return "Hello World!"; } }
http://localhost:8080/
実行結果
Microsoft Windows [Version 10.0.19042.964] (c) Microsoft Corporation. All rights reserved. C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git status On branch master No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: .gitignore new file: build.gradle new file: gradle/wrapper/gradle-wrapper.jar new file: gradle/wrapper/gradle-wrapper.properties new file: gradlew new file: gradlew.bat new file: settings.gradle new file: src/main/java/com/nyx/heroku_java8_get_start/HerokuJava8GetStartApplication.java new file: src/main/java/com/nyx/heroku_java8_get_start/IndexRestController.java new file: src/main/resources/application.properties new file: src/test/java/com/nyx/heroku_java8_get_start/HerokuJava8GetStartApplicationTests.java C:\Users\nyx\IdeaProjects\heroku_java8_get_start>heroku login heroku: Press any key to open up the browser to login or q to exit: Opening browser to https://cli-auth.heroku.com/auth/cli/browser/35e5c2b9-66ec-43e9-a665-1aab6ea3b21e?requestor=SFMyNTY.g2gDbQAAAAw2MC4xMTQuODIuNThuBgCXfRlSeQFiAAFRgA.9v7aHnbs9ezqvPQIQpwPzTqJwUWgwe6XSkV261ritZY Logging in... done Logged in as *********@gmail.com C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git branch -a C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git branch C:\Users\nyx\IdeaProjects\heroku_java8_get_start> C:\Users\nyx\IdeaProjects\heroku_java8_get_start> C:\Users\nyx\IdeaProjects\heroku_java8_get_start> C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git status On branch master No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: .gitignore new file: build.gradle new file: gradle/wrapper/gradle-wrapper.jar new file: gradle/wrapper/gradle-wrapper.properties new file: gradlew new file: gradlew.bat new file: settings.gradle new file: src/main/java/com/nyx/heroku_java8_get_start/HerokuJava8GetStartApplication.java new file: src/main/java/com/nyx/heroku_java8_get_start/IndexRestController.java new file: src/main/resources/application.properties new file: src/test/java/com/nyx/heroku_java8_get_start/HerokuJava8GetStartApplicationTests.java C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git commit -m"add:first commit." [master (root-commit) 86a803b] add:first commit. 11 files changed, 397 insertions(+) create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/com/nyx/heroku_java8_get_start/HerokuJava8GetStartApplication.java create mode 100644 src/main/java/com/nyx/heroku_java8_get_start/IndexRestController.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/com/nyx/heroku_java8_get_start/HerokuJava8GetStartApplicationTests.java C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git status On branch master nothing to commit, working tree clean C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git branch * master C:\Users\nyx\IdeaProjects\heroku_java8_get_start>heroku login heroku: Press any key to open up the browser to login or q to exit: Opening browser to https://cli-auth.heroku.com/auth/cli/browser/b74c0c51-b57e-409d-91ec-f246db68c152?requestor=SFMyNTY.g2gDbQAAAAw2MC4xMTQuODIuNThuBgB4bhtSeQFiAAFRgA.g1afhoARe7TWuD-J0rz82oycjF-3s3zFL4G6dDfQ7j0 Logging in... done Logged in as *********@gmail.com C:\Users\nyx\IdeaProjects\heroku_java8_get_start>heroku create Creating app... done, ⬢ sample-userland-****** https://sample-userland-******.herokuapp.com/ | https://git.heroku.com/sample-userland-******.git C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git branch -a * master C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git remote -v heroku https://git.heroku.com/sample-userland-******.git (fetch) heroku https://git.heroku.com/sample-userland-******.git (push) C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git status On branch master nothing to commit, working tree clean C:\Users\nyx\IdeaProjects\heroku_java8_get_start>git push heroku master Enumerating objects: 27, done. Counting objects: 100% (27/27), done. Delta compression using up to 4 threads Compressing objects: 100% (18/18), done. Writing objects: 100% (27/27), 57.95 KiB | 6.44 MiB/s, done. Total 27 (delta 0), reused 0 (delta 0) remote: Compressing source files... done. remote: Building source: remote: remote: -----> Building on the Heroku-20 stack remote: -----> Determining which buildpack to use for this app remote: -----> Gradle app detected remote: -----> Spring Boot detected remote: -----> Installing JDK 1.8... done remote: -----> Building Gradle app... remote: -----> executing ./gradlew build -x check remote: ./gradlew: 39: cd: can't cd to "./ remote: Downloading https://services.gradle.org/distributions/gradle-6.8.3-bin.zip remote: ..........10%..........20%..........30%...........40%..........50%..........60%..........70%...........80%..........90%..........100% remote: To honour the JVM settings for this build a single-use Daemon process will be forked. See https://docs.gradle.org/6.8.3/userguide/gradle_daemon.html#sec:disabling_the_daemon. remote: Daemon will be stopped at the end of the build remote: > Task :compileJava remote: > Task :processResources remote: > Task :classes remote: > Task :bootJarMainClassName remote: > Task :bootJar remote: > Task :jar SKIPPED remote: > Task :assemble remote: > Task :build remote: remote: BUILD SUCCESSFUL in 37s remote: 4 actionable tasks: 4 executed remote: -----> Discovering process types remote: Procfile declares types -> (none) remote: Default types for buildpack -> web remote: remote: -----> Compressing... remote: Done: 66.4M remote: -----> Launching... remote: Released v3 remote: https://sample-userland-******.herokuapp.com/ deployed to Heroku remote: remote: Verifying deploy... done. To https://git.heroku.com/sample-userland-******.git * [new branch] master -> master C:\Users\nyx\IdeaProjects\heroku_java8_get_start>
動作確認画面
- ログに記載されたデプロイ先のURLをコピーしてブラウザからアクセスして動作確認を実施
https://git.heroku.com/sample-userland-******
C:\Program Files\Heroku\bin
基本的に最新のドキュメントは以下になります。
https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/spring/azure-spring-boot-starter-active-directory
上記をMSのドメイン内で表示しているのが以下になります。(画像が表示されない。)
https://docs.microsoft.com/en-us/java/api/overview/azure/spring-boot-starter-active-directory-readme?view=azure-java-stable
ただし、上の設定だけだと不十分で過去の情報も併せて読む必要があります。
以下、過去のチュートリアルのAzureAD側の設定が参考になります。
https://docs.microsoft.com/en-us/azure/developer/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-active-directory
ただ、参考にするべき画像の内容が異なる。
最低限必要なスコープの情報が古いままとなっている。スコープとしてDirectory.AccessAsUser.Allを割り当てる必要があり、この権限はサインインしたユーザが存在しているディレクトリと同じ階層のユーザ情報にすべてアクセスすることができる権限となっている。上長に不信感を与えて両省が下りない状態となる。AzureAdversion3.1.0までこの状態で、3.2.0からDirectory.Read.Allとなり、サインインしたユーザの情報を読み取ることのみができる権限のみ必要な状態となる。
なので、画像は間違いで、Directory.Read.Allを設定する必要があることになる。
バージョンによって異なると思われるので詳細は以下ファイルを確認すること。
スコープに関する記事 現状正しい情報を確認可能
https://docs.microsoft.com/en-us/graph/permissions-reference
ログイン時に必要に必要となるredirect-uriの制約(設定の変更はできないが認識する必要がある。)
サーバ側(AzureAD本体)のredirect-uriの設定を追加する必要がある。
この時に制約を知っておく必要がある。
https://docs.microsoft.com/en-us/azure/active-directory/develop/reply-url
AzureADにはグループを認可局として扱うことができる機能がある。
認可局として扱う場合は、Springにはグループを設定する必要がある。
また、Spring側の設定にグループを追加する必要がある。
グループを設定したくない場合はAzureADのサーバ側に疑似的なグループを設定する必要がある。
また、session-statelessの設定を追加する必要がある。
https://docs.microsoft.com/en-us/java/api/overview/azure/active-directory-spring-boot-starter-readme?view=azure-java-stable
SSOをAzureADが担保するためにアプリ側でセッションが切れている場合に通常のログアウトを行っても、AzureADサーバが担保するexpireの時間以内の場合は、自動的にログインした状態となる。ここを制御するためには、ログアウトのURLを設定する必要がある。
ログアウトについては以下を参考にする。
https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-web-app-sign-user-sign-in?tabs=java
特にURLが要//login.microsoftonline.com/common/oauth2/v2.0/logout
最新リリースのソースを追う
下記ファイルの履歴やblameを確認して最新バージョン又はリリースバージョンのリビジョンを見つけることで特定のバージョンのソースを確認できる。
https://github.com/Azure/azure-sdk-for-java/blob/28993948d2cf44e1c2a13ff46120767ca232294f/sdk/spring/azure-spring-boot/pom.xml#L16
3.4.0リビジョンのソースは下記
https://github.com/Azure/azure-sdk-for-java/commit/a04075d5ce607d79d0b273b42b579b184dd0197d
認証のみの履歴を追う場合は、下記パッケージ配下の履歴だけを見れば十分追うことができる。
https://github.com/Azure/azure-sdk-for-java/commits/master/sdk/spring/azure-spring-boot/src/main/java/com/azure/spring/aad
リリースの状態を知りたいときは下記
https://github.com/Azure/azure-sdk-for-java/blob/master/sdk/spring/azure-spring-boot/CHANGELOG.md
Springbootとのバージョンの関係を知りたい場合は下記
https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/spring/README.md
Spring Initializrの状態を知りたい場合は下記だが、更新が遅れる場合がある。
https://github.com/Azure/azure-sdk-for-java/blob/master/sdk/spring/spring-reference.yml
spring-oauth2のデフォルトだけで対応できるソーシャルサービスの場合は、redirect-uriの設定を一部変更可能
spring-azure-active-directoryの場合は、変更は不可
サーバ側(AzureADの本体側)のredirect-uriの設定は変更ができる。
ログアウトの設定もデフォルトのSpringのとは逸脱している注意が必要
SpringOAuth2のデフォルトカスタマイズ情報。AzureADの認証にはほとんど使えないが、考え方は参考に独自内部認証サービスを作成する場合や、SpringSecurityの大枠を知るためには読む必要がある。
https://docs.spring.io/spring-security/site/docs/5.2.x/reference/html/oauth2.html