エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

【Java】JJUG CCC 2022 Spring参加報告

公式サイト

JJUG CCC 2022 Spring

参加セッション

  • 開発者にやさしく、柔軟性、安全性を高めたGithub ActionsベースのCI/CDを構築する
  • Java で作るカスタム GitHub Actions

参加理由

ネタ探し&恒例行事のため

感想

メモ書き程度です。。。

開発者にやさしく、柔軟性、安全性を高めたGithub ActionsベースのCI/CDを構築する

  • CI/CDのタスク→なるべく小さなタスクに分割する
    • 必要な作業のみしたい場合に対応しやすくなる
  • actions/cache → ライブラリのダウンロード短縮ができる
  • flyway → DBマイグレツール。springと相性がいい
  • デプロイの効率化→デグレ確認・テスト作業の時間確保がしやすくなる
  • 環境ごとのブランチ→テストしたものが本番にあがっているのか判断しにくい。
    • 早い開発をしていくと、ネックになっていた。

Java で作るカスタム GitHub Actions

  • カスタムアクションは、そこまで面倒ではない
  • 好きな言語で作成できる
  • 他タスクと連携しやすいように、引数で挙動制御できるようにする
  • 文字列の扱いが煩雑になることは、なるべく辞める

「サポート」は製品開発? - JDBCライブラリ屋さんが実践する攻めのテクニカルサポートとJavaエンジニアのキャリアについて -

  • 質問をニーズと捉える
  • サポートできるシナリオを増やす

サポートにネガティブなイメージが多いのは、障害対応と同じ作業をするイメージが多いから。
バグ修正でいい思い出がある人って少ないと思うんだよね。。。
しかも、間違いを公然の場で指摘されるから、辛そうってイメージがあるんだと思う。

APIをラップしてSQLライクにアクセスできるってわけか。。。
ドライバの問題、利用するサービスのAPIの問題とか、いろいろな問題が凝縮されてそう。。。
twitterjdbc経由でデータ取れるんだ。。。

話を来ていて、どっちかというと、プロダクトマネージャーに近い気がした。
組織構造が気になった。

Java初心者が知っておくべきプログラミングのこと

  • 変数の難しさ:再代入とかしてると、それをおいきれてないために分からなくなる
    • ループがない→変数の再代入がない→状態保持しない→理解しやすい
  • オブジェクト志向:過度な適用をして難易度を上げている

過度な適用をしている例は結構ある。無駄なsetter/getterがそのいい例。
プログラミングが難しいと思われるのは、いろいろな問題が複合しているのを細分化できずに苦戦して、解決できる前に挫折する人が多いからだと思う。

  • readcode
    • in/outでなんとなく読める
    • 短い時間でやれる

AtCodeは、前に挑戦したことあるんだけど、入力した内容が全部消えてやる気がゼロになった

脱二重メンテナンス!ドキュメント自動生成への道

  • openAPI
    • swagger = openAPIのツールセットの一つ
  • テーブル定義書:schemaspy
    • DBからメタ情報を読み込んでドキュメント生成

swaggerって、結構簡単に導入できるんだな。
実際に動いているものからドキュメントを生成するのが、今の流行りなんだと思いました。

挙動が分からないときは、ソース見ろってことですね。。。

Javaのビルドやバージョンの違いをグラフデータベースで理解する。移行で困らないための知識グラフを作ろう。

あんまり利用用途がピンと来てない。

テストコードの注入から始めるレガシーコードのリファクタリング

  • テストはいっぺんに全部かかない
  • カバレッジを確認しながら進める
    • 100%を目指すのではなく、通っているところをリファクタリングする、通ってないところを通すテストケースを書くために利用する。
  • テストの目的を理解し、不要・重複するテストケースは削除する
  • モックはなるべく使わない。前提を間違うとテストも間違える。使うなら前提条件の確認もする

テストコードは、IntelliJだとTestMe使って、Mockito+JUnit5で作ると楽
実際の業務に耐えられるものかは知らないが、個人でやるレベルでは、問題ない。

テストクラスのメソッドに日本語入れるのは、賛成派。
半角全角の切り替えが面倒だから、あんまり使わないのが現状だけどね。。。

気になったもの

  • flayway
  • actions/cache
  • readcode

あとで調べるか。。。

感想

そう言えば、マイクロサービスってワードが頻出しなくなったな。
バズワードでは無くなったのだろう。

セッション聞いても、なかなか質問ってし辛い。。。
経験を聞くだけだと、「へぇ~」になってしまいがちなのをなんとかしたいと思ってる。
バカの壁が超えられてないなぁ~と個人的に感じている。
知識がないわけじゃないんだけど、たぶん、当事者意識が、今は低いのだろうと感じた。

アンカンファレンスの方に言ってみるべきだったかもしれないとは、後々思った。

