<![CDATA[Martin Hujer blog]]> 2019-10-10T11:15:39+00:00 https://blog.martinhujer.cz/ Sculpin <![CDATA[Jaké novinky přinese PHP 7.4]]> 2019-10-07T00:00:00+00:00 https://blog.martinhujer.cz/jake-novinky-prinese-php-7-4/ Vydání PHP 7.4 je plánováno na 28. listopadu 2019. Přináší hromadu zajímavých věcí – Typed Properties, Arrow Functions, Preload, FFI a pár dalších vylepšení. Sice přibyly i nějaké deprecations, ale typicky se týkají podivného chování, takže upgrade by měl být snadný.

Článek vyšel na serveru Zdroják.cz

]]>
<![CDATA[How to use Data Providers in PHPUnit]]> 2019-09-03T00:00:00+00:00 https://blog.martinhujer.cz/how-to-use-data-providers-in-phpunit/

I think that even if you are already using Data Providers, you will find some of those tips useful.

Data Providers are a handy feature of PHPUnit which allows you to run the same test with different inputs and expected results. This is useful when you are writing some text filtering, transformations, URL generation, price calculations, etc.

Let's say you are implementing your own trim function and you need to test it with lots of tests like the following one:

<?php

public function testTrimTrimsLeadingSpace(): void
{
    $input = ' Hello World';
    $expectedResult = 'Hello World';

    self::assertSame($expectedResult, trim($input));
}

Instead of duplicating the test method and just changing the inputs, you can use Data Providers:

<?php

/**
 * @dataProvider provideTrimData
 */
public function testTrim($expectedResult, $input): void
{
    self::assertSame($expectedResult, trim($input));
}

public function provideTrimData()
{
    return [
        [
            'Hello World',
            ' Hello World',
        ],
        [
            'Hello World',
            " Hello World \n",
        ],
    ];
}

Data Provider is just a regular public method in the test case class which returns an array of arrays.

  • You link it to the test method with a @dataProvider annotation followed by the method name.
  • Parameters returned from the data provider are added to the method definition. (I prefer to pass the expected value as a first parameter to match the assert* methods)
  • PHPUnit runs the test method with each data set as a separate test.

Here is a screenshot of running the test above in PhpStorm: PHPUnit: basic data providers in PhpStorm

Now you know how to use basic Data Providers. In the rest of the article I will dive into more advanced stuff and tips.

Tip #1: Always name the data providers

By default, each data provider is referenced by its array index. It means that when running it, PHPUnit will tell you, that the test failed with data set #0.

To prevent confusion when having lot of data providers, you should always name them. Because the data provider method returns a regular array, it is as easy as adding keys there:

<?php

public function provideTrimData()
{
    return [
        'leading space is trimmed' => [
            'Hello World',
            ' Hello World',
        ],
        'trailing space and newline are trimmed' => [
            'Hello World',
            "Hello World \n",
        ],
        'space in the middle is removed' => [
            'HelloWorld',
            "Hello World",
        ],
    ];
}

It makes test results much easier to understand:

PHPUnit: named data providers in PhpStorm

I recommend that you name the data sets the same way you would use for separate tests.

Tip #2: You can run single data set from data provider

When there is something wrong with one of the data sets, you probably want to run the test only with it. You can do so by using PHPUnit's --filter option in CLI.

Here are examples of what is possible (the documentation shows examples with ', but that does not work on Windows, where you have to use " to wrap the argument):

  • --filter "testTrimTrims#2" runs data set #2 (third data set, as the array keys start at zero)
  • --filter "testTrimTrims#0-2" runs data sets #0, #1 and #2
  • --filter "testTrimTrims@trailing space and newline are trimmed" runs specific named data set
  • --filter "testTrimTrims@.*space.*" runs named data sets that match the regexp

Don't forget to check the other possible patterns in docs.

PhpStorm does not currently allow you to run a single data set from the code (please vote for the issue WI-43933), but you can run all of them and then rerun one from the test results. When you have the JetBrains issue tracker open, please also vote for WI-43811 (possibility to go to the data set from the test results).

When I want to run a single data set from the PhpStorm I usually just comment out all the other data sets.

Tip #3: Add type definitions

I always add type hints to the method definitions when possible. When using data providers, it means adding parameter type hints to the method that accepts data sets and adding a return type (and phpdoc) to data provider method:

<?php

/**
 * @dataProvider provideTrimData
 */
public function testTrimTrims(
    string $expectedOutput,    // <-- added typehint here
    string $input              // <-- added typehint here
): void
{
    self::assertSame($expectedOutput, trim($input));
}

/**
 * @return string[][]          // <-- added typehint here
 */
public function provideTrimData(): array     // <-- added typehint here
{
    return [
        'leading space is trimmed' => [
            'Hello World',
            ' Hello World',
        ],
        'trailing space and newline are trimmed' => [
            'Hello World',
            "Hello World \n",
        ],
    ];
}

If you need to have a nullable type in the test method, I recommend splitting it into two separate methods and data providers. Instead of having testTransformData(?string $expectedResult, string $input) with a nullable parameter I would create those:

testTransformData(string $expectedResult, string $input) testTransformingInvalidDataReturnsNull(string $invalidInput)

Tip #4: Data providers are supported well in PhpStorm

Despite the issues I mentioned above (WI-43933 and WI-43811) I think that Data providers support in PhpStorm is quite good.

When you reference non-existing data provider, you can use quick action to generate it: PhpStorm: create data provider quick action

Auto-completion of data provider name works in the @dataProvider annotation: PhpStorm: rename data provider refactoring

Renaming the data provider using Rename refactoring also works as expected: PhpStorm: rename data provider refactoring

Tip #5: More complex data providers

Instead of having a static array written in the code, the data providers can be more complex and prepare the data set dynamically.

For example, when having the external data, you can easily generate resulting array this way:

<?php
/**
 * @return string[][]
 */
public function provideSpams(): array
{
    $spamStrings = require __DIR__ . '/fixtures/spams.php';

    $result = [];
    foreach ($spamStrings as $spamString) {
        $result[mb_substr($spamString, 0, 40)] = [$spamString];
    }

    return $result;
}

You should be careful with adding lot of logic to the data provider. Otherwise you would have to write a test that tests the data provider...

You can even return instances from the data provider:

<?php

public function provideDateTimesPartOfDay(): array
{
    return [
        [
            'morning',
            new DateTimeImmutable('2018-10-01 10:00:00'),
        ],
        [
            'afternoon',
            new DateTimeImmutable('2019-09-01 15:00:00'),
        ],
    ];
}

Tip #6: You can use Closures in Data providers to delay evaluation

The disadvantage of data providers is that they are evaluated before anything else (to allow PHPUnit calculate the total number of tests). It means that they can't access anything initialized in setUpBeforeClass() or setUp().

You can work around this limitation by returning closures from data providers. Have a look at the code bellow - data provider returns a closure which is called in the test itself.

<?php

/**
 * @dataProvider provideDateTransformations
 */
public function testWithClosuresInDataProvider(
    string $expectedResult,
    Closure $setTime
): void
{
    $dateTime = new DateTime('2019-09-01');

    $setTime($dateTime);

    self::assertSame($expectedResult, $dateTime->format('Y-m-d H:i:s'));
}

public function provideDateTransformations()
{
    return [
        'midnight' => [
            '2019-09-01 00:00:00',
            function (DateTime $date): void {
                $date->setTime(0, 0, 0);
            },
        ],
        '3 o\'clock in the afternoon' => [
            '2019-09-01 15:00:00',
            function (DateTime $date): void {
                $date->setTime(15, 0, 0);
            },
        ],
    ];
}

Tip #7: Use yield to simplify large nested arrays

Instead of having large arrays in the data provider, you can use yield for each data set:

<?php
public function provideTrimData()
{
    yield 'leading space is trimmed' => [
        'Hello World',
        ' Hello World',
    ];
    yield 'trailing space and newline are trimmed' => [
        'Hello World',
        "Hello World \n",
    ];
    yield 'space in the middle is removed' => [
        'HelloWorld',
        'Hello World',
    ];
}

I think it may help with code readability for large arrays. However similarly to arrays, all yields are evaluated before tests start (PHPUnit calculates the total number of tests before running them).

Tip #8: Don't use @testWith annotation

Instead of using a separate method for data provider, PHPUnit supports inlining the data sets as JSON in PHPDoc using the @testWith annotation.

<?php
/**
 * @testWith
 *        ["Hello World", " Hello World"]
 *        ["Hello World", "Hello World \n"]
 *
 */
public function testTrim($expectedResult, $input): void
{
    self::assertSame($expectedResult, trim($input));
}

Please do not use this, because PHPDocs is not a good place to put your code:

  • syntax highlighting does not work there
  • IDE code validation does not work there
  • automatic code formatting does not work there
  • it cannot be analysed statically by PHPStan

Conclusion

Do you have other tips to use Data Providers even more efficiently? Please share them in the comments!

]]>
<![CDATA[Don't put .idea and .vscode directories to project's .gitignore]]> 2019-08-26T00:00:00+00:00 https://blog.martinhujer.cz/dont-put-idea-vscode-directories-to-projects-gitignore/

