Blog (10)
Komentarze (1.3k)
Recenzje (7)
@kamil_w[How To] Lama, czyli automatyzowanie Androida

[How To] Lama, czyli automatyzowanie Androida

08.07.2012 22:08

Jakiś czas temu na łamach tutejszego bloga opublikowałem wpis przedstawiający Lamę – program, który pozwala zautomatyzować wykonywanie działań w systemie spod znaku zielonego robocika. Zdaję sobie sprawę z tego, że konfiguracja tego narzędzia i tworzenie reguł jego działania może okazać się dla niektórych nie lada wyczynem. Biorąc to pod uwagę postanowiłem opisać aplikację bardziej szczegółowo oraz pokazać w jaki sposób można ją wykorzystać na przykładzie własnej konfiguracji .

422896

Program podzielony jest na cztery zakładki:

  • Rejony,
  • Zdarzenia,
  • Profile,
  • Ostatnie.

Profile

Najprostszą funkcją Lamy są profile dźwiękowe, których o dziwo domyślnie nie ma w Androidzie. Przyznać muszę, że funkcji tej nie używałem na żadnym z moich poprzednich telefonów. Nie miałem takiej potrzeby, ale po przejściu ze szkolno – uczelnianego trybu życia na tryb biznesowy zacząłem doceniać tę funkcjonalność i, dopóki nie poznałem Lamy, strasznie mi jej w Androidzie brakowało.

422904

Po instalacji Lamy dostępnych jest kilka predefiniowanych profili. Można z nich, jednak nic nie stoi na przeszkodzie, by tworzyć nowe profile i je konfigurować. W każdym z profili można zdefiniować osobno głośność dla dzwonków, powiadomień, multimediów i dźwięków systemowych. Istnieje możliwość przypisania innego dźwięku dzwonka i powiadomień dla poszczególnych profili. Da się również zdefiniować wygląd ikony programu wyświetlanego na systemowym pasku stanu, dzięki czemu łatwo można się zorientować jaki profil jest w danej chwili aktywny. Ciekawie wygląda także możliwość wybierania kontaktów, dla których ustawienia profilu mają nie obowiązywać. Funkcja przydatna, gdy czekamy na ważny telefon od konkretnej osoby. Należy nadmienić, że z powodu ograniczeń samego systemu w wersji 4.x nie da się ustawić różnej głośności dla powiadomień i dzwonka.

Rejony

W tym miejscu użytkownik ma możliwość tworzenia definicji rejonów i uczenia aplikacji rozpoznawania w jakim rejonie się aktualnie przebywa. Lokalizowanie odbywa się poprzez sprawdzanie masztów sieci komórkowej, z którymi jesteśmy połączeni, tak więc WiFi oraz GPS nie muszą być włączone, a co za tym idzie, nie jesteśmy skazani na szybkie rozładowywanie baterii .

422908

W zakładce tej po zainstalowaniu mamy dostępne dwa rejony: dom i praca. Rejony te można usunąć i/lub dodać nowe. Są to tylko puste definicje, które nie zawierają żadnej informacji o naszej lokalizacji. Program trzeba nauczyć jaka lokalizacja odpowiada danej definicji rejonu. W tym celu klikamy i przytrzymujemy daną definicję rejonu. Pokaże się menu, z którego należy wybrać opcję „Naucz się rejonu”, a następnie trzeba podać czas w jakim program będzie uczył się naszej lokalizacji. Im dłużej, tym lepiej. Przykładowo przebywając w pracy od 8 do 16 warto włączyć uczenie rejonu tuż po przekroczeniu drzwi do zakładu pracy. Rejonu dom można nauczyć Lamę np. w nocy. Dzięki temu mamy pewność, że Lama nauczy się lokalizacji naszego domu bezbłędnie. Chyba, że ktoś lunatykuje i zdarza mu się wybierać na nocne wycieczki. ;) Informacje o rejonach są bardzo przydatne podczas tworzenia reguł zdarzeń. Dzięki nim można tworzyć reguły zdarzeń uwarunkowane od naszej lokalizacji. Prościej mówiąc – np. wchodzisz do domu i telefon coś sam robi.

Ostatnie

W zakładce o nazwie Ostatnie wyświetlana jest lista ostatnio widzianych masztów .

422912

