エンターテイメント!!

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

2021/08/30週 気づきと振り返り 在宅勤務がやりたいです。。。。

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

設計

構造化された文章書いてくれませんかね。。。

実装に落とす時、無駄にif文が増えるような記述は、マジで辞めてもらいたいんですけど。。。

Java

SpringBootでThymeleafによるxmlファイルの出力時の属性の定義方法

例えば、以下の出力をしたい場合

<outline text="test-title" type="rss" htmlUrl="test" xmlUrl="test"/>

th:textと書きたいところだが、実際には、出力時にエラーになる。

やる場合は、下記の用に属性出力の設定で対応する必要がある。

<outline th:attr="text=${outline.title},htmlUrl=${outline.htmlUrl},xmlUrl=${outline.xmlUrl}"
      type="rss"/>

あと、thymeleafの初期化は、xml用の設定でテンプレートエンジンを生成する必要がある。

    ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
    TemplateEngine engine = new TemplateEngine();
    resolver.setTemplateMode(TemplateMode.XML);
    resolver.setPrefix("templates/");
    engine.setTemplateResolver(resolver);

intellij でファイル削除

使用箇所を検索してから削除してくれるんだね。
最初、それが分からなくて、なんで削除されないんだ?って思ったけど、慣れると誤削除防止の観点からは、こっちの方がいいと感じた。

その他

在宅勤務の終了

8月まで在宅勤務の現場だったのだが、9月で現場出社の現場に変わった。。。

あらためて出社するようになったが、出社がかなりシンドイ。。。

在宅勤務中は、まったく動かなかったから、出社は、かなりの運動になっていたんだと改めて感じた。
そもそも京葉線が乗り換えクソだということもあるが。。。

痩せそうではあるが、在宅勤務継続が良かった。。。

あんかけ焼きそば

初めて作ったけど、かなり大量の野菜を消費できるのがいい。
餡さえうまく作れれば、うまいということは分かった。

【読書ノート】ロードマップの誤解をとく本

読むに至ったきっかけ

ロードマップをよく読むので、改めて存在意義を明確化したかったので読み始めた。

まとメモ

ロードマップ=未来を考えるための手段
目的ではない。
目標を明確にし、誰がどう使うのかを明確にすることが重要。

現在は、VUCAの時代

  • Volatility:変動
  • Uncertainty:不確定
  • Complexity:複雑
  • Ambiguity:曖昧

将来の予測は困難になっている。そのために、目標を明確にし、行動する指針としてのロードマップが重要に考えられている。

ロードマップ=羅針盤
意思はなく、うまく使えないと役に立たない。

スケジュール:戦術、目先の対応重視
ロードマップ:不確定要素への対応戦略

ロードマップを使うことによる効果

  • 目利き能力の強化
  • 他の領域についての比較議論へのたたき台
  • 部門間の時間軸・整合性の整理

→ゴールの共有化

技術ロードマップが全てではない。
市場、経営と事業の方向性がリンクされて役立つロードマップになる。
技術ロードマップで満足していては、将来を切り抜ける羅針盤にはなりえない。

感想

言っていることは分からなくもないが、刺さる人にはささるのか?
読んでたけど、抽象的なことが多くて途中でダレた。。

資料を使って自分の考えまとめるのは普通では?って思ったが、世の中はそうなってはいないのだろうか?
特に当たり障りのない一般論を書いているだけのように感じた。

2021/08/16週 気づきと振り返り また、くだらぬことで躓いてしまった

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

c#

delegate

Javaのlambda式を覚えたあとだと、記述方法にものすごい違和感があるのだが、これが普通なのだろうか?

SendGrid

c#でSendGrid利用しているので、そのときにハマったことを書いてく

送信リクエストのレスポンスに403:Forbiddenが返ってくる

掲題の通り、送信リクエストを送ったら、レスポンスに403:Forbiddenが返ってきていた。

理由は、fromに登録ユーザ以外のメールアドレスを設定していたから、メール送信の権限なしと判断したというメッセージがレスポンスのボディ部に設定されて返って来ていた。

