2023/08 CTOへの日報まとめ

日報




2023-08-01

Excelファイルのシート名に使用できる文字数は最大31文字ということをはじめて知りました。加えて、シート名以外の部分で最大文字数が設定されている可能性もあると思ったため、開発時には調査が必要だと思いました。また、長文が入力された場合の挙動を動作チェックすることの重要性を感じました。

2023-08-02

タイムゾーンを表す略語である「PDT」について、理解することができました。

PDTとは「Pacific Daylight Time」の略で、太平洋夏時間を示す。アメリカやカナダの太平洋沿岸地域で、夏時間が適用される期間(春分と秋分の間)に使用される。PDTは、協定世界時(UTC)に-7時間を加えた時間。すなわち、日本が春分と秋分の間(夏時間)にPDTを採用している地域と同時刻にするためには、日本時間から-16時間をする必要がある。注意点として、タイムゾーンは国や地域により夏時間への切り替え日や冬時間への切り替え日が異なる。そのため、特定の日付で時間を変換する際にはこれらを考慮する必要がある。また、一部の地域では夏時間を採用していないため、同じタイムゾーンでも時差が異なる場合がある。

2023-08-03

SPOFという言葉を知ることができました。

  • SPOFとは、システムを構成する要素のうち、そこが停止するとシステム全体が停止してしまう部分のこと
  • Single Point of Failureの頭文字を繋げたもの
  • 日本語では「単一障害点」と呼ぶ

諸々サーバーが冗長化されていないと、そのサーバーがダウンしたときにシステム全体が停止してしまい、そのサーバー自体が単一障害点になってしまうため、改めてサーバーの冗長化の重要性を感じました。また、単一障害点は絶対に作ってはいけないと思いました。

2023-08-04

リリース時に発生するDBの変更に関して、現在はシェルスクリプトを実行することで差分を埋めているかと思いますが、以前はドライブに上がっているSQLファイルを各自実行する形の運用だったかと思います。そこで、SQLファイルに書かれていた「ENGINE = InnoDB;」というものが何か分からなかったので、調べました。

  • InnoDB(イノDB)とは、MySQLとMariaDBのためのデータベースエンジン
  • データベースエンジンとは、データベースを操作する際に必要な部品のこと
  • 銀行口座がデータベースだとすると、ATMがデータベースエンジンにあたる
  • エンジンがないと自動車が動かないように、データベースエンジンがないとデータベースは動かない
2023-08-09

自社サービスでは使われていないかもしれませんが、トランザクション内でSELECT ~~~ FOR UPDATEを使用して、更新をかけたい行やテーブルに排他的なロックをかける方法があるかと思います。これに関して、ロックを獲得したい行が既に他トランザクションによってロックが獲得されている場合、ロックの解放を待つかタイムアウトを待つしかないと思います。そこで、ロックが解放されるまで、あるいはタイムアウトまで待たされるよりも、ロックが獲得できなかったことを即時に知らせてほしい場合には、下記のクエリを使用するとよいことを知りました。

1. SELECT ~~~ FOR UPDATE NOWAIT:ロックが獲得できなかったときは即時にエラーを返す
2. SELECT ~~~ FOR UPDATE SKIP LOCKED:即時に獲得可能なロックのみ獲得して結果を返す

例、select * from users where id = 1 for update nowait;
ロックが獲得できなかった場合に返されるエラー:ERROR 3572 (HY000): Statement aborted because lock(s) could not be acquired immediately and NOWAIT is set.

例、select * from users where id in (1, 2, 3, 4) for update skip locked;
id = 1のレコードが既にロックがかけられていた場合、id = 2, 3, 4のレコードのロックのみ獲得する

2023-08-10

以前、シニアエンジニアに問い合わせ対応の相談をさせていただいた際に教えていただいた「_gid」と、加えて「_ga」について自分でも調べてみました。以下に理解した内容を記載します。

_ga, _gidとは、Google Analyticsによって使用されるパフォーマンスクッキーで、ウェブサイト訪問者の識別や追跡に役立つ。

  • _ga:このパフォーマンスクッキーは、ユーザーを2年間の期間で識別するために使用される。一般的に、同一のデバイスとブラウザからの訪問を一意のユーザーとして識別する。つまり、長期的なユーザー識別に用いられる。
  • _gid:このパフォーマンスクッキーは、ユーザーを24時間の期間で識別するために使用される。短期的なセッション識別に役立ち、新しいセッションごとに新しいIDが生成される。

また、前提として「パフォーマンスCookie」とは、「当サイトがお客様にどのように利用されているのか」に関してのデータを取得し、当サイトの利便性や機能の向上のために使われる。このCookieにより、お客様が当サイト内のどのページを訪れたか、どのコンテンツに興味を示していたかなどを調べることが可能となる。

