Artykuły po roku

2021

Zależności Funkcyjne w Haskellu

26 minut(y)

Spytano mnie raz, co jest trudnego w Haskellu, co jednocześnie jest łatwe w OOP. Np. stworzenie interfejsu kolekcji i danie możliwości implementowania go klientom-użytkownikom. W tym celu potrzebujemy Klasę Typu od dwóch parametrów. Ale żeby mieć dobry interfejs, to nie wystarczy. O czym się przekonaliśmy w artykule Abstrakcja i dopasowanie do wzorców.

Złote testy w Haskellu

22 minut(y)

Zainspirowany wpisem o złotych testach na 4programmers postanowiłem dodać je do swojego projektu w Haskellu.

Abstrakcja i dopasowanie do wzorców w Haskellu

12 minut(y)

Po hermetyzacji i abstrakcji RAMu dla interpretera HelMA pora na stos. Stos, zwłaszcza stos arytmetyczny, jest strukturą używaną w wielu interpreterach jezyków ezoterycznych. Więc warto wydzielić tą abstrakcję do osobnego modułu.

Abstrakcja w Haskellu, czyli klasy typów

9 minut(y)

Po Hermetyzacji pora na Abstrakcje. Abstrakcja ma w programowaniu wiele znaczeń. Jednak w tym artykule będzie mi chodzić o abstrakcję spotykaną w OOP, czyli interfejsy (w Javie), traity (w Scali) czy klasy czysto abstrakcyjne (w C++). Czy Haskell ma odpowiednik interfejsów/traitów? Tak są to klasy typów (ang. Type Classy). Dzięki nim możemy wybierać implementację podczas działania programu.

Hermetyzacja w Haskellu

11 minut(y)

Hermetyzacja to cecha charakterystyczna obiektowych języków programowania. Co jednak nie znaczy, że hermetyzacja nie istnieje w Haskellu. Hermetyzację podobną do klas z języków OOP osiąga się w Haskellu za pomocą modułów i jawnego eksportowania funkcji i typów.

Alternatywy dla Prelude w Haskellu

7 minut(y)

Haskell jest pięknym językiem programowania, ale nie jest doskonały. Haskell posiada wiele błędów projektowych. Biblioteka standardowa Haskella też nie jest idealna. Prelude jest zbiorem domyślnie importowanych modułów w Haskellu z biblioteki standardowej. Niestety prelude importuje wiele niebezpiecznych oraz powolnych funkcji. Jednocześnie nie importuje wielu użytecznych funkcji.

Wróć do góry ↑

2020

5 języków programowania, które warto znać będąc już programistą

10 minut(y)

Jakiś czas temu na https://4programmers.net pojawiło się stwierdzenie: Ostatnio oglądałem wypowiedź twórcy języka C++, gdzie Bjarne Stroustrup powiedział, że zna ponad 20 języków programowania w przynajmniej podstawowym stopniu, dodał, że dobry programista powinien znać bardzo dobrze przynajmniej 5 języków, aby potrafił spojrzeć na problem z różnych perspektyw. Jaką piątkę wy byście wybrali, w jakiej kolejności i dlaczego?

Leniwe ładowanie komentarzy z Disqus

4 minut(y)

Ponieważ korzystam z bloga opartego na generatorze statycznych stron Jekyll i nie mam żadnego backendu, nie mam możliwości samodzielnego zaimplementowania komentarzy. Jednak Minimal Mistakes, używany przeze mnie szablon, proponuje kilka rozwiązań tego problemu. Są to zewnętrzne systemy komentarzy wystawiające publiczne API jak: Disqus Discourse komentarze Facebooka komentarze utterances Staticman

Problem wywołań cebulowych w Haskellu

7 minut(y)

Przez Problem wywołań cebulowych rozumiem sytuację zagnieżdżonego wywoływania różnego rodzaju funkcji jak: someFunction someData = thirdFunction (secondFunction (firstFunction someData))

Attoparsec i EAS

9 minut(y)

W poprzednim artykule attoparsec zdefiniowałem cele napisania prostego asemblera z języka EAS do ezoterycznego języka programowania ETA. W tym artykule przyszła pora na implementację.

Wyrażenia regularne kontra parsery

7 minut(y)

Wyrażenia regularne słyną z tego, że są trudne i mało czytelne. Czy są dla nich jakieś alternatywy? Tak, są to parsery.

