北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

今日は "GO GLOBAL" meetup #1 の日です

"GO GLOBAL" meetup #1 に参加していますので、自分用のメモを残しておきます。

コーディング試験Codility運用の実態と実績 / @k0000i さん

  • コーディング試験とは : コンピュータサイエンスの理解度を見る
  • 応募すると、コーディング試験を受けるようメールが来る
  • 2時間で2問を回答する
  • IDEは使用可能
  • デモテストや練習問題がある
    • 受けておくとスコアを上げられるでしょう
  • 正確性とパフォーマンスのスコアの平均
    • 正確性 : バグがないか
    • パフォーマンススコア : 大きいデータを突っ込んだ場合
  • コードテストだけで実力を図ることは不可能
    • 能力は面接で直接確認する
  • 例えばGoogleの試験では、バイナリ木を反転できないと落ちる (homebrewの作者談)
  • 時間の使い方も見ている
    • コーディングの過程を動画で見ることができる
  • テストスコアは機密情報
  • 平均スコアは相当低い
    • 満点が 3.1 % 、 ゼロ点が 16.7 %
    • 5~10分で離脱する
  • similarity チェックをしている
    • チート防止。C++で書き始めて突然PHPのコードに変えた人とか

メルカリにおける技術者採用方法の最近 / @mootoh さん

  • コードインタビューを受けたり実施したり
  • 技術課題 × 技術面接
  • 課題を期限内に提出してもらう
    • アプリ作成、ML、セキュリティ
  • PROS: 面接よりプレッシャーが少ない
  • CONS: 過程がわからない、自由度が高いと評価しにくい
  • メルカリは、海外の候補者に日本に来てもらうことが多い
    • 最初から日本に来てもらうわけにも
  • 技術課題は、海外在住でも問題がない
  • 面接
    • GOTチーム(同時通訳)
    • 面接官の英会話力が必要
    • Google DocsSkype Interview を利用。
    • Hangouts の音が切れる
      • 推測せずに聞き返すのが大事
  • Scaleさせる : 候補者も面接者も増える
    • 標準化 : ばらつきを減らし、評価できる人を増やす
    • Hackerrank : 採点の自動化
  • うまい、やすい、はやい
    • 採る方も採られる方も
    • いい会社、少ない手間で、早く結果が出る
  • アウトプットが多い人
    • GitHub, Blog など
    • 課題をスキップしたり、面接で最初から核心を聞けたり
  • フェーズによって採用は変わる
    • 以前駄目でも、今なら良かったり
  • まとめ
    • グローバル化かつスケールさせるとカオスになる
    • 中の人になると見えることがある

コードテストでtrack.runを使ってる話と採用フロー / @yosuke_furukawa さん

  • インターンのコードテストに track を採用している
  • テストの内容
    • DB、HTTP、アルゴリズム、数学
    • 2~3時間はかかる
    • 技術力+入社意欲を見る
  • アルゴリズムの問題の例 (公開禁止です)
    • アルゴリズムを知らないと最後の問題は解けない
    • どの計算量まで耐えられるかを見る
  • 優秀な人だと、1.5時間で95%程度の正答率
  • trackのいいところ
    • 解けなくても、アピールができる
    • わかった部分などを、文章で伝えて部分点をもらいにいける
  • trackのだめなところ
    • エディタが使いにくい
    • UIがわかりにくい
    • 回数をこなせば、コツはわかる
  • 点数でフィルタしない。面接の参考値
  • 面接は相互理解の場
    • 人が期待と違った。会社が期待と違った
  • 職務履歴書から質問を考えておく
  • 何をしたかではなく、何を学んだかを知りたい
    • XXXという仕事をして、YYYということを学んだ。という回答を期待する
  • 会話を通じて、お互いを学べる機会とする
  • 入社ではなく、入社後にフォーカスした回答をして欲しい

付け焼き刃でベイエリアの面接を突破するたった一つの方法 / @daigo さん

  • ホワイトボード面接が嫌い
    • 人前、勉強に時間を取られる、当日疲れる、ホワイトボードスキル、運ゲー
    • 通常業務で鍛えられない
    • 競技プログラミング好きな人には楽しい、動けばいいって人にはつらい
  • Cracking the coding interview という本がすべての元凶
    • Googleさんのやつ。いつの間にか必須になってしまった
  • FBからの案内メール
    • 準備することを教えてくれたり、準備会があったり
    • もはや受験
  • 変な人を採用するよりマシなので、足切りとして使ってるんでしょう
  • 遊びに来いと言われたら、受験スケジュールが渡された
    • 12:30 - 18:00 まで
    • HRはコンバージョンを狙ってるので騙しに来る
  • 電話面接
    • 通話しながら 2 問ほど解かされる
  • 頭が真っ白になり、「おうちかえりたい」になる
    • 優れた面接官は救ってくれる
    • 最適解を狙わず、まず解ける方法を狙うこと
  • ホワイトコートで書くとき
    • 型のない言語を選ぶ
    • 方針を決めてから書かないと、insertが辛い
    • 標準関数を使うときは O(n) かを知っておく
    • ホワイトボードを購入して訓練する
    • 円と線分の当たり判定、経路探索辺りの問題は多い
  • LeetCode
    • 過去問をひたすら解く。受験なので
    • 各社の過去問が登録されている
    • 「あ、これLEETCODEでやったところだ」
    • 「この問題知っていたら言ってね」(いうわけがない)
  • 必勝法
    • CEO/CTOに気に入られる
    • 契約社員で始める
    • 受験者で共謀 (同じ問題が出る) (グレーです)
    • 会社にいる人と練習 (友情はNDAを超えるか)
  • 怠惰が大事
    • 多方面から攻める
    • Googleは付け焼き刃では無理なので勉強して
  • leetcode もくもく会をやってます

