2024/03 CTOへの日報まとめ

日報




2024-3-5

GraphQLのスキーマを読めるようになりました。非常に面白い技術だと感じました

スキーマ APIが受け付ける形を定義したもの

schema {  // APIのエントリーポイント
query: Query  // CRUDのRを表す
mutation: Mutation  // CRUDのCUDを表す
}

type Query {  // 上述のQueryの定義部分
getUser(id: ID!): User  // getUser(id: 1)で、id:1のユーザー情報を取得。!は必須の意。Userはレスポンスオブジェクトのスキーマ
}

type Mutation {  // 上述のMutationの定義部分
createUser(input: CreateUserInput!): User  // createUser(input: 〇〇)でユーザー作成する。〇〇に記載するパラメータはcreateUserスキーマ参照。UserはQueryと同様の役割
}

type User {  // Query, MutationでのUserスキーマ定義部分
id: ID
firstName: String
lastName: String
age: Int
}

type CreateUserInput {  // MutationでのCreateUserInputスキーマ定義部分
firstName: String!
lastName: String!
age: Int
}

Queryリクエストサンプル

query GetUser {   queryで取得を意。GetUserはクエリ名で任意で指定可能で、複数のリクエストを行う際の識別に使える
getUser(id: "123") {  // ID!部分を"123"と指定。これによりid="123"のユーザー情報を取得するリクエストとなる
firstName   // このスコープが上記スキーマのUserに当たる部分で、レスポンスを受けたいパラメータを指定する
lastName  // つまり今回はfirstNameとlastNameだけをレスポンスとして返すように指定。必要なデータの取得に抑えることができ、オーバーフェッチを回避
}
}

Mutationリクエストサンプル

mutation CreateUser {
createUser(input: { firstName: "John", lastName: "Doe" }) {  // CreateUserInput!部分を{ firstName: "John", lastName: "Doe" }と指定。ageは任意なので今回は含めていない
id  // 作成したユーザーのidのみレスポンスとして返してもらうように指定。ここでも必要なレスポンスの取得に限定することでオーバーフェッチを回避
}
}

2024-3-6

昨日の日報で記載したQueryとMutationのサンプルリクエストでは、パラメータをハードコーディングしていました。
なので、本日は動的に値を変更する方法を理解することができました

query GetUser($id: ID!) {
getUser(id: $id) {
firstName
lastName
}
}

$val = {
"id": "abc123" // ここを動的に値変更
}

$valをQueryとまとめてエンドポイントへ投げればOK

2024-3-8

PHPのarray_pop関数について知ることが出来ました

2024-3-11

インターン生は、charとvarcharを使いこなせていないことに気付きました。下記を理解して使い分けができるようになると良いのではないか、と思いました。共有したいと思います

char

  • 固定長であり、不足文字数分はスペースで埋められる
  • 固定長なので、パフォーマンスに優れる
  • 反対に、不足文字数分がスペースで埋められるため、ディスクの無駄使いが発生する

varchar

  • 可変長であり、文字数分のディスクが確保されるため、ディスクの無駄遣いは発生しない
  • 代わりに、パフォーマンスはcharに比べて低下する
2024-3-12

メモリ上のアライメント調整について知ることができました。

  • メモリ上のアライメント調整とは、データをメモリ上で特定の境界に沿って配置すること
  • これはCPUがデータをより効率的に読み書きできるようにするための最適化手法
  • 異なるデータタイプ(整数、浮動小数点数、文字列など)には、それぞれ最適なアクセスを実現するための「自然なアライメント境界」がある
  • 例えば、多くのプラットフォームでは、4バイトの整数は4バイト境界に、8バイトの浮動小数点数は8バイト境界に配置されるのが最適
  • このように配置することで、CPUが1回のメモリアクセスでデータ全体を読み書きできるようになり、パフォーマンスが向上する
  • 逆に、これらの自然な境界に沿って配置されていないデータにアクセスする場合は、複数回のメモリアクセスが必要になることがあり、パフォーマンスが低下する
  • アライメントを最適化することは、特にメモリアクセスのパフォーマンスが重要なアプリケーションにおいて有用
  • しかし、この最適化はプラットフォームに依存するため、異なる環境での互換性を考慮する必要がある
2024-3-15

拡張子に.gzを持つGZIPで圧縮されたファイルの中身をターミナルに出力するコマンドを知ることができました。

zcatコマンド
zcatは、GZIPで圧縮されたファイルの内容を表示するためによく使用される。このコマンドはファイルを解凍してその内容を標準出力に送る。
zcat hoge.gz

2024-3-18

スプーフィング攻撃について知ることができました。

  • スプーフィング攻撃とは、攻撃者が信頼できる人物、デバイス、またはウェブサイトになりすまして、被害者から機密情報を盗み出す攻撃
  • この攻撃は、電子メール、電話、ウェブサイトなど、さまざまなコミュニケーション手段を利用して行われる
  • スプーフィング攻撃の目的は、被害者を騙して個人情報、金融情報、企業の機密データなどを明らかにすること
2024-3-19

指定されたオブジェクトを同じ順序で配列にして返すJSのObject.values()メソッドについて知ることができました。

knockoutのforeachバインディングが動かずデバッグした結果、回そうとしていたものがオブジェクトでした。なので、配列に変換しましたが、その際に使いました

2024-3-22

クエリログのZ以降の数値(クエリID?)の次に表示されている数字が、同一クエリID内におけるクエリ順序を表していることを知りました。

2024-3-25

ファイル操作での「シーク」について知ることができました。

  • ファイル操作での「シーク」とは、ファイル内の特定の位置にアクセスポインタを移動させることを指す
  • これにより、ファイルの任意の位置からデータの読み書きを開始することができる
  • ファイルの先頭からのバイト数を指定して、その位置にアクセスポインタを設定する
  • シーク機能は、大きなファイルを扱う時や、ファイルの特定のセクションに直接アクセスする必要がある場合に非常に便利
2024-3-26

擬似乱数生成器(PRNG, Pseudo Random Number Generator)における「シード(seed)」について知ることができました

  • シードとは、乱数生成の開始点となる初期値のこと
  • 擬似乱数生成器は、本質的には決定論的なアルゴリズムであり、同じシード値を用いれば、同じ乱数の系列を生成することが可能
  • シードの主な役割は、乱数生成プロセスにおける「ランダム性」の源となること
  • 異なるシード値を使うことで、異なる乱数の系列が生成される
  • シードが同じであれば、どのプラットフォーム上でも、どの言語の擬似乱数生成器を使用しても、生成される乱数の系列は同じになる
  • より予測不可能な乱数系列を生成するためには、UNIXタイムスタンプをシード値として利用することが一般的
  • プログラムが異なる時刻に実行されるたびに、異なる乱数系列が得られるため、結果として得られる乱数の「ランダム性」が向上する
2024-3-29

rebaseやrevertで何か問題が発生したときに備えて、ブランチのバックアップをとっておいた方が良い場面があるかと思いますが、この時のバックアップ方法として、rebaseやrevertを行うブランチから新たにブランチを切るという方法は、非常に手軽で良いバックアップ方法だと感じました。