Lambdaカクテル

Common Lispを書くMT-03ライダー(初心者)です

YAPC2019備忘録

気になった箇所だけつまんでいるので,網羅性はあまりないです.

2019年冬のPerl (40min) -- charsbar

xxxx年ssのperlシリーズ

5.28のおさらい(cf.perldelta)

  • 同じfhの共有不可
    • あんまりよくわからなかった
  • ヒアドキュメント終端は省略不可
  • 文字列のビット演算子が正式化
    • 生 &. 死 => 愛 おもしろい
  • perl -iがより安全になった(処理完了後にはじめて置換するようになった)
    • 途中でコケるとファイルを破壊してしまう(今までそうなってたのか・・・)
  • 正規表現中の{}のあつかい(autoconfまわりでエラ-から警告(deprecated)に戻した)
  • サブルーチンシグネチャ再修正(lvalueの場合に問題がおきるため)
    • lvalueおもしろい
    • Babbleというモジュールでこのへんを切り替えコードの一般化ができるようになった
  • セキュリティフィックス

感想

  • lvalueはじめて知っておもしろかったけど,うかつに手を出すと魔境になりそう
  • 着々と堅い変更を加えている

5.30の予定(来年5月ごろ)

  • 多少のパフォーマンス改善
  • エラーになるもの
    • 配列の添字最小値のnon-zero指定
      • むしろ今までできたんかいという気持ち
    • File::Glob::glob なくなる bsd glob使うべし

感想

  • globどっかで見たきがするのでちょっと調べたい

指標悪化してる

  • コミッタ,コミット,オーサ減ってる(かなり)
  • mojaveExtUtils::MakeMakerにApple独自パッチが当てられていてcpanのを使うとコケることがある
  • system perlつかわないほうがよい
  • cpanの指標も悪化している(upload uploader)

感想

まあそうなるな・・・ある意味ブルーオーシャンになってサクセスするチャンスが増えたともいえる

明るい話題

  • grep.cpanauthors.orgつくった
  • Mojolicious 8リリース
  • JSON::XS 4.0 allow_nonrefがデフォで有効化 JSON JSON::PPも同様.boolean_valuesが登場.
  • Perl::LanguageServerが登場!!!

感想

  • LSPまじかよ
    • 欲しい
  • JSON::XSよく使うのでdelta見ておきたい

Perl6のほう

  • 6.dが登場 メジャーバージョンアップ
  • perl6 profilerかっこいい見た目になった
  • p6はthreadメインなのでforkなかった.シングルスレッドにするとforkできるようになった
  • Rakudo.js いつのまにこんなものが・・・という印象
    • ブラウザでp6うごかせる6pad
  • p6env登場
  • p6のLSPも登場

感想

  • ブラウザで動かせるの,時代だよね〜
    • ある意味インストールが関門なのでそこでひとまず遊べるのは良いことだとおもう
    • 現代的な言語はだいたい公式サイトとかでブラウザで遊べることがおおいきがする

関連イベント

  • fukuoka.pmあるらしい

Q&A

  • (@astj) rakudo.jsのパフォーマンスどうなの
    • ファイルとか使えないけどまあまあ動いてる

Perl to Go (40min) -- xaicron

  • ちらほらGo書いてる人いる
  • perl10年やってきたひとがGoでweb apiつくって得られた知見はなす
  • Goでwebappつくるはなし

なぜgo

  • webサーバとしてみたgo
    • オンプレで運用するのはダウントレンド
    • クラウド使ってコンテナを使い捨てる時代
    • こんてなはもらえるメモリなどすくない,それをたくさん並べる
    • 高速でメモリ効率良い言語が求められる
    • コンテナサイズも小さくすれば起動速度も上がる
    • ランタイムが必要な言語は数百MBになってしまうのでさけたい
      • バイナリだったらランタイムいらない
    • goroutineで効率的にCPUとメモリつかえる
  • cliツールとしてみたgo
    • コンパイルが高速になった時代なのでLL感覚でサクサク書ける
    • クロスコンパイルが楽なので配布も楽
    • 数十MBのバイナリDLするくらいなら別にキツくない時代
      • ネット高速
  • 流行ってるし・・・

感想

Common Lisperなので耳が痛い

  • メモリ効率
    • CLはGCあるけどメモリ構造意識したコードあまり書かない
      • なんでもlist
  • コンテナは各自がんばってる感じ
    • まあまあちゃんと動くのがある
  • CLはバイナリ吐けるけどランタイムも保存する(デバッガ)ので数十MBにはなる
  • CLはクロスプラットフォームなバイナリ吐かないはず
  • CLは流行ってない

