fedoraのfirewall-cmdでsshのIP制御を行う

あらまし

以前までfedorasshなどのIP制御をする場合は/etc/hosts.deny/etc/hosts.allowをいい感じに編集することで行っていました。

www.thegeekdiary.com

しかし最近のfedoraではこれらが非推奨になっているらしく、公式のフォーラムなどを見てもfirewalldを使えとの回答があるので、こちらで行ってみます。

Changes/Deprecate TCP wrappers - Fedora Project Wiki

forums.fedoraforum.org

なおfirewalldに対応するfirewall-cmd以外を使う方法では、nftablesを使う方法があり、こちらに関してはこのエントリを見るといい様です。

knowledge.sakura.ad.jp

fedorasshのIP制御をする

試しに某大学のIPアドレス及びプライベートIPアドレス以外のsshログインを制御してみます。

現在の設定の確認にはfirewall-cmdの list-allオプションを使います

$firewall-cmd --list-all

FedoraServer
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: dhcpv6-client http https ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

この場合 FedoraServer というzoneが使われており、許可しているservicesがhttp, https, ssh, dhcpv6-clientであるという状態です。デフォルトですね。

すべてのsshのログインを弾く

すべてのsshアクセスを弾くにはservicesからsshを外せばいいです。

$firewall-cmd --remove-service=ssh --zone=FedoraServer --permanent

処理をしたら忘れずにリロードを実行します

$ firewall-cmd --reload

特定のIPからのsshを許可する

次に許可したいIPをTCPの22番ポートのアクセスを許可する設定にしていきます。(sshTCPで22番ポートを使うので)

IPとサブネットマスクの表現はCIDRが使えます。

$firewall-cmd --permanent --zone=FedoraServer --add-rich-rule="rule family="ipv4" source address="133.13.0.0/16" port protocol="tcp" port="22" accept"
$firewall-cmd --permanent --zone=FedoraServer --add-rich-rule="rule family="ipv4" source address="10.0.0.0/8" port protocol="tcp" port="22" accept"

処理をしたら忘れずにリロードを実行します

$ firewall-cmd --reload

ここまで出来たら再び --list-allで確認すればいい感じになると思います。 取り急ぎこんな感じで...

mac OS Catalinaでlibcのドキュメントをmanでみる

なんかデフォルトのMANPATHに含まれなくなってしまったらしいので、みたい場合は~/.zshrcなどに以下を書き加える必要がある

export MANPATH="/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/share/man:$MANPATH"

具体的なバージョンは/Library/Developer/CommandLineToolsの中身に依存する(大体14か15)

PerlCon 2019に参加してきました!!!

こんにちは! id:anatofuzです。

皆さんのおかげで、ラトビアのリガで開催されたPerlCon2019に参加し、無事帰ってくる事ができました!!! 報告が遅れてしまいすいません 🙇

という訳でこのブログではPerlConの参加から帰国までのイベントレポートを乗せていこうと思います!!

旅レポート

初日

今回の旅は id:papixさんと共に行動をする旅でした。 日本からHelsinkiへの便はちょうどお昼というのもあり、当日沖縄から東京、そしてHelsinkiはかなり時間的に厳しいので、前日入りをするぞ!!!となっていました。

papixさんと「前日は大江戸温泉物語で」などと話していましたが、id:papixさんが成田空港内のいい感じのホテルを抑えていただくことに成功したので、二人でそこに宿泊することになりました。 その為、初日は、那覇から成田のホテルへの移動となりました。(なお完全にいつもどおりに羽田行きの便を取ってしまった)

成田へバスで。空港から空港へのバスってあるんですね..

今回のためにイオンモールイカムで購入した大きめのキャリーケースに、目印としてはてなブログと研究室のアイコン、そして旅のお守りとしてポプテピピックのステッカーを当日貼り付け、出発しました。自宅から那覇羽田空港までは順調に進み、そのままリムジンバスに乗り込んで成田空港へと向かいました。

f:id:anatofuz:20191229155848j:plain
今回のために買ったキャリーケース。イギリスの国旗があしらわれていて、気持ちで負けないようにポプテピピックのステッカーを貼った

成田空港ではすでにid:papixさんが資料作成のためにカフェに滞在しており、合流後、二人でひとまずホテルへ向かいました。 ホテルへは成田空港から無料バスが出ており、いい感じに輸送されます。 ホテルの部屋からは空港を見ることができ、「空港じゃん....」という小学生みたいな感想を抱きました。

ホテルからみた風景 空港じゃん.

成田で日本を経つ前の最後の晩餐(?)として、成田空港でとんかつを食べ、id:papixさんはFitBoxingをし、僕は資料を書きながらその日は寝ました。

