BullよりElkスマートフォン用の表示で見るBullよりElk洋服と食をこよなく愛するWebプログラマ。この広告は、90日以上更新していないブログに表示しています。Dayとは、「日々のプロジェクトにリソースを取られて、技術獲得やチャレンジができず知的好奇心を満たせていない」と感じたリーダーが(勝手に)企画してくれたとてもありがたい日です。2週ごとに1日くらいのペースでやっていくつもりです。題材は、自チームや自身のメリットに繋がることであれば何でもよいです。CI入門」を選びました。チュートリアルを試したレベルですが、やったことを書きます。この題材にした理由は2つあります。数年前から気になっていて、当時の同僚(とても尊敬している人)がかなり推していたから会社でJenkinsを使っているけど、時代的にどうだろうと思ったから。Composeのインストール任意のディレクトリで次のコマンドを実行。Councourseがデプロイされます。CLIのバイナリが落ちてきます。(今回はMacで話を進めます)ダウンロードしたら次のコマンドを実行します。timeの精神に基づいており、flyコマンドを実行する度にターゲットAPIを指定する必要があります。manually:メッセージにしたがってhttp://127.0.0.1:8080/sky/login?redirect_uri=http://127.0.0.1:54711/auth/callbackにアクセスすると、ログイン画面が表示されます。docker-compose.ymlのservices.concourse.environment.CONCOURSE_ADD_LOCAL_USERに設定されている。username:admin、password:adminでログインできます。コマンドでもログインできます。APIをターゲットにできます。任意のディレクトリで次のコマンドを実行し、concourse-tutolialをクローンしてtask_hello_world.ymlを実行します。worldと出力するだけの簡単タスクです。task_hello_world.ymlタスクが完了すると、以下のように出力されます。呼ばれていることがわかります。worldsucceededhttp://127.0.0.1:8080/builds/1にアクセスするとWebUIで実行結果を確認できます。GNU/Linuxsucceededこれも同様に、http://127.0.0.1:8080/builds/4にアクセスするとWebUIで実行結果を確認できます。今回はとりあえずここまでです。Boot2系に移行してハマった点について書きます。2.1.xで変更された点もまとめます。変更点見つけたら随時書いていこうと思います。Bootのバージョンは1.5.10です。2系のバージョンは、2.1.1(2018/12/14時点の最新)です。WebErrorAttributes#getErrorAttributes()の引数変わったhttps://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/error/ErrorAttributes.javaGradle実行可能jarの作り方1bootRepackageタスクが呼ばれたあとにjarタスクが呼ばれて実行可能jarが作られるようです。true}2bootJarタスクで実行可能jarを作ります。jarタスクは無効になっているようです。launchScript()}actuatorエンドポイントプレフィックス1/health2/actuatorがつくようになりました。2.0.x「,」区切りでした。--></springProfile>2.1.x「|」区切りになりました。PROJECT(FCP)というサービスの開発を副業で始めました。FCPとはFCPとは、「ファッションアイテムの寄付とお買い物でチャリティ活動できる」サービスです。コイニーに入る前に勤めていたwajaという会社が運営しているサービスです。詳しくは、ココをみてください。バックエンドは1人で1ヶ月半でフルリプレースを行いました。これは、エンジニア生活で一番の大仕事でした。技術的な変化としては次の通りです。SecurityThymeleafただリプレースするだけでなくて、リファクタリングをやったり、パフォーマンス改善も行いました。副業を始めようと思ったのか副業を始めた理由として、もちろん「お金が欲しい!」という気持ちはあります。1番の理由は、「転職をしないため」です。自分は、1つの環境だけに長くいられない性格をしているようです。これまで転職を何度かしてきました。自分でいうのもアレなんですけど、その期間でちゃんと貢献はしてきたつもりです。いろんな会社を見てきた経験はできました。それとは引き換えに長い時間いることでしか味わえない本当に辛い時期や信頼関係というものを経験したことがありません。これについては、そろそろ経験しておかないとまずいなとは思っています。コイニーの所属するheyグループは、まだまだ発展途中ですが本当にいい会社だと思います。けっこうなペースで人が増えていて、これから組織的な強化が行われていくのだと思います。それに伴って懸念していることがあります。いい環境というのは心地よくて、長くいたい(出たくない)と思うようになり、外を知るということを自然としなくなるのではないだろうかと思います。なるのが非常に怖くて、会社とは違うどこかに所属しておきたいと感じていました。することで転職への熱はだいぶ抑えらます。FCPを選んだのか3つ理由があります。スーパーできるディレクターともう1度仕事をしたかったからこの人と入社時から絡むことはあったけど、仕事で絡んだのはやめる3ヶ月前からです。仕事の熱とか視点とか知識はかなり持っていて、純粋に「この人すごいな」ってなりました。仕事だけでなく、その他の引き出しも多いし何者なのだろうかと思ってました。ある程度コード書けるので、1人で回せなくはないかなと思います。リプレースしたばっかで数字もよくて、「今がチャンスだからディレクター業に専念したいから可能なら開発はやって欲しい」というのは退職してからも話は持ちかけられてました。本業の試用期間も終わって少し落ち着いたころに直で、CEOにFCPの開発やらせてよって連絡しました。思ったよりすんなりOKでました。そんな感じで始まって、また一緒に仕事ができるのでとてもワクワクしています。自分が作ったサービスは愛着がわいていたからだいたいの人はそうなんじゃないかな?って思うんですけど、DB設計からリリースまでほぼ1人でやりましたのでとても愛着が湧いてるサービスです。この経験ってなかなか積めないし、社会に貢献できるサービスなので、これからも成長させていきたいと考えてます。小さいサービスだしいろいろと試せて、会社では学べないことを学べそうだから会員数はけっこういますけど、サービスの規模は小さめなので技術的にも施策的にもいろいろと試せるのではないかと考えています。上記のディレクターとほぼ2人で進めて行くので、ビジネスのこともかなり理解しないといけないです。降りてきた仕様をそのまま実装するのはよくないですし。ビジネスの話はあまり得意でないので、そこについても学んでいけるのはメリットが大きいです。ここで学んだことを本業で活かせるタイミングはあるはず。最後に開業freeeを使えばすぐに開業届作れます。税務署での手続きも5分で終わります。Security使いましょう!」というタイトルで話してきました。Festを運営しているJSUGから「何か技術的な話ある?」と連絡が来たからです。声がかかったのは純粋に嬉しかったし、人前話す機会はなかなかないので迷うことなくYESと答えました。(人前で話すのかなり苦手ですけど)〜当日まで私は日常的に人前で話してないし、ネタになるような勉強はそこまでしていないので1ヶ月半前くらいから準備をはじめました。サンプル作って、リファレンス読んでソースコード読んでをひたすら行ってネタ集めをしました。ネタ集めを進めていくと、わかっていたこと、わかっていなかったこと、勘違いして認識していたこと、全く知らなかったことがすごくはっきりわかります。認可周りのは知識ゼロでした。登壇の機会がなかったらたぶん勉強しなおさない部分なのでよかったです。AccessDecisionVoterを使って認可処理を行っている何て想像もしてませんでした。メソッドセキュリティは好きですが、@PreAuthorize以外がほぼ使っていなくて改めて他のアノテーションについても学べました。ある程度調査が済んでからは、Keynoteと戯れる毎日。見た目、フォント、図すごく迷いました。(スライドの色は2日前まで全く違う色でした)社内リハもしました。人に見てもらうと全然目をつけていない部分にもちゃんとアドバイスが来るのでほんとによい。3回くらい個人リハやりました。資料作りながら感じたことです。資料作ったり練習したりして45分セッションやる人すごいなって感じた。20分だと何か1つでも持ち帰ってくれーくらいでやってたけど、45分となると聴く人が飽きないようにとか、何を聞きたいかとかより考えないといけない。当日スピーカー控え室に行きました。スピーカーの方は、みんなギリギリまで資料を見直したり、個人リハをしたりしています。登壇慣れしてる方でも。自分のセッション14:15、セッションの時間になりました。立ち見が出るレベルに満席でした。足を運んでくださって本当にありがとうございました。セッションの頭でコイニー知ってるかのアンケートとってみましたけど、10/90と想像以上に少なくて凹みました...満席だし、Springの講師やってる多田さんの前だし緊張MAXでした。本当は話すつもりなかったメソッドセキュリティの話もするくらいに時間早く終わってしまった...結果1分しか余らなかったのでよしとしました。美味しいご飯ありがとうございました。司会をやりましたw懇親会でお話した2人が自分のセッション聞いてくださっていました。Security特に使ってないけど今後使うことになりそうだからという理由でした。Springのソースコードの解説はよかったとのことでした。Security使ってるけど自分の理解に自身がなかったし、認証認可周りで知らないことあるからという理由でした。「自分の理解はあっていたようだ、知らないとこについても知れた。フレームワークのソースコードについても話してくれてありがたかった。メソッドセキュリティは全く知らなかったけど便利そうだから使いたい。」という嬉しい言葉をたくさんいただきました。こんな風にいろんな人話す機会がある懇親会っていい時間だなと強く感じました。反省等アンケートの結果には悪かったという評価もありました。ありがたいですが、欲を言えばどこが悪かったかまで書いてもらえるとありがたいです。自分なりに考えた悪かったところタイトルにCognitoと入れてたけど実際に話したのは、概要くらいで実装は特に紹介しなかった。Securityの話が割合として多すぎた。淡々と解説をしている感じになっていた気がする。今後にどう活かせばいいのかというイメージを描きにくかったと思います。話の流れがうまく繋がっていなかった部分があった。よかったこともいくつかありますが、恥ずかしいので省略します。自分で満足するセッションができなかったのは悔しかったので、社で開催する勉強会で反省点を生かしつつ、場数踏んでリベンジします。その他アンケートを書くまでがカンファレンスです。フィードバックをもらうことで次の機会に生かすことができます。スピーカーの皆さん単に話したいことを話しているわけではないと思います。何かしら持って帰って仕事に活かしてほしいと思いながら準備・セッションをしています。聴く人が求めていることはなんだろうといったことも考えていると思います。いうわけで聴いてる人の声がすごく役立つのです。会全体のアンケートも同様です。3分もあれば終わるので、お礼の意味を込めてアンケートに回答するくらいのことはやってもいいのではないのかな?と思います。Hibernateエンティティが登録、更新、削除された履歴を管理します。Enversは、履歴管理テーブル全体を管理するエンティティ(デフォルトでRevinfo)をいて、自動採番されるid(プロパティ名はrev)と履歴を永続化した日時(プロパティ名はrevtstmp)の2プロパティを持っています。エンティティ(後述のClient)の登録、更新、削除された履歴を管理するエンティティ(後述のClientHistory。デフォルトのクラス名はClientAud)が履歴管理するプロパティに加えて、Revinfoのid(デフォルトのプロパティ名はrev)とどのようなイベントが行われたかのフィールド(デフォルトのプロパティ名はrevtype)を持っています。ちなみにrevは、Revisionの略です。<artifactId>hibernate-envers</artifactId></dependency>@Auditedをエンティティクラス(またはエンティティの特定のフィールド)に付与する今回は、Clientエンティティを使って説明します。address2;}ここでClientエンティティの履歴を管理したいのでクラスに対して@Auditedを付与します。Clientエンティティの履歴を管理するエンティティは、デフォルトでClientAudとなります。Audは、Auditの略ですがわかりずらいのでClientHistoryにします。ClientHistoryのプロパティ名も、それぞれrevをauditId、revtypeをauditTypeに変更します。application.propertiesに次のように書けば変更できます。spring.jpa.properties.org.hibernate.envers.audit_table_suffix=_historyspring.jpa.properties.org.hibernate.envers.revision_field_name=audit_idspring.jpa.properties.org.hibernate.envers.revision_type_field_name=audit_typeテーブルを準備するFlywayを使うので、sqlファイルに次のように書きます。これで、Clientと対になるclientテーブル、ClientHistoryと対になるclient_historyテーブル、履歴管理テーブル全体の管理をするrevinfoが作られます。やってみるそれぞれ、Hibernateが生成したSQLです。1528214465681}ここでauditTypeの0、1、2は何ですか?という疑問が残ってるかと思いますが、それぞれ次の通りです。削除イベントにあったタイプが与えられます。Enversで履歴管理が楽になりました。現場からは以上でした。最近はやってるnoteに移行しました。16:56ブログ移行Tweet広告を非表示にするもっと読むコメントを書く2018-03-14私のPC事情ツール会社変わる時とかに、前の会社のPCでのブックマークとかアプリ移行できないときのためにメモ。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。