<![CDATA[Martin Hujer blog]]> 2019-08-15T11:50:44+00:00 https://blog.martinhujer.cz/ Sculpin <![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

Pokud byste na Caldera de Montaña Blanca chtěli výlet s průvodcem, tak je v nabídce na OutdoorVisit.

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ě).

OutdoorVisit outdoor tours

Na Lanzarote se můžete naučit surfovat, jít na hike s průvodcem nebo se podívejte na nejlepší outdoorové aktivity na Lanzarote.

]]>
<![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/Resources/templates': App
        '%kernel.project_dir%/src/Admin/Resources/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/Resources/templates"
        },
        {
            "namespace": "Admin",
            "path": "src/Admin/Resources/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.

]]>
<![CDATA[Fuerteventura - kam na výlety? Co navštívit?]]> 2018-11-18T00:00:00+00:00 https://blog.martinhujer.cz/fuerteventura-kam-na-vylety/

You can read the English version of this travel guide for Fuerteventura here.

V říjnu 2018 jsme byli skoro tři týdny na Fuerteventuře, takže mám spoustu tipů na zajímavá místa a obecně k Fuerteventuře.

Fuerteventura - Puerto del Rosario

Cesta tam - letenky, autobus

Na Fuerteventuru se sice dá letět přímo z Prahy, ale jednosměrná letenka stojí cca 7 tisíc, takže jsme nakonec letěli s Ryanair z Berlína. Jedna letenka ze Schönefeldu stála asi 30€. Dá se tam v pohodě dopravit Flixbusem nebo Regiojetem (autobusem). A taky vlakem ČD (ranní jízdenky myslím v 6:30 z Prahy jsou docela levné).

Připomínám tip, který už jsem někde psal - na letišti se po security typicky dá docela levně koupit voda v láhvi v automatu na pití - na Fuerteventuře třeba 0.5l za 1€. Na Schönefeldu si zas můžete skrz security vzít prázdnou láhev a naplnit si ji z vodovodu.

Doprava - autobusy

Autobusy na Fuerteventuře provozuje společnost Tiadhe. Jízdní řády mají na webu - pozor, jsou tam jen odjezdy z výchozí stanice, ne průjezdy jednotlivými zastávkami. Jízdenky se kupují u řidiče v hotovosti.

Doprava - trajekty

Po dvou týdnech na Fuerteventuře jsme se na dva týdny přesouvali na Lanzarote a pak zase zpět. Z města Corralejo tam jezdí tři společnosti. Armas, Fred Olsen a Lineas Romero. Fred Olsen je nejrychlejší, ale taky nejdražší. My jsme obě cesty jeli s Lineas Romero (15€ za osobu a cestu), kteří jsou spíš taková výletní loď a neberou auta.

Doprava - auto

Vzhledem k tomu, že jsme během dne potřebovali kromě výletů také pracovat, tak jsme si půjčili auto na celých 14 dnů, co jsme byli na Fuerteventuře. Díky tomu jsme mohli třeba dopoledne pracovat a odpoledne vyrazit na výlet (což by se s přesuny autobusem dělalo mnohem hůře). Ukázalo se, že nejdražší je půjčení na jeden den (jako jsme si ho třeba půjčovali v Las Palmas) a pak to hodně klesne. Půjčení na celých 14 dnů stálo 220 € (+ nafta).

Půjčovali jsme rovnou na letišti od Cicar (i pak na Lanzarote) - mají pojištění bez spoluúčasti a stačí normální karta, není potřeba kreditka. Auto jde dopředu zarezervovat na webu, abyste měli jistotu, že ho budou mít k dispozici. Zároveň si tím ušetříte opisování údajů při přebírání, protože to všechno už jde vyplnit přes web. Při přebírání si můžete zadarmo dopsat i druhého řidiče, což je fajn. Auto jsme vraceli v Corraleju v přístavu (tzn. není problém vrátit jinde, než jste si ho půjčili). Palivo by při vrácení mělo být na stejné úrovni jako předtím.

