sobota, 8 listopada 2014

Pożyteczne narzędzia - graphviz

Przez przypadek właściwie, szukając jakiegoś przyjemnego rozwiązania na wypisywanie drzew BST znalazłem wzmiankę o pakiecie graphviz, który tworzy piękne obrazki z plików tekstowych zawierających ich opis w pewnym składniowo podobnym do C metajęzyku.

Narzędzie to może być bardzo użyteczne przy wizualizacji wszelkich grafów, workflow programów albo innych śmiesznych zastosowań, na które jeszcze nie wpadłem. Ogółem bardzo mi się podoba w zamyśle. Świetna rzecz do ilustracji tego jak działają struktury wskaźnikowe (listy czy jakieś tablice mieszające) więc może się przydać do prezentacji jako graficzny dodatek do tekstu złożonego w TeX'u.

Z czym to się je?

W Debianie wystarczy sobie wpisać:

#aptitude install graphviz

I wszystko powinno pięknie się zainstalować. Paczka składa się z wielu programów dla mnie na razie najważniejszy wydaje się dot służący do robienia grafów skierowanych (btw podoba mi się modularność tego pakietu, dzięki temu mamy ułatwione zadanie czytając manuala do tych mniejszych jego części).

 
 Z poniższego kodu, który umieścimy sobie w jakimś pliku np. graph.gv
digraph G{
       node [shape=record, height=.1]
       56->44;
       56->70;
       44->35;
       70->69;
       70->80;
       35->23;
}
Możemy po użyciu następującej komendy terminalowej :
$dot -Tgif graph.gv -o graph.gif
Stworzyć sobie taki oto obrazek z drzewem BST.



Oczywiście można tworzy daleko bardziej rozbudowane opisy, które będą powalać swoją dokładnością. W moim wypadku było jednak potrzebne proste wypisywanie drzewa, które zaszyłem sobie w programie w taki sposób, że po przetworzeniu przez dot'a dostaję fajną graficzną reprezentację.

Further reading:

http://www.graphviz.org/pdf/dotguide.pdf

środa, 20 sierpnia 2014

Pożyteczne narzędzia - youtube-dl

Natknąłem się na ciekawy programik terminalowy - mianowicie youtube-dl. Pewno dla większości już sama nazwa powie dużo o jego możliwościach - tak służy do pobierania z różnych serwisów streamujących wideo filmików.

Po więcej info zachęcam do przejrzenia man'a dla tego programu, ale mogę wyszczególnić jedną fajną funkcję - zgrywanie samego audio.

Przewrotnie etykietuje jako linux, ale jest to projekt crossplatformowy, więc jak ktoś ma OSX czy Windows'a to sobie może wersję dla swojego systemu również znaleźć (jednak już chyba tylko na githubie projektu).

Instalacja na debianie w gałęzi sid jest banalnie prosta wystarczy :

#aptitude install youtube-dl
(instalacja w stable wymaga ściągnięcia skryptu ze strony twórców)
$sudo wget https://yt-dl.org/downloads/2014.09.04.1/youtube-dl -O /usr/local/bin/youtube-dl
$sudo chmod a+x /usr/local/bin/youtube-dl

I menadżer już sam za nas załatwi sprawę z zależnościami :) 
[Przekonany jestem, że w systemach Fedoro-pochodnych pewnie też się da do niego dokopać yum 'em czy co tam jest :)]
Istnieje oczywiście możliwość ściągnięcia sobie kodu i skompilowania własnej binarki. Wszytko na stronie projektu.

No i cóż, po instalacji polecam przetestować! Naprawdę świetna rzecz, szczególnie jak mamy laptopa, czas i zero sieci w okolicy, a YouTube to nie tylko koty i kompilacje wypadków. (Polecam kanał MITOpenCourseware).


Jak się to je w skrócie?

Powiedzmy, że nas zaintrygował ten film :
 

Wystarczy, że wklepiemy sobie taki kod w konsolę: 


$youtube-dl https://www.youtube.com/watch?v=0M_kIqhwbFo -o "/folder/docelowy/%(title)s"

Co nam to zrobi? Ściągnie plik do katalogu /folder/docelowy/ i nazwie go tak jak nazywa się filmik na YouTube.
Prawda, że przyjemne? ;) 

niedziela, 20 lipca 2014

