Programmeertechnieken, Voorjaar 2016

Hints en tips voor opdracht 4

Permissieproblemen en dergelijke met Android Studio

In het geval van vreemde problemen met permissies en het niet kunnen lezen van /vol/home, is een workaround om het Android project tijdelijk in /scratch te zetten op de lokale harddisk. Dit kan als volgt:
  1. In /scratch een nieuwe map maken /scratch/s1234567.
  2. ~/AndroidStudioProjects naar deze nieuwe map kopieren.
  3. De permissies van deze mappen aanpassen zodanig dat group en other geen toegang hebben. Dit kan met het commando chmod of met een grafische file browser
  4. Voor de zekerheid: ~/.AndroidStudio2.1 verplaatsen naar ~/.AndroidStudio2.1.backup. (~/Android map kan blijven staan).
  5. Open nu het project in /scratch in Android Studio.
  6. BELANGRIJK: wanneer je stopt met werken of van PC wisselt: kopieer het project vanuit /scratch terug naar je home-directory! Alleen de home-directory is vanaf alle machines bereikbaar!

Zet de "Instant run" feature in Android Studio uit

Er zijn problemen met Instant run in combinatie met netwerkshares. Het is daarom belangrijk om instant run uit te schakelen:

  1. Ga naar File → Settings → Build, Execution, Deployment (links) → Instant Run
  2. Zet de eerste checkbox uit.

Werken aan het Play project in een IDE (bijvoorbeeld Android Studio)

Het is niet mogelijk om binnen Netbeans aan het Play project te werken omdat Netbeans niet met het SBT build system overweg kan. Met Android Studio is dit wel moglijk, met behulp van het uitvoeren van de volgende stappen:

  1. File → Settings → Plugins (links) → Browse Repositories → "Scala" → Install plugin
  2. Kies daarna voor "Restart Android Studio", wacht daarna tot alles is geïndexeerd.
  3. File → New → Import Project.
    1. Selecteer de map waarin build.sbt zit.
    2. Kies "Import project from external model: SBT
    3. Zet "auto-import" aan
    4. Selecteer de Java 8 SDK.
    5. Kies "Finish"

Je kunt in de terminal binnen de IDE activator run uitvoeren om het programma te laten draaien binnen de IDE.

Gebruiken van JSON in Play projecten

Om JSON te kunnen gebruiken in een Play project kun je gebruik maken van de import play.libs.Json. Helaas ontbreken hier routines om op een eenvoudige manier JSON-objecten aan te maken. Een handige klasse om dit te kunnen doen is ObjectNode en deze kan gevonden worden in de Jackson-library. Om deze in een Play project te kunnen gebruiken moet deze als library dependency worden opgegeven. Voeg hiertoe in het bestand build.sbt de volgende regel toe aan de libraryDependencies: "com.fasterxml.jackson.core" % "jackson-databind" % "2.4.0" (inclusief aanhalingstekens). Met de import com.fasterxml.jackson.databind.node.* heb je nu toegang tot ObjectNode. Voor een voorbeeld, zie de sectie over SQLite hieronder.

Gebruiken van SQLite in Play projecten

