派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

【イベントレポート】マンガで学ぶ、Gitの使い方超入門ハンズオン

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2019年4月5日のイベントでは「マンガで学ぶ、Gitの使い方超入門ハンズオン」を開催。プログラム開発者からWeb制作者まで、幅広い層に使われているバージョン管理ツール「Git(ギット)」。まだ使ったことがない人のために、基礎の基礎から教えてくださいました。書籍『わかばちゃんと学ぶ Git使い方入門』のマンガのエピソードを交えながら解説してくださる上、自分のノートPCを持ち込んで実際に操作するハンズオン形式だったので、とても楽しく分かりやすいイベントでした。

■今回のイベントのポイント
・Gitってなに?どう便利なの?
・リポジトリとは
・ステージングとコミットの概念
・ブランチの概念
・GitHub上のリポジトリにプッシュとプルができるようになろう
 
【講師】湊川 あいさん

【講師】湊川 あいさん
フリーランスのWebデザイナー・漫画家・イラストレーター。マンガと図解で、技術をわかりやすく伝えることが好き。著書『わかばちゃんと学ぶ Webサイト制作の基本』『わかばちゃんと学ぶ Git使い方入門』『わかばちゃんと学ぶ Googleアナリティクス』が全国の書店にて発売中のほか、動画学習サービスSchooにてGit入門授業の講師も担当。「マンガでわかるGit」「マンガでわかるDocker」「マンガでわかるUnity」といった分野横断的なコンテンツを展開している。
Twitterアカウント: https://twitter.com/llminatoll
 
f:id:itstaffing:20190528101926j:plain

Gitってなに?どう便利なの?

Gitというと「難しそう」とか「エンジニアが使うもの」という印象があるかもしれません。そもそもメリットがわからないと学ぶ気になれないものです。書籍『わかばちゃんと学ぶ Git使い方入門』の主人公であるわかばちゃんが、マンガでGitのメリットを紹介してくれました。

大学に通うわかばちゃんは、Webのゼミを選択しており、誰もいないゼミの教室で、勉強を兼ねて個人サイトを制作しています。しかし、CSSをちょっと編集しようとしたら、デザインが壊れてしまいました。元に戻したいと思い、修正を加える前のファイルを探すのですが、過去に保存したファイル名の付け方がいい加減で、見つからず、思わず「どれだよ」と叫びます。

Web制作、プログラム開発だけでなく、ワープロや表計算ソフトで文書を作成する際もよく見かける「あるある」です。わかばちゃんの気持ちがよく分かります。

Gitは、プログラムのソースコードやドキュメントのバージョンを管理するためのツールです。例えるならば、ロールプレイングゲームで、ボスキャラを倒す前にセーブしておくイメージです。ボスに負けてゲームオーバーになっても、ボス戦前に戻ることができるアレです。つまり、間違ったコードを書き込んでしまい、プログラムが動かなくなったとしても、正常に動いていた頃の状態をいつでも復元できるというわけです。

Gitのメリット

Gitには、さらに大きなメリットがあります。複数名で開発や制作を行う現場では、誰が・いつ・どこで・何のために・どう修正したかという記録が煩雑になります。Gitは、それを一元的に取りまとめることができます。

企業やプロジェクトでGitを複数名で利用する際、よく使われているのがGit Hub(ギットハブ)というサービスです。GitHubは、簡単に言うとソースコードの保管場所です。とはいえ単なるソースコード置き場ではなく、メンバー間のコミュニケーションの場として機能するのが特徴です。たとえば、修正した箇所をプルリクエストという形で提案したり、掲示板のような見た目でお互いのソースコードにレビューしあったりすることができます。

リポジトリとは?

ここからは、実際にGitを動かしながら、使い方を学んでいきました。

まずはリポジトリについてです。Gitにおけるリポジトリは、コードの過去の状態が記録されている貯蔵庫のようなもの。

はじめに、あらかじめイベント開始前に自分のPCにダウンロード&インストールしておいたGUIツール「SourceTree」を起動します。SourceTreeは、もともとコマンドラインツールのGitをGUI環境で手軽に使うためのものです。まずはリポジトリを新規作成します。

f:id:itstaffing:20190528101929j:plain
▲作業用フォルダ「R-TEST」を作成しておき、SourceTreeの「Create」ボタンをクリックし、先ほどのフォルダ「R-TEST」を指定してローカルリポジトリを作成する

ローカルリポジトリ「R-TEST」が作られます。これをダブルクリックして開いてみると、まだ何もありません。そこでフォルダR-TESTの中にテキストファイルを作成します。

リポジトリにファイルの更新履歴を記録していきます。リポジトリへの記録手順について理解するために、またわかばちゃんが登場します。

マンガでは、みんなでお好み焼きを作るのですが、その手順の要所要所で写真に記録を残していきます。粉と水と卵を混ぜたところを撮影台に乗せて撮影し、キャベツを千切りにしたものを混ぜて、また撮影台に乗せて撮影し……と。「料理ブログにでも載せるのかな?」と不思議に思うわかばちゃん。ところが、最後に、ゼミの教授がそこにコーラを混ぜてしまい残念な結果になってしまいます。

「はぁ、キャベツを混ぜたところに戻れれば……」

そんな声に応えてくれるのがGitです。Gitは、撮影した時点にいつでも戻せる魔法のカメラのようなものなのです。

f:id:itstaffing:20190528101932j:plain
▲変更作業をする、ステージングエリアに乗せる(撮影台に乗せる)、コミットする(撮影する)という手順を踏むことでリポジトリに変更が記録され、後からその時点の内容に戻すことができる

早速、先ほどR-TESTフォルダ内に作成したテキストファイルを、ステージングエリアに乗せてみましょう。

f:id:itstaffing:20190528101934j:plain
▲画面下の[ログ]タブをクリックして画面を切り替え、作業ツリーのファイル一覧から、目的のファイルを選び、[選択をインデックスに追加]ボタンをクリックする

次にステージングエリアに乗せたファイルを選び、コミットします。

f:id:itstaffing:20190528101938j:plain
▲[ファイルステータス]タブに戻し、ステージしたファイル一覧から目的のファイルを選び、[コミット]ボタンをクリックする

これで、初めてのコミットが記録されました。以降、同様にファイルに変更を加え、ステージングして、コミットすると、そのたびに更新履歴が記録されていきます。

f:id:itstaffing:20190528101940j:plain
▲masterブランチにソースが登録された。以後、コミットするたびに履歴が保存されていく

コミットを繰り返すうちに、以前の状態に戻したくなったら、SourceTreeの履歴一覧から目的のものをダブルクリックします。これでファイルの内容がその時点のものに戻ります。これをチェックアウトと呼びます。

f:id:itstaffing:20190528101944j:plain
▲ソースツリーから過去のものを選びダブルクリックすることで、その時点での内容に戻せる(ソースファイルの内容が戻っている)

もしかすると、ステージングエリアに乗せる作業が二度手間なように思った方もいるかもしれませんね。なぜステージングエリアは必要なのでしょうか?