Pozor, s auty z půjčoven by se mělo jezdit jen po asfaltových cestách, jinde většinou neplatí pojištění (mrkněte do smlouvy).

Faro del Tostón - Opel Astra

Počasí

Typicky bylo na koupání - teploty kolem 24°C a když svítilo slunce tak vedro. V noci teploty lehce pod 20°C.

Jídlo

Pro Fuerteventuru jsou typické kozí sýry - queso majorero (viz níže).

Voda z vodovodu je odsolovaná, takže není vhodná na pití a nezbývá, než nosit barely s vodou ze supermarketu. Vypozoroval jsem, že 8l barely mají typicky lepší držadlo než 5l, takže i když jsou těžší, tak se lépe nosí.

Ve větších obchodech běžně mají pult s čerstvými rybami a mořskými plody. My kupujeme předvařené krevety (langostino cocido, 9€ za kilo), nebo plátek z tuňáka, který vám ukrojí (rodaja de atún, 12€ za kilo). Letos jsme rozšířili repertoár i o chobotnici (pulpo cocido). Dá se koupit předvařené zavakuované chapadlo nebo už přímo kousky. Stačí na chvíli hodit na pánev a pak posypat mletou paprikou (pulpo a la gallega)

Pulpo a la Gallega

Bankomaty

Za výběr z některých bankomatů si kromě vaší banky účtuje poplatek ještě ta banka, které ten bankomat patří. Ale při výběru z bankomatů Cajamar Caja Rural poplatek neúčtují (vyzkoušeno Revolut a Airbank kartou).

Města na Fuerteventuře

Fuerteventura je velký ostrov - druhý největší z Kanárských ostrovů - a přitom tam žije jen 100 tisíc lidí, takže je hodně prázdný. Nechtěli jsme trávit tolik času v autě, tak jsme první týden bydleli na severu a projeli jsme ta místa na severu a druhý týden na jihu a prozkoumali to tam. Města na Fuerteventuře se hodně liší, v některých bydlí hlavně místní a jiná jsou letoviskovitá letoviska.

El Cotillo

El Cotillo je malé městečko na severu, kde jsme strávili první týden. Není přeplněné turisty, takže pokud bychom na Fuerteventuru jeli někdy na měsíc, tak asi do Cotilla. Je zajímavé tím, že má velkou surfařskou pláž. A plážové laguny.

  • Laguny jsou část pláže, která je chráněná přírodním vlnolamem a při odlivu tam je dost mělko - ideální pro děti.
  • Castillo del Tostón - místní minipevnost s fajn výhledem. Vstup 3€, platba pouze kartou.
  • El Goloso de Cotillo - kavárna, kde jsme byli asi 5×
  • Kalima - tapas bar

El Cotillo - lagunky

Corralejo

Corralejo je letovisko oblíbené britskými turisty. Pláž nic moc. Oproti El Cotillo dražší.

Puerto del Rosario

Puerto del Rosario je hlavní město Fuerteventury, málo turistů. Strávili jsme tam posledních 5 dnů. V přístavu průběžně kotví různé výletní lodě. Pokud neznáte, tak doporučuji MarineTraffic.com - obdoba FlightRadaru pro lodě. Hezká pláž s bílým pískem.

  • Oficina de Turismo de Puerto del Rosario - turistické informační centrum. Doporučuji navštívit hned po příletu, získáte spoustu tipů (možná i něco, co tu nebudu mít napsané)
  • Café Atlántico - cafeteria s výhledem na moře. Mají dobré obložené bagety za 3€.
  • Cafetería Del 15 - cafeteria, kam jsme náhodně zapadli po příletu, když jsme měli hlad. Velmi local - chodí tam na oběd místní v montérkách.
  • parkoviště kousek od centra, zdarma. Pozor, abyste nezadali do navigace druhé podobné, které je mnohem dál (nám se to první den povedlo).
  • Panadería Pastelería Pulido Alonso - příjemná kavárna, mají několik poboček na ostrově.

