Pole v PostgreSQL

PostgreSQL umožňuje nastavit sloupec jako několika rozměrné pole. V tomto příspěvku ukážu vytvoření sloupců, které budou obsahovat jednorozměrné pole.

Vytvoření tabulky favorite a naplnění daty.

create table favorite (
	id serial not null,
	person_id int not null,
	favorite_names varchar(15)[],
	favorite_numbers int[],

	primary key(id)
);

insert into favorite (person_id, favorite_names, favorite_numbers) values
	(4, '{"Petr", "Anna"}', '{7, 11, 23, 999}'),
	(5, array['Alena'], '{1}'),
	(7, '{"Marie", "Aneta", "Petr"}', array[17, 24]),
	(9, array['Pankrác', 'Servác', 'Bonifác'], array[111, 13, 9, 2]);

Třetí sloupec obsahuje pole řetězců a čtvrtý sloupec pole celých čísel. Pole je možné vytvořit pomocí složených závorek a nebo pomocí konstruktoru ARRAY.


Zobrazení tabulky favorite.

select * from favorite;

postgresql_arrays_01


Vypsání záznamů, které mají první záznam v poli favorite_numbers větší, než druhý záznam.

select * from favorite where favorite_numbers[1] > favorite_numbers[2];

Vypíše třetí oblíbené jméno a druhé oblíbené číslo pro každý záznam.

select favorite_names[3] as "Třetí oblíbené jméno", favorite_numbers[2] as "Druhé oblíbené číslo" from favorite;

postgresql_arrays_02


Zobrazí pro každý záznam počet položek v poli favorite_names (počet oblíbených jmen).

select array_length(favorite_names, 1) as pocet_oblibenych_jmen from favorite;

Zdroje:

View tables v PostgreSQL

Databáze v PostgreSQL obsahuje informační schéma (information_schema) ve kterém jsou různé pohledy (view), ze kterých lze získat informace o objektech v databázi. View information_schema.tables obsahuje informace o všech tabulkách (tables) a pohledech (views) v aktuální databázi.

select * from information_schema.tables;

Výpis celého pohledu information_schema.tables.

select * from information_schema.tables where table_schema = 'public';

Výpis všech informací o tabulkách a pohledech ve schématu public.

select * from information_schema.tables where table_schema = 'nazev_schematu';

Výpis všech informací o tabulkách a pohledech ve schématu s názvem nazev_schematu.

select table_name from information_schema.tables where table_type = 'VIEW';

Výpis všech pohledů (názvů pohledů) v aktuální databázi.

select table_name from information_schema.tables where table_type = 'BASE TABLE';

Výpis všech tabulek (názvů tabulek) v aktuální databázi.

Jak najít tabulky obsahující určité sloupce v PostgreSQL

Může se stát, že víte název sloupce, ale nevíte, v jaké tabulce se tento sloupec nachází. Informace o objektech databáze lze v PostgreSQL nalézt ve schématu information_schema.

Informační schéma (information schema) je množina pohledů (views), které obsahují informace o objektech v databázi. Informace o sloupcích lze nalézt v information_schema.columns view. Zdroj: postgresql.org/…/information-schema.html

Následující select vrátí názvy tabulek, které obsahují sloupce s názvem nazev_sloupce.

select table_name from information_schema.columns where column_name like 'nazev_sloupce'

Daný pohled (information_schema.columns) obsahuje řadu dalších informací např. datový typ sloupce.

Změna textu na malá/velká písmena v Idea IDE

Občas je potřeba změnit určitý text na upper case (velká písmena) nebo lower case (malá písmena). Pro tuto akci má Idea IDE klávesovou zkratku. Označte text, který chcete převést na malá/velká písmena a stiskněte Ctrl+Shift+U. Tato akce funguje i například při commitu při zadávání commit message.

Stejnou akci je možné vyvolat přes nabídku Edit -> Toggle Case. Pro to aby byla volba zpřístupněna je třeba mít označen text.

idea_zmena_textu_na_mala_velka_pismena

Proměnný počet parametrů v Javě