Dzięki temu można np. sprawdzić gdzie się w danym czasie przebywało, które maszty są dostępne jednocześnie w kliku rejonach, a także samemu przypisywać poszczególne maszty do danych rejonów (opcja dostępna po przytrzymaniu palcem na informacji o danym maszcie).

Zdarzenia

Kwintesencją aplikacji jest możliwość tworzenia zadań, które mają być uruchamiane po spełnieniu ustalonych przez nas warunków. W niniejszym rozdziale opisane zostały rozwiązania, które są stosowane przeze mnie.

422916

Dbanie o słuch i o sprzęt

Na początek nieskomplikowane zadanie – jeden warunek, jedna czynność.

Mój smartfon wydaje z siebie całkiem niezły dźwięk. Chip audio Yamahy w SGS2 jest naprawdę przyzwoity. W połączeniu z dobrymi słuchawkami nawet przy ciszej puszczonej muzyce dobrze słychać linię melodyczną, bas jest przyjemny, nie dudni i naprawdę da się „czuć fun”. Dzięki temu i dobremu odizolowaniu od świata pełnego hałasu, jakie dają mi moje słuchawki, nie czuję potrzeby gwałcenia swoich uszu jak największą dawką decybeli. Zauważyłem, że przeważnie, gdy słucham muzyki za pomocą słuchawek ustawioną mam głośność na 10 (w 15‑stopniowej skali). Biorąc to pod uwagę stworzyłem sobie zadanie, które po podłączeniu słuchawek ustawia mi głośność multimediów na 10. W tym celu:

422920

Od tej pory za każdym razem, gdy podłączam słuchawki głośność muzyki ustawia się na poziom, który gwarantuje mi, że dźwięki z słuchawek do mnie dotrą, że nie ogłuchnę, a także że nie uszkodzę słuchawek.

Drugie zadanie w utworzonej przeze mnie grupie „głośność multimediów” odpowiada za ustalanie głośności multimediów w przypadku, gdy dźwięk ma się wydobywać z wbudowanego w telefon głośnika. Nie jestem autobusowym DJ’em (choć mógłby na to wskazywać mój avatar). Nie jestem osobą, która lubuje się w zmuszaniu całego otoczenia do słuchania muzyki, którą ja lubię. Tym bardziej w sposób, który ją tak zniekształca, że linia melodyjna się zatraca i zamiast muzyki słychać jedynie chaotyczny hałas. Dlatego poziom głośności multimediów, jaki mnie zadowala w przypadku korzystania z wbudowanego w telefon głośnika to 2. Dzięki takiej wartości również podczas włączania gier nie rykną one na mnie niespodziewanie. Ustawienie to osiąga się podobnie, jak wyżej. Należy:

422923

Ustalanie jasności ekranu w zależności od pory dnia

Jasność ekranu wpływa na szereg spraw, ale dwie są chyba najbardziej oczywiste. Przede wszystkim wraz ze zwiększeniem poziomu jasności zwiększa się zapotrzebowanie na energię telefonu, a co za tym idzie, skrócenie czasu działania naszego urządzenia bez dostępu do ładowarki. Drugą sprawą jest męczenie naszego wzroku. Jasno świecący ekran w nocy zdecydowanie bardziej męczy nasz wzrok niż wtedy, gdy jest on przyciemniony. Dlatego też stworzyłem sobie dwa zadania, które odpowiadają za ustalanie poziomu jasności ekranu w zależności od pory dnia.

Pierwsze:

422927

Drugie:

422929

Automatyczne przełączanie profili dźwiękowych

Jak już wcześniej wspomniałem dorosłem do korzystania z profili dźwiękowych w telefonie. Będąc w domu lub pracy korzystam z profilu, który jest cichy, ale słyszalny. Będąc w terenie (na spacerze, zakupach, w pubie z przyjaciółmi, w autobusie, czy na koncercie) ustawiony mam taki profil, który pomimo dużego hałasu pozwala mi usłyszeć dźwięk dzwonka i/lub poczuć wibracje. Stosuję jeszcze jeden profil, który nazwałem mianem „Nocny”. Wyłącza on wszelkie dźwięki i wibracje. Dzięki temu od ustalonej przeze mnie godziny mam wszystko i wszystkich w nosie oraz gwarancję spokojnego snu. :D Oczywiście profile aktywują mi się automatycznie i nie muszę pamiętać o ręcznym włączaniu poszczególnych profili. Lama robi to za mnie dzięki ustalonym przeze mnie zdarzeniom. Przy okazji wykorzystuję tu funkcję Lamy odpowiedzialną za przypisywanie rejonów do poszczególnych lokalizacji za pomocą nadajników sieci komórkowej.