Další města

  • Calleta de Fuste - letoviskovité letovistko

  • Gran Tarajal - městečko zajímavé zejména tím, že má pláž s tmavým pískem a spoustu jednosměrek.

  • Costa Calma - letovisko, s obrovskou pláží, kde jsme strávili náš druhý týden na Fuerteventuře. Tady je to pro změnu oblíbené zejména německými turisty. Bydleli jsme v apartmánu kousek dál z centra, takže to bylo fajn. A v místním Sparu mají v sortimentu i kávu Dallmayr.

  • Morro Jable - další letoviskovité letovisko na jihu ostrova. Hodně pěkná pláž.

Výlety

Výletů jsme podnikli spoustu. Ta místa, která jsou přímo v nějakém městě jsem napsal přímo k nim. Všechno jsme objezdili autem, takže nevím, které z nich jsou nedosažitelné autobusem.

El Faro del Tostón

El Faro del Tostón je maják několik kilometrů od El Cotillo. Je tam muzeum tradičního rybářství, ale dorazili jsme tam až po zavíračce. Původně jsme tam chtěli jít pěšky z El Cotillo, ale naštěstí jsme jeli autem, je to po silnici, takže by to nebyla zábavná procházka.

El Faro del Tostón

Lajares

Na Lajares našla Ivča v Lonely Planet doporučení, že tam jsou fajn kavárny. Ty tam jsou (mimochodem pobočka našeho oblíbeného El Goloso, které jsme znali z Cotilla). Akorát, že ono tam už nic dalšího zajímavého není.

La Oliva

La Oliva je malá vesnice s docela hezkým kostelem a galerií. Ale co je zajímavé jsou větrné mlýny Molinos De Villaverde kousek odtamtud. Pozor, silnice nevede až k nim a pak se nečekaně mění na hliněnou a není se kde otočit. Takže radši auto nechte u hlavní silnice a dojděte to pěšky.

Molinos De Villaverde

Museo del Queso Majorero

I když je na první pohled Fuerteventura suchá a pustá, tak tam chovají kozy majorero a z jejich mléka vyrábějí sýr (pod různými značkami). O historii a současnosti výroby sýra se dozvíte v muzeu sýra Museo del Queso Majorero. Za mě hodně zábavné a dobře zpracované. Součástí je i větrný mlýn a kaktusová zahrada, takže si na to nechte více času. Na ty kozy můžete narazit po celém ostrově i u silnice nebo na silnici, tak pozor.

Museo del Queso Majorero

Antigua a Pulido Alonso

Kavárnu Pulido Alonso už jsem předtím zmiňoval, ale ta v Antigua je pro nás speciální. Protože když jsme po druhém týdnu na Fuerteventuře jeli do Corraleja na trajekt na Lanzarote, tak jsme cestou zjistili, že máme zbytečně moc času a že bychom se cestou mohli stavit někde na kávu. A při cestě byla Antigua, kde jsme podle Google Map vybrali právě kavárnu Pulido Alonso.

Betancuria

Betancuria byla kdysi hlavním městem Fuerteventury. A kromě jiného tam je kostel s počátky už v 15. století. Zajímavostí je, že to tam funguje na podobném principu jako Karlštejn - po 17h tam je všecko zavřené. Kousek od Betancurie jsou na kopci sochy nějakých králů a fajn výhled do kraje.

Sochy nedaleko Betancuria

Vyhlídka u soch

Parque Natural Dune De Corralejo

Písečné duny nedaleko Corraleja. Zaparkovat se dá dobře na tomhle parkovišti. Pokud jste nikdy na písečných dunách nebyli, tak určitě doporučuji - je to super zážitek (další jsou třeba v Maspalomas na Gran Canarii). Nezapomeňte si vzít opalovací krém a něco na hlavu, protože to slunce tam je dost silné. Směrem ke Corrajelu je pak několik hezkých pláží. Nakonec jsme se tam nekoupali, protože když jsme přijeli, tak byla žlutá vlajka a než jsme vyndali věci z auta, tak ji plavčík vyměnil za červenou.