東京 -> ヘルシンキ

次の日はシュッと朝起きて空港に移動、出国審査関連の手続きが始まるまで荷物を預けるなどしていました。 papixさんが昨年修行をしていた為、専用レーンでシュッと手続きをする事ができたので「修行すごい....」と思っていました。

初めての海外なのでテンションが上って電光掲示板を撮影した.

券です

朝食はまだ食べていなかったので、これもpapixさんの力でラウンジに乗り込み、修行パワーで無料で提供される朝食を食べていました。 (めちゃくちゃ海外旅行慣れてそうなスーツ姿の人々もいて、「これが国際線ラウンジ...」となっていました)

ラウンジでの朝食とpapixさん.

ラウンジです.

ラウンジ以外では国際線のゲートを超えた先の風景にテンションが上っていました。 なお今からラクダのプログラミング言語のカンファレンスに行くはずなのに、「らくだだめだ」という衝撃的なポスターを目撃する...

いろいろオタクてきなのがあった.

というわけで搭乗です。普段は国内線のLCC的な飛行機しか乗らないので、大きくて圧倒された。

ここに国内の地名以外が出るのが新鮮だった.

機内は定期的に食べ物がデプロイされるシステムになっており、国際線の便に乗っていれば餓死することはないなと感じました。 ポプテピピックの「ビーフオアチキン?」の再現はできなかった。

ハンバーガー作れたのははしゃいだ.

機内はまくらやUSB充電、タブレット端末などがありインターネットカフェか?という感じでした。 wifiも課金すれば使えたので、資料を書くためとTwitterをするためにwifi繋いでました。自宅のネット環境よりは早かった。 今現在航空機がいる場所が地図で出ていましたが、ほとんどロシア上空だったのが面白かったです。マジでロシアは大きい…

しばらくは資料づくりを頑張って、資料が終わった後はタブレットにinstallしていたシャークネードを見ていました。 papixさんはSwitchやってました。シャークネード1は良かったですが、シャークネード2を見ようとしたら、「開幕15分くらいで飛行機にシャークネードが突っ込む」シーンだったので、「これは国際線に乗っている今見るものではない」と思いそっ閉じしました。

充実の機内設備.

そしてついに海外上陸です!!! 我々がついたのはフィンランドヘルシンキ空港です。

ヘルシンキ空港

ヘルシンキ空港では「無限に続くかと思われる、ホラーゲームで絶対敵が出る廊下」や、「唐突の日本語」、「トイレの手を拭くやつがリサイクル式になっていて、伸ばして引っ込める」などの衝撃体験がありました。 入国審査は「Papers, Please」で鍛えたにも関わらず、先にpapixさんが行っていたためか、「Hello」の一言で通過という状況でした。

ヘルシンキ空港

そして空港のRkioskiで「DNA」という絶妙にPerl感があるSIMカードを購入しました。滞在日数に比べてかなり容量があるプランだったらしいのですが、僕のiphoneが「写真を問答無用でicloudにアップロードする機能が有効になっていた」為に、このプランに救われました。

そこからは電車に乗ってヘルシンキ中央駅へ!! なおフィンランドの公共交通はすべて同じ乗車券になっていて、滞在日数に合わせて3日分などの様に買うことができます。 特に改札などは存在しませんが、乗務員から提示を求められた際に期限が切れていたりすると問題が発生するタイプの様です。今回は提示を求められることは無かったです。

電車でgoです

ヘルシンキ中央駅の周辺は、いかにも「ヨーロッパです」という感じでした。街がすべてディズニーランドじゃん...。みたいな感じでした。 ここまでの電車や、この町並みで本当に海外に来たんだなぁと実感しました。

このあたりには「いかにもヨーロッパっぽい銅像」や「すごみのあるアフラック」「日本料理店」などがありました。

ヘルシンキの風景

ホテルBothにチェックインを済ませ、その日は近くのスーパーで買ったサンドイッチなどを食べました。 ヘルシンキでは、水だと思ったらだいたい炭酸水が売っていて、ビールは夜は発売禁止になる世界観です。 スーパーはベルトコンベアに商品を載せて精算するシステムでした。

スーパーです。ヘルシンキの小売店は、店内に大体スロットマシンが置かれている

ご飯です

というわけで時差が辛いのもあるので、この日の晩はpapixさんのFitBoxingを見届けて寝ました。

2日目

2日目のヘルシンキは10度スタートでした。早朝と深夜は冷えるという情報があり、薄手のパーカーを念のために持っていきましたが、常に寒かったのでほぼパーカーを着ていました。 とはいえ現地のおじさまは、半袖短パンでランニングをしており、「これが国の違い…」となっていました。  

