きり丸の技術日記

技術検証したり、資格等をここに残していきます。

はじめてのHHKBを買いました

my new gear...

f:id:nainaistar:20201017145138j:plain
my new gear

買っちった。そこまでキーボードにこだわりはないですが、職場の人に影響されて買いました。前々からHHKBは欲しかったですしね。

買った商品

商品名:HHKB Professional HYBRID Type-S日本語配列/墨

PrimeDayで購入したので、35,200から2,000を引いた33,200円でした。

きり丸が別に持っているキーボード

商品名:Surface Ergonomic無線キーボード (日本語キー配列)

感想

流石に値段は高いですね…。

打鍵感としては、キータッチが軽い方を好むので私はこのキーボードの打鍵感は好きです。ただ、静電容量無接点方式のカチッとした感じが好きな方はお勧めできないです。

私は結構強めに打鍵してしまうタイプですが、それなりに消音してくれます。ただ、完全消音ではなく、ある程度の打鍵音は鳴ってしまいます。会社なら気にならない打鍵音ですが。

サイズ感としては小さくて持ち運びに便利です。しかし、元々メインで使っていたのがエルゴノミクスのキーボードだったので、肩が開いて打鍵していない感覚があり、30分も打ち続けていると肩こりになりそうです。

あとは、アームレストが無いので、元々それに慣れていると腕と机の接点が痛いです。

結論としては、家でのメインキーボードは変わらずにSurface Ergonomicをメインにします。このHHKBは会社に持って行って、使おうと思います。でも、在宅が多くなったのでいつ使おうかな…。

最終的には分割キーボードじゃないと、満足できそうにない自分がいます。

(商品とは別に)困ったこと

購入した商品はJIS配列のキーボードでしたが、US配列のキーボードとして認識されていました。

意気揚々とこのキーボードの打ち心地を試そうと思った矢先、日本語入力ができなかったので困りました…。新しいキーボードはキー配列に慣れていないので、英字ローマ字変換するキーがどこにマッピングされているのかわからなかったですし。

結論としては、@it様の 「Windows 10で異なる言語のキーボード配列に誤認識される場合の対処方法」で解決できて良かったです。 www.atmarkit.co.jp

終わりに

もしこの記事が役に立ったのであれば、はてぶ、Twitterでの記事の拡散、Twitterのフォローもよろしくお願いします。私の励みになります。

YAMLのブロックを変数化し、変数を参照して共通化する(アンカーとエイリアス)

設定ファイルの一部値を修正漏れが発生したことで、障害が発生した 経験は無いでしょうか。また、タイムアウト値等の連携システムごとに大きく変わらない設定値を記載するのを面倒に感じたことは無いでしょうか。

今回の記事では、YAMLのアンカー、エイリアス、マージ機能を使って、YAMLの反映漏れや記載内容の削減を目指します。

ゴール

設定ファイルから、下記2つのURLを生成します。アンカー、エイリアス、マージ機能を使って、設定ファイルをリファクタリングします。

http://localhost:80/twitter http://localhost:10080/facebook

※ポートやエンドポイントは例です。

副次効果


設定値を纏められるので、数値の単位を揃えることができます。設定ファイルと実装は異なるので、単位が違っていてもいいですが、少なくとも混乱はしなくなります。

(例)

twitter:
  timeout: 3 # 3ミリ秒?3秒?
facebook:
  timeout: 3000 # 3000ミリ秒?3秒?

アンカーとエイリアスを使って共通化

アンカー(Anchor)は変数宣言、エイリアス(alias)は変数使用です。

&を付与するとアンカーとなります。&timeout 3と使用すると、timeoutという変数に3が設定されています。

*を付与するとエイリアスとなります。*timeoutと使用すると、3と置換されます。

下記例では、hostprotocolporttimeoutの値を共通化しています。

# 置換前のYAMLファイル
external:
  twitter:
    host: localhost
    protocol: http
    port: 80
    timeout: 3
    endpoint: twitter
  facebook:
    host: localhost
    protocol: http
    port: 10080
    timeout: 3
    endpoint: facebook
# アンカーとエイリアスを使用して共通化したファイル
external:
  common: 
    host: &host localhost
    protocol: &protocol http
    port: &port 80
    timeout: &timeout 3
  twitter:
    host: *host
    protocol: *protocol
    port: *port
    timeout: *timeout
    endpoint: twitter
  facebook:
    host: *host
    protocol: *protocol
    port: 10080
    timeout: *timeout
    endpoint: facebook

マージを使って共通化

アンカーとエイリアスでは変数ののみを共通化しました。マージ機能を使用すると、変数のキーの両方を共通化できます。

マージ機能を使用するには、<<とエイリアスを組み合わせます。

ただし、YAMLの仕様としては、マージという機能は定義されていないようです。なので、使用するライブラリでマージ機能が実装されているかどうかを確認してください。

下記例では、host: localhostprotocol: httpport: 80timeout: 3を共通化した&commonというアンカーをマージしています。

また、Facebookのportを10080でcommonを上書きしています。

external:
  common: &common
    host: localhost
    protocol: http
    port: 80
    timeout: 3
  twitter:
    <<: *common
    endpoint: twitter
  facebook:
    <<: *common
    port: 10080 # 上書き
    endpoint: facebook

ブロックのアンカーとエイリアス