Duny Corrajelo

Jenomže to bychom nebyli my, kdybychom jenom zevlili na dunách. Místo toho jsme měli naplánovaný výstup na nedaleký kopec Montaña Roja. Záznam trasy jsem nahrál na Wikiloc. Když se na to podíváte, tak je vidět, že jsme zastavili až moc daleko - ale z auta to vypadalo, že je tam všude hrozně vysoký rantl a nechtěli jsme to auto zničit. Když jsme tam pak šli pěšky, tak na dvou místech to bylo na parkování OK, tak jsou v té mapě označené. Shora byl pak super výhled.

Montaña Roja

Salinas del Carmen

Sůl se získává buď v solných dolech nebo se taky dá usušit mořská voda, jako to třeba dělali a dělají v muzeu výroby soli Salinas del Carmen. Vnitřní expozice je pěkně zpracovaná, ale hlavně je součástí i venkovní část, kde si prohlédnete, jak to celé funguje.

Salinas del Carmen

Pájara a vyhlídka na FV-605

Co jsme občas dělali bylo, že pokud jsme měli čas, tak jsme místo nějaké hlavní silnice (FV-1, FV-2) vzali nějakou scénickou trasou přes kopce a vesnice (typu FV-605). Takhle jsme se stavili ve vesnici Pájara. Ta je zajímavá tím, že tam mají kostel ze 17. století, řeku, kde by se vám prášilo za kánoí a uprostřed kruháče místo fontánky sochu pána dojícího kozu.

Pájara - řeka

Pájara - socha dojiče

Pokud pojedete z Pájary na jih přes kopce po FV-605, tak cestou můžete zastavit na vyhlídce se super výhledem

Vyhlídka FV-605

Pozo Negro

Rybářská vesnice na konci silnice. Pláž s černým pískem a oblázky a dvě kavárny.

Faro de la Entallada

Faro de la Entallada je maják na útesu se super výhledem. Poslední úsek silnice je opravdu úzký a se svodidly tam docela šetřili, tak opatrně.

Faro de la Entallada

Mirador del Salmo

Vyhlídka Mirador del Salmo stojí za zastávku, pokud bude mít cestu okolo. Je to hned u silnice.

Pico de la Zarza

Pico de la Zarza (někdy také nazývaná Pico de Jandía) je nejvyšší hora Fuerteventury. Sice má jen 807 m. n. m., ale zas na ní stoupáte od nuly. Záznam trasy (15 km) najdete na Wikiloc. Na výstup jsme vyráželi v 9h ráno a naštěstí bylo chvílemi pod mrakem. Určitě si vezměte hodně vody a něco na hlavu, protože cestou je přesně nula míst, kde se dá schovat před sluncem. Auto jsme nechali zbytečně daleko, dalo by se docela dobře zaparkovat až tam, kde jsme se odpojili od silnice. Z vrcholu jsou super výhledy i na severní stranu ostrova.

Pico de La Zarza

Cofete

Cofete je hezká pláž na severní straně ostrova. Kvůli silným proudům se tam nedá koupat. Jde tam buď dojet autem (pozor, je prašná cesta) nebo speciálním autobusem s pohonem 4x4 z Morro Jable. Vyjíždí z Estación de Guaguas (=autobusák). Je to linka L111 a pozor, bere jen 18 lidí, takže tam buďte dřív.

Cofete bus

Zpátky můžete jet buď tím stejným autobusem nebo se jako my můžete projít přes kopec (12 km). Trasu jsem opět dal na Wikiloc.

Cofete - cesta přes kopec

Islote de Lobos

Islote de Lobos je malý ostrůvek kousek od Corrajela, dá se tam dojet výletní lodí. Tohle je jediná věc z celého článku, kterou jsme si nechali na někdy příště, ale uvádím ji tu pro úplnost.

Závěr

