ChatGPTにコードレビューの言葉を考えてもらう

※ コードレビューをしてもらうではありません。

コードレビューの言葉って気を遣いますよね。
相手は人間なので 失礼なことを言ってしまってないか心配です。
そこで今回は、 Chat GPT にコードレビューの言葉を考えてもらいましょう。
しかも、レビュイーの好きなキャラを使えば、そのキャラからレビューしてもらっているので何を言われても幸せな気持ちになるはずです。
こんな win-win な 活用方法はありません。

変換してもらう言葉は以下の4つになります。

  1. このメソッドの名前が内容と合ってないです。
  2. この条件分岐は必要ないと思います。
  3. ここで空チェックを行った方が良いと思います。
  4. このメソッドの役割が多すぎるので分割した方が良いと思います。

※ GPT-4 を利用しています。

カミーユ・ビダン の場合

  1. このメソッドの名前、完全に内容とズレてるだろ!名前を変えないと誤解を生むぞ!
  2. この条件分岐、一体何のために存在してるんだ?邪魔だから削除しろ!
  3. ここ、まさか空チェックをスルーするつもりじゃないだろうな? 不具合を招きたいのか?今すぐ修正しろ!
  4. このメソッドの役割、多過ぎるだろ。まるでジャンクだ。分割しないと後で後悔するぞ!

過激ですね…レビュイーが精神崩壊しそうです…
何回か試してたのですが、たまにベジータみたいになってましたね

シャア・アズナブル の場合

  1. このメソッドの名前、まるで戦場で迷子になったかのようだ。内容と一致させるべきだ!名前が全てを語るのだから。
  2. この条件分岐、本当に必要と思っているのか? これは無駄だ、削除すべきだ。質を追求しろ!
  3. ここでの空チェック、まさか忘れていないだろうな?過信は命取りだ。すぐに対応せよ!
  4. このメソッド、役割が多すぎる。分割することで各々が本来の力を発揮できる。手を打つべきだ!

所々、ぽい名言生み出しています。
「まるで戦場で迷子になったかのようだ」、「分割することで各々が本来の力を発揮できる」とかはかっこいいですね。

ハマーン・カーン の場合

  1. このメソッドの名前、内容と全く合致していない。恥を知れ。名前と内容が一致しないなど、どうしようもない俗物ね。直ちに名前を見直すべきだ。
  2. この条件分岐、必要ないだろうが。恥を知れ、俗物。不必要なものに固執するなど、余計な混乱を生むだけよ。
  3. ここで空チェックを怠るとは、あまりにも無責任だ。恥を知れ、俗物。これ以上問題を生む前に、速やかに対応しなさい 。
  4. このメソッドの役割、明らかに多すぎるわ。無秩序な行為を放置するな、恥を知れ。分割することで整理し、機能を明確にするべきよ。

情緒不安定さを隠せません。
それぞれ最後の言葉がないほうがハマーン様っぽいですね…
どうしようもない俗物って…w

シン・アスカ の場合

  1. 全然内容と合ってない、このメソッドの名前!名前を変えてやる!俺が、ここで!
  2. 絶対に必要ない、この条件分岐!削除してやる!それが俺の意志だ、今日、ここで!
  3. 空チェックを怠ってる、この部分!すぐにでも対処するんだ!今日、ここで!
  4. 役割が多すぎる、このメソッド!分割してやる!今日、ここで!

めちゃくちゃ怒ってますが全部やってくれるのが、シンっぽいですね。
任務とか大体文句言いながらもやってますからね。
レビュワーにとってはマイナスでしかないですが、レビュイーにとっては神様かもしれません。

※ 「もっと強気でお願いします。」「「恥を知れ、俗物。」のような雰囲気でお願いします。など何回かリクエストを出した結果です。

まとめ

使うにしてもキャラは選びましょう。

Chat GPT とモデルについて考えてみる

Chat GPT 使ってますか?

それはもう本当に色んな使い方が出来るので、逆にどう使っていいのかわからない部分もありますね。
Chat GPT をどう使っているかといった勉強会が増えてきそうです。

自分は仕事では以下のようなことで使ってます。

  • 英語
  • 変数名、メソッド名が不自然じゃないか
  • コードレビュー(もっといい書き方がないか)

などです。

モデル について聞いてみたかったのですが、 結構勉強になったのでここでは簡易的なサンプルに置き換えてやってみました

会話形式でやってみます。

Q. オンライン書店のドメインモデルの一例を教えてください。

(あ、今は書店だけど、今後は本以外も売っていく可能性は大いにあるな…)
Q. 後に書籍以外も売る可能性があるのですが、BookはItemにしたほうがいいですか?

(Itemは広すぎるかな…?)
Q. Itemを消して、 Book Music Movie などに分けるのは好ましくないですか?

(う~ん…どんな固有の特性や振る舞いがあるか今のところ想像がつかないんだよね…、 とはいえ商品の種類が多くなることを考えると…)

