振り返り2019年の抱負から今年を振り返ってみます。子供らが遊んでいる中で書いているのでかなり雑です。あとできれいにします。Platformを使う2018年後半から2019年前半にかけて副業でFirebaseでスマホアプリのサーバサイドをやりました。感じたことはGCPめっちゃいいということ。Functionsでしたが他にも色々できるのですごい進化を感じました。数学をやる2019年前半に中学レベルの数学までを復習しました。やってみて思ったことは業務で必要にならない限りは継続が難しいことでした。宅建をとる以下で書いたので割愛http://3.115.145.106.xip.io/archives/1629体力をつける会社でランニング部があり今年は多少ですが走ることができました。久しぶりに筋トレも再開することができました。2020年はこれらの活動を増やして継続していきたいです。やらなくてよかったこと何年かやってみてやらなくてよいことが見えてきました。いうより実務で必要にならない限り習得が難しいです。重要だしやりたいけどサブでやるには継続が難しく思ったような成長曲線が描けません。合計24記事ということで月2記事のペースは維持できました。特別気にしていませんが月間PVも約1万と少しずつ伸びてきていていい感じ。まとめここ数年はテックリード、スクラムマスター、マネージメント業務が多く業務で開発をする機会が減っていましたが、今年の後半は最高の会社・メンバー・プロダクト・技術スタックでいろんなことがとても充実した1年になりました。Goを始めたらまずはioパッケージを知るべしGoを書いているとio.writerとio.readerを扱うケースが頻繁に出てきますが、これはioパッケージが多くの他のパッケージのインターフェースになっているからなのでioパッケージを知っておくことで開発が楽になります。本書はGoのio.Writer、io.Readerからはじまりシステムの深いところまで丁寧に説明されているのでとてもおすすめです。ioパッケージから始まっているのも納得です。Webで無料で見れますし書籍版、PDF版で購入も可能です。Web版https://ascii.jp/elem/000/001/235/1235262/書籍版Goならわかるシステムプログラミングioパッケージのインターフェース一覧ioパッケージのインターフェース一覧です。Goのインターフェースの実装は、明示的にインターフェースを明示的にimplementsせず、インターフェースを満たしていたらimplementsしていることになります。Reader(インターフェース)Writer(インターフェース)Seeker(インターフェース)Closer(インターフェース)ReadWriter(複合インターフェース)ReadCloser(複合インターフェース)WriteCloser(複合インターフェース)ReadSeeker(複合インターフェース)WriteSeeker(複合インターフェース)ReadWriteCloser(複合インターフェース)ReadWriteSeeker(複合インターフェース)ReaderFrom(インターフェース)WriterTo(インターフェース)ReaderAt(インターフェース)WriterAt(インターフェース)ByteReader(インターフェース)ByteScanner(インターフェース)ByteWriter(インターフェース)RuneScanner(インターフェース)StringWriter(インターフェース)複合インターフェース表Goではインターフェースにインターフェースを食わせることができ、ioパッケージで作られている複合インターフェースは以下となります。以下のコマンドを叩くと対象のインターフェースを満たしているものの一覧が確認できます。ReaderWriterのimplements一覧WriterはReaderに比べると少ないです。Writerioパッケージのパブリックメソッドを叩いてみるioパッケージにはインターフェース以外に実装されている関数があるので叩いてみました。taisa831[Golang]Goのio/ioutilパッケージは分かりやすくて使いやすいGoのioパッケージは主にインターフェースになっていて他のパッケージで多く実装されています。ioパッケージにもパブリックな関数がありファイルの入出力はできますが少し細かい処理になります。io/ioutilパッケージを使うとファイルの入出力処理が簡単にできます。以下にio/ioutilパッケージを使った処理とそれに対するテストコードを記載します。Close()NopCloserはreaderインターフェースしかなく、closerを持っていない場合にダミーでcloserインターフェースを追加することができます。NopCloserのClose()は何もしません。Write()DevNullを使うと吐き捨て用のWriterを利用することができます。Writeの他にもWriteString、ReadFrom関数が用意されているのですが、今の所Writeしか呼び出すことができません(叩き方がわかりません)。これについては気になったのでWriteString、ReadFromも叩けるようにGo本体にコードを変更してコントリビュートしてみたのですが、あえなくNGをくらいました。有り難いことに金曜日夕方にリクエストして夜には返信が来たのでレスポンスは早かったです。コントリビュートするまでの手順」という記事を公開してくれているので比較的すんなり行うことができました。先は長いですが取り敢えず自分のできることは一通り終わりました。利用したフローと結構異なっていたので備忘録がてらブログに書いておこうと思います。本書はGoのio.Writer、io.Readerからはじまりシステムの深いところまで丁寧に説明されているのでとてもおすすめです。Webで無料で見れますし書籍版、PDF版で購入も可能です。v2.9のリリース情報とDiff2019年8月20日にNuxt.jsのバージョンが2.8.1から2.9へがリリースされました。2019年9月19日時点ではバージョン2.9.2まであがっています。本投稿ではリリース内容と変更点が見れるように2.8.1から2.9.1のソースのDiffと変更されたファイル一覧を載せておきます。変更ファイル数は、examplesやtestを除くと約142ファイルでした。バージョンが上がっただけ、関数にスペースが追加されただけのファイルも多く、それを除くともっと少なくなります。Notesの中でもTypescript関連の変更が個人的には大きいと思います。見れば簡単に行えます。(本記事の一番下でも試しにやってみました。process.Diffv2.8.1からv2.9.2のDiffをつくってみました。この時点ではTypescriptのソースがある場合は起動できませんがなにもしなければ起動します。既存プロジェクトからのMigration方法は以下です。記事を見ましたが、最終的にWikipediaが分かりやすく一番参考にしました。https://ja.wikipedia.org/wiki/JSON_Web_TokenJWTの構造JWTは以下の3つの要素をピリオドで区切った文字列で構成されます。署名生成に使用するアルゴリズムを格納します。下記のHS256は、このトークンがHMAC-SHA256で署名されていることを示しています。"JWT"}ペイロード認証情報などのクレームを格納します。クレームとはペイロードに含める以下のような標準フィールド(クレーム)を指します。JWTの仕様では、トークンに一般的に含まれる7つの標準フィールドが定義されています。用途に応じた独自のカスタムフィールドを含むこともできます。1422779638}7つのペイロードの標準クレーム署名トークン検証用の署名です。署名はヘッダーとペイロードをBase64urlエンコーディングしてピリオドで結合したものから生成します。署名はヘッダーで指定された暗号化アルゴリズムにより生成されます。下記はHMAC-SHA256形式でのコード例です。storageが用いられますが、セッションIDのようにCookieを用いる場合もあります。認証時にはAuthorizationヘッダーでBearerスキーマを利用します。サーバー上に認証状態を保持しないステートレスな認証方式です。その為JWT単体ではトークンを無効にすることが出来ません。サーバーに状態を保持すれば可能ですが、その場合ステートレスの利点は失われることになります。書いてある内容そのままです。Middlewareを使って実際の動作を確認してみます。使う前提で、次のMiddlewareを利用します。「https://github.com/appleboy/gin-jwt」。Gin用に薄くラップしたものです。jwt-goはトークンを作成したりパースしたり様々な機能が用意されています。載っているのでこれを元に確認します。処理は大きく「ログイン時にToken発行する」と「トークン認証&処理実行する」の2種類あります。ログイン時にToken発行するログイン時にTokenを発行する処理は、LoginHandlerです。Routerでは次のように定義しています。LoginHandlerではAuthenticatorとPayloadFuncが呼ばれる為、Middlewareにてこれらを実装する必要があります。authMiddleware.LoginHandler)Authenticatorはログイン認証の為の関数です。例では固定値が設定されていますが、実際は主にDBから値を取得することになると思います。PayloadFuncはペイロードに含めるクレームを設定します。ペイロードには任意のクレームを追加可能なので、ログインIDとなるuserIDをセットしています。jwt.MapClaims{}}ログイン時にアクセストークンを取得するにはサーバ起動後に以下のコマンドを実行します。password=admin実行すると次のような結果が得られます。"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjY4Nzk5NzgsImlkIjoiYWRtaW4iLCJvcmlnX2lhdCI6MTU2Njg3NjM3OH0.D0z_y8vLEeQW_mtgOCw6gfrmz6eSGfW6uOG7KoEaMAo"}LoginHandlerの処理を見てみるここであらためてauth_jwt.goのLoginHandlerの処理を見てみると内部で何をやっているかが具体的に分かります。エラーチェックなどを省いて主要なところだけ確認してみます。上記middlewareで実装しているAuthenticatorを呼んでログイン認証します。mw.Authenticator(c)ログイン認証が通ったらクレームを取得します。token.Claims.(jwt.MapClaims)上記で実装しているPayloadFuncを呼んで独自クレームを設定します。}}更にペイロードに必要なクレーム情報を設定します。expはトークン切れタイムで、orig_iatはトークン生成タイムです。mw.TimeFunc().Unix()最後に署名付きトークンを生成してレスポンスとして返します。expire)これらを組み合わせたLoginHandlerの実際の処理です。err}払い出されたTokenを検証してみる払い出されたTokenを検証してみます。トークンはピリオドで分割し3つに分けることができます。eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjY4Nzk5NzgsImlkIjoiYWRtaW4iLCJvcmlnX2lhdCI6MTU2Njg3NjM3OH0.D0z_y8vLEeQW_mtgOCw6gfrmz6eSGfW6uOG7KoEaMAoヘッダー:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9ペイロード:eyJleHAiOjE1NjY4Nzk5NzgsImlkIjoiYWRtaW4iLCJvcmlnX2lhdCI6MTU2Njg3NjM3OH0署名:D0z_y8vLEeQW_mtgOCw6gfrmz6eSGfW6uOG7KoEaMAoヘッダーとペイロードはbase64でエンコードされているだけなので以下のコマンドで確認することができます。-D{"exp":1566879978,"id":"admin","orig_iat":156687637%・署名は暗号化されているので当然復元できません。-DL������k`8,:���ϧ���*�%またトークンを確認するのに便利なサイトがあります。このサイトを利用するとJWT認証の確認が簡単にできます。Verifiedと認証成功が確認できます。https://jwt.io/・認証NG・認証OKトークン認証&処理実行する次にトークン認証と認証後の処理の実行をみてみます。auth_jwt.goではMiddlewareFuncを呼び出します。RouterにはauthMiddleware.MiddlewareFunc()をかまし、その中に実行したいRouteを設定します。})}middleware側では、IdentityHandlerとAuthorizatorをあらかじめ実装しておく必要があります。false},トークンを使ってリクエストを投げるとリクエストが実行されます。application/json"正常にレスポンスが取得できました。invalidが返ってきます。invalid"}MiddlewareFuncの処理を見てみるでは実際中ではどのような処理が行われているかauth_jwt.goのMiddlewareFuncの主要処理をみてみます。トークンからクレームを取得します。mw.GetClaimsFromJWT(c)クレーム内のexpをチェックしトークンが有効かをチェックします。return}ミドルウェアで実装しているIdentityHandlerを呼び出し、クレームからユーザ情報を取得します。}},ミドルウェアで実装しているAuthorizatorを呼び出しIDが一致していたら認証OKとなります。false},MiddlewareFuncの全処理です。c.Next()}これで一通りの動作確認ができました。まとめはじめ知らないワードが出てきて理解しきれなかったのですが、実際に触ってみることでJWTについてある程度理解できました。触ってみてステートレスであり、ステートレスであるがゆえにJWT単体ではトークンを無効にすることが出来ないという理由も実感できました。オススメコーチング書籍3冊!!これまで特別意識してこなかったコーチングについて意識する機会があったのでオススメしてもらった3冊を読みました。学びがあったこととその感覚の定着の為にメモしておきます。大学を卒業してソフトウェアエンジニアになり、いちエンジニアからチームリーダー、テックリード、マネージャー、スタートアップのCTOを経験してきました。その中でチームマネージメントや1on1などもやってきました。これまでやってきたことは自分の経験であったり周囲との関わりで得たものをベースに自分なりに考えてやっていました。今、新しい環境(スタートアップ)にジョインしたところ、今の環境には1on1(コーチング)を積極的に進めているエンジニアがいました。それはこれまで半ばやらされている感じでやっていた1on1とは印象が違いました。そこでもれなく自分もコーチングをしてもらうようになったわけですが、そのコミュニケーションの中でこれまでの自分の活動を振り返ってみると自分が今「コーチング」に興味があることが分かりました(年齢的なこともあると思います)。「マネージメント」と聞くとちょっと抵抗感があるけど「コーチング」と聞くと抵抗感がないという不思議さもあります。そんなこんなでオススメしてもらった書籍を読み、体系的に学びを得た上で、今後の活動に活かそうと思います。コーチング・マネジメント―人と組織のハイパフォーマンスをつくるコーチング・マネジメント―人と組織のハイパフォーマンスをつくる書評2002年に出版された本なので今から約20年程前の本ですが、読んでいても時間の経過による内容のずれなどは全く気になりません。前半から後半にかけては、コーチングの基本・詳細と進んでいき最後の方にはコーチングを導入するにあたってのチェックリストがあるといった構成になっています。中でも一番の要点は、「コーチング・フロー」と「いかに聞くのか?」ということだと思います。「コーチング・フロー」は次のとおりです。行動計画を立てるフォローこれだけ見ると当たり前のようですが、これを実際に実践する・させる為に「いかに聞くのか?」というスキルが求められます。本の中ではそのコミュニケーションへのアプローチの方法やコミュニケーションが如何に大事かが書かれています。やり方や捉え方によっては詰めているようにも感じられそうな程の質問攻めですがそこのバランスが重要なポイントになるかと思います。書評2009年に出版された書籍の新版(2019年)です。この本は「コーチング・マネジメント」より詳細に具体的にコーチングについて書かれています。後半では実例による説明もあります。目次がパッと見分かりやすかったので記載しておきます。組織へのコーチング本書でも4章で「コーチング・プロセス」とし「コーチング・マネジメント」の「コーチング・フロー」が書かれています。本書で特筆すべきは「コーチが持つべき3つの視点」として以下の3つ(PBPの視点)について言及されていることです。これらは三角形となりそれぞれ相互に作用しているようです。Possesion(身につけるもの)Behavior(行動)Presence(考え方、信念)全体的に図が多く具体的に書かれているので「コーチング・マネジメント」と合わせて読むとより理解が深まると思います。書評2016年に出版された本で、上記2冊と違い著者が外国人です。著者は日本に長年いながらも、グーグルやモルガン・スタンレーで人材開発を務めていたとあって外国から見た日本という視点がおもしろい点です。上記2冊と違いコーチングではなく、リーダーシップはこうあるべきということが書かれています。グーグルの話や、マインドフルネス、禅などの話も出てきます。コーチングという文脈ではないので上記2冊+αな気持ちで読むとよいかもしれません。problems.(リーダーシップとは、難問に取り組むために人々を動かしていくこと)」という定義を用います。Unlearn学ぶことは大事だが、ただ知識を増やす(Learn)だけではなく、学び直す(relearn)の必要があります。完全に時代遅れになった考え方、価値観や信念は手放す(unlearn)べきです。続き、それのTypeScript版を作ってみました。GORM+GinでTODOリストのAPIを作ってみた」を利用します。CORSを全て許可しているのでどこからでも叩けるようになっています。TypeScriptを書くのは今回が初めてなので、誤っている箇所やもっとよい書き方などがあれば指摘して頂ければと思います。できたものできたものはこちらです。http://vuejs-ts.taisablog.com/todoAPIのエンドポイントAPIのエンドポイントは以下としました。削除プロジェクト作成vue-cliを使ってプロジェクト作成をしました。featuresを選択し、TypeScriptをONにします。ここではRouterもONにしました。featuresvue-cliでできたプロジェクトのsrc配下の構成は以下となっています。今回はそこにTodo.vueとTodoList.vueを追加して実装しました。views配下で実装するだけでも大丈夫ですが、今回はあえてviews/Todo.vueからTodoList.vueコンポーネントを呼び出す形としました。新規追加views/Todo.vueTodoList.vueコンポーネントを呼び出します。importとクラス定義axiosを利用するのでインストールします。'http://gin.taisablog.com/api/v1/'createdフックcreatedフックでロード時に一覧を取得します。}}HTMLHTMLとCSSはもう少し書き直したいです。}ソースhttps://github.com/taisa831/sandbox-vuejs-tsまとめTypeScriptを書くのが初めてだったので(書籍自体あまりなかったですが)事前に2冊購入して読みました。学習コストが大変かと思っていましたが、評判通りJavaやC#のようなサーバサイドのように書けるので書きやすくてよいです。taisa831Vue.jsで外部APIを使ったTODOリストを作ってみたAPIを使ったTODOリストをVue.jsで作ってみました。GORM+GinでTODOリストのAPIを作ってみた」を利用します。CORSを全て許可しているのでどこからでも叩けるようになっています。できたものできたものはこちらです。http://vuejs.taisablog.com/todoAPIのエンドポイントAPIのエンドポイントは以下としました。削除TODOリストの処理プロジェクトはvue-cliで作成し、APIはaxiosを利用しました。componentsにTodo.vueファイルを作成しそこにすべての処理を書いています。XTodo.vue全部HTMLとスタイルはあえてフレームワークを使わず自力で作成したのでボロボロです。}ソースソースはこちらにあがっています。https://github.com/taisa831/sandbox-vuejsまとめもっとスマートな書き方があるかしれませんが、これで一通り動作するようになりました。次はこれをTypeScriptに書き換えたものを作成する予定です。HTMLとCSSに一番時間がかかったのでもっとスマートにさらっと書けるようになりたいです。taisa8312019年前半の振り返り2019年が半年を過ぎたので振り返ります。本業頑張るのはもとより、2019年の抱負がある程度固まってきたので書いておきます。これまでAWSを自分で多く触るケースはあまりありませんでしたが、GCPを使うケースが増えてきたので今年からはAWSではなくGCPをたくさん触っていこうと思います。Functionsを扱いました。http://sandbox.taisablog.com/)を立ててみたりしました。FirebaseもGCEもかなりいい感じなので今後は個人でちょくちょく使っていくと思います。使い方の勘ドコロ数学をやる間に合わせ程度に以下の投稿にある内容をやりました。次はまたしばらく必要になりそうなタイミングになったら進めてみようと思います。小学校6年間の算数から中学3年間の数学までを復習してみた宅建をとるいろいろと調べたり少しやってみたりしたところ、以下をやればなんとか合格できる気がしましたが状況が変わってきたので受験するのはやめました。宅建みやざき塾でテキストを購入(テキストだけの購入は不可)何回か講義を受ける3月頃にはじめて10月に向けて通勤時間などを活用して約300時間くらい費やす直前に対策講義を受ける体力をつける相変わらず走れていませんが軽い筋トレをしつつ体重は4キロ程減らせました。あと3キロ減が目標です。ブログ記事1月から6月末までで11記事でした。年間月2記事で24記事を目安にしているので1記事程足りないペースでした。GORM+GinでTODOリストのAPIを作ってみた目標の見直し2019年後半は以下をがっちり身に着けることを目標にします。目標の詳細については違うタイミングで少しブレイクダウンする予定です。WooCommerce.。