Projekt na wakacje 2014 : Wikibooks!

Jak można przeczytać we wcześniejszym poście, troszkę mi się w tym roku powinęła noga, no i czeka mnie kampania wrześniowa. Jednak postanowiłem, że przynajmniej jak już mam się do niej uczyć, to zrobię coś też dla innych ;)

W ramce obok poniżej maina znajdują się linki do mojej (na razie bardziej planowanej pracy) na te wakacje. A mianowicie do książek w serwisie Wikibooks! Osobiście, bardzo podoba mi się cały pomysł stojący za tym projektem, o czym wspominałem też wcześniej, w pierwszych postach. Dopiero teraz myślę, że jestem na tyle kompetentny, żeby do pracy zabrać się samemu.

Jak dla mnie najlepszą formą nauki jest nauczanie, a czy pisanie w zasadzie notatek w formie książki, gdzie starasz się jak najprzystępniej przedstawić temat nie jest najlepszym rozwiązaniem? Szczególnie, że zawsze będzie można do nich wrócić i odświeżyć wiedzę, gdy tylko będzie to potrzebne.

Mam nadzieję, że do następnych wakacji uda mi się rozprawić ze wszystkimi podręcznikami, które chciałbym napisać. I stworzyć z tego coroczną tradycję, żeby:
 a) dzielić się wiedzą
 b) zrobić coś, co będzie dla mnie rozwijające.

Tak właśnie myślę o tym, żeby skończyć w większości :
A do tego napisać, bardziej jako projekt poboczny niemniej ciekawy:
Gorąco zachęcam do pomocy, a ponadto polecam tego typu rozrywki w wolnym czasie, bo bez ćwiczeń, jak każdy mięsień, mózg też będzie się kurczyć ;)

piątek, 18 lipca 2014

Studia na Uniwersytecie Jagiellońskim. Rok I

Mamy teraz lipiec. Zanosiłem się z napisaniem tego postu od bardzo dawna, chyba od grudnia. Przeżyłem jedną sesję zimową, a teraz jeszcze walczę w sesji letniej, więc myślę, że mam już całkiem niezły ogląd sytuacji.

W zamyśle chciałem napisać coś takiego, jeszcze przed pierwszą sesją :

Od października mam to szczęście,  że mogę studiować na najstarszej uczelni w naszym kraju. Dodatkowo, mogę studiować kierunek, który nie tylko jest niezwykle rozwijający, ale również, jak się zdaje, przyczyni się do tego, że będę mógł znaleźć pracę w zawodzie po studiach. A mianowicie informatykę.
Nie będę wchodził w spór na temat wyższości nauk humanistycznych nad ścisłymi, tudzież the other way around. Niemniej muszę przyznać, że jeszcze nigdy w życiu nie czułem się tak zadowolony z tego, co robię na co dzień.
 (dopisek lipcowy: a miałem to nieszczęście, z perspektywy czasu, że w liceum byłem na profilu humanistycznym)
Jeśli ktoś zastanawia się nad studiowaniem na Wydziale Matematyki i Informatyki, to mogę powiedzieć mu tylko jedno - zastanów się, czy jesteś w stanie się w pełni poświęcić nauce matematyki (bo to jest generalnie problemem)
 (dopisek lipcowy: przynajmniej na pierwszym semestrze, gdzie trzeba się przyzwyczaić do tego, że studia działają w zupełnie innym trybie niż to do czego przyzwyczaiło nas liceum, ale to samo piszę poniżej)
, jeśli masz jakieś braki, bo bez zaangażowania lepiej nie próbuj. Nie chcę tu nikogo zniechęcać, chcę tylko uprzedzić, że na tym wydziale ciężko jest "studiować", naprawdę trzeba się tu uczyć. Należy zapomnieć o wszelkich przyzwyczajeniach z liceum i podejścia, że jakoś to będzie - bez pracy nie będzie się miało nawet głupiej trói.
Tyle na temat studiów. Sesja się zbliża - trzeba się dobrze przygotować.

No i co mogę dodać po ( na razie ) prawie zaliczeniu pierwszego roku?
Po pierwsze, nie ma się co bać kampanii wrześniowej, jeśli jest się na tyle ogarniętym, żeby zostawić sobie na nią jeden przedmiot, a nie po prostu nie uczyć się na pierwsze terminy z innych rzeczy. No, ale to jest tylko gwoli tego jak studiowanie przebiega w ogóle. Przejdzmy do meritum - Uniwersytetu Jagiellońskiego.