それは、開発の中で、一度にいくつもの更新ファイルがあったとき、コミットを分けて行いたいというケースがあるからです。たとえば、CSSとJavaScriptを同時に編集し、まとめてコミットしてしまったとしましょう。コミットした時点では特に問題がないように思えますが、後々CSSだけを元に戻したくなった場合、JavaScriptまで一緒に過去の状態に巻き戻ってしまうと不都合です。そういうわけで、コミットの粒度を人間が選ぶことができるようにこのステージングエリアという仕組みがあるのです。

ブランチの概念

Gitには、ブランチという概念があります。これはいわば並行世界、つまり“同時並行で進む世界”と考えることができます。ここでは湊川さんのサイトにある「絵文字でわかるGit」をベースに解説が進みます。

▼絵文字でわかるGit
https://webdesign-manga.com/emojigit/

たとえば、お寿司を作ることを考えます。お寿司はシャリとネタからできていますが、これらを用意する過程をkomeブランチとsakanaブランチに分けるとします。

komeブランチでは、苗を植え→稲を育て→米を収穫するというように作業を進め、sakanaブランチのほうも、稚魚→魚→マグロと作業を進めていき、米とマグロを最終的にマージしてお寿司にします。

f:id:itstaffing:20190528101947j:plain
▲komeブランチとsakanaブランチで同時並行作業を進め、最終的に両者をマージしてお寿司が完成する(湊川さんのサイト「絵文字でわかるGit」より)

ソフトウェア開発のシーンでも、機能ごとに分け、同時並行で開発したり、本番用と新規機能用の開発を並行して進めることがあります。そういったときに役立つのがブランチです。それぞれのブランチで作業を進め、結果をマージ(合体)させます。

同時並行で開発を進めていくと、同じ行に異なる修正が入ることがあります。たとえばAさんとBさんが同じファイルの3行目をそれぞれ別の内容に書き換えていた、といった場合です。その状態でマージしようとすると、Gitが「コンフリクト(衝突)しているよ」と教えてくれます。AさんとBさん、どちらの修正を採用するかは、マージする人が適宜判断します。

GitHub上のリポジトリにプッシュとプルができるようになろう

後半では、複数メンバーでの開発について学びました。Git Hubにログインし、湊川さんが用意した練習用リポジトリ(すでにHTMLファイルが用意されているもの)を、自分のGit Hubアカウントにフォーク(分岐)させて、そのGit Hubのリモートリポジトリのクローンを自分のPCに作成(コピー)し、ローカルリポジトリを作成します。

そして、ローカルリポジトリ上でHTMLファイルに自己紹介を追加し、Git Hub上のリモートリポジトリにプッシュし、自身の変更を湊川さんのソースにマージしてもらうためプルリクエストを送ります。プルリクエストとは「こういう変更を加えたからあなたのリポジトリに反映して欲しい」という連絡です。これを見て、湊川さんはリクエストのあったソースコードを自分のGit Hubリポジトリに取り込みます。

f:id:itstaffing:20190528101950j:plain
▲SourceTreeでコミットしてプッシュした後、Git Hubの画面でプルリクエストを送る

会場では、イベント参加者から寄せられるプルリクエストに応じて、湊川さんが、それぞれの変更をマージして取り込み、GitHub Pages上でひとつのWebページを完成させました。

Gitは、もともとコマンドラインで使うツールとのことですが、今回はSourceTreeというGUIツールを使ったので、クリックするだけの直観的な操作で行うことができました。また、湊川さんの書籍『わかばちゃんと学ぶ Git使い方入門』のマンガを見ながら学ぶことで、概念を理解しやすく、苦手意識を持つことなく、参加者の皆さんもGitに親しむことができました。

【イベントレポート】イマドキなシステム開発には、見積りの知識を身につけよう

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2019年3月22日のイベントでは「『イマドキ』ソフトウェア 開発プロジェクトを見積りを通して知る ~システム開発のための見積りのすべてがわかる本より~」と題して、書籍『システム開発のための見積りのすべてがわかる本』の著者である佐藤大輔さん、渡邉一夫さん、畑中貴之さんの3名を講師としてお迎えし、開発プロジェクトの見積りについて、さまざまな視点からレクチャーしていただきました。

■今回のイベントのポイント
・プロジェクトとお金の流れを知る
・「イマドキ」のITプロジェクトでは、アジャイルやチケット駆動もあたりまえ?
・事例研究:クラウド時代の現場では何が起きているのか

【講師プロフィール】
佐藤 大輔さん
大手SIerでプログラマ、SEを経験し、2003年にSI事業と自社サービスを行う企業「株式会社オープントーン」を創業。現在、同社代表取締役社長。
渡邉 一夫さん
Java ServeletなどサーバサイドJavaの登場初期からJavaに精通し、数々のエンタープライズシステムの開発を手掛けてきた実績を持つエンジニア。
畑中 貴之さん
エンジニア、個人事業主として数々のビッグプロジェクトをマネジメントしてきた経験を持ち、現在はオープントーンにて取締役兼観光ビッグデータ事業部長を務める。

そもそも見積りって?プロジェクトとお金の流れを知り仕事の組み立てに生かそう!

まずは佐藤さんが、見積りの基本的な考え方を紹介してくれました。

「見積り」というと、これからかかる費用の明細が書かれた見積書をイメージしてしまうのですが、佐藤さんによれば、見積りとは、予算、納期、品質などの要素を、あらかじめ明らかにしておくことであり、それは「いわばプロジェクト計画そのもの」だということです。

f:id:itstaffing:20190521123046j:plain
▲予算、納期、品質を明らかにする「見積り」とはプロジェクト計画そのもの

たとえば日常よくある「この作業、いつまでに終わりますか?」という問いに「今週中には終わります」と答えたとします。その根拠を計算することも立派な見積りの一つです。

これは、残りの工数を確認して、開発~テストの期間を計算して何人日必要、と算出します。つまり見積り作業自体は、エンジニアが日々やっていることなのです。ただし、プロジェクトが大規模になると、この作業がビジネスに組み込まれていきます。

ここで、見積りのやり方を学びます。見積りの手法にはいくつか種類がありますが、わかりやすい積み上げ法で説明してくれました。

積み上げ法(積算法)は、名前の通り作業をひたすら積み上げていく手法だそうです。「24時間365日動かしたい」「5000人同時ログインに耐える処理能力」などといったユーザーの要望を聞き、エンジニアは何が必要かを考えていきます。

f:id:itstaffing:20190521123048j:plain
▲1つの画面に紐づく機能を積み上げ、人日計算を行い集計していく

こうした作業でわかるように、見積りは概要設計をすることと同じです。すなわち設計を進めないと見積りはできません。

そのため、場合によっては見積りに、機能一覧、スケジュール、アクティビティ図、アーキテクチャ構成図、プロジェクト体制図(開発とユーザーの責任範囲等)が伴うこともあるそうです。

また、ここで紹介された積み上げ法以外にも、FP(ファンクションポイント)法、OP(オブジェクトポイント)法など、さまざまな見積り作成の手法があります。

見積りは、あくまでも予測に過ぎません。「やってみたら5日で終わらなかった」というのはよくある話。計画通りに進まなかったときに、それを次回の見積りのためにフィードバックしていくことが、現場において大事なことです。

「イマドキ」のITプロジェクトでは、アジャイルやチケット駆動もあたりまえ?