tl;dr: Don't put .idea and .vscode directories to project's .gitignore. You should configure a global .gitignore for your machine instead.

When you are using git (or any other version control), there are some temporary files in the directory structure, which should not be included in the repository. Usually they are listed in the .gitignore file in the project root directory.

What if I told you that there are other ways to exclude temporary files from the project? There are three.

1. .gitignore file in the project's root

.gitignore in the project is the most important one. In it you should list any files or directories which are created by the application itself. Best examples are cache files, logs, local configs etc.

In the Symfony application your .gitignore may look like this (I included an explanation on each line):

/.env.local   <-- local config
/.env.*.local   <-- local config
/var/   <-- cache and logs
/vendor/   <-- dependencies installed through Composer

# PHPUnit
/phpunit.xml   <-- local PHPUnit config used for overriding the default phpunit.xml.dist
.phpunit.result.cache   <-- PHPUnit cache files

# PHPCS
/phpcs.xml   <-- local PHPCS config used for overriding the default phpcs.xml.dist
.php_cs.cache   <-- PHPCS cache file

The important thing is that those files are created by the application itself by either building it, running it or doing some work on it.

2. Global .gitignore for your machine

Some files or directories present in the application directory are not created by the application itself, but by the operating system or other applications. Those shouldn't be excluded using the project's .gitignore, because they may differ from developer to developer.

Common examples are .idea (PhpStorm), .vscode (VS Code), Thumbs.db (Windows thumbnails cache), .DS_Store (some macOS cache).

There is a perfect place for them - the global .gitignore file for the machine. When you add something there, it is ignored in any repository, so you don't have to exclude those files in every project you happen to be working on.

You configure the path to the global .gitignore in the .gitconfig file which usually resides in your home directory:

# add this to ~/.gitconfig:

[core]
    excludesfile = ~/.gitignore

And create the .gitignore file in your home directory:

# create ~/.gitignore

# PhpStorm
.idea

# VSCode
.vscode

From now on, those will be ignored in any git repository on your machine.

Quite often I see people adding those anyway. From a quick Github search you can see that there are almost 200k results for commits which mention some commonly ignored directory:

There is no point in adding those for the internally developed applications, as you can nudge each developer to properly configure his workstation. But if you are managing an open-source application or library, you may want to make it easier for newcomers to submit patches - even though you know it is not a clean solution. On the other hand, do you expect to receive high-quality contributions from developers who don't bother to properly configure their workstations?

3. .git\info\exclude

For the sake of completeness, I must mention the third option. You can use .git\info\exclude file to exclude files for a single repository. But those exclusions are not versioned, so the others won't benefit from them.

I can't remember using it, but you may find it useful in some situations.

Conclusion

Imagine that there is a new editor called Extra Textedit with an advanced AI which really helps with coding. As it becomes more popular, there will be a flood of commits and Pull Requests with add .eedit directory to .gitconfig.

Please use the global .gitignore and don't make the people on the internet spend hundreds or thousands of hours on this.

Btw. I recommend reading the gitignore documentation to learn more about the patterns you can use to exclude files.

]]>
<![CDATA[Oslo - co vidět? Kam na výlety?]]> 2019-08-15T00:00:00+00:00 https://blog.martinhujer.cz/oslo-kam-na-vylety/ V červenci 2019 jsme byli týden v Oslu a stihli jsem toho spoustu, včetně dvou zajímavých hike za město, tak třeba se vám to bude hodit jako inspirace.

Výhled na Oslo z Ekebergparken

Cesta do Osla

Letěli jsme z Prahy s Norwegian. Tím, že jsme byli docela omezení ve výběru termínu, tak nás nakonec zpáteční letenky (pro oba) stály 8700 Kč. Několik dnů po zabookování nám přišel mail, že zpáteční let ruší a že nás přehodili na jiný den. Pokud je to více než 14 dnů do odletu, tak to mohou klidně udělat. Ale v profilu pak šlo letenky zadarmo přebookovat na jiný termín, takže jsme zpáteční let přehodili na další den, na který ty lety předtím byly drahé. No a jako vždy jsme letěli jen s příručákem. Ani v Praze ani v Oslu velikost zavazadel neměřili.

MHD v Oslu

MHD v Oslu provozuje Ruter As a funguje to super. Na jízdenky se používá aplikace RuterBillet, kde si jízdenky přímo kupujete (existuje alternativa s nějakou plastovou kartičkou, to jsme nezkoumali). Koupili jsme si týdenní jízdenky. Výhoda je, že je můžete koupit dopředu a vybrat si čas začátku platnosti a případně je zapnout ručně. Kupodivu nefungovala platba kartou (MasterCard ani VISA, Airbank ani Fio), takže jsme platili PayPalem.

Většina Osla je v zóně 1, takže týdenní jízdenka nám stačila na tu jednu zónu. A na těch několik cest mimo si jde přes aplikaci přikoupit "Extra" na tu konkrétní zónu. Mají to hezky udělané, že místo toho, abyste museli zkoumat, jakou zónu chcete, jen vyberete, kam chcete jet a ono to ukáže, jakou zónu si máte koupit. Ty tickety na extra zónu jsou jen asi na hodinu až dvě, takže jde zase nastavit začátek platnosti a případně to těsně před nástupem do autobusu/lodi/vlaku odstartovat ručně.

Pro hledání spojů buď můžete používat Google Maps nebo jejich aplikaci RuterReise (ta ukazuje i zóny).

Většinu toho zvládnete linkami metra, které kromě centra jezdí po povrchu (historicky to bylo tak, že postupně zapojili samostatné tramvajové tratě do struktury metra).

Cesta z letiště

Z letiště je nejlepší jet vlakem VY. Pozor, na letišti mají mnohem lépe vidět prodej jízdenek do Airport Express Train (Flytoget), který stojí mnohem víc a není o moc rychlejší. Jízdenky na VY vlak si koupíte v automatu vlevo od toho Flytogetu. Nebo ještě lépe - pokud budete už mít dopředu koupenou jízdenku na MHD v RuterBillet, tak si jen přikoupíte zónu na letiště - je to levnější, než celá samostatná jízdenka.

Oslo - letiště

Peníze a nakupování

V Norsku je docela draho, cca 2-3× než v ČR. Vzhledem k tomu, že kurz NOK je 2.7 CZK, tak se dá docela dobře orientovat podle cen, které mají kde napsané - jsou podobné jako v ČR, jen nesedí měna :-) (streetfood 110-150 NOK atd.)

Zajímavost: V Norsku fungují zálohy na PET láhve a plechovky, podobně jako v ČR na láhve od piva. (video)

Všude se dá platit kartou. I když jsme došli lesem na takovou chatu, kde měli suché záchody, tak stejně měli terminál na karty. Stejně tak kiosek na ostrůvku u pláže. A veřejné záchodky v parku mají u dveří také terminál na pípnutí kartou. Takže jsme za celý týden neměli v ruce žádné norské peníze (ale nosili jsme nějaká eura, kdybychom s kartou náhodou někde neuspěli.)