Q. Item をインターフェースにして後のBookなどは具体的な実装でなんとかしようと思いますが、どうですか?

~終~

本来は、もっと説明が必要になることを聞いていたのですが、自分の言葉が足りな過ぎて、ちょっとずれた回答が来ることがありましたね。
逆に Chat GPT に誤解されずに回答がさくさく来るような人は、人に説明するのも上手いんだろうなと思いました。
コンテキスト(使いたかった)も説明しないといけないので、ドメインを洗練させるために言葉にしてChat GPT に確認してもらうのも面白そうです。

補足情報を結構くれるので、この部分分からなかったから聞いてみようとなるのもすごいですね。

的外れな回答(特に3.5)をする場合もあるので情報が最終的には自分で回答の確認をした方が良いですがそれでも凄いです。
課金が必要にはなりますが、仕事や大事な場面で利用する場合はGPT-4 の方がいいかなと思います。

S3のオブジェクトをAWS CLIを利用して一括でダウンロードする

表題の通りです。

【 AWS 公式 ドキュメント】 オブジェクトのダウンロード

S3コンソールの使用のところの注記に「一度にダウンロードできるオブジェクトは 1 つだけです。」とあります(2023/02/17時点)。

ディレクトリをダウンロードしようとチェックを入れても、ダウンロードの部分が有効になりません。

コンソールでやろうとするのは諦め、aws-cliを利用して行いました。

aws-cliのバージョンは、2.2.38です。

上の画像にある「testdir」をダウンロードしたいと思います。
コンソールでダウンロードしたいオブジェクトをクリックして、「S3 URIをコピー」しておきます。

注意点ですが、 公式ドキュメントにあるように

オブジェクトをダウンロードすると、データ転送料金が適用される

ので、不必要に大きな容量をダウンロードするのはやめた方がいいと思います。

実行コマンドは下記です。

aws s3 cp コピーしたURI コピーしたいローカルPCのパス --recursive

自分は、ホームディレクトリにあるドキュメントのtestディレクトリに入れたかったので以下のコマンドでダウンロードしました。

【Java】Gsonオブジェクトが、toJsonメソッドを呼び出した際に値がnullのものは、消失してしまう

タイトルだけだとどういうことかわからないので、サンプルを書きます。

目標はGsonを使って以下のようなJsonを生成することです。

{"hoge":"hoge","fuga":null}

Gsonを使ってJsonを生成するのは慣れていた(つもり)だったので以下のようにサラサラと書いてみます。

Map<String, String> map = new HashMap<>();
map.put("hoge", "hoge");
map.put("fuga", null);

Gson gson = new Gson();
String json = gson.toJson(map);

jsonの中身を見ると…

{"hoge":"hoge"}

俺のfugaが消えています…

調べてみると、GsonにはBuilderが用意されてて、そこでserializeNulls()を呼んで create()すると良いみたいです。

Map<String, String> map = new HashMap<>();
map.put("hoge", "hoge");
map.put("fuga", null);
GsonBuilder gsonBuilder = new GsonBuilder().serializeNulls();
Gson gson = gsonBuilder.create();
String json = gson.toJson(map);

結果

{"hoge":"hoge","fuga":null}

fugaを取り戻しました。

serializeNulls()の中身を見ると、GsonBuilderのserializeNullsプロパティがtrueにするような処理が走っていました。
serializeNullsプロパティはデフォルトではfalseになっていました。

そもそも GsonBuilder なるものがあるのを知らなかったですね…勉強になりました。

<参考サイト>

【Quita 】Gsonはデフォルトではnullなフィールドをシリアライズしない

【Java】JSONObjectで、getIntやoptIntで null の場合は0にせず null のままでいてほしい

int 型 はnullにならないので、しょうがないのですが、optIntegerのようなものが欲しいわけです。
本件、タイトルのことを上司に聞いたら即、一番下にある参考サイトを見つけてくれました。
情報収集力に雲泥の差がありますね…。

JSONObjectにそんなものがなかったのでなければ、作りましょうというのが今回のお話です。
ついでにDouble型も作ります。

public class JSONUtil {

    public static Integer optInteger(JSONObject jsonObject, String key) throws JSONException {
        return (jsonObject.isNull(key)) ? null : jsonObject.getInt(key);
    }

    public static Double optWrapperDouble(JSONObject jsonObject, String key) throws JSONException {
        return (jsonObject.isNull(key) || Double.isNaN(jsonObject.getDouble(key))) ? null : jsonObject.getDouble(key);
    }

}

0 とか 入力なしをきちんとわけたいときってどうするのがいいのかいまだに迷います。
Stringは、””でいい気はしますが…。
個人的には、nullは、 すぐNullPointerExceptionにはまるため使いたくないので…。

<参考サイト>

【Stack Overflow】Json Parsing and Nullable int value in android