O książkach – tym razem programistycznych

Ostatnio coraz częściej na stronie wydawnictwa PacktPub pojawiają się ciekawe ebooki w wersjach całkowicie darmowych – dzisiaj jest to książka „Git Best Practices Guide” a wczoraj była to „Mastering C# Concurrency”. Dlatego też postanowiłam dziś przypomnieć o tej stronie, ponieważ warto mieć w zakładkach podstronę tego wydawnictwa, która codziennie proponuje nową darmową książkę – link. Staram się tam zaglądać codziennie aby nic mi nie umknęło, ale bywają i dni, kiedy ktoś mi przypomina o tym, że jest coś fajnego. Co jakiś czas pojawiają się też akcje tematyczne – na przykład tydzień z Linuxem, JavaScriptem czy tworzeniem gier. Można wtedy wyhaczyć całkiem fajne książki za darmo.

Oprócz tego PacktPub ma również sekcję „Forever Free eBooks”. Znajduje się tam zbiór książek na temat tworzenia aplikacji webowych – HTML JavaScript, Node.js a także Aplikacji oraz Big Data – Python, R, Machine Learning i Docker.

Kolejnym źródłem darmowych książek, które chciałabym Wam dzisiaj polecić jest strona Syncfusion. U nich znajdziemy ponad 100 darmowych książek, których zaletą jest to, że zawierają zawsze dokładnie około 100 stron.  Jest to naprawdę fajne jeśli chcemy szybko wejść w jakiś temat bądź coś sobie przypomnieć. Biblioteczka jest bardzo przekrojowa – są tam książki zarówno traktujące ogólnie o programowaniu, jak również bardziej specyficzne – na temat C# czy JavaScript. Jest w czym wybierać.

A Wy jakie znacie źródła (legalne) darmowych ebooków z dziedziny IT?

Pierwszy commit;) – Jupyter Notebook

W ostatnim czasie udało mi się przerobić całkiem fajny tutorial na Kaggle.com, który uczy podstaw machine learning na przykładzie pasażerów Titanica i przewidywania, którzy mieli szansę na przetrwanie. Tutorial nazywa się Titanic: Machine Learning from Disaster i pozwala on na przejście całego procesu od przetworzenia zbioru danych do uzyskania wyników, które możemy wysłać na serwer Kaggle w celu zrobienia sobie portfolio.

Ponieważ moim celem w ramach tegorocznego Daj się poznać jest właśnie wrzucenie swoich właśnych „prognoz” na Kaggle do zadania „Partly Sunny with a Chance of Hashtags” taki tutorial bardzo mi pomógł w zrozumieniu co i jak po kolei. Jest tam jednak parę rzeczy, które muszę bardziej zgłębić, by wiedzieć co robię a nie tylko odtwarzać. Jednak w tym świetnie pomaga mi uczenie się na Dataquest o którym już tutaj wspominałam.

Po przerobieniu tutoriala z Titanica moim pierwszym krokiem było przeniesienie instrukcji z tutoriala do notesu Jupyter aby później móc na tym pracować już moim zbiorem danych. Okazało się jednak, że to nie było takie proste, ponieważ po pierwsze po instrukcji:

predictions[predictions > .5] = 1
predictions[predictions <=.5] = 0

dostałam informację: „FutureWarning: in the future, boolean array-likes will be handled as a boolean array index app.launch_new_instance()” Na szczęście to póki co ostrzeżenie, więc nie szukałam w tym momencie rozwiązania dla tego problemu.
Gorzej było, gdy po instrukcji:

alg = LogisticRegression(random_state=1)

pojawiło się:

NameError Traceback (most recent call last)
in ()
----> 1 alg = LogisticRegression(random_state=1)

NameError: name 'LogisticRegression' is not defined

Na szczęście okazało się, że wystarczy instrukcję zamienić na:

alg = linear_model.LogisticRegression(random_state=1)