Parsowanie parametrów wiersza poleceń w Haskellu

8 minut(y)

Prawie każdy program, który można wywoływać z wiersza poleceń (ang. Command Line Interface, CLI), a interpreter jak HelMA w szczególności, musi posiadać obsługę parametrów (ang. Options) przekazywanych z wiersza poleceń. Obsługę taką można napisać samodzielnie albo z pomocą dedykowanej bibliotek. Ja zdecydowałem się na bibliotekę optparse-applicative. Biblioteka ta posiada szereg zalet. Między innymi można jej używać w eta-lang.

Testy jednostkowe i mockowanie wyścia-wejścia w Haskellu

8 minut(y)

Testy pisać trzeba, to oczywiste. Pozostaje pytanie jednostkowe czy integracyjne? Ja na razie zdecydowałem się na jednostkowe, co postawiło mnie przed kolejnym pytaniem jak przetestować kod używający wyjścia-wejścia w Haskellu? To znowu sprowadza się do pytania jak zamockować monadę IO w Haskellu?

Sześć rodzajów polimorfizmu - polimorfizm jakiego nie znamy z OOP

10 minut(y)

Wydawałoby się, że trzy rodzaje polimorfizmu, jakie są spotykane w obiektowych językach programowania i które opiswałem w artykule Sześć rodzajów polimorfizmu - polimorfizm jaki znamy z OOP, są wszystkim czego potrzebujemy do szczęścia, żeby pisać zwięzły kod. Czasem pojawi się tylko jakiś zgrzyt, gdzie trzeba zaimplementować wzorzec wizytator lub fakrykę.

Haskell i monady - czy monady są jeszcze egzotyczne?

13 minut(y)

Język programowania Haskell to ma straszną opinię. Że trzeba rozumieć co to teoria kategorii albo monady. Tylko że teoria kategorii odnosi się do wszystkich języków programowania. A monady są podobno możliwe nawet w Bashu. Gdy tak mówię lub piszę, ludzie mi nie wierzą. Ostatnio z tego powodu dostałem kod w Haskellu, który wyglądał mniej więcej tak:

Krótka historia informatyki na przykładzie serializacji danych

11 minut(y)

Najpierw odpowiedzmy sobie na dodatkowe pytanie kto to jest informatyk? Odpowiedź jest oczywista jest to człowiek znający się na informatyce. I tu dochodzimy do głównego pytania a co to jest informatyka? Można pomyśleć, że informatyka to nauka o komputerach. Przecież codziennie informatycy używają komputerów. Ale

Sojowe latte - To nie ma sensu

4 minut(y)

Czy was też denerwuje argument sojowe latte? Jakakolwiek sensowna rozmowa może zakończyć się argumentem sojowe latte. I jest to uważane za argument ostateczny i niepodważalny.

Krótki wpis o tym jak Google niszczy konkurencję

5 minut(y)

Żyję sobie spokojnie jak gdyby nigdy nic i nagle cerrato z 4programmers.net pisze do mnie, że moja strona mi się rozjechała i podsyła screena. Patrzę i faktycznie plik CSS się w ogóle nie wczytał. Sprawdzam w Chromium, Chromie, Operze i Edge i wszędzie działa. Pytam się cerrato co za niszową przeglądarkę używa.

Git - zmiana informacji o autorze

3 minut(y)

System kontroli wersji git przechowuje informacje o autorach zatwierdzeń (ang. commit) w każdym zatwierdzeniu osobno. Tzn. nie istnieje żadne globalne miejsce w którym moglibyśmy zmienić te informacje, jak np. nazwisko autora zatwierdzenia. Zamiast tego musimy modyfikować historię wszystkich zatwierdzeń. Na szczęście nie trzeba robić tego ręcznie dla każdego zatwierdzenia tylko można napisać jednolinijkowy skrypt używający podpolecenia (ang. subcommend) filter-branch.

Wróć do góry ↑

2019

No Exceptions - IO, królowa monad

10 minut(y)

Czasem słyszy się opinie, że programowanie funkcyjne jest bez sensu, ponieważ czyste funkcje (ang. pure functions) nie pozwalają na pisanie efektów ubocznych. A przecież każdy działający program potrzebuje efektów ubocznych. Dla wyjaśnienia efektem ubocznym jest: Komunikacja ze światem zewnętrznym, zarówno odczyt jak i zapis Komunikacja między wątkami Zmienny stan (ang. mutable state) i zmienne kolekcje (ang. mutable collections)

