眠気.jl

投稿=不定期

JuliaでAWS Lambda動かすやつのメモ(RIEでlambdaのテストも)

最初に

この動画見て www.youtube.com このレポ github.com 走らせた時のメモです、特にオリジナリティないです
LambdaでもJulia使いたいけど上の動画みるの面倒な人に良いかもしれません
動画だとecr認証の箇所などわからなかったので追記しました

概要

  1. lambdaのコンテナ立ててローカルでcurlで叩いてローカルで動作確認
  2. ECRにそれをpushしてlambdaにそのURIを登録

必要だったもの

  1. aws configureすませたaws cli
  2. awsのaccount_idとregion (aws ecrコマンドで使う)

ローカルでテスト実行

buildとrun

docker build -t julia-lambda:latest . && docker run -it --rm -p 9000:8080 julia-lambda:latest

curlで叩く、別ウインドウを起動して

curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '100000'

動いた f:id:julialangisthebestlang:20210127204353p:plain

ECRにプッシュ

(※ [region], [account_id]は使っている値を入れてください)
account_idと使うregionを指定して認証する

aws ecr get-login-password --region [region] | docker login --username AWS --password-stdin [account_id].dkr.ecr.[region].amazonaws.com

ECRにレポジトリ作成

aws ecr create-repository \
    --repository-name julia-lambda \
    --image-scanning-configuration scanOnPush=true \
    --region [region]

タグ付け

docker tag julia-lambda:latest [account_id].dkr.ecr.[region].amazonaws.com/julia-lambda:latest

ECRにプッシュ

docker push [account_id].dkr.ecr.[region].amazonaws.com/julia-lambda:latest

Lambdaの作成

Lambdaのコンソールにログイン>コンテナーメージにチェック>関数名を適当に埋める>イメージを参照、からさっきプッシュしたECRのURIを選ぶ
テストイベントの中身を10000のみにしてテストを実行

┌ Info: Got response from handler
└   response = "3.1224"

動いた
ここCLIでやろうとしたんですが、やり方わかりませんでした
ECRのimage URI指定してコマンドラインからLambda作る方法ご存知の方は私にTwitterでこっそり教えてください

補足

Lambdaの設定

デフォルトのメモリだと足りなかったので増やしたら通りました

Memory Size: 1024 MB Max Memory Used: 357 MB Init Duration: 4718.01 ms

RIEとは

R.I.Pに似てますね
lambdaをローカルテストできる便利機能っぽいです, これで動くかどうか祈りながらzipを作る必要ないですね(?)
AWS Lambda の新機能 – コンテナイメージのサポート | Amazon Web Services ブログ
より引用します
「Lambda Runtime Interface Emulator をオープンソースとしてリリースします。これにより、コンテナイメージのローカルテストを実行して、Lambda にデプロイした際に実行されることを確認することができます。Lambda Runtime Interface Emulator は、AWS が提供するすべてのベースイメージに含まれており、任意のイメージでも使用できます。」

リンクとか

Runtime APIのドキュメント AWS Lambda runtime API - AWS Lambda
ECRをCLIでやるドキュメント Using Amazon ECR with the AWS CLI - Amazon ECR

Ubuntu19.10でKindle for PCを使う

Wine入れてフォントいれて頑張る

Kindleのダウンロード

ダウンロード kindle for pc 無料 (windows)

Wineインストール

sudo apt install wine64
winecfg

winecfgでウインドウが立ち上がるのでWindows8に設定

winetrickインストール

このままだと豆腐地獄なのでフォント入れる

sudo apt install winetricks
winetricks

Select the default wineprefix
Install a font
cjkfontsを選択、念の為takao等も好みで選択

wine [kindle_path]/kindle-for-pc-1-17-44183.exe

Juliaで微積CLIを作る(Fire.jl+SymEngine.jl)

動機

関数電卓コマンドラインで出来たらいいなと思った,ありきたりな動機