Lightning talk

コーディング面接を受ける際の Tips / @thagikura さん

  • GoogleTwitter を受けた Tips
  • オンライン面接。 45分×1回か2回
  • オンサイト面接。45分を4回~6回
    • ホワイトボードで実施
    • オンライン面接より難しい
    • コーディングが多いが、アーキテクチャ
    • 実際コードを書くのは30分程度
    • 速さも観点
  • 言語の選び方
    • 一番書きなれた言語
    • 記述量が少ない言語がいい (Javaはきつい)
    • 面接官に断って略記を使う
  • 適切にメソッド分割する
    • 部分店
    • 書き直しがすくなくなる
  • データ構造、アルゴリズムのおさらいが重要
    • エンジニアの本質は重要ではない

初めてのエンジニア海外チャレンジ / @yabaiwebyasan さん

  • セブ島でプログラミングを学んだ
  • 人生で一度も受験勉強をしていない (推薦)
  • ALIS ブロックチェーンSNS
  • ベルリンはビザが通りやすい
    • 英語が通じる 31歳以下、2000ユーロ
    • 世界からエンジニアが集まっている
  • 日本人は失敗を恐れすぎ
    • 20代のうちに、リスクを恐れずに海外へ
  • エージェントから英語をまず勉強するように言われてしまった
  • 国内は自分を雇う気がないので、海外へ行ったほうがいい
  • HackerRank, LeetCode, Pramp, awesome-iterview-questions などで勉強
  • Linked-in では、ドイツに住んでることにしている
  • 無料で英語を学ぶ会
    • Dev Japan, CodeChryslis などの会

QuipperのWebエンジニア採用におけるコードテスト / @kechol さん

  • 書類、一次面接、コードテスト、二次面接、VP、オファー面談
  • 1問辺り2時間程度の問題を、3問
    • 自宅で解いてもらう
    • 言語を指定 Ruby/JavaScript
    • 未経験でもキャッチアップで溶ける難易度設定
  • アプリを丸ごと作るテストをやっていた
    • 問題点: 他社に取られる、脱落する
  • コードテストの変更の方針
    • コードテストはなくさない
    • 最低のレベルを担保する
    • アルゴリズム問題は出さない
      • 日本ではメジャーではない (訓練している人がいない)
      • サービスのボトルネックではない (キャッシュ戦略などのほうが大事)
  • コードテストで見たい要素をスプレッドシートにまとめる
    • 担保するかしないか
    • 担保できない部分をどうするか
  • スプレッドシートを元に問題を作成
  • 運用
    • Codility や track は使ってない
    • Dockerfile で環境を固定し、エンジニアがモブレビュー
  • 提出期間が 2 週間から 3 日へ
  • スクリーニングプロセスとしてはよい
  • 利用ライブラリのアップデートはメンテナンス必要
  • インドネシアではアプリを作るコードテストを実施している
    • 他社もコードテストが一般的なので、採用の妨げにならない
    • チートが多いのでその防止

人生で初めて外資の転職試験受けてみた / @ganezasan さん

  • 英語歴
    • アメリカ人とチャットベース開発を1年 (チャットじゃないと仕事にならない)
    • セブ島で3ヶ月
    • ぎりぎり読めてぎりぎり聞こえる
  • 英語の面接で日本語を使うと落ちる
  • WEB系のホワイトボード面接は、思ったより難しくない
    • 英語で説明するのがきつい
    • 事前の情報がない。前提条件がざっくり。数学的な知識。
  • Paizaで練習
    • 受験に近い (日本語なので)
    • HackerRank
    • Aランク、Sランクは1時間で終わらない
    • 土日を使って2週間かかるレベル
  • 転職には運もある
  • 英語で仕事できる場所
  • 英語の自信がなければ、職種を変えるのもいい
    • サポートエンジニアになって英語を学ぶ
  • CircleCIへ入社した感想
    • 「すみません」より"Thank you"
    • 初めて話す人でも質問に答えてくれる
    • リアクションが大きい

テックインタビュー裏表(?) / @mogutan88 さん

  • 桑年 (48)
  • 多数受けて、通ったところも落ちたところもある
  • 練習が必要
    • 本命ではない会社を数社受ける
  • 学歴、職歴、業務経験
    • 学歴の詐称ビジネスがある国、地域がある
    • コーディング面接などをしないと危険
  • 業務に関連した質疑応答
    • 書いていることが本当か
    • 英語力、どんな人か
    • 運(時期によって、必要な英語力などは違う)
  • 業務に関連しない質疑応答
    • カルチャーマッチ、ストレス対応
    • 同部署の人が面接官の場合は、印象が大事
  • コーディング力
    • コーディングの慣れ(何年も離れてると書けない)
    • CSをやっていないときつい
  • リファレンス
    • コネ。裏取り
    • 海外でも重要。重役と知り合いなど。
    • 裏取りの意味もある。元の会社に聞くなど

