【プログラミング】何かをダウンロードするようなエンドポイントで、Edgeでのみダウンロードにならなかった話

問題

CSVをダウンロードさせるようなエンドポイントを立てた時、ChromeFireFoxではダウンロードになるのに、Edgeでのみダウンロードにならないという状況が発生しました。

問題のコード

エンドポイントのコードは以下です。フレームワークはSpringBootです。

@GetMapping(value = "/api/csv-all", produces = "text/csv")
public void allCsv(
        @RequestParam("id") Integer id,
        HttpServletResponse response
) {
    response.setCharacterEncoding(CSVCharset);

    response.setHeader(
            "Content-Disposition",
            "attachement;filename=\"" + createFilename(i) + "\""
    );

// 以下省略

原因

実は以下の部分にtypoがありました。これを直せばEdgeでもダウンロードになりました1

    response.setHeader(
            "Content-Disposition",
            // attachementが正しい綴り!
            "attachement;filename=\"" + createFilename(i) + "\""
    );

  1. この修正でFireFoxでもダウンロードするファイル名が変わりました。

【日記】秋葉原に行った

気になった製品

東プレ REALFORCE91UG-S

仕事では以前当てたリアルフォースRGB(光らせてない)を使っていますが、スペースキーの右側が外れるのとテンキーが邪魔なのが不満です。

買い替え先にするならREALFORCE91UG-Sでしょうか。スペースが短く、All荷重30gのテンキーレス静音リアフォです。
仕事用ならベストなキーボードだと思ってます。

 会社で「入力機器の購入に全額補助が出る制度」ができるという噂が有るので、それが来たら買うつもりです。(来なくても消費税上がるなら買います。)

ROCCAT Kone AIMO

2017年に購入したThermaltake Tt eSports VENTUS Zをずっと使ってきましたが、ボタンの反応がおかしくなってきたので買い換えようかなと思っています。

同じマウスを買わないという前提なら、今日手に取った中では ROCCAT Kone AIMOがいい感じでした。

Razer Mambaも候補として考えていましたが、高い上に手に持ってもピンと来ないなどしたので除外します。

ハードウェア的にはVENTUS Zが一番気に入ってるんですけどねー……。
同じマウスは2回書いたくないので、少なくともVENTUS Z以外を買うつもりです。

 東京マルイ ステアーHC

サバゲーに行って以来エアガンの購入を検討していましたが、ステアーHCを買うつもりです。
購入タイミングは次のサバゲー開催が決まり次第かな……。

www.tokyo-marui.co.jp

ストック部が長すぎやしないかと思ってましたが、G&G L85 A1を構えた所*1そこまでキツさが無かったので、画像から分析すると*2*3より短かったステアーHCならちゃんと構えられるかなと思っています。

カスタムパーツも一緒に買うつもりです。
サプレッサー、ダットサイト、フォアグリップ……。お金がいくらあっても足りないな……。

*1:レプマート様で触らせて頂きました

*2:「(公式画像の全長/画素数)x公式画像のストックからトリガー部までの画素数」で計算

*3:G&G L85 A1が410.7mm、東京マルイ ステアーHCが384.1mmでした

【Java】引数のListに対するStream処理がコンパイルできない状況への対処

以下のコードは、Listを内容のクラスの名前の配列にして返すという内容です。
List内の型に関係なく実行できるコードであるため、一見正しいように見えますが、このコードはコンパイルできません。

String[] toNameArray(List list) {
    return list.stream().map(it -> it.getClass().getName()).toArray(String[]::new);
}

対処

以下のように、ジェネリクスで「何でも取る」ということを明示すれば解決できます。

String[] toNameArray(List<?> list) {
    return list.stream().map(it -> it.getClass().getName()).toArray(String[]::new);
}
補足

例え「ジェネリクスに全く影響されずに実行できるコード」であっても、それを明示するジェネリクスを書かなければ警告やコンパイルエラーとなります。
つまり、「何が指定されていても構わない」という場合は<?>ジェネリクスとして指定しなければならないということです。

おまけ

Qiitaに投稿した、この例を含むジェネリクス関連の記事です。
qiita.com

【日記】ニコニコのプレミアム会員になった

Why?

ぶっちゃけ画質やらサービスはクソだと思いますが、中学校からずっと楽しませて頂きましたし、低画質解除やらを気にするのが馬鹿らしいと思ってました。
社会人になって給料も貰ったので、日常的に使うものや払いたいものには金を払おうと思います。

せめて自分の払う金で(微々たるものだけど!)投稿者様の受けられるサービスが良くなればいいなと思います。

後お金がもっと欲しいです。

【日記】サバゲーに行った

人生初サバゲに行ってきました。

感想

痛いけど面白い

当然ですが、当たれば痛かったです。
でもめっちゃ面白かったです。

FPSやったことが有って運動が好きならめっちゃハマれると思いました。

ただ、社会人の遊びだなーとは思います。
装備は借りることもできますが、借りても買っても高いことに変わりはありませんし、移動・フィールド代ととにかく財布にダメージが入ります。
会社の部費+先輩の金が有ってなお結構高くつきました。

……後日の筋肉痛も痛いです。

エアガン重たい

フィールドで借りたのはマルイのH&K G3 SASでした。

www.tokyo-marui.co.jp

これ、持って走ると結構思いと感じましたが、後から調べてみるとかなり軽い部類のエアガンでした。
買おうかなと思って軽く選んでみましたが、これ以上に重いものばかりなんですよね……。

エアガン買いたくなった

エアガンはカスタムとかも結構できるようで、「ぼくのかんがえたさいきょうの銃」できるのが良いなと思いました。
元々銃やFPSは好きだったので、1本買ってみたいなと思ってます。

カスタムだ何だと考えるとやっぱり高いですが、その分稼げばいいはず(沼フラグ)。

【PCパーツ】Silicon Power XPOWER Turbine/XPOWER Turbine RGBの製品寸法について

公式ページにあった以下2枚の製品画像に違和感があったので、問い合わせを行いましたが、画像とデータが間違っていたという回答をいただきました。

image.png

image.png

正しい製品寸法は以下の通りだそうです。

  • XPOWER Turbine -  W133.4 mm × H38.2 mm

  • XPOWER Turbine RGB - W133.4 mm × H40.7 mm

現在は製品ページも直っています。

www.silicon-power.com

www.silicon-power.com

【ModelMapper】The destination property [セッター名] matches multiple source property hierarchiesと言われた時の対処【Java】

以下のようなエラーに対処します。

org.modelmapper.ConfigurationException: ModelMapper configuration errors:

1) The destination property [セッター名] matches multiple source property hierarchies:

対処

ModelMapper#getConfiguration().setAmbiguityIgnored(true)を指定することで、マップ先が曖昧な場合は無視することができます。

modelMapper = new ModelMapper();
modelMapper.getConfiguration().setAmbiguityIgnored(true);