2024/04 CTOへの日報まとめ

日報




2024-4-1

バッファリングについて知ることができました。

  • バッファリングとは、データを一時的に蓄えることで、入出力処理の効率を向上させる技術のこと
  • 具体的には、入力データを一度に大量に読み込み、または出力データを一度に大量に書き出すことで、システム呼び出しの回数を減らし、全体の処理速度を向上させる技術のこと
  • 一時的にデータを保存する領域のことをバッファという
  • バッファリングを利用することで、データの読み書きに関するシステム呼び出しの回数を減らしたり、データを一定量まとめて処理することで、I/Oのオーバーヘッドを削減することが可能
  • これにより、プログラムの実行効率が向上し、特に大量のデータを扱う場合に顕著なパフォーマンスの改善が見られる
2024-4-3

Knockout.jsのko.computedを自分で初めて実装しました。とても浅い感想になってしまいますが、便利だと感じました

2024-4-8

ガベージコレクタ(GC)について知見を深めることができました。

  • ガベージコレクタ(GC)とは、プログラムが動的に確保したメモリ領域のうち、もはや使用されなくなった部分を自動的に探し出して解放するシステムのこと
  • このプロセスにより、プログラムで使用されなくなったメモリリークを防ぎ、利用可能なメモリ資源を効率的に管理する
  • プログラミング言語によっては、開発者が直接メモリを管理する必要がある(CやC++など)
  • これに対して、JavaやPython、Goなどの言語では、ガベージコレクタがメモリ管理の大部分を自動で行い、開発者がメモリ解放について考慮する必要を大幅に減少させる

ガベージコレクタの基本的な動作は以下のステップに分けられる

1. 到達可能性分析(Reachability Analysis)
ガベージコレクタは、プログラムの実行中にアクセス可能な(到達可能な)オブジェクトを特定する。これには、スタック、グローバル変数、またはヒープ内の他のオブジェクトから参照されているオブジェクトが含まれる。

2. マーク(Mark)
到達可能なオブジェクトを「マーク」する。これにより、どのオブジェクトがまだ使用中であるかを識別する。

3. スイープ(Sweep)
マークされていないオブジェクト(つまり、プログラムから到達不可能と判断されたオブジェクト)をメモリから解放する

ガベージコレクタの利点は、メモリ管理の自動化によってプログラムの安定性と開発の生産性を向上させることにある。しかし、ガベージコレクションのプロセスが予測不可能なタイミングで発生すると、パフォーマンスの低下や応答性の問題を引き起こす可能性がある。そのため、高性能を必要とするアプリケーションでは、ガベージコレクタの挙動を適切に制御するか、あるいは低レベル言語での手動メモリ管理を選択することがある。

2024-4-9

ミューテックスについて理解することができました。

  • ミューテックス(Mutex)は、相互排他制御(Mutual Exclusion)を行うコンピュータおよびプログラムの仕組みを指す言葉
  • 並行処理されるプロセス間において利用されるリソースを排他制御するための仕組み
  • プロセスあるいはスレッドは、ミューテックスの関数を利用することで、共有リソースの利用をロック(Lock)し、他のプロセスがリソースにアクセスできないようにする
  • その後、処理を終えた後はロックを解放し(Unlock)、リソースを使用可能にする
  • ミューテックスの仕組みを利用することにより、リソース競合によるレース・コンディション(Race Condition)の発生を防ぐことができる
2024-4-10

OOMについて知見を深めることができました。

  • OOMとは、「Out of Memory」の略で、コンピュータシステムがメモリ不足に陥り、プログラムやプロセスが必要とするメモリを割り当てることができない状態を指す
  • OOMが発生すると、システムやアプリケーションは正常に機能しなくなり、最悪の場合、クラッシュすることがある

OOMの主な原因

  • メモリリーク:プログラムが不要になったメモリを適切に解放しないことで、使用されなくなったメモリが徐々に蓄積し、使用可能なメモリが不足する
  • 過剰なメモリ確保:アプリケーションが一度に大量のメモリを要求するが、システムがその要求を満たすことができない場合
  • システムリソースの限界:物理的なメモリが不足している、または仮想メモリが枯渇している状態

OOMの影響

  • プロセスの終了:システムはメモリが不足している状態を解決するために、メモリを大量に消費しているプロセスを強制的に終了させることがある
  • システムの不安定:メモリが不足すると、システム全体のパフォーマンスが低下し、応答性が悪くなることがある
  • データの損失:プロセスが突然終了した場合、作業中のデータが失われることがある

