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

私とOSS活動とPerl