Raku(Perl6)のCroを使ってPerl入学式の課題を解いてみる

こんにちは。最近は雇用契約を結ぶために東京と沖縄を行き来しているid:anatofuzです。

これはPerlアドベントカレンダー6日目の記事です。

そういえばYAPC::Kyotoのテーマが決定したようです。 個人的にQといえばウルトラQなのですが、Qにちなんで、今回は旧Perl6ことRakuの話です。

大事な話

Perl6はRakuに名前が代わりました (#rakulangです)

Croを使ってWAFの簡単な例題を解いてみる

さてRakuでWebAppを作ってみたいと、インターネットエンジニアの方は夜中に唐突に思い出して夜も眠れなくなるかと思います。 このエントリでは、Rakuの主力なWAFの一つであるCroを用いてWebアプリケーションを作製したいと思います。

今回作製したコードは次のリポジトリに置いてあります。

github.com

Croとは

RakuのIDEであるCommaを開発しているチームが主に開発しているWAFです。 厳密にはWAFではなく、reactive programmingのためのフレームワークという立ち位置です。 その為、デフォルトパッケージである Cro はルーティングやweb socketなどをサポートしていますが、テンプレートエンジンなどは派生パッケージである Cro::WebApp名前空間のものを利用するとなっています。

Croのインストール

まずはCroのインストールから始めてみましょう。今回はDockerで色々しますが、何かと物があったほうが便利です。 Raku自体は $brew install rakudo-star などで入れましょう

$zef install cro

なお $zef install Cro だと、別のパッケージが入るので気をつけましょう。

....ですが、2019/12/06現在 なんか IO::Socket::Async::SSL周りで死ぬので諦めたほうが良いかもしれません....orz

$ zef install cro
===> Searching for: cro
===> Searching for missing dependencies: IO::Socket::Async::SSL, YAMLish, Cro::WebSocket, Docker::File, File::Ignore
===> Searching for missing dependencies: Cro::HTTP, Base64, Digest::SHA1::Native, Crypt::Random
===> Searching for missing dependencies: IO::Path::ChildSecure, HTTP::HPACK, Cro::TLS, JSON::JWT, Log::Timeline, if
===> Searching for missing dependencies: Digest::HMAC
===> Building: Digest::SHA1::Native:ver<0.04>
===> Building [OK] for Digest::SHA1::Native:ver<0.04>
===> Testing: IO::Socket::Async::SSL:ver<0.7.5>
===> Testing [FAIL]: IO::Socket::Async::SSL:ver<0.7.5>
Aborting due to test failure: IO::Socket::Async::SSL:ver<0.7.5> (use --force-test to override)

モックを作ろう

ではまずプロジェクトを始めるために適当にディレクトリを作ります

$mkdir test_cro

croをいれるとcroコマンドが使えるようになるので、これでstubを作成します。 croが上手く入らなかった場合は、同じファイルを頑張って手で書けば問題ないです。

$cro stub http entrance .

今回は entranceというプロジェクトで作成します。 作製すると次のようなディレクトリ構成のものが出来上がります

.
├── Dockerfile
├── META6.json
├── README.md
├── lib
│   └── Routes.pm6
├── service.p6

入学式ではMojolicious::Liteを使ってエイッとしていましたが、今回はほぼこの雛形のRouters部分を編集することになります。

Perl入学式の課題1

Perl入学式の練習問題ではこのようなものがあります。

先ほど作成したhttp://127.0.0.1:3000/profileを充実させましょう。以下のページからコードをコピペして利用してもokです。

[GitHub] mojo_prof.pl

` @@ profile.html.ep % layout 'default'; % title 'profile'; <h1>プロフィール</h1> <p>私の名前は<%= $name %>です</p> <p>趣味は<%= $hobby %>で, 好きなプログラミング言語は<%= $lang %>です</p> テンプレート部の profile を、コピペして上記のものに置き換えます。 コントローラー内で stash を利用して name, hobby, lang 変数に値を代入します。 思いつかない人用ハッシュ (name => 'larry', hobby => 'study', lang => 'Perl' )

workshop-2019/slide.md at master · perl-entrance-org/workshop-2019 · GitHub

Croのデフォルトは127.0.0.1ではなく0.0.0.0の10000番ポートであるので、適宜組み替えて、これに該当するものを作ってみます。

Dockerで作業をする

....と、まずはcroが今日はmac osでは上手く動かないので、 Dockerを使っていい感じにビルド出来るようにしてみましょう。

FROM croservices/cro-http:0.8.1
RUN mkdir /app
COPY . /app
WORKDIR /app
RUN apt-get update && apt-get -y install build-essential
RUN zef install --deps-only . && perl6 -c -Ilib service.p6
ENV ENTRANCE_HOST="0.0.0.0" ENTRANCE_PORT="10000"
EXPOSE 10000
CMD perl6 -Ilib service.p6

このようなDockerfileを用意します。 (cro stubでも同様のものができますが、 makeコマンドが無いので RUN apt-get update && apt-get -y install build-essential を加えます)

次に docker buildするのが面倒なので、 docker-compose.yml を書きます

version: "3.6"
services:
  app:
    build: .
    image: anatofuz_cro_entrance
    volumes:
      - .:/app
    ports:
      - "10000:10000"
    tty: true

ここまで書いて docker-compose up すると、croのweb appが立ち上がると思います。

ルーティングとテンプレートエンジン

ここまで出来たら、次に /profileのエンドポイントを生成するのと、該当するテンプレートを作ってみましょう。 説明の都合上まずはテンプレートエンジンを導入します。

Perl6/Rakuでは現状 META6.json というパッケージの情報をまとめたjsondepends 配列の中身を利用するモジュールと判断し、 zef がインストールします。 その為、 まずは この META6.jsonに利用するパッケージを記述する必要があります。 使用するテンプレートエンジンはCro::WebApp::Templateですので、以下のように追記します。

  "depends": [
    "Cro::HTTP",
    "Cro::WebApp::Template"
  ],

次にテンプレートファイルを用意します。

テンプレートファイルを置く場所は任意に設定できます。 今回はプロジェクトルートにtemplatesディレクトリを作製し、その中に書いていきます。 テンプレートファイルの拡張子は .crotmp が使われている様です。

$mkdir templates
$vim profile.crotmp

profile.crotmpの中身はこんな感じです

<!doctype html>
<html lang="ja">
  <head>
    <title> <.<title>> </title>
  </head>
  <body>
    <h1> プロフィール </h1>
      <p> 私の名前は <.<name>> です</p>
      <p>趣味は <.<hobby>>で, 好きなプログラミング言語は<.<lang>>です</p> 
  </body>
</html>

mojolicousでは、渡した変数を使う場合は <%= $name %> としましたが、 Croでは無名ハッシュを送り、 <.<key>>とすることでアクセスできます。 これはRakuのSyntaxに近いものですね。

次にRoutes.pm6を編集します Routes.pm6は、Croのstubが生成するデフォルトのルーティングファイルであり、 Cro::HTTP::Routerによって実現されています。

Croのルーティングには、 template 機能があり、 レンダリングするテンプレートと無名ハッシュの形でパラメータを送る事ができます。 テンプレートは Cro::WebApp::Template ですので、 これをuseして template-location にプロジェクトルートから見たtemplateファイルのパスを指定します。

use Cro::HTTP::Router;
use Cro::WebApp::Template;

sub routes() is export {
    template-location 'templates';

    route {
        get -> {
                  template 'index.crotmp', { title => "タイトル", greeting => "hello Cro" };
        }

        get -> 'profile' {
                  template 'profile.crotmp', { title => "タイトル", name => "AnaTofuZ" , hobby => "Twitter", lang => "Perl"};
        }
    }
}

この例では / 及び /profile にGETリクエストが発行された場合、それぞれ index.crotmpと profile.crotmpにパラメータを渡しつつレンダリングをします。

実際にここまで書いて dokcer-compose up してみると

f:id:anatofuz:20191206164554j:plain

上のような表示が出ます!! やったね!!!

FizzBuzzをテンプレートエンジンで解く

Perl入学式にはFizzBuzzをテンプレートエンジンで解く課題があります。やってみましょう。

まずは fizzbuzz.crotmpですが

<!doctype html>
<html lang="ja">
  <head>
    <title> <.<title>> - Cro </title>
  </head>
  <body>
    <@numbers: $var>
      <?{$var % 3 == 0}> Fizz </?>
      <?{$var % 5 == 0}> Buzz </?>
      <?{($var % 3 != 0) && ($var % 5 != 0 )}> <$var> </?>
      <br/ >
    </@>
  </body>
</html>

上の様になります。 Croの templateエンジンでは <@array: $scalar> と書くと、 </@> が来るまでの間、 Perlで言うところの for my $scalar (@array) と書いたのと同じ意味になります。 以下の <? {} > </?> は, {} の中身を真偽値判定する if文のようなものであり、 <? の場合は中がtrueであるときに要素がレンダリングされます。

そしてFizzBuzzに値を送るルーティング部分は

use Cro::HTTP::Router;
use Cro::WebApp::Template;

sub routes() is export {
    template-location 'templates';

    route {
        get -> {
                  template 'index.crotmp', { title => "タイトル", greeting => "hello Cro" };
        }
        get -> 'profile' {
                  template 'profile.crotmp', { title => "タイトル", name => "AnaTofuZ" , hobby => "Twitter", lang => "Perl"};
        }

        get -> 'fizzbuzz' {
                 template 'fizzbuzz.crotmp', { title => "xxx", numbers => [(0..100).list] };
        }
    }
}

上のようになります。ここまで出来ると... f:id:anatofuz:20191206165000j:plain

この様にテンプレートエンジンでFizzBuzzが書けます!! やったね!!!

ここまでで、Perl入学式の課題をいくつかCroを使って解いてみました。 続きは別のアドベントカレンダーでまた書くかも...!?

明日は id:kfly8 さんです。わくわく

Fedora30以降のkernelの変更

背景

  • ちまたではawkを使って番号を決めてgrub2-で解決する方法が出回っている
    • 最近のFedoraでは grub2.configをいくらgrepしてもkernel情報が乗ってない
    • Linux Kernelをリモートデバッグするぞ!! という時にkernelが切り替えられないと不便

やりかた

$ grubby --info=ALL でそれっぽいやつを探して grubby --set-default /boot/vmlinuz-4.2.0-1.fc23.x86_64 とかで変更できるようです

詳しくは

Working with the GRUB 2 Boot Loader

Catalinaで/usr/includeが消えた俺達は

追記 (2019/10/10)

/usr/include が要らなかったので消した

TL;DR

$ clang --sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk

あらまし

mac osがCatalinaになり、 /usr/include からついにヘッダファイルが消えた。 (Mojave時はdmgを使うことで移植できたがそれも無くなった)

そのため、 自分でインストールしたCコンパイラを使う場合は、(例えばclangの場合)clangのオプションを使って指定する必要がある。

というわけで

以前の /usr/include 相当は /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk 以下にあるので、これをパスに加えました。 これでbrewでいれたllvm/clangも動いて便利

問題

  • クロスビルド出来ないっぽい?

Wantedly peopleのサマーインターンに行っていました

はい

という訳でWantedlyのサマーインターンに行っていました。驚くべきことにPerlはメインで動いてないです。

wantedlyinc.com

行くまで

ちょっと前に「本採用の逆求人だと思って行ったらインターンの逆求人だった」サポーターズの逆求人イベントに行ったのですが、そこで id:izumin5210さんとid:yjmkzkさんとお話する機会があり、サーバーサイド側でやっていることが面白そうだったので応募するぞ!!! となりました。応募後は一度リモートで面談をして、そこで決定という感じです。

あの回のサポーターズのイベントにいたid:sosodemonaiくんやid:sathoeku先生もインターンにいたので、なかなかおもしろかったです

golangは書いてないのでなぜOKだったのかはよくわからないですが「おもしろPerl沖縄県民採用」みたいな感はあった

インターン先の印象

はてななどのインターネットコンテンツをよく見る僕にとっては

  • 「よく増田で見かける」
  • 「定期的にxxxxしている」
  • 「意識高そう」

などというイメージがありました。

実際に3週間体験してみると、上2つに関しては現在は大丈夫かなぁという気がしています。 意識高そうなのは社風がクレバーに行こうみたいな感じだったので、ビジネスサイドの人などはそう思っているような雰囲気を感じました。とはいえエンジニアとしてやっていきするにはかなり良い環境じゃん...!!という感じを受けました。行ってみると違うね。

エンジニアの皆さんは、なんかこうエンジニアだったので非常に安心しました。おしゃれな人が多かったので「これが白金台か…」となっていました。都会って怖いね。

配属先

Wantedlyインターンは就業形なので人々はよしなにチームにアサインされます。 僕はWantedllyPeopleのバックエンド(サーバーサイド)でエイッとしていました。

Peopleは様々なマイクロサービスで構築されており、主にrailsgolangが頑張っています。

rails側もちょっと触りましたが、rails側は主にid:sosodemonaiくんが触っており、僕はひたすらgolangの方のあるマイクロサービスに関わっていました。 マイクロサービスは様々なものがあるのですが、僕はpeopleの通知をよしなにするマイクロサービスをエイっとやってバーンとしていました。メインはgolangで、たまにrailsrubyのライブラリにPRを出すなどの生活をしていた世界観です。あとは社会人必須のスプレッドシートも書きました。

メンターは id:izumin5210さんで、隣の席でHHKBとMagic Trackpadを使い、vimとAlfredを凄まじい勢いで使役していたので「これがプロか....!!」となっていました。

チームには他にid:qnighyさんや@Altechさんもいて、凄まじい人間が多かったです。id:qnighyさんはPRのレビューが「教科書かな...」という感じで書いていて、隣で見ていてすごかったです。よくわからないですが、たまに踊っているらしいです。

なおid:izumin5210さんには、「僕が日に日に(id:anatofuzの)ディスプレイの上の仮面ライダーを増やしていく行為を目撃する」、「プロティンを無限に飲む人と、玄米茶を一日4Lは飲む僕に挟まれる」などの体験を提供することになってしまい、非常に申し訳なく今は思っています....。次からは玄米茶は一日2Lくらいに止めようと....

👆これらが近場のセブンで買った仮面ライダーです

Perl

基本的に僕はPerlMongerなのでPerlを書きたいのですが、残念ながらWantedlyにはPlackアプリケーションはありませんでした。切ない。

ですが特定のテストでsed的な使われ方をしているのが1件あるらしいので、実質Perl企業でした。 という訳で僕も業務中に git add しない程度の脱法Perlを着服していました。

トータルで5件くらい書いていましたが、うち1件を書いていたところメンターのid:izumin5210さんに検挙される事案が発生しました。

別にRubyGolangがメインの企業でPerlを書いたからと行って市中引き回しとか、白金台の高級住宅街でピンポンダッシュをさせられるなどの怒られは特に無かったので安心ですね。

個人的にはワンライナーでシュッとPerlを書くと落ち着く感があり非常に心理的に良かったです。 なおPerlを初週は業務中にPerlを書かなかったので、日曜日にPerlのライブラリにPRを送っていました

初週は「CrazyPerlBoy」とジョジョに出てきそう、もしくは浦沢直樹が風呂敷を広げて回収しなかった漫画のタイトルみたいな呼ばれ方をしていましたが、最終週には「Perl太郎」と呼ばれるに至りました。 やはり本名で呼ばれない

Golang

インターン中は基本的にgolangを書いていました。僕にとってgolangは処理系を多少読んだことがあるのと、Tour Of Goを多少やったことがある程度だったので、ちゃんと書いたのは初めての体験でした。

3週間くらい書いて、3割くらいはPerlに似ているのではないかと気づいたので、実質Perlを書いていました。

とはいえ静的言語を触るのは久々(C言語も静的だけど..!!)なので、「循環参照を起こして破滅」、「ポインタを使うのか実態をいれるのか焦る」、「ひたすら同じインタスタンスを連れ回す」、「エラーチェックを忘れる」、「便利パッケージの存在を知らずすべて気合で実装してしまう」などの破滅ポイントを一通り体験してきました。

作業が「破滅!!!!!!」となると、どこからともなく id:izumin5210 さんがシュッとPRにコメントしたり、ペアプロをしてもらい、最終的にはプロジェクトで使っている処理をある程度ならすっとかけたのでよさみがありました。かなり勉強させていただきました、ありがとうございます。vscodeペアプロ機能便利ですね。

他にはslackに雑に質問を書いたら皆さんから早く反応していただいて、そういう面でも良かったです。なお社内用語としては、「いい話」「なるほど」「たしかに」などはやはり使われていましたが、頻繁に「かわいそう」というワードも使われていました。

なおwantedly社内の会議室にはだいたいapple tvが置かれていて、人々がシュッと画面をうつしていたのが印象的でした。ただ会議室によっては異常に寒いところや、「なぜか日を追うごとに椅子が増えていく会議室」などがあり、都会って怖いなと思いました。

触れた技術としては名前だけ聞いたことがあった「gRPC」や「gRPC-gateway」、例のマイクロサービスなどをモリモリ触ったので実際にサービスを展開しているコードきっかけに、技術に触れる事ができて非常に面白かったです。

後は個人的にlldbやgdbを使っている影響で、ひたすらdlvを使っていましたが、たまにdlvが使えないケースがあり、そういうケースでもGitHubだけでコードを追ってしまう人々を見て、すごいな...などと思ったりもしていました。僕もそうなりたいですね。

くらし

インターン期間中は社の方に取っていただいた渋谷のマンスリーマンションに滞在していました。コインランドリーも徒歩一分だったので非常に便利でした。

毎日山手線で通勤していたのですが、時間を間違えるとそこそこ人がいるので人間って怖い....シムシティしたい....と思っていました。ちなみに初めてiphone walletにいれたSuicaを使ったのですが、非常に便利でした。我々がほしいのはおサイフケータイだったのだ...。

PRがmergeされたら、帰宅ルートの道玄坂HUBに行くのを気持ちとして頑張っていたので、2週目はわりとHUBに行っていた気がする。よくわからないですが3回通ったらメイヤーになりました。どうでもいいですが、朝の渋谷は通勤するリーマンが多いのに夜の渋谷はおもしろ人間が多いですね…。定期的にメルトダウンしている人間と、敗戦処理(リバースしたものを処理する人)を見た気がします。都会怖い...

東京に居たのでPerlコミュニティの人々と飲んだり、ちょうど東京にいたid:kaoru1615くんと飲んだり、id:mackee_wさんにビルコンに連れて行ってもらいました。ありがとうございました。

あとは秋葉原とらのあなで薄い本を見ていたら沖縄太郎さんとエンカウントし、そのままジャンク品を漁る->メイドバーに連れて行かれる->ラズパイを購入するという謎の行いをしていました。なんだったんだ。

ランチ

ランチですが、やはり社が白金台なので単価は高めです。 インターン生同士で交流をするイベントで、「白金台のちょっといいランチ」マップを貰ったのですが、行こうとしていた店が休みだったり、単価が2000円スタートだったりと、色々と都会って怖いなという案件がありました。

とはいえ目黒まで行けばある程度は安いのと、日によっては社でまかないランチ(paypayやkyash、クレカなどで払うと食べれる)などがあったので、生存していく事は出来るぞという感じでした。

仕事の進め方

仕事の進め方ですが、僕はバイト先のid:yasslabと趣味のTwitterの影響で、「とりあえず思考の過程を人々が見れる場所に書いておく」という癖があるので、issueやPRのコメント数が100を超えるものが普通に発生してしまい、wantedllyの僕が見たリポジトリの中では異常な行いをしているものを量産しました。「issueとPRが実質Twitter」と言われました

特に最初のタスクの際は、Golangの先頭が大文字だとコメントを書けというルールを矯正するLinterからの怒られが異常に発生したこともあり、トータルでコメント数が300いって笑顔みたいになっていました。

結果として id:izumin5210さんから、「どこでサポートしたらいいのかわかりやすい」と言われたので良かったかな...と思っています。

一週間目はgolangに慣れてなかったのもあり、不必要にAPIを生やしまくった結果、「使わないから削除しようね...」となり、最終的に定義したinterfaceが満たすべき関数の数が「10 -> 4」くらいに減少したので、YAGNI守っていこうね...となりました。

2週目以降はgolangにも慣れてきたので、色々とエイッとするスピードが多少向上しました。 また社にも慣れてきたので

f:id:anatofuz:20190908104106j:plain

などと言い出す日もありました。楽しかったですね。

持っていってよかったもの

何故かインターンの前にアイコンがプリントされている服を2点発注していたので、それを定期的に着ていったのですが、社内での交流会みたいなタイミングで認識されやすくなるので便利でした。顔写真がアイコンじゃないのでアイコンに自分を近づけると体験として良い。

あとはランチが単価も高ければカロリーも高いので、整腸剤を持参しておいてよかった...という感じです。ハンバーガーとか焼き肉とかが周囲にあるので、午後の業務は整腸剤が無いとぽよぽよしてしまう気がする。

ちなみに水は社にウォーターサーバーがあるのですが、かなり水を飲む太郎なので前半は紅茶、後半は玄米茶をひたすら持っていきました。特に玄米茶は1日3本は買っていたので、白金台のセブンの玄米茶の売上に貢献したと思います。支払いはSuicaでしていました。文明ですね。

成果

まだmergeされてない・別リポジトリのPRもいくつかありますが、mergeされた中ではこんな感じでした。

f:id:anatofuz:20190908104610j:plain

携わっていたpeopleアプリは最終日の前日にインストールしました。

他にはこんな感じです。

打ち上げ

最終日の金曜日がYEPP(Year end pool party)という納会がある関係で、「インターンの打ち上げと修了式を前日の木曜日にするという時空の歪み」を体験しました。

インターンの打ち上げ時では、それぞれのメンターさんから担当の学生に手紙が読み上げられるという感動体験がありましたが、僕だけ「Perl太郎と呼ばれる」というコンテンツがありました。評価としては「楽しそうに仕事している」「スプレッドシートをまとめるなど仕事ができる」「コードを書く筋力がある」と言っていただいた反面、「コンピュータサイエンス的な知識をコードに落とし込むのが弱そう」と言われたので、やっていくぞという気持ちです。

f:id:anatofuz:20190908085925j:plain 👆はインターンの打ち上げででるいい感じのケーキです。(ちなみに人の写真です) Rubyを食べようとするGopherくんです。 なお、このGopherくんは結果として僕が食べたので、「Perlの人間がgolangを食べるというコンプライアンス的に問題のありそうな行い」をしてしまったので心配。

なお金曜日の最終出社日は、セキュリティカードを返却したにも関わらず、社にキャリーケースを忘れるなどをし、id:izumin5210さんに鍵を開けてもらうなどの行いをしました。生活をちゃんとやっていきたいですね。

f:id:anatofuz:20190908105057j:plain
著者近影です

雑記

人生においては3度目のインターンなのですが、2週間以上のインターンに関しては前科があるので、「3週間最後までいれるかな…」と不安がっていましたが、「スケジュールが合えば延長していく?」と言われたり、無事完走できたりしたので良かったですね。ちょっとは成長したかな....。

あとはインターン中にAWSの例の障害が発生したりしていたので面白かったです。

という訳で皆さんありがとうございました!!!

PerlConの渡航費のカンパのお願い

追記(2019/07/08)

カンパのご協力ありがとうございました!!!

目標金額を達成していましたので一旦停止致します!!!

皆さんありがとうございました!!!!!!!!!!!!


こんにちは id:anatofuzです。

8月の7-9日の三日間にラドビアのリガでPerlConというPerlの国際カンファレンスが開催されます。

PerlCon 2019 | The European Perl Conference in Riga, Latvia

学生のうちに海外カンファレンスには行ったほうが良いという話を聞いており、 以前YAPC::Tokyoで登壇した「レガシーPerlビルド」をベースにPerlCon用にCfPを書いた結果、プロポーザルが通ったのでリガで登壇する予定です。

ですが、ラドビアへの交通費が予想以上にかかってしまい、行くことは可能ですが、今後の大学生活で利用したい資金(下宿先の家賃、生活費などなど)に支障が出てしまう事が考えられます。アルバイトや奨学金などである程度は貯金がありますが、今度無茶な予算の配分になりそうというのが見込まれます。

完全に個人的な事情で申し訳ないのですが、リガ行きの資金をいくらかカンパにて援助していただけると非常に助かります!

勝手なお願いで恐縮ですが、できればご協力をお願いします。

目標金額

  • 合計で30万ほど
  • カンパの金額はおまかせします!

用途

  • リガへの渡航費 + リガでの宿泊費 + Tシャツ費のみに充当
    • リガへの往復渡航費とTPCiR会期中のリガでの宿泊費(3泊4日)以外に利用しません
  • オーバーした分はPerl関連の団体や勉強会などに寄付致します

特典

  • 発表スライドにアイコンが乗って紹介します
  • もちろんこのブログでもご紹介致します
  • アイコン入りのTシャツを作り、それを着てPerlConで発表します

カンパの方法

申し訳ないですが口座振込 or LINE Payでの送金でお願いします。 (kyashなどでは現金化する事が難しく、宿泊費などの支払いで支障をきたす可能性がある為です)

送っていただきたい口座及びLINE Payなどは、個別にお知らせ致しますので、DMかメールなどで連絡をお願いします。

(メールアドレス anatofuz@gmail.com )

備考

  • TPCiR終了後、リガへの渡航費 + リガでの宿泊費 + Tシャツ費及び、支援していただいた金額の収支を公開致します
  • Okinawa.pmなどでPerlConのレポートと支援していただいた皆さんへの感謝のトークをする予定です

mac osのスクリーンショットの形式を変えるコマンドを作る(zshの補完も)

mac osスクリーンショットは、 defaults write com.apple.screencapture type のあとに使う形式をいれることで、作成する形式を変換することができます。

なので下のようなシェルスクリプトをzshrcの中に書いておきます。

screenshot-type () {
    if [ $# -ne 1 ]
    then
        echo "require bmp,gif,jpg,pdf,png,tiff"
        return 1
    else
        defaults write com.apple.screencapture type $1
    fi
}

これは、入力がbmp, gif, jpg, pdf, png, tiffであることを仮定し、入力をスクリーンショットが出力する形式として設定します。

とはいえ、常にjpgやpdfを想定している通り打つのはできないので、補完も書いておきます。

#compdef screenshot-type
function _screenshot-type {
    _values 'type' 'jpg' 'png' 'pdf' 'bmp' 'gif' 'tiff'
}

これを _screenshot-type などの名前で $fpathが通っている場所においておきます。

そうすると、zshscreensho-type と入力してtabを打つと、形式が保管されて便利です

ディレクトリ移動と爆速にするzshの設定

みなさん cdしていますか? 私はしています。

ところで普段からzshを使ってcdをすると、補完とかを使ってそこそこ快適にできますが、それでも「普段使うあのディレクトリにパット移動したい…」 などのケースが出てくると思います。

大体この際に対応は、zshにpecoとfast_cdあたりを組み合わせて行う運用ですが、 この場合は fast_cdが覚えているディレクトリ数が少ないため 頑張って移動しようとしても、候補のディレクトリが4つとかいう悲しい状態になります。

ということで、zshを書いていきましょう。 まずは、移動したディレクトリを覚える設定を書きます

export dirfile="$HOME/.dirfile"

function cd {
    builtin cd "$@"
    echo $PWD >>| $dirfile
}       

zshのcdのhookを使えという声もありますが、まずは無難にcdしたら $dirfile に設定しているファイルに、ディレクトリパスを追記していきます。

ちなみに、このファイルを活用すると、コマンド一発で直前のディレクトリに移動するものを書けます。

function hd {
    cd $(cat $dirfile | tail -1)
}

こうしておくと、複数端末を開いてエイヤする際にかなり便利です。

ちなみに $dirfile にゴミがたまってきたら、次のコマンドでuniqにします

function dirfileuniq {
    local new_dirfile=$(cat $dirfile | sort -rn | uniq)
    echo $new_dirfile >| $dirfile
}

はい。そしてディレクトリの移動ですが、どこかの記事で見たpecoの活用術の設定を活用します。

function peco-dir-jmp
{
    which peco z > /dev/null
    if [ $? -ne 0 ]; then
        echo "Please install peco and z"
        return (1)
    fi
    local res=$(cat $dirfile | sort -rn | uniq | peco)
    if [ -n "$res" ]; then
        BUFFER+="cd $res"
        zle accept-line
        else
            return 1
        fi
 }
zle -N peco-dir-jmp
bindkey '^[pz' peco-dir-jmp

こうしておくと、 Ctrl-pzでよしなにディレクトリ移動が可能となります。 便利でしたね。現場からは以上です