Om SQLite in een Play project te kunnen gebruiken, moeten er library dependencies worden toegevoegd. De truc is om in het bestand build.sbt het volgende aan de libraryDependencies-lijst toe te voegen: "org.xerial" % "sqlite-jdbc" % "3.8.11.2" (aanhalingstekens ook in het bestand zetten). Dit is de JDBC driver voor SQLite, welke standaard niet wordt meegeleverd. Daarna kun je met de SQLite-database verbinden door in het bestand conf/application.conf helemaal onderaan bij het gedeelte db { de volgende regels toe te voegen:

default.driver=org.sqlite.JDBC
default.url="jdbc:sqlite:/absolute/pad/naar/database.db"

Voor meer details over het instellen van database drivers zie https://www.playframework.com/documentation/2.5.x/JavaDatabase.

Een klein voorbeeld om een SQL query uit te voeren (het uitlezen van de tabel "users") en de resultaten terug te gegeven als JSON object is het volgende:

Connection connection = db.getConnection();

ArrayNode result = Json.newArray();

try {
    Statement stmt = connection.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT * FROM users");
    while (rs.next()) {
        ObjectNode user = Json.newObject();
        user.put("id", rs.getInt("id"));
        user.put("name", rs.getString("name"));
        result.add(user);
    }
} catch (SQLException e) {
    System.out.println(e);
}
return ok(result);

Bekijken en aanpassen sqlite database

Om een sqlite database te bekijken en aan te passen kun je uiteraard gebruik maken van het command-line programma sqlite3. We hebben ook een grafische applicatie geïnstalleerd. Deze applicatie staat in het PT-environment en kun je opstarten met het commando sqlitebrowser.

Wat te doen bij fouten zoals "Authentication error" in logcat bij Google Maps?

Dit is te verhelpen door een nieuwe API key aan te vragen. Het is gebleken dat API keys niet op alle PCs of voor een willekeurige user werken.

Deployment Web Applicatie

Om de Web applicatie de deployen op de server moet er een stand-alone package (distributable) worden gemaakt. Voor instructies, zie deze pagina uit de Play documentatie. De applicatie kan middels ssh worden geupload naar de server pt2016.liacs.nl. Accounts worden tijdens het werkcollege uitgedeeld door de student assistenten. Ieder team krijgt ook een TCP poort toegewezen waarop de Play server moet draaien. Dit moet worden ingesteld in het bestand conf/application.conf in de Play distributable (vul hier het correcte poortnummer in):
http.port = 9101
Tevens moet in code/application.conf de context worden ingesteld (vul hier de correcte teamnaam in):
play.http.context="/team11/"
Door met ssh in te loggen op de server kan de applicatie worden opgestart. De applicatie is bereikbaar onder http://play2016.liacs.nl/team10/ (vul hier weer de correcte teamnaam in). De server is alleen benaderbaar vanuit het Universitaire netwerk. Via deze URL wordt er automatisch contact gemaakt met de Play server van dit team die draait op de specifieke poort.

Stappenplan

In het volgende stappenplan zijn alle uit te voeren stappen voor het deployen van een Play-applicatie samengezet:
  1. Stel een cookie security-secret/token in in de configuratie van de Play-applicatie (./conf/application.conf)
  2. In de play-project map, run activator dist om een "Play-distributable" te maken, wat een .zip bestand in ./target/univeral/ genereerd.
  3. Mount via sshfs het filesystem van de server op je lokale machine: mkdir ~/mnt, dan sshfs teamXX@pt2016.liacs.nl:/home/teamXX/ ~/mnt. Hierna kun je via de ~/mnt map op je lokale machine bij de bestanden in de home-directory van de server komen.
  4. Kopieer de eerder gemaakte distributable (het .zip-archief) naar je home-directory op de server (de ~/mnt map dus) en pak dit zip-archief hier uit
  5. Voeg de volgende twee configuratie-regels toe aan de Play-configuratie (bijvoorbeeld helemaal onderaan) -- dit is vooral van belang bij de configuratie op de server:
    http.port = 91XX # Poort verschilt per team, zie het papiertje met de account-details
    play.http.context = "/teamXX/"
    
  6. Als je een sqlite database hebt geconfigureerd, verander het absolute pad in de configuratie naar het database-bestand zodat het weer een correct pad is op de server, zoals /home/teamXX/database.sqlite3. Sla het database-bestand niet op binnen een map behorende bij het Play-project, deze wordt anders overschreven bij elke deployment naar de server.
  7. "ssh" naar de server: ssh teamXX@pt2016.liacs.nl. Start vervolgens "screen" op door screen uit te voeren. Alles wat binnen een screen-sessie wordt uitgevoerd blijft bewaard tot dat je de screen-sessie expliciet afsluit, dus ook als je de ssh-verbinding verbreekt. Start binnen screen de Play-server op door de executable in de ./bin/-map uit te voeren (in de uitgepakte distributable). Later kun je door screen -r uit te voeren via "ssh" de eerder gestarte screen-sessie weer terug krijgen (re-attachen), bijvoorbeeld als je op een andere dag de Play-server wil herstarten wegens een update.

Screen cheatsheet