Ruby 3.1 を install した

Ruby で何かやろうと思ったけどせっかくなので新しい方をinstallしてみた

色々引っかかったのでもうこれ記事でいいなって思ったので書いた

1年ぶりくらいの brew upgrade rbenv

  • 結構時間かかった
  • 色々アップデートされてたけどウインドウ閉じちゃって見返せないので割愛

rbenv install --list 打ってみる

> rbenv install --list
2.6.10
2.7.6
3.0.4
3.1.2
jruby-9.3.9.0
mruby-3.1.0
picoruby-3.0.0
rbx-5.0
truffleruby-22.3.0
truffleruby+graalvm-22.3.0

Only latest stable releases for each Ruby implementation are shown.
Use 'rbenv install --list-all / -L' to show all local versions.

3.1系の最新は3.1.2なので落としてみる

rbenv install 3.1.2

Installing ruby-3.1.2...
ruby-build: using readline from homebrew
ruby-build: using gmp from homebrew

BUILD FAILED (macOS 11.6.8 using ruby-build 20221101)

Last 10 log lines:
compiling dln.c
compiling localeinit.c
In file included from yjit.c:158:
./yjit_iface.c:17:10: fatal error: 'capstone/capstone.h' file not found
#include <capstone/capstone.h>
         ^~~~~~~~~~~~~~~~~~~~~
compiling array.c
1 error generated.
make: *** [Makefile:434: yjit.o] Error 1
make: *** Waiting for unfinished jobs....

早速のError

まぁ久しぶりだしね・・・

./yjit_iface.c:17:10: fatal error: 'capstone/capstone.h' file not found

エラーの原因はcapstoneとやらが無いからのようで・・・

yjit_iface.cこれが噂のYJITか・・・!

capstoneはディスアセンブラフレームワークらしい

YJITはこれを使ってるってことなのか

www.capstone-engine.org

brew install capstoneを打ってみるが既に入っている

ググってみると以下を発見

github.com

あ、なるほど、CFLAGSとLDFLAGS渡してあげればいいのか

/usr/local/Cellar以下に入っていたので

$ export CFLAGS="-I/usr/local/Cellar/capstone/4.0.2/include"
$ export LDFLAGS="-L/usr/local/Cellar/capstone/4.0.2/lib"

これで通ってそう...と思ったらまた新たなエラーを踏む