市場

この日は朝市でご飯を食べようという流れになり、路面電車を利用して海岸沿いの市場に行きました。

移動風景

路面電車に乗ったのは初めてか久しぶりな気がします。 話には聞いていましたが、海外にはあまり電柱がない。

路面電車車内/車外

朝市会場は海沿いで、常にうみねこかカモメ的なのが鳴いていてのどかでした。 早く付きすぎて、まだ朝市は動いていなかったのでしばらく探索していました。

港の風景。おしゃれ...

ヘルシンキのオシャレ度は凄まじく、公衆トイレもめちゃくちゃオシャレでした。

これがまさかの公衆トイレ

付近には環状のオシャレな建物や、大きい碇などがあり記念撮影などをしていました

円周率を学ぶ辺りの算数の教科書に出てきそうな環状の建物

大きい碇とpapixさん。Ingressのポータルでした

町並みはやはりオシャレ…ドラマの世界じゃん....

ローラースルーゴーゴーみたいなのがよくおいてあって、レンタルできる

そんなことをしていると、そろそろ市場も開いてきたので適当な店で朝食を取りました。 飲食系の屋台以外には、民芸品を売る屋台などもありました。

今回はMooseのミートパイと、ムーミンのベリー系の炭酸飲料を買いました。 Mooseという名前を見た瞬間、Perlを感じてしまった。

店内はヒーターみたいなのがついていて、「夏の気温じゃねぇ...」という感じでした。

朝食を食べた店です。カード決済もできる

会計時にセントとユーロの硬貨がパッと区別がつかずちょっと焦りました。

鹿のパイとムーミンの炭酸飲料。ベリーっぽい

スオメンリンナ

ご飯も食べたので、観光再開です。ここの市場からフェリーでスオメンリンナ島に移動できます。 このフェリーは前日の電車や、朝方乗った路面電車と同じ乗車券で乗ることができます。

フェリーです

フェリー乗り場

デッキの上にでていました。風が心地よかった

著者近影

スオメンリンナ島に上陸した際は、朝早かったのでぼちぼちでしたが、帰るときには日本人旅行客や、様々な国の観光客の方が来ていました。 スオメンリンナ島、めちゃくちゃオシャレ度が高くて、建物も歴史を感じつつオシャレ度が高い。 要塞だけありかなり強そうな建物が並んでいました。

スオメンリンナ

道中いかにもゼルダとかに出てくる、「序盤と終盤に行くとイベントが発生する場所」を見ました。

光の当たり方も素晴らしい

ヨーロッパ==RPGみたいな図式があるので、「復活できるセーブポイントやんけ!!!」みたいな場所もありました。とはいえ実際にドンパチやっていた場所なので、第二次大戦などの戦争を感じさせるものも多かったです

教会です。鐘を鳴らすとイベントが起きそう

石で作られた要塞は当時の戦争風景を感じさせられました。 キングスゲートというカッコいい名前の場所もありました。 (当時は船でこのキングスゲートに国賓が来ていたらしい)

要塞です

そしてスオメンリンナ島には至るところに大砲があります。 今では玉の代わりにゴミが詰められている大砲もありましたが、大砲の存在感はすごかったです

大砲です

大砲を撮影している時に、id:papixさんが中国系の観光客の方から話しかけられ、記念撮影をしてあげるなどのやり取りがありました。

あとはなんか、日本では見たことがない鳥がめっちゃいました。 忍者龍剣伝で見たことがある気がする。

とりです

スオメンリンナ島には博物館も多数設立されていますが、今回は戦争博物館に行きました。 ちょっとした日本語ガイドみたいなのもあって便利。(とはいえ展示物はフィンランド語/英語で解説されているので、だいたいは英語を読む)

こういう博物館行ったことがないので「おおっ!!」と言っていた

papixさんがめちゃくちゃテンションが上っていた

スオメンリンナ島の象徴的なもの

教会の中に入れました

ひとしきりスオメンリンナ島を満足した我々は、フェリー乗り場の前で酒を飲みつつ休憩しました。ciderってサイダーじゃなくてりんご酒の方。

シードルと洗剤みたいな容器に入っているファンタっぽい飲み物。果肉入りで、ファンタより甘かった

そしてフェリー乗船。再びヘルシンキ市場に戻ります。

そしてスオメンリンナ島から戻りました

すでに1日終わった感がありましたが、まだ昼前になっていません。 市場にはうみねことか背中に円柱が刺さっているカメの石像がありました。

戻りました

近場の教会(生神女就寝大聖堂)

まずは近場の教会に行ってみます。「信号とかも縦じゃん! すごい!!」みたいな感じでした

自転車も借りれる