Jednak w tutorialu nic takiego potrzebne nie było;) No ale na szczęście wszystko ostatecznie poszło szybko i sprawnie. Tak więc krok po kroku posuwam się coraz dalej. Jednak już wiem, że temat Data science jest tak ogromny, iż jeśli nie zwiększę ilości czasu jaki mu poświęcam, zgłębienie go zajmie mi dłużej niż bym chciałą. Ale nie przeszkadza mi to zbytnio, bo jest to bardzo ciekawe!

No i udało się też wrzucić wreszcie coś sensownego do Gita – czyli mój Jupyter Notebook z póki co rozwiązaniem do kwestii Titanica.

Historia zmian danej funkcji w Git

Jeśli używamy Gita na pewno znamy polecenie

git log

które to wyświetla nam historię zmian w repozytorium. Jednak polecenie to ma pewną ciekawą możliwość, którą daje nam przełącznik -L. Mianowicie wówczas możemy podać nazwę metody oraz nazwę pliku i wyświetli nam się cała historia, ale dotycząca zmian w tej konkretnej metodzie. Jest to naprawdę wygodne, gdy chcemy dokładnie przyjrzeć się zmianom tylko w jednym miejscu bez przedzierania się przez rozbudowane porównywanie i całe pliki. Mój przykładowy plik Demo.cs wygląda tak:

using System;

public class Demo
{
	public void Demo()
	{
		// Here is the third change
	}
}

Wywołanie polecenia gita:

git log -L :Demo:Demo.cs

Zwróci coś takiego:

commit b37ad38a5ebc75e0b54f036e137832368fae754f
Author: Maga 
Date:   Sun Apr 16 21:50:47 2017 +0200

    next change

diff --git a/Demo.cs b/Demo.cs
--- a/Demo.cs
+++ b/Demo.cs
@@ -3,7 +3,7 @@
 public class Demo
 {
-       public static void Main()
+       public void Demo()
        {
                // Here is the third change
        }
 }
\ No newline at end of file

commit fadf9afd23f8008e3514f183a9873442dcd597d1
Author: Maga 
Date:   Sun Apr 16 21:50:25 2017 +0200

    next change

diff --git a/Demo.cs b/Demo.cs
--- a/Demo.cs
+++ b/Demo.cs
@@ -3,7 +3,7 @@
 public class Demo
 {
        public static void Main()
        {
-               // Here is the second change
+               // Here is the third change
        }
 }
\ No newline at end of file

commit be56749b09a606f0137c993d0df03fa336e88701
Author: Maga 
Date:   Sun Apr 16 21:48:03 2017 +0200

    Second change