/private/var/folders/6j/q4gjr83j1kn6y1gszxjwdzdh0000gn/T/ruby-build.20221115235314.327.LDBVvA/ruby-3.1.2/lib/fileutils.rb:240:in `mkdir': Permission denied @ dir_s_mkdir - /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/Users (Errno::EACCES)
    from /private/var/folders/6j/q4gjr83j1kn6y1gszxjwdzdh0000gn/T/ruby-build.20221115235314.327.LDBVvA/ruby-3.1.2/lib/fileutils.rb:240:in `fu_mkdir'
    from /private/var/folders/6j/q4gjr83j1kn6y1gszxjwdzdh0000gn/T/ruby-build.20221115235314.327.LDBVvA/ruby-3.1.2/lib/fileutils.rb:221:in `block (2 levels) in mkdir_p'
    from /private/var/folders/6j/q4gjr83j1kn6y1gszxjwdzdh0000gn/T/ruby-build.20221115235314.327.LDBVvA/ruby-3.1.2/lib/fileutils.rb:219:in `reverse_each'
    from /private/var/folders/6j/q4gjr83j1kn6y1gszxjwdzdh0000gn/T/ruby-build.20221115235314.327.LDBVvA/ruby-3.1.2/lib/fileutils.rb:219:in `block in mkdir_p'
    from /private/var/folders/6j/q4gjr83j1kn6y1gszxjwdzdh0000gn/T/ruby-build.20221115235314.327.LDBVvA/ruby-3.1.2/lib/fileutils.rb:211:in `each'
    from /private/var/folders/6j/q4gjr83j1kn6y1gszxjwdzdh0000gn/T/ruby-build.20221115235314.327.LDBVvA/ruby-3.1.2/lib/fileutils.rb:211:in `mkdir_p'
    from ./tool/rbinstall.rb:218:in `makedirs'
    from ./tool/rbinstall.rb:331:in `prepare'
    from ./tool/rbinstall.rb:432:in `block in <main>'
    from ./tool/rbinstall.rb:1127:in `block in <main>'
    from ./tool/rbinstall.rb:1124:in `each'
    from ./tool/rbinstall.rb:1124:in `<main>'
make: *** [uncommon.mk:383: do-install-all] Error 1

Permission denied !?何故?全然わからん

ググってみると同じような状態の人が見つかる

github.com

@BytesGuy Do you have this line export SDKROOT=$(xcrun -sdk macosx --show-sdk-path) in .barhrc or .zshrc?

For me, after i comment this line out, it works fine.

ドンピシャでこれだった

.zshrcexport SDKROOT="$(xcrun --sdk macosx --show-sdk-path)"コメントアウトすることで解決

これって何で入れたやつだっけ?

これからは.zshrcに何か書き足すときはコメント入れることにしよう・・・

無事インストール完了

FaradayでSlackにファイルアップロードする

リハビリ記事

目的

SlackにCSVファイルを投げつけたかった

はじめに

以下を参考にSlack Appを作成し、Tokenを取得 qiita.com

files.uploadを読んでみる api.slack.com とりあえずCSVファイルが投げれれば良かったのでsystemで書いてみる

  system("curl -F file=@#{file_path} -F channels=#{channel_id} -F token=#{token} -F initial_comment=#{comment}  https://slack.com/api/files.upload")

書いてみたものの他でも使うかもしれないのでもうちょっとちゃんと書くことにする

Faraday使った実装

lostisland.github.io 不真面目なのでとりあえず楽そうに書いてみる

require "faraday"

class SlackFileUploadService
  def self.file_upload(file_path:, channel_id:, comment:)
    faraday = Faraday.new(url: "https://slack.com")

    token = Token # 取得したtoken
    
    faraday.post("api/files.upload", file: file_parh, channels: channel_id, token: token, initial_comment: comment)
  end
end

SlackFileUploadService.file_upload(file: file_path, channel_id: channel_id, comment: comment)

エラーが返ってきた

{"ok":false,"error":"no_file_data"}

どうやらFilePath投げるだけじゃダメらしい

ファイルの送信方法でググってみる

こちらを見るとFaraday::UploadIO使わないといけないらしい crieit.net

再度チャレンジ

今度はfileで一度Faraday::UploadIOで受けてから実行

require "faraday"

class SlackFileUploadService
  def self.file_upload(file_path:, channel_id:, comment:)
    faraday = Faraday.new(url: "https://slack.com")

    token = Token
    file = Faraday::UploadIO.new(file_path, "text/plain")
    
    faraday.post("api/files.upload", file: file, channels: channel_id, token: token, initial_comment: comment)
  end
end

SlackFileUploadService.file_upload(file: file_path, channel_id: channel_id, comment: comment)

変わらずエラー

{"ok":false,"error":"no_file_data"}

そもそもcurl-Fってなんだと思い調べてみる www.y-hakopro.com

-Fオプション使用時のContent-Typeはデフォルトで「multipart/form-data」が指定される。

ここでmultipart/form-dataというワードを入手した

multipartというワードを入手した状態で改めてfile uploadをググっていると stackoverflow.com どうやらFaraday.newの際に色々指定しなければいけないらしい

指定している内容はググると詳しそうなページが当たった

(たくさんタメになりそうな事書かれていそうなので後で全部読んでおきたい) nekorails.hatenablog.com

再再チャレンジ

require "faraday"

class SlackFileUploadService
  def self.file_upload(file_path:, channel_id:, comment:)
    faraday = Faraday.new(url: "https://slack.com") do |f|
      f.request :multipart
      f.request :url_encoded
      f.adapter Faraday.default_adapter
    end

    token = Token
    file = Faraday::UploadIO.new(file_path, "text/plain")
    
    faraday.post("api/files.upload", file: file, channels: channel_id, token: token, initial_comment: comment)
  end
end

SlackFileUploadService.file_upload(file: file_path, channel_id: channel_id, comment: comment)

成功!

{"ok":true,"file":以下略}

無事SlackにもCSVが投下されました

めでたし

AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー 読みメモ6

VPC

CIDR

  • Classless Inter-Domain Routing
  • 10.0.0.0/16 のようにIPアドレスの範囲を定義し、使うことができる

サブネット

  • VPCで設定したアドレス範囲をサブネットに分けて定義する

インターネットゲートウェイ

  • VPCとパブリックインターネットを接続するためのゲートウェイ
  • VPCにつき1つ作成することができる
  • インターネットゲートウェイ自体が水平スケーリングによる冗長性と高い可用性を持っているため、単一障害点にはならない

ルートテーブル

  • サブネットの経路を設定する
  • VPCを作成したときにメインルートテーブルというルートテーブルができている

パブリックサブネットとプライベートサブネット

  • サブネットを多く作り細かく分けていくと煩雑になる
  • 特別な要件がない最小構成は各アベイラビリティゾーン2つの役割でサブネットを分割する
  • パブリックサブネット
    • インターネットに対して直接ルートを持つ
  • プライベートサブネット
    • インテ〜ネットに対してルートを持たない

セキュリティグループ

ネットワークACL

CloudFront

  • 世界中に150箇所以上あるエッジロケーションを使い、最も低いレイテンシーでコンテンツを配信できるコンテンツ配信ネットワーク
  • CDN
  • エッジロケーションにキャッシュを持つことで低レイテンシーでの配信が可能となる
  • ドメイン証明書を設定でき、HTTPSのアクセスを受けることができる
  • AWS Certificate Manager を使用することで追加費用無しで作成、管理できる
  • AWS Shield, AWS WAF などと組み合わせることで外部からの攻撃や驚異からオリジナルコンテンツを保護できる

Route 53

  • DNS サービス
  • シンプルルーティング
    • 問い合わせに対して単一のIPアドレス情報を回答するシンプルなルーティング
  • レイテンシベースのルーティング/Geo DNS
    • 1つのドメインに対して複数のDNSレコードを用意し、地理的な場所を近くしてレイテンシーが低くなるようにルーティングする
  • 加重ラウンドロビン
    • 1つのドメインに対して複数のDNSレコードを用意し割合を決める
  • 複数値回答
    • 複数のレコードからランダムに回答
  • プライマリとセカンダリを用意しプライマリのヘルスチェックが失敗したときにセカンダリのレコードを回答するようにできる
  • エイリアスも設定でき、Zone Apex と呼ばれるトップレベルのルートドメインにも設定できる

AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー 読みメモ5

EBS

EC2インスタンスのボリュームとして使用

  • EC2と同様に不要になればいつでも削除できる

アベイラビリティゾーン内でレプリゲート

ボリュームタイプの変更が可能

  • 汎用SSDの性能は最大でも1600IOPSかつ一定の性能を約束するものではない
  • IOPS は、1秒あたりのI/Oアクセス数
  • プロビジョンドIOPSでは、最大値は6400IOPS、そして最小のIOPSを設定できる
  • コストを節約したい場合は、スループット最適化HDDが選択できる
  • さらにアクセス頻度が低い場合はCold HDDを検討できる
  • HDDの2つはルートボリュームとしては使用できず、追加ボリュームとして使用できる
  • 使用し始めた後からでも変更可能

容量の変更が可能

  • EBS は確保しているストレージ容量に対して課金が発生する

高い耐久性のスナップショット

  • EBS は同じアベイラビリティゾーン内の複数サーバー間で自動的にレプリゲートされているので、アベイラビリティゾーンが使えなくなった場合EBSも使えなくなる
  • EBSのスナップショットを作成するとS3の機能を使って保存されるのでアベイラビリティゾーンの複数の施設で自動的に冗長化される
  • S3の耐久性はイレブンナインなので、EBSのスナップショットもイレブンナインとなる

ボリュームの暗号化

  • EBSの暗号化を有効化すればボリュームが暗号化される
  • スナップショットも暗号化される

永続的ストレージ

S3

  • Amazon Simple Storage Service
  • インターネット対応の完全マネージド型のオブジェクトストレージ

無制限のストレージ容量

- S3では保存したいデータ容量を先に決めておく必要はない - バケットというデータの入れ物を作ればデータを保存し始めることができる - 1つのファイル5TBまで

高い耐久性

  • S3は1つのリージョン内の複数のアベイラビリティゾーンにまたがって自動的に冗長化して保存される
  • S3の耐久性はイレブンナイン

インターネット経由でアクセス

  • 世界中のどこからでもアクセスできる
  • マネジメントコンソール、AWS CLISDKAPIからもアクセスできる

S3のセキュリティ

  • 作成時点ではプライベート
  • 必要に応じてアクセス権の付与や、インターネットへ公開を設定できる
  • アクセスコントロールリスト
    • 他の特定のAWSアカウントにオブジェクトの一覧を許可
    • 他の特定のAWSアカウントにオブジェクトの書き込みを許可
    • 他の特定のAWSアカウントにオブジェクトの読み取りを許可
    • 誰にでもオブジェクトの一覧を許可
    • 誰にでもオブジェクトの書き込みを許可
    • 誰にでもオブジェクトの読み取りを許可
    • 上記が設定できる
    • バケットにも個別のオブジェクトにも設定できる
  • バケットポリシー
    • さらに細かい設定ができる
    • 特定のIPアドレスに読み取りアクセスを許可する
  • IAMポリシー
    • AWSサービスにアクセス権を設定できる

通信費・保存データの暗号化

  • 通信中はhttpsでアクセスすることで暗号化される
  • 保存データの暗号化
    • S3のキーを使用したサーバーサイド暗号化
    • KMSを使用したサーバーサイド、クライアントサイド暗号化
    • 独自のキーを使用したサーバーサイド、クライアントサイド暗号化

S3の料金

ストレージ料金

  • 保存しているオブジェクトの容量に対しての料金
  • 1ヶ月全体を通しての平均保存量で料金が算出される
  • ストレージクラスによって料金が変わる
    • 標準
      • ストレージクラスを指定しない場合のデフォルトのストレージクラス
      • ユースケースの例はアプリケーションによって頻繁に利用されるオブジェクトや静的Webコンテンツの配信
    • 低頻度アクセスストレージ
      • アクセスする頻度の少ないオブジェクトを格納することでS3のトータルコストを下げることができる
      • ストレージ料金は安くなるが、リクエスト料金が標準ストレージよりも上がる
      • ユースケースの例はバックアップデータ
    • 1ゾーン低頻度アクセスストレージ
      • アクセスする頻度が少なく、複数のアベイラビリティゾーンに冗長化される可用性を必要としないオブジェクト
      • 複数リージョンにバックアップする場合など該当のS3バケット以外にもデータの複製がある場合に使う
    • Amazon Glacier
      • Amazon Glacierは単独のサービスとしても使用できるアーカイブサービス
      • リアルタイムなアクセスは必要はないが保存しておかなければならないようなアーカイブデータを格納する
      • ユースケースは規約によって保存年数が定められているデータなど
      • アクセスすることはほとんどなくても削除できないデータに最適
      • オブジェクトにアクセスするときは、一度取り出さなくてはならない
      • 取り出しには3-5時間かかる
      • さらに低コストオプションのGlacier Deep Archiveもある
    • ライフサイクルポリシー
      • アップロードした日から起算して自動でストレージクラスを変更するライフサイクルポリシーを設定できる
      • EC2(EBS)には当日のエラーログ、30日間はS3、その後30日間は低頻度アクセス...というように設定できる

リクエスト料金

  • データをダウンロードしたりアップロードしたりするリクエストに対する料金

データ転送料金

  • リージョンの外にデータを転送した場合の料金
  • インターネットへ転送した場合と他リージョンへ転送した場合でも料金は変わる
  • インターネットからS3への転送受信には課金はかからない
  • Cloud Frontへの転送料金は課金対象外

S3のユースケース

  • アプリケーションのデータ保存
  • HTML、画像、動画ファイルなどの静的コンテンツ
  • データバックアップの保存
  • ログデータ、センサーデータなどの保存
  • ビッグデータのステージング(Redshift, Athena, EMR)
  • クロスリージョンレプリケーションによるDR対策

その他ストレージサービス

  • EFS
    • Amazon Elastic File System
    • 複数のEC2インスタンスでマウントして共有利用できるストレージサービス
  • Storage Gateway
    • オンプレミスアプリケーションとAWSのストレージサービスを、シームレスに接続して利用することができるゲートウェイサービス
  • Snowball
    • 物理デバイスを使用してペタバイト級の大容量データ転送を行うことができるサービス
    • 主にオンプレミスからAWSへデータ転送する際に利用する
    • エクサバイト級のデータ転送にはSnowmobileを使用する

AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー 読みメモ4

Auto Scaling

  • 自動でインスタンスをスケーリングしてくれる機能
  • 数の増減でスケーリングすることを水平スケーリング
  • インスタンスそのものの性能を上げることを垂直スケーリング
  • Auto Scalingでは水平スケーリングを自動化する
  • Auto Scaling ポリシー
    • ターゲットポリシー
      • 平均CPU使用率などを決め、自動的に最小値と最大値の間でインスタンスの数を調整する
    • シンプルポリシー
      • CloudWatch のアラームに基づいて Auto Scaling アクションを実行する
      • クールダウンと呼ばれる連続でアクションが発生した際の実行の制限ができる
    • ステップポリシー
      • 複数段階でのインスタンスの追加、削除ができる
      • ウォームアップと呼ばれる頻繁に実行を抑える機能がある。これはインスタンスが必要な数に満たされるまで実行できる
  • ポリシーでの実行だけでなく、時間を指定したスケジュールでの実行も可能
  • インスタンスの構成はステートレスであることが必要

    ブートストラップ

  • インスタンス起動時にコマンドスクリプトを実行してソースコードを最新にする
  • ユーザーデータ
    • 初回起動時に自動実行してデプロイを自動化できる機能
  • メタデータ
    • ユーザーデータの処理の中でインスタンス固有の情報が必要な場合利用する

      Lambda

  • プログラムさえあればプログラムを実行する環境を用意しなくとも実行することができるサービス
  • リクエストやトリガーによって実行されるが、同時に発生した場合それぞれ並列に実行される
  • 設定する性能はメモリ、最長15分のタイムアウト時間

ゼロからのOS自作入門 読みメモ 2章 その5

その4の続き

EFI_MEMORY_DESCRIPTOR構造体

///
/// Definition of an EFI memory descriptor.
///
typedef struct {
  ///
  /// Type of the memory region.
  /// Type EFI_MEMORY_TYPE is defined in the
  /// AllocatePages() function description.
  ///
  UINT32                Type;
  ///
  /// Physical address of the first byte in the memory region. PhysicalStart must be
  /// aligned on a 4 KiB boundary, and must not be above 0xfffffffffffff000. Type
  /// EFI_PHYSICAL_ADDRESS is defined in the AllocatePages() function description
  ///
  EFI_PHYSICAL_ADDRESS  PhysicalStart;
  ///
  /// Virtual address of the first byte in the memory region.
  /// VirtualStart must be aligned on a 4 KiB boundary,
  /// and must not be above 0xfffffffffffff000.
  ///
  EFI_VIRTUAL_ADDRESS   VirtualStart;
  ///
  /// NumberOfPagesNumber of 4 KiB pages in the memory region.
  /// NumberOfPages must not be 0, and must not be any value
  /// that would represent a memory page with a start address,
  /// either physical or virtual, above 0xfffffffffffff000.
  ///
  UINT64                NumberOfPages;
  ///
  /// Attributes of the memory region that describe the bit mask of capabilities
  /// for that memory region, and not necessarily the current settings for that
  /// memory region.
  ///
  UINT64                Attribute;
} EFI_MEMORY_DESCRIPTOR;
  • Type
    • メモリ領域の種別
  • PhysicalStart
    • メモリ領域先頭の物理メモリアドレス
  • VirtualStart
  • NumberOfPages
    • メモリ領域の大きさ
  • Attribute
    • メモリ領域が使える用途を示すビット集合

メモリマップ構造体

struct MemoryMap {
  UINTN buffer_size;
  VOID* buffer;
  UINTN map_size;
  UINTN map_key;
  UINTN descriptor_size;
  UINT32 descriptor_version;
}

メモリマップのファイルへの保存

  • Main.cのメモリマップのファイルへの保存部
  CHAR8 memmap_buf[4096 * 4]; // メモリマップを確保
  struct MemoryMap memmap = {sizeof(memmap_buf), memmap_buf, 0, 0, 0, 0};
  GetMemoryMap(&memmap); // メモリマップを取得、gBS->GetMemoryMapに値が入る

  EFI_FILE_PROTOCOL* root_dir;
  OpenRootDir(image_handle, &root_dir); // 書き込み先のファイルを開く。存在しなければ新規作成。これはルートディレクトリを開いている。

  EFI_FILE_PROTOCOL* memmap_file;
  root_dir->Open(
      root_dir, &memmap_file, L"\\memmap",  // root_dir を開いている。ファイル名はmemmap
      EFI_FILE_MODE_READ | EFI_FILE_MORE_WRITE | EFI_FILE_MORE_CREATE, 0); // 読み|書き|作成モードでオープン

  SaveMemoryMap(&memmap, memmap_file); // ここで取得したメモリマップを保存する
  memmap_file->Close(memmap_file); // ファイルを閉じる

以下追ったコード

  • EFI_FILE_PROTOCOL
/// The EFI_FILE_PROTOCOL provides file IO access to supported file systems.
/// An EFI_FILE_PROTOCOL provides access to a file's or directory's contents,
/// and is also a reference to a location in the directory tree of the file system
/// in which the file resides. With any given file handle, other files may be opened
/// relative to this file's location, yielding new file handles.
///
struct _EFI_FILE_PROTOCOL {
  ///
  /// The version of the EFI_FILE_PROTOCOL interface. The version specified
  /// by this specification is EFI_FILE_PROTOCOL_LATEST_REVISION.
  /// Future versions are required to be backward compatible to version 1.0.
  ///
  UINT64                Revision;
  EFI_FILE_OPEN         Open;
  EFI_FILE_CLOSE        Close;
  EFI_FILE_DELETE       Delete;
  EFI_FILE_READ         Read;
  EFI_FILE_WRITE        Write;
  EFI_FILE_GET_POSITION GetPosition;
  EFI_FILE_SET_POSITION SetPosition;
  EFI_FILE_GET_INFO     GetInfo;
  EFI_FILE_SET_INFO     SetInfo;
  EFI_FILE_FLUSH        Flush;
  EFI_FILE_OPEN_EX      OpenEx;
  EFI_FILE_READ_EX      ReadEx;
  EFI_FILE_WRITE_EX     WriteEx;
  EFI_FILE_FLUSH_EX     FlushEx;
};

サポートされているファイルシステムへのファイルIOアクセスを提供している

  • OpenRootDir
    • Main.cで定義したOpenRootDir
EFI_STATUS OpenRootDir(EFI_HANDLE image_handle, EFI_FILE_PROTOCOL** root) {
  EFI_LOADED_IMAGE_PROTOCOL* loaded_image;
  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL* fs;

  // handle のチェック
  gBS->OpenProtocol(
      image_handle,
      &gEfiLoadedImageProtocolGuid,
      (VOID**)&loaded_image,
      image_handle,
      NULL,
      EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);

  gBS->OpenProtocol(
      loaded_image->DeviceHandle,
      &gEfiSimpleFileSystemProtocolGuid,
      (VOID**)&fs,
      image_handle,
      NULL,
      EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);

  // root を開く
  fs->OpenVolume(fs, root);

  return EFI_SUCCESS;
}
  • EFI_OPEN_PROTOCOL
/**
  Queries a handle to determine if it supports a specified protocol. If the protocol is supported by the
  handle, it opens the protocol on behalf of the calling agent.

...
**/
typedef
EFI_STATUS
(EFIAPI *EFI_OPEN_PROTOCOL)(
  IN  EFI_HANDLE                Handle,
  IN  EFI_GUID                  *Protocol,
  OUT VOID                      **Interface, OPTIONAL
  IN  EFI_HANDLE                AgentHandle,
  IN  EFI_HANDLE                ControllerHandle,
  IN  UINT32                    Attributes
  );

handleが指定されたプロトコルをサポートしているかどうかを判別する

  • OpenVolume
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_OPEN_VOLUME OpenVolume;
/**
  Open the root directory on a volume.
...
**/
typedef
EFI_STATUS
(EFIAPI *EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_OPEN_VOLUME)(
  IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL    *This,
  OUT EFI_FILE_PROTOCOL                 **Root
  );

rootディレクトリを開く

  • EFI_FILE_OPEN
/**
  Opens a new file relative to the source file's location.
...
**/
typedef
EFI_STATUS
(EFIAPI *EFI_FILE_OPEN)(
  IN EFI_FILE_PROTOCOL        *This, // ファイルを開く場所
  OUT EFI_FILE_PROTOCOL       **NewHandle, // 開いたファイル?
  IN CHAR16                   *FileName, // 開くファイルの名前
  IN UINT64                   OpenMode, // 作成読み書きのモード指定
  IN UINT64                   Attributes
  );

指定したファイルを開く

  • EFI_FILE_CLOSE
/**
  Closes a specified file handle.
...
**/
typedef
EFI_STATUS
(EFIAPI *EFI_FILE_CLOSE)(
  IN EFI_FILE_PROTOCOL  *This
  );

指定したファイルを閉じる

ペース遅いけどSaveMemoryMap次追います

AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー 読みメモ3

EC2

  • Elastic Compute Cloud
  • 必要な時に必要なだけインスタンスを稼働させることができる
  • 使用した分だけコストが発生
    • EC2稼働に対しての料金
    • データ転送料金
      • リージョンの外にデータを転送した場合料金が発生する
      • インターネットからEC2へのデータ受信は料金発生しない
      • AZ が異なるEC2への転送の場合料金発生する
    • ストレージ料金
      • 厳密にはEC2ではなくEBSへの課金となる
      • 1GBあたりのプロビジョニングした料金
      • プロビジョニングとはボリュームのサイズとして確保した容量
  • インスタンスタイプという性能の組み合わせから選べる
    • インスタンスタイプの例
      • t2.micro
        • t はファミリー
        • 2は世代
        • microはサイズ
      • ファミリー
        • インスタンスユースケース
        • T: 汎用、検証
        • M: 汎用
        • C: コンピューティング
        • X, R: メモリ最適化
        • P, F, G: 最速コンピューティング
        • H, I, D: ストレージ最適化
      • サイズは性能の大きさ
        • vCPU, メモリ, ネットワーク, ストレージ性能, 使用できるストレージなどが決まる

          ELB

  • Elastic Load Balancing
  • ユーザーからのリクエストラフィックを複数のインスタンスに分散する
    • 異なるAZにも対応しているため、1つのAZが丸ごと障害発生してもシステムを継続することができる
  • ロードバランサータイプ
    • Application Load Balancer
      • HTTP, HTTPSのリクエストを負荷分散する
      • Webアプリケーションに対しての機能が提供されている
    • Network Load Balancer
    • Classic Load Balancer
      • Application Load Balancer, Network Load Balancer以前のタイプ
      • 互換性のために残されている
  • ヘルスチェック
  • ELB は通過するトラフィックが増えると自動的にノードが増えるため単一障害点とならない
  • クロスゾーン負荷分散
    • 異なるAZにELBを設定すると実体としては各AZに配置されるが、異なるAZへの負荷分散も行われる