Scala: Difference between revisions

From Bitpost wiki
No edit summary
No edit summary
Line 11: Line 11:
=== SBT PROJECT CREATION ===
=== SBT PROJECT CREATION ===


# Make a folder for your project, eg MyProject
* Make a folder for your project, eg MyProject
# Create this path, it is HARDCODED INTO SBT and expected, fuck off
* Create this path, it is HARDCODED INTO SBT and expected, fuck off
#:<pre>
src/main/scala
#::src/main/scala
---  
#::---  
Hardcoded layout
#::Hardcoded layout
├── project
#::├── project
│  └── target
#::│  └── target
│      └── config-classes
#::│      └── config-classes
├── src
#::├── src
│  ├── main
#::│  ├── main
│  │  ├── resources
#::│  │  ├── resources
│  │  └── scala
#::│  │  └── scala
│  └── test
#::│  └── test
│      ├── resources
#::│      ├── resources
│      └── scala
#::│      └── scala
└── target
#::└── target
* Create a first module, eg:
</pre>
MyProject/src/main/scala/Scrap.scala
# Create a first module, eg:
---
#::MyProject/src/main/scala/Scrap.scala
object Scrap extends App {
#::---
  println("Hello Scrap.  And away we go!")
#::object Scrap extends App {
}
#::  println("Hello Scrap.  And away we go!")
* From a command line, run sbt, should compile and run:
#::}
MyProject$ sbt run
# From a command line, run sbt, should compile and run:
* If that doesn't work, kill yourself
#::MyProject$ sbt run


=== INTELLIJ PROJECT CREATION ===
=== INTELLIJ PROJECT CREATION ===


# From IntelliJ, File->New->Project... (NOT FROM EXISTING because INTELLIJ SUCKS MY DICK)... ->Scala->SBT
IntelliJ wins Worst-IDE by a long factor. Who needs to type when the IDE can churn out unusable code indexes in the background for you that peg the CPU for hours?  Don't worry, once it gets done it will write the code for you!  Quit complaining and buy the latest Macbook every 3 months to keep up.
# Use your folder for location and the name; eg MyProject
# NNOPE FUCK OFF


Trying again, starting with IntelliJ...
* From IntelliJ, File->New->Project... (NOT FROM EXISTING because INTELLIJ SUCKS MY DICK)... ->Scala->SBT
# File - New - Project... - Scala->SBT  
* Use your folder for location, name, and module (under More Settings), eg MyProject
# Project Name: Scrap
* It should have created that nasty smelly code layout (see above).  Add a module, eg:
# Project location: ~/development/Reusable/scala/scrap/IDEAScrapProject
MyProject/src/main/scala/Scrap.scala
# [X] use auto-import
* Then magically after it settles down you should be able to Build->Module, and Run->{modulename}


=== CONTAINERS ===
=== CONTAINERS ===

Revision as of 18:21, 25 October 2016

Installation

Start with Java. Then sbt:

echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
sudo apt-get update
sudo apt-get install sbt

Next, set up ~/.sbt/repositories with repos used by your team.

SBT PROJECT CREATION

  • Make a folder for your project, eg MyProject
  • Create this path, it is HARDCODED INTO SBT and expected, fuck off
src/main/scala
--- 
Hardcoded layout
├── project
│   └── target
│       └── config-classes
├── src
│   ├── main
│   │   ├── resources
│   │   └── scala
│   └── test
│       ├── resources
│       └── scala
└── target
  • Create a first module, eg:
MyProject/src/main/scala/Scrap.scala
---
object Scrap extends App {
  println("Hello Scrap.  And away we go!")
}
  • From a command line, run sbt, should compile and run:
MyProject$ sbt run
  • If that doesn't work, kill yourself

INTELLIJ PROJECT CREATION

IntelliJ wins Worst-IDE by a long factor. Who needs to type when the IDE can churn out unusable code indexes in the background for you that peg the CPU for hours? Don't worry, once it gets done it will write the code for you! Quit complaining and buy the latest Macbook every 3 months to keep up.

  • From IntelliJ, File->New->Project... (NOT FROM EXISTING because INTELLIJ SUCKS MY DICK)... ->Scala->SBT
  • Use your folder for location, name, and module (under More Settings), eg MyProject
  • It should have created that nasty smelly code layout (see above). Add a module, eg:
MyProject/src/main/scala/Scrap.scala
  • Then magically after it settles down you should be able to Build->Module, and Run->{modulename}

CONTAINERS

Here are three ways to create a container from information in another.

Immutable map (best):

 val andClause = unverifiedTileSet.map { un =>
   and(
     Array(
       BSONDocument("x" -> BSONInteger(un.x)),
       BSONDocument("y" -> BSONInteger(un.y))
     )
   )
 }
 val orClause = BSONDocument("$or" -> andClause)
 val pUp = Promise[Unit]
 val fUp = uDao.col.update(orClause, updateSet, upsert = true, multi = true)
 fUp.onComplete {
   case Success(res) => pUp.success()
   case Failure(t) => pUp.failure(t)
 }
 pUp.future

For with yeild, good for multiple steps:

	/*
		// //2) way with for <- yield
 		// val orClause = for(
		// 	un <- unverifiedTileSet; 
		// 	andClause <- { 
		// 	 	and(
		//        		Array(
		//        			BSONDocument("x" -> BSONInteger(un.x)),
		//        			BSONDocument("y" -> BSONInteger(un.y))
		//      			)
		// 		)
		// 	}
		// )yield{
		//  		BSONDocument("$or" -> andClause)
		// }

		//2) way with for <- yield
		val orClause2 = for(
			andClause <- {
				unverifiedTileSet.map{un =>
					and(
						Array(
							BSONDocument("x" -> BSONInteger(un.x)),
							BSONDocument("y" -> BSONInteger(un.y))
						)
					)
				}
			}
		)yield{
			BSONDocument("$or" -> andClause)
		}

Third way, mutable oldskool:

		// method 3, oldskool for with mutable, not recommended
		import scala.collection.mutable.ArrayBuffer
		var andClause = ArrayBuffer.empty[BSONDocument]
		for (un <- unverifiedTileSet) {
      andClause += and(
	        Array(
            BSONDocument("x" -> BSONInteger(un.x)),
            BSONDocument("y" -> BSONInteger(un.y))
          )
	      )
    }
    val orClause = BSONDocument("$or" -> andClause)
	*/

CAUSAM setup

For Causam, set up an AWS VPN to get on the stash network, then add these:

[repositories]
local
artifactory-releases: http://artifactory.energynet.link:8081/artifactory/libs-release/
artifactory-snapshots: http://artifactory.energynet.link:8081/artifactory/libs-snapshot/
ivy-releases: http://artifactory.energynet.link:8081/artifactory/ivy-releases, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
anormcypher: http://artifactory.energynet.link:8081/artifactory/anormcypher

Then if you have a project already, use sbt and let that pull down all the dependencies:

cd ~/development/causam/git/causam-north-poller-scala
sbt compile