čtvrtek 10. října 2019

Gzip HTTP Request with Spring Boot and Jetty

It is quite easy to get HTTP response gzipped with Spring Boot, all you need is to enable a property:

server.compression.enabled=true # response compression

The gzip encoding of HTTP request is quite different beast and it needs completely different approach.

First of all it is web-container specific - here is Spring configuration for Jetty using its GzipHandler:

@Component
public class JettyCustomizer implements
     WebServerFactoryCustomizer<ConfigurableJettyWebServerFactory> { 

  @Override
  public void customize(ConfigurableJettyWebServerFactory factory) {
    factory.addServerCustomizers(server -> {
        GzipHandler handler = new GzipHandler();
        handler.setInflateBufferSize(2_048);
        handler.setHandler(server.getHandler());
        server.setHandler(handler);
    });
  }
}


The Inflate Buffer Size has to be set and the handler is able to gzip responses as well.

The configuration can be tested using curl:

echo '{"foo":"bar"}' | gzip | curl --http1.1 -i -X POST http://localhost:8080/test -H "Content-type: application/json" -H "Content-Encoding: gzip" --data-binary @-

pátek 9. listopadu 2018

Nest x Yale Lock - první dojmy

Nest x Yale Lock je chytrý zámek, který je společným počinem firem Google a Yale, což je americký výrobce zámků, nyní patřící do koncernu Assa Abloy.
Zámek samotný je koncipovaný jako přídavný zámek, nenahrazuje tedy vložku zámku, zevnitř má knoflík na mechanické zamykání, zvenku dveří má dotykový display na zadání kódu.

Jak se tedy dá zámek ovládat?
  • odemykat a zamykat aplikací Nest v mobilu (i na dálku, pokud je zámek online)
  • zvenku odemykat a zamykat unikátním kódem, který si každý uživatel nastaví v aplikaci (i když zámek je offline)
  • zvenku rychle zamykat jenom stisknutím tlačítka, třemi prsty nebo dlaní (dá se vypnout)
  • zamykat hlasovým pokynem přes Google Assistant / Google Home (odemykání není dostupné prý z bezpečnostních důvodů)
  • volitelné automatické zamykání buď po uplynutí určitého času (10s/1m/5m) nebo pokud systém Nest pozná, že uživatelé nejsou doma
  • zevnitř se dá zámek zamykat a odemykat klasickým knoflíkem
Velice zajímavou funkcí, a vlastně hlavním důvodem proč jsme zámek pořizovali, je možnost vytvoření "návštěvníků", kteří mají přidělený svůj kód kterým mohou zámek otevřít, a který navíc může být omezený časově - jak dobou začátku a konce platnosti, tak určitými dny v týdnu a dokonce i časovými úseky v rámci jednoho dne.

Dočasně jde přístup návštěvníkům zakázat zapnutím privátního módu - tlačítkem na vnitřní straně zámku nebo pomocí aplikace.

Nastavování uživatelských a návštěvnických účtů probíhá prostřednictvím aplikace a ta také umožňuje zobrazit historii - kdy který uživatel nebo návštěvník zámek odemkl nebo zamkl (pokud nebylo použité rychlé zamknutí nebo knoflík). Aplikace taky umí zobrazit notifikace když dojde k odemknutí nebo zamknutí zámku.

Zámek je napájený klasickými tužkovými bateriemi a není připojený přímo na Wi-Fi, ale připojení mu bezdrátově zprostředkovává buď Nest Connect (krabička, co se připojí do zásuvky) nebo Nest Guard (krabička, cose stará o zabezpečení domu). Pro případ že zámku dojdou baterky, jsou z vnější spodní strany přístupné konektory, ke kterým se dá připojit 9V baterka a zámek otevřít pomocí kódu.

Zámek jsme o víkendu nainstalovali a první dojmy jsou skvělé. Po pár dnech používání se zdá, že zámek plní naše očekávání a navíc opravdu dobře vypadá. Z venkovní strany bych se vizáž nebál označit za až futuristickou, vnitřní strana je trošku hmotnější než jsem čekal, ale nic, za co bychom se museli stydět. Před montáží působí zámek velice robustně - hlavně venkovní část, která je v podstatě odlitek z jednoho kusu s displayem, připevněná skrz dveře šrouby k vnitřnímu dílu.

Ovládání kódem a tlačítkem je naprosto bezproblémové - při ovládání z aplikace je nejdřív nutné přidržet tlačítko, až po kratší prodlevě se zámek otočí.

Největší komplikací zůstává instalace. Zámek je určený na bezfalcové dveře šířky 3,5 - 4,5 cm, a díl zámku se závorou (věc, co vyjede, pokud se otočí v zámku klíčem) má šířku 21mm a plech kolem závory dokonce 22 mm. Jenomže klasické české dveře mají falc šířky 2 cm, takže je při instalaci potřeba projevit notnou dávku kreativity. Mimo to je potřeba myslet na to, že zámek je určený jako přídavný, a tím pádem neovládá střelku (věc, co zajede, když se zmáčkne klika). Z toho důvodu je možné jej instalovat pouze na dveře, které mají zvenku kliku nebo jsou osazeny střelkou s válečkem, jinak by nešly zvenku otevřít.