Mój wydział znajduje się w dość ustronnej części Krakowa - mianowicie na Ruczaju, dla części osób to może być mało dobra wiadomość, jeśli się teraz tego dowiadują, a liczyli na to, że będą mogli wynająć coś w centrum i mieć blisko do barów i na uczelnie, dla mnie osobiście jest to na plus, ponieważ dzięki temu ( jak mi się wydaje ), przynajmniej po części, większość zajęć odbywa się w jednym budynku, więc przerwy między laborkami można przeznaczyć na dowolne czynności różne od dojazdów (+). Dodatkowo, jak jest ciepło to można wyjść na zewnątrz, na przykład na dziedziniec (++, dwa bo jeszcze wtedy łapie wifi UJotowe) albo obok budynku na łąkę i sobie spokojnie w cieniu poleniuchować, względnie pouczyć.

Co do kadry i wyposażenia.
Jeśli mówią wam, że będziecie się uczyć programować na kartkach i dostaniecie dużo matmy, której w życiu nie wykorzystacie, no to nie wiem, kto wam takich kitów nawciskał.

Nie wiem, być może jestem aż takim szczęściarzem, ale dostałem samych prowadzących, do których nie mogę się przyczepić. Zawsze byli gotowi do pomocy przy różnych zagadnieniach, w każdym razie nie mogli się czegoś nauczyć za mnie, więc z problemami trzeba było czasem po prostu posiedzieć nie koniecznie polegać na tym, że ktoś to umie, gotowe rozwiązania nie zawsze dają dobre skutki jak chodzi o rozwijanie umiejętności.

Na kartkach owszem programuje się, ale to tylko wtedy jak jest na przykład kartkówka, czy jakaś inna forma sprawdzania wiedzy, gdzie z oczywistych względów nie bardzo można używać komputerów (chociaż słyszałem, że niektórzy prowadzący korzystają z jakichś aplikacji webowych. Też się da jak się chce). Ewentualnie, wtedy gdy jest to przedmiot ściśle algorytmiczny, a przez to nie trzeba bezmyślnie pisać kodu i go kompilować,żeby pokazać, że działa, tylko pracować głową nad rozwiązaniem !

Co do wyposażenia, to wydział zaopatrzony jest świetnie, jest przestronny, więc jak ktoś chce to może bez problemu korzystać ze sprzętu (rzutniki etc), sal, a przede wszystkim świetnie zaopatrzonej biblioteki.
Sale komputerowe, których jest naprawdę multum są dobrze wyposażone, niemniej, osobiście korzystam z własnego laptopa na zajęciach, bo mam tam wszystko skonfigurowane "pod siebie" z ulubionym edytorem tekstu (vim), czy środowiskiem graficznym (fluxbox) na czele ;)

Wróćmy jeszcze może do matematyki. Jeśli ktoś chce być na prawdę dobrze zarabiającym programistą (ergo dobrym algorytmikiem, no to siłą rzeczy powinien mieć dobre zrozumienie matematyki z prostego względu - matematyka daje masę świetnych narzędzi do wykorzystania w pracy, bądź co bądź również związanej z budową abstrakcji, bo przecież matematyka jest właśnie jej źródłem.

 Jeśli to nie trafia, to może zastanówmy się nad poszczególnymi przedmiotami:
  • Logika/Wstęp do Teorii Mnogości - w zasadzie logiczne podstawy matematyki, no a kim jest informatyk, jeśli nie współczesnym logikiem? Przedmiot dość problematyczny, bo wprowadza bardzo dużo formalnych definicji jak i dowodów, które mogą być nieco nieoczywiste na pierwszy rzut oka, niemniej nie ma się co zrażać, trzeba się po prostu przyłożyć.
  • Algebra liniowa z geometrią analityczną - jak dla mnie no to też jest po prostu mus, bez dobrej orientacji w przestrzeniach liniowych ciężko będzie zrozumieć biblioteki do animacji 3D, no nie? No, a jeśli nie interesuje Cię pisanie gier, to zawsze może zainteresować sztuczna inteligencja albo dokładniej nauczanie maszynowe - SVM - polecam wyszukać w sieci ;)
  • Analiza matematyczna - teoria złożoności obliczeniowej,metody numeryczne, chociażby; w każdym razie bardzo przydatny aparat matematyczny. Kiedyś mi taka analogia budowlano-remontowa wpadła do głowy - nie na co dzień będziesz korzystać z wiertarki prawda? No, ale jak już będziesz potrzebować kiedyś coś przewiercić, to mimo wszystko wypadałoby by mieć wiertarkę na stanie. Podobnie IMO jest z analizą matematyczną, nie koniecznie będziesz codziennie liczyć całki czy pochodne, jednak zawsze może się okazać, że taki dzień nastąpi.
  • W moim wypadku przewinęło się też troszkę algebry abstrakcyjnej, no i tutaj chyba nie muszę mówić o oczywistym jej zastosowaniu w kryptografii, weźmy na przykład algorytm RSA, do szyfrowania asymetrycznego, podstawy matematyczne sięgają bezpośrednio do teorii grup, a podstawą jego bezpieczeństwa jest to, że bardzo trudno przeprowadzić faktoryzację liczb złożonych z długich liczb pierwszych.
