意外と使える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オプションが抜かれた俺達は

追記: 2018/11/22

5.25から --with-cairoのオプションが消えてデフォで入るようになったっぽい

さらに追記 2019/12/21

anatofuz.hatenablog.com

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設定が反映されるのを待ちましょう!!お疲れ様でした!!

Rubyの::ModuleName(コロンコロン)について

TL;DR

トップレベルの参照を確実にもたせたい時は ::

経緯

Okinawa.rbでRubyのモジュールを読んでいた所 ::ModuleName の様な書き方のモジュールが発見された

cf. https://github.com/intridea/hashie/blob/4070a699b039a1083971f698647d3707df4b03cc/lib/hashie/hash.rb#L14

cf. https://github.com/sisimai/rb-Sisimai/blob/master/lib/sisimai/string.rb#L49

これはどういう意味なんだろうと、はなちんさんやシーマンさん,Twitterでazumakuniyuki に聞いた所トップレベルの宣言の場合は利用するということがわかった。

たとえば以下のようなコードになるようです。

module Hoge
    module String
        p String
        p ::String
    end
end
~/w/R/Sample ❯❯❯ ruby colong.rb
Hoge::String
String

という訳で :: をつけると組み込みAPIなどのトップレベルで定義された物を利用できるようです

Perl入学式で出来るXXなこと

これはPerl入学式春のブログリレー3日目のエントリです。

昨日はPerl入学式校長のid:papixさんのエントリでした。 Perl入学式の基本スタンスである「プログラミング未経験者の方がプログラミングを好きになってもらえる/良いエンジニアとなる」という事を改めて考え直せました。

さて僕からはPerl入学式に参加してみようかなと思う皆さんに向けて,Perl入学式を完走するとできるようになることについて書いていこうかなと思います。

出来ること

母国語が持てる

ここで言う母国語とは、我々が普段会話に使っている日本語ではなくて、プログラミング言語の母国語です。

母国語、つまりbaseとなる考えをPerlで持つことによって多言語の習得がしやすくなります。例えばrubypythonやGoなど…多種多様な言語も「あぁPerlのアレね…」という感じで理解していく事ができます。

これは僕が1番Perl入学式に参加してよかった所で、入学式に初めて参加した当時は「CやJavaPythonを一通り触ったけどどれもあまり書けないぞ…」となっていました。そこでPerl入学式でPerlをしっかり学び、書籍などで勉強するに連れて、Perlで様々な問題を解決出来るようになりました。プログラミングが苦手なあなたにとってはPerlは最適な処方薬となるでしょう。

また、webアプリケーションを作る際のフレームワークでも同じ事が言えると思っていて、比較的薄いフレームワークが多いPerlではwebの根底が理解できると思います。僕も勉強中なのですが…。

やりたいことが簡単になります

Perl入学式で利用しているPerlは別名グルー言語とも言われ、様々な処理と処理の間を併せ持つことが出来る言語です。

プログラマーでない皆さんも大丈夫。Perl入学式卒業生のid:note103 さんのYAPC::Okinawaでのエントリを見るときっとヒントがあると思います。

note103.hateblo.jp

もし何か◯◯な事を自動化とか楽してみたいんだけど…というのがありましたらぜひPerl入学式のslackで聞いてみましょう。きっと力になれるはずです。

エンジニアの方と話す切っ掛けや内容が増える

Perl入学式の運営をしているサポーターの方や各地域pmの方々と、何を話したら良いのか…そもそもそういう集まりに行って良いのか…と思っている方もいるかもしれません。

Perl入学式に参加すると、例えば「リファレンスがよくわからないんですけど…」とか「utf8周りが複雑で…」などの話の切っ掛けを得ることが出来ます。その切っ掛けから、人々が「#わかる」や「こうすればええんやで」みたいな感じで話がつながります。その話をしながら飲むお酒は楽しいので、ぜひ皆さん参加してみましょう。

サポーターに挑戦

Perl入学式はサポーターと呼ばれるボランティアスタッフで運営をしています。サポーターが在籍している committer チャンネルでのやり取りなど、サポーターになってみないと見えない世界もあります。

…個人的にはPerl入学式は懇親会とサポーターに入ってからが本番の様な所もあるので、ぜひ皆さんにはサポーターとして参加していただきたいです。

(Acme)モジュールを作れる

個人的にPerlの中で好きなAcme名前空間ジョークモジュールをPerl入学式卒業レベルでも作ることが出来ます。

実際に僕も作って何本かあげています。CPANに自分のアイコンと名前が出るのは、Acmeモジュールですが嬉しくなるのでぜひ挑戦してみては如何でしょうか。

そして…

そして、Perl入学式一番の強みは、各地のサポーターを始めとするエンジニアコミュニティの一員になれることです。 僕自身もPerlコミュニティの人々に成長させていただき、今沖縄ではPerl入学式の運営としてエイヤッとしています。

Perlは人と人を繋げるグルー言語。次に繋がる人は画面の前のあなたかもしれません。え?繋がるのが怖いって?

大丈夫です。Perlのスローガンでもある「TMTOWTDI(やり方は一つじゃない)」 です。あなたとPerl、そしてプログラミングとの関わり方の一つとしてPerl入学式に参加していただければ幸いです。

そういえば、Perl入学式が地元でないけど、Perl入学式をしてみたいという方、僕や各地のサポーターに言えば何かが始まるかもしれません。やってみませんか?

明日は id:sorehaedamame さんです。お楽しみに!

Seleniumの良い感じの入れ方

Selenium(良い感じにブラウザをプログラムから操作できるやつ)をインストールしたのでメモ

環境

インスコ方法

$brew install selenium-server-standalone
$brew install chromedriver
$brew services start selenium-server-standalone
$brew services start chromedriver

なんか全部brewで出来て簡単

なぜか chromedriver のみgemと競合する可能性があるのでrubyを使う場合は注意 (具体的に言うとパスと優先度の問題でruby gemの方が優先的に参照されて地獄)