上記の内容を理解しました。_gidで絞ることで、該当ユーザーの24時間以内のアクセス履歴をたどれるため、問い合わせ調査が円滑になると感じております。また、_gaに関しては、_gidほど使う機会はないかもしれませんが、「過去に同一のエントリーフォームにアクセスしたことがあるかどうか」などを調べるときに有効だと感じています。しかし「一般的に、同一のデバイスとブラウザからの訪問を一意のユーザーとして識別する」とのことなので、「今回はPCからEFにアクセスしたが、以前はスマホからアクセスした」といった場合、_gaで検索をかけても、過去にスマホからアクセスした際のログは発見できないため、ここは注意が必要だと感じました。

2023-08-15

「マッシュアップ」と「ゼロデイ攻撃」について知ることができました。

  • マッシュアップとは、複数のWebサービスを組み合わせて、新たなWebサービスを生み出すこと。APIを用いて、複数サービスから情報を取得し、その情報を組み合わせて新たな情報を提供するだけで、新しいサービスが生まれる。
  • ゼロデイ攻撃とは、発見されたセキュリティホールに対する修正プログラムが開発される前に、そのセキュリティホールを利用して仕掛ける攻撃のこと
2023-08-16

DBのオプティマイザという機能の存在をはじめて知りました。

  • オプティマイザとは、SQLをもとに最適なデータ取得方法を動的に決定する機能

select * from employees where employee_number = 100;
上記クエリの場合、例えば下記のような取得方法が考えられる

  • 上から順に1件ずつ見ていき、employee_number = 100のレコードを取得する
  • 下から順に1件ずつ見ていき、employee_number = 100のレコードを取得する
  • employee_numberカラムを昇順または降順でソートし、二分探索によりemployee_number = 100のレコードを取得する

これまで自分の知らないところで、このような機能が働いていたのだなと少し感心しました。

2023-08-17

Linuxディストリビューションについて知ることができました。

  • Linuxディストリビューションとは、Linuxカーネル・ライブラリ・アプリケーション・ドキュメントなどをパッケージ化したLinux系OSのこと
  • Linuxカーネル自体は、Linuxの基本的な機能を担うソフトウェアであるため、完全なOSとして機能させるには追加のコンポーネントが必要。そこで、Linuxカーネルに追加のコンポーネントを組み合わせ、特定の目的やユーザーに適した形で提供されるOSを「Linuxディストリビューション」という

また、Linuxディストリビューションとして有名な下記4つについても、また調べてみました。

  • Ubuntu:「誰にでも使いやすいOS」をコンセプトに開発されたLinuxディストリビューションの1つ。高い人気を誇る。
  • RHEL:Red Hat Enterprise Linuxのこと。アメリカのRedHat社が開発した、商用向けのLinuxディストリビューション。
  • Fedora:RHELに実験的要素を含んだもの(最新の技術やソフトウェアの最新バージョンを取り入れたもの)。安定性に欠けるため、エンタープライズでの使用にはあまり適していない
  • CentOS:RHELのクローンOSで、RHELの商用部分を取り除いたLinuxディストリビューションのこと。安定性も比較的高く、商用でも使われる機会が増えている。
2023-08-18

IPsecの簡単な概要について知ることができました。

  • IPsecとは、暗号化によって、パケットの秘匿や改ざんの検知を実現するプロトコルのこと。
  • インターネットを介して拠点間を接続するVPNを実現するためのプロトコルとして広く利用されている。
  • VPNに使用されるプロトコルとしては、他にPPTPやOpenVPN, WireGuardなどが挙げられる。近年では、WireGuardが安全性や性能面で優れており、最も利用されている。
2023-08-21

本日は、パスワードクラッキングとそれを実現する手法について知ることができました。

パスワードクラッキングとは、IDとパスワードによる認証を行うWebアプリから、パスワードを抜き出そうとする攻撃のこと。主な手法としては、辞書攻撃とブルートフォース攻撃がある。

  • 辞書攻撃:パスワードによく使われる単語(passwordや123456など)をまとめたファイル(辞書)を用意しておき、それを用いてログインを次々と試すことでパスワードを特定する攻撃手法
  • ブルートフォース攻撃:パスワードに使われる文字の全組み合わせをしらみつぶしに試すことで、パスワードを特定する攻撃手法
2023-08-22

SQLのNOT EXISTS句とNOT IN句における、NULLの扱い方の違いについて知ることが出来ました。

SELECT * FROM table_b WHERE NOT EXISTS (SELECT * FROM table_a WHERE table_b.name = table_a.name);
table_b.name = NULLのレコードも取得する

SELECT * FROM table_b WHERE name NOT IN (SELECT name FROM table_a);
table_b.name = NULLのレコードは取得しない

上記のような違いがあるとのことでした。DBにおけるNULLの扱いには注意が必要だと改めて思いました。また個人的には、EXISTS句よりIN句の方が直感的に理解しやすいクエリだと感じており、 IN句の方が好きなのですが、パフォーマンス面では EXISTS句の方が優れているとのことなので、場面によって使い分けることができると良いなと感じました。

2023-08-23

本日は「プロビジョニング」と「メトリクス」という用語について知ることができました。

  • プロビジョニングとは、アクセス数を予測し、ネットワークやコンピューター設備などのリソースを必要に応じて適切に提供できるように準備しておくこと
  • メトリクスとは、リソースの状況のこと。システム監視などで用いられる(例:EC2とRDSのメトリクスを監視する)
