Suche senden
Hochladen
再帰で脱Javaライク
•
5 gefällt mir
•
3,057 views
TIS Inc.
Folgen
「実戦での Scala 〜 6つの事例から知る Scala の勘所〜」でLTしました。
Weniger lesen
Mehr lesen
Ingenieurwesen
Melden
Teilen
Melden
Teilen
1 von 30
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
Typesafe Reactive Platformで作るReactive System入門
Typesafe Reactive Platformで作るReactive System入門
TIS Inc.
Typesafe Reactive Platformで作るReactive System
Typesafe Reactive Platformで作るReactive System
TIS Inc.
10分で分かるリアクティブシステム
10分で分かるリアクティブシステム
TIS Inc.
AWS Ops系サービスが更に便利になる中、それでもなおZabbixとセットで考えたほうが良いのか?
AWS Ops系サービスが更に便利になる中、それでもなおZabbixとセットで考えたほうが良いのか?
Daisuke Ikeda
Cloud Days Tokyo 2015 "オンプレミス環境のクラウド化と運用を楽にする OpenStack ソリューション ~ハイブリッド・クラウドを...
Cloud Days Tokyo 2015 "オンプレミス環境のクラウド化と運用を楽にする OpenStack ソリューション ~ハイブリッド・クラウドを...
Shinichiro Arai
Spring social の基礎
Spring social の基礎
Takuya Iwatsuka
JobScheduler ユーザカンファレンス 2016 東京日産コンピュータシステム様 事例紹介
JobScheduler ユーザカンファレンス 2016 東京日産コンピュータシステム様 事例紹介
Daisuke Ikeda
リアクティブシステムとAkka
リアクティブシステムとAkka
TIS Inc.
Empfohlen
Typesafe Reactive Platformで作るReactive System入門
Typesafe Reactive Platformで作るReactive System入門
TIS Inc.
Typesafe Reactive Platformで作るReactive System
Typesafe Reactive Platformで作るReactive System
TIS Inc.
10分で分かるリアクティブシステム
10分で分かるリアクティブシステム
TIS Inc.
AWS Ops系サービスが更に便利になる中、それでもなおZabbixとセットで考えたほうが良いのか?
AWS Ops系サービスが更に便利になる中、それでもなおZabbixとセットで考えたほうが良いのか?
Daisuke Ikeda
Cloud Days Tokyo 2015 "オンプレミス環境のクラウド化と運用を楽にする OpenStack ソリューション ~ハイブリッド・クラウドを...
Cloud Days Tokyo 2015 "オンプレミス環境のクラウド化と運用を楽にする OpenStack ソリューション ~ハイブリッド・クラウドを...
Shinichiro Arai
Spring social の基礎
Spring social の基礎
Takuya Iwatsuka
JobScheduler ユーザカンファレンス 2016 東京日産コンピュータシステム様 事例紹介
JobScheduler ユーザカンファレンス 2016 東京日産コンピュータシステム様 事例紹介
Daisuke Ikeda
リアクティブシステムとAkka
リアクティブシステムとAkka
TIS Inc.
開発組織を急成長させる AWS 〜 Opt Technologies の歩みと AWS 活用
開発組織を急成長させる AWS 〜 Opt Technologies の歩みと AWS 活用
Jiro Hiraiwa
第8回oss運用管理勉強会 Zabbix入門&Zabbix3.0先取り紹介
第8回oss運用管理勉強会 Zabbix入門&Zabbix3.0先取り紹介
Daisuke Ikeda
Ansible・ServerspecベースのOSS開発のCIの成功・失敗談
Ansible・ServerspecベースのOSS開発のCIの成功・失敗談
光平 八代
Ansible・Serverspecベースの自動化フレームワークSHIFT wareの紹介
Ansible・Serverspecベースの自動化フレームワークSHIFT wareの紹介
光平 八代
可用性を突き詰めたリアクティブシステム
可用性を突き詰めたリアクティブシステム
TIS Inc.
SIOS iQ:機械学習 I T O A VMware仮想環境の性能問題の原因分析 迅速な問題解決と未然防止を実現
SIOS iQ:機械学習 I T O A VMware仮想環境の性能問題の原因分析 迅速な問題解決と未然防止を実現
softlayerjp
Spring I/O 2015 報告
Spring I/O 2015 報告
Takuya Iwatsuka
AWS Summit Tokyo 2015_NTTデータセッション(後半:AWSを使ったシステム運用ノウハウ)
AWS Summit Tokyo 2015_NTTデータセッション(後半:AWSを使ったシステム運用ノウハウ)
Hinemos
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)
Hinemos
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
Daisuke Ikeda
OSC2018Tokyo/Fall 自律的運用に向けた第一歩(OpsBear取り組み紹介)
OSC2018Tokyo/Fall 自律的運用に向けた第一歩(OpsBear取り組み紹介)
Daisuke Ikeda
Spring I/O 2017 報告 ThymeleafのWebFlux対応
Spring I/O 2017 報告 ThymeleafのWebFlux対応
Takuya Iwatsuka
AZAREA-Clusterセミナー(クラウドEXPO2013春)
AZAREA-Clusterセミナー(クラウドEXPO2013春)
AzareaCluster
20210427_Introducing_X-TechJAWS
20210427_Introducing_X-TechJAWS
Typhon 666
バッチソリューションAzarea cluster 2016
バッチソリューションAzarea cluster 2016
AzareaCluster
170311 JAWS days 2017 fintech
170311 JAWS days 2017 fintech
Toshihide Atsumi
OpenStack環境の継続的インテグレーション
OpenStack環境の継続的インテグレーション
エクイニクス・ジャパン
ぜんぜんスマートじゃないプライベートクラウドの現実 - 運用担当者が苦労する4つの問題と3つの救済策
ぜんぜんスマートじゃないプライベートクラウドの現実 - 運用担当者が苦労する4つの問題と3つの救済策
エクイニクス・ジャパン
アメーバブログを支えるデータセンターとインフラ技術
アメーバブログを支えるデータセンターとインフラ技術
Hiroki NAKASHIMA
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ
エクイニクス・ジャパン
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
Yuta Okamoto
実戦でのScala LT 2015.2.21
実戦でのScala LT 2015.2.21
Junichi Okamura
Weitere ähnliche Inhalte
Was ist angesagt?
開発組織を急成長させる AWS 〜 Opt Technologies の歩みと AWS 活用
開発組織を急成長させる AWS 〜 Opt Technologies の歩みと AWS 活用
Jiro Hiraiwa
第8回oss運用管理勉強会 Zabbix入門&Zabbix3.0先取り紹介
第8回oss運用管理勉強会 Zabbix入門&Zabbix3.0先取り紹介
Daisuke Ikeda
Ansible・ServerspecベースのOSS開発のCIの成功・失敗談
Ansible・ServerspecベースのOSS開発のCIの成功・失敗談
光平 八代
Ansible・Serverspecベースの自動化フレームワークSHIFT wareの紹介
Ansible・Serverspecベースの自動化フレームワークSHIFT wareの紹介
光平 八代
可用性を突き詰めたリアクティブシステム
可用性を突き詰めたリアクティブシステム
TIS Inc.
SIOS iQ:機械学習 I T O A VMware仮想環境の性能問題の原因分析 迅速な問題解決と未然防止を実現
SIOS iQ:機械学習 I T O A VMware仮想環境の性能問題の原因分析 迅速な問題解決と未然防止を実現
softlayerjp
Spring I/O 2015 報告
Spring I/O 2015 報告
Takuya Iwatsuka
AWS Summit Tokyo 2015_NTTデータセッション(後半:AWSを使ったシステム運用ノウハウ)
AWS Summit Tokyo 2015_NTTデータセッション(後半:AWSを使ったシステム運用ノウハウ)
Hinemos
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)
Hinemos
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
Daisuke Ikeda
OSC2018Tokyo/Fall 自律的運用に向けた第一歩(OpsBear取り組み紹介)
OSC2018Tokyo/Fall 自律的運用に向けた第一歩(OpsBear取り組み紹介)
Daisuke Ikeda
Spring I/O 2017 報告 ThymeleafのWebFlux対応
Spring I/O 2017 報告 ThymeleafのWebFlux対応
Takuya Iwatsuka
AZAREA-Clusterセミナー(クラウドEXPO2013春)
AZAREA-Clusterセミナー(クラウドEXPO2013春)
AzareaCluster
20210427_Introducing_X-TechJAWS
20210427_Introducing_X-TechJAWS
Typhon 666
バッチソリューションAzarea cluster 2016
バッチソリューションAzarea cluster 2016
AzareaCluster
170311 JAWS days 2017 fintech
170311 JAWS days 2017 fintech
Toshihide Atsumi
OpenStack環境の継続的インテグレーション
OpenStack環境の継続的インテグレーション
エクイニクス・ジャパン
ぜんぜんスマートじゃないプライベートクラウドの現実 - 運用担当者が苦労する4つの問題と3つの救済策
ぜんぜんスマートじゃないプライベートクラウドの現実 - 運用担当者が苦労する4つの問題と3つの救済策
エクイニクス・ジャパン
アメーバブログを支えるデータセンターとインフラ技術
アメーバブログを支えるデータセンターとインフラ技術
Hiroki NAKASHIMA
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ
エクイニクス・ジャパン
Was ist angesagt?
(20)
開発組織を急成長させる AWS 〜 Opt Technologies の歩みと AWS 活用
開発組織を急成長させる AWS 〜 Opt Technologies の歩みと AWS 活用
第8回oss運用管理勉強会 Zabbix入門&Zabbix3.0先取り紹介
第8回oss運用管理勉強会 Zabbix入門&Zabbix3.0先取り紹介
Ansible・ServerspecベースのOSS開発のCIの成功・失敗談
Ansible・ServerspecベースのOSS開発のCIの成功・失敗談
Ansible・Serverspecベースの自動化フレームワークSHIFT wareの紹介
Ansible・Serverspecベースの自動化フレームワークSHIFT wareの紹介
可用性を突き詰めたリアクティブシステム
可用性を突き詰めたリアクティブシステム
SIOS iQ:機械学習 I T O A VMware仮想環境の性能問題の原因分析 迅速な問題解決と未然防止を実現
SIOS iQ:機械学習 I T O A VMware仮想環境の性能問題の原因分析 迅速な問題解決と未然防止を実現
Spring I/O 2015 報告
Spring I/O 2015 報告
AWS Summit Tokyo 2015_NTTデータセッション(後半:AWSを使ったシステム運用ノウハウ)
AWS Summit Tokyo 2015_NTTデータセッション(後半:AWSを使ったシステム運用ノウハウ)
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
OSC2018Tokyo/Fall 自律的運用に向けた第一歩(OpsBear取り組み紹介)
OSC2018Tokyo/Fall 自律的運用に向けた第一歩(OpsBear取り組み紹介)
Spring I/O 2017 報告 ThymeleafのWebFlux対応
Spring I/O 2017 報告 ThymeleafのWebFlux対応
AZAREA-Clusterセミナー(クラウドEXPO2013春)
AZAREA-Clusterセミナー(クラウドEXPO2013春)
20210427_Introducing_X-TechJAWS
20210427_Introducing_X-TechJAWS
バッチソリューションAzarea cluster 2016
バッチソリューションAzarea cluster 2016
170311 JAWS days 2017 fintech
170311 JAWS days 2017 fintech
OpenStack環境の継続的インテグレーション
OpenStack環境の継続的インテグレーション
ぜんぜんスマートじゃないプライベートクラウドの現実 - 運用担当者が苦労する4つの問題と3つの救済策
ぜんぜんスマートじゃないプライベートクラウドの現実 - 運用担当者が苦労する4つの問題と3つの救済策
アメーバブログを支えるデータセンターとインフラ技術
アメーバブログを支えるデータセンターとインフラ技術
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ
Andere mochten auch
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
Yuta Okamoto
実戦でのScala LT 2015.2.21
実戦でのScala LT 2015.2.21
Junichi Okamura
Rx入門
Rx入門
Takaaki Suzuki
Scala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscala
Kazuhiro Sera
Reactive extensions入門v0.1
Reactive extensions入門v0.1
一希 大田
Scala@SmartNews_20150221
Scala@SmartNews_20150221
Shigekazu Takei
Scala@SmartNews AdFrontend を Scala で書いた話
Scala@SmartNews AdFrontend を Scala で書いた話
Keiji Muraishi
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
takezoe
Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話
Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話
LINE Corporation
未来のプログラミング技術をUnityで -UniRx-
未来のプログラミング技術をUnityで -UniRx-
torisoup
Reactive Programming in Java 8 with Rx-Java
Reactive Programming in Java 8 with Rx-Java
Kasun Indrasiri
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuri
Yuta Okamoto
Andere mochten auch
(12)
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
実戦でのScala LT 2015.2.21
実戦でのScala LT 2015.2.21
Rx入門
Rx入門
Scala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscala
Reactive extensions入門v0.1
Reactive extensions入門v0.1
Scala@SmartNews_20150221
Scala@SmartNews_20150221
Scala@SmartNews AdFrontend を Scala で書いた話
Scala@SmartNews AdFrontend を Scala で書いた話
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話
Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話
未来のプログラミング技術をUnityで -UniRx-
未来のプログラミング技術をUnityで -UniRx-
Reactive Programming in Java 8 with Rx-Java
Reactive Programming in Java 8 with Rx-Java
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuri
Ähnlich wie 再帰で脱Javaライク
PHPコアから読み解くPHP5.5
PHPコアから読み解くPHP5.5
Yahoo!デベロッパーネットワーク
インメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギ
Masaki Yamakawa
Aerospike deep dive LDTs
Aerospike deep dive LDTs
Masaki Toyoshima
20120317 IT系勉強会 in 神戸
20120317 IT系勉強会 in 神戸
Takahiro Iwase
Perl 非同期プログラミング
Perl 非同期プログラミング
lestrrat
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
Ouka Yuka
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由
Ransui Iso
Gorinphp0729
Gorinphp0729
akitsukada
Gorinphp0729
Gorinphp0729
akitsukada
ぱっと見でわかるC++11
ぱっと見でわかるC++11
えぴ 福田
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
Shin-ya Koga
SwiftでRiemann球面を扱う
SwiftでRiemann球面を扱う
hayato iida
Arduinoでプログラミングに触れてみよう 続編
Arduinoでプログラミングに触れてみよう 続編
Hiromu Yakura
Scalaで型クラス入門
Scalaで型クラス入門
Makoto Fukuhara
大江戸Ruby会議01 "mission critical"なシステムでも使えるThreadの作り方
大江戸Ruby会議01 "mission critical"なシステムでも使えるThreadの作り方
Mayumi Emori
ATN No.2 Scala事始め
ATN No.2 Scala事始め
AdvancedTechNight
197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング
Net Penguin
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
bitter_fox
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
Ransui Iso
Javascript入門-デジタル時計を作りながらJavaScriptを学ぼう-
Javascript入門-デジタル時計を作りながらJavaScriptを学ぼう-
Yossy Taka
Ähnlich wie 再帰で脱Javaライク
(20)
PHPコアから読み解くPHP5.5
PHPコアから読み解くPHP5.5
インメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギ
Aerospike deep dive LDTs
Aerospike deep dive LDTs
20120317 IT系勉強会 in 神戸
20120317 IT系勉強会 in 神戸
Perl 非同期プログラミング
Perl 非同期プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由
Gorinphp0729
Gorinphp0729
Gorinphp0729
Gorinphp0729
ぱっと見でわかるC++11
ぱっと見でわかるC++11
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
SwiftでRiemann球面を扱う
SwiftでRiemann球面を扱う
Arduinoでプログラミングに触れてみよう 続編
Arduinoでプログラミングに触れてみよう 続編
Scalaで型クラス入門
Scalaで型クラス入門
大江戸Ruby会議01 "mission critical"なシステムでも使えるThreadの作り方
大江戸Ruby会議01 "mission critical"なシステムでも使えるThreadの作り方
ATN No.2 Scala事始め
ATN No.2 Scala事始め
197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
Javascript入門-デジタル時計を作りながらJavaScriptを学ぼう-
Javascript入門-デジタル時計を作りながらJavaScriptを学ぼう-
Mehr von TIS Inc.
AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現
AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現
TIS Inc.
Reactive Systems that focus on High Availability with Lerna
Reactive Systems that focus on High Availability with Lerna
TIS Inc.
Starting Reactive Systems with Lerna #reactive_shinjuku
Starting Reactive Systems with Lerna #reactive_shinjuku
TIS Inc.
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
TIS Inc.
Akkaの並行性
Akkaの並行性
TIS Inc.
JavaからAkkaハンズオン
JavaからAkkaハンズオン
TIS Inc.
Akka in Action workshop #ScalaMatsuri 2018
Akka in Action workshop #ScalaMatsuri 2018
TIS Inc.
Preparing for distributed system failures using akka #ScalaMatsuri
Preparing for distributed system failures using akka #ScalaMatsuri
TIS Inc.
Akkaで実現するステートフルでスケーラブルなアーキテクチャ
Akkaで実現するステートフルでスケーラブルなアーキテクチャ
TIS Inc.
akka-doc-ja
akka-doc-ja
TIS Inc.
Effective Akka読書会2
Effective Akka読書会2
TIS Inc.
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
TIS Inc.
甲賀流Jenkins活用術
甲賀流Jenkins活用術
TIS Inc.
Mehr von TIS Inc.
(13)
AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現
AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現
Reactive Systems that focus on High Availability with Lerna
Reactive Systems that focus on High Availability with Lerna
Starting Reactive Systems with Lerna #reactive_shinjuku
Starting Reactive Systems with Lerna #reactive_shinjuku
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
Akkaの並行性
Akkaの並行性
JavaからAkkaハンズオン
JavaからAkkaハンズオン
Akka in Action workshop #ScalaMatsuri 2018
Akka in Action workshop #ScalaMatsuri 2018
Preparing for distributed system failures using akka #ScalaMatsuri
Preparing for distributed system failures using akka #ScalaMatsuri
Akkaで実現するステートフルでスケーラブルなアーキテクチャ
Akkaで実現するステートフルでスケーラブルなアーキテクチャ
akka-doc-ja
akka-doc-ja
Effective Akka読書会2
Effective Akka読書会2
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
甲賀流Jenkins活用術
甲賀流Jenkins活用術
再帰で脱Javaライク
1.
Copyright © 2014
TIS Inc. All rights reserved. 再帰で 脱Javaライク 2015.2.21 TIS株式会社 前出祐吾
2.
Copyright © 2014
TIS Inc. All rights reserved. 2 自己紹介 TIS株式会社 戦略技術センター! 社内向けエンジニア基盤の整備 ▶ Scalaの活用検証! 甲賀忍者! 東京デビュー(先月)! @yugolf
3.
Copyright © 2014
TIS Inc. All rights reserved. 3 Scalaってどうなの? コード量が半分くらいに! ! とはいえ、Scalaって難しいんじゃないの? ! 大丈夫、Javaのライブラリ呼べるし、Javaライクにも書ける し。 (その場合、コード量は半分にならないけど。。) ! ん!?
4.
Copyright © 2014
TIS Inc. All rights reserved. 4 脱Javaライクしてファ ンクショナルなプロ グラマーになるんです。
5.
Copyright © 2014
TIS Inc. All rights reserved. 5 Javaライクってなんですの? 例:総和 1からnまでを全部足す。 ! (めいっ ぱい、 Javaっぽ く足す) def sowa(value: Int): Int ={ var result = 0; for(n <-‐ 1 to value) { result = result + n; } return result; } ! sowa(10) //> res4: Int = 55
6.
Copyright © 2014
TIS Inc. All rights reserved. 6 脱Javaライク varはやめよう。 forループもやめよう。 再帰にしよう。 ①終了条件 ②自分呼出 ③計算
7.
Copyright © 2014
TIS Inc. All rights reserved. 7 再帰にしよう:ステップ① def sowa(value: Int) :Int = if(value == 0) value else value + sowa(value -‐ 1) ①終了条件 ②自分呼出 ③計算 計算対象の数値が0に なったとき
8.
Copyright © 2014
TIS Inc. All rights reserved. 8 再帰にしよう:ステップ② def sowa(value: Int) :Int = if(value == 0) value else value + sowa(value -‐ 1) ①終了条件 ②自分呼出 ③計算 自分()
9.
Copyright © 2014
TIS Inc. All rights reserved. 9 再帰にしよう:ステップ③ def sowa(value: Int) :Int = if(value == 0) value else value + sowa(value -‐ 1) ①終了条件 ②自分呼出 ③計算 対象値 + 自分()
10.
Copyright © 2014
TIS Inc. All rights reserved. 10 再帰にしよう:実行1 def sowa(value: Int) :Int = if(value == 0) value else value + sowa(value -‐ 1) ①終了条件 ②自分呼出 ③計算 sowa(10) //> res6: Int = 55
11.
Copyright © 2014
TIS Inc. All rights reserved. 11 再帰にしよう:実行2 def sowa(value: Int) :Int = if(value == 0) value else value + sowa(value -‐ 1) sowa(100000) //> java.lang.StackOverflowError //| at Demo$$anonfun$main$1.sowa$1(Demo.scala:64) //| at Demo$$anonfun$main$1.sowa$1(Demo.scala:64) //| at Demo$$anonfun$main$1.sowa$1(Demo.scala:64) ①終了条件 ②自分呼出 ③計算
12.
Copyright © 2014
TIS Inc. All rights reserved. 12 スタックオーバーフロー!? スタックのサイズを大きくする? (-Xss) ! スタックの消費量を減らそう!
13.
Copyright © 2014
TIS Inc. All rights reserved. 13 スタックオーバーフロー対策 末尾再帰で最適化 ! ! ! ! 自分を呼び出したあとに計算(足し算)するのではなく、 計算したものを引数として、その結果を蓄積する。 ! 戻ってきたあとに計算がなく、呼出し元に戻るだけ。 def sowa(value: Int) :Int = if(value == 0) value else value + sowa(value -‐ 1)
14.
Copyright © 2014
TIS Inc. All rights reserved. 14 末尾再帰 アキュムレータ (accumulator) 自分を呼び出したあとに計算(足し算)するのではなく、 計算したものを引数として、その結果を蓄積する。 + 3 = + 2 = + 1 =
15.
Copyright © 2014
TIS Inc. All rights reserved. 15 末尾再帰 アキュムレータ (accumulator) 自分を呼び出したあとに計算(足し算)するのではなく、 計算したものを引数として、その結果を蓄積する。 ①終了条件 ②自分呼出 ③アキュムレータ による計算
16.
Copyright © 2014
TIS Inc. All rights reserved. 16 末尾再帰にしよう:ステップ① def sowa(value: Int, acc: Int = 0):Int = if(value == 0) acc else sowa(value - 1, value + acc) 計算対象の数値が0に なったとき ①終了条件 ②自分呼出 ③アキュムレータ による計算
17.
Copyright © 2014
TIS Inc. All rights reserved. 17 末尾再帰にしよう:ステップ② def sowa(value: Int, acc: Int = 0):Int = if(value == 0) acc else sowa(value - 1, value + acc) 自分() ①終了条件 ②自分呼出 ③アキュムレータ による計算
18.
Copyright © 2014
TIS Inc. All rights reserved. 18 末尾再帰にしよう:ステップ③ def sowa(value: Int, acc: Int = 0):Int = if(value == 0) acc else sowa(value - 1, value + acc) 対象値 + アキュム レータ ①終了条件 ②自分呼出 ③アキュムレータ による計算
19.
Copyright © 2014
TIS Inc. All rights reserved. 19 末尾再帰にしよう:実行 def sowa(value: Int, acc: Int = 0):Int = if(value == 0) acc else sowa(value - 1, value + acc) sowa(100000) //> res4: Long = 705082704 ①終了条件 ②自分呼出 ③アキュムレータ による計算
20.
Copyright © 2014
TIS Inc. All rights reserved. 20 逆アセンブル public final int sowa(int); Code: 0: iload_1 1: iconst_0 2: if_icmpne 9 5: iload_1 6: goto 18 9: iload_1 10: aload_0 11: iload_1 12: iconst_1 13: isub 14: invokevirtual #101 // Method sowa2:(I)I 17: iadd 18: ireturn public final int sowa(int, int); Code: 0: iload_1 1: iconst_0 2: if_icmpne 7 5: iload_2 6: ireturn 7: iload_1 8: iconst_1 9: isub 10: iload_1 11: iload_2 12: iadd 13: istore_2 14: istore_1 15: goto 0 ただの再帰 末尾再帰
21.
Copyright © 2014
TIS Inc. All rights reserved. 21 逆コンパイル public final int sowa(int value) { return value != 0 ? value + sowa(value - 1) : value; } def sowa(value: Int) :Int = if(value == 0) value else value + sowa(value -‐ 1) ただの再帰
22.
Copyright © 2014
TIS Inc. All rights reserved. 22 逆コンパイル public final int sowa(int value, int acc) { do { if (value == 0) return acc; acc = value + acc; value = value - 1; } while (true); } def sowa(value: Int, acc: Int = 0):Int = if(value == 0) acc else sowa(value -‐ 1, value + acc) 最適 化!! 末尾再帰
23.
Copyright © 2014
TIS Inc. All rights reserved. 23 tailrecアノテーション 末尾再帰になっていないメソッドの検出 import scala.annotation.tailrec @tailrec final def sowa(value: Int): Int = if (value == 0) value else value + sowa(value -‐ 1) could not optimize @tailrec annotated method sowa: it contains a recursive call not in tail position
24.
Copyright © 2014
TIS Inc. All rights reserved. 24 上書き禁止 @tailrec def sowa(value: Int, acc: Int = 0): Int = if (value == 0) acc else sowa(value -‐ 1, value + acc) @tailrec final def sowa(value: Int,… could not optimize @tailrec annotated method sowa: it is neither private nor final so can be overridden overrideしてメソッドを変更出来ないようにfinalにする privateにするか ローカルメソッドにしてもOK
25.
Copyright © 2014
TIS Inc. All rights reserved. 25 総和 def sowa(value: Int) :Int = if(value == 0) value else value + sowa(value -‐ 1) ノーアキュム @tailrec final def sowa(value: Int, acc: Int = 0): Int = if (value == 0) acc else sowa(value -‐ 1, value + acc) アキュム
26.
Copyright © 2014
TIS Inc. All rights reserved. 26 !(階乗) def factorial(value: Int): Int = if (value == 0) 1 else value * factorial(value -‐ 1) @tailrec final def factorial(value: Int, acc: Long): Long = if (value == 0) acc else factorial(value - 1, value * acc) ノーアキュム アキュム
27.
Copyright © 2014
TIS Inc. All rights reserved. 27 (おまけ)関数(計算式)を引数に def calculate[A](value: Int, acc: A, func: (Int, A) => A): A = { def calculate(value: Int, acc: A): A = if (value == 0) acc else calculate(value - 1, func(value, acc)) calculate(value, acc) } ! def factorial(value: Int) = calculate(value, 1L, (v: Int, acc: Long) => v * acc) ! def sowa(value: Int) = calculate(value, 0, (v: Int, acc: Int) => v + acc) 計算(たすか かけるか) 型(Int か Longか) 階乗 総和
28.
Copyright © 2014
TIS Inc. All rights reserved. 28 まとめ:脱Javaライクの第一歩 再帰で関数型プログラミング アキュムレータで末尾再帰 @tailrecで末尾かチェック ! 注) 間接的な再帰は最適化されません。
29.
Copyright © 2014
TIS Inc. All rights reserved. 29 よくわからなかった、という方は スライドの最初に再帰してくださ い。(コップ本より) まとめ:脱Javaライクの第一歩
30.
THANK YOU
Jetzt herunterladen