最初、ボディ部を見てなかったので、リクエスJSONの中身とか、APIキーの問題かと思って四苦八苦していた。
定時後だったので、ほとんど人がいないし、かなり焦っていたが、問題先送り戦術で、諦めて帰った。
翌朝、そういえば、ボディ部にエラー原因の内容のメッセージが出てくることを思い出して、ボディ部を見たら、"fromに登録ユーザ以外の~"という英語のメッセージが出ていたので、データを直してテストしたら、問題なくメールが送られた。。。

帰宅してから、どうやって解決しようか寝るまで悩んでたから、肩の荷が降りた。。。
解決したときは、午前中だったけど、もう帰ってもいいだろうくらいの仕事はしたと思うんだよね。
一日間を置くことで、冷静に考えられたor余計なことを忘れたのが良かったのかもしれない。
よく1日間を開けると、結構解決することがある。明日の俺を信じる気持ちが必要なのかも知れない。
ただし、土日明けだと、必要なことも忘れるので、問題の先送りで週マタギするのは危険だと思いました。

最初、SendGridの公式ドキュメント見た時、403:Forbiddenが帰ってきたときの原因欄が空欄で絶望しかけたけど、ちゃんとボディ部見れば解決できたので、ちゃんとしたサービスだと思いました。

業務以外の問題・気づき

Java

ThymeleafでJavaに埋め込み

バインドする方法は、調べてすぐ分かって、Listにも同じように適用したら沼にハマった。。。
なんか、ハッシュコードっぽいのが埋め込まれてるな~と気づいてからは、解決が早かった。
どうやら、オブジェクトは、getter/setterが必須らしい。。。
getterを付けたら表示された。
Javaのgetter/setterが必要になるのは、結構不便だと思うのだが、いるのかな?
入れ物のクラスとしてしか使わないので、特定のインタフェース実装したらgetter/setter不要になるとかして欲しい。
コード量が増えるだけで、可読性向上を阻害してると思うんだよね。。。
視力が低いから、なるべくコードは単純明快にして、目に優しい実装にしたい。

参考:ThymeleafでJavaScriptのちょっとした注意点をメモ - Mitsuyuki.Shiiba 参考:Spring Boot で Thymeleaf 使い方メモ - Qiita

フォントサイズ重要

MirageSQLでSQL実行してエンティティクラスにバインドさせた内容をHTMLのJavaScriptに埋め込んで色々処理しているのだが、特定のカラムの値が渡って来ないことに気づいた。
バインディング内容は間違っていないし、setterはなくてもバインドして値が入っているから、問題ないはずと思いながらSQLとエンティティクラスの内容を比較しながらにらめっこしてた。

そして、本当に抽出できているのか疑問になって、getter付けてみたり、SQL実行してカラムの内容を確認していたけど、問題ないよな~って思いながら台パン直前くらいまでストレス溜まったときに点から神託が下ってきた。「Mapで中身見ればいいんじゃね?」と。

エンティティクラスをMapに変えて中身を確認したら、全然違うSQLの実行結果が返ってきていることに気づき、実行しているSQLをよくよく見たら、指定しているファイルが違っていた。。。

実行するSQLを正しいものに直して実行したら、難なく表示されてしまった。。。
台パン直前までストレス溜めたのがアホらしかった。。。

解消したら、速攻でフォントサイズを変更した。
IntelliJで開発しているのだが、エディターとエディター以外でフォントサイズの指定箇所が違っているらしい。
とりあえず、異なっていると目の負担がデカそうだったので合わせて大きくしておいた。

参考:IntelliJのフォントをツールウィンドウも含めて見えやすいサイズまで拡大してみた - Qiita

開発環境作るときは、作業する前にフォントサイズを見やすい大きさに変えておくことは重要だと感じた。

テスト

ウォーターフォールで開発しているのだが、結合レベルのことを単体でやれって言われて、実施したけど、進捗があがらなかったら俺のせいにされるの、おかしくない?

実際やっていて、結合テストで出すべきバグが単体で出てきて、それを解決するために工数咲いてたら、単体が工数かかるの当たり前じゃんって思うのだが。。。

雑記

台パン