Bydleli jsme na Airbnb, takže jsme si večeře vařili a k obědu jsme měli vždycky svačinu, protože jsme stejně byli někde na výletě. Suroviny v obchodě zas tak drahé nejsou (doporučuji supermarkety Kiwi nebo Rema 1000). A třeba takový chlazený losos stojí stejně jako v ČR ;-)

Když mluvím o bydlení, tak doporučuji bydlet na metru a max pár stanic od centra, ať ušetříte čas.

Elektroauta

V Norsku se prodává víc elektroaut než těch se spalovacím motorem. Je to hlavně kvůli různým úlevám pro EV a naopak ekologické dani z aut se spalovacím motorem (více info). Vzhledem k tomu, že většinu elektřiny (95 %) získávají z vodních elektráren, to zní jako super nápad. Nevýhoda je, že rozvodná síť na to není připravena a budou do ní muset hodně investovat.

A s tím souvisí jedna zajímavost - Ruter (dopravní podnik v Oslu) zkouší na jedné krátké lince provozovat autonomní elektrické minibusy. To jsme samozřejmě museli vyzkoušet :-)

Autonomní miniautobus

Drøbak a Oscarsborg - výlet lodí

Drøbak je vesnice asi 30km od Osla, kam se dá dojet MHD lodí (pozor, je potřeba přikoupit zóny - viz výše). Když budete stát frontu na trajekt, tak vám bude připadat, že se tam nevejdete - ale ta loď je fakt velká (cca pro 200 lidí), tak se nebojte.

Drøbak - cesta lodí

Lodí můžete dojet až do Drøbaku nebo vystoupit o zastávku dříve, na ostrově Oscarsborg, kde je vojenská pevnost. Odtamtud se pak dá do Drøbaku dostat přívozem. Je to dost důležité místo norských dějin, protože v roce 1940 se jim z té pevnosti podařilo potopit německý křižník Blücher a tím zbrzdit invazi Němců do Osla tolik, že norský král a vláda stihl utéci. Doporučuji přečíst článek na Wikipedii: Battle of Drøbak Sound. My jsme tam nebyli, protože jsem to zjistil až potom.

Drøbak - Oscarsborg

V samotném Drøbaku je zajímavá třeba pláž, Husvikbatteriet - dělo, které se přičinilo o potopení křižníku Blücher. A kousek na kopci Veisvingbatteriet - další děla, tentokrát v lepším stavu a se super výhledem na Oscarsborg.

Drøbak - dělo

Zpátky z Drøbaku jsme už jeli autobusem, kterým to je rychlejší, než lodí.

Østmarka hike (16 km)

Oslomarka je označení pro lesnatou a kopcovitou krajinu v okolí Osla, kterou Norové využívají k rekreaci (výlety, kola atd.). My jsme vyrazili do východní části nazvané Østmarka.

Østmarka - Svartputten

Østmarka

Metrem jsme dojeli na konečnou, do Ellingsrudåsen. Tam už kousek od východu z metra (který je vyražený ve skále!) začíná turistická trasa. Nejprve jsme šli kousek po hlavní turistické, která je zároveň cyklostezka, ale pak jsme odbočili směrem na Haukåsen. Většinou se nám podobné pokusy - třeba vylézt na nějaký vysoký kopec v okolí - odmění fajn zážitkem. Cestou jsme si udělali malinkou odbočku k jezeru Svartputten a pokračovali jsme se na Haukåsen. Ten je zajímavý zejména tím, že tam je umístěný radar.

Haukåsen radar

Odtamtud jsme došli na chatu Mariholtet, kde se dá občerstvit. Co nás hodně překvapilo bylo, že si místní nedávají pivo, ale kávu nebo colu. To by se v Čechách nestalo :-)

Dál jsme pokračovali po červené a pak po západní straně jezera Lutvann, odkud byl super výhled. Nakonec jsme došli na metro do Haugeurd a jeli domů.

Østmarka - Lutvann

Mrkněte na celou trasu na Wikiloc.

Výhoda chození na výlety v Norsku v létě je, že vám díky pozdnímu soumraku nehrozí, že byste se do tmy nestihli vrátit.

Holmenkolen

Holmenkollen je známý skokanský můstek, kde se konají různé důležité závody (nejen) ve skocích na lyžích. První můstek tam byl postaven koncem 19. století a zajímavé je, že ho jednou za čas zbourají a pak postaví nový a větší (naposledy v roce 2010).

Holmenkolen

Metrem dojedete do stanice Holmenkollen a odtamtud dojdete kousek k můstku. Součástí areálu je muzeum, které popisuje historii samotného můstku, ale i polárních výprav. V ceně vstupenky je i výstup (resp. vyvezení se výtahem) na vršek můstku, odkud je super výhled. Doporučuji jít nejdříve vystát tu frontu na výtah, čím tam dorazíte později, tím je větší. Ale muzeum určitě nevynechejte (můžete si ho projít až po návratu z vyhlídky).

Kromě výhledu nabízí horní plošina možnost sjet si dolů na zipline - ale mě to teda přišlo dost vysoko :-) (na fotce jsou vidět ta ocelová lana)

Holmenkolen

Hike přes Vettakollen a Ullevålseter k jezeru Sognsvann (15 km)

Z Holmenkollen jsme popojeli pár stanic na zastávku Vettakollen, odkud jsme vyrazili na další hike.

První část cesty je trochu do kopce, ale brzy přijde odměna v podobě super výhledu na Oslo (je to kupodivu dříve, než samotný vrchol Vettakollen - odtamtud není vidět nic).

Vettakollen výhled

Pak pokračujete lesem, cestou občas potkáte nějaké jezero, jezírko nebo mokřad. Nejvzdálenějším bodem je Ullevålseter, což je taková horská chata, u které se potkávají různé turistické a cyklo trasy. I když to je uprostřed ničeho, tak samozřejmě jde platit kartou. A pozor, podle webu mají v pondělí zavřeno, tak ať vás to nepřekvapí. Dali jsme si tak ke svačině kávu, horkou čokoládu a něco sladkého.

Chata Ullevålseter

Jezero Lille Aklungen

Cestou zpět jsme šli kolem dvou velkých jezer, a nakonec jsme došli k jezeru Sognsvann. To je kousek od města, takže tam spoustu místních chodí běhat.

Celá trasa opět na Wikiloc.

Jezero Sognsvann

Grilování, jednorázové grily

Možná to bylo tím, že jsme v Oslu měli dobré počasí, ale mezi místními je hodně populární grilování na jednorázových grilech (takové ten alobalový tácek naplněný uhlím). Grilují všude možně, třeba právě u toho jezera Sognsvann.

Hodně zajímavé je, že tomu museli přizpůsobit infrastrukturu. Na místech, která se hodí na grilování, mají kromě obyčejných košů také speciální kovový koš na vyhazování těch jednorázových grilů!

Koš na grily

Káva

Na kávu jsme nikam moc nechodili, takže mám jen jeden tip na kavárnu - Espresso House.

Na Airbnb byl Nespresso kávovar, takže jsme si kávu vařili doma. S tím souvisí zajímavost - jak jsem psal výše, tak všechno je v Norsku 2-3× dražší, ale Nespresso kapsle stojí v přepočtu stejně jako v ČR (NOK 3,89 vs CZK 9,90). Pro kapsle jsme se stavili v Nespresso obchodě na jejich "Pařížské".

Oslo - ostrovy Langøyene a Gressholmen

Kromě delší cesty lodí do Drøbaku, o které jsem psal výše, můžete v Oslu vyrazit MHD lodí na ostrovy, které jsou kousek za městem (a zase platí, že ta loď vypadá malá, ale vejde se tam spoustu lidí, takže nezůstanete na břehu ani když tam bude velká fronta).

My jsme nejdříve vyrazili na Langøyene, kde je fajn pláž. Kromě toho to je jediný z ostrovů, na kterém se může stanovat. Kousek od pláže je kiosek, který samozřejmě přijímá platební karty.