今回は中に入れなかったので、写真だけ取って楽しみました。

色合いとかの雰囲気もいい

ヘルシンキ大聖堂

そしてヘルシンキ大聖堂へ向かいました。 観光地なので様々なバスや路面電車が行き交っています。

ヘルシンキ大聖堂です

ヘルシンキ大聖堂は中にも入れました。

ヘルシンキ大聖堂です

ヘルシンキ大聖堂です

このあたり

そして路面電車テンペリアウキオ教会へと向かいます

路面電車に乗車。券売機もある

テンペリアウキオ教会

テンペリアウキオ教会は岩を重ねて作られている教会で、今はコンサート会場としても使われている様です。 僕たちが入ったときはジャズピアノのコンサートをしていました。 「サラウンド環境じゃん...音質めっちゃいい...」みたいな感想です

テンペリアウキオ教会です

テンペリアウキオ教会からは一旦ホテルに戻り休憩しました。 かなり活動した感じはありましたが、まだ時間があるので ヌークシオ国立公園へと向かうことになりました。

ヌークシオ国立公園

まずは最寄り駅へ電車で向かいます。

ヘルシンキ中央駅で路面ではない電車に乗りました

電車に乗る前に、ヘルシンキ中央駅の売店でご飯と水を買ったのですが、なんと水のペットボトルのキャップが半開きになっていました。店員のお兄さんがいい人で、変えてきていいよとか言ってくれた...

次にバスに乗り換えて向かいます。降りるバス停をミスって結構歩くことになりました。

バスです。バスは乗車券を運転手さんに見せたりする

国立公園まではひたすら山道を歩きます。 道中にマツダやホンダなどの、日本車のホイールが落ちていました。こんなとこで日本を...

山道です

公園は非常に森と湖が綺麗でした。桟橋みたいなのがグラグラして面白かった。

湖が綺麗でした

ベンチで先程買ったパン的なものと水(炭酸水)を飲んで休憩です。 パン的なもの、なんかネチョネチョしていてあまり美味しくはなかった...

ごはんタイムです

ここで休憩していたら、午前中にスオメンリンナ島でid:papixさんが記念撮影をしてあげた中国系観光客のおばさまと再開するというおもしろ体験がありました。おばさまも疲れていたみたいなので、ここから3人でヘルシンキ市内へと戻ります。

3人で帰宅

道中でいい感じのスポットにもよりました

かなりいい風景

この日は疲れからか、電車に乗っている時から頭痛が発生してしまい、早めに眠りにつきました。 ご飯は前日と同じでスーパーで購入しました。 あとはこういう体験もありました

3日目

3日目はしばらくヘルシンキに滞在した後、メイン目的地のラトビア、リガへと向かいます。

エロマンガで朝食

id:papixさんの提案で、2人でエロ漫画に行きました。 エロ漫画という名前ですが、エロ漫画は売っておらず、パン屋さんです。 店内にはお父様がご飯を食べていて、エロ漫画ではなく新聞を読んでいました。

ピロシキと、バナナとベリーが混ざったドロッとした健康飲料的なのを飲んでいました。

オシャレなエロ漫画です

近くにはどうみてもポータルな冬戦争のモニュメントなどもありました。

QRコードがあって、撮影すると詳細のwebページに飛ぶ

デザイン博物館らしく、いろいろアートっぽいものが立ち並ぶ

公園

近場には公園があり、ちょっと散歩しました。 ここにも教会的なものがあり、「こ、これが北欧...!」となっていました。

のんびり散歩しました

カンピ礼拝堂

そしてカンピ礼拝堂に向かいました。ここは静寂に包まれていて、弓道部時代を思い出しました。 都会は色々うるさいですが、こういう場所があると心落ち着きますね...。

中は写真は取れないですが、静寂に包まれていました

突然の語録....

ヘルシンキ市街

さていよいよヘルシンキともお別れをし、リガへと向かいます。 路面電車ヘルシンキ中央駅へと向かいます。

ヘルシンキ市街

再び電車に乗ってGo!

ヘルシンキ空港へ

ヘルシンキ空港

ヘルシンキ空港では、リガへの搭乗手続きを英語でしたり、手荷物預け入れをしたりと英語実践編みたいな感じでした。(手続きが無事できた時は感動した)

ヘルシンキ空港

お土産屋さんでは鹿の絨毯用の毛皮などが売っていました。 我々はid:papixさんの力を利用して、ヘルシンキ空港のラウンジに行っていました。

ラウンジはハチャメチャにオシャレで、鮭のスープが美味しかったです。 また、ラウンジで「沖縄の研究室のサーバーにssh」するという実績を解除し、「グローバルIPってすごい....」と実感しました。

ラウンジ

