Mobile Factory Tech Blog

技術好きな方へ!モバイルファクトリーのエンジニアたちが楽しい技術話をお届けします!

YAPC::Tokyo 2019 でスタッフをやった5人に感想を聞いてみた

こんにちは。id:kfly8です。

先日、YAPC::Tokyo 2019というカンファレンスが開催され、総勢37名のスタッフで運営されていました。その運営にモバファクのメンバーが私含め5人スタッフ参加させてもらったので、その感想をお伝えしていきたいと思います。

早速ですが、インタビューをしていきます!*1

f:id:kfly8:20190213160719j:plain:w1000

Q. 普段はどんなお仕事をしていますか?

numa_yk : 広報とIRをやっています。

N : 採用チームにいます。

xiang_ping : ブロックチェーン関連のチームで、新規サービスのプロジェクトリーダーをやっています。エンジニアではないので、主に企画とディレクションがメインです。

odan3240 : ブロックチェーンチームでエンジニアとして働いています。お仕事は、DApps開発キットのUniqys Kitの開発や、新規サービスの開発をやっています。

kfly8 : 採用、育成、広報、組織開発など事業を横断するようなことをやらせてもらっています。が、最近はずっとYAPCのお仕事をしていました:D

f:id:kfly8:20190213161556j:plain:w1000

Q. どうしてスタッフ参加してみようと思ったのですか?

numa_yk : YAPCは昔から社内のエンジニアたちがたくさん参加しているイベントで、モバファクのエンジニアがどんなところでわくわくしているのか見てみたく参加しました。会社で提供しているサービスはエンジニアなしでは作れないので、どんな活動をしているのか興味がありました。

N : こばけんさんに誘われて。(※こばけんは、kfly8の呼称です)

xiang_ping : 社内で参加する方にお誘いいただきました。エンジニアイベントなのでこれまで参加を検討したことはなかったのですが、非エンジニアの立場で参加することで得られる体験もあると思い、今回の参加を決めました。

odan3240 : 会社がPerlを主に使用していることもあって、YAPCに興味があったことが大きいです。また、ACM-ICPCという競技プログラミングの大会のアジア地区予選のボランティアをやった経験があり、技術カンファレンスのボランティア自体にも興味がありました。

kfly8 : Perlが好きだから。Perlコミュニティが好きだから。

f:id:kfly8:20190213161105j:plain:w400

Q. スタッフとしてどんなお仕事をしましたか?

numa_yk : 受付をやっていました

N : 当日は受付や弁当、荷物の配送関連をしていました。バックパネルなど発注も行いました!

odan3240 : ホールのスタッフをしていました

xiang_ping : 受付中心に動いていました。

kfly8 : 運営委員長でした。当日は会場をふらふらしてイレギュラーなことがあったら対処をしていました。それまでは、主にスポンサー様、イベント会社の方、会場の方とのやりとりを行なっていました。

f:id:kfly8:20190213161026j:plain:w1000

Q. 参加して良かったことを教えてください!

numa_yk : 活気があって楽しかった!(雑)

numa_yk : 非エンジニアからすると一見入りにくい感じかと思いきや、一緒にわいわいすると職種関係なく一つのもの作れますね。

N : いろんな企業のいろんな職種の人と話す機会はそうそうないので、雑ですが楽しかったです。

xiang_ping : 普段であれば繋がることがない方と交流できたことです。特に他社のエンジニアの方とお話しする機会はほぼないので、どのような仕事をしていて、今後どのようになりたいかなど興味深い話を色々と聞くことができました。

odan3240 : タダ飯

odan3240 : スタッフ間で調整すれば気になるセッションを聞くことが出来たのが嬉しかったです。AWS X-Rayを用いた分散トレーシングの話に興味があったので、実際に聞きに行きました。

kfly8 : 楽しい!って声が聞けて良かったです。過去にもスタッフをやらせてもらったことがあるのですが、今回、正直大変だったこともあり、心に沁みました。