【ネタ】SoftwareDesign2022年06月号 SE用語集の感想

書くに至った経緯

ゆるい記事があってもいいかなと思い、感想をつらつらと書きたくなったから。

不思議の国のSE用語

気になったものを一部抜粋

確かに、業界用語化しているから、初めての人は分からんだろうなと思う。

動詞編

渡す/わたす

これは、よくに言う。
語源は、たぶん、変数を箱として捉えるように言われて、そのイメージを言語化した結果、「渡す」になったんだと思う。

配る/くばる

最近は、言わない気がする。
どっちかというと、俺は、バラ撒くとか言う。
配ると同じだけど、バラ撒くの方が富豪になれた気がして気分がいい。

立てる/たてる

たぶん、「立てる」のイメージは「建てる」の方が合ってる気がする。
主にサーバーに対して使うけど、サーバー=インフラで、インフラ整備=建築から「建てる」って呼び回しが増えたんだと思う。

食べる/たべる

使った記憶がない。
どっちかというと、インポート/エクスポートって言う。

舐める/なめる

使ってる人は、見たことあるけど、俺は使ったことないな。
たぶん、50代以降の人しか使ってないと思う。
嫌らしい意味に聞こえるのは、僕だけでしょうか?

名詞編

ほげ

サンプルコードでしか見たことない。
言っている人って居るの??

ポンチ絵/ぽんちえ

聞いたことがない。
いい間違えそうなんで、たぶん、使うことはないだろう。

マサカリ/まさかり

イベントに出るようになって知った。
語源が分からんのだが、投げるのなら手裏剣の方がよくない?

形容詞編

しこしこ

セクハラで訴えられそうだから、使わない。
使ってる人をみたことあるけど、これも50代前後の人だけだと思う。

そもそも、しこしこって思いつく時点で、何かを狙ってるよね。

ペコペコ

使ってる人みたことないのだが、居るのか??
兎田ぺこらの狂信者しか使わないと思うぺこ!

Pekora Ch. 兎田ぺこら - YouTube

会議ワード編

運用でカバー

面倒くさいからシステム化対象外にしようぜって意味

理解理解

おっさんしか使わないイメージ
俺は使わない。
逆に、2度言う事で理解してないという印象を受けるのだが、俺だけ?

一瞬だけ

一瞬じゃない

正直ベース

実態を聞き出すための枕詞

感想

アジェンダってないんだ。。。
最初聞いたとき、意味わからんかったのだが。

他のやつも見てるけど、おっさんが使いそうなワードがいっぱいあった。
俺は使ったことないワードが多い。
どっちかというと、SIer業界で年のいった人が使ってそうな言葉が多い。
そのうち淘汰されていくと思う。

【翻訳】The 6 key questions I ask when reviewing code

元記事

The 6 key questions I ask when reviewing code - DEV Community

経緯

ちょっと興味を惹かれたので、翻訳してみた

要点

コードレビューでするべき質問・確認すべき内容

  1. 変更理由の説明
  2. 変更内容の副作用の検証(要求以外の挙動をしないかの検証)
  3. 影響範囲
  4. エンドユーザー・運用者からの視点
  5. いつ実行されるか?
  6. 要件がすべて満たされているか?

指摘は、否定的なものになりがち。
肯定的なコメントを残せるなら残す。

感想

書かれると当然だが、文章化してみたことは、ほとんどないなと思った。

業務をやっていって、なんとなく覚えたけど、初学者は分からんだろうなと思う。
対面あり/なしにかかわらず、する側もされる側も、これに注視して説明が必要だろうとは思う。

特に対面だと、レビューイとレビューアで、前提が違っていると、空回りすることが多い。
コーディング規約があるのなら、レビュー規約も作って、円滑にレビューが進むようにすべきだと思いました。

【Java】ジャロ・ウィンクラー距離を試してみる

経緯

RSSリーダーを作っているのだが、登録しているサイトが膨大になり、タイトルからある程度、類似した項目を抽出できないかと調査した。
その結果、ジャロ・ウィンクラー距離にたどり着いたので、とりあえず試してみる。

定義

ジャロ・ウィンクラー距離に最初からたどり着いたわけではなく、レーベンシュタイン距離の方が先にたどり着いた。
ちょっと、判定方法が安易だなと思って、もう少し深く調べたら、ジャロ・ウィンクラー距離にたどり着いたので試してみる

wikipedia

ジャロ・ウィンクラー距離 - Wikipedia

全然意味がわからねぇ。。。
調べた感じ、文字列を置換・編集して同じ文字列になる距離を測ることで、一致度を判定しているらしい。

実装

今回の環境

Java11
IntelliJ IDEA 2022.1.1 (Community Edition)
Gradle 5.5

