かわばんが

エンジニアの雑記

ウェブアプリケーションエンジニア java/spring/awsとか

文字列置換。複数の対象をそれぞれの文字で置き換える。

テキスト内のURLをURLnで置き換えたかった。 テキストにURLはいくつあるか不明で0の場合もあり。そして置換する文字列のnは1から始まる自然数でインクリメントする。

https://~ → URL1
https://~ → URL2

という感じ。

        // テキストから正規表現使ってURLを抽出した(省略)
        List<String> urlList = XXX;


        int i = 1;
        for (String url : urlList) {
            text = text.replce(url, String.format("URL%d", i);
            i ++;
        }

        return text;

初めtext.replce(url, String.format("URL%d", i)を自身に代入してなくて(text =がなかった)、文字列変わらなくて悩んだ。バカみたいだ。

今回は使わなかったけれど、置き換えたい文字列が複数あるような場合はStringUtils.replaceEachなるものもあるみたい。 初めて知った。 これ真似しようかなと思ったけど、ぱっと見複雑で何してるか分かりずらいとやだったのでやめました。でも便利そう。

qiita.com

あと正規表現は一生苦手。

javaでCSVの読み込み

csv読み込んでヘッダーとデータの数比較した。 今回は配列に詰めたけど、model作ってそこに突っ込んだりできたりもするみたい。便利。

利用したライブラリ:opencsv

grade.build

dependencies {
    implementation('com.opencsv:opencsv:5.3')
}

公式はではcompile 'com.opencsv:opencsv:5.3’て書いてあったけどcompileは非推奨っぽかったのでimplementationを使った。

CSVReader reader = new CSVReader(new InputStreamReader(new FileInputStream(file), “”SJIS));

String[] header = reader.readNext();
String[] array;

for (int i = 0; i <= limit; i++) {
    array = reader.readNext();

    if (array == null) break;

    if (array.length != header.length()) {
        エラー処理
        break;
    }
}

csvはデータにカンマとか改行がある時の考慮しないといけないから面倒くさい。。

参考

qiita.com

opencsv.sourceforge.net

「JSUG勉強会 2020その2 Spring Boot 1.xから2.xへの移行」に参加しました

2020-02-12(水)に行われた勉強会に参加しました。
Pivotalジャパン株式会社様のオフィスで行われました。

jsug.doorkeeper.jp

運営、登壇者の方々ありがとうございました。 とても勉強になりました

決済サービスのSpring Bootのバージョンを2系に上げた話 内立 良介さん (コイニー株式会社)

www.slideshare.net

本イベントでは上記のスライドをもとにお話しされていましたが 内立さん自身もブログでわかりやすくまとめてくださっていたので、引用させていただきます。

note.com

Spring Boot 1.5→2.1バージョンアップを経験して分かったハマりどころ 川口 竜太郎さん(ヤフー株式会社)

speakerdeck.com

Metrics with Micrometer in Spring Boot 2 Tommy Ludwig さん(Pivotal Japan)

スライド見当たりませんでしたので、公開していないかもしれません。

感想

登壇者のそれぞれの実体験ベースの話で注意点やはまったところなどを共有する内容でした。
最後のTommy Ludwigさんのお話はバージョンアップとは別のお話でした。

紹介されていた具体例に関してはアプリケーションごとの構成で異なってくる部分があるので
今すぐというより実際に手を動かしたときのために頭の片隅に置いておくという感じでした。
実際にバージョンアップを行う機会があったときにスライドを見返させていただこうと思います。

一番の収穫は、バージョンアップ作業の大きな流れを把握できたことです。
これまでの知識でこうなんだろうなという想像はしてましたが、実際に実施したことはありません。
経験の浅い自分にとっては実際に実施した方の話を聞いて確認できたことで、自分が手を動かすときにスムーズに作業に入っていく助けになったように感じます。
自分の想像や想定の域だった部分の答え合わせができました。

現状の自分が携わるプロジェクトにおける流れを書いておこうと思います。
ちなみにjava8、Spring4系(Bootではない) 、maven を使ってる。

1.pomで依存しているバージョンを上げる
2.コンパイルエラーとか影響範囲を見て見積もる
3.コンパイルエラーを修正
4.動作確認

コンパイルエラーのところに関してはどの辺で出てくるか今は想像もつきません。
動作確認はテストのやり方が課題になりそうだなと感じます。

質疑応答の時間があったのですが、顧客から見たとき価値のないようなものを組織に理解してもらうことに難しさを感じているエンジニアが結構いました。 その点に関して、うちではサービスの継続ができなくなるような状況で実施することになるのかなというふうに思います。 この辺りはセキュリティをどこまでやるかみたいなところと通ずる部分がある気がするので難しいです。

バージョンアップを実施する機会はそう大きないので知識の引き出しを増やす良い機会でした。

「JSUG勉強会 2020その1 Spring x Kotlin」に参加しました

JSUG勉強会 2020その1 Spring x Kotlin」に参加しました。
会場に行く途中、Lodgeというコーワーキングスペースを通ったのですがとっても綺麗でした。
羨ましい。

lodge.yahoo.co.jp

普段Java×Springで開発していますが、今後kotlinを導入できたらと思い参加しました。
備忘録としてメモに残しておきます。

KotlinでSpring 完全理解ガイド 長澤 太郎さん (Ubie株式会社)

speakerdeck.com

Spring Initializerを使えばSpringで簡単に開発できる。

ビルドツールをgradleにするとスクリプトがkotlinで記述される。

アノテーションでbean登録やハンドラ定義ができる

問題1:Kotlinではデフォルトで継承を許可しない。
open修飾子をつけて許可する。(面倒、ダサい)
→allopenプラグインが公式である(kotlin-springプラグイン)
Spring Initializerで作れば最初から入ってるので意識しなくてOK。

問題2:バリデーションに注意
アノテーションがフィールドにかからない。
→@field: をつける
nullを代入できるかどうか定義できる。
→Intの後ろに?をつける。
kotlinにはプリミティブという概念がない。

kotlin用DSLを使って比較的あたらいいbean登録やハンドラ定義ができる

RouterDSLを使ってハンドラを簡単にかけるので便利。
ktlint Linter兼Fomatter おすすめ

WebFluxでkotlinのこルーチンという機能が便利

kotlinにはコルーチンがある。

kotlinでもJUnitを使ったテスト

JUnit5を普通に使える。
アサーションライブラリは何がいい?
→AssertJを使ってる。assertkが気になる。

kotlinでモックするならMockKがいい感じ

基本的なことは一通りできる。

番外:よくある質問

「DBアクセスはどうしてる?」
Ubie株式会社さんではJDBCテンプレート。生のSQL書いてマッピングしてる。

感想

Javaをやってきた人ならkotlin抵抗なく入っていけそうです。
環境は整ってきているのでらしいので、Better Javaとして取り組む価値はありそうだと感じました。

Spring 5.2におけるKotlinサポート 木原 快さん (ヤフー株式会社)

www.slideshare.net

Spring × Kotlin

Spring5で初めてkotlinをサポート
サーバーサイドkotlinが使われるきっかけになった。

どうやって始めるか

Spring Initializerを使う

Java <->Kotlin

コードスニペットにKotlinが追加された

WebMvc.fn

RouterFunctionとは
従来のアノテーションベースとは異なる新たなルーティング方法

Spring5.3から追加された @Configurationアノテーションを使って`Bean定義をしていく

MockMvcDSL

指定するパラメータが増えてきた時、すっきりするのでおすすめ

@ConfigurationProperties

Boot2.1
MutableでのBinding

Boot2.2.0
@ConstructorBindingでImmutable Binding
@ConstructorBindingのみでスキャン対象

Boot2.2.1
@ConstructorBindingでImmutable Binding
@ConfigurationPropertiesScan or @EnableAutoConfigurationが必要

Coroutines

Coroutinesとは処理の中断再開が容易な計算インスタンス。軽量スレットみたいなもの。 WebFluxでいくつかサポートが入った。 →kotlinらしく、より簡単に並列に処理できる

質疑応答

Javaプロジェクトにkotlinを導入する際の注意点は?
nullの部分とか仕様が異なるところがあるので、注意が必要。
考慮しないといけないことが増えるので、あまり混在させないほうがいいかもしれない。

・DBコネクション数についてなんか聞いてました。
聞きそびれました。。
コネクションプールが枯渇するような状況はまだない。って言ってた

・コルーチンの制約はありますか?
ブロッキングはなるべく呼び出さない方がいい。
スレッドに依存するライブラリを使うときとかは苦労する。 ログとか。

感想

自分のレベルでは少し難しかったので、メモにあまり自信がありません。。
実際に触って勉強してみます。

Xサーバーの「WordPress簡単移行」機能で移行ができなかった

AWS上で構築されたWordpressの環境をエックスサーバーに移行するためXサーバーの「WordPress簡単移行」機能とやらを使ってみた。

結論から言うとうまくいかなかった。
ググったけどあまり情報が出てこなかったのでメモしておく。

何が起きたか

エラーが出て移行が完了しない。

なぜか

原因はいくつかあった。

1
ドメイン/wp-adminの遷移先がwordpressアカウントでログインという画面に遷移するため。
ユーザー名またはメールアドレスでログインする画面に行かないとダメらしい。

この画面に行ってしまうとダメ。 f:id:marumori514:20191031120057p:plain

エラーメッセージ

移行元WordPressへの移行用プラグインのインストールまたは有効化に失敗している可能性があります。 原因として考えられる以下の項目についてご確認ください。 移行元URLにはダッシュボードの一般設定で確認できる「WordPress アドレス (URL)」を指定してください。 httpとhttpsの間違いに注意してください。 利用しているWordPressユーザーが管理者ではない場合、管理者権限を持つユーザーを利用してください。 移行元WordPressのwp-config.phpファイル内にdefine('DISALLOW_FILE_MODS',true);の記載がある場合、削除した上で再度お試しください。

2
プラグインのインストールに接続情報の入力が必要であったため。

エラーメッセージ

移行元WordPressダッシュボードへのログインに失敗している可能性があります。 ユーザー名とパスワードに誤りがないことをご確認ください。 また、Basic認証やロボット認証が有効な場合は解除してください。

3
移行元のディスク容量に十分な空き容量がない。(これはもう諦めた。経緯は後述)

エラーメッセージ

移行元WordPressでの移行用データファイルの作成に失敗しました。 移行元のディスク容量に空きがない場合、十分な空き容量を確保してから再度お試しください。 また、移行元の環境によっては作成できるファイルサイズが制限されている場合があります。 移行元WordPressのwp-contentディレクトリ内の合計容量が一定(目安としては2GB以下程度)になるようにしてください。

対策

1
Jetpackの設定を変更して/wp-adminの遷移先を「ユーザー名またはメールアドレス」でログインできる画面に変更した。

この画面に行けばOK。
f:id:marumori514:20191031115756p:plain

そもそも/wp-adminの遷移先がwpアカウントでログインの画面になぜ言ってるのかわからなかったので調べた。
情報少なかったけどJetPackがやてるらしい。
参考にしたURL:https://blog.dreamhive.co.jp/mkoba/?p=5994

2016年の記事だったので自分の対応も詳しく残しておこうと思う。 「JetPack」→「設定」→「セキュリティ」タブで下の方にある

ユーザーが WordPress.com アカウントを使ってこのサイトにログインすることを許可

のチェックを外す。これで/wp-adminの遷移先が「ユーザー名またはメールアドレス」でログインできる画面になる。

f:id:marumori514:20191031115532p:plain

2
wp-config.php内に、define('FS_METHOD','direct');を追記した。
こうすると接続情報の入力が不要になる。

3
対応するのをやめた。 ファイル圧縮するのも大変だし、削除もできなかったので諦めて自分で移行することにした。

まとめ

簡単移行

意外と難しい。

マージをrevertしたら差分が出なくなった

リリースするためmasterに開発した資材を取り込んだ。しかし過去にRevertした時の修正だけが取り込まれない。

developは確かに最新なのに、なんでやねん。

ってなったのでメモ。文章にしづらい。わかりづらい。

問題が起きるまでの手順

featureで開発したものをリモートにpush //1

developにマージするためプルリクエストを作成したが、誤ってマージ先をmasterに指定。 //2

気が付かずmasterにマージしてfeatureを削除。 //3

マージした時点で間違いに気が付きgithubの画面上でRevertボタンを押す。 //4

ローカルにてfeatureをdevelopにマージしリモートのdevelopにpush。 //5

リリース時にdevelopをmasterにマージ //6

起こった問題

//6を行うことで、//5で取り込んだ修正をmasterに取り込み本番環境へリリースするつもりだった。

しかしmasterには//4の修正は取り込まれなかった。

どうやって解消したか

ローカルのmasterで直接、revertを行った時の資材を修正しpushした。

その後、masterをdevelopにもマージ。

対応は適切だったのか

今回は修正対象のファイルが少なかったため、masterを直接修正することも可能だったが修正するファイルが増えれば増えるだけバグが入る可能性が高まる。 したがって適切ではなかったと思われる。

ではどうすべきだったのか。

結論としては//2をrevertである。 するとリモートのmasterに、revertする前の修正が反映されるので(間違えてマージした状態)ローカルでpullして最新の状態にしておけば問題なかったのではないかと思われる。

revertに対してRevertを行うということはなんとなくわかっていたのだが、どのコミットハッシュ値に対してrevertすればいいのかという部分がよくわからなかった。のでびびった。

ちなみに検証用のリポジトリーでやってみたのだが、githubの画面上でrevertボタンを押すとrevertのプルリクみたいなのが作成されるので、それをマージするという流れになる。 revertのマージプルリクエストのコミットがあるので、そのcommitをrevertすればよかったと思われる。

今回の学び

Revert後、再度マージしたい場合はRevertをRevertしないと差分が出ない。

参照にしたサイト。ありがとうございます。

https://chooringo.hatenablog.com/entry/2017/03/26/225718 https://blog.risouf.net/entry/23

ec2インスタンスタイプを変更したら、起動できなくなった

経緯

料金の、見直しをしていたところ、t2よりt3の方が料金が安い上に性能がいいということがわかった。
そこでインスタンスタイプを変更して、起動させた。
しかしインスタンスタイプを変更後、起動するとエラーメッセージが出現して起動できなかった。

エラーメッセージ

Enhanced networking with the Elastic Network Adapter (ENA) is required for the 't3. medium' instance type. Ensure that your instance 'XXXX' is enabled for ENA.

(XXXXはインスタンスID)

原因

インスタンスに拡張ネットワーキングの enaSupport 属性が設定されていなかったことが原因らしい。 以下のコマンドを叩くと、空っぽが返ってきた。

aws ec2 describe-instances --instance-ids instance_id --query "Reservations[].Instances[].EnaSupport"
[]

ちなみに設定されている場合は

[
    true
]

と返ってくる。

対策

こちらを参照した。 docs.aws.amazon.com

対象インスタンスUbuntuだったので以下の部分を参考にした。 ・Ubuntu での拡張ネットワーキングの有効化 対象のインスタンスを停止させて、ローカルPCから以下のコマンド実行。(--無い方にはinstance-id入れる)

aws ec2 modify-instance-attribute --instance-id instance-id --ena-support

一応確認のためコマンドを叩くと、ちゃんとtrueが返ってきた。

aws ec2 describe-instances --instance-ids instance_id --query "Reservations[].Instances[].EnaSupport"
[
    true
]

コンソールからインスタンスタイプを変更して起動したら、無事に起動できました。