Perl6とnqpのプロファイルを出力する

TL;DR

$nqp --profile colon-pair.nqp

基本はこのLearningPerl6の記事を見れば良いのだが,Perl6が動いているMoarVMにはbuilt-inでプロファイラが用意されている. 基本的にはDevel::NYTProfと似た雰囲気でプロファイラが出力される.

例えば下の通り

MoarVM Profiler Results

今の所見た目は良いがDevel::NYTProfほどいい感じにトレースが出来ない気がしている.

公式ドキュメントによるとなんと SQLでプロファイル結果を出力 することが出来るらしい.

gdbu8.1がhigh sierraで動かない問題

どうも8.0.1にしろということらしい 証明書問題でもけっこう大変なのだが…

stackoverflow.com

.gitignoreの中に.gitignoreを書く

TL;DR

.gitignoreの中に.gitignoreを書くことで.gitignoreを管理下におかず実現できる

gitignroeをgithubリポジトリにpushしたくないが,gitの管理から外したい物がある時は 循環のようにgitignoreを書いておくと行ける

cpanfile.snapshot
local/
.gitignore

みたいな感じ


追記 2018/05/24

id:karupanerura さんより .git/info/exclude に書くと同等のことが出来るらしいです!

cf.

Ignoring files - User Documentation

意外と使えるcd - とdirsコマンド

意外と使えるけれどみんなあまり知らないlinuxコマンドテクニックです

TL;DR

cd -

普段ディレクトリを移動する際は cd を使いますが,引数として-を与えてあげると違った挙動をします.

例えば最初にルートディレクトリに移動,次にホームディレクトリ以下のsadboxに移動してみます

 / ❯❯❯ cd /
/ ❯❯❯ ls
Applications              Volumes                   home                      sbin
Library                   bin                       installer.failurerequests tmp
Network                   cores                     net                       usr
System                    dev                       opt                       var
Users                     etc                       private
/ ❯❯❯ cd ~/.sandbox
~/.sandbox ❯❯❯ ls
1.aux                     1.out                     Gemfile                   missfont.log
1.dvi                     1.pdf                     Gemfile.lock              naltoma.txt
1.fdb_latexmk             1.synctex.gz              a.out                     prezto-fasd-cache.501.zsh
1.fls                     1.tex                     hoge.c                    texrepo
1.log                     1.toc                     hoge.rb                   vendor
~/.sandbox ❯❯❯ pwd
/Users/anatofuz/.sandbox
~/.sandbox ❯❯❯ cd -
/
/ ❯❯❯ pwd
/
/ ❯❯❯ cd -
~/.sandbox
~/.sandbox ❯❯❯ pwd
/Users/anatofuz/.sandbox

こういった用に cd -を使うと直前のディレクトリを行き来する事が可能です.

dirs

ディレクトリを移動する際に,現在いるカレントディレクトリがディレクトリスタックというスタックに保存されます. スタックとはFirst In Last Out(FILO)とも呼ばれ,つまり最初に入ったやつが最後に出てくるデータ構造です.

例えばディレクトリスタックが次のようになっている場合

dirs                                                                                                      [20:14:04]
~ ~/.sandbox ~/workspace/github ~/workspace

これは最初に ~/workspaceにcdし,次に ~/workspace/githubにcdを行い, 続いて ~/.sandboxにcdした後に最後にホームディレクトリに移動したことを表しています.一番左が現在のカレントディレクトリで,時系列的に右に進むと良いということがわかります.

例えば

 anatofuz@anatofuz  ~/.sandbox 
 ❯ cd                                                                                                        [20:18:55]

 anatofuz@anatofuz  ~ 
 ❯ dirs                                                                                                      [20:18:56]
~ ~/.sandbox ~/workspace/github ~/workspace

 anatofuz@anatofuz  ~ 
 ❯ cd workspace/bitbucket                                                                                    [20:19:03]

 anatofuz@anatofuz  ~/w/bitbucket 
 ❯ dirs                                                                                                      [20:19:04]
~/workspace/bitbucket ~ ~/.sandbox ~/workspace/github ~/workspace

この用に移動するとカレントディレクトリがディレクトリスタックに詰まっていきます. これはvオプションを付けるとよりわかりやすくなるかと思います.

dirs -v                                                                                                   [20:13:10]
0  ~
1  ~/.sandbox
2  ~/workspace/github
3  ~/workspace

これで言うところの0が現在のカレントディレクトリ.3が最初にcdした先ですね.

popd

このディレクトリスタックをpopつまり一番最近のものを取り出していくのがpopdコマンドです.

先程の状況で検証してみると

 ❯ pwd                                                                                                       [20:23:37]
/Users/anatofuz

 anatofuz@anatofuz  ~ 
 ❯ popd                                                                                                      [20:23:38]

 anatofuz@anatofuz  ~/.sandbox 
 ❯ pwd                                                                                                       [20:23:39]
/Users/anatofuz/.sandbox

 anatofuz@anatofuz  ~/.sandbox 
 ❯ popd                                                                                                      [20:23:40]

 anatofuz@anatofuz  ~/w/github 
 ❯ pwd                                                                                                       [20:23:41]
