SlideShare une entreprise Scribd logo
1  sur  73
Télécharger pour lire hors ligne
Scala勉強会
Scalaとのであい

あの忌まわしい「Haskell勉強会」から1年

  あのとき感じた関数型言語に対する
       激しい敗北感

そんなとき耳にした、少しだけフレンドリー
     そうな関数型言語
Scalaとのであい

  え、なんかJavaと似てるらしい?

 モナド?圏論?そんなの関係ねえ?

  最悪Javaみたいに書けばおk?

        これは…
Scalaとのであい
                       、、、,. ,._             >>Scalaくん…… Scalaくん………
                     ィ`‘′           ヽ
                    〃/ノノ八レレ、. |                    Scalaくんに託すっ…!
                    ル三’‘′`三ヽ. |
                     [ ≧|ニ|≦_]~|^)ト、              虫のいい話なんだが……
.                     | ,-L__」 -、u |ト:| |’‘‐- ...__
              _.. -┬|l王l王l王l`/ .| | |               Haskellの代わりに…
.            ∧ |├‐┬─‐’‘′/ ||                          ぼくをきたえあげて……
            / l |.l-―|、___/-―┤
         | ̄ ̄|.| | | ヽ. /               | | 関数型をわからせてやってくれ…
      /.|       | l. | |     Y。        ||
      \/~三三..l | ̄ ̄ ̄ ̄ ̄  ̄|                            たのむ……
        /、 丁` /ヽ「|            /.|         |
.      / へ、./ | l. /⊿ |_                    |
     /     |/         | |. └‐::┐r‐┘ .|
.   !     /            |_|.    └'             |==
もくじ
Scalaの概要
JavaからScalaへ
Real World Scala
Scalaの概要
Scalaの作者
Martin Odersky
もともと、Javaバイトコードに変換される関数型
言語を開発
  javacやJava-Genericsに取り込まれる
制限なしで一からミニマムな言語を作ってみた
  使う人にとってはあまり嬉しくないことがわかった
Scalaの開発を開始
  目標は変わらずOOとFunctionalの統合
  開発者が使いやすいように
Scalaのコンセプト
オブジェクトパラダイムと関数パラダイムを統合
したマルチパラダイム言語
  関数パラダイム       オブジェクトパラダイム

         再帰     可変な値
 不変な値


  統合(?)
                        継承
        参照透明性

 関数中心           オブジェクト中心

        合流性            多態性
Scalaの実装
Javaバイトコードを生成するScalaコンパイラ+
Scala標準ライブラリ(JAR)群

   Scala    Scala       Java
 ソースコード    コンパイラ      バイトコード




                    scala-library.jar
Scalaの実装
ゆえに(?)Java              Scalaの相互呼び出しが可能
 object ScalaToJavaCallSample extends Application {
   def method = println(quot;Hello, Scala!quot;)
   new JavaToScalaCallSample().method()
 }
 public class JavaToScalaCallSample {
   public void method() {
     System.out.println(quot;Hello, Java!quot;);
   }
   public static void main (String[] args) {
     ScalaToJavaCallSample.method();
   }
 }
Scalaの実装
Java -> Scala呼び出しの場合には、ある程度
コンパイラの挙動を把握しておく必要あり
  変数
   すべてメソッドに
  クロージャ
   Functionクラスに
  などなど
動作プラットフォーム
Java VM
.NET Framework
そして、、、


           Android
Scalaの捉え方
1.   OO言語としてのScala
2.   関数型言語としてのScala
3.   並列処理基盤としてのScala
OO言語としてのScala
というか、Better JavaとしてのScala
 “すべてがオブジェクト”
 記法の簡略化
 “Singleton”の言語レベルサポート
 Mix-Inの導入
 型推論の広範な導入
 暗黙的な引数/型の補完・変換
 擬似ダックタイピング
 ネストされたメソッドの導入
