Pořadí při použití metody equals

V případě, že máme konstantu a tu porovnáváme s objektem, je vhodnější použít konstrukci konstanta.equals(objekt) než naopak. Důvod je jednoduchý. Vyhneme se tak možnosti chyby NullPointerException.

String MY_CONSTANT = "AB9922";
            
System.out.println(MY_CONSTANT.equals(MY_CONSTANT));
System.out.println(MY_CONSTANT.equals("ABCDEF"));
System.out.println(MY_CONSTANT.equals(null));

Výsledek.

true
false
false

Pokud to zkusíme opačně, kód nepůjde zkompilovat.

System.out.println(MY_CONSTANT.equals(MY_CONSTANT));
System.out.println("ABCDEF".equals(MY_CONSTANT));
// Unresolved compilation problem:  Cannot invoke equals(String) on the primitive type null
// System.out.println(null.equals(MY_CONSTANT));

Vědomě bychom konstrukci null.equals() určitě nepoužili, ale nevědomě se používá docela často. Zde je metoda, která vrací náhodný String. Vrácená hodnota tedy může být i null.

 private static String generateString() {
       int randomNumber = gen.nextInt(3);
      
       switch(randomNumber) {
              case 0:
                     return "AB9922";
              case 1:
                     return "XX8811";
              default:
                     return null;
       }
 }

Pokud budeme porovnávat objekty tímto způsobem,

 private static final String MY_CONSTANT = "AB9922";

 public static void main(String[] args) {
      
       for (int i = 0; i < 100; i++) {
              System.out.println(generateString().equals(MY_CONSTANT));
       }
 }

kód nám pravděpodobně bude nějakou chvíli fungovat, ale časem se určitě objeví NullPointerException.

true
true
false
Exception in thread "main" java.lang.NullPointerException

Předejít tomu můžeme změnou objektu, na kterém metodu equals() voláme.

for (int i = 0; i < 100; i++) {
      System.out.println(MY_CONSTANT.equals(generateString()));
}

Rychlé spuštění programu ve Windows

Operační systém Windows nabízí několik možností jak rychle spustit program (ať už pomocí klávesové zkratky či jinak). Uvádím zde několik způsobů:

Připnutí ikony programu na hlavní panel

Pravým tlačítkem na program -> Připnout na hlavní panel. Pokud z hlavního panelu chcete program odstranit, pravým tlačítkem na program na panelu -> Odepnout tento program z  hlavního panelu. Tímto způsobem je možné si upravit hlavní panel tak, aby obsahoval ty nejpoužívanější programy a ty díky tomu byly lehce přístupné.

Spuštění programu na hlavním panelu pomocí klávesové zkratky

Všechny programy připnuté k hlavnímu panelu mají své pořadové číslo (zleva doprava od jedničky). Tlačítko Start, ikona Prohledat Windows a Zobrazení úkolů se nepočítá.

windows_spusteni_programu

Na tomto snímku je můj hlavní panel. Pokud budu chtít pustit průzkumníka souborů, stisknu klávesu Windows + 1 (průzkumník Windows lze spustit i klávesovou zkratkou Win + E). Pokud budu chtít spustit Eclipse IDE, stisknu klávesu Windows + 4. Pokud program ZimNotes tak klávesu Windows + 2.

Přiřazení klávesové zkratky zástupci

Pokud máte na ploše zástupce programu, je možné mu přiřadit klávesovou zkratku. Klikněte pravým tlačítkem na ikonu programu -> Vlastnosti -> umístěte kurzor do textového pole s popiskem Klávesová zkratka a tiskněte nějaké písmeno. Automaticky se předvyplní Ctrl + Alt.

windows_spusteni_programu02

Na obrázku je programu (zástupci programu) PuTTY přiřazena klávesová zkratka Ctrl + Alt + Y.

Zdroje:

Guava Optional.orNull()

V jednom z předchozích příspěvků jsem se věnoval třídě Optional z knihovny Guava. Nezmínil jsem ale užitečnou metodu orNull(). Tato metoda buď vrátí referenci na objekt v případě, že isPresent() je true, nebo null. Může se to hodit třeba v případě, kdy ve svém kódu používáte třídu Optional, ale jiné metody požadují objekt, nebo null.

Optional str1 = Optional.of("world");
Optional str2 = Optional.absent();

System.out.println(str1.orNull());
System.out.println(str2.orNull());

Výsledek.

world
null

V následujícím kódu si všimněte metod getString01() a getString02(). Obě dělají to samé, jen getString02() je mnohem kratší a přehlednějsí.