Odtamtud jsme přejeli na ostrov Gressholmen. Ten je mnohem více zarostlý, ale taky je na něm několik pláží. A zajímavostí je, že na něm kdysi bylo první norské letiště (pro hydroplány).

Oslo

A teď zajímavé věci v samotném Oslu.

Ekebergparken

Ekebergparken je kopec s parkem na kraji Osla. Nejlepší je dojet tramvají přímo do zastávky Ekebergparken a odtamtud se projít po parku, prohlédnout si sochy a dojít na vyhlídku, odkud je vidět kontrast starých a nových budov v Oslu. Odtamtud se pak dá po cestičce sejít dolů do centra.

Sochy v Ekebergparken

Opera

Operahuset je zajímavé zejména tím, že je možné vyjít až na střechu, odkud je fajn výhled.

Oslo - Operahuset

Pevnost Akershus

Určitě doporučuji nevynechat pevnost Akershus - kromě historických budov je odtamtud hezký výhled na přístav.

Akershus

Akershus - výhled na přístav

Norsk Folkemuseum

Do Norsk Folkemuseum postupně přemístili různé budovy, aby mohli ukázat, jak v minulosti žili lidé (nejen) na norském venkově. Areál si buď můžete projít sami nebo se připojit k některé z komentovaných prohlídek (doporučuji!). Nejvýznamnější památkou v muzeu je kostel přibližně z roku 1200, který koncem 19. století nechal král přestěhovat tam, kde je teď.

Norsk Folkemuseum - kostel

A jedna zajímavost, kterou jsme se tam dozvěděli. Určitě znáte takové ty domky se střechami porostlými trávou (a teď nemyslím moderní kancelářské budovy). Vždycky jsem myslel, že ta tráva tam má nějaký účel, ale ono ne. Jen holt tenkrát dávali na střechu vrstvu hlíny jako izolaci a shodou okolností z ní pak rostla tráva.

Norsk Folkemuseum - tráva na střeše

Playa de Huk

Když už kvůli Folkemuseum (nebo jinému muzeu) budete na poloostrově Bygdøy, tak si vezměte plavky a běžte se vykoupat na Playa de Huk. My jsme měli štěstí na počasí - bylo 28°C, takže pláž byla narvaná :-)

Královský palác a zahrada

Když už budete v Oslu, tak se určitě zajděte podívat na královský palác a do jeho zahrad.

Královský palác

Královský palác - zahrada

Frognerparken

Velký park, jedno z více turistických míst. Zejména kvůli zajímavé fontáně obklopené turisty a sloupovému sousoší.

Frognerparken - fontána

Frognerparken - sousoší

Závěrem

V Oslu a jeho okolí toho je spoustu k vidění. Určitě doporučuji zařadit nějaké výlety za město než jen chodit mezi budovami.

]]>
<![CDATA[Fuerteventura - Things to Do, Best Places to Visit]]> 2019-05-05T00:00:00+00:00 https://blog.martinhujer.cz/fuerteventura-things-to-do/

This article is a translation of my travel guide for Fuerteventura (in Czech).

In October 2018 we spent almost three weeks in Fuerteventura, so I have lots of tips for interesting places and about Fuerteventura in general.

Fuerteventura - Puerto del Rosario

Traveling there - airline tickets, bus

You can fly to Fuerteventura directly from Prague, but one-way ticket costs around 7k CZK (280€) so in the end we flew with Ryanair from Berlin. One ticket from Schönefeld costs around 30€ and you can get there easily by Flixbus or Regiojet. You can also use Czech Rails (ČD) train - morning tickets at 6:30AM from Prague are quite cheap.

I already mentioned this tip in other post, but it is worth repeating here. At the airport, after passing through security, you can usually buy cheap bottles of water in the vending machine (0.5l for 1€ in Fuerteventura). On the other hand, in Schönefeld, you can bring an empty bottle through and refill it with the tap water after the security.

Fuerteventura Buses

Buses on Fuerteventura are operated by Tiadhe company. You can find timetables on their website - unfortunately, they provide only the departure times from the starting stop, not when the bus passes through each stop. You can buy the tickets at the bus (cash only).

Fuerteventura Ferries

After spending two weeks in Fuerteventura we went to Lanzarote for next two weeks and then back again. We took a ferry from Corralejo city to Arrecife. You can choose from three companies that service this route - Armas, Fred Olsen and Lineas Romero. Fred Olsen is the fastest but also the most expensive. We used Lineas Romero ferry both times (it costs 15€ per person). Their ferry is more of a tourist boat than a ferry (and they don't transport cars).

Fuerteventura Car Rental

We weren't on Fuerteventura only for holidays, but we also had to do some work at least part of each day, so we rented car for whole two weeks. Thanks to that we could work in the mornings and take trips in the afternoon (which would be much harder if we had to take a bus). It turned out that the most expensive option is renting for a single day. If you rent for a longer period, the price lowers considerably. Rental for two weeks cost us 220 € (+gas).

We rented the car at the airport from the Cicar company (we also used them in Lanzarote). They offer good insurance and they don't require you to have a credit card (debit card is OK). You can book the car in advance through the website to be sure they have it available for you. It will also speed up the rental process, because you can pre-fill all the info online and they will just check it. You can also add a second driver for free. We returned the car in Corralejo (you don't have to return it to the same office). The fuel level should be approximately same as when you were handed the car.

Careful: You should not drive the rental cars on the dirt roads - it is usually not covered by insurance (check the terms of your rental agreement).

Faro del Tostón - Opel Astra

Weather

The weather was good for swimming all the time - temperatures around 24°C and hot when the sun shined. Temperatures at night were just below 20°C.

Fuerteventura food

Fuerteventura is renowned for its goat cheese - queso majorero (see below).

Tap water is desalinated, therefore it is not suitable for drinking and you must buy water in the supermarket. Surprisingly, the 8l barrels usually have better handle than the 5l ones, so despite being heavier, they are easier to carry.

Bigger supermarkets offer fresh fish and seafood. We usually buy precooked shrimp (langostino cocido, 9€/kg) or tuna steak (rodaja de atún, 12€/kg). This year we started buying octopus as well (pulpo cocido). You can buy a precooked whole tentacle or pieces. Just put it in the pan for a while with olive oil and add grounded sweet pepper (pulpo a la gallega).

Pulpo a la Gallega

ATMs

Some Spanish banks charge an extra fee for a cash withdrawal (in addition to your bank fee). But the Cajamar Caja Rural bank does not charge the extra fee yet (I tested it with Revolut and Airbank card.)

Cities in Fuerteventura

Fuerteventura is a large island (the second biggest of the Canary Islands) and only 100 thousand people live there, so it is quite empty. We didn't want to spend that much time in car, so first week we stayed in the north and explored the places there and the second week, we stayed in the south and visited the places there. The cities in Fuerteventura are different from each other - ranging from locals-only to built-for-tourists.

El Cotillo

El Cotillo is a small town in the north where we spent the first week. As it is not overflowing with tourists, we would also consider it for a longer stay (month+). It has a great surfing beach on one side and the beach lagoons on the other side.

  • Lagoons is a part of the beach which is protected by natural breakwater and shallows caused by low tide make it great for children.
  • Castillo del Tostón - small fort with good views. Entrance fee is 3€, can be paid only by card (no cash).
  • El Goloso de Cotillo - café where we went at least five times (during one week!)
  • Kalima - good tapas bar

El Cotillo - lagoons

Corralejo

Corralejo is resort popular among British tourists. We didn't like the beach much. And it is more expensive in comparison with El Cotillo.

Puerto del Rosario

Puerto del Rosario is the capital of Fuerteventura with very few tourists. We spent last five days there. Many cruise ships harbour in the city port. You can use MarineTraffic.com (FlightRadar for ships) to see more information about the ships. The city has a nice beach with white sand.

  • Oficina de Turismo de Puerto del Rosario - tourist information centre. I recommend visiting it just after arrival to get some paper map and lot of tips (I guess they know more things than I have in this article)
  • Café Atlántico - cafeteria with a sea view. They offer good and cheap sandwiches.
  • Cafetería Del 15 - random cafeteria, where we had lunch after arrival because we were starving. I guess we were the only tourists there in a while :-)
  • free parking close to the city centre. Check that you have the correct one - there is another free parking, but much farther from the city centre. Try to guess where we parked ;-)
  • Panadería Pastelería Pulido Alonso - pleasant café, they have several shops around the island.

