<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Albert Wolszon on Medium]]></title>
        <description><![CDATA[Stories by Albert Wolszon on Medium]]></description>
        <link>https://medium.com/@Albert221?source=rss-80a3a2600502------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*nuNTb2n6aFbNuWE03qFIcQ.jpeg</url>
            <title>Stories by Albert Wolszon on Medium</title>
            <link>https://medium.com/@Albert221?source=rss-80a3a2600502------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 08 Apr 2026 21:05:25 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@Albert221/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Moja przygoda z PPL(A) — pamiętnik]]></title>
            <link>https://medium.com/@Albert221/moja-przygoda-z-ppl-a-pami%C4%99tnik-efafe15574ef?source=rss-80a3a2600502------2</link>
            <guid isPermaLink="false">https://medium.com/p/efafe15574ef</guid>
            <dc:creator><![CDATA[Albert Wolszon]]></dc:creator>
            <pubDate>Thu, 06 Jun 2024 19:04:21 GMT</pubDate>
            <atom:updated>2024-06-06T19:04:21.141Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*t8DDudSOs-z6Qp4Cs08D4w.jpeg" /></figure><h3>Moja przygoda z PPL(A) — pamiętnik</h3><p>Ten wpis będzie służył jako swego rodzaju pamiętnik mojej przygody ze szkoleniem PPL(A). Znajdziesz tu moją drogę przez szkolenie teoretyczne i praktyczne, ze zdjęciami z powietrza, dygresjami i przeżywanymi emocjami. A na samym końcu rozpiska kosztów.</p><h4>22.05.2022 (22 maja, niedziela)</h4><p>Słowem wstępu, już będąc dzieckiem miałem taki szczeniacki cel, żeby “do trzydziestki zrobić licencję na śmigłowiec”. To było takie paliwo tego na co się piszę. Utleniaczem natomiast był mój dobry znajomy z gimnazjum, Konrad, jak się dowiedziałem że on sam zaczyna robić PPL(A), jako jego kontynuację zabawy z General Aviation, po lataniu szybowcami. Po przepytaniu go o wszystkie rzeczy związane z robieniem licencji, lataniem i logistyką za tym stojącą, zacząłem coraz realniej myśleć nad przystąpieniem do szkolenia osobiście.</p><p>Na przestrzeni kilku tygodni coraz bardziej się w to wkręcałem, oglądałem filmiki z zapisów radiokomunikacji na kanale <a href="https://www.youtube.com/channel/UCuedf_fJVrOppky5gl3U6QQ">VASAviation</a>, oglądałem rolki na Instagramie z samolotami. Przyjemną perspektywą było też posiadanie niecodziennego hobby, które pozwala doświadczyć czegoś w pewien sposób egzotycznego i wymienienia pieniędzy zarobionych przed komputerem na coś z kompletnie innej beczki.</p><p>Kupiłem w Aeroklubie Warszawskim lot zapoznawczy i po paru zmianach terminu (głównie z powodu niesprzyjającej pogody) 11 maja 2022 znalazłem się pół kilometra nad Warszawą w Aero AT-3.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Iy2R29QJilwsiQ2vVjPNIg.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sZAoIuspJ3U6eGTVp6jSjg.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*r-CLvqjNT-ugoFFiz9GQeQ.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bj3oX3LHZhh-Gb6Jg5HP0A.jpeg" /></figure><p>Lot był świetny, poczułem tę zajawkę i wreszcie się zdecydowałem na szkolenie. Po rozmowie telefonicznej i wypytaniu o szczegóły samego szkolenia w AW czekam na 30 maja na spotkanie organizacyjne, i jeżeli logistyka całości będzie mi odpowiadać, kolejnego dnia będę już na wykładzie.</p><p>W międzyczasie czytam <a href="https://sklep.dlapilota.pl/literatura/58-podrecznik-pilota-samolotowego-domicz-szutowski.html"><em>Podręcznik pilota samolotowego</em> Jerzego Domicza i Lecha Szutowskiego</a>, żeby się nieco zaznajomić z tematem przed samymi wykładami. Od czasu do czasu dla sportu rozwiązywałem też testy w apce <a href="https://apps.apple.com/pl/app/ppl-po-polsku/id1488269044">PPL Po Polsku</a>.</p><h4>05.06.2022 (5 czerwca, niedziela)</h4><p>Jestem już po spotkaniu organizacyjnym jak i 3 pierwszych wykładach! Z <em>Zasad lotu</em>, <em>Prawa lotniczego</em> oraz <em>Ogólnej wiedzy o statku powietrznym</em>.</p><p>Spotkanie organizacyjne zapoznało wszystkich mniej więcej z tym co to jest latanie, jak wygląda życie aeroklubu oraz jak wyglądają koszta licencji. Razem z Oskarem — z którym się na to spotkanie wybrałem — wypełniliśmy formularz <em>Zgłoszenie na szkolenie lotnicze</em> i już kolejnego dnia byliśmy na pierwszym wykładzie. Te odbywają się w trybie wieczorowym, 3 dni w tygodniu, zwykle 17:00–21:00, w budynku aeroklubu, sąsiednio do EPBC. Na wykładach jest nas dwanaścioro.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fkCD8g5B0J47ljMp0268Ow.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ygfa9TNP4D3Ml-FeheBvVw.jpeg" /></figure><p>Bardzo inspirujące było to, jak na zajęciach z <em>Prawa lotniczego</em> z Hubertem Massalskim (pozdrawiam!) wybraliśmy się na chwilę na walne zebranie Aeroklubu gdzie wybierany był nowy zarząd. Móc usłyszeć pilota liniowego będącego w Aeroklubie od 1965 roku i jego karierze lotnika, z tysiącami godzin na różnych maszynach, w — w pewnym sensie — przestrzeni, gdzie każdy jest równy (no, my co dopiero świeży uczniowie) to bardzo uskrzydlające doświadczenie.</p><h4>10.07.2022 (10 lipca, niedziela)</h4><p>Przede mną już tylko ostatnie zajęcia z <em>Meteorologii </em>i całe przedmioty <em>Nawigacji </em>oraz <em>Osiągów i planowania lotu</em>. W wewnętrznym systemie aeroklubu zdałem już wszystkie przedmioty oprócz tych dwóch wymienionych. <em>Zasady Lotu</em> to zdecydowanie najcięższy przedmiot.</p><p>W minionym czasie mieliśmy zajęcia <em>Wiedzy o Samolocie</em> z Prezesem Aeroklubu, <em>Łączności </em>z informatorem i kontrolerem z FISu, <em>Meteorologii </em>z synoptykiem pogodowym z 15-letnim stażem. Sami praktycy, co jest naprawdę motywujące, a słuchanie osób z prawdziwą zajawką i bardzo praktycznym doświadczeniem w swojej dziedzinie daje naprawdę potężnego kopa zafascynowania tymi tematami.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DRkGMAhlGsutiqjZrs_OKA.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VmoF0uTiCr9vAvbR6kXDHw.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*I1a_jUw2xdsISfk_iVlB_w.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*P-jysZG4SiMNl5evXlgRuw.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*saTYfviS0-NEn44Co1gAtA.jpeg" /></figure><p>Jedne zajęcia z <em>Wiedzy o Samolocie</em> mieliśmy w hangarze aeroklubu.</p><p>Oprócz zajęć, w międzyczasie zrobiłem też badania lotniczo-lekarskie drugiej klasy w ALERGO-MED.</p><h4>28.09.2022 (28 września, środa)</h4><p>Po tej jakże długiej przerwie spędzonej w oczekiwaniu na wrześniową sesję egzaminacyjną (w sierpniu sesji nie było) i powolnym docieraniu formalności z Aeroklubem czas na aktualizację.</p><p>Za mną już całe szkolenie teoretyczne oraz pierwsze podejście do sesji egzaminacyjnej w ULCu. Udało mi się zdać 6 na 9 przedmiotów; ku mojej uciesze, najtrudniejsze <em>Prawo Lotnicze</em> i <em>Zasady Lotu</em> udało zdać się już przy pierwszym podejściu! Nie udało mi się natomiast podołać <em>Meteorologii</em>, <em>Osiągom i Planowaniu Lotu</em> jak i <em>Człowiekowi — Możliwości i Ograniczenia</em>. Drugie podejście już za miesiąc.</p><p>W poczekalni sali egzaminacyjnej klimat nieco przypomniał mi czasy zdawania prawa jazdy, jednak zdecydowanie mniej stresujący. W przeciwieństwie jednak do momentu wejścia na salę, gdzie musiałem najpierw wziąć parę głębokich wdechów, żeby uspokoić drżenie rąk przy wpisywaniu danych do zalogowania. Po pierwszym przedmiocie poszło już z górki.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*tY7YzZG6Ui574Bp8" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*GrFYkUyiaIvCuKRE" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*zSLqOHFT3IblBbon" /></figure><p>Mam też już założone konto w Aeroklubowym systemie i już na ten piątek mam zaplanowany swój pierwszy lot, z Piotrem Beerem jako moim instruktorem. Oby pogoda była dobra a poranna mgła zaspała.</p><h4>05.10.2022 (5 października, środa)</h4><p>Za mną mój pierwszy lot jako pilot-uczeń! Już wcześniejszego dnia cieszyłem się dobrym TAFem i prognozą na Windy:</p><blockquote>EPWA 050530Z VRB02KT CAVOK 08/07 Q1022 NOSIG</blockquote><p>a dziś poznałem swojego instruktora — Piotra Beera (pozdrawiam!) — i rozpocząłem swoją przygodę z praktyką szkolenia PPL(A). Zaczęliśmy od omówienia tematów gdzie co jest w budynku Sekcji Samolotowej, zrobiliśmy zlecenie na lot, wyważenie, mały briefing i poszliśmy do hangaru.</p><p>Tam zaczęliśmy od przeglądu samolotu przed lotem, paliwa było dosyć, więc obyło się bez tankowania, uzupełniliśmy olej w silniku i napompowaliśmy jedną z opon. Wyciągnęliśmy dyszlem samolot na płytę przed hangarem.</p><p>Dalej była już lekcja kołowania. Sterujemy przepustnicą i hamulcami. Przed wjazdem na pas zrobiłem w ramach ćwiczeń ósemkę. Dalej Piotr wystartował i już na crosswindzie to ja przejąłem stery. Jak to i przy nauce jazdy, początkowo bardzo dużo rzeczy jest do ogarnięcia wzrokiem i głową; co prawda skupiałem się na samym locie i utrzymaniu kursu, ale już to było mocno wymagające. Gdy byliśmy już daleko od zabudowań to robiłem parę zakrętów. Dalej spotkaliśmy w powietrzu kolegę Pawła z którym byłem w grupie na teorii w SP-RAM (również pozdrawiam!) i zrobiliśmy lowpassa nad Chrcynnem. Dalej zawróciliśmy i skupiałem się na utrzymaniu kursu, zniżaniu poziomu lotu bez przyrostu prędkości i zwiększaniu poziomu lotu bez spadku prędkości. Instruktor pozwolił mi doświadczyć przeciągnięcia samolotu. Ekstremalne uczucie. Jeżeli Ty, czytelniku, wybierałbyś się kiedyś na lot widokowy — poproś pilota o przeciągnięcie. Adrenalina gwarantowana!</p><p>W międzyczasie jeszcze zrobiłem kilka kółek i wracaliśmy włączając się do kręgu. Dalej instruktor już przejął ster i tłumaczył co robi przy lądowaniu, od wyciągania klap, przez włączanie świateł do lądowania, na samym lądowaniu kończąc.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/733/0*-9mMCq_qL2JmbDGb" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mcU1zqix9k-IhaVPk66Cjg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/707/1*cJMpuh5HJikPHcetLrEnNQ.png" /></figure><p>Zanim się pożegnaliśmy pomogłem jeszcze powyciągać samoloty z hangaru, żeby móc wyciągnąć D-FIDI — Cessnę 208 Caravan — która zaraz miała lecieć do Chrcynna zrzucać skoczków spadochronowych.</p><p>No to tak. Pierwszy lot za mną. Nie mogę się doczekać kolejnych! Aczkolwiek wiem, że będzie to wymagające, zarówno zręcznościowo jak i mentalnie zadanie.</p><h4>14.10.2022 (14 października, piątek)</h4><p>Trzy lekcje już za mną i kolejne lądowania. Wykonywałem już kręgi nadlotniskowe nad EPNC, a ostatnio uczyłem się kręgu nad EPBC. Zaczęła też się nauka samego lądowania. Na pierwszej lekcji działo się bardzo dużo i ciężko było to wszystko ogarnąć, ale już na kolejnych lekcjach jest coraz lepiej, powoli coraz więcej elementów obsługi statku powietrznego jest wprowadzane do mnie, jak np. obsługa podgrzewu gaźnika czy zgłaszanie na radiu pozycji z wiatrem. Pogoda jak na razie jest sprzyjająca, z korzystnymi dla dalszych lotów TAFami (czyli lotniczymi prognozami pogody wydawanym dla lotnisk).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SaDSN8NBEwW5UCDriLxbDA.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6SPvwsGFJ0iZfbl3dEdFnQ.jpeg" /></figure><h4>18.10.2022 (18 października, wtorek)</h4><p>Pozostałe trzy przedmioty zaliczone i tym samym egzamin teoretyczny do PPL(A) zdany!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/733/0*tn4GXuoyTJtsfPOu" /></figure><h4>18.01.2023 (18 stycznia, środa)</h4><p>Listopad i grudzień nie był dla mnie specjalnie lotny. Dni wolne, przeziębienie lub brak pogody skutecznie przeszkadzały w lataniu. W nowym roku zmieniła się też cena lądowań na EPBC, przez co teraz kręgi wykonujemy w Chrcynnie. Sam krąg zajmuje dużo mniej czasu niż w Babicach, jednak trzeba do Chrcynna jeszcze dolecieć.</p><p>Coraz płynniej komunikuję się z informatorami na radiu, starty i budowanie kręgu wychodzi mi bezproblemowo. Walczę natomiast wciąż z lądowaniami. W miniony poniedziałek miałem mały <em>eureka moment</em>, gdy zrozumiałem jak należy poruszać drążkiem przy ostatnich sekundach lądowania. Do zestawu brakuje mi jeszcze tylko prawidłowe ocenianie wysokości nad pasem, ostatnie lądowania wychodziły mi nawet <em>nietragicznie</em>, jednak spadałem na pas z 2–3 metrów. Zdecydowanie jest jeszcze pole do poprawy.</p><p>Sama obsługa samolotu też już nie jest dla mnie taka straszna. I nie mowa tu o sterach, a całości, czyli operowanie podgrzewem gaźnika, pompa paliwa, światła, klapy czy kontrolowanie temperatury oleju i na cylindrach i odpowiednio dostosowywanie ich wentylacji.</p><p>Mam też już swoją kartę paliwową do naszej aeroklubowej samolotowej stacji paliw i legitymację członkowską!</p><p>W logbooku mam niecałe 11h block time’u.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_CfoQKHOubpIwznh9quIcw.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TGgs4zSWTmohVab6PvjO1g.jpeg" /></figure><h4>29.04.2023 (29 kwietnia, sobota)</h4><p>Znowu miejsce miała mała przerwa. W styczniu latałem 3 razy, w marcu 2 razy, ale teraz mamy końcówkę kwietnia. Pogoda zrobiła się już wreszcie lotna, poranki dają znacznie więcej nadziei (o ile nawet nie pewność!) na pomyślne warunki. Udało mi się w kwietniu polecieć 3 razy i plany są na kolejne loty tuż po majówce i wreszcie regularne lekcje.</p><p>Każda lekcja po większej przerwie to nieco gorsze opanowanie wszystkiego co się dzieje dookoła, dopiero po parunastu, parudziesięciu minutach wraca wprawa nabyta w poprzednich lotach.</p><p>Jeżeli chodzi o moje postępy, to zdaniem instruktora ląduję już jak jak najbardziej bezpiecznie. Jest oczywiście pole do doskonalenia, co też ma za każdym razem miejsce.</p><p>Za mną już ćwiczenia lotów na małych prędkościach, wyciągania samolotu z przeciągnięcia, a na ostatniej lekcji już zaczęliśmy imitacje lądowań awaryjnych.</p><p>Dzień mojego pierwszego lotu solo zbliża się nieubłaganie. Stresuję się tym na samą myśl, ale jak to ze wszystkimi kulminacyjnymi punktami. Jeżeli instruktor stwierdzi, że jestem gotów, to nie pozostaje mi nic, tylko się z nim zgodzić.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*J8N1sRfEqO8EVxMJSC9W0w.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Hqhi2kLS7vDokCay" /></figure><p>W międzyczasie dla własnej i innych wygody stworzyłem aplikację mobilną pomagającą w przygotowaniu samolotu do lotu i wyważenia: <a href="https://play.google.com/store/apps/details?id=me.wolszon.aw_pilot_helper">Android</a> <a href="https://apps.apple.com/us/app/aw-pilot-helper/id6447465616">iOS</a>.</p><p>Ćwiczyłem też na sucho korespondencję radiową, zapisałem sobie parę najczęściej używanych formułek, jak na przykład witanie się na nowej częstotliwości przy przejściu z Babice Informacja na Olsztyn Informacja. Po takim nawet małym treningu o niebo lepiej się ją prowadzi.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fgo6C3wA_4QGBIyQBj3WoQ.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*I3r9wqXx1rkJzjdo_EDCyw.jpeg" /></figure><p>Złożyłem również do UKE wniosek o wydanie świadectwa ogólnego radiotelefonisty w służbie radiokomunikacyjnej lotniczej.</p><p>Wzrosła niestety opłata lotniskowa na EPBC:</p><p><a href="https://dlapilota.pl/wiadomosci/polska/niezrozumialy-i-nieuzasadniony-wzrost-cen-na-epbc-apel-o-rozsadek-umiar-w-imie">Niezrozumiały i nieuzasadniony wzrost cen na EPBC. Apel o rozsądek i umiar w imię narodowego interesu.</a></p><h4>30.06.2023 (30 czerwca, piątek)</h4><p>Piątek, piąteczek, piątunio. Polatane! Ale po kolei, bo chwilkę mnie tu nie było.</p><p>Jestem już po swoim pierwszym locie samodzielnym! Ale droga do niego nie była bez przeszkód.</p><p>Pierwsze podejście, czyli lot sprawdzający miałem 25. maja. Jadąc na lotnisko, im bliżej byłem tym bardziej się stresowałem. Próbowałem jakoś się ze stresu otrząsnąć, ale było ciężko. Start trochę się przeciągnął co wcale nie pomagało. Z Marcinem Witkowskim (pozdrawiam!) dolecieliśmy do Chrcynna, zrobiłem tam kilka kręgów z konwojerami, ale lądowania szły mi beznadziejnie. Źle planowałem ścieżkę podejścia, zamiast patrzeć na ukos przy przyziemianiu to patrzałem przed siebie. Jednym słowem porażka. Wróciliśmy do Warszawy.</p><p>Poćwiczyłem podejście i lądowanie po kilku dniach z Piotrem.</p><p>Drugie podejście miałem 7. czerwca z Wacławem Sieczkowskim (również pozdrawiam!). Tym razem stres był zdecydowanie mniejszy. Trochę przez to, że już wiedziałem co i jak z lotem sprawdzającym, ale też warunki były nieco bardziej sprzyjające. Jednak i tutaj jeszcze dałem z siebie trochę za mało. Po paru kręgach z instruktorem pojawił się wiatr boczny (bodaj 7 czy 9kt jak pamiętam), który jednak przerósł moje umiejętności pięknego podejścia. Powietrze — dwa. Albert — zero.</p><p>16. czerwca natomiast był dniem w którym w swoim logbooku po raz pierwszy wpisałem coś w kolumnie PIC, zamiast jak zawsze DUAL!</p><p>Rano warunki były dobre, ja byłem wyspany, relatywnie wyciszony i z dobrym przeczuciem. Wykonałem z Wackiem kilka kręgów, po czym zrobiliśmy pełne zatrzymanie, powtórzyliśmy jeszcze raz procedurę <em>go around</em> i żebym nie wahał się jej stosować, i wtem stałem się jedyną osobą na pokładzie. Rozbieg, rotacja i wznoszenie odbyły się w pełnym skupieniu. Dopiero ponad wysokością decyzji, gdy schowałem klapy, obniżyłem mocy i wykonałem pierwszy zakręt miałem chwilę żeby powiedzieć sobie “wow, lecę sam!”. Dalej nadal w zaciekłym skupieniu, jednak już praktycznie pozbawiony stresu dokończyłem krąg, dotknąłem pasu, po czym po konwojerze znów się uniosłem, wielce zadziwiony tym, jak łatwo się wznieść gdy samolot jest lżejszy o osobę. Dalej drugi krąg, pełne zatrzymanie i powrót na Babice.</p><p>Także tak, pierwszy lot samodzielny za mną! Piękna sprawa. Na briefingu otrzymałem gratulacje (i nie tylko, hehe) od innych z licencją osiągnięcia kamienia milowego w swojej przygodzie lotniczej.</p><p>Parę dni później dokończyłem ćwiczenie przewidziane w programie szkolenia z lotami samodzielnymi po kręgu. Tym razem ekstaza już była nieco mniejsza, ale miałem też i więcej czasu napawać się uczuciem samotnego i samodzielnego pilotowania samolotu.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rhnLaRM9ov1kuU1QuJpbdA.jpeg" /></figure><p>Przede mną samodzielne kręgi na niskiej wysokości i loty na pilotaż.</p><h4>04.08.2023 (4 sierpnia, piątek)</h4><p>Całe zadanie A, czyli nauka pilotażu ukończone wraz z zaliczonym egzaminem. Dziś był mój pierwszy (i zapewne przedostatni) lot w zadaniu B, czyli nauki podstaw latania według przyrządów bez widoczności.</p><p>Bardzo ciekawe uczucie i wreszcie coś nowego. Miałem ubraną czapeczkę, która mocno ogranicza pole widzenia, ograniczając je do samej dolnej połowy, czyli widziałem same przyrządy w samolocie. Piotr wydawał mi polecenia na jakie headingi zakręcać i z jakim przechyleniem a ja skupiając się na samych parametrach na cyfrowych zegarach robiłem co w mojej mocy żeby to wypełnić.</p><p>No i faktycznie, w paru momentach odnosiłem wrażenie że lecę prosto, lotem poziomym, a przy spojrzeniu na sztuczny horyzont ewidentnie widać było, że lecę krzywo. Miałem okazję doświadczyć tego, jak moje ciało sugeruje mi jedno, a przyrządy w samolocie drugie.</p><p>Niżej zdjęcie czapeczki i HEMSa jaki akurat lądował w bazie.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jYya1lzjXiEI8Q_QQQqPiA.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CzN51NH-wH3k4WA7o4WXLw.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qNq8u0oOezygM8cGiRJYlw.jpeg" /></figure><h4>29.08.2023 (29 sierpnia, wtorek)</h4><p>Parę dni po tamtym locie wykonałem jeszcze między innymi ćwiczebny holding na VORze ZABORÓWEK.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/998/1*lQ9ESczD6hsJ4f0Ro-7Jqw.png" /></figure><p>Dwa tygodnie temu, 14 sierpnia, odbyłem swój pierwszy lot nawigacyjny — wokół CTRa EPWA. Lot w powietrzu, w którym jeszcze nie byłem. Nowe widoki, nowe punkty odniesienia. Naprawdę świetnie było znaleźć się w nowym miejscu, widzieć ulice czy ekspresówki którymi czasem jeździłem autem czy jednośladem, miasta, rzeki, z góry. Jak rozumiem, to jest właśnie ta frajda, jaka ma dyktować całemu General Aviation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*8gubpuAG_pE0WNZg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cIaFahBN7NxLTSzapn_p0A.png" /></figure><p>Całe latanie według nawigacyjnego planu lotu poszło mi raczej nieźle. Wypatrywanie torów, jeziorek, rzek czy nawet miast to ciekawe wyzwanie, które z pewnością wraz z kolejnymi lotami będzie mi szło lepiej.</p><p>Miałem już również odbyć swój pierwszy prawdziwy lot cross-country, bo do Gryźlin, zahaczając (touch-and-go lub tylko przelot przez CTR) o Modlin, Przasnysz, Olsztyn-Dajtki, Olsztyn-Mazury i Grądy, ale gdy już dojechałem ze sporym wyprzedzeniem do Aeroklubu, dostałem telefon, że samolot ma usterkę. Akurat miałem do wcześniej przygotowanego nawigacyjnego planu lotu wprowadzać aktualny wiatr z GAMETa i robić pięciominutówki na mapie. Takie już małe lotnictwo! Czasem pogoda, czasem mechanik, czasem koncert na lotnisku, a czasem remont pasa!</p><p>Z moich lotniczych przygód innych od samego szkolenia, to w lipcu miałem okazję zobaczyć z bliska jedno z bardziej wymagających lotnisk na świecie, LPMA — Madera. Byłem również na swoim pierwszym pikniku lotniczym, w Borkach niedaleko Dęblina oraz na swoich pierwszych pokazach lotniczych — Air Show Radom. Te drugie —przynajmniej w części lotniczej — były <em>odlotowe</em>! Lornetka (Olympus 10x50 S, jakby ktoś był zainteresowany) była dobrym zakupem. F/A-18 hałasowało aż miło, a nocny pokaz Macieja Pośpieszyńskiego oraz dwóch motoszybowców był przepiękny.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*r_tWWc5mrCJaIJqG_btyzw.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lOhobYAjxf2T609cudqwXA.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*E03vqghe7NFy_B7oDnCn5w.jpeg" /></figure><h4>03.02.2024 (3 lutego, sobota)</h4><p>No, trochę czasu minęło. Od lotu z ostatniej aktualizacji odbyłem jeszcze swój pierwszy lot cross-country przez CTR Modlina, touch&amp;go w EPZL, przerwa w Olsztynie-Dajtki i powrót do Babic. Towarzyszyły mi piękne widoki naszych polskich Mazur.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IDQc6yQVLdaJGYEV_rS3Jg.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*J3On3ScNuauzp02NI4fjbQ.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3aWxotivkk0zbq6nm56k3w.jpeg" /></figure><p>Natomiast parę dni później miałem wypadek niezwiązany z lataniem. Miałem operowaną prawą dłoń i jestem aktualnie cięższy o 8 tytanowych śrub. W styczniu skończyłem rehabilitację, z jakąś 95% sprawnością (która do praktycznie każdej czynności jest absolutnie wystarczająca). Zgodnie z <em>MED.A.020 Pogorszenie kondycji zdrowotnej</em>:</p><blockquote>a) Posiadacze licencji nie mogą korzystać z praw wynikających z licencji, w przypadku gdy:</blockquote><blockquote>3) są poddawani leczeniu medycznemu, <strong>chirurgicznemu</strong> lub innemu leczeniu, które może uniemożliwić im bezpieczne korzystanie z praw wynikających z posiadania licencji.</blockquote><p>Skorzystałem z tej pauzy od latania też na wykonanie laserowej korekty wzroku, której prędzej czy później chciałem się poddać, a po której również musiałbym udać się na ponowne badania.</p><p>Pod koniec stycznia udało się przejść badania okolicznościowe i dostać orzeczenie, już bez ograniczenia VDL (czyli okularów/soczewek). W związku z operacją musiałem przedstawić zaświadczenie od mojego chirurga, że z ręką wszystko dobrze, a w związku z korektą wzroku musiałem wykonać badania widzenia zmierzchowego i odporności na olśnienie, oprócz zwykłego badania u okulisty w placówce lotniczo-lekarskiej.</p><p>Niestety, EPBC najpierw zostało bez AFISu, a potem zostało zamknięte. Zaraz wybieram się na urlop, więc szkolenie będę kontynuował dopiero pod koniec lutego — o ile sytuacja z EPBC się ogarnie.</p><p><a href="https://dlapilota.pl/wiadomosci/polska/babice-bez-sluzby-afis-w-lutym-2024">Babice po roku od drastycznych podwyżek zostają zamknięte dla ruchu cywilnego</a></p><h4>29.03.2024 (29 marca, piątek)</h4><p>Wylatałem już kolejne osiem godzin! Pierwszy lot po tak długiej przerwie odbył się przypomnieniem z lądowań w Modlinie. Chrcynno wtedy było jeszcze zalane przez wiosenne roztopy i deszcze. Parę dni później trasa do Płocka z T&amp;G w EPZL. Dalej trasa do Piotrkowa Trybunalskiego. Mieliśmy jeszcze zahaczyć o Łódź, ale niestety w środy zamyka się dość wcześnie i nie udało się zdążyć przed zamknięciem lotniska. W samym EPPT (Piotrkowie; jak i na samej trasie) było dość wietrznie i mogłem poćwiczyć lądowania na (chyba?) najwęższym utwardzonym pasie startowym w Polsce z silnym wiatrem bocznym. Dziś natomiast ćwiczenie z lądowań zapobiegawczych i dwa kręgi w Przasnyszu.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xXu_K0fQIETm7j-_TcxBEw.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OWG6sveJwSeq2MF3cB41OA.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-hENZdXvV6N7T9NBO7VL-w.jpeg" /></figure><p>Muszę przyznać, że ta przerwa od latania chyba wyszła mi na dobre. Z niewiadomych przyczyn, mam wrażenie, że mam dużo większą swobodę w komunikacji na radiu, wlot w CTR (samego EPMO póki co) to przyjemność, a i wspomaganie się na trasie VORami wychodzi mi kompletnie naturalnie. Spodziewałem się, że będzie mi szło dużo gorzej, a oprócz tych pierwszych parunastu minut lotu i kilku lądowań to wróciłem już do poziomu na którym skończyłem we wrześniu zeszłego roku.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VIjv-yEKsaM-aHs9ngYnjw.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Na_GB1jpHVmzZ1S8Jc9A3w.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*g0mTPS4nFOp345Le_w4PSA.jpeg" /></figure><p>Napiszę jeszcze, że naprawdę przyjemnie się lata po Modlinie. Pas fajny asfaltowy, na radiu milutko, od czasu do czasu chwilka holdingu bo Ryanair ląduje. Polecam lotnisko!</p><h4>04.05.2024 (4 maja, sobota)</h4><p>Majówkowa sobota minęła mi z kolejnym lotem. Ale po kolei.</p><p>Zaliczyłem lot do Olsztyna-Mazury oraz do Gryźlin. Przyjemna trasa, ale punktu EPSY Zulu niestety nie udało mi się odnaleźć wzrokowo.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dx2yZM7CPvt-gnjl1pCHHg.jpeg" /></figure><p>Dalej, na koniec kwietnia mój najdłuższy lot w szkoleniu. Nowy Targ i Zakopane. Dokładniej: Radom-Piastów, Kielce-Masłów, Kraków-Pobiednik, Nowy Targ z przerwą na jedzenie i dotankowanie. Dalej przelot nad Zakopanym dla widoków, Zator (i Energylandia!), Częstochowa-Rudniki i Piotrków Trybunalski. Niecałe 7 godzin w powietrzu. Piękne widoki na Polskę z góry. Kielce to najładniejsze miasto jakie widziałem z góry do tej pory (no, może oprócz Warszawy). Wreszcie też mogłem doświadczyć zwiększającego się poziomu gruntu, i utrzymywanie jakiegoś standardowego 2000ft AMSL już przestało być lekiem na całe zło, a trzeba było wchodzić nieco wyżej. Sam Nowy Targ ma elewację 2060 stóp. Im dalej na południe tym ciekawiej. A poniżej Krakowa już bajka… Tatry z samolotu są przepiękne. A lot pomiędzy Gubałówką a Giewontem — coś wspaniałego.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7g7owszH1Jlk0CqnvU0pnw.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*G-vCJjAzQuSWdgFcA3vYzA.jpeg" /></figure><p>W Nowym Targu pierogi na obiad w lotniskowym barze i dotankowanie w samoobsługowej stacji Wartera.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dAHqm1n42TRzZpc6oPVsrA.jpeg" /></figure><p>Dalej lot nad Zatorem z widokiem na Energylandię, Częstochowa i jeszcze krótki postój w Piotrkowie, by kontrolnie sprawdzić ilość paliwa.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pjaip4UhQ6nCVQoFn2kFvA.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ICfbJyJ5r2uNgwqS9HpYJA.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DT52U7xeQ4zid2sTXkDXbA.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rPZEW_UlBLE7G1Yzp-RiFg.jpeg" /></figure><p>Piękna to była trasa. A jaka droga! Temu też dobrze, że udało się taką jeszcze w ramach szkolenia przelecieć.</p><p>Dziś natomiast miałem mój lot sprawdzający przed samodzielnymi lotami po trasie. Wynik: dopuszczony 🎉. Przede mną natomiast trzy trasy samodzielne i egzamin państwowy. Czy licencja już naprawdę jest w zasięgu dłoni?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2cyKGl88zbvUzg_SCDD3ow.jpeg" /></figure><h4>15.05.2024 (15 maja, środa)</h4><p>Odbyłem lot sprawdzający przed samodzielnymi przelotami i dwie samodzielne trasy. Pierwsza tydzień temu, nad miejscowością Długosiodło, Pułtusk i powrót i druga dziś, kółko wokół CTRu Okęcia przez Wartę i Mszczonów. Pierwszy lot był w piękną, prawie bezwietrzną pogodę. Start był w porządku, trzymanie się trasy również dość łatwe, bo wszystkie miejscowości czy inne punkty orientacyjne widziałem z daleka. Zrobiłem masę fotek.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yYOZhdhAU9HCNEkaIY5lZQ.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*D5Io-1uamLX4BpZDB3wPEA.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*85-e54CP2BK47o1ESoOcpQ.jpeg" /></figure><p>Dzisiejszy lot był w 20kt wiatru, w kierunku osi pasa, ale na przelocie trochę miotało.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*o0aRUCguha5W2Fy5MYyLdQ.jpeg" /></figure><p>Latanie bez instruktora w kokpicie to już takie latanie, w którym dużo więcej myślisz o planie B w postaci ładnego pola na wypadek ewentualnej awarii silnika.</p><p>Dla przyszłych pilotów mam jeszcze drobną radę. Do mapek kupcie sobie pisaki permanentne, zmywalne alkoholem czy zmywaczem do paznokci zamiast zmywalne wodą. Gdy jest ciepło i lata się w krótkich spodenkach, łatwo jest zmazać nasze ciężko wyliczone trasy spoconym kolanem czy nadgarstkiem.</p><h4>22.05.2024 (22 maja, środa)</h4><p>Wczoraj odbyła się moja trzecia samodzielna trasa. Początkowo miał być lot do Częstochowy-Rudniki i powrót przez Piotrków Trybunalskich, ale przed Częstochową były całkiem z rana jeszcze aktywne strefy EPTS6B i C. Zatem mała zmiana planów i najpierw lot do Piotrkowa, tam pełne zatrzymanie i wysiadka do przylotniskowego baru na drugie śniadanie. Po napełnieniu brzucha telefon do ASM3 z pytaniem o trasę do Częstochowy. Ta już była wolna od stref.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jQj5btXVT4zAAMlBt2AEAw.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0OaRsDhqg6MY7gUWqMhnew.jpeg" /></figure><p>Przelot do Częstochowy całkiem przyjemny, większość czasu po prostu lot wzdłuż autostrady A1 aż do znalezienia lotniska.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YAfv9VPsiAnREMcfZh1UDQ.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8Ta8drdTsXUiKnkerSm6JQ.jpeg" /></figure><p>Na powrót natomiast zorganizowałem sobie atrakcję w postaci lotniczej wycieczki do elektrowni i kopalni Bełchatów.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zKXYqtjA7VyoGtTwEy60KA.jpeg" /></figure><p>Elektrownia z jej kominami wyglądała naprawdę potężnie. Polecam się tam wybrać samolotem, świetne widoki.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BAHUYNI3RMd-4wAd8wJHsQ.jpeg" /></figure><p>Stamtąd już tylko powrót na Babice przez EPLL Kilo i dalej na radialu do Zaborówka.</p><h4>25.05.2024 (25 maja, sobota)</h4><p>Szkolenie zakończone, 10 godzin samodzielnych wylatane. Potrzebne mi były jeszcze 1.5 godziny, które wylatałem nad Modlinem i w Chrcynnie. Planowałem lowpass w Modlinie, jednak pilot w innym samolocie kołując na lotnisku zgłosił dym ze stacyjki i zostałem wysłany na holding, więc zmieniłem zamiary i poleciałem na Yankee i do Chrcynna. Niżej zdjęcie samolotu i dwóch wozów strażackich na drodze kołowania Delta w EPMO. Nikomu nic się nie stało, pilotka opuściła samolot a kierownik straży zgłosił brak zagrożenia i odholowano samolot z powrotem na stanowisko postojowe.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zZL1fvMDPNIoeubW3tzTbQ.jpeg" /></figure><h4>06.06.2024 (6 czerwca, czwartek)</h4><p>Udało się! Wczoraj miałem egzamin na licencję pilota samolotowego turystycznego, egzaminował mnie Paweł Homa (na zdjęciu niżej, pozdrawiam!). Egzamin udało się zaliczyć. Świetnie! Niniejszym kończy się moja droga do licencji PPL(A). No, jeszcze jutro rano muszę się wybrać do ULCu złożyć wniosek o wydanie licencji. A potem ją odebrać. Ale część powietrzna szkolenia została zakończona.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*npR7nZ08OCuJQ37hO0LpZw.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*W1LRXB2CbGm8YJE_4GfqdA.png" /></figure><p>Piękna to była droga. Nieco przydługa, ale skończona. W różnych momentach szkolenia przeróżne emocje. Ekscytacja, stres, czasem też i znużenie. Wyjście spocony i przygrzany przez słońce w sile wiosny, a czasem zmarznięty przez przegląd przedlotowy na dworze w zimę. Równe 72 godziny nalotu ogólnego, z czego 10 godzin 10 minut jako pilot-dowódca.</p><p>Kolejne kroki? Zobaczymy. Latać, obserwować. Ciekawy jestem uczucia pierwszego swojego lotu już jako pełnoprawny licencjonowany pilot. Gdzie wybór trasy będzie podyktowany już wyłącznie moim widzimisię. No i ubytek wagi portfela się zmniejszy, bo samolot już w cenie bez instruktora.</p><p>Jeżeli czytasz ten tekst żeby może utwierdzić się w przekonaniu czy chcesz w to iść, mówię Ci: idź!</p><p>Na sam koniec jeszcze raz podziękowania dla mojego instruktora — Piotrka Beera.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2Db4_RiAmV5w8cYAHq2QRQ.jpeg" /></figure><h4>Podsumowanie kosztów</h4><p>Każdego zapewne interesuje koszt całości. Poniżej jest lista wszystkich moich wydatków związanych z robieniem licencji, w kolejności chronologicznej. Te najbardziej istotne pogrubiłem:</p><ul><li>Lot zapoznawczy (przed samym szkoleniem) — Aeroklub Warszawski —476 zł</li><li><strong>Kurs teoretyczny samolotowy PPL(A) — Aeroklub Warszawski — 1999 zł</strong></li><li><strong>Badania wstępne lotniczo-lekarskie klasa 2 — ALERGO-MED — 520 zł</strong></li><li>Druga para okularów korekcyjnych (wymagana przez ograniczenie VDL na badaniach) — Vision Express — 142 zł</li><li><strong>Słuchawki lotnicze Navcomm NC-300D — używane — 500 zł</strong></li><li>Mapa lotnicza sektoru Warszawa laminowana z pisakiem — dlapilota.pl — 68 zł — (ostatecznie niezbyt się przydała, bo loty nawigacyjne zacząłem już po wyjściu nowego wydania w 2023)</li><li>Nakolannik Piccolo Profi — dlapilota.pl — 129 zł</li><li>Składka członkowska 2022 do 25 rż. — Aeroklub Warszawski — 235 zł</li><li><strong>Opłata lotnicza za egzamin teoretyczny — Urząd Lotnictwa Cywilnego — 179,50 zł</strong></li><li><strong>Wpłata za szkolenie praktyczne — Aeroklub Warszawski — 43 000 zł</strong></li><li>Kamizelka odblaskowa z logiem AW — Aeroklub Warszawski — 65 zł</li><li>Składka członkowska 2023 do 25 rż. — Aeroklub Warszawski — 660 zł</li><li>Opłata za wydanie świadectwa lotniczego— Urząd Komunikacji Elektronicznej — 25 zł</li><li><strong>Kalkulator lotniczy (ST-CSG Student), ploter obrotowy (PJ-1), mapy lotnicze sektorów Warszawa, Olsztyn i Kraków laminowane — dlapilota.pl — 375 zł</strong></li><li>Składka członkowska 2024 do 25 rż., członek zwyczajny — Aeroklub Warszawski— 450 zł</li><li>Badania okolicznościowe lotniczo-lekarskie klasa 2 — ALERGO-MED — 200 zł</li><li><strong>Kolejne wpłaty na szkolenie praktyczne — Aeroklub Warszawski — 19 740zł</strong></li><li><strong>Opłata lotnicza za egzamin praktyczny — Urząd Lotnictwa Cywilnego — 607,50 zł</strong></li><li><strong>Samolot i lądowanie na egzaminie praktycznym — Aeroklub Warszawski — 1342 zł</strong></li><li>Opłata lotnicza za wydanie licencji — Urząd Lotnictwa Cywilnego — 95 zł</li></ul><p>Całościowo wyszło więc 69 466,00 zł.</p><p>Do tego należy jeszcze doliczyć koszty dojazdu na lotnisko. Przy mojej odległości od niego zdecydowanie wygodniej było się na nie dostać samochodem niż komunikacją miejską.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=efafe15574ef" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What are MediaQuery’s padding, viewPadding and viewInsets?]]></title>
            <link>https://medium.com/flutter-community/what-are-mediaquerys-padding-viewpadding-and-viewinsets-37ae11bc3bc2?source=rss-80a3a2600502------2</link>
            <guid isPermaLink="false">https://medium.com/p/37ae11bc3bc2</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[flutter]]></category>
            <dc:creator><![CDATA[Albert Wolszon]]></dc:creator>
            <pubDate>Wed, 05 Oct 2022 02:25:39 GMT</pubDate>
            <atom:updated>2022-10-11T16:15:56.807Z</atom:updated>
            <content:encoded><![CDATA[<p>This article aims to help you better understand what are Flutter’s MediaQueryData (and BindingBase.window) padding, viewPadding, and viewInsets properties.</p><p>Let’s start with an excerpt from the <a href="https://api.flutter.dev/flutter/widgets/MediaQueryData-class.html#insets-and-padding">MediaQueryData documentation</a>:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/0*HmShPTgQP34yPov9.png" /></figure><blockquote>This diagram illustrates how <a href="https://api.flutter.dev/flutter/widgets/MediaQueryData/padding.html">padding</a> relates to <a href="https://api.flutter.dev/flutter/widgets/MediaQueryData/viewPadding.html">viewPadding</a> and <a href="https://api.flutter.dev/flutter/widgets/MediaQueryData/viewInsets.html">viewInsets</a>, shown here in its simplest configuration, as the difference between the two. In cases when the viewInsets exceed the viewPadding, like when a software keyboard is shown below, padding goes to zero rather than a negative value. Therefore, padding is calculated by taking max(0.0, viewPadding - viewInsets).</blockquote><p>viewPadding define portions of the screen that are partially obscured by the System UI or some physical features, like a camera notch, cut-out, Dynamic Island, and what not. This is an inner padding of your available Flutter view that you should use to display content that should accept gestures and not be obstructed by anything.</p><p>But there are some cases when you want to draw even in those viewInsets. For example to draw some background for your UI or to show a full-screen media edge-to-edge.</p><p>viewInsets indicates what area of edges of the screen is completely obscured. The most common example of such obstruction is a shown system keyboard.</p><p>padding is a convenient mix of those two. It gives you the padding needed to display content that is not obstructed both by the System UI and physical features as well as the system keyboard.</p><p>Below is a Flutter app I created to show those different paddings on different devices. iPhone 13 has a physical notch at the top and a navigation notch at the bottom, iPhone SE has a clear rectangle screen, while Pixel also has a clear rectangle screen, but with either a bottom navigation bar or a bottom navigation notch.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/6e7652c4d34a79d434cef5799a1d8bce/href">https://medium.com/media/6e7652c4d34a79d434cef5799a1d8bce/href</a></iframe><p>As you can see, iPhone with notches in horizontal orientation also has a viewPadding on the side where there is no obstruction. This is probably so that the application’s UI contents are still centered on the screen.</p><p>If you’re on Android and are using below code snippet for Splash Screens, then your bottom viewInsets will have the bottom navigation bar included. This can sometimes be problematic if you didn’t pay attention to putting SafeArea in every needed place, so it’s worth thinking of this single line of code before starting the development.</p><pre>WindowCompat.setDecorFitsSystemWindows(getWindow(), false)</pre><p>When we open a system keyboard, the viewInsets (and padding) changes. The viewInsets now describe the space taken by the system keyboard. The padding also updated to explain how much space above the insets should be offset for a <em>safe area.</em></p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/9780b876c9c3cda5490786417a924bad/href">https://medium.com/media/9780b876c9c3cda5490786417a924bad/href</a></iframe><p>All of this should be considered while developing screens for a wide range of devices. Using those values instead of hardcoded ones will help you ensure that your application’s content always displays where it should, no matter the different shenanigans that the phone producers may come up with.</p><p>The easiest way to easily use those values is to use the SafeArea widget, which applies the padding down the widget tree and removes it from the MediaQuery (using MediaQuery.removePadding) so that you won’t have to worry about redundantly nested paddings.</p><p>The concept of <em>view padding</em> is something that your designers should also be familiar with, so that when they design screen mockups, the various app bars, bottom navigations, and other fancy pieces of UI near-screen-edges will be prepared in such a way that is both adaptable on those different devices’ features and easily implementable by the developer with the certainty that this is what designer had in mind.</p><p>For further knowledge refer to:</p><ul><li><a href="https://api.flutter.dev/flutter/widgets/MediaQueryData-class.html">MediaQueryData API</a></li><li><a href="https://api.flutter.dev/flutter/widgets/MediaQueryData/viewPadding.html">MediaQueryData.viewPadding API</a></li><li><a href="https://api.flutter.dev/flutter/widgets/MediaQueryData/viewInsets.html">MediaQueryData.viewInsets API</a></li><li><a href="https://api.flutter.dev/flutter/widgets/MediaQueryData/padding.html">MediaQueryData.padding API</a></li><li><a href="https://api.flutter.dev/flutter/widgets/SafeArea-class.html">SafeArea API</a></li><li><a href="https://www.youtube.com/watch?v=lkF0TQJO0bA">SafeArea (Flutter Widget of the Week)</a></li><li><a href="https://www.youtube.com/watch?v=ceCo8U0XHqw">Padding, ViewPadding, and ViewInsets, Oh My! | Decoding Flutter</a></li></ul><p>Here’s the code for ultra-simple app used in screenshots: <a href="https://gist.github.com/Albert221/3493b53a2fabf9e4cabd79f92a44eabd">https://gist.github.com/Albert221/3493b53a2fabf9e4cabd79f92a44eabd</a></p><p>Follow Flutter Community on Twitter: <a href="https://www.twitter.com/FlutterComm">https://www.twitter.com/FlutterComm</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=37ae11bc3bc2" width="1" height="1" alt=""><hr><p><a href="https://medium.com/flutter-community/what-are-mediaquerys-padding-viewpadding-and-viewinsets-37ae11bc3bc2">What are MediaQuery’s padding, viewPadding and viewInsets?</a> was originally published in <a href="https://medium.com/flutter-community">Flutter Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to internationalize your Flutter app with ARB files today? — full-blown tutorial]]></title>
            <link>https://medium.com/@Albert221/how-to-internationalize-your-flutter-app-with-arb-files-today-full-blown-tutorial-476ee65ecaed?source=rss-80a3a2600502------2</link>
            <guid isPermaLink="false">https://medium.com/p/476ee65ecaed</guid>
            <category><![CDATA[internationalization]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[flutter]]></category>
            <dc:creator><![CDATA[Albert Wolszon]]></dc:creator>
            <pubDate>Sun, 02 Oct 2022 21:31:10 GMT</pubDate>
            <atom:updated>2023-03-12T19:27:18.024Z</atom:updated>
            <content:encoded><![CDATA[<h3>How to internationalize your Flutter app with ARB files today? — full-blown tutorial</h3><p>This article explains what is today’s (as of October 2022, Flutter 3.3) Flutter-native way to manage your ARB internationalization files, without the help of any external tools like intl_utils or similar.</p><blockquote><em>This article is no longer 100% true with Flutter 3.7 and above, as there were some changes in ARB parsing, new options added and so on. This article may be updated in the future.</em></blockquote><p>This also serves as a kind of reference knowledge that I gained during the development of <a href="https://github.com/Arbify">Arbify</a> (the public version as well as a private v2) and the <a href="https://github.com/leancodepl/poe2arb">poe2arb tool</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gTKpW04SfIdZp-I_rmGzag.jpeg" /></figure><h3>ARB files</h3><p>Your ARB files divide as follows:</p><ul><li>Template ARB file — usually English or the main language of your application. This is the file that also contains metadata, such as the description of the messages and placeholders with their corresponding type, format, example, and description. You mark one of your files as a template in configuration (see l10n.yaml below).</li><li><em>Other</em> ARB files — all the languages you support, besides the one used in the template ARB file. This file shouldn’t have any metadata, as it’s simply ignored.</li></ul><h4>ARB files syntax</h4><p>Let’s start with explaining the syntax of an ARB file.</p><pre>// app_en.arb<br>{<br>    &quot;@@locale&quot;: &quot;en&quot;,<br>    &quot;app_title&quot;: &quot;Fast Shopping&quot;,<br>    &quot;@app_title&quot;: {<br>        &quot;description&quot;: &quot;Shown on top of the screen.&quot;<br>    },<br>    &quot;list_item_no_name&quot;: &quot;No name&quot;,<br>    &quot;@list_item_no_name&quot;: {<br>        &quot;description&quot;: &quot;When the item has no/empty name.&quot;<br>    },<br>    &quot;list_item_done_ago&quot;: &quot;done {when}&quot;,<br>    &quot;@list_item_done_ago&quot;: {<br>        &quot;description&quot;: &quot;Small caps date when item was marked as done.&quot;,<br>        &quot;placeholders&quot;: {<br>            &quot;when&quot;: {<br>                &quot;type&quot;: &quot;String&quot;,<br>                &quot;example&quot;: &quot;a minute ago&quot;<br>            }<br>        }<br>    },<br>}</pre><p>This is my <strong>template</strong> ARB file.</p><h4>Locale</h4><p>Flutter checks the ARB file name for a string with <a href="https://github.com/flutter/flutter/blob/ce318b7b539e228b806f81b3fa7b33793c2a2685/packages/flutter_tools/lib/src/localizations/gen_l10n_types.dart#L554-L741">one of Flutter recognized ISO 639 language identifiers</a>. It must be prefixed with an underscore, so names like app_en.arb, my_messages_fr_ca.arbwill be recognized, while simply en.arb won’t be. The language and the following rest of the filename are then parsed using <a href="https://github.com/flutter/flutter/blob/ce318b7b539e228b806f81b3fa7b33793c2a2685/packages/flutter_tools/lib/src/localizations/localizations_utils.dart#L40">LocaleInfo.fromString</a>.</p><p>If the ARB file also has @@locale key (which is optional), Flutter checks if it matches the locale pulled from the filename. If it does not, an exception is thrown.</p><h4>Last modified</h4><p>Some tools output the @@last_modified key that contains an ISO 8601 date of the last modification of the file and/or translations.</p><h4>Messages</h4><p>Messages are the key parts of the ARB files. Each message name corresponds to a message value with the string internationalized to a given locale.</p><p>The message name could be any string that is a valid Dart field name.</p><p>The message value could be any string. It can contain variables, called placeholders. It can also contain a subset of the <a href="https://unicode-org.github.io/icu/userguide/format_parse/messages/"><em>ICU MessageFormat</em> syntax</a> (with some caveats below) for plural and select (although no gender support).</p><p>For the correct parsing of the variables, both plain ones and those used in the ICU strings, you must define the variables in the message’s metadata placeholders field.</p><pre>&quot;delete_shopping_list_dialog_body&quot;: &quot;Do you really want to delete {list_name} shopping list? This operation cannot be undone.&quot;,<br>&quot;@delete_shopping_list_dialog_body&quot;: {<br>    &quot;placeholders&quot;: {<br>        &quot;list_name&quot;: {<br>            &quot;type&quot;: &quot;String&quot;,<br>            &quot;example&quot;: &quot;Groceries&quot;<br>        }<br>    }<br>},<br>&quot;remove_all_done_dialog_body&quot;: {count, plural, =1 {Are you sure you want to remove 1 item? This operation cannot be undone.} other {Are you sure you want to remove all {count} items? This operation cannot be undone.}}&quot;,<br>&quot;@remove_all_done_dialog_body&quot;: {<br>    &quot;placeholders&quot;: {<br>        &quot;count&quot;: {<br>            &quot;type&quot;: &quot;int&quot;,<br>            &quot;format&quot;: &quot;compactLong&quot;<br>        }<br>    }<br>},</pre><p>You can also take a small shortcut here and simply use &quot;placeholder_name&quot;: {} to make it an Object type.</p><p><strong>Some remarks:</strong></p><ul><li>The <em>plural message format</em>’s count placeholder is always of type int, no matter what you specify in type.</li><li>You need to use =0 instead of zero, =1 instead of one, and =2 instead of two as plural categories in the <em>plural message format</em>.</li><li>Flutter doesn’t support offset in the <em>plural message format</em>.</li></ul><h4>Message metadata</h4><p>Message metadata resides in a JSON object with the key being the message’s name, prefixed with a single @.</p><p>This object may contain:</p><ul><li>description with a simple explanation of what a given message is. It’s added to the Dartdocs of generated getters/methods for the l10n classes.</li><li>placeholders object that contains a map of placeholder name to an object with type, example, format, description and/or optionalParameters.</li></ul><p>Available placeholder types: double, int, num, DateTime, Object (default), and any other type.</p><p>double, int, and num placeholder types must come with the format parameter that is one of the following: compact, compactCurrency, compactSimpleCurrency, compactLong, currency, decimalPattern, decimalPercentPattern, percentPattern, scientificPattern, or simpleCurrency.</p><p>If some of those number formats (<a href="https://pub.dev/documentation/intl/latest/intl/NumberFormat/NumberFormat.compactCurrency.html">like </a><a href="https://pub.dev/documentation/intl/latest/intl/NumberFormat/NumberFormat.compactCurrency.html">compactCurrency</a>) have any additional parameters, you may specify them in the optionalParameters map.</p><p>DateTime placeholder types must also come with the format parameter with a value of <a href="https://pub.dev/documentation/intl/latest/intl/DateFormat-class.html">one of the available </a><a href="https://pub.dev/documentation/intl/latest/intl/DateFormat-class.html">DateFormat constructors</a>, from here: <a href="https://github.com/flutter/flutter/blob/ce318b7b539e228b806f81b3fa7b33793c2a2685/packages/flutter_tools/lib/src/localizations/gen_l10n_types.dart#L33-L75">https://github.com/flutter/flutter/blob/ce318b7b539e228b806f81b3fa7b33793c2a2685/packages/flutter_tools/lib/src/localizations/gen_l10n_types.dart#L33-L75</a>.</p><p>Sadly, both example and description placeholder attributes aren’t outputted to the result Dart files. But they still can be used by external translation management tools, or by developers when reading the ARB files directly.</p><h3>l10n.yaml configuration file and CLI arguments</h3><p>Below is a list of the configuration options. Those can be specified in your l10n.yaml file (residing next to pubspec.yaml), or as flutter gen-l10n command arguments.</p><p>If an l10.yaml file exists, the CLI arguments are ignored.</p><ul><li>arb-dir (or --arb-dir CLI argument) — a relative path to the directory containing all the ARB files. Defaults to lib/l10n.</li><li>template-arb-file (or --templ… you get the idea) — a filename of your <em>template ARB file</em> (explained above), inside arb-dir. Defaults to app_en.arb.</li><li>synthetic-package — a boolean whether to use a synthetic package. If true, your output files will be created in the .dart_tool/flutter_gen/gen_l10n directory which you most likely excluded from Git. If false, the output-dir is used. Defaults to true.</li><li>output-dir — a relative path to the directory where the output Dart files will be generated if the synthetic package is not used.</li><li>output-localization-file — a filename of your result Dart file. Additional files for specific locales will have the locale appended after the an underscore.</li><li>output-class — a name of the class for your localization delegates and strings. Defaults to AppLocalizations.</li><li>untranslated-message-file — a relative path for a JSON file with a map of locale-message names of untranslated messages. Defaults to null, which does not generate such file.</li><li>header — a string that is prepended to the very top of the output file, above the first import. Exclusive with header-file.</li><li>header-file — a relative path to the file which contains a string that is prepended to the very top of the output file, above the first import. Exclusive with header.</li><li>preferred-supported-locales — a list of locales in order they will be passed in AppLocalizations.supportedLocales. ARB files with locales not specified in this list will still be present in supportedLocales, but in the default directory traverse (alphabetical) rather than the preferred one.<br>If we supported en and az languages, a user with pl as one’s default locale would have the app in Azerbaijan by default. Specifying en first in this option would put English before Azerbaijan in the locale lookup.</li><li>use-deferred-loading — a boolean whether to use deferred loading for different locale localization classes, used on Flutter Web only.</li><li>required-resource-attributes — a boolean whether to throw when there is no metadata for a message in the template ARB file. Defaults to false.</li><li>nullable-getter — a boolean whether the static of method in your localization delegate should return a nullable string or do a null-check inside. Defaults to true.</li><li>format — a boolean whether to format the outputted files. Defaults to true.</li></ul><p>Here’s some example l10n.yaml file:</p><pre># l10n.yaml<br>arb-dir: lib/l10n<br>template-arb-file: app_en.arb<br>output-localization-file: app_localizations.dart<br>output-class: S<br>preferred-supported-locales: [ en ]</pre><h3>pubspec.yaml</h3><p>Flutter localizations has two dependencies:</p><pre># pubspec.yaml<br>dependencies:<br>  flutter_localizations:<br>    sdk: flutter<br>  intl: ^0.17.0 # or whatever version is latest/you need</pre><p>If you use synthetic package (synthetic-package flag explained above), you must have generate: true in the flutter section of your pubspec.yaml:</p><pre># pubspec.yaml<br>flutter:<br> generate: true</pre><blockquote>Enabled synthetic package generation may cause conflicts with the build_runner though. If you stumble upon errors such as <a href="https://github.com/dart-lang/build/issues/2835">this</a>, stop using synthetic package and provide an output-dir for your result Dart files, just as I explained <a href="https://github.com/dart-lang/build/issues/2835">here</a>.</blockquote><h3>iOS configuration</h3><p>iOS applications define key application metadata, including supported locales, in an Info.plist file that is built into the application bundle. To configure the locales supported by your app, use the following instructions:</p><ol><li>Open your project’s ios/Runner.xcworkspace Xcode file.</li><li>In the <strong>Project Navigator</strong>, open the Info.plist file under the Runner project’s Runner folder.</li><li>Select the <strong>Information Property List</strong> item. Then select <strong>Add Item</strong> from the <strong>Editor</strong> menu, and select <strong>Localizations</strong> from the pop-up menu.</li><li>Select and expand the newly-created Localizations item. For each locale your application supports, add a new item and select the locale you wish to add from the pop-up menu in the <strong>Value</strong> field. This list should be consistent with the languages listed in the <a href="https://docs.flutter.dev/development/accessibility-and-localization/internationalization#specifying-supportedlocales">supportedLocales</a> parameter.</li><li>Once all supported locales have been added, save the file.</li></ol><p><em>This section is from the </em><a href="https://docs.flutter.dev/development/accessibility-and-localization/internationalization#localizing-for-ios-updating-the-ios-app-bundle"><em>official docs</em></a><em>.</em></p><h3>Your MaterialApp</h3><p>…or CupertinoApp or WidgetsApp.</p><p>Import the generated Dart file from the generated synthetic package (package:flutter_gen/gen_l10n/&lt;output-localization-file&gt;.dart) or your path (&lt;output-dir&gt;/&lt;output-localization-file&gt;.dart).</p><p>Pass AppLocalizations.supportedLocales (or whatever output-class name you’ve chosen) to your app’s supportedLocales.</p><p>Pass AppLocalizations.delegate to your localizationDelegates class. Instead of this, you can too use the AppLocalizations.localizationDelegates for convenience, which includes the widgets, Material, and Cupertino delegates as well, out-of-the-box.</p><pre>Widget build(BuildContext context) {<br>  return MaterialApp(<br>    // (...)<br>    // Localization stuff<br>    onGenerateTitle: (context) =&gt; S.of(context).app_title,<br>    supportedLocales: S.supportedLocales,<br>    localizationsDelegates: S.localizationsDelegates,<br>    // (...)<br>  );<br>}</pre><h3>Generate command</h3><p>That’s all you need! Now you can generate all the Dart files based on your ARB files using:</p><pre>flutter gen-l10n</pre><p>It’s also done on flutter build and on hot reloads.</p><p>And that’s it! Now you can import your app delegate and do AppLocalizations.of(context).someMessage to display your precious internationalized strings!</p><p>Here’s some further reading if you want to deep dive into the topic:</p><ul><li><a href="https://docs.flutter.dev/development/accessibility-and-localization/internationalization">Internationalizing Flutter apps</a> on Flutter.dev</li><li><a href="https://docs.google.com/document/d/10e0saTfAv32OZLRmONy866vnaw0I2jwL8zukykpgWBc/edit">Internationalization User Guide</a> by Flutter Team</li></ul><p>If you found this article helpful, I’d be grateful if you would 👏 clap or share it on Twitter or on your company’s Slack. Thanks!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=476ee65ecaed" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Automating publishing your Flutter apps to Google Play using GitHub Actions]]></title>
            <link>https://medium.com/flutter-community/automating-publishing-your-flutter-apps-to-google-play-using-github-actions-2f67ac582032?source=rss-80a3a2600502------2</link>
            <guid isPermaLink="false">https://medium.com/p/2f67ac582032</guid>
            <category><![CDATA[github]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[google-play]]></category>
            <category><![CDATA[flutter]]></category>
            <dc:creator><![CDATA[Albert Wolszon]]></dc:creator>
            <pubDate>Sun, 13 Sep 2020 19:02:22 GMT</pubDate>
            <atom:updated>2020-09-13T20:30:54.224Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ln0GiQX-GpUqipuLG1QjcQ.jpeg" /><figcaption>Thanks for the photo Michał!</figcaption></figure><p>Automating can help you save some time. It’s also very convenient. It also often helps your environment stay consistent: e.g. you tag a commit in your GitHub repository and a new store release is published.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/404/0*XF5nMquPikJ_Y2-Y.png" /><figcaption>xkcd: Automation</figcaption></figure><p>Lastly, I spent some time on automating publishing my Flutter app to Google Play, which I usually did from my Windows desktop, but it was annoying to type this long fastlane supply command with my Google Service Account JSON key path, etc. It took me a good day to assemble everything together and I finally managed to succeed. In this post, I wanted to share this knowledge (and workflow source code) to the community so that you won’t have to waste that much time on it.</p><h3>Intro</h3><p>I’m going to do a walkthrough through my GitHub Actions workflow. It has the following features:</p><ul><li>flutter analyze‘ying,</li><li>flutter testing,</li><li>compiling Flutter app to Android App Bundle (with release key signing),</li><li>publishing the AAB and metadata (store listing stuff) to Google Play and</li><li>caching all dependencies.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/796/1*5L4RA-x9ujHDBU0p9u26_Q.png" /><figcaption>All workflow steps</figcaption></figure><h3>Flutter Continuous Integration</h3><p>Let’s start by creating a new workflow file. I’m calling this workflow <em>Flutter release</em>. We’re going to put it in .github/workflows/flutter-release.yml.</p><pre>name: Flutter release</pre><pre>on:<br>  release:<br>    types: [published]</pre><p>Here, we are declaring the name of the workflow and the events that will trigger it.</p><pre>jobs:<br>  release:<br>    name: Test, build and release</pre><pre>    runs-on: ubuntu-latest</pre><pre>    steps:<br>      - name: Checkout<br>        uses: actions/checkout@v1<br>      <br>      - name: Setup Java<br>        uses: actions/setup-java@v1<br>        with:<br>          java-version: &#39;12.x&#39;</pre><pre>      - name: Setup Flutter<br>        uses: subosito/flutter-action@v1<br>        with:<br>          channel: beta</pre><pre>      - name: Flutter version<br>        run: flutter --version</pre><p>Let’s now create our first (and only) job.</p><blockquote>BTW, why did I set all of this up in only single job? Sharing files between jobs requires publishing artifacts, and those are files that you have a free usage limit on. I wanted to avoid that.</blockquote><p>We’re giving it a name and specifying the platform it will run on. Not only Ubuntu is enough for us, but it’s also the cheapest and you probably won’t have to worry about exceeding the free GitHub Actions usage limits anyway.</p><p>We’ll start by checking out the code, setting up the Java and Flutter, and printing the Flutter version that the Actions is using to the output. It can be helpful in case of debugging.</p><pre>      - name: Cache pub dependencies<br>        uses: actions/cache@v2<br>        with:<br>          path: ${{ env.FLUTTER_HOME }}/.pub-cache<br>          key: ${{ runner.os }}-pub-${{ hashFiles(&#39;**/pubspec.lock&#39;) }}<br>          restore-keys: ${{ runner.os }}-pub-</pre><pre>      - name: Download pub dependencies<br>        run: flutter pub get<br>      <br>      - name: Run build_runner<br>        run: flutter pub run build_runner build --delete-conflicting-outputs</pre><p>Here, we are telling Actions on what to cache, or rather — in that point of time — on what to retrieve. Specifically the pub cache. We’re using the FLUTTER_HOME environment variable from the previous subosito/flutter-action step.</p><p>Next, we’re downloading the pub dependencies using nothing else but flutter pub get.</p><p>If you’re using build_runner in your project and you decided to not push the generated files to the repository, that’s the place where you’d want to have your build_runner build step, which I do want and do have.</p><pre>      - name: Run analyzer<br>        run: flutter analyze</pre><pre>      - name: Run tests<br>        run: flutter test</pre><p>Let’s make sure our code passes analyzer check and our tests.</p><h3>Compiling and signing Android App Bundle</h3><p>If you were following the <a href="https://flutter.dev/docs/deployment/android#signing-the-app"><em>Signing the app </em>section of <em>Build and release an Android app</em></a>, you use android/key.properties file for giving keystore path and passwords to the Gradle. I’m using that too.</p><p>To use the keystore for signing we firstly need to have it available in the Actions filesystem.</p><pre>      - name: Download Android keystore<br>        id: android_keystore<br>        uses: timheuer/base64-to-file@v1.0.3<br>        with:<br>          fileName: key.jks<br>          encodedString: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}</pre><p>I’m retrieving the base64 encoded JKS file from secrets and saving it in the workflow.</p><p>But if we want to use that secret, we firstly have to declare it. Head to your GitHub repository Settings &gt; Secrets and create a new one. Name it ANDROID_KEYSTORE_BASE64.</p><p>You need to base64 encode your keystore file. You should either have bash or Git Bash present on your operating system. Run the following command:</p><pre>base64 &lt;your-keystore-file.jks&gt;</pre><p>and copy the output. Paste it as a secret’s value and save it.</p><p><a href="https://docs.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets#about-encrypted-secrets">It’s safe there.</a></p><pre>      - name: Create key.properties<br>        run: |<br>          echo &quot;storeFile=${{ steps.android_keystore.outputs.filePath }}&quot; &gt; android/key.properties<br>          echo &quot;storePassword=${{ secrets.ANDROID_KEYSTORE_PASSWORD }}&quot; &gt;&gt; android/key.properties<br>          echo &quot;keyPassword=${{ secrets.ANDROID_KEY_PASSWORD }}&quot; &gt;&gt; android/key.properties<br>          echo &quot;keyAlias=${{ secrets.ANDROID_KEY_ALIAS }}&quot; &gt;&gt; android/key.properties</pre><p>We still need the key.properties file. Let’s create it with the step above. For the storeFile value we’ll be using the path from the previous step. You still need to set ANDROID_KEYSTORE_PASSWORD, ANDROID_KEY_PASSWORD and ANDROID_KEY_ALIAS secrets.</p><pre>      - name: Build Android App Bundle<br>        run: flutter build appbundle</pre><p>Now, we can finally run our flutter build. Nothing fancy to see here.</p><h3>Publishing the app to Google Play</h3><p>This is it. We have our app compiled and we can proceed to publish it to Google Play.</p><p>We will use <a href="https://docs.fastlane.tools/actions/supply/">fastlane’s supply</a> for this. It’s nice because it works on all platforms, not only on macOS. Apart from the application binary itself, we’ll be also making sure the store listing information are up to date with the metadata we have in our repository. Because we have it in the first place, right?</p><pre>fastlane<br>└───metadata<br>    └───android<br>        └───en-US<br>            │   full_description.txt<br>            │   short_description.txt<br>            │   title.txt<br>            │<br>            ├───changelogs<br>            │       10.txt<br>            │       11.txt<br>            │       9.txt<br>            │<br>            └───images<br>                │   featureGraphic.jpg<br>                │   icon.png<br>                │<br>                └───phoneScreenshots<br>                        1.jpg<br>                        2.jpg<br>                        3.jpg</pre><p>Above is an example files structure for fastlane’s metadata. They’re basically the strings and images that you’d put in your Google Play Console.</p><p>You can see how it looks like in practice by <a href="https://github.com/Albert221/FastShopping/tree/master/fastlane">looking at my repository</a>.</p><pre>      - name: Setup Ruby<br>        uses: actions/setup-ruby@v1<br>        with:<br>          ruby-version: &#39;2.6&#39;</pre><pre>      - name: Cache bundle dependencies<br>        uses: actions/cache@v2<br>        with:<br>          path: vendor/bundle<br>          key: ${{ runner.os }}-gems-${{ hashFiles(&#39;**/Gemfile.lock&#39;) }}<br>          restore-keys: ${{ runner.os }}-gems-</pre><pre>      - name: Download bundle dependencies<br>        run: |<br>          gem install bundler:2.0.2<br>          bundle config path vendor/bundle<br>          bundle install</pre><p>Because fastlane is a ruby tool, we need to setup Ruby first. We’re also caching the gems (like pub packages but for Ruby).</p><p>This last step installs the dependencies from the Gemfile (or its lock file), but we currently don’t have any. Let’s create it in the root of our project:</p><pre>source &quot;<a href="https://rubygems.org">https://rubygems.org</a>&quot;</pre><pre>gem &quot;fastlane&quot;</pre><p>You can but don’t have to install it locally with bundle install. That way you’ll get Gemfile.lock created which you can track in the repository to always be sure of the fastlane (and other dependencies) version you’re using.</p><p><em>Snare drums…</em></p><pre>      - name: Release to Google Play (beta)<br>        env:<br>          SUPPLY_PACKAGE_NAME: ${{ secrets.ANDROID_PACKAGE_NAME }}<br>          SUPPLY_JSON_KEY_DATA: ${{ secrets.GOOGLE_SERVICE_ACCOUNT_KEY }}<br>        run: |<br>          bundle exec fastlane supply \<br>          --aab build/app/outputs/bundle/release/app-release.aab \<br>          --track beta</pre><p>Yes! That’s the very last step. We’re publishing it to the Google Play using supply. You need to set ANDROID_PACKAGE_NAME and GOOGLE_SERVICE_ACCOUNT_KEY secrets. The first one is just your app package name. You can find it in your build.gradle file under the applicationId key. The latter one is more tricky to obtain. Just follow <a href="https://docs.fastlane.tools/actions/supply/#setup">supply’s setup section</a>.</p><p>You may want to change the track to which the app is published from beta to production, alpha or internal.</p><h3>Whole workflow file</h3><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ee04415d0a778e39b3e9afa985636ba8/href">https://medium.com/media/ee04415d0a778e39b3e9afa985636ba8/href</a></iframe><p>Secrets you need:</p><ul><li>ANDROID_KEYSTORE_BASE64</li><li>ANDROID_KEYSTORE_PASSWORD</li><li>ANDROID_KEY_ALIAS</li><li>ANDROID_KEY_PASSWORD</li><li>ANDROID_PACKAGE_NAME</li><li>GOOGLE_SERVICE_ACCOUNT_KEY</li></ul><h3>Bonus hint for your test workflow</h3><p>If you had (or want to have) a test workflow, where you basically do everything like above, but stopping on flutter test, you’ll probably set the push (and maybe pull_request) events in the workflow on clause. But this will result in running both the test and release workflows at the same time when you tag a commit.</p><p>To prevent this, change your test workflow on clause as follows:</p><pre>on:<br>  push:<br>    branches:<br>      - &#39;**&#39;<br>    tags-ignore:<br>      - &#39;v*&#39;<br>  pull_request:</pre><p>The tags-ignore v** will tell the GitHub to not run this workflow when the commit’s tag begins with a v (so v1.0.0, v2.1.4 etc.).</p><p>The branches is needed, because otherwise, the push event won’t listen for anything. This is the part that made me debug the workflows for a few hours. <a href="https://github.community/t/using-on-push-tags-ignore-and-paths-ignore-together/16931/2">Solution source.</a></p><p>If you liked this article don’t forget to clap and share it!</p><h3>Read more</h3><ul><li><a href="https://docs.github.com/en/actions/getting-started-with-github-actions/about-github-actions">About GitHub Actions</a></li><li><a href="https://docs.fastlane.tools/actions/supply/">fastlane’s supply documentation</a></li><li><a href="https://github.com/Albert221/FastShopping/tree/master/.github/workflows">My workflows on which I based this article</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2f67ac582032" width="1" height="1" alt=""><hr><p><a href="https://medium.com/flutter-community/automating-publishing-your-flutter-apps-to-google-play-using-github-actions-2f67ac582032">Automating publishing your Flutter apps to Google Play using GitHub Actions</a> was originally published in <a href="https://medium.com/flutter-community">Flutter Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tutorial on deploying Arbify locally and using it in your Flutter app]]></title>
            <link>https://medium.com/@Albert221/tutorial-on-deploying-arbify-locally-and-using-it-in-your-flutter-app-9fae8af273ce?source=rss-80a3a2600502------2</link>
            <guid isPermaLink="false">https://medium.com/p/9fae8af273ce</guid>
            <category><![CDATA[development]]></category>
            <category><![CDATA[localization]]></category>
            <category><![CDATA[flutter]]></category>
            <category><![CDATA[internationalization]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Albert Wolszon]]></dc:creator>
            <pubDate>Mon, 22 Jun 2020 16:54:29 GMT</pubDate>
            <atom:updated>2020-06-22T16:54:29.861Z</atom:updated>
            <content:encoded><![CDATA[<h4>Arbify is an ARB files localization tool. Dedicated to Flutter and its intl package.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*yCgf-gJ1rxB8PS64" /></figure><p>In this article, I’ll walk you through deploying Arbify on your computer using Docker and we’ll build a Hello World! Flutter application utilizing internationalized messages created in Arbify.</p><h3>Deploying</h3><p>Firstly, we have to clone the <a href="https://github.com/Arbify/Arbify">GitHub repository</a>:</p><pre>git clone git@github.com:Arbify/Arbify.git<br>cd Arbify</pre><p>The next thing we need to do is copy the .env.example file into our brand new .env configuration file.</p><pre>cp .env.example .env</pre><p>We don’t need to change anything fancy here. We’ll leave it on defaults.</p><blockquote>Defaults were meant for deploying your own Arbify using Docker without a hassle, to try it and play with it. If you want to use it on a server, you probably want to enable production mode and set up a proper SMTP server.</blockquote><p>Now it’s time for building the Dockerfile:</p><pre>docker-compose build arbify</pre><p>As you can see we use docker-compose here. Arbify ships with a neat docker-compose.yml that handles a great portion of effort for you. Running this command may take a while depending on your network connection speed and computer power.</p><p>Once the build command succeeded, it’s time for a final deploy!</p><pre>docker-compose up -d</pre><p>You can now go to <a href="http://localhost:8000">http://localhost:8000</a> in your web browser. You should see something like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/851/1*9CaDw40sr5YMwaYGDJksgg.png" /></figure><p>Don’t worry, it’s all good! As you can see there, we need to run one last command to finish.</p><pre>docker-compose run --rm arbify docker/arbify/upgrade.sh</pre><p>This step can take a while too. It downloads all backend and frontend dependencies and compiles them. Once you do this for the first time though, the majority of your dependencies will be cached if you wanted to upgrade to a new version sometime in the future.</p><p>Your browser should refresh when the command from the previous step finished and you should see something like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*d3ZtFbYIN_fIQjGU9VC8Bw.png" /></figure><p>Log in to the Arbify with a default super administrator account using a username admin and a super-secure password password.</p><p>The first thing we may want to do is change the admin’s password to something more personal and secure.</p><p>Click on the <em>Users </em>link<em> </em>at the top navigation bar and then on <em>Edit</em> next to the admin account. Set your new password and click <em>Update user</em>.</p><h3>Creating our first project</h3><p>Let’s go to the <em>Projects</em> page and let’s click <em>New project</em>. Write some nice name for our first project and click <em>Create project</em>. Once you created it, open it by clicking on the new item on the list.</p><p>Now it’s time for creating our messages! Click <em>New message</em> and add one. Let’s call it app_name.</p><p>Since this project is for the default Flutter Hello world app, I’m gonna add one more message, button_tapped_message, but this time it will be a plural message.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7ny4fqSV8DIE3qjcRRYidg.png" /></figure><p>What’s the internationalization software for if we only have English here? Go to the <em>Languages</em> tab and add a language of your choice. I’m going with Polish as it’s my native language.</p><p>After you do that, go back to the <em>Messages</em> tab.</p><p>Let’s fill the blanks for our messages in English and the language you just added. Just click on a blank input, type your desired message, and hit Enter or defocus the field. Once it turned green you can be sure it’s saved.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hLR8HiIuQnTfhSAmsj3mww.png" /></figure><p>When you fill one field after another you can see how the blue progress bar above the language name grows and eventually turns green. It means that you translated all the messages. Good job!</p><p>Oh shoot, I made a typo. I typed ‘tpaped’ instead of ‘tapped’ in the 2nd field for English. Let me just quickly fix it!</p><p>Are you wondering what are those weird buttons next to all fields?</p><p>That’s a message value history. We can see how I fixed my typo by clicking on this button:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/623/1*TfRDVdADgu1ORPh2ZiY1Mw.png" /></figure><p>Once all of your messages turned green, it’s time for integrating them in our Flutter app!</p><h3>Integrating Arbify into the Flutter app</h3><p>Let’s begin with creating a new Flutter project.</p><pre>$ flutter create arbify_hello_world</pre><p>Add two dependencies to your pubspec.yaml file:</p><ul><li><a href="https://pub.dev/packages/arbify#-installing-tab-">arbify</a> and</li><li><a href="https://pub.dev/packages/intl#-installing-tab-">intl</a>.</li></ul><p>After running flutter pub get (which has probably already run thanks to your code editor/IDE) it’s time to run the most important command for your integration with Arbify. You’ll most surely receive an error:</p><pre>$ flutter pub run arbify:download</pre><pre>You don&#39;t have all the required configuration options. You can  <br>copy the template below and place it at the end of your pubspec.</pre><pre>arbify:<br>  url: <a href="https://arb.example.org">https://arb.example.org</a><br>  project_id: 12<br>  output_dir: lib/l10n # This is the default value.</pre><p>Do what it says. Make sure that the indentation is correct, i.e. arbify: isn’t prefixed with any spaces. Update URL with your Arbify URL, in case of this tutorial that’s localhost:8000. Update project_id too. If you’re wondering what’s the identifier of your project: open it in your browser and look at the URL. The number after /projects/ is your project’s id. You can omit the output_dir, we’ll stick to the default. In our case that’s 1.</p><p>Let’s run the command again. We should see a new prompt:</p><pre>$ flutter pub run arbify:download</pre><pre>We couldn&#39;t find an Arbify secret. Please create a secret using<br>the URL below, paste it here and press Enter.</pre><pre><a href="http://localhost:8000/account/secrets/create">http://localhost:8000/account/secrets/create</a></pre><pre>Secret: _</pre><p>Navigate to the given link and create a new secret. Use the name of your choice.</p><p>You should get a secret. Copy it and paste it to the command-line and press Enter.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_I9EYOHLmoQO5omdPfEBkQ.png" /></figure><p>After entering the secret, you should get an output showing the progress of downloading the messages.</p><pre>Output directory doesn&#39;t exist. Creating... done.<br>pl                  Downloading... done.<br>en                  Downloading... done.<br>Generating l10n.dart file... done <br>Generating messages dart files... done</pre><p>You also have a new file in your project directory: .secret.arbify. It’s been added to your .gitignore too.</p><p>You can find a newly generated lib/l10n/l10n.dart file. We’ll use it now.</p><p>In your MaterialApp, add supportedLocales and delegates as follows:</p><pre>    return MaterialApp(<br>      title: &#39;Flutter Demo&#39;,<br>      supportedLocales: S.delegate.supportedLocales,<br>      localizationsDelegates: [<br>        S.delegate,<br>      ],<br>      // (...)</pre><p>And we’re done! All we have to do is use our brand new messages generated straight from Arbify!</p><pre>// Change AppBar title to app_name message:</pre><pre>title: Text(S.of(context).app_name),<br></pre><pre>// Change Scaffold &gt; Center body to button_tapped_message:</pre><pre>Text(S.of(context).button_tapped_message(_counter))</pre><p>And voilà!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tSOofitiNDlcltoJMe75fA.png" /></figure><p>Here are both pubspec.yaml and lib/main.dart files:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/5057021b43ec0e3e8f3399d307d8cf9b/href">https://medium.com/media/5057021b43ec0e3e8f3399d307d8cf9b/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9fae8af273ce" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[From Solving a Problem in Google Play to Publishing with Flutter]]></title>
            <link>https://medium.com/hackernoon/from-solving-a-problem-to-google-play-publishing-with-flutter-e0b4716c2394?source=rss-80a3a2600502------2</link>
            <guid isPermaLink="false">https://medium.com/p/e0b4716c2394</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[problem-solving]]></category>
            <category><![CDATA[android]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[flutter]]></category>
            <dc:creator><![CDATA[Albert Wolszon]]></dc:creator>
            <pubDate>Wed, 02 Jan 2019 11:36:00 GMT</pubDate>
            <atom:updated>2019-01-02T17:21:20.762Z</atom:updated>
            <content:encoded><![CDATA[<h3>From solving a problem to publishing on Google Play with Flutter</h3><p>After the moment I got interested in Flutter I was looking for ideas for a simple app that solves a problem.</p><blockquote>This post is a retrospection, two weeks after writing first lines of code.</blockquote><h3>Problem</h3><p>Firstly, we need a problem to solve.</p><p>I was on shopping with my mom in a market. We were buying some stuff for the incoming Christmas. She had a list of products to buy on a piece of paper. Everything was okay with it, with one exception. After getting a few products in the basket, I realized that we are going from one end of the market to another several times already. I looked on this list and saw the problem.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*zcFzrIHkBUfIggLE" /><figcaption>Photo by <a href="https://unsplash.com/@joshrh19?utm_source=medium&amp;utm_medium=referral">Joshua Rawson-Harris</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>The list wasn’t nicely written and reading it required some effort. Therefore, it wasn’t possible to quickly take a look at all the items on the list and put them in the basket at the moment you saw them. You had to read the list every time after collecting each product because you didn’t automatically memorize other stuff from the list.</p><p>Also, you should always remember to bring this list with you. If you happened to forget about it, you had a problem. You either try to remind yourself what was in it or call someone at home to send it to you.</p><p>The last problem that I’ve observed is looking at what is already in the basket and what is not. I bet you don’t have a pen with you to check or cross out already collected items. Because of that, from time to time you look on your list and check what you already have and what is still needed. It distracts you from your shopping and wastes your time.</p><h3>Idea</h3><p>My idea for solving those problems was really simple. Simple ideas are the best.</p><blockquote>My mom needed a very clear and readable shopping list.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*3GFJvvYiZgcFqVtO" /><figcaption>Photo by <a href="https://unsplash.com/@daveballew?utm_source=medium&amp;utm_medium=referral">David Ballew</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>That’s it. The origin of the problem was the effort needed for reading the list and making sure to always bring it with you. If the list was easily readable, you would focus on collecting items from the list, not on the list itself.</p><p>Simple and intuitive controls would also help in making the distinction between items already in the basket and those that are still not collected.</p><p>All of it can be easily solved by using a mobile application addressing all the issues.</p><h3>Implementation</h3><p>I need to create an app. One, that will be extremely easy to use, intuitive, clear and NOT overwhelming at all.</p><p>When it comes to technology, the answer is simple. I chose Flutter. I needed simple functionality. Only one screen and two dialogs.</p><ul><li>Screen showing all your items.</li><li>Dialog letting you add a new item.</li><li>Dialog that confirms you want to delete an item.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6htzv7s1NXmM1iQqc5XrIw.png" /><figcaption>My development suite.</figcaption></figure><p>I implemented this stuff. The only one screen consisted of a ListView showing each item in a ListTile. Tapping it would make the leading icon transform from a dash to check and change the background of the tile to green. Tapping again reversed that. Trailing widget was a remove IconButton that deleted the item from the list, after confirming it in a dialog. Besides that, there was a FloatingActionButton responsible for showing an Add new item dialog.</p><p>In case of an empty list, an Undraw illustration was shown.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_MG3EhryFnReiKs0iKzkYg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GXWS5x4uEJ1dfhBPmgelQw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vxogC_fTWOKfmHkm3IZK8g.png" /></figure><p>Items were saved in a list in the app’s state. After every action, the list was saved to Shared Preferences as JSON and loaded at the app startup.</p><p>After that, I implemented localization, because I wanted the app to be in my mother language (Polish) and in English. This post helped me with it.</p><p><a href="https://proandroiddev.com/flutter-localization-step-by-step-30f95d06018d">Flutter — Localization: step by step</a></p><p>That was it in terms of the application itself. I created the launcher icon (orange text on white background) and wrote texts in Google Play Console. I published it to Alpha channel, sent to few friends and waited for their feedback. They didn’t encounter any problems and have liked its simplicity.</p><p>I published first production version. I asked my classmates to test this out and showed it to my mom. Both my classmates and my mom liked it. Well, she was amazed by it and <em>forced</em> her colleagues to download it too. 😁</p><p>I didn’t like the screenshots and launcher icon of the app at all. When I had some time I played a little bit with mockups, icons, and text in Adobe Xd and came up with some decent icon and new “screenshots”. I’ve combined two free for commercial use icons from Iconfinder and made the Google Play and launcher icon. “Screenshots” contain free to use Google Pixel 2 XL mockup I found online. I published version 1.0.1 with updated launcher icon.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SM8J-mK_WQf_-4PupXshcQ.png" /><figcaption>Adobe Xd showing all my graphics for Google Play.</figcaption></figure><p>After a few days, I thought of new features that I could add. The app must be as simple as it was, but there were some minor problems with it. My mom explained to me that once she had some items checked as complete and she tapped <em>delete all</em> thinking, that it will delete only checked items, but she lost her whole list.</p><p>I changed the effect of the <em>delete all</em> button to <em>delete completed</em> because I thought that it’s more intuitive behavior. I added an <em>Undo</em> feature too. After you delete an item (or all completed items), a snackbar pops up for few seconds telling you about that and showing an <em>Undo</em> button.</p><p>Under the hood, I reimplemented how the products were stored in the memory. I refactored using states to using ScopedModel. After that, I published version 1.1.0 that is currently the most up to date version of the application.</p><p>You can download the app and check it out yourself!</p><p><a href="https://play.google.com/store/apps/details?id=me.wolszon.fastshopping">Fast shopping - Apps on Google Play</a></p><p>Download stats aren’t so bad after few days. I’m still looking for ways to promote my app to a broader audience.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*13Xytc5ufNwq1itTqKqSnQ.png" /></figure><p>You can also find the source code on GitHub, stars are welcome. 😏</p><p><a href="https://github.com/Albert221/FastShopping">Albert221/FastShopping</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e0b4716c2394" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hackernoon/from-solving-a-problem-to-google-play-publishing-with-flutter-e0b4716c2394">From Solving a Problem in Google Play to Publishing with Flutter</a> was originally published in <a href="https://medium.com/hackernoon">HackerNoon.com</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Road of the Hack Heroes 2018]]></title>
            <link>https://medium.com/@Albert221/road-of-the-hack-heroes-2018-841a18724996?source=rss-80a3a2600502------2</link>
            <guid isPermaLink="false">https://medium.com/p/841a18724996</guid>
            <category><![CDATA[android]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[application]]></category>
            <dc:creator><![CDATA[Albert Wolszon]]></dc:creator>
            <pubDate>Fri, 16 Nov 2018 13:18:50 GMT</pubDate>
            <atom:updated>2018-12-01T17:48:16.640Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*v_D0gxkWmWLs51saKhxoLw.png" /></figure><blockquote>Hack Heroes is a polish online hackathon for high school students.</blockquote><h3>Idea</h3><p>First step for any project is an idea. Especially, a good one.</p><p>At first, I didn’t plan on taking part in this year’s edition of this hackathon, but after my friend asked me about whether I’m participating, I visited its website and saw the subject of current edition.</p><blockquote>The subject was the public data.</blockquote><p>I visited dane.gov.pl which is our polish government website for public data, clicked on random category and my first glance focused my eyes on one dataset and it gave me an idea almost immidiately.</p><p>I came up with the idea for an app that tracks your <em>life with medicines</em>. That is, you can add those by scanning their EAN barcodes, read some basic stuff about them, set notification reminders when you should take them and make a medicine-taking journal where you’ll have the history of when you took the drug, when you skipped it and what were the side effects (if you had any). That can be pretty helpful for your ordinary doctor appointents, because you have all your experience with the given medicine in your pocket and you can give many details to your doc.</p><h3>Planning</h3><p>Okay, I had an idea, what’s next? Planning.</p><p>I know from my experience, that doing stuff when you have somehow accurate and detailed plan can help you really strongly when developing an app or whatever else. If you have one, let’s say you are struggling with some code problems at the moment, you won’t lose track of your milestones, which usualy are only in your head, because you wrote them and you can even find some holes in them and fix them or find a completely new, better solution.</p><p>So, I quickly got my pencil, markers and a notebook and began drawing.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sVhYLjBu172zyUa-hHRVOA.jpeg" /><figcaption>Sketch and plan of the app I’m going to develop</figcaption></figure><h3>Technology</h3><p>Cool, I have a plan. What should I write this in?</p><p>It obviously will be a mobile app, so I have two choices: Kotlin or Flutter. I had some experience writing Android app in Kotlin, but Flutter was something new. It’s polishing existing experience vs learning something completely new. I asked a friend for a quick advice and decided to take on Flutter.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*7bj3yLl03AJTwoT_.jpg" /><figcaption>Hello Flutter</figcaption></figure><p>I will save the data using Firebase, because it is convenient for fast development and hey, it’s a hackathon project.</p><p>I will also use Golang for the server of the medications data. It will fetch this public dataset daily, parse and expose a convenient API for me to use.</p><h3>Devlog</h3><p>So, firstly I downloaded Flutter and Dart plugins for Android Studio, some basic stuff. I completed the getting started project on flutter.io with the codelabs extra, also, it was a reasonable start.</p><p>I started to create the first screen, the one with medicines list and the <em>add</em> FAB. Then, I was trying to add some domain code for the medicine entity, but ended up in a little mess with the code and its structure. So I started once again, from scratch. This time I came with — I think — something more reasonable. I’ve tried to implement Redux for managing state, but I failed, I didn’t think it is a good solution for me in that project.</p><p>For now, I’ve postponed the state aspect and focused on creating the layout of first two screens (with the medicine details).</p><h4>Medicinal products registry API</h4><p>That is the name of the service I have created. <a href="https://github.com/Albert221/medicinal-products-registry-api">It’s on GitHub, by the way.</a> It’s a simple webserver which exposes the registry from the heading through a very convenient GraphQL API to the world, so it is easy to obtain only that information, that anyone would need.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/885/1*JGtvQJ988N05609gOUxteg.png" /></figure><p>I set up the Google Cloud Build service for the repository (for the first time) and deployed it on my VPS which I’m using for fun stuff using the Portainer.</p><p><a href="https://medium.com/google-cloud/google-container-registry-and-portainer-57198bdae070">This post</a> (its second half) was helpful when I was adding the GCR.io registry to the Portainer.</p><p>Everything is live now (well, at least at the time of writing this post) at <a href="https://publicdata.rocks">https://publicdata.rocks</a>!</p><p>Next step was to add a working barcode scanner which would pop up after clicking the floating action button on the first screen. I’ve made a small research and found the ML Kit from Flutter and what is good about it is the fact, that Barcode scanning works On-Device, no API request are made, only one, to download the machine learning model for it.</p><p>Here, I found a small downside of Flutter. Its packages can be really simple, too much simple. That was the case with the <em>camera</em> package. I can only take photos to file and record videos with it. I can’t get the camera stream or something like that. I can create a Dart plugin for it, of course, which would communicate with Kotlin/Objective-C code under the hood, but that would require much more work (and time), and I’m not an iOS developer, so it wouldn’t work on iPhones.</p><p>I resolved the issue by taking a photo to a file in temporary directory and sending it to the Barcode scanner library.</p><p>After few days of designing, I’ve completed almost every screen that will be shown to the user in Adobe Xd. I’m pretty happy with the result.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5_vJDPSFVUEkD9MqRhQWyA.png" /></figure><p>I’ve also moved redesign to the code for almost everything and now I’m fighting with the best way to handle state changes across the whole app.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/801/1*dNh1-nv0cRw1uCDCOc15lQ.png" /><figcaption>My current roadmap for the app</figcaption></figure><p>For three straight days I was struggling with coming up with a decent architecture for the whole app. I started with ordinary States from Flutter core, then tried something with ScopedModels, but it all had some drawbacks that kept me from those solutions in a long distance. Lastly, I implemented Redux with built_value and I stayed with it. I see some refactors I would have to do if this app would be something after the hackathon, but for now it’s good enough. Two main screens with the majority of dialogs is implemented. But time is running out. I have six days to finish key features of the app and do some additional stuff like landing page for the application itself.</p><p>I’ve also came up with another opportunity for this app to be helpful. People can add info about side effects when they add doses to the medicine in the app. That data can be shared with third parties to help them prevent those effects. But that would require creating additional dashboard on the Web for those third parties, I definitely don’t have time for that, but I’ll include some note about this when handing the project.</p><p><strong>Quick retrospection. </strong>I didn’t have time for maintaining this post to be up to date, now, I’m after the announcement of results.</p><p>My app is available on Google Play, although it doesn’t have all the key features and some fields of the app struggle a little bit, but it’s somewhat usable.</p><p><a href="https://play.google.com/store/apps/details?id=me.wolszon.lekbierz">LekBierz - Apps on Google Play</a></p><p>On the 5th December I’m going to Warsaw for the award-giving and some training at Facebook’s place.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fdocs.google.com%2Fpresentation%2Fembed%3Fid%3D1WrdSKOSDD2o0oZRRS_iGCECVQ9gz3ND94UaFjIxrkl4%26size%3Dl&amp;url=https%3A%2F%2Fdocs.google.com%2Fpresentation%2Fd%2F1WrdSKOSDD2o0oZRRS_iGCECVQ9gz3ND94UaFjIxrkl4%2Fedit%3Fusp%3Dsharing&amp;image=https%3A%2F%2Flh3.googleusercontent.com%2FhpEykLcePBB_-B96cvHffr7OMs_drCHSAyBQd80DX3lYcglwRdSDAMxSN6C0PtwkF8juMg%3Dw1200-h630-p&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=google" width="700" height="559" frameborder="0" scrolling="no"><a href="https://medium.com/media/ff7e8f8dfd8d5d48a3236c732717e22c/href">https://medium.com/media/ff7e8f8dfd8d5d48a3236c732717e22c/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=841a18724996" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[San Francisco Trip]]></title>
            <link>https://medium.com/@Albert221/san-francisco-trip-6366366d7da5?source=rss-80a3a2600502------2</link>
            <guid isPermaLink="false">https://medium.com/p/6366366d7da5</guid>
            <category><![CDATA[google-code-in]]></category>
            <category><![CDATA[san-francisco]]></category>
            <category><![CDATA[google]]></category>
            <category><![CDATA[travel]]></category>
            <dc:creator><![CDATA[Albert Wolszon]]></dc:creator>
            <pubDate>Sun, 10 Jun 2018 11:11:49 GMT</pubDate>
            <atom:updated>2018-06-18T21:17:01.697Z</atom:updated>
            <cc:license>https://creativecommons.org/licenses/by-sa/4.0/</cc:license>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MD3db58GShxfIVqeDNrKQQ.png" /><figcaption>Beautiful Golden Gate</figcaption></figure><h4>I’m currently writing this being at 10.000m of altitude with the speed of 1.000km/h flying from SFO to AMS way back home.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*hpbqq1cYArnbV2KJ" /><figcaption>San Francisco as seen from the plane</figcaption></figure><p>As you may know from my previous blog posts, I won a Google Code-in 2017. The Grand Prize was a trip to San Francisco, to Google headquarters and some fun activities. Here I want to sum up all of my experiences from this trip so far.</p><p><a href="https://medium.com/@Albert221/the-end-of-gci2017-or-maybe-not-d82758d359b1">The end of GCI2017 (or maybe not?)</a></p><p>Just for the record, I have extended my staying here to one day before and two days after the GCI events were happening.</p><h3>Beginning</h3><p>Okay, so my journey began in GDN airport, at Gdańsk. I met with my friend (being the winner too), Grzegorz Stark there. We have boarded our plane before the 6.00AM. Flight didn’t take long, it was only two hours. After arriving at Amsterdam-Schiphol we’ve just moved to our terminal and waited some time. And there it was, my longest flight in my life (it was my 6th flight though).</p><h4>Transatlantic flight experience</h4><p>When we (me &amp; my dad) sat in our seats, we immediately came to conclusion that the Embraer seats were much more comfortable. Everyone has received KLM’s blanket and pillow as well as ear headphones (which looked like some cheap chineese stuff, which they most likely were) so that we could hear movies or music if we wanted to. Because as you may or may not know, the Boeing 747–400s have screens in front of each seat to watch some stuff or track the plane.</p><p>But after some disappointment by the comfort, I can say now one thing.</p><blockquote>No one ever has taken such a great care of me in gastronomic means as did the crew on the plane.</blockquote><p>They even had whiskey, wine or beer speaking of drinks if you’d want one.</p><p>The whole flight from Amsterdam to San Francisco took about 11 hours.</p><h3>Airport</h3><p>Once we were at SFO, after we got off the plane we headed to the border security control, police officer asked us what is the reason we are in the United States, where we will be staying and how much money we had.</p><p>After that, we got our luggage and drove to the Hyatt Regency San Francisco by a taxicab van.</p><h3>Hotel</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*l7WX1gYjhrgu6Hcw" /><figcaption>Hyatt Regency San Francisco, view from the Embarcadero</figcaption></figure><p>Okay, I must tell you that the interior of the lobby has impressed me. I talked to some guy at the reception and received our hotel cards after giving them my Payoneer card for a moment (they put $480 on hold for this stay, you should know that if you’re going there too). Our room was quite nice. It was cozy, beds were big, our view maybe wasn’t the best, but I like city landscapes and my view conformed that.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*PpRjeEpy0sc8FxEH" /><figcaption>View from my hotel window in the evening</figcaption></figure><p>After some quick rest we went outside and tried to look around the Embarcadero and went up the Market Street, we ended up in Chinatown eating some vietnamese food (I didn’t really like the vietnamese chicken soup, sadly).</p><p>In the evening we went to Marketbar for something to drink. The waiter was really funny, he asked me whether we’re on vacations and I’ve explained to him that I won the contest and that’s my trip and he was like ‘Ohh, you’re the programming king!’ and then disappeared for a moment. When he was back, he put his handmade crown made of two paper menus on my head and then started singing how I’m good at programming. It was really unique!</p><p>We ate our dinner in Subway in the same building as the hotel was. It was really bad, I mean, food was as always in Subway, but there were some addicts sitting in there as well as some homeless woman who wanted cash from us to buy her a sandwich. I think she missed the fact that she was holding a credit card in her hand.</p><h3>Coit Tower &amp; Alcatraz</h3><p>In the second day, the day the GCI events had started we have climbed all the way up (by stairs of course) to Coit Tower. My dad has counted 398 stairs! Views from the top of this hill were really nice, we could see the famous Lombard Street, Golden Gate and Alcatraz Island as well as the panorama of the whole northern San Francisco.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EMjGwJmX94xwOcPJclMbMw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*b-xNAE8AvK1UAhiwSuuwUQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Y8T0q9uxBSNKTUGfar-z0Q.png" /><figcaption>Some views from the Coit Tower hill; left to right: Lombard St, Alcatraz Island, Coit Tower itself</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*5In5O8NdHiWydaRl" /><figcaption>The dock on Alcatraz Island</figcaption></figure><p>After that, we headed to Pier 39 which was the place of all Alcatraz trips to begin. There was a souvenir shop and a burger bar next to it. We bought some souvenirs for us and relatives and stood in the line to our ferry. The cruise was quick. I’ve spoken to the barman who happened to be a Norwegian.</p><p>When we exited the ferry, there was a woman telling some quick facts about The Rock (that’s how they call the Alcatraz Island) and told us some interesting places to visit there.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-BHAJsvuJaMxxcjHMMszFA.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*biHfNKBIk_u_ctqxwxRXfA.jpeg" /><figcaption>From left to right: guard tower and the cellhouse</figcaption></figure><p>We went to the first building and watched Discovery Channel’s short documentary about San Francisco and Alcatraz Island, it was like 15 minutes long and it was really educational, I learned a lot from there about the island and the San Francisco itself.</p><p>Next, in our way to the cellhouse we met some Poles! Milena and Konrad from New York, if you’re reading this — hello! Cellhouse was just a cellhouse.</p><p>Very surprising is the fact, that there are gardens on Alcatraz Island! There was some really beautiful nature, some plants, flowers. Also, the view on San Francisco from there was simply great! We could see the whole San Francisco skyline, it was really beautiful. But kinda hard to take a picture because of the huge wind.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*zc3uBAWS_i-SHcMz" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*A0A-d2xwmfzWKE3uG16-yw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aT3ZCl4mToFHnKhsQ7ZotQ.png" /><figcaption>Left to right: gardens with Golden Gate in the background, San Francisco, some birds chillin’ around</figcaption></figure><p>And BTW, speaking of San Francisco’s city centre — there is a real amount of homeless. They are everywhere in Embarcadero. You could also smell on the streets Californian law allowing people to carry 8g of marijuana for their personal use.</p><h3>Hey, Google!</h3><p>At 5.00PM we all met at the Hyatt’s lobby. A couple of minutes before I’ve already started getting to know all other winners. We met Stephanie, Mary and Josh (and maybe Cat too but I’m not sure) and headed to San Francisco’s Google office by foot.</p><p>We had some great fun in the elevators because someone wrongly heard Stephanie about which floor to choose and we all met at the 4th floor not knowing what to do, 7th was the correct one, we continued by stairs.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*PWEkyrVkuhcCQV6N" /><figcaption>Stephanie transfering her enthusiasm onto us</figcaption></figure><p>We all were leaded to conference room where the GCI team gave us some quick talks about the contest statistics and how the next days will look. After that we have received our goodies that we were waiting for the whole time we saw them. That’s it, sweet Google Pixel 2XLs, Google Home Minis, pens, tshirts, blankets, jackets and so on…</p><p>We were also told about the game told Scavenger’s Hunt. That’s a game where you have a sheet of paper with some weird questions, like “who has a pet with a human name” and we needed to fill as much rows with the names of people as we could and people with the most names would win some extra stuff.</p><p>After that, we went to the canteen to eat. Just know, that Google won’t let you leave hungry. There was so much to eat.</p><p>We left to the hotel with our very-own Google badges which permitted us to be in Google’s buildings.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*_2icbdOpXmdavoUe" /><figcaption>More or less all the swag we have received at our first day</figcaption></figure><h3>Googleplex, Mountain View</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*QoaSTR-gDln_k4TS" /><figcaption>Hey Arav!</figcaption></figure><p>On the second day (second with GCI events) we jumped into the coaches and drove to Mountain View, the city that consists of almost only Google buildings. Our day began with — of course — a breakfast, we could choose whatever we want and how much we want. Croissants were very tasty!</p><p>Next, we had some talk from Chris DiBona, the director of open source at Google, he procceeded to giving us the awards, that is the cogs statuetes for being the winner of Google Code-in. We’ve been taking the pictures with him as well as the other winner and mentor from your organization or with Stephanie &amp; Mary if you were ‘alone’.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*pebPX4fjFWVrXxRo" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*EGgbNQCcZPefVMmr" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*xSTjXL5HxeUVacqU" /><figcaption>From left to right: ‘<em>famous’ bridge over the stream, our Googleplex building, (part of) my breakfast</em></figcaption></figure><p>Later on, we had some Googlers giving us talks. There were some HR ladies which told us some golden rules for creating and maintaining our resumes, then there was another Googler telling us about one of his funny project which was about breaking some cipher. We had a fellow GCI winner from 2010 AFAIR telling us what did she do after the contest and how it impacted her life. There was also another Googler telling a story of how she was maintaining her 20% project (at Google, you can work 20% of the time on your personal project) and how did she turned this to a full time job at Google and got an investment of $300.000 for it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/625/0*SYmBEyQRUZtgGL0H" /><figcaption>Chris DiBona handing me the GCI award; CC-BY-SA by Stephanie Taylor</figcaption></figure><p>In the break between those talks we had a lunch and everyone was meeting with a Google of their domestic language. Me and Grzegorz met with Miro Majorek, who works at YouTube and is responsible for the 2nd most popular search engine in the Internet (the YouTube one).</p><p>Then we had an hour to visit the Google Store and Google Visitors Center. I’ve done some shopping spending $100 on Chromecast, some tees and a winter hat.</p><p>At the end of the day we had some talks from a chaperone of one of winners who happened to be GCI2016 winner and he told us his story and that he’s just graduated and is going to Harvard! Congrats!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*sWQoLGoXZjTXC37w" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*0hlDDeBj-UZPUmN5" /><figcaption>Left: small shopping at Google Store. Right: we weren’t allowed to ride those bikes. Whoops</figcaption></figure><h3>…fun, fun, fun, fun, fun, fun, fun, fun, fun, fun!</h3><p><em>yeah, it’s a reference to </em><a href="https://www.youtube.com/watch?v=g-sgw9bPV4A"><em>Kazoo Kid trap remix</em></a></p><p>In the third day we were split to two groups: one who had choosen the Segway ride (mine) and one who had choosen the Cable car ride (Grzegorz’s).</p><p>We were in the lobby at 7.45AM from where we moved to Fisherman’s Wharf by a coach. We were at the segway tour place. We had some quick introduction to how segways work and how to behave on them and then we had a really quick training. It took us half an hour for everyone to get comfortable on this funny vehicle.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fstreamable.com%2Fo%2Fgqtrb&amp;url=https%3A%2F%2Fstreamable.com%2Fgqtrb&amp;image=https%3A%2F%2Fcdn-b-east.streamable.com%2Fimage%2Fgqtrb.jpg%3Ftoken%3DR13NKzRaZixpoe73LkHGZg%26expires%3D1528632088&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=streamable" width="1280" height="720" frameborder="0" scrolling="no"><a href="https://medium.com/media/f35a9fd65f9bdc5c87908c932f3f4bc0/href">https://medium.com/media/f35a9fd65f9bdc5c87908c932f3f4bc0/href</a></iframe><p>So we headed on the streets!</p><p>I must say that riding a segway is a really nice and fun experience and because of that I’m going to repeat that in my home country too! It’s just giving so much joy that you’d want to do this again!</p><p>We had a little break somewhere in the North Beach in the park, on the Coit Tower (again) and on the end of the breakwater with a beautiful view of the San Francisco’s skyline.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*-HSo0lKqY_dY4GhZ" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*JrAmbMLZGjPztfpN" /><figcaption>From left to right: me with Carol on North Beach, view from the breakwater</figcaption></figure><p>Once we reached Fisherman’s Wharf and gave our segways back, we went to The BBQ Pub for a lunch. We waited for the final meal really long, but it was worth it.</p><p>Then, we drove to the Golden Gate Visitors Center by a coach. Oh men, walking on the Golden Gate is such an experience. Really, I’ve never felt like that in my life. It’s not only the bridge, but when you feel very strong wind, this sound and vibrations of cars bypassing you with a big speed, people yelling to each other because otherwise you wouldn’t hear others. I will never forget this. <strong>I can say that this was the best thing that happened to me on that trip.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OzHd6yybQYuHzt6S9idBpw.png" /><figcaption>Oh sweet Golden Gate… 10 points for spotting Grzegorz</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KmyLXECeOLMNh5DZLc42hA.png" /><figcaption>Our yacht, it looked really nice</figcaption></figure><p>Our last thing in the schedule was a yacht cruise. The yacht wasn’t small, it was even a little bit luxurious. We went to the place where San Francisco Bay’s and Pacific Ocean’s waters meet starting from Pier 40 (it’s not next to Pier 39, it’s on the opposite side). We had a great time talking with other Poles (me, Grzegorz, Konrad and Marcin were the only Poles, excluding our parents of course) and to some newly made friends. It was very nice to talk about Machine learning, Essential Phone and other stuff.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HdGnv-v7dvrz9oa9lRqRKA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MV3zRAh6eIP6eCJsdo-2-A.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*e2yIKGYwYPZNd6yK" /><figcaption>From left to right: San Francisco skyline as seen from the yacht, Golden Gate, San Francisco skyline after leaving the yacht</figcaption></figure><p>After we’ve been back to the hotel, we hung out in a much smaller group alone at San Francisco and we took some group photos with a Google and Mozilla signs.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*WuNDkBcQUyTFwz77" /><figcaption>It was a good time hanging out with those people</figcaption></figure><h3>Goodbyes 😢</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*qXKLn5tL_Zp9unlQ" /><figcaption>Me with Konrad (left) and Grzegorz (right)</figcaption></figure><p>On the Thursday, we had our last portion of GCI events. We had really, <em>really</em> interesting talks by Googlers, one saying what is Kubernetes and how to use it in a nutshell, second one was about open source licenses from the lawyer point of view and the last one was about Project Fi.</p><p>We also had a chance to grab even more hoodies, tshirts, pens and stickers for us or for others, we had a raffle too! The biggest prize was a Google Home (the big one), I choose the 10Ah powerbank with Google Open Source branding.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*pdKOY6OdSJkcxnyj" /><figcaption>Mary putting raffle goodies on the table</figcaption></figure><p>Some of us, the winners also gave a talk about their experience during GCI. Shoutout to Liquid Galaxy guys, it was really funny!</p><p>It was our last lunch together, sadly. We were taking selfies with everyone and goodbye-ing. It was really hard, because you somehow make a connection with all those great people, that were the part of one of the greatest (or even the greatest, like it was in my case) thing that happened to your life.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*upyNk4LvKghW5GOr" /><figcaption>Our group shot at Googleplex; CC-BY-SA by Stephanie Taylor</figcaption></figure><p>I will miss you guys, but I hope we’ll all meet in the future!</p><h3>Wikimedia office</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*axEM4WdfCLgXed48" /><figcaption>Selfie with Wikipedia logo at WMF office</figcaption></figure><p>At the same day I was invited by Andre Klapper who used to be my mentor during GCI contest to the Wikimedia Foundation headquarters. Srishti has greeted me at their reception and shown me their whole office. It’s almost a one big open space with some closed offices and conference rooms. This place wasn’t big, but I can assure you that it is one of the most cozy offices I have seen.</p><p>After that we have visited the Target to do some grocery shopping and drove to Merced Heights, to our Airbnb house by MUNI Metro (M line) which turned out to be a really convenient mean of transport.</p><p>But Merced Heights… <em>Heights</em> are there on a really big purpose…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Lipk2OBLsW2160J_kko3Vw.jpeg" /><figcaption>Arch St, one of the steep roads</figcaption></figure><h3>Some hiking and resting with the nature</h3><p>On our last day in which we could do anything, me and my dad wanted to go to some places:</p><ul><li>Twin Peaks</li><li>Haight-Ashbury</li><li>Golden Gate Park</li><li>Pacific Ocean beach</li></ul><h4>Twin Peaks</h4><p>We got to Portola Dr &amp; Twin Peaks Blvd by Uber and we started walking upwards the Twin Peaks. The path was okay, there was some climbing on the stairs. Firstly, we reached the south peak, took some photos and then the north one. View from there reaches really far. They were astonishing.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CprDG0pL5PUy7Kr3mmF2MQ.png" /><figcaption>Panorama taken on Twin Peaks</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VxyBC0CN10ITOZf2urfYzg.png" /><figcaption>San Francisco’s skyscrappers as seen from the north peak of Twin Peaks</figcaption></figure><p>We went down to Christmas Tree Point, which had a nice views too, there were some telescopes to look at Golden Gate or the skyscappers from very far.</p><p>We headed down to Haight-Ashubry through Ashbury Heights, which looked like a place of rich people.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Tn0x1sKU3W__KnUM7qBb9Q.png" /><figcaption>A wild Dodge Challenger spotted</figcaption></figure><p>I forgot to mention, that in San Francisco and the Silicon Valley there is so much great cars. I’ve seen here so much Teslas, Mustangs and Hellcats that I will not see in Poland for the next 10 years.</p><p>There was even a Corvette or an Aston Martin driving somewhere.</p><p>But Camaros were quite rare. I saw <em>only</em> five of them.</p><h4>Haight-Ashbury</h4><p>This district was filled with tourists. There were many thrifth shops, mexican bars, smoking shops and souvenir shops. But there was a really big downside of being here. No bar had a free WiFi! Because we didn’t buy the US SIM card (prices were ridicolous) and almost everywhere was a free, public WiFi (well, at least in Embarcadero and Financial District).</p><p>But we’ve been to some shops with clothing and the range of products was really big and with very affordable prices.</p><p>Funny thing that when some woman asked me where I’m from she thought that there is a dictatorship in Poland.</p><h4>Golden Gate Park</h4><p>This place turned out to be slightly different than I imagined it to be, but no worries. The eastern part of the park was filled with people and children playing or laying on the grass. We joined them for an hour too. Laying here, in those 23 degrees with UV index of 12 was really nice. I could lay there all the day. But we had plans to fill! The western 2/3 of the park wasn’t so popular, there was less people and the park looked a little bit less nice. There were some turtles in the pond, seagulls, pigeons and some black birds that I don’t know what they were.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fstreamable.com%2Fo%2F5q4h9&amp;url=https%3A%2F%2Fstreamable.com%2F5q4h9&amp;image=https%3A%2F%2Fcdn-b-east.streamable.com%2Fimage%2F5q4h9.jpg%3Ftoken%3Dt5VQT33t8MnwP2Ett65LJg%26expires%3D1528635696&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=streamable" width="1280" height="720" frameborder="0" scrolling="no"><a href="https://medium.com/media/5b1d97e7a0d205c6ac4cb691d60829be/href">https://medium.com/media/5b1d97e7a0d205c6ac4cb691d60829be/href</a></iframe><p>Walking from the eastern side to the western side took us like 2,5 hours including resting on the grass and benches. At the end of it we went to gas station to buy some water and White Label Mtn Dew which was so tasty. I’m really sad Poland doesn’t have all of the flavors available in the US.</p><h4>Pacific Ocean</h4><p>The Great Highway which was between Pacific beach and GG Park was partly covered with sand. We took our shoes off and walked in the direction of water. Its temperature wsa quite similar to Baltic Sea’s. There were some people trying to surf on the one side and others kite-surfing. Fog was slowly covering whole San Francisco at that time too.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*PkOMAfh9oKVif6Au" /><figcaption>Drinking Mtn Dew White Label on the Pacific Ocean beach</figcaption></figure><h4>Way back home</h4><p>We wanted to get to our place at Merced Heights with Uber, but there was no WiFi everywhere! We went to Judah Street to do some shopping for evening and morning at 7-Eleven and then packed to a MUNI Metro N line which got us to Van Ness, from where we could get an M line Metro to our place. Big thanks to very kind man who payed for our tickets when we realized we have no cash left and we couldn’t pay with a card!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*l811ECIrHpTXUdSH" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*zpm-EgOq0rkijZBg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*RESFJzfRWIOSeiF3" /><figcaption>From left to right: Van Ness MUNI station, milk (Sargent St), more milk (view from our Airbnb place)</figcaption></figure><p>In the evening, whole San Francisco was covered with white, dense milk. We began to pack for tomorrow departure and went to sleep.</p><h3>Now</h3><p>Now? Now I’m flying at 10 kilometers over Hudson Bay knowing that I will spend next 11 hours at the Schiphol airport.</p><p>P.S. And adding all the photos at Schiphol airport.</p><h3>Summary</h3><p>This was my first time when I’ve been to USA. I liked it. I really liked it and I’d want to explore other big cities of this country if I will have a chance. I’m really glad that I had a chance to meet all those fantastic people, being them the GOSP team, GCI team, mentors and most importantly, other winners! Thank you guys (and Carol, Cynthia, Erika and Omshi!) for this beautiful experience. I will remember this till the end of my life, and you had played the major role in it.</p><p>Thank you!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*UHMXjRDiGzmhEnPj" /><figcaption>Me 😀</figcaption></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6366366d7da5" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How I got started with programming?]]></title>
            <link>https://medium.com/@Albert221/how-i-got-started-with-programming-238caf186378?source=rss-80a3a2600502------2</link>
            <guid isPermaLink="false">https://medium.com/p/238caf186378</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[getting-started]]></category>
            <dc:creator><![CDATA[Albert Wolszon]]></dc:creator>
            <pubDate>Fri, 09 Mar 2018 15:46:00 GMT</pubDate>
            <atom:updated>2018-03-09T16:03:14.882Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PnUSPHwLpc1NUtssykmj8g.jpeg" /></figure><p>This is my copy-paste from our Telegram group for GCI2017 winners:</p><blockquote>once I was at my aunt’s place, my cousin (he was in medical university then) showed me his website, which was very basic stuff, simple navigation and content and animated GIF of human brain, but I was amazed by the fact that he’ s got his own website! it was like I thought that having a website is something not for every one, it’s not available for “normal” people etc. I asked him how did he manage to make it and he told me — HTML. I was 8 at the time but my dad was near and he wrote that four letters and when we were home I asked my dad if he maybe remember what my cousin said and he gave me this phrase which I’ve googled that time. little bit later I’ve found some kind of tutorial, you know, copy-pasting stuff etc. but I had my first, very very very basic website, of course accessible through file:// protocol. some time later I wanted to make thinks a little more dynamic, here comes *PHP*. But my website didn’t work, PHP code was printed in the browser :( from that point I don’t exactly remember how things went, but I had my time doing something in C# from videotutorials, if I recall correctly it was an email client, subject, from, to and content fields and send button. unfortunately it wasn’t working for me. I also tried to learn C++ but I was too young for that (~10yo iirc), I had a chapter with XNA in C# which was pretty nice, I learnt basics of gamedev and gamedev-oriented math. And with time I sticked to webdevelopment with PHP, but I’m very open for other technologies now and I’m a fan of Android development with Kotlin and Golang!</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=238caf186378" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The end of GCI2017 (or maybe not?)]]></title>
            <link>https://medium.com/@Albert221/the-end-of-gci2017-or-maybe-not-d82758d359b1?source=rss-80a3a2600502------2</link>
            <guid isPermaLink="false">https://medium.com/p/d82758d359b1</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[google-code-in]]></category>
            <category><![CDATA[open-source]]></category>
            <dc:creator><![CDATA[Albert Wolszon]]></dc:creator>
            <pubDate>Tue, 16 Jan 2018 16:56:36 GMT</pubDate>
            <atom:updated>2018-06-10T13:49:55.238Z</atom:updated>
            <cc:license>https://creativecommons.org/licenses/by-sa/4.0/</cc:license>
            <content:encoded><![CDATA[<p><em>If you don’t know what is Google Code-in, you probably want to read my first post about it.</em></p><p><a href="https://medium.com/@Albert221/google-code-in-diary-1-42c05078b225">The beginning of Google Code-In 2017</a></p><p>Today is 16th of January, 2018. On my Code-in dashboard there is a line saying that there’ s one day left from the competition’s end. Tomorrow is a deadline for submitting students’ work. The day after tomorrow is a deadline for mentors to review it. On the 24th organizations must have had chosen finalists and Grand Prize Winners of Google Code-in 2017. And finally, on 31st of January, winners will be announced officialy.</p><p>You’d think that this is the end, don’t you?</p><p>My answer is no. Actually, I was really hard working for the last fifty days. It was a headache for my school marks, for my biological clock, sometimes for me itself. Going to sleep at 4AM and waking up at 6.40AM to school so that after school I can sleep again for 2 to 5 hours was on my daily basis. Yes, I didn’t have to sweat myself so much in that time. But I wanted to. Worth noting is the fact that this was my third Code-in edition I took part of. Previous ones were on 2014 and 2015. I wanted to give my maximum on that contest.</p><p>Okay, but that was about the contest itself. I want to say more. Wikimedia. What is Wikimedia? I’d say it’s a very, very friendly organization with people doing things with love. I met many volunteers on its IRC channels who were putting their free time in development and CRs for Wikimedia completely for free. I somehow know how do they feel with that and why they do that. Wikimedia’s “products”, that is MediaWiki and Wikipedia app for example are something that hardly noone wouldn’t recognize (at least in my environment). Imagine how much people use those services daily, maybe event hourly! Millions of users? I’d guess something like that. And now imagine that your work, something that you would usually be doing anyway is dedicated for that software, for that services. That your work served for those people. Those hundreds of thousands people. And it served them well. It helped them resolve a problem. It helped them get to knowledge they needed. You imagine that feeling? Because I know and feel that. In 2013 I did 4 tasks. If I recall correctly, only one had any influence that could be anyhow spotted. That task was about changing one cog icon in some tooltip to similar, SVG one. You wouldn’t imagine how proud I was of that one, little change. I was like</p><blockquote>Look! Do you see that cog?! I made it!</blockquote><p>back then. And now, with that many fixed issues, that many new features, that many improvements I brought to this organization… write ending of that sentence yourself.</p><p>I’d really like, I really hope and I’ll try, to take an active part of contributing to this awesome organization. I’ll be honest, I won’t have that much time. For that fifty days I was putting almost 100% of me into work on it. But I’ll try to fix some issue, give some feedback or be a part of a bigger change sometimes.</p><p>And that was my experience of contributing to Wikimedia on past time. If it somehow motivated you for taking part in any open source, go ahead! Contact with owners, maintainers, other contributors, ask how can you help, look at that OSS issue board, be it GitHub, Trello, Phabricator or whatever, claim it or comment that you’d like to work on that and get to it! Actively communicate with other people related to this software.</p><p>Woah, this text above came deeply from my heart, heart of young developer who found himself a way of expressing his programming skill in something that can help people.</p><p>But getting to other point of that article I want to summary my work as in Google Code-in contest itself.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/608/1*WkfXTFuDNID0V21UbGtjyg.png" /></figure><p>I completed 43 tasks in forty nine days. Vast majority of them was from Code category. There were also some Documentation and User interface tasks too.</p><p>Here’s the complete list of all tasks I’ve done:</p><ol><li>Kiwix mobile app on Android: Warn users when opening external content —<a href="https://github.com/kiwix/kiwix-android/pull/294">https://github.com/kiwix/kiwix-android/pull/294</a></li><li>Get onto Internet Relay Chat (IRC)</li><li>Kiwix mobile app on Android: Improve night mode back to the top button — <a href="https://github.com/kiwix/kiwix-android/pull/295">https://github.com/kiwix/kiwix-android/pull/295</a></li><li>Kiwix mobile app on Android: Disallow multiple side bar menu activation — <a href="https://github.com/kiwix/kiwix-android/pull/296">https://github.com/kiwix/kiwix-android/pull/296</a></li><li><strong>Wikipedia Android app: Long press on find in page up / down arrows should advance to first / last match</strong> — <a href="https://gerrit.wikimedia.org/r/#/c/394365/">https://gerrit.wikimedia.org/r/#/c/394365/</a></li><li>[[MediaWiki:Botpasswords-deleted-body/en]] misses GENDER support — <a href="https://gerrit.wikimedia.org/r/#/c/394761/">https://gerrit.wikimedia.org/r/#/c/394761/</a></li><li>OAuth messages that point to error descriptions in mediawiki.org need to be simplified — <a href="https://gerrit.wikimedia.org/r/#/c/394860/">https://gerrit.wikimedia.org/r/#/c/394860/</a><br>Also, I did a followup commit to this change in the later time to add lacking error messages.</li><li>Add margin between buttons on Special:Undelete — <a href="https://gerrit.wikimedia.org/r/#/c/395037/">https://gerrit.wikimedia.org/r/#/c/395037/</a></li><li>wfWaitForSlaves is deprecated, replace usages #3 — <a href="https://phabricator.wikimedia.org/T181673#3811093">https://phabricator.wikimedia.org/T181673#3811093</a></li><li>Popups extension should not use deprecated method jQuery.fn.hover() — <a href="https://gerrit.wikimedia.org/r/#/c/395651/">https://gerrit.wikimedia.org/r/#/c/395651/</a></li><li>Make five strings in the MassAction extension translatable — <a href="https://gerrit.wikimedia.org/r/#/c/395817/">https://gerrit.wikimedia.org/r/#/c/395817/</a></li><li>Re-enable some codesniffer sniffs disabled in MediaWiki’s MobileFrontend extension — <a href="https://gerrit.wikimedia.org/r/#/c/396296/">https://gerrit.wikimedia.org/r/#/c/396296/</a></li><li>Remove references to deleted $this-&gt;debug in installer — <a href="https://gerrit.wikimedia.org/r/#/c/396547">https://gerrit.wikimedia.org/r/#/c/396547</a></li><li>Fix insufficient difference between background colors for un/read notifications in the Echo flyout — <a href="https://gerrit.wikimedia.org/r/#/c/396554/">https://gerrit.wikimedia.org/r/#/c/396554/</a></li><li>Remove numbers from Table of Contents layout in print mode, as they display incorrectly — <a href="https://gerrit.wikimedia.org/r/#/c/396932/">https://gerrit.wikimedia.org/r/#/c/396932/</a></li><li>Write a help page that explains how use Wikimedia visual editor to create complex links — <a href="https://www.mediawiki.org/wiki/Help:VisualEditor/User_guide/Links">https://www.mediawiki.org/wiki/Help:VisualEditor/User_guide/Links</a></li><li>Fix autoloading of database dumps related maintenance scripts in MediaWiki core — <a href="https://gerrit.wikimedia.org/r/#/c/398074/">https://gerrit.wikimedia.org/r/#/c/398074/</a></li><li><strong>Add options for filtering deleted pages to Wikimedia’s “Pages Created” tool</strong> — <a href="https://github.com/x-tools/xtools/pull/143">https://github.com/x-tools/xtools/pull/143</a></li><li>7x Add MinusX support to one MediaWiki skin and one MediaWiki extension</li><li>Add logging of warnings that are returned after attempted uploads in the addwiki/mediawiki-api library — <a href="https://github.com/addwiki/mediawiki-api-base/pull/41">https://github.com/addwiki/mediawiki-api-base/pull/41</a></li><li><strong>Make securitycheckplugin detect double escaping (advanced task)</strong> — <a href="https://gerrit.wikimedia.org/r/#/c/399776/">https://gerrit.wikimedia.org/r/#/c/399776/</a></li><li>[Unit testing] Unit test “addPublisher” in Newsletter’s `includes/NewsletterDb.php` file — <a href="https://gerrit.wikimedia.org/r/#/c/400075/1">https://gerrit.wikimedia.org/r/#/c/400075</a>/</li><li>Fix “jQuery.fn.hover() is deprecated” in Content Translation — <a href="https://gerrit.wikimedia.org/r/#/c/400175/">https://gerrit.wikimedia.org/r/#/c/400175/</a></li><li>Add anchors to headings in CXStats — <a href="https://gerrit.wikimedia.org/r/#/c/400260/">https://gerrit.wikimedia.org/r/#/c/400260/</a></li><li>[Unit testing] Unit test “updateName” in Newlsetter’s `includes/NewsletterDb.php` file — <a href="https://gerrit.wikimedia.org/r/#/c/400420/">https://gerrit.wikimedia.org/r/#/c/400420/</a></li><li>Individual newsletter pages should have a visual hierarchy — <a href="https://gerrit.wikimedia.org/r/#/c/400451/">https://gerrit.wikimedia.org/r/#/c/400451/</a></li><li><strong>Create a pop-up for musical scores showing more features </strong>— <a href="https://gerrit.wikimedia.org/r/400834">https://gerrit.wikimedia.org/r/400834</a> + <a href="https://gerrit.wikimedia.org/r/401093">https://gerrit.wikimedia.org/r/401093</a></li><li><strong>Transcribe three sheet music images into score tags on Wikipedia (I) </strong>— <a href="https://en.wikipedia.org/wiki/St_Paul%27s_Suite">https://en.wikipedia.org/wiki/St_Paul%27s_Suite</a></li><li><strong>Define wgRestrictionEdit (as an empty array) on Education Program pages </strong>— <a href="https://gerrit.wikimedia.org/r/#/c/401411/">https://gerrit.wikimedia.org/r/#/c/401411/</a><br>And here’s my comment on GCI website: <br>It might look that it was easy because it took me 3 hours from claiming the task to submitting patch, but no! For that three hours I was 100% focused on the code and the issue, as you can see on Phabricator (T133289) I was practising a Rubber-ducking and finally found the issue. I think that’s the best solution for the problem. It wasn’t an easy one, but I liked it!</li><li><strong>“Discussion” tab on wiki pages should have indication of non-existent target page (other than only color)</strong> — <a href="https://gerrit.wikimedia.org/r/#/c/401733/">https://gerrit.wikimedia.org/r/#/c/401733/</a></li><li>Remove the language icon shown on Wikidata.org and MediaWiki.org on mobile web (as it doesn’t do anything)<br>Small log from IRC:<br>20:18 &lt;jdlrobson&gt; Albert221: tested myself and looks good!<br>20:18 &lt;jdlrobson&gt; (checked enwiki as well to check it still shows there)<br>20:19 &lt;thcipriani&gt; cool, going live everywhere :)</li><li>Replace the layout-only span.mw-editButtons-pipe-separator in favor of CSS — <a href="https://gerrit.wikimedia.org/r/#/c/403066/">https://gerrit.wikimedia.org/r/#/c/403066/</a></li><li>Make missing areas of Query.Wikidata.org translatable — <a href="https://gerrit.wikimedia.org/r/#/c/402391/">https://gerrit.wikimedia.org/r/#/c/402391/</a></li><li><strong>Add date range options to Wikimedia’s “Page History” tool </strong>— <a href="https://github.com/x-tools/xtools/pull/149">https://github.com/x-tools/xtools/pull/149</a></li><li><strong>Kiwix mobile app on Android: Move the bookmark button to the bottom bar when it is enabled</strong> — <a href="https://github.com/kiwix/kiwix-android/pull/338">https://github.com/kiwix/kiwix-android/pull/338</a></li><li>Kiwix mobile app on Android: Move at least 30 constants to separate package — <a href="https://github.com/kiwix/kiwix-android/pull/339">https://github.com/kiwix/kiwix-android/pull/339</a></li><li>Blog about your GCI experience (findings and learnings) with Wikimedia — this post</li></ol><p>I marked bigger tasks with bold.</p><p>I want to thank all people from Wikimedia who were influenced in Google Code-in. They were doing it all for free, in their free time and they deserve really big applause for that!</p><p>I also want to thank andre__, Zppix, d3r1ck, mhutti1, Kelson, musikanimal, FlorianSW, Jonas_WMDE, Legoktm, Ebe123, Reedy, bawolff, Volker_E, tonythomas, jdlrobson in no particular order for their help, bigger or smaller either in mentoring me through doing tasks either in my problems, issues and things that had struggled me when writing code. You really rock! You do what you love and you do it very good! What I can do is to learn from you! You all are great and the best in your particular field of interest and I’m really envy of some of those things. I hope I’ll get my skills closer to your levels sometime.</p><p>I also want to thank some fellow students, that is divadsn, refeed and Phantom42 for some good jokes and having good time on IRC.</p><p>And for the fourth time I also want to thank my parents and my girlfriend for supporting me, cheering me up and not minding my zombie-like lifestyle for the time of the contest.</p><p>And lastly I want to thank principal of my school for telling other teachers that I’m taking part in the contest so that they won’t expect so big preparations to school for me.</p><p>Some last words to you, my reader. If you want to learn something new, have a beautiful experience in your life or just have some good time in things related to writing code and creating software, November 28th — that is the date you should save in your calendar. You definitely should take part in the Google Code-in contest and perceive all I wrote here all by yourself! Good luck.</p><p><a href="https://medium.com/@Albert221/san-francisco-trip-6366366d7da5">San Francisco Trip</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d82758d359b1" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>