Matematyka, bądź co bądź, dała początek informatyce jako osobnej dziedzinie, była to podstawa teoretyczna. Sama zresztą nazwa pochodzi od informacji oraz automatyki, gdzie niemal każdą informację można wyrazić w naturalnym niemal języku liczb i matematyki właśnie.

Post wyszedł nieco długawy. W zasadzie adresujący najbardziej same sprawy związane z przebiegiem na dowolnej uczelni, niekoniecznie na UJ. Co do najstarszego uniwersytetu w Polsce, to mogę powiedzieć, że polecam Wydział Matematyki i Informatyki jako miejsce do studiowania, nie spotkałem się z tym, żeby utrudniano tam zdobywanie wiedzy, wprost przeciwnie, oczywiście, tylko wtedy, gdy faktycznie ma się do tego chęci.

poniedziałek, 14 kwietnia 2014

[C++] Przeładowywanie operatorów

C++ to doskonałe narzędzie głównie z tego powodu, że pozwala robić programiście prawie wszystko, na co on ma ochotę.
Jedną z tych rzeczy jest właśnie przeładowanie operatorów.

Składnia

Przeładowanie można implementować na 2 sposoby:
  1. poprzez funkcję zaprzyjaźnioną
  2. metodę będącą składową klasy
Jaka jest różnica?
Pisząc a@b w pierwszym wypadku wywołanie będzie równoważne do:

 operator@(a,b);

Natomiast w drugim będziemy wołać metodę na rzecz któregoś obiektu:

a.operator@(b);

Przykład:

Powiedzmy, że chcemy sobie przeładować abstrakcyjny operator "@".
Czyli mają naszą klasę typ_arg i chcemy móc korzystać z wyrażenia "a@b"
(tak, żeby było to wyrażenie przemienne, tzn. a@b == b@a).

W klasie musimy sobie zaprzyjaźnić ten operator w następujący sposób.

friend typ_arg operator@(const typ_arg& arg1,const typ_arg& arg2);

Przeładowywanie operatora wypisywanie strumieniowego

Znajduje się w pliku nagłówkowym <ostream> (tym samym w <iostream>).

friend std::ostream& operator<<(std::ostream&, const typ_arg&);

operator << zawsze pobiera jako argument strumień wyjściowy a potem go zwraca, kiedy skończy go modyfikować w odpowiedni sposób.

czwartek, 23 stycznia 2014

Programowanie AVR

Czas na nowe hobby!
Niedługo, będę zaczynał moją przygodę z programowaniem mikrokontrolerowym.
Wybór padł na chip Atmel'a - Atmegę 8.
Pierwsze projekty powinny się pojawiać na przestrzeni kilku następnych tygodni.

Póki co garść linków, które były dla mnie pomocne :
 -> Mikrokontrolery
 -> Darmowe ebooki z Organizacji i architekury Komputerów, dość przydatne, jeśli chodzi o teoretyczną podbudowę całości.
 -> Ebooki o mikroprogramowaniu.

środa, 5 czerwca 2013

Programming resources, czyli chciałbym zacząć programować