Q. 逆に悪かったこと、改善した方がいいと思ったことがあれば教えてください!

xiang_ping : 前日の準備が大変ですね、、Tシャツの準備やノベルティ詰めなどもっと効率的にやれたらいいなと思いました。ただ、作業中に色々とお話しできるのはよかったです。また受付に関して、一部QRコードによる自動化がありましたが、Tシャツの配布や企業スポンサー対応などアナログな部分もあったので、その辺りをもっと効率化できればいいかと思いました。

odan3240 : 朝が弱いタイプなので集合時間が早めだったのがつらかった...

kfly8 : 個人的な話ですが、トークがほぼ見れなかったので動画にしっかり残したい..!

f:id:kfly8:20190213161740j:plain:w400

Q. 参加してみてわかったこと、気づきがあれば教えてください!

N : 交流って大事ですね。最後の懇親会などはとっても楽しかったです!

xiang_ping : エンジニアでなくても、その場での出会いや、やりきった後の達成感が得られるので、参加したことのない人に勧めたいです!

odan3240 : 参加する前は技術カンファレンスにスタッフは難しいというイメージがあったため、ボランティア応募することに抵抗がありました。しかし実際参加してみると難しいことはなく、カンファレンスに携わることが出来ました。

kfly8 : YAPCのやり方もひとつじゃない!って記事を書きました!

f:id:kfly8:20190213160802j:plain:w400

Q. 感想をひとこと!

numa_yk : たのしかった!

N : 京都行きましょう!w

xiang_ping : また関東近辺で開催することがあれば参加したいと思います!

odan3240 : YAPC Kyoto楽しみ!

kfly8 : 楽しかった!

あとがき

よくよく考えてみると不思議ですよね。

YAPCというとがっつりエンジニア向けのイベントです。トークは全部技術トークです。 今回、スタッフ参加した5人のうち3人は非エンジニアです。非エンジニアが興味を持って、休日に何を話しているかわからないイベントに参加し、朝から晩まで楽しんでいるなんて、不思議じゃないですか?*2自分の立場は、運営委員長であったり、弊社の人間であったりして、客観的ではないかもしれないですが、素敵なことだなーと思います。

技術コミュニティにスタッフとして参加することは、もしかしたら敷居のあることに見えるかもしれませんが、 今回のインタビューを通して、改めて「気にしないで!楽しめるよ!」ってことを声を大にして言えるなーと思いました。

f:id:kfly8:20190213162824j:plain:w1000

*1:自分で自分にインタビューするのは変ですが気にしません

*2:もちろんエンジニアがスタッフ参加しても楽しめました:D

Pythonでシェルコマンドを実行する

この記事はモバイルファクトリー Advent Calendar 2018の24日目の記事です。


はじめに

メリークリスマス! エンジニアのid:Carimaticsです。

突然ですが、シェルスクリプトは便利な言語ですね。
Unix系OSであればほぼ標準で利用でき、シェルスクリプトにより移植性の高いコードを記述することができます。
また、シェルコマンド自体も強力なものが数多く用意されており、処理を簡潔に表現することも可能です。

一方で、シェルスクリプトは普段から慣れ親しんでいなければ読み書きが難しい言語でもあります。1
というのも、最近久しぶりにシェルスクリプトを書いたのですが、書き方に迷う場面が多々あったのです。
めったに使わない構文であれば仕方ないとも思えるのですが、if文やfor文を書こうとするたびに手が迷ってしまい、大変もどかしい思いをしました。
また、シェルスクリプトの規模が大きくなると、保守性も困難になりがちです。

ということで、Pythonをbetter shell scriptとして利用できると楽そうだと考えました。
Pythonであれば比較的読み書きしやすい構文で書くことができます。
他にもRubyやPerlなどがある中でどうしてPythonなのかと言うと、これは趣味です。

