@znz blog

ZnZ の memo のようなもの

Learn Languages 2017 in ODC に参加しました

| Comments

LLイベント2017 – Learn Languages に参加しました。 今回は名前が Lightweight Language から Learn Languages に変わって (単数形から複数形に変わってる)、 オープンデベロッパーズカンファレンス2017 Tokyo というイベントの一部としての開催でした。 今年は本編の方は無料イベントになっていました。

会場

たまには飛行機に乗りたいと思ったので、行きは飛行機で移動しました。

京急蒲田駅から(路線検索によると15分ぐらい)歩く必要がありました。

帰りは新幹線でしたが、金券ショップで買える指定席の回数券が使えない時期の最終日だったので、自由席で帰りました。 ギリギリだと座れないと辛そうというのと翌日がつらいかもということもあって、懇親会には参加せずに帰りました。

0泊で東京のイベントに参加したのは、思い出せる限りでは Binary 2.0カンファレンス 2005 以来のような気がします。

オープニング

  • いろいろあって名前が変わった
  • 会場無線LANはなし
  • LT の枠が余っているのでまだ募集中

基調講演「ハッカーになるためには何の言語を勉強したらいいですか?」

  • SECCON
  • CTF (Capture The Flag)
  • ハッカー育成
  • ハッカー vs. クラッカー
  • 世界で有名な日本人ハッカー
  • ハッカーの誕生場所
  • 初期のハッカーはハードウェア対象だったのでわかりやすかった
  • ソフトウェアだとわかりにくいので、可視化が重要
  • ENIAC : 配線でプログラミング
  • 紙でプログラミング
  • FORTRAN : パンチカード
  • 紙テープ
  • 若者の「01」離れ
  • TK-80
  • 回路図もついていた
  • 大人の科学 vol.24 (4bitマイコン)
  • Harvard Mark I Computer (1944)
  • 世界初の汎用計算機 (完全自動計算機)
  • プログラムとデータが別々
  • グレース・ホッパーの作業日誌 (1945年)
  • 史上初のコンピュータ・バグ
  • 原因となった「蛾」
  • COBOL
  • COBOL は英語の文法をベースにしている
  • 文末が「.」で終わるのは古い言語
  • 「.」が抜けるとわかりにくいなどデバッグしにくい
  • ハーバード・アーキテクチャの復権?
  • 現代のコンピュータセキュリティの根本問題: データとコードの分離がされていないこと
  • XSS脆弱性、SQLインジェクション、x86任意コード実行(マルウェア感染)
  • 01を実践的に学べる場所が必要
  • ローマは1日にしてならず
  • せめて2日はほしい
  • ハッカーになるためには 何の言語を勉強したらいいですか?
  • ペルシャ語
  • Stuxnet (スタックスネット)
  • イランの核施設の遠心分離機をターゲットにした。SiemensのSTEP7 (ビジュアルプログラミング言語、JIS 3503でも標準化されてる) (メモできていなかったので https://twitter.com/tadsan/status/899118034182316032 より)
  • アドレッシング表記 127.7 (小数点 .0-7 はビット目)
  • マルウェアFlameではLua言語が使われていた? SQLiteも?
  • ベルシャ語 (外国語)、機械語 (CPU, VM)、ビジュアル言語 (ラダープログラミング)、ドメイン言語 (EUCの発展)
  • 一番いいたかったのは外国語を勉強しましょう
  • 初めての PC から大学時代の話
  • 制約のある環境だと、ハッカーが育ちやすい
  • Perl でマインスイーパーの自動クリアのデモ
  • Win32::GuiTest のデモ
  • ケータイやスマホの機械操作
  • 会社で PRML 読書会
  • 関連情報を書籍化
  • 機械学習のプログラミング (最近)
  • scikit-learn
  • 機械学習では最近 Python, R がよく使われる
  • 画像解析はデバッグが大変
  • 暴走問題
  • 自動操作中なのでタスクマネージャーも操作できない
  • コンソールもひらけないので taskkill も使えない
  • USB メモリーの autorun.inf で [Autorun] open=taskkill /F /IM perl.exe
  • 悪用されたので autorun は Vista 以降だとデフォルトで無効
  • USB にさすと cmd.exe がどんどん開くデバイス (キーボードとして振る舞う)
  • MikuMikuDance
  • MMM と kinect で機械学習を使ったモーションキャプチャ
  • akinator
  • 集団学習アルゴリズム
  • Randomized Forests in Vision
  • https://twitter.com/kinyuka/status/892577093166419968 (「AI人材を募集します」で始まるツイート) の紹介
  • 質疑応答
  • アセンブラかるた
  • アセンブラ・クロスワードパズル
  • study と learn の違い
  • 高校 (児童・生徒) までは教えてもらう、大学 (学生) は自分で勉強する
  • study は学習していること、learn は習得した
  • 小学生とかに教えるときにビジュアルプログラミングとかだけではなく高度なことを教えるのは?
  • ぺたスクリプト というのがある
  • 国語が重要
  • 同年代以外のいろんな人と話をするのも大事

休憩

LT の募集案内があった。

関数型言語のすすめ

  • 関数プログラミング用言語としての Haskell
  • http://www.sampou.org/
  • 関数プログラミングとは
  • 副作用を使わない?
  • 関数?
  • なぜ関数プログラミング : 抽象的にわかりやすく考えたい, 簡潔で読みやすいプログラム
  • Haskell : 汎用の純粋関数プログラミング言語
  • ポイントは、ほしい値の仕様は型で構成する, ほしい値は式で構成する
  • 書く前に読めるようになってほしい
  • コードの読み方のポイントは関数の型シグネチャ
  • 型シグネチャの中の -> は型構成演算子で右結合
  • g :: a -> b -> cg :: a -> (b -> c)
  • 関数適用は左結合なので g x y(g x) y
  • 無名関数はあるが実際にはほとんど使わない
  • 例: 最初は型を書いて実装は undefined にしておいてあとで書く

  • Scala 言語紹介

  • 2003年に開発された
  • Scalable Language
  • オブジェクト指向と関数型の融合
  • 全ての値はオブジェクト
  • var と val
  • 統一的な型階層: 全ての型は Any のサブタイプ、 Nothing は全ての型のスーパータイプ
  • case classes
  • 代数的データ型とパターンマッチ
  • 不変コレクションとパターンマッチ
  • ローカル型推論
  • 第一級関数と高階関数

  • Elixir 言語紹介

  • アクターモデル
  • 動的型付け
  • ネットワークサーバー構築に特化した
  • 関数の引数のパターンマッチ
  • ドキュメント
  • ドキュメントテスト
  • mix test でドキュメント中の example が動く
  • 型システムは(まだ)ない
  • Elixir プログラミング = 関数型プログラミング + アクターモデル
  • Elixir の計算モデル
  • Elixir のアーキテクチャ
  • なぜ Elixir を使うのか?

  • 関数型プログラミングとは入力から出力への写像

  • 今回のお題

  • 関数型プログラミングのメリットを示す、比較的簡潔なコードになる、意味のある問題
  • 構文解析を行うライブラリを作成せよ (パーザコンビネータ)、様々な用途に対応できる、簡潔にかける
  • サンプルの入力: 四則演算の数式: カッコを含む, 空白は含まない, 整数のみ

  • Haskell 版

  • パーサ「言語」を構成する要件
  • 型から考える
  • (感想: 抽象的で難しかった)

  • Scala 版

  • 計算しない場合は10行程度
  • foldLeft を使って計算
  • ここまではライブラリを使った例、ここからはライブラリの方の説明
  • 作る側は60行程度
  • 第一級関数やパターンマッチの恩恵
  • パーザを関数とみなすことの恩恵

  • Elixir 版

  • パーサー I/F: 入力と出力を決める
  • BaseModule と CalcModule を作る
  • ドキュメントにテストを書きながら実装
  • Elixir ではパイプ演算子 (|>) を多用する
  • https://github.com/ohr486/LearnLanguage2017inODC
  • https://twitter.com/ohrdev/status/899156490832945152

  • 質疑応答

  • バージョンアップするときに無停止でできるという話があったが Erlang の VM のバージョンアップのときは無停止ではできないであっているか → あっている
  • プロセスのメモリ消費: トランポリン実装? プロセス実装のドキュメントを見るのが良いのでは。
  • Haskell にはそもそも副作用という概念がない
  • Scala は中庸的で、できるだけ状態が変化するオブジェクトを返すが、必要なら var を使うし、IO も制限していない
  • 「Scalaでもvarを使うことはあまり推奨されず、オブジェクトの性質を利用して副作用を使える」 https://twitter.com/golden_lucky/status/899153339564269570
  • テスティングフレームワーク、データベースアクセス、アプリケーションサーバー
  • Haskell: Web フレームワークは3種類ぐらい, データベースはいろいろ, QuickCheck
  • Scala: Web フレームワークは Play 2, データベースは Slick, quill というのもある, テストは Scala Test
  • Elixir: Web フレームワーク Phoenix, データベース ?(覚えきれず), テスト ?(覚えきれず)

第2プログラミング言語鑑定団

  • 初心者が複数言語を知っていた方が良いと言われて次の言語に悩む
  • Teratail や Yahoo 知恵袋を参考にした
  • 質問1: 文系の大学4年生の時に独学で C と Java の初歩, 会社で HTML, CSS, JavaScript https://twitter.com/hourin/status/899159271807397888
  • OCaml: 独学ができるようなので Web と対極にあるもの, プログラミング OCaml (これ?) がよかった
  • Ruby とか Go とか: サーバーサイドやインフラ系, 周りが使っているものなら Ruby じゃなくても Python とかでもとインフラ系として Go
  • ◎本命 C#, ○対抗 DevOps, ×大穴 PhotoShop: C や Java に似ているもので Web だけでは心配とあったので C#, 将来が不安なら上から下まで自分でできた方が安心できそうなので DevOps, あとは将来が不安ならとりあえず PhotoShop
  • Xamarin + C#: 微妙な感じなので、微妙なところ

  • 質問2: 文系大学, ゲーム好き, ゲームクリエイターになりたい, プログラミングはまだできない, 特筆したスキルもない, ゲーム開発者になるためにはどの言語から学ぶのがよいでしょうか? https://twitter.com/hourin/status/899161811827646464

  • ◎NScripter, ○Unity, ▲スポーツジム: (NScripter についてはメモとれず), Flash みたいな感じで Unity を使う, 最終的には C# に辿りつけばいいな, ゲーム開発者は体が資本
  • ◎Unity, ○Unreal Engine: 「Unreal Engine 4 で極めるゲーム開発」(ボーンデジタル)
  • HyperCard, LiveCode: 文系なら英語も大丈夫, ボードゲーム?
  • 何でもいいからさっさと作る: 作りたいものがあるはずなので頑張ってほしい

  • 質問3: サーバーサイドエンジニア, Ruby on Rails, AI や機械学習が気になっている https://twitter.com/hourin/status/899162996777164800

  • Python: 「ゼロから作るディープラーニング」(オライリー)
  • (Python), (PyCall), 数学: まず数学
  • ◎Python, ○R, ▲C/C++: 文系しばりがなくなった。Ruby を使っているのなら Python ぐらい知っているだろう。なんとか偏差とかも簡単にできる R。最適な、とあるので C/C++
  • Prolog: 使いこなす、とあるので。Watson や Pepper の裏側で使われている。
  • 処理系はいっぱいある。入れやすいのは GNU Prolog

  • 質問4: SIer 2次下請け, Struts, Java しか使ったことがない https://twitter.com/hourin/status/899164784163041280

  • 作った感じの質問
  • 会場アンケート: Struts を使っている人? → いない
  • Common Lisp: 「実践 Common Lisp」(オーム社), 身につけると長く役に立つ
  • Haskell: 「すごいHaskell」(オーム社), 最近和書がたくさん出ているので恐れずにやってみると良い
  • Lisp: 圧倒的に長く役に立つ, 転職は探せばある?, すべての言語が Lisp, Lisp を学ぶと悟り体験が得られるらしい
  • Ruby, C, アセンブラ: だんだん掘っていけば長く使えるはず
  • ◎PHP, ○C/C++, ▲COBOL: 相変わらず2次下請けで良い?ならPHP, 組み込みなど他の分野に変わるなら C/C++, COBOL をやっていたら転職もできるし長く使える, アセンブラはアーキテクチャが変わると長く使えるという条件に当てはまらなそうなので COBOL にした

  • 質問5: Web サイト作成のために PHP 学習中, 効率的なプログラミング学習法, 面白いプログラミング言語とその理由 https://twitter.com/hourin/status/899166828559122433

  • これも作った感じの質問
  • 「あなたの知らない超絶技巧プログラミングの世界」(Ruby): esolang は他の人が出すだろうと思って、これにした。
  • ◎Ruby, ○JavaScript, ▲Curl: Ruby: たのしいRuby という本がある, JavaScript: Web サイト制作のために、とあるので, Web サイトはインフラを用意するのが大変, ちょっとした変更ならローカルでできる, Curl: 面白いという点だけなら Curl という言語, サーバー側もクライアント側も Curl
  • Brainf*ck: 「Ruby で作る奇妙なプログラミング言語」(マイコミ), Brainf*ck の実装をどんな言語でもいいのでやってみるのが面白い, 実装が簡単なのが Brainf*ck
  • おっぱい言語, なでしこ/ひまわり/プロデル: Brainf*ck 系の言語におっぱい言語というのがある, 日本語プログラミング言語

  • 質問6: インフラ運用エンジニア, 使える言語はシェル, 仕事で使っている OSS の言語は多様, 自動化をやっていくために、どのような言語を学ぶのがよい? https://twitter.com/hourin/status/899169062915235840

  • Go: 「プログラミング言語Go」(丸善), 「Go ならわかるシステムプログラミング」(ラムダノート) (まだ出てない), 列挙されていた言語になかったもの, Google が推している, 下回りを C とかアセンブラで学ぶのは古い
  • YAML とそれを使える言語: 設定ファイルが YAML のことが多い, ツールの実装言語を学べば良い
  • ◎Python, ○Ruby, ▲Go: Python: インストーラーとかマネージメント系がシェルから Python になっているので, libpcap を直接扱えるライブラリとかでスキルセットを広げていける, 自動化は ansible が YAML を使っていて Python で書かれている, Ruby: chef が Ruby で書かれている, 自分でプラグインとか書ける, Go: 上のレイヤーからみて Docker を使っているのではないかということで Docker の実装に使われている Go
  • 怒りに身をまかせろ: 怒りさえあれば勉強しなくて良い, 必要があれば読むので自然に覚えていく, インフラエンジニアはプログラマと仲良くすると色々教えてもらえる, 怒ってもいいけど怒られないように

  • 会場から質問: 小学3年生の子供に教えるのに適した言語は? Scratch の番組とかは見て興味をもってやっている

  • Scratch はそんなにやっていなくて、結局ゲームをやっている
  • Scheme 「SICP」(翔泳社)
  • (日本語), Smalruby
  • ◎English, ○Smalltalk, △N-88 BASIC
  • ボードゲーム, アセンブラカルタ

ライトニングトーク

従来言語で理解する次世代言語の概念 高野光弘 @takano32

  • 次世代の発想は既存の発想の発展が多い
  • 空飛ぶ車 = 車 + 飛行機
  • プログラミングにも同様のことが多い
  • Perl = sh + sed + awk
  • C++ = C + オブジェクト指向
  • Java = オブジェクト指向 + 仮装計算機
  • サンプルはアンケート項目
  • Ruby = Perl + オブジェクト指向
  • … (はやすぎるのでメモを取るのを諦めました)

同じ処理を複数の言語で書いてみよう 増井 敏克 (ますい としかつ) @masuipeo

  • いろんな本を書いている
  • プログラミング言語図鑑
  • 本を書いた経緯
  • CodeIQ で出題者をしている
  • 提出された回答をみていたら、いろんな言語が読み書きできるようになった
  • 言語の人気は変わる
  • 言語を勉強するときのコツは?
  • とにかく手を動かす
  • 「読む量は学力の上限を規定し、閣僚は学力の下限を規定する」
  • 言語を学ぶときの姿勢

おいら的テスティングフレームワーク比較 Java C# PHP JavaScript sengoku

  • Java: モックの作成が簡単
  • JavaScript: ファイル監視が楽チンすぎる
  • describe と it に日本語をかけてわかりやすい
  • expect の書き心地が英語っぽくて良い
  • C#: マウス操作するのがつらい (キーボードショートカットがうまく動かなかった), モック化を阻むフレームワーク (.Net Framework) 内のクラス
  • PHP: とくに可もなく不可もなく
  • SQlite はテストが5000万行で本体7万行
  • テストを書きやすい環境を選ぶ方が良いのでは

PHPにおけるメタプログラミングの温床 うさみけんた @tadsan

  • オープンクラスなどではなく静的解析しやすい
  • その和を乱す動的な機能がある
  • 初級編
  • callable $f($arg)
  • compact
  • extract
  • $$var 可変変数
  • debug_backtrace
  • 中級編
  • マジックメソッド
  • __get(), __set()
  • __call()
  • 上級編
  • spl_autoload_register

関係記述型言語 ラダーのすすめ 土井 康正

now going with go @nasa9084

  • emacs!
  • 会場アンケート: 昨日も来ていた人は少なかった
  • go言語
  • go special syntax
  • iota
  • Initializer Statement
  • defer Statement
  • testing package
  • go testgo test -bench
  • testing.T
  • testing.B
  • Example Tests
  • go generate
  • // go:generate stringer
  • 便利な標準ライブラリ
  • gofmt
  • go vet
  • godoc

Klassic言語の宣伝 水島宏太

RubyKaigi 2017 のご紹介+α @takatayoshitake

クロージング

恒例の抽選での書籍プレゼントは、全員分あるということだったので、どうするのかと思ったら、今までのボール投げとは違ってくじ引きでした。 書籍は2冊もらえた人もいたようです。

Comments