Trzeba przyznać, że mało jest rzeczy, które byłby równie ciekawe oraz zmuszające do wysiłku umysłowego jak programowanie. Nie jestem programistą, ale zawsze chciałem się nauczyć programować.
Dopiero od niedawna zacząłem się o tym poważniej myśleć.  Można powiedzieć, że pod tym względem jestem geekiem. Dostałem grube tomisko o C++ dla początkujących i staram się tym zajmować.
Chociaż pewnych podstaw nauczyłem się jeszcze w gimnazjum za sprawą dość fajnej nauczycielki jaką miałem przez rok. Bawiłem się wtedy Turbo Pascalem, nawet pamiętam, że mi na jego temat pożyczyła książkę. No, ale po jej przerobieniu utknąłem w martwym punkcie. Nie bardzo wiedziałem, gdzie szukać przydatnych informacji.

Dopiero niedawno udało mi się znaleźć ciekawe i przede wszystkim (jak mi się wydaje) użyteczne źródła informacji. Jeżeli jakimś cudem szukając czegoś na temat początków z programowaniem uda ci się czytelniku natrafić na tego bloga, to poniżej zamieszczam listę linków wraz z opisem.

Jeszcze na wstępie muszę ci coś powiedzieć. Jeśli chcesz się zająć programowaniem na poważnie i myślisz o pracy w branży, to bez dwóch zdań musisz znać angielski. I to na naprawdę przyzwoitym poziomie.

Przydatne linki

Internet wbrew pozorom jest pełen wiedzy, która czeka na odkrycie. Wystarczy tylko głębiej pogrzebać. Z polskich stron oraz blogów polecam :
  • http://cpp0x.pl/ - dość oczywista strona, jeśli interesuje cię C++. Dokumentacja do samego C++ i kilku często używanych bibliotek. Jest w czym przebierać.
  • http://gynvael.coldwind.pl/ - naprawdę świetna strona prowadzona przez programistę, który naprawdę wie o czym pisze, miałem okazję dowiedzieć się o jego blogu dzięki Magazynowi Programista, który na pewno jest również źródłem wiedzy wartym uwagi 
  • Dział programowanie w Wikibooks - tak wiem, pewnie to jest jeden z pierwszych wyników wyskakujących w Google. Zdaję sobie sprawę również z faktu, że większość podręczników jest niedokończona, ale być może jesteś bardziej doświadczony - podziel się swoją wiedzą. Uważam jednak, że zawsze można sobie tu rzucintualnie jest jeszcze wersja angielska, która jest zdecydowanie lepiej rozbudowana (chociaż jej też przć okiem, przynajmniej na spisy treści, które na pewno podpowiedzą czego szukać dalej. Eweydałoby się rozbudowanie). Zajrzeć nie zaszkodzi.

Kursy on-line

Jeżeli mówimy o podstawach, to większość skieruje nas w stronę Pythona. Ja osobiście myślę, że im więcej języków tym lepiej. Jednak myśląc o Pythonie i  podstawach programowania to niezrównany bez wątpienia jest kurs MIT 6.00 Intro to Computer Science and programming, który można znaleźć na YouTube. Dodatkowo na stronie MIT OpenCurseWare można znaleźć materiały, które zostały rozdane podczas wykładów studentom. Ponadto MIT ma bardzo bogatą ofertę nie tylko związaną z CS, polecam się pobawić z ich stroną, można znaleźć na prawdę wiele interesujących kursów.

Jeżeli chodzi o WebDev to bezwątpienia dobrą stroną jest Codecademy. Budowa strony w HTML5 z użyciem CSS oraz Javascriptu wraz z jQuery, obsługa strony serwerowej z PHP lub Ruby, dodatkowo kurs Pythona oraz popularnych APIs (np. od YouTube). Wszystko w jednym miejscu, umieszczone w quasi-social media obudowie, która motywuje do działania poprzez przyznawanie punktów oraz badges.

Niestety, nie znalazłem niczego tak dobrego w mowie ojczystej jak kursy oferowane po angielsku. Inne kursy on-line oferowane są na przykład przez takie strony jak :
Tutaj w większości kursy prowadzone są przez prawdziwe uczelnie z całego świata. Odbywają się z różną częstością i w różnych dziedzinach ( nie tylko Computer Science czy Computer Engineering).

Mam nadzieję, że mój bełkot do czegoś się przyda. Wiem, ile czasu mnie zajęło przeszukiwanie sieci, może komuś to ułatwi start.