カテゴリー: programming

terraformingを試す

AWSの管理にterraformを導入したいけれど、既存のリソースはもうすでに存在しちゃっているということは、まあよくあると思います。手で tf ファイルと tfstate ファイルをいじればなんとかやってやれないことはないですが、幸いなことにこれを支援してくれるツールが存在します。それが terraforming です。

terrraforming の導入

terraforming を取ってくる Gemfile 書いて bundle install すれば、おk。

terraforming の使い方

とても簡単。bundle exec terraforming [service_name] --profile=[$PROFILE]で既存のawsの構成通りのtfファイルのコードを生成してくれます。以下のような具合。

これを tf ファイルに追記すればよいのですが、 tfstate にこれらのリソースがあることが記されていないため、このまま plan, apply をすると既存のものを無視して構築を始めてしまいます。これを防ぐためには tfstate を適切に更新して、 plan で差分が出ない状況に持っていく必要があります。そこで terraforming iam --profile default --tfstate --merge=./terraform.tfstate とすると既存の tfstate に既存のAWSインフラの state を追記してもらえます。こわければ tfstate の backup を取っておいたほうが良いかと思います。

とても良いですねー。

terraformを試す

terraformのチュートリアルを見ながら、いろいろ試してみた記録その1。結構使い勝手はよさそうなので、こういうツールでちゃんとAWSのリソースを管理していきたい。

terraform の導入

導入は brew install terraform で OK

EC2インスタンスを立てる, 更新する, 破棄する

とりあえず簡単なところから。以下のファイルを example.tf という名前で作成する。

で、 terraform plan を実行するとこれからAWSに対して何を行うのかを表示してくれる。なにもないまっさらな状態であれば以下のような出力になるだろう。

terraform apply を実行すると、実際にリソースが作成される。さっきの example.tf を編集してたとえば t1.micro にして、 terraform plan をするとちゃんと instance_type に差分がでる旨の表示が出る。スタックの削除は terraform destroy で行ける。

リソースの依存性を扱う

以下のように、Elastic IPを設定する。Elastic IPに対するパラメタは instance しかない。そこには ${aws_instance.example.id} とあるがこれは、 EC2 インスタンスのidが埋め込まれる変数の役割を持つ。

もうすでに EC2 インスタンスは立ち上がっており、 aws_eip の部分だけ追記をして terraform plan を実行すると以下のようになり、この挙動がわかりやすい。

プロビジョニング

以下のように provisioner 内の command を設定することによりプロビジョニングを行える

まっさらな状態でこれを実行すると、file.txtがちゃんと生成される

変数

variables.tf なるファイルを作る

そして、example.tf の provider を以下のように変えてみよう

variables.tf で定義してある region についての挙動はもうおわかりだろう。問題は access_keysecret_key であるが、これは default が設定されていないので apply 時に渡す。たとえば terraform apply -var 'access_key=...' -var 'secret_key=...' のような具合だ。

また conf ファイルから読み込みたければ、たとえば dev.tfvars という名前で以下のようなファイルを作成し terraform apply -var-file ./dev.tfvars を実行すれば良い。

環境変数からの呼び出しは TF_VAR_access_key などという名前をつければいける。

出力

terraform apply を実行した結果のうち、重要な値の出力を得たい場合は以下のような形のコードを書けばよい

すると apply 時に以下のような出力が得られる

またapply後に出力だけ得たい場合は terraform output ip などとすれば良い。

Cのコードがどのように処理されるのか

プリプロセッシング

空のファイルのプリプロセッシングを進めてみる

続いて、簡単なコードを書いてみた上で…

#define を使って見ると…

#include の動きは単純にソースコードをガバッと持ってくるだけ。コメントの除去とかもこのタイミングの模様。

コンパイル

プリプロセッサの出力をソースにしてアセンブリコードを生成する。
空のプログラムを流してみる

続いて int i = 1; とだけ書かれたコード

さすがにつまらん…。単純な関数とかはこんな感じ。まあここらへんは別の記事とかで…。

アセンブル

アセンブリコードからバイナリの生成を行うフェーズ。

あっ、ハイ…って感じだ。次のコードを試してみる。

リンク

実行可能なバイナリにする。ライブラリや他の必要なコードとの結合を行う。

参考にしたページ

ありがとうございます 🙏

電卓を作る

プログラミング言語を作るの2章を読み進めた記録。興味があったけど手を出せずにいた自作プログラミング言語ですが、この記事を読んでまあつべこべ言わず手を動かそうと決心して、コードを書き始めた。成果物はここにあります。

処理系のうごき

プログラミング言語の処理系は通常以下のような流れで動く

  1. 字句解析: ソースコードをトークンの並びに分割する。字句解析を行うプログラムのことをレキシカルアナライザと呼ぶ。
  2. 構文解析: トークンの並びから抽象構文木を構築する。構文解析を行うプログラムのことをパーサと呼ぶ。
  3. 意味解析: 抽象構文木に対して、データ型などの意味的な解釈を行う。
  4. コード生成: 機械語やバイトコードなどを吐き出す