2023-08-24

「ペネトレーションテスト」というテスト手法を知りました。

ペネトレーションテストとは、自身が開発したアプリケーションの脆弱性の有無を確認するために、実際のサイバー攻撃と同じ手法で、自身のWebシステムにアクセスを試みて、疑似的な攻撃を行うことで、脆弱性の有無を確認するテストのこと。

2023-08-25

「フィード」と「フィードリーダー」について知ることができました。

フィード

  • フィードとは、Webサイトなどの更新履歴を配信するためのファイルのこと
  • ユーザーはフィードをチェックすることで、Webサイトにアクセスすることなく、最新の更新情報を確認することができる
  • フィードの形式としては、RDFという記述言語をベースとしたRSS1.0と、XMLをベースにしたRSS2.0がある
  • また、RSSの代わりになるものとして、有志によりXMLをベースにしたAtomという形式も構築されている
  • 現在のWebでは、主にRSSとAtomが利用されている

フィードリーダー

  • フィードリーダーとは、Web上のフィードを取得し、管理するためのソフトウェアのこと
  • 複数の登録されたフィードを定期的にチェックし、更新情報をユーザーが閲覧できるように整形して表示する機能を備えている
  • RSSリーダーと呼ばれることも多い
2023-08-28

QAエンジニアが書いてくださったSSO認証に関するwikiを読み、SSOに関する理解を深めることができました。

2023-08-29

DBの負荷分散方法の1つである「シャーディング」について知ることができました。

シャーディングとは、複数のDBに同じテーブルを用意し、1つのテーブルに保存していたレコードを分散して保存することで、各DBが保持するレコード数を減らす負荷分散方法

2023-08-30

Redisについて知ることができました。

  • Redisとは、インメモリデータベース
  • 単純かつ消えてよい一時的なデータの保存に適している
  • 加えて、RDBと比べ処理速度が早いため、セッションストア等で用いられる
  • AWSが提供しているRedisサービスとしては、Amazon MemoryDB for Redis、Amazon ElastiCache for Redisが挙げられる
  • Azureが提供しているRedisサービスとしては、Azure Cache for Redisが挙げられる
2023-08-31

本日のスキルアップタイムのアウトプットになります。

正規化

  • 第1正規形:繰り返し部分を分離させて、独立したレコードとした表
  • 第2正規形:部分関数従属している列を切り出した形の表
  • 第3正規形:主キー以外の列に関数従属している列を切り出した形の表

トランザクション

  • DBに対する一連の処理をひとまとめにしたもの
  • 全て実行されるか、1つも実行されないか、のどちらか(途中まで実行されることはない)
  • ACID特性を有する

ACID特性

  • 原子性(Atomicity)トランザクション内の全ての操作は、すべて完了するか、あるいは一つも実行されないかのどちらか
  • 一貫性(Consistency):トランザクションの実行前と実行後で、DBは一貫した状態を保つ必要がある
  • 独立性(Isolation)同時に実行される複数のトランザクションがある場合、それぞれのトランザクションは独立しており、他トランザクションの途中の状態に影響を受けない
  • 永続性(Durability):トランザクションが一度完了したら、その結果は永続的にDBに保存される。システム障害により完了したトランザクションの結果が失われることはない。

インデックス

  • テーブルを辞書だとすると、インデックスは目次のこと
  • 膨大なデータが格納されたテーブルの中から対象のデータを見つける際に役立つ、どのデータがテーブル内のどこに格納されているかを表す索引のこと
  • しかし、レコード数の少ないテーブルにインデックスを付与することで、逆にパフォーマンスの低下に繋がることも懸念されるため、インデックスの付与の要否は検討が必要

制約(constraint)

  • 主キー(PRIMARY KEY)制約:NOT NULL制約とUNIQUE制約を含む制約
  • 外部キー(FOREIGN KEY)制約:他テーブルの主キーを参照するカラムに適用される制約。参照先カラムに存在しない値が外部キー制約を有するカラムに入ることを防ぐ
  • UNIQUE制約:同一カラム内で一意の値である必要がある。同一テーブルの複数カラムに設定可能な制約
  • NOT NULL制約:NULLを許容しない
  • CHECK制約:カラムに入る値が指定した条件を満たすことを保証する制約
  • DEFAULT制約:カラムにデータが明示的に指定されなかった場合に、デフォルト値を設定するための制約

照合順序(collation)

  • 文字列の比較やソートの際のルールのこと
  • 照合順序が異なれば、クエリによる文字列比較やソートの結果が変わる
  • 照合順序は、DBやテーブル、特定カラムに設けることが可能

MySQLで設定可能な照合順序

  • utf8mb4_general_ci:大文字と小文字を区別しないUTF-8文字セットの照合順序
  • utf8mb4_bin:バイナリベースの照合順序。大文字と小文字やアクセントを完全に区別する
  • utf8mb4_unicode_ci:Unicode標準を使用して、大文字と小文字を区別しないUTF-8文字セットの照合順序