講師を渡邉さんにバトンタッチして、今度はアジャイル開発やチケット駆動開発についてのお話です。

先ほどの見積りのところでも触れられていたように、システム開発は不確実性との闘いであり、見積るのは難しく、常に不確実性とつき合いながらプロジェクトを進めていく必要があります。

従来のウォーターフォール型開発では、この不確実性を設計段階で解消していました。しかし、これをアジャイル型開発では、開発を進めながら解消していきます。

f:id:itstaffing:20190521123050j:plain
▲ウォーターフォール型とアジャイル型での違い

スプリントという単位で反復しながら開発を行うスクラム開発では、1スプリントごとに振り返りを行うことで、次回スプリントの不確実性を解消していくことができます。たとえば、今回のスプリントでは、チケットを消化できなかったとします。その原因を分析し、早々に修正をかけることで次回スプリントでは同じ過ちを回避するということができるとのこと。

また、チケット駆動開発においてGitのgit-flowやGitHub Flowなどの機能によるブランチモデルを利用して、開発フローの意思統一を図るというアイデアも紹介してくれました。

f:id:itstaffing:20190521123053j:plain
▲git-flowをチケット駆動型開発に利用することで、意思統一を図ることもできる

クラウド時代の現場では何が起きているのか

そして最後は畑中さんによる事例紹介です。

紹介されたのは観光ビッグデータを活用した情報提供サービスを構築するというプロジェクト。宿泊統計というビッグデータの分析基盤を構築し、そこから需要予測ロジックにより導き出される予測値を提供する「観光予報プラットフォーム」だそうです。

まずは、システム全体の概要図を作成します。

f:id:itstaffing:20190521123056j:plain
▲システム概要図を作り、システム構成を考える

システム構成が見えてきたら、ソフトウェア開発規模を見積ります。

f:id:itstaffing:20190521123059j:plain
▲このとき、見積りしやすい部分と、ブレやすい部分を分けて考えるのがポイント

ソフトウェア開発規模を見積る際は、見積りしやすいもの、見積りがブレやすいものに分けるのがポイントです。事例では、見積りしやすいものとして、データ登録・整形、プログラム(バッチ)、情報発信APIシステム(API)などを挙げ、ブレやすいものとしてデータ提供システム(Webシステム)の部分を挙げています。

そして、システムではクラウド環境を利用するため、インフラのコストも見積ります。事例ではAWSを利用していました。

f:id:itstaffing:20190521123103j:plain
▲AWSを利用する場合は、Amazonの簡易見積りツールを利用するのが便利とのこと

ソフトウェア開発規模とインフラの見積り、そしてプロジェクトに関わる作業を洗い出したら、概算見積表を作成します。

f:id:itstaffing:20190521123106j:plain
▲プロジェクトに関わる作業には、コンサルティング費用、インフラの構築や運用設計、脆弱性診断、プロジェクトマネジメントなどの費用が含まれる

工数見積りにはRedmineを使ったそうです。理由としては、スクラム開発でチケット駆動開発を行うのにRedmine Backlogプラグインが使えるからだといいます。

実際のスクラム開発での流れは2週間で1スプリントを想定。しかし、最初はどれぐらいかかるかわからないので、「簡易登録機能だからこれぐらいか?」とか「僕は3日欲しい」などの意見を開発チームから聞き出し、1つ目のスプリントのストーリーポイント(≒作業時間)の見積りを作成します。

f:id:itstaffing:20190521123109j:plain
▲開発チームの意見をもとにストーリーポイントの見積りを作成する

そしてスプリントを1回し、その結果から振り返り(KPT)を行い、これを反復することで、その後のスプリントにおける精度の向上を図ります。α版は苦戦しても、β版では余裕をもって開発が進められるようにするのがポイントです。

f:id:itstaffing:20190521123112j:plain
▲振り返りによって精度を上げ、β版では余裕をもって開発が進められるようになる

これまで「見積り」と聞くと「自分には縁がない」と思っていた方もいるかもしれません。しかしアジャイル開発が増えてきた昨今、日常業務にも深く関わってきそうです。改めて、自分のプロジェクトを確認してみるのもよいでしょう。

【イベントレポート】今注目のRPAの考え方を知り、実務に活かす

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを定期的に開催しています。

最近何かとよく聞くRPA。Robotic Process Automationの略で、ロボットによる処理の自動化を意味します。ロボットといっても、物理的な実体があるわけではなく、コンピュータの中にあるソフトウェアを使って事務作業などを自動化することを指す言葉です。

これまでも事務作業を効率化するために業務システムが開発され、プログラムによる自動化は多く行われていました。RPAも目的は同じですが、注目されている理由としてRPAツールの登場があります。

そこで、2019年3月27日のイベントでは「今注目のRPAの考え方を知り、実務に活かす!」を開催。RPAツールがこれまでの自動化とどのように違うのか、無料で使えるRPAツールでどのようなことができるのか、事例や注意点を含めて増井さんに解説いただきました。

【講師】増井 敏克さん
【講師】増井 敏克さん
増井技術士事務所代表。技術士(情報工学部門)。情報処理技術者試験にも多数合格。ビジネス数学検定1級。「ビジネス」×「数学」×「IT」を組み合わせ、コンピュータを「正しく」「効率よく」使うためのスキルアップ支援や、各種ソフトウェアの開発、データ分析などを行う。著書に『おうちで学べるセキュリティのきほん』『プログラマ脳を鍛える数学パズル』『エンジニアが生き残るためのテクノロジーの授業』『もっとプログラマ脳を鍛える数学パズル』『図解まるわかりセキュリティのしくみ』(以上、翔泳社)、『シゴトに役立つデータ分析・統計のトリセツ』『プログラミング言語図鑑』『プログラマのためのディープラーニングのしくみがわかる数学入門』(以上、ソシム)がある。
 
■今回のイベントのポイント
・RPAとこれまでの自動化との違い
・個人(無料の範囲)、現場でのRPA導入例
・RPAを導入する際の注意点

RPAとこれまでの自動化との違い

これまでの業務システムなどの場合、開発するにはプログラミングが必要で、修正したいときには開発者に依頼する必要がありました。しかし、RPAツールはプログラミングに関する知識が不要で、事務担当者が自分で修正できます。

同じように担当者が自動化する仕組みとして、これまでもExcelのマクロがありました。操作を記録して再生する程度であれば誰でも使えましたが、あくまでもExcelの中だけで、他のプログラムを操作するにはプログラミングの知識が必要でした。

同様に、Web画面を操作するには、Seleniumを使ってChromeやMozillaの操作を記録、実行する方法はテストやスクレイピングで多く使われていました。これも簡単に使えますが、Webブラウザ内の操作しかできませんでした。

RPAツールはマウスやキー操作を自動的に記録することで、定型作業を自動化でき、複数のアプリケーションを操作できます。このようなツールはデスクトップ自動化と呼ばれ、これまでも存在しました。しかし、RPAツールであればサーバーで実行することでパソコンを使っていない時間帯でも処理できる、OCRなど最新の技術を簡単に使える、豊富なパッケージで機能を拡張できる、などの特徴があります。

f:id:itstaffing:20190516134221j:plain

無料で使える自動化ツールとその特徴

