Maciej Aniserowicz's Blog, page 20
May 14, 2019
REKRUTACJA – ostatnie starcie [devstyle vlog #272]
The post REKRUTACJA – ostatnie starcie [devstyle vlog #272] appeared first on devstyle.pl.
May 13, 2019
Null nullowi nierówny – czyli „nic” w SQL Server
Cześć! Dawno się nie widzieliśmy. Wciąż żyję, wciąż dłubię w SQL-u i wciąż mam o tym coś do powiedzenia. Dziś chciałbym opowiedzieć Wam trochę o… niczym. Okazuje się, że nie jest to tak prosty temat, jak by się mogło wydawać. Jeśli programujesz w innym języku, to z pewnością zdarzyło Ci się z nullem w tej lub innej formie zetknąć. A jak sytuacja wygląda w naszych ukochanych bazkach? O tym za chwilę.
Najpierw jednak muszę się usprawiedliwić, bo jakiś czas mnie tu nie było. Pierwszy kwartał był dla mnie okresem, w którym musiałem się odsunąć od pozapracowych aktywności. Nowy rok, nowa praca, nowe mieszkanie, kilka nowych wyzwań na dalsze miesiące. Słowem – nowy ja. Mam nadzieję, że to rozumiesz i że brakowało Ci mnie chociaż trochę.
Null jaki jest, każdy widzi
O niczym, czyli o nullu, można wbrew pozorom powiedzieć całkiem sporo. Wielu osobom spędza on sen z powiek. Był przyczyną mnóstwa przedziwnych i niespodziewanych wyjątków. Tony Hoare, który ponad 50 lat temu zaimplementował to cudo po raz pierwszy, wręcz przepraszał za swój pomysł.
Zacznijmy więc od skryptów w Javie. Aby sprawdzić, jak to działa, wystarczy wdusić F12 na klawiaturze i wkleić w konsolę poniższy kawałek kodu.
var x = null;
var y = null;
console.log(x == y);
console.log(x === y);
Oba porównania zwracają true. Nawet biorąc pod uwagę słynne już dziwaczne wyniki porównań w JS, było to do przewidzenia. A jak sytuacja będzie wyglądała w C#? Weźmy na warsztat taki kawałek kodu w prostej konsolówce.
string x = null;
string y = null;
Nullable z = null;
Console.WriteLine(x == y);
Console.WriteLine(z.Equals(x));
Console.WriteLine(ReferenceEquals(z, x));
C# jest silnie typowanym językiem, więc pokusiłem się o sprawdzenie równości na nieco więcej sposobów, również porównując dwie zmienne zupełnie różnych od siebie typów.
I znowu: wszystko jest sobie równe. Nie jest to zaskakujące, bo przecież jedno nic i drugie nic są dokładnie tym samym, prawda? Nie będę wchodzić w szczegóły, jak to działa w innych językach, ale jeśli chcesz się dowiedzieć o tym trochę więcej w kontekście C#, to polecam prezentację Mariusza Dobrowolskiego – tutaj. A my przejdźmy do tabelek.
NULL w SQL-u
Jak zawsze musimy zacząć od przygotowania bazy, na której będziemy operować. Stwórzmy zatem tabelę przechowującą dane jakichś osób, przy czym drugie imię i adres mailowy określmy jako nullowalne, bo – w odróżnieniu od imienia i nazwiska – ktoś może ich nie mieć.
CREATE DATABASE [Sample]
GO
USE [Sample]
GO
CREATE TABLE [dbo].[People]
(
[Id] int NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED,
[FirstName] nvarchar(max) NOT NULL,
[LastName] nvarchar(max) NOT NULL,
[MiddleName] nvarchar(max) NULL,
[Email] nvarchar(max) NULL
)
GO
INSERT INTO [dbo].[People]
([FirstName], [LastName], [MiddleName], [Email])
VALUES
(N'Rafał', 'Hryniewski', NULL, 'rafal@hryniewski.net'),
('Maciej', 'Aniserowicz', NULL, NULL),
('Jan', 'Kowalski', 'Andrzej', 'test@test.test'),
('Anna', 'Nowak', NULL, NULL)
GO
Struktura jest dosyć prosta. Wyobraźmy sobie, że z jakiegoś powodu musimy wybrać wszystkich użytkowników, którzy nie mają adresu e-mail, oraz tych, którzy mają jakikolwiek adres. Myślę, że wiesz, jak to zrobić, ale zacznijmy od sposobu niepoprawnego.
SELECT *
FROM [dbo].[People]
WHERE [Email] = NULL
SELECT *
FROM [dbo].[People]
WHERE [Email] <> NULL
I niespodzianka. Oba wyniki są puste mimo tego, że posiadamy przecież rekordy zawierające zarówno NULL, jak i jakąś wartość w kolumnie Email. Pójdźmy dalej i powtórzmy poprzednie eksperymenty z innych języków. Niestety typ boolean w MS SQL nie może być przypisany do czegokolwiek, więc składnia jest nieco brzydka, bo musimy skorzystać z konstrukcji CASE WHEN.
DECLARE @x int = 1;
DECLARE @y int = 1;
DECLARE @z int = NULL;
DECLARE @result1 bit;
DECLARE @result2 bit;
DECLARE @result3 bit;
DECLARE @result4 bit;
SET @result1 = CASE WHEN @x = @y THEN 1 ELSE 0 END;
SET @result2 = CASE WHEN NULL = @x THEN 1 ELSE 0 END;
SET @result3 = CASE WHEN @z = @z THEN 1 ELSE 0 END;
SET @result4 = CASE WHEN @z <> @z THEN 1 ELSE 0 END;
SELECT @result1, @result2, @result3, @result4;
Jeśli nie chce Ci się wklejać tego kodu do Management Studio, to mogę zdradzić, że tylko @result1 przyjmie wartość 1. Zwróć jednak baczną uwagę na przypisanie wartości zmiennej @result3, porównujemy tu ze sobą dwie zmienne @z, które uprzednio ustawiliśmy jako NULL. W przykładach w innych językach sytuacja byłaby odwrotna.
Jeszcze ciekawiej wygląda na tym tle przypisanie wartości zmiennej @result4. Tutaj również kończymy z zerem, a porównujemy przecież, czy @z jest różne od @z. Jaki z tego wniosek? Wychodzi na to, że @z z wartością ustawione na NULL nie jest sobie równe. Nie jest też od siebie różne.
WTF?
Wbrew pozorom jest to bardzo logiczne zachowanie, ale zanim wyjaśnię, dlaczego tak jest, pozwólmy sobie na jeszcze jeden mały eksperyment przy wykorzystaniu utworzonej uprzednio tabeli.
Załóżmy, że dla każdego rekordu w tabeli będziemy chcieli skleić ze sobą pierwsze i kolejne imiona z nazwiskami. Po co? Powiedzmy, że chcemy zaadresować koperty, przesyłki lub zrobić cokolwiek, co ma mniej lub więcej sensu, ale wymaga takiej operacji. Na razie odpuśćmy sobie dbanie o odpowiednią liczbę spacji między wyrazami, jeśli brakuje nam wartości w którejś z kolumn.
SELECT
[Id],
[FirstName] + ' ' + [MiddleName] + ' ' + [LastName] AS FullName
FROM [People]
Jakie wyniki dostaniemy? Mimo że patrząc na dane przykładowe, z pewnością jesteś w stanie stwierdzić, że powinniśmy móc wygenerować takie dane, to okazuje się, że 3 z 4 rekordów mają wartość NULL. Oto wyniki:
NULL
NULL
Jan Andrzej Kowalski
NULL
Co powinniśmy zrobić, aby wszystko zostało zwrócone w sposób poprawny? (Wciąż olewamy liczbę spacji).
SELECT
[Id],
[FirstName] + ' ' + COALESCE([MiddleName], '') + ' ' + [LastName] AS FullName
FROM [People]
Różnica polega na zastosowaniu funkcji COALESCE. O tym, co ona robi, już za chwilę. Wyniki, jakie dostaniemy, są już nieco bardziej satysfakcjonujące.
Rafał Hryniewski
Maciej Aniserowicz
Jan Andrzej Kowalski
Anna Nowak
Zostaje jeszcze problem podwójnych spacji. W sumie nie jest to tematem tego posta, ale jeśli ktoś jest ciekawy, jak się z tym uporać, to odpowiedź znajdzie poniżej. Wyniki z tego fragmentu kodu sprawdź sobie samodzielnie i jego analizę potraktuj jak pracę domową. Podpowiem tylko, że jeśli rozbijesz wszystko na pojedyncze wywołania funkcji, to stanie się to naprawdę oczywiste.
SELECT
[Id],
CONCAT([FirstName], ' ', COALESCE([MiddleName] + ' ', ''), [LastName])AS FullName2
FROM [People]
Wróćmy jednak do samej operacji łączenia stringów. Pozwól, że w końcu wytłumaczę, co się dzieje i dlaczego NULL zachowuje się w taki sposób. To już przedostatni przykład w tym poście i zaraz wszystko powinno Ci się rozjaśnić. Jak myślisz, co zwróci takie zapytanie wykonane przez MS SQL?
SELECT 2 + NULL
Pewnie już się domyślasz, że wynikiem jest NULL. Spróbujmy przełożyć całe zapytanie na język polski (nawiasem mówiąc, uwielbiam SQL między innymi za to, że da się to zrobić w tak prosty sposób). Pierwsze, co przychodzi do głowy w zetknięciu z nullem, to:
WYBIERZ WYNIK Z
2
PLUS
NIC
2 + nic daje nam… dalej 2. Ale muszę Ci powiedzieć, że tłumaczenie nie jest poprawne. Właściwe powinno brzmieć:
WYBIERZ WYNIK Z
2
PLUS
NIE WIEM
Jeśli więc do 2 dodamy nieznaną wartość, to otrzymamy… nieznaną wartość.
Wszystko nabiera sensu?
Przypomnij sobie teraz każdy z przykładów, które przytoczyłem, i zamiast traktować NULL jako nic, pomyśl o nim jako o nieznanej wartości, jako „nie wiem”.
W SQL-u mamy do czynienia z trójwartościową logiką (three-valued logic). Oznacza to ni mniej, ni więcej tyle, że oprócz standardowych wartości operacji prawda i fałsz istnieją jeszcze wartości nieznane. Takie założenie sprawia również, że jeśli zrobimy z wartością nieznaną cokolwiek bez wskazania, jak się zachować w przypadku napotkania nulla, to w większości przypadków nie czeka nas żaden NullReferenceException czy inna niespodzianka. Wynik będzie najzwyczajniej w świecie nieznany.
„Ile cebuli on kupił?”
„Kto?”
„Nie wiem!”
„To skąd mam wiedzieć, ile czegokolwiek kupił?!”
Wróćmy jeszcze na chwilę do jednego z przykładów, konkretnie tego, w którym sklejaliśmy poszczególne kolumny w pełne imię użytkownika.
SELECT
[Id],
[FirstName] + ' ' + COALESCE([MiddleName], '') + ' ' + [LastName] AS FullName
FROM [People]
Co robi COALESCE? Mówi nam, jak potraktować daną wartość, gdy nie znamy jej wartości. Po raz kolejny przetłumaczmy całość na język polski:
WYBIERZ
Id,
FirstName + spację + MiddleName lub pusty string, jeśli nie wiemy, jaki jest MiddleName + spację + LastName jako FullName
Z TABELI [People]
Prawda, że wszystko nabrało sensu?
Dlaczego tak jest? NULL odzwierciedla brak danych na jakiś temat. To, jak go potraktujesz, zależy już tylko od Ciebie. Jeśli założysz, że wszystkie Twoje dane z dowodu osobistego znajdują się w jednej tabeli, to brak, na przykład, peselu będzie najpewniej brakującą informacją. Powiedziałbym więc, że NULL jest jak najbardziej na miejscu. W przypadku gdy ktoś nie ma drugiego imienia, prawidłową wartością byłby raczej pusty nvarchar, bo żadne dane w rzeczywistości nie zostały pominięte.
W praktyce warto jednak pamiętać, że NULL w kolumnach może oznaczać zarówno brakujące dane, jak i ich faktyczny „pusty” stan.
Mam nadzieję, że było fajnie i zrozumiale. Postaram się też, aby było nieco częściej. Do przeczytania!
The post Null nullowi nierówny – czyli „nic” w SQL Server appeared first on devstyle.pl.
Dlaczego się ZAPUŚCIŁEM ??? [devstyle vlog #271]
The post Dlaczego się ZAPUŚCIŁEM ??? [devstyle vlog #271] appeared first on devstyle.pl.
May 7, 2019
Kwiecień 2019, czyli dalej spoko. Podsumowanie i raport finansowy.
Na swoim (nieaktywnym już) 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ń-plecień uplótł bardzo ciekawe wyniki.
Na dobry start miesiąca wystąpiłem na białostockiej scenie studenckiego festiwalu biznesowego BOSS z nową prezentacją “Marzenie przedsiębiorcy: to ja mam biznes, a nie biznes mnie.” Przygotowałem baaardzo dużo materiału na ten temat, mógłbym gadać przez 2 godziny non stop. Tutaj miałem godzinkę i… wyszło bardzo zacnie, choć sporo treści wyciąłem. Jeśli chcesz mnie – z biznesowym tematem – na swoim evencie to daj znać! :) Rok temu prawie przestałem występować, ale jednak bardzo to lubię i czasem na pewno będę chciał jeszcze coś gdzieś do kogoś pogadać.
W kwietniu zakończyło się też DevTalk Trio. Super przedsięwzięcie, BARDZO ciepło odebrane. Jeszcze raz dziękuję Andrzejowi i Sławkowi za udział oraz firmie Lingaro za wsparcie. Czuję ogromną satysfakcję, że udało się to tak sprawnie przeprowadzić. W dużej mierze dzięki mojej asystentce Ani, która koordynowała większość prac. Dzięki, Aniu!
Na początku kwietnia ogłosiliśmy też DNA – Drogę Nowoczesnego Architekta. Na razie na tym poprzestajemy, ale będzie się jeszcze działo! Już ponad 3 tysiące osób zostawiły nam swoje maile, wyrażając zainteresowanie proponowanymi treściami. Werynajs :). Teraz trwają prace “w tle”, a w czerwcu wracamy ze szczegółami!
Przed samą Wielkanocą udostępniłem mój Kurs Gita w ponownej sprzedaży. Po raz kolejny zainteresowanie było ogromne, dzięki czemu ten kurs zarobił już od września ponad pół miliona złotych! Co oczywiście musiało wygenerować trochę jadu, do którego się publicznie ustosunkowałem, ale to nic:
A na zakończenie miesiąca ogłosiłem Nabór, Rekrutację. Przyjmowanie zgłoszeń jest już zakończone i teraz trwają rozmowy z kandydat(k)ami. A to oznacza, że Będzie Się Działo. Niekoniecznie w Polsce. Niekoniecznie w IT. Ot, fantazje mnie różne ponoszą i teraz jest czas, by spróbować je wdrożyć w życie.
Jak teraz to piszę, to wydaje się, że tak strasznie dużo się wydarzyło w ciągu zaledwie jednego miesiąca. I faktycznie, tak było! Niemniej jednak ciągle udaje się utrzymać mój główny priorytet: nie przepracowywać się. Bo to do niczego dobrego nie prowadzi.
Nieustannie bardzo dużo czasu zajmuje mi ciągłe Poznawanie Siebie, jakkolwiek by to nie zabrzmiało. Podwoiłem liczbę wizyt u psychologa i wiele godzin tygodniowo poświęcam na Zagłębianie Się W Swój Łeb I Swą Jaźń ;). Zrobiło mi się z tego niby-hobby. “Dla mnie się podoba“. Tylko spokój może nas uratować. I w tym temacie planuję za jakiś czas LIVE na YT (taki co to będzie prawdopodobnie tylko raz, na żywo, bez nagrania).
No i teraz, jak zwykle: najpierw kasa, potem plany, potem linki.
Raport finansowy: przychody
Założenia:
pieniądze (brutto) wpływające na konto w bieżącym miesiącu
usługa mogła być zrealizowana w innym terminie
Pozycje:
książka “Zawód: Programista”: 3 253,85 zł
Kurs Gita: 161 264,59 zł
Działania marketingowe: 12 300,00 zł
W sumie: 176 818,44 zł
Raport finansowy: wydatki
Założenia:
kwota brutto, znikająca z konta, bez uwzględnienia odliczeń od podatków
Pozycje (linki afiliacyjne):
ZUS: 1 665,49 zł
zespół
księgowa: 356,70 zł
asystentka: 1 220,00 zł
montaż video: 480,00 zł
montaż audio: 320,00 zł
korekta tekstów: 28,00 zł
PIT-4: 430,00 zł
oprogramowanie strony DNA: 1 353,00 zł
prace graficzne (DNA i inne): 2 607,60 zł
biuro
czynsz: 631,97 zł
narzędzia i usługi
LibSyn: 76,52 zł
Shoplo: 60,27 zł
obsługa płatności online: 3 179,09 zł
telefon Orange: 50,00 zł
Vimeo: 0 zł (opłacone do 10/2019)
ConvertKit: 0 zł (opłacone do 09/2019)
LeadPages: 0 zł (opłacone do 10/2019)
CoSchedule: 0 zł (opłacone do 09/2019)
XMind Zen: 0 zł (opłacone do 03/2019)
Google Storage: 0 zł (opłacone do 11/2019)
DropBox: 0 zł (opłacone do 02/2020)
infakt: 0 zł (opłacone do 01/2020)
wFirma: 0 zł (opłacone do 09/2019)
ToDoist: 0 zł (opłacone do 11/2019)
Headspace: 0 zł (opłacone do 08/2019)
zdrowie
psychoterapia: 990,00 zł
opaska na oczy do spania: 99,91 zł
marketing
reklama Facebook: 11 416,54 zł
reklama Google: 0 zł
sponsoring: 1 230,00 zł
domeny
X (nowy projekt): 12,18 zł
sprzęt
MacBook Pro + słuchawki Sony: 405,13 zł (20 rat 0%)
DJI Osmo Pocket: 1 622,00 zł
karta SD: 119,99 zł
książki
William N. Thorndike “The Outsiders”: 87,80 zł
rozrywka
IT Startup Brudne Przetargi: 87,00 zł
wsparcie 1 autora na Patronite: 16,00 zł
książka “Zawód: Programista”
wysyłka: 751,53 zł
magazynowanie: 301,35 zł
samochód:
leasing: 1 774,56 zł
przegląd + zmiana kół: 530,00 zł
benzyna: 482,15 zł
parking SkyCash: 50,95 zł
myjnia: 110,00 zł
W sumie: 32 545,73 zł
Podsumowanie i plany
Wygląda na to, że po raz pierwszy moje przychody przekroczą milion złotych w ciągu nieprzerwanego cyklu 12 miesięcy (a nawet 9 miesięcy!). Raduję się z tego powodu, a co!
Najwięcej kasy wydałem w tym miesiącu na reklamy Facebookowe. Ale zainwestowane 11 tys wygenerowało ponad 60 tys przychodu w 5 dni. Dobry przelicznik jak na moje standardy :).
Po takim ładnym wyniku postanowiłem – za namową Korsana – zrobić upgrade swojego sprzętu do VLOGowania i zakupiłem DJI OSMO Pocket. Całkiem spoko daje radę, choć pewnie nigdy nie wykorzystam w pełni jego możliwości. I nie czuję się z nim jeszcze tak naturalnie jak z iPhonem SE, ale… próbuję dalej.
To tyle jeśli chodzi o podsumowanie. A plany?
Takie dalsze to… to na razie nieważne, bo do tej pory możemy wszyscy umrzeć. A najbliższe – czyli na maj – są proste. Uruchomić Program Skutecznej Nauki Podstaw Frontendu: Co Ten Frontend! Startujemy 20 maja. Ponad 500 osób skusiło się na dołączenie do niego, kupując swój bilet już w marcowej przedsprzedaży, i teraz będzie kolejna szansa, żeby się frontu nauczyć z najlepszego źródła.
Zapisz się na WTF na stronie http://cotenfrontend.pl! Startujemy 20 maja :).
Jest już agenda, są terminy, jest wszystko. Jaramy się z Korsanem bardzo. Chodźcie! A cena w sprzedaży powinna zaskoczyć swoją… dostępnością. Ale to jeszcze na razie ćććśśśś.
Wkrótce poopowiadam też na VLOGu dlaczego zostałem “wydawcą” i dlaczego to jest dobre dla wszystkich stron (mnie, autorów i Klientów).
Słoneczko świeci nad Białymstokiem, jak bardzo radośnie.
Podsumowanie aktywności devstyle 04/2019
W kwietniu sporo się działo, ale “prawdziwy” tekst – tylko jeden. I to nie mój. Bartek Klimczak wystartował na devstyle z cyklem o języku GO, jeah!
Za to sporo VLOGów, i podcastów też.
Niestety znowu nie udało się wdrożyć nowego szablonu, który zamówiłem równo ROK temu. Tym razem z powodu – nie uwierzycie! – znikających maili. Bez kitu, wysłane i niedochodzące… Ale #takilajf. W maju może wreszcie się uda, a sam szablon przyda się pewnie też przy innych inicjatywach.
Teksty
Kurs golang #1: Intro – (BARTŁOMIEJ KLIMCZAK)
Rekordowy Marzec 2019: podsumowanie i raport finansowy.
Podcasty (i inne audio)
DevTalk #94 – O Kubernetes z Karolem Stępniewskim
DevTalk #93 – O PowerBI z Katarzyną Kulikovich
DevTalk Trio S02E13 – Nasze plany na przyszłość
DevTalk #92 – O błędach w tworzeniu WWW z Tomaszem “Comandeer” Jakutem
VLOGi
Akcja: REKRUTACJA. Pracuj ze mną przez wakacje! [devstyle vlog #269]
PÓŁ MILIONA złotych, czyli Banda DEBILI [devstyle vlog #268]
ZADOWOLENIE (czyje?) [devstyle vlog #267]
ROZCZAROWANIE (?) [devstyle vlog #266]
TERAPIA, mandaty, ŻONA… Q&A! [devstyle vlog #265]
Programista z POWOŁANIA [devstyle vlog #264]
RZYGAM programowaniem (i chyba WIEM DLACZEGO) [devstyle vlog #263]
Kim jest Architekt Oprogramowania? [devstyle vlog #262]
Jedyne MOTTO życiowe [devstyle vlog #261]
Najlepszy na świecie [devstyle vlog #260]
Różyczka [devstyle vlog #259]
INFLACJA vs Aniserowicz: 1:X [devstyle vlog #258]
Inne video
Q&A i Podsumowanie Tygodnia Sprzedaży Kursu Gita
Wyjazdy / konferencje
BOSS Festival, Białystok (“Marzenie przedsiębiorcy: to ja mam biznes, a nie biznes mnie.”)
4Developers 2019 / Warszawa (uczestnik / członek Rady Programowej)
====
Dzięki za uwagę i pozdro!
P.S. Jak zwykle, jeśli masz jakiekolwiek pytania: nie wahaj się, tylko je zadawaj! Na co mogę, na to odpowiem :).
The post Kwiecień 2019, czyli dalej spoko. Podsumowanie i raport finansowy. appeared first on devstyle.pl.
May 6, 2019
Dlaczego NIE NEGOCJUJĘ? I inne pytania do mojej rekrutacji [devstyle vlog #270]
The post Dlaczego NIE NEGOCJUJĘ? I inne pytania do mojej rekrutacji [devstyle vlog #270] appeared first on devstyle.pl.
May 5, 2019
DevTalk #95 – O Sztucznej Inteligencji z Krzysztofem Sopyłą
Witajcie ludzkie istoty! Maszyny. Maszyny wszędzie. I same myślą! Matrix i Terminator. Czyli sztuczna inteligencja zaprzęgnięta na potrzeby hollywoodzkich hitów. Jak jednak wygląda realnie sprawa myślenia maszyn?
Na co dzień mamy do czynienia ze sloganami rzucanymi przez największe korporacje, jak Google, Microsoft, Apple, Samsung, czy Huawei, dotyczącymi tego, jak dobrze ich oprogramowanie uczy się nas, użytkowników ich urządzeń. Siri, asystent Google, czy Alexa coraz częściej oferują nam pomoc i odciążają, służąc za asystentów codziennych zadań. Na stronach internetowych coraz częściej rozmawiamy z botami, a nie żywymi ludźmi. Ich twórcy szumnie nazywają cały mechanizm komunikacji z użytkownikiem docelowym Machine Learningiem i stawiają na równi ze sztuczną inteligencją. Jeśli chcecie dowiedzieć się, dlaczego nie mówią prawdy i czym jedno zagadnienie różni się od drugiego, dzisiejsza rozmowa z moim gościem rozwieje wszelkie wasze wątpliwości.
O sztucznej inteligencji rozmawiam z dr Krzysztofem Sopyłą, CEO firmy Ermlab Software, naukowcem i przedsiębiorcą. Krzysztof pragnie tworzyć i wdrażać nowe produkty i usługi wykorzystujące uczenie maszynowe. Wierzy, że sztuczna inteligencja pozwoli wzmocnić nasze umiejętności i uwolni nas od monotonnej pracy. Oprócz tego jest współtwórcą zamknietego startupu PLON.io (Data Science Sandbox). Obecnie rozwija portale GoodWrite i CoDoCzytania. Swoimi przemyśleniami dzieli się na swoim blogu.
Jeśli słyszeliście cokolwiek na temat testu Turinga, CAPTCHA, Chińskim pokoju, teście Voight-Kampffa (ha!), czy coś Wam się obiło o uszy na temat sieci neuronowych i uczenia maszynowego, to moja rozmowa z Krzysztofem poszerzy znacznie waszą dotychczasową wiedzę. Może dzięki temu odcinkowi zainspirujemy kogoś do stworzenia pierwszej silnej sztucznej inteligencji, która być może nie będzie chciała usunąć rasy ludzkiej z powierzchni ziemi?
Tymczasem zapraszam serdecznie do odsłuchania naszej rozmowy!
Czekam na Twoje gwiazdki i opinie na iTunes! To bardzo motywuje :). Dzięki!
I… PLAY!!
http://traffic.libsyn.com/devtalk/DevTalk_95_-_O_Sztucznej_Inteligencji_z_Krzysztofem_Sopy.mp3
Montaż odcinka: Krzysztof Śmigiel.
Ważne adresy:
zapisz się na newsletter
zasubskrybuj w iTunes, Spotify lub przez RSS
ściągnij odcinek w mp3
Linki:
Krzysztof
Blog
Ermlab
Co do czytania
GoodWrite
DevTalk#64 – O Machine Learning z Vladimirem Alekseichenko
DevTalk#55 – O Pythonie z Łukaszem Langa
DevTalk#27 – O R z Basią Fusińską
DevTalk#60 – O botach z Jackiem Kolonko
Open AI
Amazon Mechanical Turk
PyTorch
Tensorflow
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 #95 – O Sztucznej Inteligencji z Krzysztofem Sopyłą appeared first on devstyle.pl.
April 29, 2019
Akcja: REKRUTACJA. Pracuj ze mną przez wakacje! [devstyle vlog #269]
The post Akcja: REKRUTACJA. Pracuj ze mną przez wakacje! [devstyle vlog #269] appeared first on devstyle.pl.
April 28, 2019
Kurs golang #1: Intro
Golang staje się coraz bardziej popularny. Kusi szybkością, prostotą składni oraz skalowalnością. To plusy, koło których bez wątpienia nie można przejść obojętnie.
Jestem Bartek i zajmuję się programowaniem od prawie 10 lat. Bloguję oraz organizuję Meetup w Krakowie na temat golang. W tym kursie przybliżę Wam składnię języka oraz niektóre mechaniki działające pod spodem, a także pokażę, jak się z niego korzysta w prawdziwych aplikacjach, nie tylko w tutorialach. Zanim jednak przejdziemy do samego języka, porozmawiajmy o jego zastosowaniu.
Zastosowanie
Golang jest kompilowanym językiem programowania. To znaczy, że nie posiada żadnego interpretera – tak jak PHP, Python czy Ruby – oraz nie działa na wirtualnej maszynie jak C# czy Java. Kompiluje się go do języka maszynowego, co pozwala osiągnąć bardzo dużą wydajność. W przeciwieństwie do C oraz C++, które też są kompilowane, golang wyróżnia się tym, że posiada Garbage Collector (GC).
Garbage Collector to (w wielkim skrócie) metoda automatycznego zarządzania dynamicznie przydzielaną pamięcią. Dzięki temu nie musimy myśleć o zwalnianiu pamięci za każdym razem, gdy tworzymy nową zmienną dynamicznie. Pomaga to w uniknięciu – często bardzo trudnych do znalezienia – wycieków pamięci. Możemy więc zapomnieć o takim kodzie jak poniżej:
int *p = new int;
float *r = new float(75.25);
int *q = new int[n];
// freed the allocated memory
delete p;
delete r;
// freed the block of allocated memory
delete[] q;
(Więcej o Garbage Collectorze posłuchasz w tym odcinku podcastu DevTalk).
Gdzie golang sprawdza się najlepiej? Bez wątpienia jego mocną stroną są zastosowania w infrastrukturze. Coraz więcej aplikacji mających za cel wspomaganie infrastruktury bądź programistów jest pisanych właśnie za pomocą tego języka. Przykładem może być choćby Docker.
Instalacja oraz IDE
Instalacja kompilatora jest stosunkowo prosta. Na systemach z rodziny Linux/Unix wystarczy skorzystać z managera zależności.
brew install go #macOS
apt install golang #ubuntu
W przypadku środowiska Windows trzeba wykonać kilka kroków:
pobrać instalator ze strony https://golang.org/dl/,
dokonać instalacji, postępując zgodnie z instrukcjami,
stworzyć folder, w którym będą umieszczane aplikacje. Może to być np. C:\Projects\Go,
ustawić zmienną środowiskową GOPATH, tak aby wskazywała na ten właśnie folder.
Jako edytor polecam GoLand, Sublime Text bądź Atom. Oczywiście każdy inny program, który pozwala edytować pliki w kodowaniu UTF-8, się sprawdzi, jednak największą wygodę oferuje IDE od IntelliJ.
Pierwsze kroki
Zaczniemy od stworzenia katalogu z projektem. Folder ten powinien znajdować się wewnątrz $GOPATH/src. Oczywiście proste przykłady będą działać w każdym innym miejscu, lecz niektóre managery zależności mogą wtedy nie funkcjonować. Stwórzmy więc nowy folder $GOPATH/src/gocourse/first, a następnie plik main.go.
Pierwszy program
Umieść w pliku main.go zawartość listingu poniżej. Omówimy teraz pokrótce każdą z linijek. Linia nr 1 zawiera nazwę pakietu, w którym operujemy. Nazwaliśmy ten pakiet main, ponieważ tylko ten pakiet może zostać uruchomiony. Linia nr 3 zawiera import zewnętrznego pakietu, jakim jest fmt. Pakiet ten zawiera m.in. zestaw funkcji formatujących tekst oraz operujących na standardowym wejściu/wyjściu.
package main
import "fmt"
func main() {
fmt.Println("Hello world, gophers!")
}
Dalej znajduje się funkcja main(), od której zaczyna się wykonywanie programu. W jej wnętrzu znajdziemy tylko jedną instrukcję odpowiedzialną za wyświetlanie na standardowym wyjściu (terminalu) napisu „Hello world, gophers!”.
Uruchomienie programu
Aby uruchomić nasz program, musimy wykonać jedną z kilku operacji.
Jeżeli korzystamy z GoLand od IntelliJ, możemy po prostu kliknąć zielony trójkąt, taki jak na obrazku poniżej. W tym przypadku nasze IDE wykona za nas polecenie, które opiszę za chwilę, i wyświetli wbudowany terminal z wynikiem działania programu.
Innym sposobem jest użycie linii poleceń. I tutaj możemy wybrać jedną z dwóch dróg: zbudować aplikację i uruchomić plik binarny albo kazać kompilatorowi wykonać obie operacje za nas za jednym razem.
Budowanie jest bardzo proste – wystarczy wykonać poniższe polecenie, a naszym oczom pokaże się nowy plik o nazwie main(.exec), który możemy uruchamiać jak każdy inny program.
go build main.go
./main
Drugie polecenie wykonuje obie te operacje za jednym razem, lecz nie pozostawia po sobie pliku binarnego. Jednym słowem buduje program oraz go uruchamia w locie.
go run main.go
Podsumowanie
Gratuluję, zostałeś gopherem! Dzisiaj skonfigurowałeś swoje środowisko pracy, napisałeś pierwszy program w języku golang oraz nauczyłeś się go uruchamiać. Jak być może zauważyłeś, drogi Czytelniku, kod źródłowy przypomina trochę język C/C++. I rzeczywiście pod wieloma względami jest bardzo podobny, lecz golang ma prostszą składnię oraz zestaw mechanizmów, które ułatwiają programowanie. To właśnie one zostaną tematem kolejnych artykułów.
Więcej moich artykułów (nie tylko związanych ściśle z Go) znajdziesz na moim blogu developer20.com.
The post Kurs golang #1: Intro appeared first on devstyle.pl.
April 24, 2019
PÓŁ MILIONA złotych, czyli Banda DEBILI [devstyle vlog #268]
The post PÓŁ MILIONA złotych, czyli Banda DEBILI [devstyle vlog #268] appeared first on devstyle.pl.
April 18, 2019
ZADOWOLENIE (czyje?) [devstyle vlog #267]
The post ZADOWOLENIE (czyje?) [devstyle vlog #267] appeared first on devstyle.pl.
Maciej Aniserowicz's Blog
- Maciej Aniserowicz's profile
- 22 followers
