Opt Technologies Magazine

オプトテクノロジーズ 公式Webマガジン

出張Scalaハンズオン! in 会津大学

f:id:opttechnologies2015:20171120231342j:plain

11/16(木)、会津大学さんにて、授業の一環で出張Scalaハンズオンを実施させていただきました! ハンズオンの様子をレポートします。

あいさつ

こんにちは! オプトテクノロジーズ 採用担当の井上です。鍋と日本酒がより一層美味しい季節になりましたね。

日本酒醸造でも近年知名度を上げている会津に出張してきたので、レポートをお届けします(ちなみに笹政宗が好きです)。

会津大学さんへ出張してきました

11/16(木)、会津大学の授業(課外プロジェクト)の一環として、オプトのエンジニアcedretaberlagénorhynqueによるScalaハンズオンを実施する機会をいただきました。

Opt Technologiesとして初の試みとなったハンズオン当日は、学部1〜2年生の方を中心とした、意欲ある学生の皆様にご参加いただきました。

Scala入門ハンズオン (by cedretaber & lagénorhynque)

今回のハンズオンは、RubyとJavaScriptでWebアプリケーションを学んでいる1・2年生が対象ということもあり、標準以外のライブラリにあまり依存しないコマンドラインアプリケーションの製作を課題としました。

講義の前半でScalaの特徴、基本的な文法等について解説し、手を動かしてもらいながらScalaについて知ってもらいました。

後半では、題材となるアプリケーションの作り方について「関数型らしさ」に留意しながら説明し、お手本を見ながら実装してもらいました。

www.slideshare.net www.slideshare.net

具体的には、以下のような内容を扱いました。

プログラミング言語「Scala」

(スライド pp. 2-10)

Scalaとはどのような言語なのか、概説します。

JVM

ScalaはJVM (Java仮想マシン; Java virtual machine)上で動作する言語(JVM言語)のひとつです(ほかにGroovy, Clojure, Kotlinなどがあります)。

VMの上に構築された言語なので"Write once, run anywhere"というJavaの標語に象徴されるように移植性が高いのも特徴となっています。

また、Javaと相互運用可能なため、ライブラリやツールなどJavaエコシステムの資産を有効利用できるという強みもあります。

オブジェクト指向・関数型のハイブリッド言語

Scalaはオブジェクト指向プログラミングと関数型プログラミングの要素を統合したハイブリッドな言語です。

オブジェクト指向言語としての側面:

  • フィールドとメソッドを持つクラス
  • 継承とそれによるポリモーフィズム
  • etc.

関数型言語としての側面:

  • イミュータブル(変更不可能)なデータ構造
  • 再代入不可能な変数
  • パターンマッチ
  • 文指向ではなく式指向
  • etc.

Scalaの基本文法

(スライド pp. 11-53)

Scalaの基本的な文法を紹介します。

値とリテラル

RubyやJavaScriptでもお馴染みの数値、文字列、真偽値のリテラルのほかに、以下のようにコレクションの値をリテラルのように書けます(実際にはメソッド呼び出しの糖衣構文を利用しています)。

scala_literal

変数定義

val で宣言した変数は再代入不可能ですが、 var で宣言した変数は再代入可能になります。

型アノテーションは : 型 という形式で変数名の後ろに付けます。

scala_variable

制御構文

Scalaの if はRubyと同様に文(statement)ではなく式(expression)であるため、それ自体が値を返し、結果をそのまま変数に代入することができます。

scala_if_expression

yield のない for 式は foreach メソッド、 yield のある for 式は map(と flatMap)メソッドの呼び出しに相当します(機能的にはPythonのリスト内包表記によく似ています)。

scala_for-expression

パターンマッチ

match 式などで使われるパターンマッチという機能によって、値を組み立てる時に利用したのと同じような形式で値を分解し、条件分岐を表現することができます。

scala_pattern-matching

メソッドと関数オブジェクト

def メソッド名(引数): 戻り値の型 = 本体 でメソッドを定義することができます。

scala_method

(引数) => 本体 で関数オブジェクト(いわゆる「ラムダ式」。JavaScriptでいうfunction式/アロー関数式)を作ることができます。

また、関数の型は (引数の型) => 戻り値の型 という形式で表現します。

関数オブジェクトも値の一種なので、メソッドの引数として渡すことができます。

scala_function-object

map メソッド(高階関数)

関数を引数に取ったり戻り値として返したりする関数を「高階関数」と呼びます。

例えばJavaScriptやRubyでもお馴染みの map メソッドは、コレクションの個々の要素に引数で受け取った関数を適用した結果のコレクションを返します。

scala_map-method

平均値を表示するCLIツールを作ってみよう

(スライド pp. 54-212)

ここまでで学んだことを利用して、数値リストの平均値を計算する簡単なコマンドラインツールを作ってみます。

scalaコマンドとsbt

以下のように main メソッドを持つオブジェクトを定義すると、

scala_main-method

次のようにscalaファイルとして scala コマンドから実行することができます。

scala_scala-command

同様のことは、Scalaのビルドツールsbtを起動し、 compile コマンドでソースをコンパイルし、 run コマンドで実行することによっても実現できます。

コマンドライン引数を取り扱う

Scalaではコマンドライン引数が main メソッドに文字列の配列(Array)として渡るので、例えば以下のように書けば for 式でコマンドライン引数を1個ずつ標準出力することができます。

scala_command-line-args

標準入力から読み取る

scala.io.StdIn には標準入力を扱うのに便利なメソッドが定義されています。

readLine メソッドを利用すると、標準入力から1行読み込んで文字列として受け取ることができます。

scala_readline-method

指定した区切り文字で文字列を分割するには split メソッドが利用できます。

ここでは、標準入力から受け取った空白区切りの文字列を split で分割し、個々の要素を標準出力しています。

scala_split-method

文字列を数値に変換する

String 型の値に対する toInt メソッドで Int 型に、 toDouble メソッドで Double 型に型変換することができます。

scala_string-to-number

講師からのコメント (by cedretaber)

時間の関係で課題を完全に作りきってもらうことはできませんでしたが、Scalaの紹介は概ねできましたので、演習で普段扱っている動的型付け言語や、他の授業で使っている手続き型・オブジェクト指向の言語とは違った、Scalaの魅力を知っていただけたかと思います。

TAの方も自信を持っていらっしゃった通り、学生さん達のレベルは高く、初めて扱うであろう言語にもすぐに馴染んでくれました。

演習ではRubyとJavaScriptを使っていたらしいのですが、それらの言語にある map メソッドからScalaの map メソッドの動きを類推したり、言語の型付の差異から来る違いに言及するなどして、比較的程度の高い学習ができたかと思います。

御礼

今回のハンズオン実現にあたり、多大なるご支援を賜った会津大学 データベースシステム学 上級准教授の渡部 有隆様、参加・サポートしてくださった学生の皆様、ご縁を繋げてくださった方に、改めて御礼申し上げます。

また、ハンズオンの内容については、オプト技術顧問の中村学氏の助言・協力を得て構成しました。

最後に

Opt Technologiesによるハンズオンをご希望いただける学校関係者の方は、こちらまで、是非お気軽にお声掛けください!

Opt Technologiesでは現在、中途採用に加え、2018・2019年度新卒採用についても、各種採用イベントを中心に活動中です。

春には2019年度新卒エンジニア向けのインターンも開催予定です。こちらから是非ご応募ください!