コードリーディング: aws/aws-lambda-go
おおまかな動きを知るために、ざっとコードリーディング。
- コードリーディング aws/aws-lambda-go
- 正式に AWS Lambda で Go 言語がサポートされた。同時に、Go 言語で使うためのライブラリも GitHub に公開された。そのライブラリが https://github.com/aws/aws-lambda-go
- このライブラリがどのようなものかを知るために、このソースコードを読んでみる。
- 全体の流れとしては、aws/aws-lambda-go を import し、 自作の関数を作り、lambda.Start() に関数を渡す。これをコンパイルして、実行ファイルを zip に圧縮し、Lambda にデプロイするという手順となっている。
- lambda.Start() に登録する関数を、ユーザー定義関数とする
- GOOS=linux との指定から、実行ファイルは Linux の 64bit
- 以下に
Note that only 64-bit binaries are supported on AWS Lambda.
と記述があるから、32bitではない- Ref. Lambda Execution Environment and Available Libraries - AWS Lambda https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html
- 以下に
- AWS Lambda からの呼び出し
- AWS Lambda はzipから実行ファイルを取り出し、実行しているだけ?
- Using Global State to Maximize Performance より、init() が使える
- Lambda Function Handler (Go) - AWS Lambda https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/go-programming-model-handler-types.html
- lambda.Start() に登録できる関数の型は以下の通り
- https://github.com/aws/aws-lambda-go/blob/master/lambda/entry.go#L25-L33
- func ()
- func () error
- func (TIn) error
- func () (TOut, error)
- func (TIn) (TOut, error)
- func (context.Context) error
- func (context.Context, TIn) error
- func (context.Context) (TOut, error)
- func (context.Context, TIn) (TOut, error)
- https://github.com/aws/aws-lambda-go/blob/master/lambda/entry.go#L25-L33
- lambda.Start() でやっていること
- ユーザー定義関数の処理をする RPC 通信をする TCP サーバーを起動している
- ポート番号は環境変数 _LAMBDA_SERVER_PORT で決まる。なしはデフォルト
- 実行ファイルを実行すると、RPCサーバーとして起動する。ローカルでも実行可能
- この RPC サーバーには、ユーザー定義関数と Ping() が実装される
- Ping() は https://github.com/aws/aws-lambda-go/blob/master/lambda/function.go#L19-L22
- PingResponse を返すだけの関数
- PingResponse は https://github.com/aws/aws-lambda-go/blob/master/lambda/messages/messages.go#L8-L9
- 仕組みとしては コンテナで RPC サーバーが起動し、外部とやり取りをしている
- ユーザー定義関数の処理をする RPC 通信をする TCP サーバーを起動している
- 対応しているイベント
コマンド一発で WSL のファイルをエクスプローラーで開く
WSL の画像ファイルや PDF ファイルを GUI で確認したいとき、Windows のアプリケーションからコマンド一発で開けないかと思い、ファイルパスを変換する関数を書いた。
Windows のアプリケーションのコマンドに渡す前に、ファイルのパスを変換して渡してあげれば、一発になる。一応。
以下の関数を定義し
function to_winpath() { wsl_path=`powershell.exe -Command 'echo ($env:LOCALAPPDATA + "\lxss")' | tr -d '\r'` abs_path=`readlink -f $1` internal_path=${abs_path//\//\\} echo "${wsl_path}${internal_path}" }
次のように、コマンドに渡してあげればいい。このコマンドではエクスプローラーで PDF ファイルを開いている。
$ explorer.exe `to_winpath sample.pdf`
しかし、タイプが増えるので面倒。
C# で Hello world
using System; namespace HelloWorld { class Program { static void Main(string[] args) { Console.WriteLine("Hello, world"); } } }
VimのVundleでプラグインを管理する
NeoBundle.vim から dein.vim に移行している最中ですが、Vundle.vim しか使えない環境もあり、改めて手順におこしておく。
1. Vundle.vim をローカルにコピーする
$ git clone http://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
2. vimrc に Vundle.vim の設定を追加する
" " Vundle.vim " set nocompatible " be iMproved, required filetype off " required set rtp+=~/.vim/bundle/vundle/ call vundle#begin() Plugin 'VundleVim/Vundle.vim' call vundle#end() " required filetype plugin indent on " required
3. プラグインをインストールする
vim を起動して、 :PluginInstall
を実行する。
nginx モジュール開発するにあたって(config編)
まずconfigに関する情報集め。
include ファイルや外部ライブラリがなければ、以下の内容で十分。
ngx_module_type=HTTP ngx_module_name=ngx_http_foobar_module ngx_module_srcs="$ngx_addon_dir/ngx_http_foobar_module.c" . auto/module ngx_addon_name=$ngx_module_name
青春18きっぷで東京から小倉まで
品川を始発で出発して、小倉まで。 青春18きっぷで初の長旅だったけれど、途中で休憩できたり、意外と疲れなく行けた。
ansible で vagrant の開発環境を構築する (準備)
ansible で vagrant の環境を構築するための準備。
実行環境
$ sw_vers ProductName: Mac OS X ProductVersion: 10.11.1 BuildVersion: 15B42 $ vagrant --version Vagrant 1.7.4 $ ansible --version ansible 1.9.4 configured module search path = None
ansible をインストール
brew install ansible
環境設定
- inventory file
ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key 127.0.0.1 ansible_ssh_port=2222 ansible_ssh_private_key_file=.vagrant/machines/default/virtualbox/private_key ansible_ssh_user=vagrant
接続確認
inventory file をファイル名 hosts
として保存する。
$ ansible -i ./hosts 127.0.0.1 -m ping 127.0.0.1 | success >> { "changed": false, "ping": "pong" }
参考
ssh の設定でつまづきましたが、こちらが参考になりました! Vagrant + Ansible