これ、在宅勤務のときしかできないなと感じた。
職場でやったら、明らかに空気悪くする。
前に、職場で台パンしてるやつ見たことあるけど、むちゃくちゃ空気悪かったわ。。。
とりあえず、そいつが離席したときに周囲の人と茶化して空気をきれいにしておいたけど、ああいう人間にはなりたくないとは思う。
たしかに、台パンするとストレスがある程度解消するけど、周囲の人達を不快にしてもいい理由にはならないと思うんだよね。

言っとくが、俺はネタとして台パンって書いてあるだけで、周りの空気は敏感に読んで、動作は自重してるからね?

料理

エビチリ

初めて作った。
エビは、すでにワタが取られているやつが格安だったので、それを使った。
市販されているものより辛めにできた。
レシビに砂糖を入れるとあったが、無視して入れなかったので、それが原因かも知れない。
辛いのは嫌いじゃないので、別に問題ではなかった。
米を少量しか炊いてなかったので、米不足感が否めなかった。。。

意外とかんたんにできるんだな~と思ったが、エビのワタを取る作業が一番大変なのかもしれない。

nodist npm mathで入れた後にnpm -v でCannot find module

背景

掲題の通り。
npmいじってたら、セキュリティ警告が出ていることに気づいて、nodistでLTSのnodist入れたら上記の状態になった。

環境

windows10

原因

よく分からん。。。。
たぶん、npm matchでのインストールが失敗しているのだと思う。

ちなみに、npm -v したときの出力内容↓

$ npm -v
node:internal/modules/cjs/loader:936
  throw err;
  ^

Error: Cannot find module 'C:\Program Files (x86)\Nodist\npmv\7.20.3\bin\npm-cli.js'
    at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15)        
    at Function.Module._load (node:internal/modules/cjs/loader:778:27)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:79:12)
    at node:internal/main/run_main_module:17:47 {
  code: 'MODULE_NOT_FOUND',
  requireStack: []
}

対応内容

とりあえず、インストール失敗してそうだったので、C:\Program Files (x86)\Nodist\npmv配下にある7.20.3ディレクトリを削除。

その後、nodist npm matchを実行してnpmをインストールする。

そして、npm -vする。
すると、表示できた。

$ npm -v
7.20.3

感想

nodistは、開発が止まっているから、「何かのバグを見つけたのか?もしかして、なんかやっちゃいました?」的なことを考えたが、単にインストールが失敗しているだけだった。
操作タイミングによってはインストールが失敗するのかも知れない。
そういえば、nodistを更新した後、node追加する前にnodist npm matchやったから、それがまずかったかも知れない。。。

nodistの開発が止まっているのは、もう機能追加は終わっているからだろうか?

2021/08/09週 気づきと振り返り DIちょっと分かる

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

C#

linq

使いどきがないのだが、俺がおかしいのか?
Javaラムダ式みたいに、forEachが使いたいときがあるのだが、イマイチ使い方が分からん。

メソッドの命名規則

C#の命名規則で、メソッド名が大文字始まりなのが、ものすごく違和感あるのだが、どうにかならんものだろうか?
Java/JavaScript/Swift/Typescriptやってきたけど、全部小文字始まりだから、大文字始まりで書くことに違和感しか無い。
なれの問題だろうか?

Java

オブジェクト初期化子

C#のオブジェクト初期化子は便利だな~と思っていて、Javaには無いのか調べたら、あった。 無いと思っていたが、文法的に可能だと知ったときは、結構衝撃的だった。

JavaでもC#みたいなオブジェクト初期化子書けるんですよ - C Sharpens you up

Mirage-SQLをAutowride

結構、苦労した。。。
内容は、下記の過去記事参照

suzaku-tec.hatenadiary.jp

雑記

NT$

NT$って台湾ドルなんだと最近知った。
New Taipeiの略だろうか?
最初見た時、ナラティブドル??って思った。
ガンダムの話をいきなり持ち込んできて、何いってんだコイツ?って思ったけど、ガンダム全然関係なかったな。。。

網目状

アニメ上って聞こえて、話が噛み合わなかった。。。。
そんな設定のアニメにあったか?って思ったけど、網目状って言っているらしかった。。

OJCP 11 Gold

受けようと思っているのだが、勉強が進まない。。。

やる気が出ないんだよね。。。
ついついSwitchの電源ボタン押してしまう。
やる気スイッチを押してくれって思うけど、抗えないんだよね。。。

情報処理技術者試験