関数型言語としてのScala
高階関数
 ラムダ式
 クロージャ
 Yコンビネータ
カリー化
遅延評価
不変オブジェクトだらけの標準ライブラリ
パターンマッチ、Caseクラス
並列処理実行基盤としてのScala
Future
並列計算
セマフォ
Reader/Writer
同期/非同期チャネル
Workers
Mailboxes
Actors
JavaからScalaへ
すべてがオブジェクト
プリミティブ型消滅、Scala独自のクラス群に
 scala.Int, scala.Long, …
 内部的にはプリミティブ+俺Boxingで処理
関数/メソッドもオブジェクトに(後述)
 Function0~クラス
演算子はすべてメソッドに
 メソッドも演算子のように使える
記法の簡略化
例:クラス定義(Java)
public class Foo {
  private String name;
  public Foo(String name) {
     this.name = name
  }
  public void setName(String name) {
     this.name = name
  }
  public String name() {
     return name
  }
}
記法の簡略化
例:クラス定義(Scala)
class Foo (var name: String)
objectの導入
要するに「Singletonなclass」
  staticの代替と考えてもおk
  コンパイル後には実際、static+Singletonクラスに
 object HelloWorld extends Application {
    println(“Hello, World!”)
  }

classとは異なる名前空間を持つ
   Scalaライブラリの中で、classと同名のFactoryとして
   リテラルの拡張のような形で使われている
 val list : List = List(1, 2, 3, 4, 5)
Mix-In
 特定のプログラム要素(trait)をclassに付加可能
 traitは実装を持つインタフェースのように振舞う
 Javaのインタフェースは存在しない
   class A extends B with C
                                 trait B



                                 trait C


                        自分のイメージはなんかこんなかんじ
Mix-in
 Traitの例
 trait HelloTrait {
    val msg = quot;Hello, World!quot;
    def say {
      println(msg)
    }
  }
  class SimpleClass extends HelloTrait
  new SimpleClass().say