シリコンバレーで現地就職した際に重要だったいくつかの物事 / @daikikohara さん

  • 主にスタートアップの話
  • 現地にいること
    • コーディング試験で口頭だけでなくホワイトボードを使える
    • インターン、試用期間を利用できる
    • 待遇差。給料を下げたいからリモートで探す
  • 現地へ行く : 学生ビザ
    • 大学の Extension プログラム
    • 9ヶ月のプログラムで1年間
    • 40過ぎでチャレンジしている人も
  • リファレンス
    • 同僚にインタビューされる
    • 同僚と仲良くしておく
  • スキルの証明
    • コーディング試験
    • 作ったもののデモ
    • LinkedInのアカウント
  • 英語力は不要
    • 技術系の英語は、英語の技術書、英語の記事が読めれば
    • 投資系の用語はわかってないと身を守れない
  • 計画を立てるのが大事

グローバルIT企業での働くまで・働いてみての学び / @yando さん

  • JD (Job Description)
    • よく読むこと
    • 日本と傾向が違う
    • 具体的にどういう人を求めているか、しっかり書かれている
    • minimum qualifications, Preferred qualifications
  • BA/BS degree in Computer Science
    • 学位、学士の条件
    • equivalent practical experience (実務経験3年を、在学1年に換算。10年働けば O.K. )
  • A strong sense of ownership
    • スタートアップ系
  • Bachelor's degree in computer science
    • 文系いらない
  • Requriements にふわっとしたことが書いており、Optionalで言語の指定
    • 日本の求人は逆になっている
  • 海外で働く。ビザ。学位が問題となる
  • 理系を出ていれば若いうちからチャンスがある
  • 文系出身の場合、アプローチを考える必要がある
  • 修士、博士、特許はアピールポイント
  • CV を準備する
    • JDに対応する内容
    • カバーレターはIT系では要らないのでは
    • Linkedin のプロフィールが大事
    • SEO対策的なアピールはよくない。行きたいところに合わせる
    • 三者のチェックを(英語得意な人に)
  • リファーラル
  • Interviewにはしっかりと準備
    • あきらめないこと
    • 暗記問題ではない。自力を伸ばすこと
    • 無言で回答するのは良くない。インタラクティブ
  • 英語 : 非ネイティブが多い
    • 苦手意識を取ることが大事
    • 緊張しながらやっては意味がない
    • 開き直ってから伸びる
  • 多様性
    • チームメイトの年齢は知らない。履歴書にも書かない
    • 法的に問題があることも
  • 残業
    • 納期に余裕を持たせるために残業すると注意される
    • プランニングに影響する。残業ありきのプランを立ててしまう
    • 仕事ができない、と見られることもある
  • glassdoor
    • 様々な企業の報酬体系など
    • 日本と違う。交通費の支給などがなかったり。手取りは変わらない??

今日は Haskell Day 2018 の日です

Haskell Day 2018 に来ましたので、自分用のメモを残しておきます。タグは #HaskellDay です。

作りながら学ぶHaskell入門 / @igrep さん

  • 会場、懇親会のスポンサーは IIJ 様 (ありがとうございます!)
  • mmlh コマンドで各自進める
    • 課題の自動添削、たまにヒントを出してくれる
  • わからなかったらメンターへ聞く

Haskellを導入した話とHRRの紹介 / @khibinoさん

  • 2008年 PerlからJavaを呼び出していた
    • メンテナがいない、型検査がない
    • Java, UNIXとの親和性があまりない
  • 検討 => Common Lisp, OCaml, Haskell
  • Haskellunix パッケージが良かった
  • 2010年から
    • debian lenny, GHC 6.8 (cabal installがまだない)
    • PerlHaskellに書き換え
    • 1年後 2,700行 、 2年後 5,800行
  • パーサコンビネータ attoparsec のおかげでテキスト処理が書きやすい
  • DB2 のパッケージを debian 用に変換するビルドシステム
  • STMによる、状態のあるマルチスレッドプログラム
  • DSLの定義がしやすい (Monad, HRR)
  • ここから HRR の紹介
  • SQL を組み立てる HaskellDSL
  • 部品化、型安全
  • コンパイル時に Database Schema 読み込みが可能
  • 2013年から開発開始
  • SQL を関係演算的に書く
    • リスト内包表記的に書ければよい
    • 最近は #name p == #name b 的な書き方をサポート
    • 素のHaskellなので、変数に代入して再利用可能
  • window 関数などもサポートしている
  • Q). パフォーマンスでハマりは?
  • Q). #name は拡張?
    • A). OverloadedRecordFields 拡張
  • Q). 業務で使うには?
    • A). 外部コマンド呼び出しとか、そういうところが効く
  • Q). esqueleto と比較したHRRの一押しポイント
    • A). 試してくださっている方の意見によると、HRRの方が記述力が高い
    • A). 「esqueleto は型安全ではないです」

Servantで行う安全かつ高速なAPI開発 / @nakaji-dayo さん

  • Haskell を使ってみよう、と思ってもらうのが目標
  • WebAPIとBatchの開発にHaskellを利用
    • 課金のあるSNS(!!)
    • 顧客管理などの社内ツール
  • WAFは Servant を利用、 HRR を利用
  • Servantは型レベルプログラミング
    • 型安全、型による副産物
  • HRR / 型が合えば正しいSQL
  • 一連の機能の呼び出しが型で守られるようにしたい
  • :> エンドポイントの定義をつなぐ、 :<|> でエンドポイント同士をつなぐ
  • 実装は Handler モナド
    • 定義と実装が一致する
    • ExceptT ServantErr IO IO と HTTP エラーコードを例外として投げる機能
  • API定義から servant_swager でSwaggerを生成できる
  • servant-mock ランダムな値を返すモックサーバ
  • ReaderTHandler を拡張する (DBプールなど)
  • 型による制約
    • MonadService HTTP例外を投げない
    • MonadView 副作用を起こさない
    • view でクエリを投げようとすると型エラー
  • 型安全なテンプレート
    • heterocephalus, shakespeare
    • e-mail などに利用
  • REPL で Handler を呼べる
    • def と レンズで巨大なテストデータでも完結に作れる
  • 利用ライブラリはたくさんある
    • Web, RDB, 暗号化、テンプレート、一通りある
    • 外部APIとのクライアントライブラリも揃っている
  • RDBMS: HDBC, HRR
  • Elasticsearch: bloodhound
  • AWS API: amazonka
  • Google API: gogol
  • Firebase は網羅的なものはない
  • ライブラリの問題点
    • 新しいものに対する対応
    • マルチバイト文字
    • ニッチなもの (和暦、バグったCSVのパーサ)
  • まとめ: Haskellすごい
  • Q). 開発チームと教育は
    • A). 3人、アルバイト、ペアプロ。おすすめ構成、本を。
  • Q). バックエンド以外は?
    • A). 適材適所。 elm は使ったことはある

