先日、社内勉強会を開催し、Jakarta EE 10の変更点について発表しました。
ところで、スライドはMarp + VSCodeで作成したのですが、Markdownで書いた構成案に肉付けしてそのままスライドを作れたので、すげー便利ですね。
技術は世界を救う。たぶん。
先日、社内勉強会を開催し、Jakarta EE 10の変更点について発表しました。
ところで、スライドはMarp + VSCodeで作成したのですが、Markdownで書いた構成案に肉付けしてそのままスライドを作れたので、すげー便利ですね。
2021/08/21に開催されたISUCON11 予選にチーム「TF」で出場しました。
ISUCON (Iikanjini Speed Up CONtest) についてはこちら→ https://isucon.net
・2021/08/27 18:41: ISUCON11 オンライン予選 全てのチームのスコア(参考値)の順位に更新(68位→67位)
どちらも初参加の2人で参加しました。言語はGolangを選択しました。
運営の計測による最終スコアは53398点、全体の67位で予選敗退しました。
ベンチマークの履歴は以下。ちなみに初回ベンチ = 10:08:38 の4149点は、当時暫定1位でした。やったね。
yulis452は開発ノータッチの方針が決まっていたので、手を動かす練習としてISUCON10予選、10本戦、11事前講習をときました。GolangはMattermostのソースを少し読み書きした程度だったので実装面は割と怪しめでしたが、初動での計測ツール設定をある程度Ansibleで行うことを検討していたので、playbookを整備して、早く開発に入れる準備をできた、と最後の練習を終えた時点では考えていました。
※当日はサーバーリストの表示順で上から1号機〜3号機と呼称していたため、以下同様に記載します
予選ライブでISUCONDITIONの紹介を見て、いざ始めようとansible-playbookを叩いたらいきなりエラー。pt-query-digestのためのslowlog設定が/etc/mysql/mysql.conf.d/mysqld.cnfを前提にしていたところ、MySQLではなくMariaDBがインストールされていてコケました。
今思えばそこでMySQLに入れ替えるともできたと思いますが、なぜかpt-query-digestを諦めてMariaDBのまま進む方針としました。この時点ですでにテンパってますね・・・
ansibleでの設定が終わった段階で1号機に対してベンチマークを実行するとなぜかfailしました。同じ状態の2号機・3号機を指定したらfailしなかったので、以降は2号機をベンチ対象として指定する方針にしました。(後で運営からアナウンスがありましたが、ベンチマーカーの不具合があったようです。該当したのが弊チームのみという・・・)
DBを3号機に移し、New Relic APMを設定したところで12時、スコアは1000点でした。
前日に調達してあったコンビニ弁当を食べつつ、インデックスを追加したところで27000点台まで伸び、その後細かい修正をいくつか行っていますが、それ以上はすぐには伸びませんでした。
14時前、当日一番のやらかしポイントが到来します。
https://github.com/maruTA-bis5/isucon11-qualify/commit/bece0826949cf71a2ed50bebe11bcba64c1c008b
複数回INSERTするならバルクインサートにしてしまえ、という発想の修正でしたが、
“)”を”~”にtypoするという痛恨のミス。
これによってisu_conditionが全くINSERTされなくなり、加点要素がないためにスコアが1000点のまま変動しなくなりました。
多分冷静ではなかったのでしょう。この後色々な修正を試みますがいつまで経ってもtypoに気づかず、ポータル障害明けの18時過ぎになってようやく気がつきました。。。
紆余曲折あったときの修正の一部が原因でfailしていたのもあったのでrevertして、fail -> 45268点に復帰。すでに残り時間も少なく、これ以上コードに修正を加えるのはリスクがあると感じたため、これ以上コードに大きく手を入れるのは止めることにしました。
最後の調整としてDBのコネクション数を増加させてから、諸々ログ・計測を止めた状態で51198点。再起動試験としてsudo reboot後にISUCONDITIONにアクセスしてデータが入っているのを確認した後、再度ベンチマークを回して最高点の53478点で終了しました。最終スコアとは違いますが、ひとまず初参加ながらスコアを残せそうで一安心です。
初手MariaDBや、午前中から数万点のスコアを出している他チームを見て、かなり焦ってしまったことが諸々のミスにつながっているように思います。普段の仕事でも、プレッシャーがかかるとミスを起こしがちなので、いかにプレッシャーを感じずに進めるかが重要そうです。
yulis452は開発はできないものの、情報整理を得意としているので、今回はマニュアルの確認とベンチ結果の考察をお願いしていました。特にマニュアルについては、「このデータについて加点に関係するか?」という聞き方でも適切に加点内容を説明してもらえたこと、当日マニュアルとは別にアプリケーションマニュアルも存在していたことを指摘してくれたことで非常に助かりました。
とはいえ、私自身もそこまで開発の手が早いわけではないですし、ISUCONの参考実装に頻出の言語に慣れていないので、もう1人開発担当がいれば例の凡ミスにもすぐ気がつけたかもしれないなぁ。
予選当日に使用したリポジトリは以下に公開しています。
https://github.com/maruTA-bis5/isucon11-qualify
前提: Gitのuser.name
, user.email
が適切に設定されていること。
この記事の手順で作成したリポジトリは https://github.com/maruTA-bis5/git-init-eclipse です。
1. EclipseのProject Explorerより、Git管理したいプロジェクトを右クリックし、Team > Share Project…を選択する。
2. Share ProjectダイアログのUse or create repository in parent folder of project
を選択する。
3. 対象のプロジェクトを選択し、Create Repository
ボタンをクリックする。
4. Finish
をクリックする。
ここまででローカルリポジトリが作成されます。次は初回のコミットを行います。
5. Git Staging
ビューを開く。
6. Unstaged Changes
のファイルをStaged Changes
に移動し、Commit Message
を入力してCommit
をクリックする。
このとき、*.class
ファイルは表示されていませんが、*.class
ファイルが出力されるディレクトリは.gitignore
に記載されているため無視されます。他にも無視するファイルがあれば.gitignore
に追記しておきます。
※.gigignore
はProject Explorerには表示されないので、このタイミングで修正するか、Git Repositoriesビューから開く必要があります。
初回コミットが完了したら、リモートリポジトリにpushします。(リモートリポジトリでの管理が不要ならここまで)
7. Git StagingビューのPush HEAD
ボタンをクリックする。
8. Location
> URI
にリモートリポジトリのURL、認証が必要ならAuthentication
を入力しPreview >
をクリックする。
画像ではSSHを使用する形で入力していますが、HTTP(S)でも問題ありません。
パスワード認証が必要な場合は、Authentication
を入力しておきます。
9. ブランチの指定は基本的に変更しなくて良いはず。前のステップで入力した認証情報に誤りがあればこの段階でエラーが表示されるので、一度戻って修正する。問題なければPreview >
をクリックする。
10. pushのプレビューを確認してPush
をクリックする。
11. pushが完了するとpush結果が表示される。失敗した場合もこのダイアログが表示されるので、必ずMessage Details
の内容を確認する。
Mattermostと他のアプリケーションを連携する新しい方法として、Mattermost Apps FrameworkがDevelopers Previewとして利用可能になりました。
https://developers.mattermost.com/integrate/apps/
Appsの説明としてBe written in any language.
と説明されており、せっかくなのでJavaで試してみました。普段仕事で使うのはJavaなので。。。
リポジトリ: https://github.com/maruTA-bis5/mattermost-apps-example-java
Appsを作るのに最低限必要なことはkaakaaさんの記事やQuick startを読んで頂くとして、それ以外に/install
がOKのレスポンスを返さないとインストールに失敗するようです(画面上や/apps list
では問題ないように見えるが、Failed to install app
のログが出力される)。mattermost-plugin-appsのコミット0cae0b3fadb7bfae03ffc015cab28654e4bf2d31で確認しました。
Java App側はJAX-RSでサクッと。Quick startではいくつかのjsonファイルを作成してそれをGo側で読み込んで返却するようにしていましたが、動的に生成できるようにデータモデルとJacksonを使っています。
内容としてはQuick startと同じなので代わり映えはありませんが、Goでなくても同じ挙動のAppsを作れるということは確認できました。より複雑な処理が必要になってくるとApps APIを利用することになりますが、Apps Pluginが提供するREST APIなのでそこまで難しくはなさそうです。
Pluginと違って、Go以外の言語でも簡単に作れるのは良いですね。
普段の業務ではモノリシックなアプリを扱っているので"分散"という点はあまり気にしていないのですが、やはり1リクエストでどの辺の処理に時間がかかっているのかを知りたい気持ちがあります。Jakarta EEとの統合を考えるとMicroProfile OpenTracingが第一候補になるかと思います。MP OpenTracingは主にJAX-RSとの統合を意識して作られていると思っていますが、Jakarta Server Facesとの統合を考えるといくつか検討すべき事項があります。
jsf ライフサイクル
で検索してください@Traced
アノテーションを付与したクラス・メソッドの処理時間等を記録する(CDIのInterceptorで実現している)が、@ViewScoped
なバッキングビーン(Serializable
とする必要がある)で使用すると例外が発生する(メモるの忘れた・・・non-serializableなinterceptorは適用できないとかなんとか)この2点を解決できれば有用かと思ったので、休暇を利用してさっと作りました。ライセンスはApache License, Version 2.0
で、Maven Centralにも公開済みです。
https://github.com/maruTA-bis5/opentracing-faces
使い方はREADMEにも書いてあるとおりですが、基本的にMP OpenTracingと同じように使います。
Serializable
でないバッキングビーンや、それ以外のCDI管理Beanなどについては、MP OpenTracingの@Traced
を使用します。@ViewScoped
なバッキングビーンに@Traced
を使うと怒られるので、@TracedSerializable
を代わりに使用します。TracingPhaseListener
を使用します。ちなみに動作確認はWildFly 20.0.1.Finalで行いました。他のアプリケーションサーバーでうまく動かなければ教えてもらえると助かります。
この記事はStackOverflowの質問”How to resolve conflicts in EGit”に対する回答(https://stackoverflow.com/a/27914508)の日本語訳です。(2020/07/02 9:31閲覧 original: dan carter, edited: Peter Mortensen)
原文と同じく、CC BY-SA 4.0でライセンスされます。
Team Synchronize(チーム同期化)ビューを使っていますか?それは問題です。EGitの場合、競合の解決にTeam Synchronizeビューは全く使えません。代わりにGit Repository(Gitリポジトリー)ビューを使う必要があります。
Gitパースペクティブを開いて下さい。Git Repositoryビューの中のBranches→Local→masterを右クリックしてMerge…を選択します。
Remote Trackingには自動的にorigin/master
が選択されるはずです。Mergeをクリックして下さい。(訳注: 作業ブランチにmasterの変更を取り込む場合は、origin/masterを自分で選択する)
(訳注: 競合している場合は)result:conflict
と表示されるはずです。
競合しているファイルを開くと、古いsk000l >>>> ==== <<<<スタイルで競合箇所が示されます。ファイルを編集して競合を解決し、保存します。
‘Git Staging'(Gitステージング)ビューを開くと、変更した(訳注: 競合していた)ファイルが’Unstaged Changes'(ステージされていない変更)に表示されます。右クリックして’Add to Index‘を選択してください。
これをファイルごとに繰り返します。
そして’Git Staging’ビューからコミットしてプッシュします。Git/Eclipseはあなたがリモートリポジトリに加えられていた変更をあなたのローカルのmasterにマージしたことを認識し、non-fast-forwardエラーは回避されます。
2017/03/21に開催されたJJUG ナイト・セミナー 「Enterprise Java最新動向〜Java EE 8とMicroprofile〜」に参加した際のメモ書きです。
気が向いたら内容を整理するかも。
Java EE 8は仕様はFIXしていないので注意
WebTarget
)の生成が可能に.async()
をコールするだけ、コールバックオブジェクト(InvocationCallback
)の登録も可能)InvocationCallback
がネストしてかなり気持ち悪い(callback hell).async()
)に加えて、RxInvoker(.rx()
)が追加された。戻り値はCompletionStage
CompletionStage<Number> price = client.target(...);
CompletionStage<String> wheather = client.target(...);
price.thenCombine(wheather, (price, wheather) -> reserveIfAffordable(price, wheather));
// ^ priceの結果とwheatherの結果を受けて次の処理を行う。chain
// ^ TODO 後で調べる: CompletableFuture
RxFlowable<Response> flowable = client.target(...).request().rx(RxFlowableInvoker.class).get();
.rx()
の引数に、RxInvoker継承クラスを指定するws://
)だが、Server-Sent EventsはHTTPベース/0/user/address
JsonPointer
, JsonPointer#getValue
JsonPatch#diff
, JsonMergePatch#diff`JsonCollectors
@JsonbFooBar
アノテーションで、カスタマイズ可能
PushBuilder
.fireAsync
をたたく、Observer側は@ObserveAsync
@NotEmpty
@NotBlank
@kkzr
https://www.slideshare.net/kenjikazumura/2017 3Q Ver1.2(plan)
APSベンダーがMicroProfileを提供 > 市場が評価 > [OK]JCPへ提案, [NG]フィードバックを反映
@Inject @ConfigProperty ConfigValue<Integer>
GET /health
> 200 Up
or 503 Down
@Health
をつけて、HealthStatus
を返す.retryOn
)、間隔(.withDelay
)、回数(.withMaxRetries
)を指定.withFallback
)を指定する※この記事は丸太式 Advent Calendarの25日目です
まさか最後まで書けるとは思っていなかった
25日目です。
仕事で帰りが23時になる日も多かったですが、自分でもよく書けたと思っています。
何日か日付またいだけど
Advent Calendarの記事はAdventarにまとめてあります。
http://www.adventar.org/calendars/402
おおむね技術系の記事になっています。そういう仕事だし仕方ないね。
どうせ記事を書くなら業務からネタを持ってきたかったのですが、自社フレームワークだったりバージョンが若干古かったりしたので、あまり書くことがありませんでした。
毎日アウトプットするのは大変でしたが、来年は隔週くらいで何かしら出力していきたいです。
さて、明日は仕事納めです。
仕事納まるかなぁ・・・
皆さん、良いお年を!
※この記事は丸太式 Advent Calendarの24日目です
GitHub Flowを弊社の開発で取り入れられないか検討するために、少し調べています。
#何も決定権は持っていないけど
とりあえず読んだ/読んでいる/読もうと思っているページを幾つかピックアップしています。
GitHub Flow(というかGit)を使った開発経験が無いエンジニアをうまく説得できる材料がそろえば良いと思っています。
https://gist.github.com/Gab-km/3705015
http://qiita.com/tbpgr/items/4ff76ef35c4ff0ec8314
https://pepabo.github.io/docs/github/workflow.html
http://komaken.me/blog/2013/09/09/git-flow%E3%81%A8github-flow%E3%81%96%E3%81%A3%E3%81%8F%E3%82%8A%E3%81%BE%E3%81%A8%E3%82%81/
GitHub Flowじゃないけど
http://www.slideshare.net/KatokichiSoft/git-flow-16616440
弊社の製品品質について若干問題が生じているので、社内でもっと活発に議論できればと思っています。
# 関係ないですがlink-cardの日本語文字化けがひどいですね。近いうちに何とかします。
※この記事は丸太式 Advent Calendarの23日目です
こんばんは。Vim初心者です。
普段からできるだけVimを使おうと思っているのですが、会社のPCがWindowsなのでどうし
ても他のエディタを多用してしまいます。
ただ、そちらのエディタはMarkdownの構文強調に対応していないので、仕事の合間にメモ
を取る場合等、プレーンテキストのモードでMarkdownを書いたりしています。
また、この記事もMemolistプラグインで作成したMarkdownをほぼそのまま貼り付けていま
す。
Software Design誌の2015年1月号に、【「Vim使い」事始め】という特集が組まれています。
別に中の人でも何でもありませんが、Vimを使う上で必要なことが凝縮されているように感じました。
Software Design (ソフトウェア デザイン) 2015年 01月号 [雑誌]
本編はもちろん、@jnchitoさんと@kaoriyaさんのコラムは興味深い物があります。
これからVimを使おうとしている方はもちろん、Vimを使い始めてまだ間もない(私のような)方も是非読んでみてください。
私の.vimrcはGitHubで管理していますが、「ここはこうした方がいいんじゃない?」「こ
のプラグインはおすすめ」というご意見があれば、是非ご教授ください。
https://github.com/bis5/dotfiles