やっていく

下記をfunc_calc.jlとして保存
今回は小文字アルファベット全部をシンボル扱いする

using Fire
using SymEngine


# シンボル扱いする文字の定義,書き方 1/3
a=symbols(:a); b=symbols(:b)
# シンボル扱いする文字の定義,書き方 2/3
c,d = symbols("c d")
# シンボル扱いする文字の定義, 書き方 3/3
@vars e f g h i j k l m n o p q r s t u v w x y z


"微分する,Argument type Basic is not supported by Fire.jlらしいのでString受取してタイプ変換"
@main function diff_func(f::String, respect_to::String)
    f = Basic(f)
    respect_to = Basic(respect_to)
    result = diff(f,respect_to)
    println(f,"を",respect_to,"で1回微分すると:",result)
end

"代入,この文章はjulia func_calc.jl subsitution --helpで見れる"
@main function subsitution(f::String,respect_to::String,num::Float64)
    f = Basic(f)
    respect_to = Basic(respect_to)
    result = subs(f,respect_to=>num)
    println(f,"において",respect_to,"に",num,"を代入すると:",result)
end

動作確認

微分

:~
$ julia func_calc.jl diff_func 5*x^3+6*x^2+2x+1 x
1 + 2*x + 6*x^2 + 5*x^3をxで1回微分すると:2 + 12*x + 15*x^2
:~
$ julia func_calc.jl diff_func 5*x^3+6*x^2+2x+1 y
1 + 2*x + 6*x^2 + 5*x^3をyで1回微分すると:0

代入

:~
$ julia func_calc.jl subsitution x^2+x+1 x 3
1 + x + x^2においてxに3.0を代入すると:13.0

感想など

Fire.jlでそのまま受け取れると思ったので少し詰まった(typeof()で見ていって解決)

参考URL等

Fire.jl
GitHub - ylxdzsw/Fire.jl: Fire.jl is a library for automatically generating command line interfaces (CLIs) for julia functions.
Fire.jlはgooglepython-fire↓にインスパイヤされたらしい
GitHub - google/python-fire: Python Fire is a library for automatically generating command line interfaces (CLIs) from absolutely any Python object.
SymEngine.jl C++のSymEngineというライブラリのJuliaラッパー
GitHub - symengine/SymEngine.jl: Julia wrappers of SymEngine
Sympy.jl,SymEngine.jl,Reduce.jlで一番スター数が多いのがSymEngine.jl
SymPy.jl vs SymEngine.jl vs Reduce.jl vs - Usage - JuliaLang

JuliaでCLIを作る(Fire.jl)

動機

GoでCLIを作るのが流行ってるので,逆張りしたいから

環境

諸事情でアプデしてない...

julia> versioninfo()
Julia Version 1.1.1

やっていく

呼びたい関数が一つの場合

julia> # press ] here
(v1.1) pkg> add Fire
~$ vim dekiraa.jl

文字列を受け取って表示してみる(※関数が一つの場合)
dekiraa.jlを次のように書く(Fire.jl@mainを見ていく)

using Fire

@main function dekiraaaa(name)
    println(name,"でCLIをつくる?出来らぁ!!")
end

セーブして

~$ julia dekiraa.jl Julia言語
~$ Julia言語でCLIをつくる?出来らぁ!!

できた

複数の関数呼びたい場合

funcs.jlを次のように書く

using Fire


@main function add(num::Integer...)
    println("足し算します :",num)
    println(sum(num))
end

@main function multiple(num::Integer...)
    println("全部かけます :", num)
    a = 1
    for i in num
        a = a * i
    end
    println(a)
end

@main function is_palindrome(str::String)
    reversed_str = join(reverse(split(str,"")),"")
    if reversed_str == str
        println("こ、これは...回文だああああ┗(^o^ )┓三ドコドコドコ┗(^o^)┛三┏( ^o^)┛")
    else
        println("回文ではないですね (´・ω・`)")
    end