More cities

  • Calleta de Fuste - place built for tourists

  • Gran Tarajal - town interesting mainly for its black sand beach and for the abundant narrow one-way streets.

  • Costa Calma - resort with enormous beach where we spent our second week on Fuerteventura. This one is popular among German tourists. We stayed in a nice apartment a bit farther from the city centre. In the local Spar shop you can even buy Dallmayr coffee.

  • Morro Jable - resort in the south of the island with a great beach.

Fuerteventura Trips

We made a lot of trips in Fuerteventura. I already mentioned some cities and places above. We visited all of them by car, so I'm not sure which of them are easily accessible by bus.

El Faro del Tostón

El Faro del Tostón is a lighthouse close to El Cotillo. You can visit the museum of the traditional fishing (we arrived late, so it was already closed).

El Faro del Tostón

Lajares

Lajares is recommended in the Lonely Planet because of its cafés. Yes, the cafés are there, but there is nothing else of interest.

La Oliva

La Oliva is a small village with an old church and gallery. You should also visit wind-mills Molinos De Villaverde nearby. Careful, that the road does not go all the way to them, but it changes to a bumpy dirt road. Therefore, it is better to leave the car next to the main street and walk to the windmills.

Molinos De Villaverde

Museo del Queso Majorero

Even though the Fuerteventura may appear dry and barren, they breed the majorero goats there and make cheese from their milk (under different brands). You can learn more about how the cheese was produced in the past and how it is produced nowadays in Museo del Queso Majorero. I really liked the museum as the exposition was well prepared and entertaining. The area includes also a windmill and cactus garden, so leave yourself enough time to visit all those places. And speaking about the goats - be careful as you can encounter them all over the island next to the road or even crossing the road.

Museo del Queso Majorero

Antigua and Pulido Alonso

I already mentioned Pulido Alonso café, but the one in Antigua is special for us. When we were heading to Corralejo for a ferry after two weeks in Fuerteventura, we realized we have too much time. So, we decided to stop for coffee. Antigua happened to be nearby, and we chose the Pulido Alonso by the rating. We had great coffee and cakes there.

Betancuria

Betancuria used to be capital of Fuerteventura in the past. Apart from other things, you can visit the church from 15th century. The city is like Charles Castle near Prague in one aspect - everything is closed after 5PM. Close to Betancuria you can visit statues of ancient kings and admire the views.

Statues near Betancuria

Views near the statues near Betancuria

Parque Natural Dune De Corralejo

Sand dunes near Corralejo. You can park easily on this parking place. If you never have been to sand dunes, I recommend this one hundred percent, it's a great experience (you can visit another in Maspalomas in Gran Canaria). Don't forget to bring your sun cream! The sun is really strong in the dunes. Between the sand dunes and the Corralejo, you can find some nice beaches. But we didn't swim there in the end, because when we arrived there was a yellow warning flag and before we took our things from the car, lifeguard swapped it for the red one.

Corrajelo Dunes

But it wouldn't be us to spend whole day walking around on dunes. Instead we hiked to the nearby hill Montaña Roja. You can check the recorded map in Wikiloc. If you watch the map carefully, you can see that we parked unnecessarily far. But from the car, all the places appeared to have to big curb to park there and I didn't want to break the car. But when we walked there, we realized that at least two places are suitable for parking, so I marked them in the map. And the view from the Montaña Roja was spectacular.

Montaña Roja

Salinas del Carmen

You can either get salt from salt mines or you can let the sea water dry up. That's how they did it in the past and how they do it now in the museum of salt production Salinas del Carmen. They have nice indoor exposition, but the main part is outside, where you walk through the whole process of salt production.

Salinas del Carmen

Pájara and a viewpoint on FV-605

When we drove somewhere and we had enough time, instead of using main road (FV-1, FV-2), we used some small scenic road over the hills and villages (FV-605). This way we visited village Pájara. You can find several interesting things there - church from 17th century, dried-up river and a roundabout with a statue of man milking a goat.

Pájara - dried-up river

Pájara - statue of man milking a goat

If you follow the FV-605 south from Pájara, you can stop at perfect viewpoint

Viewpoint at FV-605

Pozo Negro

Fisherman village in the end of the road. There is a black-sand and pebble beach and two cafés.

Faro de la Entallada

Faro de la Entallada is a lighthouse on the cliff with a great sea view. Last part of the road is really narrow and with few guardrails, so be careful.

Faro de la Entallada

Mirador del Salmo

View point Mirador del Salmo is worth visiting when you are driving nearby. It is just next to the road.

Pico de la Zarza

Pico de la Zarza (sometimes also called Pico de Jandía) is the highest mountain of Fuerteventura. Although it has only 807 meters above sea level, you are starting at 0 m. The hike is about 15 km and you can check our walk on Wikiloc. We started the ascent at 9AM and luckily it was partly cloudy on that day. Don't forget to bring enough water and something to cover you head, because there is no place to hide from sun. We parked unnecessarily far; we could have parked at the place where the dirt road started. From the top of the mountain you can admire great views also to the north side of the island.

Pico de La Zarza

Cofete

Cofete is a nice beach on the northern side of the island. Swimming is forbidden there because of the strong sea currents. You can get there either by car (by the dirt road) or by a special 4x4 bus from Morro Jable. It goes from Estación de Guaguas (=main bus station). It is a line L111 and it takes only 18 people, so be there early.

Cofete bus

You can get back by the same bus or you can hike back over the hill (12 km). Our walk on Wikiloc.

Cofete - path over the hill

Islote de Lobos

Islote de Lobos is a small island not far from Corralejo. You can take a tourist boat there. This is the only thing from the whole article we have kept unvisited for the next time. But I include it here for the sake of completeness.

Conclusion

Although we didn't spend that much time on Fuerteventura, we managed to do lot of things and visit lot of places. Having a rental car for the whole time really helped, because we could do just a short trip in the afternoon which won't be possible if we went by bus.

If you go to Fuerteventura and have enough time, I recommend spending at least a week on Lanzarote, where are also many things to see.

]]>
<![CDATA[4 Tips for Faster Gitlab CI Builds for Symfony Applications]]> 2019-03-16T00:00:00+00:00 https://blog.martinhujer.cz/4-tips-for-faster-gitlab-ci-build-symfony-application/

Some of those tips are also applicable to non-Symfony applications and to non-Gitlab CI pipelines, so keep reading even if you are not using them.

Waiting for a CI build to finish so can merge the feature is annoying, but it is still by an order of magnitude better than not having CI at all.

In this article I will show you some tips which I used in OutdoorVisit to make our CI build faster.

Tip #1: You may not need PHP Lint

Linting of PHP files can be done as easily as running php -l myfile.php. I've included PHP Lint as a part of the build since ever. At first, I was using PhpLintTask from Phing which checks each file separately. Later I switched to PHP-Parallel-Lint which checks multiple files in parallel.

Recently I noticed that our CI build is taking more time to run. It wasn't a glitch, we were just adding more and more files to the project. The PHP Lint was taking 31 s of the build time although it ran 10 parallel checks. I couldn't remember the last time it discovered something, so I considered removing it completely. But it would open a risk of missing an error somewhere.

I took a different approach. When the Symfony compiles the DI container, it tries to load all the files and fails on syntax errors. At least when you have this configured in config/services.yaml:

services:
    App\:
        resource: '../src/*'

So instead of completely removing the PHP Lint, I just added --exclude src flag to the command, so it looks like this:

parallel-lint -j 10 --exclude vendor --exclude var --exclude src .

It helped me to cut 20 s from the build time without risking anything!

Tip #2: Enable PHP_CodeSniffer cache and cache it between builds

PHP_CodeSniffer check can take quite a lot of time when there are many files to check. It used to take around 60 s in our build. We also usually run it locally before pushing so the waiting was annoying.

