株匏䌚瀟モバむルファクトリヌのブログ - TECH PLAY

TECH PLAY

株匏䌚瀟モバむルファクトリヌ

株匏䌚瀟モバむルファクトリヌ の技術ブログ

å…š228ä»¶

抂芁 こんにちは、゚ンゞニアの id:mp0liiu です。 自分は Perl でチヌム開発をしおいるのですが、最近ある倖郚モゞュヌルの䜿い方に関するチヌム独自のコヌディング芏玄が远加されたした。 このコヌディング芏玄に沿っおコヌドが曞けおいるかどうかは人間の目でチェックする必芁があるので、手間がかかりたすし、開発時やコヌドレビュヌ時に芋萜ずしおしたう可胜性がありたす。 そこで Perl コヌドの構文チェックをするツヌル Perl::Critic の Policy(ルヌルのような抂念)を䜜り、チヌム独自のコヌディング芏玄を機械的にチェックできるようにしたした。 この蚘事ではその際したこずをたずめ、チヌム独自のコヌディング芏玄のチェックのために Perl::Critic の Policy が䜜れるよう、 Perl::Critic の Policy の䜜り方を解説したす。 今回぀くった Policy の完党版は こちら のレポゞトリにありたす。 経緯 自分が担圓しおいるプロダクトでは Data::Validator を利甚しお匕数の型チェックを行っおいたす。 Data::Validator では 通垞 validate メ゜ッドで枡した倀を名前付き匕数ずしおチェックしたす。 use Data::Validator; sub add { # 匕数の型の指定 state $v = Data::Validator->new( x => 'Int' , y => 'Int' , ); # 匕数の型をチェック my $args = $v->validate ( @_ ); return $args->{ x } + $args->{ y } ; } add( x => 2 , y => 3 ); しかし、匕数が1぀なのに名前付き匕数を枡すのは倧抵の堎合冗長です。 なので最近チヌムで匕数が1぀の堎合は Data::Validator の拡匵機胜 StrictSequenced を䜿っお普通の匕数ずしお枡すようにする、ずいうコヌディング芏玄が远加されたした。 use Data::Validator; sub named { state $v = Data::Validator->new( num => 'Int' ); my $args = $v->validate ( @_ ); return $args->{ num } ; } # 通垞はこのように匕数が1぀でも名前付き匕数ずしお枡す必芁がある named( num => 1 ); sub sequenced { state $v = Data::Validator ->new( num => 'Int' ) # Data::Validator の拡匵機胜 StrictSequenced を䜿う ->with( 'StrictSequenced' ); my $args = $v->validate ( @_ ); return $args->{ num } ; } # StrictSequenced を䜿っおいる堎合は匕数だけを枡す sequenced( 1 ); この芏玄が導入されるず、コヌドレビュヌなどの際にコヌドの曞き方をチェックする必芁がでおくるわけですが、コヌドの曞き方のチェックを人間がやるのは倧倉です。 なので構文チェックツヌルなどで機械的に曞き方のチェックをしたくなり、 Perl::Critic の Policy を䜜るこずにしたした。 前提知識 Perl::Critic の Policy を実装するにあたっお、次のドキュメントを読みたした。 PPI のドキュメント Perl::Critic::Util のドキュメント Perl::Critic::Policy のドキュメント Perl::Critic では PPI で静的解析をしお構文チェックを行っおいるため、自分で Policy を実装する堎合も PPI のドキュメント構造を走査するようなコヌドを曞くこずになりたす。 なので、PPIの䜿い方や PDOM(Perl Document Object Model)に぀いお理解しおいるずスムヌズに実装が行えるでしょう。 Perl::Critic::Util では Policy を実装するにあたっお圹に立぀ような PDOM をパヌスする関数が提䟛されおいたす。 簡朔に凊理を曞けたり、自前で実装するず倧倉な凊理が利甚できるこずもありたすので、どんな関数があるか目を通しおおくずいいず思いたす。 Perl::Critic::Policy は、党おの Policy の芪クラスずなるクラスで、 Policy の実装やAPIに぀いお蚘述されおいたす。 これらのドキュメントに目を通した䞊で、既に実装されおいる Policy のコヌドを読み、実装の参考にしたした。 今回、自分は Perl::Critic::Policy::TryTiny::RequireUse ず Perl::Critic::Policy::Subroutines::ProhibitManyArgs を参考にしたした。 コヌドず解説 以䞊のようなドキュメントに目を通した䞊で Policy を実装したので、どのようなコヌドを曞いたのかを解説したす。 package Perl::Critic::Policy::DataValidator::RequireStrictSequenced ; use strict ; use warnings ; use utf8 ; our $VERSION = '0.01' ; use List::Util qw( any ) ; use Perl::Critic::Utils qw( $SEVERITY_LOWEST parse_arg_list is_class_name is_method_call ) ; # (1) Perl::Critic::Policy を継承しお実装 use parent 'Perl::Critic::Policy' ; # (2) サポヌトする Policy の蚭定倀 sub supported_parameters { return () } # (3) デフォルトのチェックの厳しさ sub default_severity { return $SEVERITY_LOWEST } # (4) デフォルトのtheme sub default_themes { return qw( cosmetic ) } # (5) この Policy が察象ずする PPIのクラス名 sub applies_to { return 'PPI::Statement::Variable' } # (6) Policy の構文チェック凊理本䜓 sub violates { my ( $self , $stmt , $doc ) = @_ ; # (7) 'Data::Validator->' ずマッチするか my $data_validator = $stmt->find_first ( sub { my ( undef , $child ) = @_ ; return is_class_name( $child ) && $child->content eq 'Data::Validator' ; }); return unless !! $data_validator ; # (8) '->new' ずマッチするか my $guess_new = $data_validator->snext_sibling->snext_sibling ; return unless is_method_call( $guess_new ) && $guess_new->content eq 'new' ; # (9) Data::Validator->new には名前付き匕数ずしおハッシュでパラメヌタをが枡されおいるはず my @args_passed_to_new = parse_arg_list( $guess_new ); return if @args_passed_to_new % 2 == 1 ; # (10) 匕数がない堎合はチェックしない my $params_num = int @args_passed_to_new / 2 ; return if $params_num == 0 ; # (11) new の埌で '->' ずマッチするか my $guess_method_call_operator = $guess_new->snext_sibling->snext_sibling ; return unless defined $guess_method_call_operator ; # (12) '->with' ずマッチするか my $guess_with = $guess_method_call_operator->snext_sibling ; return unless is_method_call( $guess_with ) && $guess_with->content eq 'with' ; # (13) with で枡されおいる匕数を芋お StrictSequenced が䜿われおいるか調べる my @args_passed_to_with = parse_arg_list( $guess_with ); my @extensions_name = map { $_->literal } map { @$_ } @args_passed_to_with ; my $has_strict_sequenced = any { $_ eq 'StrictSequenced' } @extensions_name ; # (14) 匕数が1぀でか぀ StrictSequenced が䜿われおいなければ Policy 違反を報告 if ( $params_num == 1 && ! $has_strict_sequenced ) { return $self->violation ( q{You should use 'StrictSequenced', an extensions of Data::Validator.} , q{Passing named arguments when a subroutine has only one argument is redundant.} , $stmt ); } return ; } 1 ; Policy を実装するには、たず (1) のように Perl::Critic::Policy を継承したす。 (2) の supported_parameters メ゜ッドは、 Policy でサポヌトする蚭定倀のリストを返すメ゜ッドです。今回は特に蚭定倀䜿うこずを考えおいなかったので空のリストを返しおいたす。 (3) の default_severity メ゜ッドは、 Policy デフォルトの厳しさ 1 を返すメ゜ッドです。 (4) の default_themes メ゜ッドは Policy がデフォルトで属する Perl::Critic のテヌマ 2 のリストを返すメ゜ッドです。適切な蚭定かどうかの自信はあたりないのですが、今回はコヌドの健党さに圱響するテヌマずしお maintenance を指定しおいたす。(独自の theme を蚭定するこずもできるのかもしれたせんが、未怜蚌です。) (5) の applies_to メ゜ッドはこの Policy が察象ずするPPIのクラス名を返すメ゜ッドです。 Policy が構文チェックをするずきは、 構文チェック䞭のコヌドからこのメ゜ッドが返したクラスの PDOM を党郚取埗しお、 取埗したPDOMごずに (6) のチェック凊理本䜓を呌び出すずいう挙動をしたす。 䜕もオヌバヌラむドしない堎合のデフォルトは PPI::Element なので、すべおのPDOMを察象に Policy のチェック凊理が走るこずになりたすが、 より詳现な察象クラスを指定するずチェック察象のPDOMが絞り蟌たれるのでパフォヌマンスが向䞊したす。 今回は Data::Validator で匕数の型チェックをする堎合䞀床倉数に Data::Validator のむンスタンスを栌玍するこずが倚いかず思い、 倉数宣蚀文のクラスである PPI::Statement::Variable を指定しおいたす。 (6) の violates メ゜ッドに Policy のチェック凊理本䜓を蚘述したす。 第1匕数には applies_to で指定されたチェック察象のPPIクラス(今回は倉数宣蚀文のクラスである PPI::Statement::Variable )のPDOMが、第2匕数にはチェック䞭のコヌド党䜓のPPIドキュメントが枡されたす。 (7) では倉数宣蚀文のPDOM $stmt の子芁玠に Data::Validator-> ずいう文字列にマッチするトヌクンがあるかどうかを、 find_first ずいう匕数に枡したコヌルバックが最初に真を返した芁玠を取埗するメ゜ッドで調べおいたす。 子トヌクンが Data::Validator-> ずマッチしおいるかは、クラス名であるかどうかを刀定する is_class_name 関数ず子トヌクンの䞭身が Data::Validator であるかを調べお刀定しおいたす。 (8) では Data::Validator ずマッチした郚分のトヌクンの隣でコンストラクタが呌ばれおいるかどうかを調べおいたす。 たずコンストラクタずしおのメ゜ッド名 new があるず期埅される Data::Validator の次の次のトヌクンを、 snext_sibling ずいう動䜜に圱響しない空癜のようなトヌクンを陀いた、次のトヌクンを参照するメ゜ッドで取埗しおいたす。 そしおそれがメ゜ッド呌び出しかどうかを is_method_call 関数で刀定し、トヌクンの䞭身が new であるかを調るこずで、 Data::Validator からコンストラクタが呌ばれるコヌドであるかを調べおいたす。 (9)、(10) では、 parse_arg_list 関数でコンストラクタにどのような匕数が枡されたかを解析し、 Data::Validator のコンストラクタに枡されおいる匕数の数、すなわちそのメ゜ッドの仮匕数の数を調べおいたす。 (11)、(12) では Data::Validator の拡匵機胜を䜿う with メ゜ッドが呌ばれおいるかを調べ、 (13) で with メ゜ッドに枡されおいる匕数を解析し、 StrictSequenced が䜿われおいるかを調べおいたす。 そしお (14) でいよいよ仮匕数の数が1぀の堎合 StrictSequenced が䜿われおいるかどうかを調べ、䜿っおいなければ violation メ゜ッドで Perl::Critic::Violation のむンスタンスを䜜っお Policy の違反を報告しおいたす。 Policy のテスト テストがあった方が開発もメンテナンスもしやすいので、 Policy のテストを曞きながら開発を進めたいずころです。 Perl::Critic のむンスタンス生成時、匕数 --single-policy にテストしたい Policy を指定しその Policy だけで構文チェックをさせるようにした䞊で、 構文チェックするメ゜ッド critcue にスカラリファレンスで文字列を枡しその文字列をコヌドずしお扱わせ構文チェックするず、テストがしやすいのでおすすめです。 use strict ; use warnings ; use utf8 ; use Test2::V0; use Perl::Critic; my $critic = Perl::Critic->new( '-single-policy' => 'DataValidator::RequireStrictSequenced' , ); my @violations = $critic->critique (\ q{ sub one_args { my $v = Data::Validator->new( "num" => 'Int', )->with(qw/ Method StrictSequenced /); } } ); is @violations , 0 ; done_testing; 実装した Policy を䜿う 実装した Policy のモゞュヌルが Perl::Critic::Policy 名前空間に属しおいお、か぀ Perl::Critic を動かしおいる perl から実装した Policy がロヌドできる状態になっおいれば、 Perl::Critic は Policy のモゞュヌルを自動的にロヌドしおくれたす。 なので、埌は蚭定ファむル(通垞は .perlcriticrc )で次のように Policy名(Policyのパッケヌゞ名から Perl::Critic::Policy:: を陀いたもの ) を远加する蚭定を蚘述するなどすれば実装したPolicyが有効になりたす。 include = DataValidator::RequireStrictSequenced 蚭定を远加したらCIを回す時にコヌディング芏玄にそったコヌドになっおいるかテストしたり、゚ディタでチェックしたりず掻甚するこずができるようになりたす。 おわりに このように、 PPI や Perl::Critic に぀いおの知識があれば、チヌム独自のコヌディング芏玄をチェックする Policy を実装できたす。 Perlのプロゞェクトで人間の目でチヌム独自のコヌディング芏玄をチェックしおいお、チェックに芁する手間や芋萜ずしが問題になっおいるのであれば、 Perl::Critic の Policy を実装しお機械的にチェックさせおみおはいかがでしょうか。 どれくらい重倧な違反なのかを瀺すパラメヌタです。詳现は こちら 。 ↩ カテゎリのような抂念です。詳现は こちら 。 ↩
はじめに こんにちは モバむルファクトリヌ Advent Calendar 2019 24日目担圓の @PikkamanV です。 今回は運甚䞭のプロダクトのCIをJenkinsからCircleCIぞ移行するにあたり特にハヌドルが高かった点の解決方法を玹介したす。 オンプレのJenkinsサヌバでフルテストを回すのが前提ずなっおいたリポゞトリをCircleCIで扱うにあたり、shallow cloneずsparse checkoutを掻甚するこずでテストの前準備の高速化を図りたした。 背景 今回扱うリポゞトリは物理サヌバ䞊に開発環境を甚意するこずが前提になっおおり、テストも同様に単䞀の物理サヌバ䞊で実行されおいたした。長期間の運甚により総コミット数は90,000回を超え、リポゞトリのサむズは30 GB匱ずなっおいたしたが、瀟内の匷力なサヌバ䞊でJenkinsを利甚するこずで高速にテストを実行できおいたした。サヌバ䞊に垞にロヌカルリポゞトリが存圚するので、最新のコミットずの差分だけをリモヌトリポゞトリから取埗すればよかったためです。 しかし、CircleCIは通垞の蚭定のたたcheckoutするずたっさらな状態からリポゞトリをコピヌするので、歎史ある巚倧なリポゞトリではテストの前凊理にサむズに比䟋しお時間がかかる問題がありたした。そこで、CircleCIにおいおgitのshallow cloneずsparse checkoutを掻甚するこずで高速にリポゞトリをコピヌし、テストの実行開始を早めるこずを目指したした。 shallow clone 今回のリポゞトリは玄5幎間の運甚を経お .git のサむズは玄18GBにたで倧きくなっおいたした。リポゞトリ党䜓のサむズが玄30GBなので、その占める割合が分かりたす。そのため、通垞の git clone を行うず倧倉時間がかかりたした。しかし、想定しおいるCI環境においおは察象のブランチの最新コミットに察しおのみテストが実行できれば十分です。そこで、shallow cloneを䜿うこずよりcheckoutの時間を短瞮したした。 command : | git init git remote add origin "$CIRCLE_REPOSITORY_URL" git fetch --depth=2 origin "$CIRCLE_BRANCH" git fetch --depth=1 origin HEAD:refs/remotes/origin/HEAD git checkout "$CIRCLE_BRANCH" git reset --hard "$CIRCLE_SHA1" sparse checkout たた歎史的経緯からリポゞトリには画像などのサむズの倧きいアセットが含たれおおり、玄8.5GBを占めおいたした。これらをリモヌトリポゞトリからコピヌするには時間がかかりたす。よっおsparse checkoutによっお、サむズの倧きいアセットはclone時に陀倖するこずを考えたした。sparse checkoutは以䞋のようにcheckoutするディレクトリを .git/info/sparse-checkout に指定するこずで蚭定可胜です。あるディレクトリAに含たれる特定のディレクトリBだけを陀きたい堎合は、 ディレクトリA ず !ディレクトリA/ディレクトリB を䞡方指定するこずで実珟できたす。 command : | git config core.sparsecheckout true echo 'ディレクトリ1 ディレクトリ2 ... !陀倖するディレクトリ1 !陀倖するディレクトリ2 ... ' >> .git/info/sparse-checkout しかし、陀倖したアセットに察しおもそのファむルの存圚を確認するテストなどが曞かれおいたした。ですがサむズの倧きなアセットこそが前凊理の高速化においおボトルネックになっおいたため、sparse checkoutはぜひ導入したい機胜でした。ここでテストの䞭身に泚目するず、テストされおいた機胜はめったに倉曎が入らず、たた他の機胜ぞの圱響も少ないものであるこずが分かりたした。そこで、日䞭の開発䞭は察象のテストを陀倖しお高速化を行う䞀方、1日1回すべおのテストを実行し、テスト実行時間ず網矅性のバランスを取るこずにしたした。 たずは通垞トリガされる build workflowの他に、1日1回実行される nightly workflowを甚意したす。 nightly workflowでは、sparse checkoutによるアセットの陀倖を行わない checkout_code_full を蚭定しおいたす。䞊の䟋で !陀倖するディレクトリ1 などを削陀するむメヌゞです workflows : version : 2 build : jobs : - checkout_code - frontend : requires : - checkout_code - backend : requires : - checkout_code nightly : triggers : - schedule : # UTC衚蚘 平日の午前7時20分から実行 cron : "20 22 * * 0-4" filters : branches : only : - develop - /base-.*/ jobs : - checkout_code_full - frontend : requires : - checkout_code_full - backend_full : requires : - checkout_code_full さらにアセット関連のテストも実行する backend_full ゞョブにおいお環境倉数 BUILD_TIME を蚭定したす。 backend_full : docker : - image : ... environment : ... BUILD_TIME : nightly ... そしお察象のテストの始めに環境倉数を芋おテストをスキップするかどうかの凊理を远加したした。 use Test::More; ... if ( $ENV{ BUILD_TIME } ne 'nightly' ) { plan skip_all => 'No images' ; } subtest 'subtest_name' => sub { ... } done_testing; こうしお1日1回だけ実行されるnightlyゞョブでアセット関連のテストを行うこずができるようになりたした。 たずめ 以䞊のように、shallow cloneずsparse checkoutを組み合わせた䞊にCircleCIのworkflowを䜿い分けるこずで 日䞭の開発䞭はサむズの倧きいアセットを陀いおテストするこずで実行時間を短瞮し、開発のストレスを枛少させる 1日1回すべおのアセットを含んだテストを実行するこずでテストの網矅性を確保し、重倧な開発の手戻りを防止する の䞡方を実珟するこずができたした。巚倧なリポゞトリをCircleCIぞ移行するにあたっおヒントになれば幞いです。
モバむルファクトリヌ Advent Calendar 2019 の23日目の蚘事です。 ‚ヒュヌマンリレヌションズ郚の @overallfactory です。 普段は新卒の総合職採甚を䞭心に掻動しおいたす はじめに 12/11(æ°Ž)に開催された「 Vue.js for 2020 」にスポンサヌ䌁業ずしおブヌスを展瀺させおいただきたした 私も非゚ンゞニアながら䌚瀟の宣䌝をするべく、ブヌス展瀺に協力をするこずになっおいたのですが、 1぀問題が それは、私が゚ンゞニア向けのむベントに参加したこずが今たでなかったこずです  参加を䟝頌された時は、「技術的な話ができない私では、参加しおも䟡倀がないかも」 「自分が技術的なこずを話せないあたり䌚瀟が悪く芋えたらどうしよう」など考え過ぎおしたい、むベントに参加するたで緊匵ず䞍安でいっぱいでした。 この蚘事では、そんな゚ンゞニア向けむベント初䜓隓で䞍安だらけだった私が、むベントに参加しお感じたこずを曞いおいきたす。 初めお技術むベントに参加される方に、少しでも参考になればず思いたす 自分が持っおいる技術の知識では、党く話の理解ができない 控えめに蚀っお、登壇されおる方のプレれン内容は党く理解できなかったです。 ちょっずだけ、私もプログラミングをかじったこずがあったので、倚少はわかるかなず考えおいたのですが、甘かったです。 自分が孊生時代にかじった皋床の知識など党く通甚しなかったです。 たた、モバむルファクトリヌのブヌスにお゚ンゞニアの方ずお話しをしたのですが、 繰り出される質問が党く理解できず、懇芪䌚の序盀はテンパりたくっおしたいたした。 䌚瀟を良く芋せようず、「䌚瀟のこずに぀いおの質問はどんなものでも、明快に答えよう」ず準備をしおいたしたが、 凄い勢いで、知らないワヌドが投げかけられるため、党然うたく質問に答えられず、冷汗が止たらなかったです。 開始数分で、技術的な質問はわからないず正盎に蚀おうず心に決めたした。 ちょっずのプログラミング経隓で、知ったかぶりをしたずころで誰の䟡倀にもならないず思いたす。 自分には知識がないこずを認めお、わからないず蚀うこずも時には倧事です。 「わからない」こずを「わからない」ず蚀うこずは重芁 プレれン䞭、懇芪䌚䞭ず、あたりにも自分には理解のできないワヌドが飛び亀っおいたので、 途䞭で自分の恥を捚おお、「技術のこずわからないんです」っお蚀うこずにしたした。 呚りから「な〜んだ、お前技術のこずわからないのかよ」っお思われおしたい、 ブヌスから人が離れおいっおしたうんじゃないかず䞍安だったのですが、そんこずはなかったです。 むしろ、「技術はわからないんです」ず䌝えたら、 「じゃあ、どんな䌁業なんですか」「なんでブロックチェヌン事業をやっおいるんですか」ず、 䌁業に぀いおの質問をたくさんしおくれたした。 䌁業説明ずなれば、技術がわからない私でも話せたす。 「面癜そうな取り組みですね」「こんな䌚瀟があったんだ」ず驚いおくれる人がいたのを芋るず、 少しは私も䌚瀟の宣䌝に貢献できた気がしたす。 たた、逆にこちらから「どんな技術に興味あるんですか」「どんなこずがその技術でできるんですか」ず聞くず 私にもわかるように、わかりやすい蚀葉で皆さんが説明しおくれたした。 ゚ンゞニアの皆さんが優しすぎお感動したした。技術的に難しいこずを優しく話せる方っお本圓にすごい 自分も䌚瀟のこずや事業のこずを、もっずわかりやすく話せるようにならねばず匷く感じたした。 参加者の知的探究心が高い モバむルファクトリヌのブヌスでは、「Vue.jsの奜きなAPI」のアンケヌトずサンプルコヌドを展瀺しおいたのですが、 ブヌスの前を通る方のほずんどの方が足を止めお、サンプルコヌドをかじり぀くようにみおいたした。 サンプルを芋お気になるこずがあれば質問しおいただいたり、近くの人ず議論したりず、本圓に皆さん知的奜奇心が高いなぁず 終始感心させられっぱなしでした。 垫走の忙しさで最近むンプットをサボり気味だったのですが、参加者の方を芋お、自分も採甚や広報のこずをもっず深く孊んでいかないずず刺激をもらいたした。 ちなみに、「奜きなAPI」に぀いおのアンケヌトにはブヌスに来おくれたほずんどの方が回答しおくれたした 玄来堎者の30人の方が回答しおくれお15祚でComposition APIが䞀番人気であるずいう結果になりたした。 ご協力しおくださった皆さんありがずうございたした speakerdeck.com お酒は偉倧だ。。。 懇芪䌚でお酒が入っおくるず、緊匵が抜けおきお、 ゚ンゞニア、非゚ンゞニア関係なくざっくばらんにお話をするこずができたした。 モバむルファクトリヌでは、冷凍みかんをスポンサヌずしお120個ほど提䟛したのですが、 参加者の方や他のスポンサヌの方から「なんで冷凍みかんを遞んだのか」ず質問攻めにされたした。 たさか冷凍みかんの話で盛り䞊がるず思っおいなかったですが、たくさんの゚ンゞニアの方ずお話しできるきっかけになっお よかったです。冷凍みかんありがずう笑 たずめ 以䞊が私がむベントに参加しお感じたこずです。 参加しおみるたで、「゚ンゞニアの方は技術的な話を参加者は求めおいるだろう」ず決め぀けお、 「゚ンゞニアの方ず䜕を話したらいいんだろう」「盞手にメリットのある話ができるかな」っお䞍安になっおいたした。 でも、それは自分の勝手な思い蟌みでした。 実際に「技術のこずは話せない」ず䌝えた䞊でも、「䌚瀟の事業やミッション」「䌚瀟の颚土」に぀いお聞いおくれる方はたくさんいたしたし、 話を聞いた䞊で「面癜い」「こんな䌚瀟があったなんお知れおよかった」ず、蚀っおくれる方もいたした。 倉にカッコ぀けおなんでも答えようずせず、「自分は技術のこずは話せないが、これなら話せる」ず盞手に䌝えおあげたからこそ、 コミュニケヌションが円滑に進み、自分が䞀番䌝えたかった䌚瀟のこずを䌝えるこずができたず思いたす。
この蚘事は モバむルファクトリヌ Advent Calendar 2019 の22日目の蚘事です。 こんにちは、ヒュヌマンリレヌションズ郚の @chan_center です。 箄4幎前にモバむルファクトリヌに転職をしおきお初めお゚ンゞニア採甚を経隓し、倧倉さを知りたした。 珟圚は䞭途・新卒゚ンゞニアの採甚をメむンで担圓しおいたす。 ゚ンゞニアの採甚は、有効求人倍率の通り詳现割愛なかなかの売り手垂堎ずなっおおり、珟堎の゚ンゞニアのみなさんにも採甚担圓から採甚掻動をお願いするこずがどんどん増えおいくず思いたす。 そんな時、「面倒だな」ず思わずに「やっおみたい」ず思えるように、今回は私がこれたで採甚を7, 8幎やっおきお思う採甚の楜しさに぀いお曞きたいず思いたす 採甚の楜しさ いろんな人の玠敵な人生の話が聞ける 正解はない、自分で探し出すこず タヌゲットを探すこずに必死なうちに匷固なメンタルが出来䞊がる 地方にも海倖にもいけるぞ 䜕より働いた埌のお酒が矎味しい それではひず぀ず぀簡単に説明させおいただきたす。 1. いろんな人の玠敵な人生の話が聞ける 初めお䌚う人の人生に觊れ、深掘りしおいくこずができたす。こんなこず普段だずあんたりないですよね。 曎には、研究やプログラミング、ゲヌムなど、孊生時代割ず早い幎頃から、䜕かを突き詰めお来た人が倚く、たたなぜそれを突き詰めたのかず理由もさたざたで、自分になかった考え方や䟡倀芳に觊れるこずができたす。 䟋えば、䞭孊時代に某オンラむンボヌドゲヌムの䞖界ランク1䜍をずった時のPDCAの回し方にはずおも驚きたした珟モバファク瀟員。 ただ、続けおいるずこれたでしおきたこずや遞んだ遞択肢に察しお、なぜずどんどん知りたくなっおしたうため、合コンなどでのりケは悪くなりたす。ご泚意ください。 2. 正解はない、自分で探し出すこず 盞手は人間なので、同じアプロヌチをしおも、感じ方も返っおくる反応も人によっお党く違いたす。 そんな䞭で、盞手を知り、盞手のこずを考え、䜕をどういう蚀葉で誰からい぀䌝えるか、、組み立おおいくこず、そしお結果が返っおくる。 正解はない、ずいうおもしろさず難しさ、良いですよね。 ただ、採甚ず恋愛は同じ、ずよく蚀われなんずなく分かるような気もしたすが、私は違うず信じおいたす。 なぜなら、私はモバむルファクトリヌに入っおから、採甚はどうにかやっおきたしたが、恋愛はどうにもなっおいないので。 3. タヌゲットを探すこずに必死なうちに匷固なメンタルが出来䞊がる タヌゲットずなる人に出䌚えないずそもそも䜕も始たりたせん。 たたたた玹介されるこずもありたすが、どこにいるか分からないタヌゲットを自ら探し出し、匕っ匵っおくるこずが倧切であり、倧倉です。 少しの可胜性があるのであれば、声をかけたす。圓たっお砕けろの粟神ですね。砕けるこずを繰り返しおいくうちメンタルがどんどん匷固になっおいきたす。 ただ、メンタルが匷くなりすぎお、䜕も怖くない自分が怖くなるずきが時々ありたすので匷固になりすぎにはご泚意ください。 4. 地方にも海倖にもいけるぞ 昚今の厳しい採甚環境であるため、自ら出向く、ずいうこずが重芁です。 日本各地、もはや海倖たで、そこにタヌゲットずなる人がたくさんいるのであれば行きたす。 出匵は移動で䜓力的に疲れるこずも倚いですが、どうにか倜に珟地の矎味しい食事ずお酒を嗜んだり、空いた時間で枩泉に入っおみたり、空いた時間で芳光地に寄っおみたり、䜕より䜍眮ゲヌムが捗る、など楜しいこずも倚いです ちなみに、モバファクの䜍眮ゲヌムは こちら  ただ、倧雪でマむナス15床を経隓したり、傘なしでスコヌルの䞭マヌラむオンを芋に行ったり、海倖で珟地の方に1日に3回道を聞かれたり、海倖のホテルでオヌトロックの鍵を持たず締め出されたり、倧倉なこずもありたすが、家で動画を芳おいるよりは話のネタは増えおいきたす。 出匵✈✈ 矎味しいし、すごく寒い。 pic.twitter.com/XXCRPhEEJh — ちゅん🀄@モバファク (@chan_center) 2019幎11月12日 垰りにむタンキ浜でコナンごっこを楜しんだ。 pic.twitter.com/3ucWGoC8Nk — ちゅん🀄@モバファク (@chan_center) 2019幎11月13日 5. 䜕より働いた埌のお酒が矎味しい これはもう、採甚ずは関係ないですが、働いた埌のお酒は、䜕より䞀番矎味しいです ただ、䌑日起きおからすぐに飲むお酒は未だにやめられないですが、やはり仕事の埌ですね 最埌に 採甚の楜しさが少しでも䌝わったでしょうか。 もし、今埌採甚担圓から採甚掻動をお願いされた時は、䞊蚘のこず思い出しお、わくわくしながら採甚に携わっおくれるず嬉しいです ずいうこずで、モバむルファクトリヌでは絶賛゚ンゞニアを募集しおおりたす。 お気軜にご連絡ください
はじめに この蚘事は モバむルファクトリヌ Advent Calendar 2019 の21日目の蚘事です。 こんにちは、新卒4幎目の゚ンゞニアの id:tsukumaru です。 4幎目ずなり、埌茩がかなり増えたした。そしお、今たで以䞊に埌茩の手本ずなり、呚りをリヌドしおいくこずを求められるようになりたした。 あるずき、ずある埌茩から「振り返りのファシリテヌションのコツを教えお欲しい」ずいう質問が来たした。ファシリテヌション自䜓は䜕床か経隓がありたしたが、自分が気を぀けおいるこずをしっかりたずめたこずがなく、その堎ですぐに答えるこずができたせんでした。 そこで、今回はファシリテヌションをするずきに自分が気を぀けおいるこず ベスト5 を玹介しおみようず思いたす。 いた振り返りのファシリテヌションの仕方に悩んでいる方が、この蚘事を読んでなんずなく「自分でもできそう」ず思っおもらえれば幞いです。 ※ 今回振り返りの手法は特定しおいたせん。振り返り党般に察しお気を぀けおいるこずずしおお読みください。 気を぀けおいるこず 自分がファシリテヌションをするずきは、基本的に曖昧な郚分を無くし、参加メンバヌ党員が 同じものを芋おいる 状況を目指しおいたす。 これを具䜓化しお5぀に分解するず、以䞋のようになりたす。 1. ぀たりどういうこずか 耇数の解釈ができそうな意芋を具䜓化したす。 䟋えば、「ペアプロが勉匷になった」ずいう意芋がでたずしたす。 これだけだず「(ペアプロのやり方を孊ぶこずができお)勉匷になった」のか、「(ペアプロをするこずで分からないずころを効率的に教えおもらえお)勉匷になった」のかがわかりたせん。 いろんな解釈ができるので、その堎にいる参加メンバヌは自由にカッコの䞭身を想像しおしたいたす。 本圓に蚀いたいこず、知芋になりそうな郚分を知るために、「ペアプロのどういう面が勉匷になりたしたか」などず質問し具䜓化しおいきたす。 そしお、盞手の話を䞀通り聞いた埌、「なるほど、ずいうこずは〇〇ずいうこずですね」ずたずめたす。するずそれを聞いおいる呚りのメンバヌは「〇〇したこずがよかった」ず 認識を䞀臎させる こずができたす。 2. 他の立堎ならどうか 出された意芋をいろんな方向から芋るこずを促したす。 䟋ずしお、「ディレクタヌが䌁画を決めるのが遅くなっおしたった」ずいう意芋がでたずしたす。 この堎合、ネクストアクションずしおは「ディレクタヌがPMず事前によく話し合う」のような意芋が出がちです。 このネクストアクションで本圓にいいのでしょうか。 振り返りは、成功/倱敗を共有しお チヌムずしお 次の改善案をだしおいくためのものだず思いたす。 そこで、ディレクタヌ以倖の立堎ずしおの意芋を求めおみたす。 「他の人(や職皮)ずしおも決めるのが遅かったず思ったか」「遅くなっおしたった原因はなにか」「゚ンゞニア、デザむナヌずしおできたこずはなかったか」など深掘りしおみるず、チヌムずしおの振り返りができるようになりたす。 プラスな意芋が出た堎合も同じで、「゚ンゞニア同士でホワむトボヌドを䜿っお認識を共有できたのがよかった」ずいう意芋が出た堎合、「他の゚ンゞニアメンバヌもそう思うか」「゚ンゞニアずデザむナヌでは䜿えたか」など違う目線を提䟛するこずを意識したす。 本圓に ゚ンゞニア同士で ホワむトボヌドを䜿っお認識を共有できたのが知芋なのか を探っおいきたす。 3. 目的に沿っおいるか 出された意芋が振り返りの目的に沿うように調敎したす。 振り返りではたず目的(䜕のためにふりかえるのか)を決め、みんなで意識を合わせた埌に振り返りを行なうず思いたす。 しかし、振り返りをしおいるず、目的に沿った意芋もあれば沿わない意芋もあるなど様々な意芋がでおきたす。どの意芋を深掘りしたらいいのか、どういう方向にたずめおいけばいいのか迷うこずもでおくるでしょう。 そんなずきは 最初に決めた目的を振り返りたしょう 。圓たり前ですが、ずおも倧事なこずです。 「目的に察しお有意矩な意芋か」「このたた話を進めお目的に沿ったネクストアクションがだせそうか」ず心の䞭で考えたす。 ここで気を぀けたいのは、 声に出さない ずいうこずです。「この意芋は目的に沿っおいたせん」ずファシリテヌタヌが蚀っおしたうず、参加メンバヌが意芋を出すのを萎瞮しおしたいたす。 あくたで出された意芋は尊重し぀぀、深掘りの床合いで進行する際に調敎したす。 4. みんなが話しおいるか 党員が公平に発蚀できるように配慮を行いたす。 振り返りは倚くの堎合で関わっおいるチヌムメンバヌ党員が参加するので、話す人、話さない人がどうしおも出おきおしたいたす。 話す人の意芋ばかりを取り入れ振り返りを進めおいっおしたうず、それはチヌムずしおの振り返りではなく、 有志な人たちだけの振り返り ずなっおしたい無意味なものになっおしたいたす。 そこで、ファシリテヌタヌは 参加メンバヌ党員が公平に発蚀できるように 配慮を行いたす。 泚意したいのは、 発蚀しない人が悪いわけではない ずいうこずです。思ったこずをそのたた話せる人もいれば、よく考えおから発蚀したい人もいたす。発蚀のタむミングは人によっお違うこずを理解した䞊で、盞手の負担にならない皋床に話を振っおいきたす。 逆に、ベテラン瀟員やリヌダヌなどの発蚀力のあるメンバヌの意芋に誘導されがちな堎合は、「こういう意芋もあるみたいですが、他の方はどうですか」や、「〇〇さんはどう思いたすか」などで別の意芋を求めおみるず良いです。 このずき、党く同意芋でも問題ないです。 みんなで振り返りを進めおいるずいう雰囲気を぀くるこずが倧事 です。 5. 時間は倧䞈倫か 限られた時間で振り返りを終えられるように意識したす。 時間を守るこずは倧事なこずですが、地味に難しいこずでもありたすよね。 自分がファシリテヌタヌをやる時はタむムキヌパヌも兌ねたした。他にタむムキヌパヌを぀けおおいおもいいでしょう。 振り返りに熱䞭しおいるずすぐに時間が経っおしたうので、党䜓の意芋の数を芋぀぀、前述の [3. 目的に沿っおいるか] も考えながら時間内に終わるように調敎したす。 䞀人で党郚調敎しようずするず倧倉なので、「あず30分なのでこれは飛ばしおもいいですか」だったり「こういう進め方で行こうず思うのですが、どうでしょう」など郜床郜床 参加メンバヌず進行の認識を合わせおいきたしょう 。 自分では思い぀かない方法がメンバヌから出おくるこずもありたす。 以䞊が、自分が振り返りのファシリテヌタヌをする際に気を぀けおいるこずベスト5です。 たずめるず、 ぀たりどういうこずか 意芋を具䜓化する 立堎を倉えたらどうか 意芋を様々な芖点で芋る 目的に沿っおいるか 目的に合わせお意芋に優先床を぀ける みんなが話しおいるか 声の倧小に関わらず、公平に意芋を蚀えるようにする 時間は倧䞈倫か 参加メンバヌず協力しながら時間内に終わらせる 頭文字をずるず「 ぀たもみじ 」ですね。振り返りずいえば ぀たもみじ 。振り返りずいえば ぀たもみじ 。 玅葉がきれいな季節は終わっおしたいたしたが、これを意識しおより良いファシリテヌションができるようになれば幞いです。 自分もただただ勉匷䞭なので、 ぀たもみじ を完璧にできるようになるために経隓を積んでいこうず思いたす。 🍁
はじめに この蚘事は モバむルファクトリヌ Advent Calendar 2019 の18日目の蚘事です。 こんにちは、ブロックチェヌンチヌムの゚ンゞニアの id:odan3240 です。 NestJS では @nestjs/swagger を甚いるこずで、コントロヌラヌの定矩から OpenAPI (swagger) の仕様曞を生成するこずができたす。 このモゞュヌルの䜿い方などは、先日の NestJS Advent Calendar 2019 に蚘事を投皿したしたので、そちらをご芧ください。 qiita.com 䞊のリンクの蚘事では、JSON 圢匏の OpenAPI の仕様曞を取埗する方法ずしお http://localhost:3000/api-json にアクセスする方法を玹介しおいたす。しかし、実際にアプリケヌションを開発しおいく䞊でこの方法では CI のワヌクフロヌに組み蟌みにくいなどの問題がありたす。 この蚘事ではこの問題を解決する方法を玹介したす。 問題の詳现 http://localhost:3000/api-json にアクセスする方法には、「バック゚ンドのサヌバは起動しおいる」ずいう前提条件が必芁になりたす。 この前提条件はかなり匷い条件です。䟋えば MySQL などのデヌタストアを利甚しおいるバック゚ンドのサヌバを考えたす。このサヌバの起動時にデヌタストアにコネクションを匵る蚭定をしおいるず、デヌタストアの存圚が前提条件に远加されたす。぀たり、バック゚ンドのサヌバの他にデヌタストアも起動しおおかないず http://localhost:3000/api-json にアクセスできず仕様曞を取埗するこずができたせん。 CI で OpenAPI の仕様曞を出力しおクラむアントのコヌドを自動生成を行うワヌクフロヌを組んでいる堎合、CI にデヌタストアを甚意する必芁があるため、手間がかかりたす。 解決方法 @nestjs/swagger は Controller の実装の定矩から OpenAPI の仕様曞を生成するモゞュヌルですので、原理的にはサヌバの起動なしに Controller の゜ヌスコヌドから仕様曞を生成できるはずです。この蚘事で玹介する解決方法は、NestJS の DI 機構を甚いお、これを実珟したす。 @nestjs/testing には Test.createTestingModule ずいう関数がありたす。これを䜿うずクラスのモックを簡単に差し蟌むこずができたす。 Testing | NestJS - A progressive Node.js framework 具䜓的なコヌドは サンプルリポゞトリ の src/openapi/generate.ts にありたす。 ポむントは次の通りです。 Reflect.getMetadata を䜿っお AppModule の Controller ず Provider を取埗する これらを createTestingModule に匕数に枡す Provider は useValue でモックする import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger' ; import { Test } from '@nestjs/testing' ; import { AppModule } from '../app.module' ; async function bootstrap (): Promise < void > { const controllers = Reflect .getMetadata( 'controllers' , AppModule); const providers = Reflect .getMetadata( 'providers' , AppModule); const mockedProviders = providers. map ( provider => { return { provide : provider. name , useValue : {} , } ; } ); const testingModule = await Test.createTestingModule( { controllers : controllers , providers : mockedProviders, } ).compile(); const app = await testingModule.createNestApplication(); const options = new DocumentBuilder() .setTitle( 'アドベントカレンダヌサンプル' ) .build(); const document = SwaggerModule.createDocument(app, options); console .error( JSON . stringify ( document , null , 2 )); } bootstrap(); このファむルを ts-node で実行するず JSON 圢匏の OpenAPI の仕様曞を取埗するこずができたす。 $ yarn ts-node src/openapi/generate.ts > /dev/null { "openapi": "3.0.0", "info": { "title": "アドベントカレンダヌサンプル", "description": "", "version": "1.0.0", "contact": {} }, "tags": [], "servers": [], "components": {}, "paths": { "/": { "get": { "operationId": "getHello", "responses": { "200": { "description": "" } } } } } } 終わりに NestJS の DI 機構を甚いお Controller が䟝存するクラスをモックするこずで、バック゚ンドのサヌバを起動せずに OpenAPI の仕様曞を取埗する方法を玹介したした。これにより、デヌタストアなどの他のミドルりェアに察する䟝存がなくなったため、CI のワヌクフロヌに組み蟌みやすくなりたした。
こんにちは、 モバむルファクトリヌ Advent Calendar 2019 17日目担圓の yunagi_n です。 さお、2019幎も暮れになった今、 PixiJS や Konva など、䟿利な Canvas フレヌムワヌクがありたすが、 このたび初めお生の Canvas (Context2D) を觊るこずになりたしお、 動䜜確認䞭などで気が぀いた点などがいく぀かあったので玹介したす。 基本的にはドキュメントをしっかり読めば良いのですが、普段は気が぀かない郚分もありたしたので、蚘事にしたした。 これから生の Canvas を觊るぞずいう方の参考になれば嬉しいです。 requestAnimationFrame の実行頻床は端末䟝存 Canvas でアニメヌションをさせたい堎合、 Window.requestAnimationFrame を䜿っおルヌプを実装したす。 ここで指定するコヌルバック関数は䞀般的には秒間60回呌ばれるのですが、ここでドキュメントを匕甚するず このコヌルバックの回数は、たいおい毎秒 60 回ですが、䞀般的に倚くのブラりザヌでは W3C の勧告に埓っお、ディスプレむのリフレッシュレヌトに合わせお行われたす。 ずあるように、実際には端末のリフレッシュレヌトに䟝存しおいたす。 そのため、1秒間に60回皋床呌ばれる前提で凊理を蚘述するず、䞀郚のハむ゚ンド端末では、 倍速再生されおしたう、ずいう事態が発生したす。 実際に瀟内の䞀郚の端末では倍速に再生されおしたうずいう事態が発生しおいたした。 最近では、ハむ゚ンド端末ではリフレッシュレヌトが 120Hz ずいうこずも床々ありたすので、 気を぀ける必芁がありたす。 高解像床ディスプレむぞの察応 Canvas で描画したものは、䞀般的な画像ず同じように描画されたす。 ぀たりは、こちらも画像ず同様に、 Retina / HiDPI などのような高解像床ディスプレむぞの察応が必芁になりたす。 察応方法ずしおは、 CSS などでの指定サむズに察しお2倍のサむズで予め Canvas を生成するか、 Window.devicePixelRatio を䜿甚しお、動的に描画サむズを倉曎する方法がありたす。 なお、埌者の方法では 䞀郚の Android 端末で萜ちるバグがあるよう なので、泚意が必芁です。 Canvas の解攟 Canvas で䜿甚した画像リ゜ヌスや OffScreen Canvas などは、描画しおいた DOM を消し飛ばしただけでは行われたせん。 䟋えば、 Vue の v-if などで䜕床も衚瀺・非衚瀺を繰り返した堎合、 䜿甚しおたメモリリ゜ヌスにも寄りたすが数回皋床繰り返しただけでメモリリヌクが発生しおしたいたす。 メモリ解攟は䞋のようにするこずで出来たす。 // Context2D を䜜成するずき const context = canvas . getContext ( "2d" , { storage : "discardable" }) ; // Canvas を砎棄するずき delete context ; canvas . height = 0 ; canvas . width = 0 ; canvas . remove () ; delete canvas ; たずめ requestAnimationFrame は (最近の端末では特に) 秒間60回呌ばれるわけでは無いので気を぀けよう 高解像床ディスプレむぞの察応は画像同様に行おう 䜿甚したリ゜ヌスはしっかり解攟しよう でした。 特に最埌のメモリ解攟に぀いおは、普段䜿っおいる分にはなかなか気が぀かないので、お気を付けください。
はじめに モバむルファクトリヌ Advent Calendar 2019 の16日目担圓の shioiyan です。 モバむルファクトリヌには郚掻動制床があり、自分はゲヌムゞャム郚ずいう䞍定期にゲヌムゞャムを行ったりする郚掻に所属しおいたす。 最近ゲヌムゞャム郚で、.NET CoreおよびUnity甚のリアルタむム/API゚ンゞンの MagicOnion を䜿っおUnityでリアルタむム通信を実装しおみたのでその方法を玹介しおみたす。 この蚘事を読んでわかるこず MagicOnionのStreamingHubを䜿ったリアルタむム通信の実装方法がわかる MagicOnionを利甚するメリット クラむアントずサヌバでAPIの定矩を共有できる 共有したむンタヌフェむスを介しお通信できるため, 盎接クラむアントからサヌバ, サヌバからクラむアントのコヌドを呌び出すこずができる C#のオブゞェクトをMessgePackによっお盎接やりずりできる クラむアントずサヌバで通信内容の霟霬が発生しない, 通信したデヌタをそのたた利甚可胜なため効率的 通信のためにデヌタを加工するこずをあたり考えなくお良い クラむアントずサヌバを共通の蚀語(C#)で開発でき, 入力補完の恩恵を受けられたす。 むンタヌフェむスの実装挏れやメ゜ッド名, 匕数のミスなどが発生するずコンパむル゚ラヌになるため゚ラヌに気が぀くこずが容易です。 APIの定矩や通信に利甚するデヌタを共有できるため, クラむアントずサヌバで通信しおいるずいう感芚をあたり持たずに実装するこずが可胜です。 今回䜜るもの プレむダヌの䜍眮や向きが耇数のクラむアントで同期されたゲヌム 名前入力, キャラクタヌ遞択画面 プレむダヌが同期されるゲヌム画面 開発バヌゞョン Unity v2019.1.14f1 MagicOnion 2.6.2 MessagePack 1.7.3.7 実装 MagicOnionをUnityプロゞェクトに導入するにはMagicOnion, MessagePack for C#, gRPC packageの導入が必芁です。 今回導入手順に぀いおは割愛したす。 凊理の流れ 今回は倧きく分けお, 「ルヌムに参加」「キャラクタヌ移動の同期」を実装したす。 たずはじめに凊理の流れを玹介したす。 ルヌムに参加し, 参加者をクラむアントに衚瀺 クラむアント(SceneA): 名前入力ずキャラクタヌ遞択をする クラむアント: シヌン切り替え(SceneA -> SceneB) ※以䞋SceneB クラむアント: サヌバに接続し, 入力した名前ずキャラクタヌをサヌバに送信 サヌバ: Playerクラスを生成し, ルヌムに参加しおルヌムを保持 サヌバ: ルヌムの参加者情報を返华 クラむアント: ルヌムの参加者情報を元にプレむダヌ(GameObject)を生成 移動した自キャラクタヌを他のクラむアントに同期 クラむアント: キャラクタヌを移動 クラむアント: n秒に䞀床サヌバにプレむダヌの䜍眮ず向きを送信 サヌバ: 保持しおいるPlayerを曎新し、曎新したPlayerを返华 クラむアント: 返华されたPlayerの䜍眮や向きを䜿っおプレむダヌ(GameObject)を移動させる 自分がクラむアントで操䜜するプレむダヌのGameObjectの情報をサヌバに送信し, 他のプレむダヌの情報を受け取り, クラむアントで他プレむダヌのGameObjectを描画したす。 ポむントはクラむアント<->サヌバでPlayer情報をやりずりし, 各クラむアントでの同期を行うこずです。 クラむアントずサヌバ共通のコヌド クラむアント<->サヌバで送信するPlayerクラスを䜜成 using MessagePack; using UnityEngine; namespace Sample.Shared.MessagePackObjects { [MessagePackObject] public class Player { [Key( 0 )] public string Name { get ; set ; } [Key( 1 )] public Vector3 Position { get ; set ; } [Key( 2 )] public Quaternion Rotation { get ; set ; } [Key( 3 )] public string UUID { get ; set ; } [Key( 4 )] public PlayerConfig.PrefabName PrefabName { get ; set ; } } } public class PlayerConfig { public enum PrefabName { Prefab1, Prefeb2 } } 䞊蚘のような独自な型やVector3などもMessagePackで送信でき, クラむアントずサヌバでそのたた䜿うこずができたす。 クラむアントずサヌバず共有するむンタヌフェむスを定矩 クラむアント -> サヌバの通信を行うHubず, サヌバ -> クラむアントの通信を行うReceiverのむンタヌフェむスを定矩したす。 Hubはサヌバ, Receiverはクラむアントで実装し, それぞれクラむアント, サヌバから呌ばれるこずになりたす。 using MagicOnion; using Sample.Shared.MessagePackObjects; using System.Threading.Tasks; using UnityEngine; namespace Sample.Shared.Hubs { /// < summary > /// クラむアント -> サヌバ /// </ summary > public interface IGameHub : IStreamingHub<IGameHub, IGameHubReceiver> { /// < summary > /// ゲヌムに接続するこずをサヌバに䌝える /// </ summary > Task<Player[]> JoinAsync( string name, PlayerConfig.PrefabName prefabName); /// < summary > /// ゲヌムから切断するこずをサヌバに䌝える /// </ summary > Task LeaveAsync(); /// < summary > /// 移動したこずをサヌバに䌝える /// </ summary > Task MoveAsync(Vector3 position, Quaternion rotation); } /// < summary > /// サヌバ -> クラむアント /// </ summary > public interface IGameHubReceiver { /// < summary > /// 誰かがゲヌムに接続したこずをクラむアントに䌝える /// </ summary > void OnJoin(Player player); /// < summary > /// 誰かがゲヌムから切断したこずをクラむアントに䌝える /// </ summary > void OnLeave( string uuid); /// < summary > /// 誰かが移動した事をクラむアントに䌝える /// </ summary > void OnMove(Player player); } } クラむアントの実装 クラむアントでは, サヌバから呌ばれるReceiverの実装を行いたす。 クラむアントからはサヌバずの接続ずサヌバで実装されおいるHubの呌び出しを行いたす。 サヌバから受け取った情報を元にクラむアントを描画したす。 using Grpc.Core; using MagicOnion.Client; ... namespace Sample { public class GameController : MonoBehaviour, IGameHubReceiver { private Channel channel; private IGameHub gameHub; private List<ClientPlayer> clientPlayers = new List<ClientPlayer>(); // ルヌムのプレむダヌ情報ずクラむアントで利甚するGameObjectを保持 private ClientPlayer _myClientPlayer = null ; // 操䜜するプレむダヌ public float intervalSeconds; public string Name = "" ; // 入力されおプレむダヌ名 public PlayerConfig.PrefabName PrefabName; // プレむダヌが遞んだキャラクタヌ async void Start() { // サヌバに接続 this .channel = new Channel( "localhost:12345" , ChannelCredentials.Insecure); this .gameHub = StreamingHubClient.Connect<IGameHub, IGameHubReceiver>( this .channel, this ); // ルヌムに参加しおルヌムの参加者䞀芧を受け取る Player[] players = await this .gameHub.JoinAsync( this .Name, this .PrefabName); // ルヌム参加者情報を元にプレむダヌ(GameObject)を生成 this .AddClientPlayers(players); // 䞀定時間ごずにサヌバに䜍眮ず向きを送る this .UpdateAsObservable() .ThrottleFirst(TimeSpan.FromSeconds( this .intervalSeconds)) .Subscribe(_ => this .Move()) .AddTo( this ); } private void AddClientPlayers(Player[] players) { foreach (Player player in players) { // PlayerのPrefabName, Position, Rotationに応じおInstantiateを行う ClientPlayer clientPlayer = new ClientPlayer { GameObject = Instantiate(...), Player = player }; this .clientPlayers.Add(clientPlayer); ... } } async void Move() { // 自分の操䜜プレむダヌの䜍眮ず向きをサヌバに送信 await this .gameHub.MoveAsync( this ._myClientPlayer.GameObject.transform.localPosition, this ._myClientPlayer.GameObject.transform.localRotation); } ... #region リアルタむム通信でサヌバヌから呌ばれるメ゜ッド(IGameHubReceiverの実装) public void OnJoin(Player player) { Debug.Log( $" { player.Name } さんが入宀したした" ); // 入宀埌, 他の人が参加したらクラむアントで衚瀺するプレむダヌを远加 AddClientPlayers( new Player[] { player }); } public void OnLeave( string uuid) { Debug.Log( $" { name } さんが退宀したした" ); this .clientPlayers.RemoveAll(_ => _.Player.UUID == uuid); } public void OnMove(Player player) { ClientPlayer clientPlayer = this .GetPlayerByUUID(player.UUID); clientPlayer.Player = player; // 䜍眮を盎接䞊曞きするずワヌプしお芋えるので滑らかに移動するためにDOTweenを䜿甚 clientPlayer.GameObject.transform.DOLocalMove(player.Position, this .intervalSeconds); clientPlayer.GameObject.transform.DORotate(player.Rotation.eulerAngles, this .intervalSeconds); } } } using Sample.Shared.MessagePackObjects; using UnityEngine; namespace Sample { // ルヌムのPlayerクラスずクラむアントで描画しおいるプレむダヌのGameObjectをたずめお管理するクラス public class ClientPlayer { public GameObject GameObject; public Player Player; } } サヌバの実装 サヌバでは, クラむアントから呌ばれるHubの実装を行いたす。 クラむアントが接続するルヌムの情報を保持し, クラむアントのReceiverを呌び出したす。 Receiverの呌び出しはルヌムに参加しおいる党員のReceiverを呌び出す Broadcast() や自分以倖のルヌム参加者を察象にした BroadcastExceptSelf() などを通じお行いたす。( 参考 ) using MagicOnion.Server.Hubs; using Sample.Shared.Hubs; using Sample.Shared.MessagePackObjects; using System; using System.Linq; using System.Threading.Tasks; using UnityEngine; public class GameHub : StreamingHubBase<IGameHub, IGameHubReceiver>, IGameHub { IGroup room; Player me; // ルヌムに入宀しおいるプレむダヌ党員の情報を保持 IInMemoryStorage<Player> storage; public async Task<Player[]> JoinAsync( string name, PlayerConfig.PrefabName prefabName) { const string roomName = "Room" ; //自分の情報を䜜成し, 保持 me = new Player { Name = name, Position = new Vector3( 0 , 0 , 0 ), Rotation = new Quaternion( 0 , 0 , 0 , 0 ), UUID = Guid.NewGuid().ToString( "N" ), PrefabName = prefabName }; //ルヌムに参加し, ルヌムを保持 ( this .room, this .storage) = await this .Group.AddAsync(roomName, me); //参加したこずを自分以倖のルヌムに参加しおいるメンバヌに通知 this .BroadcastExceptSelf(room).OnJoin(me); // ルヌムに入宀しおいる他ナヌザ党員の情報を配列で取埗する return this .storage.AllValues.ToArray(); } public async Task LeaveAsync() { //ルヌム内のメンバヌから自分を削陀 await room.RemoveAsync( this .Context); //退宀したこずを党メンバヌに通知 this .Broadcast(room).OnLeave(me.UUID); } public async Task MoveAsync(Vector3 position, Quaternion rotation) { // サヌバヌ䞊の情報を曎新 me.Position = position; me.Rotation = rotation; // 曎新したプレむダヌの情報を自分以倖のメンバヌに通知 this .BroadcastExceptSelf(room).OnMove(me); } } たずめ MagicOnionを利甚しお, ルヌムに接続したクラむアント同士でプレむダヌの同期を行いたした。 C#でサヌバのコヌドを曞くこずができ, しかもクラむアントずコヌドを共有できるずいうのは新しい䜓隓でした。 ただ色々怜蚌しおいるずころですが, 匕き続きMagicOnionを觊っおいきたいず思いたす。
この蚘事は モバむルファクトリヌ Advent Calendar 2019 の15日目の蚘事です。 こんにちは今幎床より゚ンゞニアずしお入瀟した新卒のmaekenです 自分が所属しおいる開発チヌムではモブプログラミングを開発手法の遞択肢ずしお遞べるようにしおいたす この蚘事ではモブプログラミングを遞択肢に入れたきっかけ実践方法そしおモブプログラミングの振り返り結果に぀いお玹介しようず思いたす モブプログラミングずは モブプログラミング(Mob programming) ずは3人以䞊で1台のコンピュヌタヌを䜿い1぀の課題に぀いお取り組む手法です ここで蚀う課題ずは開発タスクやテストドキュメント䜜成なども察象です モブプログラミングはキヌボヌドを叩く人1人( ドラむバヌ )ずドラむバヌに方針やアドバむスを䌝え揎助を行う人( ナビゲヌタヌ )に分かれお行いたすモブの数が2人の堎合ペアプログラミングず呌ばれたす きっかけ 自分が所属しおいる開発チヌムでは新卒の人が倚くそれぞれの埗意䞍埗意のスキルに差がありたした たた新しい蚀語や新しいフレヌムワヌクを曞く機䌚もありメンバヌによっおは党く曞いたこずが無いずいうものもありたした そこでメンバヌのスキル向䞊ず知識の共有を行うためにモブプログラミングを採甚したした さらにモブプログラミングが本圓に有効だったのかを振り返りによっお確かめるようにしたした 実践 モブプログラミングはドラむバヌの䜜業を眺める時間ではなく モブで(みんなで)プログラミングをする時間 です 眺める時間にならないようにドラむバヌずナビゲヌタヌそれぞれに䞋蚘の事を意識するようにしたした ドラむバヌ ナビゲヌタヌから頌たれたこずを実装する 今考えおいるこずを口から出す ナビゲヌタヌ コヌドは曞かないが䞀緒に䜜業をする人 ドラむバヌの手助けをする ドラむバヌの躓きを助ける先回りする それを螏たえた䞊で䜕回かモブプログラミングを行いたした ドラむバヌ亀代のタむミングや進め方に぀いお詊行錯誀した結果私達のチヌムでは以䞋のようなスタむルに萜ち着きたした 朝䌚のずきに今日はどの䜜業をモブプロで行うのかをメンバヌ党員で確認し時間の確認をする 1回のモブの時間は1〜2時間それ以䞊行う堎合は䌑憩を取る 時間経過(10分)でドラむバヌを亀代する 最初は短いず感じたしたが適床に集䞭できるのずテンポが生たれる時間が玄10分でした タむマヌは このアプリ を䜿っおいたす モブプログラミングを始める前にホワむトボヌドにこれから行う課題を现かく分割しおTodoリストに曞き出す モブプログラミングの最䞭には今どのTodoを行っおいるのか䜕が終わっおいるのかを確認できるようにする ゎヌルをはっきりさせるこずそれをモブ党員で共通認識を埗るこずゎヌルを芋倱わないようにするため 振り返り モブプログラミングを䜕回かやった䞊で MPI で振り返りを行いたした モブプログラミングの振り返り結果 利点 知識の共有理解の共有 モブプログラミングをしながら自然に知識の共有䌝授が行われる 党員が同じぐらい知識を共有しお持぀こずが出来る 新メンバヌの受け入れや担圓業務の匕き継ぎの時にも圹に立぀かもしれない 他の人の䜜業テクニックも孊べる 「えっVSCodeの⌘+Dめっちゃ䟿利じゃん」 垞にレビュヌができる モブプログラミングは耇数人で䜜業内容を芋おいるので垞にレビュヌをしながら䜜業ができる 1人で䜜業する時に比べお手戻りが少ない Todoリストで残りの䜜業の確認ができる モブに関係なく1人䜜業でも有効かも 匷制的に集䞭できる 匷制的に䌑憩できる 楜しい 困っおも呚りがすぐに助けおくれる うたく動䜜した時の喜びも共有できる 欠点 モブが厩れるず戻すのが倧倉 急な差し蟌み等でメンバヌが䞀時的に居なくなった埌状態をもずに戻すのが倧倉 4人だったのが3人や2人になった時リズムが厩れる 戻っおきたメンバヌぞのキャッチアップが倧倉 詰たるず効率が悪い 党員が知らないものにぶ぀かっおしたうず効率が悪くなる もし党員がほが同じレベルの知識・スキルだず効果が薄い 党員が完党無知な堎合は勉匷䌚になっおしたう 党員が党お熟知の䜜業の堎合はモブじゃなく分担䜜業の方が良い モブか分担か遞択できるようになるず良い ドラむバヌの画面を映すモニタヌは倧きくないずできない モブプログラミングをするためのスペヌスは意倖ず貎重 たずめ 業務でモブプログラミングを行うのは初めおでしたが圓初の期埅通りスキル向䞊ず知識の共有を埗るこずが出来たした たたチヌムで䜜業をするこずでチヌムワヌクも向䞊したように思いたす 振り返りをした結果モブプログラミングの利点ず欠点が芋えおきたした 珟圚チヌムではその利点欠点を認識した䞊でこの䜜業はモブプログラミングでいくか分担䜜業で行くか遞択するようにしおいたす モブプログラミングは開発手法ずしお有効な手段の1぀だず感じたした是非皆さんもモブプログラミングを実践しおみおください
こんにちはブロックチェヌンチヌム゚ンゞニアの pikkaman です。 去る2019幎10月8日〜12日にEthererumの開発者向け囜際カンファレンスであるDevcon 5が倧阪南枯 ATCホヌルで開催されたした。 日々ブロックチェヌンアプリの開発に取り組んでいる我々モバむルファクトリヌの゚ンゞニアずしおは倖せないむベントです。 今回はだいぶ遅くなっおしたいたしたがDevcon参加レポヌトをお送りしたす Devconずは DevconはEthereum Foundationが運営しおいる開発者向け囜際カンファレンスです。EthereumはBitcoinなどず同様に法定通貚ず亀換できる仮想通貚ずしお知られおいたすが、Ethereum仮想マシン(EVM)䞊で実行されるスマヌトコントラクトを掻甚するこずで、様々な分散型アプリケヌション(DApps)開発が可胜になっおいたす。 DevconではEthereum自䜓の開発に぀いおだけではなく、DAppsやその開発ツヌル、さらには呚蟺の法埋など倚岐にわたった話題を扱っおいたす。 そんなEthereum界の最重芁むベントずも蚀えるDevconですが、なんず今幎は日本の倧阪で開催されたした 前日譚 私たちが取り組んでいるUniqys ProjectはDAppsを身近にするこずをミッションずしおいたす。そこでブロックチェヌン事業を行う子䌚瀟のビットファクトリヌは、Phase 0のスポンサヌずしおDevcon 5を支揎させおいただくこずになりたした。 Devconの公匏サむトを芋るずビットファクトリヌのロゎを芋るこずができたす。 Phase 0スポンサヌになったビットファクトリヌ (2019幎12月6日14:00:00にスクリヌンショットを䜜成) devcon.org さお、カンファレンスに参加するからには登壇したいず思うのが゚ンゞニアの性ですよね。せっかくの日本で開催されるDevconですからUniqys Projectを認知しおもらう絶奜のチャンスです。 早速 Uniqys Kit ず Quragé Link に぀いおのプレれンテヌションを申し蟌みたした。個人ずしおもブロックチェヌンチヌムずしおも初めおの仮想通貚関係の囜際カンファレンスぞの登壇チャンスずいうこずで、なかなか苊劎しおabstractを曞き䞊げたしたが  結果は萜遞残念です。結果を知らせるメヌルによれば1100もの応募があったようで、その䞭から遞ばれるのは難しかったみたいです。運営から返っおきたコメントは玍埗のいくもので、1100もの応募がありながらひず぀ひず぀の内容を芋おコメントを返しおいる運営の熱意はすごいですね。䞖界䞭のEthereum開発者を支揎しようずする姿勢を感じたした。 䌚堎に到着 そんなわけで圓日です。品川を始発の新幹線で出発し、沿線の駅の思い出を集め぀぀倧阪ぞ向かいたす。新幹線から地䞋鉄、ニュヌトラムず乗り換えお䌚堎の倧阪南枯ATCホヌルに進むのですが、䌚堎に近づくに぀れお英語を話す乗客が増え囜際色が増しおきたす。 ちょうど技術同人誌即売䌚に向かっお行くず気づいたら呚りが゚ンゞニアだけになるのず同じですね そしお䌚堎倖芳がこちら Devcon 5 䌚堎の倧阪南枯ATCホヌル 䌚堎の連絡通路に倧きく Devcon v ず曞かれおいるのを芋るずテンションが䞊がっおきたす。写真の巊偎が受け付けなのですが、朝䞀の新幹線で行ったにもかかわらず既に人で䞀杯でした。 英語で受付を枈たせお䞭に入りたす。Devcon内の公甚語は英語「だけ」で、日本語が通じるのは䌚堎の譊備員さんだけです。日本人スタッフもいるようですが、区別ができたせん😇  ちなみに、受付時にNFTNon-Fungible Tokenがもらえたす。ワッペンの裏にQRコヌドが印刷されおおり、読み蟌むず自分のアドレスにトヌクンを送るこずができたす。いかにもEthereumのカンファレンスらしいですね。 受付でもらえるWebでNFTが受け取れるワッペン さお、幎々芏暡が倧きくなっおいるDevconですが、今回のDevcon 5は倧きなATCホヌルを3フロアも䜿っお開催されたした。 ATCホヌルのB2、1、6階を䜿っおいたした。6階ぞの゚レベヌタヌはい぀も満員でした それにも関わらずどこにいおも人混みがひどく移動するにも䞀苊劎です。柱の前では参加者たちが立っお議論しおいるかず思えば、そのすぐ近くの床に座り蟌んでコヌドを曞いおいる参加者もいたす。党員がいたるずころで盛り䞊がっおいるものですから、発衚を聞いおいるわけでもないのに受け取る情報量が膚倧になりたす。私は4日間フルで参加したしたが、自分は発衚したわけでもないのに、1日が終わるずくたくたになっおいたした。 ちなみに、さすがに疲れおしたう人がいるのか、Devconには瞑想ルヌムが䌝統的に蚭眮されおいたす。もっずも、瞑想ルヌムで瞑想をしおいる人は誰䞀人ずしおおらず、某「人をダメにする゜ファ」にもたれお寝おいるか、スマホをいじっおいるかのどちらかでしたが゚ンゞニアですからね 地䞋2階のメむンホヌルの暪は亀流スペヌスずなっおおり、軜食が甚意されおいたした。カステラの屋台が朝早くから営業しおいた他、おにぎりやパン、たこ焌き、いなり寿叞、和菓子や駄菓子など「日本っぜい」ものが配られおいたした。たこ焌きが特に人気だったようで、新しいのが来おもすぐなくなっおいたしたね。今回のDevconでは倧阪南枯ATCホヌル内の飲食店で䜿えるクヌポンがひずりあたり6000円だったはず配られおいたのですが、昌間はどの参加者も発衚を聞いたり議論をしたりするのに集䞭しおいお、昌食を配垃された軜食で枈たす人が倚かったように芋えたした。 䞀口サむズのカステラは食べやすく、発衚を聞きながら食べおいる人も倚かったです おにぎりは数皮類が甚意されおいたした たこ焌きは特に人気ですぐになくなっおいたした 和菓子はむンスタ映えするのか写真に収めおいる参加者が倚かったです 地䞋2階の奥にはスポンサヌブヌスがあり、答えるずヘッドホンが圓たるアンケヌトなどバラ゚ティに富んだ方法に宣䌝しおいるようでした。 スポンサヌ䌁業には発衚しおいる䌁業も倚いので、その内容に぀いお参加者が議論しおいる姿も芋られたした。 スポンサヌブヌスに出展しおいる䌁業も日によっお違いたす 䞭倮には参加者が銖から提げる名札を䜜るスペヌスがあり、実際䜿っおいる参加者も倚く芋えたした。我々開発者は぀いTwitterやGitHubのアカりントで人を識別しがちなのでこのような配慮はありがたいです。 今回のビットファクトリヌはa sponsorですね ノベルティを配っおいるコヌナヌもここです。タオル掋かおぬぐい和かを遞ぶずき、スタッフがおぬぐいをやたら掚しおいたのが印象的でした。 dogeのコラヌゞュ画像を䜿った攻めたデザむンのトヌトバッグ Opening 2日目の午前䞭がDevcon 5のオヌプニングセレモニヌです。 Ethereumの考案者であるVitalik Buterin氏によるkeynoteが予定されおいるため、この時間垯は他の䌚堎はお䌑みになっおいたした。 Devconの参加者がほが党員ひず぀のホヌルに集たっおくるので倧隒ぎでした ラむブハりスのようにステヌゞは青い光で照らされ、ハむテンションな音楜が流れおいたした。 セレモニヌは身䜓に響く和倪錓の挔奏から始たり、䌚堎が興奮に包たれたした。 Vitalikも戞惑いながらも和倪錓を叩いおいたしたね。 セレモニヌが始たる前に䌚堎内でだけ遊べるゲヌムが宣䌝されおいたした その埌はVitalikによるkeynoteです。 実際の動画はEthereum FoundationによっおYouTubeに䞊がっおいたす。 Devconでは過去の発衚がYouTubeにアップロヌドされたす。Devcon 5の動画もちょうど今アップロヌドされ぀぀あるようです。 www.youtube.com keynoteの内容は今たさに進み぀぀あるEthererumのPoS移行に関するものでした。 BitcoinはPoWによっおビザンチン将軍問題を解決しただけだけではなく、トランザクションの承認で埗られる経枈的なむンセンティブによっお保蚌を䜜り出せる「暗号経枈 (Cryptoeconomics)」を生んだこず、しかしシステムの砎壊だけを目的ずする攻撃者に察しおは脆匱であるこず、EthereumはPoSに移行するこずで䞍正報告にもむンセンティブを䞎え、より匷固な暗号経枈を䜜り出せるこずを語りたした。 ややもすれば既存のRDBや単なる電子眲名だけで解決できる問題にブロックチェヌンを䜿っおしたうこずがあるこの業界ですが、World ComputerずしおのEthereumの存圚意矩を語る玍埗感のある発衚でした。 かがすちゃん Devconには専甚アプリがあり、タむムテヌブルを芋やすく衚瀺しおくれるずずもに、芋たい発衚を登録するこずができたす。登録した発衚は盎前になるず通知が飛んでくるので䟿利でした。 他のカンファレンスでもぜひ導入しおほしいアプリです。 スマホだずタむトルが芋切れがちなのがやや残念です。タブレット版はよく芋えたす 1日目にはdoge coinのモデルになった柎犬のかがすちゃんも䌚堎にやっおきたした。redditや4chan等で有名になり、気づいたら仮想通貚のモチヌフになっおいた犬です。 サヌビス粟神旺盛なかがすちゃんず参加者が競っお写真を撮っおいたのが印象的でした。 ある意味むンタヌネットの悪乗りから生たれたずはいえ、こうしお仮想通貚の開発者ずモチヌフが亀流する機䌚が実際にできおしたうのはEthereumの"ゆるい"コミュニティ特有の面癜さがありたす。 かがすちゃんがやっおくる発衚の通知もこの圢で飛んできたす 人間慣れしたかがすちゃんは倧人気でした 印象に残った発衚 4日間のDevconを通しお30ほどの発衚を聞きたしたが、いく぀か印象に残ったものを玹介したす。 Universal Login Progress: Results on How to Make Ethereum on Boarding Much Simpler DAppsの最重芁課題ずしおオンボヌディングがしばしば挙げられたす。 ナヌザヌのりォレット情報がどうしおもDAppsには必芁ですが、それはナヌザヌにりォレットの䜜成ず登録を芁求するこずになるからです。 UniversalLoginは埓来のOpenID Connectのようなログむン機構を実珟しおおりUXをさせおいたす。 ただ最初にETHを入れる必芁があるなど課題もあるものの、今回のDevcon 5でオヌプンβ版ずなったUniversalLoginはかなり実甚的になったように芋えたした。 www.youtube.com Optimization techniques for EVM implementations EVMの䞭では 圧倒的な速さ のevmoneの䜜者による発衚でした。 最適化を行う䞊でネックになるのはやはり陀算なので、256bit敎数挔算のC++ラむブラリを䜜ったこずを話しおいたした。 仮想マシンでの最適化ではありたせんが、孊生の頃に陀算の遅さには泣かされおいたので共感できる話でした。 ガスコストの蚈枬に぀いおは時間が足りず駆け足でしたが、これも面癜そうです。 発衚スラむド www.youtube.com Building dApps and IoT using the Incubed Ultra Light Client slock.itによるIoT向けのクラむアントIncubedに぀いおの発衚でした。 䞋の動画はslock.itによるモノを珟実䞖界で特定の人ず共有するサヌビスの玹介ですが、この皮のサヌビスでは普通䞭倮サヌバにナヌザヌずモノの情報を蚘録する必芁がありたす。 そうしたシステムに存圚する、䜕らかの理由でサヌバに぀ながらなくなったり、ハッキングされおすべおのモノが取り出せるようになるリスクを回避するためにブロックチェヌンを䜿うアむデアがありたす。 しかし、IoT機噚の貧匱なスペックではラむトクラむアントすら実行できたせん。 そこで他のフルノヌドに䟝存する圢ですが、ステヌトレスなクラむアントのIncubedを採甚するこずですべおのデヌタを怜蚌できるようにした話でした。 既存の䞭倮に䟝存するシステムを分散システムにする方法ずしお興味深い事䟋でした。 www.youtube.com Grid: your new personal Ethereum infrastructure Gridはgethやparityなどのクラむアントや分散ストレヌゞのipfsのバヌゞョン管理ツヌルです。 たたRemixやブロック゚クスプロヌラヌも内蔵しおおり、開発者にずっお必芁なものを䞀通り揃えおいたす。 Ethereum 2.0ぞの察応も発衚しおおり、DAppsやラむブラリ開発者に広く䜿われおいきそうに思えたした。 www.youtube.com Ending 最終日はあいにく台颚19号が近づいおいたためか、䌚堎の人はかなり枛っおしたいたした。 しかし、゚ンディングセレモニヌは倧盛り䞊がり モバファクず業務提携しおいるBlockBaseさんによるむケむケなデゞタル盆螊りを参加者が競っお写真に収めおいたした。 運営の方々は最初から最埌たで楜しいお祭りずしおDevconを挔出しおいたように思えたした。 サむケデリックなデゞタル盆螊りがカオスなEthereum開発の䞖界を衚珟しおいるようでした Ethereumコミュニティの熱気ずモバファクができるこず こうしお、4日間にわたるDevcon 5は盛況のたた幕を閉じたした。 参加䞭に肌で感じたのは、Ethereumはただただ発展途䞊だずいうこずです。 これは決しおネガティブな意味ではなく、ブロックチェヌンを䜿っお実珟したいこずがどんどん出おきおいるのに開発者の数が党然足りおおらず、カオスな状況がただただ続いおいきそうだずいう期埅です。 Devconの参加者が垞に議論を続けおいる熱い䌚堎や、Devcon 5が閉幕しおからも公開され続ける倚くの新情報を芋るに、この熱気があれば䞖界のEthereumコミュニティは健党に発展しおいくだろうず確信したした。 日本においおもCryptoKittiesから䞀歩進んだDAppsが登堎したり、既存の産業や倧孊での応甚事䟋が出おきたりず面癜い情報が出おきおいたす。 その䞭でモバファクもナヌザヌず開発者䞡方に向けたアプリ開発をさらに掚し進め、ブロックチェヌンのコミュニティに貢献しおいかなければならないず改めお考えたした。 そしお、次回のDevconこそは登壇したいです PR 最埌になりたすが、今回のDevcon 5ぞのスポンサヌ費甚や倧阪たでの亀通費、宿泊費はモバむルファクトリヌの支揎によるものでした。 モバむルファクトリヌはブロックチェヌンのみならず様々なカンファレンスのスポンサヌや゚ンゞニアの参加支揎を行っおおりたす。 Ethereumを䜿った開発に興味を持たれた方、ブロックチェヌンで新しい䞖界を䜜っおいきたい方、 ぜひ䞀緒にモバむルファクトリヌで働きたしょう
はじめに モバファクのCPE *1 ずしお普段は開発基盀・運甚基盀を敎備しおいる id:masasuz です。最近のお仕事ずしおは、CircleCIのオンプレミス版を瀟内に導入したした。この話もどこかで曞きたいですが、今回はモバファクにあるキャリアアップ支揎制床を甚いおArchitecting on AWSを受講した話です。 泚意点ずしお、トレヌニングの内容は4/25 *2 に受講した時点の情報なのでその埌倉わっおる可胜性がありたす。留意ください。 3行でたずめるず Architecting on AWSはAWSを觊る人にずっおずっかかりずしおずおもよい モバファクのキャリアアップ支揎制床はよい モバファクぱンゞニア採甚しおるよ Architecting on AWSずは Architecting on AWS - AWS トレヌニング | AWS Architecting on AWSはAWSが䞻催するAWSの蚭蚈に関する有料のクラスルヌムトレヌニングです。 孊習する抂芁を䞋蚘に匕甚したすが、ざっくりず蚭蚈に関する䜓系的な知識やベストプラクティスが孊べるトレヌニングずなっおいたす。 コヌスの目暙 このコヌスの孊習内容は以䞋のずおりです。 AWS のアヌキテクチャに関する原則ずベストプラクティスに基づいお、アヌキテクチャ䞊の決定を行う AWS の各サヌビスを掻甚しお、スケヌラブルで信頌性や可甚性の高いむンフラストラクチャを䜜成する AWS マネヌゞドサヌビスを掻甚しお、むンフラストラクチャで柔軟性や匟力性を向䞊させる パフォヌマンス向䞊ずコスト削枛のために、AWS ベヌスのむンフラストラクチャを効率化する Well-Architected フレヌムワヌクを䜿甚し、AWS ゜リュヌションを䜿っおアヌキテクチャを向䞊させる 察象者 このコヌスは次のような方を察象ずしおいたす。 ゜リュヌションアヌキテクト ゜リュヌション蚭蚈゚ンゞニア 受講する動機 モバファクでは1,2幎前から *3 既存のサヌビスをAWS䞊で動くように移管し始めたした。その際、AWSぞの䜓系的な知識が足りおなくお、新しいこずを始めるにあたっお䜕をするにも䞀から調べなければならず、時間がかかっおいたずいう悩みがありたした。たた、䜿ったこずあるもの、今必芁ずしおいるものの断片的な知識しかがなく、非効率な実装をしおいる可胜性がありたした。 䞀郚のサヌビスでは本栌的に運甚しおいるものもありたしたが、モバファクではただオンプレミスの環境を䜿っおいるプロダクトが倚く、これらを今埌AWSを初めずしたクラりドに移管しお円滑に運甚しお行くには今のたたではよくない。もっず䜓系的なAWSの知識を身に぀けおおきたいずいう欲求がもずもずありたした。 そんな折、クラスメ゜ッドさんの蚘事 *4 を芋おArchitecting on AWSずいうトレヌニングがあるこずを知り、今抱えおる䞍満や欲求を満たしおくれるものではないかず興味を持ちたした。ただ、受講料21䞇円ず金額的にちょっず個人で出すには厳しいなず最初は思っおいたした。ここでふず、モバファクにあるキャリアアップ支揎制床ずいう犏利厚生があるこずを思い出したした。キャリアアップずいう制床の趣旚にもあっおるので無事申請が通り参加しおきたした。 キャリアアップ支揎制床に぀いお モバファクでは、瀟員が受講を垌望する研修や研修に準ずる費甚(枡航費等)を䌚瀟が予算枠内で支揎する制床がありたす。目的ずしおは瀟員ずしおは成長するこず、䌚瀟ずしおは瀟員が成長するこずによりチヌム/䌚瀟に貢献するこず。これが求められたす。 この制床の利甚䟋ずしおは、以䞋のものを想定しおいたす。 倖郚の高額な有料のセミナヌ、勉匷䌚、カンファレンス参加費甚 5000円たでの少額な参加費甚であれば、別の制床が利甚可胜 専門的な資栌取埗、長期間の講座受講が必芁な研修 高額な曞籍の賌入等々 倖郚に衚出しおるものでは、 id:kfly8 がThe Perl Conference2019に行っおきた利甚䟋がありたす。 The Perl Conference 2019 in Pittsburghに行っおきた - Mobile Factory Tech Blog Architecting on AWS 圓日の流れ テキストずしお、VitalSource Bookshelfずいう電子曞籍プラットフォヌム䞊で動く電子曞籍が配垃されたした。そのほか、補足資料のPDFファむルず参考URL集が提瀺されたした。 基本的な流れずしおは以䞋の通りでした。 テキストを芋぀぀、座孊での講矩を行う 章の終わり毎に隣の人ず孊んだこずの理解を確認するディスカッションを行う 耇数章おきにラボ課題ずしお実際にQwiklabを䜿甚しおAWSを動かす 2日目ず3日目にグルヌプディスカッションを行いシナリオに沿ったAWSでの蚭蚈を行う 良かった点 座孊で聎いおいるだけでなく、ディスカッションを通しおより理解が深たりたした。 隣の人ずディスカッションしお珟状の理解を蚀語化するこずによっお、芋えおなかった疑問点が衚出できたずいうのは個人的には良い気付きでした。 グルヌプディスカッションでは架空の䌁業のAWSむンフラを蚭蚈するを行うのですが、ディスカッションを通し実際にAWS䞊で構築する䞊で䜕に泚意すれば良いのかが分かりずおも有意矩でした。参加した人たちはそれぞれいろんなバックグランドを持っおおり、いろんな芳点からのも蚭蚈思想を知れたの収穫でした。 留意する点 参加費が21䞇円+消費皎なのでたあたあ高額なこず。この手のトレヌニングずしおは取り立おお高くはないずは思いたすが、個人でぜんず出すにはためらう金額ではありたす。そのためか、同じ日に参加しおいた人たちの䌚瀟名が倧きめの䌁業が倚かったように感じたした。 開催しおいる時間垯が平日の9:30-17:30で3日間ずいうこず。ボリュヌム的にこの時間は必芁なのではありたすが、平日に3営業日トレヌニングのために確保する必芁がありたす。もちろん、業務調敎はちゃんずしたしたが、快く送り出しおくれた䞊長には感謝しおおりたす。 もちろん、3日間でテキストの内容を党郚詰め蟌めるわけではありたせん。詰め蟌めたずしおもそういった知識ずいうのは埗おしお時間が経぀ず忘れおしたうものです。どんな研修でも圓おはたるありがちなこずですが、埩習が肝芁です。 たずめ AWSをさわり始めた人や今AWSを觊っお業務しおいる人が知識の土台を䜜るものずしおはArchitecting on AWS良いトレヌニングだず感じたした。むンフラ専門に觊っおいる人だけでなく、アプリケヌション開発偎の立堎でAWS觊っおいる人にもお勧めできる内容だず思いたす。 そしお、今回自分ずしおは初めおモバファクでのキャリアアップ支揎制床利甚したのですが、費甚面で個人だずなかなか手が出ない研修等に参加できるずいうこずで良い制床だず思いたす。たた、キャリアアップ支揎制床をはじめそれ以倖でも、゚ンゞニアが気持ちよく開発できる犏利厚生がそろっおいるず思いたす。もし、モバファクに興味ある方はお声かけいただけたらず思いたす。 採甚サむト | 株匏䌚瀟モバむルファクトリヌ *1 : Corporate Productivity Engineer。もう少し説明する必芁があるのですが、ここではざっくりむンフラ回りを觊っおる゚ンゞニアずしお理解しおください *2 : 半幎以䞊前なのに今頃゚ントリ曞いおるのは倧倉申し蚳ないです。。。。 *3 : それ以前からAWSで動いおいるサヌビスもありたす *4 : 【AWS公匏】Architecting on AWSはAWS初心者䞭玚者に最適のトレヌニングでした  Developers.IO
はじめに この蚘事は モバむルファクトリヌ Advent Calendar 2019 の11日目の蚘事です こんにちは今幎床よりモバむルファクトリヌに入瀟した yasuda です 今回はブラりザ䞊で地図を描画するラむブラリである MapboxGL JS ずその䜿甚䟋に぀いお玹介したす 前提 この蚘事は以䞋のバヌゞョンを元に執筆しおいたす mapbox-gl-js: 1.6.0 たた本蚘事内で甚いられる座暙(緯床・軜床)は党おGoogle Maps などから目芖で取埗したデヌタです Mapbox GL JS に぀いお Mapbox GL JS はWebGL で動䜜する地図ラむブラリです Webでの動䜜のためPCでもモバむル端末でも扱うこずができたす たた地図配信サヌビスの Mapbox ず組み合わせおオリゞナルの地図を配信・衚瀺するこずができたす 最小構成 たずはmapbox-gl を䜿っお最䜎限の蚭定をしお地図を衚瀺しおみたす ここでは 公匏HPのサンプルコヌド を参考にしたす 今回は地図のスタむルデヌタに぀いおは既にできおいるものずしお詳しくは扱いたせん < body > < div id = 'map' ></ div > </ body > htmlはid: map のタグ1぀のみ甚意したす body { margin : 0 ; padding : 0 ; } #map { position : absolute ; top : 0 ; bottom : 0 ; width : 100% ; } css では党画面衚瀺を行うためのスタむルを圓おたす mapboxgl.accessToken = 'XXXX' style = 'YYYY.json' window .onload = () => { var map = new mapboxgl.Map( { container: 'map' , style: style, } ) } jsでmapboxgl の初期化凊理を行いたす (accessToken ず style は適宜倉えおください) これだけで地図の描画ができたす ドラッグで移動ダブルクリックやホむヌルの回転でズヌムずいった基本的な操䜜も行うこずができたす たた右クリックでドラッグするず地図を回転させるこずもできたす そしおMapbox GL JS はモバむル端末でも䜿甚できスワむプやピンチむン・アりトずいった操䜜も可胜です ではここからは Mapbox GL JS の䜿甚䟋を実際に䜿いながら玹介しおいきたす 初期座暙を倉える これも初めの䟋に乗っおいたのですが mapboxgl の初期化時に center (緯床・経床) ず zoom を枡すこずで初期倀を倉曎するこずができたす 今回は適圓に五反田駅蟺りを䞭倮にしおみたした center: [ 139.7237285, 35.6262489 ] , zoom: 15, 䟋えば䜿甚しおいる端末の䜍眮情報をこの初期倀に枡すこずで䜿甚者の呚蟺の地図を映すずいったこずができたす マヌカを䜿甚する Mapbox GL JS にはマヌカ機胜があり地図が元々持っおいる情報ずは別に远加で目印を぀けるこずができたす let marker = new mapboxgl.Marker() .setLngLat( [ 139.727101, 35.6259434 ] ) .addTo(map) 䟋ずしお匊瀟オフィスの近くにマヌカをおいおみたす 右の方にある青いマヌカが匊瀟の堎所です ここはさっきの五反田駅を䞭心に移した地図にも写っおいたのですがこのようにマヌカを䜿うこずでより目立たせるこずができたす 今回䜿甚したのはデフォルトのマヌカですがhtmlずstyleを定矩するこずでオリゞナルのマヌカを䜿甚するこずもできたす マヌカを耇数配眮する堎合 耇数のマヌカを同時に配眮する堎合マヌカの描画順序に泚意する必芁がありたす 䟋えば2぀のマヌカが前埌に隣接しおいる堎合画面䞊で䞊に䜍眮するマヌカは 埌方 にあるず認知したす こちらは南北に真っ盎ぐ進む京郜垂営地䞋鉄烏䞞線の各駅を駅メモの地図で芋た画像です このアむコンは圱が付いおいるこずからも前埌関係を重芁芖しおいるこずがわかりたす しかしMapbox GL JS には耇数のマヌカの描画順序を蚭定する機胜は無くデフォルトでは .addTo(map) によっお登録した順に描画されたす その際に前埌関係が正しくなるように登録すれば良いず思うのですが 地図が回転するず初期の前埌関係では砎綻するこずがありたす そこで地図が回転するず動的にマヌカの前埌関係を修埩する凊理を远加しおみたす this .map.on( 'rotate' , () => { var markerElements if (markerElements || markerElements.length) { markerElements = Array .from( document .getElementsByClassName( 'mapboxgl-marker' )) } let yPositions = [] markerElements.forEach((marker) => { let transform = marker.style.transform yPositions.push(parseInt(transform.slice(transform.lastIndexOf( ',' ) + 1))) } ) let minY if (yPositions && yPositions.length) { minY = yPositions.reduce( (a, b) => a < b ? a : b) } markerElements.forEach((marker, index) => { marker.style.zIndex = yPositions [ index ] - minY + 1 } ) } ) 地図が回転した際に呌ばれるコヌルバック関数を登録し党マヌカのhtml芁玠から transformのy芁玠で゜ヌトし z-index に枡したす (この方法では地図以倖の芁玠のz-indexずの干枉を考慮しおいないので必芁に応じお倉えおください) 地図䞊に線を匕く 先皋は特定の地点を目立たせるマヌカを配眮したしたが次は地図䞊に線を描画しお道のりを目立たせおみたす Mapbox GL JS は GeoJSON を扱うこずができ,座暙などを含むjsonを枡すこずで線や面の描画ができたす map.on( 'load' , function () { const lngLats = [ [ 139.7029507, 35.657829 ] , [ 139.7107544, 35.6462484 ] , [ 139.7162516, 35.6343683 ] , [ 139.7237285, 35.6262489 ] , [ 139.7283931, 35.6198556 ] , [ 139.7388572, 35.6299566 ] , ] map.addLayer( { 'id' : 'route' , 'type' : 'line' , 'source' : { 'type' : 'geojson' , 'data' : { 'type' : 'Feature' , 'geometry' : { 'type' : 'LineString' , 'coordinates' : lngLats, } } } , 'paint' : { 'line-color' : '#0c7' , 'line-width' : 8, } } ) } ) 䟋ずしお山手線の枋谷-品川間の各駅を結ぶ折れ線を匕きたした 他にもナヌザが定期的に珟圚地を登録しおいればその日に移動した経路を地図䞊に衚瀺したりするこずもできたす 泚意点ずしお geoJSONを地図に描画する map.addLayer() は mapboxgl の初期化凊理が終了した埌に呌び出す必芁がありたす 地図の初期化凊理である new mapboxgl.Map() の完了には少し時間がかかるため map.on('load', function(){~}) などで読み蟌みが完了したのを埅っおからgeoJSONの远加凊理を行うず安党です 終わりに Mapbox GL JS によっおモバむルのネむティブアプリずも倧差ない機胜を持぀地図を䜜るこずができたす 本蚘事ではその䜿甚䟋の䞀郚を玹介したした Mapbox GL JS には今回玹介しきれおいない倚くの機胜が備わっおおり様々な地図アプリを䜜るこずができたす
この蚘事は モバむルファクトリヌ Advent Calendar 2019 の4日目の蚘事です。 こんにちは、ブロックチェヌンチヌムで゚ンゞニアをしおいる id:odan3240 です。 今回は Ethereum のスマヌトコントラクト (以䞋コントラクト) を TypeScript から型安党に扱う方法に぀いお玹介したす。 前提 この蚘事は以䞋のバヌゞョンを元に執筆されおいたす。 NodeJS: 10.16.3 TypeScript: 3.7.2 web3: 1.2.4 typechain: 1.0.3 typechain-target-web3-v1: 1.0.3 JavaScript からコントラクトを扱う方法 JavaScript からコントラクトを扱う堎合に甚いるラむブラリずしお web3.js がよく知られおいたす。 web3.js を甚いおコントラクトのメ゜ッドを呌び出すコヌドは以䞋の通りです。 import Web3 from "web3" ; async function main() { // abi は蚭定されおいる前提 const abi = {} ; const web3 = new Web3(); const contract = new web3.eth.Contract(abi); await contract.methods.isOwner().call(); } main(); このコヌドにおいお contract.methods.isOwner().call() の郚分は実行時たで正垞に実行されるかがわかりたせん。なぜなら、コントラクトの実装の内容に応じお生えおいるメ゜ッドは異なるためです。 実際に VSCode でマりスオヌバヌしお型を衚瀺するず any 型になっおしたっおいたす。 型安党に扱う方法 コントラクトの abi ファむルには、そのコントラクトにはどんな匕数のどんなメ゜ッドが実装されおいるかの情報が栌玍されおいたす。この abi ファむルの情報から TypeScript の型定矩ファむルを生成すれば、型安党にコントラクトを扱うこずができたす。 これを行うモゞュヌルずしお、 @0x/abi-gen や TypeChain がありたす。 今回は実際にプロダクトで採甚しおいる TypeChain の䜿い方を玹介したす。 TypeChain の䜿い方 TypeChain はコアパッケヌゞの typechain ず、コントラクトを扱う各ラむブラリ向けのモゞュヌルから構成されおいたす。今回は web3.js 向けのコヌドを出力しおほしいので typechain-target-web3-v1 を導入したす。 $ yarn add -D typechain typechain-target-web3-v1 コントラクトのコンパむル結果を build ディレクトリに栌玍しおいる堎合、以䞋のコマンドを実行するず generated-abi/typechain/web3 ディレクトリに型定矩ファむルが生成されたす。 $ yarn typechain --target=web3-v1 'build/contracts/**/*.json' --outDir generated-abi/typechain/web3 䜿い方は簡単で、型を import しお Contract クラスを new するずころで as するだけです。 import Web3 from "web3" ; import { AbiItem } from "web3-utils" ; import { MyContract } from "../generated-abi/typechain/web3/MyContract" ; async function main () : Promise < void > { const abi = ( {} as any ) as AbiItem ; const web3 = new Web3 (); const contract = new web3.eth.Contract ( abi ) as MyContract ; await contract.methods.isOwner () .call (); } main (); 再びマりスオヌバヌしおみるず型が衚瀺されおいるのがわかりたす。 泚意点 web3.js ず TypeChain を䜿うずきには web3 ず typechain-target-web3-v1 のバヌゞョンの組み合わせに泚意する必芁がありたす。 具䜓的には以䞋の通りです。 1.2.1 以前の web3 を䜿甚しおいる堎合 1.0.2 以前 の typechain-target-web3-v1 を䜿甚する必芁がありたす 1.2.2 以降の web3 を䜿甚しおいる堎合 1.0.3 以降 の typechain-target-web3-v1 を䜿甚する必芁がありたす この問題が発生しおいる理由は、1.2.1 以前の web3 は型定矩ファむルがモゞュヌルに含たれおいないため @types/web3 を利甚する必芁があったのに察しお、1.2.2 からモゞュヌル自䜓に型定矩ファむルが含たれるようになり、これらの型定矩ファむルに互換性がないためです。 github.com サンプルリポゞトリ 今回玹介したコヌドの断片が含たれおいるサンプルリポゞトリです。 github.com 終わりに 型安党に TypeScript からコントラクトを扱う方法ずしお、TypeChain を甚いお abi ファむルから型定矩ファむルを生成するアプロヌチを玹介したした。 ゚ディタの補完機胜によっおコントラクトの実装を参照するこずなく、コントラクト呚りのコヌドを実装できる䜓隓を是非お詊しください。
この蚘事は モバむルファクトリヌ Advent Calendar 2019 3日目です。 こんにちは、゚ンゞニアの id:yumlonne です 昚幎の モバむルファクトリヌAdvent Calendar 2018 では、 Perlのテストモゞュヌルの玹介 ずいう蚘事を曞きたした。 今回は単䜓テストでモック *1 を倚甚した結果、蚭蚈時にテストの芖点を持぀こずが倧事だなぁず思ったのでその孊びを曞くこずにしたした。 モックを䜿いたい 私が所属するチヌムでは、モゞュヌルを䜜成したずきに単䜓テストを曞く習慣がありたす。 それに倣っお単䜓テストを曞いおきたしたが、以䞋の理由でテストが倧倉なこずがありたした。 パブリックなメ゜ッドでは Data::Validator による匕数のバリデヌションを行っおいる 生成するのが倧倉な巚倧なオブゞェクト *2 を匕数ずするメ゜ッドがある DBなどの状態を倉曎する䜜甚(副䜜甚)を持぀メ゜ッドをいろいろな箇所から呌んでいる テスト甚のナヌティリティモゞュヌルに巚倧なオブゞェクトを生成しおくれる機胜はありたしたが、テスト甚DBに問い合わせおデヌタを生成するため速床が犠牲になっおいたした。 そこで、巚倧なオブゞェクトをモックオブゞェクトに差し替えるこずを考えたした。 Test::MockObject を䜿おうず思ったのですが、モックし぀぀バリデヌションを通過するオブゞェクトを䜜るこずができたせんでした。 (远蚘: すみたせん、Test::MockObject#set_isaでisaを停装できるこずを芋萜ずしおいたした。 ) たた、 Test::MockModule や Test::Mock::Guard を䜿えば䞀応バリデヌションを通過するモックオブゞェクトを䜜れたのですが、同じクラス *3 のモックオブゞェクトを耇数個䜜成しそれぞれに別の振る舞いをさせるこずがでたせんでした。 容易にできないのなら䜜っおしたえずいうこずで、 バリデヌションを通過するモックオブゞェクトを䜜成するモゞュヌル を曞きたした。 このモゞュヌルは、 @ISA に芪クラスを蚭定した匿名クラスを䜜成したす。これによりバリデヌションを通過するモックオブゞェクトを生成でき、1ず2をクリアしたす。 3に぀いおは Test::MockModule や Test::Mock::Guard でモックするこずで、テスト内での倉曎䜜甚を抑えるこずができたす(チヌム内では Test::Spec を䜿っおいるため、付随する Test::Spec::Mocks でモックするこずが倚いです)。 倧倉だず感じたずころをモックによっお解消できたので、これを䜿っお実際にテストを曞いおみたした。 埮劙なテストができる 䟋えば、以䞋のようなナヌザ登録のコヌドがあったずしたす。 package Repository::User { sub register { # DBにナヌザを登録しおUserオブゞェクトを返す } }; package Model::User { use Data::Validator; use Repository::User; sub register { # 本圓はData::Validatorでチェックしおるけど長いので省略 my ( $class , $user_info ) = @_ ; # XXX : 倱敗は適圓に衚珟(reasonずかを含めるべき) return - 1 unless $class->nickname_is_valid ( $user_info->nickname ); return Repository::User->register( $user_info ); } sub nickname_is_valid { # ニックネヌムに䜿えない文字が無いか怜査する } } このコヌドに察しおこんなテストを曞きたした。 use Test::Spec; use Test::MockObject::AnonClass qw/create_mock_object/ ; use Model::User; use Repository::User; describe 'Model::User#registerに぀いお' => sub { my ( $user_info , @repository_args , $res ); before all => sub { $user_info = create_mock_object(+{ # user_infoのモックオブゞェクトを䜜成 parent => 'UserInfo' , methods => +{ nickname => 'piyo' , }, }); Repository::User->stubs( register => sub { # Repository::User#registerをモック @repository_args = @_ ; return 'mocked' ; }); }; context '登録できるnicknameのずき' => sub { my ( $res ); before all => sub { Model::User->stubs( nickname_is_valid => sub { 1 }); $res = Model::User->register( user_info => $user_info ); }; it 'Repository::User#registerを正しい匕数で呌ぶ' => sub { # @repository_argsが期埅通りか }; it '戻り倀はRepository::User#registerの戻り倀' => sub { # $resが期埅通りか }; }; context '登録できないnicknameのずき' => sub { # 省略 } }; runtests unless caller ; # テスト実行 曞いおあるこずをテストにしただけなのでこのテストは通りたす。しかし、リファクタリングなどで実装が倉わった堎合、振る舞いが倉わっおいなくおも倱敗する可胜性がありたす。 このテストを改善するために この問題は、テストが実装を知りすぎおいるために発生しおいたす。 なので、入出力などの振る舞いのみをチェックするブラックボックステストを曞くこずによっおこの問題を解決たたは軜枛できたす。 ブラックボックステストの難しさ 振る舞いをテストするず口で蚀うのは簡単ですが、実際にはずおも難しいこずだず考えおいたす。 倀を受け取っお倀を返すだけの玔粋なメ゜ッドであれば入出力をチェックすれば良いのですが、DBなど倖郚状態の曎新を䌎うメ゜ッドだずDBに問い合わせなければならないので堎合によっおはスロヌテストになっおしたいたすし、倚数のモゞュヌルに䟝存しおいるメ゜ッドだず振る舞いが耇雑になりたす。 ブラックボックステストをしやすいようにする このような状況を避けるため、蚭蚈段階でテストのしやすさを考慮するこずが重芁だず考えたした。 䞀䟋ですが、䞊に挙げたナヌザ登録の「DBぞの副䜜甚」をオブゞェクトに包んで返すこずでModel::Userから副䜜甚を排陀するこずができたす。 これにより、Model::Userに関しお実装に䟝らないテストを曞くこずができたす。 package Repository::User { sub register { # DBにナヌザを登録しおUserオブゞェクトを返す } }; package Command::RegisterUser { sub new {} # user_infoを保持 sub exec {} # ナヌザを登録しおUserを返す } package Command::None { sub new {} sub exec {} # 䜕もしない } package Model::User { sub register_command { # 本圓はData::Validatorでチェックしおるけど長いので省略 my ( $class , $user_info ) = @_ ; # 倱敗は適圓に衚珟(reasonずかを含めるべき) return Command::None->new unless $class->nickname_is_valid ( $user_info->nickname ); return Command::RegisterUser->new( $user_info ); } sub nickname_is_valid { # ニックネヌムに䜿えない文字が無いか怜査する } } 副䜜甚がないメ゜ッドのため、匕数ず戻り倀だけの察応で考えるこずができたす。 use Test::Spec; use UserInfo; use Model::User; use Repository::User; describe 'Model::User#register_commandに぀いお' => sub { context '登録できるnicknameのずき' => sub { my ( $user_info , $res ); before all => sub { $user_info = UserInfo->new( nickname => 'piyo' , age => 22 , comment => 'hello!' , ); }; it 'ナヌザ登録コマンドを返す' => sub { $res = Model::User->register_command( user_info => $user_info ); ok $res->isa ( 'Command::RegisterUser' ); }; }; context '登録できないnicknameのずき' => sub { # 省略 } }; runtests unless caller ; # テスト実行 この他にコマンドのテストを曞く必芁がありたすが、コマンドの凊理自䜓はシンプルなので簡単に曞くこずができたす。 副䜜甚を発生させる箇所を考慮するこずで、テストしやすい郚分を増やすこずができたした。 たずめ モック倚甚したテストを曞くこずにより、ブラックボックステストの芳点も重芁だずいうこずがわかりたした。 蚭蚈段階からテストを考慮しお進めおいくず、テストしにくい副䜜甚を持぀モゞュヌルや䟝存関係の郜合䞊ブラックボックスではテストしにくいモゞュヌルを枛らすこずができ、より安定したプロダクトにするこずができるのではないかず思いたす。 *1 : この蚘事では、厳密にはスタブであるものもモックず呌んでいたす *2 : Aniki::Row オブゞェクトや、それを耇数個持った状態デヌタなど *3 : Perlの蚘事ですがパッケヌゞをクラスず衚珟しおいたす
 この蚘事は モバむルファクトリヌ Advent Calendar 2019 2日目の蚘事です。  ヒュヌマンリレヌションズ郚シニア゚ンゞニアの id:kfly8 です。昚日、 id:karupanerura が公開しおいた 2019幎の最先端のPerl開発ボむラヌプレヌト にお、 Function::Parametersで (InstanceOf['Point']) ず括匧でくくる必芁がある ずありたした。この蚘事ではこの補足をしたいず思いたす。  たず、問題の敎理をしたいず思いたす。今回、2぀の芳点で、期埅ず異なっおいるず思いたす。たず、 InstanceOf['Point'] は、Type::Tinyの匏ずしおは正しいので、そのたた、Function::Parametersでも䜿わせお欲しいはずです。 # Type::Tinyの匏ずしおは正しい use Types::Standard -types; my $type = InstanceOf[ 'Point' ]; # けれど、Function::Parametersではそのたた䜿えない fun foo(InstanceOf[ 'Point' ] $foo ) { ... } # error!  もう䞀぀期埅するこずは、Function::Parametersの issue にあるように、クラス名を型制玄ずしお利甚したいはずです。普段、Mouseに慣れおいるず、isaにクラス名を文字列で指定できるので尚曎です。 # Mouseを䜿っおいれば、クラス名を文字列で指定できる use Mouse; has foo => ( is => 'ro' , isa => 'Foo' , # Fooオブゞェクトを期埅 );  今回この期埅通りではないので、違和感を感じさせおいるず思いたす。 Function::Parameters の型指定の仕様  䞊述の問題は、䞀蚀でたずめおしたうず、Function::Parametersの仕様のためですが、もう少し玍埗感がでるように、Function::Parametersの仕様を掘り䞋げおみたいず思いたす。Function::Parametersの ドキュメント にも同様の説明があるので、合わせお確認しおみお欲しいです。  たず䞀番簡単な䟋を説明したす。Function::Parametersは、 Str ず型指定した堎合は Str 関数が同䞀パッケヌゞに定矩されおいるかコンパむル時に探玢したす。 Str 関数が定矩されおいなければ、コンパむル時に゚ラヌになりたす。 # Strず指定するこずで、Str関数が定矩されおいるかコンパむル時に探玢する fun foo(Str $s ) { ... }  パラメタ付きの型 ArrayRef[Int] を指定した堎合は Int 関数ず ArrayRef 関数が定矩枈みかコンパむル時に確認し、 Str | Undef のpipeでUnion型ずした堎合は Str 関数ず Undef 関数が定矩枈みかコンパむル時に確認したす。 # IntずArrayRef関数が定矩されおいるか探玢 fun bar(ArrayRef[Int] $numbers ) { ... } # Str, Unde関数が定矩されおいるか探玢 fun baz(Str|Undef $maybe_str ) { ... }  ぀たり、 Function::Parametersの型指定の文法仕様は、識別子ず同名の関数を結び぀ける仕様になっおいたす。 Function::Parametersの型指定の仕様 識別子(䟋: Str ) パラメタ付き識別子(䟋: ArrayRef[...] ) 識別子の合成(䟋: Str | Undef )  なので、 InstanceOf['Int'] のように型指定をした堎合、型定矩が芋぀けられず、文法゚ラヌになりたす。 fun fuga(InstanceOf[ 'Foo' ] $a ) { ... } # => In fun fuga: missing type name after '['  さらに、この仕様により、 Strr のように指定する型名を間違えた堎合は、コンパむル時に゚ラヌにできたす。぀たり、 型定矩されおいなければ、コンパむル時に゚ラヌになるず考え、開発できたす。 これは他のPerlのValidationモゞュヌルにないメリットだず思いたす。 fun foo(Strr $a ) { ... } # => Undefined type name main::Strr  どうしおも逃げ道が欲しい堎合、匏を () で包めば、匏を評䟡する仕様があるのでそれを䜿いたす。䟋えば (InstanceOf['Foo']) ず型指定した堎合は、括匧内の InstanceOf['Foo'] ずいう匏をコンパむル時に評䟡したす。 # InstanceOf['Foo'] を括匧で包むず、括匧内を匏ずしお評䟡される fun fuga((InstanceOf[ 'Foo' ]) $a ) { ... }  ただ、この曞き方のデメリットはありたす。たず、匏を評䟡しおいるだけなので、゚ラヌメッセヌゞから原因が掚枬しにくいです。 fun fuga((IstanceOf[ 'Foo' ]) $a ) { ... } # XXX : InstanceOf の぀づりが間違っおいる # => syntax error # これでは、゚ラヌの原因が分かりにくい  たた、クラス名を間違えおも、文法゚ラヌになりたせん。 # クラス名を間違えおも文法゚ラヌにならない fun fuga((InstanceOf[ 'Foooo' ]) $a ) { ... } # => syntax OK  もし識別子の曞き方に統䞀できれば、コンパむル時に問題に気づけたす。 匏衚珟は柔軟ではありたすが、極力、䜿わないようにした方が良いず思いたす。その方法に぀いお次の段萜に曞きたす。 aliasedで文字列のalias関数を甚意し、型指定に䜿う metacpan.org  このモゞュヌルは、Too::Long::Fooずいうクラスをロヌドし぀぀、Fooずいった名前で利甚できるようにするモゞュヌルです。SYNOPSISは次の通りです。 use aliased 'Too::Long::Foo' ; my $foo = Foo->new; print Foo ; # => Too::Long::Foo  aliasedを利甚するこずで、Too::Long::Fooずいうクラスを、 (InstanceOf['Too::Long::Foo']) ずいった蚘述をするこずなく、 InstanceOf[Foo] ずいった圢で曞けたす。Fooが関数になったので、こういった蚘述ができたす。簡朔ですね use Types::Standard -types; use Function::Parameters; use aliased "Too::Long::Foo" ; fun foo(InstanceOf[Foo] $foo ) { ... } # これは、fun foo( (InstanceOf['Too::Long::Foo']) $foo) { ... } ず同じ  たた、aliasedを䜿うこずで、useできたクラスしか関数ずしお䜿えないので、 Foooo ずいったタむポにもコンパむル時に気づけたす。 use aliased "Too::Long::Foo" ; fun foo(InstanceOf[Foooo] $foo ) { ... } # => Foooo が芋぀からないので、コンパむル時に゚ラヌ aliasedずFunction::Parametersを組み合わせるこずで埗られるメリット 簡朔 型の指定方法が、識別子に統䞀できる () のあるなしで迷わない 識別子か文字列か迷わない クラス名の名前を間違えおも、コンパむル時に気づける たずめ Function::Parametersの型指定は、識別子ず同名の関数が定矩枈か探玢する 型指定に、匏衚珟を甚いるこずができ、柔軟だが、゚ラヌがわかりにくい aliasedを䜿えば、文字列を関数にでき、識別子を䜿った型指定方法に寄せられ、簡朔に蚘述でき、゚ラヌも怜知しやすい たずめるずこんな感じです おたけ  そもそも、なぜFunction::Parametersが識別子を基本ずする仕様にしおいるのか考えおみたす。䞊述の通り、簡朔、゚ラヌが怜知しやすいこずは理由になるず思いたす。自分が考えるもう䞀぀の理由は、Function::Parametersが奜きな型制玄を䜿えるようにする為です。Function::Parametersが型制玄に芁求するこずは、check、get_messageが型制玄にduck typeされおいるこずだけです。これにより、Type::Tiny、Mouse::Meta::TypeConstraintずいった耇数の型制玄クラスを䜿えたす。もしクラス名を型制玄に倉換するずしたら、Data::Validatorであれば、Mouseに䟝存させおいたすが、Function::Parametersでは、特定の型制玄に䟝存させないずいけないかもしれたせん。これは倧きなトレヌドオフだず思いたす。さらに、 Enum["Foo", "Bar"] のようにEnumの倀をクラス名ずみなすか倀ずするか区別する文法は型制玄䟝存無しに実珟するのは難しいように思いたす。こういった理由から、珟圚の仕様で良いず自分は思っおいたす。
 この蚘事は モバむルファクトリヌ Advent Calendar 2019 1日目です。  ヒュヌマンリレヌションズ郚シニア゚ンゞニアの id:kfly8 です。普段は組織暪断しお人材開発などを行ったりしおいたす。その䞭で、メンバヌにずっお初回の1on1はどうするず良いか聞かれるこずがありたす。確かに、メンバヌにずっおも䞊叞偎にずっおも初回の1on1は予想がしづらく、倚かれ少なかれ緊匵感があるず思いたす。特にチヌムに入ったばかりの新人の堎合、1on1をそもそも䜓隓したこずがなく、䞍安は倧きいかもしれたせん。そんな時、どうするのかここではそんなこずを曞きたいず思いたす。 3行たずめ 思っおいるこずを話しやすい雰囲気䜜りが倧切 そのために、たずは䞊叞偎が自己開瀺しよう 自己開瀺には、趣味、倱敗談など等身倧の話をするのがいい  盎感的には圓たり前かもしれないですが、もう少し掘り䞋げおみたいず思いたす。 初回の1on1の目的  たず、䜕を目的ずするかです。  信頌関係が出来おいない盞手に自分が䜕を考えおいるのか話すのは、億劫だず思いたす。メンバヌ偎は䞋手なこずを話しお評䟡を䞋げられたくないなんお思うかもしれたせん。自分のこずを話すのが苊手な人もいるず思いたす。30分皋床の1on1、たった1回で無理しお解決する問題ではないです。出来るずころから気軜に始めた方が長期的に続けやすいず思いたす。  チヌムの目暙や期埅を䌝えるのはどうでしょうか仕事を進めるには必芁なこずです。もしメンバヌ偎が疑問に思っおいるのであれば、認識を合わせた方が良いず思いたす。ただ、数字や具䜓的な行動は認識合わせしやすいず思いたすが、背景にある意矩や思いは、話し手がどんな人か分からないず、玍埗感が出にくいず思いたす。䟋えば、今この蚘事を読んでいる人で、この蚘事を曞いおいる筆者が信甚できるか考える人はいるず思いたす。  初回の1on1の目的のおすすめは、話しやすい雰囲気䜜りのために、たずは䞊叞偎がどんな人であるか知っおもらうこず、自己開瀺するこずです。郚䞋偎が自分の考えをオヌプンにするには、たず䞊叞偎の考えや思いをオヌプンにする。郚䞋偎だけに話しおもらうのは悪いです。䞊叞偎がオヌプンでいるこずは郚䞋ぞの信頌の蚌だず思いたす。  自己開瀺するこずは急がば回れな䜜戊です。理論的な背景ずしお、メンバヌ成長のため、 束尟睊教授のいう経隓孊習モデル を回すこずを意識しおいたす。呚りずの぀ながりが、成長に圱響を䞎えるこずがわかりやすいモデルです。 初回の1on1ではこのサむクルの真ん䞭、思い、぀ながりが狙い目 初回の1on1でどんな自己開瀺をするか  自己開瀺をするず蚀っおも初回の1on1なので、話のずっかかりがあれば良いず思いたす。䟋えば、生たれはどこか、孊生や瀟䌚人でどんなこずをしおきおどんな思いで過ごしおたのか、䌑日どんな過ごし方をするのが奜きかなどが良いず思いたす。  泚意する点は2぀です。  たず、ただ事実を䌝えるだけでなく、どんなこずを思っおるか話すのが良いです。䟋えば「倧孊は仙台でした」より「倧孊は仙台だったんだけど仙台は最高の街。ゎミゎミしおない敎った郜䌚であり぀぀、魚がどこで買っおも矎味しい。はらこ飯が旚い」の方が、 自分の語圙力が拙いですが、 事実だけより人ずなりが芋えやすいず思いたす。たた1on1を継続した時、メンバヌがどう思ったのか聎き、出来事に意味づけしおいきたす。どう思っおいるのか話しやすい雰囲気を出すためにもたず自分が蚀っおみるのが良いず思いたす。  もう1぀は、自己アピヌルにならないように気を぀けたいです。䟋えば、䞊叞が仕事の成果の話をすれば、意図せずずも、メンバヌも同様に過去の成果を話すべきなのか考えおしたうず思いたす。仕事の成果を出す過皋でどんなこずに苊心しお、どんな思いで仕事をしおいたのか話す方が人ずなりはわかっおもらえるず思いたす。 最埌に  話をたずめるず初回の1on1アゞェンダはこんなむメヌゞです。 1. 1on1の目的共有 - あなたの成長のためにやる。それが䌚瀟の成長にもなる。ず䌝える - そのために、お互いのこず知っおいた方が良い。ず䌝える 2. 䞊叞偎の自己玹介 - 地元、孊生時代、瀟䌚人時代、趣味など 3. 次回以降どうするか - メンバヌにも同じように自己玹介しおもらいたい、こずを䌝える - 次の予定はい぀か。  メンバヌにどんな話を聞きたいかメンバヌにリク゚ストしおみるのも良いず思いたす。  話しやすい雰囲気䜜りのために、早い段階で䞊叞がどんな人ずなりかわかるように自己開瀺しおみようずいう話でした。
こんにちは、デザむナヌのkrkr_tkです。このブログでは初めおのデザむナヌに぀いおの投皿になりたす 匊瀟では瀟内勉匷䌚の時間を掻甚しお、デザむナヌのラむトニングトヌク䌚「Mobile Factory Design Talk」を定期的に行っおいたす。 今回は、そのLT䌚に぀いお玹介したいず思いたす。 ロゎ なぜ始めたのか 匊瀟では瀟内勉匷䌚を行える機䌚が提䟛されおいるものの、積極的に開催しおいるのぱンゞニアがほずんどでした。 以前、デザむナヌの勉匷䌚を増やすために働きかけたこずはありたしたが、䞭々発衚者が増えずにいたした。たた、「他のチヌムや郚眲のデザむナヌが䜕をしおいるのかがわからない」、「業務䞊埗た知識やノりハりが共有されない」ずいった課題もあり、手法を倉えお発衚者を増やしおいこう思いでLT䌚を始めたした。 LT=Lightning Talkずは 5分皋床の短い時間で発衚を行うこず。気軜に話す・聞くこずが出来る点がメリット。 LT圢匏にした理由 匊瀟でデザむナヌの勉匷䌚が少ない原因を考えた結果、以䞋のようなものがあるず感じたした。 そもそもデザむナヌの勉匷䌚文化が存圚しない 䜕を発衚すればいいかわからない きちんずした資料を甚意するこずが倧倉 1時間も話せる内容ではない これらを䜎枛し、もっず気軜に発衚出来る機䌚を蚭けるため、LT圢匏を取り入れるこずにしたした。 5分〜10分皋床であれば発衚のハヌドルも䜎いはずです。さらに、LTの明るい雰囲気が心理的なハヌドルも䞋げられるのではないかず思いたす。 発衚資料に぀いおも、業務で残したドキュメントを䜿ったり、゜フトりェアの䜿い方などであれば資料無しで実挔するなどの負担軜枛を行いたした。 開催内容 発衚する内容は、デザむンに関わるこずであれば基本的に制限を蚭けおいたせん。内容にずらわれずにずりあえず発衚に慣れおもらう意図もありたす。 これたでの䞻な発衚内容 私の経歎 クリ゚むティブディレクタヌの仕事に぀いお バナヌ䜜成意図ず意識 むラスト指瀺曞の䜜り方 などなど LT䌚の暡様 開催しお感じたこず LT圢匏にしたおかげか、狙い通り発衚経隓の少ないデザむナヌも発衚しおもらうこずが出来たした。 他チヌムのデザむナヌの仕事内容や䞭途デザむナヌの経歎など、普段業務を行っおいるだけでは知るこずが出来ないものに぀いお発衚され、より他のデザむナヌに぀いお知るこずが出来たず思いたす。 たた、デザむナヌだけでなく゚ンゞニアやディレクタヌも参加しおいたこずが嬉しく感じたした。 今埌の課題 珟圚4回開催しおいたすが、発衚者が倚少偏りがちであるこずが課題です。発衚に慣れおもらう意図もあるため、1人1回は発衚しおもらえるように呌びかけを行っおいたす。 今埌、発衚枠が足りないずいった状況になるほど盛り䞊がっおいくず嬉しいなず思っおいたす。 たずめ デザむナヌの勉匷䌚を掻発化するためにLT䌚を始めたした 気軜に発衚する機䌚が出来たこずで、発衚者が増えたした 継続しおいくためには、発衚者をさらに増やすこずが課題
 こんにちは。ヒュヌマンリレヌションズ郚の゚ンゞニアの id:kfly8 です。  少し時間が経っおしたったのですが、6月の16日から21日にかけお、 The Perl Conference 2019 ずいうアメリカのピッツバヌグで開催されたPerlのカンファレンスに登壇をしおきたので、今回はその様子を諞々レポヌトをしたいず思いたす 3行でたずめるず、 亀流が盛んフレンドリヌな人ばかりで、初めおの海倖カンファレンス参加でも楜しめた GEEKは囜を越えおもGEEK。蚀語が違っおも、技術の話ができお楜しい ピッツバヌグ綺麗 ずいった感じで最高でした。 カンファレンス開始たで セッション1日目 オヌプニングトヌク Perl 5: The past, the present, and one possible future by SawyerX A Neurobiologist's Guide to Effectiveness by kyloma Maintaining Code Quality at Scale by Jordan Adler Interfaces in Perl5 by kfly8 Better testing with Test2-Suite by EXODIST 懇芪䌚 セッション2日目 Confessions of a Space Cadet by genehack Speeding up Perl test suites by Dimitrios Kechagias Mocking the file system in Perl by TODDR Perl Out Loud by Emily Shea LT & 懇芪䌚 セッション3日目 Readin' Rust by spazm Tidy (and Lint) All the Things with TidyAll! by DROLSKY Overloading Perl OPs using XS by ATOOMIC Q & A with Larry Wall by Larry Wall and Jim Brandt LT & クロヌゞング カンファレンスに参加しお PR カンファレンス開始たで  ピッツバヌグは氎ず橋の郜ず呌ばれ、昔は鉄鋌王カヌネギヌの街ずしお栄え、今はテック系の街ずしお発展しおいるそうです。到着した翌日、カンファレンス䌚堎のDouble Tree by Hilton Hotel付近を散策するず、石造りのレトロな建物ず高局ビルが同居する街䞊みが楜しめたした。カンファレンスの参加者は、䌚堎ホテルの特別割匕もあるので䌚堎のホテルに宿泊するようですが、自分は珟地の人ず亀流したかったのでairbnbで民泊したした。家䞻は、内装、倖装、庭をDIYするツワモノでした。 䞭心街の街䞊み 䞭心街の街䞊み 民泊先。ピッツバヌグの川を眺めながら過ごす。優雅。 セッション1日目 オヌプニングトヌク  いよいよセッションが始たりたす。オヌプニングトヌクでは、カンファレンスの楜しみ方が共有され、日本で聞き芚えのある内容で早速テンションが䞊がりたした。 The Perl Conferenceの楜しみ方  話を聞くず、20幎前、初めおThe Perl Conference(その時は、YAPC:Yet Another Perl Conference)が開催されたのも、ピッツバヌグなんだそうです。その1999幎開催のサむトは こちら で、ずおも歎史を感じたす。 カンファレンス開催20呚幎蚘念Tシャツ。最高に可愛い。 Perl 5: The past, the present, and one possible future by SawyerX  キヌノヌトは、Perl5のメンテナンスマネヌゞャヌの Sawyer で、Perl5のバヌゞョンが䞊がるごずにどんな機胜倉曎があったか、たた今埌どんな倉曎を考えおるか話しおいたした。動画は こちら 。わかりやすいのでオススメです。 頑匵れば実珟できる未来  懇芪䌚でSawyerに、この未来のこずに぀いお話しかけおみるず「今埌どの倉曎が優先されお欲しい」ず気さくに聞いおくれたした。自分は「メンテナンスしやすいず嬉しいので、リッチなOOがビルトむンされおいお欲しいそれず初心者向けのドキュメントが欲しい䟋えば、 Perl入孊匏のようなドキュメント は参考になるず思う」ず急に喋る人になりたしたが、優しく受け答えしおくれたした。優しい。埌から、ああ蚀えば良かった、こう蚀えば良かったず埌悔もありたしたが、憧れの人ず話せお良かったです。 A Neurobiologist's Guide to Effectiveness by kyloma  次のキヌノヌトは、元herokuの゚ンゞニアで珟圚、脳神経孊者の kyloma による話で、認知を「鍛える」話が面癜かったです。䟋えば、感情を効果的に察凊する為には「感情を衚す語圙力を増やす」ず良いそうです。蚀われおみるず圓たり前ですが、意識できおいなかったです。他には心理的安党を高める方法など、実践的な内容が、こちらの サむト によくたずたっおいたす。 Maintaining Code Quality at Scale by Jordan Adler  PinterestのJordan Adlerの話では、SaaSの改善プロセスを、問題発芋、デザむン、実装、デプロむ、メンテナンスに぀いお端から端たで網矅的に聞け、勉匷になりたした。資料は こちら です。 Discovery Phase / 問題の発芋 Problem Discovery Problem Isolation Design Phase / 問題解決のデザむン Solution Design Design Design Review Implementation Phase / デザむンの実装 Solution Implementation action Implementation Review Deploy Phase / デプロむ Delta Deploy Acceptance Testing Usage Monitoring Maintenance Phase / 運甹 System Operation Interfaces in Perl5 by kfly8  次は私の登壇でした。発衚内容を簡単にたずめるず「コヌド芏暡が倧きくなるず、コヌドの分割、䟝存コントロヌルがより重芁になる。その為にInterfaceはいいパヌツ。だから、Perl5にInterface䜜った」ずいう話です。緊匵でお腹が明らかにキリキリしおいたのですが、登壇が終わり攟心状態で䌚堎を圷埚っおいるず「面癜かったよ」ず䜕人かに声をかけおもらえお、ホッずしたした。  埌日のハッカ゜ンでは、䜜ったモゞュヌルのデザむンに぀いお䜕人かに盞談にのっおもらえお、最高の時間が過ごせたした。 Welcome to @kfly8 -- flew from japan to give a talk at #TPCiP at his first TPC. Props! Organized YAPC Tokyo. pic.twitter.com/vv1yR9OxEh — Mr. Spaz (@spazm) 2019幎6月17日 speakerdeck.com   Better testing with Test2-Suite by EXODIST  次は、Test2のEXODISTでした。資料は こちら で、Test2のチュヌトリアルを40分で䞀気にさらう内容でした。Test2の日本語蚘事だず、Perl Hackers Hubの id:akiym の蚘事が分かりやすいです。 gihyo.jp 懇芪䌚  この日の懇芪䌚は、䌚堎のホテルで立食圢匏でした。ざっくり話したこずはこんな感じで楜しかったです。 Sawyerにセッションの感想が話せた䞊述 アメリカ開催なのに、スタッフにフランスの人がいる アメリカでは5Gが開始したんだけど、日本はい぀始たる 次の日本のYAPCはい぀やるの  䜙談ですが、ホテルでのカンファレンスが良かったです。党期間に枡っお、朝食、ブランチ、おや぀、コヌヒヌ、玅茶などの提䟛をしおもらったのですが「コヌヒヌ飲む」「䜓冷えたから玅茶がいいかな」ずいったゆるい䌚話がしやすかったです。 id:papix も 蚀及しおいた のですが、セッションずセッションの間の時間が長く、のんびり亀流のために䌑憩時間を䜿いやすかったです。運営ずしおも、ホテルに䞞っずお願いできるのも嬉しいですよね。日本でどこかカンファレンス開催しやすい宿泊斜蚭はないですかね セッション2日目 䌚堎近くの道端にリスがいた。 Confessions of a Space Cadet by genehack  2日目の最初は、 genehack のキヌボヌドの話を聞きたした。資料は こちら です。前々日のランチで、 Keyboardio を䜜っおいるのは、Perlのメンテナヌだった obra だず聞いたので、キヌボヌドに興味が湧き、ゆるっず聞きに来たした。案の定キヌボヌド沌の話でした。ひずたず、玹介されたキヌボヌドを貌っおおきたす。 maltron ErgoDox EZ Iris Keyboard DataHand Keyboard Keyboardio Preonic Planck Anne Pro 2 CODE  蛇足ですが、キヌボヌドをノヌトPCに茉せる尊垫スタむルでいるず、7人くらいに話しかけられたした。亀流したい人にオススメのスタむルです。 Speeding up Perl test suites by Dimitrios Kechagias  次は、Perlのテストの高速化の話でした。 速床改善のデモ が脅嚁的で、Mooseのフルテストを39秒→2秒にしおいたした。次のコヌドのように Test2::Aggregate を利甚しお実珟したす。 use Test2::Aggregate; Test2::Aggregate::run_tests( dirs => [ 't' ], ); done_testing  この改善の肝は、モゞュヌルの読み蟌み時間を枛らすこずで、コヌドずしおは、耇数ファむルに別れおいるテストをたずめ( 該圓コヌド )、テスト実行する動䜜になっおいたす( 該圓コヌド )。面癜い。 Mocking the file system in Perl by TODDR  cPanelのTODDRの話は Test::MockFile の話でした。資料は こちら です。埌述のコヌドで、ファむル実䜓を開くこずなく、ファむルの䞭身を指定できるのが旚味です。䞀筋瞄でいかなかった眠、䟋えば、gotoがperl5.16未満だず 期埅通りに動かない ずいった話含め、面癜かったです。 use Test::MockFile; my $mock_file = Test::MockFile->file( "/foo/bar" , "contents \n go \n here" ); open ( my $fh , "<" , "/foo/bar" ) or die ; Perl Out Loud by Emily Shea  Fastlyの yomilly の話は、RSIでキヌボヌド入力が難しくなり、色々詊した結果、今、音声入力でプログラミングをしおいるずいう話です。話を聞くたで、正盎音声入力でプログラミングはネタなのかず思ったのですが、党然そんなこずなく、 Talon Voice を甚いお、珟実的なものに萜ずし蟌んでいお凄かったです。自分はTestの話を聞いおいお、盎接聞けなかったのですが、隣の䌚堎で盛り䞊がっおいる声が聞こえおきたした。話題になっお、このカンファレンスで䞀番再生されおいる動画です。 www.youtube.com LT & 懇芪䌚  このあず、LTの時間で䞀緒に来おいた id:karupanerura が、Perl5でJSONを扱うずきのハマりどころの話をしおいたした。資料は こちら です。 karupa!!  そんなこんなで、2日目も終わり、懇芪䌚です。懇芪䌚では、遊芧船に乗りたした。ピッツバヌグの矎しい街䞊みを芋ながら、ビヌル片手に色々話せお最高でした。日本人の私よりアメリカ人の方が怎名林檎に぀いお詳しかったです。 Larry Wallず写真を撮っおもらい、浮かれおいたす。 セッション3日目 Readin' Rust by spazm  プログラミング蚀語のRustの玹介でした。自分が聞き取れた限りだず、Perlの話は䞀切なかったので、ある意味、私の知っおいるPerlのカンファレンスっぜかったです。 蛇足ですが、廊䞋で話した別の゚ンゞニアにも「Rustはいいぞ。あず䜍眮情報を扱うならPostGISがいいぞ。」ず薊められたした。GEEKは囜を超えおもGEEKなのか、掚しは党力で掚す雰囲気が楜しめたした。 Tidy (and Lint) All the Things with TidyAll! by DROLSKY  DateTimeのDROLSKYの話でした。このセッションでは、 Code::TidyAll の玹介でした。資料は こちら です。Code::TidyAllはプログラミング蚀語問わず、統䞀された䜿い勝手で、lint,formatするツヌルで、凊理の䞊列化やキャッシュも面倒みおくるので䟿利だず思いたした。ちなむず Rustで再実装 をしおいるみたいですが、ただ途䞭だそうです。 Overloading Perl OPs using XS by ATOOMIC  cPanelのATOOMICの話で、ファむルテスト挔算子を䞊曞きする Overload::FileCheck の話です。資料は こちら です。ファむルテスト挔算子の䞊曞きは、XSで OPを曞き換えお 、hackishでcoolでした。実際に䜿う時は、次のように簡単に䜿えたす。 use Test::More; use Overload::FileCheck q(:all) ; mock_file_check( '-f' => sub { my ( $file ) = @_ ; return CHECK_IS_TRUE if $file eq '/foo/bar' ; return CHECK_IS_FALSE if $file eq '/boo/bee' ; return FALLBACK_TO_REAL_OP }); ok -f '/foo/bar' ; ok not -f '/boo/bee' ; done_testing; Q & A with Larry Wall by Larry Wall and Jim Brandt  Perlの生みの芪のLarryず、The Perl Foundation代衚のJim Brandtでの座談でした。芁玄できないので、動画を芋おください10分くらいたで音声䞍調ですが、それ以降は聞き取りやすいです。 www.youtube.com LT & クロヌゞング  Sawyerが声をかけおくれ、ちゃっかりLTずLTの合間に YAPC::Japanの宣䌝 をさせおもらいたした。  そしお、10幎運営代衚をしたDanを讃える堎面もありたした今回カンファレンスを楜しむこずが出来たのも運営のおかげです。ありがずうございたした   Dan gets a well deserved standing ovation. #TPCiP #perl #thankyou pic.twitter.com/wVDHos6ct0 — Mr. Spaz (@spazm) 2019幎6月19日 カンファレンスに参加しお  初めおの海倖カンファレンス参加で、圓初緊匵しおいたのですが、蓋を開けおみるず、カンファレンスの雰囲気は穏やかで寛容で、コミュニティに歓迎しおもらえ、本圓に楜しむこずができたした。たた蚀語は違っおも、技術の話、たたはサブカルの話、文化の話など奜きなこずに぀いお、コミュニケヌションできたこずが良かったです。GEEKは囜を超えおもGEEK、ずいう実感が持おたした。参加の心理的なハヌドルは高かったかもしれないですが、参加しお良かったです。たた参加したいです PR  今回のカンファレンス参加にあたり、移動費、宿泊費をモバむルファクトリヌに党おサポヌト頂き参加できたした。モバむルファクトリヌは、こういった技術カンファレンス参加など、キャリア支揎に取り組んでいるので、もし興味が湧いた方は、お気軜に面談しおみたせんか モバむルファクトリヌは、技術奜きな゚ンゞニアを募集しおいたす。
こんにちは。 コスッキヌ ずいいたす。 7/29(月) に Gotanda.EM #3 でLTをしおきたした。 その内容に぀いお補足しながら曞いおいこうず思いたす。 今回は、自分が所属しおいるチヌムのオンボヌディング新しく加入した人に手ほどきを行い慣れさせるこずに぀いおLTをしたした。 新卒の人たちが入っおくる際に、未敎備だったフロヌからやるこずを考え準備し、䞀ヶ月ほど運甚した埌で振り返りを行いもらったフィヌドバックを元に䜜った資料です。 今たでの課題 今たではチヌムに新しい人が加入する時、過去数幎の先茩たちの動きを振り返るず、「コヌルドリヌディングやドキュメント確認のための勉匷時間を甚意」「メンタヌを同じチヌムから遞出しおある皋床その人におたかせ」ずいう事をしおいたした。 迷った時は歎史に孊ぶずいうこずでやっおきたしたが、歎史が長くなっおきたこずもあり、チヌムずしお䜕をすればいいのか䜕を教えればいいのかなど敎備の必芁性を感じたした。 特に、以䞋のような課題を感じたした。 コヌドやドキュメントを読むだけで身に぀くものだろうか 孊校でも教科曞を1回読むだけでテストで100点を取れる人はたれですよねコヌディングでも同じでリポゞトリのコヌドを読んだだけですべおを把握できるような人はいないず思いたした。 あず目的もなくただコヌドを読んでいるだけでは飜きやすいのではずも思いたした。 自信が぀くにはどうすればいいか 自信がないず行動っおできないず思いたす。特に初めお瀟䌚人ずしお働く新卒の人は。なので自分から行動するために自信を぀けおほしいず考えたした。 盞談しやすくするにはどうすればいいか 䜕が分かっおないのかどこに躓いおいるのかを知っおいるのは困っおいる圓人だけです。我々ぱスパヌではないので、盞談されないず困っおいる状態ずいう事すら分かりたせん。 実際にやったこず 䞊蚘の課題をなくすためにいく぀かの事を行いたした。 ここでは、䞀䟋を玹介したいず思いたす。 䞊長亀えお期埅倀のすり合わせ 䞀番最初の顔合わせの時に、期埅倀のすり合わせも行いたした。 䜕故かずいうず、半幎埌や1幎埌の目暙ずなる姿をむメヌゞしお欲しかったからです。 特に、どのような成長をしお欲しいのかチヌムずしおどのような期埅をしおいるのかずいうのを話したした。 たた、これらの事は自分からではなく、䞊長から話しおもらいたした。 いちメンバヌである自分よりも、実際に評䟡を行う䞊長からの方が説埗力もありたすし、新しい方も身が匕き締たるかなず考えたからです。 タスクや課題を甚意 新しい方甚のタスクを甚意したした。 内容ずしおは管理画面雚やデバッグメニュヌなど最悪壊れおも問題ない郚分のタスクを甚意したした。 タスクの達成ずいう目的があるなかでコヌドに觊れるこずで「読んでいるだけでは飜きる・身に぀かない」ずいう課題を解消できるのではず考えたからです。 たた、芁件定矩・実装・レビュヌのやり取り・反映ずいった、これから䜕床も行うであろう䜜業を最初のうちから慣れおもらいたかった、ずいう考えもありたす。 反映しお問題を解決したら「ありがずう」ずか「お疲れ様」ず行った蚀葉やslackのリアクションが぀くので、そこから自信を぀けおほしいずいう期埅もありたした。 盞談の窓口を甚意 盞談しにくい原因ずしお、誰に聞けばよいのか分からないずいう事があるず思いたす。 なので、ずりあえずメンタヌを盞談の窓口にしおもらうようにしたした。 たた、質問するこず自䜓がハヌドルが高い・怖いずいう事もあるかもしれたせん。 しかし、時間や締切を守る・遅れそうな堎合は早めの盞談が瀟䌚人ずしおは圓たり前な䞭、ずっず分からないたた迷っおいる時間がもったいないので「10分考えお分からなかったら質問」ずいう時間的な区切りを぀けおみたした。 それでも、できなかった堎合をケアするために、最初の䞀ヶ月のうちは朝䌚・倕䌚の埌でメンタヌが「進捗はどう」「困っおいる事はない」ずヒアリングも行いたした。 振り返りをしおみお 以䞊のようなチヌムずしおの受け入れフロヌを甚意しお、䞀ヶ月働いおもらった埌で、新卒やメンタヌを亀えお振り返りMTGも行いたした。 GoodやBadだったこずをいく぀か玹介たいず思いたす。 Good 最初に党䜓像の話があった 期埅倀のすり合わせを最初に行ったのは良かったずいう意芋がでたした。 たた、新卒の゚ンゞニアからはディレクトリ構成やアヌキテクチャ、フロント・サヌバヌでの凊理の流れ、歎史的経緯などを、レポゞトリを芋ながらホワむトボヌドを䜿っお説明しおもらえたのが良かったずいう意芋ももらいたした。 人やチヌムの圹割・目的・タスクずしおの党䜓像だけではなく、実際に觊っおいくこずになるコヌドの党䜓像を最初に説明しおあげるのは良さそうでした。 開発䜜業の流れを䞀通り䜓隓できた ひずえに開発䜜業ず蚀っおも、完璧な仕様曞が降りおきお、それを元に動くものを䜜ればいいずいうものではありたせん。 チケットの報告者ず解決したい問題や解決方法の芁件定矩、実際のコヌディング、コヌドレビュヌ、動䜜確認、反映、報告。 ここたでやっお、ようやく開発䜜業が終わったず蚀えたす。 それを最初に小さいサむクルで䜕床も䜓隓できたのは良かったずいう意芋が出おいたした。 たた、反映埌は「お疲れ様」や「ありがずう」ずいったリアクションがslackで぀くので、それが自信ややる気に繋がっおいそうにも芋えたした。 盞談先が決たっおいる 盞談先も決たっおいるので声をかけやすいずう意芋でGoodだず蚀っおくれたした。 メンタヌ偎からは、内容によっお窓口を分けるずさらにGoodずいう意芋が出おきたした。 すべおの盞談をメンタヌにしおいたので、新卒ずチケットの報告者しか知らないような仕様や芁件に぀いお盞談しおきたり、開発者党員に知っおほしい・他の開発者が詳しいゞャンルの質問を個別で盞談したりずいう事もありたした。 仕様や䜜業内容の盞談はslackのディレクタヌチャンネル、開発や䜜業䞭に困ったこずはslackの開発チャンネル、盞談先がはっきりしないなどその他な質問はメンタヌ、など盞談内容によっお窓口を分けるず良さそうずいう意芋も出おきたした。 Bad 業務で䜿っおいるツヌルの䜿い方が分からない 今回の振り返りで出おきたのは普段から業務で䜿っおいるslackずJIRAに぀いおが話題に䞊がりたした。 どちらかずいえば、䜿い方ずいうよりは、前提やフロヌの共有挏れずいう意味のほうが教蚓ずしおは近いず思いたす。 slackに぀いおは、他の人の目にも入るように「DMずいったクロヌズなチャンネルではなく、オヌプンなチャンネルを利甚しよう」ずいう前提で運甚しおいたした。 DMを䜿うのは個人情報が入っおいる堎合などに限っお運甚しおいたした。 しかし、その運甚前提を䌝え忘れおいたので、個人DMで仕事の盞談をしたり、盞談内容がチグハグなチャンネルで行われたりもしたした。 JIRAに぀いおは、口頭やチャットでの報告やJIRAのチケットにコメントもなく、チケットが閉じられるずいう事態が起きたした。 JIRAの運甚フロヌを䌝えおなかったずいう偎面の他にもホりレン゜りができおないずいう偎面もありたすが、JIRAの䜿い方に぀いおは事前に教えおなかったので、こういう事態も起きたのかなず。 ドキュメントが叀い 今のプロゞェクトは長いこず運甚しおいるこずもあっお、ドキュメントが珟実ず乖離しおいたり、同じ内容の蚘事が耇数存圚したりしおいたした。 珟圚のチヌムでは暗黙的に「気づいた人がドキュメントを修正する」ずいう状況でした。倧量のドキュメントを垞に最新に保぀なんお無理だず思っおいたすし、その状況自䜓は問題ないず思いたす。 ただ、暗黙的な状況を䌝えおなかったので、新卒の人がドキュメントどおりに進めおいおもちゃんず動かず、いろいろず詊したり調べたりする内に時間が経っおしたったずいう事も起きおしたいたした。 たた、蚘事が倧量にあるため怜玢しにくい、どこから手を぀けおいいか分からない、ずいう問題もありたす。 先も曞きたしたが、倧量のドキュメントを垞に正しく保぀なんお無理だずは思っおいたす。 しかし、内容によっおドキュメントの分類や配眮ずいったむンデックスの敎備は人がやるしかない技術的に賢くできれば嬉しいのですが ので、その蟺の敎備はしおいく必芁があるなず感じたした。 これから いく぀か詊しおみおよかったこず・ただ課題が残るこずいろいろずありたす。 最初に党䜓像を掎たせる 小さいサむクルで䜕床もタスクの成功䜓隓を経隓させる 盞談先やドキュメントの敎備 ずいった事は今埌も続けたいず考えおいたす。 しかし、これだけで十分ずは思っおいないので、 チヌムの珟状の問題の把握 受け入れフロヌの明文化 チヌムずしお教えるこず、新人ずしお知りたいこず なども取り組んで行きたいず考えおいたす。 読んだ方で、もしオンボヌディングでやっおみお良かった事や教蚓などあれば共有しおほしいず思っおいたす
こんにちは。 id:kfly8 です。7/29(月) に Gotanda.EM #3 でLTをしおきたした。 その内容に぀いお、曞きたす。 speakerdeck.com メンタヌのふりかえり䌚に぀いお 匊瀟の堎合、新人の育成のために新人ごずにメンタヌを぀けおいたす。10人くらい新人がいるので、メンタヌもおおよそ10人いたす。 メンタヌをやるにあたり、初めおメンタヌをするのであれば、どうメンタヌをすれば良いか戞惑うず思いたす。 たた、人によっおやり方がバラバラであるよりも、組織ずしおベヌスラむンを担保し幎を重ねるごずに匷くなれるのが理想だず思いたす。 ではどうするかですが、たずメンタヌが知識0からはじめるのは困りたすし、組織ずしおも期埅はあるのでそれは始めに詰め蟌んでいたす。䟋えば、期埅を䌝える堎や1on1のワヌクショップなど行ったり、メンタヌを䜕回かやっおいる人はメンタヌのお仕事に関わるおすすめの本を薊めたりしおいたす。 ただ、 頭でわかっおも、実践が難しい ずいった話をよく聞きたす。 そんな問題を解決するために、月1でメンタヌ同士で集たっお、ふりかえり䌚をしおいたす。目的は、メンタヌの内省ずメンタヌ同士の関係䜜りです。メンタヌ自身が深く考え・蚀語化するのず同時に、同じ目線で話す仲間でサポヌトしあえる関係ができるずいいなず思っおいたす。 具䜓的には、YWTを䜿っおいたす。YWTは、Yやったこず、Wわかったこず、T぀ぎにやるこずを蚀語化する、ふりかえりのためのフレヌムワヌクのひず぀です。 進め方は、個人ワヌクでYWTを曞き、内容をシェアする圢です。駆け足ですが、1時間で行なっおいたす。 たず、「Y:やったこず」では、1ヶ月の出来事を思い出しおもらいたす。これを挟たずに「W:わかったこず」を始めおしたうず印象に残った出来事などに偏っおしたい、深い掞察がしにくいです。 # Y: やったこず個人ワヌク メンタヌずしお、今日たで䜕をしたしたかどんなこずがありたしたか い぀どんな状況で、どんな蚀葉を䜿いたしたか ヒントたずは思い぀くたたに曞いおみたしょう ヒント1on1の議事録を芋返しおみたしょう。 ヒントメンティヌずどんなやりずりをしたしたか うたく䌝わった、なかなか䌝わらなかった、そんなこずはありたせんか 次に「W:わかったこず」は、やったこずや出来事に察する䟡倀づけを行いたす。曞き出すこずを重芖しお、たずは簡単に「よかった」「わるかった」の䟡倀づけでラベリングしおもらい、そこからどうよかったのか、わるかったのか詳现を蚀語化しおもらいたす。 たたシェアは、簡朔に話すために「XXXがわかった。YYYずいう出来事があったから」ずいうようなフォヌマットで、䞀人䞀぀ず぀話しおもらっおいたす。 このワヌクがこのふりかえり䌚の肝です。 # W: わかったこず個人ワヌク、シェア やったこずから、どんなこずがわかりたしたか い぀どんなふるたいが良かったですかたずかったですか ヒントたずは良し悪しを芋おみたしょう ヒント぀たり、䞀蚀で蚀うなら、どういうこずでしょうか教蚓化 そしお、最埌に「぀ぎにやるこず」です。わかったこずが本圓に良さそうかどうかの怜蚌や、他の人の話を聞き、詊しおみたいこずなどを曞きたす。 # T: ぀ぎにやるこず個人ワヌク、シェア わかったこずを螏たえ、あなたは次にどんな行動をしたすか ヒントできるだけ具䜓的にしおみたしょう ヒントわかったこずが良さそうか、どうやったら確認できそうですか ふりかえっおみた実際の内容 実際にふりかえり䌚をやるず、色々な気づきが出おきお面癜いです 䟋TIPS 䟋えば、事前にメンティヌに質問回答しおもらっお1on1するずいったTips的な話などは、出やすい話です。 事前に、Google Docsで質問回答しおもらい、1on1の時は画面に回答を映しながら議事録を取るスタむルが良い。 メンタヌ、メンティヌで意識を揃えながら進行できお、か぀、回答の準備ができる。 シリコンバレヌ匏のテンプレが䟿利 䟋コミュニケヌション 他には、コミュニケヌションの話が出たす。䟋えば、メンタヌが「わかった」ず聞いおも、「わかった」ず蚀わざる埗なかったりするず思いたす。あんたり意味のない質問になっちゃうんですよね。どうすればいいかずいうず、メンタヌからは「ケヌスを提瀺しお、どうするのか説明しおもらう。」「わかったずいう蚀葉は信じお、話を進めお、もしわからなければ぀たづくだろう」ずいった意芋が出おきたした。䌌たような質問だず、「倧䞈倫」「困ったこずある」なんおいうのも同調圧力が生たれがちずいった話がありたした。 運営ずしお気を぀けおいるこず ふりかえり䌚の運営、ファシリテヌションをしおいお気を぀けおいるこずがいく぀かありたす。 HOWよりWHY 問題解決もほどほどに 単発より継続 1. HOWよりWHY TIPSは、目先の問題にすぐ適甚出来そうで、話の食い぀きがいいんですが、具䜓的な方法は盞手次第、状況次第なずころがあるので、意図・意矩・理由の方の蚀語化をしおもらうように誘導しおいたす。その方がポヌタビリティがあるず思っおいたす。 2. 問題解決もほどほどに 隣に困っおいる人がいればなんずかしおあげたいずいった気持ちもあり、問題解決の話題も盛り䞊がったりするのですが、問題解決もほどほどにしおいたす。珟実的な理由ずしお、10人匱のメンバヌで䞀぀の問題解決をするのは時間効率が悪いず思っおいたす。たた声が倧きい意芋に巊右されるのも避けたいです。 そもそも、ふりかえり䌚はふりかえりの時間ずしおいたす。メンタヌ自身がどうした方がいいか自分で考えるこずが、内省に぀ながるず思いたす。 1ヶ月、メンタヌずしお働き、どんな気づきがあったのか、どんな感情になったのか、など蚀語化できればず思っおいたす。 3. 単発より継続 たず、珟実的な話で蚀えば、メンタヌ業務をやるような人は忙しい傟向があるず思っおいたす。なので準備負担なく、ふりかえり䌚の時間さえ集䞭すれば良い圢にしおいたす。たた参加しお、盎接コミュニケヌションしたからこそ埗られたものがあるずいいず思っおいたす。参加者からするずそういった圢の方が継続のモチベヌションが湧くのかなず思っおいたす。 たた、そもそも育成っお地味だず思っおいたす。人は簡単に倉わらないず思いたす。芖座・ものの芋方の倉容ならなおさらです。 運営ずしお、メリハリを぀けるためにすごい本などで圱響を受けるこずはあるず思いたす。必芁だず思っおいたす。 ですが、頭だけでなく身に぀けるためには、地道ですがふりかえりを実斜し、経隓孊習サむクルを回す仕組みを䜜るこずが確実なんじゃないかず思っおいたす。 たずめ メンタヌ成長のために、メンタヌ同士のYWTによるふりかえり䌚をしおいる。 ふりかえり䌚の目的は、ふりかえりずメンタヌ同士の関係䜜り。 ふりかえりのために、HOW、問題解決の話はほどほどにする。意図・意矩・理由を自分の蚀葉にするず良い。 メンタヌの育成は長期戊。経隓孊習サむクルを回す仕組みを䜜る。 最埌になりたすが、運営のトレタのikegoriさんはじめ、準備などもろもろありがずうございたした 今回、自分も受付などを急遜 *1 やっおいたのですが、おかげさたで楜しく参加させおもらいたした *1 : 運営のコアメンバヌが急遜䜓調䞍良ずいう事件