perlmongerがはまったところ

  • CPANない
    • go getするモデル
    • githubを直に拾う
    • インデックスされてないので中央集権的なのがない
    • ソムリエが必要で,目的ベースでいいかんじのライブラリ探すのが大変 googleつかうしかない
    • 朗報 module indexerできるらしい
    • githubに全依存状態なので落ちると終わり
      • ミラーするらしい
    • minicpanでミラー作っていた時代をおもいだす
  • GOPATHのがれられない
    • 開発は常にGOPATHの下でやる必要がある
    • ライブラリがそこに置かれている前提で進む
      • (CLも似たような話ある.*default-central-repository*とか)
  • ライブラリ管理むずい
    • ローカルに落ちてきたライブラリのバージョン管理とかない
    • いきなりgitのmasterのheadが落ちてくる(masterがstableとは限らない)
    • cartonみたいなやつたくさんあるんだけどgo modが公式に入ったのでこれ使えばよさそう
      • (この手のツールどの言語にもたくさんあるよね)
    • まだあまりこなれていない
  • オーサリングツールない
    • リリースフロー的なのがない
    • まっさらな大地
    • go xxxを打ちまくるかMakefileを書きまくったりする

感想

  • CLにはcpan的なquicklispある
  • ソムリエ必要なの大変そう
  • GOPATHみたいなものが必要なのはコンパイル型の宿命なのだろうか
  • オーサリングツールという概念あまり知らなかった

perlとの相違点

  • 変数と型について
    • camelCase
    • 変数に型があり別のを入れられない
    • 配列とsliceというのがある
    • (型ちゃんとしてるのはイマドキな言語の条件ってきがする)
  • 関数
    • 可変長引数をとれる
      • 便利じゃん
    • 複数の値を返せる
    • ファーストクラスな関数
  • エラーハンドリング
    • 例外機構ない,死ぬときはpanicする
    • perlでおなじみのdie
    • 普通は使わない
    • 戻り値でerror返すというのが慣例 (foo, bar, error)のように最後の値をerrorにする
  • defer
    • Scope::Guardみたいなやつ,unwind-protectみたいなやつ 関数を抜けたときに動かす処理を記述する
      • (panicしても常に実行される??)
  • goroutine
    • スレッド立てるやつ anyeventやcoroみたいなの
    • channelを使って通信する
    • context
      • goroutineとかでデータを引き回したりする
      • $cみたいなやつと言われて納得
      • coreに入っているので様々なmoduleで同じインターフェイスを使ってコンテキストの引き回しができる
        • よさそう
  • package
    • coreのときは素朴に書ける
    • そうじゃないときはfully-qualifiedに書く
      • perlもそんな感じだよね・・・
    • スコープ
      • ほぼフラットにぜんぶ置くスタイル
  • このへんで時間が押してくる
  • webサーバー立てるの簡単
    • すげーじゃん
    • middleware対応
    • realizeってやつでコードに追従してコンパイルかけられる
  • DBまわりはlibmysqlいらない,goでぜんぶできてる
  • ここで終わった

感想

  • 「あ〜それCommon Lispにもあるわ〜」
  • エラーハンドリング適当なのあまり信じられない
    • CLerは例外けっこう使う
    • 大域脱出したくないというベースでそうなっているらしい,どこでcatchされるのかがコードからわからない
    • ライブラリ管理むずかしいのわかりみしかない

webapiつくろう

テスト

docker ubildしてうごかす

まとめ

ランチスポンサーセッション (40min)

SBX

  • 製品
    • Taxilla 知識を集積する便利な検索エンジン
    • Gandhara ジェネリックなAI/機械学習フレームワーク
    • Garuda 汎用コネクティビティ / オートメーション
  • 今回はGarudaの話
    • かつて人間がプログラムにデータを渡す世界だった
    • 汎用ツールにデータをとにかく渡すと走らせるプログラム候補(ガジェット)を推薦する
    • そうやってできたワークフローを保存できる
    • 無償のコミュニティガジェットがある
    • 手持ちのスクリプトをガジェット化するガジェットもある

感想

データ入出力を共通化する基盤なのかなとおもった,バイオ系ではメジャーなのかもしれない

Mixi

  • perl書いたことない新卒エンジニア(20)
    • Perlの教育と業務
      • 毎朝先輩に30分ほどSlackの教育を受ける
      • 正解を教えるのではなく気付かせる
      • 一人で自走できる環境を作ってくれた
    • perlは楽しいし学びが多い
      • 書き方に人間が出るのがおもしろい
      • TMTOWTDI
      • mojoliciousは薄くできてる
        • 学ぶことが多い
      • わからないこともおおい
      • アーキテクチャへの興味が出てきた