Luckily, PHPCS has a built-in caching feature, which can be enabled by passing a command line argument: --cache=./var/.phpcs-cache. The cache-file path can be changed to anything else and you can also configure it as an option in your phpcs.xml.dist ruleset.

This sped up our CS check from 60 s to 3 s!

But it worked only locally, because the Gitlab CI and others like Bitbucket Pipelines create a new environment for each build. For Gitlab all you need to do is to add the path to cache section in .gitlab-ci.yml (We already had vendor/ and node_modules there). Gitlab takes care of backing it up after the build and restoring it before the next build.

  cache:
    paths:
      - node_modules/
      - vendor/
      - var/.phpcs-cache  <-- added the PHPCS cache here

Tip #3: Run Symfony tests with debug=false

Apart from having a good number of unit tests, we also use some container tests and lots of controller tests for most of the frontend. They are slow (running against a database) but they are worth it because they detect tremendous number of issues and regressions.

When you are running your Symfony application in dev or test environment, cache freshness is automatically checked on each request and invalidated if necessary. The great thing is that you don't have to worry about it, and you will never be surprised by stale cache. In prod mode, cache is not invalidated automatically, and you must take care of it manually during deploy.

If you are running your whole test suite at once, there is no need to check the cache freshness before each test.

It can be done by changing APP_DEBUG flag in phpunit.xml.dist file to 0:

<env name="APP_DEBUG" value="0" />

However, this solution is not perfect, because you will need to take care on invalidating the cache manually while you are developing. You can use this custom bootstrap.php for tests from Github.

I chose a different approach for our project and just changed the environment variable for CI builds in .gitlab-ci.yml:

variables:
  APP_DEBUG: 0

As it affects only the CI, running the tests locally does not benefit from this - but on the other hand I don't have to worry about properly invalidating the cache (and I'm usually running just a few tests locally anyway).

This helped me to cut the tests running time in CI from 90 seconds to 53 seconds!

Tip #4: Run npm install with --no-audit

If you have an application where you use NodeJS and npm just to compile assets such as CSS and JS, there is no need to stay on the very latest versions of the packages. However, because Webpack depends on lots of packages, npm will start spitting out messages like this during npm install:

audited 9438 packages in 16.958s
found 222 vulnerabilities (5 low, 213 moderate, 3 high, 1 critical)

As the JavaScript code installed through npm is never facing the hostile environment of the internet, those are not very scary. But they are unnecessarily cluttering the build output, so I decided to disable them. It can be done by adding --no-audit switch to npm install

npm install --no-audit

Apart from cleaning out the build output, it saved several seconds from the npm install run which is neat.

Conclusion

Do you know other tricks how to make the CI build faster? Please share them in comments!

]]>
<![CDATA[Povinné ručení od České Pojišťovny - Jak ho zlevnit?]]> 2019-03-12T00:00:00+00:00 https://blog.martinhujer.cz/povinne-ruceni-ceska-pojistovna-zlevneni/ Dlouhou dobu jsem měl povinné ručení u České Pojišťovny (dříve měli akci na přenos bonusu v rámci rodiny, což bylo dost výhodné). Každý rok mi přišel požadavek na zaplacení o trochu více než předchozí rok. Letos jsem se konečně rozhoupal prozkoumat, jestli nejde mít povinné ručení někde jinde levněji.

Jediný zajímavý parametr pro srovnání je limit pojistného plnění. Našel jsem tedy nějaký srovnávač povinných ručení a vyplnil údaje o autě podle stávající pojistné smlouvy. Pozor, pokud nechcete, aby vám někdo zkoušel vnutit pojištění a chcete ho jen srovnat, tak nezadávejte svoje telefonní číslo ani rodné číslo (Můžete použít třeba to z Wikipedie).

Ve výsledcích mě překvapilo, že Česká Pojišťovna (ano, tam, kde mám stávající smlouvu) nabízí povinné ručení se stejnými limity plnění levněji, než po mě chtějí teď zaplatit.

A tím se dostáváme k tomu nejdůležitějšímu.

Jak snížit cenu povinného ručení u České Pojišťovny?

Abych ověřil, že to srovnávač počítá správně, spočítal jsem si povinné ručení přímo na webu České Pojišťovny. Tam jsem zadával reálné údaje, protože už je stejně mají. A pokud zadáte jméno a rodné číslo, tak to i správně načte bonus za dosavadní bezeškodní průběh.

Výsledkem bylo kalkulace níže, o osm set levnější, než 3 231 Kč, které bych platil podle stávající smlouvy.

Kalkulace povinného ručení u České Pojišťovny

Tabulku jsem si vytisknul a měl jsem v plánu se stavit na pobočce Česká Pojišťovny, starou smlouvu vypovědět a uzavřít novou.

Ale než jsem se k tomu dostal, tak mi volali, že jsem nedokončil online objednávku pojištění. A kupodivu uměli, bez nějakého přesvědčování, tu starou smlouvu zrušit a udělat novou na částku z online kalkulačky, bez toho abych musel někam chodit.

Podklady pak poslali e-mailem a smlouva byla uzavřena tím, že jsem zaplatil pojistné.

Na co si dát pozor u povinného ručení?

Pojišťovny jsou uličníci, tak si všechno pořádně kontrolujte:

  1. Promyslete limity plnění, což je maximum, kolik pojišťovna bude hradit v případě škody nebo újmy na zdraví.
  2. Kontrolujte, jestli vám nezkusili prodat i něco dalšího (třeba havarijní pojištění).
  3. Pozor, že existující smlouvu lze vypovědět nejpozději 6 týdnů před prodloužením, takže to neodkládejte.

Závěrem

Dává smysl se každý rok podívat, jestli nemůžete mít povinné ručení levněji, ať už u stávající pojišťovny nebo někde jinde.

]]>
<![CDATA[Lanzarote - kam na výlety? Co navštívit?]]> 2018-12-16T00:00:00+00:00 https://blog.martinhujer.cz/lanzarote-kam-na-vylety/ V říjnu 2018 jsme byli dva týdny na Lanzarote, takže mám spoustu tipů na zajímavá místa a obecně k Lanzarote.

Nejdříve jsme byli pár týdnů na Fuerteventuře, takže ty věci, které jsem popsal v prvním článku, už tu nebudu opakovat.

Lanzarote má nádhernou sopečnou krajinu, takže doporučuji se při výletech průběžně zastavovat na odpočívadlech u silnice a prohlížet si výhledy (spolujezdec může koukat, ale jako řidič jsem si moc výhledů z auta neužil).

Lanzarote - Montañas del Fuego - Timanfaya

Auto z půjčovny

Jeli jsme trajektem z Fuerteventury a hned po příjezdu jsme si v Playa Blanca zase půjčili auto od Cicar (dopředu jsme ho zarezervovali přes web). Měli jsme ho na celou dobu, než jsme se vraceli zpět na Fuerteventuru. Stejně jako na Fuerteventuře si neumím představit, jak bychom ty výlety zvládli autobusem.

Arrecife

Na Lanzarote jsme bydleli v hlavním městě Arrecife. Výhoda je, že je docela uprostřed ostrova, takže na všechny výlety je to podobně daleko.

Lanzarote - Arrefice

Parkování ve městě není jednoduché, protože se skládá převážně z úzkých jednosměrek. Většinou jsme parkovali přibližně tady nebo na hliněné ploše o pár metrů dále.

I ve městě toho je spoustu k vidění:

  • Playa del Reducto - městská pláž s pozvolným vstupem do vody. Kousek od pláže je půjčovna sportovního vybavení a paddleboardů.
  • Castillo de San Gabriel - na ostrůvku, kam se dostanete po mostě je malá pevnůstka s muzeem uvnitř a hezkým výhledem shora.
  • Charco de San Ginés je uzavřená zátoka s přístavem pro malé lodě. Super na procházení okolo. Je zajímavé se tam jít podívat v různých časech, protože vzhledem k přílivu a odlivu může být třeba půlka zaparkovaných lodiček na suchu. Když už tam budete, tak doporučuji zkusit zmrzlinu v Antiu Xixona nebo se večer zastavit na tapas v La Caja de tapas.
  • Punto Sabroso je malá restaurace s latinsko-americkými a španělskými jídly. Velmi local atmosféra - sice mají menu i v angličtině, ale na případné doplňující dotazy už budete potřebovat španělštinu.
  • pokud se vydáte po cyklostezce podél moře směrem k letišti, tak můžete dojít na další pláže nebo až do Playa Honda. Šli jsme tam pěšky, ale asi by bylo zábavnější půjčit si kolo - je to docela daleko.