そしてFinAirでリガへ。プロペラ機です。 機内サービスのジュースの注文は焦りましたが、「指出してThis one」で乗り切りました。 夏に研究室に来ていたインド人留学生から学んだテクニックが役に立った...。

プロペラ機です

機内風景

リガ

そうこうしている内にリガです。リガへの入国は、特に入国審査などがなく、国内線のノリで乗る事ができます。まずはリガから、papixさんがboltという配車アプリでタクシーを手配し、ホテルへ向かいました。

リガです

リガのホテル

リガのホテルでは危うく予約されていないという状況になりそうでしたが、なんとか無事乗り込むことができました。音楽イベントをやっている関係で、どこのホテルも満員に近いらしい。

無事ついて一息

ついでに目の前のコンビニ(スーパー?)で飲み物とお菓子を買いました。

リガでの食事

近場にLidoといういい感じのレストランがあるようなので徒歩で行きました。 ラトビアの料理をいい感じにバイキングでトレーに載せ、載せた食べ物に応じて会計というシステムです。

町並み

ご飯はなかなか美味しく、注文も実物をバイキングすればいいのでなかなか良かったです。 (料理名を見ても瞬時に日本語でイメージがつかないですが、バイキングならその点が解消される)

料理です

3日目 (PerlCon 1日目)

移動

いよいよPerlConが始まります! まずは会場まで僕がBoltでタクシーを呼び、向かいます。 boltは最初から目的地を登録するので、後は乗り込むだけ。支払いもクレジットカードで、しかも友達の紹介だとかなり無料で乗ることができます。

配車アプリで移動しました

その為タクシーも日本のようなタクシーではなく、普通の車にbolt用のスマホが備え付けられているという世界観でした。

タクシーからの眺め

会場であるRadisson Blu Daugavaに到着です!(グループのホテルがラトビアに他に何個かあった)

会場到着

PerlConには日本からは、papixさん、 charsbarさん, skajiさん、福岡に今いらっしゃるgugodさん、私が参加しました。

会場

チェックインとPerlConの受付を済ませ、ぐるっと会場を見て回ります。 PerlConではメインホールが$部屋で、1階上がった先のサブ会場が、それぞれ@%というPerlのシジルがつけられた名前でした。

会場の前には旗がある

メイン会場前の旗 | 入り口のプログラム | サンドイッチなどの軽食が食べれるとこ

もちろんノベルティもあって、Perlのマークや「I love Perl5|6」のステッカー、LarryWallのポストカードなどがもらえました。2階の@%の部屋の前では、定期的に軽食が食べられる懇談の時間があります。

ノベルティとサンドイッチ

オープニング、聞いたトーク

オープニングではカッコいいPerlConの紹介ビデオがキル・ビルのテーマに乗って放送されていました。会場にはこれなかったLarryからのビデオメッセージが再生された後、PerlのメインコミッタであるSawyerXのキーノートが始まりました。

$会場の雰囲気

Sawyerのキーノート

Sawyerのトークは今までのPerl5のバージョンごとの歴史や、今後のアップデートで強化していきたいことなどの、日本ではあまり聞けないPerl自体の話でした。 SawyerはCPANなどのアイコンが自分の顔で、見た感じ怖そう...と思っていましたが、素晴らしく優しい良い方でした。charsbarさんが繋いでくれて、お話する事もできました。「Perl5のリポジトリにcommitするにはどうしたらいい?」という質問に「とりあえずcommitしてくれれば指摘するよ!!」みたいに答えてもらえました。当日は恋人(?)といつも一緒に行動していたのが微笑ましかったです。

Perl6の本とblack stories

PerlConは売店もあり、Perlの書籍やグッズが販売されていました。 Wendy Van Dijk さんが店員だったのですが、気さくに話しかけてくれて、クッキーの型付ききまでおまけでくれました。「Perl6の本ならどれがオススメ?」と聞いたら教えてくれた本を買っています。

PerlConには本棚のタペストリーがありましたがこれはWendyとLizの本棚だそうです。

売店では他に「Perl」というワインが売られていて、charsbarさんやgugodさんによると、これはドイツに「Perl」という地名の田舎町があり、その町のワインをWendyたちが売っているそうです。

初日のトークは、まさかのcharsbarさんの裏番組がpapixさんという日本人がブッキングするという事件もありましたが、面白いトークが多かったです。特にPerl6プロジェクトのメインコミッタであるJonathan Worthingtonによる、Perl6の高速化の話は面白かったです。MoarVMに関する最近のアップデートや、Perl6が驚くべきことにPerl5よりも早い処理があるなどの衝撃的な発表に興奮していました。

