Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

私とOSS活動とPerl

3,897 views

Published on

YAPC::Japan 2019 での登壇資料です

Published in: Software
  • Be the first to comment

  • Be the first to like this

私とOSS活動とPerl

  1. 1. 私とOSS活動とPerl YAPC::Tokyo 2019 2019.01.26 [SAT] 前田隼輔 ( @duck8823 )
  2. 2. 自己紹介 - 前田隼輔 @duck8823 - 株式会社エス・エム・エス - Server Side Kotlin - エンジニア 6年目 - Perl: アプリ開発経験なし / 運用スクリプト - OSS: 個人開発 2
  3. 3. 3 Agenda ( 私とOSS活動とPerl ) ├─ 0. 学生時代 │ └─ 生命科学 と Perl ├─ 1. 新卒時代 │ ├─ Java と Perl │ └─ CPAN::Author ├─ 2. 転職活動 │ ├─ Perl と 技術カンファレンス │ └─ 転職活動 と OSS └─ 3. OSS と 個人プロジェクト ├─ 今作っているもの └─ OSS と世界
  4. 4. 4 Agenda ( 私とOSS活動とPerl ) ├─ 0. 学生時代 │ └─ 生命科学 と Perl ├─ 1. 新卒時代 │ ├─ Java と Perl │ └─ CPAN::Author ├─ 2. 転職活動 │ ├─ Perl と 技術カンファレンス │ └─ 転職活動 と OSS └─ 3. OSS と 個人プロジェクト ├─ 今作っているもの └─ OSS と世界
  5. 5. 5 生命科学とPerl
  6. 6. 修士論文のテーマ - 専攻は生命科学 - 学部時代はウェット(実験屋さん) - (もともとパソコンも好きだったので) 大量データ解析をする研究をテーマに => Perl を勧められたのがきっかけ 6
  7. 7. BioPerl - 生命科学: 2000年代後半から大量解析時代 => バイオインフォマティクス - BioPerl - github.com/bioperl - 生命科学のためのPerlツール群 - OSS 7
  8. 8. この頃書いていたPerl - スクリプト( .pl )のみ - モジュール何それ - リファレンス何それ - 複数の スクリプトを パイプ で繋ぐ - OSSは利用するだけ(意識してなかった) 8
  9. 9. “ 9 OSSは意外と近くにある
  10. 10. 10 Agenda ( 私とOSS活動とPerl ) ├─ 0. 学生時代 │ └─ 生命科学 と Perl ├─ 1. 新卒時代 │ ├─ Java と Perl │ └─ CPAN::Author ├─ 2. 転職活動 │ ├─ Perl と 技術カンファレンス │ └─ 転職活動 と OSS └─ 3. OSS と 個人プロジェクト ├─ 今作っているもの └─ OSS と世界
  11. 11. 11 Java と Perl
  12. 12. 新卒社会人時代とPerl - アプリケーション開発は Java - 主機能は CRUD 操作なウェブアプリ - クラス・インスタンスの概念 - 運用スクリプトは Perl - CSV / Excel データのパース - RDBからの取得、インポート 12
  13. 13. 13 開発と運用で言語が違うと... List<Employee> results = manager.from(Employee.class) .where( new ComplexWhere() .eq("name", name) .and( new SimpleWhere() .eq("age", age) )      ) .getResultList(); my $sth = $dbh->prepare(<< "EOS" SELECT * FROM employee WHERE name = ? AND age = ? EOS ); $sth->execute($name, $age); for my $result (@{$sth->fetchall_arrayref(+{})}) { ... - アプリケーション開発 - Java - S2JDBC (O/R Mapper) - 流れるような I/F
  14. 14. 14 開発と運用で言語が違うと... List<Employee> results = manager.from(Employee.class) .where( new ComplexWhere() .eq("name", name) .and( new SimpleWhere() .eq("age", age) )      ) .getResultList(); my $sth = $dbh->prepare(<< "EOS" SELECT * FROM employee WHERE name = ? AND age = ? EOS ); $sth->execute($name, $age); for my $result (@{$sth->fetchall_arrayref(+{})}) { ... - 運用スクリプト - Perl - DBI - SQL
  15. 15. 15 書き味が全く異なる List<Employee> results = manager.from(Employee.class) .where( new ComplexWhere() .eq("name", name) .and( new SimpleWhere() .eq("age", age) )      ) .getResultList(); my $sth = $dbh->prepare(<< "EOS" SELECT * FROM employee WHERE name = ? AND age = ? EOS ); $sth->execute($name, $age); for my $result (@{$sth->fetchall_arrayref(+{})}) { ...
  16. 16. 高いスイッチングコスト - 運用作業の発生頻度が絶妙 - DBI の API に慣れなかった - SQLが覚えられない 16 アプリ開発と同じインターフェース で運用スクリプトも書きたい
  17. 17. 17 流れるようなインターフェース? List<Employee> results = manager.from(Employee.class) .where( new ComplexWhere() .eq("name", name) .and( new SimpleWhere() .eq("age", age) )      ) .getResultList(); - メソッドチェーン - メソッドの戻り値(インスタンス) を繋ぐ - インスタンス = クラスの実体 - Perlでもクラスを表現すれば
  18. 18. 18 public class Employee { public String name; public Integer age; public Employee() { this.name = "名前"; this.age = 0; } public String hello() { return "こんにちは " + this.name ; } } クラスとモジュール package Employee; sub new { my $pkg = shift; my $self = { name => "名前", age => 0 }; return bless $self, $pkg; } sub hello { my $self = shift; return "こんにちは" . $self->{name}; } 1; - moduleでクラスを表現 - コンストラクタ - インスタンスメソッド
  19. 19. 19 インスタンスの使い勝手 Employee employee = new Employee(); employee.name = "太郎"; employee.age = 25; employee.hello(); // こんにちは太郎 my $employee = Employee->new(); $employee->{name} = "太郎"; $employee->{age} = 25; $employee->hello(); // こんにちは太郎 Javaのライブラリの構造を真似れば 同じようなI/Fをもつライブラリを作れる
  20. 20. 20 同じような I/F のPerlモジュールを作成 List<Employee> results = manager.from(Employee.class) .where( new ComplexWhere() .eq("name", name) .and( new SimpleWhere() .eq("age", age) )      ) .getResultList(); my $results = $manager->from(Employee) ->where( Pdbc::Where->new( "name", name, EQUAL) ->and( Pdbc::Where->new( "age", age, EQUAL) ) ) ->list;
  21. 21. “ 21 作ったライブラリを使いたい
  22. 22. 会社 <- GitHub -> 自宅 - 家でコード書いて仕事で楽したい - 正式に会社で使いたい - 当時知った Git と GitHub => GitHubに公開 github.com/duck8823/pdbc-gen (archived) github.com/duck8823/pdbc-manager 22
  23. 23. モジュールの配布 - GitHub リポジトリからインストール - GitHub は tarball をダウンロードできる - cpanm は tarball からインストールできる 23 > cpanm https://github.com/<owner>/<repo>/tarball/<ref> 個人的に配布するだけなら十分
  24. 24. 24 CPAN::Author
  25. 25. CPAN::Author になった - CPAN::Author になりたくて作った なにか称号が欲しかった(3年目) - github.com/duck8823/Slack-RTM-Bot - Slack の RTM ( Real Time Messaging ) API を利用した Bot を作るためのライブラリ 25 > cpanm Slack::RTM::Bot
  26. 26. Slack::RTM::Bot 26 use Slack::RTM::Bot; my $bot = Slack::RTM::Bot->new( token => '<API token>'); $bot->on({ channel => 'general', text => qr/.*/ }, sub { my ($response) = @_; print $response->{text}."n"; }); $bot->start_RTM; sleep 300; $bot->stop_RTM;
  27. 27. Slack::RTM::Bot 27 use Slack::RTM::Bot; my $bot = Slack::RTM::Bot->new( token => '<API token>'); $bot->on({ channel => 'general', text => qr/.*/ }, sub { my ($response) = @_; print $response->{text}."n"; }); $bot->start_RTM; sleep 300; $bot->stop_RTM; - インスタンスの生成
  28. 28. Slack::RTM::Bot 28 use Slack::RTM::Bot; my $bot = Slack::RTM::Bot->new( token => '<API token>'); $bot->on({ channel => 'general', text => qr/.*/ }, sub { my ($response) = @_; print $response->{text}."n"; }); $bot->start_RTM; sleep 300; $bot->stop_RTM; - 条件とアクションを追加
  29. 29. Slack::RTM::Bot 29 use Slack::RTM::Bot; my $bot = Slack::RTM::Bot->new( token => '<API token>'); $bot->on({ channel => 'general', text => qr/.*/ }, sub { my ($response) = @_; print $response->{text}."n"; }); $bot->start_RTM; sleep 300; $bot->stop_RTM; - 条件 - 正規表現が利用可能
  30. 30. Slack::RTM::Bot 30 use Slack::RTM::Bot; my $bot = Slack::RTM::Bot->new( token => '<API token>'); $bot->on({ channel => 'general', text => qr/.*/ }, sub { my ($response) = @_; print $response->{text}."n"; }); $bot->start_RTM; sleep 300; $bot->stop_RTM; - 実行する関数
  31. 31. Slack::RTM::Bot 31 use Slack::RTM::Bot; my $bot = Slack::RTM::Bot->new( token => '<API token>'); $bot->on({ channel => 'general', text => qr/.*/ }, sub { my ($response) = @_; print $response->{text}."n"; }); $bot->start_RTM; sleep 300; $bot->stop_RTM; - RTMの開始と終了
  32. 32. CPANに公開して... 32 - ソースコードのリポジトリに反応 - 初めてのStar - 初めてのIssue - 初めてのPull Request 開発モチベーションの向上
  33. 33. 英語でのやりとり - 異なる言語圏 - 言葉以外の情報が重要 サンプルコード / 実行環境 / ログ 33
  34. 34. Issue / Pull Request の内容 - README / ドキュメント修正 - バグ - Deprecated / New な API - 知らなかった構文 34 スキル・知識の向上
  35. 35. “ 35 共有するためにGitHubに置いた CPANに公開することで露出が増え それによりフィードバックも増加 スキル・知識の向上に繋がった
  36. 36. 36 Agenda ( 私とOSS活動とPerl ) ├─ 0. 学生時代 │ └─ 生命科学 と Perl ├─ 1. 新卒時代 │ ├─ Java と Perl │ └─ CPAN::Author ├─ 2. 転職活動 │ ├─ Perl と 技術カンファレンス │ └─ 転職活動 と OSS └─ 3. OSS と 個人プロジェクト ├─ 今作っているもの └─ OSS と世界
  37. 37. 37 転職のきっかけ
  38. 38. Perlと技術カンファレンス - YAPC::Asia 2015 個人スポンサー - 初めての勉強会・カンファレンス - 登壇者・参加者が楽しそうだった 38 勉強会に参加したい
  39. 39. 勉強会は圧倒的に東京が多い 39
  40. 40. 勉強会は圧倒的に東京が多い 40
  41. 41. 勉強会は圧倒的に東京が多い 41 - 東京の会社に転職するきっかけ - 転職後の勉強会で... - Slack::RTM::Botを使ってくださってる方に遭遇
  42. 42. 42 転職とOSS
  43. 43. 転職活動とOSS - GitHub のアカウントを掲載 - 前職の内定後... - 最終判断は公開していたコード => コードを評価してもらえた瞬間 43
  44. 44. より身近になったOSS - 転職先は積極的にOSSを活用していた - 必要であれば業務時間でも - 外部のツールへコントリビュート - ドキュメント・typo修正 - オプションの追加 44
  45. 45. 45 Agenda ( 私とOSS活動とPerl ) ├─ 0. 学生時代 │ └─ 生命科学 と Perl ├─ 1. 新卒時代 │ ├─ Java と Perl │ └─ CPAN::Author ├─ 2. 転職活動 │ ├─ Perl と 技術カンファレンス │ └─ 転職 と OSS └─ 3. OSS と 個人プロジェクト ├─ 今作っているもの └─ OSS と世界
  46. 46. 46 今作っているもの
  47. 47. Slack::RTM::Bot の更新頻度 - github.com/duck8823/Slack-RTM-Bot - Issue/Pull Request ベース - RTM APIはあまり使わなかった - Webhooks を使うことがほとんど 47 自分で利用しないと更新頻度が低下
  48. 48. 今作っているもの - github.com/duck8823/duci - 個人リポジトリ - Golang製 の CI サーバー - 2018/04/01~ 継続的に開発 - JetBrains Open Source license 48
  49. 49. 使いたいものを作る - CI の定義が煩わしい - 学習コストがかかる - ローカルとCIでの挙動の違い 49 特別な設定ファイルを必要としない シンプルなCIサーバーを作ろう
  50. 50. github.com/duck8823/duci - タスクランナー で タスク を定義しよう - Makefile / build.gradle etc. - 必要なインフラは Dockerfile で定義しよう - ENTRYPOINT / CMD でタスクを実行 - コンテナをビルドして実行するだけ 50
  51. 51. 実際に使う - CI を作るのにCIを使う => bug / feature etc. 51
  52. 52. 思いをREADMEに書く 52 Starをもらったときの嬉しさUP
  53. 53. 53 OSS と 世界
  54. 54. “ 54 世界はOSS開発者に優しい
  55. 55. JetBrains Open Source license - JetBrains All Products Pack が利用可能 - IDEA などのツール - $249.00 / 1st year => 無料 - 対象: Open Source プロジェクト - 3ヶ月以上継続的に活動している - コミッター / メインコントリビューター - 個人プロジェクトでも可能 55
  56. 56. IDEA Perl Plugin - github.com/Camelcade/Perl5-IDEA 56
  57. 57. OSSは優遇される - GitHub - 無料枠は private repoに制限あり - Travis CI / CircleCI - OSS は無料 - Coveralls(カバレッジの記録 ) - OSS は無料 - その他静的解析サービスなど 57
  58. 58. 58 まとめ
  59. 59. まとめ - OSSは様々な場所で利用されている - 例. 生命科学分野での研究 - OSSがなければ開発できない - ソースを公開することで様々なきっかけ - スキル向上 / 転職 / 勉強会 etc. - CPAN に公開するとフィードバック増えた - 世界はOSS開発者に優しい 59
  60. 60. “ 60 OSSを身近に感じてみよう

×