Maciej Aniserowicz's Blog, page 32
October 19, 2018
Jak przyjąć feedback? [devstyle vlog #208]
The post Jak przyjąć feedback? [devstyle vlog #208] appeared first on devstyle.pl.
October 18, 2018
Wystarczy [devstyle vlog #207]
The post Wystarczy [devstyle vlog #207] appeared first on devstyle.pl.
October 17, 2018
Uczenie maszynowe, iOS i Core ML
Komputery potrafią szybko liczyć i są świetne w błyskawicznym wykonywaniu dokładnie określonych poleceń, ale brakuje im kreatywności i umiejętności domyślania się w przypadku braków w specyfikacji.
Ludzie są w tej kwestii zupełnie odwrotni. Mają zwykle duże trudności z wykonaniem dokładnie określonych poleceń, ale na podstawie własnych doświadczeń robią wszystko po swojemu. Niektórzy uważają, że fajnie by było, gdyby komputery też tak potrafiły…
Co to jest uczenie maszynowe?
Uczenie maszynowe (ang. Machine Learning) to dziedzina nauki, której głównym celem jest tworzenie systemów potrafiących się doskonalić i nabywać nową wiedzę przy pomocy danych. Warto zwrócić uwagę, że nie są tu sprecyzowane żadne konkretne algorytmy. W szczególności nie są to wyłącznie sieci neuronowe, choć tak kojarzył się ten termin większości osób, z którymi rozmawiałem.
Jakie algorytmy są w takim razie wykorzystywane? Oczywiście sieci neuronowe (różne typy), ale również drzewa decyzyjne, algorytmy genetyczne, maszyny wektorów nośnych (SVM) oraz wiele, wiele innych. To naprawdę szeroki, głęboki i trudny temat. Nie zamierzam się tu skupiać na naukowej stronie sztucznej inteligencji, ponieważ nie jesteście tu, by czytać prace naukowe, a ja nie czuję się wystarczająco kompetentny w tej kwestii.
Tym, na czym chciałbym się skupić, jest praktyczne zastosowanie gotowych (nauczonych) modeli na platformie iOS. Przygotowanie modelu zostawiam data scientistom (nie słyszałem o polskim odpowiedniku tej nazwy), bo wymaga to zupełnie innych umiejętności niż programowanie.
Po co nam to?
Przeprowadzanie uczenia na urządzeniu mobilnym rzadko ma jakiś sens (ewentualnie douczanie) – nie tylko ze względów wydajnościowych, ale również z uwagi na zwykle małą dostępną ilość danych możliwych do wykorzystania w tym celu. Jednakże wykorzystywanie nauczonych modeli już jak najbardziej sens ma. Można w ten sposób pozwolić na działanie aplikacji bez dostępu do Internetu albo po prostu odciążyć serwery, obniżając koszty infrastruktury. Gdy dane użytkownika nie opuszczają należącego do niego urządzenia, nie ma też problemu z dbaniem o bezpieczeństwo informacji. Brak opóźnień wynikających z transmisji danych przez Internet pozwala również na zupełnie nowe rozwiązania, jak np. funkcje aparatu w iPhonie XS.
Można pomyśleć, że tylko najwięksi gracze mogą skorzystać z takich rozwiązań, ale w rzeczywistości jest inaczej. Owszem, jeśli jest się małą firmą lub tworzy się aplikacje na zlecenie, trudno dokonać przełomu w dziedzinie sztucznej inteligencji. Mimo to zarysowują się już pewne ścieżki, którymi można podążać.
Analiza obrazu
Analiza obrazów lub nakładanie filtrów to bardzo skomplikowane obliczeniowo zadania, które korzystają z głębokich sieci neuronowych, co sprawia, że wykonywanie tych operacji w chmurze może być bardzo kosztowne.
Wspomaganie obliczeń przez GPU albo Neural Engine pozwala na uzyskanie bardzo dobrej wydajności przy jednoczesnym uniknięciu lub zredukowaniu wspomnianego kosztu utrzymania infrastruktury. Ciekawym przykładem użycia może być biblioteka NSFWDetector, która klasyfikuje zdjęcia pod kątem zawartości pornografii. Można tego użyć np. do ukrywania podglądów niektórych plików w aplikacji lub do filtrowania treści w aplikacji społecznościowej jeszcze przed wysłaniem jej na serwer.
Proces, jaki musiał towarzyszyć uczeniu tego klasyfikatora, pozostawiam już waszej wyobraźni. ;-)
Predykcja tekstu
Z tym się już raczej wszyscy zdążyli oswoić. Chyba już każda klawiatura poza systemową na iOS posiada podpowiedzi następnego słowa. ;-) Niektórzy nawet zajmują się nauczeniem komputera pisania całych książek.
Dużo ciekawsze z perspektywy programisty są np. lub predykcja kodu.
Analiza tekstu
Analiza tekstu nie jest może tak zasobożerna jak analiza obrazu, ale także tutaj prywatność użytkowników ma duże znaczenie. Chyba już wszystkie liczące się komunikatory oferują szyfrowanie end-to-end. W takiej sytuacji opcją jest zastosowanie ML na urządzeniu końcowym.
A do czego? Choćby do określania stylu wiadomości (biznesowa, formalna) przed jej wysłaniem lub do analizy nastroju po odebraniu treści w celu zastosowania dla niej odpowiedniego stylu wizualnego lub przypisania kategorii (która może być wykorzystywana do powiadomień).
Jak się za to zabrać?
Gdy już określimy nasz cel, trzeba przygotować lub znaleźć odpowiedni model. To najtrudniejsza część całego zadania i w największym stopniu wpływa na wyniki. Niestety nie ma jedynej słusznej odpowiedzi, ponieważ każdy przypadek jest inny i wymaga innego podejścia.
Ciekawym źródłem na początek może być zestawienie Awesome Core ML Models. Na platformie iOS najłatwiejszym rozwiązaniem jest skorzystanie z Core ML, ale istnieją także inne rozwiązania, jak np. TensorFlow Lite. Można zaimplementować cały algorytm manualnie, czego oczywiście nie polecam.
Jak to zwykle bywa w takich sytuacjach: jeśli rzeczywiście istnieje potrzeba pisania złożonych algorytmów samodzielnie, to nie ma już co do tej potrzeby wątpliwości.
Core ML
Tryb pracy z Core ML składa się z kilku kroków. Pierwszym jest uzyskanie odpowiedniego modelu.
Następnie trzeba go konwertować przy użyciu coremltools lub innych bibliotek, np. tf-coreml na format [Core ML model] (https://apple.github.io/coremltools/coremlspecification/). Przy tej konwersji podaje się metadane określające parametry wejściowe i wyjściowe.
Kolejnym krokiem jest import modelu do swojego projektu w Xcode. To chyba najłatwiejsze zadanie, ponieważ wymaga jedynie przeciągnięcia pliku mlmodel na okno z projektem.
Gdy mamy to już za sobą, możemy przejść do implementacji. Tę można zrobić na dwa sposoby: użyć bezpośrednio klasy MLModel albo skorzystać z klas wygenerowanych przez Xcode. To drugie rozwiązanie jest oczywiście wygodniejsze. Gdy pracujemy na obrazach, jeszcze lepszym rozwiązaniem może być skorzystanie z frameworka Vision.
Jeśli używamy klas wygenerowanych przez Xcode, wystarczy zaledwie kilka linijek kodu, aby otrzymać wyniki:
let userParams: MLMultiArray = ...
let classifier = MyClassifier()
let prediction = try classifier.prediction(input1: userParams)
let userStatus = prediction.output1
Jeśli ktoś chciałby zobaczyć, jak wygląda taka implementacja używająca Vision zintegrowana z prostą aplikacją, to niedawno wrzuciłem na GitHuba przykładowy projekt z mojej prezentacji o CoreML.
Jak się okazało, faktycznej pracy z CoreML nie ma zbyt wiele. Apple postanowiło prawie całość działań przerzucić na etap przed dodaniem modelu do projektu. Programista aplikacji iOS lub macOS nie musi znać się na sztucznej inteligencji – dostaje plik mlmodel, który przedstawia gotowy model przyjmujący na wejściu jedne dane i produkujący inne. Nie jest to w żadnym razie przypadek. Tak jak wspominałem na początku, przygotowanie odpowiedniego modelu jest zadaniem raczej dla naukowca niż programisty. Nie tylko pozwala to odpowiednio podzielić pracę pomiędzy odpowiednimi osobami – prócz tego Python, którego używa się choćby do konwersji modelu, jest w środowisku naukowym po prostu najpopularniejszy. Nie bez znaczenia jest też stabilność formatu mlmodel.
Programista, który otrzyma taki plik, może z niego skorzystać bez martwienia się o wersje bibliotek itp. – system sam zadba o to, by obliczenia były wykonywane możliwie jak najlepiej (CPU, GPU, Neural Engine).
Co dalej?
Znając podstawy, możemy poddać się naszej kreatywności i zbudować kolejną aplikację zarabiającą miliony.
Co Twoim zdaniem warto zbudować przy wykorzystaniu CoreML? A o czym chcesz przeczytać w przyszłości?
Koniecznie daj znać w komentarzu!
The post Uczenie maszynowe, iOS i Core ML appeared first on devstyle.pl.
October 16, 2018
Wednewsday #28 – programistyczne nowinki
Cześć i czołem kod pod stołem. Zapraszam na #28 już porcję ciekawostek, nowinek dla programistów.
How to Write a Technical Paper – jak sporządzić dokumentacją techniczną (epitom).
Software disenchantment – dokąd zabrnęło wytwarzanie oprogramowania i jak je odczarować. Polecam!
33 concepts every JavaScript developer should know.
How I’ve Attracted The First 500 Paid Users For My SaaS That Costs $5/mo – przydatna lekcja biznesu jeśli dostarczasz coś w modelu SaaS.
Alternative code styles – mało znane a nawet dość egzotyczne style pisania kodu.
The Illustrated TLS Connection – każdy bajt protokołu TLS wyjaśniony w sposób graficzny.
AssemblyScript – projekt kompilujący TypeScript do WebAssembly.
RandomAPI – usługa generujące dane testowe. Jest opcja darmowa.
Creating an ASCII-art tree in C# – jak uzyskać ładne drzewko w konsoli.
Autogit – apka konsolowa automatyzująca pewne zadania w Gicie na wielu repozytoriach.
DevConf 2018 – nagrania prelekcji z tegorocznej edycji DevConf.
JavaScript Visualizer – narzędzie do wizualizacji kontekstu wykonania w JavaScript.
refactoring.guru – stronka w dość przystępny sposób tłumaczy wzorce projektowe i refaktoryzacje kodu.
Zapraszam również do śledzenia audycji podcastowej, w której prezentuję najnowsze wiadomości, ciekawostki ze świata IT oraz własne przemyślenia na temat programowania i bycia programistą:
http://devsession.pl/podkast/
The post Wednewsday #28 – programistyczne nowinki appeared first on devstyle.pl.
Sytuacje [devstyle vlog #206]
The post Sytuacje [devstyle vlog #206] appeared first on devstyle.pl.
October 15, 2018
ASYSTENTKA i DELEGACJA: Q&A [devstyle vlog #205]
The post ASYSTENTKA i DELEGACJA: Q&A [devstyle vlog #205] appeared first on devstyle.pl.
October 12, 2018
CECHY dobrej ASYSTENTKI [devstyle vlog #204]
The post CECHY dobrej ASYSTENTKI [devstyle vlog #204] appeared first on devstyle.pl.
October 11, 2018
Asystentka [devstyle vlog #203]
The post Asystentka [devstyle vlog #203] appeared first on devstyle.pl.
October 10, 2018
Rubiny, szyny, trailblazery, feniksy. Wrześniowe spotkanie BRUG.
1 października. Godzina 8:00. Zaczęło się. Nie ma już odwrotu. Drodzy Towarzysze i Towarzyszki. Z przykrością Was informuję, iż nadszedł i na mnie czas. Nie ma od tego ucieczki. Studia is coming.
I niby fajnie spotkać znajomych z roku i wymienić się historiami z wakacji, jednak gdzieś tam głęboko pod skórą czuję, że już niedługo rozpoczną się zaliczenia, kolokwia i egzaminy. Aż kusi polecieć klasykiem i zapytać: „A na co to komu, a po co to?”. Ale nie ma tego złego, co by na dobre nie wyszło. Na szczęście mam swoje grupy programistyczne, na które mogę chodzić bez obaw, że ktoś na nich wyczyta mnie z listy i każe odpowiadać przy tablicy. Zwłaszcza że po wakacjach wiele z nich reaktywowało swoje spotkania ze zdwojoną mocą i potrafią wyrastać niczym grzyby po deszczu.
Ostatnio, przeglądając twarzoksiążkę, dostałam informację o tym, iż Białystok Ruby Users Group powstaje z popiołów niczym feniks i zaprasza wszystkich chętnych na swoje wrześniowe wydanie.
Przyznam się bez bicia. Do tej pory nie miałam okazji wybrać się na spotkanie BRUG-u, ale skuszona miłą alternatywą udałam się 20 września, niezmiennie na godzinę 18, do siedziby już chyba wszystkim znanej firmy SoftwareHut przy ulicy Sienkiewicza 110.
Tym razem miało nie być nikogo z moich znajomych, dlatego też trochę niepewnie przekroczyłam próg sali coworkingowej. Moim oczom ukazała się grupka ludzi, wśród których znalazł się sam ojciec dyrektor Adam Piotrowski z firmy 2N IT. Po krótkiej rozmowie i poznaniu kilku nowych znajomych nadszedł czas rozpoczęcia wydarzenia. Adam powitał wszystkich przybyłych i zaprosił na scenę pierwszego prelegenta.
Wprowadzenie do operacji w Trailblazerze
Moja pierwsza reakcja, gdy usłyszałam słowo „Trailblazer”? „WUT?! Co to jest? Do czego to? Można to zjeść? A nie, to były tagliatelle…” Ale spoko, nie poddawajmy się. Całe szczęście, że prezentację prowadził Kamil Milewski – również z firmy 2N IT – który podjął się tego trudnego zadania, jakim było wyjaśnienie wszystkim, co to za ananas.
No i co ja biedna mogę powiedzieć? Dojrzałość wystąpienia mnie powaliła. Kamil ma duże doświadczenie w pisaniu projektów, w których użyty jest Trailblazer. Sam podczas prezentacji powtarzał, że początki z tym narzędziem są bardzo trudne, ale jeżeli przejdziemy pierwszy etap nienawiści do niego, to później ta relacja może przerodzić się w prawdziwą miłość.
Punktem zapalnym do stworzenia wspomnianej prezentacji był projekt, przy którym klient zaproponował użycie tego właśnie frameworka. Kamil tym razem skupił się tylko na jednej z wielu możliwości, jakie daje nam Trailblazer, czyli operacjach. W późniejszej rozmowie zdradził, że był to jego pierwszy występ i ma nadzieje na kolejne, może nawet z kontynuacją oraz rozwinięciem innych modułów i zagadnień dotyczących tej architektury.
Z mojego punktu widzenia Kamil – jak na pierwsze wystąpienie – poradził sobie bardzo dobrze. Temat był ciekawy i na pewno nikt wśród obecnych się nie nudził. Mam nadzieję, że kolejne prezentacje pójdą mu jeszcze lepiej i po zdobyciu bogatszego doświadczenia z większym luzem będzie występował przed liczniejszym gronem słuchaczy.
Po prezentacji Kamila Adam zarządził kilkuminutową przerwę, podczas której do swojego wystąpienia przygotowywał się kolejny prelegent.
That’s the evilest thing I can imagine, czyli rubiowe ciekawostki w służbie robienia dowcipów nielubianym kolegom z pracy
Przyznajcie sami – dość ciekawy tytuł, prawda? Przykuł moją uwagę od samego początku, a to – jak to mówią – połowa sukcesu. Myślę, że każdy z nas ma takiego kolegę/koleżankę, czy to w pracy, czy na uczelni, który zalazł nam za skórę i któremu chciałoby się odpłacić pięknym za nadobne. Jeżeli do tej pory nie udało Wam się znaleźć pomysłu, jak to zrobić i to w taki sposób, aby nikt się nie dowiedział, że nabroiliście w kodzie, to proszę siadać wygodnie, a ten człowiek podpowie Wam, od czego zacząć.
Panie i Panowie, z niezmierną radością przedstawiam Wam Rafała Camleta (uwaga, znowu zaskoczenie) z firmy 2N IT (swoją drogą, zdolnych mają pracowników, prawda? ). .
Istne wcielenie diabła z Atomówek. Człowiek, który z własnej, nieprzymuszonej woli zrobił prezentację w VIM-ie i jest jednym spośród trzech fanów tego edytora w Białymstoku, a to, co pokazał w trakcie trwania prezentacji, było jakimś kosmosem.
Rafał przygotował wiele przykładów świetnie ukrytych niespodzianek w kodzie, które podczas debugowania dałyby w kość niejednemu developerowi. Celem jego prezentacji było przemycenie jak największej dawki wiedzy merytorycznej w jak najciekawszym wydaniu. Zdaniem Rafała w chwili, gdy posiadamy wiedzę na wybrany temat, powinniśmy z nią eksperymentować – a czy istnieją lepsze eksperymenty niż te rodem z warsztatu szalonego naukowca?
Jeżeli brakuje Wam pomysłów na to, jak uprzykrzyć życie Waszym projektowym kolegom, to Rafał służy pomocą i obiecał, że jeżeli tylko wpadnie na kolejne niecne plany, to z chęcią pojawi się po raz kolejny w roli prelegenta i podrzuci jeszcze większą porcję wrednego kodu.
Jeżeli chodzi o moje odczucia, to z jednej strony go podziwiam, ale z drugiej bałabym się z nim pracować, biorąc pod uwagę, że w nagrodę mogłabym dostać do sprawdzenia kawałek kodu „przygotowanego” specjalnie dla mnie.
Po tej dawce jakże niebezpiecznej wiedzy nadszedł czas na kolejną krótką przerwę, po której ostatni prelegent tego wieczoru był gotowy do wystąpienia.
Wyklikaj se GraphQL
Nadszedł czas na mieszankę wybuchową: połączenie grafów i SQL. Brzmi jak skład prostego, ale dającego mocnego kopa drinka. Przy tej prezentacji nie mogło być inaczej. Autorem powyższego przepisu był nie kto inny jak Artur Czemiel z firmy Aexol. W krótkim czasie przedstawił nam produkt, nad którym pracował wspólnie z kolegami, czyli GraphQL Editor mający ułatwić nam korzystanie z GraphQL.
Artur przeprowadził dla nas szybki tutorial działania edytora oraz opowiedział o projekcie i jego powstaniu: skąd wziął się pomysł, a także jak przygotować środowisko. Zdradził mi też, że na pewno będzie kontynuował ten temat i przedstawi generowanie mockowego back-endu.
To była bardzo krótka, ale ciekawa prezentacja i mam nadzieję, że już niedługo będziemy mogli zobaczyć w pełnej okazałości projekt Artura i jego kolegów.
Teachers, leave them, kids, alone
Odwiedzając różne grupy programistyczne, dochodzę do wniosku, że wiedza, która jest na nich przekazywana – niekiedy w dość niekonwencjonalny sposób – potrafi zostać ze mną na dłużej niż ta zdobyta na studiach czy wyczytana z książek. Nawet jeżeli na co dzień nie pracuję z daną technologią, mogę śmiało powiedzieć, że każda prezentacja, której wysłuchałam czy to na spotkaniu BRUG-u, czy Azura lub .NET, zasiała we mnie ziarenko ciekawości. Z kolei wszyscy ludzie, których spotkałam i z którymi miałam okazję porozmawiać na wspomnianych wydarzeniach, tę ciekawość dodatkowo podsycają.
Zawsze gdy kończy się takie spotkanie, trochę żałuję, że to już wszystko i musimy się rozejść. Wiem jednak, że spotkamy się za miesiąc i znów będziemy mogli wymienić się doświadczeniami zdobytymi przez ten czas.
Tak że, drogi czytelniku, z tego miejsca chcę Cię zaprosić do aktywnego uczestnictwa w życiu społeczności programistycznej. Sam dziel się wiedzą, ale też czerp ją od tych wspaniałych ludzi, którzy nie chcą za nią zupełnie niczego oprócz Twojej obecności na spotkaniu. Myślę, że to niewielka cena za to, co w zamian dostajemy.
The post Rubiny, szyny, trailblazery, feniksy. Wrześniowe spotkanie BRUG. appeared first on devstyle.pl.
Jestem jak PAWLAK. I do tego ZACHĘCAM (ZERO polityki!!!) [devstyle vlog #202]
The post Jestem jak PAWLAK. I do tego ZACHĘCAM (ZERO polityki!!!) [devstyle vlog #202] appeared first on devstyle.pl.
Maciej Aniserowicz's Blog
- Maciej Aniserowicz's profile
- 22 followers