Montañas del Fuego - Timanfaya

Nejzajímavější věc na Lanzarote. V národním parku Timanfaya uvidíte měsíční krajinu jako následek sopečných erupcí v letech 1730 a 1736. Doporučuji tam vyrazit brzy po ránu, abyste se vyhnuli frontě.

Lanzarote - Montañas del Fuego - Timanfaya

Dostanete se tam autem a vstupné se platí už na odbočce z hlavní LZ-67 na LZ-602 (pozor, nedá se tam platit kartou). Následně dojedete na parkoviště k Restaurante El Diablo. Až zaparkujete, tak běžte do fronty na autobus. Čekali jsme tam jen chvilku. Autobus vás vezme na projížďku skrz park (výklad ve španělštině, angličtině a němčině). Dnes už je aktivní jen sopka Timanfaya, podle které se celý park jmenuje.

Po projížďce vás ještě čeká ukázka toho, že sopka je aktivní (horkem v díře v zemi tam zapalují nějaké roští). Potom se můžete jít podívat do Restaurante El Diablo, kde kromě jiného nabízejí maso grilované na horku ze sopky. Ten gril stejně jako postavu "ďábla" (logo parku) vymyslel César Manrique (viz dále).

Lanzarote - Montañas del Fuego - Timanfaya - El Diablo

Vstupenky Bonos

Na Lanzarote si můžete zakoupit jednu vstupenku ke vstupu na několik hlavních turistických atrakcí. Je to levnější než si kupovat jednotlivé vstupy zvlášť. Více informací najdete na oficiálním webu.

César Manrique

César Manrique byl slavný lanzarotský umělec, sochař a architekt 20. století. Navrhnul spoustu věcí, které na Lanzarote uvidíte. Takový místní Jára Cimrman.

Casa Museo De César Manrique

Ve městě Haría je Casa Museo De César Manrique - muzeum v domě, kde žil César Manrique. Dovnitř jsme nakonec nešli, protože nám 10€ za vstup přišlo hodně a nechtěli jsme trávit odpoledne vevnitř v muzeu.

Na dvoře mají vystavený SEAT Ibiza, který Manrique natřel na výstavu aut v Barceloně v roce 1987. Zajímavé je, že Cicar (největší kanárská půjčovna aut) se v roce 2015 domluvila se SEATem a nechali si nabarvit 96 nových SEAT Ibiza tak jako ten historický a normálně je půjčují (viděli jsme je několikrát). Našel jsem k tomu docela hezké video.

Lanzarote - César Manrique - SEAT Ibiza

Mirador del Río

Mirador del Río je super vyhlídka v severní části ostrova. Je odtamtud krásný výhled na další kanárský ostrov La Graciosa a případně můžete posedět v zabudované kavárně. Jak vás jistě nepřekvapí, tak to celé navrhl César Manrique.

Lanzarote - Mirador del Río - La Graciosa

Volcán de la Corona (hike)

Cestou z Mirador del Río sí můžete udělat krátký výlet na kráter Volcán de la Corona z vesnice Ye. Doporučuji zastavit u kostela a pak jít podle trasy na Wikiloc. Cesta vede do kopce mezi vinicemi (jednotlivé rostliny révy v ohrádkách z kamenů) až ke kráteru. Byli jsme tam zrovna když bylo zataženo a skoro do deště, takže to vypadalo hodně tajemně. Od kráteru buď můžete pokračovat jako okruh nebo se vrátit po stejné zpět.

Lanzarote - Caldera de Monte Corona

Cueva de los Verdes

Cueva de los Verdes je podzemní jeskyně sopečného původu (vypadá to jako krápníková jeskyně, ale nejsou tam krápníky). Vznikla tak, že tamtudy tekla roztavená láva směrem k moři. Určitě stojí za návštěvu.

Lanzarote - Cueva de los Verdes

Jameos del Agua

Jameos del Agua je jeskyně s velkým podzemním jezírkem, kde žijí bílí mini-krabi. Kromě jiného tam je také muzeum a podzemní koncertní síň. Samozřejmě v tom má zase prsty César Manrique.

Lanzarote - Jameos del Agua

Lanzarote - Jameos del Agua - Sunset

Jardín de Cactus

Jardín de Cactus je obrovská kaktusová zahrada, kterou (jak jinak) navrhl César Manrique. Pokud budete z chození mezi kaktusy unavení, tak si můžete dát kávu v kavárně, která je součástí zahrady. (Baví mě, že i na takhle turisticky exponovaném místě ta káva je docela dobrá a není předražená).

Lanzarote - Jardín de Cactus

Teguise

Historická vesnice Teguise byla kdysi hlavním městem ostrova. Kousek za městem je kopec s výhledy na celý ostrov a na něm pevnost Castillo de Santa Barbara. Zároveň je tam kráter, který si můžete obejít dokola.

Lanzarote - Castillo de Santa Barbara

Casa Museo del Campesino

Casa Museo del Campesino je muzeum zemědělství a řemesel (vstup zdarma). Uprostřed areálu můžete sejít do jeskyně s tunelem. Celé to vymyslel náš známý César Manrique včetně monumentu stojícího před muzeem.

Lanzarote - Casa Museo del Campesino

Vína na Lanzarote

Při výletech po ostrově si určitě všimnete, že všude pěstují révu. Typicky je každá rostlina révy v samostatné ohrádce z kamenů, které ji chrání před větrem. Zároveň mají půdu přikrytou drobným sopečným kamením, které drží vláhu (a přitom je lehké). Víno si můžete koupit pak i běžně v supermarketu - láhev bílého El Grifo stojí 11€ (případně můžete zkusit jiné značky - vždycky je na nich napsané, že jsou z Lanzarote). Pokud budete mít čas, tak můžete navštívit muzeum vinařství Museo el Grifo (mají i variantu prohlídky s ochutnávkou).

Lanzarote - Vinná réva

Montaña Blanca (hike)

Montaña Blanca je hora se super výhledem, ale podle mě to je takový otloukánek, protože se jmenuje stejně jako druhá Montaña Blanca, která má uprostřed kráter, takže je mnohem populárnější. Ale tenhle hike jsme šli na tu první, protože cestou na tu druhou jsme narazili na uzavřené silnice kvůli triatlonu. Mrkněte na záznam trasy na wikiloc. Jeli jsme tam v sobotu, takže jsme ve vesnici Montaña Blanca zaparkovali na prázdném parkovišti u školy. A následoval trošku náročnější hike na horu. Výhoda je, že to lze jít jako okruh a není potřeba se vracet po stejné trase.

Lanzarote - Montaña Blanca

Caldera de Montaña Blanca (hike)

Výlet ke kráteru Caldera de Montaña Blanca je delší, tak si nezapomeňte vzít dost vody a svačinu. Záznam trasy jsem opět dal na wikiloc. Parkovali jsme zbytečně daleko ve vesnici, můžete buď zaparkovat na kraji té hlavní silnice kousek před odbočkou na prašnou cestu nebo ještě kus popojet po té prašné cestě a zaparkovat tam (označeno na mapě). Pak už se vydáte po svých sopečnou krajinou.

Lanzarote - Caldera de Montaña Blanca

