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か・・・!
YJITはこれを使ってるってことなのか
brew install capstone
を打ってみるが既に入っている
ググってみると以下を発見
あ、なるほど、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 !?何故?全然わからん
ググってみると同じような状態の人が見つかる
@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.
ドンピシャでこれだった
.zshrc
のexport 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
AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー 読みメモ5
EBS
EC2インスタンスのボリュームとして使用
- EC2と同様に不要になればいつでも削除できる
アベイラビリティゾーン内でレプリゲート
- EBS は同じアベイラビリティゾーンの複数サーバー間で自動的にレプリゲートされる
ボリュームタイプの変更が可能
- 汎用SSDの性能は最大でも1600IOPSかつ一定の性能を約束するものではない
- IOPS は、1秒あたりのI/Oアクセス数
- プロビジョンドIOPSでは、最大値は6400IOPS、そして最小のIOPSを設定できる
- コストを節約したい場合は、スループット最適化HDDが選択できる
- さらにアクセス頻度が低い場合はCold HDDを検討できる
- HDDの2つはルートボリュームとしては使用できず、追加ボリュームとして使用できる
- 使用し始めた後からでも変更可能
容量の変更が可能
- EBS は確保しているストレージ容量に対して課金が発生する
高い耐久性のスナップショット
- EBS は同じアベイラビリティゾーン内の複数サーバー間で自動的にレプリゲートされているので、アベイラビリティゾーンが使えなくなった場合EBSも使えなくなる
- EBSのスナップショットを作成するとS3の機能を使って保存されるのでアベイラビリティゾーンの複数の施設で自動的に冗長化される
- S3の耐久性はイレブンナインなので、EBSのスナップショットもイレブンナインとなる
ボリュームの暗号化
- EBSの暗号化を有効化すればボリュームが暗号化される
- スナップショットも暗号化される
永続的ストレージ
- EBSはインスタンスのホストとは異なるハードウェアで管理されている
- インスタンスを一度停止して再度開始したときもEBSのデータは残る
- インスタンスストアはEC2インスタンスが起動している時のみデータを保持している
- インスタンスストアをルートボリュームとして起動できるAMIもあるが、その場合起動したEC2インスタンスを停止することはできない
S3
- Amazon Simple Storage Service
- インターネット対応の完全マネージド型のオブジェクトストレージ
無制限のストレージ容量
- S3では保存したいデータ容量を先に決めておく必要はない - バケットというデータの入れ物を作ればデータを保存し始めることができる - 1つのファイル5TBまで
高い耐久性
インターネット経由でアクセス
S3のセキュリティ
- 作成時点ではプライベート
- 必要に応じてアクセス権の付与や、インターネットへ公開を設定できる
- アクセスコントロールリスト
- バケットポリシー
- さらに細かい設定ができる
- 特定のIPアドレスに読み取りアクセスを許可する
- IAMポリシー
- AWSサービスにアクセス権を設定できる
通信費・保存データの暗号化
- 通信中はhttpsでアクセスすることで暗号化される
- 保存データの暗号化
- S3のキーを使用したサーバーサイド暗号化
- KMSを使用したサーバーサイド、クライアントサイド暗号化
- 独自のキーを使用したサーバーサイド、クライアントサイド暗号化
S3の料金
ストレージ料金
- 保存しているオブジェクトの容量に対しての料金
- 1ヶ月全体を通しての平均保存量で料金が算出される
- ストレージクラスによって料金が変わる
リクエスト料金
- データをダウンロードしたりアップロードしたりするリクエストに対する料金
データ転送料金
- リージョンの外にデータを転送した場合の料金
- インターネットへ転送した場合と他リージョンへ転送した場合でも料金は変わる
- インターネットからS3への転送受信には課金はかからない
- Cloud Frontへの転送料金は課金対象外
S3のユースケース
- アプリケーションのデータ保存
- HTML、画像、動画ファイルなどの静的コンテンツ
- データバックアップの保存
- ログデータ、センサーデータなどの保存
- ビッグデータのステージング(Redshift, Athena, EMR)
- クロスリージョンレプリケーションによるDR対策
その他ストレージサービス
AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー 読みメモ4
Auto Scaling
- 自動でインスタンスをスケーリングしてくれる機能
- 数の増減でスケーリングすることを水平スケーリング
- インスタンスそのものの性能を上げることを垂直スケーリング
- Auto Scalingでは水平スケーリングを自動化する
- 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
- 必要な時に必要なだけインスタンスを稼働させることができる
- 使用した分だけコストが発生
- インスタンスタイプという性能の組み合わせから選べる
- Elastic Load Balancing
- ユーザーからのリクエストトラフィックを複数のインスタンスに分散する
- 異なるAZにも対応しているため、1つのAZが丸ごと障害発生してもシステムを継続することができる
- ロードバランサータイプ
- ヘルスチェック
- ELB は通過するトラフィックが増えると自動的にノードが増えるため単一障害点とならない
- クロスゾーン負荷分散
- 異なるAZにELBを設定すると実体としては各AZに配置されるが、異なるAZへの負荷分散も行われる