Mix-Inの正体
コンパイラは、このようなバイトコードを生成
class A extends B {          trait B {
                               def method {…



class A implements B { 実装 interface B {
                            public void method();
 public void method {      abstract class B$class {
   B$class.method();        public static void method {
 }                      委譲
                               println(“hello, world!”);
                            }
型推論
型を明記しなくてもコンパイラが推測、補完
 一番簡単な例
val obj: SampleClass = new SampleClass


val obj = new SampleClass
 推測できない場合や、矛盾が見つかった場合には
 エラー吐いてくれる
型推論
もうちょい凝った例:
def dup[T](x: T, n: Int): List[T] =
  if (n == 0) Nil else x :: dup(x, n - 1)
             推測
dup(“three”, 3)
 dupはこのような形で呼び出し可能
自分は、どこでなら型推論が働くのか、あまり把
握できてません。コンパイラの奴隷です。
implicit
 暗黙的にメソッド引数を補完
   引数が足りなくても、implicit宣言した値を探し出し
   てきて勝手に補完してくれる
def method[A](x: List[A])(implicit y: Param[A]) {
  println(x); println(y)
}
abstract class Param[A]
  implicit object IntParam extends Param[Int]
  implicit object StringParam extends Param[String]
method(List(1,2,3)) <= IntParamを補完
method(List(“a”, “b”, “c”)) <= StringParamを補完
implicit
 暗黙的に型変換(というより、型をラップ)
   C#の拡張メソッドのようなことができる

class Factorizer(x: Int) {
  def fact(n: Int): BigInt =
        if (n == 0) 1 else fact(n-1) * n
  def ! = fact(x)
}
implicit def int2fact(n: Int) = new Factorizer(n)
println(10!)
擬似ダックタイピング
Structured Typesという機能で可能に

def method[R <: {def close : Unit}](r: R) = { …

「def close : Unit」をメンバに持つオブジェクトで
あればなんでもOK
もちろんここでも(r: R)から型推論される
ネストしたメソッド
メソッド内にメソッドを定義可能
 定義されたメソッドは、外側のメソッドのローカル変
 数を参照できる
def outer {
  val innervalue = “hello.”
  def inner() = {
    println(innervalue)
  }
  inner()
}
カリー化や、その他高階関数で使ったりする
高階関数・匿名関数
関数を返す関数や、関数を引数に取る関数
  クロージャ、カリー化の基盤になる
  無名関数も作ることが出来る
  例:有名なやつ
abstract class List[A] { ...
def map[B](f: A => B): List[B] = this match {
  case Nil => this
  case x :: xs => f(x) :: xs.map(f)
}

xs map (x => x * x)
カリー化
関数の引数を部分的に渡すことで、引数が部分
的に適用された関数を作ることができる
  関数内でバリエーションを扱える
関数をカリー化可能な形式にする必要あり

 def func(x: Int, y: Int, z: Int): Int = {x + y + z}
                            Function.carried(func _)
                            (func _).carry
def func(x: Int)(y: Int)(z: Int): Int = {x + y + z}
カリー化
簡単な例:
val newfunc = func(1)(2)
newfunc(3) // => 6
Newfunc(5) // => 8
遅延評価
Scalaでは、引数の評価タイミングを選ぶことが
出来る
 Call by Value(Javaとか)
   def func(x: Int) =…
 Call by Name(Haskellとか)
   def func(x: => Int) =…
   呼び出される側には、未評価のブロックが渡ってくる
 関数渡し
   def func(x: () => Int) = …
   関数がわたってくる
   実質的にはCall by Nameと同じ
遅延評価
変数初期化式の評価タイミングも選べる
  lazy val = DB.hogeTable.selectAll
  valが最初に評価されるまで、SELECTは行われない


フィボナッチ数列の無限リスト
lazy val fib: Stream[Int] =
 Stream.cons(0,
  Stream.cons(1,
   fib.zip(fib.tail).map(p => p._1 + p._2)))
モナド
List、Stream、Map、Optionなどはモナドとして
構成されている
For-ComprehensionはList内包表記ではなくモ
ナド操作用構文
 For-Comprehensionが正常に動作するためには
   map[B] (f: A => B) : M[B]
   flatMap[B] (f: A => M[B]) :M[B]
   unit[A] : M[A]
 これらが存在し、モナド則(Monadic Law)を満たす
 必要がある
Real World Scala
AOP
traitを使うことでそれっぽいことが実現可能
  インスタンス単位でtraitを付加できることを利用する

val enhanced = new Target with AroundAdvice

  内部的には、traitを付加したインスタンスごとに個
  別にクラスを生成している
  DIと組み合わせれば効果的なのはJavaと同じ
実行時に織り込むタイプのAOPフレームワーク
も使える
DI
 Mix-InとSelf-Type Annotationでそれっぽいも
 のが実現可能
    Self-Type Annotationとは、Mix-inされ、インスタン
    ス化される際の型を指定できる機能
 trait SomeTrait {
   this: SomeClass =>
   …
 既存のDIコンテナも使えるけど、相性もある
     Scalaだとフィールド定義できないとか
     setter/getterがスタイルにあわないとか
ライブラリ
Scala-Library
  不変コレクション
  Actor
  パーサコンビネータ
  …
Actorモデル
動作モデル                send async messages                 Actor
                                           M   address

                              create

    M   address
                  Actor                 共有領域は持たない
                                       必要な情報はメッセージで
                          M

                                       M
                                                         Actor
                                               address
           send async messages
なんかこんなかんじ
詳しく知りたければWikipediaにリンクされてる論文読んで

scala.actorsパッケージでこのモデルをサポート
scala.actors
 scala.actors.Actor



                        Actorオブジェクト

              mailbox
   M
       send
              M       M      M        処理
                             act
Actorフレームワーク
ThreadとActorの関係
 Actorオブジェクトに割り当てられる「わけではない」
 メッセージ駆動の処理に「都度」割り当てられる

                      Actorオブジェクト

            mailbox
 M
     send
            M     M         M       処理
                           act
Actorフレームワーク
Threadの割り当てはSchedulerが行う
                        Scheduler



                      Actorオブジェクト

            mailbox
 M
     send
            M     M         M       処理
                           act
Actorフレームワーク
スレッド依存版(receive/wait)



       mailbox    メッセージ取得




                            Thread
         M
                 ブロック!

     メッセージなし
Actorフレームワーク
スレッド非依存版(react)

          mailbox   1. メッセージ取得

            M




                                 Thread
メッセージなし

                    2. 処理保存
            処理

                    3. 例外スローにより終了
Actorフレームワーク
スレッド非非依存版(react)
                                       3. 再開

                        mailbox
                1. 送信
         send              M      4. メッセージ取得
Thread




                                               Thread
                                    5. 処理実行
          2. 処理取得         処理
【恒例】デモ「悟空vsフリーザ」【行事】
悟空とフリーザを戦わせてみた




           VS
       Korea      Japan
パーサコンビネータ
 Scala標準の構文解析ライブラリ群
    字句解析してくれるあたり
expr ::= term {'+' term | '-' term}
term ::= factor {'*' factor | '/' factor}
factor ::= floatingPointNumber | '(' expr ')'

object ArithParser extends JavaTokenParsers {
  def expr: Parser[Any] = term ~ rep(quot;+quot;~term | quot;-quot;~term)
  def term : Parser[Any] = factor ~ rep(quot;*quot;~factor | quot;/quot;~factor)
  def factor : Parser[Any] = floatingPointNumber | quot;(quot;~expr~quot;)“
  def parse(text : String) = { parseAll(expr, text) }
}
ライブラリ
Scala-Dbc
  ScalaでSQLライクに書けるモノらしい
  ドキュメント皆無 Webにも情報皆無
  評判悪
ライブラリ
Scala-Swing
  Scala標準ライブラリの1つ
    デフォルトのアプリケーションモデルを提供
      基本的な画面構造をあらかじめ定義
        (Simple)GUIApplication
    イベントモデルの修正
      Event Publisher/Subscriber
      イベントハンドラが色んなコンポーネントを知らなくて良い
  Swingを利用したプレゼンテーション用言語内DSLと
  も見ることができる
    リテラルライクな画面構築
    ちょっとだけ宣言的に書いている気になれる
ライブラリ
 Scala-Swing
object SwingApp extends SimpleGUIApplication {
  def top = new MainFrame {
    title = “SwingApp”; var numclicks = 0
    object label extends Label {
      text = “Number:” + quot;0 quot;
      listenTo(button)
      reactions += {
        case ButtonClicked(button) =>numclicks = numclicks + 1
        text = “Number:” + numclicks
      }
    }
    object button extends Button { text = quot;I am a buttonquot; }
    contents = new FlowPanel { contents.append(button, label) }
  }
}                                        Scala勉強会@札幌より引用
フレームワーク
Lift
  Servletで動作するフルスタックWebフレームワーク
  Railsライクな開発スタイル
       Maven2のプラグインで実現
       内部はRailsと同じく黒魔法、実際の学習コストは高め
  非同期系のサポート
       Ajaxサポート、jQuery同梱
       ActorによるCometのサポート
  共通機能
       SiteMapやACLの組み込み
       設定はコードで
フレームワーク
Lift
  View
       XMLリテラルによるViewの記述
       ControllerではなくView中心、ViewHelperの組み合わせ
       みたいな感じ
  ORM
       ARみたいな標準ORMあり
       Djangoとかいうのに似た機能もあるらしい
フレームワーク
Liftのアーキテクチャ
             登録
                       フック                        REST
Boot                   URLリライト
                                                  Comet
               early

              Lift                                  Ajax

                         dispatch
    呼び出し     Rules

 Lift       Lift                      Lift        Snippet         Model
Filter     Servlet                  Session        Snippet         Model

                                                       Template
    生成         Request                                 XHTML
                State                         S

           http://liftweb.net/index.php/How_lift_processes_HTTP_requests
フレームワーク
Form仕様は意味不明                                       input text
                                form.html
 Menu                                              submit
 画面                       1-2.refer
         1-1./form.html                              1-4.register
                              1-3.instanciate
                     Lift                show   Snippet
                                                   2-3.値取得
Form画面                                          Handler
                               2-2.execute
        2-1.submit            2-4.instanciate
                     Lift                show   Snippet
フレームワーク
Lift
  ざっとさわってみて
       レイヤの感覚は希薄、model.toFormがHTMLタグ返す
       APIが直感的ではない
         Ajax、CometはまぁOK
         Formが使いづらすぎる
       ドキュメントなさすぎ、古すぎ
       最新のScalaに対応してない(2008.11.21現在)
フレームワーク
Web Flavor
 ぶっちゃけて言えば、Scala版JSP
 Servlet/JSPコンテナ上のScala(Java)アプリとして
 JSPコンテナを実装しているようなイメージ
 XMLリテラルでPHP的なテンプレートエンジンを構成
 リクエスト発生時にScalaソースコードをコンパイルし
 て実行、表示
フレームワーク
Web Flavor
 POHPでHTMLテンプレート的な構成も可能に
   <span flavor:id=“xxx”>
 事前に全コンパイルし、通常のJavaWebアーカイブ
 としても配布可能に


  手軽にWebアプリを作るには結構便利

XMLリテラル以外にScalaっぽい要素は少ない
補:SAStruts
 出来心で使ってみた。
 CoC的なFWはラップしないと使いづらい
 Scalaコンパイラが生成するバイトコードのスタイ
 ルはScalaプログラムが直接コントロールできな
 いため
  フレームワークにあわせようとするとScala的なプロ
  グラミングスタイルから逸脱する
  Scalaプログラミングスタイルにあわせるとフレーム
  ワークが動かない
Scalaのよさそうなところ
簡略記法による軽量な開発
副作用排除による品質の向上
わりと速い(Javaとあまりかわらない)
Javaとの相互運用性は高い
 Scala=>Javaはほぼ問題なし
 Java=>Scalaは注意が必要
 Better Javaとして使うには十分なレベル
Actorその他で並列処理が得意
 並列処理のAP基盤開発には良さげ
Scalaのよさそうなところ
DSLが作りやすそう
 言語機能との区別がつきづらいような記述が可能
  リテラルもどき
  制御構文もどき
  Caseクラス
 パーサコンビネータ
Scalaのなんかいまいちなところ
開発環境はイマイチ
 Eclipseプラグインはエラーの嵐、Javaレベルは遠い
Scalaの長所を生かしきったFWが少ない
関数型のわかりづらさとカオスな言語仕様があ
いまって、読めない人続出の予感
もう意味がよくわからない例
Scalaの制御構文?
object TargetTest2 extends Application {
  var i = 10
  loop {
    println(quot;i = quot; + i) i -= 1
  } unless (i == 0)
}
もう意味がよくわからない例
いいえ、メソッドです。
object TargetTest2 extends Application {
  def loop(body: => Unit): LoopUnlessCond =
       new LoopUnlessCond(body)
  protected class LoopUnlessCond(body: => Unit) {
    def unless(cond: => Boolean) {
      body if (!cond) unless(cond)
    }
  }
}
なぜそうなる
List構築の際の一般的な書き方

val list = List(“First”, “Second”, “Third”)

これは何?Listクラスの特別な構文か何か?
なぜそうなる
 いいえ、Listオブジェクトです。

object List {
 def apply[A](xs: A*): List[A] = xs.toList
…
sealed abstract class List[+A] extends Seq[A] {
…
なぜそうなる
Streamを構築する際の一般的な書式は

Stream.cons(1, Stream.cons(2, Stream.Empty))

Streamクラス?いやいや、違うはず。
Streamオブジェクトのconsメソッドだよね。
なぜそうなる
Streamオブジェクトの内部オブジェクトである「
cons」のapplyメソッドです。
object Stream {
 object cons {
  def apply[A](hd: A, tl: => Stream[A]) =
   new Stream[A] {
    override def hasDefiniteSize =
     if (tlDefined) tlVal.hasDefiniteSize
     else super.hasDefiniteSize
…
}
言語内DSLへの道
このようなよくわからない構文を使うと、言語内
DSLへの道が開けます
  implicitもあわせると効果抜群、意味不明

 val con = new FooConnection
 using(con) { c =>
   c.doSomething
 }
さわってみた印象

   しょせんJavaだから
 とか思ってなめてかかると
    痛い目にあう
というか意味がわからなくなる
                 なった
さわってみた印象



 JavaScriptやRubyを超える
     カオスさに好印象
ありがとうございました



   何か質問があれば

Contenu connexe

Tendances

JavaScriptでオブジェクト指向(Javascript/OOP)
JavaScriptでオブジェクト指向(Javascript/OOP)JavaScriptでオブジェクト指向(Javascript/OOP)
JavaScriptでオブジェクト指向(Javascript/OOP)smzk
 
Horm Glin Samana
Horm Glin SamanaHorm Glin Samana
Horm Glin Samanawnpp web
 
Hr 032 資訊系進路圖
Hr 032 資訊系進路圖Hr 032 資訊系進路圖
Hr 032 資訊系進路圖handbook
 
主管就要懂管理--試讀本
主管就要懂管理--試讀本主管就要懂管理--試讀本
主管就要懂管理--試讀本cml745
 
Web技術勉強会11回目
Web技術勉強会11回目Web技術勉強会11回目
Web技術勉強会11回目龍一 田中
 
Doo Jit Dton Phon Buang Mara
Doo Jit Dton Phon Buang MaraDoo Jit Dton Phon Buang Mara
Doo Jit Dton Phon Buang Marawnpp web
 
胸腔胃-气道瘘:经鼻空肠营养管和胃减压管置入治疗--申
胸腔胃-气道瘘:经鼻空肠营养管和胃减压管置入治疗--申胸腔胃-气道瘘:经鼻空肠营养管和胃减压管置入治疗--申
胸腔胃-气道瘘:经鼻空肠营养管和胃减压管置入治疗--申baiyunguofeng
 
CEO-020-領導的意義Ok
CEO-020-領導的意義OkCEO-020-領導的意義Ok
CEO-020-領導的意義Okhandbook
 
資工所考試密技說明會
資工所考試密技說明會資工所考試密技說明會
資工所考試密技說明會Mu Chun Wang
 
悟透Javascript
悟透Javascript悟透Javascript
悟透JavascriptDoCode org
 
CEO-022-領導統御的基本概念
CEO-022-領導統御的基本概念CEO-022-領導統御的基本概念
CEO-022-領導統御的基本概念handbook
 
Ohp Seijoen H20 03 Seigyobun
Ohp Seijoen H20 03 SeigyobunOhp Seijoen H20 03 Seigyobun
Ohp Seijoen H20 03 Seigyobunsesejun
 
PXI, LabVIEW事例集2
PXI, LabVIEW事例集2PXI, LabVIEW事例集2
PXI, LabVIEW事例集2nishimizu
 
25000社以上採用計測ソリューション
25000社以上採用計測ソリューション25000社以上採用計測ソリューション
25000社以上採用計測ソリューションnishimizu
 
PHPカンファレンス2009 - 45分で分かる安全なWebアプリケーション開発のための発注・要件・検収
PHPカンファレンス2009 - 45分で分かる安全なWebアプリケーション開発のための発注・要件・検収PHPカンファレンス2009 - 45分で分かる安全なWebアプリケーション開発のための発注・要件・検収
PHPカンファレンス2009 - 45分で分かる安全なWebアプリケーション開発のための発注・要件・検収Hiroshi Tokumaru
 
新生說明會_slide
新生說明會_slide新生說明會_slide
新生說明會_slideMu Chun Wang
 

Tendances (20)

JavaScriptでオブジェクト指向(Javascript/OOP)
JavaScriptでオブジェクト指向(Javascript/OOP)JavaScriptでオブジェクト指向(Javascript/OOP)
JavaScriptでオブジェクト指向(Javascript/OOP)
 
Intro. to CSS
Intro. to CSSIntro. to CSS
Intro. to CSS
 
Samit01 Python
Samit01 PythonSamit01 Python
Samit01 Python
 
Horm Glin Samana
Horm Glin SamanaHorm Glin Samana
Horm Glin Samana
 
Hr 032 資訊系進路圖
Hr 032 資訊系進路圖Hr 032 資訊系進路圖
Hr 032 資訊系進路圖
 
Thirukkural
ThirukkuralThirukkural
Thirukkural
 
主管就要懂管理--試讀本
主管就要懂管理--試讀本主管就要懂管理--試讀本
主管就要懂管理--試讀本
 
Web技術勉強会11回目
Web技術勉強会11回目Web技術勉強会11回目
Web技術勉強会11回目
 
Doo Jit Dton Phon Buang Mara
Doo Jit Dton Phon Buang MaraDoo Jit Dton Phon Buang Mara
Doo Jit Dton Phon Buang Mara
 
胸腔胃-气道瘘:经鼻空肠营养管和胃减压管置入治疗--申
胸腔胃-气道瘘:经鼻空肠营养管和胃减压管置入治疗--申胸腔胃-气道瘘:经鼻空肠营养管和胃减压管置入治疗--申
胸腔胃-气道瘘:经鼻空肠营养管和胃减压管置入治疗--申
 
CEO-020-領導的意義Ok
CEO-020-領導的意義OkCEO-020-領導的意義Ok
CEO-020-領導的意義Ok
 
資工所考試密技說明會
資工所考試密技說明會資工所考試密技說明會
資工所考試密技說明會
 
悟透Javascript
悟透Javascript悟透Javascript
悟透Javascript
 
CEO-022-領導統御的基本概念
CEO-022-領導統御的基本概念CEO-022-領導統御的基本概念
CEO-022-領導統御的基本概念
 
GLT#13 Naruhiko Ogasawara
GLT#13 Naruhiko OgasawaraGLT#13 Naruhiko Ogasawara
GLT#13 Naruhiko Ogasawara
 
Ohp Seijoen H20 03 Seigyobun
Ohp Seijoen H20 03 SeigyobunOhp Seijoen H20 03 Seigyobun
Ohp Seijoen H20 03 Seigyobun
 
PXI, LabVIEW事例集2
PXI, LabVIEW事例集2PXI, LabVIEW事例集2
PXI, LabVIEW事例集2
 
25000社以上採用計測ソリューション
25000社以上採用計測ソリューション25000社以上採用計測ソリューション
25000社以上採用計測ソリューション
 
PHPカンファレンス2009 - 45分で分かる安全なWebアプリケーション開発のための発注・要件・検収
PHPカンファレンス2009 - 45分で分かる安全なWebアプリケーション開発のための発注・要件・検収PHPカンファレンス2009 - 45分で分かる安全なWebアプリケーション開発のための発注・要件・検収
PHPカンファレンス2009 - 45分で分かる安全なWebアプリケーション開発のための発注・要件・検収
 
新生說明會_slide
新生說明會_slide新生說明會_slide
新生說明會_slide
 

Scala Study Session