Je super, že to je oficiální trasa, takže jsou podél i informační tabule o sopkách apod. Nejdříve dojdete k menšímu kráteru, do kterého se dá vejít z boku (Caldera de Montaña Caldereta). Zajímavé je, že tam dřív něco pěstovali a chovali kozy (jak je to uvnitř chráněné proti větru, tak se tam drží vlhkost). Teprve potom začnete stoupat na okraj velkého kráteru Caldera de Montaña Blanca. Ten je možné obejít dokola (cestou vylezete na samotný vrchol Montaña Blanca). Pozor, že tam, kde se pak potřebujete odpojit z okruhu po obvodu kráteru, ta odbočka není úplně zřejmá, ale je označená naskládanými kameny (občas koukněte do mapy). Po sestupu se napojíte na tu cestu, po které jste ke kráterům přišli.

Lanzarote - Caldera de Montaña Blanca

Los Hervideros

Na západním pobřeží je několik míst, které stojí za zastávku. Los Hervideros je vyhlídka z útesů na mořský příboj (i v jeskyních). Název to má podle toho, že se tam jakoby vaří voda.

Lanzarote - Los Hervideros

El Golfo a pár dalších věcí na západním pobřeží

Pokud pojedete od Los Hervideros dále, tak narazíte na pláž Playa Montaña Bermeja, která také stojí za vidění. Nakonec dojedete do městečka El Golfo. Je tam spoustu rybích restaurací s výhledem na moře a na případný západ slunce. Až tam budete čekat, tak se určitě dojděte podívat na zelené jezírko El Lago Verde.

Lanzarote - Lago Verde

Vrak lodi u Arrecife

Kousek od Arrecife můžete zastavit na pláži, kterou zdobí vrak lodi. (Zaparkovat můžete o pár desítek metrů dál, kde je před budovou dost místa.) Vrak tam je od roku 1981, kdy ta loď plula okolo Lanzarote a zjistili, že jim teče dovnitř. Arrecife jim nedovolilo jet do přístavu, protože kdyby se potopili uprostřed přístavu, tak by ho zablokovali. Místo toho je nasměrovali na mělčinu v písčité zátoce, kde je dodnes. Už delší dobu plánují, že vrak odstraní, ale zatím (říjen 2018) tam pořád je. Když jsme tam byli, tak z něj někdo dokonce skákal do vody.

Lanzarote - Shipwreck Arrecife

Punta Mujeres

Punta Mujeres je městečko, kde naleznete přírodní "bazény" - ohraničený kus moře, kde se dá příjemně koupat.

Pastelería San Antonio

Sladká tečka na závěr. Pastelería San Antonio je pekárna/kavárna ve vesnici Tías. Stavovali jsme se tam dvakrát cestou z nějakého výletu na kávu a něco sladkého nebo slaného k jídlu.

Závěr

Byli jsme na Lanzarote jen dva týdny, ale viděli jsme toho hrozně moc. Neumím si představit, že bychom na celý ostrov měli méně času. Opět se osvědčilo půjčené auto, i když večerní parkování v přeplněném Arrecife bylo náročnější.

Pokud se budete chystat na Lanzarote a budete mít více času, tak doporučuji alespoň týden z toho strávit na Fuerteventuře, tam je toho taky spoustu k vidění.

A pokud se chystáte do Las Palmas na Gran Canarii, tak mrkněte na moje tipy na výlety.

AmazingLanzarote.com

Vytvořil jsem ještě samostatný web s informacemi o Lanzarote (v angličtině).

]]>
<![CDATA[Jaké novinky přinese PHP 7.3]]> 2018-11-28T00:00:00+00:00 https://blog.martinhujer.cz/jake-novinky-prinese-php-7-3/ Vydání PHP 7.3 je plánováno na 6. prosince 2018. Přináší několik nových funkcí, vylepšení a různá pročištění jazyka. Oproti jiným vydáním mu sice chybí nějaký trhák, ale na druhou stranu nepřibyly ani žádné zásadní nekompatibilní změny, takže upgrade bude snadný.

Článek vyšel na serveru Zdroják.cz

]]>
<![CDATA[Best PhpStorm plugins for Symfony development]]> 2018-11-26T00:00:00+00:00 https://blog.martinhujer.cz/best-phpstorm-plugins-for-symfony-development/ I've been using PhpStorm for quite a while and I'm still surprised now and then when it suggests an auto-completion for something I thought that's not possible.

But there are still many things - usually framework- or library-specific - that PhpStorm cannot do on its own. But there are plugins that can step in place and do the magic for specific framework or library.

PHP Annotations

PHP Annotations plugin analyses the classes which can be used as annotations and provides code-completing when writing annotations - e.g. Doctrine ORM mappings.

PHP Annotations plugin

PHP Toolbox

PHP Toolbox plugin was extracted from Symfony plugin and provides better auto-completion for several libraries (PHPUnit, Behat, Doctrine, Twig etc.)

Symfony Plugin

Both PHP Annotations and PHP Toolbox are best used together with the Symfony Plugin. This plugin provides auto-completion for anything in Symfony you can imagine. It analyses the DI container code, so it can suggest the services when you call $container->get(). It provides various auto-completions in the YAML config files. Apart from that, it can handle lots of Form, Twig and Routing auto-completions. You can click through from controller to template, from the name of the route to the controller where it is defined. It analyses translation files and provides the completion for the translations when calling the translate function or using trans filter in Twig.

How to use custom template directory with the Symfony plugin?

If you have templates in a custom namespace and directory - e.g. configured in config/packages/twig.yaml, the auto-completion in controllers or other templates won't work for those, because the Symfony plugin can't detect them.

twig:
    paths:
        '%kernel.project_dir%/src/App/templates': App
        '%kernel.project_dir%/src/Admin/templates': Admin

You can fix it by manually adding them in PhpStorm Settings (PHP -> Symfony -> Twig/Template). But each of the developers must do it himself. Unless you put in into ide-twig.json in a project root:

{
    "namespaces": [
        {
            "namespace": "App",
            "path": "src/App/templates"
        },
        {
            "namespace": "Admin",
            "path": "src/Admin/templates"
        }
    ]
}

This file is loaded by Symfony plugin and the namespaces and paths will be configured automatically (you can check it in the Settings).

Enable translation keys auto-completion for custom translation methods

When you create a custom method that accepts translation key, the PhpStorm won't do the auto-completion for it, because it does not know that the parameter is a translation key. Luckily, the Symfony plugin provides an easy way to let it know of the type of the parameter. Have a look at the following example:

<?php
class TitleManager
{
    /**
     * @param string $label #TranslationKey
     */
    public function addItem(string $label): void
    {
        // ...
    }
}

$titleManager = new TitleManager();
$titleManager->addItem('app.products.name'); // the translation key auto-completion will work here 

You can see that I added #TranslationKey to the method parameter PHPDoc. It is something they call Hash Tags in Symfony plugin. It allows you to define the type of the parameter, so the plugin can provide the auto-completion. Apart from TranslationKey, you can also use Entity, Service, FormType, Template, Route, Class, TranslationDomain, FormOption or Interface (don't forget to prefix them with #).

PHPUnit Enhancement

PHPUnit Enhancement plugin provides smart autocomplete for mock creation. It also handles refactoring - if you rename a method which is mocked, it is correctly renamed in the string in tests.

PHPUnit Enhancement plugin

PHP composer.json support

PHP composer.json support plugin adds composer.json auto-complete and validation. It also displays which version of each packages is installed (from the data in composer.lock)

Php Inspections (EA Extended)

Php Inspections (EA Extended) is a plugin that adds a lot of inspections for statically analyzing the PHP code you are writing and suggesting fixes and improvements.

Twig Support

Twig Support is an official plugin from Jetbrains bundled with PhpStorm, so just enable it in the settings and you are done.

.env files support

Symfony 4 uses .env files for configuration parameters (instead of parameters.yml) and .env files support plugin provides syntax highlighting for the .env file.

.ignore

.ignore plugin provides syntax highlighting and path auto-completion for .gitignore (and other ignore files). It also automatically changes the color of the ignored files in the Project File Tree to gray.

Conclusion

I can't imagine using PhpStorm for Symfony development without those plugins. They save me time and prevent mistakes by providing the magic auto-completion.

Do you use some other useful plugins? Please let me know in the comments.

Update: If you are interested in plugins not directly related to Symfony, have a look at the Essential PhpStorm plugins article by localheinz.

]]>