public static void main(String[] args) {
	Optional str1 = Optional.of("world");
	Optional str2 = Optional.absent();
	
	System.out.println(getString01(str1));
	System.out.println(getString01(str2));
	System.out.println(getString02(str1));
	System.out.println(getString02(str2));
}

private static String getString01(Optional str) {
	if (str.isPresent()) {
		return str.get();
	} else {
		return null;
	}
}

private static String getString02(Optional str) {
	return str.orNull();
}

Metoda Arrays.asList()

Tato metoda vrací list fixní délky. To znamené, že jakýkoliv pokus o změnu velikosti tohoto listu skončí chybou UnsupportedOperationException.

Ať už se jedná o odebrání prvku,

List list = Arrays.asList("a", "b", "c", "b");
		
ListIterator iterator = list.listIterator();
while (iterator.hasNext()) {
	if (iterator.next().equals("b")) {
		iterator.remove();
	}
}

nebo o přidání prvku,

List list = Arrays.asList("a", "b", "c", "b");
		
ListIterator iterator = list.listIterator();
while (iterator.hasNext()) {
	if (iterator.next().equals("b")) {
		iterator.add("bbb");
	}
}

dostaneme následující chybu.

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at java.util.AbstractList$ListItr.add(AbstractList.java:438)
        ...

V případě, že chceme vytvořil list s proměnnou velikostí, můžeme použít parametrický konstruktor ArrayList(kolekce).

List list = new ArrayList(Arrays.asList("a", "b", "c", "b"));
		
ListIterator iterator = list.listIterator();
while (iterator.hasNext()) {
	if (iterator.next().equals("b")) {
		iterator.remove();
	}
}

Výsledkem je následující list: [a, c].

Režim celé obrazovky ve VirtualBoxu

Při vytvoření virtuálního počítače ve VirtualBoxu a instalaci operačního systému do tohoto virtuálního počítače se může stát, že zobrazení celé obrazovky nebude zcela funkční (plocha operačního systému virtuálního počítače nebude přes celé okno).

virtual_box_guest_additions

Řešením je nainstalování přídavků pro hosta (guest additions).

Zařízení -> Instalovat přídavky pro hosta.

virtual_box_guest_additions02

Zobrazí se volba co se má dělat po vložení média. Potvrdit volbu „Otevřít v souborovém manageru“.

virtual_box_guest_additions03

Dvojklikem spustit autorun.sh.

virtual_box_guest_additions04

Potvrdit spuštění souboru.

virtual_box_guest_additions05

Zadat heslo.

virtual_box_guest_additions06

Po skončení instalace stisknout Enter a operační systém ve virtuálním počítači restartovat. Po restartu by se již měla plocha operačního systému přizpůsobovat velikosti okna.

virtual_box_guest_additions07

Zdroje:

Vložení měřícího kódu

Google Analytics používá pro měření návštěvnosti webu (a další statistiky) měřící kód, který je  třeba přidat do každé stránky, která má být sledována.

Kód pro vložení lze nalézt v části „Správce“.

google_analytics_merici_kod

Následně kliknout na „Údaje o měření“ -> „Měřicí kód“.

google_analytics_merici_kod02

Nejednodušším řešením je vložit kód do části head nebo footer, která je součástí (vkládá se do) každé stránky. Ve WordPressu stačí třeba editovat soubor (vložit kód do souboru) header.php nebo footer.php, které jsou umístěny v /www/wp-content/themes/nazev_tematu.

Symbolický link

Symbolický odkaz, anglicky symbolic link, symlink, softlink, tj. měkký odkaz označuje v informatice alternativní odkaz, který ukazuje na jiný soubor nebo adresář. Odkaz je realizován jako malý speciální soubor, který obsahuje absolutní nebo relativní cestu k cílovému souboru. Zdroj: cs.wikipedia.org/wiki/Symbolick%C3%BD_odkaz

Symbolický odkaz se vytváří pomocí příkazu ln s volbou -s.