並列並行言語Haskell / @syocy さん

  • 今日の元ネタ: Haskellによる並列・並行プログラミング
  • CPUのトレンド
    • シングルスレッド性能が伸び止まり、論理コア数が増えている
    • 10以上の物理コアを持つCPUがご家庭でも
    • 12 core で $399 、 32 coreで $1,799
  • 並列並行言語
  • Haskell (GHC) の並列並行の歴史は古い
    • 1997年頃には決まっていた
    • 純粋なコードの分離: 並列性
    • 軽量スレッド: 並行
  • 並列 parallel = 同時に進めて高速化すること
  • 並行 concurrent = 同時に進んでいるように見せる
  • 分散 distributed = 複数のマシンを使う、共有メモリがない、障害を仮定
  • 並行のほうが簡単
  • async で軽量スレッド生成、 wait で待つ、 cancel も可能
    • cancel すると非同期例外(難しいので略)が飛ぶ
  • スレッド間通信
    • MVar アクセスの公平性
    • STM 複雑な処理をミスなく書きやすい
  • atomically STM のトランザクションを作る
  • ランタイムによる軽量スレッド、構文の軽さ、STMによる簡潔さ
  • 「A Tour of Go in Haskell」 を作ったので見てね
  • Haskellはランタイムへ指示しただけでは並列に評価しない
    • 並列に評価してほしい場所を par pseq で指定する
  • 評価戦略: using で評価戦略を指示
  • 自動的な並列化
    • Par モナド
      • データフロー並列とパイプライン並列
    • Haxl
      • データソースへのクエリを並列化
  • 行列計算での並列化
    • repa, accelerate (GPU)
  • 分散プログラミング
    • distributed-process
    • Erlang のモデルに近い
  • ThreadScope
    • 各スレッドのリソース使用量を可視化する
  • 最近の並列・並行関連
    • ApplicativeDo 拡張
      • Applicative の中には自動で並列にできるもの
    • -qn オプション : GCの並列性を変える(下げるといいことがある)
    • NUMA サポート
    • Cardano が Cloud Haskell で実装
  • 軽量スレッドの消費メモリ
    • TSO.h によると、 1kb + 18word 。1,000個で1MB
  • Q). STM で公平性がないのはなぜ?
    • A). 書籍を買いましょう
  • Q). map を自動で並列化できる?
    • A). コンテナの実装によって変えられる

Dhall: Haskellの新たなキラーアプリ / @syocy さん

  • 設定ファイルとは?
  • 設定ファイル言語は機能が不足している
    • DRYじゃない、型検査がない、分割したい、無限ループして欲しくない
  • Dhall
  • 言語仕様があり、参照実装がHaskellで書かれる
    • Bool, Natural, Integer, Double, Text
    • List, Optional, Record, Union
  • インポート
    • ローカルパス、URL(ハッシュ値指定でチェック可能)、生text
  • Dhall は実用的か
  • dhall-to-yaml dhall-to-json を使えばよい
  • Kubernetes は大量の YAML
    • "Wall of YAML"
    • dhall-kubernetes がある
  • 型ファイルを作って読み込む
  • デフォルト値を作る
    • ^ でレコードを組み合わせる
  • ここからは補遺
  • Haskell では dhall コマンドが便利
    • dhall format, dhall repl
  • 多相関数、カインドもサポートしている
    • 型推論はない。型を明示的に適用
  • Haskell では直接DhallファイルをHaskellの型として読める
  • 事例: 跋扈(ばっこ)する混沌のJSONをDhallで書き換え
    • invalid JSON 生成のため、 dhall-to-json は使えない・・・
  • Q). makeYaml を使ったファイルを dhall-to-json すると?
    • A). サポート外
  • Q). 言語としてみたときに Dhall の改善点は?
    • A). オプショナルとリストの記号が同じなのがちょっと。だったが、そこにだけ型推論が入った
  • Q). JSON, YAML を Dhall にするには?
    • A). 手動でやるしかない
  • Q). http, https を認証が必要な場合は? コンフィグはプライベートのはずなので
    • A). 不明。サポートあるかも。
  • Q). 外からとってくる理由は?
    • A). オフィシャルな型をローカルで使いたかったり
  • Q). ビルトイン関数はあるが、関数を作るのは?
    • A). Dhall 上で書く関数であれば簡単。ループも書ける