もともと卒研で触っていた内容でもあったのでかなり興味深く、Twitterでツイートしたところ、IRCに誘われました。

Perl6の高速化について

papixさんのトークでは、明日の僕のトークの宣伝も入りました。

突然のトーク順番変更

なんと本来は私のトークは初日だったのですが、Sawyerのトークを聞いてるあたり、こんなメールが来ました。

Hi Tokahiru,

We moved your talk to the Day 2 of the conference.

Please find us to get another lunch ticket.

Thank you for your understanding.

Andrey
-- 
PerlCon 2019
____________________________________________________________________________
The European Perl Conference in Riga, Latvia
https://perlcon.eu | mail@perlcon.eu

ま、まさかの当日順番変更....!!! というわけでスピーカーのランチチケットを取り替えてもらい、私のトークは翌日2日目に移動になったのです...。

部屋騒動

PerlCon初日が終わり、ホテルの部屋に行こうとしましたが色々と問題がありました。 部屋はカードキーで入るのですが、手書きで書いてもらった部屋番号が「651」にしか見えなくて、その部屋を開けようとしたのですが、一向に開かない....。 ロビーで問い合わせようと1Fに降り、偶然居たcharsbarさんに聞いたところ「651」じゃなくて「657」だったというオチでした。

そして部屋に入ったにも関わらず、我々を迎えていたのは...

ベット*2と思っていたのに、まさかのダブルベッド1つ。流石にid:papixさんとダブルベッドはお互いにきついので、フロントに「I want an extra bed!! Please separate bed!! today!!! 」みたいに頼み込んでエクストラベッドをもらいました。

夜はcharsbarさん、skajiさん,papixさんで食事に行きました。 charsbarさんが終始優しくて本当にありがとうございました...! (明日トークだったのですでに緊張していた)

おいしいビールをいただきました

4日目 (PerlCon 2日目)

朝ごはん

すでに緊張していましたが、ご飯を食べました

自分のトーク

PerlCon2日目ではいよいよ僕のトークです。

というわけで異常に緊張していました。具体的に緊張の例を上げると

  • 昼ごはんがほとんど食べられない
  • トイレに6回行く
  • 部屋に内鍵したことに気づかない
  • お腹が以上に痛くなる
  • 部屋に水を忘れたことに気づかない
  • 発表前に自分のPCから映像が映らず異常に焦る

などがありました。緊張していましたね...。

とーくのスライドは、

  • Google翻訳で違和感ない日本語に戻せるかチェック
  • Grammalyでチェック
  • DMM英会話などの文例を使う

などをして作りました。

会場は前日のpapixさんと同じで@部屋でした。

トークですがスライドはこちらです。フロッピーディスクの辺りでウケがあって良かった。

日本からきていた皆さんが来てくださったのですが、あのSawyerXも来ていただいていて、非常にびっくりしました。(気づいたのはトークが終わった後の質疑応答のタイミングだったと思う)

トーク自体はYoutubeに上がっています。


Takahiro Shimizu. How to build traditional Perl interpreters

トークは極度に緊張していたのですが、一種のクライマーズ・ハイというか、実際に話していたときは夢中になっていて、あまり覚えていないです。聞いたところ「所々日本語が出たり怪しそうだったが、勢いで乗り切っていた」という話だったので、ま、まぁ良かったかな...という感じです。トーク終わった後にSawyerに握手を求められたのがすごい嬉しかった。

トークが終わって、廊下で休んでいたら、先程のトークを聞いていてくださった方から「面白かったよ、いつもそういうことしてるの?」と言われて「他にPython0.9.1ビルドしてます...」とか話しら興味深そうに聞いてくれました。

聞いたトーク

2日目はLTなどもあり、密度が結構濃かったです。 最初はElizabeth Mattijsenによるキーノートで、Perl6の現状や、Perl6の噂を検証するというものでした。この日はElizabethから「Perl6をCameliaという名前にしない?」という提案がキーノート内でありました。(最終的にはRakuになりましたが)

この方はトークをすべてターミナルでやっていて面白かったです。 (おもしろコマンド, API紹介みたいなトークでした)

次のPerlConの会場投票の開票

僕は別のトークに行っていましたが、WebPerl という凄まじい発表があったのも2日目です。 また、Twitterのフォロワーでもある、AlexanderのRakuのWAFであるCroに関するトークを聞いていました。

かなりPerl6成分が多めだったので、聞いていて楽しかったです。スライドをLaTeXで作っている方もいました。トークの内容は(僕が英語がそこまでよく理解できないのもありますが)、日本人の方が(話し方|技術的に)に上手いというのもあったと思います。

スピーカーディナーなど