Java umožňuje zadat metodě libovolný počet parametrů pomocí trojtečkové notace. Vnitřně si Java vytvoří pole argumentů a toto pole předá metodě. Jedná se tedy o zjednodušený zápis oproti tomu, abyste museli sami vytvořit pole a to předat.

Mějmě proměnné

 String ahoj = "Ahoj";
 String nazdar = "Nazdar";
 String cau = "Čau";
 String[] pole = {"AA", "BB", "CC", "DD"};
 List<String> seznam = Arrays.asList("XXX", "YYY", "ZZZ");

a metodu

public static void method(Object ... params) {
    for (int i = 0; i < params.length; i++) {
        if (i > 0) {
            System.out.print(" | ");
        }
        System.out.print(params[i]);
    }
    System.out.println();
}

Metodu je možné zavolat bez argumentů, s jedním nebo několika argumenty a nebo za argument zadat pole objektů.

method();
method(ahoj, nazdar, cau);
method(pole);
method(seznam);
method(seznam.toArray());

Výsledek

Ahoj | Nazdar | Čau
AA | BB | CC | DD
[XXX, YYY, ZZZ]
XXX | YYY | ZZZ

Pokud chceme argumenty kombinovat (zadat jak argument tak pole argumentů zároveň) je potřeba vytvořit pole s argumenty a to předat metodě.

List<Object> objectParamList = new ArrayList<Object>();
objectParamList.add(cau);
objectParamList.add(new Date());
objectParamList.addAll(Arrays.asList(pole));
objectParamList.add(123);
objectParamList.addAll(seznam);
objectParamList.add(Math.random());
method(objectParamList.toArray());

Výsledek

Čau | Sun Jan 24 16:41:59 CET 2016 | AA | BB | CC | DD | 123 | XXX | YYY | ZZZ | 0.37927696865182803

Zapsání změn v Gitu jako někdo jiný

V Gitu při zapisování změn (commit) je možné určit autora. Jinak řečeno, je možné provést commit jako někdo jiný. To se může hodit v případě, že zapisujete změny někoho jiného a chcete, aby změny byly připsány tomuto autorovi (aby bylo vidět, že jejich autorem byl někdo jiný než vy).

git commit

Provede zapsání změn a za autora bude uveden ten, kdo je určen v souboru .gitconfig.

git commit --author="František Koudelka <fk@email.cz>"

Provede zapsání změn a za autora bude uveden „František Koudelka“.

git commit --amend --author="Jan Nový <jn@email.cz>"

Pozmění poslední commit a za autora bude uveden „Jan Nový“. Také se změní výchozí zpráva k revizi (commit message) za tu, která je zadána při tomto commitu.

V Idea IDE je také možné změnu autora provést při commitu.

git_zapsani_zmen_jako_nekdo_jiny_v_idee

Provede zapsání změn jako „Petr Zelený“.

V případě, že chcete změnit poslední commit, je třeba zaškrtnout volbu „Amend commit“.

git_zapsani_zmen_jako_nekdo_jiny_v_idee_02

Změní poslední commit tak, že bude obsahovat také nové změny a autorem bude „honzik“.

Nepodporované verze Lubuntu (Ubuntu)

Standardní vydání verze Lubuntu (Ubuntu) je podporováno 9 měsíců. Verze označená LTS (Long Term Support) je podporována 5 roků. Podpora znamená, že jsou vydávány bezpečnostní opravy a updaty.

Verzi a délku podpory jednotlivých verzí lze nalézt na následující adrese (na obrázku je stav z ledna 2016).

lubuntu_nepodporovana_verze_02

I když je verze nepodporovaná, neznamená to, že by byla nepoužitelná. Je možné danou verzi nainstalovat, nebo nadále používat, jen operační systém a programy nebudou získávat updaty. Také není možné instalovat nové programy z centrálního úložiště.

lubuntu_nepodporovana_verze

Vymazání cache v Chrome

Při vytváření webových stránek a hraní si s kaskádovými styly se může lehce stát, že prohlížeč stále zobrazuje webovou stránku s původními styly a nechce, ani po znovu načtení stránky, vzít v potaz změněný soubor stylů.

