就活終わりました

こんにちは。最近MacBookProのキーボードが返ってこなくなったid:anatofuzです。キーボード押し込んだままなかなか帰ってこない...

というわけでこのエントリは就活のご報告という感じです。具体的にどこの会社に行くとかは伏せるので、気になる方はid:anatofuzを飲みに連れていきましょう。

スケジュール感

なんとなくweb系は早いイメージがあったので、10月くらいから面接をぼちぼち受けていました。 まだ21卒のスケジュールを公開していない会社は、後述する新卒エージェント的なのを利用していました。

その為「新卒エージェント氏に紹介された会社を受けた」というよりは「行きたかった会社の面接を新卒エージェント氏に頼んだ」という感じです。 エージェント氏経由だと提出する書類が簡単になるとか思ってましたが、別にそういうことは無かったので、今となっては「別に全部自分で応募してもよかったな...」と思っています。

イメージとしては、10月に某社の最終面接を受けるのが一番早く、11月にweb面接な1次・2次面接のピーク、12月が最終面接のピークという感じでした。

使ったサービス

使ったサービスは「キャリアセレクト」と「athletics(CodeSprint)」ですね。マイナビとかは会員登録さえしてないです。 なおキャリアセレクトは「Facebookで友達申請が来て、友達登録すると新卒エージェントだった」みたいな感じです。正直どうなんだろうという感じではある。 その為キャリアセレクトを使ったのは、たまたま行きたくて21卒の情報が公式サイトに無かった企業 + 書類出すのが簡単になるかな…と思っていた企業が、エージェント氏との面談で名前があがったというのが理由です。

「athletics(CodeSprint)」さん経由で会社を受けることは無かったのですが、アドバイザーさんがとかく親切でいいので皆さん使うならathleticsを使いましょう。

サポーターズさんからはアクションがあいましたが、個人的にもう大体決まっていたので面談だけして特に使ってませんでした。 また、逆求人も4月に行ったインターンの逆求人以外は行ってないです。

逆求人?

わりと様々な人々は逆求人を強く進めていますが、僕は4月のインターン以外行ってませんでした。 というのも、交通費が出るのはいいのですが、基本的に逆求人で来る企業大体同じ説があり、同じ企業と2回も3回も会うのめんどくさい...というのがあった為です。 僕はすでにいろいろな会社知っていましたが、あまり会社を知らないという人は行ってみたほうが良いかもしれない

沖縄からの就活

沖縄からの就活ですので、基本的に2次くらいまではweb面談で行っていました。 web面談は正直慣れがあると思っていて、遠方の学生で慣れているか不安な方は一度友人同士でネットで会話すると良いかもしれないです。 よく使ったのはSkypeGoogleハングアウトですが、会社によってはappearを使っているケースもありました。

面接おもしろ体験

いくつかの会社でおもしろ体験があったので書いておきます

某社1

  • 最終面接は直接あってやりたいと言われたので、東京まで行ったら本社でweb面談をすることになった
  • いきなり会議室のホワイトボードに「xxxを作るとしたらどうするか、というのを説明してください」というのをweb越しに言われる
  • appearを使っていたが回線が悪く、面接官の映像がほぼ止まっていてラジオみたいになっている
  • いきなり東進衛星予備校の収録みたいなことをした結果、「説明が上手くない」的な理由でお見送り
  • 社長と役員面接の時も「弱点は?」と聞かれ「メンタル」と答えたらそれが理由で落ちた
  • 東京まできてweb面談なら終始webで良いと思うし、いきなり東進衛星予備校の収録をしてしっかり話せる人がほしいのか...そうか...

某社2

  • お見送り理由の代わりにポエムが送りつけられて精神衛生上良くなかった
  • 落ちた理由が知りたいのではあるが...

