Maciej Aniserowicz's Blog, page 39
May 8, 2018
Wednewsday #05 – programistyczne nowinki
Witam w piątym już wydaniu #wednewsday. Uwaga teraz będą devowe odgłosy radości:
[“hip”,”hip”]
hip hip array!
Właśnie trwa #MSBuild więc jesteśmy zalewani nowościami od Microsoftu. Póki co piekło nie zamarzło ale wszystko się może wydarzyć! Za tydzień jakoś postaram się to podsumować.
Wersja audio (linki z podcastu znajdziecie na Devsession):
Data Science
Data Science Resources : Cheat Sheets – ściągawki w .pdf dla R, Python, Numpy, Pandas.
Extracting Structured Data From Recipes Using Conditional Random Fields – ekstrahowanie danych na przykładzie książki kucharskiej.
Piaskownica
The best books on Computer Science and Programming – 5 polecanych książek do nauki programowania.
Progressive Web Apps core guides on MDN Web Docs – wstęp do PWA, ogólne zagadnienia.
Laravel 5.6 – CRUD Operation with MongoDB – operację CreateReadUpdateDelete z wykorzystaniem bazy MongoDB. Polecam także inne artykuły ze strony learninglaravel.net
JVM Architecture 101: Get to Know Your Virtual Machine – znaj swoją wirtualną maszynę Java.
Glitch – Przestrzeń w sieci gdzie każdy może spróbować programowania. Zbuduj swoją pierwszą apke, grę. Przerób projekty innych.
Programowanie
Why Developers Should Install WSL Today – Windows Subsystem Linux dla developerów. Sam używam od kilku dni i ‘so far so good’.
A month of clean code – Podsumowanie miesiąca z clean code. Dobrze pokazane przykłady (od użytkowników) przed i po refaktoryzacji.
Apache Spark : Python vs. Scala – porównanie możliwości Pythona i Scali w pracy z Apache Spark.
Semantic Versioning – semantyczne wersjonowanie oprogramowania. To, na które także przechodzi Google.
What happens before main() function is executed in C – znów schodzimy niżej aż do hardware’u.
My first impressions about Graal VM – pierwsze doświadczenia z rozszerzeniem do wirtualnej maszyny Java.
Ciekawostki, artykuły, dyskusje
Uniwersytet Opolski otwiera kierunek Game Studies
Continuous Development Will Change Organizations as Much as Agile Did – wpływ CD na organizację pracy.
Stack Overflow Isn’t Very Welcoming. It’s Time for That to Change
Programmers are having a huge debate over whether they should be required to behave respectfully to each other
Where Do The World’s Software Developers Live? – Geolokalizacja developerów. Ale bez obawy tutaj tylko analiza kont GitHub’a i przy okazji fajny use case jak to zostało wykonane.
Zapraszam również do śledzenia audycji podcastowej, w której co tydzień prezentuję najnowsze wiadomości, ciekawostki, wpadki oraz nadchodzące wydarzenia ze świata IT:
http://devsession.pl/podkast/
The post Wednewsday #05 – programistyczne nowinki appeared first on devstyle.pl.
May 6, 2018
DevTalk #77 – O projektowaniu gier z Jackiem Wesołowskim
Odcinek 77. to spojrzenie w kierunku zawsze przyspieszającym bicie programistycznych serc.
Moim i Waszym Gościem jest Jacek Wesołowski. Jacek od dawna pracuje w branży, przez którą wielu programistów zostało programistami. Czyli? Klepie CRMy!!! Nie no… Jacek robi w gamedev oczywiście! Jednak nie zajmuje się kodowaniem gier. Jego zadaniem jest sprawienie, żeby gra była… grywalna. A na Twitterze jako @jzillw.
Tematem rozmowy jest to, czym Jacek zajmuje się na co dzień: projektowanie gier. I to gier, które większość z Was na pewno zna! Dowiecie się jak to się dzieje, że jedna gra wciąga na całe tygodnie, podczas gdy inne to tylko “MEH”? Jak wygląda współpraca projektanta z programistami? Kto co robi i “kogo ile” potrzeba w zespole? Dlaczego praca nad grami wygląda inaczej niż nad aplikacjami biznesowymi i co jest największą bolączką teamów tworzących hity? I… wiele więcej! Cud-miód.
Z niniejszym odcinkiem powiązany jest bardzo interesujący projekt. Jacek pisze książkę “Projektowanie Przeżyć“, w której to w szczegółach wprowadzi nas w ten magiczny świat.
Inicjatywę można wesprzeć w akcji crowd-fundingowej na portalu PolakPotrafi. Zachęcam do zapoznania się i dorzucenia swojej cegiełki! Ja już pierwszego dnia wybrałem paczuszkę dla siebie:
PLAY!
http://traffic.libsyn.com/devtalk/DevTalk_E77-Jacek_Wesolowski-Projektowanie_Gier.mp3
Montaż odcinka: Krzysztof Śmigiel.
Ważne adresy:
zapisz się na newsletter
zasubskrybuj w iTunes lub przez RSS
ściągnij odcinek w mp3
zostań Patronem! :)
Linki:
Kampania crowdfundingowa książki “Projektowanie przeżyć”: https://polakpotrafi.pl/projekt/projektowanie-przezyc
DevTalk#17 – O gamedev z Przemysławem Czatrowskim: https://devstyle.pl/2015/06/01/devtalk17-o-gamedev-z-przemyslawem-czatrowskim/
Unity Engine: https://unity3d.com
Muzyka wykorzystana w intro:
“Misuse” Kevin MacLeod (incompetech.com)
Licensed under Creative Commons: By Attribution 3.0
http://creativecommons.org/licenses/by/3.0/
The post DevTalk #77 – O projektowaniu gier z Jackiem Wesołowskim appeared first on devstyle.pl.
May 4, 2018
Kwiecień 2018 na devstyle: podsumowanie i raport finansowy.
Na swoim profilu na Patronite obiecałem publikować co miesiąc “raport finansowy”. Dodatkowo zamieszczam podsumowanie tego, co działo się w imperium devstyle w ostatnim miesiącu. Pokazuję… wszystko. Bez tajemnic. Enjoy!
Kwiecień miał być pracowity. Miał powstać – najlepiej w całości! – mój Kurs Gita. Okazało się, że… nie powstał. Finalnie plecień, co przeplata, upłynął na… sam nie wiem na czym. Głównie na zdrowieniu, bo przez większość miesiąca byłem po prostu chory, więc ani siły ani chęci nie było do działania.
Ale to się już na szczęście zmieniło:
Dzieliłem się smutnymi spostrzeżeniami, że – zdałem sobie z tego sprawę na terapii u psychologa – niezależnie od tego “ile bym zrobił”, to ciągle mam wrażenie, że za mało. Że nic nie robię. Że jestem leń.
Poruszyłem ten temat w socialach i okazało się, że taki problem ma bardzo wiele osób w IT. Dlatego też od tego miesiąca, w niniejszych podsumowaniach, będę publikował listę wszystkich treści na devstyle. Żeby spojrzeć i powiedzieć: o, jednak to nie takie nic! Auto-terapia.
Finansowo: miało być inaczej, ale nie było :). Więc pod tym kątem akurat miesiąc dość nudny. No, poza tym, że jest kilka tysięcy na minusie, bo przyszło się podatek za 2017 dopłacać (remanent, niesprzedany nakład książki).
Raport finansowy: przychody
Założenia:
pieniądze wpływające na konto w bieżącym miesiącu; usługa mogła być zrealizowana w innym terminie
kwoty to faktury netto (chyba, że zaznaczono inaczej)
Pozycje:
konsultacje: 3 200,00 zł
Patronite: 1 465,39 zł
Convertiser (afiliacja Finansowego Ninja): 120,37 zł
książka “Zawód: Programista”: 6 856,05 zł
działania marketingowe: 1 550 zł
W sumie: 13 191,81 zł.
Raport finansowy: wydatki
Założenia:
kwota brutto, znikająca z konta, bez uwzględnienia odliczeń od podatków
Pozycje (linki afiliacyjne):
Księgowa: 290,00 zł
ZUS: 1 257,78 zł
PIT-4: 113,00 zł
PIT-36L (2017): 4 974,00 zł
ConvertKit: 501,13 zł
zoom.us: 50,81 zł
LeadPages: 0 zł (wykupione na 2 lata)
LibSyn: 51,62 zł
Google Storage: 0 zł (wykupione na rok)
DropBox: 0 zł (wykupione na rok)
infakt: 0 zł (wykupione na rok)
wFirma: 0 zł (wykupione na rok)
ToDoist: 0 zł (wykupione na rok)
MacBook Pro + słuchawki Sony: 405,13 zł (20 rat 0%)
Shoplo: 60,27 zł
współpracownicy: 80,00 zł
konferencja dla asystentki devstyle: 179,29 zł
Pajacyk (z afiliacji Finansowego Ninja): 120,00 zł
poczta: 16,50 zł
Patronite (wsparcie 4 autorów): 42,00 zł
Patronite (koszty): 192,21 zł
kurs Mirka Burnejko “Trzy Poziomy“: 248,50 zł
wsparcie akcji “Projektowanie Przeżyć”: 70,00 zł
reklama Facebook: 258,90 zł
książki:
Finansowy Ninja (drugi egzemplarz, do specjalnych celów): 79,80 zł
Mit Charyzmy: 22,89 zł
książka “Zawód: Programista”
obsługa płatności: 160,08 zł
wysyłka: 3 933,54 zł
magazynowanie: 241,08 zł
kurs Gita (przygotowania):
klips studyjny x4 (studio video): 36,60 zł
akcesoria do rysowania: 68,33 zł
książka “Jeden rysunek dziennie”: 18,82 zł
papier do flipcharta: 58,40 zł
samochód:
leasing: 1 774,56 zł
sprzątanie wnętrza: 450,00 zł
benzyna: 563,24 zł
parking SkyCash: 50,95 zł
myjnia: 20,00 zł
W sumie: 16 389,43 zł.
Raport finansowy: podsumowanie
Niby minus, ale się nie przejmuję. Kilka faktur jest już wystawionych i czeka na opłacenie. Inne – będą wystawione wkrótce. Mimo słabej formy i niewielkiej aktywności… biedy nie ma.
Maj szykuje się mega intensywnie. I świetnie, bo już mi się chce! Sporo wyjazdów (Warszawa, Zielona Góra, Poznań, Gdańsk, Rzeszów), sporo aktywności online. Od 7 maja codzienny VLOG, a do tego minimum dwa webinary. No i… wreszcie start Kursu Gita!
Nie wiem, czy uda mi się nagrać cały materiał, ale może zdecyduję się na uruchomienie przedsprzedaży na atrakcyjnych warunkach. Zapisz się, by mieć do niej dostęp! Jeszcze nie zdecydowałem, ale być może ograniczę się do udostępnienia kursu tylko dla chętnych zapisanych na listę oczekującą.
Nie mogę się doczekać :). Na razie udało mi się przeobrazić garaż w semi-pro studio video i wypuścić testowe nagranie – recenzję moich słuchawek, żeby zobaczyć czy dźwięk/światło/sync audio i video jest OK. Good news: jest OK.
No i nie zapominajmy, że na devstyle dołączyły kolejne osoby! Jest co czytać, jest co słuchać, jest co oglądać. I bardzo dobrze, tak ma być!
Podsumowanie aktywności devstyle 04/2018
Teksty
Jak (i po co) zacząć pisać funkcyjnie w C#? (Miłosz)
Wasze Historie #17: Programowanie – pasja utracona? (Bartosz)
Narzędzia programisty iOS cz. 1: Xcode (Piotrek)
Wednewsday #03 – programistyczne nowinki (Grzesiek)
Wednewsday #02 – programistyczne nowinki (Grzesiek)
Życie w chmurze, czyli jazda bez transakcji (Szymon)
Wednewsday #01 – programistyczne nowinki (Grzesiek)
Podcasty
DevTalk #76 – O rekrutacji z Agatą Dzierlińską
DevTalk #75 – O zdrowiu z Kamilem Lelonkiem (część 2)
VLOGi
Praca o zmiennej intensywności [devstyle vlog #156]
Co MUSISZ zrobić, żeby MNIE POKONAĆ? [devstyle vlog #155]
Mechanical Animals [devstyle vlog #154]
Jak przyciągnąć NAJLEPSZYCH ludzi? [devstyle vlog #153]
DONE is better than PERFECT… z jednym ALE !!! [devstyle vlog #152]
Video
Sony WH-1000XM2. Recenzja słuchawek.
devstyle live: RODO dla programistów z Beatą Marek
wywiad TV Narew – po raz pierwszy w telewizorze :)
devstyle LIVE o nauce i rozwoju
Wyjazdy
“Szczęśliwy Programista” @ OLMUG Olsztyn
spotkanie ze studentami @ Łomża
4 Developers 2018 @ Warszawa (uczestnik, członek Rady Programowej)
====
Jak co miesiąc mam nadzieję, że taki ekshibicjonizm przynosi Tobie nieco wartości i inspiracji…
…albo chociaż zaciekawia :).
Do przeczytania wkrótce!
Procent… nareszcie zdrowy i do działania gotowy
P.S. Jak zwykle, jeśli masz jakiekolwiek pytania: nie wahaj się, tylko je zadawaj! Naprawdę nie mam żadnych tajemnic i chętnie na wszystko odpowiem.
The post Kwiecień 2018 na devstyle: podsumowanie i raport finansowy. appeared first on devstyle.pl.
May 1, 2018
Wednewsday #04 – programistyczne nowinki
“Zbliża sie majówka
potocznie nazwana
czeka na ten weekend
ludność kochana ”
aut. Bozka
A wy czekaliście z utęsknieniem na kolejną porcję newsów? No mam nadzieję!
Wersja audio (podcast Devsession):
Machine Learning
Build Your First Deep Learning Classifier using TensorFlow – zbuduj swoje pierwsze rozwiązanie oparte o TensorFlow + Python rozpoznające rasę psa.
5 Open Source Libraries to Aid in Your Machine Learning Endeavors – przydatne biblioteki, frameworki w pracy z ML oraz kilka otwartych zbiorów danych.
What’s new in YOLO v3? – detekcja obiektów w czasie reczywistym z wykorzystaniem algorytmu YOLO.
Piaskownica
Top Tutorials To Learn Kubernetes – zbiór tutoriali do Kubernetes dla początkujących i zaawansowanych.
How I designed a game with Scratch – bo Scratch nie tylko dla dzieci jest.
Interactive Go programming with Jupyter – krótkie wprowadzenie do Jupyter Notebook i języka GO.
Top 5 Best Ethical Hacking Course for Programmers – 5 kursów do nauki ‘etycznego hackowania’.
So you want to be a [Hacker/Pentester/Red Teamer] – dla osób chcących zajmować się szeroką pojętym bezpieczeństwem.
Słownik (EN/PL) pojęć związanych z testowaniem oprogramowania (pdf, 82str)
Oracle MOOC: Java Coding & Concepts with a Game (May 2018) – właśnie dziś startuje kurs online Javy od Oracle’a oparty o tworzenie gier.
Programowanie
How my unit tests went from 42 seconds to 1.8 seconds – PHP i kilka best practices w zakresie testów jednostkowych.
Java Challengers #1: Method overloading in the JVM – przeciążanie metod w Javie.
What Is API Testing and Why Should We Be Using It? – jak testować API RESTowe.
Hit Me Baby One More Time – What Are Cache Hits and Why Should You Care? – Coś dla fanów architektury systemów, procesorów, pamięci. Czyli jak działa Cache.
BOLO: Reverse Engineering – inzynieria wsteczna. Tylko dla odważnych – ASM na pokładzie!
Part 1 (Basic Programming Concepts)
Part 2 (Advanced Programming Concepts)
Ciekawostki, artykuły, dyskusje
The 21 Software Engineers Behind Your Favorite Apps: From Snapchat to Uber – poznajcie sylwetki 21 inzynierów stojących za najpopularniejszymi obecnie aplikacjami.
Top 5 World’s Most Difficult Programming Languages – 5 najtrudniejszych języków programowania.
It’s harder to read code than to write it. – dyskusja na reddit dlaczego tak często chcemy wywalać stary kod i pisać nowy.
Zapraszam również do śledzenia audycji podcastowej, w której co tydzień prezentuję najnowsze wiadomości, ciekawostki, wpadki oraz nadchodzące wydarzenia ze świata IT:
http://devsession.pl/podkast/
The post Wednewsday #04 – programistyczne nowinki appeared first on devstyle.pl.
April 29, 2018
Jak (i po co) zacząć pisać funkcyjnie w C#?
Niezależnie od tego, czy masz już programistyczne doświadczenie, czy też dopiero zaczynasz swoją przygodę z programowaniem, jest całkiem prawdopodobne, że sformułowanie programowanie funkcyjne obiło Ci się o uszy.
Mimo rosnącej popularności, u większości programistów nie wywołuje ono przyspieszonego bicia serca. W tym artykule chciałbym Ci pokazać, że ten styl programowania może być źródłem sporej frajdy, a przy tym pomoże Ci pisać lepszy kod. Co więcej, pokażę Ci, jak w ogóle zabrać się do tematu i zacząć pisać funkcyjnie w C#.
Dlaczego warto?
Zacznijmy od najważniejszego, czyli dlaczego w ogóle masz poświęcać swój cenny czas na naukę programowania funkcyjnego (PF)? Jest co najmniej kilka powodów, dzięki którym nie będzie to czas stracony.
Będziesz robić mniej bugów
PF jest trochę jak zdrowe odżywianie. Wymusza na Tobie przestrzeganie surowo brzmiących reguł, ale w długim okresie jest dla Ciebie dobre i prowadzi do pożądanych skutków. Jak za chwilę zobaczysz, w PF jest dużo zasad, które na początku mogą wydawać się bardzo restrykcyjne, a czasem nawet absurdalne. Jednakże, przestrzegając tych reguł, masz znacznie mniejsze pole do popełnienia błędu. Twój kod jest czystszy i bardziej przewidywalny.
Wybierasz co chcesz
Nie musisz iść na całość i od razu przesiadać się na F# czy Haskella. Jest wiele funkcyjnych technik, które z powodzeniem można stosować w codziennej pracy bez robienia wielkiej rewolucji.
Pogimnastykujesz umysł
PF wymusza inne spojrzenie na rozwiązywane problemy. Takie wyjście ze strefy komfortu pozwoli Ci poszerzyć horyzonty i da Ci sporo satysfakcji. Jeśli masz już powoli dosyć programowania na co dzień, to dzięki PF możesz rozbudzić swoją pasję na nowo.
Czym jest programowanie funkcyjne?
Formalnie rzecz ujmując, PF to paradygmat programowania. Cóż to takiego? Paradygmat to zbiór wysokopoziomowych zasad i reguł dotyczących pisania kodu. Jakie paradygmaty wyróżniamy? Poniżej znajdziesz trzy najważniejsze (oczywiście jest ich więcej).
Proceduralny – program składa się z wielu funkcji i procedur. Każda z nich składa się z serii instrukcji, które ma wykonać komputer. Przykładowe języki: C, Pascal.
Obiektowy – najbardziej popularny spośród paradygmatów. W tym podejściu modelujemy rzeczywistość za pomocą zbioru obiektów, które wysyłają do siebie komunikaty. Przykładowe języki: Java, C#, C++.
Funkcyjny – program składa się przede wszystkim z funkcji. Aplikację tworzymy poprzez składanie małych funkcji w co raz bardziej skomplikowane. Przykładowe języki: F#, Haskell, Ocaml.
Podejścia proceduralne i funkcyjne wpadają do większego worka o nazwie programowanie imperatywne. Istotą programowania imperatywnego jest wydawanie komputerowi instrukcji. Programista opisuje dokładnie w jaki sposób program ma się zachować.
W PF nie ma instrukcji, są za to wyrażenia. Program jest funkcją, wyliczającą rezultat na podstawie podanych argumentów.
Funkcje kojarzą nam się (słusznie) z matematyką. Być może zastanawiasz się właśnie, co taka matematyczna funkcja może mieć wspólnego z aplikacjami, które tworzysz na co dzień. Kluczowe jest zauważenie, że funkcje nie muszą wcale działać na liczbach. Co powiesz na funkcję, jako argument przyjmującą akcję wykonaną przez użytkownika i zwracającą obiekt opisujący, jak powinien zmienić się UI na skutek tej akcji?
Czy C# jest funkcyjny?
Zapytajmy Wikipedii:
C# is a multi-paradigm programming language encompassing strong typing, imperative, declarative, functional, generic, object-oriented (class-based), and component-oriented programming disciplines.
Pomimo, iż C# kojarzy się nam głównie jako język obiektowy, to jak widać możemy w nim znaleźć elementy z wielu różnych paradygmatów, w tym funkcyjnego. Ja uważam, że w C# jest naprawdę sporo elementów wspierających funkcyjność (zwłaszcza w porównaniu do np. Javy).
Podstawowe funkcyjne zagadnienia
Omówię teraz kilka podstawowych funkcyjnych koncepcji.
Funkcje obywatelami pierwszej kategorii
Jak już wiemy, w PF najważniejsze są funkcje. Aby móc programować choć trochę funkcyjnie, język musi pozwalać traktować funkcje jak wartości. Możemy zatem funkcję przypisać do zmiennej:
Func calculateTax =
employee => employee.Salary * 0.19;
Funkcje mogą być też parametrami dla innych funkcji:
double CalculateTax(Employee employee, Func getTaxRate)
{
return employee.Salary * getTaxRate(employee);
}
W tym przykładzie funkcje CalculateTax przyjmuje jako parametr funkcję getTaxRate, określającą jaką metodę liczenia podatku zastosować dla danego pracownika.
Funkcje moga również zwracać funkcje:
Func GetTaxRateCalculationMethod(Employee employee)
{
if (employee.IsSelfEmployed)
{
return GetLinearTaxRate;
}
else
{
return GetProgressiveTaxRate;
}
double GetLinearTaxRate(Employee e) => 0.19;
double GetProgressiveTaxRate(Employee e) => e.Salary > 32000 ? 0.32 : 0.19;
}
Ten przykład demonstruje przy okazji dość nowy element języka C#, czyli funkcje lokalne (pojawiły się w wersji 7.0 języka). Przydaje się on bardzo podczas pisania funkcyjnego kodu.
W powyższych przykładach używam określania funkcja w odniesieniu do metod, wyrażeń lambda, funkcji anonimowych – z punktu widzenia programowania funkcyjnego, nie ma to znaczenia. Najważniejsze jest, że wszystkie te konstrukcje zwracają jakiś wynik. W związku z tym metoda zwracająca void nie jest funkcją.
Jak widać, C# pozwala na traktowanie funkcji jak wartości. W związku z tym, możemy powiedzieć, że w tym języku funkcje są obywatelami pierwszej kategorii.
Czyste funkcje (pure functions)
Wiemy już, że w PF funkcje traktujemy poważnie – będziemy je przekazywać, zwracać i przypisywać. Jednak funkcja funkcji nierówna. Jeśli chcemy programować funkcyjnie, to musimy poznać pojęcie czystej funkcji.
Funkcja jest czysta, jeśli spełnia następujące warunki:
Jej wynik zależy tylko i wyłącznie od zadanych argumentów (tzw. referential transparency).
Nie posiada efektów ubocznych.
Referential transparency
Skupmy się najpierw na punkcie pierwszym. Wydaje się to dość intuicyjne, jednak nie każda funkcja spełnia ten warunek. Spójrzmy na przykład na poniższą metodę:
private double taxRate = 0.19;
double CalculateTax(Employee employee)
{
return employee.Salary * this.taxRate;
}
void DoStuff()
{
var employee = new Employee { Salary = 2000 };
this.taxRate = 0.15;
Console.WriteLine(this.CalculateTax(employee));
this.taxRate = 0.23;
Console.WriteLine(this.CalculateTax(employee));
}
Widać na pierwszy rzut oka, że na konsolę wypisane zostaną dwie różne liczby. Wszystko dlatego, że CalculateTax odwołuje się do czegoś spoza funkcji – do pola taxRate. W związku z tym nie możemy powiedzieć, że wynik tej funkcji zależy wyłącznie od argumentów, z jakimi została zawołana.
Zobaczmy jeszcze jeden przykład funkcji, która nie jest pure.
TimeSpan CalculateAge(Employee employee)
{
return DateTime.Now - employee.DateOfBirth;
}
W tym przypadku funkcja odwołuje się do DateTime.Now, które da inny wynik w zależności od tego, kiedy zostało wywołane. W jaki sposób możemy sprawić, aby ta funkcja była czysta?
TimeSpan CalculateAge(Employee employee, DateTime now)
{
return now - employee.DateOfBirth;
}
Musimy wynieść odwołanie do świata zewnętrznego poza funkcję. W tym przypadku, zamiast wołać DateTime.Now, funkcja będzie przyjmować nowy parametr now.
Efekty uboczne
Kolejnym warunkiem, który musi spełniać czysta funkcja, jest brak efektów ubocznych. Czym są efekty uboczne?
Wypisanie tekstu na konsolę.
Wysłanie danych poprzez sieć.
Modyfikacja pola klasy (w przypadku metody) lub pola statycznego.
I wiele innych…
Wywołanie funkcji nie może zatem posiadać żadnych skutków ubocznych. Zadaniem funkcji jest wyłącznie wyliczenie jakiejś wartości na podstawie argumentów.
Ta reguła może Ci się wydawać bez sensu. Jak to, kod ma nie mieć efektów ubocznych? Czy w takim razie ktoś w ogóle zauważy jego wywołanie?
Możliwe są tutaj dwa podejścia. Języki czysto funkcyjne, takie jak Haskell, używają bardzo ciekawej koncepcji monad do ukrycia efektów ubocznych w taki sposób, że da się mimo wszystko pisać czyste funkcje.
Na początek jednak lepiej posłużyć się innym, bardziej pragmatycznym podejściem. Otóż tworząc program, nie dążymy do tego, aby wszystkie funkcje były czyste, a raczej do tego, aby funkcji czystych było jak najwięcej. Staramy się tak zorganizować nasz kod, aby funkcje nieczyste pojawiały się tylko tam, gdzie interakcja ze światem zewnętrznym jest konieczna.
Kilka słów o składni
Warto przy okazji wspomnieć o fajnym elemencie składni C# (który pojawił się w wersji 6.0 języka), który ma pewien związek z pisaniem czystych funkcji. Są to tak zwane expression-bodied methods. Przykładowo, powyższą funkcję CalculateTax możemy zapisać w następujący sposób:
TimeSpan CalculateAge(Employee employee, DateTime now)
=> now - employee.DateOfBirth;
Taki zapis jest dużo bardziej zwięzły. Jaki ma to związek z czystymi funkcjami? Otóż jeśli funkcja ma nie posiadać efektów ubocznych, to wynika z tego, że będziemy w niej unikać używania instrukcji. Skoro wynik zależy wyłącznie od podanych argumentów, to ciałem funkcji może być po prostu wyrażenie. Dzięki expression-bodied methods możemy taką funkcję zapisać dużo zwięźlej.
Funkcje wyższego rzędu
Dochodzimy do momentu, w którym programowanie funkcyjne pokazuje swoją prawdziwą siłę. Mając do dyspozycji powyższe dwie koncepcje – funkcje jako obywatele pierwszej kategorii oraz czyste funkcje – jesteśmy gotowi na zmierzenie się z pojęciem funkcji wyższego rzędu.
Mam dla Ciebie dobrą wiadomość – prawdopodobnie od dawna znasz i używasz funkcji wyższego rzędu! Chodzi o LINQ, który jest bardzo mocno oparty na tej koncepcji.
Czym są zatem funkcje wyższego rzędu? Są to funkcje, które przyjmują inne funkcje jako argument. Rozpatrzmy przykład, w którym mając zadaną tablicę pracowników, chcemy znaleźć pracownika o najwyższej pensji. Tradycyjne, imperatywne rozwiązanie mogłoby wyglądać na przykład następująco:
Employee FindHighestEarner(Employee[] employees)
{
if (employees.Length == 0)
{
return null;
}
var candidate = employees[0];
foreach (var employee in employees)
{
if (employee.Salary > candidate.Salary)
{
candidate = employee;
}
}
return candidate;
}
W tym podejściu zaczynamy od wprowadzenia zmiennej przechowującej kandydata na wynik (czyli pracownika z najwyższą pensją). Następnie, przechodzimy po tablicy employees i jeśli znajdziemy pracownika o pensji wyższej niż kandydat, to ustawiamy zmienną candidate na tego pracownika. Po przejściu całej tablicy candidate będzie wskazywał na pracownika z najwyższą pensją.
Spójrzmy teraz na funkcyjną implementację.
Employee FindHighestEarner(Employee[] employees)
{
return employees.Aggregate((candidate, employee) =>
employee.Salary > candidate.Salary
? employee : candidate
);
}
Jak widać, kod nam się znacznie uprościł i skrócił. W tym rozwiązaniu użyłem funkcji Aggregate (pochodzącej z LINQ), przyjmującej inną funkcję jako parametr. Przyjmowana funkcja opisuje jak, mając element tablicy oraz wynik częściowy wyliczony dla poprzednich elementów, skonstruować wynik częściowy, uwzględniający ten element. W naszym przypadku wynikiem jest pracownik o najwyższej pensji. Mając pracownika najlepszego spośród pierwszych trzech elementów tablicy oraz pracownika czwartego, jesteśmy w stanie powiedzieć, kto jest najlepszym pracownikiem dla pierwszych czterech elementów tablicy.
Aggregate jest przykładem funkcji wyższego rzędu. Prawdopodobnie znasz inne funkcje wyższego rzędu takie jak Select czy Where. Chcąc pisać funkcyjnie w C# warto zaznajomić się ze wszystkimi funkcjami występującymi w LINQ i zacząć ich używać zamiast imperatywnych rozwiązań. Powstały w ten sposób kod jest dużo bardziej zwięzły i w lepszy sposób wyraża intencje programisty.
Jaki jest związek funkcji wyższego rzędu z poprzednimi koncepcjami? Język musi umożliwiać przekazywanie funkcji jako parametr innych funkcji, aby funkcje wyższego rzędu były możliwe do zaimplementowania. Co więcej, bardzo często jako argument funkcji wyższego rzędu będziemy podawać funkcję czystą.
Funkcyjna kompozycja
Na koniec chciałbym Ci opowiedzieć o idei kluczowej dla programowania funkcyjnego. Otóż jeśli chcemy budować nasz program z funkcji, to potrzebujemy narzędzi pozwalających nam w prosty i wygodny sposób te funkcje ze sobą komponować. Wróćmy na chwilę do przykładu z przekazywaniem metody wyznaczania odsetek podatku do CalculateTax.
double CalculateTax(Employee employee, Func getTaxRate)
{
return employee.Salary * getTaxRate(employee);
}
Zapiszę teraz tę funkcję w inny sposób:
Func CalculateTax(Func getTaxRate) =>
employee => employee.Salary * getTaxRate(employee);
Co tu się wydarzyło? Pierwotnie funkcja CalculateTax przyjmowała dwa argumenty. Zmieniłem ją w taki sposób, że przyjmuje ona jeden argument getTaxRate, a następnie zwraca funkcję, która przyjmuje kolejny argument employee. Taki zabieg nazywamy w programowaniu funkcyjnym rozwijaniem (ang. currying). Co daje nam taka dziwna operacja?
Dzięki takiemu zapisowi możemy w bardzo łatwy sposób tworzyc nowe funkcje poprzez podanie tylko jednego argumentu do CalculateTax. Przykładowo, możemy w prosty sposób stworzyć funkcje, które wyliczają podatek liniowy lub progresywny:
var calculateTaxLinear = CalculateTax(GetLinearTaxRate);
var calculateTaxProgressive = CalculateTax(GetProgressiveTaxRate);
Jest to bardzo istotna operacja w programowaniu funkcyjnym, ponieważ dzięki niej możemy uniknąć tworzenia niepotrzebnych funkcji – zamiast tego składamy istniejące.
Podsumowanie
Powyższe zagadnienia to zaledwie wierzchołek góry lodowej. Stanowią one jednak podstawę do dalszej nauki. W ramach podsumowania, poniżej znajdziesz listę wskazówek, które pozwolą Ci tworzyć bardziej funkcyjny kod w C#.
Korzystaj z możliwości, jakie daje Ci język i twórz funkcje parametryzowane innymi funkcjami. Ten mechanizm często możesz wykorzystać np. zamiast dziedziczenia.
Staraj się, aby jak największa część Twojego kodu znajdywała się w czystych funkcjach.
Wykorzystuj funkcje wyższego rzędu. Jeśli piszesz pętlę, to prawdopodobnie da się ją przepisać jako wywołanie funkcji wyższego rzędu.
Jeśli tworzysz wiele podobnych funkcji, to zastanów się, czy możesz tego uniknąć wykorzystując currying.
A to dopiero początek! Do przeczytania już wkrótce w kolejnych odsłonach tego cyklu!
The post Jak (i po co) zacząć pisać funkcyjnie w C#? appeared first on devstyle.pl.
Jak przyciągnąć NAJLEPSZYCH ludzi? [devstyle vlog #153]
The post Jak przyciągnąć NAJLEPSZYCH ludzi? [devstyle vlog #153] appeared first on devstyle.pl.
DONE is better than PERFECT… z jednym ALE !!! [devstyle vlog #152]
The post DONE is better than PERFECT… z jednym ALE !!! [devstyle vlog #152] appeared first on devstyle.pl.
April 26, 2018
Wasze Historie #17: Programowanie – pasja utracona?
Programowaniem bawiłem się w czasach, gdy 128 mega ramu w moim Atari było czymś, z czym nawet sam komputer nie wiedział do końca jak sobie poradzić, a człowiek był zdany najpierw na jakieś pokątne broszurki w stylu “Atari Basic Essentials” a potem na całkiem obszerne (jak na swój czas) materiały w Bajtku. Piękne czasy mikroprogramów, bezpośredniego programowania pamięci, zabawy z asemblerem, spritami…
Niniejszy post jest częścią cyklu "Wasze Historie".
Autor: Bartosz Gala
Odwiedź też blog Bartosza!
Świetna zabawa, konkurowanie z kolegami kto w tych kilkunastu (góra kilkudziesięciu) linijkach absolutnie niezrozumiałego dla przeciętnego śmiertelnika kodu zrobi coś niezwykłego. To było coś fascynującego! I to do tego stopnia, że co nieco zapamiętałem aż do dziś.
Taki klasyczny mikroprogram składał się generalnie z dwóch części: pętli z komendą peek x,y w roli głównej która to zapisywała do podanej komórki pamięci konkretną wartość oraz listy Data a, b, c, d, e, …. zawierającej dane dla komendy peek. Kilka linijek programu i kilka/kilkanaście linijek cyferek. I powstawał programik, przy którym assembler brzmiał tak wysokopoziomowo jak dziś Python czy Ruby ;)
W najprostszej możliwej wersji wyglądało to mniej więcej tak:
1 FOR I=1536 TO 1550
5 READ A
10 POKE I,A
15 NEXT I
20 DATA 173,11,212,141,10,212,141,24,208,141,26,208,23,123,134
…ale coś poszło nie tak…
Niestety, braki materiałów do dalszej nauki utrudniały wybicie się dalej.
Brak Internetu, książek, kogokolwiek znajomego, kto by mógł pomóc i do tego wcale niepoprawiająca sytuacji niecierpliwość typowa dla nastolatka.
Ja osobiście zatrzymałem się na drukowanej niebieską czcionką (bo kserokopiarki wtedy nie chciały tego ruszyć – ot taka ówczesna walka z piractwem ) książce do Pascala (autora nie pamiętam, i dobrze mu tak zresztą, za to co uczynił) po prostu odbiłem się od niej jak od ściany i tak mi zostało.
…a na koniec edukacja
Aktu zniszczenia dokonało Liceum z “informatyką”, gdzie niemająca pojęcia o czymkolwiek nauczycielka od muzyki wpajała nam wyczytywane z kartek komendy LOGO. Siedzieliśmy po 3 osoby przy jednym komputerze i wklepywaliśmy bezrozumnie pod dyktando w poczciwe Elwro 800 Junior.
I tak umarło już do końca coś, co trwało ładnych kilka lat. Umarło, zdemolowane przez wspaniałe szkolnictwo średnie lat ‘90-tych.
Przerywnik autobiograficzny
Przez następne lata z programowaniem nie miałem w zasadzie nic wspólnego. No chyba, że zaliczyć przelotną i
niemiłą przygodę z TEX-em bez żadnej dokumentacji, czy pomniejsze dostosowywania już istniejących addonów
do gier.
Mimo ciągłego kontaktu z sprzętem, serwisem komputerów, sieci i sprzętu pomiarowego zaszytego po zęby procesorami, kontrolerami i oprogramowaniem, zabaw z Linuksem czy często nierównymi walkami z konfiguracją routerów, do programowania nawet nie myślałem wracać. W mojej głowie miałem wkodowany “paradygmat programowania upierdliwego” – i nic nie chciało tego zmienić…
Paradygmat programowania upierdliwego
Pojawiła się też nowa pasja – Role Playing Games. Nie komputerowe, tylko klasyczne, pełne interakcji z innymi,
pełne kombinowania, pełne myślenia… I jak się pojawiła, tak trwa do dziś. Chociaż komputerowe RPG stają się coraz lepsze, to nadal daleko im do pierwowzoru :)
Powrót pasji
Jednak jakiś rok temu w ramach wolnego czasu zdecydowałem, że już wiek odpowiedni, żeby zapomnieć o
urazach i przypomnieć sobie pasję z młodych lat. Wiele nie myśląc, siadłem do zabawy z programowaniem na
nowo.
Nie będę tu sciemniać – nie było ciężko, bo jedyny cel, jaki sobie postawiłem, to sprawdzić, czy dam radę. Czy sprawi to taką radochę jak za młodu? Czysty relaks, zero stresu. Początki okazały się dużo prostsze, niż myślałem, a dopiero potem zaczęło pojawiać się to przyjemne uczucie odkrywania ziemi nieznanej… i trwa do dziś.
Jak wybrać język z tego natłoku? Wybór języka padł na C++ i było to zupełnie losowe (lista języków na ekranie, zamknięte oczy i pacamy palcem), chociaż ten traf dał od początku poczucie czegoś “znajomego”, czegoś co w końcu lat ‘80 jawiło się jako wielka nowość… i tylko wszyscy się zastanawiali, czemu są wzmianki o C, C++ a nigdzie nie ma nic o C+… bo przecież oczywiste, że gdzieś ten z jednym plusem musi być :).
Jednak podejrzewam, że każdy inny wybór dałby podobny efekt, więc nie ma co myśleć: albo wybieramy język, który zna ktoś znajomy i może nam pomagać raz na czas, albo… pacamy :)
Dzień dzisiejszy
Dzisiaj piszę sobie jakieś ćwiczenia, jeden większy, wykorzystujący całą do tej pory zdobytą wiedzę, projekt. Generalnie: świetnie się bawię, poświęcając na tę zabawę czasem ciut za dużo czasu.
Korzystam pełnymi garściami z tego, czego te 30 lat temu po prostu nie było – z wiedzy w Internecie, książek, możliwości spytania się kogoś o poradę (a sporadycznie nawet taką poradę otrzymuję, zanim sam znajdę rozwiązanie). I jest naprawdę fajnie!
Nawet nie zdajecie sobie sprawy, jak niesamowite jest móc skorzystać z dokumentacji w internecie… to zmienia wszystko.
Wnioski na koniec
Tak więc jeśli zastanawiasz się, czy mając te ponad 40 wiosen na karku można sobie usiąść i zacząć programować, to… można! I nie wymaga to lat poświęceń, wydawania majątku na szkolenia. Oczywiście o ile tylko sprawi ci to radochę, a twoim głównym celem nie jest po trzech dniach nauki aplikować na stanowisko “Senior devilish good developer” i zarabiać na start miesięcznie więcej niż cały Google w rok. Tylko po prostu, tak “dla funu” i bez “parcia na karierę”.
Możesz naprawdę udowodnić sobie, że potrafisz tworzyć użyteczne (chociażby tylko dla siebie) programy. I osiągnąć to, co dla większości ludzi wokoło wydaje się niemożliwe.
Co dalej?
Co prawda nie wykluczam, że któregoś dnia ogłoszę światu “jeśli ktoś chce przyjąć starego, pamiętającego
dinozaury (i ZX Spectrum) juniora na praktyki i da jakieś 1500 na przeżycie to się polecam“… ale na razie po prostu mam radochę z klepania kodu. Radochę z tego, że program robi to, co ja chcę (czasem), a nie to co on chce (częściej). I że wreszcie mogę spełnić przynajmniej kilka marzeń z dzieciństwa, jak chociażby napisać sam dla siebie jakąś prostą nostalgiczną gierkę tekstową wyglądającą, jakby żywcem została wyjęta z lat 80. I nieważne, że przeciętny “indyk” jest przy niej arcydziełem sztuki programistycznej.
No chyba, że ktoś by zaproponował mi udział w tworzeniu jakiejś gry RPG. Wtedy pewnie nawet nie spytam kiedy i za ile, bo jak zderzą się dwie pasje w jednym miejscu, to rozum potrafi iść spać ;) i w sumie sam nie wiem, czy ta myśl – że może kiedyś jednak coś takiego się wydarzy – nie napędza mnie nieświadomie przy klepaniu kolejnych linijek kodu, uczeniu się kolejnych technik i ciekawostek.
…a jak nie, to może sam napiszę sobie jakiegoś “Erpega” i będę się z niego cieszyć. W końcu należy spełniać
własne marzenia!
The post Wasze Historie #17: Programowanie – pasja utracona? appeared first on devstyle.pl.
April 25, 2018
Narzędzia programisty iOS cz. 1: Xcode
Tym razem opiszę najpopularniejsze narzędzia wśród programistów iOS. W pierwszej części skupię się na Xcode, ponieważ to w nim spędza się najwięcej czasu.
Opis przyda się szczególnie początkującym programistom, którzy nie wiedzą gdzie i czego szukać lub wręcz zaczynają przygodę z macOS. Doświadczeni też mogą znaleźć coś ciekawego, ponieważ z pewnością nie każdy się ze wszystkim zetknął. Mnie też to dotyczy, więc jeśli pominąłem coś ważnego, bardzo proszę o komentarz! :-)
Xcode
O nim już chyba każdy słyszał. Co można jeszcze dodać? Całkiem sporo, rzecz jasna. Oczywiście nie będzie tutaj wszystkiego, bo narzędzie to jest tak rozbudowane, że zasługiwałoby na całą książkę.
Pierwsza i najważniejsza rzecz to wersja Xcode, z jakiej chcemy korzystać. Aktualnie wersja Xcode jest równoznaczna z wersją SDK iOS, tvOS, watchOS i macOS. Dla przykładu Xcode 9.3 to SDK iOS 11.3, a Xcode 9.2 to SDK iOS 11.2. Używając starszego Xcode nie możemy korzystać z dobrodziejstw nowego systemu. Użytkownicy iOS aktualizują system bardzo szybko, więc często implementuje się nowe funkcjonalności jeszcze gdy SDK jest w wersji beta aby być gotowym na premierę systemu.
Jeśli projekt nie wymaga używania konkretnej wersji Xcode (co zwykle trwa krótko, aż kod i zależności nie zostaną zaktualizowane) polecam korzystać z najnowszej dostępnej. Rzadko kiedy powoduje to problemy, a często je rozwiązuje. Apple często narzuca konieczność uploadu aplikacji skompilowanych z najnowszym SDK.
Dla przykładu aktualnie Apple wymaga aby od kwietnia tego roku wszystkie aplikacje wysyłane do App store były zbudowane z SDK iOS 11, a nowe aplikacje wspierały w pełni rozdzielczość iPhone X. Tutaj można zauważyć jeden z plusów niekorzystania z nowego Xcode – jeśli projekt jest duży i skomplikowany, poprawienie wszystkich ekranów pod kątem wsparcia dla iPhone X może być problematyczne, a aplikacje skompilowane z SDK iOS 10 będą działały w trybie kompatybilności, wyświetlając czarne paski na górze i na dole. Jest na to jednak pewien sposób. Wystarczy użyć LaunchImage i nie załączyć wersji dla iPhone X. W ten sposób możemy używać nowego SDK i nadal otrzymać tryb kompatybilności.
Tutaj mała dygresja. LaunchImage, choć powszechnie nazywany “splash screenem“, nie jest nim w rozumieniu Apple od początków iOS 10 lat temu. Gdy przyjrzymy się dokumentacji oraz aplikacjom Apple, możemy zauważyć, że ten ekran powinien być zaprojektowany w taki sposób, aby sprawiać wrażenie, że aplikacja otwiera się szybciej niż w rzeczywistości. W jaki sposób? Prezentując główny interfejs aplikacji ale jeszcze bez danych. Niestety “splash screeny” nadal są w modzie. Niektórzy wręcz przedłużają start aplikacji aby użytkownik na pewno zdążył zapamiętać logo producenta… ale to lepiej pomińmy milczeniem.
W jaki sposób zainstalować Xcode? Standardowo pobiera się go z Mac App Store. Osobiście polecam jednak użyć [xcode-install], o którym wspominałem poprzednio.
Budowanie z linii komend
Xcode zawiera też narzędzia linii komend, które są instalowane podczas pierwszego uruchomienia Xcode. Jeśli jest zainstalowane kilka wersji, można wybierać pomiędzy nimi w ustawieniach Xcode (Xcode -> Preferences -> Locations -> Command Line Tools). Można to zrobić również poprzez wywołanie komendy xcode-select lub przez xcode-installprzy użyciu komendy np. xcversion select 9.2.
Ich dokumentację można standardowo odnaleźć przy użyciu systemowych “manual pages” np. man xcodebuild lub man xcrun albo poprzez wewnętrznego helpa, czyli np. xcodebuild -h lub xcrun -h.
Dokumentacja
Xcode posiada wbudowaną przeglądarkę dokumentacji (Window -> Developer Documentation), którą można też otworzyć, klikając w kodzie na symbol trzymając klawisz Command. Nie trzeba jej dodatkowo ściągać i zawiera się wewnątrz Xcode.
Są też inne przeglądarki dokumentacji na macOS. Osobiście polecam Dash. Jest on co prawda płatny ($25) ale przydaje się podczas programowania iOS. Źródeł dokumentacji jest całkiem sporo.
Symulator iOS
Wraz z Xcode dostajemy też kilka innych aplikacji, w tym symulator iOS. Wbrew nazwie jest to również symulator watchOS oraz tvOS. Jak poprzednio wspominałem, działa on bardzo szybko i sprawnie (z wyjątkiem OpenGL), więc warto z niego korzystać. Symulatorami zarządza się w dwóch miejscach.
Pierwsze to ustawienia Xcode. Wchodząc do Xcode -> Preferences -> Components możemy zauważyć listę symulatorów starszych wersji iOS. Najnowszej (dla danego Xcode) nie ma na liście, ponieważ zawsze zawiera się on w paczce z Xcode. Jeśli chodzi o usuwanie symulatorów to musimy to zrobić sami znajdując je w systemie plików (/Library/Developer/CoreSimulator/Profiles/Runtimes)
Drugie to okno Devices and Simulators. Możemy z tego miejsca np. instalować aplikacje, podglądać konsolę urządzeń (fizycznych oraz symulatorów). W tym momencie bardziej nas jednak interesuje możliwość zarządzania instancjami symulatorów. Każda instancja ma swoje zapisane dane, zainstalowane aplikacje itp. Xcode domyślnie stworzy ich wiele, ale dobrze wiedzieć gdzie nimi zarządzać.
Warto też wspomnieć o narzędziu fastlane snapshot. Zostało ono stworzone do hurtowego wykonywania zrzutów ekranu aplikacji do celów publikacji w App Store, ale ma też inną przydatną komendę: fastlane snapshot reset_simulators. Komenda ta skasuje wszystkie instancje i utworzy je na nowo. Przydaje się to szczególnie wtedy, gdy zajmujemy się UI testami lub znudziło nam się bycie zaskakiwanymi, że np. po odpaleniu aplikacji na iPhone 6s z iOS 10.2 mamy już jakieś dane, ponieważ uruchamialiśmy ją tam rok wcześniej…
Dobrze jest też znać kilka podstawowych skrótów klawiaturowych symulatora, a szczególnie “magiczne” działanie przycisków Shift oraz Option – pozwalają one na symulowanie multitouch.
Instruments
Aplikacja Instruments służy do profilowania aplikacji. Uruchamia się ona również podczas wywołania w Xcode opcji Product -> Profile (wtedy też projekt skompiluje się odpowiednio). Jest to zbiór wielu różnych narzędzi służących do dynamicznej analizy kodu. Przykładowe narzędzia to:
Time Profiler – sprawdza, które wywołania metod zajmują najwięcej czasu i jak bardzo obciążony jest procesor.
Leaks – analizowanie alokacji i szukanie wycieków pamięci.
Energy Diagnostics – sprawdzanie jak dużo energii zużywa nasza aplikacja
Osobiście najlepiej trafiały do mnie materiały na temat tej aplikacji z filmów z WWDC. Nic tak dobrze nie nauczy dynamicznego analizowania jak film, który przedstawia działającą aplikację i osobę przy pracy.
Poza dynamiczną analizą kodu jest też Static Analyzer, który jak nazwa wskazuje służy do statycznej analizy kodu. Nie występuje on jednak jako osobna aplikacja, a uruchamia się go poprzez wywołanie w Xcode Product -> Analyze. Zajmuje to trochę więcej czasu niż budowanie projektu ale potrafi wychwycić sporo głupich błędów jak np. kod, który zupełnie nic nie robi.
Ważne foldery
Wspominałem już o tym, że symulatory trzeba usuwać ręcznie. Nie jest to jedyny folder, który warto znać. Najważniejsze moim zdaniem to:
DerivedData (~/Library/Developer/Xcode/DerivedData) – tam Xcode domyślnie trzyma obiekty pośrednie budowania itp. Jeśli projekt wywala dziwne błędy (choć nie powinien), to najczęściej pomaga usunięcie zawartości tego folderu.
Simulators (/Library/Developer/CoreSimulator/Profiles/Runtimes) – folder, o którym już wspominałem. Tam są symulatory. Ważą po kilka GB, więc warto usuwać niepotrzebne.
Device Support (~/Library/Developer/Xcode/iOS DeviceSupport) – symbole oraz biblioteki pozwalające debugować aplikacje na danej wersji systemu. Niestety nie kasują się samoczynnie, więc jeśli brakuje nam miejsca na dysku, to jest pierwsze miejsce, w którym należy go szukać.
Provisioning Profiles (~/Library/MobileDevice/Provisioning Profiles) – są one potrzebne przy podpisywaniu aplikacji. Nie zajmują dużo miejsca ale czasem ich usunięcie i pobranie ponownie (Xcode -> Preferences -> Accounts -> Download Manual Profiles) potrafi pomóc w problemach z podpisywaniem.
Poza tym dobrą wskazówką jest dodanie katalogu całego ~/Library/Developer do wykluczeń Spotlight. Ktoś z was potrzebuje wyszukiwać przez Spotlight pliki pośrednie budowania? A może symbole debugowania? Jeśli tak, to możecie zignorować tę radę. Pozostali pewnie się ucieszą ze zwiększenia szybkości działania Xcode.
Chisel
Koniecznie trzeba wspomnieć o jeszcze jednym narzędziu, które nie wchodzi w skład Xcode. Jest to chisel.
Dzięki niemu używanie LLDB jest o wiele prostsze. Pozwala np. łatwo znaleźć w hierarchii widok spełniający zadany warunek albo zlokalizować go na ekranie czy też otworzyć podgląd obrazu ukrytego w zmiennej.
Ma o wiele więcej możliwości i naprawdę warto się z nim zapoznać.
AppCode
Jeśli ktoś lubi narzędzia IntelliJ, a bariera finansowa nie jest problemem, polecam skorzystać z AppCode… lub chociaż spróbować. Mi osobiście nie odpowiada skakanie pomiędzy nim a Xcode, ale wiele osób bardzo sobie chwali dodatkowe możliwości.
Prawie wszystkie z wyżej wymienionych porad odnoszą się również do AppCode, ponieważ korzysta ono pod spodem dokładnie z tego samego co Xcode, czyli xcodebuild, xcrun itd. Różnice dotyczą jedynie warstwy GUI, edytora tekstu i pluginów.
Inne narzędzia
W następnej części opiszę krótko kilka innych, mniejszych narzędzi, które na co dzień wykorzystuję w pracy.
A może jest coś innego o czym chcielibyście przeczytać? Dajcie znać!
The post Narzędzia programisty iOS cz. 1: Xcode appeared first on devstyle.pl.
April 24, 2018
Wednewsday #03 – programistyczne nowinki
To już nasze trzecie środowe newsowe spotkanie.
Zapewne zauważyliście, że staram się kategoryzować newsy tak aby lepiej po nich się poruszać. Dziś dojdzie nowa kategoria – ‘Piaskownica’. W piaskownicy znajdziecie linki, dla osób rozpoczynających przygodę z programowaniem lub takich, dla których dane zagadnienie jest czymś nowym.
Wersja audio (podcast Devsession):
Piaskownica
5 Best Websites By Google for Programmers and Developers – 5 stron od Google’a wspomagających naukę programowania.
What exactly is Node.js? – Wszyscy słyszeli o ‘apkach na Nołdzie’ ale czasem warto wiedzieć co to ten Node.js jest i w jaki sposób działa.
A .NET Glossary – zaczynasz przygodę z .NET? Łap krótki słownik haseł, z którymi się spotkasz.
Python Modules and Packages – Wstęp do tworzenia paczek i modułów w Pythonie.
Chmura
Learn about Azure services by category – interaktywna strona zawierająca zbiór usług dostępnych na Azure.
Container Networking: From Docker to Kubernetes – darmowa książka (za maila) od wydawnictwa O’Reilly
Sztuczna Inteligencja
Pros and Cons of Neural Networks – wady i zalety użycia sieci neuronowych.
Key Algorithms and Statistical Models for Aspiring Data Scientists – lista najważniejszych algorytmów używanych w analizie danych.
Personalized Hey Siri – słynny asystent Apple’a od strony technicznej.
Machine Learning’s ‘Amazing’ Ability to Predict Chaos
Google Semantic Experiences – Pokaz możliwości rozumienia naturalnego języka
Programowanie
It’s time to rebuild the web – rozważania m.in. nt. funkcjonalności ‘View page source’ dostępnej w przegladarkach i jak aktualny stopień skomplikowania aplikacji webowych źle na nią wpływa.
Checking the Unity C# Source Code – Wykryte błędy po analizie kodu źródłowego niedawno udostępnionego kodu źródłowego frameworka Unity.
VuePress – generator stron statycznych oparty o Markdown
Sonarwhal – open-sourcowe narzędzie typu ‘linting’, wykrywające na podstawie zdefiniowanych reguł błędy w aplikacji webowej.
Ciekawostki, Narzędzia, Sprzęt
5 Best TV Shows For Programmers and Hackers – 5 seriali z ‘nami’ w roli głównej.
Najlepsze ciche klawiatury mechaniczne
FreeCodeCamp live – radio internetowe dla programistów. Brak reklam, muzyczka typu chillout, downtempo.
10 Coding Games To Level Up Our Programming Skills – gramy i podnosimy skille programistyczne. Przyjemne z pożytecznym.
Zapraszam również do śledzenia audycji podcastowej, w której co tydzień prezentuję najnowsze wiadomości, ciekawostki, wpadki oraz nadchodzące wydarzenia ze świata IT:
http://devsession.pl/podkast/
The post Wednewsday #03 – programistyczne nowinki appeared first on devstyle.pl.
Maciej Aniserowicz's Blog
- Maciej Aniserowicz's profile
- 22 followers
