Scala: Difference between revisions

From Bitpost wiki
No edit summary
No edit summary
Line 9: Line 9:
Next, set up ~/.sbt/repositories with repos used by your team.
Next, set up ~/.sbt/repositories with repos used by your team.


=== 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
src/main/scala
#:<pre>
---  
#::src/main/scala
Hardcoded layout
#::---  
├── project
#::Hardcoded layout
│  └── target
#::├── project
│      └── config-classes
#::│  └── target
├── src
#::│      └── config-classes
│  ├── main
#::├── src
│  │  ├── resources
#::│  ├── main
│  │  └── scala
#::│  │  ├── resources
│  └── test
#::│  │  └── scala
│      ├── resources
#::│  └── test
│      └── scala
#::│      ├── resources
└── target
#::│      └── scala
#::└── target
</pre>
# Create a first module, eg:
# Create a first module, eg:
MyProject/src/main/scala/Scrap.scala
#::MyProject/src/main/scala/Scrap.scala
---
#::---
object Scrap extends App {
#::object Scrap extends App {
  println("Hello Scrap.  And away we go!")
#::  println("Hello Scrap.  And away we go!")
}
#::}
# From a command line, run sbt, should compile and run:
# From a command line, run sbt, should compile and run:
MyProject$ sbt run
#::MyProject$ sbt run
 
=== INTELLIJ PROJECT CREATION ===
 
# From IntelliJ, File->New->Project... (NOT FROM EXISTING because INTELLIJ SUCKS MY DICK)... ->Scala->SBT
# From IntelliJ, File->New->Project... (NOT FROM EXISTING because INTELLIJ SUCKS MY DICK)... ->Scala->SBT
# Use your folder for location and the name; eg MyProject
# Use your folder for location and the name; eg MyProject

Revision as of 18:12, 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

  1. Make a folder for your project, eg MyProject
  2. 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
  1. Create a first module, eg:
    MyProject/src/main/scala/Scrap.scala
    ---
    object Scrap extends App {
    println("Hello Scrap. And away we go!")
    }
  2. From a command line, run sbt, should compile and run:
    MyProject$ sbt run

INTELLIJ PROJECT CREATION

  1. From IntelliJ, File->New->Project... (NOT FROM EXISTING because INTELLIJ SUCKS MY DICK)... ->Scala->SBT
  2. Use your folder for location and the name; eg MyProject
  3. NNOPE FUCK OFF

Trying again, starting with IntelliJ...

  1. File - New - Project... - Scala->SBT
  2. Project Name: Scrap
  3. Project location: ~/development/Reusable/scala/scrap/IDEAScrapProject
  4. [X] use auto-import

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