No Exceptions - o problemach z wyjątkami

16 minut(y)

Wyjątki bywają problematyczne, ale przez swoich obrońców, są często przedstawiane jako jedna z fundamentalnych części programowania obiektowego. Co ciekawe wyjątków nie ma w podstawowych założeniach paradygmatu obiektowego. Nie ma też nic o wyjątkach w definicji programowania obiektowego podanej przez Alana Kaya, lider zespołu tworzącego język Smalltalk uznawany za twórcę tego terminu. Za to jest o komunikowaniu się obiektów za pomocą wiadomości.

Kolejny język programowania - język wszystkomający

9 minut(y)

Język wszystkomający jest to język w którym można programować imperatywnie, funkcyjnie, obiektowo, proceduralnie oraz strukturalnie. Prawdopodobnie jest to język zły do nauki jako pierwszy język programowania. Może też być złym językiem do nauki pojedynczych paradygmatów programowania, jeśli nie mamy odpowiedniej dyscypliny. Jeśli jednak mamy tę dyscyplinę jest to genialny język do nauki nowych paradygmatów programowania. Po co uczyć się nowych paradygmatów programowania starałem się wyjaśnić w artykule Kolejny język programowania do nauki - paradygmaty programowania.

Kolejny język programowania do nauki - paradygmaty programowania

13 minut(y)

Zdecydowaliśmy się nauczyć programować. I zostać programistami. Może nawet dostaliśmy pierwszą pracę. I w tej pracy ktoś nam powiedział, że uczy się nowego, a więc i kolejnego, języka programowania. Czemu się uczy? Bo np. usłyszał/przeczytał cytat:

Który język programowania wybrać na początek - język natywny

12 minut(y)

Wiele osób pyta się, który język programowania wybrać na początek jako pierwszy język do nauki. Wiele jednak zależy od tego do czego chcemy użyć tego języka programowania. Dlatego wybrałem zwycięzców w czterech kategoriach: dynamicznie typowany język skryptowy ogólnego przeznaczenia statycznie typowany język korporacyjny używany do pisania długowiecznych aplikacji klasy enterprise język fullstackowy, który można używać do pisania frontendu i backendu szybki język natywny działający bez maszyny wirtualnej i interpretera

Który język programowania wybrać na początek - język fullstackowy

14 minut(y)

Wiele osób pyta się, który język programowania wybrać na początek jako pierwszy język do nauki. Wiele jednak zależy od tego do czego chcemy użyć tego języka programowania. Dlatego wybrałem zwycięzców w czterech kategoriach: dynamicznie typowany język skryptowy ogólnego przeznaczenia statycznie typowany język korporacyjny używany do pisania długowiecznych aplikacji klasy enterprise język fullstackowy, który można używać do pisania frontendu i backendu szybki język natywny działający bez maszyny wirtualnej i interpretera

Który język programowania wybrać na początek - język korporacyjny

8 minut(y)

Wiele osób pyta się, który język programowania wybrać na początek jako pierwszy język do nauki. Wiele jednak zależy od tego do czego chcemy użyć tego języka programowania. Dlatego wybrałem zwycięzców w czterech kategoriach: dynamicznie typowany język skryptowy ogólnego przeznaczenia statycznie typowany język korporacyjny używany do pisania długowiecznych aplikacji klasy enterprise fullstack język, który można używać do pisania frontendu i backendu szybki język natywny działający bez maszyny wirtualnej i interpretera

Który język programowania wybrać na początek - język skryptowy

7 minut(y)

Wiele osób pyta się, który język programowania wybrać na początek jako pierwszy język do nauki. Wiele jednak zależy od tego do czego chcemy użyć tego języka programowania. Dlatego wybrałem zwycięzców w czterech kategoriach: dynamicznie typowany język skryptowy ogólnego przeznaczenia statycznie typowany język korporacyjny używany do pisania długowiecznych aplikacji klasy enterprise fullstack język, który można używać do pisania frontendu i backendu szybki język natywny działający bez maszyny wirtualnej i interpretera

Functional Miners - Programowanie Funkcyjne dla Każdego

4 minut(y)