Pokud se s tímto člověk popere, tak vzhledem k funkcím vychází Nest x Yale Lock za cenu v přepočtu 6.600 Kč jako výborná koupě


čtvrtek 15. února 2018

Jak Raspberry PI s dynamickou IP adresou přiřadit doménové jméno

Ať je důvodem to, že se někteří členové domácnosti nekamarádí s IP adresami a jejich zjišťováním z ARP tabulek, obyčená pohodlnost, nebo něco úplně jiného, hodí se mít Raspberry PI nebo jiné zařízení (třebaže umístěné v privátní síti) dostupné prostřednictvím doménového jména.

Použít se dá třeba DuckDNS, což je zdarma dostupná dynamická DNS služba, která vybranému doménovému jménu prostřednictvím jednoduchého API přiřazuje IP adresy.

Po přihlášení do DuckDNS si zvolíme doménové jméno, které bude přístupné jako JMENO.duckdns.org a získáme API token.

Návod na DuckDNS webu vybízí k aktualizaci IP adresy z cronu, ale na operačních systémech používajících Systemd (např. Raspbian a jeho klony) existuje elegantnější řešení, které prostřednictvím Systemd zajistí update IP adresy pokaždé, když se zařízení připojí do sítě.

Vytvoříme Systemd unit v souboru /etc/systemd/system/duckdns.service například příkazem systemctl edit --full --force duckdns.service:

[Service]
Type=oneshot
ExecStart=/bin/bash -c "curl --silent https://www.duckdns.org/update?domains=JMENO\\&token=TOKEN\\&verbose=true\\&ip=$(hostname -I)"
RemainAfterExit=yes

[Unit]
Wants=network-online.target
After=network-online.target

[Install]
WantedBy=multi-user.target

Funkčnost ověříme pomocí:
systemctl restart duckdns && systemctl status duckdns
Pokud výstup obsahuje OK, je vše v pořádku, KO značí problém.

Povolíme spouštění:
systemctl enable duckdns

Na závěr zajistíme spouštění network-online.target po té, co je k dispozici síť, podle správce připojení.
Raspbian a spol:
systemctl enable connman-wait-for-network.service
Ubuntu a spol:
systemctl enable NetworkManager-wait-online.service
Jinak:
systemctl enable systemd-networkd-wait-online.service

Pokud náhodou nepoužijeme k editaci unitu systemctl edit, je nutné změny aplikovat pomocí příkazu systemctl daemon-reload

Pro umocnění efektu můžeme ještě DNS záznam z vlastní domény JMENO.example.com nasměrovat jako CNAME na JMENO.duckdns.org.

úterý 7. listopadu 2017

How to change ThinkPad's key binding

My ThinkPad has two keys originally intended as Back/Forward actions e.g. in web browser.

As I find them not very usable for browsing, I was searching for a way how to give them much useful role: eg. Page Down/Page Up.

My Ubuntu uses XKB, so here is the receipe:

  1. open /usr/share/X11/xkb/symbols/inet
  2. change lines
    key <I166> { [ XF86Back ] };
    key <I167> { [ XF86Forward ] };
    to
    key <I166> { [ Prior ] };
    key <I167> { [ Next ] };
  3. restart the computer 

čtvrtek 3. srpna 2017

How to erase Thinkpad's SSD

As SSD can't be reliably erased using ordinary commands like rm nor shred, Lenovo provides a special Drive Erase Utility which is able to erase drive using USB stick.
  1. Create VFAT partition on a USB Drive
  2. On USB create a directory EFI with BOOT subdirectory
  3. Download ZIP file with Drive Erase Utility
  4. Extract ZIP file and place .EFI file into BOOT directory
  5. Check the computer boots from "UEFI first" (combined mode with "Legacy first" mode may not work)
  6. Place the USB into port, boot and follow on-screen instructions
Read more about FDE - Full Disk Encryption.

pátek 26. září 2014

Výhledy ze Syslíkovic nory

Jelikož nová Syslíkovic nora je spíš povahou orlí hnízdo nabízející nepřeberné množství výhledů a panoramat, množí se dotazy, co že je to, co je vidět.

V prostoru, který dřív částečně patřil k parku Lužánky a kde park přecházel do soukromých zahrad, byla v roce 1860 založena první vilová kolonie v Brně. První vily v této lokalitě navrhl brněnský stavitel Josef Arnold. Nejstarší Kaiserova vila byla postavena v roce 1860, v roce 1862 Arnoldova vila, Giskrova vila a dnes již zbořená Adamčikova vila.