/Users/anatofuz/workspace/github

この用に順にディレクトリが移動していっています. なお + 2などつけるとその分ディレクトリが消されます

pushd

pushdはその逆で,カレントディレクトリをディレクトリスタックに積み上げます

zshなら

zshならオプションで設定する必要がありますが, cd -でタブを押すことで ディレクトリスタックが可視化され,簡単にcdする事ができます.

f:id:anatofuz:20180518200330p:plain

 ❯ dirs                                                                                                      [20:02:51]
~ ~/.sandbox ~/workspace/github ~/workspace

 anatofuz@anatofuz  ~ 
 ❯ cd -0/                                                                                                    [20:02:51]
 -- directory stack --
0 -- ~/workspace
1 -- ~/workspace/github
2 -- ~/.sandbox

Perl6(nqp)とMoarVMのデバッグを行う手順

背景

皆さんお元気ですか.私はげんきです. さて人間生きているとPerl,とりわけPerl6に興味が出てくると思います. Perl6に興味を持ったが最後,実際の内部処理などが気になり夜も眠れない日が続くと思います.

今日はそんなみなさんにPerl6の実装であるMoarVMとRakudoのサブセットであるnqpのデバッグについてお教えします.

MoarVMの用意

MoarVMは現在GitHubにて公開されています. 通常使う文にはrakudo-starなどがありますが今回はデバッグソースコードから落としてきます.

$ git clone https://github.com/MoarVM/MoarVM.git

Configure.pl

落としてきたMoarVMですが,ここでPerl製のMakefile生成ツールであるConfigure.plを使います. なおこのツールですがカレントディレクトリにConfigure.plがないと実行できないという技があります.気をつけましょう.

Configure.plにはいくつかオプションがありますが,今回利用するものをピックアップします

  • cc
  • debug
    • debugオプション
  • --no-optimize
  • compiler
  • toolchain
    • "posix", "gnu", "bsd" and "msvc"のツールチェインを選択可能
  • prefix
    • make installの先を指定

なので例えば次のようになります. これは独自gccコンパイラを指定している感じです.

$ ./Configure.pl --cc /usr/local/x86-cbc/bin/gcc --debug --no-optimize --compiler gcc --prefix=src/build_perl6/MoarVM

make install

ここまで来たら make と make installを実行します

$ make && make install

ここまで来るとローカルとbuildのprefixさきに moarというバイナリが生成されています. こちらがmoarVMのバイナリとなっています.

さてMoarVMは用意できましたが動かすnqpをinstallしていません.別途installします.

NQP

NQPとは Not Quite Perl の略でPerl6のサブセット.つまりPerl6の簡易版であり,コンパイラ開発者用に設計された単純なPerl6です.

こちらもGitHubで展開されています.

NQPの用意

まずは同じようにgit cloneしましょう

$git clone git://github.com/perl6/nqp.git

これも同じようにConfigure.plがあります. 今回はバックエンドとして先程buildしたmoarを使うので指定を行います

$ ./Configure.pl --prefix=src/build_perl6/nqp --backends=moar --with-moar=src/build_perl6/MoarVM/bin/moar
  • オプション
  • prefix
    • ビルド先
  • backends
    • NQPが走るVMを選択する
  • --with-moar
    • MoarVMを使う場合MoarVMのパス

ここまで出来たら

$ make && make install

を実行しましょう.

NQPの実態

さてbuildできたnqpですが,実はこれはバイナリファイルではありません. 証拠にファイルの種類を確認するfileコマンドを入力してみましょう

$file nqp
nqp: POSIX shell script, ASCII text executable

なんとnqpはただのシェルスクリプトなのです.

中身は主に二種類あり,ソースコード側では

#!/bin/sh
exec src/build_perl6/MoarVM/bin/moar nqp.moarvm "$@"

prefix先では

 cat nqp
#!/bin/sh
exec src/build_perl6/MoarVM/bin/moar --libpath=src/build_perl6/nqp/share/nqp/lib src/build_perl6/nqp/share/nqp/lib/nqp.moarvm "$@"

となっています.デバッグ用のlldb/gdbではシェルスクリプトをかませることが出来ないのでここは

exec以下をコピーして

lldb src/build_perl6/MoarVM/bin/moar nqp.moarvm のように実行します

anatofuz lldb  src/build_perl6/MoarVM/bin/moar nqp.moarvm
Current executable set to 'src/build_perl6/MoarVM/bin/moar' (x86_64).

ここまでいくとデバッグできるので例えばmainにデバックポイントをかけて

(lldb) b main
Breakpoint 2: where = moar`main + 24 at main.c:144, address = 0x00000000004012dc
(lldb) run
Process 107353 launched: 'src/build_perl6/MoarVM/bin/moar' (x86_64)
Process 107353 stopped
* thread #1: tid = 107353, 0x00000000004012dc moar`main(argc=2, argv=0x00007fff6aebbea8) + 24 at main.c:144, name = 'moar', stop reason = breakpoint 2.1
    frame #0: 0x00000000004012dc moar`main(argc=2, argv=0x00007fff6aebbea8) + 24 at main.c:144
   141     {
   142         MVMInstance *instance;
   143         const char  *input_file;
-> 144        const char  *executable_name = NULL;
   145         const char  *lib_path[8];
   146
   147     #ifdef _WIN32
]