2日目ではスピーカーディナーがありました。偶然にもリガに来て初日に行ったレストランと同じ店でした。スピーカーディナーには、NW在住のMakoto Nozakiさんブルガリアのエンジニア、カナダで図書館システムを開発しているPerl6が好きなおじさんなどと喋りました。他にはcharsbarさんの紹介で、Perl6のコアコミッタの方ともお話する事ができました。

あまり懇親会が日本でも得意ではなかったのがあるのですが、もっと英語を喋れるようになってガンガン話したい...!と思いました。

5日目 (PerlCon 3日目)

3日目はトークも終わり、リラックスして聞いていました。

朝ごはんです

聞いたトーク

KeynoteはJonathan Worthingtonで、1日目と少し似ているPerl6の今後についてのトークでした。 3日目はMoarVMの高速化というより、文法やモジュールの話、並列構文などが中心でした。

他にはXSを使ってPerlのオペコードを上書きする話や、skajiさんのcpmの話、Perl6を使って実装した同時進化アルゴリズムの話などがありました。

LTや合間で入ってくるジョーク、英語が上手く聞き取れないので意味が理解できなくて笑えないのが悔しい...!となりました。LTはLTなので早くて集中力が試される感じがありました。

抽選会

3日目の終わりに差し掛かっている頃、BlackStoriesの提供で、参加者の名前が呼び上げられたらプレゼントが貰えるくじがありました。 偶然にも名前が呼ばれて、BlackStories海外版をもらいました。

BlackStories英語版をもらいました! (留学生とやりたい)

close後

PerlConのクロージングは、この3日間のスライドショーとスタッフのエンドロールなどが再生されました。あの規模のカンファレンスを2名+技術班で運用しているのはすごかった...!

その後は日本からの人々で集まって、はちみつビールやうさぎなどを食べていました。

うさぎです

うさぎは鶏肉に似ていましたが、鶏肉よりも獣感が強いと言うか、肉を食べている感じが強かったです。

はちみつビールは非常に甘くて美味しかったです。

黒いビールがはちみつビール、にんにくのおつまみとか

その後はpapixさんと夜のリガを歩きながらホテルへ向かいました。 コンテンツ力が高かった「ボタンを押し続けないと上昇しないエレベーター」は面白かったです。

ボタンを押し続けないと上昇しないエレベーター

夜のリガ市街

6日目 リガ->ヘルシンキ->日本

楽しかった旅も終わり、いよいよ帰宅です。 その前にリガをもう少し観光します

~自由の記念碑

昨日の晩の散歩でみかけたような道を歩きます。 ラトビアヘルシンキと比べると落ち着いては居ますが、ヨーロッパらしさは相変わらずです。

普通の町並みも良い絵になる

そして自由の記念碑へ! 兵隊さんが警備していました

自由の記念碑

ねこ

PerlConのマークにもなっている猫を見かけました。かわいいですね。 意外と写真を取っている人が少なかった気もする。

ねこです

聖ペテロ教会の塔

塔です

エレベーターに乗ると上にいける

塔の中も非常に美しい

そして近くの売店で水を買い、boltでリガの空港へ向かいました

コンビニでの買い物はしっかりできるようになった

リガ->ヘルシンキ

リガの空港でお土産やコーラを買ったりしてちょっとゆっくり。 自動販売機はクレジットカード決済に対応していてこれがキャッシュレス...となりました。

ヤクザとコーラです

リガからヘルシンキはまたプロペラ機です。

プロペラ機に乗り込むぞ!!

ヘルシンキ->日本

ヘルシンキではムーミン関連のお土産を買ったり、謎の味千ラーメンを見たり、自販機で飲み物を購入しました。お土産売り場では唐突に店員に日本語で話しかけられたり、サルミアッキを買うなどの体験をしました。

ヘルシンキへの入国で、自動でパスポートの顔と認証するシステムがったのですが、なぜか僕だけスムーズに反応せず、「2分くらい顔認証のブース内で足止め」という悲しい出来事も体験しました。

空港内。なんかラーメン屋がある

最後に自動販売機でムーミンの炭酸飲料を買いました

そして飛行機に乗り込みます。まさかのタラップではなくバスで移動...。

そして飛行機へ...

機内では炭酸がおいてあったり、アイスを貰ったり、またご飯を無限にもらうなどしました。 寝ないといけなかったのですが、なかなか眠れず、日本についたときは大変でした。

機内風景。帰りは疲れていました

~日本

そして日本に ...!!

Perlのカンファレンスに参加したので健康相談室に行かなきゃ...と思いながら入国しました。

とりあえず成田のレンタルシャワーでシャワーを浴びて、そのまま実家山梨にバスで移動しました。 (本当は大江戸温泉とかに行こうとしたが、疲れていて早く家かホテルに行きたかった)