RPAツールは多くの企業が製品を提供しており、有料の製品から無料のものまで様々です。有料のツールはサポートや研修なども含めて安心して使用できますが、少し試してみたいという場合には高価です。

そこで、最初は無料で使える自動化ツールを試してみるのが良いでしょう。例えば、日本語で簡単に使えるツールとしてUiPathがあり、Community Editionであれば無料で使用できます。フローチャートのような分岐が自在に実現でき、マウスの操作などを直感的に記録、実行できます。

f:id:itstaffing:20190516134202j:plain

Windowsでよく使われているツールとして、他にWorkFusion RPA Expressがあります。メモリの使用量が多く、コンピュータのスペックが要求されますが、タスクリストのようなイメージで簡単に処理を追加できます。英語のツールですが、それほど難しい単語も出てこないので、それほど苦労せずに使えると思います。

f:id:itstaffing:20190516134207j:plain

macOSの場合は、標準でインストールされているAutomatorを使う方法もあります。図のように、実行したアクションを並べるだけで様々な処理が可能なため、初心者でも簡単に自動化できます。

f:id:itstaffing:20190516134210j:plain

パソコンに限らず、スマートフォンでも自動化すると面倒な操作が不要になります。例えば、iOSであれば「ショートカット」という無償のアプリを使うと、便利なライブラリが最初から用意されているだけでなく、ウィジェットに登録すると簡単に実行できます。

f:id:itstaffing:20190516134213j:plain

現場で使われている事例

シンプルな例として、私の場合、Amazonで書籍の売上ランキングを確認する場面を考えます。手作業でWebブラウザを操作して、各書籍のページを開き、ランキングが表示されている部分までスクロールすると取得できますが、チェックする書籍の数が増えてくると面倒です。

そこで、自動的にWebブラウザを開き、対象のテキスト部分を取得、テキストファイルに保存することを考えてみます。例えば、Automatorでは上述のAutomatorの図のようにやりたいことを並べるだけで簡単に実行できます。

事務作業を効率化する目的では、Excelで受領した発注書を自社のWebフォームに転記、入力するような作業もよく見かけます。このような定型的で単純な処理はRPAツールが得意とする作業です。

f:id:itstaffing:20190516134215j:plain