申し込みを忘れてしまった。。。。
もう期限切れ。。。

免除を1回分、損してしまった。。。

山の日

8/11かと思い、あやうく月曜に出社するところだった。。。
カレンダーの購入タイミングによって、表示が違うトラップが厄介すぎる。

カレンダー業界は、年1の購入イベントが年2になって、儲かってそうだな。

SpringでMirageSQLをAutowiredでDIして使う

背景

久しぶりにJavaで何か作りたくなって、とりあえずDBアクセス絡みの機能を実装した。
その際、今風にDIしたいと思って色々調べてたりしてたら、かなり手間取ったのでまとめる。

環境

IntelliJ IDEA 2021.2 (Community Edition)
ビルド #IC-212.4746.92、ビルド日 July 27, 2021
ランタイムバージョン: 11.0.11+9-b1504.13 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Windows 10 10.0
GC: ParNew, ConcurrentMarkSweep
Memory: 2002M
Cores: 4
Registry: debugger.watches.in.variables=false
Non-Bundled Plugins: color.scheme.GitHub 3 (1.2.1), com.intellij.ja (212.231), com.karateca.jstoolbox (1.10), com.nerdscorner.android.plugin.github (2.1.1), net.seesharpsoft.intellij.plugins.csv (2.17.1), com.codestream.jetbrains-codestream (11.0.12+180), mobi.hsz.idea.gitignore (4.2.0), SpringBootGen (1.0), String Manipulation (8.15.203.000.3), org.sonarlint.idea (5.2.0.35150), ru.adelf.idea.dotenv (2021.3.0.212), com.intellij.lang.jsgraphql (3.0.0)
Kotlin: 212-1.5.10-release-IJ4746.92

悩んだところ

miragesql-integration

DIの概念はある程度知っていて、どうすればいいかもだいたい把握しているのだが、Mirage-SQLをDIするのに必要なライブラリが何なのか分からずに色々試行錯誤して1周間が過ぎた。。。

早く公式サイトのドキュメントを見るべきだった。
見たら、思いっきりmiragesql-integration が必要だと書いてあった。。。
com.miragesql:miragesql だけでDIできないかと四苦八苦していた自分がアホらしかった。。。

とりあえず、以下の設定を入れ込んだ。

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    implementation 'com.miragesql:miragesql:2.1.0'
    implementation 'org.xerial:sqlite-jdbc:3.36.0.1'

    // https://mvnrepository.com/artifact/be.ceau/opml-parser
    implementation 'be.ceau:opml-parser:2.2.0'

    // https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2
    implementation 'org.apache.commons:commons-dbcp2:2.9.0'

    // https://mvnrepository.com/artifact/org.springframework/spring-jdbc
    implementation 'org.springframework:spring-jdbc:5.3.9'

    implementation 'com.miragesql:miragesql-integration:2.1.0'

}

AppConfig

そういえば、設定をJavaのソースで書けると何かで覚えたので、やってみることに。
ここが、結構悩んだ。

DIでやっていることは理解していたので、@Bean付けてインスタンス返すだけだろ?余裕余裕って思ってたけど、設定が必要なプロパティを見逃したり、全然別のクラスを使ってたりと、公式ドキュメントに書かれてること以外のことをやろうとして、実行時エラーでドツボにハマっていた。。。
別日に設定を見直すところからやったら、すんなり解けて、台パンした。。。

面倒臭いので、設定ファイル晒す。
公式サイト、import文の記載がないので、たまたま同じクラス名のやつがあると、間違えたときに原因が分からなくて、結構詰まってた。

package com.example.GaleWings;

import com.miragesql.miragesql.SqlManagerImpl;
import com.miragesql.miragesql.dialect.SQLiteDialect;
import com.miragesql.miragesql.integration.spring.SpringConnectionProvider;
import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
public class AppConfig {