2019-05-21 odbyło się spotkanie Functional Miners (@fun_miners) w HackerSpace Silesia (@hs_silesia) o tematyce Programowanie Funkcyjne dla Każdego. Wydarzyły się dwie prezentacje: Wojciech Gawroński - Functional Programming in the Wild Andrzej Spiess - From \x.x to Facebook - Introduction to Lambda Calculus

Biblioteki do logowania dla języka Java i platformy JVM

6 minut(y)

W artykule Konfiguracja fabryki loggerów z biblioteki Slogging w Scali autorytarnie stwierdziłem, że Logback dla JVM jest najlepszym silnikiem do logowania. Czytając artykuł Programowanie w Rust: The Good, The Bad and The Ugly zszokowała mnie informacja, że programista nie wie która biblioteka logowania dla Javy jest najlepsza. Prawdziwa klęska urodzaju. I programista nie wie co wybrać

Czy nadaję się na programistę? Inne możliwości w IT

13 minut(y)

Wiele osób pyta “Czy nadaję się na programistę?”. Złośliwi mówią, że jeśli się pytacie, zamiast siedzieć w piwnicy i rozwiązywać tutoriale z programowania, ewentualnie dopytywać się co jeszcze się nauczyć, to niestety się nie nadajecie. Niezłośliwi podają Test na programistę.

Krótki opis konstrukcji kompilatorów GCC, LLVM i Clang

11 minut(y)

W dawnych czasach każdy dobry programista chciał napisać swój własny kompilator języka C. Co prawda te czasy już minęły i dziś większość z nas programuje w językach o wiele bardziej złożonych niż C. Dzięki czemu jesteśmy w stanie pisać szybciej kod. Ale nadal warto znać podstawy budowy kompilatorów. Na szczęście konstrukcja kompilatora jest prosta jak konstrukcja dzidy bojowej. Dzida bojowa składa się z: przeddzidzia dzidy bojowej śróddzidzia dzidy bojowej zadzidzia dzidy bojowej.

Lokalne uruchamianie strony hostowanej na GitHub Pages

5 minut(y)

Jedną z największych zalet generator statycznych stron Jekyll jest to, że jest wspierany przez portal Github za pomocą Github Pages. Gdyby nie Github Pages prawdopodobnie wybrałbym Hugo napisane w języku Go do budowania tego bloga. Największą wadą Github Pages jest to, że posiada ograniczony zbiór dozwolonych wtyczek i nie wolno instalować własnych wtyczek. Listę dozwolonych wtyczek (wraz z wersjami) można znaleźć na stronie Dependency versions lub pod postacią pliku json na stronie versions.json.

Prosty sposób na zmianę historii Gita

9 minut(y)

Każdy z nas czasem zatwierdza (ang. commit) coś brzydkiego do repozytorium. Dlaczego tak robimy? Czasem przypadkiem, ale często dlatego, że trzeba przełączyć się na inną gałąź, a posiadamy już jakieś zmiany na gałęzi aktualnej. Co prawda można niezatwierdzone zmiany, tylko schować w schowku za pomocą polecenia git stash, ale dane ze schowka strasznie łatwo stracić. Poza tym schowek jest jeden wspólny dla wszystkich gałęzi.

jekyllcodex.org - problem ze skryptem seo

5 minut(y)