某社3

  • お見送り理由が意味不明すぎる
  • 研究にてOSレベルまでのプログラムを読み込んでいるが、プログラム言語に対してソースレベルの話には繋がらなかったため。

  • 御社はOSの上でプログラミングをしていない...? プログラミング言語に対してソースレベルの話...? 御社のOSはFPGAで実装している...?
  • 「好きなプログラミング言語に出会ったこと」と「好きなプログラミング言語の好きな理由」は分けて話したはずなのに混同されて、そこで落ちていた
  • 「今注目している技術は?」に「Twitterでみてこういう技術が調べたら面白かったんで...」と話したら、「自ら調べて実装するのは好きではなさそう」と言われた
  • 御社のエンジニアはTwitterとかから入ってくる情報を検索したり、Perl1.0をビルドしたりするのは「自ら調べる」に入らないのか...すごいな...

某社4

  • 社長面接で「懸念点は?」と聞かれたので、正直に「メンタルですね...」と答えたら落ちた
  • 交通費めちゃくちゃ出してくれたし人事の方も丁寧だったので良かった

某社5

  • 面接で20分研究の話しをして面白かった
  • ここは通っていた

所感

  • GitHubは見られるのでなにかコードやプロダクトをあげておくと良い
  • 必ず「チーム開発はしたことある?」と「チームでどういうポジションだった?」は聞かれる
    • enpitの話をするとよさそう
  • 研究の話が出来る企業とそうでない企業がある
    • 研究の話ができない企業は、今までのインターンとバイトの話が多い
    • 研究の話が出来る企業は論文とかも見てくれている
  • インターンに行った企業名で選別されてそうなのはどうなの?という気がした
    • 地方学生不利では?
  • 勉強会/カンファレンス/コミュニティ活動は結構評価される
    • さいわい沖縄は活発なので行きやすい
  • ブログとspeekerdeckとかに資料はあげておくと、面接前に見てもらえる

就活のメモ

就活のメモは全部scrapboxを使っていました

f:id:anatofuz:20191227110942j:plain

結果が出た企業にはポプテピピックの画像を載せていました

はい

というわけで就活レポートでした。参考になれば幸いです

最近使っているOSS/自作CLIツールとか

こんにちは。 琉大アドベントカレンダーをエイッとやる係のid:anatofuzです。 これは琉大 Advent Calendar 2019 10日目の記事です。

昨日はid:onigirichanreさんの逆求人の話でした。 onigirichanre.hateblo.jp

良いですね逆求人。僕も行ったことはありますが、都会でやっている逆求人の場合あからさまに自分に興味を持っている企業(人間)と、そうでない企業が目に見えてわかるので面白いですね。 ちなみに某サイバーなんとかとの面接体験は最悪だったのを覚えています。

このエントリ

最初は自分のデスク周りの話をしようと思っていましたが、 NiZのキーボードFILCOのウッドパームレストは良いぞという話しかしないと思ったので、変更して便利コマンド/最近の自作スクリプトの話です。

あとサンテ メディカル12の目薬などは必ず持っておくと便利。

pbcopy

まずは自作コマンドでなくmac osに標準で入っているコマンドから見ていきましょう。 個人的に頻繁に使うのは、 このpbcopyです。 機能は単純で、シュッと標準入力をpbcopyにわたすと、それがクリップボードにコピーされるものです。

イディオム的によく使うのはパイプでつなげる方法でしょうか。 例えば

$echo 'hoge' | pbcopy

とすると hogeクリップボードにコピーされます。

ojichat

おじさんがLINEやメールで送ってきそうな文を生成するコマンド。 らしく一部の界隈で非常に人気のあるコマンドです。

github.com

$ ojichat
のりかチャンは、スタイルがいいね😚(^o^)😃ホント可愛すぎだよ〜😘マッタクモウ(^o^)😃☀ 😘(^_^)
$ ojichat jogo
僕はjogoチャン一筋だよ😴🤑(^^;;僕はjogoチャンの味方だかラネ😃

僕はよくTwitterid:unimarimoクソリプを飛ばす際に利用していますが、前述の pbcopy と組み合わせると効果を発揮します。

$ojichat | pbcopy

こうすると、 ojichatの出力がクリップボードにコピーされますが、標準入力をすべてpbcopyにパイプで渡している為、 実際にペーストしてみないと何が入っているかわかりません。 こうなるのが辛いので、 zshrcにシュッと書いた関数が ojicopy です。

function ojicopy {
  local ojimsg=$(ojichat $@)
  echo $ojimsg
  echo $ojimsg | pbcopy
}

使用方法は ojichatojicopy に差し替えるだけです。

$ ojicopy jogo
jogoチャン(笑)元気、ないのかなぁ(-_-;)大丈夫( ̄ー ̄?)寒いけど、頑張ってね😎(# ̄З ̄)✋😤

こうすると出力自体は ojichat を単体打ちしたのと等価ですが、恐るべきことにクリップボードにもコピーされます。 原理はシェルが読める方ならだいたい分かるかと思いますが, ojicopy の引数をojichat に渡し、その出力を変数ojimsgに代入します。 あとはただ echopbcopy を実行しているだけです。

pt

the_platinum_searcherのこと

github.com

golangで書かれた素早いgrep。最近はripgrepもいいらしいが、ptの方を使っている

fd

Rustで書かれたfinder。オプションがfinderと違うので良く忘れる

github.com

ディレクトリ移動系

cdしたらzshchpwd_functionssave_dir_historyが実行され、ホームディレクトリ以下に探索したディレクトリが追記され続ける用になっている

export dirfile="$HOME/.dirfile"


function save_dir_history {
    echo $PWD >>| $dirfile
} 
  
chpwd_functions+=save_dir_history

hd

👆で作成した dirfileの末尾は最後に cd したディレクトリです。 普段ターミナルのウィンドウをバンバン開く運用をしているので、別のターミナルで最後にcdしたディレクトリと、別のwindowsのシェルのカレントディレクトリを同期したい。 その為には dirfileの末尾にcdすればいいので、そういう運用でコマンドを書いています。 なお他の関数でdirfile を参照するには環境変数にする必要があり、 export しています。

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

こう書いておくと、⌘Nであたしいターミナルwindowを開いたら、とりあえず hd って押しておくと便利

peco

ご存知パイプで繋いだものをいい感じにインクリメンタルサーチしてくれるくん

peco-z-search

もともとはこちらのエントリを参考にして書いていたものです

qiita.com

このエントリではzshのzというツールの機能を使い、ディレクトリのインクリメンタルサーチを実現しています。 しかし僕はすでに dirfileディレクトリ一覧が入っているので、これを catPerlワンライナーに渡しています。 Perlワンライナーでは、 Perl の if (-d $file_name) を利用し、 デッドリンクでないものを出力する様にしています。 また、 id:anatofuz が、gameというディレクトリにいかがわしいタイトルのゲームを大量においているので、公衆の面前でコマンドを実行して大変なことにならないよう、 game がパスに含まれていたら削除しています。

#function peco-z-search# {{{
function peco-z-search
{   
    which peco z > /dev/null
    if [ $? -ne 0 ]; then
        echo "Please install peco and z"
        return (1)
    fi
    local res=$(cat $dirfile | perl -ne 'BEGIN{%dir;} chomp($_); $dir{$_}++; END{map { print "$_\n" if (-d $_) } grep { $_ !~ /game/ } keys %dir}' | peco)
    if [ -n "$res" ]; then
        BUFFER+="cd $res"
        zle accept-line
        else
            return 1
        fi
 }
zle -N peco-z-search
bindkey '^[pz' peco-z-search
# }}}

ちなみにこのPerlスクリプトと等価なものはだいたいこんな感じでした。

local res=$(cat $dirfile | sort -rn | uniq | peco)

heic2jpg

僕はよくiphoneで取った写真をair dropmacに送っていますが、リアルタイム撮影をしている為、拡張子がHEICで送られます。 HEICのデータは写真としてアップデートできないので、 jpegなどに変換したいですね。 実はこの変換は mac osで出来るのですが、よくコマンドを忘れるので雑にスクリプト化しています。

#!/usr/local/bin/zsh
if [ $# -ne 1 ]; then
  echo 'require heic file'
  exit 1
fi
image_title=$1:r
sips --setProperty format jpeg ${image_title}.HEIC --out ${image_title}.jpg

このsips がいい感じに画像変換をしてくれており、 jpegに変換します。 image_title=$1:r の部分ですが, zshの機能で ${str}:r とすると、${str} の拡張子を取り除くことが可能となります。 これをシュッと実行すると、実行したディレクトリで、HEICのファイル名と同じjpegファイルが生成されます。

screenshot-type

mac osで取得するスクリーンショットの種類を変更してくれるコマンド 何が変更できるか覚えられないので、 tabを叩くといい感じに保管してくれるようになっています

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
}

screenshot-type j でタブ押すと、いい感じにjpgに保管してコマンドを実行してくれる。 これの補完関数を $fpath が通っているディレクトリに _screenshot-type という名前で登録している。

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

_values と書いておくと、コマンドの引数として補完される。

hg-browse

僕らの大学と研究室ではgitの他にmercurialを利用しているが、 gitでいうところのhubコマンドの hub browse みたいなのが無かったから書いたスクリプト。 基本自分の大学の環境で出来るようにしている。

#!/usr/bin/env perl
use strict;
use warnings;
use IPC::Run3;


# hg config経由でhgrcにかかれているpush先を確認する
my @cmd = ('hg','config','paths.default');
my ($stdout,$stderr);
eval { run3 \@cmd,undef,\$stdout,\$stderr;};

if ($@){
    print "error! >> $stderr";
    exit 1;
}

# 無かったら特に何もしない
exit 1 unless ($stdout);

# yomitanはパスで開けないので別枠
if ($stdout =~ /yomitan/){
    yomitan($stdout);
} elsif ($stdout =~ /firefly/){
    firefly($stdout);
}

if ( $stdout =~ m[(https?|ssh)://(\w+@)?(.*)]){
    my $url = "http://$3";
    @cmd = ('open',$url);
    eval { run3 \@cmd,undef,\$stdout,\$stderr;};
    if ($@){
        print "error! >> $stderr";
        exit 1;
    }
}


sub yomitan {
    my $input  = shift;
    my $http_domain = 'https://ie.u-ryukyu.ac.jp/hg/';
    my $mid_path = 'index.cgi/home/hg/';
    my $url;

    if ($input =~ m[.*//home/hg/y(\d+)(.+)]){
        $url = $http_domain . "y$1/".$mid_path."y$1".$2;
    }
    @cmd = ('open',$url);
    eval { run3 \@cmd,undef,\$stdout,\$stderr;};
    exit 0;
}

sub firefly {
    my $input  = shift;
    my $http_domain = 'http://www.cr.ie.u-ryukyu.ac.jp/';
    my $url;
    if (($input =~ m[.*?firefly.cr.ie.u-ryukyu.ac.jp/(.*)] )||($input =~  m[.*firefly/(.*)])){
        $url = $http_domain.$1;
    }
    @cmd = ('open',$url);
    eval { run3 \@cmd,undef,\$stdout,\$stderr;};
    exit 0;
}

例えばhgrcにこういうのが書かれているリポジトリの場合

[paths]
default = ssh://yomitan//home/hg/y15/e155730/OS/ex6.3
$hg-browse

リポジトリ内で実行すると、 https://ie.u-ryukyu.ac.jp/hg/y15/index.cgi/home/hg/y15/e155730/OS/ex6.3 を自動でopenしてくれるくん


というわけで色々な便利モジュール集でした。個人的にはだいたいターミナル上で生活している人間なので、このあたりのおもしろツールをいかに使う/作るかを考えています。 もし皆さんもちょっとシェルやCUIをカスタマイズしようと思ったら、参考にしてもらえれば幸いです。

明日はid:sdr816くんです

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のレポートと支援していただいた皆さんへの感謝のトークをする予定です