シェルコマンドを軽くラップできれば漸進的にスクリプトを改善していけると考えたため、本記事ではとりあえずシェルコマンドを簡単に叩けるようになるまでを目標にしました。

動作確認環境

  • Python 3.7.1

方針

  • Pythonの標準ライブラリに含まれるもののみを利用する
  • ひとまず3.x系のみ対応する

Pythonでシェルコマンドを実行する

簡単な方法

シェルコマンドを実行すること自体は簡単で、 subprocess モジュールを利用することでシェルコマンドを子プロセスとして実行できます。
subprocess モジュールでは、サブプロセスの実行は run() 関数を利用するのが推奨されています。

import subprocess

subprocess.run('ls')

注意点として、 run() で引数に文字列を渡す場合、引数なしで実行されるプログラムでなければなりません。
例えば、以下のように、コマンド引数をしているとエラーになります。

import subprocess

subprocess.run('ls tmp')

実行すると以下のエラーが出ます。

FileNotFoundError: [Errno 2] No such file or directory: 'ls tmp': 'ls tmp'

ls tmp というプログラムを実行しようとして失敗しています。

シェルコマンドに引数を渡す場合には、 run() にトークン区切りのリストを渡す必要があります。

import subprocess

subprocess.run(['ls', 'tmp'])

これで ls tmp を実行することができます。 このような場合、 shlex モジュールを用いて、コマンド文字列をリスト化できます。

import shlex
import subprocess

cmd = 'ls tmp'
tokens = shlex.split(cmd) # => ['ls', 'tmp']
subprocess.run(tokens)

トークン区切りにする以外には、 run() に対して shell=True を渡すことで、シェルコマンド文字列をそのまま実行することができます。

import subprocess

subprocess.run('ls tmp', shell=True)

しかし、この場合はシェルを実際に呼び出すことになるため、シェルインジェクションが発生する可能性があるので注意が必要です。
例えば、以下のような攻撃が発生し得ます。

import subprocess

def ls(dir):
    cmd = f"ls {dir}".
    subprocess.run(cmd, shell=True)

ls('; rm -fr tmp')

これは、シェルで ls ; rm -fr tmp を実行することになり、tmpファイルを削除されてしまいます。 shell=True を利用する場合は、外部からの入力には十分に注意しましょう。

パイプを利用する

shell=True する方法

shell=True することで、パイプを利用することは可能です。 ただし、前述の通りシェルインジェクションが発生する可能性があるため、利用には十分ご注意ください。

import subprocess

def ls(dir, filter):
    cmd = f"ls {dir} | grep {filter}"
    subprocess.run(cmd, shell=True)

ls('tmp', '.md')

shell=True しない方法

そこで、 shell=True を利用せずにパイプを利用するには、 subporcess.Popen を利用します。
上記と同等の結果を得るには、以下の用に書きます。

import subprocess
import shlex

def ls(dir, filter):
    cmd_ls = f"ls {dir}"
    cmd_grep = f"grep {filter}"
    p1 = subprocess.Popen(shlex.split(cmd_ls), stdout=subprocess.PIPE)
    subprocess.Popen(shlex.split(cmd_grep), stdin=p1.stdout)
    p1.stdout.close()

ls('tmp', '.md')

かなり冗長になってしまいました。
Popen を利用する場合は、使いやすくスクリプトを整えてあげるか、セキュリティリスクを考慮した上で shell=True の利用を検討しても良いかも知れません。

まとめ

かなり駆け足になってしまいましたが、Pythonでシェルコマンドを利用する方法について簡単に紹介しました。
subprocess を利用する以外にも、 shutilospathlibglob などのモジュールを組み合わせることで、よりbetter shell scriptらしい可読性の高いコードが書けるようになりそうです。

最後までお読みいただきありがとうございました。
それでは良いお年を!


  1. もちろんシェルスクリプトに限った話ではありませんが、その傾向が強い言語だと思っています。