Semigroupとは? Monoidとは? 環とは? / @aiya000 さん

  • 代数をHaskellで実装する
  • 今日のスライドと標準ライブラリは若干違う
  • マグマ : 足し算(あるいは掛け算)ができる
  • マグマのインスタンスは型から一意に決まらない
    • 足し算と掛け算、など
    • newtype
  • 半群: x <> (y <> z) == (x <> y) <> z 結合法則
  • モノイド: 単位元 e, e <> x = x = x <> e
    • NonEmpty First Last単位元がないのでモノイドではない
  • 群: 逆元 x ^ (-1)
  • 「可換な」「アーベル」
    • x <> y = y <> x
    • unification に使える
  • 擬環: 加法群、乗法半群、分配法則
    • x >< (y <> z) = (x >< y) <> (x >< z)
    • (x <> y) >< z = (x >< z) <> (y >< z)
  • 環: 乗法がモノイド
  • 半群準同型写像 f (x <> y) = f x <> f y
    • モノイドとなる
    • 群、モノイドも同様
    • すべての道はモノイドに通ず
  • 体: 乗法が群 ( 0 を除く)
    • 引き算、割り算ができる
  • Q). unification とは?
    • A). 懇親会で
  • Q). 代数的構造は代数とは言わない
    • A). 代数は具体的な物を指す。(環状の代数、リー代数)

HaskellCLI / @matsubara0507 さん

  • プログラムを新しく学んだら CLI を作るはず
  • getArgs コマンドライン引数。空白区切り
  • System.Console.GetOpt いい感じに型にしてくれる
  • optparse-applicative
    • よりリッチなこと
    • 難しい。簡単なラッパー多数
  • サブコマンドを定義できるが網羅性がない
    • extensible で解決できる
    • わからなかったらextensible攻略wiki
  • Prelude
    • Haskell で勝手にインポートされるモジュール
    • NoImplicitPrelude プラグマで止められる
  • Prelude だめじゃん、ってなる時期が来る
    • 代替品がたくさんある
  • rio
    • stack 開発チームによる alt Prelude
    • 帯域環境、ログ、
    • text, bytestring, directory, filepath, containers, lens, time, vector
  • 例: medium
  • Haskell Stack
    • cabal hell を防げる
  • stack new した後はだいたい同じ
    • 推しパッケージ追加
    • github アカウント書いたり
    • hsfiles でテンプレ化できる
    • stack-1.9 から GitHub, GitLab, BitBucket から取れる
    • github:xxxxx/hhhhh.hsfiles で参照可能
    • stack-templates リポジトリを作る
    • matsubara0507/stack-tpls でテンプレ取れる
  • GraphQLのクライアント誰か作って

gloss: 動かして遊んで学ぶHaskell / @lotz さん

  • Haskell入門後ありがち 「ネタがない」
  • gloss
    • 2Dグラフィックを簡単に描画
    • ゲームも作れる
    • Twitterで「glossで作ってみた」して欲しい
  • display InWindow text など
  • line 線分
  • circle circleSolid
  • rectangleWire rectangleSolid
  • text フォント指定、日本語表示はできない
  • 座標系
    • 真ん中が (0, 0)
    • translate
    • scale 拡大縮小 x 座標、 y 座標、別
    • rotate
    • color
  • Picture は Monoid
  • 例: 2重振り子のシミュレーション
    • simulate 関数
    • 引数 model
    • model -> Picture
    • ViewPort -> Float -> model -> model 時間発展させる
  • 二重振り子のモデル
    • 角度θを2つ
  • hamilton
  • デカルト座標と角度の座標系を2つ使う
  • 振り子の絵を作る
    • 線と丸を適切に組み合わせるだけ
  • 例: コモナドで作るライフゲーム
  • モナド extractduplicate
  • 周りが 2個か3個であれば生存
  • Z [a] a [a] 1つの要素に注目した無限リスト
    • left right を定義できる
    • extract は自明
    • duplicate は、 leftright でそれぞれ移した無限リストをもたせる
  • Z2 (Z (Z a)
    • extract は自明
    • duplicate 4方向にずらした無限リストをもたせれば良い
  • neighbours 周りの個数、 life 時間発展させる
  • モナドextend で、ライフゲームが完成する
  • 遅延評価によって、この実装でも動く
    • 見える部分だけの評価でいいので
  • 計算量がどんどん増える
    • トーラス上に実装すれば解決できる?
  • IO を使いたければ、 simulateIO PlayIO
  • 例: カオスゲーム
    • 多角形(三角形)の頂点と適当な点の内分点をどんどん追加するとフラクタルが書ける
    • クリックして適当な点を決める

Liszt あるいは永続データ構造を真に永続させる方法 / @fumieval さん

  • バイト列のリストに
    • 名前をつけて
    • 1つのファイルにリアルタイムで
    • Map [ByteString] ByteString
  • insert Transaction モナド内で追加
  • commitFile で変更を反映
  • liszt コマンドでサーバを立てる
  • fetch で取得
  • Request でとり方を指定する
  • commitFile でファイルを指定し、 "hello, world" を書き込む
  • Skew binary random access list を要素として持つ 2-3 Tree
  • Skew binary random access list
    • アップグレード、ダウングレード
    • 一部を取り出すのに適したデータ構造
    • 純粋関数型構造の本を参照
  • リーフ 0 ~ 2枚、または 2ノード、 3ノード
    • ルールが複雑だが、値をバランスよく配置できる
  • 途中でエラーで落ちてもデータは残る
  • inotify で検知できる
  • extensive 攻略wikiのバックエンドとなっている
  • Kafka との比較
    • 1つのファイルにアーカイブできる
    • パフォーマンスは劣る
    • 書き込みにサーバがいらない
    • Franz Kafka に対抗して Franz Liszt とした
  • GCを実装したい
  • データ構造の永続化、圧縮
  • Q). 何Gくらいまでいける?
    • A). 100GB くらいまでならなんともない
  • Q). acid-state との違いは?
    • A). 1個のデータかどうか? 詳しくないので詳細は
  • Q). RDBMSっぽくなりますか?
    • A). それはないです(即答)
  • Q). ローカルファイル以外に保存は?
    • A). 書き込みはローカルに限定
  • 最後に自己紹介