などと出来ます! これでPerl6のデバッグが出来て夜も眠れますね!

brewのgnuplotにpdfオプションが抜かれた俺達は

TL;DR

$ brew install gnuplot --with-cairo

以前はbrewgnuplotをinstallする際に --with-pdflib-lite などのオプションがあったが最近抜かれていた. そんな中でもpdfを吐き出したい時はどうすれば良いのかぐぐったところstack overflowの記事が発見された.

stackoverflow.com

曰く--with-cario をinstall時に設定すると良いらしい

 ❯ brew reinstall gnuplot --with-aquaterm --with-x11 --with-cairo                                                                                                                                    [21:55:08]
==> Reinstalling gnuplot --with-cairo --with-aquaterm --with-x11
==> Downloading https://downloads.sourceforge.net/project/gnuplot/gnuplot/5.2.2/gnuplot-5.2.2.tar.gz
Already downloaded: /Users/anatofuz/Library/Caches/Homebrew/gnuplot-5.2.2.tar.gz
==> Downloading http://apps.jcns.fz-juelich.de/src/libcerf/libcerf-1.5.tgz
Already downloaded: /Users/anatofuz/Library/Caches/Homebrew/gnuplot--libcerf-1.5.tgz
==> ./configure --prefix=/private/tmp/gnuplot-20180429-83310-1ge0ljp/gnuplot-5.2.2/libcerf --enable-static --disable-shared
==> make install
==> ./configure --disable-silent-rules --prefix=/usr/local/Cellar/gnuplot/5.2.2_1 --with-readline=/usr/local/opt/readline --without-tutorial --disable-wxwidgets --with-qt=no --with-aquaterm --with-x
==> make
==> make install
==> Caveats
AquaTerm support will only be built into Gnuplot if the standard AquaTerm
package from SourceForge has already been installed onto your system.
If you subsequently remove AquaTerm, you will need to uninstall and then
reinstall Gnuplot.
==> Summary
🍺  /usr/local/Cellar/gnuplot/5.2.2_1: 47 files, 2.8MB, built in 1 minute 15 seconds
>>> elapsed time 1m17s

 anatofuz@anatofuz  ~ 
 ❯ gnuplot                                                                                                                                                                                           [21:56:58]

    G N U P L O T
    Version 5.2 patchlevel 2    last modified 2017-11-15

    Copyright (C) 1986-1993, 1998, 2004, 2007-2017
    Thomas Williams, Colin Kelley and many others

    gnuplot home:     http://www.gnuplot.info
    faq, bugs, etc:   type "help FAQ"
    immediate help:   type "help"  (plot window: hit 'h')

Terminal type is now 'aqua'
gnuplot> set term pdf

Terminal type is now 'pdfcairo'
Options are ' transparent enhanced fontscale 0.5 size 5.00in, 3.00in '
gnuplot>

これでokらしい.と言うかなぜ合わせたのか

すでにinstallしている場合は

$brew reinstall gnuplot --with-aquaterm --with-x11 --with-cairo 

など reinstall すればだいたい解決する世界観です

GoogleCloudSorage+CloudflareでHTTPSなwebサイトを構築する

qiita.com

背景

GCPUG in Okinawa!#5-GCPは意思決定が加速するよで行ったLTの続きのようなものです.

ドメイン購入と静的ホスティングまで

ドメインを購入してHTTPな静的サイトを構築するまでの手順はこちらを御覧ください.

雰囲気で構築するオレオレ静的サイト

HTTPS

HTTPS化にあたり,CloudFrareでの作業が必要となりますが @noraworld さんのGitHubPagesでの記事が参考になります. https://qiita.com/noraworld/items/89dd85a434a7b759e00c

GitHubPagesとの違い

GoogleCloudPlatformはトップレベルドメインに対応していないため www などのサブドメインを直接CNAMEに設定することが可能です.

その為,初期のドメイン設定の際に www.anatofuz.net などと申請すると 自動的に wwwc.storage.googleapis.com が設定されます.

f:id:anatofuz:20180422125755j:plain

また必要はないかと思うのですが,念のためにNSを追加しておきます

f:id:anatofuz:20180422125733j:plain

SSL以降の設定は @noraworld さんの記事の通りでOKですが,最後のCNAMEの設定に該当するものは特に記述しなくてokです.

Googleドメインでの設定

Googleドメインでは初期に追加したCNAMEなどを削除し 使用しているネームサーバーをカスタムネームサーバーとして,CLoudFlareから指定されたものを設定します.

f:id:anatofuz:20180422125652j:plainf:id:anatofuz:20180422125656j:plain

CloudDNSの設定

ここが個人的にはハマりポイントでしが,CloudDNS側で www.anatofuz.net に対してCloudFlareの設定を記述する必要があります.

f:id:anatofuz:20180422125715j:plain

ここまで記述すれば後はDNS設定が反映されるのを待ちましょう!!お疲れ様でした!!