気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

Kotlin 処理実行時間をhh:mm:ssのフォーマットで出力する

バッチなどで経過時間をログ出力したいときに、ミリ秒表示などではなく時間形式で表示したい場合の処理を記載しておく。

fun main() {
    val begin = System.nanoTime()
 
    /*コードが始まります*/
 
    //2秒間スリープします
    Thread.sleep(2000)
 
    /*コードは終了します*/
 
    val end = System.nanoTime()
    val elapsedTime = formatElapsedTime(end-begin)
 
    println("Elapsed time: ${elapsedTime}")
}

/**
 * 経過時間(ナノ秒)をhh:mm:ssのフォーマットで出力する
 */
fun formatElapsedTime(elapsedTimeNanos: Long): String {
    val elapsedTimeSeconds = elapsedTimeNanos / 1_000_000 / 1_000
    val hours = elapsedTimeSeconds / 3600
    val minutes = (elapsedTimeSeconds % 3600) / 60 // 1時間の剰余の秒/60秒
    val seconds = (elapsedTimeSeconds % 60) // 1分の剰余の秒
    return String.format("%02d:%02d:%02d", hours, minutes, seconds)
}

参考URL

UTで現在時刻を扱うとき使う java.time.Clock

UTで現在時刻を扱う際の課題

現在時刻を取得するためにSystem.currentTimeMills()やLocalDateTime.now()などのstatic methodを呼び出して利用することが多いが、static methodを利用して現在時刻を取得するとテストで利用する際の時刻のスタブを用意しずらくなる。

Clockクラスを用いるとスタブを用意しやすい

static methodではなく、Clockのインスタンスメソッドを使って現在時刻を取得するため、テストでスタブを用意しやすくなる。 時間設定もfixedというメソッドがあるため、簡単に設定可能。

SpringでClockを用いるときは、BeanとしてClockインスタンスを定義しておき、利用する。

@Bean
    fun clock(): Clock = Clock.fixed(Instant.parse("2023-11-13T00:00:00.00Z"), ZoneId.systemDefault())

実装では、コンストラクタインジェクションでDIして利用。

テストでは、@MockとMockitoを利用して固定のInstantを返却する。

class SampleBeanTest {

  @MockBean
  Clock clock;
  
  @InjectMocks
  SampleBean sampleBean;
  
  @Test
  public testSample(){
  
    when(clock.instant()).thenReturn(Instant.parse("2023-11-13T00:00:00Z"))
  
    // ...
  }
}

参考URL

Kotlin 変数、メソッドの宣言

トップレベル宣言

Javaではクラス内部の定義のみだが、Kotlinではクラスに属さないようにトップレベルに定義、アクセスできる。

  • インターフェース(sealed interface)
  • クラス(data class/object/value class/sealed class/enum class)
  • プロパティ
  • 関数
  • typealias

1ファイル中に複数のクラスを宣言可能

トップレベル宣言処理のクラス

  • トップレベルに複数宣言されたクラスやインターフェース
    • 各名称のクラスを生成
  • トップレベルに宣言されたプロパティや関数、typealias
    • ファイル名Ktというクラスを生成。そのクラスに属することになる

クラスメソッドやクラス変数の定義場所

companion objectに定義しがちだが、トップレベルへの定義が推奨とのこと 余計なオブジェクトの生成が減る

Mac Slack便利ショートカット

ショートカット一覧

説明 ショートカットキー
チャンネル移動 ⌘+KもしくはT
すべてのDMへ移動 ⌘+Shift+K
スレッドを確認 ⌘+Shift+T
ブックマーク ⌘+Shift+S
全未読画面を開く ⌘+Shift+A
次のワークスペースへ切り替え ⌘+Shift+[
前のワークスペースへ切り替え ⌘+Shift+]
現在の会話で検索する ⌘+ F
ファイルをアップロードする ⌘+U
会話の最新の未読メッセージに移動する ⌘+J

Slack のキーボードショートカット | Slack

Envoy Proxyについて

Envoyとは?

  • Nginxと類似した機能を持つOSS
  • マイクロサービスに対応するために、サービス間のネットワーク制御をライブラリとしてではなく、ネットワークプロキシとして提供するために開発された
  • アーキテクチャ
    • アプリケーションと同じホスト上にEnvoyを構築
    • Kubernetesなどでは、Envoyを各アプリケーションのサイドカーコンテナとしてデプロイ
      • サイドカーとは?
        • Kubernetesポッド内のアプリケーションコンテナと連動する独立したコンテナです。アプリケーション補完機能を保持
        • 機能:SSL/mTLS、トラフィックルーティング、高可用性など
    • 各サービスは別のサービスを直接参照するのではなく、Envoyを経由してアクセスすることになる

  • Envoyはアプリケーションからネットワークの切り離しを実現
    • Envoyは、各サービスのIPアドレスを保持、アプリケーション自体が別のサービスのIPアドレスを知らなくても問題はなくなる
    • サービスの通信経路やIPアドレスが変更になった場合でも、Envoyの設定を更新するのみで、アプリケーションに手を加える必要がなくなる
    • サービスメッシュを実現する
      • 開発者はアプリケーションのビジネスロジックに専念し、それらの通信に関連する複雑な問題を解決する責任から解放される

Envoyが提供する機能

  • ネットワークレベルのフィルタ
    • L3/L4フィルタ -フィルタはTCPプロキシ、HTTPプロキシ、TLSクライアント証明書認証などをサポート
  • gRPCサポート
    • gRPCリクエスト/レスポンスのルーティングおよび負荷分散の基盤として使用する必要のあるHTTP/2機能全てをサポート
  • サービスディスカバリーとダイナミックコンフィグレーション
    • オプションとしてDNSを介してバックエンドホストの検出を行うことが出来ます。またxDS APIを使用してEnvoy内の設定を動的に更新することも可能

参考URL

実行中以外の全体ソースを参照できるPython デバッガー pudb

インストール

$ pip install pudb 

使い方

pythonのところをpudb に置き換えるだけ

$ pudb sample.py  

コマンド

  • n : 次の行へ (ステップオーバー)
  • s :関数などの内部に入る (ステップイン)
  • b :ブレークポイントを打つ
  • ? : Help ウィンドウが表示
  • Ctrl + x : 下側に表示されている Python の REPL ウィンドウに移動
    • REPL ウィンドウ
      • 現在の変数の状態を見れる
  • q:終了する(Ctrl +x を押して制御をメインのウィンドウに戻してから q キー)

OpenTelemetryとは

OpenTelemetryとは

近年、様々な状況に対して強く、柔軟なシステムが求められ、その中で重要な要素として「Observability」(可観測性:オブザーバビリティ)が求められています。

OpenTelemetryは、Observabilityにおいて必要不可欠なシステムの状態を示すさまざまなシグナル(ログやCPU、メモリなどのメトリクス)の収集や送信を標準化する、Cloud Native Computing Foundation(CNCF)プロジェクトです。

Observabilityを実現するためにシステムの状態を可視化するためのシグナルである「テレメトリー」が用いられます。

テレメトリー

テレメトリーの要素としては、ログ、トレース、メトリクスが重要。
加えてプロファイル、ダンプも含めたものを「Primary Signals」と呼んでいる。

  • ログ
    • アプリやサーバで発生している個別のイベント(エラーログ、アクセスログなど)
  • トレース
  • メトリクス
    • サーバのリソース状況(CPU使用率など)やサービス状況(レイテンシ、トランザクション量、エラーレートなど)といった、特定の時間間隔で測定された数値データ

参考URL