Wyszukiwując swój blog w google trafiłem na brzydki opis w rodzaju: for post in paginator. posts %} {{ post. title }} {{ post. date | date:

Scala - No Universal Equality

6 minut(y)

Ostatnim błędem zgłaszanym w kodzie projektu resentiment przez scalafix jest “No Universal Equality” wynikający z użycia operatora ==.

Jekyll - kategorie i tagi

6 minut(y)

Opublikowałem już kilka artykułów na blogu i chciałem je w jakiś sposób pogrupować. Najlepiej za pomocą kategorii i tagów.

Biblioteki do logowania dla języka Scala

9 minut(y)

Chcąc dowiedzieć się co dzieje się wewnątrz naszej aplikacji mamy dwie drogi. Pierwszym sposobem jest debugowanie. Jednak im więcej wątków w aplikacji i im bardziej komunikują się one w sposób asynchroniczny tym trudniej jest debugować. Drugim sposobem jest logowanie informacji. Najprostszym sposobem logowania informacji w Javie jest System.out.println, a w Scali upraszcza się to do println. Ale jest to złe z dwóch powodów: Po pierwsze, jeśli piszemy aplikację “konsolową” (ang. command line interface, CLI) to użytkownik będzie niepotrzebnie widział nieinteresujące go informacje z wewnętrznego procesu przetwarzania. Tak wypisanych informacji nie można zapisać w bazie danych ani wysłać do innego systemu.

Wróć do góry ↑

2018

Ciągła integracja, ciągła kontrola, ciągła Scala

12 minut(y)

W poprzednich wpisach zbudowaliśmy ogromne polecenie do analizy statycznej i dynamicznej kodu projektu oraz generacji raportów. Jednak wykonanie tego polecenia trwa. A programiści nie lubią czekać.

Flagi kompilatora Scalac

8 minut(y)

Nie bójmy się tego powiedzieć, Scala to nowy Perl. I tak jak w Perlu, w Scali obowiązuje zasada TIMTOWTDI (ang. There is more than one way to do it), czyli “Można to zrobić na różne sposoby”.

Statyczna analiza kodu dla języka Scala w SBT - część 1.

5 minut(y)

Statyczna analiza programu to analiza oprogramowania komputerowego wykonywanego bez faktycznego uruchamiania programów, w przeciwieństwie do analizy dynamicznej, która jest analizą wykonywaną na programach podczas ich wykonywania.

Dynamiczna analiza kodu dla SBT - testy jednostkowe

7 minut(y)

Dynamiczna analiza programu to analiza oprogramowania komputerowego wykonywanego przez wykonywanie programów na rzeczywistym lub wirtualnym procesorze. Korzystanie z metryk testów, takich jak pokrycie kodu, zapewnia, że przetestowano odpowiednią ilość możliwych zachować programu. Aby analiza dynamiczna programu była skuteczna, program docelowy musi być wykonany z wystarczającą ilością danych wejściowych do testów, aby uzyskać interesujące zachowanie. Testy jednostkowe, testy integracyjne, testy systemowe i testy akceptacyjne wykorzystują dynamiczną analizę programu.

Git-flow i aliasy

3 minut(y)

Gitflow jest wspaniałą koncepcją pracy z gałęziami w repozytorium Git. Strategia ta jest świetnie opisana na A successful Git branching model.

Przenośna Scala

5 minut(y)

Znajomy zajarał się językiem Rust. Opowiada mi jaki to wspaniały język i pokazuje przykłady kodu. Rust na pierwszy rzut oka wygląda jak skrzyżowanie C i języka Haskell plus kanały jak w języka Go. Czyni go to pretendentem do bycia najbardziej skomplikowanym językiem programowania na świecie. Pretendentem, bo istnieje wśród programistów JVM opinia, że najbardziej skomlikowanym językiem na świecie jest Scala. Scala jest skrzyżowaniem Javy i Haskella plus aktory z języka Erlang.

jekyllcodex.org - część druga

2 minut(y)

Ponad miesiąc temu, w panice, szukałem prostego skryptu, który by wyświetlał ostrzeżenie o plikach cookies. Skrypt odnalazłem na stronie jekyllcodex.org. Strona ta zawiera repozytorium skryptów, które rozszerzają możliwości generatora statycznych stron Jekyll.

Docker - usuwanie obrazów

2 minut(y)

Dziesięć lat pracy na Linuksie nauczyło mnie, że jeśli Linuks zaczyna magicznie i bez ostrzeżenia sam z siebie nie działać to najprawdopodobniej skończyło się miejsce na dysku. Identycznie jest z Dockerem. Jeśli lokalnie stawiamy chmurę mikroserwisów, które często pojawiają się w nowych wersjach, to prędzej czy później zabraknie nam miejsca na dysku. W skrajnym wypadku, na laptopie zastępczym, musiałem dwa razy w tygodniu usuwać obrazy Dockerowe.

Alias - polecenie powłoki Bash

4 minut(y)

Jeśli: masz problemy z zapamiętywaniem skomplikowanych poleceń Basha lub innych programów wywoływanych przez wiersz poleceń nie lubisz wpisywać w terminalu długich poleceń z podkomendami i przełącznikami

Jekyll i ciasteczka (pliki cookies)

4 minut(y)

Przed założeniem bloga opartego na technologiach Jekyll i GitHub Pages przejrzałem sporo polskojęzycznych blogów z opisem “Jak to zrobić”. Wszyscy mówili, że jest to niesamowicie proste. Za wyjątkiem jednego malkontenta, Gutka (https://blog.gutek.pl/2014/10/30/nowy-blog-2/).

Wróć do góry ↑