build.gradle

    // https://mvnrepository.com/artifact/org.apache.lucene/lucene-spellchecker
    implementation group: 'org.apache.lucene', name: 'lucene-spellchecker', version: '3.6.2'

    // https://mvnrepository.com/artifact/org.apache.lucene/lucene-analyzers-kuromoji
    implementation group: 'org.apache.lucene', name: 'lucene-analyzers-kuromoji', version: '8.11.1'

↑のやつをdependenciesに加えればイケるはず。

サンプル実装

import org.apache.lucene.search.spell.JaroWinklerDistance;

public class Test {

  public static void main(String[] args) {
    String str1 = "足なんて飾りです。偉い人にはそれが分からんのです。";
    String str2 = "胸なんて飾りです。男にはそれが分からんのです。";

    JaroWinklerDistance jaro = new JaroWinklerDistance();

    System.out.println(jaro.getDistance(str1, str2));
  }
}

※実装内容に他意はありません。

予防線張っておかないと、今の御時世、怖いからね!

使い方は簡単で、JaroWinklerDistanceってのを生成して、getDistanceメソッドで比較したい文字列を渡すだけ。
それだけで結果が見える。
ジャロ・ウィンクラー距離のアルゴリズムは、最初の頃は知りたいと思ったけど、ソース見てその気は失せた。

実行結果

0.91768116

かなり似てる判定になってますね。

逆に、ガンダム語録を変えて比較してみると

    String str1 = "足なんて飾りです。偉い人にはそれが分からんのです。";
    String str2 = "親父にもぶたれたことないのに!";
0.3777778

ふむ。。。
ちゃんと文章を見ているけど、さすがに、意味や背景は考慮してないな。

所感

できれば、意味を考えて距離計算できるといいんだけどなぁ。。。
たしか、ウィキペディアで該当ページまでたどり着けるまで、どれくらいか判定するサービスが会ったような気がする。
それと組み合わせてみると面白そうだと思った。※やる気はない

あと、いろいろ調べてて思ったけど、ベクトル計算が重要だなと思った。
どのアルゴリズムを見ても、ベクトル計算が必須。
いかに数値に置き換えるかが重要だった。
学生諸君は、ちゃんと数学は勉強したほうがいい。
分からなくても、概要は把握した方がいい。

参考サイト

2つの文字列がどれだけ類似しているかを判定するレーベンシュタイン距離とジャロ・ウィンクラー距離(Java編) | ぱーくん plus idea

【技術解説】似ている文字列がわかる!レーベンシュタイン距離とジャロ・ウィンクラー距離の計算方法とは - ミエルカAI は、自然言語処理技術を中心とした、RPA開発・サイト改善・流入改善レコメンドエンジンを開発

2022/05/30週 気づきと振り返り 開発環境なんとかなりませんかねぇ。。。

業務こなしての問題・気づき

ログ調査

結合フェーズに入って、ログを見て、挙動調査しているのだが、マジでハゲそう。。。。

原因が特定できず、ログとにらめっこして、時間だけが溶けていくので、ものすごい焦るんだよね。。。
ある程度、調査しても進展がなかったら、やり方を変える方がいいと学びましたとさ。

開発環境

ビルドが。。。

ビルドが遅すぎる。。。
いらないソース削ったりしてなんとかしてるけど、資材の不整合がおきて実行時にエラーが出たりすると、かなり混乱する。

本来ならば、それを考慮してシステム配置を考えるべきだったが、それを失敗すると、開発効率に甚大な影響があると学びましたとさ。。。。
それが、今後に活きてくるのかは、分からんけど。

Mockito

UnnecessaryStubbingExceptionの発生

使ってないmockがあると、発生するらしい。
最初、それが分からなくて、設定なにか間違ったか凄くコードを疑ってたけど、俺は何も悪くなかったんだ!悪いのは俺の周りの環境!

Java: Mockitoでハマった落とし穴5つとその解決方法 - Qiita

UnnecessaryStubbingException - mockito-core 2.6.5 javadoc

mockito blog: New Mockito API: lenient()

2022/05/23週 気づきと振り返り 頭ハゲそう

業務こなしての問題・気づき

Java

Spring

Validator愚痴1

@validatedで入力チェックしているのだが、BindingResultをメソッド引数に追加してないため、validationエラーが発生したときにメソッドが呼ばれずに、なんで?って2日くらい悩んでた。
俺が実装した画面だったら気づいたかも知れないが、下手に自動生成しているから、可能性の考慮から外れるんだよね。。。
それについての愚痴は、後記の通り

Validator愚痴2

入力チェックをvalidatorでやるのはいいんだけど、いろんなところに設定が飛ぶせいで、無茶苦茶メンテしにくい。 利用しないほうがメンテしやすいのではないかと感じたが、俺だけだろうか?
かなり頭を抱えながら設定を確認していた。
デバックしにくいのも難点だと思う。