Na to, že jsme tam nebyli tak dlouho, jsme toho stihli hrozně moc. Hodně k tomu pomohlo to půjčené auto, protože jsme mohli jen i na krátký výlet později odpoledne, což by autobusem bylo mnohem komplikovanější. A těch 14 dnů bylo tak akorát, jinak by to bylo moc hektické.

Pokud se budete chystat na Fuerteventuru a budete mít více času, tak doporučuji alespoň týden z toho strávit na Lanzarote, 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.

OutdoorVisit outdoor tours

Na Fuerteventuře se můžete naučit surfovat, jet na e-bike výlet nebo se podívejte na nejlepší outdoorové aktivity na Fuerteventuře.

]]>
<![CDATA[Use different Google Analytics ID by domain in Google Tag Manager]]> 2018-08-26T00:00:00+00:00 https://blog.martinhujer.cz/use-different-google-analytics-id-by-domain-in-tag-manager/ When setting up Google Analytics (or Facebook Pixel) in the Google Tag Manager the typical approach is to put the UA-code or the Pixel ID into the Constant Variable. And that ID is then used in the GA/Facebook Tag.

But soon after launch the people from Marketing will start complaining that some strange orders and conversions are appearing in the Google Analytics.

What happened? Apart from real orders, also the orders made in testing and dev environments are sent there.

There is a better way. You can easily use different UA codes in production and in testing environments. In the rest of the article I will guide you through setting it up.

Analysis

It is clear that we want to use testing UA code in dev/test environments, but apart from that we also want to use it when testing the Google Tag Manager configuration itself with Preview feature (even on production website).

The decision process for the UA code goes like this:

  • Are we running in Debug mode?
    • YES: use test ID
    • NO:
    • Are we on production domain?
      • YES: use real ID
      • NO: use test ID

Preparation

  1. Go to Google Tag Manager and create two Constant Variables:

    • GA_ID_DEV with the testing ID
    • GA_ID_PROD with the production ID
  2. In the Variables section in Built-In Variables enable Debug Mode and Page Hostname variables.

Setting up the hostname detection

  1. Create a Variable of type Lookup Table and name it GA_ID_BY_HOSTNAME
  2. Input Variable is {{Page Hostname}}
  3. Click Add row
  4. Put your production domain into the Input field (just the domain without https:// and the trailing /)
  5. Put {{GA_ID_PROD}} into the Output field
  6. Check Set default value checkbox
  7. Put {{GA_ID_DEV}} to the Default value field

It should look like this: GA_ID_BY_HOSTNAME variable configuration

By defining only the production domain and using default value for anything else, we handle any testing or dev environment.

Setting up the Debug environment detection

If you look back into the Analysis chapter, we have covered the Are we on production domain? part. Now we will cover the Are we running in Debug mode?.

  1. Create a Variable of type Lookup Table and name it GA_ID
  2. Input Variable is {{Debug Mode}}
  3. Click Add row
  4. Put true into the Input field and {{GA_ID_DEV}} into the Output field
  5. Click Add row again
  6. Put false into the Input field and {{GA_ID_BY_HOSTNAME}} into the Output field

It should look like this: GA_ID variable configuration

You might have noticed that we have used the variable GA_ID_BY_HOSTNAME which we prepared in previous step.

Setting up the Google Analytics Tag

With all those variables prepared, you can set up the Google Analytics tag as usual. But when creating the Google Analytics Settings, put {{GA_ID}} into the Tracking ID field as in the following picture. It will be resolved to correct UA code depending on the environment.

Google Analytics Settings variable

That's it!

Conclusion

Apart from Google Analytics ID, you can use this guide to set up Facebook Pixel ID or any other system where you can easily create different IDs for different environments.

Are you using similar approach? Or did you find a better way? Let me know in the comments!

]]>
<![CDATA[Consistence brings consistency to the PHP]]> 2018-02-06T00:00:00+00:00 https://blog.martinhujer.cz/consistence-brings-consistency-to-the-php/ In the article I describe the Consistence library that aims to bring consistency to PHP applications.