end

※複数の関数を定義した場合,その関数を指定しなければ動かない
なのでまず定義した関数を次のコマンドで取得する(覚えてれば必要ないです)

~$ julia funcs.jl --help
See --help of each command for usages
  add
  multiple
  is_palindrome

さらに細かく見る場合は

julia funcs.jl is_palindrome --help
No documentation found.

(定義した場所等うんぬんの文章)

Positional Arguments:
  str: String

確認してみる

~$ julia funcs.jl is_palindrome たけやぶやけた
こ、これは...回文だああああ┗(^o^ )┓三ドコドコドコ┗(^o^)┛三┏( ^o^)┛
~$ julia funcs.jl is_palindrome あいうえお
回文ではないですね (´・ω・`)

できた

感想等

これとZygoteでコマンドライン関数電卓ができそうなのでいずれやります

参考URL

Building A CLI(Command Line Interface ) in Julia with Fire jl [2019]

https://github.com/ylxdzsw/Fire.jl

JuliaのPlot(backend=gr())がtoo many file openで落ちるとき

結論

GR.inline("png")

を追記しよう

動機

Juliaでフレームを増やすと落ちるときがある
例えばこの記事のコードでanim=@animate for i = 1:5000
とすると次のようなエラーが起こる

socket: Too many open files
GKS: can't connect to GKS socket application
Did you start 'gksqt'?

解決策 (してなかった)

mp4にしてみる
gifの部分をmp4にするとうまくいく場合もある
いかない場合もある
(描画できる量は gif<mp4のようだが,どれぐらいまで大丈夫なのかわからなかった)

解決策

GR.inline("png")

を追記したら

anim = @animate 1:5000

落ちることなく最後まで描画できた(mp4,gif共に)
(詳しくはURLを)

最後に

これで突然ランダムウォークを5000歩ぐらい見たくなった時も安心ですね

参考URL(ほぼこのまま)

github.com

github.com

JuliaのPlot(backend=gr())がtoo many file openで落ちるとき

結論

GR.inline("png")

を追記しよう

動機

Juliaでフレームを増やすと落ちるときがある
例えばこの記事のコードでanim=@animate for i = 1:5000
とすると次のようなエラーが起こる

socket: Too many open files
GKS: can't connect to GKS socket application
Did you start 'gksqt'?

解決策 (してなかった)

mp4にしてみる
gifの部分をmp4にするとうまくいく場合もある
いかない場合もある
(描画できる量は gif<mp4のようだが,どれぐらいまで大丈夫なのかわからなかった)

解決策

GR.inline("png")

を追記したら

anim = @animate 1:5000

落ちることなく最後まで描画できた(mp4,gif共に)
(詳しくはURLを)

最後に

これで突然ランダムウォークを5000歩ぐらい見たくなった時も安心ですね

参考URL(ほぼこのまま)

github.com

github.com

vimrcをターミナルでリロードする(vim -c ':source ~/.vimrc | quit')

動機

.vimrcだけを少しだけ書き換えてターミナルでsource ~/.vimrcを実行するとエラーが出た(それはそう,vim起動中にするべき)

vimを(見た目的には)起動せずにやってみる

このようにvim -cでvimコマンドを実行すれば良いと思ったが

vim -c ':source ~/.vimrc'

上記のコマンドだとvimを閉じる処理をしていないので、下記のようにパイプで終了させる

vim -c ':source ~/.vimrc | quit'

エラー無し+ロードに時間がかからなければ見た目的にはvimが起動していないように見える

vim -c ':source ~/.vimrc | sleep 5 | quit'

等で遅延させると開いていることがわかる

感想

面倒くさがらずdotfilesの方でinstall.sh走らせればこんなことには

同じミスをしている方を見つけて勝手に親近感を覚えました

ryutamaki.hatenablog.com

tmg0525.hatenadiary.jp