ブロックで定義したアンカーを使用する方法を記載します。次の設定ではtwittertwitter2は同一の設定がされています。

OpenAPIやSwaggerではエラーレスポンス、同一のパスパラメータを何度も定義することがあるため、アンカーとエイリアスを使いこなすことで、記載量を減らせます。

external:
  common: &common
    host: localhost
    protocol: http
    port: 80
    timeout: 3
  twitter: &twitter
    <<: *common
    endpoint: twitter
  twitter2: *twtitter

GitHubソースコード

github.com

YAMLの定義

https://yaml.org/

https://yaml.org/refcard.html

https://yaml.org/spec/1.2/spec.html

JSONの定義


今回の記事とは関係ないですが、JSONを設定ファイルとしている場合も同様に共通化できないか調べてみたので残しておきます。結論としてはできないようです。

なので、JSONとYAMLを選択できる場合に、YAMLに軍配が上がるかと考えています。

ただし、個人的には読みやすさだけでいうと、YAMLの配列記述とか分かりづらいのでJSONの方が好きです。

www.json.org

終わりに

動けばいい、ということで設定ファイルは雑に扱われがちのように感じます。設定ファイルを雑に扱った結果、設定ファイルを読み込んで実装するプログラムはもっと雑になります。

この記事を読んだことで、設定ファイルのリファクタリングという別観点を植え付けることができれば幸いです。


もしこの記事が役に立ったのであれば、はてぶ、Twitterでの記事の拡散、Twitterのフォローもよろしくお願いします。

私の励みになります。

参考記事

CircleCIの「YAMLの記述」 circleci.com

フューチャー技術ブログの「一周回って、人間が読み書きする設定ファイルはJSONが良いと思った」 future-architect.github.io

類似記事

Javaでプロパティのテストを書く方法(こちらで動作検証しながら、リファクタリングしていました) nainaistar.hatenablog.com

SpringBootでpropertiesやymlの設定ファイルが読み込めることのテストを書く【Java】

2021/03/31 追記

SpringBoot2.4以降の場合はこちらの記事も参考にしてみてください。


SpringBootではpropertiesファイルやymlファイル(以降、設定ファイル)に、DBのURL等々の環境ごとの変数を記載できます。

設定ファイルの値が目的通り一致していることを書くテストには大きい価値は無いので、全設定ファイルのテストを作成する必要はありません。ただし、設定ファイルが目的通りに読み込めていることを示すテストは、最低1つはあるべきだと考えています。

今回の記事は、設定ファイルを読み込んでいることを示すテストを記載します。

ゴール

設定ファイルを読み込めていることを示すテストを書けるようにする。

環境

  • org.springframework.boot
    • 2.2.0.M3

ソースコード

設定ファイル


下記のディレクトリに、設定ファイルを記載する src/test/resources/application.yml

app:
  config:
    appName: "Kirimaru"

設定ファイルを読み込むJavaファイル


ConfigurationPropertiesアノテーションを使用する。prefixをつけることで、特定の階層以降を読み込むことができるので、可読性が上がる。

下記ディレクトリにJavaファイルを格納する。 {ContextRoot}/config/CoreProperties.java

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Getter
@Setter
@ConfigurationProperties(prefix = "app.config")
public class CoreProperties {
  private String appName;
}

テストコード


SpringJunitConfigアノテーションと、EnableConfigurationPropertiesアノテーションを使用します。

設定ファイルから読み込ませて、目的通り読み込んでいることを確認する必要があるので、SpringJunitConfigのイニシャライザにConfigFileApplicationCOntextInitializer.classを指定する必要があります。

また、必要な設定ファイルを読み込ませるために、EnableConfigurationPropertiesに読み込ませたい設定ファイルを指定します。今回の例ではCoreProperties.classです。

{TestのContextRoot}/config/CorePropertiesTests.java

@SpringJUnitConfig(initializers = ConfigFileApplicationContextInitializer.class)
@EnableConfigurationProperties({CoreProperties.class})
class CorePropertiesTests {
  @Autowired
  CoreProperties coreProperties;

  @Test
  void test_01(){
    assertThat(coreProperties.getAppName()).isEqualTo("Kirimaru");
  } 
}

GitHubソースコード

  • 対象ファイル
    • application.yml(activeProfilesにutを指定)
    • application-ut.yml(profiles=utで動かしているので、設定値はこちら)
    • CoreProperties.java
    • CorePropertiesTests.java

github.com

公式ヘルプ&公式ソース

www.baeldung.com

github.com

終わりに

仕事でも同じソースを書きましたが、複数のアノテーションを使った記憶が無かったので混乱しました。誰かが高速化のためにリファクタリングしてくれたのか、自分が単純に忘れているのかわかりませんが、改めて勉強になりました。

本当は設定ファイルのアンカーやエイリアスを使ったうえで、共通化できることの検証をしたかったのですが、その手前で時間をかけてしまいました。やっぱり、TDDの最初のステップは難易度が高いですね。この辺を自分の知識をフル動員したり、ブログに残したりして次回失敗する時間を1分でも短縮したいと考えています。

この辺をサクっとできて品質担保する時間を確保できれば、他の人にも一目置かれる存在になると考えているので勉強していきたいです。


この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。

f:id:nainaistar:20201013111905p:plain