There is no argument, that PHP can sometimes be a bit inconsistent about naming stuff and maintaining order of parameters for related functions. Also, in some cases it is not strict and allows you to use the language and the functions in a wrong way. Sometimes you get false as a return value where an exception would be appropriate.

I really like the idea of code being strict because it prevents errors in the application. E.g. strpos usually returns int, but it returns false when the $needle was not found. It would be much better to throw SubstringNotFoundException in that case.

Consistence provides opinionated strict wrappers with better error handling and consistent naming and consistent parameters order.

Disclaimer: I haven't created the library, but I find it useful and I hope you will as well. It is one of the packages I use on every project.

Let's dive into it.

Use Enums for better type safety

It's a good practice to use constants instead of passing magic numbers (or magic strings) around. But you still pass them as a string, so there is nothing that prevents you from passing any other arbitrary string:

<?php
class BodyType
{
    const SUV = 'suv';
    const COMBI = 'combi';
    const HATCHBACK = 'hatchback';
    const CABRIO = 'cabrio';
    // ... 
}

function createCar(string $bodyType) {
    // do something with $bodyType
}

$car = createCar(BodyType::CABRIO);
$car = createCar('doubledecker'); // unexpected things can happen

Consistence provides an enum implementation. When you extend the class from Enum, all constants are automatically treated as possible enum values:

<?php
class BodyType extends \Consistence\Enum\Enum
{
    const SUV = 'suv';
    const COMBI = 'combi';
    const HATCHBACK = 'hatchback';
    const CABRIO = 'cabrio';
    // ...
}

function createCar(BodyType $bodyType) {
    echo $bodyType->getValue(); // you can use `getValue()` method to access the internal enum value
}

// use get() to get an instance of enum
$cabrioBodyType = BodyType::get(BodyType::CABRIO);

// It is a regular class instance
var_dump($cabrioBodyType instanceof BodyType); // bool(true)

// You always get the same instance, so you can compare them
var_dump(BodyType::get(BodyType::CABRIO) === BodyType::get(BodyType::CABRIO)); // bool(true)

// Type-hint checks work as expected
$car = createCar($cabrioBodyType); 

// Argument 1 passed to createCar() must be an instance of BodyType, string given
$car = createCar('doubledecker'); 

Enums also make it easier to write an actual code. Compare the following examples. When you want to instantiate the class from the first one, you have to dig into the documentation to check what are the allowed values:

<?php
class Car
{
    public function __construct(
        string $bodyType,
        string $transmissionType,
        string $engineType,
        string $fuelType
    )
    {}
}