電卓プログラムの字句解析

lex というレキシカルアナライザを自動生成してくれるツールを使う。UNIX系のOSであれば最初から入っていることが多い。定義には正規表現を使う。

電卓プログラムの構文解析

yacc というパーサを自動生成してくれるツールを使う。

構文規則だけを抜き出すと以下のような感じ?

動かす

Makefile を書いた

以下のような感じ

コマンドラインから、温かみのある手動ビルドをしたいときは以下のような具合

shift と reduce

パーサーのうごきをちゃんと押さえておく。1 + 2 * 3 という入力があったときの動きは以下の通り。

  1. 1 (shift) next: AND
  2. primary_expression (reduce) next: AND
  3. term (reduce) next: AND
  4. expression (reduce) next: AND
  5. expression AND (shift) next: 2
  6. expression AND 2 (shift) next: MUL
  7. expression AND primary_expression (reduce) next: MUL
  8. expression AND term (reduce) next: MUL
  9. expression AND term MUL (shift) next 3
  10. expression AND term MUL 3 (shift) next CR
  11. expression AND term MUL primary_expression (reduce) next CR
  12. expression AND term (reduce) next CR
  13. expression (reduce) next CR
  14. expression CR (shift)
  15. line (reduce)
  16. line_list (reduce)

スタックの動き

  • 2 * 3 を reduce する際は、 term := term MUL primary_expression { $$ = $1 * $3; } の規則に従う
  • $1 = 2, $2 = *, $3 = 3 として、 新しい term には $$ = 2 * 3 が格納される
  • {} を書かなかった場合は $$ = $1 が補われる
  • つまり 1 => primary_expression($$ = 1) => term($$ = 1) => expression($$ = 1) みたいな感じになっている

管理ポリシーとインラインポリシーの違い

参考: http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_managed-vs-inline.html

管理ポリシー

  • AWS管理ポリシーとカスタマー管理ポリシーに分かれる
  • AWS管理ポリシーはよく見る 〜〜〜FullAccess とかそういうやつ
  • カスタマー管理ポリシーはそれを自分で作れる模様
  • 複数のユーザー/グループ/ロール(この3つを合わせてプリンシパルエンティティというらしい)にアタッチできるという特徴がある
  • ロールバックできる
  • バージョン管理してくれる
  • IAM内のARNを持つスタンドアロンな存在

インラインポリシー

  • 単一のユーザー/グループ/ロールにしかアタッチできない

インラインポリシーは、ポリシーとそれが適用されているプリンシパルエンティティとの厳密な 1 対 1 の関係を維持する必要がある場合に便利です。たとえば、ポリシー内のアクセス権限が意図したプリンシパルエンティティ以外のエンティティに間違って割り当てられないようにする必要がある場合などです。インラインポリシーを使用すると、ポリシーのアクセス権限が間違ったプリンシパルエンティティにアタッチされることはありません。また、AWS マネジメントコンソールを使用してプリンシパルエンティティを削除すると、プリンシパルエンティティに埋め込まれたポリシーもその一部として削除されます。

バージョン管理・ロールバック、強さあるし、カスタマー管理ポリシー強い

Swift3について色々まとめていくスレ

String を Data に変換する

色々実験したスクショ

スクリーンショット 2016-08-12 18.50.49

C++メモ

  • struct/classの違い➡︎デフォルトの可視性
  • 基本的にすべて値型
  • const は signature に含まれる
  • 抽象クラスを作るときは必ずデストラクタを作る

厨二病

virtual 継承とそうでないものの違い

superクラスのコンストラクタを取り込む

Swift1系脳で出来ないと思い込んでいたことができるようになっていた件

再帰的構造を持つ enum

Swift 1 系では、再帰的構造を持つ enum を定義することはできませんでした。たとえば、

というコードを書くと、Swiftの処理系は受け付けてくれません。しかしながら、Swift2はとても素晴らしい indirect という修飾子を導入することにより、再帰的構造を持つ enum を定義できるようになりました。

また、挙動的に面白いのが、再帰的構造を持つが即座に評価されないようになっている場合、たとえば以下のような遅延ストリームについては、indirect 修飾子がなくても動くのです。これは Swift 1 系のときに挙動を試してないので、どうだったかわかりませんが、Xcode ダウンロードするのめちゃめちゃ時間掛かるし重いのでだれか試して欲しい。

にゃ〜ん…って感じですね?

関数内に定義した関数の再帰呼び出し

まあコードみればわかると思うけど、以下のようなコードが Swift 1 系では動かなかった(記憶がある…)。間違っていたらごめんなさい。でも関数内に定義した関数なんて、再帰呼び出しにくらいしか使わなくないですか?と半ギレした記憶があるので多分ほんとに動かなかったと思う。Swift2でやっと動くようになりました。

Swift 最高!!!!!!(大嘘)