感想

  • 学ぶところが多い
    • 負けんぞ
    • 学ぶ姿勢を大事にしているのはほんとうにすごい

Perl5の静的解析入門 機械と人間双方の歩み寄りによる平和編 (40min -- macopy

  • 機械と人間仲良くしたい
  • 正規表現でperlをパースするPPR
  • 人間と機械に分かりにんういコード
  • 型シグネチャをつける

静的解析とは

  • ソースをただの文字列として扱う(本質)
  • perlの構文解析の途中までやって引き抜くというのが難しい
    • 最近の言語は引き抜けることがおおい
  • メリット
    • コメントをいいかんじに活用できる
    • 実行できる状態に近付けば,コードから情報は抜け落ちていく
    • 実行時解析で利用できない情報がある
    • 動的にBEGINでめちゃくちゃやってると厳しいことになる

PPI

  • whitespaceやsemicolonを残してくれる(書き戻せる形で解析してくれる)
  • serialize呼ぶと書き戻せる
  • 解析するための構造であって,実行するための構造ではない
  • デメリット
    • けっこう遅い 1175行で6.8秒

PPR

  • 正規表現でなんとかする君
  • あらかじめ定義してある表現を正規表現に展開して使う

PPI使う例

  • カヤックではS::ArgsというよりData::Validatorを直に使ってたりする
    • 実行時にバリデーションされる
    • 静的に解析したい!!
  • 関数定義から関数名とか取り出したりいろいろする

感想

Smart::Argsのパーサ作ったけど,これで静的に呼び出しチェックする君も作ればええやんという気がしてきた

人類による歩み寄り

  • 納得できる挙動するときもあるし,意味不明なことするときもある,それがPerl
  • これだからPerlは・・・
    • ???「Javascriptもそうだよ〜」
  • コードの迷いは思考の迷い
  • 心に静的コンパイラを持つ
    • イマドキの言語にある機能・習慣を輸入するとよい
    • 書くのは一回,読むのはn回xm人

感想

  • 書くのより読む回数が圧倒的に多いのなるほどと思った.書くときはサクサク書きたいから適当にしがちだけど,一度書いたものはなかなか消えない.

質問

  • 文字列の中にperlコードみたいになってたらどうするの
    • 文字列は文字列として認識されるが,抜き出すと困る
  • カッコの対応とかどうするの
    • perlreはネストできるんじゃ・・・

感想

perlreおまえってやつは・・・

PerlプログラムでPerlプログラムを修正する方法 (20min) -- Kang-min Liu

PPI

  • P5コードをDOMにする
  • がんばれば色々操作できる
    • 切り貼り
    • 削除
    • 挿入

サブルーチンの多重宣言を検出する

  • PPIでできる
  • botでええやん
  • GHEにbot飼って指摘する
  • 指摘できたら自動で対応できるのでは??
    • nitpick系の削除だったらbotで十分
  • https://github.com/gugod/p5-nitpick

まとめ

  • PPIによる変更は簡単
  • ゴミコードの検出は面倒
  • botにレビューさせるのは良い
  • 自動的な修復はわりと簡単

感想

PPI使うbot書いてみようかという気になってきた.gheで動くbot適当なの作ってみたい

レガシーPerlビルド 〜現代に蘇るPerl[1..5].0とPerl6〜 (20min) -- 八雲アナグラ

perl

  • 今回見るperlはラリーウォールのperl

昔のperl

ちゃんとgitでタグついてる

難易度

意外にも最近のになるほど難しくなる

perlのビルド方法

configureでMakefileのいつものやつ

レガシーなやつだとmake dependという依存をなんとかするコマンドが必要だったりする

make世界観なのはUNIXの延長として作ろうとしていたから??

でもperl1よりautoconfは新しい・・・そしてautoconfがperlで動いていた時代があった・・・? 自前でdistというツールを作ったらしい

perl1

いまどきperlテスト通過率100%のパッケージがあるらしい

2

osxにgccを入れるか,metaconfigを使うとビルドできる

4

関数名がC関数とぶつかる

5

Makefileが生成できない

6

p6のコンパイルにはperlが必要

感想

突然地球上からperlのバイナリが消えたらperlビルドできなくなりそう

Perlでも分散トレーシングしたい! - AWS::XRayによる解析とその実装 (40min) -- fujiwara

分散トレーシングとは

  • 複数の言語で構築される大規模分断システムのパフォーマンス解析のためのシステム
  • 分散大規模システムでは追跡が困難

trace

  • 複数のspanを含む有向非巡回グラフ

Span

  • 名前
  • 開始時刻
  • 終了時刻
  • context
  • tag
  • log

分散トレーシングの実装と仕様いくつかある

2014年ごろから流行りだした

どうやってトレースするか

  • SDK
    • SDKでデータを作成してエージェントに送信,それがサーバに向かう
    • 内部の挙動がトレースできるが,言語に依存
  • サービスメッシュ
    • Envoyとかのサービスメッシュのデータプレーンでやる
    • 言語に依存しないが,内部の挙動はトレースできない

AWS X-Ray

  • API
  • daemon
  • SDK
  • console

しくみ

アプリケーションからデーモンにUDPで投げ付ける

良いところ

  • トレースがたくさん作られる,それを投げるのがTCPだと大変
    • デーモンにUDP投げるだけなのでめでたい
  • 影響が出にくい

X-Ray用語

スパンのことをセグメントという

PerlのSDK

  • ない
  • つくった
  • JSONをUDPで投げればよいので簡単にできる
  • Plack::Middleware::XRayもつくった

仕込むのが面倒

  • captureって書きまくらないといけないのは面倒
  • Devel::KYTProfの結果を投げ付ければよい
    • Devel::KYTProf::Logger::XRay
    • ロガーは差し替え可能になってる

感想

KYTProfみたいなのCLでもやりたい,meteringの上にのっかれないか

ISUCON8予選問題作成の裏側 (20min) -- karupanerura

  • なぜこの問題ができたかという話
  • 競技を成立させる、楽しい問題にする、解けるようにする、低コストにする
  • 競技とは?
    • 問題ハックを避けなければならない
    • 「普通の」チューニングをしっかりやって勝てる問題が理想的
    • 不正に操作できないスコアが必要
    • 金で解決できなくするために外部リソースNG
  • スコア化難しい(性能の悪いアプリと良いアプリに同じレベルの負荷はかけられない)
  • 楽しい問題
    • 単純作業ではいけない
    • 工夫の余地がなければならない

感想

ちゃんとやったらスコアが上がるような問題を設計するのは大変だとおもうし,すごいなあ・・・

多くのCPAN Authorに育てられ、息をするようにCPANモジュールを書けるようになり、そして分かったこと (20min) -- Songmu

  • 多くのモジュールを上げる(質より量)
  • 自分のメディアを育てる
  • コンテクストを醸成する
  • 発信してると機会が寄ってくる
  • 車輪の再発明を恐れない

感想

一人のperl使いが試行錯誤しながらもコミュニティの中で成長していき,成果を出しておおきくなっていく過程を知ることができた. 心の支えになるような発表だった.一般に避けられがちな「質より量」「車輪の再発明」を否定せず,それを通ってきたから力になるんだ,というふうな話は心強かった.エンジニアリングを重んじる人ほど既にあるものを作るのは忌避感が強いとおもうけど,自分の成長のためには別の考えかたも必要なのだ.

LT

@note103

  • 自走する初心者
  • 一人二役、問題を出す側ととく側になってる
  • アウトプットしてて恥ずかしさが薄れていく

感想

このLTがよかった.俺もまだまだ初心者みたいなもので,業務で長いこと使っているけど精神的な面ではずっと初心者で,おおきくなっていく方法がわからずにいる.でもこのLTを聞くと,自走する初心者というのは自分で自分に問題を出して,それを解いていくのだということがわかる.「自分はどうしたらよいのだろう」となったら,まず自分に適当な問題を与えて,それをただ解くのだ.プロダクトを書くのは「本番」で,そのために行う練習が必要なのだ.俺はぜいたくに本番だけやろうとしていないかと思って自分を戒めようとおもった.最高の本番,つまり仕事にするには,普段から練習していないとだめで,反射でできるようにしたいなとおもった.スポーツや芸術,職人の世界でもそうで,いきなり本番や売り物をつくるということはしない.

Keynote: 松野 徳大 (40min)

  • 新しいチャレンジを1プロダクトにつき1つ入れたい
  • software IC
  • コミュニティは利用するもの、かつまた貢献するもの
  • 検索に引っかかることが重要、ならツイッターよりブログ

感想

「新しいチャレンジ」という概念がよいとおもった.いつも同じことをやっているのでは飽きてしまうから,チャレンジを自ら押し込んでいくのだ.そこは仕事と自分の成長とをすりあわせてプッシュしていく必要があるなとおもった.コミュニティの話もふに落ちるところが多かった.貢献することばかり考えていては萎縮してしまう.持ちつ持たれつなのだ.