U prohlížeče Google Chrome se k vymazání cache (a také historie, cookie, hesel, …) dostanete přes Chrome menu (ikona se třemi vodorovnými čarami) -> Další nástroje -> Vymazat údaje o prohlížení … Pro vymazání souborů stylů slouží volba „Obrázky a soubory v mezipaměti“.

chrome_vymazání_cache

Zdroj: support.google.com

Převod streamu primitivních datových typů na stream objektů

V předchozím příspěvku jsem se věnoval streamům, které jako elementy obsahují primitivní datové typy. Jednalo se o následující streamy: IntSteam, DoubleStream, LongStream. Pomocí metody boxed() je možné stream primitivních datových typů převést na stream objektů odpovídajícího datového typu.

// Převod na stream objektů.
Stream<Integer> si = IntStream.range(1, 10).boxed();
Stream<Long> sl = LongStream.of(1_415, 402_112, 999).boxed();
Stream<Double> ds = DoubleStream.generate(() -> Math.random()).limit(5).boxed();

// Zobrazení elementů streamu.
si.forEach(System.out::println);
sl.forEach(System.out::println);
ds.forEach(System.out::println);

Streamy primitivních datových typů v Javě

Java kromě Stream<Object> nabízí i streamy primitivních datových typu. Přesněji řečeno má takové streamy tři:

  • IntStream
  • DoubleStream
  • LongStream

Vytvoření streamu primitivních datových typů
K vytvoření streamu primitivních datových typů je možné, tak jako pro stream objektů, použít metody generate() a iterate().

// IntStream obsahující deset sedmiček.
IntStream isg = IntStream.generate(() -> 7).limit(10);
// IntStream s elementy 0, 1, 2, 3, 4.
IntStream isi = IntStream.iterate(0, i -> i + 1).limit(5);

// Nekonečný DoubleStream, který obsahuje náhodná čísla.
DoubleStream dsg = DoubleStream.generate(() -> Math.random());
// DoubleStream s elementy 1.1, 2.2, 4.4, 8.8, 17.6.
DoubleStream dsi = DoubleStream.iterate(1.1, i -> i + i).limit(5);

// Nekonečný LongStream, který obsahuje čísla 9876543210.
LongStream lsg = LongStream.generate(() -> 9876543210L);
// LongStream obsahující čísla (řády) od 1 miliónu po 1 bilión.
LongStream lsi = LongStream.iterate(1_000_000, num -> num * 10).limit(9);

Dalším způsobem je použít statickou metodu of() a do ní uvést výčet hodnot.

IntStream intStream = IntStream.of(1, 3, 5, 7);
DoubleStream doubleStream = DoubleStream.of(0.52, 15.24, 7.879);
LongStream longStream = LongStream.of(14_854, 4_854);

Stream je možné vytvořit taktéž z pole pomocí statické metody java.util.Arrays.stream().

int[] intArray = { 1, 2, 3, 4};
double[] doubleArray = {12.548, 0.99, 103.1};
long[] longArray = {12, 778_755_441_784L, 1_221};

// IntSteam s elementy 1, 2, 3, 4.
IntStream isFromArray = Arrays.stream(intArray);
// DoubleStream s elementy 0.99 a 103.1.
DoubleStream dsFromArray = Arrays.stream(doubleArray, 1, 3);
// LongStream s elementem 1221.
LongStream lsFromArray = Arrays.stream(longArray, 2, 3);

IntStream a LongStream mají navíc k dispozici statické metody range() a rangeClosed().

// IntSteam s elementy 0, 1, 2, 3, 4.
IntStream isFromRange = IntStream.range(0, 5);
// LongStream s elementy 100, 101, 102, 103.
LongStream lsFromRange = LongStream.rangeClosed(100, 103);

Zdroj: HORSTMANN, Cay S. Java SE 8 for the really impatient. Upper Saddle River, NJ: Addison-Wesley, 2014, xv, 215 pages. ISBN 0321927761.