Profil terenowy:

422933

Profil do domu i pracy:

422935

Profil nocny:

422937

Blokowanie wygaszania ekranu

Czy zdarzyło Wam się, że grając w jakąś grę, czytając e‑booka lub przeglądając Internet na waszym smartfonie ekran się wyłączył? Mi to się zdarzało notorycznie. Jednak za pomocą Lamy można ten problem rozwiązać. Pierwszą myślą jaka przyszło mi do głowy było stworzenie zdarzenia z listą aplikacji, podczas włączania których wygaszacz ekranu ma być wyłączany oraz zdarzenie z taką samą listą jednak z funkcją ustawiania wygaszacza ekranu na 30s po zamknięciu jakiejkolwiek aplikacji z tej listy. Jednak chwilę się zastanowiłem i doszedłem do wniosku, że jest prostszy sposób. Zadałem sobie pytanie – „czy jest jakieś zdarzenie, które zachodzi po zamknięciu jakiejkolwiek aplikacji?” I olśnienie. Jest. :D Przecież zamykając jakąkolwiek aplikację włączana jest aplikacja startowa (chyba tak ją można nazwać po Polsku), czyli z angielskiego launcher. I tak zamiast kilkudziesięciu warunków można użyć jednego. Podobnie sytuacja wygląda w przypadku wyłączania wygaszacza ekranu. Po co tworzyć długą listę aplikacji, które mają wyłączać wygaszacz, skoro można stworzyć zdarzenie mające za zadanie wyłączyć wygaszacz, gdy uruchomiony zostanie jedynie launcher? Jeśli mamy jakieś aplikacje, których warunek nie powinien dotyczyć nic nie stoi na przeszkodzie, by je również podać w warunkach zdarzenia. Takimi programami mogą być wszystkie te, które nie wymagają interakcji z użytkownikiem (radio, radio internetowe, dyktafon, aplikacje do przesyłania danych, odtwarzacz audio itp. Itd.). Tym sposobem warunek jest prostszy, wydajniejszy i łatwiejszy do stworzenia.

Wyłączanie wygaszania ekranu po uruchomieniu aplikacji:

422941

Ustawienie czasu, po którym ekran ma się wyłączyć na 30 sekund:

422943

Jeśli używana jest domyślna aplikacja startowa można ograniczyć się do wskazania jedynie jednej aplikacji i pominąć funkcję OR. Jednak z doświadczenia wiem, że warto wszelkie rozrośnięte warunki zaczynać właśnie od tej funkcji. Dlaczego? Domyślnie działa funkcja AND, czyli wszystkie wskazane warunki muszą być spełnione, by zdarzenie zadziałało. Jeśli przyjdzie konieczność dodania nowego warunku w przypadku, gdy zaczniemy tworzyć zdarzenie od funkcji OR wystarczy dodać nowy warunek wewnątrz tej funkcji. W przypadku, gdy zdarzenie nie będzie rozpoczęte od tej funkcji może zajść konieczność czasochłonnego tworzenia zdarzenia od początku.

Moje „widzi mi się” dla połączeń telefonicznych

Kompletnie nie miałem pomysłu jak zatytułować tę funkcję. Mając ustawioną już funkcję odpowiedzialną za włączanie i wyłączanie wygaszacza ekranu pojawił się u mnie drobny problem. Korzystam z aplikacji do zarządzania kontaktami i połączeniami telefonicznymi exDialer. Zauważyłem, że gdy do kogoś dzwonię za pomocą exDialera, po zakończeniu połączenia zostaje ponownie wyświetlone okno tego programu. Gdy uruchomiony jest ten program, ekran nie wyłącza się samoczynnie, bo przecież sam to wcześniej zablokowałem. Jakoś tak już mam, że po zakończeniu rozmowy nigdy nie pamiętam o tym, żeby wyjść z programu exDialer lub wyłączyć ekran za pomocą fizycznego przycisku. Musiałem więc to jakoś rozwiązać. Rozwiązanie okazało się nie takie oczywiste, jak mogłoby się to wydawać. Najprostszym sposobem byłoby ustawienie w Lamie włączenia aplikacji startowej (w moim przypadku Go Launcher EX) po zakończeniu rozmowy, jest tylko jedno „ale”. Przy takim skonfigurowaniu Lamy przenoszony byłbym do ekranu startowego po każdym połączeniu – zarówno wychodzącym, jak i przychodzącym. O ile dzwoniąc do kogoś to ma sens, to w przypadku, gdy ktoś do mnie dzwoni już nie. Przecież na dłuższą metę byłoby to denerwujące, gdybym np. czytał e‑booka, ktoś by do mnie zadzwonił i po zakończeniu rozmowy zamiast wrócić do czytania książki zostałbym skierowany do ekranu startowego, czyli na pulpit. Tak więc trzeba było stworzyć zadanie, które po połączeniu wychodzącym przeniesie mnie do ekranu głównego (czego konsekwencją będzie automatyczne wyłączenie ekranu po 30 sekundach), a przy połączeniu przychodzącym przeniesie mnie do ostatnio używanej aplikacji.