In the second one, you just start typing BodyType::get(BodyType:: and then choose from the suggested values:

<?php
class Car
{
    public function __construct(
        BodyType $bodyType,
        TransmissionType $transmissionType,
        EngineType $engineType,
        FuelType $fuelType
    )
    {}
}

There are Doctrine and Doctrine + Symfony integrations which allow you to use Enums in Doctrine entities:

<?php
use Consistence\Doctrine\Enum\EnumAnnotation as Enum;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity()
 */
class Car
{
    /**
     * @Enum(class=BodyType::class)
     * @ORM\Column(type="string_enum")
     * @var BodyType
     */
    private $bodyType;

    public function __construct(BodyType $bodyType)
    {
        $this->bodyType = $bodyType;
    }

    public function getBodyType(): BodyType
    {
        return $this->bodyType;
    }
}

If you need to represent multiple values, have a look at the MultiEnums.

If the Consistence only provided the Enums, it would be enough reason for me to use it.

Use ObjectPrototype to disable magic methods

In PHP you can write to undefined object properties. If the property is not defined and you assign a value to it, it is created in runtime.

I think it is a bad idea because it can hide subtle bugs and typos. Consider the following example, where I made a several mistakes in the code, but PHP almost did not complain.

<?php
class MyClass
{
    public $foo;
}

$a = new MyClass();
$a->boo = 'bb'; // I made a typo, but PHP is fine with that

var_dump($a->foo);  // NULL
var_dump($a->boo);  // string(2) "bb"
var_dump($a->otherProperty);  // Notice:  Undefined property: MyClass::$otherProperty

If you want a more real-world example, consider this:

<?php
$finalPrice = $product->price * $customer->distountRate;

There is a typo in a property name, so the $finalPrice would be 0, because undefined property has null value which is converted to 0 and used in multiplication.

Consistence provides a straightforward way to mitigate this type of bugs. There is an ObjectPrototype class which you can extend your classes from. If you try to assign or read something from an undefined property, an exception is thrown. Calling undefined methods throws an exception too. Those exceptions are not meant to be caught, but they should be fixed directly in your code.

<?php
class MyClass extends \Consistence\ObjectPrototype
{
    public $foo;
}

$a = new MyClass();
$a->boo = 'bb'; // throws Consistence\UndefinedPropertyException

var_dump($a->foo); // NULL, but that does not matter, an exception would be thrown before
var_dump($a->boo); // throws Consistence\UndefinedPropertyException
var_dump($a->otherProperty); // throws Consistence\UndefinedPropertyException

$a->foo(); // throws Consistence\UndefinedMethodException

You're probably thinking, that using a base class for all classes is an awful code-smell!

I agree in general, but this case is different. If you consider the Consistence library to be an extension or augmentation of the standard PHP library, ObjectPrototype class is more like Object base class in Java. And nobody complains about it there.

The unseen advantage of this is that when you extend ObjectPrototype, you can't extend anything else, which is a good thing. You should be using composition as a code reuse mechanism anyway. In cases when the inheritance makes sense, you can use ObjectMixinTrait which enables the strict behaviour. Good example are the exceptions (they are objects too!):

<?php
class MyCustomException extends \Exception
{
    use \Consistence\Type\ObjectMixinTrait;
}

$exception = new MyCustomException();
$exception->foo = 'a'; // throws Consistence\UndefinedPropertyException

Speaking of exceptions, there is a PhpException which can be used as their base class. It has a shorter constructor without the mostly useless $code argument.

Strict type checking

PHP type-hints are powerful, but there are still a lot of things they can't check. You can put the detailed type info into the PHPDoc, but it is ignored at runtime. It only helps other developers and the IDE to better understand the code.

In the following example, IDE understands that the array contains int values, but PHP only checks that it is an array:

<?php
/**
 * @param int[] $data
 */
function foo(array $data)
{
    var_dump($data);
}

foo([0, 1, 2]); // OK,
foo(['0', '1', '2']); // OK
foo(1); // not OK: Argument 1 passed to foo() must be of the type array, integer given

You can use Type class to manually check that the variable contains expected type:

<?php
use Consistence\Type\Type;

/**
 * @param int[] $data
 */
function foo(array $data)
{
    Type::checkType($data, 'int[]');

    var_dump($data);
}

foo([0, 1, 2]); // OK 
foo(['0', '1', '2']); // throws Consistence\InvalidArgumentTypeException: int[] expected,  [array] given

Type::checkType() throws an exception when the type-check fails. If you want to throw the exception yourself, you can use Type::hasType($data, 'int[]') which returns boolean value.

Here are some examples what else you can use as an expected type:

  • object: useful in < PHP 7.2
  • Union types: int|string or int[]|string[]
  • Collection of objects: Product::class . '[]'
  • Array keys type: int:string[] (array of string values indexed by int keys)

Consistent array manipulation functions

Standard PHP functions for array manipulation aren't very consistent or strict:

  • most of them are not using strict comparison - they do automatic type conversion
  • most of them do not accept callbacks to create more complicated logic
  • some accept the source array as first parameter, some as a second parameter

Consistence provides several array manipulation functions in the ArrayType namespace. Let's have a look at the examples.

In the first example you can see how the implicit type conversion in in_array function can lead to unexpected results:

<?php
use Consistence\Type\ArrayType\ArrayType;

$data = ['1', '2'];

// automatic type conversion
in_array('1', $data); // bool(true)
in_array(1, $data); // bool(true) <- unexpected result!
in_array(true, $data); // bool(true) <- unexpected result!

// strict flag set to true
in_array('1', $data, true); // bool(true)
in_array(1, $data, true); // bool(false) <- works as expected
in_array(true, $data, true); // bool(false) <- works as expected

// ArrayType::containsValue() works as expected by default
ArrayType::containsValue($data, '1'); // bool(true)
ArrayType::containsValue($data, 1);  // bool(false)
ArrayType::containsValue($data, true);  // bool(false)

In this case you can get away with just making sure to always add true as a third parameter.

The code gets more complicated when you need more complex logic, e.g. you want to check if the array contains a value larger than 3. You can iterate through the array and determine if some value matches the condition:

<?php
$data = [1, 2, 3, 4];

$result = false;
foreach ($data as $value) {
    if ($value > 3) {
        $result = true;
        break;
    }
}
var_dump($result); // bool(true)

Consistence provides more succinct way of doing it with containsValueByValueCallback(), where you only need to write the actual business logic and not the repetitive boilerplate code:

<?php
use Consistence\Type\ArrayType\ArrayType;

$data = [1, 2, 3, 4];

$result = ArrayType::containsValueByValueCallback($data, function (int $value) {
    return $value > 3;
});

var_dump($result); // bool(true);

I often use array filtering by callback:

<?php
use Consistence\Type\ArrayType\ArrayType;

$data = [1, 2, 3, 4];

$result = ArrayType::filterValuesByCallback($data, function (int $value): bool {
    return $value > 2;
});
var_dump($result); // [3, 4]

And mapping values by callback:

<?php
use Consistence\Type\ArrayType\ArrayType;

$data = [1, 2, 3, 4];

// map values using callback
$result = ArrayType::mapValuesByCallback($data, function (int $value) {
    return $value * 2;
});
var_dump($result); // [2, 4, 6, 8]

Sometimes it may be convenient to use filterByCallback() and mapByCallback() that pass both key and value to the callback function (they use the KeyValuePair value object internally).

Did you know, that array_unique() is always comparing loosely? Therefore, I prefer to use strict ArrayType::uniqueValues():

<?php
use Consistence\Type\ArrayType\ArrayType;

$data = [1, '1', true];

var_dump(array_unique($data)); // ['1']
var_dump(ArrayType::uniqueValues($data)); // [1, '1', true]

Last thing I want to show you regarding the arrays is the find/get convention. If the method name starts with find (e.g. findValue()), it can either return the value or null. But if the method name starts with get (e.g. getValue()), it either returns the value or throws an exception.

<?php
use Consistence\Type\ArrayType\ArrayType;

$data = [1, 2, 3, 4];

// we want to get a value at key

ArrayType::findValue($data, 3); // int(4)
ArrayType::findValue($data, 5); // null

ArrayType::getValue($data, 3); // int(4)
ArrayType::getValue($data, 5); // throws ElementDoesNotExistException

And there is more, have a look at the available methods for yourself.

Regex

This chapter is going to be a short one. Consistence provides a preg_match wrapper with more sensible API and exceptions error handling:

<?php
use Consistence\RegExp\RegExp;

// you can either check if the string matches the pattern
RegExp::matches('abc', '/bc+/'); // bool(true)

// or get the matches back
$matches = RegExp::match('abcde', '/[b-d]+/');
var_dump($matches); // ['bcd']

PHPStan integration

There is a static analysis tool called PHPStan (you can read more about it in Ondřej's blogpost.

I have created PHPStan rules for the Consistence library. There is one which checks that the class extends ObjectPrototype or uses ObjectMixinTrait. And second which checks that you are using safer Consistence array manipulation functions instead of the plain native PHP ones.

Conclusion

In the article I've described the most interesting parts of the Consistence library. My favourite are enums and strict types everywhere.

If you are not using the Consistence library yet, give it a try!

]]>