Porovnávání Optional

Při porovnávání Optional není nutné kontrolovat isPresent a volat hodnotu, ale jde rovnou porovnánat objekty.

Optional<Long> emptyLong = Optional.empty();
Optional<Long> l1 = Optional.of(1L);
Optional<String> s1 = Optional.of("abc");

System.out.println(emptyLong.equals(l1));
System.out.println(emptyLong.equals(Optional.empty()));
System.out.println(l1.equals(s1));
System.out.println(s1.equals(Optional.of("abc")));

Výsledek

false
true
false
true

Stejné to je v testech (např. při použití testNG):

assertNotEquals(emptyLong, l1);
assertEquals(emptyLong, Optional.empty());
assertNotEquals(l1, s1);
assertEquals(s1, Optional.of("abc"));

Takto asserty projdou. Pokud bychom to změnili např. na assertEquals(emptyLong, l1), dostali bychom následující chybu:

Exception in thread "main" java.lang.AssertionError: expected [Optional[1]] but found [Optional.empty]
	at org.testng.Assert.fail(Assert.java:93)
	at org.testng.Assert.failNotEquals(Assert.java:512)
	at org.testng.Assert.assertEqualsImpl(Assert.java:134)
	at org.testng.Assert.assertEquals(Assert.java:115)
	at org.testng.Assert.assertEquals(Assert.java:178)
	at ...

Maven a scope test

Maven má rozsahy (scope), kterými je možno ovlivnit, která závislosti se bude používat v které fázi maven buildu. Rozsah test znamená, že dané závislosti (knihovny) budou k dispozici během testovací fáze, ale jinak ne.
Jednoduchý příklad ukážu na knihovně TestNG, která se používá pro testování. Závislost v pom.xml vypadá následovně:

<dependency>
	<groupId>org.testng</groupId>
	<artifactId>testng</artifactId>
	<version>6.11</version>
	<scope>test</scope>
</dependency>

Pokud budeme mít třídu AppTest v balíčku src/test/java a v ní tento test, který používá knihovnu TestNG:

import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotEquals;

import org.testng.annotations.Test;

public class AppTest {
	@Test
	public void test() {
		assertNotEquals("A", "B");
		assertEquals(10, 10);
	}
}

při spuštění buildu aplikace pomocí mavenu (mvn test, z Eclipse IDE Run As -> Maven test) proběhne vše v pořádku (knihovna TestNG je k dipozici, kód se zkompiluje a proběhne).

Číst dálMaven a scope test

Modifikace sysdate v Oracle SQL

Oracle funkce sysdate vrací aktuální datum a čas databáze. Používá například při zjišťování, zda daný záznam je platný či ne.

SELECT * FROM tabulka WHERE datum < sysdate

Často ale potřebujeme zjistit záznam, který je např. starší než aktuální datum plus/mínus X dní/hodin/minut/… Pokud napíšeme:

SELECT SYSDATE, SYSDATE - 60 FROM dual;

bude výsledek následující:

SYSDATE                SYSDATE-60
12.07.17 11:22:36      13.05.17 11:22:36

To je docela nepřehledné, protože ne každý může vědět, že se odečítají dny. Mnohem lepší je:

SELECT SYSDATE, SYSDATE - INTERVAL '60' DAY AS sysdate_minus_60_days FROM dual;

který vrací stejný výsledek, ale je mnohem jasnější, jaká časová hodnota se modifikuje (INTERVAL ’60‘ DAY):

SYSDATE                SYSDATE_MINUS_60_DAYS
12.07.17 11:25:00      13.05.17 11:25:00

Je samozřejmě možné přidávat a odebírat nejen dny, ale i jiné časové úseky (second, minute, hour, day, month, year).

SELECT SYSDATE, SYSDATE + INTERVAL '5' MINUTE AS sysdate_plus_5_minutess FROM dual;

Výsledek

SYSDATE                SYSDATE_PLUS_5_MINUTES
12.07.17 11:26:34      12.07.17 11:31:34

Alias v Linuxu

Pokud se potřebujete často přepínat do určitého adresáře (například s logy) je vhodné si vytvořit alias. Vhodným umístěním je soubor .bashrc tak, aby byl alias k dispozici po spuštění bashe.

alias plog='cd /var/log/postgresql'

Pokud nyní v bashi napíši plog (funguje doplňování pomocí tabulátoru) a stisknu enter, přepnu se do složky /var/log/postgresql. Příkazy lze řetězit, takže tento alias

alias plog='cd /var/log/postgresql; ls -al'

provede nejen přepnutí do adresáře /var/log/postgresql, ale rovnou i vypíše jeho obsah.