exDialer:

422948

Przejście do ekranu domowego, czyli na pulpit tylko w przypadku rozmowy wychodzącej:

422950

Przypisywanie różnych metod wprowadzania treści w różnych aplikacjach

Domyślnie w moim telefonie dostępna była klawiatura Swype, która bardzo przypadła mi do gustu. Na co dzień to właśnie z niej korzystam, jednak okazało się, że ma ona (lub aplikacja mojego banku) błąd. Gdy w aplikacji banku Pekao s.a. próbuję podać kwotę przelewu korzystając z klawiatury Swype pierwsza podana przeze mnie cyfra samoczynnie wstawia się wielokrotnie. I tak oto pewnego razu płacąc rachunek za telefon nieopatrznie przelałbym na konto mojego dostawcy usług komórkowych kwotę 5555555555555555555,55 zł. (sic!). Pomijam fakt, że takiej gotówki nie mam (a szkoda) oraz to, że mój dzienny limit jest duuuużo mniejszy, jednak sam fakt może zarówno zadziwiać, śmieszyć, jak i przerażać. Zauważyłem, że korzystając z klawiatury od Samsunga problem ten nie występuje, a że jestem na tyle leniwy, że nie chce mi się za każdym razem, gdy włączam aplikację mojego banku przełączać klawiaturę, zleciłem to zadanie Lamie. Okazało się, że Lama sama w sobie nie pozwala na osiągnięcie wyznaczonego tu celu, ale umożliwia to wtyczka do programu Locale o nazwie Secure Settings. Jest ona kompatybilna z Lamą i można ją pobrać z Google Play.

Przełączanie klawiatury na klawiaturę od Samsunga podczas włączania aplikacji banku:

422954

Przełączenie klawiatury na Swype po wyjściu z aplikacji banku:

422956

Automatyczne włączanie i wyłączanie GPSu

GPS w naszych smartfonach ma to do siebie, że bardzo lubi konsumować baterie naszych urządzeń dlatego warto go uruchamiać tylko wtedy, gdy jest to konieczne. Jednak po co zawracać sobie tym głowę, skoro dzięki Lamie można sprawić, że będzie się on uruchamiał automatycznie tylko wtedy, gdy będzie potrzebny i wyłączał, gdy przestaniemy go potrzebować?

Automatyczne włączanie GPSu*:

422960

Automatyczne wyłączanie GPSu**:

422962

* Do przełączania stanu GPSu można również użyć warunku dostępnego bezpośrednio w Lamie, jednak warunek ten zadziała tylko w  przypadku urządzeń z Androidem w wersji 2.2 lub niższej oraz być może w przypadku urządzeń z zainstalowanym tzw. Custom ROMem (np. CyanogenMod).

** Alternatywnie wyłączanie GPSu można ustawić, gdy wszystkie aplikacje potrzebujące GPSu do działania będą wyłączone (funkcja AND + lista aplikacji zatrzymanych lub wyłączonych). Takie rozwiązania ma jednak wadę. Przykładowo biegając korzystam z aplikacji Endomondo i słucham muzyki przy pomocy PowerAMPa. Gdybym w czasie biegania chciał na chwilę włączyć odtwarzacz audio żeby np. wybrać inny album musiałbym na chwilę wyjść z aplikacji Endomondo, a to spowodowałoby wyłączenie GPSu. Inny przykład: jadąc samochodem i korzystając z aplikacji Mapy może się zdarzyć, że przyjdzie do nas SMS albo e‑mail. Po otwarciu wiadomości aplikacja Mapy zostałaby przeniesiona na dalszy plan, a tym samym moduł GPS zostałby wyłączony. Można by jeszcze spróbować uwarunkować włączanie i wyłączanie GPSu od stanu ekranu (włączony lub wyłączony), ale to również raczej nie ma prawa się sprawdzić, bo przecież biegając z Endomondo nie patrzę na ekran smartfona a na drogę, więc ekran spokojnie może być wyłączony.