Vila Tugendhat (1930)
Klenot brněnské funkcionalistické archtektury pozná většina návštěvníků a není ji potřeba asi moc představovat.
Navrhl ji Ludwig Mies van der Rohe pro manžele Fritze a Gretu Tugendhatovy na pozemku, který jim daroval Gretin otec. Tugendhatovi žili ve vile do května 1938 kdy před hrozbou války odjeli do Švýcarska. V roce 1939 vilu zabavilo Gestapo, v letech 1945-1950 zde byla soukromá taneční škola, od roku 1950 byla ve vlastnictví československého státu a do konce sedmdesátých lete zde bylo rehabilitační středisko pro děti jako součást nedaleké dětské nemocnice. V roce 1992 zde po proběhlých jednáních byla podepsána smlouva o rozdělení státu.
Od roku 1980 je vila ve vlastnictví města Brna a od roku 2012 je vila otevřena veřejnosti.

Arnoldova vila (1862)
Vila stavitele Josefa Arnolda patřila od roku 1909 Cecílii Hože, sestře Alfreda Löw-Beera, která ji v letech 1909-1915 dala upravit ve stylu art deco s prvky secese. V roce 1939 vilu zabavilo Gestapo, po válce ji vlastnil stát, po té město Brno a v letech 1952-2012 v ní byla mateřská školka.
Vila je ve špatném stavu a v roce  2012 byla zapsána na seznam nejohroženějších kulturních nemovitých památek.

Löw-Beerova vila (1903-1904)
Secesní vilu nechal postavit brněnský textilní průmyslník Moritz Fuhrmann. Tři roky po jeho smrti v roce 1910 prodali jeho synové továrníkovi Alfredu Löw-Beerovi, otci Grety Tugendhatové.
V roce 1940 vilu zabavilo Gestapo, od roku 1954 je majetkem státu a od roku 1962 zde sídlil Domov mládeže.
Vila se v současné době opravuje.

Zahradní domek Samuela Berana (1919-1920)
Letní dřevěný zahradní domek postavil pro továrníka a prvního poválečného předsedu brněnské židovské obce Samuela Berana a jeho ženu Hermine na zahradě jejich vily Ernst Wiesner.
Domek využívá Ústav geoniky Akademie věd.

středa 13. srpna 2014

Vertica a historické dotazy

Sloupcová databáze Vertica má zajímavou vlastnost, která umožňuje dělat dotazy i na již neexistující data (smazaná nebo změněná).
Syntaxe vypadá tak, že se před běžný dotaz SELECT předřadí čas, ve kterém nás zajímá stav dat:

at time '2014-08-13 00:30:00' select * from moje;

Celé to funguje tak, že Vertica po operaci DELETE nemaže smazané řádky přímo, ale jenom je jako smazané označí. Operaci UPDATE Vertica implementuje jako smazání řádku a vložení nového (DELETE+INSERT).

Metadatům o smazaných řádcích Vertica říká delete vektory a jejich stav můžeme zjistit ze systémové tabulky delete_vectors:

select projection_name,sum(deleted_row_count) as deleted_row_count,floor(sum(used_bytes)/1024) as used_kb from delete_vectors group by projection_name order by projection_name;
 projection_name | deleted_row_count | used_kb 
-----------------+-------------------+---------
 moje_super      |                 5 |      16

To, jak daleko do historie Vertica "vidí", se konfiguruje pomocí parametrů HistoryRetentionTime (počet sekund) nebo HistoryRetentionEpochs (počet zpětně uchovávaných epoch). Pokud oba parametry nastavíme na -1, Vertica si bude smazaná data pamatovat navždy.

Seznam aktuálních epoch můžeme zjistit ze systémové tabulky epochs:

select * from epochs;
       epoch_close_time        | epoch_number 
-------------------------------+--------------
 2014-08-13 12:05:52.71345+02  |        16259
 2014-08-13 14:49:47.034859+02 |        16260
 2014-08-13 14:49:47.04223+02  |        16261

Pro zjištění údajů o aktuální epoše můžeme využít funkce:

select GET_AHM_TIME() as time, GET_AHM_EPOCH() as epoch;
                      time                      | epoch
------------------------------------------------+-------
 Current AHM Time: 2014-08-13 14:49:47.04223+02 | 16261

AHM znamená Ancient History Mark a je to značka, označující nejstarší uchovávanou epochu -- starší epochy je možné smazat.

AHM je možné nastavit i ručně, funkcemi SET_AHM_TIME (nastaví AHM na daný čas),
SET_AHM_EPOCH (nastaví AHM na danou epochu), MAKE_AHM_NOW (nastaví AHM na aktuální čas).

Skutečné mazání dat (PURGE) z epoch starších než AHM řídí Vertica automaticky nebo je můžeme vyvolat ručně.
O automatiku se stará komponenta Tuple mover při provádění operace mergeout -- neplést s operací moveout, která přesouvá data z Write Optimized Storage (WOS) do Read Optimized Storage (ROS).
Ruční purge můžeme provést funkcemi PURGE_TABLE (provede purge dat v dané tabulce a všech jejích projekcích), PURGE_PROJECTION (provede purge dat v dané projekci) a PURGE (provede purge v celém databázovém schématu).