OOM Killer

  • Linuxなどの一部のOSでは、「OOM Killer」と呼ばれるメカニズムがあり、メモリ不足の際に自動的にプロセスを選択して終了させ、システムの安定性を保つように動作する
  • OOM Killerは、システムが完全に停止するのを防ぐための最後の手段として機能するが、予期しないプロセスの終了により問題が発生することもある

OOM問題を防ぐためには、プログラムのメモリ使用を慎重に管理し、不要なメモリ確保を避け、定期的にメモリリークのチェックを行うことが重要。また、システムのメモリ容量を適切に設計し、必要に応じて増設することも有効な手段となる。

2024-4-17

アルゴリズムにおける「オーダー」について理解を深めることができました。

  • アルゴリズムにおけるオーダーとは、そのアルゴリズムの実行時間や必要な記憶領域が入力サイズに対してどのように増加するかを表すために使用される概念
  • 具体的には、アルゴリズムの効率性を評価する際に用いられ、大きな入力サイズに対する振る舞いの傾向を把握するのに役立つ
  • オーダーは、通常「O表記法」(Big Oh Notation)によって表現される
  • 例えば、アルゴリズムの実行時間が入力サイズnに対して直線的に増加する場合、そのオーダーはO(n)と表される。これは、入力サイズが2倍になれば、実行時間も約2倍になることを意味する
  • 一方、アルゴリズムの実行時間が入力サイズの2乗に比例して増加する場合は、O(n^2)と表され、入力サイズが2倍になると実行時間は4倍になることを意味する
2024-4-18

アルゴリズムにおける「時間複雑度」について理解を深めることができました。

  • 時間複雑度とは、アルゴリズムが問題を解決するのに要する時間が入力サイズに対してどのように増加するかを表す指標
  • アルゴリズムの効率性を評価する際に重要な役割を果たし、異なるアルゴリズムの比較や、特定の問題に最も適したアルゴリズムを選択する際の基準となる

時間複雑度の例

  • 線形時間 O(n):アルゴリズムの実行時間が入力サイズに直接比例する。例:線形探索
  • 対数時間 O(logn):アルゴリズムの実行時間が入力サイズの対数に比例する。例:二分探索
  • 二次時間 O(n^2):アルゴリズムの実行時間が入力サイズの二乗に比例する。例:バブルソート
  • 線形対数時間 O(nlogn):アルゴリズムの実行時間が入力サイズとその対数の積に比例する。例:マージソート
2024-4-22

データ構造とアルゴリズムの分野で出現する、データの探索アルゴリズムの1つである「ハッシュ法」において、データを格納するハッシュテーブル上の位置(index)を決めるハッシュ値が重複した場合に、新たなハッシュ値を生成することで空いているハッシュテーブル上の位置にデータを挿入するプロセスがあります。その場合のハッシュ値の生成方法に関して、下記の記事で理解を深めることができました。
https://zenn.dev/fikastudio/articles/efcfe246642553

2024-4-23

Docker Hubに存在するイメージを探すコマンドを知ることができました。
また出力にあるofficialにOKと記載されているイメージに関しては、docker Hub公式のものとのことでした
docker search ruby

またあまり場面としてはないかもしれませんが、コンテナを1つだけ作成して、そのコンテナ内でコマンドを実行するdockerコマンドについても理解することができました
例:ubuntu環境でbashを起動させる docker run ubuntu bash

2024-4-24

fooテーブルのbarカラムには、COLLATEとしてutf8mb4_0900_binが設定されていました。ただ、これがどのようなCOLLATE設定なのか分からなかったため、調べました。

utf8mb4_0900_binは、utf8mb4文字エンコーディングを使用するMySQLデータベースでよく見られるCOLLATE設定

各部分の説明

  • utf8mb4:使用する文字エンコーディングの明示
  • 0900:Unicodeのバージョン9.0に基づいていることを示す。これは文字の比較やソートがUnicode 9.0の規則に従って行われることを意味する
  • bin:バイナリ比較を行うことを意味しており、文字列が完全に一致する場合のみ等しいとみなされる。大文字と小文字、アクセント、その他の文字の違いも全て区別される。バイナリ比較は文字列のバイト値に基づいており、最も厳密な比較方法
    • 2024-4-26

      Docker Hub にイメージをアップロードするためには、Docker Hub のDocker Image の命名規則に則る必要があることを知りました。

      • ユーザーのオリジナルイメージは、 /: という命名にする必要がある
      • : は省略可能で、省略すると :latest と命名される

      命名には、docker tag コマンドを使用する
      $ docker tag hello /hello  helloという名前のイメージに、/helloというタグを付与する