Automatyczne włączanie Internetu

Z Internetu w komórce korzystamy często, czasem bardzo często, ale nie można powiedzieć, że korzystamy z niego przez cały czas. Warto włączać Internet tylko wtedy, gdy jest on nam potrzebny. W moim przypadku algorytm włączania Internetu jest dość skomplikowany. Transfer danych pakietowych, czyli Internet od usługodawcy sieci komórkowej włącza mi się, gdy:

422967

W efekcie transfer danych pakietowych włącza się tylko wtedy, gdy będąc poza domem włączę jakąś aplikację, która wymaga dostępu do sieci globalnej lub gdy program Play24.

Równie skomplikowany jest algorytm, który odpowiada w moim smartfonie za włączanie WiFi. Włączy się ono, gdy:

422970

Rozszyfrowując powyższy zapis można wywnioskować, że poza domem włączany jest transfer danych pakietowych, natomiast w domu łączę się z Internetem za pomocą WiFi, które jest włączane tylko wtedy, gdy sam tego sobie zażyczę, lub gdy podłączę telefon do ładowarki/laptopa. Ponadto warto zwrócić uwagę na fakt, że aplikacja Play24 działa poprawnie tylko, gdy używany jest Internet z sieci komórkowej. Z tego względu powyższy algorytm jest zrobiony tak, by bez względu na miejsce pobytu oraz na to, czy telefon jest podłączony do ładowarki po uruchomieniu aplikacja Play24 zawsze korzystała z Internetu mobilnego. Dodatkowo do zdarzenia włączania WiFi dodałem akcję wyłączania transferu danych pakietowych, bo przecież nie da się korzystać z obu technologii jednocześnie.

Sposób implementacji algorytmów w Lamie:

Automatyczne włączanie transferu danych pakietowych (tylko w terenie):

422974

Automatyczne włączanie WiFi (tylko w domu):

422976

Automatyczne wyłączanie Internetu

Mając już ustawione automatyczne włączanie modułów odpowiedzialnych za połączenie z Internetem warto byłoby ustawić jeszcze automatyczne ich wyłączanie. Tu również prosty warunek raczej się nie sprawdzi w 100% i trzeba zastosować kilkustopniowe algorytmy. Tak więc automatyczne wyłączanie transferu danych pakietowych następuje u mnie, gdy:

422979

Algorytm wyłączania WiFi jest podobny, jednak bardziej skomplikowany, bowiem dochodzą dwa czynniki: wyłączanie WiFi po uruchomieniu aplikacji Play24 oraz stan pracy baterii. Biorąc to wszystko pod uwagę automatyczne wyłączenie WiFi zadziała, gdy:

422981

* Chodzi tu o aplikacje, które do działania potrzebują dostępu do Internetu, ale mogą jednocześnie być używane przy wyłączonym ekranie, czyli np. do słuchania radia internetowego nie potrzeba włączonego ekranu. To samo dotyczy rozmowy głosowej prowadzonej poprzez Skype’a. ** Aplikacje, które do działania na pewno nie potrzebują Internetu, czyli np.: czytnik e‑książek, gry, odtwarzacz wideo, dyktafon, pakiet biurowy, itd. Skoro mamy ich używać przez jakiś czas (bo przecież książki nie czytamy przez 2 minuty) aplikacje te powinny wyłączać dostęp do Internetu. Mam nadzieję, że rozpisałem warunki na tyle przejrzyście, że każdy z Was rozumie jak to działa. Poniżej sposób zaimplementowania powyższych algorytmów w Lamie.

Automatyczne wyłączanie „Internetu mobilnego”:

422984

Automatyczne wyłączanie WiFi (nie tylko w domu).

422986

Synchronizacja danych systemowych i Dropboxa po podłączeniu do wybranej sieci WiFi