最近では、AI機能が身近になっており、これらを連携すると便利に使える例があります。例えば、スマートスピーカーと連携すると、Google Homeに話しかけたものをEvernoteに登録するような連携はIFTTT(https://ifttt.com/)などを使うと簡単に実現できます。また、Evernoteには、登録されたメモ(ノート)をメールで送信する機能もありますので、そのメールを使った処理をRPAで自動化することもできます。Google Homeから直接メールを送信することもできますので、このような連携は手軽に実現できます。

また、最近はOCRの精度も向上しているため、受信したFAXをPDFとして処理し、そこに書かれている文字を取り出してフォームに入力する、といったことも実用的になってきました。

f:id:itstaffing:20190516134218j:plain

RPAを導入するときの注意点

RPAはプログラミングなどが不要なため、情報システム部門が関係しなくても簡単に導入できてしまいます。これは、「シャドーIT」のリスクがあると言えます。ファイル共有サービスなどを従業員が勝手に利用して情報が漏洩することなどを指す言葉ですが、RPAツールでも様々な問題が発生する可能性があります。例えば、管理者が行っていた作業を自動化すると、IDの使い回しが発生したり、一般社員でも管理者権限で実行できてしまったりするかもしれません。

また、作成した処理を誰がメンテナンスするか、という問題もあります。例えば、使用しているシステムに以下のような変更が発生すると、RPAツールが処理の実行に失敗します。

● フォルダ内のデータを処理している場合、フォルダを移動した、フォルダ名を変更した、といった操作が行われた
● Webサイトから何らかのデータを取得している場合、サイトがリニューアルされた
● 社内システムで、情報システム部門がシステムを改修した

このような場合、RPAの処理を作った人が異動したり退職したりすると、中身がわからなくなってしまいます。さらに、これまでのシステム開発では丁寧に設計し、全体最適となるように検討していましたが、RPAだと担当者が思いつくままに実装してしまい、個別最適になってしまう可能性があります。

何よりも問題なのが、ロボットの数が増えてくると、その管理ができないことです。動いているつもりでもエラーが発生している、間違った処理をしていても気づかない、といった状況が発生します。そもそも誰がログを管理するのか、という問題もあります。

このように、RPAは手軽に導入できて便利に使える一方で、運用面も含めて検討しておかないと、後々トラブルが発生する可能性もあることに注意が必要です。メリットとデメリットを正しく理解し、導入するようにしましょう。

【イベントレポート】IoTセキュリティとソフトウェアの脆弱性を考える

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2019年3月8日のイベントでは「マジメだけどおもしろいセキュリティ講義 ~IoTセキュリティとソフトウェアの脆弱性をめぐる議論~」と題し、書籍『マジメだけどおもしろいセキュリティ講義』の著者でもあるすずきひろのぶさんを講師にお迎えして、コンピュータセキュリティの最前線について教えていただきました。

■今回のイベントのポイント
・大規模DDoS攻撃を引き起こしたMIRAIのケーススタディ
・過去例からIoT機器の脆弱性について考える
・現状におけるIoT機器のセキュリティの問題を整理
・脆弱性情報流通の枠組みと運用について
・政府のあたらしい取り組みNOTICE

【講師プロフィール】
すずき ひろのぶ(鈴木裕信)さん
1985年、株式会社SRAに入社。UNIXやネットワーク関連のソフトウェア開発を経験後、同社ソフトウェア工学研究所にてネットワークやソフトウェア品質の研究を行う。1997年にソフトウェア・コンサルタントとして独立。JPCERT/CCの立ち上げ時から運営に参加し、現在も一般社団法人JPCERTコーディネーションセンター理事として情報セキュリティに携わるほか、実践女子大学、専修大学、中央大学で非常勤講師として勤めると同時にユニバーサル・シェル・プログラミング研究所に在籍しSELinuxの実践的利用の研究や実践的IoTセキュリティの研究を進める。

大規模DDoS攻撃を引き起こしたMIRAIのケーススタディ

セキュリティにおいて、注目すべきホットな話題が、IoT機器をボット化させてDDoS攻撃をしかけたマルウェア(悪意を持つソフトウェア)「MIRAI」の登場です。

MIRAIを知る前に、まずDDoS攻撃について説明されました。DDoS攻撃は、いわばDoS攻撃の進化版です。DoS(Denial of Services:サービス拒否)攻撃でもいちばん困るのは、正常に見えるアクセスを大量にサーバに送り付け、処理をマヒさせてしまうというもの。

しかし、単一のIPアドレスから送信されるパケットは制御可能な上、サーバ側の処理能力が攻撃側の処理能力を上回っていれば攻撃は成り立ちません。パソコンを一台、二台用意しただけでは企業や官庁などの規模のサイトを麻痺させることはむずかしいのだそうです。

そこで登場するのがDDoS(Distributed DoS:分散サービス拒否)攻撃です。一斉に異なるIPアドレスからパケットを送り付けてオーバーフローさせてしまうというもの。どれだけ多くの攻撃ノードを用意できるかが重要になってくるそうです。

f:id:itstaffing:20190424120150j:plain
▲DDoS攻撃のイメージ。マルウェアに感染した攻撃botが、ターゲットとなるサーバに一斉に攻撃を仕掛ける(出典: 講演スライドより)

2016年9月に登場した「MIRAI」は、約14万5千もの攻撃ノードから、1秒間に9300万パケット、転送量にして約799Gbpsの攻撃を仕掛けたそうです。すずきさんによれば「このパケット量に耐えられるシステムはそうそうありません」とのこと。

では、なぜMIRAIは、このような前代未聞の大量攻撃を仕掛けることができたのか。それは「IoT機器が攻撃ノードとして使われたから」だそうです。

今では、街中のいたるところに設置され、防犯や安全に貢献しているカメラですが、それらはIPネットワークで接続されており、撮影画像を送信するために通信機能を備えています。

MIRAIは、こうしたネットワークカメラ1台1台に内蔵されているコンピュータに侵入し、C&Cサーバと呼ばれる司令塔からの命令によって、一斉攻撃を仕掛ける仕組みになっています。また、MIRAIは非常に考えて作られており、感染したマルウェアが周辺のIPアドレスをサーチし、見つけた対象のアーキテクチャ(ARM、X86、SuperH、MIPS等)に最適なバイナリを送り込みます。そうして、わずか72時間で、約14万5千もの攻撃ノードを手に入れたのだそうです。恐ろしいですね。

MIRAIのC&Cサーバも設計が練られていて、200万台のノードをコントロールできるように設計されていたそうです。200万台のノードが一斉攻撃を仕掛けると考えただけでも、ぞっとします。

MIRAIの感染対象はインターネットカメラが搭載する「組込みLinux」というOSでしたが、これはインターネットカメラだけでなく、家庭で利用しているブロードバンドルータなどにも利用されています。そして、感染した機器には共通の条件がありました。telnetのポートをオープンにしていたこと、デフォルトアカウントからroot権限が使えたこと、管理用ログインアカウントとパスワードが出荷時のままであったこと、などです。

この話を聞くと、自宅のブロードバンドルータのパスワードを購入時のものから変えておいたかどうか、不安になる方もいるかもしれません。

ちなみに、MIRAIを作成した犯人はすでに逮捕されており、MIRAIおよびC&Cサーバのソフトウェアは公開されており、その手口は解明済みです。

現状におけるIoT機器のセキュリティの問題を整理

イベントでは、このほかにも、東芝のHDDレコーダーや、I・Oデータ機器のネットワークカメラなどが狙われた過去の事例や、海外事例としてHospira Lifecare PCA輸液ポンプのroot権限が乗っ取り可能という重大な脆弱性が存在していたケースなども紹介されました。輸液ポンプは医療現場で使われるだけに、人命に直結する脅威です。

こうしたIoT機器が、今後も狙われることは間違いなく、新たな対策が必要です。その対策の1つとして、すずきさんが紹介してくれたのが「SHODAN」というサービスです。

f:id:itstaffing:20190424120153j:plain
▲SHODANを使えば、自分が使っているIoT機器が外部からどう見えているかがわかる (出典 https://www.shodan.io

「SHODAN」は、合法的な手法で、オンラインになっているサービス機器を見つけるサービスです。インターネット側からアクセス可能なIoT機器はインターネットに接続した瞬間に、第三者に見つけられるのは時間の問題になります。それなら、「SHODAN」を使って、自分たちの設置したIoT機器が、外部からどう見えているのかを確認しておこうというポジティブな使い方をすずきさんは提案していました。本来はインターネット側からアクセスされる意図はなかったのにアクセスできてしまうような誤った設定などを見つけるのにたいへん有用で、これはIPA(独立行政法人 情報処理推進機構)も推奨しています。

また、別のアプローチとして、IoT機器のネットワーク空間をインターネットから切り離し、セキュアな仮想ネットワークを構築するという試みもあり、すでに株式会社ソラコムやニフティ株式会社が、そうしたサービスを提供し始めています。

f:id:itstaffing:20190424120155j:plain
▲IoT機器をインターネットから切り離されたセキュアな仮想ネットワークで接続する取り組みもある(出典:講演スライドより)

脆弱性情報流通の枠組みと運用について

また、重要な課題であるソフトウェアの脆弱性についても、これを周知させるため、中立的な第三者による、統一した脆弱性情報ハンドリングの必要性についても説明しました。

米国では、これを国家安全保障の範囲と捉え、米国土安全保障省(DHS)の資金提供によるMITREという団体が脆弱性情報のハンドリングを行っていて、NIST(米国立標準技術研究所)では、脆弱性情報のデータベース化も行っているそうです。

一方、日本国内では、JPCERT/CCやIPAが経済産業省の告示に従い、海外とも連携しながら脆弱性情報のハンドリングを行っています。

f:id:itstaffing:20190424120158j:plain
▲日本国内での脆弱性情報のハンドリングはJPCERT/CCやIPAが推進。国際連携もしっかり行っている

政府のあたらしい取り組みNOTICE

最新の話題として、2019年1月に、総務省とNICT(情報通信研究機構)と各インターネットサービスプロバイダが連携してIoT機器への無差別侵入調査・注意喚起を行う「NOTICE」という取り組みが発表されました。

f:id:itstaffing:20190424120203j:plain
▲NOTICEは、botが行うような試みをNICTが行い、安全予防に対する注意喚起を行う

この「無差別侵入」が不正アクセス禁止法に触れるのではないかという疑念もありましたが、一方で、ルータやネットワークカメラのデフォルトパスワードはマニュアルに記載されて公知なものとなっており、「みだりに第三者に知らせてはならないものとされている符号」に当たらないという見解も主流になりつつあります。しかし、昨今の状況からそのままでは警察や検察がどう解釈するかは予想できません。

そこで、NOTICEの実施にあたっては法改正を行い、通称「NICT法」の中に新たに「特定アクセス行為」という概念が取り入れられました。

f:id:itstaffing:20190424120206j:plain
▲NICT法では合法的に新たに「特定アクセス行為」という概念が盛り込まれた(出典:講演スライドより)

今後は、IoT機器の販売に対してデフォルトパスワードのままでは使えなくなるように指導が入る流れが予想されるものの、海外製品の国内OEM販売などでも徹底できるかどうかなど、不透明な部分も多々あります。

いずれにしても、IoT機器が私たちの身近にどんどん増えていくことは間違いありません。こうした動きに、もっと敏感になっておく必要がありそうです。

増井敏克の「情報のキャッチアップが足りない」ときに読むコラム 第4回 脆弱性ってなんだろう?

f:id:itstaffing:20190417105443j:plain

情報システムやネットワークに対する攻撃は多様化し、情報漏洩や不正アクセスのニュースは世界中で後を絶ちません。脆弱性への知識や脆弱性診断の需要は高まるばかりですが、皆さんは脆弱性について、どれくらい理解しているでしょうか。今回のコラムでは、エンジニアとして、脆弱性について知っているとよい内容をまとめました。

【講師】増井 敏克さん
【講師】増井 敏克さん
増井技術士事務所代表。技術士(情報工学部門)。情報処理技術者試験にも多数合格。ビジネス数学検定1級。「ビジネス」×「数学」×「IT」を組み合わせ、コンピュータを「正しく」「効率よく」使うためのスキルアップ支援や、各種ソフトウェアの開発、データ分析などを行う。著書に『おうちで学べるセキュリティのきほん』『プログラマ脳を鍛える数学パズル』『エンジニアが生き残るためのテクノロジーの授業』『もっとプログラマ脳を鍛える数学パズル』『図解まるわかりセキュリティのしくみ』(以上、翔泳社)、『シゴトに役立つデータ分析・統計のトリセツ』『プログラミング言語図鑑』『プログラマのためのディープラーニングのしくみがわかる数学入門』(以上、ソシム)がある。

脆弱性とバグの違い

ソフトウェアなどにバグがあると、利用者は想定した操作ができず、通常の使い方であっても問題になります。つまり、設計された通りに実装されておらず、利用者はその問題に気づきます。

それに対し、脆弱性の場合は利用者が通常の使い方をしている場合は気づきません。その製品の開発者すら気づいていないことがほとんどです。しかし、攻撃者がその脆弱性を見つけると、その問題点を狙った攻撃が可能となり、情報漏洩やファイルの破壊などの攻撃が成立してしまいます。

脆弱性と似た言葉にセキュリティホールがありますが、一般的には脆弱性の方が広い意味で使われます。例えば、教育不足による「人の脆弱性」や、ハードウェアに存在する問題に使われることもあります。一方で、セキュリティホールは主にソフトウェアの脆弱性に使われます。

f:id:itstaffing:20190417105446j:plain

脆弱性やバグがソフトウェアに存在すると、多くの場合は開発会社から修正プログラムや更新プログラムが提供されます。このプログラムをダウンロードし、適用することで、脆弱性を修正できます。このようなプログラムの中でも、セキュリティに特化したものをセキュリティパッチと呼ぶこともあります。

ただし、サポートが終了した製品に対してはこのような修正プログラムが提供されない場合があるため、サポート期間には注意が必要です。もし修正プログラムが提供されない場合は、該当のソフトウェアを使用しない、代替のソフトウェアに切り替える、といった対応が必要かもしれません。

なお、「情報セキュリティ早期警戒パートナーシップガイドライン」が定められており、ソフトウェアやWebサイトに脆弱性を発見した場合にはIPA(情報処理推進機構)に報告することになっています。

f:id:itstaffing:20190417105450j:plain

脆弱性を防ぐために開発者が注意すること

開発者にとっては、開発の各ステップにおいてセキュリティを意識することが大切です。ソフトウェアの開発においては、要件定義から設計、実装、テスト、運用という大きな流れがあります。この各ステップにおいて、セキュリティレビューやソースコードレビュー、脆弱性診断やシステム監査・セキュリティ監査などを実施します。

特に脆弱性診断は重要で、開発したアプリケーションに脆弱性がないか調べるだけでなく、以下の図のようにネットワークの設定漏れやファームウェアの更新状況、サーバーの設定ミスやOS、アプリケーションの修正プログラム適用状況、不要なサービスの有無なども確認します。データベースには不要なユーザーが登録されていないか確認することも必要です。

f:id:itstaffing:20190417105453j:plain

また、脆弱性を作り込まないために最新の情報を仕入れることも大切です。例えば、Webアプリを開発する場合は、IPAによる「安全なウェブサイトの作り方」を読んでおくことは必須です。

さらに、最新の情報を収集します。IPAの情報セキュリティページ(https://www.ipa.go.jp/security/index.html)や、JVN(https://jvn.jp)を使う方法があります。JVNは情報セキュリティに関するポータルサイトで、各ベンダーのサイトを順に調べるよりも手軽に、統一されたフォーマットで一覧表示できます。

また、発見された脆弱性が対応を優先すべきかどうか調べるには、CVSS(Common Vulnerability Scoring System)を使う方法があります。JVNのサイトではCVSSの評価値が公開されていますし、以下の図のようなCVSS計算ソフトウェアを使って自分でCVSS値を計算することもできます。

f:id:itstaffing:20190417105458j:plain

脆弱性診断手法を知る

脆弱性診断は手作業で実施することもできますが、多くの場合は専用のツールを使用します。例えば、無料のツールとして、OWASP ZAPやBurp SuiteのCommunity版などがあります。また、脆弱性があるとどのような攻撃が可能なのかを学ぶには、IPAが公開している脆弱性体験ツールAppGoat(https://www.ipa.go.jp/security/vuln/appgoat/index.html)を使用するのも一つの方法です。

f:id:itstaffing:20190417105501j:plain

2019年2月にはIPAから「脆弱性対策の効果的な進め方(ツール活用編)」という資料も公開されています。この資料には脆弱性を取り巻く状況や脆弱性対策の考え方がまとめられています。 (参考:https://www.ipa.go.jp/security/technicalwatch/20190221.html

なお、脆弱性診断を行う場合には、自分が管理しているサーバー、アプリ以外には行わないようにしてください。勝手に攻撃すると、不正アクセス禁止法などに抵触する恐れがあります。脆弱性診断を行うとデータを破壊する場合があり、ページの内容やデータベースが書き換えられるため、事前にバックアップを取得しておくことは必須です。

このとき、誤検知の可能性についても理解しておきましょう。脆弱性診断ツールが検知しても、攻撃が成立するとは限りません。また、脆弱性診断ツールが検知できなくても、脆弱性が存在しないとは言えません。このため、手作業での脆弱性診断と組み合わせて実施することが一般的です。

脆弱性に関する理解は深まったでしょうか。たとえば、Webアプリを公開してから脆弱性が見つかった場合、サービスの停止などに追い込まれ、企業の存続に関わる場合もあります。脆弱性に関する最新の情報をキャッチアップすることは、大きなアクシデントを防ぐ一助となり得ます。日々のセキュリティに関するニュースを見る際は、原因に目を向けてみると、また違った見方ができそうです。

【イベントレポート】便利だけど、難しそう?Dockerのキホンをマンガで学ぶ

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2019年2月20日のイベントでは「『マンガでわかるDocker』から学ぶ、DockerのキホンからDocker Hubへ自作イメージ公開まで」と題し、技術書典4で大人気だった『わかばちゃんと学ぶ』シリーズ『マンガでわかるDocker』の作者である湊川あいさんが、マンガの内容に沿って実践しながら「Dockerとは何か?」から基礎的な使い方までを、やさしく解説してくださいました。

■今回のイベントのポイント
・そもそもDockerとは?
・冪等性とは?
・コンテナを立ち上げてみよう
・開発環境を作ろう
・Dockerfileの書き方
・Docker Hubに自作イメージを公開してみよう
 
【講師】湊川 あいさん
【講師】湊川 あいさん
フリーランスのWebデザイナー・漫画家・イラストレーター。マンガと図解で、技術をわかりやすく伝えることが好き。著書『わかばちゃんと学ぶ Webサイト制作の基本』『わかばちゃんと学ぶ Git使い方入門』『わかばちゃんと学ぶ Googleアナリティクス』が全国の書店にて発売中のほか、動画学習サービスSchooにてGit入門授業の講師も担当。「マンガでわかるGit」「マンガでわかるDocker」「マンガでわかるUnity」といった分野横断的なコンテンツを展開している。
Twitterアカウント: https://twitter.com/llminatoll

そもそもDockerとは?

今回のイベントでは、湊川さんが書かれた「マンガでわかるDocker」に沿って、初心者にもわかりやすく説明してくれました。

f:id:itstaffing:20190410115527j:plain
▲イベントは、自身で技術面の記述から作画までを手掛けたマンガ「マンガでわかるDocker」をベースに進められた。

まずは、Dockerとは何かという疑問から。Dockerは、サーバOSであるLinuxを仮想化する技術の一つで、例えるならば「Windowsパソコン上で、ゲームソフトが遊べるエミュレータ―のようなもの」と考えれば良いそうです。

Dockerでは、MacやWindowsといったパソコン用OSの上で、Ubuntu Linuxというサーバ用OSが動かせます。もともとLinux上で仮想的なLinuxサーバを運用するためのソフトだったので、もちろんLinuxの上でも動かせます。

では、パソコン上でLinuxを動かしたり、Linux上で同じLinuxを動かすのはどんなメリットがあるのでしょうか?

Linuxサーバ上で動かすアプリケーションは、開発時や実行時に、JavaやPHP、Rubyといったプログラミング言語や、Webサーバ、データベース管理ソフトなど、さまざまなソフトウェアを利用しています。こうした周辺ソフトウェアは、開発環境と実際に運用する本番環境で、できる限り同じものに揃えておかなければなりません。

Dockerが便利なのは、Docker上で作成した仮想的なLinux環境をコンテナという単位で入れ替えることができ、「冪等性(べきとうせい)」が担保されることだそうです。

冪等性とは?

湊川さんのマンガには、わかばちゃんという女の子が登場します。その女の子が私たちの代わりに、PHPさんという謎のお兄さんに教わりながら技術知識を身につけていくスタイル。難しい言葉が出てくると、必ずPHPさんが初心者にわかりやすく説明してくれます。

早速、「冪等性」についてですが、たとえば、ゲーム機のスイッチを入れたときに、毎回同じタイトル画面が立ち上がり、ゲーム機に差したカートリッジが同じならば、毎回同じ内容のゲームがスタートします。また、ゲーム内のショップで買い物をするときには、回復薬を1つ買えば100円が減り、もう1つ買えば同じように100円が減ります。このように、ある操作を1回行っても複数回行っても結果が同じであることを「冪等(べきとう)である」と言います。

「そんなの当たり前なのでは?」と思うかもしれません。しかし、Linuxサーバ上のプログラミング言語や連動するソフトの種類やバージョンはさまざまなものがあり、環境ごとに異なるケースも少なくありません。そうすると、自分の環境で作ったサイトデータやアプリケーションを相手に渡したときに、渡した先で動かないという状況が生じかねません。

こうした「こちらでは動くのに、あちらでは動かない」ということがないように、双方がDockerを使って冪等性を担保しておけば、余計なことに煩わされることが無くなります。

コンテナを立ち上げてみよう

Dockerの紹介が一通り終わると、実際のパソコンを使ったデモが始まりました。パソコンにDocker Desktop(for Mac/for Windows)をインストールするとパソコン上でDockerが使えるようになります。湊川さんがマンガの内容に沿って、実際にMacでDockerの操作を実演してくれました。

まずはDockerコンテナを立ち上げます。Macなら「ターミナル」、Windowsなら「コマンドプロンプト」を起動してコマンドラインから操作します。利用可能なコンテナの一覧を表示させるにはcontainer lsコマンドを実行します。

$ docker container ls

一覧に何も表示されません。これは今現在は利用可能なコンテナがローカルには存在していないということです。まだ何もしていないので当たり前ですね。では、早速はじめてのコンテナを立ち上げてみましょう。runコマンドでhello-worldというイメージをもとにコンテナを作成・起動します。

$ docker run hello-world

実行すると画面に「Hello from Docker!」というメッセージが表示されて終了しました。

f:id:itstaffing:20190410115532j:plain
▲Dockerでhello-worldを実行する。画面はWindows版

該当のイメージ(今回はhello-worldイメージ)がローカルに無い場合、「Docker Hub」というネット上から自動でダウンロードしてきてくれるのです。

コンテナのライフサイクル

続いて、Alpine LinuxのイメージをDocker Hubからダウンロードして使ってみます。Alpine Linuxは、Linuxのディストリビューション(利用目的等に合わせてLinuxと必要な周辺ソフトを集めた配布パッケージ)の一つです。

Docker Hubからダウンロードするのですが、このとき、初心者はオフィシャルのイメージを使ったほうが安全とのこと。なぜなら、イメージは誰でもアップロードできるためです。個人が作ったアンオフィシャルのイメージを使うときは、Dockerfileの中身をちゃんと確認し「そのイメージが何をインストールしているか」「どんなコマンドを実行するか」理解してからにしましょう。

f:id:itstaffing:20190410115536j:plain
▲Docker Hubのサイト画面。このサイトにさまざまなイメージがアップロードされており、手軽にダウンロードして使うことができる。

先ほどのhello-worldと同様に、run alpineとすれば良いのですが、ここではrunコマンドを分解して実行して見せてくれました。runコマンドは、pull、create、startをまとめたものなので、次のような手順になります。

まずpullコマンドでダウンロードします。

$ docker pull alpine

次にcreateコマンドでイメージをもとに、コンテナを作成します。

$ docker create -it alpine

そしてstartコマンドでコンテナを実行します。

$ docker start [コンテナ識別子]

このときコンテナ識別子には、createコマンド実行時に表示されたidを指定します。

コンテナを停止するには、stopコマンドを使います。

$ docker stop [コンテナ識別子]

では、Alpine Linuxを実際に使ってみましょう。Linuxを利用するにはシェルを起動する必要があります。そこでrunコマンド実行時に、シェル(bin/sh)の実行も指定しておきます。

$ docker run -it alpine bin/sh

これで、Alpine Linuxの起動と同時にシェルが実行され、Alpine Linux環境内でさまざまな操作が行えるようになります。

開発環境を作ろう

いよいよDockerで開発環境を作ります。なんと、コマンド1行で済みます。

$ docker run -d -p 80:80 --name myapp -v $(pwd)/var/www/html php:7.0-apache

コマンドラインの内容は、PHPのバージョン7,0とApacheを含むイメージ(php:7.0-apache)をrunコマンドでダウンロード・コンテナ起動しています。-dは、バックグラウンドでの実行を指示しています。

-p 80:80はポート番号指定で、パソコンのポート80に接続するとコンテナのポート80につながるようにしています。

--name myappは、作成したコンテナにmyappというコンテナ名を付けています。これにより、その後のコンテナの操作がこの名前を指定して行えます。

コンテナを停止すると、このコンテナの中で作ったファイル(index.phpなど)は失われてしまいます。そこで、これを防ぐために-vオプションでパソコンのローカルフォルダをコンテナ内($(pwd)/var/www/html)にマウントします。

これで環境が立ち上がりました。この環境を利用するために、次のコマンドでシェル(bash)を起動します。

# docker exec -it myapp bash

そして、この環境内でPHPを使ってWebページを出力する簡単なプログラムを作成してみます。

# echo '<?php phpinfo();' > index.php

この状態で、パソコンのブラウザから、下記のようなURLを指定すると、コンテナに接続され、ページが閲覧できます。



f:id:itstaffing:20190410115540j:plain
▲ブラウザでlocalhostにアクセスするとPHPのバージョン情報が表示される。画面はWindows版

このほか、Dockerfileの書き方やDocker Hubへのアップロードについても学びました。Dockerが便利だとは聞くけれど、なんだか難しそうと思われている方は、ぜひマンガをとっかかりにするのもよさそうです。

f:id:itstaffing:20190410115543j:plain

【イベントレポート】Javaの次のステップへ。今注目のJVMプログラミング言語「Scala」を学ぼう

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2019年2月13日のイベントでは「今注目のJVMプログラミング言語『Scala』を学ぶ!~Javaエンジニアに向けたScalaの概要~」と題して、書籍『実践Scala入門』の著者である水島宏太さんを講師にお迎えし、スケーラブルなシステムの開発で注目されるプログラミング言語Scalaの基礎を解説していただきました。

■今回のイベントのポイント
・ポストJavaとJVM言語
・どのJVM言語を学ぶべきか
・JavaからScalaへ

【講師プロフィール】
水島 宏太さん
筑波大学大学院システム情報工学研究科コンピュータ・サイエンス専攻修了[博士(工学)]。大学院在籍時からScalaを継続して追いかけ、アジア最大のScalaイベントであるScalaMatsuriの前身「Scala Conference in Japan 2013」の発起人でもある。現Japan Scala Association代表理事。株式会社ドワンゴ勤務。著書に『オープンソース徹底活用Scala実践プログラミング』(共著、秀和システム)、『実践Scala入門(共著)』(技術評論社)、『Scala スケーラブルプログラミング(監修)』(インプレス)などがある。

ポストJavaとJVM言語

Javaだけ知っていればいいという時代でないということは、何となくわかっているものの、Javaは依然として重要な言語であり、Javaに加えてそれ以外の言語も覚えなければと考える人が増えています。そうした人たちの間で現在、注目されているのが、JVM言語だそうです。

JVM言語とは、処理系がJVM(Java仮想マシン)上で動作する言語の総称で、主なものとしてScala、Kotlin、Clojureなどがあります。そして、なぜJVM言語が注目されるかと言えば、Javaエンジニアにとって学びやすいからなのだそうです。

どのJVM言語を学ぶべきか

JVM言語はどれも同じというわけではなく、それぞれ長短があり、水島さんがそれをわかりやすく紹介してくださいました。

f:id:itstaffing:20190328125331j:plain
▲Scalaの長所と短所

Javaの資産をほぼ完全に使えるというのは、Scalaの大きなメリットですね。また、Better Javaとして使えるというのは、Javaのような書き方もできる上に、Javaでは使いにくかった部分や難しかった部分が、簡潔に記述できるという意味だそうです。

f:id:itstaffing:20190328125335j:plain
▲Kotlinの長所と短所

KotlinもBetter Javaとして使えますが、現状ではAndroidアプリ開発以外の実績が少ないことがネックだといいます。

f:id:itstaffing:20190328125339j:plain
▲Clojureの長所と短所

Clojureは良くも悪くも、静的な型がないことが特徴だそうです。IDEのサポートが弱いというのも、少し手を出しにくい印象がします。

大まかにまとめると、Androidアプリを中心に開発を行うのであればKotlin、サーバーサイド中心の開発を行うのであればScala、型が不要ならばClojureを選ぶのがよい、という結論でした。

イベントでは、Javaの復習も踏まえて説明されたのですが、Javaが抱える課題として、以下のようなものが挙げられました。

f:id:itstaffing:20190328125342j:plain
▲Javaが抱えるさまざまな問題

ラムダ式とは、Functional Interface(FI)を持つオブジェクトのメソッドを実装するための記法でJava8から実装されているそうです。

f:id:itstaffing:20190328125346j:plain
▲ラムダ式「()->」を使ってメソッドを記述。

上記のように、インターフェイスにRunnableを使う場合、メソッドに引数を渡したり、メソッドからの戻り値を受け取ったりすることができません。そこでJava8からは、多数のFIがjava.util.functionパッケージ以下に追加されているそうです。

このように、言語を設計した当所はあまり考慮されていなかったり、後から登場した概念を実装するため「増築」を繰り返していったりしたことで、Javaにもさまざまな問題点が生じ始めているようです。

そこでScalaの登場です。JavaエンジニアがScalaを学ぶことで、次のようなメリットが生じます。

f:id:itstaffing:20190328125350j:plain
▲JavaエンジニアがScalaを学ぶことのメリット

高階関数というのは、関数を引数にする、あるいは関数を戻り値とする関数のことで、たとえばリスト構造の各要素に対して順々に与えられた関数を処理していくmap()などが、これに相当するそうです。

JavaからScalaへ

そして、いよいよJavaとScalaの違いに迫ります。セミナーでは、事前にScalaの基礎文法の丁寧な説明もありましたが、ここでは割愛します。まずはJavaの記述とScalaの記述の違いから。

f:id:itstaffing:20190328125353j:plain
▲配列を用意し、配列の値を操作して表示するプログラム。こちらはScalaをBetter Javaとして記述した場合の例

ScalaはBetter Javaとしても使えますが、Scala本来の方法で記述することもできます。

f:id:itstaffing:20190328125357j:plain
▲先ほどのプログラムをScala流に記述するとこうなる(あくまでも記述の一例)

しかし、この後のサンプルはいずれもBetter JavaとしてのScalaの記述です。まずは、ジェネリックなクラスの定義について見てみましょう。

f:id:itstaffing:20190328125400j:plain
▲型変数Tはインスタンス生成時の記述から推論されている

同様に、ジェネリックなメソッドの定義についても見てみましょう。

f:id:itstaffing:20190328125403j:plain
▲こちらはJavaでメソッドを定義した例

f:id:itstaffing:20190328125408j:plain
▲Scalaだと、このように記述できる。swapメソッドの型変数Uも引数から推論される

Java8から実装されているFIを利用したStream APIの記述も見てみましょう。これもJavaで記述する場合と、Scalaで記述する場合で下図のように異なります。

f:id:itstaffing:20190328125411j:plain
▲Java8から実装されたStream APIもScalaだと簡潔に記述できる

上図で、Javaは、コレクションnumbersからstream()で、ラムダ式を渡せるStream形式に変換し、高階関数であるmap()でStreamに対する操作を行い、collect()で終端操作をしています。

いっぽうScalaでは、StreamAPIと同様の操作も簡潔で、終端操作も記述する必要がなく、すっきりとしたコードで記述できていることがわかります。リストに対する処理は多用するため、冗長で煩雑な記述が簡略化されるメリットはとても大きいと思います。

Scalaというと並列分散処理が記述しやすいとか、関数型言語という特徴などが、真っ先に取り上げられがちですが、今回学んだように、まずはBetter Javaとして使うというのが、導入としてはよさそうです。Javaの延長線としてScalaを使い、段階的にScala流の記述を学んでいくことができるというのは大きな魅力です。エンジニアとしての幅を広げるために「次はScala」という選択肢を、考えてみませんか。