PDF: Proč je všudypřítomný, ale tak složitý na generování?

Formát PDF (Portable Document Format) je jedním z nejrozšířenějších souborových formátů na světě. Setkáváme se s ním denně – od faktur a smluv, přes e-knihy, až po technické manuály. Ale co vlastně PDF je a proč je jeho generování pomocí programovacích knihoven často mnohem složitější, než bychom čekali?

1. Co je PDF? Vznik a základní fungování

PDF vzniklo v roce 1993 ve společnosti Adobe Systems s jasným cílem: uchovat vzhled a formátování dokumentu nezávisle na platformě, hardwaru nebo softwaru, na kterém je prohlížen. Cílem bylo, aby dokument vypadal naprosto stejně na každém zařízení, ať už jej otevřete na Windows, Macu, Linuxu, telefonu nebo vytisknete.

Jak PDF funguje?

Číst dál

Smazání všech lokálních Git větví

Příkaz git branch zobrazí seznam všech lokálních větví.

Příkaz git branch -r zobrazí seznam všech remote (vzdálených) větví

Příkaz git brach -d nazev_vetve smaže uvedenou lokální větev (pokud již byla mergnutá)

Příkaz git branch -D nazev_vetve smaže uvedenou lokální větev (bez ohledu na její merge status, je to zkratka pro --delete --force)

Smazání všech větví s výjimkou větve s názvem dev se provede příkazem

git branch | grep -v "dev" | xargs git branch -d

Anotace javax.persistence.SequenceGenerator

Anotace @SequenceGenerator se používá k určení generátoru primárních klíčů pro tabulku. Na tento generátor je odkazováno z anotace @GeneratedValue.

name – Název generátoru, který musí být unikátní.
sequenceName – Název sekvence v databázi. Je to sekvence, která již v databázi existuje.
allocationSize – Musí být stejná jako hodnota „auto incerement“ sekvence v databázi.

import cz.vitfo.entity.CustomerEntity.Companion.GENERATOR_NAME
import cz.vitfo.entity.CustomerEntity.Companion.SEQUENCE_NAME
import cz.vitfo.entity.CustomerEntity.Companion.TABLE_NAME
import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
import javax.persistence.Id
import javax.persistence.SequenceGenerator
import javax.persistence.Table

@Entity
@Table(name = TABLE_NAME)
@SequenceGenerator(name = GENERATOR_NAME, sequenceName = SEQUENCE_NAME, allocationSize = 1)
class CustomerEntity(

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = GENERATOR_NAME)
    var id: Long

) {
    companion object {
        const val TABLE_NAME = "t_customer"
        const val SEQUENCE_NAME = "${TABLE_NAME}_id_seq"
        const val GENERATOR_NAME = "${SEQUENCE_NAME}_gen"
    }
}

Povýšení verze gradle v projektu

Verze použitého gradle (gradle wrapperu) je uvedena v adresar_projektu/gradle/wrapper/gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

Stačí změnit verzi v řádku s distributionUrl a reload projects.

Způsob uvedený v dokumentaci je ještě jednodušší. Stačí zadat

./gradlew wrapper --gradle-version 7.2

a verze v gradle-wrapper.properties se změní.

Internet Computer – struktura nového projektu

Tento příspěvek čerpá z oficiálního tutoriálu.

Postup vývoje na lokálním prostředí (zdroj oficiální tutoriál)

Nový projekt se vytvoří příkazem dfx new a nazveme jej stejně jako v oficiálním tutoriálu – explore_hello. Vytvoří se složka explore_hello se soubory projektu a pokud máte nainstalován node.js, přidá se i vzorový front-endový kód a závislosti. Pro zajištění toho, že název projektu bude platný při použití JavaScriptu, Motoka a dalších, je doporučeno používat v názvu pouze písmena, číslovky a podtržítka.

Číst dál

Internet Computer – konfigurační soubor dfx.json

Konfigurační soubor dfx.json obsahuje konfiguraci projektu pro Internet Computer. Tento konfigurační soubor je v kořenovém adresáři projektu. Pokud si vytvoříte projekt s názvem explore_hello (dfx new explore_hello) bude vypadat nějak takto.

{
  "canisters": {
    "explore_hello": {
      "main": "src/explore_hello/main.mo",
      "type": "motoko"
    },
    "explore_hello_assets": {
      "dependencies": [
        "explore_hello"
      ],
      "frontend": {
        "entrypoint": "src/explore_hello_assets/public/index.js"
      },
      "source": [
        "src/explore_hello_assets/assets",
        "dist/explore_hello_assets/"
      ],
      "type": "assets"
    }
  },
  "defaults": {
    "build": {
      "packtool": ""
    }
  },
  "dfx": "0.6.26",
  "networks": {
    "local": {
      "bind": "127.0.0.1:8000",
      "type": "ephemeral"
    }
  },
  "version": 1
}

Část

  • canisters určuje jméno WebAssembly modulu projektu (explore_hello).
  • canisters.explore_hello určuje, že hlavní program (main) je main.mo a že se jedná o motoko program.
  • canisters.explore_hello_assets určuje detaily pro front-end.
  • dfx nastavení určuje verzi software použitého v tomto projektu.
  • network sekce specifikuje o síti, ke které se bude připojovat.

Zdroj: sdk.dfinity.org/docs/developers-guide/tutorials/explore-templates.html

Internet Computer – vytvoření nového projektu

Tak jako předchozí příspěvek, tak i tento čerpá z tohoto quick startu.

Aplikace pro Internet Computer (IC) začínají jako projekt. Ten je možné vytvořit pomocí dfx (viz předchozí příspěvek). Při vytváření projektu pomocí dfx je vytvořena výchozí struktura projektu. V tomto příspěvku budu postupovat podle výše uvedeného tutoriálu.

V terminálu zadejte příkaz dfx new hello (místo hello můžete použí jiný název pro projekt)

Číst dál

Instalace DFinity SDK

Instalace DFinity Canister Software Development Kitu (SDK) je hezky popsána v dokumentaci na sdk.dfinity.org/docs/quickstart/local-quickstart.html. Tento příspěvek čerpá z uvedeného webu a pouze doplňuje pár informací k instalaci na Ubuntu. Je třeba mít nainstalován node.js.

Stažení a instalaci SDK provedete příkazem sh -ci "$(curl -fsSL https://sdk.dfinity.org/install.sh)"

Číst dál