    @Bean(destroyMethod = "close")
    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("org.sqlite.JDBC");
        dataSource.setUrl("jdbc:sqlite:library.db");
        dataSource.setUsername("");
        dataSource.setPassword("");
        return dataSource;
    }

    @Bean
    public DataSourceTransactionManager transactionManager() {
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource());
        return dataSourceTransactionManager;
    }

    @Bean
    public SpringConnectionProvider connectionProvider() {
        SpringConnectionProvider springConnectionProvider = new SpringConnectionProvider();
        springConnectionProvider.setTransactionManager(transactionManager());
        return springConnectionProvider;
    }

    @Bean
    public SQLiteDialect dialect() {
        SQLiteDialect dialect = new SQLiteDialect();
        return dialect;
    }

    @Bean
    public SqlManagerImpl sqlManager() {
        SqlManagerImpl sqlManager = new SqlManagerImpl();
        sqlManager.setConnectionProvider(connectionProvider());
        sqlManager.setDialect(dialect());
        return sqlManager;
    }
}

完成後の感想

なんとか動くようになって、ホッとした。。。
最近は、Javaやることが滅多になかったからな。
もしくは、あったけど、1世代古い開発環境だったりで、チャレンジングなことができなかったからな。

久しぶりにDIとかやってみて、かなり手こずってしまった。

作成したもの

GitHub - suzaku-tec/GaleWing

参考

Integration · mirage-sql/mirage Wiki · GitHub

雑記

最近の俺、台パンしすぎじゃね?

electron-forgeで画面起動後のコンソールに`Unable to load preload script`

背景

bootstrap5に移行をしていたが、どうもwebpack絡みで問題があって、解決できなかった。
electron-fogeでビルドプロセスが楽になるという噂を小耳にし、bootstrap5乗せたやつが動いたので、まずは、既知のelectronプロジェクトをelectron-fogeに移行しようと思い立ち、移行に向けて動いた。
途中までは順調に進んで、なんとかビルドが成功する状態に持ってこれて、いざ動かしたら、Unable to load preload scriptが出てきて、使い物にならない画面が表示された。。。

なんとか解決できたので、それを記録として残しておく。

現象

背景で書いたとおり、npm startelectron-foge start を実行したら、画面表示後、コンソールログにUnable to load preload scriptが表示された。。。

原因

作ったtsファイルが読み込めていない。
おっかしーな、ちゃんとts-loader噛ましているし、対象もtsファイルになっているのになーと思っていろいろ試行錯誤していた。

試行錯誤した結果、下記の対応でpreloadのエラーが解消した。

module.exports = {
・・・
  resolve: {
    modules: [`${__dirname}/src`, 'node_modules'],
    extensions: [".ts", ".js"],
  }
};

たぶん、tsファイルがちゃんと対象になって居なかったんだろうと予想。
webpackの知識がなさすぎて、何が悪いのか、全然分からないんだよね。
webpackの公式ドキュメント見ても、全然解決できる気がしないのが、webpack職人を量産しているんだろうなと思う。
最近、webpackが辛たん。。。
ちゃんとドキュメント読んだほうがいいのかもしれない。

ただ、まだcssとかの参照エラーが出てて、気が滅入ってるんだよね。。。

参考サイト

execFile error · Issue #1043 · electron-react-boilerplate/electron-react-boilerplate · GitHub

Unable to load preload script in packaged app · Issue #1425 · electron-react-boilerplate/electron-react-boilerplate · GitHub

雑記

とりあえず、難問が1つ解決したのだが、まだまだエラーがいっぱいある。。。
台パンする日々が続きそう。。。

ドキュメントって、なんで読みたいと思わないんだろうな。
官僚仕事っぽいのが苦手なんだろうと思う。
苦手とはいいつつ、仕事だとドキュメントはちゃんと読むんだけどね。
外部APIとの連携とかは神経質なくらいIOの確認とエラー時の動作やレスポンスは確認してる。
コードレビューも設計書との 乖離や、障害内容の把握とかで、嫌でも結構な文章読んでいると思っているのだが、官僚が見る1日の文章量と比べると少ないのだろうか?
やれば出来る子なんだと思いたい。じゃないと、どうにかなりそう。

最近、自社の内部監査をしたが、自社のドキュメントとISMS/QMSを全部理解してないと、内部監査は無理だろと感じた。
いま、自社でやってる内部監査は、なんちゃって内部監査で、内部監査になってないと思うんだよね。。。 自分の担当範囲のドキュメントを理解して、現状と比べるのだけで精一杯でしたわ。
他の人が、そうやっているかは知らん。