validatorの要素数チェック

Spring使って開発しているんだが、リスト形式のデータの場合、デフォルトで要素数チェックが入ってしまうらしい。。。
デフォルトだと256件。
単体のときは発生せず、結合になって本番相当のデータを操作して初めて気づいた。
原因を特定するまで、無茶苦茶時間がかかった。。。
まぁ、これにたどり着くまでに、crsfトークンの問題があったりして、いろんなところに確認依頼出したり、打ち合わせ出たり、シンドかった。。。
メンタルやられてるのに、そういうのに出るのは、かなり辛いんだよね。。。
誰か、もっと俺を甘やかして!!

DataBinder (Spring Framework API) - Javadoc

自動生成

障害対応・バグ修正が難しい

自動生成される内容を完全に把握してないと、バグ修正が難しい。
実際、自動生成されたものが意図したものではないけど、正常ケースが通る場合、何が悪いのか、かなり難儀な調査をした。

バグが発生しないと思い込むせいで、可能性から除外してしまい、改修が面倒になる。

やるならソースを全くイジらない自動生成か、実装は人がやるのどちらかにしないと、見えない工数がかかってくる。
しかも、不具合

雑記

今週もキツかった。。。
もう、ドツボにはまることが多くて、マジでハゲそう。。。

温泉旅行でもしてゆっくり過ごす日をどこかで作りたい。
GWは、人と会いたくなくて、ずっと家で籠もってたから、6月あたりで出かけようかなと画策中。
いつもだと、箱根あたりに行くんだけど、気分変えて、別の場所がいいかな?
候補としては、熱海、鬼怒川、草津あたりを考えてる。

Webスクレイピング周りの調査結果まとめ

きっかけ

webページ解析してみたくて、いろいろ調べた

調査内容まとめ

基本的に、jsoupってライブラリを使えば、webページの情報をオブジェクト化してくれる。
あとは、cssの知識と正規表現の知識があれば、データを引っ張ってこれることまでは確認できた。

問題は、動的webページの解析。

いろいろ調べたが、HtmlUnit使えばいいらしいってことまで調査できたが、自分が使ったサイトでは、無理だった。
他にも、seleniumのライブラリ使って動的サイトで最終的なwebページの情報を取ろうと思ったけど、無理だった。
ajax許可しているはずなんだけど、できてないのは、何かしらの原因があると思っているけど、それが何なのか調査しているうちに、心が折れてしまったよ。。。

javaのライブラリでは無理だったのだが、pythonとかjsのライブラリならイケるのだろうか?

あと、json形式でデータを持っているパターンがあって、それは、正規表現で抽出して、jacksonに食わせてやったんだけど、階層構造が複雑すぎて萎えた。。。
json構造を分析してjavaファイルを作成してくれるサービスが欲しいんだけど、全部1ファイルで出力するやつで、「そうじゃないんだよ!!!」って心の中で叫んでた。
結局、人力でオブジェクト作成したけど、今後もなにかありそうだから、生成するやつを作っておきたい。

まとめ

javaだと、webスクレイピングは、静的解析なら十分にやれることが分かった。
ただ、cssの知識が必須。
あとは、文字列操作とかのために、正規表現とかもいる。

動的webページの解析は、サイトによってできたりできなかったりがある気がする。
ヘッドレスブラウザが充実すれば、javaもワンチャンとは思うが、現状、進化の早いブラウザの実装に付いて行ける力のあるライブラリは、ない気がしている。

その他雑記

いろいろ調べてて思ったけど、ブラウザのサポートが、chromefirefoxのエンジン大半だった。
firefox民なのだが、調べてるとchromeの情報が大量に出てくるので、憤りを覚える。
「そのうち、独占禁止法とかに触れてしまうのでは?」って思うのだが、ブラウザ戦争は、このままchrome独り勝ち状態になってしまうん??
潮目が変わったと思うのは、firefoxのアドオン切りのあたりからだろうと思っている。
firebugsとか、お気に入りのアドオンが使えなくなって、chromeに乗り換えた人が多かったんだと思う。俺も一時期乗り換えてたけど、chromeのUIがどうしても気に入らなくてfirefoxに戻った。
chromeのUIが、ものすごく嫌いだから、firefox使い続けているんだけど、このまま行くと、chrome以外の選択肢がなくなりそうで怖い。
レンダリングエンジンも、chromeの独り勝ち状態にさせるのは、まずいと思うんだけど、どうすりゃいいんだろう?

cssの知識は、stylusで付けた。
cssの知識が薄いwebエンジニアって、結構いると思うんだけど、どうだろう?
使ってないと、すぐ陳腐化する気がする。
俺も完璧って訳じゃないけど、アクセスしたり調査するくらいの知識は付けた。
擬似クラス周りは、さっぱり分からない。