ということで無事帰国しました!!

感想

今回は初めての海外、初めての国際線、初めての海外カンファレンスと初めてづく目だったので、無事に行って返ってこれて良かった!! という感じでした。特にほぼ日一緒にいたpapixさんや、現地で合流したcharsbarさん、skajiさん、gugodさんにはお世話になりました。ありがとうございました!!!

初めての海外では「英語って本当に言語なんだな...」という感想を得ました。変かもしれませんが、普段書籍や映画,洋曲などで英語が使われているメディアとは触れていますが、実際に英語話者が多数派の世界には行ったことはありませんでした。今回始めて海外に行き、日本語話者が圧倒的に少ない世界に行ってみると「英語って本当に会話で使われている!!!」という、当たり前ではありますが、実感として持つことができたと思います。英語勉強しっかりやっていきたい。

またPerlConでは海外のPerlMongerとお会いできたのが非常に刺激になりました。CPANでアイコンで見たことがある方々が実際に動いて喋っているのは「実在したんだ!!!」みたいな体験でした。特にSawyerとAlexandreに会えたのは良かったです。Perlを作っている彼らも1人の人間なんだなと感じました。僕も彼らと開発してみたいなと強く感じました。

PerlConは日本のYAPCと同じような熱気もありつつ、Perlの内部の話や、Perl6の話が多かったのが印象的です。RubyKaigiに近いものがあるなと感じました。もちろんハイレベルな発表もありましたが、日本の勉強会でしている話が英語にできればPerlConでも通用するなと感じました。

またid:papixさんが「英語は度胸」と言いながら英語コミュニケーションをすごいしていて、カッコいい...!と思いました。僕ももう少し度胸をつけたいと思い、ぼちぼちduolingoとかを始めています。

カンパについて

今回のPerlConは、インターネットの皆様からのカンパで行くことができました! 改めてお礼申し上げます。ありがとうございました!!!!

id:papixさんと相談しながら、小さくブログで募集をしようとしたところ、想像以上のスピードでカンパがあつまり、本当にありがたかったです。 Perlコミュニティの皆さんから、沖縄のコミュニティの皆さん、そしてインターネットでしか面識がない方や、面識が今までなかった方からもカンパを頂きました。

皆さん共通してカンパのときにかけていただいた言葉は「若者だから頑張ってこい」と「以前Perl(コミュニティ)にお世話になったから」という言葉です。Perlという言語がよく、「人と人とをつなぐグルー言語」と呼ばれている理由が、実感できたと思います。

今回は若者であるということと、Perlコミュニティの皆さんの力でPerlConに行く事ができました。 私も近いうちに社会に出て、1人のエンジニアとしてやっていくと思いますが、「あの時の若者がだめになった」と言われないように、僕もPerlコミュニティに還元できるようになっていこうと思います。

本当にありがとうございました!!!

カンパしていただいた皆様

  • kfly8 さん
  • xtesuji さん
  • anzu_mmm さん
  • monamomi さん
  • fujiwara さん
  • Intel0tw5727 さん
  • hitode909 さん
  • sironekotoro さん
  • magnolia_k_ さん
  • hogas さん
  • sugyan さん
  • e2_kan さん
  • toku_bass さん
  • ミノタケ さん
  • kaz_hiramatsu さん
  • aokabin さん
  • sago25tk さん
  • ytnobody さん
  • nakaraxp さん
  • hoto17296 さん
  • k_nishijima さん
  • DQNEO さん
  • yasu47b さん
  • masakyst さん
  • mackee_w さん
  • hkoba さん
  • monmon さん
  • kazuhooku さん
  • shinotra さん
  • masayuki.uehara さん
  • _ _ gfx _ _ さん
  • perlzemi さん
  • uzulla さん
  • akiym さん
  • bokutin さん
  • papix さん
  • codehex さん
  • skaji さん
  • karupanerura さん
  • tokubass さん
  • momen さん

(この他にも様々な方が協力してくださいました!!)

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

カンパ集計

合計 ¥588,000 でした!

カンパ収支

  • 航空券
    • ¥205,990
  • Tシャツ費用
    • ¥2,990
  • リガ宿泊費
    • ¥33,163

  • 収支
    • +¥345,857

カンパの余剰分について

カンパの余剰分は当初の予定通りPerlの団体にお渡しという形を取ろうと思います。

具体的には、私以外のPerlに関わる学生とPerlコミュニティに還元したほうが良いと思い、次回YAPC::KyotoなどのYAPCの学生旅費支援スポンサー費として利用致します。

最後になりますが、ありがとうございました!!!

就活終わりました

こんにちは。最近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 さんです。わくわく