Synchronizacja danych to świetna sprawa. Jednak stwierdziłem, że automatyczna synchronizacja, jaką oferuje mi Android nie jest mi potrzebna. Zamiast tego wymyśliłem sobie, żeby synchronizacja była przeprowadzana tylko wtedy, gdy będę się łączyć z zaufaną siecią WiFi, czyli z sieci w moim domu. Po pierwsze dzięki temu pozbyłem się kolejnej funkcji, która cały czas pracując w tle zużywa baterię. Po drugie dzięki synchronizacji tylko przy wykorzystaniu WiFi zapobiegam zużywaniu pakietu danych od operatora sieci, a po trzecie, z racji tego, że synchronizuję dane tylko w zaufanej sieci (bo taką jest sieć domowa) mam gwarancję, że moje dane nie zostaną przejęte np. za pomocą jakiegoś narzędzia do Sniffingu.

Synchronizacja danych tylko po podłączeniu do zaufanej sieci WiFi

422990

Ustawienia

Warto również zajrzeć do ustawień aplikacji, gdzie można skonfigurować rodzaj powiadomień programu, sposób prezentowania przez niego danych, czas blokady profili dźwiękowych, włączyć funkcje eksperymentalne i wiele więcej.

Podsumowanie

W niniejszym wpisie przedstawiłem moje autorskie sposoby wykorzystania Lamy. Tworząc opisane rozwiązania starałem się sprawić, by były one jak najprostsze, a jednocześnie uwzględniały jak największą liczbę czynników. W niektórych rozwiązaniach nie miałem już pomysłu na lepsze rozwiązanie (np. wł/wył GPS), a w innych mam wrażenie, że dałoby się wymyślić coś innego. Przykładowo o ile z algorytmu wyłączania Internetu jestem zadowolony, to jego włączanie pewnie dałoby się poprawić. Chodzi mi tu o zjawisko opóźnienia podłączenia do Internetu od chwili włączenia modułu odpowiedzialnego za dostęp do niego. Np. włącza się WiFi, ale połączenie z siecią następuje z kilkusekundowym opóźnieniem. Czasami przez to trzeba wyjść z aplikacji i wejść do niej ponownie. Może dałoby się jakoś to rozwiązać np. włączając WiFi po włączeniu ekranu, odczekaniu minuty i jeśli w tym czasie nie zostałaby uruchomiona aplikacja, która wymaga dostępu do sieci WiFi by się wyłączało.

Są też zdarzenia, nad którymi brakuje mi czasu, żeby przysiąść. Jednym z nich jest funkcja „blokowacza aplikacji”, która miałaby polegać na tym, że chcąc uruchomić jakąś aplikację z poufnymi danymi ekran by się blokował (blokada za pomocą symbolu), ale po wciśnięciu przycisku wstecz lub po poprawnym wprowadzeniu symbolu blokada by się wyłączała (tymczasowo lub w zależności od sytuacji, permanentnie). W Google Play są dostępne aplikacje, które działają właśnie w ten sposób. Jedną z nich jest Smart App Protector. Obecnie z niej korzystam, ale gdyby udało mi się skłonić Lamę do takiego działania zrezygnowałbym z dodatkowej aplikacji. Podejrzewam, że dałoby się to zrobić korzystając z Secure Settings i zmiennych Lamy, ale cóż. Miałem trochę czasu na to w ten weekend, ale z chęcią rozwiązywania łamigłówek wygrała chęć podzielenia się z Wami wiedzą i doświadczeniem.

Kończąc ten wpis chciałbym przeprosić za ewentualne błędy. Jestem językowym świtem i nie toleruję jakichkolwiek błędów. Jednak fakt, że ten dość długi tekst tworzyłem po części w nocy, a po części w niedającym żyć upale po prostu nie chciało mi się sprawdzać, czy te naskrobane przeszło 4600 słów ma sens (swoją drogą moja praca inżynierska miała krótszą część teoretyczną).

Jeśli ktoś z Was ma jeszcze jakieś ciekawe pomysły na wykorzystanie Lamy, albo wpadł na to, jak ulepszyć moje rozwiązania chętnie poczytam o tym w komentarzach pod tym wpisem.

---‑------------------------------- PS: Przepraszam za formę wstawienia list, ale nie ogarnąłem jak tu zrobić listy wielopoziomowe PPS: Nad tekstem się trochę napracowałem. Zastrzegam sobie do niego prawo, a tym samym nie wyrażam zgody na publikowanie go w innym miejscu - ani w całości, ani we fragmentach.

Wybrane dla Ciebie
Komentarze (94)