~$ ln -s /etc/rc.local 
~$ file rc.local 
rc.local: symbolic link to `/etc/rc.local' 

Výše uvedený příklad vytvoří symbolický odkaz na soubor /etc/rc.local. Příkaz file vypíše typ souboru. File mode bit na první pozici je l (malé písmeno l).

ln -s /etc/rc.local symLinkTo_rc.local

Tak jako v předchozím příkladu vytvoří symbolický link na soubor /etc/rc.local a pojmenuje jej symLinkTo_rc.local.

Velmi hezké vysvětlení symbolických odkazů jsem nalezl na této webové stránce a zde je budu citovat:

Symbolický link je něco jako zkratka, principem je velmi podobný odkazu v html souboru, ale funguje v rámci souborového systému. Je velmi vzdáleně podobný zástupci ve Windows, což je nedokonalá napodobenina symbolického linku. Zástupce ve Windows je obyčejný datový soubor, který některé programy speciálně interpretují a jiné nikoliv. Tj. podpora zástupců je záležitost jednotlivých aplikací. Symbolický link je záležitost podstatně nižší úrovně, je to součást souborového systému a jeho interpretaci má na starost jádro. Symbolický link je speciální soubor stejně jako je speciální soubor adresář.

Symbolický link si můžete představit jako normální soubor, jehož obsahem je adresa (cesta, path) na jiný soubor (i speciální, tedy adresář, rouru a podobně). Přesně to totiž symbolický link je. Akorát že to není normální soubor a ta cesta není uložena v datové oblasti (symbolický link nic takového nemá) takže ho třeba nemůžete otevřít v textovém editoru a podívat se na ni.

Symbolický link nemusí ukazovat jen na datové soubory. Může ukazovat na libovolný druh souboru, třeba na adresáře. Je užitežné (alespoň já to dělám a dělám to všem lidem, kterým instaluji a konfiguruji Linux) si ve svém domácím adresáři udělat adresář který obsahuje hromadu symbolických linků, které ukazující na často navštěvované adresáře rozmístěné po různých discích co máte v počítači jako zkratky, které umožňují rychlý přístup k nim. Do těchto frekventovaných adresářů se ze všech aplikací pak dostanete nanejvýš na dvě kliknutí, protože domácí adresář je v Linuxu výchozí bod, od kterého se pokračuje dál.

Když smažete soubor, na který ukazuje symbolický link, tak symbolický link poté ukazuje do nikam. Pokus o jeho otevření pro čtení nebo zápis se chová stejně jako pokus o otevření neexistujícího souboru. Správci souborů takové symbolické linky často výstražně zvýrazňují, třeba červenou barvou. Zdroj: usl.wraith.cz/usl.html

Time test

JUnit i TestNG umožňují pomocí parametru timeout anotace @Test nastavit podmínku testu tak, aby test, pokud má být úspěšný, proběhl do určité doby (definované v milisekundách). V případě, že test trvá déle, jeho běh je ukončen a test je označen jako neúspěšný (failure).

Metoda, která se bude testovat.

public void longMethod() {
	for (int i = 0; i < 1_000_000; i++) {
		System.out.println("myMethod");
	}
}

Test.

@Test(timeout=1000)
public void longMethodTest() {
	longMethod();
}

Kód je stený jak pro JUnit tak pro TestNG. Pro JUnit test se používá anotace org.junit.Test a pro TestNG org.testng.annotations.Test. Pokud bude výše uvedený test trvat déle jak 1000 milisekund, bude označen jako neúspěšný.

File mode bits

V Linuxu je vše soubor a tím pádem vše má nastaveno i oprávnění (permission). Oprávnění určuje kdo má právo číst (read), zapisovat (write) a spustit (execute) daný soubor. Výpis oprávnění souborů lze získat pomocí příkazu ls s volbou -l.

Ukázka:

drwxr-xr-x   6 root root     4096 říj 12 19:30 apt
drwxr-xr-x   2 root root     4096 srp  5 07:18 at-spi2
-rw-r--r--   1 root root     2177 dub  9  2014 bash.bashrc
-rw-r--r--   1 root root       45 bře 22  2014 bash_completion
drwxr-xr-x   2 root root     4096 říj 24 20:43 bash_completion.d
-rw-r--r--   1 root root      356 led  1  2012 bindresvport.blacklist
-rw-r--r--   1 root root      321 dub 16  2014 blkid.conf
lrwxrwxrwx   1 root root       15 zář  2 20:35 blkid.tab -> /dev/.blkid.tab

1 2-4 5-7 8-10
 typ souboru oprávnění uživatele oprávnění skupiny oprávnění ostatních uživatelů

Typ souboru

běžný soubor
d adresář
l link
s socket (slouží pro komunikaci mezi procesy)
p pojmenovaná roura (named pipe)
b blokové zařízení
c znakové zařízení

K určení typu souboru slouží příkaz file.

vitfo@vitfo-VirtualBox:~$ file Pictures/
Pictures/: directory 

vitfo@vitfo-VirtualBox:~$ file .profile 
.profile: ASCII text

Oprávnění

Oprávnění je určeno trojicí čísel. První znamená oprávnění pro čtení (r), druhé pro psaní (w) a třetí pro vykonání/spuštění (x). V případě, že dané oprávnění není, používá se -. Zde je ukázka souboru bez oprávnění ---------- (10 krát pomlčka). Pro změnu „file mode bits“ slouží příkaz chmod.

Zdroje: