Enviar pesquisa
Carregar
Scala警察のすすめ
•
8 gostaram
•
12,335 visualizações
T
takezoe
Seguir
#scalafukuoka
Leia menos
Leia mais
Software
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 30
Baixar agora
Baixar para ler offline
Recomendados
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
PostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
例外設計における大罪
例外設計における大罪
Takuto Wada
TLS, HTTP/2演習
TLS, HTTP/2演習
shigeki_ohtsu
Mais conteúdo relacionado
Mais procurados
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
Mikiya Okuno
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
増田 亨
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
増田 亨
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
REST API のコツ
REST API のコツ
pospome
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki
Tackling Complexity
Tackling Complexity
Yoshitaka Kawashima
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
mosa siru
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版
LINE Corporation
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介
AdvancedTechNight
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
yoku0825
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
yoku0825
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
Kouhei Sutou
分散システムについて語らせてくれ
分散システムについて語らせてくれ
Kumazaki Hiroki
DockerとPodmanの比較
DockerとPodmanの比較
Akihiro Suda
ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。
toshihiro ichitani
Mais procurados
(20)
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
REST API のコツ
REST API のコツ
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Tackling Complexity
Tackling Complexity
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
分散システムについて語らせてくれ
分散システムについて語らせてくれ
DockerとPodmanの比較
DockerとPodmanの比較
ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。
Destaque
おっさんES6/ES2015,React.jsを学ぶ
おっさんES6/ES2015,React.jsを学ぶ
dcubeio
自然言語処理 Word2vec
自然言語処理 Word2vec
naoto moriyama
AtCoderで始めるテスト駆動開発
AtCoderで始めるテスト駆動開発
YujiSoftware
Scala製機械学習サーバ「Apache PredictionIO」
Scala製機械学習サーバ「Apache PredictionIO」
takezoe
The best of AltJava is Xtend
The best of AltJava is Xtend
takezoe
MP in Clojure
MP in Clojure
Kent Ohashi
Clojure web dev history
Clojure web dev history
Ikuru Kanuma
Non-Functional Programming in Scala
Non-Functional Programming in Scala
takezoe
Javaでマサカリ投げてみた
Javaでマサカリ投げてみた
YujiSoftware
Tensor Decomposition and its Applications
Tensor Decomposition and its Applications
Keisuke OTAKI
ElasticsearchとTasteプラグインで作るレコメンドシステム
ElasticsearchとTasteプラグインで作るレコメンドシステム
Shinsuke Sugaya
PredictionIOでSparkMLを使った開発方法
PredictionIOでSparkMLを使った開発方法
Shinsuke Sugaya
自然言語処理
自然言語処理
naoto moriyama
Elasticsearchで作る形態素解析サーバ
Elasticsearchで作る形態素解析サーバ
Shinsuke Sugaya
Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方
Shinsuke Sugaya
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
Shinsuke Sugaya
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
Shinsuke Sugaya
ちょっと理解に自信がないなという皆さまに贈るHadoop/Sparkのキホン (IBM Datapalooza Tokyo 2016講演資料)
ちょっと理解に自信がないなという皆さまに贈るHadoop/Sparkのキホン (IBM Datapalooza Tokyo 2016講演資料)
hamaken
AI社会論研究会
AI社会論研究会
Hiroshi Nakagawa
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
NTT DATA OSS Professional Services
Destaque
(20)
おっさんES6/ES2015,React.jsを学ぶ
おっさんES6/ES2015,React.jsを学ぶ
自然言語処理 Word2vec
自然言語処理 Word2vec
AtCoderで始めるテスト駆動開発
AtCoderで始めるテスト駆動開発
Scala製機械学習サーバ「Apache PredictionIO」
Scala製機械学習サーバ「Apache PredictionIO」
The best of AltJava is Xtend
The best of AltJava is Xtend
MP in Clojure
MP in Clojure
Clojure web dev history
Clojure web dev history
Non-Functional Programming in Scala
Non-Functional Programming in Scala
Javaでマサカリ投げてみた
Javaでマサカリ投げてみた
Tensor Decomposition and its Applications
Tensor Decomposition and its Applications
ElasticsearchとTasteプラグインで作るレコメンドシステム
ElasticsearchとTasteプラグインで作るレコメンドシステム
PredictionIOでSparkMLを使った開発方法
PredictionIOでSparkMLを使った開発方法
自然言語処理
自然言語処理
Elasticsearchで作る形態素解析サーバ
Elasticsearchで作る形態素解析サーバ
Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
ちょっと理解に自信がないなという皆さまに贈るHadoop/Sparkのキホン (IBM Datapalooza Tokyo 2016講演資料)
ちょっと理解に自信がないなという皆さまに贈るHadoop/Sparkのキホン (IBM Datapalooza Tokyo 2016講演資料)
AI社会論研究会
AI社会論研究会
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
Semelhante a Scala警察のすすめ
Scala Daysに行ってみて
Scala Daysに行ってみて
Kota Mizushima
Scalaノススメ
Scalaノススメ
Yasuyuki Maeda
1周遅れのScala入学 #nds41
1周遅れのScala入学 #nds41
Kazumune Katagiri
Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]
Ra Zon
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009
Taisuke Shiratori
Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks
Hiroshi Ito
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
Ra Zon
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
Ra Zon
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
Kazuhiro Sera
Object-Funcational Analysis and design
Object-Funcational Analysis and design
Tomoharu ASAMI
Scala勉強会_2014_11_18
Scala勉強会_2014_11_18
Shuya Tsukamoto
ScalaCL in ScalaKaigi
ScalaCL in ScalaKaigi
Hideyuki Takeuchi
activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介
Kevin Toyoda
ATN No.2 Scala事始め
ATN No.2 Scala事始め
AdvancedTechNight
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
Scala.jsはじめました!
Scala.jsはじめました!
K Kinzal
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
Nobukazu Hanada
Trait in scala
Trait in scala
Yuta Shimakawa
【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js
Yuto Suzuki
Why dont you_create_new_spark_jl
Why dont you_create_new_spark_jl
Shintaro Fukushima
Semelhante a Scala警察のすすめ
(20)
Scala Daysに行ってみて
Scala Daysに行ってみて
Scalaノススメ
Scalaノススメ
1周遅れのScala入学 #nds41
1周遅れのScala入学 #nds41
Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009
Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
Object-Funcational Analysis and design
Object-Funcational Analysis and design
Scala勉強会_2014_11_18
Scala勉強会_2014_11_18
ScalaCL in ScalaKaigi
ScalaCL in ScalaKaigi
activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介
ATN No.2 Scala事始め
ATN No.2 Scala事始め
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
Scala.jsはじめました!
Scala.jsはじめました!
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
Trait in scala
Trait in scala
【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js
Why dont you_create_new_spark_jl
Why dont you_create_new_spark_jl
Mais de takezoe
Journey of Migrating Millions of Queries on The Cloud
Journey of Migrating Millions of Queries on The Cloud
takezoe
GitBucket: Open source self-hosting Git server built by Scala
GitBucket: Open source self-hosting Git server built by Scala
takezoe
Testing Distributed Query Engine as a Service
Testing Distributed Query Engine as a Service
takezoe
Revisit Dependency Injection in scala
Revisit Dependency Injection in scala
takezoe
How to keep maintainability of long life Scala applications
How to keep maintainability of long life Scala applications
takezoe
頑張りすぎないScala
頑張りすぎないScala
takezoe
GitBucket: Git Centric Software Development Platform by Scala
GitBucket: Git Centric Software Development Platform by Scala
takezoe
Scala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.js
takezoe
Tracing Microservices with Zipkin
Tracing Microservices with Zipkin
takezoe
Type-safe front-end development with Scala
Type-safe front-end development with Scala
takezoe
Scala Frameworks for Web Application 2016
Scala Frameworks for Web Application 2016
takezoe
Macro in Scala
Macro in Scala
takezoe
Java9 and Project Jigsaw
Java9 and Project Jigsaw
takezoe
Reactive database access with Slick3
Reactive database access with Slick3
takezoe
markedj: The best of markdown processor on JVM
markedj: The best of markdown processor on JVM
takezoe
ネタじゃないScala.js
ネタじゃないScala.js
takezoe
Excel方眼紙を支えるJava技術 2015
Excel方眼紙を支えるJava技術 2015
takezoe
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
takezoe
GitBucket: The perfect Github clone by Scala
GitBucket: The perfect Github clone by Scala
takezoe
Play2実践tips集
Play2実践tips集
takezoe
Mais de takezoe
(20)
Journey of Migrating Millions of Queries on The Cloud
Journey of Migrating Millions of Queries on The Cloud
GitBucket: Open source self-hosting Git server built by Scala
GitBucket: Open source self-hosting Git server built by Scala
Testing Distributed Query Engine as a Service
Testing Distributed Query Engine as a Service
Revisit Dependency Injection in scala
Revisit Dependency Injection in scala
How to keep maintainability of long life Scala applications
How to keep maintainability of long life Scala applications
頑張りすぎないScala
頑張りすぎないScala
GitBucket: Git Centric Software Development Platform by Scala
GitBucket: Git Centric Software Development Platform by Scala
Scala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.js
Tracing Microservices with Zipkin
Tracing Microservices with Zipkin
Type-safe front-end development with Scala
Type-safe front-end development with Scala
Scala Frameworks for Web Application 2016
Scala Frameworks for Web Application 2016
Macro in Scala
Macro in Scala
Java9 and Project Jigsaw
Java9 and Project Jigsaw
Reactive database access with Slick3
Reactive database access with Slick3
markedj: The best of markdown processor on JVM
markedj: The best of markdown processor on JVM
ネタじゃないScala.js
ネタじゃないScala.js
Excel方眼紙を支えるJava技術 2015
Excel方眼紙を支えるJava技術 2015
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
GitBucket: The perfect Github clone by Scala
GitBucket: The perfect Github clone by Scala
Play2実践tips集
Play2実践tips集
Scala警察のすすめ
1.
Scala警察のすすめ Naoki Takezoe @takezoen BizReach, Inc
2.
有名OSSでもScala的に微妙なコードが多い ● ビッグデータ、機械学習界隈のプロダクトにこの 傾向がある ● 元々関数型界隈ではなく、ビッグデータ界隈や機 械学習界隈の人がSparkやMLlibを使うために Scalaを使っているので仕方ない ●
むしろScala警察活躍のチャンス!!!!
3.
Scala的に微妙なコードあるある
4.
その1. Procedure Syntax
5.
Procedure Syntax メソッドの戻り値がUnitの場合はメソッド定義の「=」 を省略できるという記法 def hello()
{ "Hello World!!" }
6.
なぜダメか? ● 戻り値の型がUnitになってしまう ● Javaから来た人が間違って書いてしまいがち ●
将来のバージョンのScalaでは廃止予定 def hello(): Unit = { "Hello World!!" } def hello(): String = { "Hello World!!" } こういうメソッドを定義しているつもりが・・・ 実はこうなっている
7.
どうすればよいか? Procedure Syntaxは使わない def hello():
String = { "Hello World!!" } def hello() = { "Hello World!!" } または
8.
その2. Unit is
not Unit value
9.
Unit値を返すつもりでUnitと書いてしまう def hello(): Unit
= { // ...いろいろ処理... Unit } これ
10.
なぜダメか? ● Unit値は()、UnitはUnitオブジェクト ● メソッドの戻り値など、実害はないケースが多い ので気づきにくい scala>
val x = () x: Unit = () scala> val x = Unit x: Unit.type = object scala.Unit
11.
どうすればよいか? Unitではなく()と書きましょう def hello(): Unit
= { // ...いろいろ処理... () } こう書く
12.
その3. Auto Tupling
13.
引数を自動的にタプルに変換する機能 def hello(x: (String,
String)): String = { x._1 + " " + x._2 } // 本来であればこう呼び出す hello(("Naoki", "Takezoe")) // こう書ける hello("Naoki", "Takezoe")
14.
なぜダメか? ● なぜコンパイルエラーになるのかわかりにくい ケースがある ● リファクタリング時に意図せずコンパイルが通って しまうケースがある
15.
どうすればよいか? ● Auto-Tuplingを使わずに記述する ● 名前付き引数で引数を渡す ●
Any型の引数を持つメソッドを定義する場合や、 リファクタリング時は特に注意する Scalaパズルにも 書いてある!
16.
その3. Escape by
"return"
17.
def hello(name: String):
String = { return s"Hello ${name}!" } そもそもこういう場合はreturnは不要
18.
引数チェックのEarly return def hello(names:
Seq[String]): String = { // Seqが空の場合 if(names.isEmpty) return "" // Seqに空文字列が含まれている場合 names.foreach { name => if(name.isEmpty) return "" } // 実際の処理 names.mkString(", ") }
19.
なぜダメか? ● メソッドの戻り値の型推論が効かなくなるので戻り 値の型を明示的に記述する必要がある ● 場合によっては例外にコンパイルされている (ControlThrowable)
20.
どうすればよいか? ● 不要な場合は書かない ● if
elseやコレクション操作に置き換える ● 使う場合は例外処理に気をつける
21.
def hello(names: Seq[String]):
String = { // Seqが空の場合 if(names.isEmpty) "" // Seqに空文字列が含まれている場合 else if(names.exists(_.isEmpty) "" // 実際の処理 else names.mkString(", ") }
22.
例外処理をする場合 ● Throwableでキャッチしない ● Throwableもキャッチする必要がある場合は NonFatalを使う try
{ // ...処理... } catch { case NonFatal(t) => t.printStackTrace() } ControlThrowableなどは マッチしない
23.
他にもよくあるパターン ● varやmutableコレクション ○ ループカウンタやコレクションの詰め替え処理など ●
whileループ ○ varやmutableなコレクションと組み合わせで使用されてい ることが多い ○ returnやbreakなどとの合わせ技担っている場合も
24.
ループカウンタが必要な場合 var i =
1 seq.foreach { x => println(s"${i}: ${x}") i = i + 1 }
25.
zipWithIndexを使う seq.zipWithIndex.foreach { case
(x, i) => println(s"${i + 1}: ${x}") }
26.
途中で処理を止めたい場合 var line: String
= null val lines = new ListBuffer[String]() line = reader.readLine() while(line != null){ lines += line line = reader.readLine() }
27.
Iterator.continuallyが使える val lines =
Iterator.continually(reader.readLine()) .takeWhile(_ != null)
28.
バッドコードを検出するために ● コンパイラのオプションを設定しよう ● Lintツールを使おう ○
scalastyle ○ wartremover scalacOptions in ThisBuild ++= Seq( "-feature", "-unchecked", "-deprecation", "-Xfuture", "-Yno-adapted-args", "-Ywarn-dead-code", "-Ywarn-numeric-widen" )
29.
SparkがScalaの隙間産業を生み出している ● PredictionIO ● Spark
MLlib ● Mahout-Spark ● Elasticsearch-Hadoop
30.
SparkがScalaの隙間産業を生み出している ● PredictionIO ● Spark
MLlib ● Mahout-Spark ● Elasticsearch-Hadoop あなたもScala警察として OSSコミッタになろう!
Baixar agora