inline-java パッケージを WSL へインストール

ハマってガチャガチャしたので間違いあるかもしれないけどメモ。

まずjavaをインストール。入れるのは default-jdk のほうがいい気もする。

$ sudo apt install openjdk-9-jre-headless
$ sudo apt install openjdk-9-jdk-headless

jvm パッケージを入れるのに必要と思われる環境変数

$ export JAVA_HOME=/usr/lib/jvm/java-9-openjdk-amd64
$ export LD_LIBRARY_PATH=/usr/lib/jvm/java-9-openjdk-amd64/lib/amd64/server

jni パッケージのために stack.yaml へパスを追加。

extra-include-dirs:
  - /usr/lib/jvm/java-9-openjdk-amd64/include/linux
  - /usr/lib/jvm/java-9-openjdk-amd64/include
extra-lib-dirs:
  - /usr/lib/jvm/java-9-openjdk-amd64/lib/amd64/server

stack build inline-java してビルドする環境が整ったことを確認。

サンプルは依存パッケージに inline-javajvm を入れて、以下のような感じで。 DataKinds がいつの間にか必要になってたようだったので加えた。

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE QuasiQuotes #-}
{-# OPTIONS_GHC -fplugin=Language.Java.Inline.Plugin #-}
import Language.Java (withJVM)
import Language.Java.Inline

main :: IO ()
main = withJVM [] [java| { System.out.println("Hello Java!"); } |]

実行。

$ stack exec java-sample
Hello Java!

今日は Roppongi.pm #1 の日です

六本木.pm に来ていますので、適当にメモします。

オープニング

  • 吉祥寺.pm + Okinawa.pm = 六本木.pm
  • 六本木で Okinawa.pm やればいいや
  • 飲食自由、フリードリンク
  • ハッシュタグ#roppongipm

ラクダがピンクだった頃の思い出 / @yoshiyuki_kondo さん

  • Cプログラマのためのアルゴリズムとデータ構造、 Javaプログラマのためのアルゴリズムとデータ構造、yaccによるCコンパイラプログラミング なども書いてます
  • Perl4の時代はラクダ本もリャマ本もピンク
  • 訳本には Larry Wall のサインが入っている
  • 1994年の 5.0 で青いラクダになった
  • 常時接続は先進的な大学・企業のみ
    • 小規模な会社はモデム(uucp)
    • usenetとメールを利用。30分毎にポーリング
  • Perl 3 の後期から弄っていた
    • comp.sources.misc
    • perl 4.0 のネットニュース → 36個集めるとソースファイルになる
  • Sun の Sparc Station
    • 16MB, 500MB
    • 3人でPC9801からログイン
    • X window は未使用
    • Emacs(Eight Megs And Constanly Swapping 笑) の日本語版は Nemacs
  • Perl は初めて広く使われたスクリプト言語
  • Cと比べてPerlのよかったとこ
    • s/// は大胆だけど便利
    • <> $_ は慣れると便利
    • コンパイルがいらないのでターンアラウンドが短い
      • BASICを思い出す
    • 標準Cライブラリを一通り使える
    • 別プロセスを起動しないので、早い
  • Perl4の弱点
    • requireしかない(oraperl.pl)、リファレンスがない
    • 日本語の扱い jperl, jcode.pl
  • 当時はオライリーの日本法人がなかった
  • Perl5 になってオライリー・ジャパンから
  • Linux Confrence 200 Fall & Perl/Ruby Conference
    • Larryにアニメの売ってる場所を教えた思い出
    • Ruby 2.0 と Perl 6 はどっちが先に出るか
  • Perl のハッシュ実装は優れている
    • Hashdos : 同じハッシュ値を持つキーを大量に投げて、そのキーへのアクセスを遅くする
    • perlは大丈夫だった : 毎回ハッシュ値の生成方法が違う

Amason::S3::Thin の紹介 / @DQNEO さん

  • AMazon S3
    • KVS的だが永続保存
    • 大きめのファイルを大量保存
    • HTTP REST API
  • Amazon::S3::Thin
    • Thin, Low level, Low learning cost, Signature V4
    • put_bucket , put_object or get_object
  • Thin
    • put_bucket_compose_request request の組み合わせ
    • HTTPリクエストを作ることしかやってない
    • ステータスコード無視、リトライしない、XMLもパースしない
  • Thin の利点
    • 依存が少ない(XMLライブラリ不要)
    • やってることが透過的にわかる
    • エラー時の挙動を自由に組める
  • Low level
    • put_bucketAPI の PUT Bucket と一対一に対応
  • Low level の利点
    • S3 Rest API を知っていれば学習コストが低い
    • aws-cliaws s3api と同じ感覚
  • 利用実績
    • ブラジル、アメリカのPR、 skaji さんのとこ
  • 動機
    • Net::Amazon::S3, Amazon::S3 が主流だった
    • Perlish Interface が用途に合わない
      • メソッド名が add_key なのに PUT OBject してるとか
      • $bucket オブジェクトの位置づけが直感的ではない
      • $s3->err は文字列じゃないの? $bucket への呼出が $s3 に保存されたり
      • 抽象レイヤにもやもや → fork した
  • 設計のヒント
    • Symfony (PHP)
      • MVCフレーム枠ではない
      • HTTPフレームワーク。リクエストを受けてレスポンスを返す
    • S3ライブラリの本質はHTTPクライアント
      • Perlで言えば 。
    • Web::Query (by tokuhirom さん)
      • 通信部分とDOM部分が明確に分かれている
    • リクエストを作るだけ。通信はしない
  • 与太話 (PHPer が感じたこと)
    • 日本のPerl Mongersは強い
    • Perl以外にも精通
    • 息をするように CPANize
    • Conference駆動OSS開発
    • インフラ、アプリケーションエンジニアも
    • 小さいツールでものを作る、Test文化、POD文化
    • PODに哲学
    • 車輪の再発明もする
    • 遊び心 Acme::
      • 処理系のソースに指輪物語のセリフが書いてたり

Perl5 と私の歴史 / @tokuhirom さん

  • 2005~2014までPerl、2015~2016までJava
  • Perl 5のまま
  • Text Processing, CGI, mod_perl, Plack と変化があった
    • おじさん「CGI時代はFTPでアップするだけだった・・・」
  • 10年前に考えていた理想のプログラミング言語
    • 速い、楽しい、便利
    • XS、みんなで作るのは楽しい、自分で書けば便利になる
  • 書いたもの
    • Text::MicroTemplate
    • MadEye (Plagger 的なの)
    • HTTP::Session
    • Smart::Args (エグい記法で書けるやつ)
    • Furl (DeNAの人が必要としてた)
    • OrePAN
    • Amon2 : 広く使われている。高速
    • Teng : DBIx::Classより省メモリで高速
      • DevOps的な人が楽をできるようなテクニカルスタッフ
    • Minilla : miyagawa さんが Dist::Zilla ベースでも作ったので2つになった
    • Router::Boom : ルーティングを正規表現にするので速い
    • Localizer
    • Plack : 仕様と実装を分けたかった。miyagawaさんが飛行機に乗ってる間にできた
  • Perl Toolchain Gang になった
    • 日本人だとmiyagawaさんとtokuhiromさん
    • perldoc.jp
      • miyagawaさんが飽きたので受け取って、JPA
    • METACPAN の API Exporter
    • plenv
  • Perl6 の歴史
    • 10年経っても実用的な速度が出ない
    • Perl 5 を Perl 7 にする派
    • Perl 6 と Perl 5 は別の言語だから仲良くしよう
  • 2015年にPerl6がリリース
    • WAFが作れるようになっているはず
    • 色々を移植 → 速度が出てないので、実用的ではない
  • なぜをJavaを使っているか
    • Fast 、 IDE Support がある
    • Perl を書く人は動的にやってしまいがちなので、IDEがショボい
  • Perl 5 は Plack のあと、 Text Processing 用途に戻ってきた
    • awk などより便利
    • Python には DATA section や <> のような意味不明な機能がない
  • Perl 5 は Plack に向いてない。 Text Processing で使うもの

History from Perl 1.0 to Perl 6 / @AnaTofuZ さん

  • Perl1 ... Perl4 は実在したのか
  • Perl 全部ビルドした
  • Perl 2, Perl 3 のコードは Perl 5 のリポジトリにすべて残っている
    • タグが付けられている
  • 過去のPerlのコードはググっても出てこない
    • man を使う
  • gcc を自前で build する必要がある
  • Perl 1.0
    • 2002年 gcc3 対応(Perlへの誕生日プレゼント)
    • chastai さんのリポジトリ → 消えた
    • サブルーチン、 C 言語スタイルの for loop はある
    • 添字は文字列である必要
    • エラーメッセージが厳しい
  • Perl 2.0
    • local, foreach, sedよりも高速, do で外部ファイルの呼び込み
    • fib が書ける (再帰呼び出しサポート)
  • Perl3.0
    • Perl5の原型ができる
    • 型グロブ、連想配列do hoge から &hoge でサブルーチン呼出
    • .. が範囲演算子
    • 多次元配列がまだ書けない - キーの結合でごまかす
  • Perl4.0
  • Perl5.0
    • オペコードを使ったコンパイル+ インタプリタ型に変更
    • miniperlが登場、 manからpod
    • use, my
    • SV 型ができた
    • typedef の数が9個から 49個へ
  • パフォーマンスは、小さい処理であればオペコードに変換しない分古いPerlのほうが速い
  • Perl6.0
    • 大きいデータを使うと、JITによってJVM版について
    1. GCCは古いものを撮ってくる?
      1. 必要はない。Perlのソースをいくつか弄る

LT

めくるめくB::Cの世界 / @papix さん

  • PerCUDA / PerlGPGPU を使う論文
  • GPGPUが熱い
  • 問題点 : Perl -> C -> LLVM IR -> PTX
  • Text::Xslate でやってる
  • B::C --force で因すとーる
  • 変換は成功
  • B::C 初華絵ない
    • 普通のC言語のコードが必要
    • PerlとCは似ているから、そのまま変換するといい
  • perlcc を使うとバイナリにできる

サーバレス日本語形態素解析エンジンとの格闘記録 / @Korenari_D さん

  • Perl / awk sed が辛い時に使うもの
  • 実用PerlPerl自然言語処理に使うと書いてある
    • NLPのいしづえ
  • 形態素解析
    • 「振り返れ」「ば」「遠く」「へ」「やって」「きた」
  • 形態素解析エンジン + ライブラリ
    • MeCab + IPAdic / NEologd
  • 環境を整えるのがめんどくさい
  • AWS APIGateway + Python Lambda + NEOlogd の発表の構成が良さそう?
    • OSのコンパイルが必要、処理速度が遅い
    • 1,000 文字の解析に 9.1 秒
    • Lambda の起動と S3 からのDockerイメージ読み込みが遅い
  • サーバレスは銀の弾丸ではない
  • API Gateway - Fargate で1秒以内になった

吉祥寺.pmに登壇して○○になろう! / @setoazusa さん

  • 9/1 付で Microsoft MVP for Developer Technologies (JavaのMVPは日本人初)
  • 吉祥寺.pmに登壇してMMVPになろう
  • PHPPythonはあるけどPerlはない
  • kuduで入るなら何でも動く、Dockerがある、PerlのMVP
  • 10/8 技術書店に行きましょう

1年間Perlでゲーム作りました / @return520 さん

  • サーバー
    • Amon2 を API サーバとして利用
    • RDS Redis Memcache と通信
    • フロント : AngularJS, Vue.js, Native, Unity
  • EC2インスタンスでAgngular.js と Amon2 で
  • Perl 5.18 で、バージョンをあげようとしている

クロージング

  • YAPC::Tokyo 2019 を 2019-01-26 に開催
  • ブログを書くまでが Roppongi.pm
  • 次回以降は反響次第。話を聞きたい人に声を掛ける方針

"アルゴリズムクイックリファレンス" のノート (2)

p.4 の貪欲法。素朴なアルゴリズムよりこちらの実装のほうが楽に思える。

github.com

前回の遅いアルゴリズムとの速度比較。 variance introduced by outliers が大きくていいのかは気になる。貪欲法の方が 2,000 倍以上速いので、むしろ前回の slow の実装に問題がありそう。

$ stack exec bench-convexhulls -- --output=convexhull.html
points generated
fromList [Point 2.1377835882015472e-2 0.37675969687894406,Point 0.13059550359891225 0.8854193459395515,Point 0.14393294171704973 0.6508550014289608,Point 0.14678966702903884 0.21690928594716652,Point 0.1757711424912075 0.38256258657810427,Point
 0.28131270801990793 0.5923766278106027,Point 0.3174033812169047 2.044354461161324e-2,Point 0.3439496349547865 0.6634254643623526,Point 0.35531986020882733 0.9939481921271572,Point 0.4572955120772927 0.8085648753413374,Point 0.47351659627409937
 0.654837905224889,Point 0.5475827076206295 0.6856510548569369,Point 0.5982120295123295 0.11060895459648956,Point 0.7500144155213943 0.4153833924540856,Point 0.7612610246351973 0.8364323883690482,Point 0.7686159957030524 0.9395602140690221,Poin
t 0.8566170876792828 0.3887263627739349,Point 0.8958593880534803 0.8857736692653796,Point 0.9108407836308833 0.7138539153041928,Point 0.9771895259588333 0.6526386332297055]
benchmarking slow
time                 5.779 ms   (5.547 ms .. 6.036 ms)
                     0.987 R²   (0.975 R² .. 0.998 R²)
mean                 5.858 ms   (5.748 ms .. 6.044 ms)
std dev              407.6 μs   (267.3 μs .. 603.6 μs)
variance introduced by outliers: 41% (moderately inflated)

benchmarking greedy
time                 2.451 μs   (2.413 μs .. 2.495 μs)
                     0.997 R²   (0.992 R² .. 0.999 R²)
mean                 2.452 μs   (2.421 μs .. 2.520 μs)
std dev              148.3 ns   (51.28 ns .. 270.0 ns)
variance introduced by outliers: 72% (severely inflated)

HTMLはこちら。

https://cdn.rawgit.com/hiratara/hs-nutshell-algorithm-examples/master/convexhull.html

降順に並べるときに使う Data.OrdDown みたいな小技は、知っているとお得感がある。

"アルゴリズムクイックリファレンス" のノート

p.3 の convex hull の素朴解。

https://github.com/hiratara/hs-nutshell-algorithm-examples/blob/master/src/Main.hs

正しいかわからないので、plotしておく(案の定バグってたので修正してある)。

f:id:hiratara:20180908162419p:plain

道具は datahaskell に従った。具体的には、乱数に mwc-probability 、 plot に Chart-diagrams を利用。作ったsvgファイルをブラウザで見るために、 stack install wai-app-static して warp によってweb serverを立ち上げている。。

"The Elements of Statistical Learning" のノート

The Elements of Statistical Learning .

chap. 2

  • supervised learning と unsupervised learning
  • inputs
    • predictors, independent variables, features とも言う
  • outputs
    • responses, dependent variables, targets とも言う
  • quantitative
  • qualitative : 有限集合で表現される
    • classes, categorical, discrete, factors とも言う
  • regression : quantitative outputs を予測すること
  • classification : qualitative outputs を予測すること
  • qualitative and quantitative input variables
    • 予測に使う手法に影響する
  • ordered categorial : categorical だが順番がある
    • 例: small, medium, large
  • qualitative variable はコード上では数値で表現される
    • 0, 1 とか -1, 1 とか
    • dummy variables: 複数個のカテゴリをまとめる
    • K-level qualitative variables
      • K 個の2値変数で同時に2つ以上ONにならないもの
  • input variable は X で表す
    • component は X_j
  • quantitative outputs は Y
  • qualitative outputs は G (group)
  • observed value は小文字で書く
    • i番目に観測したX は x_i
    • scalar or vector
  • 行列は大文字太字
    • \boldsymbol{X}: N \times p, i = 1, ..., N, x_i: \textit{p-vactors}