diff --git a/Demo.cs b/Demo.cs
--- a/Demo.cs
+++ b/Demo.cs
@@ -3,7 +3,7 @@
 public class Demo
 {
        public static void Main()
        {
:
 {
        public static void Main()
        {
-               // Here is the second change
+               // Here is the third change
        }
 }
\ No newline at end of file

commit be56749b09a606f0137c993d0df03fa336e88701
Author: Maga 
Date:   Sun Apr 16 21:48:03 2017 +0200

    Second change

diff --git a/Demo.cs b/Demo.cs
--- a/Demo.cs
+++ b/Demo.cs
@@ -3,7 +3,7 @@
 public class Demo
 {
        public static void Main()
        {
-               // Here is the first change
+               // Here is the second change
        }
 }
\ No newline at end of file

commit bb7f033cdc9edce4eed0f7c30031b50d2cfc99d5
Author: Maga 
Date:   Sun Apr 16 21:47:46 2017 +0200

    First change

diff --git a/Demo.cs b/Demo.cs
--- a/Demo.cs
+++ b/Demo.cs
@@ -0,0 +3,7 @@
+public class Demo
+{
+       public static void Main()
+       {
+               // Here is the first change
+       }
+}

Są tutaj zmiany uporządkowane od najnowszych od najstarszych. W moim demonstracyjnym przypadku zmiany polegały jedynie na zmianie komentarza a następnie nazwy metody, ale oczywiście w prawdziwych plikach będzie tego dużo więcej. W konsoli jest to oczywiście wszystko podświetlone – zmiany usunięte są napisane czerwoną czcionką dodane zieloną.

Skąd brać dane do projektów data science? Czyli webscraping.

Webscraping – co to takiego?

Jest to proces automatycznego pobierania stron internetowych i wyciągania z nich interesujących nas informacji. Ponieważ dzieje się to automatycznie zajmuje to oczywiście mniej czasu niż gdybyśmy to chcieli zrobić ręcznie.

Od czego zacząć?

Najważniejsze co musimy zrobić chcąc skorzystać z danych umieszczonych na jakiejś stronie to upewnienie się, że jej warunki użytkowania nam na to pozwalają.
Jeśli już mamy taką stronę, której zawartość możęmy wykorzystać musimy się zastanowić jakie dane są nam potrzebne. Nastepnie z pomocą przyjdzie nam opcja Inspect (Zbadaj) w przeglądarce. Pozwoli nam ona w wygodny sposób przejrzeć strukturę HTML.

Kiedy ustalimy strukturę stron, które nas interesują jesteśmy gotowi napisać automat. W Pythonie z pomocą przyjdą nam takie biblioteki jak:

URLOPEN

Jest to funkcja modułu urllib.request, który umożliwia pobieranie stron z danego URL. Korzystamy z niej w bardzo prosty sposób:

page = urlopen("Url którego zawartość chcemy pobrać).read()

W ten sposób w zmiennej page mamy zawartość danej strony.

BEAUTIFULSOUP4

Ta biblioteka ułatwia przechodzenie po strukturze HTML. Na przykład, by wybrać wszystkie punkty danej listy wywołamy coś takiego:

data = BeautifulSoup(html, "lxml")
listelements = data.find_all("li")

Gdy już będziemy mieli dane, to możemy użyć biblioteki pandas, o której już tutaj wspominałam. Pozwala ona analizować dane w bardzo wygodny sposób.

Mogą nam się również przydać wyrażenia regularne i tutaj z przyda nam się operator Re, który również znajdziemy w Pythonie.  Pozwala on między innymi na wyszukiwanie i dopasowywanie tekstów do wzorca.

Kiedy już zdobędziemy dane, wyciągniemy co trzeba, obrobimy by format nam odpowiadał możemy użyć klasy DictWriter aby zapisać je w formacie CSV albo modułu do Sqlite by zapisać dane w bazie.

Łamigłówki dla programisty

Dzisiaj taki dość przyjemny temat na niedzielny wieczór. Mianowicie o tym co lubię robić, kiedy mam chwilę czasu i chęć na poćwiczenie umysłu. Otóż moim ulubionym przedmiotem w szkole była matematyka a algorytmy to jedna z rzeczy, które najbardziej mnie interesowały na studiach. Niestety w pracy w tym momencie nie wykorzystuję zbytnio tych „algorytmów akademickich”, ale staram się by w mojej głowie nie zaśniedziały one za bardzo.

Matematyka i algorytmy

Już wiele lat temu znalazłam stronę „Project Euler”, która to zawiera zbiór problemów matematycznych (w tym momencie około 600). Rozwiązanie polega po prostu na wpisaniu poprawnej odpowiedzi w okienko. Zadania mają przypisany stopień trudności, więc możemy wybrać sobie łatwiejsze bądź trudniejsze.

Tak jak wspomniałam – strona ta istnieje już bardzo długo, a w międzyczasie, szczególnie ostatnio, pojawiło się dużo podobnych a nawet o wiele fajniejszych.

Zadania z rekrutacji

Wydaje mi się, że tego typu zadania zyskały dużą popularność wraz z powstaniem Codility – jest to strona często wykorzystywana przez firmy jako jeden z procesów rekrutacji programistów. Choćby z tego powodu warto się z nią zapoznać oraz z typami zadań jakie tam są. Jest duża szansa, że z czymś podobnym spotkacie się w przyszłości.
Na czym to polega? Macie jakieś zadanie typu znaleźć cyfrę, która nie znajduje się w podanej tablicy – np. w tablicy [3, 2, 5, 1] nie znajduje się 4. Rozwiązanie trzeba zakodować w wybranym przez Was języku – oczywiście z tych dostępnych na platformie. Następnie rozwiązanie jest automatycznie weryfikowane pod względem poprawności i wydajności. Czasem kluczem do rozwiazania jest tylko poprawność a kiedy indziej wydajność. Warto zatem mieć w głowie kilka możliwych sposobów rozwiązania zadania.

Pomijając praktyczne wykorzystanie wiedzy algorytmicznej przy zdobywaniu nowej pracy, uważam że tego typu portale dostarczają naprawdę fajnych łamigłówek i jeśli ktoś lubi coś takiego, może miło spędzić czas. Co więcej – o ile początkowo zadania idą jak po grudzie, zwłaszcza jeśli studia mamy dawno za sobą, to po rozwiązaniu ich już kilkunastu czy kilkudziesięciu idzie nam to zdecydowanie szybciej. Generalnie wszystko sprowadza się do zapamiętania pewnych wzorców postępowania i zdobycia sprawności w ich stosowaniu.

Platform, gdzie możemy rozwiązywać algorytmiczne zadania jest całkiem sporo i ja sama mam już duży problem z tym, które wybrać. Ostatnio spędzam czas głównie na HackerRank oraz Codewars.

Co ciekawego jest na HackerRank?
  • Sporo zadań ze wspomnianego Project Euler
  • Ścieżka Cracking the Coding Interview – czyli bardzo fajny zbiór zarówno filmów jak i zadań, które objaśniają tematy często poruszane na rozmowach kwalifikacyjnych. Filmy są zrealizowane przez Gayle Laakmann McDowell, autorkę książki „Cracking the Coding Interview” w której na konkretnych zagadanieniach pomaga przygotować się do niemalże każdego procesu rekrutacyjnego od strony technicznej i nie tylko. Gayle jest też założycielką portalu CareerCup, gdzie użytkownicy wrzucają pytania z rekrutacji w których brali udział.
  • Niektóre firmy – w tym momencie Booking.com wystawiają tam swoje zadania, których rozwiązanie jest tożsame z aplikacją do firmy i jednocześnie pierwszym etapem rekrutacji.
  • Zadania są zgrupowane według ścieżek – np Algorytmy, Matematyka, Struktury danych, SQL a także języków – w ten sposób łatwiej można dotrzeć do tematyki, która nas interesuje
  • Cyklicznie organizowane są też różnego rodzaju zawody z nagrodami
    Co ciekawego jest na Codewars?
  • Tutaj zadania to tzw Kata, których trudność określana jest ilością kyu – czyli mamy taki trochę japoński klimat.
  • Grupowanie zadań określają nam tagi, który jest cała masa – Algebra, Geometry, Integers, Loops, Binary itd
  • Głównym przeznaczeniem tej strony jest ćwiczenie pewnych „kata” czyli różnych powtarzalnych w pracy programisty czynności najlepiej w różnych językach aby tym bardziej gimnastykować umysł

Ale to tylko dwa serwisy z całej masy i ciągle mi szkoda, że nie mam tyle czasu, by spędzać go w większym stopniu na tego typu zadaniach.

Inne portale

CodeFights – również duży zbiór zadań przygotowujących do rozmów kwalifikacyjnych, rywalizacja z innymi użytkownikami
LeetCode – dość ważna strona jeśli myślicie o aplikacji do Google, Amazon czy Facebook itp – znajdują się tam zadania z prawdziwych rekrutacji, więc jest szansa, że traficie na któreś z nich w swoim procesie rekrutacyjnym.
CodeEval – tutaj też czekają nas różne rankingi i rywalizacje

Dość ciekawą opcją są też nieco starsze:

Polski SPOJ
Orginalny SPOJ
Timus Online Judge
MasterCoder – z tej osobiście jeszcze nie korzystałam, ale zapowiada się ciekawie

Nie można też zapomnieć o potyczkach algorytmicznych czyli corocznym konkursie w którym rozwiązuje się różne ciekawe zadania.

Zachęcam do korzystania z tych portali, ponieważ nasze szare komórki również potrzebują nieco treningu od czasu do czasu:) A może Wy kojarzycie jeszcze inne fajne strony? Zachęcam do komentowania!