From 1d1565d6ab28406cc99226908dcd769d10e26a1f Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Sat, 15 Aug 2020 17:01:11 +0200 Subject: [PATCH 001/160] Create microblog --- _collections/_microblog/jezyk-fullstackowy.md | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 _collections/_microblog/jezyk-fullstackowy.md diff --git a/_collections/_microblog/jezyk-fullstackowy.md b/_collections/_microblog/jezyk-fullstackowy.md new file mode 100644 index 00000000..afca1b19 --- /dev/null +++ b/_collections/_microblog/jezyk-fullstackowy.md @@ -0,0 +1,115 @@ +W ciągu ostatnich 48h zarzucono mi to wiele rzeczy, ale nikt mi nie będzie zarzucać że nie wiem, że `nawet w WEB można się już obyć bez JS`, dlatego przeklejam tu swój stary artykuł z bloga. Mam nadzieję że przez rok się mocno nie zdezaktualizował. + +Nie jest to artykuł profesjonalisty, ale bardziej zapiski hobbysty i próba usystematyzowania nowych rzeczy. Proszę o konstruktywną krytykę. `Jesteś upośledzony` to nie jest konstruktywna krytyka, bo to już wiem (mam krótkowzroczność -8D, niezdiagnozowanego Aspergera i totalny brak gustu). BTW Podobno jest to najlepszy artykuł jaki mam na blogu, więc kolejne będą jeszcze gorsze :P + +Z pozdrowieniami dla frontendowców za to że piszą front i dzięki temu ja tego nie muszę robić. + +# Który język programowania wybrać na początek - język fullstackowy + +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: +1. [dynamicznie typowany język skryptowy ogólnego przeznaczenia](https://www.writeonly.pl/programming/jezyk-skryptowy/) +2. [statycznie typowany język korporacyjny używany do pisania długowiecznych aplikacji klasy *enterprise*](https://www.writeonly.pl/programming/jezyk-korporacyjny/) +3. język *fullstackowy*, który można używać do pisania frontendu i backendu +4. [szybki język natywny działający bez maszyny wirtualnej i interpretera](https://www.writeonly.pl/programming/jezyk-natywny/) + +W tym artykule skupię się na zwycięzcy trzeciej kategorii, świętym Graalu programowania webowego, czyli języku *fullstackowy*, w którym można pisać zarówno frontend jak i backend. + +**Ważna uwaga!** +Artykuł nie jest sponsorowany przez Google, mimo że każdy ze zwycięskich języków jest używany przez Google. Nie jest też sponsorowany przez JetBrains. Po prostu uważam, że JetBrains tworzy najlepsze IDE. Jest to tylko mój mały subiektywny ranking języków programowania na rok 2019. + +## JavaScript oraz jego problemy i dziwactwa +**JavaScript** jest obecnie jedynym językiem programowania wspieranym przez przeglądarki bezpośrednio. Dlatego jesteśmy skazani na niego przy programowaniu frontendu działającego po stronie przeglądarki. Jednocześnie JS posiada sporo swoich problemów i dziwactw. Zaczynając od najważniejszych są to: +1. Różne implementacje w różnych przeglądarkach +2. Słabe typowanie, które pozwala robić takie rzeczy jak JSFuck +3. Obiektowość oparta na [prototypach](https://pl.wikipedia.org/wiki/Prototyp_(oprogramowanie)). + +Ostatnie nie byłoby nawet problemem gdyby nie to, że w początkowej fazie istnienia rozdziału na frontend i backend programiści backendowi byli przymuszani do pisania frontendu. Bolało to zwłaszcza programistów języków korporacyjnych, gdzie obiektowość oparta jest na [klasach](https://pl.wikipedia.org/wiki/Klasa_(programowanie_obiektowe)). + +### Podejście zerowe +Początkowo głównym problemem z JavaScryptem było to, że był różnie implementowany w różnych przeglądarkach. W niektórych przeglądarkach brakowało niektórych funkcji, w innych te same funkcje zachowywały się różnie. Spowodowało to powstawanie wielu różnych nakładek i bibliotek na JS, z czego jedna stała się *de facto* standardem - **JQuery**. Było to jednak w dawnych czasach, gdy programowanie JavaScripcie było proste, ponieważ służył on głownie do robienia bezsensownych animacji na strona oraz customowych menu kontekstowych. + +Obecnie głównym problemem pisania aplikacji webowych jest to, że potrzebujemy osobnych programistów do tworzenia frontendu (*frontendowców*) i osobnych do tworzenia backendu (*backendowców*). Teoretycznie istnieje święty Graal wszelakiej rekrutacji, człowiek orkiestra, Leonardo da Vinci swoich czasów, czyli fullstackowiec potrafiący pisać zarówno frontend jak i backend. W praktyce jest to jednak osoba znająca się na wszystkim, ale po trochu. Trochę jak np. internista w szpitalu. Rozwiązaniem jest dopiero język *fullstackowy*. + +### Podejście pierwsze - język backendowy transpilowany do JS + +Ponieważ programistów JavaScriptu było mało, a frontend stawał się coraz bardziej skomplikowany pojawił się pomysł, żeby już istniejące języki backendu transpilować do JS. Dzięki temu programiści backendu mogą z marszu stać się programistami frontendu. Tutaj są dwie grupy rozwiązań: +* Biblioteki graficzne przeniesione do **JS**: + * RAP (ang. *Remote Aplication Platform*) - to implementacja SWT (ang. *Standard Widget Toolkit*). SWT to niestandardowy (sic!) zestaw bibliotek graficznych dla Javy, posiadający implementacje dla najpopularniejszych systemów operacyjnych (Mac, Linux, Windows). +* GWT (ang. *Google Widget Toolkit*) - biblioteka graficzna zaprojektowana dla Javy specjalnie pod transpilację do JS + * Pyjs - Port GWT dla języka **Python** +* Język backendu przeniesiony do frontendu jednocześnie nie narzucający frameworka widoku i biblioteki graficznej: + * **Scala.js** - posiada już dedykowane frameworki ja *Udash* + * Kotlin.js - dalej w procesie projektowania + * Ceylon.js - transpilowany do CommonJS + * ClojureScript* - używa Closure Compiler do optymalizacji kodu. Tutaj pojawia się gwiazdka ponieważ istnieją [różnice](https://clojurescript.org/about/differences) pomiędzy +**Clojure** i ClojureScript + * Dla Javy: + * J2CL - transpilator od Google używający Closure Compiler i będący następcą GWT + * JSweet - transpilator do języka **TypeScript**, który następnie jest transpilowany do JS + * Programiści języka **Haskell** także podejmowali kilka prób stworzenia transpilatora z Haskella do JS. Są to Fay, GHCJS, Haste i uhc + * Dla języka **OCaml** jest kilka transpilatorów, ale aktualnie najbardziej obiecująco wygląda **BuckleScript.** + * Język **Racket** był jednym z pierwszych transpilowanych do JS, aktualnie jest rozwijany RacketScript + +### Podejście drugie - nowy język transpilowany do JS + +Według wielu programistów pierwsze podejście było niezadowalające. Istniało wiele problemów z językami backedowymi transpilowanymi do JS. Prawdopodobnie największym jest przetwarzanie współbieżne. Statycznie typowane języki korporacyjne posiadają wielowątkowość do przetwarzania współbieżnego. Interpretery JS posiadają jeden wątek i do przetwarzania współbieżnego używa konstrukcji `Promise` (*obietnicy*), której najbliżej do monady) `IO` z Haskella lub FlatMappable `Future` ze Scali. Ponieważ nie da się łatwo zamienić modelu `Promise` na wielowątkowość to jest to problemem. + +Ponieważ pierwsze podejście okazało się niezadowalające postanowiono stworzyć nowe języki programowania będące jak najbardziej podobne do JS, ale jednocześnie rozwiązujące znane w nim problemy. Te języki to m.in.: +* **CoffeeScript** - pierwszy popularny, nowy język transpilowany do JS. Posiada klasy i *normalne* dziedziczenie, ale typowany dynamicznie. Promowany przez programistów **Ruby** we frameworku RoR +* **LiveScript** - funkcyjny następca CoffeeScriptu +* **TypeScript** - rozszeżenie **JS** o statyczne typowanie i klasy +* **PureScript** - **Haskell**, ale wykonywany zachłannie, czyli jak *normalny* język programowania, a nie Haskell +* **ReasonML** - **OCaml** ze zmienioną składnią w celu upodobnienia go do **JS**. Także transpilowany za pomocą **BuckleScript**. +* **Elm** * - język będący połączeniem języków **Meta Language** i **Haskell** oraz będący już zintegrowany z frameworkami React i Redux (implementacja architektury Flux). Jest z gwiazdką, bo jest dedykowany tylko do pisania frontendu. Jednocześnie posiada ciekawą właściwość jaką jest usuwanie martwego kodu podczas transpilacji. Dlatego aplikacja napisana w Elmie może być mniejsza niż kod Reacta +* **Dart** * - kolejny język z gwiazdką. Mimo że jest względnie młody przeszedł już historię dzielącą się na etapy: + 1. Natywny język przeglądarki - niestety wykonywany natywnie tylko przez Chroma. Inne przeglądarki miały posiadać maszynę wirtualną Darta napisaną w JS. + 2. Język do pisania frontendu, transpilowany do JS + 3. Język do pisania frontendu i aplikacji mobilnych za pomocą frameworku Flutter + +Ale jakim cudem w ogóle można mówić o JS jako o języku *fullstackowym*? Spójrzy na małe kalendarium: +* 2007 - Qt dodaje Qt Script, własną implementacją EmcaScriptu, język jest dedykowany do tworzenia **GUI**. Teoretycznie nic to nie wnosi do tej historii, ale zainspirowało niektórych +* 2008 - Gnome dodaje dwa [bindingi Javascriptu](https://wiki.gnome.org/JavaScript), Gjs i Seed. Są one dedykowane do tworzenia **GUI** w miejsce wcześniej stosowanego w tym celu języka **Python**, ale można ich używać jako główny język do pisania aplikacji oraz jako język skryptowy +* 2009 - powstaje Node.js, wyciągnięty z przeglądarki interpreter] V8, który można używać z linii poleceń CLI +* 2011 - powstaje Vert.x, framework do przetwarzania współbieżnego na JVM, który posiada API m.in. w JavaScripcie + +A więc wszystkie języki transpilowane do JS (i sam JS oczywiście) można wykonywać po stronie backendu! +### Podejście wygrywające +zwycięzcą kategorii *język fullstackowy* jest język transpilowany do JS i jest to ... JavaScript! + +Co?! Dlaczego JavaScript jest transpilowany do JavaScriptu? Wynika to z tego, że w międzyczasie tworzenia gigantycznej ilości nakładek do JavaScriptu sam Javascript też był rozwijany. Niestety dalej trzeba wspierać stare przeglądarki używające starszych wersji JavaScriptu. Dlatego jest potrzebny transpilator Babel zamieniający ECMAScript 6 do ECMAScript 5. + +A dlaczego JavaScript jest zwycięzcą? +* Ewoluował i nie jest już tak brzydki jak kiedyś +* Jest popularny - język roku 2014 według Tiobe +* Nawet jeśli będziesz pisać frontend w innym języku programowania niż JS to prawdopodobnie i tak będziesz musiał znać podstawy JavaScriptu, +* Niestety [WebStorm] od JetBains jest płatny, ale na szczęście istnieją inne dobre IDE dla JavaScriptu jak Atom lub VSC. +* Chyba wreszcie zrozumieli JS w Google. Google długo miało problemy z JavaScriptem i dlatego m.in. stworzyło GWT. Jednak od pewnego czasu Google wspiera użycie JavaScriptu np w Google Cloud Functions, gdzie można używać tylko i wyłącznie JavaScriptu. + +Ale nie to jest największą zaletą JavaScriptu! Największą zaletą jest Node.js. A największą zaletą Node.js jest to, że jest jednowątkowy i zmusza do pisania aplikacji funkcyjnych, asynchronicznych i reaktywnych + +Node.js nie jest jedynym asynchronicznym serwerem. Istnieją także inne jak: +* Vert.x - wielki framework dla języków JavaScript, Java, Scala, Kotlin, **Ceylon**, Groovy i **Ruby** +* Lagom - kolejny wielki framework, dedykowany dla języka Java +* Akka HTTP - biblioteka dedykowana dla języków **Scala** i Java +* Spark - biblioteka dedykowana dla języków **Kotlin** i Java +* Ratpack - biblioteka dedykowana dla języków Groovy i Java +* WebFlux - reaktywa wersja Springa + +Wiele innych frameworków także zaczyna wspierać programowanie asynchroniczne, jak np. DropWizard. +## Podsumowanie + +Trudno tutaj o dobre podsumowanie. Chyba nie mam odwagi polecić komuś JavaScript/TypeScript do nauki jako pierwszy język do programowania. +Głównie obawiając się o zdrowie psychiczne tej osoby, która miałaby programować w JS. + +Osobiście jestem zwolennikiem statycznie typowanych języków backendu transpilowanych do JS, jak np. Scala.js lub Kotlin.js. Pozwala to współdzielić kod między frontendem i backendem, który teoretycznie może być nawet aplikacją natywną. Jednocześnie w tych językach programowania do rozwiązywania problemów asynchroniczności są preferowane konstrukcje `Future` oraz **monady** `IO`, które łatwo przetłumaczyć na `Promise` z JS. + +Równie ciekawy wydaje się także, pojawiącący w niektórych zagranicznych ogłoszeniach o pracę, stos technologiczny PHP, czyli: +* **P**ureScript na frontendzie +* **H**askell na backandzie +* **P**ostgreSQL jako baza danych + +Są to co prawda dwa języki programowania do nauki, ale bardzo podobne do siebie. O wiele bardziej niż Java i JavaScript. Więc opanowanie jednego z nich, gdy umie się już drugi nie powinno być problemem. + +[Link do oryginalnego artykułu](https://www.writeonly.pl/programming/jezyk-fullstackowy/) + +#writeonly From 6a0ea0809166bfd1b41b43a5e6e95c02fd062755 Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Sun, 10 May 2020 20:01:25 +0200 Subject: [PATCH 002/160] Add categories --- _collections/_categories/cli.html | 4 ++++ _collections/_categories/haskell-eta.html | 8 ++++++++ _collections/_categories/java.html | 3 +++ _collections/_categories/jekyll.html | 4 ++++ _collections/_categories/programming.html | 4 ++++ _collections/_categories/relationships.html | 4 ++++ _collections/_categories/rust.html | 4 ++++ _collections/_categories/scala-jvm.html | 6 ++++++ _collections/_categories/scala-native.html | 6 ++++++ _collections/_categories/scheme-racket.html | 4 ++++ _collections/_categories/thoughts.html | 4 ++++ 11 files changed, 51 insertions(+) create mode 100644 _collections/_categories/cli.html create mode 100644 _collections/_categories/haskell-eta.html create mode 100644 _collections/_categories/java.html create mode 100644 _collections/_categories/jekyll.html create mode 100644 _collections/_categories/programming.html create mode 100644 _collections/_categories/relationships.html create mode 100644 _collections/_categories/rust.html create mode 100644 _collections/_categories/scala-jvm.html create mode 100644 _collections/_categories/scala-native.html create mode 100644 _collections/_categories/scheme-racket.html create mode 100644 _collections/_categories/thoughts.html diff --git a/_collections/_categories/cli.html b/_collections/_categories/cli.html new file mode 100644 index 00000000..b32f8a9a --- /dev/null +++ b/_collections/_categories/cli.html @@ -0,0 +1,4 @@ +--- +category: cli +--- +Ang. command line interpreter/interface, czyli wiersz poleceń. diff --git a/_collections/_categories/haskell-eta.html b/_collections/_categories/haskell-eta.html new file mode 100644 index 00000000..9a10dfbd --- /dev/null +++ b/_collections/_categories/haskell-eta.html @@ -0,0 +1,8 @@ +--- +category: haskell-eta +redirect_from: +--- +Opis powstawania projektów +HelCam +i Helpa +w języku programowania Haskell. \ No newline at end of file diff --git a/_collections/_categories/java.html b/_collections/_categories/java.html new file mode 100644 index 00000000..762460b8 --- /dev/null +++ b/_collections/_categories/java.html @@ -0,0 +1,3 @@ +--- +category: java +--- diff --git a/_collections/_categories/jekyll.html b/_collections/_categories/jekyll.html new file mode 100644 index 00000000..2bcceae3 --- /dev/null +++ b/_collections/_categories/jekyll.html @@ -0,0 +1,4 @@ +--- +category: jekyll +--- +Opis walki z generatorem statycznych stron Jekyll i powstawania tematu WriteOnlyDoc. diff --git a/_collections/_categories/programming.html b/_collections/_categories/programming.html new file mode 100644 index 00000000..2be6a29b --- /dev/null +++ b/_collections/_categories/programming.html @@ -0,0 +1,4 @@ +--- +category: programming +--- +Techniczne opowieści o programowaniu i językach programowania. diff --git a/_collections/_categories/relationships.html b/_collections/_categories/relationships.html new file mode 100644 index 00000000..027c07d5 --- /dev/null +++ b/_collections/_categories/relationships.html @@ -0,0 +1,4 @@ +--- +category: relationships +--- +Relacje z wydarzeń diff --git a/_collections/_categories/rust.html b/_collections/_categories/rust.html new file mode 100644 index 00000000..d57c1949 --- /dev/null +++ b/_collections/_categories/rust.html @@ -0,0 +1,4 @@ +--- +category: rust +redirect_from: +--- diff --git a/_collections/_categories/scala-jvm.html b/_collections/_categories/scala-jvm.html new file mode 100644 index 00000000..7cb6b966 --- /dev/null +++ b/_collections/_categories/scala-jvm.html @@ -0,0 +1,6 @@ +--- +category: scala-jvm +redirect_from: +--- +Opis powstawania projektu hyde +w języku programowania Scala, diff --git a/_collections/_categories/scala-native.html b/_collections/_categories/scala-native.html new file mode 100644 index 00000000..a3bdcbb7 --- /dev/null +++ b/_collections/_categories/scala-native.html @@ -0,0 +1,6 @@ +--- +category: scala-native +--- +Opis powstawania projektu resentiment +w języku programowania Scala, +Scala.js i Scala native. diff --git a/_collections/_categories/scheme-racket.html b/_collections/_categories/scheme-racket.html new file mode 100644 index 00000000..fc7c4f50 --- /dev/null +++ b/_collections/_categories/scheme-racket.html @@ -0,0 +1,4 @@ +--- +category: scheme-racket +redirect_from: +--- diff --git a/_collections/_categories/thoughts.html b/_collections/_categories/thoughts.html new file mode 100644 index 00000000..901c832b --- /dev/null +++ b/_collections/_categories/thoughts.html @@ -0,0 +1,4 @@ +--- +category: thoughts +--- +Przemyślenia niedokońca technicznie. From 01afaf1328985ee69e6dddf6a4bbd8689e9ab08b Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Thu, 15 Oct 2020 23:10:32 +0200 Subject: [PATCH 003/160] Add googleb9232d26fd83679a.html --- googleb9232d26fd83679a.html | 1 + 1 file changed, 1 insertion(+) create mode 100644 googleb9232d26fd83679a.html diff --git a/googleb9232d26fd83679a.html b/googleb9232d26fd83679a.html new file mode 100644 index 00000000..f699468f --- /dev/null +++ b/googleb9232d26fd83679a.html @@ -0,0 +1 @@ +google-site-verification: googleb9232d26fd83679a.html \ No newline at end of file From d31df6d88924f6c4f42cba6639c33558490750eb Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Thu, 22 Oct 2020 14:41:32 +0200 Subject: [PATCH 004/160] Add ads.txt --- ads.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 ads.txt diff --git a/ads.txt b/ads.txt new file mode 100644 index 00000000..40300c28 --- /dev/null +++ b/ads.txt @@ -0,0 +1 @@ +google.com, pub-8978320289517812, DIRECT, f08c47fec0942fa0 \ No newline at end of file From 365f05a18ca75f1378ef571279b5aa7c45a4a9f0 Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Fri, 10 Apr 2020 22:32:44 +0200 Subject: [PATCH 005/160] Create CNAME --- CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 CNAME diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..7ba35cb4 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +writeonly.pl \ No newline at end of file From 028118dfd168f20e8f62373ae34c842c9d6a97cb Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Sun, 10 May 2020 20:02:04 +0200 Subject: [PATCH 006/160] Add libs --- _collections/_libs/akka-http.html | 7 +++++ _collections/_libs/akka-js.html | 6 +++++ _collections/_libs/akka.html | 7 +++++ _collections/_libs/arrow.html | 8 ++++++ _collections/_libs/attoparsec.html | 21 +++++++++++++++ _collections/_libs/cats.html | 8 ++++++ _collections/_libs/dagger.html | 6 +++++ _collections/_libs/dropwizard.html | 8 ++++++ _collections/_libs/earley.html | 7 +++++ _collections/_libs/fastparse.html | 7 +++++ _collections/_libs/fastparser.html | 7 +++++ _collections/_libs/flow.html | 6 +++++ _collections/_libs/functionaljava.html | 10 +++++++ _collections/_libs/gson.html | 6 +++++ _collections/_libs/guice.html | 6 +++++ _collections/_libs/happy-alex.html | 21 +++++++++++++++ _collections/_libs/hspec.html | 14 ++++++++++ _collections/_libs/hunit.html | 14 ++++++++++ _collections/_libs/jackson.html | 6 +++++ _collections/_libs/jdbi.html | 6 +++++ _collections/_libs/jolt.html | 6 +++++ _collections/_libs/jool.html | 6 +++++ _collections/_libs/jooq.html | 6 +++++ _collections/_libs/jquery.html | 6 +++++ _collections/_libs/jsonpath.html | 6 +++++ _collections/_libs/jsonsurfer.html | 6 +++++ _collections/_libs/logback.html | 8 ++++++ _collections/_libs/macwire.html | 6 +++++ _collections/_libs/megaparsec.html | 24 +++++++++++++++++ _collections/_libs/minimal-mistakes.html | 4 +++ _collections/_libs/optparse-applicative.html | 5 ++++ _collections/_libs/parsec.html | 12 +++++++++ _collections/_libs/pulsar.html | 9 +++++++ _collections/_libs/quasar.html | 9 +++++++ _collections/_libs/quickcheck.html | 12 +++++++++ _collections/_libs/readp.html | 27 +++++++++++++++++++ _collections/_libs/scala-guice.html | 6 +++++ .../_libs/scala-optparse-applicative.html | 5 ++++ _collections/_libs/scalatest.html | 7 +++++ _collections/_libs/scalatra.html | 6 +++++ _collections/_libs/scalawui.html | 6 +++++ _collections/_libs/scalaz.html | 8 ++++++ _collections/_libs/semigroupoids.html | 6 +++++ _collections/_libs/shocon.html | 7 +++++ _collections/_libs/slogging.html | 7 +++++ _collections/_libs/specs2.html | 7 +++++ _collections/_libs/sqlite.html | 5 ++++ _collections/_libs/stoml.html | 8 ++++++ _collections/_libs/trifecta.html | 15 +++++++++++ _collections/_libs/udash.html | 6 +++++ _collections/_libs/utest.html | 7 +++++ _collections/_libs/vavr-kotlin.html | 10 +++++++ _collections/_libs/vavr.html | 10 +++++++ _collections/_libs/zio.html | 10 +++++++ 54 files changed, 469 insertions(+) create mode 100644 _collections/_libs/akka-http.html create mode 100644 _collections/_libs/akka-js.html create mode 100644 _collections/_libs/akka.html create mode 100644 _collections/_libs/arrow.html create mode 100644 _collections/_libs/attoparsec.html create mode 100644 _collections/_libs/cats.html create mode 100644 _collections/_libs/dagger.html create mode 100644 _collections/_libs/dropwizard.html create mode 100644 _collections/_libs/earley.html create mode 100644 _collections/_libs/fastparse.html create mode 100644 _collections/_libs/fastparser.html create mode 100644 _collections/_libs/flow.html create mode 100644 _collections/_libs/functionaljava.html create mode 100644 _collections/_libs/gson.html create mode 100644 _collections/_libs/guice.html create mode 100644 _collections/_libs/happy-alex.html create mode 100644 _collections/_libs/hspec.html create mode 100644 _collections/_libs/hunit.html create mode 100644 _collections/_libs/jackson.html create mode 100644 _collections/_libs/jdbi.html create mode 100644 _collections/_libs/jolt.html create mode 100644 _collections/_libs/jool.html create mode 100644 _collections/_libs/jooq.html create mode 100644 _collections/_libs/jquery.html create mode 100644 _collections/_libs/jsonpath.html create mode 100644 _collections/_libs/jsonsurfer.html create mode 100644 _collections/_libs/logback.html create mode 100644 _collections/_libs/macwire.html create mode 100644 _collections/_libs/megaparsec.html create mode 100644 _collections/_libs/minimal-mistakes.html create mode 100644 _collections/_libs/optparse-applicative.html create mode 100644 _collections/_libs/parsec.html create mode 100644 _collections/_libs/pulsar.html create mode 100644 _collections/_libs/quasar.html create mode 100644 _collections/_libs/quickcheck.html create mode 100644 _collections/_libs/readp.html create mode 100644 _collections/_libs/scala-guice.html create mode 100644 _collections/_libs/scala-optparse-applicative.html create mode 100644 _collections/_libs/scalatest.html create mode 100644 _collections/_libs/scalatra.html create mode 100644 _collections/_libs/scalawui.html create mode 100644 _collections/_libs/scalaz.html create mode 100644 _collections/_libs/semigroupoids.html create mode 100644 _collections/_libs/shocon.html create mode 100644 _collections/_libs/slogging.html create mode 100644 _collections/_libs/specs2.html create mode 100644 _collections/_libs/sqlite.html create mode 100644 _collections/_libs/stoml.html create mode 100644 _collections/_libs/trifecta.html create mode 100644 _collections/_libs/udash.html create mode 100644 _collections/_libs/utest.html create mode 100644 _collections/_libs/vavr-kotlin.html create mode 100644 _collections/_libs/vavr.html create mode 100644 _collections/_libs/zio.html diff --git a/_collections/_libs/akka-http.html b/_collections/_libs/akka-http.html new file mode 100644 index 00000000..e47e5f41 --- /dev/null +++ b/_collections/_libs/akka-http.html @@ -0,0 +1,7 @@ +--- +lib: akka-http +title: Akka HTTP +langs: scala +tags: http +--- +Akka HTTP diff --git a/_collections/_libs/akka-js.html b/_collections/_libs/akka-js.html new file mode 100644 index 00000000..efb7b4a4 --- /dev/null +++ b/_collections/_libs/akka-js.html @@ -0,0 +1,6 @@ +--- +lib: akka-js +title: Akka.js +langs: scala javascript +--- +AKKA.JS diff --git a/_collections/_libs/akka.html b/_collections/_libs/akka.html new file mode 100644 index 00000000..7947e68c --- /dev/null +++ b/_collections/_libs/akka.html @@ -0,0 +1,7 @@ +--- +lib: akka +title: akka +langs: scala +--- +akka - biblioteka dla języka Scala, +która umożliwia programowanie z użyciem aktoróœ w jak w języku Erlang. \ No newline at end of file diff --git a/_collections/_libs/arrow.html b/_collections/_libs/arrow.html new file mode 100644 index 00000000..afc6f171 --- /dev/null +++ b/_collections/_libs/arrow.html @@ -0,0 +1,8 @@ +--- +lib: arrow +title: ARROW +langs: kotlin +tags: fp +--- +ARROW - biblioteka dla języka Kotlin, +która umożliwia programowanie czysto-funkcyjne znane z języka Haskell. \ No newline at end of file diff --git a/_collections/_libs/attoparsec.html b/_collections/_libs/attoparsec.html new file mode 100644 index 00000000..b8b1352c --- /dev/null +++ b/_collections/_libs/attoparsec.html @@ -0,0 +1,21 @@ +--- +lib: attoparsec +title: Attoparsec +langs: haskell eta +tags: parser +--- +AttoParsec - biblioteka do budowania parserów dla języków Haskell i Eta. + diff --git a/_collections/_libs/cats.html b/_collections/_libs/cats.html new file mode 100644 index 00000000..56eab6fa --- /dev/null +++ b/_collections/_libs/cats.html @@ -0,0 +1,8 @@ +--- +lib: cats +title: Cats +langs: scala +tags: fp +--- +Cats - biblioteka dla języka Scala, +która umożliwia programowanie czysto-funkcyjne znane z języka Haskell. \ No newline at end of file diff --git a/_collections/_libs/dagger.html b/_collections/_libs/dagger.html new file mode 100644 index 00000000..f180040e --- /dev/null +++ b/_collections/_libs/dagger.html @@ -0,0 +1,6 @@ +--- +lib: dagger +title: Dagger +langs: java +tags: di +--- diff --git a/_collections/_libs/dropwizard.html b/_collections/_libs/dropwizard.html new file mode 100644 index 00000000..d141346d --- /dev/null +++ b/_collections/_libs/dropwizard.html @@ -0,0 +1,8 @@ +--- +lib: dropwizard +title: DropWizard +langs: java +tags: http +--- + +https://github.com/dropwizard/dropwizard \ No newline at end of file diff --git a/_collections/_libs/earley.html b/_collections/_libs/earley.html new file mode 100644 index 00000000..517ff646 --- /dev/null +++ b/_collections/_libs/earley.html @@ -0,0 +1,7 @@ +--- +lib: earley +title: Earley +langs: haskell +tags: parser +--- +Earley - biblioteka do budowania parserów dla języka Haskell. diff --git a/_collections/_libs/fastparse.html b/_collections/_libs/fastparse.html new file mode 100644 index 00000000..71bb97ee --- /dev/null +++ b/_collections/_libs/fastparse.html @@ -0,0 +1,7 @@ +--- +lib: fastparse +title: FastParse +langs: scala +tags: parser +--- +FastParse - biblioteka do budowania parserów dla języka Scala. diff --git a/_collections/_libs/fastparser.html b/_collections/_libs/fastparser.html new file mode 100644 index 00000000..72048c0a --- /dev/null +++ b/_collections/_libs/fastparser.html @@ -0,0 +1,7 @@ +--- +lib: fastparser +title: FastParser +langs: haskell +tags: parser +--- +FastParser - biblioteka do budowania parserów dla języka Haskell. diff --git a/_collections/_libs/flow.html b/_collections/_libs/flow.html new file mode 100644 index 00000000..7f1e54ab --- /dev/null +++ b/_collections/_libs/flow.html @@ -0,0 +1,6 @@ +--- +lib: flow +title: Flow +langs: haskell +--- +Flow diff --git a/_collections/_libs/functionaljava.html b/_collections/_libs/functionaljava.html new file mode 100644 index 00000000..15a7fbcc --- /dev/null +++ b/_collections/_libs/functionaljava.html @@ -0,0 +1,10 @@ +--- +lib: functionaljava +title: Functional Java +langs: java +tags: fp +--- +Functional Java - biblioteka dla języka Java, +która umożliwia programowanie czysto-funkcyjne znane z języka Haskell. + +Twitter : @@functionaljava \ No newline at end of file diff --git a/_collections/_libs/gson.html b/_collections/_libs/gson.html new file mode 100644 index 00000000..ee0d6bea --- /dev/null +++ b/_collections/_libs/gson.html @@ -0,0 +1,6 @@ +--- +lib: gson +title: Gson +langs: java +tags: json +--- diff --git a/_collections/_libs/guice.html b/_collections/_libs/guice.html new file mode 100644 index 00000000..bc309587 --- /dev/null +++ b/_collections/_libs/guice.html @@ -0,0 +1,6 @@ +--- +lib: guice +title: Guice +langs: java +tags: di +--- diff --git a/_collections/_libs/happy-alex.html b/_collections/_libs/happy-alex.html new file mode 100644 index 00000000..382e6836 --- /dev/null +++ b/_collections/_libs/happy-alex.html @@ -0,0 +1,21 @@ +--- +lib: happy-alex +title: Happy & Alex +langs: haskell eta +tags: parser +--- +Happy i Alex - biblioteki do budowania parserów dla języków Haskell i Eta. + diff --git a/_collections/_libs/hspec.html b/_collections/_libs/hspec.html new file mode 100644 index 00000000..0f156f6a --- /dev/null +++ b/_collections/_libs/hspec.html @@ -0,0 +1,14 @@ +--- +lib: hspec +title: HSpec +langs: haskell eta +tags: testing +--- +HSpec - biblioteki do pisania testów dla języków Haskell i Eta. + + + diff --git a/_collections/_libs/hunit.html b/_collections/_libs/hunit.html new file mode 100644 index 00000000..a5d6dcc9 --- /dev/null +++ b/_collections/_libs/hunit.html @@ -0,0 +1,14 @@ +--- +lib: hunit +title: HUnit +langs: haskell eta +tags: testing +--- +HUnit - biblioteki do pisania testów dla języków Haskell i Eta. + + + diff --git a/_collections/_libs/jackson.html b/_collections/_libs/jackson.html new file mode 100644 index 00000000..efc604f3 --- /dev/null +++ b/_collections/_libs/jackson.html @@ -0,0 +1,6 @@ +--- +lib: jackson +title: Jackson +langs: java +tags: json +--- diff --git a/_collections/_libs/jdbi.html b/_collections/_libs/jdbi.html new file mode 100644 index 00000000..e5147045 --- /dev/null +++ b/_collections/_libs/jdbi.html @@ -0,0 +1,6 @@ +--- +lib: jdbi +title: JDBI +langs: java +tags: sql +--- diff --git a/_collections/_libs/jolt.html b/_collections/_libs/jolt.html new file mode 100644 index 00000000..0b8092b4 --- /dev/null +++ b/_collections/_libs/jolt.html @@ -0,0 +1,6 @@ +--- +lib: jolt +title: Jolt +langs: java +tags: json +--- diff --git a/_collections/_libs/jool.html b/_collections/_libs/jool.html new file mode 100644 index 00000000..bd07f80c --- /dev/null +++ b/_collections/_libs/jool.html @@ -0,0 +1,6 @@ +--- +lib: jool +title: JOOL +langs: java +tags: fp +--- diff --git a/_collections/_libs/jooq.html b/_collections/_libs/jooq.html new file mode 100644 index 00000000..38049401 --- /dev/null +++ b/_collections/_libs/jooq.html @@ -0,0 +1,6 @@ +--- +lib: jooq +title: JOOQ +langs: java +tags: sql +--- diff --git a/_collections/_libs/jquery.html b/_collections/_libs/jquery.html new file mode 100644 index 00000000..5452ea13 --- /dev/null +++ b/_collections/_libs/jquery.html @@ -0,0 +1,6 @@ +--- +lib: jquery +langs: javascript +title: JQuery +--- +JQuery \ No newline at end of file diff --git a/_collections/_libs/jsonpath.html b/_collections/_libs/jsonpath.html new file mode 100644 index 00000000..814e2659 --- /dev/null +++ b/_collections/_libs/jsonpath.html @@ -0,0 +1,6 @@ +--- +lib: jsonpath +title: JsonPath +langs: java +tags: json +--- diff --git a/_collections/_libs/jsonsurfer.html b/_collections/_libs/jsonsurfer.html new file mode 100644 index 00000000..21815dc8 --- /dev/null +++ b/_collections/_libs/jsonsurfer.html @@ -0,0 +1,6 @@ +--- +lib: jsonsurfer +title: JsonSurfer +langs: java +tags: json +--- diff --git a/_collections/_libs/logback.html b/_collections/_libs/logback.html new file mode 100644 index 00000000..157626f6 --- /dev/null +++ b/_collections/_libs/logback.html @@ -0,0 +1,8 @@ +--- +lib: logback +title: Logback +langs: java +tags: logging +--- +Locback - biblioteka do logowania dla języków +Java, Kotlin i Scala. diff --git a/_collections/_libs/macwire.html b/_collections/_libs/macwire.html new file mode 100644 index 00000000..26b32d7a --- /dev/null +++ b/_collections/_libs/macwire.html @@ -0,0 +1,6 @@ +--- +lib: macwire +title: MacWire +langs: scala +tags: http +--- diff --git a/_collections/_libs/megaparsec.html b/_collections/_libs/megaparsec.html new file mode 100644 index 00000000..104e7b1a --- /dev/null +++ b/_collections/_libs/megaparsec.html @@ -0,0 +1,24 @@ +--- +lib: megaparsec +title: Megaparsec +langs: haskell eta +tags: parser +--- +MegaParsec - biblioteka do budowania parserów dla języków Haskell i Eta + diff --git a/_collections/_libs/minimal-mistakes.html b/_collections/_libs/minimal-mistakes.html new file mode 100644 index 00000000..c7f53985 --- /dev/null +++ b/_collections/_libs/minimal-mistakes.html @@ -0,0 +1,4 @@ +--- +lib: minimal-mistakes +title: Minimal-mistakes +--- diff --git a/_collections/_libs/optparse-applicative.html b/_collections/_libs/optparse-applicative.html new file mode 100644 index 00000000..526e6bb5 --- /dev/null +++ b/_collections/_libs/optparse-applicative.html @@ -0,0 +1,5 @@ +--- +lib: optparse-applicative +title: optparse-applicative +langs: haskell eta +--- diff --git a/_collections/_libs/parsec.html b/_collections/_libs/parsec.html new file mode 100644 index 00000000..86fb8383 --- /dev/null +++ b/_collections/_libs/parsec.html @@ -0,0 +1,12 @@ +--- +lib: parsec +title: Parsec +langs: haskell eta +tags: parser +--- +Parsec - biblioteka do budowania parserów dla języków Haskell i Eta + diff --git a/_collections/_libs/pulsar.html b/_collections/_libs/pulsar.html new file mode 100644 index 00000000..62629fac --- /dev/null +++ b/_collections/_libs/pulsar.html @@ -0,0 +1,9 @@ +--- +lib: pulsar +langs: clojure +title: Pulsar +--- +Pulsar - biblioteka dla języka Clojure, +która umożliwia programowanie z użyciem włókien (ang. fiber), +kanałów jak w języku Go +oraz aktoróœ w jak w języku Erlang. \ No newline at end of file diff --git a/_collections/_libs/quasar.html b/_collections/_libs/quasar.html new file mode 100644 index 00000000..e91226f8 --- /dev/null +++ b/_collections/_libs/quasar.html @@ -0,0 +1,9 @@ +--- +lib: quasar +langs: kotlin +title: Quasar +--- +Quasar - biblioteka dla języka Kotlin, +która umożliwia programowanie z użyciem włókien (ang. fiber), +kanałów jak w języku Go +oraz aktoróœ w jak w języku Erlang. diff --git a/_collections/_libs/quickcheck.html b/_collections/_libs/quickcheck.html new file mode 100644 index 00000000..be259061 --- /dev/null +++ b/_collections/_libs/quickcheck.html @@ -0,0 +1,12 @@ +--- +lib: quickcheck +title: QuickCheck +langs: haskell eta +tags: testing +--- +QuickCheck - biblioteki do pisania testów dla języków Haskell i Eta. + diff --git a/_collections/_libs/readp.html b/_collections/_libs/readp.html new file mode 100644 index 00000000..91323cd9 --- /dev/null +++ b/_collections/_libs/readp.html @@ -0,0 +1,27 @@ +--- +lib: readp +title: ReadP +langs: haskell eta +tags: parser +--- +ReadP - biblioteka do budowania parserów dla języków Haskell i Eta. + diff --git a/_collections/_libs/scala-guice.html b/_collections/_libs/scala-guice.html new file mode 100644 index 00000000..57659beb --- /dev/null +++ b/_collections/_libs/scala-guice.html @@ -0,0 +1,6 @@ +--- +lib: scala-guice +title: Scala Guice +langs: scala +tags: di +--- diff --git a/_collections/_libs/scala-optparse-applicative.html b/_collections/_libs/scala-optparse-applicative.html new file mode 100644 index 00000000..8d537819 --- /dev/null +++ b/_collections/_libs/scala-optparse-applicative.html @@ -0,0 +1,5 @@ +--- +lib: scala-optparse-applicative +title: scala-optparse-applicative +langs: scala +--- diff --git a/_collections/_libs/scalatest.html b/_collections/_libs/scalatest.html new file mode 100644 index 00000000..68dff4b2 --- /dev/null +++ b/_collections/_libs/scalatest.html @@ -0,0 +1,7 @@ +--- +lib: scalatest +title: ScalaTest +langs: scala +tags: testing +--- +ScalaTest to biblioteka do testów jednostkowych i akceptacyjnych dla języka Scala. diff --git a/_collections/_libs/scalatra.html b/_collections/_libs/scalatra.html new file mode 100644 index 00000000..94303ab1 --- /dev/null +++ b/_collections/_libs/scalatra.html @@ -0,0 +1,6 @@ +--- +lib: scalatra +title: Scalatra +langs: scala +tags: http +--- diff --git a/_collections/_libs/scalawui.html b/_collections/_libs/scalawui.html new file mode 100644 index 00000000..194fce38 --- /dev/null +++ b/_collections/_libs/scalawui.html @@ -0,0 +1,6 @@ +--- +lib: scalawui +title: ScalaWUI +langs: scala +tags: http +--- diff --git a/_collections/_libs/scalaz.html b/_collections/_libs/scalaz.html new file mode 100644 index 00000000..327eef70 --- /dev/null +++ b/_collections/_libs/scalaz.html @@ -0,0 +1,8 @@ +--- +lib: scalaz +title: Scalaz +langs: scala +tags: testing +--- +Scalaz - biblioteka dla języka Scala, +która umożliwia programowanie czysto-funkcyjne znane z języka Haskell. \ No newline at end of file diff --git a/_collections/_libs/semigroupoids.html b/_collections/_libs/semigroupoids.html new file mode 100644 index 00000000..084b42c0 --- /dev/null +++ b/_collections/_libs/semigroupoids.html @@ -0,0 +1,6 @@ +--- +lib: semigroupoids +title: Semigroupoids +langs: haskell +--- +Semigroupoids diff --git a/_collections/_libs/shocon.html b/_collections/_libs/shocon.html new file mode 100644 index 00000000..c1545078 --- /dev/null +++ b/_collections/_libs/shocon.html @@ -0,0 +1,7 @@ +--- +lib: shocon +title: SHocon +langs: scala +tags: hocon +--- +SHocon diff --git a/_collections/_libs/slogging.html b/_collections/_libs/slogging.html new file mode 100644 index 00000000..a1c6cc54 --- /dev/null +++ b/_collections/_libs/slogging.html @@ -0,0 +1,7 @@ +--- +lib: slogging +title: slogging +langs: scala +tags: logging +--- +slogging to biblioteka do logowania dla języka Scala. diff --git a/_collections/_libs/specs2.html b/_collections/_libs/specs2.html new file mode 100644 index 00000000..e5067d98 --- /dev/null +++ b/_collections/_libs/specs2.html @@ -0,0 +1,7 @@ +--- +lib: specs2 +title: specs2 +langs: scala +tags: testing +--- +specs2 to biblioteka do testów jednostkowych i akceptacyjnych dla języka Scala. diff --git a/_collections/_libs/sqlite.html b/_collections/_libs/sqlite.html new file mode 100644 index 00000000..f693f66a --- /dev/null +++ b/_collections/_libs/sqlite.html @@ -0,0 +1,5 @@ +--- +lib: sqlite +title: SQLite +tags: database +--- diff --git a/_collections/_libs/stoml.html b/_collections/_libs/stoml.html new file mode 100644 index 00000000..eb5bcdcc --- /dev/null +++ b/_collections/_libs/stoml.html @@ -0,0 +1,8 @@ +--- +lib: stoml +title: STOML +langs: scala +tags: toml +--- +STOML +toml-scala diff --git a/_collections/_libs/trifecta.html b/_collections/_libs/trifecta.html new file mode 100644 index 00000000..1337dfd1 --- /dev/null +++ b/_collections/_libs/trifecta.html @@ -0,0 +1,15 @@ +--- +lib: trifecta +title: Trifecta +langs: haskell +tags: parser +--- +Trifecta - biblioteka do budowania parserów dla języka Haskell. + diff --git a/_collections/_libs/udash.html b/_collections/_libs/udash.html new file mode 100644 index 00000000..09115fb4 --- /dev/null +++ b/_collections/_libs/udash.html @@ -0,0 +1,6 @@ +--- +lib: udash +title: Udash +langs: scala +tags: http +--- diff --git a/_collections/_libs/utest.html b/_collections/_libs/utest.html new file mode 100644 index 00000000..29cc70c5 --- /dev/null +++ b/_collections/_libs/utest.html @@ -0,0 +1,7 @@ +--- +lib: utest +title: µTest +langs: scala +tags: testing +--- +utest to biblioteka do testów jednostkowych dla języka Scala. diff --git a/_collections/_libs/vavr-kotlin.html b/_collections/_libs/vavr-kotlin.html new file mode 100644 index 00000000..d91bcbad --- /dev/null +++ b/_collections/_libs/vavr-kotlin.html @@ -0,0 +1,10 @@ +--- +lib: vavr-kotlin +title: vavr-kotlin +langs: kotlin +tags: fp +--- +Vavr integration for Kotlin - biblioteka dla języka Kotlin, +która umożliwia programowanie funkcyjne znane z języków Scala i Ocaml. + +Twitter : @vavr_io \ No newline at end of file diff --git a/_collections/_libs/vavr.html b/_collections/_libs/vavr.html new file mode 100644 index 00000000..b8d76420 --- /dev/null +++ b/_collections/_libs/vavr.html @@ -0,0 +1,10 @@ +--- +lib: vavr +title: Vavr +langs: java +tags: fp +--- +Vavr - biblioteka dla języka Java, +która umożliwia programowanie funkcyjne znane z języków Scala i Ocaml. + +Twitter : @vavr_io \ No newline at end of file diff --git a/_collections/_libs/zio.html b/_collections/_libs/zio.html new file mode 100644 index 00000000..7f4fcc1d --- /dev/null +++ b/_collections/_libs/zio.html @@ -0,0 +1,10 @@ +--- +lib: zio +title: ZIO +langs: scala +tags: fp +--- +ZIO - biblioteka dla języka Scala, +która umożliwia programowanie z użyciem włókien (ang. fiber), +kanałów jak w języku Go +oraz lekkich aktorów w jak w języku Erlang. From f3901114745c75523e37e1a3caf5225960d3775c Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Sun, 10 May 2020 20:01:54 +0200 Subject: [PATCH 007/160] Add tools --- _collections/_tools/bash.html | 4 ++++ _collections/_tools/bucklescript.html | 14 ++++++++++++++ _collections/_tools/cabal.html | 6 ++++++ _collections/_tools/clang.html | 5 +++++ _collections/_tools/clojurescript.html | 11 +++++++++++ _collections/_tools/disqus.html | 4 ++++ _collections/_tools/docker.html | 4 ++++ _collections/_tools/etlas.html | 6 ++++++ _collections/_tools/git.html | 4 ++++ _collections/_tools/github.html | 4 ++++ _collections/_tools/graalvm.html | 5 +++++ _collections/_tools/jekyll.html | 4 ++++ _collections/_tools/jvm.html | 7 +++++++ _collections/_tools/kotlin-js.html | 6 ++++++ _collections/_tools/kotlin-native.html | 6 ++++++ _collections/_tools/llvm.html | 16 ++++++++++++++++ _collections/_tools/lunr.html | 5 +++++ _collections/_tools/node-js.html | 5 +++++ _collections/_tools/pagespeed-insights.html | 4 ++++ _collections/_tools/postgresql.html | 5 +++++ _collections/_tools/sass.html | 4 ++++ _collections/_tools/sbt.html | 6 ++++++ _collections/_tools/scala-js.html | 6 ++++++ _collections/_tools/scala-jvm.html | 5 +++++ _collections/_tools/scala-native.html | 9 +++++++++ _collections/_tools/scalafix.html | 6 ++++++ _collections/_tools/sed.html | 4 ++++ _collections/_tools/seed.html | 7 +++++++ _collections/_tools/solr.html | 5 +++++ _collections/_tools/swagger.html | 4 ++++ _collections/_tools/teavm.html | 5 +++++ _collections/_tools/ubuntu.html | 4 ++++ 32 files changed, 190 insertions(+) create mode 100644 _collections/_tools/bash.html create mode 100644 _collections/_tools/bucklescript.html create mode 100644 _collections/_tools/cabal.html create mode 100644 _collections/_tools/clang.html create mode 100644 _collections/_tools/clojurescript.html create mode 100644 _collections/_tools/disqus.html create mode 100644 _collections/_tools/docker.html create mode 100644 _collections/_tools/etlas.html create mode 100644 _collections/_tools/git.html create mode 100644 _collections/_tools/github.html create mode 100644 _collections/_tools/graalvm.html create mode 100644 _collections/_tools/jekyll.html create mode 100644 _collections/_tools/jvm.html create mode 100644 _collections/_tools/kotlin-js.html create mode 100644 _collections/_tools/kotlin-native.html create mode 100644 _collections/_tools/llvm.html create mode 100644 _collections/_tools/lunr.html create mode 100644 _collections/_tools/node-js.html create mode 100644 _collections/_tools/pagespeed-insights.html create mode 100644 _collections/_tools/postgresql.html create mode 100644 _collections/_tools/sass.html create mode 100644 _collections/_tools/sbt.html create mode 100644 _collections/_tools/scala-js.html create mode 100644 _collections/_tools/scala-jvm.html create mode 100644 _collections/_tools/scala-native.html create mode 100644 _collections/_tools/scalafix.html create mode 100644 _collections/_tools/sed.html create mode 100644 _collections/_tools/seed.html create mode 100644 _collections/_tools/solr.html create mode 100644 _collections/_tools/swagger.html create mode 100644 _collections/_tools/teavm.html create mode 100644 _collections/_tools/ubuntu.html diff --git a/_collections/_tools/bash.html b/_collections/_tools/bash.html new file mode 100644 index 00000000..57f87458 --- /dev/null +++ b/_collections/_tools/bash.html @@ -0,0 +1,4 @@ +--- +tool: bash +title: Bash +--- \ No newline at end of file diff --git a/_collections/_tools/bucklescript.html b/_collections/_tools/bucklescript.html new file mode 100644 index 00000000..29d4bcd4 --- /dev/null +++ b/_collections/_tools/bucklescript.html @@ -0,0 +1,14 @@ +--- +tool: bucklescript +title: BuckleScript +langs: ocaml meta-language +--- +BuckleScript - transpilator obiektowo-funkcyjnego języka programowania OCaml do języka JavaScript. + diff --git a/_collections/_tools/cabal.html b/_collections/_tools/cabal.html new file mode 100644 index 00000000..53b4c0eb --- /dev/null +++ b/_collections/_tools/cabal.html @@ -0,0 +1,6 @@ +--- +tool: cabal +title: Cabal +langs: haskell +--- +Cabal \ No newline at end of file diff --git a/_collections/_tools/clang.html b/_collections/_tools/clang.html new file mode 100644 index 00000000..67c39705 --- /dev/null +++ b/_collections/_tools/clang.html @@ -0,0 +1,5 @@ +--- +tool: clang +title: Clang +--- +Clang \ No newline at end of file diff --git a/_collections/_tools/clojurescript.html b/_collections/_tools/clojurescript.html new file mode 100644 index 00000000..b36f1d18 --- /dev/null +++ b/_collections/_tools/clojurescript.html @@ -0,0 +1,11 @@ +--- +tool: clojurescript +title: ClojureScript +langs: clojure +--- +ClojureScript - transpilator obiektowo-funkcyjnego języka programowania Clojure do języka JavaScript. + diff --git a/_collections/_tools/disqus.html b/_collections/_tools/disqus.html new file mode 100644 index 00000000..274e16db --- /dev/null +++ b/_collections/_tools/disqus.html @@ -0,0 +1,4 @@ +--- +tool: disqus +title: Disqus +--- \ No newline at end of file diff --git a/_collections/_tools/docker.html b/_collections/_tools/docker.html new file mode 100644 index 00000000..218b61b2 --- /dev/null +++ b/_collections/_tools/docker.html @@ -0,0 +1,4 @@ +--- +tool: docker +title: Docker +--- \ No newline at end of file diff --git a/_collections/_tools/etlas.html b/_collections/_tools/etlas.html new file mode 100644 index 00000000..9a8bd4ef --- /dev/null +++ b/_collections/_tools/etlas.html @@ -0,0 +1,6 @@ +--- +tool: etlas +title: Etlas +langs: eta haskell +--- +Etlas \ No newline at end of file diff --git a/_collections/_tools/git.html b/_collections/_tools/git.html new file mode 100644 index 00000000..ef0af9dc --- /dev/null +++ b/_collections/_tools/git.html @@ -0,0 +1,4 @@ +--- +tool: git +title: Git +--- \ No newline at end of file diff --git a/_collections/_tools/github.html b/_collections/_tools/github.html new file mode 100644 index 00000000..9ba59013 --- /dev/null +++ b/_collections/_tools/github.html @@ -0,0 +1,4 @@ +--- +tool: github +title: Github +--- diff --git a/_collections/_tools/graalvm.html b/_collections/_tools/graalvm.html new file mode 100644 index 00000000..2c554023 --- /dev/null +++ b/_collections/_tools/graalvm.html @@ -0,0 +1,5 @@ +--- +tool: graalvm +title: GraalVM +langs: java +--- diff --git a/_collections/_tools/jekyll.html b/_collections/_tools/jekyll.html new file mode 100644 index 00000000..4b657837 --- /dev/null +++ b/_collections/_tools/jekyll.html @@ -0,0 +1,4 @@ +--- +tool: jekyll +title: Jekyll +--- \ No newline at end of file diff --git a/_collections/_tools/jvm.html b/_collections/_tools/jvm.html new file mode 100644 index 00000000..2395d230 --- /dev/null +++ b/_collections/_tools/jvm.html @@ -0,0 +1,7 @@ +--- +tool: jvm +title: JVM +langs: java +--- +https://pl.wikipedia.org/wiki/Wirtualna_maszyna_Javy +(ang. Java virtual machine, JVM) \ No newline at end of file diff --git a/_collections/_tools/kotlin-js.html b/_collections/_tools/kotlin-js.html new file mode 100644 index 00000000..9e32eaa5 --- /dev/null +++ b/_collections/_tools/kotlin-js.html @@ -0,0 +1,6 @@ +--- +tool: kotlin-js +title: kotlin.js +langs: kotlin +--- +Transpilator Kotlin JS \ No newline at end of file diff --git a/_collections/_tools/kotlin-native.html b/_collections/_tools/kotlin-native.html new file mode 100644 index 00000000..e74786fd --- /dev/null +++ b/_collections/_tools/kotlin-native.html @@ -0,0 +1,6 @@ +--- +tool: kotlin-native +title: Kotlin/Native +langs: kotlin +--- +Kompilator Kotlin Native \ No newline at end of file diff --git a/_collections/_tools/llvm.html b/_collections/_tools/llvm.html new file mode 100644 index 00000000..55145a96 --- /dev/null +++ b/_collections/_tools/llvm.html @@ -0,0 +1,16 @@ +--- +tool: llvm +title: LLVM +--- + +LLVM Haskell Examples +llvm-hs +llvm-hs-pure +llvm-hs-typed + +llvm-general +llvm-general-pure +llvm-general-quote + +llvm-data-interop + diff --git a/_collections/_tools/lunr.html b/_collections/_tools/lunr.html new file mode 100644 index 00000000..f7452a70 --- /dev/null +++ b/_collections/_tools/lunr.html @@ -0,0 +1,5 @@ +--- +tool: lunr +title: Lunr +tags: search +--- \ No newline at end of file diff --git a/_collections/_tools/node-js.html b/_collections/_tools/node-js.html new file mode 100644 index 00000000..0c72deba --- /dev/null +++ b/_collections/_tools/node-js.html @@ -0,0 +1,5 @@ +--- +tool: node-js +title: Node.js +langs: javascript +--- \ No newline at end of file diff --git a/_collections/_tools/pagespeed-insights.html b/_collections/_tools/pagespeed-insights.html new file mode 100644 index 00000000..0a96cd33 --- /dev/null +++ b/_collections/_tools/pagespeed-insights.html @@ -0,0 +1,4 @@ +--- +tool: pagespeed-insights +title: PageSpeed Insights +--- \ No newline at end of file diff --git a/_collections/_tools/postgresql.html b/_collections/_tools/postgresql.html new file mode 100644 index 00000000..a53ac3f2 --- /dev/null +++ b/_collections/_tools/postgresql.html @@ -0,0 +1,5 @@ +--- +tool: postgresql +title: PostgreSQL +tags: database +--- \ No newline at end of file diff --git a/_collections/_tools/sass.html b/_collections/_tools/sass.html new file mode 100644 index 00000000..46839c35 --- /dev/null +++ b/_collections/_tools/sass.html @@ -0,0 +1,4 @@ +--- +tool: sass +title: Sass +--- \ No newline at end of file diff --git a/_collections/_tools/sbt.html b/_collections/_tools/sbt.html new file mode 100644 index 00000000..62ebc27e --- /dev/null +++ b/_collections/_tools/sbt.html @@ -0,0 +1,6 @@ +--- +tool: sbt +title: sbt +langs: scala +--- +Scala Build Tool \ No newline at end of file diff --git a/_collections/_tools/scala-js.html b/_collections/_tools/scala-js.html new file mode 100644 index 00000000..95102a15 --- /dev/null +++ b/_collections/_tools/scala-js.html @@ -0,0 +1,6 @@ +--- +tool: scala-js +title: Scala.js +langs: scala +--- +Transpilator Scala.js \ No newline at end of file diff --git a/_collections/_tools/scala-jvm.html b/_collections/_tools/scala-jvm.html new file mode 100644 index 00000000..b933b33a --- /dev/null +++ b/_collections/_tools/scala-jvm.html @@ -0,0 +1,5 @@ +--- +tool: scala-jvm +title: Scala JVM +langs: scala +--- \ No newline at end of file diff --git a/_collections/_tools/scala-native.html b/_collections/_tools/scala-native.html new file mode 100644 index 00000000..c53b341c --- /dev/null +++ b/_collections/_tools/scala-native.html @@ -0,0 +1,9 @@ +--- +tool: scala-native +title: Scala Native +langs: scala +--- +Kompilator Scala Native. +@scala_native + +Zobacz Awesome Scala Native diff --git a/_collections/_tools/scalafix.html b/_collections/_tools/scalafix.html new file mode 100644 index 00000000..1aabf803 --- /dev/null +++ b/_collections/_tools/scalafix.html @@ -0,0 +1,6 @@ +--- +tool: scalafix +title: Scalafix +langs: scala +--- +Scalafix \ No newline at end of file diff --git a/_collections/_tools/sed.html b/_collections/_tools/sed.html new file mode 100644 index 00000000..3d7c647a --- /dev/null +++ b/_collections/_tools/sed.html @@ -0,0 +1,4 @@ +--- +tool: sed +title: Sed +--- diff --git a/_collections/_tools/seed.html b/_collections/_tools/seed.html new file mode 100644 index 00000000..4e0cae6c --- /dev/null +++ b/_collections/_tools/seed.html @@ -0,0 +1,7 @@ +--- +tool: seed +title: Seed +langs: scala +tags: toml +--- +Seed diff --git a/_collections/_tools/solr.html b/_collections/_tools/solr.html new file mode 100644 index 00000000..b3cf346d --- /dev/null +++ b/_collections/_tools/solr.html @@ -0,0 +1,5 @@ +--- +tool: solr +title: Solr +tags: search +--- \ No newline at end of file diff --git a/_collections/_tools/swagger.html b/_collections/_tools/swagger.html new file mode 100644 index 00000000..c9e45455 --- /dev/null +++ b/_collections/_tools/swagger.html @@ -0,0 +1,4 @@ +--- +tool: swagger +title: Swagger +--- diff --git a/_collections/_tools/teavm.html b/_collections/_tools/teavm.html new file mode 100644 index 00000000..9ac8451c --- /dev/null +++ b/_collections/_tools/teavm.html @@ -0,0 +1,5 @@ +--- +tool: teavm +title: TeaVM +langs: java +--- diff --git a/_collections/_tools/ubuntu.html b/_collections/_tools/ubuntu.html new file mode 100644 index 00000000..960b30ef --- /dev/null +++ b/_collections/_tools/ubuntu.html @@ -0,0 +1,4 @@ +--- +tool: ubuntu +title: Ubuntu +--- \ No newline at end of file From 81328a6ba654f8c6525e7053c372f104b120915d Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Wed, 4 Nov 2020 09:57:04 +0100 Subject: [PATCH 008/160] Add favicon.ico --- android-chrome-192x192.png | Bin 0 -> 9371 bytes android-chrome-512x512.png | Bin 0 -> 26312 bytes apple-touch-icon.png | Bin 0 -> 8623 bytes browserconfig.xml | 9 +++++++++ favicon-16x16.png | Bin 0 -> 469 bytes favicon-32x32.png | Bin 0 -> 1008 bytes favicon.ico | Bin 0 -> 15406 bytes mstile-150x150.png | Bin 0 -> 6295 bytes site.webmanifest | 1 + 9 files changed, 10 insertions(+) create mode 100644 android-chrome-192x192.png create mode 100644 android-chrome-512x512.png create mode 100644 apple-touch-icon.png create mode 100644 browserconfig.xml create mode 100644 favicon-16x16.png create mode 100644 favicon-32x32.png create mode 100644 favicon.ico create mode 100644 mstile-150x150.png create mode 100644 site.webmanifest diff --git a/android-chrome-192x192.png b/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..b71458955d3a4b74623b49673d0f7ac1e32265d3 GIT binary patch literal 9371 zcmeI2^-~mH*!GuNlu$rWLU73?Bo>gRyOyOvxQ`?g9VJ zx^phX000O8Q!4fkwo;*cB zQ`qcFtOasF^$XjU9ZW@a)*PFJbX@7s1DR4!b8Z>J7GWm*PKhWmTPxod4@^e2F!52N ztHCVeb2J7OhaAqVZCl*Y6h2F=*1{9{3xs`TzVstuD`?L`imT=to-`Cf0br@z_gl!b zL(~a%A1g@!^H#Nd;@Dlhf)d@5BTR_x{Rfp8e|S{I2N zCKdn$&%!(1mlDk=jRKPk1v0It-}kLAYGBQg+rFJXB#JTk$Lw`cc$H^-Y42nsQqD{L zNCH^40%!~BQA7(>L;Eo?Isjq}MxfmYW~fBwn_N)>pr$1zkmN!M4o_YO~~Q%*?9LVTy$1$y-c^+1c9m8psQPi1o4ru_pXi6jXw zq$r$7e1I`0NB*l)|EqRT>yYvWWc{)w{!;Kn`kefdrDN+JEJ24-U2rT!Y!GWNWk$4xbv z4@#Qyy7J~s_w=}EB?;*@3%T5pzLC!rFu(c}+>_ifWeUIEw{`R%q{Lbit3^Kr?Y4cZ z-Ppr2HRlXzH5a!3K0fBhLKoqS0pP%^qLU6V_WBvz?K@BFRq^HB9gUDh9;AJ|hV3yc zo%>Ztd!qKF6?ZM%4 zZbo3f@(UD>Sgm>Q>D=SP5)-&n|M;0(F%G|2(kB?*(WBd3j19emoyYIpwB2gv3Toxn zx6e_?-0mzuCo}T|0IJEG>~(I=!K4DCrCiuL0$oNy|6MS7%B)D0OJO3m(VxUEbg>5d zyLv`tV?>;*Wp1Oo*S!D4w$YqQkmJ>Tc@oWSJ7fD$=FwmmrmNyEgAn3Y>f}@$beSB0`ofQWU?WL&R+<)L=xaw zt&c7X1TZ0`TvK~Bc@|WR$8r!gi6`xB=-JCNu^%QNpy&3V1!+@Wf6o-4S6y)6E>3qc z6Z_-iEUp+^cw(*lElGK*0bDk=J^Zrv3H!Tv z*}o3VvU3>OFeUe(!JteA+$Xn|;EG|hK9%1}U)dFE^#4v79CSOmFjYkKHZZaV1qozx zy+I<6&DV2F$+^e>M5!G!X=-`qrr`M;ezUYEV-WGV;oVv`$dSo$S?LXO_-z7BS3Va} z&e1QhAa?3tMW6J!;8-7KEcnfRzif1BCKJB8Q*Up(Wq&EDk}Jt3wfo@9s~sMhzjg^G zn-_~Ws#jO0$9$_*N!DbPq;(w{RW zz006H>C={0goufi@bcL3iqy--eI2x%3K~_0lfp4H;efPl&gNXL2VcsIZoEa+8xoMi$Ovn zXw&_-3~igVFuDQ_)~zHtS3P>K<_X&vQ=EE(yx~pXJQfmNa{KDt;1hGc)|;U1!13Ks zN~f9U=pC*z{;I=~*K9YL#fM4b^%@FJ?%p0OB_s^eS-o1&1`ZO6TA{7RSML5Ek9O*! z^-m?y9;C6RW6Oy(GqseqDs$}Qv{_dgDd~7g(&{E+hO@_uUV^R1q3_h!PV6ApoUx_{ z2j=e_D(}>*-8=%lcUU!=`FA#dU;oxT7&XV@JpdLjunsL3llJ{RPs-G8#o#xrY*^BF zQOAXke1Er_?N5a6 zi1l9DkRm+$B%H=ox!G=|^~e(K_xe81>o<5)i@&9c9%RitYac039hl0x)$B^6*_{rH zb>-uO(7P9UZL$to>Iz0_I(FlhK2Y|~4AU%Jt2$$i{q|@Ym_iQ$S!SFXjO+I1<~5q! zIFQ8pwq5B`HRO}!Tg6lz-xIk(yO2=yTOp?z4_CsUiaZG#=Njq5UMY9YCBfwpr zID8(bIt_PeFYn7Mo%F;C@z0nz+L71ePl`-YP2ibi|#F<0+sr^yR ze7J^_$~wUY-7ZaRmL(3y;oQM`)O3x~OY-=0*8%ikD4gi4Tly4uj@)Y-+MOaab)f|R zs>PL*F{j4JHPST#r0ES8pWh&r+?3YwY%M0$>8HkHL}Nn=vi?M=>TSS3metCL#HhpsB-`iuv1}*G9cfH=;jWvSlMYKcp#;1A~JsQ1stCB3$`I5 z%y9+hrpsCZ1!p~ksy=BL3<}X|;6YhGC=pb~kmlxwr0C<3FC;P+F?>VTzj1%j&Qou1 z8f*2*jCdhPFG?-(^|ZqPuirWT%1O)+m{Jtd-a~^@@@~9DoG`G?3(rb7y)$tqnUmnY zAPrPjyCF?f5g1rGC;ZcHo&NP2mbQ@%x^e*sUSjF6O(nQC&2IX=ht_}w{95(RTSN%5 zAb>TNHkOxYw6NTFRD)ZN9zCJ%XB$XQ7V`4JBB-oOq+M(ewLLQll9cSp9!|p(Ts(X^ zX!`)9(9wO1eN~rsZarReX^o%F%%Dy28qza_M{X{nTq>Zw!QwRKn1=2E+7_$5=T*bU zLDiPelZJ|PpqP1gXd?0|Q6n7B-3o&UnK+@6_>w)WRl(f);dkHr={|uK96Vg=<;Q?2 z_dxZu(9Q8rXyF#aN{x_<^)I{$wuT~0M;PoykXIMuuhUzHXs9gj`@Ld8#g@)A=*(6& zIlbL>USo>Y9BW!E`S%MG@tv0L0Xi^c44!yHdX&Y+Ityd>oBICQpawL>%t`q-=y#q& z+0{vw_*v>!C_~r;R}N5f<@c|=1R4>Lko?MUy+Lg7kICQV;GM_o*$k?`k60R2bfDP=*w5BUoKEo2z2hy5O#E{qS}8yE^sy{U<;6*G5v- z6TLnDSe!)YH{7gWrsvazSUqY{&=Q|YqJQ{s;!~-T(ET;dto7uF_VQ+)V>cXv;mwK| zN^d_aF{qFqccb-?nb=5+N*JIDg?+_Q$@X#y$Fts8PATRyi~yzjTEmH4WMlm66^Q=E zfWBgFJWAvpfJ>})WbItkF*}EiPzbO?_qZRbKY88 zH)|dH0DHw{E~f6B2)=TS0XhbX<>=eRp5&s(6Z}lNTl2@Y=L9+h+-YURsp@E#b3Zdo$Gd z8~OOVTWjK+Y0Eq)$MU`JGCvK9G$CXb1Q=DRidvZvh|jLKmupe9I-~740r?{7dETfR zLxBN@pArVp0R&E`;{K*tj}Z*;G$62H_2j8Ab0fKdU4jmw zBbb1eb6q3*en}-?If@cGUDX{Gb}F855$=EQ%Ql=*e=`5?9N-dv&ac~G+G-81JO6+q zUkJ!01bDliCZzt@ih%;8P@s+hWF0puJjx(*?-H$uJK2lw_*|u9h2p>qQVjS6B8M%W zjJKv36YQqN^X&Ka_kI>3qgaym&VRR%bG8tu0*5A7HQ;njYD?X^Z5fvK!u&7&-|Vsf z6R~%k_$1<+*$+bI?=7hz@-7ZlV6Pt&o8B-5_YyYZG+naqBPcA8{gSYp5z~EGMjo7k zml1S~N4A8l*(}5SzA1G-_p!meiwHkvSe{q-iS6KSxT3NQrL}{v^)dXJfU~*IjzR%> zQA1rE)$DpULQKALq8S#Fv4~l4FY}5J3}Y4|nJ*a?9@cfqaj9@fr9qrK3DJ2ia=LN# zP-EGYfdHIG>dHOBo1*=g5YM<(3!QWMG;eE^bN)N+-G}%5yK5=!q14ixV)8-&M*gqt z8c(e(^=FsUWKPZwIFa88QhEArWihgnVB7C9^<%1oiu9g&db4xUgP(<;yBm>hF`LhK z1{sk(<)7co#tDxF-1GDOjmKp`1D?r;Nd;-PB4I?2GL!0qh|q6}a|;W~ifk%XaB`^m7?f3EjQZ75CMYcQeU$DP4D5%?@c-t=x;3Wzu?oag+ekaCT9-;VAa8tP0ArE(aHEJ5A z*MzfT1r~AJ1Xj-7apUi4_Qg@j*Sth*!=?9t_ z7S*OKwJMP(BYMh#HbvHecN1Fx2(H@|2O8(&u0M=h@y3ERpD~;7XoJ@3>2$B9?*_Sf zfuODqy>pE3GYgz0{fo)>PrGZDgBb1R+EF9xur<4+k9b}QuT65FO3BqxxNB4>hG1Af zLpFYtG#Lj|2CIta@h#y)Y*9Bn?5QMJ>8~dy2lqaRseK8kxRFpIl_>535LN$jM;Cvl zjVRlzHlE35OCmqo2N~KQS5P%sV)35O8r37}s!CY}++uO670xy`S@$P@DppDV`m2#s z?cS_Y=ws6KB`=43p}-E8Bxgbvk}V$~`|;~;NB{FPoeb1NMopa)jMi{^61jlOQenv9 z&-H6tQ+)iuK3Z#!T~Oh@mqn!R^efr+@W6{{l9lhN_d#QiGp+JGnPxsdt@uOw2xw=s zgS-V2F=nY}a%Q{=KWo)cK1dJ%JY#-E;?!V{HS)$7(?f?ul#a8xR0kNeyF;m`3EydR zfX&+@Y2y(T1s&ooVK=qP>GX37nEIkXA*!a#iZif?gDc}-YZvwC`PJ3!nUUc1y<8Ob z*P520W2J#M!z!ITUin0z#uEi)J3|&F?TQ^SVn8auVqC zfu*)Vvjxg6NI{W!WZLcOO2U4yw$ZaMl1vk5`l+zTPc!&(D#HQzQ?B4tFDW|hg=pdc z3U{hQT2^DdVv>{H`gpOJZPT{}g5R#0Afe2c_^4dAH555jQ$FhSUJ`kqZ8q6peL9z8 z$UzTCo5Q$wCFqx0E3cCjW|4(_6aO$)OGx^*UmO$@x+{C_8X?U-zbpN zEx6+9QpBN4n_F|a&V~hU;DcDs1SC3hQBo-ekzjW7-m^yRso=RHoq}K|ARxbUmNwYs zV3iw9DYpLzwbBkj>{7+bZrI5-vJhQj$@RIe0yVYCVBKWIa-%B@h;9k^?gOvBn>ni- zK2a5O-hkvV?&WTGIQXKszPIO6qVU;^a`>)QlP6S70Zd2Z*y8ZEm$slYXZ@r`X-zu; zKlq*V&&Nb9mnl8r`o4X`laQcS*#il&@h4W;3PS38KRofiiqw_Hg_Yasl}Y{1Y=cpS&z2`91% zh2i#fm5#PHG&m9pxjY1W0WlOY06UqQ{(^r-DWjRIUb3RTv3~InIbOO!i|2K_8FVX# z)ezTB$D==lcwRA|c@Xq3BVWHbq!dx0Hc+itcEOX@|GJKAOX9gNr)Y;IWgC&Qhk%NnaDVvV$-&A^nhNcCHXR6jCE?>85GKCGLxEA&fu zNdWW9l>%1|PutOJA_7ne1>N)N``?~FI4ev{Y&}Cfy7*Ym@FGvthQAOP2FK7HwKAD7 zzj1u6{I5;+=>BJhG-QA7e;Un{ze8r{bdO4kKxkIb57+SduE*GceDu5E zmsB|Qe>xqiLmF|e3bG~9tS?8^1zixvsvo&ZOEZ9_Lh_wZh44dg-C`6g@ntL zWvBf8hwSRYd9q2MPO1J9yYT&>bj|WAr)o~qkI38i4YOY#!sez#WdHOvr{=zi1+9>^ z+Z(}Y6ya|~IHH7TeGmM-kyqxA64Wp>B@rv`WwpfcwX`MhEqoX_WvVTswcp z00Z>Rw($!GtBvrdXi6}P8T&M4eHZXAijPZDe~a!{U~@(g;fcRus+G(|7d#@IIj|(5 zPZmZVa}Wx>DU;#j{&fPSp$UIVGd|Opv-$Hnjt$s-N0sJEAQ_1}&9vuLbM@%IAa6%; zj;c%XG03{V)z`&>H+w;e&$j-?k%Hcx^Pup|!=H6+V#l@~8M(o$>-@?OZ`Hxa3fvb8 zT2mpW?L-txV`;|%!!JRtY#ngBu=*aU5P|{VLLwWJD$v*(P%WlSK3`15Cd-B@0d}}9ub=X370v?^R8vV_Po;yNfpFyqP zil#bq{3kKbSP1yt)&RU3!SF+U~i_{C=xE3kD&h2ZE?y^eL`pCDJMdw{1D2zZIFV((${a zNb#%fJ{p6~CbRT6%xZ5mi%_Z1T%SZcJmtecD+6KIEbkGsN=xQuC0 zHn`O-UsLiw8FiH03)WdeV=qL6+<4d@p`Ls=zPp=IwDRk`6J;%^oV(v=ILfi4u>gKF zJ#A!{)U_YSfN5OdJ@m0LV;e{rHOkuNulml(F#Wfp$hD>ypl`$cRVX-`Xn^N1h8a+d zT0$FB?T1#j4|(1e<$TM|*$(K-jcSI1zwj*aNBjXM#pig*Jj^AaXNrrn3~Y+f=%VpS z`~6$oI?7*gy$k}l+PHjFG@BXrPOeYtx_U;EurQsv*2xj+5E*IK-yJm-L1^W@u$(z1 z9mU@ukONIYZ%F6Q;{cQ;1HM#+4mqFMB}vWj#>z)H)8b?@*ldk$0UQgfR8GYT)x~zI zUW}ac;xie9GfvUo+;krheArlJF#dyRp}$dYJARX~>L%CgjyyO6APX;+L_&EWPMjYt zS#=x$8u9QCB?TGQX=!thzn-4%s@pxOSVIHw`1ID{J6ZbG=MZHBI>4`x^AFWBRF9b9 zsjb)yHR(j?b^}_W$RugI!N<(Zra;elQ@wUgLwS`+eMwidZZq4(=ie(V(M91{f7`r( zihlzsWTso{^BVlUj*ur470XGI!tOPv-wW0Z%IB^Er}l}y?Bga7$eFR-ZGt}1@HFrd^&nYGN8*OfBd?>ne3eUom}*1RV>h-^9-mQr~}y`{nxe{*`zGJ-dqU#(~3) zin3W@!M(d=qG!J@%)K(triWUHxg5GbRsYdkUqn|+|sGqJT2SWdlX*a~7 zEjE|asPd@I0=HgJ-QG0;Xodxwf<&8i@e03JQg5)d4-PrQp_VJIoIlwmtpq#84|~*9 z;2EC4cH4&tZSHTE=Q1Kp0f%eP;mC^^a@rnUoga|J$McCr5{98T@|R>k0%zhL!C(0`-&99d^f1lBa{2aw zQKjOSUyug(%AqJ)QxfFTZ75Gnd{@qHUe3jPn@GF5-mEybo|wLzureXQBX*a>2~R#{ z+UF?~m1-q6HpMY|ClZ9a(=F0lUHua%kG&Ra-A}|F9JE93Ql+}m`9S`R!?0PKX}@jX zmGNY97MHr=0!UmWUdpG#2jptrOnGcQdn5^#P6q1z6D-}qB?wz5tn78xo1+f8=zm}U zp}~JFz-M8X3a8*5AtZ1884Wo1>s^Y_WemBK7}}h2j6pWBs1Zby)6O5`5N-%3JImR2EJY`gpYzqu&nNL)hj zK4j`khxPfVOA%#u0c_bkk7^I7V?ac`oq#&F`Hg3tlxDY%pIdZv8EKd9!L(rFpxKjy zX_W;0mO!3%Kr;*j*KLiVZ2!!FAQ{Y>pa(8#`NLS*b}10KK0B=Pp^I#u8Nv{IfP^B} z2KGZG0>CunsApA<+D1ypKmfrFDZ*m2?+&L`BJj)EG&1z9?kC~h-N-UKxG+-6`v`wl z!kY_9c{dtRNHjZ0y!k&^2oo>H$K_w~fqg%T)fixSa(y&(`{g|E&A-4%NL!dZ{*|?TAi>pGW@V zE?d*qt0tC?)4bZAK<3p>KvhF$M`x$>)PbyWotLV7{~07w*HJbMKIV9ZZ2fRBs$ zckDBA2>^Eh#b>fwKE~VWc++D`XYF&R9m?_LQ60)kQ~!ap`7;F8?VmbJ3FD^T9` zGW?a+6r`i$#p~DB)U*Wc=M?8=7iy@zxDa?K9Ez?)!@NF0 zweQ)@;L2E-@|rqlIX&A+)Vp^F{HLhXg!&=`5VuT)_5(-wo^t@-Nf`+}fK8D7a}ww_ z1&D$iQ$i*1uL$e0KY*A)v;7ty2I_8!1K-Q9l+Yb3&Q}EyyVpW0-Hc!s9cC(pg3pX-x}ny z;3iNUSO?6DD(}|;OqH&~LK6Z+*(CpcE(i7oUju6fSjAW&f+0?b3z=Lx)wjwt|8oO0 zhusL~!HEDh)xFx~2fmX{6Hb&jJ;Qz`^G~@W42Che(C?c&&Ah4dq6UsZxS%a;0lA{T z&tHPlzMg+k0lXKpn^;)bVMV za@hZR0P{DIZ6D;q$0tq9WrhPdhN41ATKQgD{GZ2)^WyUl=R2QXyrlrrY6B*NtDeSa z1poawd1xW_jbS5`i@_Ll<;lY*fCyf7Jvr8h&VSzXg4e)0%cE2e9{}s5(;rLBPpJMj zo8sYT88TBFshnj7K=&X6?@;5r)Zd8R0cTULW9zzRr#;97vT*ormvRMD{%3NLveY3I z1@2!pmoEk(iV;t;%z0jpK>js};0Vo?QJSyH(sv^OxH|iZYS&n96-~YWXUM$^(E&r* zvt$Qe%hq56WE`!T(D0Dy2qnNYu$sroynKok!jg;s=(km6GU zy4p<}kG3^OIuqUgzK8!3L5MHd4|&dK0GP60XKE_WW%Z1z{&nb{EaD}BF!pwYOiDaA zuufn|MWFNg?cXWzPKF2D4>Z0?1!(C7r6W|)O8<51;&a4HJmkrBe;0pUJ#~n9NW$Vu zK_T^j(R)6xI=^fP4iQ60-2FSEK@{&KLu*6Q3C@!X9dHnbR|bv2|4z1dGW7(y=|BPP zM?v5_K|N{VZRcRihJW1v_8Cfv_ML3$EsKC@Y!8ZmLqZ< z2)+MbFG+)8Eoihb7-9%oCnTm~|F4UFQLN)m>n@H)fe^%5wu^>Px&Ph~2(_}r0Y*c^ z5kJiz{4=XD6Z@kGI2eQk?WJ1h>Ht~?ysqxtk$(d*Z-RZ(^vZMtFclhjk@a76D3we} z2da+=5%P$&T2$r)L9)eP6QKi7K;NqqqW@RD^A>Q3B|_}~Q}4eQM-A6shX{dV;=fCR3?aco z;KjnXZp*)w)qyPQ|1DKA*sos5fMf{Sjd-H}1{VxSV*MMarx=^BL^j;?{>I}Luzvf` zf{iJmwfc(su57VynwXr=t` zNPY+m2>jbjjt5!5o$v&ngt+bckonj3GC6;vA|WO!-_QeT%h2Q;Qlkr>dijz>i(bQT7$K8>`Unm zMBP*1JM7A2^il4Ozrgob1Q3HF7qZ3+W@rFzWVP)jfcomxU#k$xbV07`⋙y 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 GgZ}}62J0UH literal 0 HcmV?d00001 diff --git a/apple-touch-icon.png b/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6dbed03e5493d8c160a909688e1a6e6005e3c83b GIT binary patch literal 8623 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 + + + + + #da532c + + + diff --git a/favicon-16x16.png b/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..eb04e68648774fd89c9498af9f0bcd10ecafa5d8 GIT binary patch literal 469 zcmV;`0V@89P)A6T^Ok?qA(1CiatPvvZ!5PEyRUTix8YmOodTdM1o{YBO@45&9v!bQEjS4 zv1L5`8QJGpIf2ZIs$|E-E683dHE?|$ zsdfrYJm16Z0S@n?aR|q-NMcm9zBhl_;Heb z=^`K!EUD)GcqzW>Dn3t@Dn^=l6|tKr#wglCjQ{^9{)=In)j0nGP@sbOF9Fw300000 LNkvXXu0mjfAu-jo literal 0 HcmV?d00001 diff --git a/favicon-32x32.png b/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..c86a57909909d078766b3934ff4095e558179544 GIT binary patch literal 1008 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 aM+C6NK<#~~CY6G70nmQ(OdX|W6Y(GXII{`> literal 0 HcmV?d00001 diff --git a/site.webmanifest b/site.webmanifest new file mode 100644 index 00000000..45dc8a20 --- /dev/null +++ b/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file From 928a39663ff63f01ddf632338d95716725c1c0bb Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Fri, 6 Nov 2020 13:41:50 +0100 Subject: [PATCH 009/160] Create README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..4ebbf269 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# writeonly.github.io +Read https://writeonly.github.io From f6beab37cfc431cc5e44a675c3aeed9cbc4eac6f Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Sat, 16 May 2020 17:20:27 +0200 Subject: [PATCH 010/160] Add projects --- _collections/_projects/helcam.html | 13 +++++++++++++ _collections/_projects/hell.html | 6 ++++++ _collections/_projects/helms.html | 6 ++++++ _collections/_projects/helpa.html | 10 ++++++++++ _collections/_projects/helvm.html | 6 ++++++ _collections/_projects/linkchecker.html | 5 +++++ _collections/_projects/resentiment.html | 5 +++++ 7 files changed, 51 insertions(+) create mode 100644 _collections/_projects/helcam.html create mode 100644 _collections/_projects/hell.html create mode 100644 _collections/_projects/helms.html create mode 100644 _collections/_projects/helpa.html create mode 100644 _collections/_projects/helvm.html create mode 100644 _collections/_projects/linkchecker.html create mode 100644 _collections/_projects/resentiment.html diff --git a/_collections/_projects/helcam.html b/_collections/_projects/helcam.html new file mode 100644 index 00000000..79dd42e1 --- /dev/null +++ b/_collections/_projects/helcam.html @@ -0,0 +1,13 @@ +--- +project: helcam +title: 🚁 HelCam +langs: haskell +--- +🚁 HelCam to interpreter ezoterycznych języków programowania. +W tej chwili są obsługiwane języki: + diff --git a/_collections/_projects/hell.html b/_collections/_projects/hell.html new file mode 100644 index 00000000..1add85bc --- /dev/null +++ b/_collections/_projects/hell.html @@ -0,0 +1,6 @@ +--- +project: hell +title: HelL +langs: haskell +--- +HelL diff --git a/_collections/_projects/helms.html b/_collections/_projects/helms.html new file mode 100644 index 00000000..e94ba611 --- /dev/null +++ b/_collections/_projects/helms.html @@ -0,0 +1,6 @@ +--- +project: helms +title: HelMS +langs: haskell +--- +HelMS diff --git a/_collections/_projects/helpa.html b/_collections/_projects/helpa.html new file mode 100644 index 00000000..f0a5e124 --- /dev/null +++ b/_collections/_projects/helpa.html @@ -0,0 +1,10 @@ +--- +project: helpa +title: 🧑‍🏭 HelPA +langs: haskell +--- +HelPA to assembler dla ezoterycznych języków programowania. +W tej chwili są obsługiwane języki: + diff --git a/_collections/_projects/helvm.html b/_collections/_projects/helvm.html new file mode 100644 index 00000000..f7237c05 --- /dev/null +++ b/_collections/_projects/helvm.html @@ -0,0 +1,6 @@ +--- +project: helvm +title: HelVM +langs: haskell +--- +HelVM diff --git a/_collections/_projects/linkchecker.html b/_collections/_projects/linkchecker.html new file mode 100644 index 00000000..79e1d838 --- /dev/null +++ b/_collections/_projects/linkchecker.html @@ -0,0 +1,5 @@ +--- +project: linkchecker +title: LinkChecker +langs: scala +--- diff --git a/_collections/_projects/resentiment.html b/_collections/_projects/resentiment.html new file mode 100644 index 00000000..47ef8810 --- /dev/null +++ b/_collections/_projects/resentiment.html @@ -0,0 +1,5 @@ +--- +project: resentiment +title: Resentiment +langs: scala +--- From 5b37bdf299da108823373171f1446c9d93b4695e Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Thu, 30 Apr 2020 21:29:40 +0200 Subject: [PATCH 011/160] Add eso --- _collections/_eso/beatnik.html | 5 +++++ _collections/_eso/brainfuck.html | 6 ++++++ _collections/_eso/eas.html | 7 +++++++ _collections/_eso/esoassembly.html | 7 +++++++ _collections/_eso/eta.html | 6 ++++++ _collections/_eso/false.html | 18 ++++++++++++++++++ _collections/_eso/funge.html | 6 ++++++ _collections/_eso/piet.html | 11 +++++++++++ _collections/_eso/sponge.html | 7 +++++++ _collections/_eso/sqasm.html | 7 +++++++ _collections/_eso/subleq.html | 6 ++++++ _collections/_eso/wasm.html | 7 +++++++ _collections/_eso/whitespace.html | 14 ++++++++++++++ _collections/_eso/wsa.html | 7 +++++++ 14 files changed, 114 insertions(+) create mode 100644 _collections/_eso/beatnik.html create mode 100644 _collections/_eso/brainfuck.html create mode 100644 _collections/_eso/eas.html create mode 100644 _collections/_eso/esoassembly.html create mode 100644 _collections/_eso/eta.html create mode 100644 _collections/_eso/false.html create mode 100644 _collections/_eso/funge.html create mode 100644 _collections/_eso/piet.html create mode 100644 _collections/_eso/sponge.html create mode 100644 _collections/_eso/sqasm.html create mode 100644 _collections/_eso/subleq.html create mode 100644 _collections/_eso/wasm.html create mode 100644 _collections/_eso/whitespace.html create mode 100644 _collections/_eso/wsa.html diff --git a/_collections/_eso/beatnik.html b/_collections/_eso/beatnik.html new file mode 100644 index 00000000..b1cfa468 --- /dev/null +++ b/_collections/_eso/beatnik.html @@ -0,0 +1,5 @@ +--- +eso: beatnik +title: Beatnik +tags: esolang +--- diff --git a/_collections/_eso/brainfuck.html b/_collections/_eso/brainfuck.html new file mode 100644 index 00000000..6446873c --- /dev/null +++ b/_collections/_eso/brainfuck.html @@ -0,0 +1,6 @@ +--- +eso: brainfuck +title: 🌈 BrainFuck +tags: esolang +color: rainbow +--- diff --git a/_collections/_eso/eas.html b/_collections/_eso/eas.html new file mode 100644 index 00000000..408c9190 --- /dev/null +++ b/_collections/_eso/eas.html @@ -0,0 +1,7 @@ +--- +eso: ets +title: ❤️ EAS +tags: assembler +color: red +--- +Assembler dla ❤️ ETA diff --git a/_collections/_eso/esoassembly.html b/_collections/_eso/esoassembly.html new file mode 100644 index 00000000..a2ebf478 --- /dev/null +++ b/_collections/_eso/esoassembly.html @@ -0,0 +1,7 @@ +--- +lang: esoassembly +title: EsoAssembly +description: '' +redirect_from: +- langs/easm +--- diff --git a/_collections/_eso/eta.html b/_collections/_eso/eta.html new file mode 100644 index 00000000..ba3a5936 --- /dev/null +++ b/_collections/_eso/eta.html @@ -0,0 +1,6 @@ +--- +eso: eta +title: ❤️ ETA +tags: esolang +color: red +--- diff --git a/_collections/_eso/false.html b/_collections/_eso/false.html new file mode 100644 index 00000000..1ea26cbf --- /dev/null +++ b/_collections/_eso/false.html @@ -0,0 +1,18 @@ +--- +eso: false +title: False +tags: esolang +--- + +Istnieją w Haskellu dwie implementacje ezoterycznego języka False: + + +Przykładowy program: +
+{[n: 0 1 [n;0=~][$2o+n;1-n:]# %%]f: 300f;!}
+[0 1 @ [0=~][1o3o+\1-]# %%%]f: 300f;!
+{4 0 1 @ 1o 3o + \ 1 -}
+
diff --git a/_collections/_eso/funge.html b/_collections/_eso/funge.html new file mode 100644 index 00000000..848aa116 --- /dev/null +++ b/_collections/_eso/funge.html @@ -0,0 +1,6 @@ +--- +eso: funge +title: 💛 Funge +tags: esolang +color: yellow +--- diff --git a/_collections/_eso/piet.html b/_collections/_eso/piet.html new file mode 100644 index 00000000..a9ee2c69 --- /dev/null +++ b/_collections/_eso/piet.html @@ -0,0 +1,11 @@ +--- +eso: piet +title: 💚 Piet +tags: esolang +color: green +--- + +Istnieje jeden interpreter ezoterycznego języka 💚 Piet napisany w Haskellu: + diff --git a/_collections/_eso/sponge.html b/_collections/_eso/sponge.html new file mode 100644 index 00000000..f0718d99 --- /dev/null +++ b/_collections/_eso/sponge.html @@ -0,0 +1,7 @@ +--- +eso: sponge +title: 💛 Sponge +tags: esolang scheme +color: yellow +--- +Kompilator podzbioru Scheme do Funge diff --git a/_collections/_eso/sqasm.html b/_collections/_eso/sqasm.html new file mode 100644 index 00000000..8b545812 --- /dev/null +++ b/_collections/_eso/sqasm.html @@ -0,0 +1,7 @@ +--- +eso: sqasm +title: 💙 SqAsm +tags: assembler +color: blue +--- +Assembler dla 💙 SubLeq diff --git a/_collections/_eso/subleq.html b/_collections/_eso/subleq.html new file mode 100644 index 00000000..88d39c01 --- /dev/null +++ b/_collections/_eso/subleq.html @@ -0,0 +1,6 @@ +--- +eso: subleq +title: 💙 SubLeq +tags: esolang +color: blue +--- diff --git a/_collections/_eso/wasm.html b/_collections/_eso/wasm.html new file mode 100644 index 00000000..32ad266f --- /dev/null +++ b/_collections/_eso/wasm.html @@ -0,0 +1,7 @@ +--- +eso: wasm +title: WAsm +tags: assembler +color: black +--- +🖤 Assembler Maszyny W diff --git a/_collections/_eso/whitespace.html b/_collections/_eso/whitespace.html new file mode 100644 index 00000000..802e2afe --- /dev/null +++ b/_collections/_eso/whitespace.html @@ -0,0 +1,14 @@ +--- +eso: whitespace +title: 🤍 WhiteSpace +tags: esolang +color: white +--- + +Istnieją cztery interpretery ezoterycznego języka 🤍 WhiteSpace napisane w Haskellu: + diff --git a/_collections/_eso/wsa.html b/_collections/_eso/wsa.html new file mode 100644 index 00000000..e09d149f --- /dev/null +++ b/_collections/_eso/wsa.html @@ -0,0 +1,7 @@ +--- +eso: wsa +title: 🤍 WSA +tags: assembler +color: white +--- +Assembler dla 🤍 WhiteSpace From e7c8e52c7a611ecffc18cbb0ba294e7d1b04f26a Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Wed, 4 Nov 2020 14:59:03 +0100 Subject: [PATCH 012/160] Add _includes --- _includes/head/critical.css | 843 ++++++++++++++++++++++++++++++++++++ 1 file changed, 843 insertions(+) create mode 100644 _includes/head/critical.css diff --git a/_includes/head/critical.css b/_includes/head/critical.css new file mode 100644 index 00000000..ec911f49 --- /dev/null +++ b/_includes/head/critical.css @@ -0,0 +1,843 @@ +* { + box-sizing: border-box; +} + +html { + box-sizing: border-box; + background-color: rgb(37, 42, 52); + font-size: 16px; +} + +body { + margin: 0px; +} + +article, +aside, +header, +nav, +section { + display: block; +} + +a { + color: rgb(191, 152, 80); +} + +img { + max-width: 100%; + height: auto; + vertical-align: middle; + border: 0px; +} + +button, +input { + margin: 0px; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + line-height: normal; +} + +button { + -webkit-appearance: button; +} + + + +html { + position: relative; + min-height: 100%; +} + +body { + margin: 0px; + padding: 0px; + color: rgb(234, 234, 234); + font-family: -apple-system, BlinkMacSystemFont, Roboto, 'Segoe UI', 'Helvetica Neue', 'Lucida Grande', Arial, sans-serif; + line-height: 1.5; +} + +h1, +h2, +h3, +h4 { + margin: 2em 0px 0.5em; + line-height: 1.2; + font-family: -apple-system, BlinkMacSystemFont, Roboto, 'Segoe UI', 'Helvetica Neue', 'Lucida Grande', Arial, sans-serif; + font-weight: bold; +} + +h1 { + margin-top: 0px; + font-size: 1.563em; +} + +h2 { + font-size: 1.25em; +} + +h3 { + font-size: 1em; +} + +h4 { + font-size: 0.75em; +} + +p { + margin-bottom: 1.3em; +} + +p, +pre, +ul, +ol { + orphans: 3; + widows: 3; +} + +code, +pre { + font-family: Monaco, Consolas, 'Lucida Console', monospace; +} + +pre { + overflow-x: auto; +} + +p > code, +li > code { + padding-top: 0.1rem; + padding-bottom: 0.1rem; + font-size: 0.8em; + background-color: rgb(31, 36, 44); + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + background-position: initial initial; + background-repeat: initial initial; +} + +p > code::before, +p > code::after, +li > code::before, +li > code::after { + letter-spacing: -0.2em; + content: '\00a0'; +} + +ul li, +ol li { + margin-bottom: 0.5em; +} + +li ul { + margin-top: 0.5em; +} + +nav ul { + margin: 0px; + padding: 0px; +} + +nav li { + list-style: none; +} + +nav a { + text-decoration: none; +} + +nav ul li, +nav ol li { + margin-bottom: 0px; +} + +nav li ul { + margin-top: 0px; +} + + + +.btn { + display: inline-block; + margin-bottom: 0.25em; + padding: 0.5em 1em; + font-family: -apple-system, BlinkMacSystemFont, Roboto, 'Segoe UI', 'Helvetica Neue', 'Lucida Grande', Arial, sans-serif; + font-size: 0.75em; + font-weight: bold; + text-align: center; + text-decoration: none; + border-width: 0px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +.masthead { + position: relative; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: rgb(81, 85, 93); + -webkit-animation: intro 0.3s 0.15s both; + z-index: 20; +} + +.masthead__inner-wrap { + clear: both; + margin-left: auto; + margin-right: auto; + padding: 1em; + max-width: 100%; + display: -webkit-box; + -webkit-box-pack: justify; + font-family: -apple-system, BlinkMacSystemFont, Roboto, 'Segoe UI', 'Helvetica Neue', 'Lucida Grande', Arial, sans-serif; +} + +.masthead__inner-wrap::after { + clear: both; + content: ''; + display: table; +} + +.masthead__inner-wrap nav { + z-index: 10; +} + +.masthead__inner-wrap a { + text-decoration: none; +} + +.site-logo img { + max-height: 2rem; +} + +.site-title { + display: -webkit-box; + font-weight: bold; + z-index: 20; +} + +.site-subtitle { + display: block; + font-size: 0.625em; +} + +.masthead__menu { + float: left; + margin-left: 0px; + margin-right: 0px; + width: 100%; + clear: both; +} + +.masthead__menu ul { + margin: 0px; + padding: 0px; + clear: both; + list-style-type: none; +} + +.masthead__menu-item { + display: block; + list-style-type: none; + white-space: nowrap; +} + +.breadcrumbs { + clear: both; + margin: 0px auto; + max-width: 100%; + padding-left: 1em; + padding-right: 1em; + font-family: -apple-system, BlinkMacSystemFont, Roboto, 'Segoe UI', 'Helvetica Neue', 'Lucida Grande', Arial, sans-serif; + -webkit-animation: intro 0.3s 0.3s both; +} + +.breadcrumbs::after { + clear: both; + content: ''; + display: table; +} + +.breadcrumbs ol { + padding: 0px; + list-style: none; + font-size: 0.75em; +} + +.breadcrumbs li { + display: inline; +} + +.breadcrumbs .current { + font-weight: bold; +} + +.greedy-nav { + position: relative; + display: -webkit-box; + -webkit-box-align: center; + min-height: 2em; + background-color: rgb(37, 42, 52); + background-position: initial initial; + background-repeat: initial initial; +} + +.greedy-nav a { + display: block; + margin: 0px 1rem; + color: rgb(234, 234, 234); + text-decoration: none; +} + +.greedy-nav a.site-logo { + margin-left: 0px; + margin-right: 0.5rem; +} + +.greedy-nav a.site-title { + margin-left: 0px; +} + +.greedy-nav__toggle { + height: 2rem; + border: 0px; + outline: none; + background-color: transparent; +} + +.greedy-nav .visible-links { + display: -webkit-box; + -webkit-box-pack: end; + -webkit-box-flex: 1; + overflow: hidden; +} + +.greedy-nav .visible-links li { + -webkit-box-flex: 0; +} + +.greedy-nav .visible-links a { + position: relative; +} + +.greedy-nav .visible-links a::before { + content: ''; + position: absolute; + left: 0px; + bottom: 0px; + height: 4px; + background-color: rgb(99, 86, 63); + width: 100%; + -webkit-transform: scaleX(0) translate3d(0px, 0px, 0px); + background-position: initial initial; + background-repeat: initial initial; +} + +.greedy-nav .hidden-links { + position: absolute; + top: 100%; + right: 0px; + margin-top: 15px; + padding: 5px; + border: 1px solid rgb(81, 85, 93); + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + background-color: rgb(37, 42, 52); + -webkit-box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px; + box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px; + background-position: initial initial; + background-repeat: initial initial; +} + +.greedy-nav .hidden-links.hidden { + display: none; +} + +.greedy-nav .hidden-links::before { + content: ''; + position: absolute; + top: -11px; + right: 10px; + width: 0px; + border-style: solid; + border-width: 0px 10px 10px; + border-color: rgb(81, 85, 93) transparent; + display: block; + z-index: 0; +} + +.greedy-nav .hidden-links::after { + content: ''; + position: absolute; + top: -10px; + right: 10px; + width: 0px; + border-style: solid; + border-width: 0px 10px 10px; + border-color: rgb(37, 42, 52) transparent; + display: block; + z-index: 1; +} + +.nav__list { + margin-bottom: 1.5em; +} + +.nav__list input[type="checkbox"], +.nav__list label { + display: none; +} + +@media (max-width: 63.9375em) { + .nav__list label { + position: relative; + display: inline-block; + padding: 0.5em 2.5em 0.5em 1em; + color: rgb(122, 130, 136); + font-size: 0.75em; + font-weight: bold; + border: 1px solid rgb(189, 193, 196); + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + z-index: 20; + } + + .nav__list label::before, + .nav__list label::after { + content: ''; + position: absolute; + right: 1em; + top: 1.25em; + width: 0.75em; + height: 0.125em; + line-height: 1; + background-color: rgb(122, 130, 136); + } + + .nav__list label::after { + -webkit-transform: rotate(90deg); + } + + .nav__list ul { + margin-bottom: 1em; + } + + .nav__list a { + display: block; + padding: 0.25em 0px; + } +} + +@media (max-width: 63.9375em) and (min-width: 64em) { + .nav__list a { + padding-top: 0.125em; + padding-bottom: 0.125em; + } +} + +.nav__list .nav__items { + margin: 0px; + font-size: 1.25rem; +} + +.nav__list .nav__items a { + color: inherit; +} + +@media (max-width: 63.9375em) { + .nav__list .nav__items { + position: relative; + max-height: 0px; + overflow: hidden; + z-index: 10; + -webkit-transform: translate(0px, 10%); + } +} + +.nav__title { + margin: 0px; + padding: 0.5rem 0.75rem; + font-family: -apple-system, BlinkMacSystemFont, Roboto, 'Segoe UI', 'Helvetica Neue', 'Lucida Grande', Arial, sans-serif; + font-size: 1em; + font-weight: bold; +} + +.nav__sub-title { + display: block; + margin: 0.5rem 0px; + padding: 0.25rem 0px; + font-family: -apple-system, BlinkMacSystemFont, Roboto, 'Segoe UI', 'Helvetica Neue', 'Lucida Grande', Arial, sans-serif; + font-size: 0.75em; + font-weight: bold; + text-transform: uppercase; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: rgb(81, 85, 93); +} + +.toc { + font-family: -apple-system, BlinkMacSystemFont, Roboto, 'Segoe UI', 'Helvetica Neue', 'Lucida Grande', Arial, sans-serif; + color: rgb(122, 130, 136); + background-color: rgb(37, 42, 52); + border: 1px solid rgb(81, 85, 93); + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-box-shadow: rgba(0, 0, 0, 0.121569) 0px 1px 1px; + box-shadow: rgba(0, 0, 0, 0.121569) 0px 1px 1px; +} + +.toc .nav__title { + color: rgb(255, 255, 255); + font-size: 0.75em; + background-color: rgb(99, 86, 63); + border-top-left-radius: 4px; + border-top-right-radius: 4px; + background-position: initial initial; + background-repeat: initial initial; +} + +.toc__menu { + margin: 0px; + padding: 0px; + width: 100%; + list-style: none; + font-size: 0.75em; +} + +.toc__menu a { + display: block; + padding: 0.25rem 0.75rem; + color: rgb(241, 241, 241); + font-weight: bold; + line-height: 1.5; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: rgb(81, 85, 93); +} + +.toc__menu li ul > li a { + padding-left: 1.25rem; + font-weight: normal; +} + +.page__footer a { + color: inherit; + text-decoration: none; +} + +div.highlighter-rouge { + position: relative; + margin-bottom: 1em; + background-color: rgb(38, 50, 56); + color: rgb(238, 255, 255); + font-family: Monaco, Consolas, 'Lucida Console', monospace; + font-size: 0.75em; + line-height: 1.8; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + background-position: initial initial; + background-repeat: initial initial; +} + +div.highlighter-rouge pre.highlight { + margin: 0px; + padding: 1em; +} + +.highlight pre { + width: 100%; +} + +.highlight .k { + color: rgb(199, 146, 234); +} + +.highlight .o { + color: rgb(137, 221, 255); +} + +.highlight .p { + color: rgb(238, 255, 255); +} + +.highlight .kc { + color: rgb(199, 146, 234); +} + +.highlight .kd { + color: rgb(199, 146, 234); +} + +.highlight .s { + color: rgb(195, 232, 141); +} + +.highlight .na { + color: rgb(130, 170, 255); +} + +.highlight .nx { + color: rgb(130, 170, 255); +} + +.highlight .nt { + color: rgb(137, 221, 255); +} + +.highlight .s2 { + color: rgb(195, 232, 141); +} + +.highlight .s1 { + color: rgb(195, 232, 141); +} + +.hidden { + display: none; + visibility: hidden; +} + +.visually-hidden, +.screen-reader-text, +.screen-reader-shortcut { + clip: rect(1px 1px 1px 1px); + overflow: hidden; + position: absolute !important; + height: 1px !important; + width: 1px !important; + border: 0px !important; +} + +.navicon { + position: relative; + width: 1.5rem; + height: 0.25rem; + background-color: rgb(99, 86, 63); + margin: auto; + background-position: initial initial; + background-repeat: initial initial; +} + +.navicon::before, +.navicon::after { + content: ''; + position: absolute; + left: 0px; + width: 1.5rem; + height: 0.25rem; + background-color: rgb(99, 86, 63); + background-position: initial initial; + background-repeat: initial initial; +} + +.navicon::before { + top: -0.5rem; +} + +.navicon::after { + bottom: -0.5rem; +} + +#main { + clear: both; + margin-left: auto; + margin-right: auto; + padding-left: 1em; + padding-right: 1em; + -webkit-animation: intro 0.3s 0.15s both; + max-width: 100%; +} + +#main::after { + clear: both; + content: ''; + display: table; +} + +body { + display: -webkit-box; + min-height: 100vh; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; +} + +.page .page__inner-wrap { + float: left; + margin-top: 1em; + margin-left: 0px; + margin-right: 0px; + width: 100%; + clear: both; +} + +.page .page__inner-wrap .page__content, +.page .page__inner-wrap .page__meta, +.page .page__inner-wrap .page__share { + position: relative; + float: left; + margin-left: 0px; + margin-right: 0px; + width: 100%; + clear: both; +} + +.page__title { + margin-top: 0px; + line-height: 1; +} + +.page__title + .page__meta { + margin-top: -0.5em; +} + +.page__content h2 { + padding-bottom: 0.5em; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: rgb(81, 85, 93); +} + +.page__content p, +.page__content li { + font-size: 1em; +} + +.page__content p { + margin: 0px 0px 1.3em; +} + +.page__share { + margin-top: 2em; + padding-top: 1em; + border-top-width: 1px; + border-top-style: solid; + border-top-color: rgb(81, 85, 93); +} + +.page__share-title { + margin-bottom: 10px; + font-size: 0.75em; + text-transform: uppercase; +} + +.page__meta { + margin-top: 2em; + color: rgb(241, 241, 241); + font-family: -apple-system, BlinkMacSystemFont, Roboto, 'Segoe UI', 'Helvetica Neue', 'Lucida Grande', Arial, sans-serif; + font-size: 0.75em; +} + +.page__taxonomy .sep { + display: none; +} + +.page__comments { + float: left; + margin-left: 0px; + margin-right: 0px; + width: 100%; + clear: both; +} + +.page__comments-title { + margin-top: 2rem; + margin-bottom: 10px; + padding-top: 2rem; + font-size: 0.75em; + border-top-width: 1px; + border-top-style: solid; + border-top-color: rgb(81, 85, 93); + text-transform: uppercase; +} + +.sidebar { + clear: both; +} + +.sidebar::after { + clear: both; + content: ''; + display: table; +} + +@media (max-width: 64em) { + .sidebar { + position: relative; + z-index: 10; + -webkit-transform: translate3d(0px, 0px, 0px); + } +} + +.sidebar > * { + margin-top: 1em; + margin-bottom: 1em; +} + +.sidebar h3 { + margin-bottom: 0px; + font-family: -apple-system, BlinkMacSystemFont, Roboto, 'Segoe UI', 'Helvetica Neue', 'Lucida Grande', Arial, sans-serif; +} + +.sidebar li { + font-family: -apple-system, BlinkMacSystemFont, Roboto, 'Segoe UI', 'Helvetica Neue', 'Lucida Grande', Arial, sans-serif; + font-size: 0.75em; + line-height: 1.5; +} + +.sidebar__right { + margin-bottom: 1em; +} + +#cookie-notice { + clear: both; + color: rgb(241, 241, 241); + background-color: rgb(26, 29, 36); + display: none; + text-align: center; + padding: 1rem; + margin-left: auto; + margin-right: auto; + margin-top: 2em; + bottom: 0px; + z-index: 0; + position: fixed; + max-width: 100%; +} + +#cookie-notice::after { + clear: both; + content: ''; + display: table; +} + +#cookie-notice a { + display: inline-block; + margin-left: 0.5rem; +} + +.fas, +.far { + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; +} From 7114a6619cfc9155d2678e1e3e76d3cf61c682a1 Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Wed, 25 Mar 2020 22:05:41 +0100 Subject: [PATCH 013/160] Update _data --- _data/navigation.yml | 59 +- _data/ui-text.yml | 1618 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1669 insertions(+), 8 deletions(-) create mode 100644 _data/ui-text.yml diff --git a/_data/navigation.yml b/_data/navigation.yml index e3af8aec..0ce9659e 100644 --- a/_data/navigation.yml +++ b/_data/navigation.yml @@ -1,9 +1,52 @@ main: - - title: "Posts" - url: /posts/ - - title: "Categories" - url: /categories/ - - title: "Tags" - url: /tags/ - - title: "About" - url: /about/ \ No newline at end of file +# - title: "🔍" +# url: /search + - title: "🕵️" + url: /privacy + - title: "✍️" + url: /about + - title: "🔖" + url: /books + - title: "☀️" + url: https://helvm.online/ + - title: "🍆" + url: https://www.degustujacaistota.pl/ + +sidebar-main: + - title: "Artykuły" + url: /posts + children: + - title: "🐈 Po kategoriach" + url: /categories + - title: "🤟 Po językach" + url: /langs + - title: "🧰 Po narzędziach" + url: /tools + - title: "📚 Po bibliotekach" + url: /libs + - title: "🏷️ Po tagach" + url: /tags + - title: "🚧 Po projektach" + url: /projects + - title: "🌈 Eso" + url: /eso + - title: "Strony" + children: +# - title: "🔍 Wyszukiwarka" +# url: /search + - title: "🕵️ Polityka prywatności" + url: /privacy + - title: "✍️ O autorze" + url: /about + - title: "🔖 Przeczytane książki" + url: /books + - title: "☀ HelVM️" + url: https://helvm.online/ + - title: "🍆 Degustująca Istota" + url: https://www.degustujacaistota.pl/ +# - title: "Wyszukiwarki" +# children: +# - title: "Wyszukiwarka Jekyll" +# url: /search-jekyll/ +# - title: "Wyszukiwarka Jekyll Prosta" +# url: /search-jekyll-simple/ diff --git a/_data/ui-text.yml b/_data/ui-text.yml new file mode 100644 index 00000000..69987b62 --- /dev/null +++ b/_data/ui-text.yml @@ -0,0 +1,1618 @@ +# User interface text and labels + +# English (default) +# ----------------- +en: &DEFAULT_EN + skip_links : "Skip links" + skip_primary_nav : "Skip to primary navigation" + skip_content : "Skip to content" + skip_footer : "Skip to footer" + page : "Page" + pagination_previous : "Previous" + pagination_next : "Next" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : "Toggle menu" + search_label : "Toggle search" + toc_label : "On this page" + ext_link_label : "Direct link" + less_than : "less than" + minute_read : "minute read" + share_on_label : "Share on" + meta_label : + tags_label : "Tags:" + categories_label : "Categories:" + date_label : "Updated:" + comments_label : "Leave a comment" + comments_title : "Comments" + more_label : "Learn more" + related_label : "You may also enjoy" + follow_label : "Follow:" + feed_label : "Feed" + powered_by : "Powered by" + website_label : "Website" + email_label : "Email" + recent_posts : "Recent posts" + undefined_wpm : "Undefined parameter words_per_minute at _config.yml" + comment_form_info : "Your email address will not be published. Required fields are marked" + comment_form_comment_label : "Comment" + comment_form_md_info : "Markdown is supported." + comment_form_name_label : "Name" + comment_form_email_label : "Email address" + comment_form_website_label : "Website (optional)" + comment_btn_submit : "Submit comment" + comment_btn_submitted : "Submitted" + comment_success_msg : "Thanks for your comment! It will show on the site once it has been approved." + comment_error_msg : "Sorry, there was an error with your submission. Please make sure all required fields have been completed and try again." + loading_label : "Loading..." + search_label_text : "Enter your search term..." + search_placeholder_text : "Enter your search term..." + results_found : "Result(s) found" + back_to_top : "Back to top" +en-US: + <<: *DEFAULT_EN +en-CA: + <<: *DEFAULT_EN +en-GB: + <<: *DEFAULT_EN +en-AU: + <<: *DEFAULT_EN + +# Spanish +# ------- +es: &DEFAULT_ES + skip_links : "Saltar enlaces" + skip_primary_nav : "Saltar a navegación principal" + skip_content : "Saltar a contenido" + skip_footer : "Saltar a pie" + page : "Página" + pagination_previous : "Anterior" + pagination_next : "Siguiente" + breadcrumb_home_label : "Inicio" + breadcrumb_separator : "/" + menu_label : "Alternar menú" + search_label : "Alternar búsqueda" + toc_label : "En esta página" + ext_link_label : "Enlace directo" + less_than : "menos de" + minute_read : "minuto(s) de lectura" + share_on_label : "Compartir en" + meta_label : + tags_label : "Etiquetas:" + categories_label : "Categorías:" + date_label : "Actualizado:" + comments_label : "Deja un comentario" + comments_title : "Comentarios" + more_label : "Ver más" + related_label : "Puede que también te interese" + follow_label : "Seguir:" + feed_label : "Feed" + powered_by : "Funciona con" + website_label : "Sitio web" + email_label : "Correo electrónico" + recent_posts : "Entradas recientes" + undefined_wpm : "El parámetro words_per_minute (palabras por minuto) no está definido en _config.yml" + comment_form_info : "Tu dirección de correo electrónico no se publicará. Los campos obligatorios están marcados" + comment_form_comment_label : "Comentario" + comment_form_md_info : "Puedes utilizar Markdown" + comment_form_name_label : "Nombre" + comment_form_email_label : "Dirección de correo electrónico" + comment_form_website_label : "Sitio web (opcional)" + comment_btn_submit : "Enviar comentario" + comment_btn_submitted : "Enviado" + comment_success_msg : "¡Gracias por tu comentario! Se publicará una vez sea aprobado." + comment_error_msg : "Ha ocurrido un error al enviar el comentario. Asegúrate de completar todos los campos obligatorios e inténtalo de nuevo." + loading_label : "Cargando..." + search_label_text : "Términos de búsqueda..." + search_placeholder_text : "Términos de búsqueda..." + results_found : "resultado(s) encontrado(s)" + back_to_top : "Volver arriba" +es-ES: + <<: *DEFAULT_ES +es-CO: + <<: *DEFAULT_ES + +# French +# ------ +fr: &DEFAULT_FR + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "Page" + pagination_previous : "Précédent" + pagination_next : "Suivant" + breadcrumb_home_label : "Accueil" + breadcrumb_separator : "/" + menu_label : "Menu" + search_label : + toc_label : "Sur cette page" + ext_link_label : "Lien direct" + less_than : "moins de" + minute_read : "minute(s) de lecture" + share_on_label : "Partager sur" + meta_label : + tags_label : "Tags :" + categories_label : "Catégories :" + date_label : "Mis à jour :" + comments_label : "Laisser un commentaire" + comments_title : "Commentaires" + more_label : "Lire plus" + related_label : "Vous pourriez aimer aussi" + follow_label : "Contact" + feed_label : "Flux" + powered_by : "Propulsé par" + website_label : "Site" + email_label : "Email" + recent_posts : "Posts récents" + undefined_wpm : "Le paramètre words_per_minute n'est pas défini dans _config.yml" + comment_form_info : "Votre adresse email ne sera pas visible. Les champs obligatoires sont marqués" + comment_form_comment_label : "Commentaire" + comment_form_md_info : "Markdown est supporté." + comment_form_name_label : "Nom" + comment_form_email_label : "Adresse mail" + comment_form_website_label : "Site web (optionnel)" + comment_btn_submit : "Envoyer" + comment_btn_submitted : "Envoyé" + comment_success_msg : "Merci pour votre commentaire, il sera visible sur le site une fois approuvé." + comment_error_msg : "Désolé, une erreur est survenue lors de la soumission. Vérifiez que les champs obligatoires ont été remplis et réessayez." + loading_label : "Chargement..." + search_label_text : + search_placeholder_text : "Entrez votre recherche..." + results_found : "Résultat(s) trouvé(s)" + back_to_top : "Retour en haut" +fr-FR: + <<: *DEFAULT_FR +fr-BE: + <<: *DEFAULT_FR +fr-CH: + <<: *DEFAULT_FR + +# Turkish +# ------- +tr: &DEFAULT_TR + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "Sayfa" + pagination_previous : "Önceki" + pagination_next : "Sonraki" + breadcrumb_home_label : "Ana Sayfa" + breadcrumb_separator : "/" + menu_label : + search_label : + toc_label : "İçindekiler" + ext_link_label : "Doğrudan Bağlantı" + less_than : "Şu süreden az: " + minute_read : "dakika tahmini okuma süresi" + share_on_label : "Paylaş" + meta_label : + tags_label : "Etiketler:" + categories_label : "Kategoriler:" + date_label : "Güncelleme tarihi:" + comments_label : "Yorum yapın" + comments_title : "Yorumlar" + more_label : "Daha fazlasını öğrenin" + related_label : "Bunlar ilginizi çekebilir:" + follow_label : "Takip et:" + feed_label : "RSS" + powered_by : "Emeği geçenler: " + website_label : "Web sayfası" + email_label : "E-posta" + recent_posts : "Son yazılar" + undefined_wpm : "_config.yml dosyasında tanımlanmamış words_per_minute parametresi" + comment_form_info : "Email adresiniz gösterilmeyecektir. Zorunlu alanlar işaretlenmiştir" + comment_form_comment_label : "Yorumunuz" + comment_form_md_info : "Markdown desteklenmektedir." + comment_form_name_label : "Adınız" + comment_form_email_label : "Email adresiniz" + comment_form_website_label : "Websiteniz (opsiyonel)" + comment_btn_submit : "Yorum Yap" + comment_btn_submitted : "Gönderildi" + comment_success_msg : "Yorumunuz için teşekkürler! Yorumunuz onaylandıktan sonra sitede gösterilecektir." + comment_error_msg : "Maalesef bir hata oluştu. Lütfen zorunlu olan tüm alanları doldurduğunuzdan emin olun ve sonrasında tekrar deneyin." + loading_label : "Yükleniyor..." + search_label_text : +tr-TR: + <<: *DEFAULT_TR + +# Portuguese +# ---------- +pt: &DEFAULT_PT + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "Página" + pagination_previous : "Anterior" + pagination_next : "Seguinte" + breadcrumb_home_label : "Início" + breadcrumb_separator : "/" + menu_label : + search_label : + toc_label : "Nesta Página" + ext_link_label : "Link Direto" + less_than : "menos de" + minute_read : "minutos de leitura" + share_on_label : "Partilhar no" + meta_label : + tags_label : "Etiquetas:" + categories_label : "Categorias:" + date_label : "Atualizado:" + comments_label : "Deixe um Comentário" + comments_title : "Comentários" + more_label : "Saber mais" + related_label : "Também pode gostar de" + follow_label : "Siga:" + feed_label : "Feed" + powered_by : "Feito com" + website_label : "Site" + email_label : "Email" + recent_posts : "Artigos Recentes" + undefined_wpm : "Parâmetro words_per_minute não definido em _config.yml" + comment_form_info : "O seu endereço email não será publicado. Os campos obrigatórios estão assinalados" + comment_form_comment_label : "Comentário" + comment_form_md_info : "Markdown é suportado." + comment_form_name_label : "Nome" + comment_form_email_label : "Endereço Email" + comment_form_website_label : "Site (opcional)" + comment_btn_submit : "Sumbeter Comentário" + comment_btn_submitted : "Submetido" + comment_success_msg : "Obrigado pelo seu comentário! Será visível no site logo que aprovado." + comment_error_msg : "Lamento, ocorreu um erro na sua submissão. Por favor verifique se todos os campos obrigatórios estão corretamente preenchidos e tente novamente." + loading_label : "A carregar..." + search_label_text : +pt-PT: + <<: *DEFAULT_PT +# Brazilian Portuguese +pt-BR: + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "Página" + pagination_previous : "Anterior" + pagination_next : "Próxima" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : + search_label : "Buscar" + toc_label : "Nesta página" + ext_link_label : "Link direto" + less_than : "menos que" + minute_read : "minuto(s) de leitura" + share_on_label : "Compartilhe" + meta_label : + tags_label : "Tags:" + categories_label : "Categorias:" + date_label : "Atualizado em:" + comments_label : "Deixe um comentário" + comments_title : "Comentários" + more_label : "Saiba mais" + related_label : "Talvez você também goste" + follow_label : "Acompanhe no" + feed_label : "Feed" + powered_by : "Desenvolvido com" + website_label : "Site" + email_label : "E-mail" + recent_posts : "Publicações recentes" + undefined_wpm : "Parâmetro words_per_minute indefinido no _config.yml" + comment_form_info : "Seu e-mail não será publicado. Os campos obrigatórios estão marcados" + comment_form_comment_label : "Comentário" + comment_form_md_info : "Você pode usar Markdown." + comment_form_name_label : "Nome" + comment_form_email_label : "E-mail" + comment_form_website_label : "Site (opcional)" + comment_btn_submit : "Enviar comentário" + comment_btn_submitted : "Enviado" + comment_success_msg : "Obrigado pelo seu comentário! Ele aparecerá no site assim que for aprovado." + comment_error_msg : "Desculpe, ocorreu um erro no envio. Verifique se todos os campos obrigatórios foram preenchidos e tente novamente." + loading_label : "Carregando..." + search_label_text : + search_placeholder_text : "Pesquisar..." + results_found : "Resultado(s) encontrado(s)" + back_to_top : "Voltar para o topo" + +# Italian +# ------- +it: &DEFAULT_IT + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "Pagina" + pagination_previous : "Precedente" + pagination_next : "Prossima" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : + search_label : + toc_label : "Indice della pagina" + ext_link_label : "Link" + less_than : "meno di" + minute_read : "minuto/i di lettura" + share_on_label : "Condividi" + meta_label : + tags_label : "Tags:" + categories_label : "Categorie:" + date_label : "Aggiornato:" + comments_label : "Scrivi un commento" + comments_title : + more_label : "Scopri di più" + related_label : "Potrebbe Piacerti Anche" + follow_label : "Segui:" + feed_label : "Feed" + powered_by : "Powered by" + website_label : "Website" + email_label : "Email" + recent_posts : "Articoli Recenti" + undefined_wpm : "Parametro words_per_minute non definito in _config.yml" + comment_form_info : "Il tuo indirizzo email non sarà pubblicato. Sono segnati i campi obbligatori" + comment_form_comment_label : "Commenta" + comment_form_md_info : "Il linguaggio Markdown è supportato" + comment_form_name_label : "Nome" + comment_form_email_label : "Indirizzo email" + comment_form_website_label : "Sito Web (opzionale)" + comment_btn_submit : "Invia commento" + comment_btn_submitted : "Inviato" + comment_success_msg : "Grazie per il tuo commento! Verrà visualizzato nel sito una volta che sarà approvato." + comment_error_msg : "C'è stato un errore con il tuo invio. Assicurati che tutti i campi richiesti siano stati completati e riprova." + loading_label : "Caricamento..." + search_label_text : + search_placeholder_text : "Inserisci termini di ricerca..." + results_found : "Risultati" + back_to_top : "Vai su" +it-IT: + <<: *DEFAULT_IT + +# Chinese (zh-CN Chinese - China) +# -------------------------------- +zh: &DEFAULT_ZH_HANS + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "页面" + pagination_previous : "向前" + pagination_next : "向后" + breadcrumb_home_label : "首页" + breadcrumb_separator : "/" + menu_label : "切换菜单" + search_label : + toc_label : "在本页上" + ext_link_label : "直接链接" + less_than : "少于" + minute_read : "分钟阅读" + share_on_label : "分享" + meta_label : + tags_label : "标签:" + categories_label : "分类:" + date_label : "更新时间:" + comments_label : "留下评论" + comments_title : "评论" + more_label : "了解更多" + related_label : "猜您还喜欢" + follow_label : "关注:" + feed_label : "Feed" + powered_by : "技术来自于" + website_label : "网站" + email_label : "电子邮箱" + recent_posts : "最新文章" + undefined_wpm : "_config.yml 配置中 words_per_minute 字段未定义" + comment_form_info : "您的电子邮箱地址并不会被展示。请填写标记为必须的字段。" + comment_form_comment_label : "评论" + comment_form_md_info : "支持 Markdown 语法。" + comment_form_name_label : "姓名" + comment_form_email_label : "电子邮箱" + comment_form_website_label : "网站(可选)" + comment_btn_submit : "提交评论" + comment_btn_submitted : "已提交" + comment_success_msg : "感谢您的评论!被批准后它会立即在此站点展示。" + comment_error_msg : "很抱歉,您的提交存在错误。请确保所有必填字段都已填写正确,然后再试一次。" + loading_label : "正在加载..." + search_label_text : + search_placeholder_text : "输入您要搜索的关键词..." + results_found : "条记录匹配" + back_to_top : "返回顶部" +zh-CN: + <<: *DEFAULT_ZH_HANS +zh-SG: + <<: *DEFAULT_ZH_HANS +# Taiwan (Traditional Chinese) +zh-TW: &DEFAULT_ZH_HANT + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "頁面" + pagination_previous : "較舊" + pagination_next : "較新" + breadcrumb_home_label : "首頁" + breadcrumb_separator : "/" + menu_label : "切換選單" + search_label : + toc_label : "本頁" + ext_link_label : "外部連結" + less_than : "少於" + minute_read : "分鐘閱讀" + share_on_label : "分享到" + meta_label : + tags_label : "標籤:" + categories_label : "分類:" + date_label : "更新時間:" + comments_label : "留言" + comments_title : "留言內容" + more_label : "了解更多" + related_label : "猜您有與趣" + follow_label : "追蹤:" + feed_label : "RSS Feed" + powered_by : "Powered by" + website_label : "網站" + email_label : "電子信箱" + recent_posts : "最新文章" + undefined_wpm : "_config.yml 中未定義 words_per_minute" + comment_form_info : "您的電子信箱不會被公開. 必填部份已標記" + comment_form_comment_label : "留言內容" + comment_form_md_info : "支援Markdown語法。" + comment_form_name_label : "名字" + comment_form_email_label : "電子信箱帳號" + comment_form_website_label : "網頁 (可選填)" + comment_btn_submit : "送出留言" + comment_btn_submitted : "已送出" + comment_success_msg : "感謝您的留言! 審核後將會顯示在站上。" + comment_error_msg : "抱歉,部份資料輸入有問題。請確認資料填寫正確後再試一次。" + loading_label : "載入中..." + search_label_text : +zh-HK: + <<: *DEFAULT_ZH_HANT + +# German / Deutsch +# ---------------- +de: &DEFAULT_DE + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "Seite" + pagination_previous : "Vorherige" + pagination_next : "Nächste" + breadcrumb_home_label : "Start" + breadcrumb_separator : "/" + menu_label : "Menü ein-/ausschalten" + search_label : + toc_label : "Auf dieser Seite" + ext_link_label : "Direkter Link" + less_than : "weniger als" + minute_read : "Minuten zum lesen" + share_on_label : "Teilen auf" + meta_label : + tags_label : "Tags:" + categories_label : "Kategorien:" + date_label : "Aktualisiert:" + comments_label : "Hinterlassen Sie einen Kommentar" + comments_title : "Kommentare" + more_label : "Mehr anzeigen" + related_label : "Ihnen gefällt vielleicht auch" + follow_label : "Folgen:" + feed_label : "Feed" + powered_by : "Möglich durch" + website_label : "Webseite" + email_label : "E-Mail" + recent_posts : "Aktuelle Beiträge" + undefined_wpm : "Undefinierter Parameter words_per_minute in _config.yml" + comment_form_info : "Ihre E-Mail Adresse wird nicht veröffentlicht. Benötigte Felder sind markiert" + comment_form_comment_label : "Kommentar" + comment_form_md_info : "Markdown wird unterstützt." + comment_form_name_label : "Name" + comment_form_email_label : "E-Mail-Addresse" + comment_form_website_label : "Webseite (optional)" + comment_btn_submit : "Kommentar absenden" + comment_btn_submitted : "Versendet" + comment_success_msg : "Danke für Ihren Kommentar! Er wird auf der Seite angezeigt, nachdem er geprüft wurde." + comment_error_msg : "Entschuldigung, es gab einen Fehler. Bitte füllen Sie alle benötigten Felder aus und versuchen Sie es erneut." + loading_label : "Lade..." + search_label_text : + search_placeholder_text : "Suchbegriff eingeben..." + results_found : "Ergebnis(se) gefunden" +de-DE: + <<: *DEFAULT_DE +de-AT: + <<: *DEFAULT_DE +de-CH: + <<: *DEFAULT_DE +de-BE: + <<: *DEFAULT_DE +de-LI: + <<: *DEFAULT_DE +de-LU: + <<: *DEFAULT_DE + +# Nepali (Nepal) +# -------------- +ne: &DEFAULT_NE + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "पृष्‍ठ" + pagination_previous : "अघिल्लो" + pagination_next : "अर्को" + breadcrumb_home_label : "गृह" + breadcrumb_separator : "/" + menu_label : "टगल मेनु" + search_label : + toc_label : "यो पृष्‍ठमा" + ext_link_label : "सिधा सम्पर्क" + less_than : "कम्तिमा" + minute_read : "मिनेट पढ्नुहोस्" + share_on_label : "शेयर गर्नुहोस्" + meta_label : + tags_label : "ट्यागहरू:" + categories_label : "वर्गहरु:" + date_label : "अद्यावधिक:" + comments_label : "टिप्पणी दिनुहोस्" + comments_title : "टिप्पणीहरू" + more_label : "अझै सिक्नुहोस्" + related_label : "तपाईं रुचाउन सक्नुहुन्छ " + follow_label : "पछ्याउनुहोस्:" + feed_label : "फिड" + powered_by : "Powered by" + website_label : "वेबसाइट" + email_label : "इमेल" + recent_posts : "ताजा लेखहरु" + undefined_wpm : "अपरिभाषित प्यारामिटर शब्दहरू_प्रति_मिनेट at _config.yml" + comment_form_info : "तपाइँको इमेल ठेगाना प्रकाशित गरिने छैन।आवश्यक जानकारीहरुमा चिन्ह लगाइको छ" + comment_form_comment_label : "टिप्पणी" + comment_form_md_info : "मार्कडाउन समर्थित छ।" + comment_form_name_label : "नाम" + comment_form_email_label : "इमेल ठेगाना" + comment_form_website_label : "वेबसाइट (वैकल्पिक)" + comment_btn_submit : "टिप्पणी दिनुहोस् " + comment_btn_submitted : "टिप्पणी भयो" + comment_success_msg : "तपाईंको टिप्पणीको लागि धन्यवाद! एक पटक यो अनुमोदन गरेपछी यो साइटमा देखाउनेछ।" + comment_error_msg : "माफ गर्नुहोस्, तपाईंको टिप्पणी त्रुटि थियो।सबै आवश्यक जानकारीहरु पूरा गरिएको छ भने निश्चित गर्नुहोस् र फेरि प्रयास गर्नुहोस्।" + loading_label : "लोड हुँदैछ ..." + search_label_text : +ne-NP: + <<: *DEFAULT_NE + +# Korean +# ------ +ko: &DEFAULT_KO + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "페이지" + pagination_previous : "이전" + pagination_next : "다음" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : "토글 메뉴" + search_label : + toc_label : "On This Page" + ext_link_label : "직접 링크" + less_than : "최대" + minute_read : "분 소요" + share_on_label : "공유하기" + meta_label : + tags_label : "태그:" + categories_label : "카테고리:" + date_label : "업데이트:" + comments_label : "댓글남기기" + comments_title : "댓글" + more_label : "더 보기" + related_label : "참고" + follow_label : "팔로우:" + feed_label : "피드" + powered_by : "Powered by" + website_label : "웹사이트" + email_label : "이메일" + recent_posts : "최근 포스트" + undefined_wpm : "Undefined parameter words_per_minute at _config.yml" + comment_form_info : "이메일은 공개되지 않습니다. 작성 필요 필드:" + comment_form_comment_label : "댓글" + comment_form_md_info : "마크다운을 지원합니다." + comment_form_name_label : "이름" + comment_form_email_label : "이메일" + comment_form_website_label : "웹사이트(선택사항)" + comment_btn_submit : "댓글 등록" + comment_btn_submitted : "등록됨" + comment_success_msg : "감사합니다! 댓글이 머지된 후 확인하실 수 있습니다." + comment_error_msg : "댓글 등록에 문제가 있습니다. 필요 필드를 작성했는지 확인하고 다시 시도하세요." + loading_label : "로딩중..." + search_label_text : + search_placeholder_text : "검색어를 입력하세요..." + results_found : "개 결과 발견" + back_to_top : "맨 위로 이동" +ko-KR: + <<: *DEFAULT_KO + +# Russian / Русский +# ----------------- +ru: &DEFAULT_RU + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "Страница" + pagination_previous : "Предыдущая" + pagination_next : "Следующая" + breadcrumb_home_label : "Главная" + breadcrumb_separator : "/" + menu_label : "Выпадающее меню" + search_label : + toc_label : "Содержание" + ext_link_label : "Прямая ссылка" + less_than : "менее" + minute_read : "мин на чтение" + share_on_label : "Поделиться" + meta_label : + tags_label : "Метки:" + categories_label : "Разделы:" + date_label : "Дата изменения:" + comments_label : "Оставить комментарий" + comments_title : "Комментарии" + more_label : "Читать далее" + related_label : "Вам также может понравиться" + follow_label : "Связаться со мной:" + feed_label : "RSS-лента" + powered_by : "Сайт работает на" + website_label : "Сайт" + email_label : "Электронная почта" + recent_posts : "Свежие записи" + undefined_wpm : "Не определён параметр words_per_minute в _config.yml" + comment_form_info : "Ваш адрес электронной почты не будет опубликован. Обязательные поля помечены" + comment_form_comment_label : "Комментарий" + comment_form_md_info : "Поддерживается синтаксис Markdown." + comment_form_name_label : "Имя" + comment_form_email_label : "Электронная почта" + comment_form_website_label : "Ссылка на сайт (необязательно)" + comment_btn_submit : "Оставить комментарий" + comment_btn_submitted : "Отправлено" + comment_success_msg : "Спасибо за Ваш комментарий! Он будет опубликован на сайте после проверки." + comment_error_msg : "К сожалению, произошла ошибка с отправкой комментария. Пожалуйста, убедитесь, что все обязательные поля заполнены и попытайтесь снова." + loading_label : "Отправка..." + search_label_text : + search_placeholder_text : "Введите поисковый запрос..." + results_found : "Найдено" +ru-RU: + <<: *DEFAULT_RU + +# Lithuanian / Lietuviškai +# ------------------------ +lt: &DEFAULT_LT + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "Puslapis" + pagination_previous : "Ankstesnis" + pagination_next : "Sekantis" + breadcrumb_home_label : "Pagrindinis" + breadcrumb_separator : "/" + menu_label : "Meniu rodymas" + search_label : + toc_label : "Turinys" + ext_link_label : "Tiesioginė nuoroda" + less_than : "mažiau nei" + minute_read : "min. skaitymo" + share_on_label : "Pasidalinti" + meta_label : + tags_label : "Žymės:" + categories_label : "Kategorijos:" + date_label : "Atnaujinta:" + comments_label : "Palikti komentarą" + comments_title : "Komentaras" + more_label : "Skaityti daugiau" + related_label : "Taip pat turėtų patikti" + follow_label : "Sekti:" + feed_label : "Šaltinis" + powered_by : "Sukurta su" + website_label : "Tinklapis" + email_label : "El. paštas" + recent_posts : "Naujausi įrašai" + undefined_wpm : "Nedeklaruotas parametras words_per_minute faile _config.yml" + comment_form_info : "El. pašto adresas nebus viešinamas. Būtini laukai pažymėti" + comment_form_comment_label : "Komentaras" + comment_form_md_info : "Markdown palaikomas." + comment_form_name_label : "Vardas" + comment_form_email_label : "El. paštas" + comment_form_website_label : "Tinklapis (nebūtina)" + comment_btn_submit : "Komentuoti" + comment_btn_submitted : "Įrašytas" + comment_success_msg : "Ačiū už komentarą! Jis bus parodytas kai bus patvirtintas." + comment_error_msg : "Atleiskite, įvyko netikėta klaida įrašant komentarą. Pasitikrinkite ar užpildėte visus būtinus laukus ir pamėginkite dar kartą." + loading_label : "Kraunama..." + search_label_text : +lt-LT: + <<: *DEFAULT_LT + +# Greek +# ----- +gr: &DEFAULT_GR + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "Σελίδα" + pagination_previous : "Προηγούμενo" + pagination_next : "Επόμενo" + breadcrumb_home_label : "Αρχική" + breadcrumb_separator : "/" + menu_label : "Μενού" + search_label : + toc_label : "Περιεχόμενα" + ext_link_label : "Εξωτερικός Σύνδεσμος" + less_than : "Λιγότερο από" + minute_read : "λεπτά ανάγνωσης" + share_on_label : "Μοιραστείτε το" + meta_label : + tags_label : "Ετικέτες:" + categories_label : "Κατηγορίες:" + date_label : "Ενημερώθηκε:" + comments_label : "Αφήστε ένα σχόλιο" + comments_title : "Σχόλια" + more_label : "Διάβαστε περισσότερα" + related_label : "Σχετικές αναρτήσεις" + follow_label : "Ακολουθήστε:" + feed_label : "RSS Feed" + powered_by : "Δημιουργήθηκε με" + website_label : "Ιστοσελίδα" + email_label : "Email" + recent_posts : "Τελευταίες αναρτήσεις" + undefined_wpm : "Δεν έχει οριστεί η παράμετρος words_per_minute στο αρχείο _config.yml" + comment_form_info : "Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα απαιτούμενα πεδία εμφανίζονται με αστερίσκο" + comment_form_comment_label : "Σχόλιο" + comment_form_md_info : "Το πεδίο υποστηρίζει Markdown." + comment_form_name_label : "Όνομα" + comment_form_email_label : "Διεύθυνση email" + comment_form_website_label : "Ιστοσελίδα (προαιρετικό)" + comment_btn_submit : "Υπόβαλε ένα σχόλιο" + comment_btn_submitted : "Έχει υποβληθεί" + comment_success_msg : "Ευχαριστούμε για το σχόλιό σας! Θα εμφανιστεί στην ιστοσελίδα αφού εγκριθεί." + comment_error_msg : "Λυπούμαστε, παρουσιάστηκε σφάλμα με την υποβολή σας. Παρακαλούμε βεβαιωθείτε ότι έχετε όλα τα απαιτούμενα πεδία συμπληρωμένα και δοκιμάστε ξανά." + loading_label : "Φόρτωση..." + search_label_text : + search_placeholder_text : "Εισάγετε όρο αναζήτησης..." + results_found : "Αποτελέσματα" +gr-GR: + <<: *DEFAULT_GR + +# Swedish +# ------- +sv: &DEFAULT_SV + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "Sidan" + pagination_previous : "Föregående" + pagination_next : "Nästa" + breadcrumb_home_label : "Hem" + breadcrumb_separator : "/" + menu_label : "Växla menyläge" + search_label : "Växla sökläge" + toc_label : "På denna sida" + ext_link_label : "Direkt länk" + less_than : "mindre än" + minute_read : "minut läsning" + share_on_label : "Dela på" + meta_label : + tags_label : "Taggar:" + categories_label : "Kategorier:" + date_label : "Uppdaterades:" + comments_label : "Lämna en kommentar" + comments_title : "Kommentarer" + more_label : "Lär dig mer" + related_label : "Du kanske vill även läsa:" + follow_label : "Följ:" + feed_label : "Flöde" + powered_by : "Framställd med" + website_label : "Webbsida" + email_label : "E-post" + recent_posts : "Senaste inlägg" + undefined_wpm : "Odefinerade parametrar words_per_minute i _config.yml" + comment_form_info : "Din e-post adress kommer inte att publiceras. Obligatoriska fält är markerade" + comment_form_comment_label : "Kommentar" + comment_form_md_info : "Stöd för Markdown finns." + comment_form_name_label : "Namn" + comment_form_email_label : "E-post adress" + comment_form_website_label : "Webdsida (valfritt)" + comment_btn_submit : "Skicka en kommentar" + comment_btn_submitted : "Kommentaren har tagits emot" + comment_success_msg : "Tack för din kommentar! Den kommer att visas på sidan så fort den har godkännts." + comment_error_msg : "Tyvärr det har blivit något fel i ett av fälten, se till att du fyllt i alla obligatoriska fält och försök igen." + loading_label : "Laddar..." + search_label_text : + search_placeholder_text : "Fyll i sökterm..." + results_found : "Resultat funna" + back_to_top : "Tillbaka till toppen" +sv-SE: + <<: *DEFAULT_SV +sv-FI: + <<: *DEFAULT_SV + +# Dutch +# ----- +nl: &DEFAULT_NL + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "Pagina" + pagination_previous : "Vorige" + pagination_next : "Volgende" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : "Wissel Menu" + search_label : + toc_label : "Op deze pagina" + ext_link_label : "Directe Link" + less_than : "minder dan" + minute_read : "minuut gelezen" + share_on_label : "Deel op" + meta_label : + tags_label : "Labels:" + categories_label : "Categorieën:" + date_label : "Bijgewerkt:" + comments_label : "Laat een reactie achter" + comments_title : "Commentaren" + more_label : "Meer informatie" + related_label : "Bekijk ook eens" + follow_label : "Volg:" + feed_label : "Feed" + powered_by : "Aangedreven door" + website_label : "Website" + email_label : "Email" + recent_posts : "Recente berichten" + undefined_wpm : "Niet gedefinieerde parameter words_per_minute bij _config.yml" + comment_form_info : "Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd" + comment_form_comment_label : "Commentaar" + comment_form_md_info : "Markdown wordt ondersteund." + comment_form_name_label : "Naam" + comment_form_email_label : "E-mailadres" + comment_form_website_label : "Website (optioneel)" + comment_btn_submit : "Commentaar toevoegen" + comment_btn_submitted : "Toegevoegd" + comment_success_msg : "Bedankt voor uw reactie! Het zal op de site worden weergegeven zodra het is goedgekeurd." + comment_error_msg : "Sorry, er is een fout opgetreden bij uw inzending. Zorg ervoor dat alle vereiste velden zijn voltooid en probeer het opnieuw." + loading_label : "Laden..." + search_label_text : "Geef uw zoekterm in..." + search_placeholder_text : "Geef uw zoekterm in..." + results_found : "Resultaat gevonden" + back_to_top : "Terug naar boven" +nl-BE: + <<: *DEFAULT_NL +nl-NL: + <<: *DEFAULT_NL + +# Indonesian +# ---------- +id: &DEFAULT_ID + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "Halaman" + pagination_previous : "Kembali" + pagination_next : "Maju" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : "Menu Toggle" + search_label : + toc_label : "Pada Halaman Ini" + ext_link_label : "Link langsung" + less_than : "Kurang dari" + minute_read : "Waktu baca" + share_on_label : "Berbagi di" + meta_label : + tags_label : "Golongan:" + categories_label : "Kategori:" + date_label : "Diupdate:" + comments_label : "Tinggalkan komentar" + comments_title : "Komentar" + more_label : "Pelajari lagi" + related_label : "Anda juga akan suka" + follow_label : "Ikuti:" + feed_label : "Feed" + powered_by : "Didukung oleh" + website_label : "Website" + email_label : "Email" + recent_posts : "Posting terbaru" + undefined_wpm : "Parameter terdeskripsi words_per_minute di _config.yml" + comment_form_info : "Email Anda tidak akan dipublish. Kolom yang diperlukan ditandai" + comment_form_comment_label : "Komentar" + comment_form_md_info : "Markdown disupport." + comment_form_name_label : "Nama" + comment_form_email_label : "Alamat email" + comment_form_website_label : "Website (opsional)" + comment_btn_submit : "Submit Komentar" + comment_btn_submitted : "Telah disubmit" + comment_success_msg : "Terimakasih atas komentar Anda! Komentar ini akan tampil setelah disetujui." + comment_error_msg : "Maaf, ada kesalahan pada submisi Anda. Pastikan seluruh kolom sudah dilengkapi dan coba kembali." + loading_label : "Sedang meload..." + search_label_text : +id-ID: + <<: *DEFAULT_ID + +# Vietnamese +# ---------- +vi: &DEFAULT_VI + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "Trang" + pagination_previous : "Trước" + pagination_next : "Sau" + breadcrumb_home_label : "Trang chủ" + breadcrumb_separator : "/" + menu_label : "Menu" + search_label : + toc_label : "Tại trang này" + ext_link_label : "Đường dẫn trực tiếp" + less_than : "nhỏ hơn" + minute_read : "phút đọc" + share_on_label : "Chia sẻ tại" + meta_label : + tags_label : "Nhãn:" + categories_label : "Chủ đề:" + date_label : "Cập nhật:" + comments_label : "Để lại bình luận" + comments_title : "Bình luận" + more_label : "Mở rộng" + related_label : "Có thể bạn cũng thích" + follow_label : "Theo dõi:" + feed_label : "Feed" + powered_by : "Được hỗ trợ bởi" + website_label : "Website" + email_label : "Email" + recent_posts : "Bài viết mới" + undefined_wpm : "Chưa định nghĩa thông số words_per_minute tại _config.yml" + comment_form_info : "Email của bạn sẽ được giữ bí mật. Các phần bắt buộc được đánh dấu" + comment_form_comment_label : "Bình luận" + comment_form_md_info : "Hỗ trợ Markdown." + comment_form_name_label : "Tên" + comment_form_email_label : "Địa chỉ email" + comment_form_website_label : "Website (không bắt buộc)" + comment_btn_submit : "Gửi bình luận" + comment_btn_submitted : "Đã được gửi" + comment_success_msg : "Cảm ơn bạn đã bình luận! Bình luận sẽ xuất hiện sau khi được duyệt." + comment_error_msg : "Rất tiếc, có lỗi trong việc gửi bình luận. Hãy đảm bảo toàn bộ các phần bắt buộc đã được điền đầy đủ và thử lại." + loading_label : "Đang tải..." + search_label_text : + search_placeholder_text : "Nhập từ khóa cần tìm..." + results_found : "Kết quả tìm được" + back_to_top : "Lên đầu trang" +vi-VN: + <<: *DEFAULT_VI + +# Danish +# ------ +da: &DEFAULT_DA + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "Side" + pagination_previous : "Forrige" + pagination_next : "Næste" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : "Vis/skjul menu" + search_label : + toc_label : "På denne side" + ext_link_label : "Direkte link" + less_than : "mindre end" + minute_read : "minutters læsning" + share_on_label : "Del på" + meta_label : + tags_label : "Nøgleord:" + categories_label : "Kategorier:" + date_label : "Opdateret:" + comments_label : "Skriv en kommentar" + comments_title : "Kommentarer" + more_label : "Lær mere" + related_label : "Måske kan du også lide" + follow_label : "Følg:" + feed_label : "Feed" + powered_by : "Drives af" + website_label : "Website" + email_label : "E-mail" + recent_posts : "Seneste indlæg" + undefined_wpm : "Parameteren words_per_minute er ikke defineret i _config.yml" + comment_form_info : "Din e-mail bliver ikke offentliggjort. Obligatoriske felter er markeret" + comment_form_comment_label : "Kommentar" + comment_form_md_info : "Markdown er understøttet." + comment_form_name_label : "Navn" + comment_form_email_label : "E-mail" + comment_form_website_label : "Website (frivillig)" + comment_btn_submit : "Send kommentar" + comment_btn_submitted : "Sendt" + comment_success_msg : "Tak for din kommentar! Den bliver vist på siden, så snart den er godkendt." + comment_error_msg : "Desværre skete der en fejl. Prøv igen, mens du sørger for at alle obligatoriske felter er udfyldt." + loading_label : "Indlæser..." + search_label_text : + search_placeholder_text : "Hvad leder du efter..." + results_found : "Resultat(er) fundet" + back_to_top : "Tilbage til toppen" +da-DK: + <<: *DEFAULT_DA + +# Polish +# ------ +pl: &DEFAULT_PL + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "Strona" + pagination_previous : "Poprzednia" + pagination_next : "Następna" + breadcrumb_home_label : "Strona główna" + breadcrumb_separator : "/" + menu_label : "Przełącz menu" + search_label : + toc_label : "Spis treści" + ext_link_label : "Link bezpośredni" + less_than : "mniej niż" + minute_read : "minut(y)" + share_on_label : "Udostępnij" + meta_label : + tags_label : "Tagi:" + categories_label : "Kategorie:" + date_label : "Ostatnia aktualizacja:" + comments_label : "Zostaw komentarz" + comments_title : "Komentarze" + more_label : "Dowiedz się więcej" + related_label : "Także może Ci się spodobać" + follow_label : "Śledź:" + feed_label : "Feed" + powered_by : "Powstało dzięki" + website_label : "Strona" + email_label : "Email" + recent_posts : "Najnowsze wpisy" + undefined_wpm : "Parametr words_per_minute nie został zdefiniowany w _config.yml." + comment_form_info : "Twój adres email nie będzie udostępiony. Wymagane pola są oznaczone" + comment_form_comment_label : "Skomentuj" + comment_form_md_info : "Markdown jest wspierany" + comment_form_name_label : "Imię" + comment_form_email_label : "Adres email" + comment_form_website_label : "Strona www (opcjonalna)" + comment_btn_submit : "Skomentuj" + comment_btn_submitted : "Komentarz dodany" + comment_success_msg : "Dziękuję za Twój komentarz! Zostanie dodany po akceptacji." + comment_error_msg : "Niestety wystąpił błąd. Proszę upewnij się, że wszystkie wymagane pola zostały wypełnione i spróbuj ponownie." + loading_label : "Trwa ładowanie strony..." + search_label_text : + posts_older : "Starsze artykuły" + posts_newer : "Nowsze artykuły" + back_to_top : "Wróć do góry" + go_to_comments : "Idź do komentarzy" + go_to_post : "Idź do artykułu" +pl-PL: + <<: *DEFAULT_PL + +# Japanese +# -------- +ja: &DEFAULT_JA + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "ページ" + pagination_previous : "前へ" + pagination_next : "次へ" + breadcrumb_home_label : "ホーム" + breadcrumb_separator : "/" + menu_label : "メニュー" + search_label : + toc_label : "目次" + ext_link_label : "リンク" + less_than : + minute_read : + share_on_label : "共有" + meta_label : + tags_label : "タグ:" + categories_label : "カテゴリー:" + date_label : "更新日時:" + comments_label : "コメントする" + comments_title : "コメント" + more_label : "さらに詳しく" + related_label : "関連記事" + follow_label : "フォロー" + feed_label : + powered_by : + website_label : + email_label : + recent_posts : "最近の投稿" + undefined_wpm : "パラメータ words_per_minute が _config.yml で定義されていません" + comment_form_info : "メールアドレスが公開されることはありません。次の印のある項目は必ず入力してください:" + comment_form_comment_label : "コメント" + comment_form_md_info : "Markdown を使用できます" + comment_form_name_label : "名前" + comment_form_email_label : "メールアドレス" + comment_form_website_label : "URL (任意)" + comment_btn_submit : "コメントを送信する" + comment_btn_submitted : "送信しました" + comment_success_msg : "コメントありがとうございます! コメントは承認されるとページに表示されます。" + comment_error_msg : "送信エラーです。必須項目がすべて入力されていることを確認して再送信してください。" + loading_label : "読み込み中..." + search_label_text : + search_placeholder_text : "検索キーワードを入力してください..." + results_found : "件" +ja-JP: + <<: *DEFAULT_JA + +# Slovak +# ----------------- +sk: &DEFAULT_SK + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "Stránka" + pagination_previous : "Predošlá" + pagination_next : "Ďalšia" + breadcrumb_home_label : "Domov" + breadcrumb_separator : "/" + menu_label : "Menu" + search_label : + toc_label : "Obsah" + ext_link_label : "Priamy odkaz" + less_than : "menej ako" + minute_read : "minút" + share_on_label : "Zdieľaj na" + meta_label : + tags_label : "Tagy:" + categories_label : "Kategórie:" + date_label : "Aktualizované:" + comments_label : "Zanechaj odkaz" + comments_title : "Komentáre" + more_label : "Dozvedieť sa viac" + related_label : "Podobné články" + follow_label : "Sleduj:" + feed_label : "Zoznam" + powered_by : "Stránka vytvorená pomocou" + website_label : "Web stránka" + email_label : "Email" + recent_posts : "Najnovšie príspevky" + undefined_wpm : "Nedefinovaný parameter words_per_minute v _config.yml" + comment_form_info : "Tvoja emailová adresa nebude publikovaná. Požadované polia sú označené" + comment_form_comment_label : "Komentár" + comment_form_md_info : "Markdown je podporovaný." + comment_form_name_label : "Meno" + comment_form_email_label : "Emailová adresa" + comment_form_website_label : "Webstránka (voliteľné)" + comment_btn_submit : "Vlož komentár" + comment_btn_submitted : "Vložený" + comment_success_msg : "Ďakujem za tvoj komentár! Po schválení bude zobrazený na stránke." + comment_error_msg : "Prepáč, pri ukladaní nastala chyba. Ubezpeč sa prosím, že si vyplnil všetky požadované polia a skús znova." + loading_label : "Načítava sa..." + search_label_text : + search_placeholder_text : "Zadaj hľadaný výraz..." + results_found : "Nájdených výsledkov" + back_to_top : "Na začiatok stránky" +sk-SK: + <<: *DEFAULT_SK + +# Hungarian +# ----------------- +hu: &DEFAULT_HU + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "Oldal" + pagination_previous : "Előző" + pagination_next : "Következő" + breadcrumb_home_label : "Kezdőlap" + breadcrumb_separator : "/" + menu_label : "Menü nyit/zár" + search_label : + toc_label : "Ezen az oldalon" + ext_link_label : "Közvetlen Link" + less_than : "kevesebb mint" + minute_read : "eltöltött percek" + share_on_label : "Megosztás" + meta_label : + tags_label : "Tagek:" + categories_label : "Kategóriák:" + date_label : "Frissítve:" + comments_label : "Szólj hozzá!" + comments_title : "Hozzászólások" + more_label : "Tovább" + related_label : "Ajánlások" + follow_label : "Követés:" + feed_label : "Folyam" + powered_by : "Powered by" + website_label : "Honlap" + email_label : "Email" + recent_posts : "Friss cikkek" + undefined_wpm : "Ismeretlen paraméter words_per_minute : _config.yml" + comment_form_info : "Az e-mail címed nem lesz publikus. A csillagozott mezők kitöltése kötelező" + comment_form_comment_label : "Hozzászólás" + comment_form_md_info : "Támogatott formázási mód: Markdown" + comment_form_name_label : "Név" + comment_form_email_label : "Email cím" + comment_form_website_label : "Honlap (nem kötelező):" + comment_btn_submit : "Hozzászólás elküldése" + comment_btn_submitted : "Hozzászólás elküldve" + comment_success_msg : "Köszönjük a Hozzászólást! A Hozzászólások csak előzetes moderáció után lesznek publikusak." + comment_error_msg : "Hoppá, hiba történt a beküldés közben. Kérlek ellenőrizd hogy minden kötelező mező ki van-e töltve." + loading_label : "Betöltés..." + search_label_text : + search_placeholder_text : "Keresendő szöveg..." + results_found : "Találatok:" + back_to_top : "Oldal tetejére" +hu-HU: + <<: *DEFAULT_HU + +# Romanian +# ----------------- +ro: &DEFAULT_RO + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "Pagina" + pagination_previous : "Anterior" + pagination_next : "Următor" + breadcrumb_home_label : "Acasă" + breadcrumb_separator : "/" + menu_label : "Comută meniul" + search_label : + toc_label : "Pe această pagină" + ext_link_label : "Link direct" + less_than : "mai puțin de" + minute_read : "minute de citit" + share_on_label : "Distribuie pe" + meta_label : + tags_label : "Etichete:" + categories_label : "Categorii:" + date_label : "Actualizat:" + comments_label : "Lasă un comentariu" + comments_title : "Comentarii" + more_label : "Citește mai departe" + related_label : "S-ar putea să-ți placă" + follow_label : "Urmărește:" + feed_label : "Feed RSS" + powered_by : "Cu sprijinul" + website_label : "Site" + email_label : "Email" + recent_posts : "Articole recente" + undefined_wpm : "Parametru words_per_minute nedefinit în _config.yml" + comment_form_info : "Adresa ta de email nu va fi făcută publică. Câmpurile marcate sunt obligatorii" + comment_form_comment_label : "Comentariu" + comment_form_md_info : "Markdown este suportat." + comment_form_name_label : "Nume" + comment_form_email_label : "Adresă de email" + comment_form_website_label : "Site (opțional)" + comment_btn_submit : "Trimite comentariul" + comment_btn_submitted : "Trimis" + comment_success_msg : "Mulțumesc pentru comentariu! Va apărea pe site în momentul în care va fi aprobat." + comment_error_msg : "Scuze, este o problemă cu comentariul tău. Asigură-te că toate câmpurile obligatorii au fost completate și încearcă din nou." + loading_label : "Se încarcă..." + search_label_text : + search_placeholder_text : "Caută ceva..." + results_found : "Rezultate găsite" + back_to_top : "Înapoi în susul paginii" +ro-RO: + <<: *DEFAULT_RO + +# Punjabi +# ----------------- +pa: &DEFAULT_PA + skip_links : "ਲਿੰਕ ਛੱਡੋ" + skip_primary_nav : "ਮੂਲ ਮਾਰਗ ਛੱਡੋ" + skip_content : "ਸਮੱਗਰੀ ਛੱਡੋ" + skip_footer : "ਅੰਤ ਵਿਚ ਲਿਖਿਆ ਛੱਡੋ" + page : "ਸਫ਼ਾ" + pagination_previous : "ਪਿਛਲਾ" + pagination_next : "ਅਗਲਾ " + breadcrumb_home_label : "ਘਰ" + breadcrumb_separator : "/" + menu_label : "ਟੌਗਲ ਮੀਨੂ" + search_label : "ਖੋਜ" + toc_label : "ਇਸ ਸਫ਼ੇ 'ਤੇ" + ext_link_label : "ਸਿੱਧਾ ਸੰਪਰਕ" + less_than : "ਤੋਂ ਘੱਟ" + minute_read : "ਮਿੰਟ ਵਿੱਚ ਪੜਿਆ ਜਾ ਸਕਦਾ ਹੈ" + share_on_label : "ਸਾਂਝਾ ਕਰੋ" + meta_label : "ਸਵੈ-ਸੰਦਰਭ ਜਾਣਕਾਰੀ" + tags_label : "ਟੈਗ" + categories_label : "ਵਰਗ" + date_label : "ਅਪਡੇਟ ਕੀਤਾ:" + comments_label : "ਇੱਕ ਟਿੱਪਣੀ ਛੱਡੋ" + comments_title : "ਟਿੱਪਣੀਆਂ" + more_label : "ਹੋਰ ਜਾਣੋ" + related_label : "ਤੁਸੀਂ ਇਸਦਾ ਆਨੰਦ ਵੀ ਲੈ ਸਕਦੇ ਹੋ" + follow_label : "ਫਾਲੋ ਅੱਪ ਕਰੋ:" + feed_label : "ਫੀਡ" + powered_by : "ਦੁਆਰਾ ਸੰਚਾਲਿਤ" + website_label : "ਵੈੱਬਸਾਇਟ" + email_label : "ਈਮੇਲ" + recent_posts : "ਹਾਲ ਹੀ ਦੇ ਪੋਸਟ" + undefined_wpm : "_config.yml ਤੇ ਅਣ-ਪ੍ਰਭਾਸ਼ਿਤ ਪੈਰਾਮੀਟਰ words_per_minute" + comment_form_info : "ਤੁਹਾਡਾ ਈਮੇਲ ਪਤਾ ਪ੍ਰਕਾਸ਼ਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ। ਅਨੁਮਾਨਿਤ ਸਥਾਨਾਂ ਨੂੰ ਅੰਡਰਲਾਈਨ ਕੀਤਾ ਗਿਆ ਹੈ" + comment_form_comment_label : "ਟਿੱਪਣੀ" + comment_form_md_info : "ਮਾਰਕਡਾਊਨ ਵਰਤ ਸਕਦੇ ਹੋ।" + comment_form_name_label : "ਨਾਮ" + comment_form_email_label : "ਈਮੇਲ ਪਤਾ" + comment_form_website_label : "ਵੈਬਸਾਈਟ (ਵਿਕਲਪਿਕ)" + comment_btn_submit : "ਕੋਈ ਟਿੱਪਣੀ ਭੇਜੋ" + comment_btn_submitted : "ਪੇਸ਼ ਕੀਤਾ" + comment_success_msg : "ਤੁਹਾਡੀਆਂ ਟਿੱਪਣੀਆਂ ਲਈ ਧੰਨਵਾਦ! ਇਹ ਮਨਜ਼ੂਰੀ ਮਿਲਣ ਦੇ ਬਾਅਦ ਸਾਈਟ 'ਤੇ ਦਿਖਾਇਆ ਜਾਵੇਗਾ।" + comment_error_msg : "ਮੁਆਫ ਕਰਨਾ, ਤੁਹਾਡੀ ਅਧੀਨਗੀ ਵਿੱਚ ਕੋਈ ਗਲਤੀ ਹੋਈ ਸੀ ਕਿਰਪਾ ਕਰਕੇ ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਸਾਰੇ ਲੋੜੀਂਦੇ ਖੇਤਰ ਪੂਰੇ ਹੋ ਗਏ ਹਨ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" + loading_label : "ਲੋਡ ਹੋ ਰਿਹਾ ਹੈ..." + search_label_text : "ਖੋਜ" + search_placeholder_text : "ਆਪਣੀ ਖੋਜ ਦੇ ਸ਼ਬਦ ਨੂੰ ਦਰਜ ਕਰੋ..." + results_found : "ਨਤੀਜਾ ਮਿਲਿਆ/ਮਿਲੇ" + back_to_top : "ਵਾਪਸ ਚੋਟੀ 'ਤੇ ਜਾਓ" +pa-IN: + <<: *DEFAULT_PA + +# Persian (Farsi) +# -------------- +fa: &DEFAULT_FA + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "صفحه" + pagination_previous : "قبلی" + pagination_next : "بعدی" + breadcrumb_home_label : "صفحه اصلی" + breadcrumb_separator : "/" + menu_label : "فهرست" + toc_label : "در این صفحه" + ext_link_label : "لینک مستقیم" + less_than : " " + minute_read : "(طول مطالعه (دقیقه" + share_on_label : "اشتراک گذاری در" + meta_label : + tags_label : "تگ ها: " + categories_label : "دسته بندی ها: " + date_label : "به روز شده در: " + comments_label : "ارسال نظر" + comments_title : "نظرات" + more_label : "ادامه مطلب" + related_label : "ممکن است از این مطالب نیز لذت ببرید" + follow_label : "دنبال کنید: " + feed_label : "خوراک" + powered_by : "طراحی شده توسط" + website_label : "سایت اینترنتی" + email_label : "پست الکترونیک" + recent_posts : "آخرین مطالب" + undefined_wpm : ".(words_per_minute) _config.yml متغیر اشتباه در" + comment_form_info : ".آدرس ایمیل شما منتشر نخواهد شد. فیلدهای اجباری مشخص شده اند" + comment_form_comment_label : "دیدگاه" + comment_form_md_info : ".پشتیبانی می شود Markdown" + comment_form_name_label : "نام" + comment_form_email_label : "پست الکترونیک" + comment_form_website_label : "سایت اینترنتی (اختیاری)" + comment_btn_submit : "ارسال نظر" + comment_btn_submitted : "ارسال شد" + comment_success_msg : ".باتشکر از ارسال دیدگاه! پس از تأیید، این دیدگاه در سایت نشان داده خواهد شد" + comment_error_msg : ".متاسفانه در ارسال شما خطایی بود. لطفا مطمئن شوید تمام فیلدهای مورد نیاز تکمیل شده و دوباره امتحان کنید" + loading_label : "...بارگذاری" + search_label_text : + search_placeholder_text : "...عبارت جستجوی خود را وارد کنید" + results_found : "نتایج" + back_to_top : "بازگشت به بالا" +fa-IR: + <<: *DEFAULT_FA + + +# Malayalam +# ----------------- +ml: &DEFAULT_ML + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "പേജ്" + pagination_previous : "തിരികെ" + pagination_next : "മുന്നോട്ട്" + breadcrumb_home_label : "ഹോം" + breadcrumb_separator : "/" + menu_label : "ടോഗിൾ മെനു" + search_label : "ടോഗിൾ സെർച്ച്" + toc_label : "ഈ പേജിൽ" + ext_link_label : "ലിങ്കിലേക് പോകാൻ" + less_than : "ഏതാണ്ട്" + minute_read : "മിനിറ്റ് ദൈർഖ്യം" + share_on_label : "ഷെയർ ചെയ്യുവാൻ " + meta_label : + tags_label : "ടാഗുകൾ:" + categories_label : "വിഭാഗങ്ങൾ:" + date_label : "അവസാന മാറ്റം:" + comments_label : "അഭിപ്രായം രേഖപ്പെടുത്തുക" + comments_title : "അഭിപ്രായങ്ങൾ" + more_label : "കൂടുതൽ അറിയുവാൻ" + related_label : "നിങ്ങൾക് ഇതും ഇഷ്ടപ്പെട്ടേക്കാം" + follow_label : "പിന്തുടരുക:" + feed_label : "ഫീഡ്" + powered_by : "പവേർഡ് ബൈ" + website_label : "വെബ്സൈറ്റ്" + email_label : "ഇ-മെയിൽ" + recent_posts : "സമീപകാല പോസ്റ്റുകൾ" + undefined_wpm : "Config.yml ലെ words_per_minute പരാമീറ്റർ നിർവചിച്ചിട്ടില്ല." + comment_form_info : "നിങ്ങളുടെ ഇമെയിൽ വിലാസം പ്രസിദ്ധീകരിക്കില്ല. ആവശ്യമായ ഫീൽഡുകൾ അടയാളപ്പെടുത്തി." + comment_form_comment_label : "കമന്റ്" + comment_form_md_info : "Markdown സപ്പോർട്ട് ചെയ്യുന്നതാണ്." + comment_form_name_label : "പേര്" + comment_form_email_label : "ഇ-മെയിൽ" + comment_form_website_label : "വെബ്സൈറ് (ഓപ്ഷണൽ)" + comment_btn_submit : "അഭിപ്രായം രേഖപ്പെടുത്തുക" + comment_btn_submitted : "രേഖപ്പെടുത്തി" + comment_success_msg : "നിങ്ങളുടെ അഭിപ്രായത്തിന് നന്ദി! ഇത് അംഗീകരിച്ചുകഴിഞ്ഞാൽ ഇത് സൈറ്റിൽ പ്രദർശിപ്പിക്കും." + comment_error_msg : "ക്ഷമിക്കണം, നിങ്ങളുടെ സമർപ്പണവുമായി ബന്ധപ്പെട്ട് ഒരു പിശകുണ്ടായിരുന്നു. ആവശ്യമായ എല്ലാ ഫീൽഡുകളും പൂർത്തിയായിട്ടുണ്ടെന്ന് ഉറപ്പുവരുത്തുക, വീണ്ടും ശ്രമിക്കുക." + loading_label : "ലോഡിംഗ്..." + search_label_text : + search_placeholder_text : "നിങ്ങളുടെ തിരയൽ പദം നൽകുക..." + results_found : "ഫലം (കൾ) കണ്ടെത്തി" + back_to_top : "മുകളിലേയ്ക്ക്" +ml-IN: + <<: *DEFAULT_ML + +# Thailand +# -------------- +th: &DEFAULT_TH + skip_links : + skip_primary_nav : + skip_content : + skip_footer : + page : "หน้า" + pagination_previous : "ก่อนหน้า" + pagination_next : "ถัดไป" + breadcrumb_home_label : "หน้าแรก" + breadcrumb_separator : "/" + menu_label : "พับเมนู" + search_label : "พับการค้นหา" + toc_label : "บนหน้านี้" + ext_link_label : "ลิงก์โดยตรง" + less_than : "น้อยกว่า" + minute_read : "นาที ในการอ่าน" + share_on_label : "แชร์ไปที่" + meta_label : + tags_label : "แท็ก:" + categories_label : "หมวดหมู่:" + date_label : "อัพเดตล่าสุด:" + comments_label : "แสดงความคิดเห็น" + comments_title : "ความคิดเห็น" + more_label : "อ่านต่อ" + related_label : "คุณอาจจะชอบสิ่งนี้" + follow_label : "ติดตาม:" + feed_label : "ฟืดข่าว" + powered_by : "ขับเคลื่อนโดย" + website_label : "เว็บไซต์" + email_label : "อีเมล" + recent_posts : "โพสล่าสุด" + undefined_wpm : "ไม่สามารถระบุพารามิเตอร์ words_per_minute ได้ใน _config.yml" + comment_form_info : "อีเมลของคุณไม่สามารถโพสสาธารณะได้ กรุณากรอกช่องที่ระบุด้วยเครื่องหมายดอกจันไว้" + comment_form_comment_label : "แสดงความคิดเห็น" + comment_form_md_info : "มาร์กดาวน์ได้รับการสนับสนุน" + comment_form_name_label : "ชื่อ" + comment_form_email_label : "ที่อยู่อีเมล" + comment_form_website_label : "เว็บไซต์ (ตัวเลือก)" + comment_btn_submit : "ส่งความคิดเห็น" + comment_btn_submitted : "ส่งเรียบร้อยแล้ว" + comment_success_msg : "ขอบคุณสำหรับการแสดงความคิดเห็น! ความคิดเห็นจะได้รับการแสดงหลังจากได้รับการยืนยัน" + comment_error_msg : "ขออภัย, มีบางอย่างผิดพลาดจากการส่งแบบฟอร์ม กรุณาตรวจทานทุกช่อง และลองส่งใหม่อีกครั้ง" + loading_label : "กำลังโหลด..." + search_label_text : + search_placeholder_text : "ใส่คำค้นหาของคุณ..." + results_found : "ผลการค้นหา พบ" + back_to_top : "กลับด้านบน" +th-TH: + <<: *DEFAULT_TH + +# Hindi +# ----------------- +hi: &DEFAULT_HI + skip_links : "लिंक छोड़ें" + skip_primary_nav : "प्राथमिक पथ-प्रदर्शन छोड़ें" + skip_content : "सामग्री छोड़ें" + skip_footer : "अंत-में लिखा छोड़ें" + page : "पृष्ठ" + pagination_previous : "पिछला" + pagination_next : "अगला" + breadcrumb_home_label : "घर" + breadcrumb_separator : "/" + menu_label : "टॉगल मेनू" + toc_label : "इस पृष्ठ पर" + ext_link_label : "सीधा संपर्क" + less_than : "से कम" + minute_read : "मिनट में पढ़ सकते हैं" + share_on_label : "साझा करें" + meta_label : "स्व-संदर्भात्मक जानकारी" + tags_label : "अंकितक:" + categories_label : "श्रेणियाँ:" + date_label : "अपडेट किया गया:" + comments_label : "एक टिप्पणी छोड़ें" + comments_title : "टिप्पणियाँ" + more_label : "और अधिक जानें" + related_label : "आप इसका भी आनंद ले सकते हैं" + follow_label : "अनुसरण करे:" + feed_label : "फ़ीड" + powered_by : "द्वारा संचालित" + website_label : "वेबसाइट" + email_label : "ईमेल" + recent_posts : "हाल के पोस्ट" + undefined_wpm : "_config.yml पर अपरिभाषित पैरामीटर words_per_minute" + comment_form_info : "आपका ईमेल पता प्रकाशित नहीं किया जाएगा। अपेक्षित स्थानों को रेखांकित कर दिया गया है" + comment_form_comment_label : "टिप्पणी" + comment_form_md_info : "मार्कडाउन की अनुमति है।" + comment_form_name_label : "नाम" + comment_form_email_label : "ईमेल पता" + comment_form_website_label : "वेबसाइट (ऐच्छिक)" + comment_btn_submit : "टिप्पणी भेजें" + comment_btn_submitted : "प्रस्तुत" + comment_success_msg : "आपके कमेंट के लिए धन्यवाद! इसे स्वीकृति मिलने के बाद साइट पर दिखाया जाएगा।" + comment_error_msg : "क्षमा करें, आपके सबमिशन के साथ एक त्रुटि हुई थी। कृपया सुनिश्चित करें कि सभी आवश्यक फ़ील्ड पूरा हो गए हैं और पुनः प्रयास करें।" + loading_label : "लोड हो रहा है..." + search_label_text : "खोज" + search_placeholder_text : "अपना खोज शब्द दर्ज करें..." + results_found : "परिणाम मिला/मिले" + back_to_top : "शीर्ष पर वापस" +hi-IN: + <<: *DEFAULT_HI + +# Catalan +# -------------- +ca: &DEFAULT_CA + skip_links : "Salta els enllaços" + skip_primary_nav : "Salta a la navegació primària" + skip_content : "Salta al contingut" + skip_footer : "Salta al peu" + page : "Pàgina" + pagination_previous : "Anterior" + pagination_next : "Següent" + breadcrumb_home_label : "Inici" + breadcrumb_separator : "/" + menu_label : "Mostra/amaga el menú" + search_label : "Mostra/amaga la cerca" + toc_label : "En aquesta pàgina" + ext_link_label : "Enllaç directe" + less_than : "es llegeix en menys de" + minute_read : "minut(s)" + share_on_label : "Comparteix a" + meta_label : + tags_label : "Etiquetes:" + categories_label : "Categories:" + date_label : "Actualitzat:" + comments_label : "Deixa un comentari" + comments_title : "Comentaris" + more_label : "Llegeix més" + related_label : "També et pot agradar" + follow_label : "Segueix-me:" + feed_label : "Feed" + powered_by : "Funciona amb" + website_label : "Pàgina web" + email_label : "Correu electrònic" + recent_posts : "Entrades recents" + undefined_wpm : "El paràmetre words_per_minute no està definit a _config.yml" + comment_form_info : "No es mostrarà el teu correu electrònic. Els camps obligatoris estan marcats" + comment_form_comment_label : "Comentari" + comment_form_md_info : "Admet Markdown." + comment_form_name_label : "Nom" + comment_form_email_label : "Correu electrònic" + comment_form_website_label : "Pàgina web (opcional)" + comment_btn_submit : "Envia" + comment_btn_submitted : "Enviat" + comment_success_msg : "Gràcies pel teu comentari! Apareixerà un cop sigui aprovat." + comment_error_msg : "Hi ha hagut un error enviat el comentari. Comprova que els camps obligatirs estiguin omplerts i torna-ho a provar." + loading_label : "Carregant..." + search_label_text : "Introdueix termes per cercar..." + search_placeholder_text : "Introdueix termes per cercar..." + results_found : "resultat(s)" + back_to_top : "Torna a dalt" +ca-ES: + <<: *DEFAULT_CA + +# Another locale +# -------------- +# From 7c142affaaffc1c39ce86145b7ac2e2a77841c1c Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Fri, 13 Nov 2020 17:56:52 +0100 Subject: [PATCH 014/160] Update assets --- assets/images/.DS_Store | Bin 0 -> 6148 bytes assets/images/ZabinskiKamil.jpg | Bin 0 -> 204348 bytes assets/images/bio-photo.jpg | Bin 1661 -> 0 bytes assets/images/gromy.jpg | Bin 0 -> 30523 bytes assets/images/kamil.adam.jpg | Bin 0 -> 16769 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/images/.DS_Store create mode 100644 assets/images/ZabinskiKamil.jpg delete mode 100644 assets/images/bio-photo.jpg create mode 100644 assets/images/gromy.jpg create mode 100644 assets/images/kamil.adam.jpg diff --git a/assets/images/.DS_Store b/assets/images/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 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 diff --git a/_collections/_langs/ams-js.html b/_collections/_langs/ams-js.html new file mode 100644 index 00000000..28e6d860 --- /dev/null +++ b/_collections/_langs/ams-js.html @@ -0,0 +1,5 @@ +--- +lang: ams-js +title: asm.js +description: '' +--- diff --git a/_collections/_langs/awk.html b/_collections/_langs/awk.html new file mode 100644 index 00000000..d871292d --- /dev/null +++ b/_collections/_langs/awk.html @@ -0,0 +1,17 @@ +--- +lang: awk +title: AWK +description: dynamicznie typowany, skryptowy język programowania. +--- + + +

Blogi

+ diff --git a/_collections/_langs/ceylon.html b/_collections/_langs/ceylon.html new file mode 100644 index 00000000..82074b50 --- /dev/null +++ b/_collections/_langs/ceylon.html @@ -0,0 +1,16 @@ +--- +lang: ceylon +title: Ceylon +description: statycznie typowany język programowania kompliwany do kodu maszynowego Javy. +--- + diff --git a/_collections/_langs/clojure.html b/_collections/_langs/clojure.html new file mode 100644 index 00000000..4311cf28 --- /dev/null +++ b/_collections/_langs/clojure.html @@ -0,0 +1,52 @@ +--- +lang: clojure +title: Clojure +description: 'obiektowo-funkcyjny dialekt funkcyjnego języka programowania Lisp kompilowany do kodu bajtowego Javy.' +--- + + +Istnieją także poboczne kompilatory i transpilatory języka Clojure: +
    +
  • + ClojureScript - transpilator Clojure do języka JavaScript. +
  • +
  • + ClojureCLR - kompilator Clojure do CLR dla platformu .Net. +
  • +
  • + ClojureC - transpilator Clojure do C. +
  • +
  • + ClojureScheme - transpilator Clojure do Scheme. + Później Scheme można transpilować do C. +
  • +
  • + clojure-py - transpilator Clojure do języka Python. +
  • +
+ +

Tutoriale i książki

+ diff --git a/_collections/_langs/coffeescript.html b/_collections/_langs/coffeescript.html new file mode 100644 index 00000000..a4bf3929 --- /dev/null +++ b/_collections/_langs/coffeescript.html @@ -0,0 +1,21 @@ +--- +lang: coffeescript +title: CoffeeScript +description: 'dynamicznie typowany język programowania transpilowany do języka JavaScript.' +redirect_from: +- langs/cs +--- + diff --git a/_collections/_langs/common-lisp.html b/_collections/_langs/common-lisp.html new file mode 100644 index 00000000..30733feb --- /dev/null +++ b/_collections/_langs/common-lisp.html @@ -0,0 +1,35 @@ +--- +lang: common-lisp +title: Common Lisp +description: 'obiektowo-funkcyjny standard funkcyjnego języka programowania Lisp.' +redirect_from: +- langs/cl +--- + + +

Blogi

+ + +

Inne

+ diff --git a/_collections/_langs/coq.html b/_collections/_langs/coq.html new file mode 100644 index 00000000..b0cae685 --- /dev/null +++ b/_collections/_langs/coq.html @@ -0,0 +1,13 @@ +--- +lang: coq +title: Coq +description: +--- + \ No newline at end of file diff --git a/_collections/_langs/crystal.html b/_collections/_langs/crystal.html new file mode 100644 index 00000000..57d1e28f --- /dev/null +++ b/_collections/_langs/crystal.html @@ -0,0 +1,19 @@ +--- +lang: crystal +title: Crystal +description: statycznie typowany, natywny język programowania ze składnią inspirowaną językiem Ruby. +--- + diff --git a/_collections/_langs/dart.html b/_collections/_langs/dart.html new file mode 100644 index 00000000..429b4bc3 --- /dev/null +++ b/_collections/_langs/dart.html @@ -0,0 +1,16 @@ +--- +lang: dart +title: Dart +description: statycznie typowany język programowania +--- + diff --git a/_collections/_langs/dc.html b/_collections/_langs/dc.html new file mode 100644 index 00000000..d47be398 --- /dev/null +++ b/_collections/_langs/dc.html @@ -0,0 +1,5 @@ +--- +lang: dc +title: DC +description: '' +--- \ No newline at end of file diff --git a/_collections/_langs/eiffel.html b/_collections/_langs/eiffel.html new file mode 100644 index 00000000..fff7e457 --- /dev/null +++ b/_collections/_langs/eiffel.html @@ -0,0 +1,13 @@ +--- +lang: eiffel +title: Eiffel +description: statycznie typowany, obiektowy język programowania. +--- + diff --git a/_collections/_langs/elixir.html b/_collections/_langs/elixir.html new file mode 100644 index 00000000..30544b2b --- /dev/null +++ b/_collections/_langs/elixir.html @@ -0,0 +1,19 @@ +--- +lang: elixir +title: Elixir +description: dynamicznie i silnie typowany oraz funkcyjny i współbieżny język programowania działający na maszynie wirtualnej Erlanga ze składnią inspirowaną językiem Ruby. +--- + diff --git a/_collections/_langs/elm.html b/_collections/_langs/elm.html new file mode 100644 index 00000000..204f99e4 --- /dev/null +++ b/_collections/_langs/elm.html @@ -0,0 +1,33 @@ +--- +lang: elm +title: Elm +description: 'język funkcyjny transpilowany do JS ispirowany językami ML i Haskell.' +--- + + +

Tutoriale i książki

+ + +

Blogi

+ diff --git a/_collections/_langs/emacs-lisp.html b/_collections/_langs/emacs-lisp.html new file mode 100644 index 00000000..c4e6c9be --- /dev/null +++ b/_collections/_langs/emacs-lisp.html @@ -0,0 +1,20 @@ +--- +lang: emacs-lisp +title: Emacs Lisp +description: 'Elisp, dialekt języka programowania Lisp używany do pisania rozszerzeń i skryptów edytora Emacs.' +redirect_from: +- langs/el +- langs/elc +- langs/elisp +--- + diff --git a/_collections/_langs/erlang.html b/_collections/_langs/erlang.html new file mode 100644 index 00000000..97479219 --- /dev/null +++ b/_collections/_langs/erlang.html @@ -0,0 +1,13 @@ +--- +lang: erlang +title: Erlang +description: dynamicznie i silnie typowany oraz funkcyjny i współbieżny język programowania działający na maszynie wirtualnej Erlanga +--- + diff --git a/_collections/_langs/eta.html b/_collections/_langs/eta.html new file mode 100644 index 00000000..3760e95f --- /dev/null +++ b/_collections/_langs/eta.html @@ -0,0 +1,41 @@ +--- +lang: eta +title: Eta +description: 'implementacja czysto-funkcyjnego języka programowania Haskell kompilowana do kodu bajtowego Javy.' +--- + + +

Wykłady i prezentacje

+ diff --git a/_collections/_langs/forth.html b/_collections/_langs/forth.html new file mode 100644 index 00000000..9e8191ef --- /dev/null +++ b/_collections/_langs/forth.html @@ -0,0 +1,5 @@ +--- +lang: forth +title: Forth +description: '' +--- diff --git a/_collections/_langs/frege.html b/_collections/_langs/frege.html new file mode 100644 index 00000000..8c503693 --- /dev/null +++ b/_collections/_langs/frege.html @@ -0,0 +1,20 @@ +--- +lang: frege +title: Frege +description: 'dialekt czysto-funkcyjnego języka programowania Haskell kompilowany do kodu bajtowego Javy.' +--- + + +

Nagrania

+ diff --git a/_collections/_langs/fsharp.html b/_collections/_langs/fsharp.html new file mode 100644 index 00000000..28977a6a --- /dev/null +++ b/_collections/_langs/fsharp.html @@ -0,0 +1,16 @@ +--- +lang: fsharp +title: F# +description: statycznie typowany, obiektowo-funkcyjny język programowania. Dialekt języka OCaml +--- + diff --git a/_collections/_langs/genie.html b/_collections/_langs/genie.html new file mode 100644 index 00000000..1fe51174 --- /dev/null +++ b/_collections/_langs/genie.html @@ -0,0 +1,13 @@ +--- +lang: genie +title: Genie +description: statycznie typowany, natywny i obiektowy język programowania transpilowany do C. +--- + diff --git a/_collections/_langs/go.html b/_collections/_langs/go.html new file mode 100644 index 00000000..97b153c0 --- /dev/null +++ b/_collections/_langs/go.html @@ -0,0 +1,16 @@ +--- +lang: go +title: Go +description: statycznie typowany, natywny język programowania. +--- + diff --git a/_collections/_langs/hamler.html b/_collections/_langs/hamler.html new file mode 100644 index 00000000..a3124e7b --- /dev/null +++ b/_collections/_langs/hamler.html @@ -0,0 +1,15 @@ +--- +lang: hamler +title: hamler +description: 'dialekt funkcyjnego języka programowania Haskell działający na maszynie wirtualnej Erlanga.' +redirect_from: +- langs/ps +--- + \ No newline at end of file diff --git a/_collections/_langs/haskell.html b/_collections/_langs/haskell.html new file mode 100644 index 00000000..25020d92 --- /dev/null +++ b/_collections/_langs/haskell.html @@ -0,0 +1,85 @@ +--- +lang: haskell +title: Haskell +description: 'statycznie typowany, natywny i czysto-funkcyjny język programowania.' +redirect_from: +- langs/hs +- langs/lhs +--- + + +

Niestandardowe implementacje i dialekty

+ diff --git a/_collections/_langs/idris.html b/_collections/_langs/idris.html new file mode 100644 index 00000000..37d9fe47 --- /dev/null +++ b/_collections/_langs/idris.html @@ -0,0 +1,23 @@ +--- +lang: idris +title: Idris +description: 'statycznie typowany, natywny i czysto-funkcyjny język programowania. Prawdopodobnie następca języka Haskell.' +--- + + +

Książki

+ diff --git a/_collections/_langs/java.html b/_collections/_langs/java.html new file mode 100644 index 00000000..461b84c8 --- /dev/null +++ b/_collections/_langs/java.html @@ -0,0 +1,5 @@ +--- +lang: java +title: Java +description: statycznie typowany język programowania kompilowany do kodu maszynowego Javy. +--- \ No newline at end of file diff --git a/_collections/_langs/javascript.html b/_collections/_langs/javascript.html new file mode 100644 index 00000000..4759a073 --- /dev/null +++ b/_collections/_langs/javascript.html @@ -0,0 +1,7 @@ +--- +lang: javascript +title: JavaScript +description: 'dynamicznie i słabo typowany, skryptowy język programowania.' +redirect_from: +- langs/js +--- diff --git a/_collections/_langs/joy.html b/_collections/_langs/joy.html new file mode 100644 index 00000000..4dab6dcb --- /dev/null +++ b/_collections/_langs/joy.html @@ -0,0 +1,13 @@ +--- +lang: joy +title: Joy +description: funkcyjny, stosowy, dynamicznie typowany język programowania +--- + diff --git a/_collections/_langs/julia.html b/_collections/_langs/julia.html new file mode 100644 index 00000000..21dddc8d --- /dev/null +++ b/_collections/_langs/julia.html @@ -0,0 +1,13 @@ +--- +lang: julia +title: Julia +description: dynamicznie typowany język przeznaczony do wysokowydajnej analizy numerycznej i nauk obliczeniowych. +--- + diff --git a/_collections/_langs/kotlin.html b/_collections/_langs/kotlin.html new file mode 100644 index 00000000..2e33c9a1 --- /dev/null +++ b/_collections/_langs/kotlin.html @@ -0,0 +1,26 @@ +--- +lang: kotlin +title: Kotlin +description: statycznie typowany język programowania kompilowany do kodu maszynowego Javy. +--- + + +

Nagrania

+ \ No newline at end of file diff --git a/_collections/_langs/lisp.html b/_collections/_langs/lisp.html new file mode 100644 index 00000000..d05d4e35 --- /dev/null +++ b/_collections/_langs/lisp.html @@ -0,0 +1,29 @@ +--- +lang: lisp +title: Lisp +description: dynamicznie typowany, funkcyjny język programowania. +--- +Pięć głównych dialektów to: +
    +
  1. + Scheme - minimalistyczny, + mocno funkcyjny (rekurencja ogonkowa i pełne kontunuacje) Lisp wymyślony w MIT do katowania studentów +
  2. +
  3. + Racket - dialekt Scheme używany do zastosowań naukowych +
  4. +
  5. + Clojure - dialekt Lispa, + mocno podobny do Scheme, + zoptymalizowany do działania na JVM + i czerpiący mocno z języka Haskell +
  6. +
  7. + Common Lisp - wszystkomający, + obiektowo-funkcyjny (Common Lisp Object System) Lisp +
  8. +
  9. + Emacs Lisp - dialekt Lispa, + mocno podobny do Common Lisp, używany w edytorze Emacs +
  10. +
diff --git a/_collections/_langs/livescript.html b/_collections/_langs/livescript.html new file mode 100644 index 00000000..5e28f92f --- /dev/null +++ b/_collections/_langs/livescript.html @@ -0,0 +1,18 @@ +--- +lang: livescript +title: LiveScript +description: 'dynamicznie i słabo typowany język programowania transpilowany do języka JavaScript.' +redirect_from: +- langs/ls +--- + diff --git a/_collections/_langs/lua.html b/_collections/_langs/lua.html new file mode 100644 index 00000000..73d84932 --- /dev/null +++ b/_collections/_langs/lua.html @@ -0,0 +1,22 @@ +--- +lang: lua +title: Lua +description: dynamicznie typowany, skryptowy język programowania. +--- + diff --git a/_collections/_langs/meta-language.html b/_collections/_langs/meta-language.html new file mode 100644 index 00000000..c796460f --- /dev/null +++ b/_collections/_langs/meta-language.html @@ -0,0 +1,48 @@ +--- +lang: meta-language +title: Meta Language +description: 'ML, rodzina statycznie typowanych języków funkcyjnych. Jako jeden z pierwszych posiadał typy polimorficzne umożliwiajace metaprogramowanie. Zaprojektowany jako LISP z typami.' +redirect_from: +- posts-by-langs/meta-language +- langs/ml +--- +

Dialekty języka ML

+
    +
  1. + OCaml - prawdopodobnie pierwszy statycznie typowany język wszystkomający (obiektowo-funkcyjny). +
  2. +
  3. + Standard ML, (SML) - ustandaryzowana wersja języka. +
  4. +
  5. + Concurrent ML, (CML) - dialekt Standard ML posiadający rozszerzenia do programowania współbierznego. +
  6. +
  7. + Dependent ML, (DML) - eksperymentalna wersja ML posiadająca typy zależne. +
  8. +
  9. + Lazy ML, (LML) - język ML z leniwą ewaluacją kompilowany do kodu natywnego. + Jeden z protoplastów języka Haskell +
  10. +
  11. + MacroML - eksperymentalna wersja ML posiadająca makra inspirowane makrami z języka Scheme +
  12. +
  13. + Elm - język transpilowany do JS, inspirowany językami ML i Haskell. +
  14. +
  15. + LinearML - ML działąjący bez GC +
  16. +
+ +

Kursy

+ + + diff --git a/_collections/_langs/mouse.html b/_collections/_langs/mouse.html new file mode 100644 index 00000000..620b98a4 --- /dev/null +++ b/_collections/_langs/mouse.html @@ -0,0 +1,10 @@ +--- +lang: mouse +title: Mouse +description: '' +--- + diff --git a/_collections/_langs/ocaml.html b/_collections/_langs/ocaml.html new file mode 100644 index 00000000..b26a1c9e --- /dev/null +++ b/_collections/_langs/ocaml.html @@ -0,0 +1,55 @@ +--- +lang: ocaml +title: OCaml +description: 'Obiektowe rozwinięcie języka programowania ML i pradopodobnie pierwszy statycznie typowany język wszystkomający (obiektowo-funkcyjny)' +redirect_from: +- langs/caml +- langs/mli +--- + + +

Blogi i youtube

+ + +

Dialekty języka OCaml i języki inspirowane nim

+
    +
  1. + Scala - język programowania na wirtualną maszynę Javy + inspirowany językiem OCaml. + Podobno co wersję Scali Martina Odersky zastanawia się czy nie zastąpić wąsatych nawiasów wcięciami jak w języku OCaml. +
  2. +
  3. + F# -implementacja języka OCaml na platformę .Net która powoli staje się nowym dialektem i językiem. +
  4. +
  5. + ReasonML - dialekt języka OCaml + kompilowany do JS + za pomocą BuckleScript. +
  6. +
diff --git a/_collections/_langs/perl.html b/_collections/_langs/perl.html new file mode 100644 index 00000000..20d07cd2 --- /dev/null +++ b/_collections/_langs/perl.html @@ -0,0 +1,22 @@ +--- +lang: perl +title: Perl +description: dynamicznie i słabo typowany, skryptowy język programowania. +--- + \ No newline at end of file diff --git a/_collections/_langs/pony.html b/_collections/_langs/pony.html new file mode 100644 index 00000000..4fc4aeed --- /dev/null +++ b/_collections/_langs/pony.html @@ -0,0 +1,23 @@ +--- +lang: pony +title: Pony +description: natywny język programowania. +--- + + +

Artykuły i youtube

+ diff --git a/_collections/_langs/postscript.html b/_collections/_langs/postscript.html new file mode 100644 index 00000000..faedd241 --- /dev/null +++ b/_collections/_langs/postscript.html @@ -0,0 +1,10 @@ +--- +lang: postscript +title: PostScript +description: '' +--- + diff --git a/_collections/_langs/prolog.html b/_collections/_langs/prolog.html new file mode 100644 index 00000000..6823846d --- /dev/null +++ b/_collections/_langs/prolog.html @@ -0,0 +1,27 @@ +--- +lang: prolog +title: Prolog +description: język programowania logicznego. +--- + +

Blogi

+ diff --git a/_collections/_langs/purescript.html b/_collections/_langs/purescript.html new file mode 100644 index 00000000..36a1cd03 --- /dev/null +++ b/_collections/_langs/purescript.html @@ -0,0 +1,21 @@ +--- +lang: purescript +title: PureScript +description: 'dialekt funkcyjnego języka programowania Haskell transpilowany do języka JavaScript.' +redirect_from: +- langs/ps +--- + \ No newline at end of file diff --git a/_collections/_langs/python.html b/_collections/_langs/python.html new file mode 100644 index 00000000..cd48edc5 --- /dev/null +++ b/_collections/_langs/python.html @@ -0,0 +1,16 @@ +--- +lang: python +title: Python +description: dynamicznie typowany, skryptowy język programowania. +--- + diff --git a/_collections/_langs/racket.html b/_collections/_langs/racket.html new file mode 100644 index 00000000..8780ba25 --- /dev/null +++ b/_collections/_langs/racket.html @@ -0,0 +1,19 @@ +--- +lang: racket +title: Racket +description: statycznie i dynamicznie typowany, funkcyjno-obiektowy dialekt języka programowania Scheme. +--- + diff --git a/_collections/_langs/reasonml.html b/_collections/_langs/reasonml.html new file mode 100644 index 00000000..61b5dcf8 --- /dev/null +++ b/_collections/_langs/reasonml.html @@ -0,0 +1,35 @@ +--- +lang: reasonml +title: ReasonML +description: 'Reason, rozszerzenie obiektowo-funkcyjnego języka programowania OCaml transpilowane do języka JavaScript.' +redirect_from: +- langs/reason +- langs/re +--- + + +

YouTube

+ diff --git a/_collections/_langs/rpl.html b/_collections/_langs/rpl.html new file mode 100644 index 00000000..29b794bc --- /dev/null +++ b/_collections/_langs/rpl.html @@ -0,0 +1,5 @@ +--- +lang: rpl +title: RPL +description: '' +--- diff --git a/_collections/_langs/ruby.html b/_collections/_langs/ruby.html new file mode 100644 index 00000000..1c7e6554 --- /dev/null +++ b/_collections/_langs/ruby.html @@ -0,0 +1,22 @@ +--- +lang: ruby +title: Ruby +description: dynamicznie typowany, w pełni obiektowy oraz interpretowany język programowania. +--- + \ No newline at end of file diff --git a/_collections/_langs/rust.html b/_collections/_langs/rust.html new file mode 100644 index 00000000..966d9557 --- /dev/null +++ b/_collections/_langs/rust.html @@ -0,0 +1,22 @@ +--- +lang: rust +title: Rust +description: statycznie typowany, natywny język programowania. +--- + diff --git a/_collections/_langs/sather.html b/_collections/_langs/sather.html new file mode 100644 index 00000000..bb8d27bc --- /dev/null +++ b/_collections/_langs/sather.html @@ -0,0 +1,13 @@ +--- +lang: sather +title: Sather +description: statycznie typowany, obiektowy język programowania. +--- + diff --git a/_collections/_langs/scala.html b/_collections/_langs/scala.html new file mode 100644 index 00000000..5611004d --- /dev/null +++ b/_collections/_langs/scala.html @@ -0,0 +1,32 @@ +--- +lang: scala +title: Scala +description: statycznie typowany, obiektowo-funkcyjny język programowania kompilowany do kodu maszynowego Javy inspirowany językami OCaml, Erlang i Haskell. +--- + + +

Tutoriale i książki

+ diff --git a/_collections/_langs/scheme.html b/_collections/_langs/scheme.html new file mode 100644 index 00000000..f3fe0828 --- /dev/null +++ b/_collections/_langs/scheme.html @@ -0,0 +1,131 @@ +--- +lang: scheme +title: Scheme +description: 'standard funkcyjnego języka programowania Lisp.' +--- + + +

Książki

+ + +

Implementacja rozwijane

+Racket wszystkomający dialekt.
+ +CHICKEN scheme - embedded intepreter z kontunuacjami + + +Chibi-Scheme - nowy embedded intepreter + + +Guile Scheme - wersja Scheme z łatwą integracją z C oparty na SCM + + +

Implementacje historyczne

+s7 - embedded intepreter oparty na TinyScheme + + +TinyScheme - embedded intepreter aktualnie używany w Gimpie + + +Scsh (a Scheme Shell) - powłoka systemowa oparta na Scheme 48 + + +Scheme 48 - interpreter będący podstawą powłoki Scheme Shell + + +SCM - wersja scheme oparta na SIOD + + +SIOD - embedded intepreter pierwotnie używany w Gimpie + + +PreScheme - Niskopoziomowy Scheme działąjący bez GC diff --git a/_collections/_langs/smalltalk.html b/_collections/_langs/smalltalk.html new file mode 100644 index 00000000..9dd3b7df --- /dev/null +++ b/_collections/_langs/smalltalk.html @@ -0,0 +1,32 @@ +--- +lang: smalltalk +title: +description: dynamicznie typowany, w pełni obiektowy, reflektywny języki programowania. +--- + +

Książki

+ +

Implementacje

+Squeak -implementacja języka Smalltalk. + diff --git a/_collections/_langs/standard-ml.html b/_collections/_langs/standard-ml.html new file mode 100644 index 00000000..45e2200b --- /dev/null +++ b/_collections/_langs/standard-ml.html @@ -0,0 +1,22 @@ +--- +lang: standard-ml +title: Standard ML +description: 'ustandaryzowana wersja języka Meta Language' +redirect_from: +- langs/sml +--- +

+
    +
  1. + Wikipedia +
  2. +
+ +

Kursy

+ + + diff --git a/_collections/_langs/tcl.html b/_collections/_langs/tcl.html new file mode 100644 index 00000000..eafcef0a --- /dev/null +++ b/_collections/_langs/tcl.html @@ -0,0 +1,25 @@ +--- +lang: tcl +title: Tcl +description: 'dynamicznie typowany, skryptowy język programowania inspirowany językiem Lisp.' +--- + +

Tutoriale

+ \ No newline at end of file diff --git a/_collections/_langs/typed-clojure.html b/_collections/_langs/typed-clojure.html new file mode 100644 index 00000000..d932c042 --- /dev/null +++ b/_collections/_langs/typed-clojure.html @@ -0,0 +1,13 @@ +--- +lang: typed-clojure +title: Typed Clojure +description: '' +--- + diff --git a/_collections/_langs/typed-racket.html b/_collections/_langs/typed-racket.html new file mode 100644 index 00000000..fe352d33 --- /dev/null +++ b/_collections/_langs/typed-racket.html @@ -0,0 +1,10 @@ +--- +lang: typed-racket +title: Typed Racket +description: '' +--- + diff --git a/_collections/_langs/typescript.html b/_collections/_langs/typescript.html new file mode 100644 index 00000000..d4a8e0d7 --- /dev/null +++ b/_collections/_langs/typescript.html @@ -0,0 +1,21 @@ +--- +lang: typescript +title: TypeScript +description: 'statycznie typowany język programowania transpilowany do języka JavaScript.' +redirect_from: +- langs/ts +--- + diff --git a/_collections/_langs/vala.html b/_collections/_langs/vala.html new file mode 100644 index 00000000..0c8c1d26 --- /dev/null +++ b/_collections/_langs/vala.html @@ -0,0 +1,16 @@ +--- +lang: vala +title: Vala +description: statycznie typowany, natywny i obiektowy język programowania transpilowany do C. +--- + diff --git a/_collections/_langs/webassembly.html b/_collections/_langs/webassembly.html new file mode 100644 index 00000000..974c2912 --- /dev/null +++ b/_collections/_langs/webassembly.html @@ -0,0 +1,7 @@ +--- +lang: webassembly +title: WebAssembly +description: '' +redirect_from: +- langs/wasm +--- diff --git a/_collections/_langs/zig.html b/_collections/_langs/zig.html new file mode 100644 index 00000000..245a12bf --- /dev/null +++ b/_collections/_langs/zig.html @@ -0,0 +1,5 @@ +--- +lang: zig +title: Zig +description: '' +--- From fbcec26d5a50b9eebb72579ffb100542f0bb0e44 Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Sun, 10 May 2020 20:02:14 +0200 Subject: [PATCH 019/160] Add tags --- _collections/_tags/ad-hoc.html | 6 +++++ _collections/_tags/adt.html | 6 +++++ _collections/_tags/ajax.html | 4 +++ _collections/_tags/alias.html | 4 +++ _collections/_tags/alternative.html | 16 ++++++++++++ _collections/_tags/api.html | 6 +++++ _collections/_tags/applicative.html | 16 ++++++++++++ _collections/_tags/assembler.html | 4 +++ _collections/_tags/ast.html | 8 ++++++ _collections/_tags/bdd.html | 6 +++++ _collections/_tags/blog.html | 4 +++ _collections/_tags/bytecode.html | 5 ++++ _collections/_tags/cfg.html | 6 +++++ _collections/_tags/cisc.html | 5 ++++ _collections/_tags/cli.html | 6 +++++ _collections/_tags/code-analysis.html | 4 +++ _collections/_tags/collection.html | 4 +++ _collections/_tags/compiler.html | 8 ++++++ _collections/_tags/continuation.html | 5 ++++ _collections/_tags/cps.html | 6 +++++ _collections/_tags/cson.html | 5 ++++ _collections/_tags/css.html | 4 +++ _collections/_tags/cst.html | 8 ++++++ _collections/_tags/currying.html | 4 +++ _collections/_tags/dag.html | 6 +++++ _collections/_tags/di.html | 4 +++ _collections/_tags/do-notation.html | 5 ++++ _collections/_tags/dsl.html | 6 +++++ _collections/_tags/dynamic-code-analysis.html | 6 +++++ _collections/_tags/factory.html | 4 +++ _collections/_tags/filter-branch.html | 5 ++++ _collections/_tags/flatmappable.html | 4 +++ _collections/_tags/for-comprehensions.html | 5 ++++ _collections/_tags/fp.html | 4 +++ _collections/_tags/functor.html | 26 +++++++++++++++++++ _collections/_tags/github-pages.html | 5 ++++ _collections/_tags/gui.html | 7 +++++ _collections/_tags/hocon.html | 6 +++++ _collections/_tags/html.html | 4 +++ _collections/_tags/http.html | 4 +++ _collections/_tags/hygienic-macro.html | 5 ++++ _collections/_tags/immutable.html | 4 +++ _collections/_tags/ini.html | 5 ++++ _collections/_tags/interface.html | 4 +++ _collections/_tags/interpreter.html | 4 +++ _collections/_tags/io.html | 7 +++++ _collections/_tags/java-properties.html | 4 +++ _collections/_tags/jekyllcodex.html | 4 +++ _collections/_tags/json-merge-patch.html | 10 +++++++ _collections/_tags/json-patch.html | 10 +++++++ _collections/_tags/json-pointer.html | 6 +++++ _collections/_tags/json-schema.html | 7 +++++ _collections/_tags/json.html | 5 ++++ _collections/_tags/lambda-calculus.html | 6 +++++ _collections/_tags/lazy.html | 4 +++ _collections/_tags/lexer.html | 4 +++ _collections/_tags/library.html | 4 +++ _collections/_tags/logging.html | 4 +++ _collections/_tags/mappable.html | 4 +++ _collections/_tags/microservice.html | 4 +++ _collections/_tags/misc.html | 5 ++++ _collections/_tags/monad.html | 23 ++++++++++++++++ _collections/_tags/monoid.html | 5 ++++ _collections/_tags/native.html | 4 +++ _collections/_tags/no-exceptions.html | 5 ++++ _collections/_tags/nojvm.html | 5 ++++ _collections/_tags/oisc.html | 5 ++++ _collections/_tags/onion.html | 4 +++ _collections/_tags/oop.html | 4 +++ _collections/_tags/openapi.html | 4 +++ _collections/_tags/operator.html | 4 +++ _collections/_tags/parser.html | 7 +++++ _collections/_tags/pattern-matching.html | 4 +++ _collections/_tags/properties.html | 4 +++ _collections/_tags/protocol.html | 4 +++ _collections/_tags/regexp.html | 4 +++ _collections/_tags/rest.html | 4 +++ _collections/_tags/risc.html | 5 ++++ _collections/_tags/rison.html | 4 +++ _collections/_tags/rpc.html | 4 +++ _collections/_tags/rpn.html | 4 +++ _collections/_tags/script.html | 4 +++ _collections/_tags/seo.html | 6 +++++ _collections/_tags/soap.html | 4 +++ _collections/_tags/ssa.html | 5 ++++ _collections/_tags/state.html | 7 +++++ _collections/_tags/static-code-analysis.html | 6 +++++ _collections/_tags/task.html | 4 +++ _collections/_tags/tco.html | 5 ++++ _collections/_tags/testing.html | 4 +++ _collections/_tags/toml.html | 7 +++++ _collections/_tags/trait.html | 4 +++ _collections/_tags/transpiler.html | 6 +++++ _collections/_tags/tui.html | 5 ++++ _collections/_tags/type-class.html | 14 ++++++++++ _collections/_tags/ui.html | 4 +++ _collections/_tags/unit-testing.html | 5 ++++ _collections/_tags/webservice.html | 4 +++ _collections/_tags/xml.html | 5 ++++ _collections/_tags/yaml.html | 4 +++ 100 files changed, 571 insertions(+) create mode 100644 _collections/_tags/ad-hoc.html create mode 100644 _collections/_tags/adt.html create mode 100644 _collections/_tags/ajax.html create mode 100644 _collections/_tags/alias.html create mode 100644 _collections/_tags/alternative.html create mode 100644 _collections/_tags/api.html create mode 100644 _collections/_tags/applicative.html create mode 100644 _collections/_tags/assembler.html create mode 100644 _collections/_tags/ast.html create mode 100644 _collections/_tags/bdd.html create mode 100644 _collections/_tags/blog.html create mode 100644 _collections/_tags/bytecode.html create mode 100644 _collections/_tags/cfg.html create mode 100644 _collections/_tags/cisc.html create mode 100644 _collections/_tags/cli.html create mode 100644 _collections/_tags/code-analysis.html create mode 100644 _collections/_tags/collection.html create mode 100644 _collections/_tags/compiler.html create mode 100644 _collections/_tags/continuation.html create mode 100644 _collections/_tags/cps.html create mode 100644 _collections/_tags/cson.html create mode 100644 _collections/_tags/css.html create mode 100644 _collections/_tags/cst.html create mode 100644 _collections/_tags/currying.html create mode 100644 _collections/_tags/dag.html create mode 100644 _collections/_tags/di.html create mode 100644 _collections/_tags/do-notation.html create mode 100644 _collections/_tags/dsl.html create mode 100644 _collections/_tags/dynamic-code-analysis.html create mode 100644 _collections/_tags/factory.html create mode 100644 _collections/_tags/filter-branch.html create mode 100644 _collections/_tags/flatmappable.html create mode 100644 _collections/_tags/for-comprehensions.html create mode 100644 _collections/_tags/fp.html create mode 100644 _collections/_tags/functor.html create mode 100644 _collections/_tags/github-pages.html create mode 100644 _collections/_tags/gui.html create mode 100644 _collections/_tags/hocon.html create mode 100644 _collections/_tags/html.html create mode 100644 _collections/_tags/http.html create mode 100644 _collections/_tags/hygienic-macro.html create mode 100644 _collections/_tags/immutable.html create mode 100644 _collections/_tags/ini.html create mode 100644 _collections/_tags/interface.html create mode 100644 _collections/_tags/interpreter.html create mode 100644 _collections/_tags/io.html create mode 100644 _collections/_tags/java-properties.html create mode 100644 _collections/_tags/jekyllcodex.html create mode 100644 _collections/_tags/json-merge-patch.html create mode 100644 _collections/_tags/json-patch.html create mode 100644 _collections/_tags/json-pointer.html create mode 100644 _collections/_tags/json-schema.html create mode 100644 _collections/_tags/json.html create mode 100644 _collections/_tags/lambda-calculus.html create mode 100644 _collections/_tags/lazy.html create mode 100644 _collections/_tags/lexer.html create mode 100644 _collections/_tags/library.html create mode 100644 _collections/_tags/logging.html create mode 100644 _collections/_tags/mappable.html create mode 100644 _collections/_tags/microservice.html create mode 100644 _collections/_tags/misc.html create mode 100644 _collections/_tags/monad.html create mode 100644 _collections/_tags/monoid.html create mode 100644 _collections/_tags/native.html create mode 100644 _collections/_tags/no-exceptions.html create mode 100644 _collections/_tags/nojvm.html create mode 100644 _collections/_tags/oisc.html create mode 100644 _collections/_tags/onion.html create mode 100644 _collections/_tags/oop.html create mode 100644 _collections/_tags/openapi.html create mode 100644 _collections/_tags/operator.html create mode 100644 _collections/_tags/parser.html create mode 100644 _collections/_tags/pattern-matching.html create mode 100644 _collections/_tags/properties.html create mode 100644 _collections/_tags/protocol.html create mode 100644 _collections/_tags/regexp.html create mode 100644 _collections/_tags/rest.html create mode 100644 _collections/_tags/risc.html create mode 100644 _collections/_tags/rison.html create mode 100644 _collections/_tags/rpc.html create mode 100644 _collections/_tags/rpn.html create mode 100644 _collections/_tags/script.html create mode 100644 _collections/_tags/seo.html create mode 100644 _collections/_tags/soap.html create mode 100644 _collections/_tags/ssa.html create mode 100644 _collections/_tags/state.html create mode 100644 _collections/_tags/static-code-analysis.html create mode 100644 _collections/_tags/task.html create mode 100644 _collections/_tags/tco.html create mode 100644 _collections/_tags/testing.html create mode 100644 _collections/_tags/toml.html create mode 100644 _collections/_tags/trait.html create mode 100644 _collections/_tags/transpiler.html create mode 100644 _collections/_tags/tui.html create mode 100644 _collections/_tags/type-class.html create mode 100644 _collections/_tags/ui.html create mode 100644 _collections/_tags/unit-testing.html create mode 100644 _collections/_tags/webservice.html create mode 100644 _collections/_tags/xml.html create mode 100644 _collections/_tags/yaml.html diff --git a/_collections/_tags/ad-hoc.html b/_collections/_tags/ad-hoc.html new file mode 100644 index 00000000..090cd92c --- /dev/null +++ b/_collections/_tags/ad-hoc.html @@ -0,0 +1,6 @@ +--- +tag: ad-hoc +title: Ad hoc polymorphism +--- +Polimorfizm ad-hoc +(ang. Ad hoc polymorphism) \ No newline at end of file diff --git a/_collections/_tags/adt.html b/_collections/_tags/adt.html new file mode 100644 index 00000000..bb1cc125 --- /dev/null +++ b/_collections/_tags/adt.html @@ -0,0 +1,6 @@ +--- +tag: adt +title: ADT +--- +Abstrakcyjny typ danych +(ang. Abstract data type, ADT) \ No newline at end of file diff --git a/_collections/_tags/ajax.html b/_collections/_tags/ajax.html new file mode 100644 index 00000000..911684d9 --- /dev/null +++ b/_collections/_tags/ajax.html @@ -0,0 +1,4 @@ +--- +tag: ajax +title: AJAX +--- diff --git a/_collections/_tags/alias.html b/_collections/_tags/alias.html new file mode 100644 index 00000000..934c081a --- /dev/null +++ b/_collections/_tags/alias.html @@ -0,0 +1,4 @@ +--- +tag: alias +title: Alias +--- \ No newline at end of file diff --git a/_collections/_tags/alternative.html b/_collections/_tags/alternative.html new file mode 100644 index 00000000..b8fc085e --- /dev/null +++ b/_collections/_tags/alternative.html @@ -0,0 +1,16 @@ +--- +tag: applicative +title: Applicative +tags: typeclass +--- +Alternatywa to monoid na funktorach aplikacyjnych (ang. Alternative is a monoid on applicative functors). + +

Dokumentacja

+ diff --git a/_collections/_tags/api.html b/_collections/_tags/api.html new file mode 100644 index 00000000..568e6be4 --- /dev/null +++ b/_collections/_tags/api.html @@ -0,0 +1,6 @@ +--- +tag: api +title: API +--- +Interfejs programowania aplikacji +(ang. Application programming interface, API) \ No newline at end of file diff --git a/_collections/_tags/applicative.html b/_collections/_tags/applicative.html new file mode 100644 index 00000000..fac2c8ad --- /dev/null +++ b/_collections/_tags/applicative.html @@ -0,0 +1,16 @@ +--- +tag: applicative +title: Applicative +tags: typeclass +--- +Aplikatywa to funktor z aplikacją + +

Dokumentacja

+ diff --git a/_collections/_tags/assembler.html b/_collections/_tags/assembler.html new file mode 100644 index 00000000..a02f76f7 --- /dev/null +++ b/_collections/_tags/assembler.html @@ -0,0 +1,4 @@ +--- +tag: assembler +title: Assembler +--- \ No newline at end of file diff --git a/_collections/_tags/ast.html b/_collections/_tags/ast.html new file mode 100644 index 00000000..ec01651e --- /dev/null +++ b/_collections/_tags/ast.html @@ -0,0 +1,8 @@ +--- +tag: ast +title: AST +--- +Drzewo składniowe +(ang. syntax tree), +czyli drzewo składni abstrakcyjnej +(ang. abstract syntax tree, AST). diff --git a/_collections/_tags/bdd.html b/_collections/_tags/bdd.html new file mode 100644 index 00000000..f18ff2c9 --- /dev/null +++ b/_collections/_tags/bdd.html @@ -0,0 +1,6 @@ +--- +tag: bdd +title: BDD +--- +Rozwój oparty na zachowaniu +(ang. Behavior-driven development, BDD) \ No newline at end of file diff --git a/_collections/_tags/blog.html b/_collections/_tags/blog.html new file mode 100644 index 00000000..aa1ac48d --- /dev/null +++ b/_collections/_tags/blog.html @@ -0,0 +1,4 @@ +--- +tag: blog +title: Blog +--- \ No newline at end of file diff --git a/_collections/_tags/bytecode.html b/_collections/_tags/bytecode.html new file mode 100644 index 00000000..29e9c8c1 --- /dev/null +++ b/_collections/_tags/bytecode.html @@ -0,0 +1,5 @@ +--- +tag: bytecode +title: Bytecode +--- +Kod bajtowy (ang. Bytecode). \ No newline at end of file diff --git a/_collections/_tags/cfg.html b/_collections/_tags/cfg.html new file mode 100644 index 00000000..45ce799e --- /dev/null +++ b/_collections/_tags/cfg.html @@ -0,0 +1,6 @@ +--- +tag: cfg +title: CFG +--- +Graf przepływu sterowania +(ang. Control-flow graph, CFG). diff --git a/_collections/_tags/cisc.html b/_collections/_tags/cisc.html new file mode 100644 index 00000000..586bbadf --- /dev/null +++ b/_collections/_tags/cisc.html @@ -0,0 +1,5 @@ +--- +tag: cisc +title: CISC +tags: isc +--- diff --git a/_collections/_tags/cli.html b/_collections/_tags/cli.html new file mode 100644 index 00000000..8d8e182d --- /dev/null +++ b/_collections/_tags/cli.html @@ -0,0 +1,6 @@ +--- +tag: cli +title: CLI +--- +Wiersz poleceń +(ang. Command-line interface, CLI) \ No newline at end of file diff --git a/_collections/_tags/code-analysis.html b/_collections/_tags/code-analysis.html new file mode 100644 index 00000000..088592be --- /dev/null +++ b/_collections/_tags/code-analysis.html @@ -0,0 +1,4 @@ +--- +tag: code-analysis +title: Code analysis +--- \ No newline at end of file diff --git a/_collections/_tags/collection.html b/_collections/_tags/collection.html new file mode 100644 index 00000000..ea251f62 --- /dev/null +++ b/_collections/_tags/collection.html @@ -0,0 +1,4 @@ +--- +tag: collection +title: Collection +--- diff --git a/_collections/_tags/compiler.html b/_collections/_tags/compiler.html new file mode 100644 index 00000000..59f99add --- /dev/null +++ b/_collections/_tags/compiler.html @@ -0,0 +1,8 @@ +--- +tag: compiler +title: Compiler +--- +

Ksiązki

+
    +
  • Kompilatory. Reguły, metody i narzędzia. KLASYKA INFORMATYKI. Autorzy: Jeffrey D. Ullman , Alfred V. Aho , Ravi Sethi
  • +
diff --git a/_collections/_tags/continuation.html b/_collections/_tags/continuation.html new file mode 100644 index 00000000..6a2edc6f --- /dev/null +++ b/_collections/_tags/continuation.html @@ -0,0 +1,5 @@ +--- +tag: continuation +title: Continuation +--- +Kontynuacja (ang. Continuation) diff --git a/_collections/_tags/cps.html b/_collections/_tags/cps.html new file mode 100644 index 00000000..3f2ac70d --- /dev/null +++ b/_collections/_tags/cps.html @@ -0,0 +1,6 @@ +--- +tag: cps +title: cps +--- +Programowania w stylu kontynuacyjnym +(ang. Continuation-passing style, CPS). diff --git a/_collections/_tags/cson.html b/_collections/_tags/cson.html new file mode 100644 index 00000000..2e060b83 --- /dev/null +++ b/_collections/_tags/cson.html @@ -0,0 +1,5 @@ +--- +tag: cson +title: CSON +langs: coffeescript +--- diff --git a/_collections/_tags/css.html b/_collections/_tags/css.html new file mode 100644 index 00000000..b1c4315e --- /dev/null +++ b/_collections/_tags/css.html @@ -0,0 +1,4 @@ +--- +tag: css +title: CSS +--- \ No newline at end of file diff --git a/_collections/_tags/cst.html b/_collections/_tags/cst.html new file mode 100644 index 00000000..14ea34e3 --- /dev/null +++ b/_collections/_tags/cst.html @@ -0,0 +1,8 @@ +--- +tag: cst +title: CST +--- +Drzewo wyprowadzenia +(ang. parse tree), +czyli drzewo składni konkretnej +(ang. concrete syntax tree, CST). \ No newline at end of file diff --git a/_collections/_tags/currying.html b/_collections/_tags/currying.html new file mode 100644 index 00000000..d478b048 --- /dev/null +++ b/_collections/_tags/currying.html @@ -0,0 +1,4 @@ +--- +tag: currying +title: Currying +--- diff --git a/_collections/_tags/dag.html b/_collections/_tags/dag.html new file mode 100644 index 00000000..a30bd739 --- /dev/null +++ b/_collections/_tags/dag.html @@ -0,0 +1,6 @@ +--- +tag: dag +title: DAG +--- +Skierowany graf acykliczny +(ang. directed acyclic graph, DAG). diff --git a/_collections/_tags/di.html b/_collections/_tags/di.html new file mode 100644 index 00000000..5c6b8633 --- /dev/null +++ b/_collections/_tags/di.html @@ -0,0 +1,4 @@ +--- +tag: di +title: DI +--- diff --git a/_collections/_tags/do-notation.html b/_collections/_tags/do-notation.html new file mode 100644 index 00000000..64642517 --- /dev/null +++ b/_collections/_tags/do-notation.html @@ -0,0 +1,5 @@ +--- +tag: do-notation +title: bo notation +--- +Notacja do (ang. do notation) diff --git a/_collections/_tags/dsl.html b/_collections/_tags/dsl.html new file mode 100644 index 00000000..168c0ae0 --- /dev/null +++ b/_collections/_tags/dsl.html @@ -0,0 +1,6 @@ +--- +tag: dsl +title: DSL +--- +Język dziedzinowy +(ang. Domain-specific language, DSL) \ No newline at end of file diff --git a/_collections/_tags/dynamic-code-analysis.html b/_collections/_tags/dynamic-code-analysis.html new file mode 100644 index 00000000..bde0c404 --- /dev/null +++ b/_collections/_tags/dynamic-code-analysis.html @@ -0,0 +1,6 @@ +--- +tag: dynamic-code-analysis +title: Dynamic code analysis +--- +Dynamiczna analiza kodu +(ang. Dynamic code analysis) diff --git a/_collections/_tags/factory.html b/_collections/_tags/factory.html new file mode 100644 index 00000000..89cd0f2e --- /dev/null +++ b/_collections/_tags/factory.html @@ -0,0 +1,4 @@ +--- +tag: factory +title: Factory +--- \ No newline at end of file diff --git a/_collections/_tags/filter-branch.html b/_collections/_tags/filter-branch.html new file mode 100644 index 00000000..79fe1506 --- /dev/null +++ b/_collections/_tags/filter-branch.html @@ -0,0 +1,5 @@ +--- +tag: filter-branch +title: Filter Branch +tools: git +--- \ No newline at end of file diff --git a/_collections/_tags/flatmappable.html b/_collections/_tags/flatmappable.html new file mode 100644 index 00000000..c9800681 --- /dev/null +++ b/_collections/_tags/flatmappable.html @@ -0,0 +1,4 @@ +--- +tag: flatmappable +title: FlatMappable +--- diff --git a/_collections/_tags/for-comprehensions.html b/_collections/_tags/for-comprehensions.html new file mode 100644 index 00000000..44604906 --- /dev/null +++ b/_collections/_tags/for-comprehensions.html @@ -0,0 +1,5 @@ +--- +tag: for-comprehensions +title: For Comprehensions +langs: eta haskell scala +--- \ No newline at end of file diff --git a/_collections/_tags/fp.html b/_collections/_tags/fp.html new file mode 100644 index 00000000..d8eefdf9 --- /dev/null +++ b/_collections/_tags/fp.html @@ -0,0 +1,4 @@ +--- +tag: fp +title: Functional Programing +--- \ No newline at end of file diff --git a/_collections/_tags/functor.html b/_collections/_tags/functor.html new file mode 100644 index 00000000..e893555b --- /dev/null +++ b/_collections/_tags/functor.html @@ -0,0 +1,26 @@ +--- +tag: functor +title: Functor +tags: typeclass +--- + +

Dokumentacja

+ + + + + + + + + diff --git a/_collections/_tags/github-pages.html b/_collections/_tags/github-pages.html new file mode 100644 index 00000000..fc05f2af --- /dev/null +++ b/_collections/_tags/github-pages.html @@ -0,0 +1,5 @@ +--- +tag: github-pages +title: GitHub Pages +--- +GitHub Pages diff --git a/_collections/_tags/gui.html b/_collections/_tags/gui.html new file mode 100644 index 00000000..28ed933b --- /dev/null +++ b/_collections/_tags/gui.html @@ -0,0 +1,7 @@ +--- +tag: gui +title: GUI +tags: ui +--- +Graficzny interfejs użytkownika +(ang. CGraphical user interface, GUI) diff --git a/_collections/_tags/hocon.html b/_collections/_tags/hocon.html new file mode 100644 index 00000000..da3f6ecb --- /dev/null +++ b/_collections/_tags/hocon.html @@ -0,0 +1,6 @@ +--- +tag: hocon +title: HOCON +langs: java scala +--- +HOCON diff --git a/_collections/_tags/html.html b/_collections/_tags/html.html new file mode 100644 index 00000000..64c111cc --- /dev/null +++ b/_collections/_tags/html.html @@ -0,0 +1,4 @@ +--- +tag: html +title: HTML +--- \ No newline at end of file diff --git a/_collections/_tags/http.html b/_collections/_tags/http.html new file mode 100644 index 00000000..64a24ff7 --- /dev/null +++ b/_collections/_tags/http.html @@ -0,0 +1,4 @@ +--- +tag: http +title: HTTP +--- \ No newline at end of file diff --git a/_collections/_tags/hygienic-macro.html b/_collections/_tags/hygienic-macro.html new file mode 100644 index 00000000..829fa35d --- /dev/null +++ b/_collections/_tags/hygienic-macro.html @@ -0,0 +1,5 @@ +--- +tag: type-class +title: Hygienic Macro +--- +Makro Higieniczne (ang. Hygienic Macro) diff --git a/_collections/_tags/immutable.html b/_collections/_tags/immutable.html new file mode 100644 index 00000000..15cdab06 --- /dev/null +++ b/_collections/_tags/immutable.html @@ -0,0 +1,4 @@ +--- +tag: immutable +title: Immutable +--- diff --git a/_collections/_tags/ini.html b/_collections/_tags/ini.html new file mode 100644 index 00000000..c903e88f --- /dev/null +++ b/_collections/_tags/ini.html @@ -0,0 +1,5 @@ +--- +tag: ini +title: INI +langs: Python +--- diff --git a/_collections/_tags/interface.html b/_collections/_tags/interface.html new file mode 100644 index 00000000..5b93db37 --- /dev/null +++ b/_collections/_tags/interface.html @@ -0,0 +1,4 @@ +--- +tag: interface +title: Interface +--- \ No newline at end of file diff --git a/_collections/_tags/interpreter.html b/_collections/_tags/interpreter.html new file mode 100644 index 00000000..9ff81a18 --- /dev/null +++ b/_collections/_tags/interpreter.html @@ -0,0 +1,4 @@ +--- +tag: interpreter +title: Interpreter +--- \ No newline at end of file diff --git a/_collections/_tags/io.html b/_collections/_tags/io.html new file mode 100644 index 00000000..3589317d --- /dev/null +++ b/_collections/_tags/io.html @@ -0,0 +1,7 @@ +--- +tag: io +title: IO +--- +IO - skrót oznaczający operacje wejścia-wyjścia (Input-Output), +a także monadę z języku programowania Haskell (oraz inspirującym się na nim) +do przeprowadzania operacji wejścia i wyjścia. \ No newline at end of file diff --git a/_collections/_tags/java-properties.html b/_collections/_tags/java-properties.html new file mode 100644 index 00000000..c48e56e1 --- /dev/null +++ b/_collections/_tags/java-properties.html @@ -0,0 +1,4 @@ +--- +tag: java-properties +title: Java Properties +--- diff --git a/_collections/_tags/jekyllcodex.html b/_collections/_tags/jekyllcodex.html new file mode 100644 index 00000000..14c0e660 --- /dev/null +++ b/_collections/_tags/jekyllcodex.html @@ -0,0 +1,4 @@ +--- +tag: jekyllcodex +title: jekyllcodex +--- \ No newline at end of file diff --git a/_collections/_tags/json-merge-patch.html b/_collections/_tags/json-merge-patch.html new file mode 100644 index 00000000..bbd70fa3 --- /dev/null +++ b/_collections/_tags/json-merge-patch.html @@ -0,0 +1,10 @@ +--- +tag: json-merge-patch +title: JSON Merge Patch +tags: json +--- +RFC 7386 (JSON Merge Patch) + + diff --git a/_collections/_tags/json-patch.html b/_collections/_tags/json-patch.html new file mode 100644 index 00000000..823e4d63 --- /dev/null +++ b/_collections/_tags/json-patch.html @@ -0,0 +1,10 @@ +--- +tag: json-patch +title: JSON Patch +tags: json +--- +RFC 6902 (JSON Patch) + + diff --git a/_collections/_tags/json-pointer.html b/_collections/_tags/json-pointer.html new file mode 100644 index 00000000..2f78ad21 --- /dev/null +++ b/_collections/_tags/json-pointer.html @@ -0,0 +1,6 @@ +--- +tag: json-pointer +title: JSON pointer +tags: json +--- +RFC 6901 (JSON Pointer) diff --git a/_collections/_tags/json-schema.html b/_collections/_tags/json-schema.html new file mode 100644 index 00000000..2dc89340 --- /dev/null +++ b/_collections/_tags/json-schema.html @@ -0,0 +1,7 @@ +--- +tag: json-schema +title: JSON Schema +tags: json +--- +JSON Schema + diff --git a/_collections/_tags/json.html b/_collections/_tags/json.html new file mode 100644 index 00000000..a60aa314 --- /dev/null +++ b/_collections/_tags/json.html @@ -0,0 +1,5 @@ +--- +tag: json +title: JSON +--- +JavaScript Object Notation \ No newline at end of file diff --git a/_collections/_tags/lambda-calculus.html b/_collections/_tags/lambda-calculus.html new file mode 100644 index 00000000..9200ebf4 --- /dev/null +++ b/_collections/_tags/lambda-calculus.html @@ -0,0 +1,6 @@ +--- +tag: lambda-calculus +title: lambda calculus +--- +Rachunek lambda +(ang. Lambda calculus). \ No newline at end of file diff --git a/_collections/_tags/lazy.html b/_collections/_tags/lazy.html new file mode 100644 index 00000000..1af244db --- /dev/null +++ b/_collections/_tags/lazy.html @@ -0,0 +1,4 @@ +--- +tag: lazy +title: Lazy +--- diff --git a/_collections/_tags/lexer.html b/_collections/_tags/lexer.html new file mode 100644 index 00000000..5c2302ad --- /dev/null +++ b/_collections/_tags/lexer.html @@ -0,0 +1,4 @@ +--- +tag: lexer +title: Lexer +--- \ No newline at end of file diff --git a/_collections/_tags/library.html b/_collections/_tags/library.html new file mode 100644 index 00000000..6ff54326 --- /dev/null +++ b/_collections/_tags/library.html @@ -0,0 +1,4 @@ +--- +tag: library +title: Library +--- \ No newline at end of file diff --git a/_collections/_tags/logging.html b/_collections/_tags/logging.html new file mode 100644 index 00000000..876b6b13 --- /dev/null +++ b/_collections/_tags/logging.html @@ -0,0 +1,4 @@ +--- +tag: logging +title: Logging +--- \ No newline at end of file diff --git a/_collections/_tags/mappable.html b/_collections/_tags/mappable.html new file mode 100644 index 00000000..45b01385 --- /dev/null +++ b/_collections/_tags/mappable.html @@ -0,0 +1,4 @@ +--- +tag: mappable +title: Mappable +--- diff --git a/_collections/_tags/microservice.html b/_collections/_tags/microservice.html new file mode 100644 index 00000000..7c3a90f6 --- /dev/null +++ b/_collections/_tags/microservice.html @@ -0,0 +1,4 @@ +--- +tag: microservice +title: MicroService +--- diff --git a/_collections/_tags/misc.html b/_collections/_tags/misc.html new file mode 100644 index 00000000..da8f3f2b --- /dev/null +++ b/_collections/_tags/misc.html @@ -0,0 +1,5 @@ +--- +tag: misc +title: MISC +tags: isc +--- diff --git a/_collections/_tags/monad.html b/_collections/_tags/monad.html new file mode 100644 index 00000000..81215f9a --- /dev/null +++ b/_collections/_tags/monad.html @@ -0,0 +1,23 @@ +--- +tag: monad +title: Monad +tags: typeclass +--- +Monada to monoid w kategorii endofunktorów + +

Dokumentacja

+ + +

Youtube

+ diff --git a/_collections/_tags/monoid.html b/_collections/_tags/monoid.html new file mode 100644 index 00000000..2af75ea0 --- /dev/null +++ b/_collections/_tags/monoid.html @@ -0,0 +1,5 @@ +--- +tag: monoid +title: Monoid +tags: typeclass +--- diff --git a/_collections/_tags/native.html b/_collections/_tags/native.html new file mode 100644 index 00000000..715a7a4c --- /dev/null +++ b/_collections/_tags/native.html @@ -0,0 +1,4 @@ +--- +tag: native +title: Native +--- \ No newline at end of file diff --git a/_collections/_tags/no-exceptions.html b/_collections/_tags/no-exceptions.html new file mode 100644 index 00000000..58b758c1 --- /dev/null +++ b/_collections/_tags/no-exceptions.html @@ -0,0 +1,5 @@ +--- +tag: no-exceptions +title: No exceptions +--- +No exceptions \ No newline at end of file diff --git a/_collections/_tags/nojvm.html b/_collections/_tags/nojvm.html new file mode 100644 index 00000000..726981b3 --- /dev/null +++ b/_collections/_tags/nojvm.html @@ -0,0 +1,5 @@ +--- +tag: nojvm +title: NoJVM +--- +Not Only Java Virtual Machine \ No newline at end of file diff --git a/_collections/_tags/oisc.html b/_collections/_tags/oisc.html new file mode 100644 index 00000000..aa68c7b6 --- /dev/null +++ b/_collections/_tags/oisc.html @@ -0,0 +1,5 @@ +--- +tag: oisc +title: OICS +tags: isc +--- diff --git a/_collections/_tags/onion.html b/_collections/_tags/onion.html new file mode 100644 index 00000000..f4aaea9f --- /dev/null +++ b/_collections/_tags/onion.html @@ -0,0 +1,4 @@ +--- +tag: onion +title: Onion +--- diff --git a/_collections/_tags/oop.html b/_collections/_tags/oop.html new file mode 100644 index 00000000..3f104cae --- /dev/null +++ b/_collections/_tags/oop.html @@ -0,0 +1,4 @@ +--- +tag: oop +title: OOP +--- diff --git a/_collections/_tags/openapi.html b/_collections/_tags/openapi.html new file mode 100644 index 00000000..32f91683 --- /dev/null +++ b/_collections/_tags/openapi.html @@ -0,0 +1,4 @@ +--- +tag: openapi +title: OpenAPI +--- \ No newline at end of file diff --git a/_collections/_tags/operator.html b/_collections/_tags/operator.html new file mode 100644 index 00000000..a216a01b --- /dev/null +++ b/_collections/_tags/operator.html @@ -0,0 +1,4 @@ +--- +tag: operator +title: Operator +--- \ No newline at end of file diff --git a/_collections/_tags/parser.html b/_collections/_tags/parser.html new file mode 100644 index 00000000..a3fd600f --- /dev/null +++ b/_collections/_tags/parser.html @@ -0,0 +1,7 @@ +--- +tag: parser +title: Parser +--- +Parser to program dokonujący procesu analizy składniowej na ciągu leksemów (tokenach z typami), +czyli sprawdzeniu ich zgodności z określoną gramatyką formalną. +Wynikiem pracy parsera jest drzewo składniowe na którym są przeprowadzane dalsze operacje. diff --git a/_collections/_tags/pattern-matching.html b/_collections/_tags/pattern-matching.html new file mode 100644 index 00000000..dd259bbe --- /dev/null +++ b/_collections/_tags/pattern-matching.html @@ -0,0 +1,4 @@ +--- +tag: pattern-matching +title: Pattern Matching +--- diff --git a/_collections/_tags/properties.html b/_collections/_tags/properties.html new file mode 100644 index 00000000..d3c46d8f --- /dev/null +++ b/_collections/_tags/properties.html @@ -0,0 +1,4 @@ +--- +tag: properties +title: Properties +--- \ No newline at end of file diff --git a/_collections/_tags/protocol.html b/_collections/_tags/protocol.html new file mode 100644 index 00000000..864326fb --- /dev/null +++ b/_collections/_tags/protocol.html @@ -0,0 +1,4 @@ +--- +tag: protocol +title: Protocol +--- \ No newline at end of file diff --git a/_collections/_tags/regexp.html b/_collections/_tags/regexp.html new file mode 100644 index 00000000..a3e98044 --- /dev/null +++ b/_collections/_tags/regexp.html @@ -0,0 +1,4 @@ +--- +tag: regexp +title: RegExp +--- diff --git a/_collections/_tags/rest.html b/_collections/_tags/rest.html new file mode 100644 index 00000000..3173bd6d --- /dev/null +++ b/_collections/_tags/rest.html @@ -0,0 +1,4 @@ +--- +tag: rest +title: REST +--- diff --git a/_collections/_tags/risc.html b/_collections/_tags/risc.html new file mode 100644 index 00000000..e7e5afb2 --- /dev/null +++ b/_collections/_tags/risc.html @@ -0,0 +1,5 @@ +--- +tag: risc +title: RISC +tags: isc +--- diff --git a/_collections/_tags/rison.html b/_collections/_tags/rison.html new file mode 100644 index 00000000..9f5a9fb8 --- /dev/null +++ b/_collections/_tags/rison.html @@ -0,0 +1,4 @@ +--- +tag: rison +title: Rison +--- diff --git a/_collections/_tags/rpc.html b/_collections/_tags/rpc.html new file mode 100644 index 00000000..19b0c829 --- /dev/null +++ b/_collections/_tags/rpc.html @@ -0,0 +1,4 @@ +--- +tag: rpc +title: RPC +--- diff --git a/_collections/_tags/rpn.html b/_collections/_tags/rpn.html new file mode 100644 index 00000000..a028b1c0 --- /dev/null +++ b/_collections/_tags/rpn.html @@ -0,0 +1,4 @@ +--- +tag: rpn +title: RPN +--- \ No newline at end of file diff --git a/_collections/_tags/script.html b/_collections/_tags/script.html new file mode 100644 index 00000000..b16f3f37 --- /dev/null +++ b/_collections/_tags/script.html @@ -0,0 +1,4 @@ +--- +tag: script +title: Script +--- diff --git a/_collections/_tags/seo.html b/_collections/_tags/seo.html new file mode 100644 index 00000000..d2169cbe --- /dev/null +++ b/_collections/_tags/seo.html @@ -0,0 +1,6 @@ +--- +tag: seo +title: SEO +--- +Optymalizacja dla wyszukiwarek internetowych +(ang. Search engine optimization, SEO). diff --git a/_collections/_tags/soap.html b/_collections/_tags/soap.html new file mode 100644 index 00000000..46363252 --- /dev/null +++ b/_collections/_tags/soap.html @@ -0,0 +1,4 @@ +--- +tag: soap +title: SOAP +--- diff --git a/_collections/_tags/ssa.html b/_collections/_tags/ssa.html new file mode 100644 index 00000000..27c5cf1c --- /dev/null +++ b/_collections/_tags/ssa.html @@ -0,0 +1,5 @@ +--- +tag: ssa +title: SSA +--- +Single Static Assignment SSA. diff --git a/_collections/_tags/state.html b/_collections/_tags/state.html new file mode 100644 index 00000000..35b1b706 --- /dev/null +++ b/_collections/_tags/state.html @@ -0,0 +1,7 @@ +--- +tag: state-monad +title: State monad +tags: monad +--- +Monada State - monada z języku programowania Haskell +do przechowywania stanu. \ No newline at end of file diff --git a/_collections/_tags/static-code-analysis.html b/_collections/_tags/static-code-analysis.html new file mode 100644 index 00000000..079aa6d5 --- /dev/null +++ b/_collections/_tags/static-code-analysis.html @@ -0,0 +1,6 @@ +--- +tag: static-code-analysis +title: Static code analysis +--- +Statyczna analiza kodu +(ang. Static code analysis) \ No newline at end of file diff --git a/_collections/_tags/task.html b/_collections/_tags/task.html new file mode 100644 index 00000000..2bbc7255 --- /dev/null +++ b/_collections/_tags/task.html @@ -0,0 +1,4 @@ +--- +tag: task +title: Task +--- diff --git a/_collections/_tags/tco.html b/_collections/_tags/tco.html new file mode 100644 index 00000000..0b332031 --- /dev/null +++ b/_collections/_tags/tco.html @@ -0,0 +1,5 @@ +--- +tag: tco +title: TCO +--- +Optymalizacja rekuncji ogonowej (ang. *Tail Call Optimization*, **TCO**) \ No newline at end of file diff --git a/_collections/_tags/testing.html b/_collections/_tags/testing.html new file mode 100644 index 00000000..dd0e3705 --- /dev/null +++ b/_collections/_tags/testing.html @@ -0,0 +1,4 @@ +--- +tag: testing +title: Testing +--- diff --git a/_collections/_tags/toml.html b/_collections/_tags/toml.html new file mode 100644 index 00000000..3deda2d0 --- /dev/null +++ b/_collections/_tags/toml.html @@ -0,0 +1,7 @@ +--- +tag: toml +title: TOML +langs: rust +tools: seed +--- +TOML diff --git a/_collections/_tags/trait.html b/_collections/_tags/trait.html new file mode 100644 index 00000000..dd03d5ba --- /dev/null +++ b/_collections/_tags/trait.html @@ -0,0 +1,4 @@ +--- +tag: trait +title: trait +--- \ No newline at end of file diff --git a/_collections/_tags/transpiler.html b/_collections/_tags/transpiler.html new file mode 100644 index 00000000..225d346f --- /dev/null +++ b/_collections/_tags/transpiler.html @@ -0,0 +1,6 @@ +--- +tag: transpiler +title: Transpiler +--- +Transpilator (ang. transpiler) jest to +kompilator ze źródła do źródła (ang. source-to-source compiler). \ No newline at end of file diff --git a/_collections/_tags/tui.html b/_collections/_tags/tui.html new file mode 100644 index 00000000..d6b36dbe --- /dev/null +++ b/_collections/_tags/tui.html @@ -0,0 +1,5 @@ +--- +tag: tui +title: TUI +tags: ui +--- \ No newline at end of file diff --git a/_collections/_tags/type-class.html b/_collections/_tags/type-class.html new file mode 100644 index 00000000..65ca3dfa --- /dev/null +++ b/_collections/_tags/type-class.html @@ -0,0 +1,14 @@ +--- +tag: type-class +title: Type Class +--- +Klasa Typów (ang. Type Class) jest to cecha (ang. trait która: +
    +
  • nie ma wewnętrznego stanu
  • +
  • ma parametr typu
  • +
  • ma przynajmniej jedną metodą abstrakcyjną (kombinator prymitywny (primitive combinator))
  • +
  • może mieć metody uogólnione (kombinatory pochodne (derived combinators))
  • +
  • może rozszerzać inne typeklasy
  • +
+ +Definicja za Programowanie Funkcyjne dla Śmiertelników ze Scalaz \ No newline at end of file diff --git a/_collections/_tags/ui.html b/_collections/_tags/ui.html new file mode 100644 index 00000000..42c11b1b --- /dev/null +++ b/_collections/_tags/ui.html @@ -0,0 +1,4 @@ +--- +tag: ui +title: UI +--- \ No newline at end of file diff --git a/_collections/_tags/unit-testing.html b/_collections/_tags/unit-testing.html new file mode 100644 index 00000000..4d4f4a06 --- /dev/null +++ b/_collections/_tags/unit-testing.html @@ -0,0 +1,5 @@ +--- +tag: unit-testing +title: Unit Testing +tags: testing +--- diff --git a/_collections/_tags/webservice.html b/_collections/_tags/webservice.html new file mode 100644 index 00000000..5183f96d --- /dev/null +++ b/_collections/_tags/webservice.html @@ -0,0 +1,4 @@ +--- +tag: webservice +title: WebService +--- diff --git a/_collections/_tags/xml.html b/_collections/_tags/xml.html new file mode 100644 index 00000000..1d2fc8ba --- /dev/null +++ b/_collections/_tags/xml.html @@ -0,0 +1,5 @@ +--- +tag: xml +title: XML +--- +XML (ang. Extensible Markup Language, w wolnym tłumaczeniu Rozszerzalny Język Znaczników). diff --git a/_collections/_tags/yaml.html b/_collections/_tags/yaml.html new file mode 100644 index 00000000..88227da1 --- /dev/null +++ b/_collections/_tags/yaml.html @@ -0,0 +1,4 @@ +--- +tag: yaml +title: YAML +--- From c0fce0ae410224a971b00c8d15da22c61b766baa Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Wed, 25 Mar 2020 22:05:58 +0100 Subject: [PATCH 020/160] Update _pages --- _pages/about.html | 26 ++++++++++++++++++++++++++ _pages/about.md | 8 -------- _pages/all-posts.html | 22 ++++++++++++++++++++++ _pages/archive-categories.html | 6 ++++++ _pages/archive-eso.html | 6 ++++++ _pages/archive-langs.html | 6 ++++++ _pages/archive-libs.html | 6 ++++++ _pages/archive-projects.html | 6 ++++++ _pages/archive-tags.html | 6 ++++++ _pages/archive-tools.html | 6 ++++++ _pages/archive-years.html | 5 +++++ _pages/category-archive.md | 6 ------ _pages/privacy.html | 21 +++++++++++++++++++++ _pages/read-books.html | 25 +++++++++++++++++++++++++ _pages/search-jekyll-simple.html | 10 ++++++++++ _pages/search-jekyll.html | 11 +++++++++++ _pages/search.html | 5 +++++ _pages/tag-archive.md | 6 ------ _pages/textarea.html | 20 ++++++++++++++++++++ _pages/year-archive.md | 6 ------ 20 files changed, 187 insertions(+), 26 deletions(-) create mode 100644 _pages/about.html delete mode 100644 _pages/about.md create mode 100644 _pages/all-posts.html create mode 100644 _pages/archive-categories.html create mode 100644 _pages/archive-eso.html create mode 100644 _pages/archive-langs.html create mode 100644 _pages/archive-libs.html create mode 100644 _pages/archive-projects.html create mode 100644 _pages/archive-tags.html create mode 100644 _pages/archive-tools.html create mode 100644 _pages/archive-years.html delete mode 100644 _pages/category-archive.md create mode 100644 _pages/privacy.html create mode 100644 _pages/read-books.html create mode 100644 _pages/search-jekyll-simple.html create mode 100644 _pages/search-jekyll.html create mode 100644 _pages/search.html delete mode 100644 _pages/tag-archive.md create mode 100644 _pages/textarea.html delete mode 100644 _pages/year-archive.md diff --git a/_pages/about.html b/_pages/about.html new file mode 100644 index 00000000..4d352096 --- /dev/null +++ b/_pages/about.html @@ -0,0 +1,26 @@ +--- +layout: page +title: O autorze +permalink: /about +description: O autorze +--- + +

+ Backend Developer. + Jestem szczęśliwym Backend Developer ponieważ istnieją Frontendowcy, którzy piszą za mnie front. + Programuję komercyjnie od 2012 roku, głownie w Javie i Scali. + Epizodycznie w językach Kotlin, Perl, PL/Perl, PL/pgSQL, Lua i Bash + oraz hobbistyczne w językach Haskell, Scala + i Scheme/Racket, + a kiedyś w - Perl i TCL. + O językach Rust i Clojure na razie tylko czytam, bo doba jest za krótka. +

+ +

+ Pracuję głównie przy aplikacjach webowych we frameworkach takich jak zbyt magiczny Spring (Spring MVC, Spring Boot), DropWizard oraz Akka-Http, + a chciałbym jeszcze poznać ZIO-WEB i http4s. +

+ +

+ Moim hobby jest programowanie czysto funkcyjne i pisanie parserów. +

diff --git a/_pages/about.md b/_pages/about.md deleted file mode 100644 index 9ba0655c..00000000 --- a/_pages/about.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -permalink: /about/ -title: "About" ---- - -Tempor velit sint sunt ipsum tempor enim ad qui ullamco. Est dolore anim ad velit duis dolore minim sunt aliquip amet commodo labore. Ut eu pariatur aute ea aute excepteur laborum. Esse ea esse excepteur minim mollit qui cillum excepteur ex dolore magna. Labore deserunt fugiat incididunt incididunt sint ea. Consequat dolore aute laboris quis proident quis non et est consectetur ex eiusmod sit culpa. - -Cupidatat ea do et in excepteur in. Ad nostrud ut est esse eu duis ea sunt eiusmod. Aliquip tempor veniam sint elit fugiat. Velit incididunt laboris amet incididunt labore dolore irure velit excepteur commodo deserunt laborum. Consectetur eu fugiat veniam veniam Lorem labore magna eiusmod. Ea occaecat reprehenderit pariatur consectetur minim labore ut aliquip. \ No newline at end of file diff --git a/_pages/all-posts.html b/_pages/all-posts.html new file mode 100644 index 00000000..cdf773cb --- /dev/null +++ b/_pages/all-posts.html @@ -0,0 +1,22 @@ +--- +layout: page +title: Wszystkie artykuły +permalink: /all-posts +description: Wszystkie artykuły po ilości słów +--- +
+ +
$('table').tablesort();
+ + + + + + {% for post in site.posts %} + + + + + {% endfor %} +
titlewords
{{ post.title }}{{post.content | strip_html | number_of_words}}
+
diff --git a/_pages/archive-categories.html b/_pages/archive-categories.html new file mode 100644 index 00000000..c127090e --- /dev/null +++ b/_pages/archive-categories.html @@ -0,0 +1,6 @@ +--- +title: "Artykuły po kategoriach" +layout: archive-categories +permalink: /categories +collections: categories +--- diff --git a/_pages/archive-eso.html b/_pages/archive-eso.html new file mode 100644 index 00000000..c2641671 --- /dev/null +++ b/_pages/archive-eso.html @@ -0,0 +1,6 @@ +--- +title: "Artykuły po eso" +layout: archive-eso +permalink: /eso +collections: eso +--- diff --git a/_pages/archive-langs.html b/_pages/archive-langs.html new file mode 100644 index 00000000..0c0cc720 --- /dev/null +++ b/_pages/archive-langs.html @@ -0,0 +1,6 @@ +--- +title: "Artykuły po językach programowania" +layout: archive-langs +permalink: /langs +collection: langs +--- diff --git a/_pages/archive-libs.html b/_pages/archive-libs.html new file mode 100644 index 00000000..5cb2ec2a --- /dev/null +++ b/_pages/archive-libs.html @@ -0,0 +1,6 @@ +--- +title: "Artykuły po bibliotekach programistycznych" +layout: archive-libs +permalink: /libs +collection: libs +--- diff --git a/_pages/archive-projects.html b/_pages/archive-projects.html new file mode 100644 index 00000000..4b9b5d41 --- /dev/null +++ b/_pages/archive-projects.html @@ -0,0 +1,6 @@ +--- +title: "Artykuły po projektach" +layout: archive-projects +permalink: /projects +collection: projects +--- diff --git a/_pages/archive-tags.html b/_pages/archive-tags.html new file mode 100644 index 00000000..4cd11124 --- /dev/null +++ b/_pages/archive-tags.html @@ -0,0 +1,6 @@ +--- +title: "Artykuły po tagach" +layout: archive-tags +permalink: /tags +collections: tags +--- diff --git a/_pages/archive-tools.html b/_pages/archive-tools.html new file mode 100644 index 00000000..9e5035e2 --- /dev/null +++ b/_pages/archive-tools.html @@ -0,0 +1,6 @@ +--- +title: "Artykuły po narzędziach programistycznych" +layout: archive-tools +permalink: /tools +collection: tools +--- diff --git a/_pages/archive-years.html b/_pages/archive-years.html new file mode 100644 index 00000000..e215bf70 --- /dev/null +++ b/_pages/archive-years.html @@ -0,0 +1,5 @@ +--- +title: "Artykuły po roku" +layout: posts +permalink: /posts +--- diff --git a/_pages/category-archive.md b/_pages/category-archive.md deleted file mode 100644 index 4cb3860e..00000000 --- a/_pages/category-archive.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "Posts by Category" -layout: categories -permalink: /categories/ -author_profile: true ---- diff --git a/_pages/privacy.html b/_pages/privacy.html new file mode 100644 index 00000000..1174bffe --- /dev/null +++ b/_pages/privacy.html @@ -0,0 +1,21 @@ +--- +layout : page +title : Polityka prywatności +description: Polityka prywatności plików cookies +permalink : /privacy +--- +
+

+ Blog, o języku programowania Scala, WriteOnly.pl przechowuje pliki cookies (tzw. ciasteczka) są używane przez: +

+
Google Analytics
+
do poprawego analizowania ruchu strony
+
Disqus
+
do obsługi komentarzy
+
WriteOnly.pl
+
po to żeby za każdym razem nie wyświetlać informacji o plikach cookies.
+
+

+ + Pokaż ostrzeżenie +
diff --git a/_pages/read-books.html b/_pages/read-books.html new file mode 100644 index 00000000..8c638017 --- /dev/null +++ b/_pages/read-books.html @@ -0,0 +1,25 @@ +--- +layout: page +title: Przeczytane książki +permalink: /books +description: Przeczytane książki programistyczne +--- +
+
+ {% assign books = site.books | reverse | sort: "year-of-publishment"| reverse %} + {% for book in books %} +
+ + {{ book.title }} + +
+
+
    +
  • Autorzy: {{ book.authors | join: ", "}}
  • +
  • Tytuł oryginalny: {{ book.title-of-original }}
  • +
  • Rok pierwszego wydania: {{ book.year-of-publishment }}
  • +
+
+ {% endfor %} +
+
diff --git a/_pages/search-jekyll-simple.html b/_pages/search-jekyll-simple.html new file mode 100644 index 00000000..410994c0 --- /dev/null +++ b/_pages/search-jekyll-simple.html @@ -0,0 +1,10 @@ +--- +layout: search +title: Wyszukiwarka Jekyll prosta +permalink: /search-jekyll-simple +description: Wyszukiwarka artykułów +power_supply_url: "https://github.com/christian-fei/Simple-Jekyll-Search" +power_supply_label: "Simple-Jekyll-Search" +--- + + diff --git a/_pages/search-jekyll.html b/_pages/search-jekyll.html new file mode 100644 index 00000000..7c4f2ce4 --- /dev/null +++ b/_pages/search-jekyll.html @@ -0,0 +1,11 @@ +--- +layout: search +title: Wyszukiwarka Jekyll +permalink: /search-jekyll +description: Wyszukiwarka artykułów +power_supply_url: "https://github.com/daviddarnes/jekyll-search-js" +power_supply_label: "jekyll-search-js" +--- + + + diff --git a/_pages/search.html b/_pages/search.html new file mode 100644 index 00000000..2cf2a317 --- /dev/null +++ b/_pages/search.html @@ -0,0 +1,5 @@ +--- +layout: search +title: Wyszukiwarka +permalink: /search +--- \ No newline at end of file diff --git a/_pages/tag-archive.md b/_pages/tag-archive.md deleted file mode 100644 index 3f4e3f0d..00000000 --- a/_pages/tag-archive.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "Posts by Tag" -permalink: /tags/ -layout: tags -author_profile: true ---- diff --git a/_pages/textarea.html b/_pages/textarea.html new file mode 100644 index 00000000..8a9ba0a7 --- /dev/null +++ b/_pages/textarea.html @@ -0,0 +1,20 @@ +--- +layout: page +title: The TextArea +permalink: /textarea +description: The Text Area +--- +
+ +
+ + diff --git a/_pages/year-archive.md b/_pages/year-archive.md deleted file mode 100644 index ce3413fc..00000000 --- a/_pages/year-archive.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "Posts by Year" -permalink: /posts/ -layout: posts -author_profile: true ---- From 7f8c56aa456d545d6b420c5ecabee15cf1028ef5 Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Sun, 10 May 2020 20:02:36 +0200 Subject: [PATCH 021/160] Add posts --- ...18-08-13-dlaczego-warto-prowadzic-bloga.md | 66 +++ ...08-22-jekyll-i-ciasteczka-pliki-cookies.md | 108 +++++ .../2018-08-30-alias-komenda-powloki-bash.md | 105 +++++ .../2018-09-05-docker-usuwanie-obrazow.md | 73 +++ .../2018-09-12-git-submoduly-i-aliasy.md | 124 +++++ .../2018-09-26-jekyllcodex-org-czesc-druga.md | 55 +++ .../_posts/2018-10-03-przenosna-scala.md | 149 ++++++ .../_posts/2018-10-10-git-flow-i-aliasy.md | 79 ++++ .../2018-10-17-dynamiczna-analiza-kodu.md | 183 ++++++++ .../2018-10-24-statyczna-analiza-kodu-1.md | 167 +++++++ .../2018-10-31-statyczna-analiza-kodu-2.md | 176 +++++++ .../2018-11-07-flagi-kompilatora-scalac.md | 156 +++++++ ...-11-14-bardziej-dynamiczna-analiza-kodu.md | 242 ++++++++++ .../_posts/2018-12-12-ciagla-intergracja.md | 275 +++++++++++ .../2019-01-09-biblioteki-do-logowania.md | 370 +++++++++++++++ .../_posts/2019-01-16-kategorie-i-tagi.md | 247 ++++++++++ .../2019-01-30-no-universal-equality.md | 180 +++++++ _collections/_posts/2019-02-13-setxkbmap.md | 74 +++ _collections/_posts/2019-02-27-scalapipe.md | 243 ++++++++++ .../2019-03-13-biblioteki-do-parserowania.md | 216 +++++++++ .../_posts/2019-03-27-arrow-asserts.md | 108 +++++ .../2019-04-10-jekyllcodex-org-head-seo.md | 105 +++++ .../_posts/2019-04-17-git-rebase-i.md | 183 ++++++++ .../_posts/2019-04-24-git-rebase-i-edit.md | 92 ++++ .../_posts/2019-05-01-github-pages.md | 160 +++++++ .../_posts/2019-05-08-gcc-llvm-clang.md | 334 +++++++++++++ _collections/_posts/2019-05-15-slogging.md | 251 ++++++++++ ...019-05-22-czy-nadaje-sie-na-programiste.md | 210 +++++++++ _collections/_posts/2019-05-29-logback.md | 148 ++++++ ...ers-programownnie-funkcyjne-dla-kazdego.md | 103 ++++ .../_posts/2019-06-12-jezyk-skryptowy.md | 165 +++++++ .../_posts/2019-06-19-jezyk-korporacyjny.md | 164 +++++++ .../_posts/2019-07-03-jezyk-fullstackowy.md | 312 +++++++++++++ .../_posts/2019-07-10-jezyk-natywny.md | 248 ++++++++++ .../2019-07-24-paradygmaty-programowania.md | 250 ++++++++++ .../_posts/2019-08-07-jezyk-wszystkomajacy.md | 183 ++++++++ .../_posts/2019-09-25-no-exceptions.md | 441 ++++++++++++++++++ .../2019-10-30-no-exceptions-std-lib.md | 261 +++++++++++ ...2019-11-27-no-exceptions-thridparty-lib.md | 255 ++++++++++ .../2019-12-25-no-exceptions-io-monad.md | 317 +++++++++++++ .../_posts/2020-01-29-git-filter-branch.md | 116 +++++ _collections/_posts/2020-02-26-preload-css.md | 98 ++++ .../_posts/2020-03-11-interface-collection.md | 155 ++++++ .../_posts/2020-04-01-sojowe-latte.md | 81 ++++ .../_posts/2020-04-15-serialization.md | 255 ++++++++++ _collections/_posts/2020-04-29-monads.md | 363 ++++++++++++++ .../2020-05-13-polymorphism-as-we-know-it.md | 230 +++++++++ ...-05-20-polymorphism-that-we-do-not-know.md | 289 ++++++++++++ _collections/_posts/2020-05-27-type-class.md | 374 +++++++++++++++ _collections/_posts/2020-06-17-state-monad.md | 253 ++++++++++ .../_posts/2020-07-01-optparse-applicative.md | 221 +++++++++ _collections/_posts/2020-08-05-attoparsec.md | 206 ++++++++ .../_posts/2020-08-19-attoparsec-eas.md | 255 ++++++++++ .../_posts/2020-09-02-pipe-operators.md | 205 ++++++++ .../2020-10-07-functor-monad-applicative.md | 249 ++++++++++ _collections/_posts/2020-11-04-lazy-disqus.md | 183 ++++++++ .../2020-12-02-5-programming-languages.md | 261 +++++++++++ 57 files changed, 11372 insertions(+) create mode 100644 _collections/_posts/2018-08-13-dlaczego-warto-prowadzic-bloga.md create mode 100644 _collections/_posts/2018-08-22-jekyll-i-ciasteczka-pliki-cookies.md create mode 100644 _collections/_posts/2018-08-30-alias-komenda-powloki-bash.md create mode 100644 _collections/_posts/2018-09-05-docker-usuwanie-obrazow.md create mode 100644 _collections/_posts/2018-09-12-git-submoduly-i-aliasy.md create mode 100644 _collections/_posts/2018-09-26-jekyllcodex-org-czesc-druga.md create mode 100644 _collections/_posts/2018-10-03-przenosna-scala.md create mode 100644 _collections/_posts/2018-10-10-git-flow-i-aliasy.md create mode 100644 _collections/_posts/2018-10-17-dynamiczna-analiza-kodu.md create mode 100644 _collections/_posts/2018-10-24-statyczna-analiza-kodu-1.md create mode 100644 _collections/_posts/2018-10-31-statyczna-analiza-kodu-2.md create mode 100644 _collections/_posts/2018-11-07-flagi-kompilatora-scalac.md create mode 100644 _collections/_posts/2018-11-14-bardziej-dynamiczna-analiza-kodu.md create mode 100644 _collections/_posts/2018-12-12-ciagla-intergracja.md create mode 100644 _collections/_posts/2019-01-09-biblioteki-do-logowania.md create mode 100644 _collections/_posts/2019-01-16-kategorie-i-tagi.md create mode 100644 _collections/_posts/2019-01-30-no-universal-equality.md create mode 100644 _collections/_posts/2019-02-13-setxkbmap.md create mode 100644 _collections/_posts/2019-02-27-scalapipe.md create mode 100644 _collections/_posts/2019-03-13-biblioteki-do-parserowania.md create mode 100644 _collections/_posts/2019-03-27-arrow-asserts.md create mode 100644 _collections/_posts/2019-04-10-jekyllcodex-org-head-seo.md create mode 100644 _collections/_posts/2019-04-17-git-rebase-i.md create mode 100644 _collections/_posts/2019-04-24-git-rebase-i-edit.md create mode 100644 _collections/_posts/2019-05-01-github-pages.md create mode 100644 _collections/_posts/2019-05-08-gcc-llvm-clang.md create mode 100644 _collections/_posts/2019-05-15-slogging.md create mode 100644 _collections/_posts/2019-05-22-czy-nadaje-sie-na-programiste.md create mode 100644 _collections/_posts/2019-05-29-logback.md create mode 100644 _collections/_posts/2019-06-05-fun-miners-programownnie-funkcyjne-dla-kazdego.md create mode 100644 _collections/_posts/2019-06-12-jezyk-skryptowy.md create mode 100644 _collections/_posts/2019-06-19-jezyk-korporacyjny.md create mode 100644 _collections/_posts/2019-07-03-jezyk-fullstackowy.md create mode 100644 _collections/_posts/2019-07-10-jezyk-natywny.md create mode 100644 _collections/_posts/2019-07-24-paradygmaty-programowania.md create mode 100644 _collections/_posts/2019-08-07-jezyk-wszystkomajacy.md create mode 100644 _collections/_posts/2019-09-25-no-exceptions.md create mode 100644 _collections/_posts/2019-10-30-no-exceptions-std-lib.md create mode 100644 _collections/_posts/2019-11-27-no-exceptions-thridparty-lib.md create mode 100644 _collections/_posts/2019-12-25-no-exceptions-io-monad.md create mode 100644 _collections/_posts/2020-01-29-git-filter-branch.md create mode 100644 _collections/_posts/2020-02-26-preload-css.md create mode 100644 _collections/_posts/2020-03-11-interface-collection.md create mode 100644 _collections/_posts/2020-04-01-sojowe-latte.md create mode 100644 _collections/_posts/2020-04-15-serialization.md create mode 100644 _collections/_posts/2020-04-29-monads.md create mode 100644 _collections/_posts/2020-05-13-polymorphism-as-we-know-it.md create mode 100644 _collections/_posts/2020-05-20-polymorphism-that-we-do-not-know.md create mode 100644 _collections/_posts/2020-05-27-type-class.md create mode 100644 _collections/_posts/2020-06-17-state-monad.md create mode 100644 _collections/_posts/2020-07-01-optparse-applicative.md create mode 100644 _collections/_posts/2020-08-05-attoparsec.md create mode 100644 _collections/_posts/2020-08-19-attoparsec-eas.md create mode 100644 _collections/_posts/2020-09-02-pipe-operators.md create mode 100644 _collections/_posts/2020-10-07-functor-monad-applicative.md create mode 100644 _collections/_posts/2020-11-04-lazy-disqus.md create mode 100644 _collections/_posts/2020-12-02-5-programming-languages.md diff --git a/_collections/_posts/2018-08-13-dlaczego-warto-prowadzic-bloga.md b/_collections/_posts/2018-08-13-dlaczego-warto-prowadzic-bloga.md new file mode 100644 index 00000000..635837ba --- /dev/null +++ b/_collections/_posts/2018-08-13-dlaczego-warto-prowadzic-bloga.md @@ -0,0 +1,66 @@ +--- +title: "Dlaczego warto prowadzić bloga o programowaniu" +author: TheKamilAdam +category: thoughts +tags: blog +langs: scala java +tools: github +libs: +redirect_from: + - dlaczego-warto-prowadzic-bloga + - thoughts/dlaczego-warto-prowadzic-bloga + - thoughts/2018/08/13/dlaczego-warto-prowadzic-bloga.html +--- + +Ja znalazłem cztery powody, dlaczego warto prowadzić bloga o programowaniu. +Natrafiałem na nie właśnie w tej kolejności. + +## Notatki dla siebie +Nie wiem jak inni programiści, +ale ja mam dobrą pamięć do rzeczy złożonych, +jak np. składnia języka **[Scala]**, +i słabą pamięć do rzeczy prostych, jak np. “z jakimi parametrami należy budować projekt w języku Scala, żeby otrzymać żądany efekt”. +Rezultat tego był taki, że wielokrotnie przeszukiwałem internet w poszukiwaniu tych samych rzeczy. +Pierwszą próbą rozwiązania mojego problemu był pomysł zapisywania wiedzy w pliku na dysku. +Niestety po formacie dysku ta wiedza się traciła. +Kolejnym krokiem było trzymanie wiedzy w chmurze np. w Dokumentach Googlowych. + +## Pomoc dla innych +Nie tylko ja mam słabą pamięć. +Poza tym do pracy przychodzą też nowi lub ludzie z innych zespołów, którzy chcą się czegoś dowiedzieć. +Głupio mi było odpowiedzieć, że czegoś nie pamiętam, gdy wiedzą że robię to od roku.q +Wycinanie fragmentów Dokumentów Googlowych i wysyłanie ich przez komunikator nie było najbardziej eleganckim rozwiązaniem. +Więc założyłem repozytorium na **[GitHubie]** i odsyłałem linki jako odpowiedzi na pytania. +Było to rozwiązanie lepsze, ale nie zadowalało mnie w pełni, +ponieważ w ten sposób mogłem pomóc tylko osobom, które mnie bezpośrednio poprosiły o pomoc. + +## Dokumentowanie swojego postępu prac + +Repozytoria na GitHubie, bez dodatkowej dokumentacji szybko mogą przerodzić się w chaos. +Tak było zarówno w przypadku mojego repozytorium zawierającego wiedzę, jak i moich projektów Scalowych. +Blog będący Dziennikiem Postępów Prac pozwala temu przeciwdziałać i zaprezentować innym zastosowane rozwiązania. + +## Dostanie wymarzonej pracy +Jest to ostatni powód, który odkryłem. Jest to także powód, który ostatecznie zmotywował mnie do założenia tego bloga. + +Jestem programistą **[Javy]**, a chcę być programistą **[Scali]**. +Fascynuję się tym językiem programowania odkąd o nim usłyszałem, czyli dłużej niż pracuję w Javie. +Niestety na Górnym Śląsku, gdzie mieszkam, jest mało pracy dla programistów Scali. +Można pracować zdalnie, ale jest ciężko przekonać firmy programistyczne, +że umie się Scalę, gdy pisało się w niej komercyjnie tylko pół roku. + +Mimo że hobbistycznie piszę w niej od pięciu lat. + +## Podsumowanie +Mój plan jest taki, +żeby umieszczać tu posty głównie związane z postępem prac nad moimi projektami opensoursowymi pisanymi dla wprawy. +Dokumentować tutaj każdą większą zmianę wraz z uzasadnieniem. + +Mam nadzieję, że będzie to jasne i łatwe do zrozumienia zarówno dla mnie, gdy po roku wrócę do swojego kodu, +jak i dla wszystkich innych, którzy chcieliby się nauczyć języka **[Scala]**. + +[Javy]: /langs/java +[Scala]: /langs/scala +[Scali]: /langs/scala + +[GitHubie]: /tools/github diff --git a/_collections/_posts/2018-08-22-jekyll-i-ciasteczka-pliki-cookies.md b/_collections/_posts/2018-08-22-jekyll-i-ciasteczka-pliki-cookies.md new file mode 100644 index 00000000..dc1de94b --- /dev/null +++ b/_collections/_posts/2018-08-22-jekyll-i-ciasteczka-pliki-cookies.md @@ -0,0 +1,108 @@ +--- +title: "Jekyll i ciasteczka (pliki cookies)" +author: TheKamilAdam +category: jekyll +tags: blog github-pages html jekyllcodex script +langs: javascript +tools: disqus jekyll +libs: jquery +redirect_from: + - jekyll-i-ciasteczka-pliki-cookies + - jekyll/jekyll-i-ciasteczka-pliki-cookies + - writeonlydoc/jekyll-i-ciasteczka-pliki-cookies + - writeonlydoc/2018/08/22/jekyll-i-ciasteczka-pliki-cookies.html +--- + +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 (). + +Pierwszy wieczór spędziłem na nieudanej instalacji Jekylla i próbie uruchomienia przykładowego bloga opartego na motywie graficznym BlackDocs +(). +Wieczór zakończyłem w momencie przeczytania porady na StackOverflow “usuń Rubiego i zainstaluj wszystko ponownie”. +Wtedy stwierdziłem, że może jednak Gutek ma rację i Jekyll bywa problematyczny. + +Jednak nie poddałem się i po paru wieczorach miałem pusty blog z możliwością komentowania postów i skryptem raportującym statystyki +(funkcjonalność dodana według ) +oraz nie do końca skonfigurowaną wyszukiwarką (). +W tym momencie uznałem, że dalsze usprawnianie bloga, który nie zawiera żadnej treści, nie ma żadnego sensu. +W związku z czym odłożyłem na czas późniejszy dodawanie tagów i kategorii “bez użycia pluginu” +( i ). +A nuż w międzyczasie plugin dla kategorii znajdzie się na liście pluginów wspieranych przez **[GitHub Pages]** +(Aktualna lista wspieranych pluginów ). + +Po opublikowaniu pierwszego posta czułem jednak, że dalej czegoś brakuje. Wciśnięcie F12 i spojrzenie w kod strony było przerażające. +Ujrzałem spaghetti w postaci naprzemiennie występujących fragmentów HTML, CSS i JS. +Ale najgorsze było, gdy spojrzałem na zakładkę “Storage”. +Okazało się, że moja prosta strona internetowa zapisuje, o zgrozo, ciasteczka. +O ile ciasteczko dla systemu komentarzy Disqus można jeszcze obronić, że jest technicznie potrzebne do działania funkcjonalności, +o tyle ciasteczko dla Google Analytics jest już jawnym śledzeniem użytkownika! + +Poszukiwanie rozwiązania mojego problemu doprowadziło mnie do strony , +a dokładniej do sekcji “Without plugins” (). +Znalazłem tam skrypt wyświetlający banner informujący o plikach Cookies. Po moich przeróbkach wygląda on tak: + +```html + + + + +``` + +Czuję, że na stronie spędzę więcej czasu z czego wynikają dwie smutne informacje: +* później zacznę pisać o języku **[Scala]** +* istnieje niebezpieczeństwo, że nauczę się jQuery + +[Scala]: /langs/scala + +[Jekyll]: /tools/jekyll + +[GitHub Pages]: /tags/github-pages diff --git a/_collections/_posts/2018-08-30-alias-komenda-powloki-bash.md b/_collections/_posts/2018-08-30-alias-komenda-powloki-bash.md new file mode 100644 index 00000000..0831ac76 --- /dev/null +++ b/_collections/_posts/2018-08-30-alias-komenda-powloki-bash.md @@ -0,0 +1,105 @@ +--- +title: "Alias - polecenie powłoki Bash" +author: TheKamilAdam +category: cli +tags: alias cli +tools: bash git +redirect_from: + - alias-komenda-powloki-bash + - cli/alias-komenda-powloki-bash + - cli/2018/08/30/alias-komenda-powloki-bash.html +--- + +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 + +istnieje rozwiązanie twoich problemów! Jest to polecenie powłoki Bash o nazwie `alias`. + +Polecenie `alias` można wywołać bez żadnego parametru: +```bash +alias +``` + +wyświetli wtedy listę wszystkich zdefiniowanych aliasów dostępnych w danym terminalu. + +## Tworzenie aliasów + +Żeby utworzyć nowy alias należy wywołać: +```bash +alias NAME=VALUE +``` + +gdzie: +* `NAME` oznacza nazwę nowego "polecenia" do wywoływania w wierszu poleceń +* `VALUE` jest poleceniem, lub ciągiem poleceń, które zostanie wywołana naprawdę. +Jeśli chcemy, żeby `VALUE` zawierało spację należy wszystko umieścić w parze apostrofów (') lub cudzysłowów (") + +Przykłady użycia: +```bash +alias rf='fm -rf' +alias ..='cd ..' +alias cwd='cd `pwd`' +``` +Od teraz : +* polecenie `rf <ścieżka_do_folderu>` będzie usuwać foldery, +* polecenie `..` przechodzić do folderu wyżej w drzewie hierarchii folderów, +* polecenie `cwd` będzie odświeżać aktywny folder. + +## Tworzenie permanentnych aliasów +Problem z aliasami jest tylko jeden. Działają tylko w ramach terminala w którym zostały zdefiniowane. +Można to rozwiązać w prosty sposób poprzez stworzenie wszystkich aliasów w pliku, np. pod nazwą `~/.bash_aliases`, +a następnie wczytywania go za pomocą polecenia `source`. +Teraz po otwarciu nowego terminala wystarczy wywołać: +```bash +source ~/.bash_aliases +``` + +by cieszyć się swoimi aliasami w każdym terminalu. + +## Automatyczne wczytywanie aliasów +Można to jednak jeszcze bardziej uprościć. +Przy starcie każdego nowego terminala jest wczytywany plik `~/.bashrc`. +Wystarczy na końcu tego pliku dodać: +```bash +source ~/.bash_aliases +``` +lub bezpieczniej: +```bash +if [ -f ~/.bash_aliases ]; then + . ~/.bash_aliases +fi +``` +Dodatkowy `if` uchroni nas przed błędem, gdy plik `~/.bash_aliases` nie istnieje. +Kropka na początku drugiej linii jest aliasem na `source`. + +Dodatkowo do pliku `~/.bash_aliases` warto dodać aliasy: +```bash +alias vish='vim ~/.bashrc' +alias srcsh='source ~/.bashrc' +``` + +## Niezniszczalne aliasy +Używanie aliasów nie jest niczym nowym. +Możliwe, że w waszej dystrybucji będzie już istnieć plik `~/.bash_aliases` czekający na uzupełnienie +lub nawet będzie już wczytywany w pliku `~/.bashrc`. +Także cała powyższa procedura jest opisana na wielu stronach i blogach. + +Mój główny problem z aliasami polegał na tym, +że gdy już miałem uzbierany pokaźny zestaw aliasów ułatwiających mi życie padł mi dysk w służbowym laptopie. +Komputer poszedł do działu IT, wymienili mi dysk, ale ja straciłem wszystkie aliasy. + +Stwierdziłem wtedy "Moja wina, bo wszystko, co tylko można, należy trzymać w chmurze". +Więc założyłem repozytorium na githubie [cli](https://github.com/writeonly/cli), +gdzie w pliku [bash_aliases](https://github.com/writeonly/cli/blob/master/bash_aliases) ponownie zbieram potrzebne mi aliasy. +Dodatkowo zrobiłem mały skrypt instalujący, tak by jedną linią +```bash +wget https://raw.githubusercontent.com/writeonly/cli/master/bash_aliases_install.sh | bash +``` +móc odzyskać wszystko to, do czego przywykłem. + +A polecenie: +```bash +update_aliases +``` +można zaktualizować aliasy. \ No newline at end of file diff --git a/_collections/_posts/2018-09-05-docker-usuwanie-obrazow.md b/_collections/_posts/2018-09-05-docker-usuwanie-obrazow.md new file mode 100644 index 00000000..8c424f94 --- /dev/null +++ b/_collections/_posts/2018-09-05-docker-usuwanie-obrazow.md @@ -0,0 +1,73 @@ +--- +title: "Docker - usuwanie obrazów" +author: TheKamilAdam +category: cli +tags: alias cli +tools: bash docker +redirect_from: + - docker-usuwanie-obrazow + - cli/docker-usuwanie-obrazow + - cli/2018/09/05/docker-usuwanie-obrazow.html +--- + +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. + +## Procedura usuwania kontenerów i obrazów Dockerowych +Szczęśliwie procedura usuwania obrazów Dockerowcyh nie jest czynnością skomplikowaną i składa się z trzech kroków. +Na początek włączamy terminal i teraz kolejno wykonujemy kroki: + +Krok 1. Zatrzymujemy wszystkie kontenery: +```bash +docker kill $(docker ps -q) +``` + +Krok 2. Usuwamy wszystkie kontenery: +```bash +docker rm $(docker ps -a -q) +``` + +Krok 3. Usuwamy wszystkie obrazy: +```bash +docker rmi $(docker images -q) +``` + +## Procedura usuwania obrazów Dockerowych jednym poleceniem +Można także wykonać wszystko razem jako jedno, połączone polecenie w terminalu: + +```bash +docker kill $(docker ps -q); docker rm $(docker ps -a -q); docker rmi $(docker images -q) +``` + +Lepiej jest jednak dodać wpis do pliku `~/.bash_aliases` : +```bash +alias docker_rmi_all='docker kill $(docker ps -q); docker rm $(docker ps -a -q); docker rmi $(docker images -q)' +``` + +I wtedy wystarczy z wywołać w terminalu: +```bash +docker_rmi_all +``` + +## Procedura usuwania kontenerów Dockerowych jednym poleceniem +Czasem jednak chcielibyśmy usunąć tylko kontenery, a obrazy pozostawić. +Czyli wykonać: +```bash +docker kill $(docker ps -q); docker rm $(docker ps -a -q) +``` + +Na taki wypadek warto przygotować skrócony alias który także warto zapisać w pliku `~/.bash_aliases` : +```bash +alias docker_rm_all='docker kill $(docker ps -q); docker rm $(docker ps -a -q)' +``` + +I wtedy wystarczy z wywołać w terminalu: +```bash +docker_rm_all +``` diff --git a/_collections/_posts/2018-09-12-git-submoduly-i-aliasy.md b/_collections/_posts/2018-09-12-git-submoduly-i-aliasy.md new file mode 100644 index 00000000..3c2fdf96 --- /dev/null +++ b/_collections/_posts/2018-09-12-git-submoduly-i-aliasy.md @@ -0,0 +1,124 @@ +--- +title: "Git - submoduły i aliasy" +author: TheKamilAdam +category: cli +tags: cli alias interpreter +labels: submodule +langs: java javascript +tools: git +redirect_from: + - git-submoduly-i-aliasy + - cli/git-submoduly-i-aliasy + - cli/2018/09/12/git-submoduly-i-aliasy.html +--- + +*Post oparty na prawdziwych wydarzeniach i traumach* + +## Submoduły + +Zrobili to! +Mimo że protestowałem. +Do projektu przy którym pracowałem dodali submoduły. + +- Jak mogli to zrobić - zadaje pytanie oburzony. +- Prosto - pada odpowiedź - za pomocą polecenia o składni: +```bash +git submodule add link-do-repozytorium opcjonalna-nazwa-folderu +``` +A w tym wypadku było to dokładnie: +```bash +git submodule add https://github.com/paulp/sbt-extras.git sbtx +``` +wykonane w folderze projektu. + +- Ale po co? - drążę dalej temat. +- Żeby współdzielić kod. +- Przecież do tego służą biblioteki! - moje oburzenie sięga zenitu. +- Ale nie zawsze jest to łatwe i możliwe: + 1. Biblioteki trzeba wydawać i trzymać je w menedżerze repozytoriów binarnych (ang. *Binary Repository Manager*), +a takiego menedżera trzeba gdzieś zainstalować. + 2. Menedżer repozytorium binarnych może kosztować, np. dla języka **[Java]** jest za darmo, a dla języka **[JavaScript]** już niekoniecznie. + 3. W językach skryptowych biblioteki są często instalowane do **[interpretera]** + co może utrudniać instalację programu klientowi +(przykład z pierwszej wersji [Git-Tools-Submodules]()). + 4. Nie wszystko da się umieścić w bibliotece, w tym wypadku jest to skrypt do budowania projektu. + +## Dodatkowe polecenia +Tak przekonany przestałem marudzić + i przejrzałem [Git-Tools-Submodules](), + [git-submodule]() + oraz [git-clone](). + Okazało się, że praca z submodułami nie jest taka straszna i sprowadza się głównie do dwóch poleceń: + +```bash +git clone --recurse-submodules +git submodule update --init --recursive +``` +Pierwsze polecenie ściąga repozytorium ze wszystkimi submodułami. +Drugie - aktualizuje submoduły po przełączeniu się na inną rewizję (ang. *commit*), gałąź lub po aktualizacji gałęzi. + +Niestety polecenia te wydłużają i tak długie już polecenia gita. + +## Aliasy Basha + +Szczęśliwie umiem rozwiązywać problem długich poleceń, +bo znam [aliasy basha](/alias-komenda-powloki-bash). + +Pierwsza wersja moich aliasów wyglądała następująco: +```bash +alias g='git' +alias gcl='git clone' +alias gclr='gcl --recurse-submodules' +alias gupdate='git submodule update --init --recursive' +alias gpr='git pull --rebase' +alias gpru='gpr && gupdate' +alias master='git checkout master && gupdate' +alias develop='git checkout develop && gupdate' +``` + +## Aliasy Gita + +Byłem bardzo zadowolony ze swoich aliasów, więc postanowiłem się nimi pochwalić koledze: +- To bez sensu - odpowiedział zdziwiony - +przecież git ma swój system [aliasów](). + +Po przeczytaniu [Git-Basics-Git-Aliases]() +i [git-config]() +mój zbiór aliasów zamienił się w zestaw poleceń gita do wykonania: + +```bash +git config --global alias.cl 'clone' +git config --global alias.clr 'cl --recurse-submodules' +git config --global alias.update 'submodule update --init --recursive' +git config --global alias.pr 'pull --rebase' +git config --global alias.pru '!git pr && git update' +git config --global alias.master '!git checkout master && git update' +git config --global alias.develop '!git checkout develop && git update' +git config --global alias.tig '!tig' +``` +Widać tutaj, że podkomenda `alias` ma dwie składnie: +```bash +git config --global alias.nowa_komenda_gita 'stara_komenda_gita_z_parametrami' +git config --global alias.nowa_komenda_gita '!dowolna_komenda_basha' +``` + +I od teraz: +* `git cl` - klonuje repozytorium; +* `git clr` - klonuje repozytorium razem z submodułami; +* `git update` - aktualizuje submoduły; +* `git pr` - pobiera zmiany ze zdalnego repozytorium; +* `git pru` - pobiera zmiany ze zdalnego repozytorium i aktualizuje submoduły; +* `git master` - przełącza na gałąź master i aktualizuje submoduły; +* `git develop` - przełącza na gałąź develop i aktualizuje submoduły; +* `git tig` - uruchamia program `tig` (o ile mamy go zainstalowany). + +Polecenia te zapisałem w pliku [git_config.sh]() +i można je wykonać poleceniem: +```bash +curl -s https://raw.githubusercontent.com/writeonly/cli/master/git_config.sh | bash +``` + +[Java]: /langs/java +[JavaScript]: /langs/javascript + +[interpretera]: /tags/interpreter diff --git a/_collections/_posts/2018-09-26-jekyllcodex-org-czesc-druga.md b/_collections/_posts/2018-09-26-jekyllcodex-org-czesc-druga.md new file mode 100644 index 00000000..9dcb051d --- /dev/null +++ b/_collections/_posts/2018-09-26-jekyllcodex-org-czesc-druga.md @@ -0,0 +1,55 @@ +--- +title: "jekyllcodex.org - część druga" +author: TheKamilAdam +category: jekyll +tags: blog jekyllcodex seo +tools: jekyll +redirect_from: + - jekyllcodex-org-czesc-druga + - jekyll/jekyllcodex-org-czesc-druga + - writeonlydoc/jekyllcodex-org-czesc-druga + - writeonlydoc/2018/09/26/jekyllcodex-org-czesc-druga.html +--- + +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. + +Dziś już na spokojnie postanowiłem przejrzeć to repozytorium skryptów. +Przeszukiwanie prowadziłem pod kątem możliwości rozszerzenia funkcjonalności mojego bloga. + +## Skrypty, które użyłem +Skrypty wykorzystane przeze mnie podzieliłem na trzy kategorie ze względu na miejsce dodania skryptu: + +### Skrypty ogólne +Są to skrypty, które w większości trafiły do układu strony `default.html`: + +- [ostrzeżenie o plikach cookies]() +- [seo]() +- [kanał rss]() +- [przyciski linkujące do kont na portalach społecznościowych]() +- [czat na żywo]() - jeszcze nie wiem po co, ale dodałem. + +### Skrypty dla postów +Są to skrypty, które trafiły do układu strony `post.html`: + +- [wskaźnik czasu czytania]() +- [przyciski udostępniania dla mediów społecznościowych]() + +### Skrypty dla stron +Jest to w zasadzie jeden skrypt, który trafił do układu strony `page.html`: + +- [okruszki chleba]() - dla bloga nie za bardzo nie ma sens, +wydaje się przydatny tylko dla stron o zagnieżdżonej hierarchii + +## Skrypty, których jeszcze nie użyłem +Niestety nie zdążyłem wypróbować wszystkich skryptów, które mnie ciekawią i które mogłyby być użyteczne na blogu. +Te które pozostały do przetestowania dzielą się na dwie kategorie: + +### Skrypty robiące jakąś magię z menu +- [proste menu]() +- [mobilne menu]() + +### Skrypty dodające wyszukiwarki +- wyszukiwarka oparta o [google]() +- wyszukiwarka oparta o [skrypt lunar]() diff --git a/_collections/_posts/2018-10-03-przenosna-scala.md b/_collections/_posts/2018-10-03-przenosna-scala.md new file mode 100644 index 00000000..588602ad --- /dev/null +++ b/_collections/_posts/2018-10-03-przenosna-scala.md @@ -0,0 +1,149 @@ +--- +title: "Przenośna Scala" +author: TheKamilAdam +category: scala-native +tags: compiler native nojvm transpiler +langs: crystal erlang haskell go javascript pony rust scala +tools: clang jvm llvm node-js sbt scala-jvm scala-js scala-native +libs: akka +redirect_from: + - przenosna-scala + - scala-native/przenosna-scala + - resentiment/przenosna-scala + - resentiment/2018/10/03/przenosna-scala.html +--- + +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]**. + +Przykłady kodu coś mi przypominają. +Wyglądają prawie jak w Scali tylko trochę mniej obiektowe, więc pytam: +- Dlaczego nie Scala? Jest to w tej chwili jedyny funkcyjny język programowania, który odniósł sukces komercyjny. +Nie licząc niszowego Erlanga - dodaję. +- Bo ja nie lubię **[JVM]** - odpowiada. - Za dużo musiałem robić w apletach. + +Po tej rozmowie zacząłem się zastanawiać czy istnieje możliwość używania Scali poza JVM. +Czy Scala jest językiem przenaszalnym na inne platformy? + +## Portable Scala - dwa razy tak i jeden raz nie + +### .Net Framework +Podobno największą konkurencją dla JVM jest .Net. + +Z kilka lat temu, jak o Scali zaczynano dopiero mówić, podobno ruszyły prace nad przeniesieniem Scali na .Net. +Podobno nawet M$ dofinansował ten projekt. + +Jednak do dziś nie ma języka Scala.NET ani S#. +Podobno różnice między JVM a .Net są zbyt duże, +żeby w sensowny sposób udało się przenieść statycznie typowany język programowania +z jednego środowiska uruchomieniowego na drugie. + +Podobno istniał jeden statycznie typowany język programowania, +który działał na obu platformach. +Jednak było to zalane taką ilością warstw abstrakcyjnych, +że czyniło go to bezużytecznym. + +### JavaScript +**[JavaScript]** jest platformą docelową dla każdego, +kto chce uruchamiać cokolwiek na stronie internetowej. +Dlatego jeśliby posiadać **[transpilator]** Scali do JavaScriptu +to w łatwy sposób można by z każdego programisty Scali stworzyć legendarnego Full-Stack Developera. +Szczęśliwie taki **[transpilator]** istnieje i nazywa się **[Scala.js]**. +Istnieje nawet [Akka.js], framework aktorów. + +Niestety **[Scala.js]** i Akka.js posiadają wszystkie wady **[Node.js]** to znaczy jednowątkowość, +ale do front-endu wydają się idealne. + +### Native +Największą zaletą języków +**[Rust]**, **[Pony]**, **[Crystal]** czy **[Go]**, +jest to, +że są to języki kompilowane do postaci natywnej, +a programy w nich pisane mogą być dostarczane do klienta pod postacią jednego pliku. + +To samo ze Scalą robi **[kompilator]** **[Scala Native]** oparty na **[LLVM]**. +Niestety dalej jest w wersji eksperymentalnej i nie posiada np. wielowątkowości. +Co czyni go na razie tylko zabawką dla nerdów i np. ... DevOpsów oraz QA. +Bo o ile jednowątkowy program na produkcji zwykle nie ma sensu, +to ScalaNative może zastąpić inne języki używane do wdrażania aplikacji i testowania. +Zwłaszcza, że zwykle i tak są to języki jednowątkowe. + +## Portable Scala - wszystkie części mocy + +W łatwy sposób można stworzyć projekt, który będzie kompilowany na wszystkie trzy platformy, +to znaczy JS, JVM i Native. + +Na początek instalujemy [zależności] dla **[Scala Native]**: + +```bash +sudo apt install clang libunwind-dev +sudo apt install libgc-dev libre2-dev +``` + +Następnie pobieramy przykładową [aplikację skośną] z portable-scala: +```bash +sbt new portable-scala/sbt-crossproject.g8 +``` + +Kompilujemy: +```bash +sbt clean compile test +``` + +I uruchamiamy: +```bash +sbt barJS/run barJVM/run barNative/run +``` + +## Mój Resentiment + +Stworzyłem projekt na portalu [GitHub], +gdzie będę starał się rozwijać aplikację kompilowaną na wszystkie trzy platformy. +Na razie pod tagiem [portable-scala] +znajduje się wersja z podniesionymi zależnościami i ze zmienioną konfiguracją projektu. + +Pobranie projektu: +``` +git clone https://github.com/writeonly/resentiment.git +``` + +Kompilacja: +```bash +sbt clean compile test +``` + +I uruchomienie: +```bash +sbt re/run reJS/run reJVM/run +``` + +[Crystal]: /langs/crystal +[Erlang]: /langs/erlang +[Go]: /langs/go +[Haskell]: /langs/haskell +[JavaScript]: /langs/javascript +[Pony]: /langs/pony +[Rust]: /langs/rust +[Scala]: /langs/scala + +[C]: /tools/clang +[JVM]: /tools/jvm +[LLVM]: /tools/llvm +[Node.js]: /tools/node-js +[Scala Native]: /tools/scala-native +[Scala.js]: /tools/scala-js + +[Akka.js]: /libs/akka-js + +[Transpilator]: /tags/transpiler +[Kompilator]: /tags/compiler + +[zależności]: http://www.scala-native.org/en/v0.3.8/user/setup.html#installing-clang-and-runtime-dependencies +[aplikację skośną]: https://github.com/portable-scala/sbt-crossproject.g8 + +[GitHub]: https://github.com/writeonly/resentiment +[portable-scala]: https://github.com/writeonly/resentiment/tree/portable-scala diff --git a/_collections/_posts/2018-10-10-git-flow-i-aliasy.md b/_collections/_posts/2018-10-10-git-flow-i-aliasy.md new file mode 100644 index 00000000..0c818f5a --- /dev/null +++ b/_collections/_posts/2018-10-10-git-flow-i-aliasy.md @@ -0,0 +1,79 @@ +--- +title: "Git-flow i aliasy" +author: TheKamilAdam +category: cli +tags: alias cli +labels: flow +tools: git +redirect_from: + - git-flow-i-aliasy + - cli/git-flow-i-aliasy + - cli/2018/10/10/git-flow-i-aliasy.html +--- + +Gitflow jest wspaniałą koncepcją pracy z gałęziami w repozytorium Git. +Strategia ta jest świetnie opisana na +[A successful Git branching model](). + +Jednak początkowo może wydawać się zbyt skomplikowana. +Straszy zwłaszcza ilością poleceń, które trzeba wykonać, żeby scalić gałąź z nową funkcjonalnością: +```bash +$ git checkout develop +$ git merge --no-ff myfeature +$ git branch -d myfeature +$ git push origin develop +``` + +Ilość poleceń, parametrów i przełączników może powodować niekończące się problemy i dyskusje + "czy na pewno potrzebujemy czegoś tak skomplikowanego?". + +Na szczęście istnieje 'git-flow'. + +## Narzędzie git-flow + +> git-flow jest zbiorem rozszerzeń gita dostarczającym wysokopoziomowe operacje na repozytorium, + wspierającym strategię rozgałęziania opracowaną przez Vincenta Driessena. +Za [ściągawka do git-flow]() + +Tutaj już nie mogą toczyć się dyskusje czy powinniśmy scalać z przełącznikiem `--no-ff` czy bez niego. +Możemy wziąć całe narzędzie ustandaryzowane i przetestowane przez społeczność i nie kroimy niczego własnego. + +Zalety tego są oczywiste: +* programista, tester i/lub wdrożeniowiec, +który raz nauczył się pracować z Gitflow ma jedną rzecz mniej do nauki przy przenoszeniu się do innego zespołu, +gdzie będą stosować dokładnie ten sam Gitflow bez żadnych lokalnych modyfikacji +* zamiast wpisywania długich wielolinijkowców w konsoli możemy używać pojedynczych poleceń. + +## Moje aliasy + +Jednak nawet te polecenia są dla mnie za długie. +Dlatego przygotowałem [plik]() z [aliasami Basha](/git-submoduly-i-aliasy) + +```bash +# git flow +git config --global alias.fi 'flow init' +# git flow feature +git config --global alias.ffstart 'flow feature start' +git config --global alias.fffinish 'flow feature finish ' +git config --global alias.ffpublish 'flow feature publish' +git config --global alias.ffpull 'flow feature pull origin' +git config --global alias.fftrack 'git flow feature track' +# git flow release +git config --global alias.frstart 'flow release start' +git config --global alias.frpusblish 'flow release publish' +git config --global alias.frfinish 'flow release finish' +# git flow hotfix +git config --global alias.fhstart 'flow hotfix start' +git config --global alias.fhfinish 'flow hotfix finish' +``` + +Można go zastosować poleceniem +```bash +curl -s https://raw.githubusercontent.com/writeonly/cli/master/git_config.sh | bash +``` + +i cieszyć się krótkimi poleceniami jak: +```bash +git ffstart myfeature +git fffinish myfeature +``` diff --git a/_collections/_posts/2018-10-17-dynamiczna-analiza-kodu.md b/_collections/_posts/2018-10-17-dynamiczna-analiza-kodu.md new file mode 100644 index 00000000..ea45d0ba --- /dev/null +++ b/_collections/_posts/2018-10-17-dynamiczna-analiza-kodu.md @@ -0,0 +1,183 @@ +--- +title: "Dynamiczna analiza kodu dla SBT - testy jednostkowe" +author: TheKamilAdam +category: scala-native +tags: code-analysis dynamic-code-analysis +labels: minitest greenlight +langs: scala +tools: scala-jvm scala-js scala-native +libs: specs2 scalatest utest +redirect_from: + - dynamiczna-analiza-kodu + - scala-native/dynamiczna-analiza-kodu + - resentiment/dynamiczna-analiza-kodu + - resentiment/2018/10/17/dynamiczna-analiza-kodu.html +--- + +> 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. + +Za [wikipedią](). + +W tym poście skupię się tylko na frameworkach do testów, testach jednostkowych i mierzeniu pokrycia kodu testami. + +## Frameworki dla testów + +* [ScalaTest]() - +jest to chyba najbardziej znany i rozbudowany framework dla testów do języka Scala. +Wspiera Scala.js w wersji 0.6.x. Ostatnia wersja snapshot wspiera Scala Native. +Posiada osiem różnych [stylów pisania testów](), +jednak autorzy zachęcają do wybrania dwóch dla projektu. +Jeden styl dla testów jednostkowo-integracyjnych, drugi - dla akceptacyjnych. +Najciekawsze style to: + * `FunSuite` i `FlatSpec` - są to proste, płaskie style pisania testów podobne do JUnit. + Jeśli jednak są dla kogoś zbyt awangardowe jest możliwość pisania testów w Scali z użyciem [JUnit i assercji z ScalaTest]() + * `FunSpec`, `FreeSpec` i `WordSpec` - są to style testów umożliwiające pisanie zagnieżdżonych testów, + jednak zagnieżdżenia nie są wymagane (za wyjątkiem stylu `FunSpec`, gdzie trzeba użyć przynajmniej jeden poziom `Describe`) + * `FeatureSpec` - jest to zaawansowany styl dla pisania testów akceptacyjnych. +* [specs2]() - +jest to drugi najbardziej znany framework do pisania testów dla języka Scala. +Od wersji czwartej wspiera Scala.js w wersji 0.6.x. +Ma dwa style pisania testów: + * `org.specs2.mutable.Specificatio` - najbardziej przypomina `FreeSpec` i jest przewidziany do pisania testów jednostkowych i integracyjnych. + * `org.specs2.Specification` - styl testów przewidziany do pisania testów akceptacyjnych, +* [uTest]() - +czarny koń tego zestawienia. +Wspiera Scala.js w wersji 0.6.x i 1.0.x oraz Scala Native. +Autor frameworka skromnie chwali się, że wspiera wszystkie wersje języka Scala. +Ma jeden styl pisania testów który wygląda jak `FreeTest`. +* [MiniTest]() - +stworzony przez [Monix]() do testowania swojej biblioteki. +Wspiera Scala.js w wersji 0.6.x. +Ma jeden styl pisania testów, który wygląda jak `FunSuite`. +* [Greenlight]() - +projekt niestety umarł. +Wspiera Scala.js w wersji 0.6.x. +Ma jeden styl pisania testów, który wygląda jak `FlatSpec` + +## Test jednostkowy w uTest + +W `build.sbt` dodajemy `uTest` do zależności projektu: +```scala + libraryDependencies += "com.lihaoyi" %%% "utest" % "0.6.5" % "test" +``` + +i ustawiamy jako framework testowy: +```scala + testFrameworks += new TestFramework("utest.runner.Framework"), +``` + +Tworzymy klasę `Calculator`, którą będziemy testować : +```scala +package pl.writeonly.re.shared + +class Calculator { + type T = Int + + def add(a: T, b: T): T = a * b + + def mul(a: T, b: T): T = a + b + + def leq(a: T, b: T): Boolean = a < b + +} +``` + +Oraz testy dla niej: + +```scala +package pl.writeonly.re.shared + +import utest._ + +object CalculatorTest extends TestSuite { + override val tests: Tests = Tests { + val calculator = new Calculator() + 'addition - { + val addition: (Int, Int) => Int = (x, y) => calculator.add(x, y) + "0 + 0 == 0" - { + assert(addition(0, 0) == 0) + } + "2 + 2 == 4" - { + assert(addition(2, 2) == 4) + } + } + 'multiplication - { + val multiplication: (Int, Int) => Int = (x, y) => calculator.mul(x, y) + "0 + 0 == 0" - { + assert(multiplication(0, 0) == 0) + } + "2 + 2 == 4" - { + assert(multiplication(2, 2) == 4) + } + } + 'less_or_equal - { + val less_or_equal: (Int, Int) => Boolean = (x, y) => calculator.leq(x, y) + "0 <= 2 == true" - { + assert(less_or_equal(0, 2)) + } + "2 <= 0 == false" - { + assert(!less_or_equal(2, 0)) + } + } + } +} +``` + +Wszystko kompilujemy i uruchamiamy testy za pomocą polecenia: +```bash +sbt clean compile test +``` + +Testy przeszły, jesteśmy szczęśliwi: +```log +[info] -------------------------------- Running Tests -------------------------------- +[info] + pl.writeonly.re.shared.CalculatorTest.addition.0 + 0 == 0 0ms +[info] + pl.writeonly.re.shared.CalculatorTest.addition.2 + 2 == 4 0ms +[info] + pl.writeonly.re.shared.CalculatorTest.multiplication.0 + 0 == 0 0ms +[info] + pl.writeonly.re.shared.CalculatorTest.multiplication.2 + 2 == 4 0ms +[info] + pl.writeonly.re.shared.CalculatorTest.less_or_equal.0 <= 2 == true 0ms +[info] + pl.writeonly.re.shared.CalculatorTest.less_or_equal.2 <= 0 == false 0ms +[info] Tests: 6, Passed: 6, Failed: 0 +``` + +## Testowanie testów - mierzenie pokrycia kodu testami +Skąd mamy mieć pewność, że przetestowaliśmy klasę `Calculator` w wystarczający sposób? +Możemy to częściowo sprawdzić mierząc pokrycie kodu produkcyjnego (tj. klasy `Calculator`) testami. + +Jeśli chodzi o narzędzia do mierzenia pokrycia kodu testami to tutaj król jest jeden +i jest nim [scoverage](). +Posiada on wtyczki do: +* [sbt]() +* [maven]() +* [gradle]() +* [scalac]() +* [sonarqube]() + +Przy czym użyjemy tutaj tylko pierwszej z nich. + +Dodajemy `sbt-scoverage` do `build.sbt`: +```scala +addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.5.1") +``` +I wykonujemy: +```bash +sbt clean coverage test && sbt coverageReport +``` +gdzie: +* `coverage` - wykonuje kompilacje z instrumentacją kodu +* `coverageReport` - generuje raport + +Niestety powyższe polecenie działa tylko dla implementacji Scala/JVM i Scala.js. +Scala Native nie wspiera instrumentacji kodu. +Dlatego projekt [resentiment](https://github.com/writeonly/resentiment) trzeba kompilować za pomocą polecenia: +```bash +sbt clean compile re/test coverage reJVM/test reJS/test && sbt coverageReport +``` + +Teraz możemy otworzyć pliki `/re/js/target/scala-2.11/scoverage-report/index.html` +oraz `/re/jvm/target/scala-2.11/scoverage-report/index.html` +i zobaczyć, że klasa `Calculator` ma 100% pokrycia kodu testami. +Lider nietechniczny i Product Owner powinni być z nas zadowoleni. diff --git a/_collections/_posts/2018-10-24-statyczna-analiza-kodu-1.md b/_collections/_posts/2018-10-24-statyczna-analiza-kodu-1.md new file mode 100644 index 00000000..bf1a928f --- /dev/null +++ b/_collections/_posts/2018-10-24-statyczna-analiza-kodu-1.md @@ -0,0 +1,167 @@ +--- +title: "Statyczna analiza kodu dla języka Scala w SBT - część 1." +author: TheKamilAdam +category: scala-native +tags: code-analysis static-code-analysis +labels: scalafmt scalariform +langs: scala +tools: sbt scalafix +redirect_from: + - statyczna-analiza-kodu-1 + - scala-native/statyczna-analiza-kodu-1 + - resentiment/statyczna-analiza-kodu-1 + - resentiment/2018/10/24/statyczna-analiza-kodu-1.html +--- + +> 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. + +> Termin ten jest zwykle stosowany do analizy wykonywanej przez zautomatyzowane narzędzie, +analiza wykonywana przez człowieka jest nazywana przeglądem kodu. + +Za [wikipedią](). + +Jest to moja ulubiona część konfigurowania projektu, +ponieważ odpowiednio dobrany zestaw wtyczek do statycznej analizy kodu +potrafi znacząco skrócić czas potrzebny do zrobienia przeglądu kodu. + +## Wtyczki modyfikujące kod źródłowy + +Z powodu ogromu różnego rodzaju wtyczek do statycznej analizy kodu dla języka Scala +w tym poście skupię się tylko na wtyczkach modyfikujących kod źródłowy. + +### sbt-scalariform - sbt plugin adding support for source code formatting using Scalariform +[sbt-scalariform]() +to wtyczka sbt dodająca obsługę formatowania kodu źródłowego przy użyciu formatera kodu Scalariform + +Dodajemy `scalariform` do pliku `projektu/plugins.sbt`: +```scala +addSbtPlugin("org.scalariform" % "sbt-scalariform" % "1.8.2") +``` + +Konfiguracja jest możliwa za pomocą: +* zmiennej `scalariformPreferences` w pliku `build.sbt` +* pliku `.scalariform.conf` + +Formatowanie kodu jest wykonywane automatycznie podczas kompilacji: + +```bash +sbt compile test:compile it:compile +``` + +### Scalafmt - Code formatter for Scala +[Scalafmt]() to formater kodu dla języka Scala. + +Dodajemy `scalafmt` do pliku `projektu/plugins.sbt`: +```scala +addSbtPlugin("com.geirsson" % "sbt-scalafmt" % "1.5.1") +``` + +Konfiguracja jest możliwa za pomocą pliku `.scalafmt.conf`, np.: +```hocon +style=IntelliJ +maxColumn=80 +``` + +Formatowanie domyślnie nie wykonuje się podczas kompilacji. +Aby sformatować kod należy wykonać: +```bash +sbt scalafmtSbt scalafmt test:scalafmt it:scalafmt +``` +Kolejno formatowany jest plik `build.sbt`, kod produkcyjny, testy jednostkowe i testy integracyjne. + +Możliwe jest także tylko sprawdzenie czy kod jest sformatowany poprawnie za pomocą polecenia: +```bash +sbt scalafmtSbtCheck scalafmtCheck test:scalafmtCheck it:scalafmtCheck +``` + +### Scalafix - Refactoring and linting tool for Scala +[Scalafix]() to narzędzie do analizy statycznej kodu w języku Scala. +Jest to jedyne narzędzie, które potrafi znalezione błędy poprawić. + +Dodajemy `scalafix` do pliku `projektu/plugins.sbt`: +```scala +addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.9.0") +``` + +W pliku `build.sbt` dodajemy następujące linie: +```scala + addCompilerPlugin(scalafixSemanticdb) + scalacOptions ++= Seq( + //"-Xfatal-warnings", // it should be disabled for scalafix + "-Ywarn-adapted-args", // for NoAutoTupling + "-Ywarn-unused", // for RemoveUnused + ) +``` + +Konfiguracja jest możliwa za pomocą pliku `.scalafix.conf`. +Poniższa konfiguracja włącza wszystkie istniejące obecnie reguły: +```hocon +rules = [ + +// Semantic Rules - Reguły semantyczne + NoAutoTupling + RemoveUnused + +// Syntactic Rules - Reguły składniowe + DisableSyntax + LeakingImplicitClassVal + NoValInForComprehension + ProcedureSyntax +] + +DisableSyntax.noVars = true +DisableSyntax.noThrows = true +DisableSyntax.noNulls = true +DisableSyntax.noReturns = true +DisableSyntax.noAsInstanceOf = true +DisableSyntax.noIsInstanceOf = true +DisableSyntax.noXml = true +DisableSyntax.noDefaultArgs = true +DisableSyntax.noFinalVal = true +DisableSyntax.noFinalize = true +DisableSyntax.noValPatterns = true +DisableSyntax.noUniversalEquality = true +DisableSyntax.noUniversalEqualityMessage = "== is unsafe since it allows comparing two unrelated types" +DisableSyntax.regex = [] +``` + +Aby naprawić kod należy wykonać: +```bash +sbt scalafix test:scalafix it:scalafix +``` +Kolejno naprawiany jest kod produkcyjny, testy jednostkowe i testy integracyjne. + +Możliwe jest także tylko sprawdzenie czy kod nie zawiera błędów za pomocą polecenia: +```bash +sbt 'scalafix --check' 'test:scalafix --check' 'it:scalafix --check' +``` + +## Podsumowanie + +Wszystkie wymienione wyżej wtyczki dodałem do projektu +[resentiment](). + +Na chwilę obecna moje polecenie do zbudowania tego projektu to: +```bash +sbt clean compile test:compile it:compile re/test && \ +sbt coverage reJVM/test reJS/test && \ +sbt coverageReport +``` + +Wcześniej jednak powinienem wywołać polecenie refaktoryzującą i formatującą kod: +```bash +sbt scalafix test:scalafix it:scalafix && \ +sbt scalafmtSbt scalafmt test:scalafmt it:scalafmt +``` + +Ewentualnie, gdy robię przegląd kodu mogę sprawdzić czy kod jest poprawny za pomocą polecenia: +```bash +sbt 'scalafix --check' 'test:scalafix --check' 'it:scalafix --check' && \ +sbt scalafmtSbtCheck scalafmtCheck test:scalafmtCheck it:scalafmtCheck +``` + +Niestety ponieważ w testach używam porównania `==` +musiałem zakomentować linię `DisableSyntax.noUniversalEquality` w pliku `.scalafix.conf`. +Problem ten rozwiąże w następnym poście. diff --git a/_collections/_posts/2018-10-31-statyczna-analiza-kodu-2.md b/_collections/_posts/2018-10-31-statyczna-analiza-kodu-2.md new file mode 100644 index 00000000..c0a521c6 --- /dev/null +++ b/_collections/_posts/2018-10-31-statyczna-analiza-kodu-2.md @@ -0,0 +1,176 @@ +--- +title: "Statyczna analiza kodu dla języka Scala w SBT - część 2." +author: TheKamilAdam +category: scala-native +tags: code-analysis static-code-analysis +labels: scalastyle wartremover scapegoat linter scala-clippy sbt-cpd sbt-stats +langs: scala +tools: sbt scala-jvm scala-js scala-native +redirect_from: + - statyczna-analiza-kodu-2 + - scala-native/statyczna-analiza-kodu-2.html + - resentiment/statyczna-analiza-kodu-2.html + - resentiment/2018/10/31/statyczna-analiza-kodu-2.html +--- + +Jest to kontynuacja posta +[Statyczna analiza kodu dla języka Scala w SBT - część 1](/statyczna-analiza-kodu-1.html). + +## Wtyczki nie modyfikujące kodu źródłowego. + +Jest to o wiele większy zestaw wtyczek niż poprzednio. + +### Scalastyle - Scala style checker + +[Scalastyle]() + +Dodajemy `Scalastyle` do pliku `project/plugins.sbt`: +```scala +addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "1.0.0") +``` + +Generujemy domyślny plik konfiguracyjny `scalastyle-config.xml` zawierający reguły: +```bash +sbt scalastyleGenerateConfig +``` + +Wchodzimy do pliku `scalastyle-config.xml` i zmieniamy poziomy z `warning` na `error`. + +Następnie wyłączamy sprawdzanie nagłówka: +```xml + +``` +A na końcu poprawiamy formatowanie dwuliniowej instrukcji `if`: +```xml + + + + + + +``` + +Teraz analizujemy kod i testy za pomocą polecenia: +```bash +sbt scalastyle test:scalastyle it:scalastyle +``` + +Pełna lista reguł jest dostępna pod linkiem +[rules-1.0.0](). + +Dla mnie najważniejszą funkcjonalnością jest liczenie [złożoności cyklomatycznej](): +```xml + + + + + +``` + +### WartRemover: a flexible scala linter +[WartRemover]() +jest to wtyczka do usuwania brodawek z kodu. +Przez brodawkę autor rozumie brzydkie rzeczy, które można napisać w języku Scala, +bo składnia języka jest zbyt liberalna. +Nazwa wtyczki jest trochę na wyrost, +ponieważ w tej chwili `WartRemover` pozwala tylko odnaleźć brodawki, +a usunąć musimy je sami. + +Dodajemy `wartremover` do pliku `project/plugins.sbt`: +```scala +addSbtPlugin("org.wartremover" % "sbt-wartremover" % "2.3.7") +``` + +W pliku `build.sbt` włączamy `wartremover`: +```scala +wartremoverErrors ++= Warts.unsafe +``` + +Od teraz przy każdej kompilacji będą poszukiwane brodawki. +Pełna lista [brodawkek]() + +### Scapegoat - Scala compiler plugin for static code analysis +[Scapegoat]() to linter dla języka Scala. + +Dodajemy `scapegoat` do pliku `project/plugins.sbt`: +```scala +addSbtPlugin("com.sksamuel.scapegoat" %% "sbt-scapegoat" % "1.3.8") +``` + +Ustawiamy wersję `scapegoat` w `build.sbt`: +```scala +scapegoatVersion := "1.1.0" +``` + +Analizujemy kod za pomocą polecenia: +```bash +sbt scapegoat +``` + +### Linter - Static Analysis Compiler Plugin for Scala +[Linter]() +to niestety nie rozwijany już linter. + +Dodajemy `Linter` do pliku `project/plugins.sbt`: +```scala +addCompilerPlugin("org.psywerx.hairyfotr" %% "linter" % "0.1.17") +``` + +Linter uruchamia się automatycznie podczas kompilacji. + +### Scala clippy - Good advice for Scala compiler errors +[Scala clippy]() +to wtyczka dodająca porady jak poprawić błędy kompilacji. + +Dodajemy `clippy` do pliku `project/plugins.sbt`: +```scala +addSbtPlugin("com.softwaremill.clippy" % "plugin-sbt" % "0.5.3") +``` + +### sbt-cpd - Copy & Paste Detector plugin using PMD for sbt. +[sbt-cpd]() +to wtyczka do wykrywania duplikatów kodu za pomocą Copy/Paste Detector (CPD) z projektu PMD. + +Dodajemy `sbt-cpd` do pliku `project/plugins.sbt`: +```scala +addSbtPlugin("com.github.sbt" % "sbt-cpd" % "2.0.0") +``` + +I analizujemy kod za pomocą polecenia: +```bash +sbt cpd +``` + +### stats - An sbt plugin for source code statistics + +[sbt-stats]() +to wtyczka licząca ilość plików, linii i znaków w projekcie. + +Dodajemy `stats` do pliku `project/plugins.sbt`: +```scala +addSbtPlugin("com.orrsella" % "sbt-stats" % "1.0.7") +``` + +Analizujemy kod za pomocą polecenia: +```bash +sbt stats +``` + +## Podsumowanie + +Wszystkie wymienione wyżej wtyczki dodałem do projektu +[resentiment]() + +Moje polecenie generowania raportów wygląda następująco: +```bash +sbt scalastyle test:scalastyle it:scalastyle && \ +sbt scapegoat && \ +sbt cpd && \ +sbt stats +``` + +Niestety, +ponieważ używam metody `println` w klasie `Core`, +muszę obniżyć poziom raportowania błędów +dla reguły `org.scalastyle.file.RegexChecker` w `ScalaStyle` +z `error` na `warning`. \ No newline at end of file diff --git a/_collections/_posts/2018-11-07-flagi-kompilatora-scalac.md b/_collections/_posts/2018-11-07-flagi-kompilatora-scalac.md new file mode 100644 index 00000000..2f7aa2e0 --- /dev/null +++ b/_collections/_posts/2018-11-07-flagi-kompilatora-scalac.md @@ -0,0 +1,156 @@ +--- +title: "Flagi kompilatora Scalac" +author: TheKamilAdam +category: scala-native +tags: compiler +labels: scalafix scalac +langs: perl scala +tools: sbt scalafix +redirect_from: + - flagi-kompilatora-scalac + - scala-native/flagi-kompilatora-scalac + - resentiment/flagi-kompilatora-scalac + - resentiment/2018/11/07/flagi-kompilatora-scalac.html +--- + +Nie bójmy się tego powiedzieć, Scala to nowy **[Perl](/langs/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". + +Jednak z biegiem czasu twórcy języka Scala uznali, +że niektóre sposoby są lepsze od innych i powinna istnieć możliwość wyłączenia gorszych sposobów. +Dodatkowo niektóre funkcjonalności języka są tak inne od tego co do tej pory widzieli programiści języków obiektowych, +że nie powinny być domyślnie włączone. +Oba te warunki, i pewnie jeszcze kilka innych, powodują, że Scalac, **[kompilator](/tags/compiler)** języka Scala, +posiada [flagi kompilacji](). +Dokładniej Scalac posiada ogromną ilość flag kompilacji. + +## Rekomendowana lista flag kompilatora + +Na szczęście istnieją tacy ludzie jak [tpolecat](), +który na swoim blogu zebrał listę [rekomendowanych flag kompilatora](https://tpolecat.github.io/2017/04/25/scalac-flags.html) +Są to: +```scala +scalacOptions ++= Seq( + "-deprecation", // Emit warning and location for usages of deprecated APIs. + "-encoding", "utf-8", // Specify character encoding used by source files. + "-explaintypes", // Explain type errors in more detail. + "-feature", // Emit warning and location for usages of features that should be imported explicitly. + "-language:existentials", // Existential types (besides wildcard types) can be written and inferred + "-language:experimental.macros", // Allow macro definition (besides implementation and application) + "-language:higherKinds", // Allow higher-kinded types + "-language:implicitConversions", // Allow definition of implicit functions called views + "-unchecked", // Enable additional warnings where generated code depends on assumptions. + "-Xcheckinit", // Wrap field accessors to throw an exception on uninitialized access. + "-Xfatal-warnings", // Fail the compilation if there are any warnings. + "-Xfuture", // Turn on future language features. + "-Xlint:adapted-args", // Warn if an argument list is modified to match the receiver. + "-Xlint:by-name-right-associative", // By-name parameter of right associative operator. + "-Xlint:constant", // Evaluation of a constant arithmetic expression results in an error. + "-Xlint:delayedinit-select", // Selecting member of DelayedInit. + "-Xlint:doc-detached", // A Scaladoc comment appears to be detached from its element. + "-Xlint:inaccessible", // Warn about inaccessible types in method signatures. + "-Xlint:infer-any", // Warn when a type argument is inferred to be `Any`. + "-Xlint:missing-interpolator", // A string literal appears to be missing an interpolator id. + "-Xlint:nullary-override", // Warn when non-nullary `def f()' overrides nullary `def f'. + "-Xlint:nullary-unit", // Warn when nullary methods return Unit. + "-Xlint:option-implicit", // Option.apply used implicit view. + "-Xlint:package-object-classes", // Class or object defined in package object. + "-Xlint:poly-implicit-overload", // Parameterized overloaded implicit methods are not visible as view bounds. + "-Xlint:private-shadow", // A private field (or class parameter) shadows a superclass field. + "-Xlint:stars-align", // Pattern sequence wildcard must align with sequence component. + "-Xlint:type-parameter-shadow", // A local type parameter shadows a type already in scope. + "-Xlint:unsound-match", // Pattern match may not be typesafe. + "-Yno-adapted-args", // Do not adapt an argument list (either by inserting () or creating a tuple) to match the receiver. + "-Ypartial-unification", // Enable partial unification in type constructor inference + "-Ywarn-dead-code", // Warn when dead code is identified. + "-Ywarn-extra-implicit", // Warn when more than one implicit parameter section is defined. + "-Ywarn-inaccessible", // Warn about inaccessible types in method signatures. + "-Ywarn-infer-any", // Warn when a type argument is inferred to be `Any`. + "-Ywarn-nullary-override", // Warn when non-nullary `def f()' overrides nullary `def f'. + "-Ywarn-nullary-unit", // Warn when nullary methods return Unit. + "-Ywarn-numeric-widen", // Warn when numerics are widened. + "-Ywarn-unused:implicits", // Warn if an implicit parameter is unused. + "-Ywarn-unused:imports", // Warn if an import selector is not referenced. + "-Ywarn-unused:locals", // Warn if a local definition is unused. + "-Ywarn-unused:params", // Warn if a value parameter is unused. + "-Ywarn-unused:patvars", // Warn if a variable bound in a pattern is unused. + "-Ywarn-unused:privates", // Warn if a private member is unused. + "-Ywarn-value-discard" // Warn when non-Unit expression results are unused. +) +``` + +Lista jest długa i działa dla języka Scala w wersji 2.12. +Jeśli używasz języka Scala w wersji wcześniejszej to część flag będziesz musiał wyłączyć. +Dla wersji 2.11 jest to: +```scala +scalacOptions --= Seq( + "-Xlint:constant", + "-Ywarn-extra-implicit", + "-Ywarn-unused:implicits", + "-Ywarn-unused:imports", + "-Ywarn-unused:locals", + "-Ywarn-unused:params", + "-Ywarn-unused:patvars", + "-Ywarn-unused:privates", +) +``` + +## .. i wtyczka do nich + +Lista opcji jest długa i może zaciemniać plik `build.sbt`. +Na szczęście [DavidGregory084](https://github.com/DavidGregory084) +stworzył wtyczkę [sbt-tpolecat](https://github.com/DavidGregory084/sbt-tpolecat) +dodającą flagi kompilatora do projektu. + +W pliku ` project/plugins.sbt` dodajemy: +```scala +addSbtPlugin("io.github.davidgregory084" % "sbt-tpolecat" % "0.1.4") +``` +i wtyczka automatycznie ustawia odpowiednie flagi dla wersji 2.10/2.11/2.12/2.13 + +## Portable Scala & Multi-project + +Jeśli kompilujesz projekt w Scali na różne platformy (JVM/JS/Native) +lub posiadasz [multi-project](), +tak jak ja w projekcie [resentiment](https://github.com/writeonly/resentiment), +to musisz ręcznie dodać flagi dla kompilatora. +Flagi generuje metoda `scalacOptionsFor`, która jako parametr pobiera wersję języka Scala. +Flagi dodajemy do każdego projektu z osobna lub do wydzielonych ustawień jak w moim przypadku: + +```scala +val SharedSettings = Seq( + scalaVersion := "2.11.12", + scalacOptions ++= scalacOptionsFor(scalaVersion.value), + // ... +) +``` + +### ScalaFix i modyfikacja domyślnych flag + +Właśnie ustawiliśmy ponad 30 różnych flag, +ale pewnie w niektórych wypadkach chciałbyś zmodyfikować tę listę. +Np. żeby móc używać wtyczki [ScalaFix](/statyczna-analiza-kodu-1.html). + +Wtyczka ta wymaga dodania dwóch flag (`-Ywarn-adapted-args`, `-Ywarn-unused"`) oraz usunięcia jednej (`-Xfatal-warnings`). +Dla wygody, flagi przypisuję do zmiennych, a następnie dodaje do `scalacOptions`. +```scala +val ScalaFixScalacOptions = Seq( + "-Ywarn-adapted-args", // for NoAutoTupling + "-Ywarn-unused", // for RemoveUnused +) + +val ScalaFixScalacOptionsOff = Seq( + "-Xfatal-warnings", // it should be disabled for scalafix +) + +val SharedSettings = Seq( + scalaVersion := "2.11.12", + scalacOptions ++= scalacOptionsFor(scalaVersion.value), + scalacOptions ++= ScalaFixScalacOptions, + scalacOptions --= ScalaFixScalacOptionsOff, + // ... +) +``` + +W identyczny sposób można włączać i wyłączać każdą inną flagę kompilatora Scalac. diff --git a/_collections/_posts/2018-11-14-bardziej-dynamiczna-analiza-kodu.md b/_collections/_posts/2018-11-14-bardziej-dynamiczna-analiza-kodu.md new file mode 100644 index 00000000..31e0ae64 --- /dev/null +++ b/_collections/_posts/2018-11-14-bardziej-dynamiczna-analiza-kodu.md @@ -0,0 +1,242 @@ +--- +title: "Bardziej dynamiczna analiza kodu dla języka Scala - Property-based testing" +author: TheKamilAdam +category: scala-native +tags: code-analysis dynamic-code-analysis +labels: property-based scalacheck scalaprops nyaya +langs: scala haskell +tools: scala-js scala-native +libs: scalatest scalaz specs2 +redirect_from: + - bardziej-dynamiczna-analiza-kodu + - scala-native/bardziej-dynamiczna-analiza-kodu + - resentiment/bardziej-dynamiczna-analiza-kodu + - resentiment/2018/11/14/bardziej-dynamiczna-analiza-kodu.html +--- + +Testy modułowe (jednostkowe) napisane w poście +[Dynamiczna analiza kodu](/dynamiczna-analiza-kodu.html) +dla projektu [resentiment]() +zawiodły. +Mimo posiadania 100% pokrycia kodu dla klasy Calculator klasa ta nie działała w sposób poprawy. + +To dlatego, że skupiłem się na drugiej linii definicji +> Korzystanie z metryk testów, takich jak pokrycie kodu, zapewnia, +że przetestowano odpowiednią ilość możliwych zachować programu + +Zapominając jednocześnie o trzeciej: +> 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. + +Problem można rozwiązać za pomocą *property-based testing* + +## Property-based testing (Testowanie oparte na właściwościach) + +Przy pisaniu normalnych testów, czyli modułowych (jednostkowych), integracyjnych i systemowych, +wyznaczamy przypadki brzegowe i klasy równoważności. +Chcemy by danych testowych było jak najmniej, tak by testy wykonywały się jak najszybciej. + +W przypadku *property-based testing* jest inaczej. +Tutaj zamiast wyznaczać konkretne dane wejściowe definiujemy tylko ogólne ograniczenia jakie mają spełniać dane. +Na podstawie ograniczeń generowane są dane wejściowe dla testów. +Dużo danych wejściowych. +Dlatego testy te są wolne, chociaż testują pojedyncze moduły i jednostki. + +## Biblioteki dla property-based testing w języku Scala + +* [ScalaCheck]() - +pierwsza i najbardziej popularna biblioteka *property-based testing*. +Wspiera Scala.js w wersji 0.6 i 1.0.0. +Inspirowana biblioteką [QuickCheck]() dla języka **[Haskell]**. +Jeden z projektów [typelevel](). +Posiada integracje z [ScalaTest]() +i [Specs2](). +* [scalaprops]() - +druga najbardziej popularna biblioteka *property-based testing*. +Wspiera **[Scala.js]** w wersji 0.6 i **[Scala Native]** w wersji 0.3. +Posiada integrację z biblioteką **[Scalaz]**. +* [Nyaya]() - +projekt niestety umarł. +Wspierał Scala.js w wersji 0.6. + +## Testowanie oparte na właściwościach za pomocą ScalaProps +Ponieważ chcę utrzymać możliwość kompilacji krzyżowej (cross compilation), +wybieram bibliotekę `scalaprops` dla testów. + +Dodajemy wtyczkę `sbt-scalaprops` do pliku `project/plugins.sbt`: +``` +addSbtPlugin("com.github.scalaprops" % "sbt-scalaprops" % "0.2.6") +``` + +Dodajemy wymagane zależności do `libraryDependencies`: +```scala + libraryDependencies ++= Seq( + "com.github.scalaprops" %%% "scalaprops" % ScalaPropsVersion % "test,it", + "com.github.scalaprops" %%% "scalaprops-scalazlaws" % ScalaPropsVersion % "test,it", + ), +``` + +Ponieważ testy jednostkowe powinny być szybkie, +konfigurujemy `scalaprops` jako testy integracyjne. + +Na początku musimy dodać do cross-projektu ustawienia dla `scalaprops` za pomocą linii: +```scala +lazy val re = crossProject(JSPlatform, JVMPlatform, NativePlatform) + // ... + .settings(scalapropsCoreSettings) +``` + +Następnie musimy wskazać folder, który będzie zawierać testy integracyjne: +```scala +lazy val re = crossProject(JSPlatform, JVMPlatform, NativePlatform) + // ... + .settings( + unmanagedSourceDirectories in IntegrationTest ++= CrossType.Full.sharedSrcDir(baseDirectory.value, "it").toSeq + ) +``` + +Niestety Scala Native nie wspiera obecnie testów integracyjnych. +Może kiedyś będzie wspierać, +może jak będę miał czas sam ogarnę makra i napiszę stosownego pull-requesta. +Do tego czasu będzie mi o tym przypominać zakomentowana linia: +```scala +lazy val re = crossProject(JSPlatform, JVMPlatform, NativePlatform) + // ... + //.nativeSettings(scalapropsNativeSettings) +``` + +Ostatecznie konfiguracja projektu wygląda następująco: +```scala +lazy val re = crossProject(JSPlatform, JVMPlatform, NativePlatform) + .withoutSuffixFor(NativePlatform) + .crossType(CrossType.Full) + .settings(SharedSettings) + .jsSettings(jsSettings) + .jvmSettings(jvmSettings) + .nativeSettings(nativeSettings) + // IntegrationTest + .configs(IntegrationTest) + .settings(Defaults.itSettings) + .settings( + inConfig(IntegrationTest)(scalafixConfigSettings(IntegrationTest)), + inConfig(IntegrationTest)(ScalafmtPlugin.scalafmtConfigSettings), + inConfig(IntegrationTest)(scalariformItSettings), + unmanagedSourceDirectories in IntegrationTest ++= CrossType.Full.sharedSrcDir(baseDirectory.value, "it").toSeq + ) + .jsSettings(inConfig(IntegrationTest)(ScalaJSPlugin.testConfigSettings)) + .nativeSettings(inConfig(IntegrationTest)(Defaults.testSettings)) + // PropsTest + .settings(scalapropsCoreSettings) + //.nativeSettings(scalapropsNativeSettings) +``` + +W folderze `re/shared/src/it/scala/` tworzymy testy dla klasy `pl.writeonly.re.shared.Calculator`: +```scala +package pl.writeonly.re.shared + +import scalaprops.{ Property, Scalaprops } + +object CalculatorIT extends Scalaprops { + val calculator = new Calculator() + + val addition: (Int, Int) => Int = (x, y) => calculator.add(x, y) + val additionTest = Property.forAll { (a: Int, b: Int) => + addition(a, b) == a + b + } + + val multiplication: (Int, Int) => Int = (x, y) => calculator.mul(x, y) + val multiplicationTest = Property.forAll { (a: Int, b: Int) => + multiplication(a, b) == a * b + } + + val lessOrEqual: (Int, Int) => Boolean = (x, y) => calculator.leq(x, y) + val lessOrEqualTest = Property.forAll { (a: Int, b: Int) => + lessOrEqual(a, b) == (a <= b) + } +} +``` + +Wywołujemy: +```bash +sbt clean coverage reJS/it:test reJVM/it:test +``` + +I naszym oczom powinien ukazać się piękny komunikat: +```bash +pl.writeonly.re.shared.CalculatorIT$ ++- additionTest Falsified(0,0,[Arg(0, 18591416),Arg(0, 241819340)],LongSeed(1542137236582000128)) 4ms ++- lessOrEqualTest ................................................. Passed(50,0,LongSeed(1542137236604999936)) 11ms +`- multiplicationTest Falsified(0,0,[Arg(0, -795557759),Arg(0, -1)],LongSeed(1542137236617999872)) 0ms +[error] falsified CalculatorIT additionTest Falsified(0,0,[Arg(0, 18591416),Arg(0, 241819340)],LongSeed(1542137236582000128)) +[error] falsified CalculatorIT multiplicationTest Falsified(0,0,[Arg(0, -795557759),Arg(0, -1)],LongSeed(1542137236617999872)) +[info] pl.writeonly.re.shared.CalculatorIT$ 39 ms +11 pl.writeonly.re.shared.CalculatorIT$.lessOrEqualTest 50 50 +4 pl.writeonly.re.shared.CalculatorIT$.additionTest 50 50 +0 pl.writeonly.re.shared.CalculatorIT$.multiplicationTest 50 50 +[info] 11 pl.writeonly.re.shared.CalculatorIT$.lessOrEqualTest 50 50 +[info] 4 pl.writeonly.re.shared.CalculatorIT$.additionTest 50 50 +[info] 0 pl.writeonly.re.shared.CalculatorIT$.multiplicationTest 50 50 +[error] Failed tests: +[error] pl.writeonly.re.shared.CalculatorIT +[error] (reJS / IntegrationTest / test) sbt.TestsFailedException: Tests unsuccessful +``` +Testy nie przeszły, mamy błąd w kodzie. W związku z tym poprawiamy klasę `Calculator`: +```scala +package pl.writeonly.re.shared + +class Calculator { + type T = Int + + def add(a: T, b: T): T = a + b + + def mul(a: T, b: T): T = a * b + + def leq(a: T, b: T): Boolean = a < b + +} +``` + +I ponownie wywołujemy: +```bash +sbt clean coverage reJS/it:test reJVM/it:test +``` + +Teraz dostajemy poprawną odpowiedź: +```bash +pl.writeonly.re.shared.CalculatorIT$ ++- additionTest ................................................. Passed(50,0,LongSeed(1542137486777999872)) 12ms ++- lessOrEqualTest ................................................. Passed(50,0,LongSeed(1542137486793999872)) 5ms +`- multiplicationTest ................................................. Passed(50,0,LongSeed(1542137486800999936)) 5ms +[info] pl.writeonly.re.shared.CalculatorIT$ 31 ms +12 pl.writeonly.re.shared.CalculatorIT$.additionTest 50 50 +5 pl.writeonly.re.shared.CalculatorIT$.lessOrEqualTest 50 50 +5 pl.writeonly.re.shared.CalculatorIT$.multiplicationTest 50 50 +[info] 12 pl.writeonly.re.shared.CalculatorIT$.additionTest 50 50 +[info] 5 pl.writeonly.re.shared.CalculatorIT$.lessOrEqualTest 50 50 +[info] 5 pl.writeonly.re.shared.CalculatorIT$.multiplicationTest 50 50 +``` + +Ostatecznie moje pełne polecenie do kompilacji to: +```bash +sbt scalafix test:scalafix it:scalafix && \ +sbt scalafmtSbt scalafmt test:scalafmt it:scalafmt && \ +sbt clean compile test:compile it:compile re/test && \ +sbt coverage reJS/test reJVM/test reJS/it:test reJVM/it:test && \ +sbt coverageReport && \ +sbt scalastyle test:scalastyle it:scalastyle && \ +sbt scapegoat cpd stats +``` + +## Smutne podsumowania +Klasyczne testy modułowe (jednostkowe) nie wystarczają, +ponieważ poprawnie napisane testy modułowe, +które pokrywają 100% kodu aplikacji, +mogą być niepoprawne, jeśli dane wejściowe są źle dobrane. + +[Haskell]: /langs/haskell + +[Scalaz]: /libs/scalaz + +[Scala Native]: /tools/scala-native +[Scala.js]: /tools/scala-js diff --git a/_collections/_posts/2018-12-12-ciagla-intergracja.md b/_collections/_posts/2018-12-12-ciagla-intergracja.md new file mode 100644 index 00000000..c428c41e --- /dev/null +++ b/_collections/_posts/2018-12-12-ciagla-intergracja.md @@ -0,0 +1,275 @@ +--- +title: "Ciągła integracja, ciągła kontrola, ciągła Scala" +author: TheKamilAdam +category: scala-native +labels: coveralls continuous-integration travis-ci +langs: scala java rust +tools: clang sbt scala-native ubuntu +libs: +redirect_from: + - ciagla-intergracja + - scala-native/ciagla-intergracja + - resentiment/ciagla-intergracja + - resentiment/2018/12/12/ciagla-intergracja.html +--- + +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ć. + +Istnieje podejrzenie graniczące z pewnością, +że programiści pracujący przy projekcie będą wywoływać polecenie fragmentarycznie, +a całe polecenie tylko przed wysłaniem kodu do repozytorium. +O ile i tego nie zapomną lub zignorują. + +W scentralizowanych systemach kontroli wersji takich jak SVN lub CVS +problem ten rozwiązywano za pomocą *hooków* po stronie klienta (tj programisty). +Np. nie można było zrobić *commita*, jeśli kod nie był sformatowany, +a pokrycie kodu testami na odpowiednio wysokim poziomie. +Nie było to jednak dobre rozwiązanie ponieważ każdą walidację po stronie klienta można oszukać, obejść i/lub wyłączyć. + +Dziś istnieją zdecentralizowane systemy kontroli wersji jak Git czy Mercurial. +Pozwalają one w łatwy sposób tworzyć *feature branche*, +dzięki czemu kod nie jest wysyłany bezpośrednio do głównej gałęzi repozytorium. +*Feature branche* nie muszą zawierać sformatowanego kodu, nie muszą się nawet kompilować. + +Jednocześnie chcielibyśmy mieć pewność, że w momencie łączenia *feature branch* z główną gałęzią repozytorium, +kod zawarty w *feature branchy* działa poprawnie i spełnia standardy zdefiniowane w projekcie. +Rozwiązaniem jest tutaj serwer ciągłej integracji. + +## Serwer ciągłej integracji i zamieszanie ze słownictwem + +Serwer ciągłej integracji jest to serwer konfigurowany skryptem, zwanym także *pipeline*. +Większość serwerów, w zależności od konfiguracji jest wstanie robić trzy rzeczy: +* ciągłą integrację +* ciągłe dostarczanie +* ciągłe wdrażanie + +**Ciągła integracja** (ang. *Continuous Integration*, *CI*) jest to proces, +który powinien wykonać się po każdym *commicie* wysłanym do zdalnego repozytorium kodu źródłowego. +W jego skład wchodzą: +* sprawdzenie poprawności formatowania +* analiza statyczna +* kompilacja +* analiza dynamiczna (testy jednostkowe i integracyjne) +* generowanie raportów + +i wszystko inne co zostanie uznane za słuszne dla pojedynczego *commitu*. + +**Ciągłe dostarczanie** (ang. *Continuous Delivery*, *CD*) jest to proces, +który powinien wykonać się po każdym *commicie* (zwykle *merge'u*) do gałęzi głównej (np. master/develop). +Składa się ze wszystkich etapów ciągłej integracji plus dodatkowo: +* nadania numeru wersji (głównie w przypadku bibliotek) +* zbudowaniu paczki wykonywalnej (biblioteki, mikroserwisu, aplikacji) +* wdrożeniu na serwer developerski (w przypadku mikroserwisów i aplikacji) +i uruchomieniu testów systemowych oraz akceptacyjnych, a następnie wdrożeniu na serwer testowy/demonstracyjny +* opublikowaniu w repozytorium artefaktów (głównie w przypadku bibliotek) + +Oczywiście jest to tylko jedna z wielu wersji procesu. +Możliwe punkty zmiany to np.: +* polityka firmy może zakładać, że numery wersji bibliotek powinny być nadawane ręcznie +* aplikacja jest na tyle duża, że niemożliwością jest uruchamianie wszystkich testów po każdej zmianie + +**Ciągłe wdrażanie** (ang. *Continuous Deployment*) jest rozszerzeniem procesu ciągłego dostarczania dla aplikacji +i zawiera tylko jeden dodatkowy punkt, zaufanie. Zaufanie, że: +* aplikacja została odpowiednio przetestowana +* jeśli włączy się alarm, sygnalizujący błąd w aplikacji, to ktoś się nim zajmie + +Dodatkowy krok polega na automatycznym wdrażaniu wydanej aplikacji na serwer produkcyjny. + +Teoretycznie możnaby wprowadzać podział na serwery CI i serwery CD. +Jednak jeśli z poziomu konfiguracji serwera CI mamy dostęp do basha, +lub możemy pisać wtyczki w innych językach programowania, +to z łatwością możemy zamienić serwer CI w serwer CD. +Łatwo więc zauważyć że granica jest tutaj bardzo płynna. + +## Wybór serwera CI/CD + +W świecie Javy jeśli ktoś mówi o serwerze CI zwykle ma na myśli Jenkinsa. +Dostępnych jest jednak wiele serwerów ciągłej integracji. +Chcąc jednak jak najszybciej (najprościej) pokazać zalety ciągłej integracji należy wybrać oprogramowanie darmowe +i dodatkowo dostępne jako usługa (ang. *Software as a Service*, *SaaS*). +Dobrze także, aby *po wyjęciu z pudełka* wspierało używane przez nas języki programowania. +Przy takich założeniach wybór padł na dwa serwisy: +* popularniejszy [Travis CI]() używający kontenerów z **[Ubuntu]** +* młodszy [CircleCI]() używający kontenerów z Debianem + +Niestety nie udało mi się skonfigurować CircleCI dla języka **[ScalaNative]**. +Problemem były zależności dla Debiana. + +Dodatkowo przydatne są także serwisy agregujące raporty z pokrycia kodu testami. +Ja znalazłem dwa działające jako serwis: +* [Code Coverage Done Right | Codecov]() +* [Coveralls - Test Coverage History & Statistics]() + +oba są darmowe dla projektów opensource. + +## Konfiguracja generowania raportów + +Do pliku `project/plugins.sbt` dodajemy dwie wtyczki: +```yaml +addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.5.1") +addSbtPlugin("org.scoverage" % "sbt-coveralls" % "1.2.7") +``` +* [sbt-scoverage]() umożliwia generowanie raportów z pokrycia kodu testami, +* [sbt-coveralls]() umożliwia wysłanie raportu +do [Coveralls]() + +## Konfiguracja projektu dla Travis Ci + +TravisCi jest konfigurowany za pomocą pliku `.travis.yml`. + +Najpierw wybieramy język programowania, jego wersję, wersję Ubuntu oraz wersję maszyny wirtualnej Javy: +```yaml +language: scala +scala: 2.11.12 +dist: xenial +jdk: openjdk8 +``` + +Niestety `openjdk-8-jdk` nie jest domyślnie zainstalowane na Ubuntu w wersji `xenial`. +Na szczęście możemy doinstalować potrzebną nam wersję Javy z pakietów Ubuntu. +Pozostałe pakiety są dla ScalaNative +```yaml +addons: + apt: + packages: + - openjdk-8-jdk + - libunwind-dev + - libgc-dev + - libre2-dev + - clang-6.0 +``` + +Niestety to nie wystarcza i musimy podmienić wersję Javy w zmiennej środowiskowej `PATH`: +```yaml +env: + global: + - JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ + - PATH=$JAVA_HOME/bin:$PATH +``` + +Włączamy cache dla folderów zawierających zależności: +```yaml +cache: + directories: + - $HOME/.sbt + - $HOME/.ivy2/cache +``` + +Uruchamiamy analizę statyczną i analizę dynamiczną kodu oraz generujemy raport z testów: +```yaml +script: + - sbt 'scalafix --check' 'test:scalafix --check' 'it:scalafix --check' && + sbt scalafmtSbtCheck scalafmtCheck test:scalafmtCheck it:scalafmtCheck && + sbt clean re/compile re/test:compile re/it:compile && + sbt coverage reJS/test reJVM/test reJS/it:test reJVM/it:test coverageReport && + sbt coverageAggregate && + sbt scalastyle test:scalastyle it:scalastyle && + sbt scapegoat cpd stats +``` + +Przesyłamy raport do usług agregujących wyniki testów: +```yaml +after_success: + - sbt coveralls + - bash <(curl -s https://codecov.io/bash) +``` + +Pełny plik konfiguracyjny `.travis.yml`: +```yaml +language: scala +scala: 2.11.12 +dist: xenial +jdk: openjdk8 + +addons: + apt: + packages: + - openjdk-8-jdk + - libunwind-dev + - libgc-dev + - libre2-dev + - clang-6.0 + +env: + global: + - JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ + - PATH=$JAVA_HOME/bin:$PATH + +cache: + directories: + - $HOME/.ivy2/cache + - $HOME/.sbt + +script: + - sbt 'scalafix --check' 'test:scalafix --check' 'it:scalafix --check' && + sbt scalafmtSbtCheck scalafmtCheck test:scalafmtCheck it:scalafmtCheck && + sbt clean re/compile re/test:compile re/it:compile && + sbt coverage reJS/test reJVM/test reJS/it:test reJVM/it:test coverageReport && + sbt coverageAggregate && + sbt scalastyle test:scalastyle it:scalastyle && + sbt scapegoat cpd stats + +after_success: + - sbt coveralls + - bash <(curl -s https://codecov.io/bash) +``` + +## Podsumowanie + +Uważny czytelnik może zauważyć, że nie wywołuje testów dla **[ScalaNative]**. +Mimo zainstalowania wszystkich pakietów wywołanie testów dla ScalaNative kończy się błędem: +```bash +[error] /usr/bin/ld: warning: libunwind.so.8, needed by /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../x86_64-linux-gnu/libunwind-x86_64.so, may conflict with libunwind.so.1 +[error] /usr/bin/ld: /home/travis/build/writeonly/resentiment/re/native/target/scala-2.11/native/lib/gc/immix/Heap.c.o: undefined reference to symbol '_Ux86_64_getcontext' +[error] //usr/lib/x86_64-linux-gnu/libunwind.so.8: error adding symbols: DSO missing from command line +[error] clang: error: linker command failed with exit code 1 (use -v to see invocation) +[info] Linking native code (immix gc) (184 ms) +[info] Starting process '/home/travis/build/writeonly/resentiment/re/native/target/scala-2.11/re-out' on port '32951'. +Exception in thread "Thread-386" java.io.IOException: Cannot run program "/home/travis/build/writeonly/resentiment/re/native/target/scala-2.11/re-out": error=2, No such file or directory + at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048) + at scala.sys.process.ProcessBuilderImpl$Simple.run(ProcessBuilderImpl.scala:71) + at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.run(ProcessBuilderImpl.scala:102) + at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.$anonfun$runBuffered$1(ProcessBuilderImpl.scala:150) + at scala.runtime.java8.JFunction0$mcI$sp.apply(JFunction0$mcI$sp.java:12) + at scala.sys.process.ProcessLogger$$anon$1.buffer(ProcessLogger.scala:99) + at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.runBuffered(ProcessBuilderImpl.scala:150) + at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.$bang(ProcessBuilderImpl.scala:116) + at scala.scalanative.testinterface.ComRunner$$anon$1.run(ComRunner.scala:31) +Caused by: java.io.IOException: error=2, No such file or directory + at java.lang.UNIXProcess.forkAndExec(Native Method) + at java.lang.UNIXProcess.(UNIXProcess.java:247) + at java.lang.ProcessImpl.start(ProcessImpl.java:134) + at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029) + ... 8 more +``` + +Jest to kolejny problem **[ScalaNative])**. po braku możliwości wygenerowania pokrycia kodu +oraz braku możliwości uruchomienia testów integracyjnych. +Dowodzi to że ScalaNative niestety dalej jest zabawką +i jeśli chce się pisać monady w języku kompilowanym natywnie należy wybrać **[Rust]**. + +## Postscriptum + +Poszukując serwisów CI natrafiłem na jeszcze jeden termin z kategorii *Continuous cośtam*. + +**Ciągła analiza statyczna** (ang. *Continuous static analysis*) jest to proces podobny do ciągłej integracji, ale ograniczony tylko do jednego kroku, +analizy statycznej. +Cechą charakterystyczną serwerów ciągłej analizy statycznej jest posiadanie ogromnej ilości reguł według których sprawdzany jest kod. +Klasycznym przykładem oprogramowania w świecie Javy jest tutaj [SonarQube](). +Ja oczywiście poszukiwałem oprogramowania działającego jako darmowa usługa dla projektów opensorsowych i znalazłem: +* [Codacy: Automated code reviews & code analytics]() +* [Rocro INSPECODE - Code review without the hassle.]() + +## Postscriptum 2 + +Termin **ciągła analiza statyczna** ułożyłem sam, +jednak występujący w jego miejscu termin **ciągła kontrola jakości kodu** (ang. *Continuous Inspection of Code Quality*) +jest według mnie zbyt ogólny. + +[Rust]: /langs/rust + +[Ubuntu]: /tools/ubuntu +[ScalaNative]: /tools/scala-native diff --git a/_collections/_posts/2019-01-09-biblioteki-do-logowania.md b/_collections/_posts/2019-01-09-biblioteki-do-logowania.md new file mode 100644 index 00000000..dbd27711 --- /dev/null +++ b/_collections/_posts/2019-01-09-biblioteki-do-logowania.md @@ -0,0 +1,370 @@ +--- +title: "Biblioteki do logowania dla języka Scala" +author: TheKamilAdam +category: scala-native +tags: library cli factory logging +labels: scala-logging scribe +langs: scala java +tools: scala-js scala-native +lisb: utest slogging +redirect_from: + - biblioteki-do-logowania + - scala-native/biblioteki-do-logowania + - resentiment/biblioteki-do-logowania + - resentiment/2019/01/09/biblioteki-do-logowania.html +--- + +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. + +Dlatego powstały biblioteki do logowania. +Biblioteki takie pozwalają przekierować logi do pliku, zapisać je w bazie danych oraz wysłać je do dowolnego innego systemu. + +## Przegląd bibliotek + +* [scala-logging]() - +wygodna i wydajna biblioteka logowania opakowywująca bibliotekę `SLF4J` dla języka Scala. +Niestety działa tylko dla Scala/JVM +* [util-logging]() - +jest małym opakowaniem wbudowanego logowania Javy, aby uczynić go bardziej przyjaznym dla Scali. +Niestety także, działa tylko dla Scala/JVM +* [scalajs-java-logging]() - +implementacja `java.logging` dla **[Scala.js]**. +Wspiera **[Scala.js]** w wersji 0.6.x i 1.0.x +* [airframe-log]() - +biblioteka do ulepszania logowania aplikacji Scala z kolorami i lokalizacjami kodów źródłowych. +Wspiera Scala.js w wersji 0.6.x i 1.0.x +* [slogging]() - +biblioteka logowania zgodna z `scala-logging` (i `SLF4J`) oparta na makrach +dla Scala/JVM, **[Scala.js]** (wersja 0.6.x) i **[Scala Native]** +* [scribe]() - +praktyczny szkielet logowania, który nie wymaga żadnej innej struktury logowania +i może być w pełni skonfigurowany programowo. +Wspiera **[Scala.js]** w wersji 0.6.x oraz **[Scala Native]**. + +## I konkretne próby zastosowania + +### scala-logging +Jest to najprawdopodobniej najpopularniejsza biblioteka do logowania w języku Scala. +Niestety jej wadą jest to, że działa tylko dla JVM. + +W pliku `build.sbt` dodajemy bibliotekę do wspólnych zależności: +```scala + libraryDependencies ++= Seq( + "com.typesafe.scala-logging" %% "scala-logging" % "3.9.0", + ), +``` + +`Scala-logging` można używać na dwa sposoby. +Za pomocą traitów `StrictLogging` i `LazyLogging`. +Oba traity tworzą zmienną `logger`, która jest loggerem. + +Trait `StrictLogging` inicjalizuje `logger` w momencie utworzenia klasy: +```scala +package com.typesafe.scalalogging + +import org.slf4j.LoggerFactory + +trait StrictLogging { + protected val logger: Logger = Logger(LoggerFactory.getLogger(getClass.getName)) +} +``` + +```scala +package pl.writeonly.re.shared + +import com.typesafe.scalalogging.StrictLogging + +object StrictLoggingCore extends Core with StrictLogging { + def apply(arg: String): Unit = { + logger.info(s"Hello Scala $arg!") + } +} +``` + +Trait `LazyLogging` inicjalizuje `logger` w momencie pierwszego użycia loggera: +```scala +package com.typesafe.scalalogging + +import org.slf4j.LoggerFactory + +trait LazyLogging { + @transient + protected lazy val logger: Logger = Logger(LoggerFactory.getLogger(getClass.getName)) +} +``` + +```scala +package pl.writeonly.re.shared + +import slogging.LazyLogging + +object LazyLoggingCore extends Core with LazyLogging { + def apply(arg: String): Unit = { + logger.info(s"Hello Scala $arg!") + } +} +``` + +Łączymy wszystko w obiekcie `Core`: +```scala +package pl.writeonly.re.shared + +trait Core { + def apply(arg: String): Unit +} + +object Core extends Core { + override def apply(arg: String): Unit = { + StrictLoggingCore(arg) + LazyLoggingCore(arg) + } +} +``` + +Tworzymy test jednostkowy we frameworku **[uTest]**: +```scala +package pl.writeonly.re.shared + +import utest._ + +object CoreTest extends TestSuite { + override val tests: Tests = Tests { + 'core - { + Core("Awesome") + } + } +} +``` + +Wywołujemy: +```bash +sbt clean re/test +``` + +I wszystko się wysypuje, bo `scala-logging` wspiera tylko JVM. + +### slogging +Jest to przepisana biblioteka `scala-logging`, +która działa dla Scala Native, Scala.js oraz oczywiście Scala/JVM. + +W pliku `build.sbt` dodajemy bibliotekę do wspólnych zależności: +```scala + libraryDependencies ++= Seq( + "biz.enef" %%% "slogging" % SloggingVersion, + ), +``` + +`Slogging` używa się identycznie jak `scala-logging`. + +Trait `StrictLogging` inicjalizuje `logger` w momencie utworzenia klasy: +```scala +package slogging + +trait StrictLogging extends LoggerHolder { + protected val logger : Logger = LoggerFactory.getLogger(loggerName) +} +``` + +```scala +package pl.writeonly.re.shared + +import slogging.StrictLogging + +object StrictLoggingCore extends Core with StrictLogging { + def apply(arg: String): Unit = { + logger.info(s"Hello Scala $arg!") + } +} +``` + +Trait `LazyLogging` inicjalizuje `logger` w momencie pierwszego użycia loggera: +```scala +package slogging + +trait LazyLogging extends LoggerHolder { + protected lazy val logger = LoggerFactory.getLogger(loggerName) +} +``` + +```scala +package pl.writeonly.re.shared + +import slogging.LazyLogging + +object LazyLoggingCore extends Core with LazyLogging { + def apply(arg: String): Unit = { + logger.info(s"Hello Scala $arg!") + } +} +``` + +Łączymy wszystko w obiekcie `Core`: +```scala +package pl.writeonly.re.shared + +trait Core { + def apply(arg: String): Unit +} + +object Core extends Core { + override def apply(arg: String): Unit = { + StrictLoggingCore(arg) + LazyLoggingCore(arg) + } +} +``` + +Tworzymy test jednostkowy we frameworku **[uTest]**: +```scala +package pl.writeonly.re.shared + +import utest._ + +object CoreTest extends TestSuite { + override val tests: Tests = Tests { + 'core - { + Core("Awesome") + } + } +} +``` + +Wywołujemy: +```bash +sbt clean re/test +``` + +I wszystko działa! + +### Scribe + +W pliku `build.sbt` dodajemy bibliotekę do wspólnych zależności: +```scala + libraryDependencies ++= Seq( + "com.outr" %%% "scribe" % ScribeVersion, + ), +``` + +`Scribe` można używać na dwa sposoby. +Za pomocą traitu `Logging` oraz za pomocą obiektu pakietu `scribe`. + +Trait `Logging` w prostu sposób tworzy `logger` dla każdej instancji klasy: +```scala +trait Logging { + protected def loggerName: String = getClass.getName + + protected def logger: Logger = Logger(loggerName) +} +``` + +```scala +package pl.writeonly.re.shared + +import scribe.Logging + +object LoggingCore extends Core with Logging { + override def apply(arg: String): Unit = { + logger.info(s"Hello Scala $arg!") + } +} +``` + +Obiekt pakietu `scribe` zawiera magię opartą na makrach, dlatego dziedziczenie nie jest potrzebne: +```scala +package object scribe extends LoggerSupport { + lazy val lineSeparator: String = System.getProperty("line.separator") + + protected[scribe] var disposables = Set.empty[() => Unit] + + override def log[M](record: LogRecord[M]): Unit = Logger(record.className).log(record) + + def dispose(): Unit = disposables.foreach(d => d()) + + implicit class AnyLogging(value: Any) { + def logger: Logger = Logger(value.getClass.getName) + } + + def async[Return](f: => Return): Return = macro Macros.async[Return] + + def future[Return](f: => Return): Future[Return] = macro Macros.future[Return] + + object Execution { + implicit def global: ExecutionContext = macro Macros.executionContext + } +} +``` + +```scala +package pl.writeonly.re.shared + +object ScribeCore extends Core { + def apply(arg: String): Unit = { + scribe.info(s"Hello Scala $arg!") + } +} +``` + +Łączymy wszystko obiektem `Core`: +```scala +package pl.writeonly.re.shared + +trait Core { + def apply(arg: String): Unit +} + +object Core extends Core { + override def apply(arg: String): Unit = { + LoggingCore(arg) + ScribeCore(arg) + } +} +``` + +Tworzymy test: +```scala +package pl.writeonly.re.shared + +import utest._ + +object CoreTest extends TestSuite { + override val tests: Tests = Tests { + 'core - { + Core("Awesome") + } + } +} +``` + +Wywołujemy: +```bash +sbt clean re/test +``` + +Niestety pojawia się błąd: +``` +[error] cannot link: @java.util.Calendar$::getInstance_java.util.Calendar +[error] cannot link: @java.util.Calendar::setTimeInMillis_i64_unit +[error] unable to link +[error] (re / Nativetest / nativeLink) unable to link +``` + +## Podsumowanie + +Jak zwykle składnia Scali pozwala zapisać te same rzeczy prościej niż w Javie, +jednocześnie dzięki temu można wymusić konwencję tworzenia loggerów na etapie kompilacji. +Dzięki temu nie mamy w kodzie loggerów o nazwach innych niż `loggger` jak np. `LOGGER` lub `LOG`. + +[Scala Native]: /tools/scala-native +[Scala.js]: /tools/scala-js + +[uTest]: /libs/utest + +[CLI]: /tags/cli diff --git a/_collections/_posts/2019-01-16-kategorie-i-tagi.md b/_collections/_posts/2019-01-16-kategorie-i-tagi.md new file mode 100644 index 00000000..c0105a5a --- /dev/null +++ b/_collections/_posts/2019-01-16-kategorie-i-tagi.md @@ -0,0 +1,247 @@ +--- +title: "Jekyll - kategorie i tagi" +author: TheKamilAdam +category: jekyll +tags: blog +tools: jekyll +redirect_from: + - kategorie-i-tagi + - jekyll/kategorie-i-tagi + - writeonlydoc/kategorie-i-tagi + - writeonlydoc/2019/01/16/kategorie-i-tagi.html +--- + +Opublikowałem już kilka artykułów na blogu i chciałem je w jakiś sposób pogrupować. +Najlepiej za pomocą kategorii i tagów. + +## Metadane + +Dla każdego postu oprócz zawartości zapisywałem także metadane, +w tym kategorie i tagi. +W przypadku tego artykułu są to: + +{%raw%} +```yaml +--- +#layout: post +title: "Jekyll - kategorie i tagi" +author: TheKamilAdam +category: jekyll +tags: jekyll blog +--- +``` +{%endraw%} + +Artykuł może zawierać wiele tagów, ale musi mieć dokładnie jedną kategorię. + +## Strony pomocnicze + +Jest to najprawdopodobniej największa wada Jekylla. +Dla każdej kategorii i dla każdego taga trzeba utworzyć stronę pomocniczą. +Strony pomocnicze kategorii muszą znajdować się w folderze `_categories`, +a strony pomocnicze tagów w folderze `_tags`. + +Przykładowy strona pomocnicza dla kategorii: + +{%raw%} +```yaml +--- +permalink: /categories/resentiment +labelcategory: "resentiment" +--- +Opis powstawania projektu resentiment. +``` +{%endraw%} + +Przykładowy strona pomocnicza dla tagu: + +{%raw%} +```yaml +--- +permalink: /tools/scala-native +#layout: page-tag +tag: "scala-native" +--- +``` +{%endraw%} + +## Kolekcje + +Ponieważ stron pomocniczych jest dużo, +dlatego źle jest je trzymać w przestrzeni głównej projektu. +Problem ten można rozwiązać za pomocą kolekcji. +W pliku `_config.yml` dodajemy: + +```yaml +collections: + categories: + output: true + tags: + output: true +``` +Od tej pory strony dla kategorii będą znajdować się w katalogu `_categories`, +a strony dla tagów w katalogu `_tags`. + +Ale dla mnie nawet to było za dużo. +Dlatego kolekcje przeniosłem do folderu `data`. +W pliku `_config.yml` dodajemy: +```yaml +collections_dir: data +``` + +Od tej pory: +* w katalogu `data/_categories` znajdują się kategorie artykułów +* w katalogu `data/_posts` znajdują się artykuły +* w katalogu `data/_tags` znajdują się tagi + +## Layouts - układy stron + +W stronach pomocniczych użyliśmy layoutów `page-categories` i `page-tags`. +Teraz trzeba je zdefiniować. + +Układ strony `_layout/page-category.html` zawierający wszystkie artykuły z danej kategorii: + +{%raw%} +```yaml +--- +#layout: default +title: {{ page.category }} +--- +
+ {% include breadcrumbs.html %} +

Kategoria: {{ page.title }}

+ + {{ posts.content }} + +
+ {% for post in site.posts %} + {% if post.category == page.category %} +
+ + {{ post.title }} + + + + +
+
+ {% assign tags = post.tags | sort %} + Tagi: + {% for tag in tags %} + {{ tag }} + {% endfor %} +
+ {% endif %} + {% endfor %} +
+
+``` +{%endraw%} + +Układ strony `_layout/page-tag.html` zawierający wszystkie artykuły z danym tagiem: +{%raw%} +```yaml +--- +#layout: default +title: {{ page.tag }} +--- +
+ {% include breadcrumbs.html %} +

Tag: {{ page.tag | capitalize }}

+ +
+ {% for post in site.posts %} + {% if post.tags contains page.tag %} +
+ + {{ post.title }} + + + + +
+
+ Kategoria : + {{ post.category | capitalize }} +
+ + {% endif %} + {% endfor %} +
+
+``` +{%endraw%} + +W obu przypadkach iterujemy po liście wszystkich artykułów i prostym `if`em wybieramy te które nas interesują. + +## Pages - strony specjalne + +Potrzebujemy jeszcze jednej rzeczy. + +Strona `pages/categories.html` zawierająca listę wszystkich kategorii: +{%raw%} +```yaml +--- +#layout: posts +title: Kategorie +permalink: /categories/ +description: Kategorie artykułów +--- +
+ {% assign categories = site.categories | sort: "title" %} +
+ {% for node in categories %} + {% if node.title != null and node.layout == "page-category" %} +
+ {{ node.title }} +
+
+ {{ node.content }} +
+ {% endif %} + {% endfor %} +
+
+``` +{%endraw%} + +Strona `pages/tags.html` zawierająca listę wszystkich tagów: +{%raw%} +```yaml +--- +#layout: posts +title: Tagi +permalink: /tags/ +description: Tagi artykułów +--- +
+
    + {% assign tags = site.tags | sort: "title" %} + {% for node in tags %} + {% if node.title != null and node.layout == "page-tag" %} +
  • + {{ node.title }} +
  • + {% endif %} + {% endfor %} +
+
+``` +{%endraw%} + +W obu przypadkach pobieramy listę wszystkich kategorii/tagów i sortujemy po tytułach. +A następnie odrzucamy te które nie są poprawne do wyświetlenia, +czyli zawierają błędny `layout` lub nie posiadają tytułu. + +## Podsumowanie + +Żeby wszystko działało trzeba było napisać trochę kodu. +Łącznie 17 stron pomocniczych dla tagów, 3 - dla kategorii, +dwa układy stron i dwie strony specjalne do agregacji kategorii i tagów. +Ale oczywiście nie to zajeło najwięcej czasu. +Największym problemem była wolność jaką daje jekyll, +czyli możliwość zbudowania układów stron w dowolny sposób. diff --git a/_collections/_posts/2019-01-30-no-universal-equality.md b/_collections/_posts/2019-01-30-no-universal-equality.md new file mode 100644 index 00000000..d745c6bf --- /dev/null +++ b/_collections/_posts/2019-01-30-no-universal-equality.md @@ -0,0 +1,180 @@ +--- +title: "Scala - No Universal Equality" +author: TheKamilAdam +category: scala-native +tags: ad-hoc compiler library monad operator type-class +labels: scalatic +langs: haskell java scala +tools: scala-jvm scala-js scala-native scalafix +libs: cats scalatest scalaz utest +projects: resentiment +redirect_from: + - no-universal-equality + - scala-native/no-universal-equality + - resentiment/no-universal-equality + - resentiment/no-universal-equality.html +--- + +Ostatnim błędem zgłaszanym w kodzie projektu **[resentiment]** przez **[scalafix]** +jest "No Universal Equality" wynikający z użycia operatora `==`. + +W języku **[Scala]** obiekty domyślnie porównuje się za pomocą operatora `==`. +Operator ten wywołuje pod spodem znaną z Javy metodę `equals`. +Operator `==` pozwala jednak na bezsensowne porównywanie obiektów, które są różnych klas. +Mimo że poprawnie napisana metoda `equals` zawsze zwróci w takim przypadku `false`. +Np. porównanie `"A" == 'A'` zawsze zwróci `false`, +ponieważ `"A"` jest klasy `String`, a `'A'` jest klasy `Char`. +Umieszczenie czegoś takiego w kodzie zawsze jest błędem programisty i powinno spowodować nieskompilowanie się kodu. +Jest to nazywane problemem `Universal Equality`. +Można ten problem rozwiązać na kilka sposobów. + +## Dotty - Multiversal Equality + +Najprostszym sposobem rozwiązania problemu `Universal Equality` jest poczekać. +Nowa wersja **[kompilator]** Scala - *[Dotty]()* będzie posiadać +[Multiversal Equality]() +co rozwiązuje problem. + +## Biblioteki zewnętrzne +Jeśli jednak jesteście niecierpliwi istnieje kilka bibliotek rozwiązujących ten problem. +Wykorzystują one to, +że Scala pozwala implementować metody, +których wywołanie wygląda jak wywołanie operatora i zwykle tym nowym operatorem jest `===`. + +### Scalactic +**[Scalactic]()** +jest to zestaw utilsów/narzędzi wydzielony ze **[ScalaTest]**, +który może być przydatny także w kodzie produkcyjnym. + +**Scalactic** posiada wiele klas do porównywania wartości, +między innymi klasę `org.scalactic.TypeCheckedTripleEquals`, +która wymaga by oba porównywane obiekty były tej samej klasy. + +Największą zaletą biblioteki **Scalactic** jest to, +że nie zagłębia się w teorię czystego programowania funkcyjnego (ang. *pure functional programming*) +i nie pojawiają się tam takie straszne terminy jak **[monada]** czy **[klasy typów]**. + +### Scalaz i Cats +*Kolejność chronologiczna.* + +Są to dwie wspaniałe biblioteki, które robią ze Scali język funkcyjny przypominający język **[Haskell]**. + +Biblioteki te dzielą się na dwie główne części: +* *Data types* - tutaj znajdują się monady, które są w Haskellu, ale nie ma ich w bibliotece standardowej języka Scala +* *Type classes* - typ konstruktu systemowego, który obsługuje polimorfizm *[ad hoc]*. + +Zarówno **[Scalaz]** jak i **[Cats]** posiadają klasę `Equal`, +która pozwala porównywać obiekty za pomocą operatora `===`. + +Dobre porównanie obu bibliotek można znaleźć na [githubie](), +chociaż różnice są bardzo małe. +Obie biblioteki wspierają **[scala.js])**, +ale tylko **Scalaz** - **[scala native]**. + +## "No Universal Equality" z Scalaz w projekcie Resentiment + +W `build.sbt` do `SharedSettings` dodajemy bibliotekę `Scalaz`: +```scala + libraryDependencies += "org.scalaz" %%% "scalaz-core" % "7.2.27", +``` + +Jeśli używamy scalafix w pliku `.scalafix.conf` można dodać/odkomentować linię: +```conf +DisableSyntax.noUniversalEquality = true +``` + +Teraz należy poprawić cały kod zamieniając `==` na `===`. +W przypadku projektu **[resentiment]** są to klasy `CalculatorTest` i `CalculatorIT` + +```scala +package pl.writeonly.re.shared + +import scalaz.Scalaz._ +import utest._ + +object CalculatorTest extends TestSuite { + override val tests: Tests = Tests { + val calculator = new Calculator() + 'addition - { + val addition: (Int, Int) => Int = (x, y) => calculator.add(x, y) + "0 + 0 == 0" - { + assert(addition(0, 0) === 0) + } + "2 + 2 == 4" - { + assert(addition(2, 2) === 4) + } + } + 'multiplication - { + val multiplication: (Int, Int) => Int = (x, y) => calculator.mul(x, y) + "0 + 0 == 0" - { + assert(multiplication(0, 0) === 0) + } + "2 + 2 == 4" - { + assert(multiplication(2, 2) === 4) + } + } + 'less_or_equal - { + val less_or_equal: (Int, Int) => Boolean = (x, y) => calculator.leq(x, y) + "0 <= 2 == true" - { + assert(less_or_equal(0, 2)) + } + "2 <= 0 == false" - { + assert(!less_or_equal(2, 0)) + } + } + } +} +``` + +```scala +package pl.writeonly.re.shared + +import scalaprops.{Property, Scalaprops} +import scalaz.Scalaz._ + +object CalculatorIT extends Scalaprops { + val calculator = new Calculator() + + val addition: (Int, Int) => Int = (x, y) => calculator.add(x, y) + val additionTest = Property.forAll { (a: Int, b: Int) => + addition(a, b) === a + b + } + + val multiplication: (Int, Int) => Int = (x, y) => calculator.mul(x, y) + val multiplicationTest = Property.forAll { (a: Int, b: Int) => + multiplication(a, b) === a * b + } + + val lessOrEqual: (Int, Int) => Boolean = (x, y) => calculator.leq(x, y) + val lessOrEqualTest = Property.forAll { (a: Int, b: Int) => + lessOrEqual(a, b) === (a <= b) + } +} + +``` + +## Podsumowanie +Język Scala posiada kilka mniejszych lub większych błedów projektowych. +Część z nich zostanie poprawiona w nowej wersji kompilatora Dotty. +Jeśli jednak nie chcemy czekać do tego czasu warto się rozejrzeć w internecie, +ponieważ prawdopodobnie istnieją już rozwiązania naszych problemów. +"Universal Equality" jest jednym z problemów, +które w prosty sposób mogą być rozwiązane już dziś. + +[Haskell]: /langs/haskell +[Scala]: /langs/scala + +[Cats]: /libs/cats +[ScalaTest]: /libs/scalatest +[Scalaz]: /libs/scalaz + +[scala native]: /tools/scala-native +[scalafix]: /tools/scalafix +[scala.js]: /tools/scala-js + +[resentiment]: /projects/resentiment + +[ad hoc]: /tags/ad-hoc +[klasy typów]: /tags/type-class +[kompilator]: /tags/compiler +[monada]: /tags/monad diff --git a/_collections/_posts/2019-02-13-setxkbmap.md b/_collections/_posts/2019-02-13-setxkbmap.md new file mode 100644 index 00000000..eb1fe957 --- /dev/null +++ b/_collections/_posts/2019-02-13-setxkbmap.md @@ -0,0 +1,74 @@ +--- +title: "setxkbmap - Jak szybko zmienić układ klawiatury z konsoli na Ubuntu?" +author: TheKamilAdam +category: cli +tags: cli +langs: +tools: bash ubuntu +libs: +redirect_from: + - setxkbmap + - cli/setxkbmap + - cli/2019/02/13setxkbmap.html +--- + +Po długiej przerwie prosty artykuł "Jak szybko zmienić układ klawiatury z konsoli na **[Ubuntu]**?". + +## Problem + +Podczas pracy na Xubuntu zainstalowanym na wirtualnej maszynie często zmienia mi się układ klawiatury z polskiej na amerykańską. +Na **[Ubuntu]** można odwrócić ten proces w łatwy sposób za pomocą ikonki na pasku zadań, +jednak już w Xubuntu ta opcja jest ukryta głęboko w trzewiach ustawień systemowych. +Dlatego prościej jest to zrobić z linii poleceń. + +## Rozwiązanie - setxkbmap + +Aby szybko zmienić układ klawiatury, wystarczy zainstalować 'setxkbmap' za pomocą polecenia: +```bash +sudo apt-get install x11-xkb-utils +``` + +Następnie można łatwo zmieniać układ klawiatury za pomocą polecenia: +```bash +setxkbmap pl +``` + +Pomoc można wyświetlić za pomocą polecenia: +```bash +setxkbmap -help +``` + +Pomoc polecenia w wersji 'setxkbmap 1.3.1' : +``` +Usage: setxkbmap [options] [ [ [

i$=z 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 literal 0 HcmV?d00001 diff --git a/assets/images/bio-photo.jpg b/assets/images/bio-photo.jpg deleted file mode 100644 index 000845179832190a64352439f621bb797d05f826..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1661 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<HTa{Rx=zyT4T z1C`?C<%!t7+kt^khfPK3u;^sAs z$CeymIysNQ(xibQvUma8S`G$rmMIJizcjF3z0FYc;sL{slm@<783u8g4u-{*4eYl+ zCorsDn82R(nn9{moQFB@@#_ZGLPmy}Q3(tWE;ESznZY1eZ(qsyi&=vqvHNPALxgef z0iM8$o@@cecadiA|Ju1He)M5rkd@3?zuh$h82q(ujz;m&B!@Xu0jyLZE;&fv#eHtuCTxb?%K&&%TSzOPiibL*Vwyic#n z{j@%$R)p0rP%nP3eQPZ6C67&B9I%pJRe&%&s^c_!F_{xmIZEl?_vMJGJgy z-kZ<-O7zcLrv5F5#ir_%3RG!)w3u)CYtHjD&$!F$Ry}tRnj|vGQRYEU%9)3!Cum+Z zpQN&+=JIO0=}`+6S4{bSzxK$sTLPYeRx_p6KDAoUG*8a#Wt50 zuYWP|YO3J%xMi_xt({hztFnAlY1z~F$)I)Vu}hCcM5Z!0%3WL@HDyJJ=cRz0Z8xGO z)a@=#u3P6lB{kJTD{9>qrkme|*yiQ@ox0*bgL`zdW@^E5XY1KfG5-6%ynNP@`?PAp z?^fA7o`+&DKc`K68N<8$cYWAgKg;P}GbOF>CFb^5d0ac;<$21`f$3#*!+(aES5|Mi zZMyQTiDRyijF-n7E~}khvv$SBbRBMgE@pAH@6cMC;{mby`e$d{U*e?Ge8ZEIUHWU0 zZ&YYp^D%F0Kckn~J?|SBFQ1vv>#XPB!+K>|*CcDND(BBqH|6xzP8H_qEccpg_j%=v z%zr*-gp(LkR1XE%oqR4o@e0F=2G)~DI1Y*0nS{JcU9$LrsfB0DveiC5oG+w$73$rgWD9=6=OGrVoZ<|sb1%HtcBd~5Ex>?m2cM%nCT;dB9+oYl4K zT>GZ#F}<2<@nOQ+R+|lT7wP8&Yw}B z<}%;Hlczo_DgT|ieop4T;L||?Q|=yfm+2RInPOG1cv{zDVYTPmbB^Dd&ZcRczrWSLD)e7xTSUW<*+Q!l!(Xp*7VL#~xvCuU4JlTp4)`>4KE;HolzjVI^k-`#)lfVnu^ z<0qP)PF_G#BE!!`qge0n--*#~0QET&yT4B6ry#3@B|7C8-)8jp+ zCAw;AX!vZy>+S`!RjRjF9pSp`H_fr#^jX6z)>wPyv#;YprHvp`DGV++3Ls?^Bd{#c N#G?RMeuEU;1OTJ`a#jEU diff --git a/assets/images/gromy.jpg b/assets/images/gromy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c5eb4667ea2a8024c76d6f877a856b8b83c93ede GIT binary patch literal 30523 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 ah3>14L*!4Rx&>i4l>Uj{oDX4t*Z&XamWwR_ literal 0 HcmV?d00001 diff --git a/assets/images/kamil.adam.jpg b/assets/images/kamil.adam.jpg new file mode 100644 index 0000000000000000000000000000000000000000..db8a5ea1371f5f520eaf7afeb21da1159dc6cd93 GIT binary patch literal 16769 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 Date: Tue, 24 Mar 2020 21:36:28 +0100 Subject: [PATCH 015/160] Update _config.yml --- _config.yml | 421 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 323 insertions(+), 98 deletions(-) diff --git a/_config.yml b/_config.yml index 3da6a50c..f501c811 100644 --- a/_config.yml +++ b/_config.yml @@ -1,115 +1,340 @@ -# Welcome to Jekyll! -# -# This config file is meant for settings that affect your whole blog, values -# which you are expected to set up once and rarely edit after that. If you find -# yourself editing this file very often, consider using Jekyll's data files -# feature for the data you need to update frequently. -# -# For technical reasons, this file is *NOT* reloaded automatically when you use -# 'bundle exec jekyll serve'. If you change this file, please restart the server process. - -# Site settings -# These are used to personalize your new site. If you look in the HTML files, -# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on. -# You can create any custom variable you would like, and they will be accessible -# in the templates via {{ site.myvariable }}. -title: MM -email: -description: >- # this means to ignore newlines until "baseurl:" - Write an awesome description for your new site here. You can edit this - line in _config.yml. It will appear in your document head meta (for - Google search results) and in your feed.xml site description. -twitter_username: username -github_username: username -minimal_mistakes_skin: default -search: true - -# Build settings -markdown: kramdown -remote_theme: mmistakes/minimal-mistakes -# Outputting -permalink: /:categories/:title/ -paginate: 5 # amount of posts to show -paginate_path: /page:num/ -timezone: # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones +# Jekyll: https://jekyllrb.com/docs/configuration/ +## Default Configuration: https://jekyllrb.com/docs/configuration/default/ + +future : true + +### Conversion +markdown : kramdown +highlighter : rouge + +### Outputting +permalink : /:categories/:title +paginate_path : /:num +timezone : "Europe/Warsaw" # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + +### Where things are include: + - _collections - _pages -# Exclude from processing. -# The following items will not be processed, by default. Create a custom list -# to override the default setting. -# exclude: -# - Gemfile -# - Gemfile.lock -# - node_modules -# - vendor/bundle/ -# - vendor/cache/ -# - vendor/gems/ -# - vendor/ruby/ - -# Plugins (previously gems:) -plugins: - - jekyll-paginate - - jekyll-sitemap - - jekyll-gist - - jekyll-feed - - jemoji - - jekyll-include-cache +sass: + # sass_dir: ui/_scss + style: compressed -author: - name : "First Lastname" - avatar : "/assets/images/bio-photo.jpg" - bio : "My awesome biography constrained to a sentence or two goes here." - links: - - label: "Website" - icon: "fas fa-fw fa-link" - url: "https://" - - label: "Twitter" - icon: "fab fa-fw fa-twitter-square" - url: "https://twitter.com/" - - label: "GitHub" - icon: "fab fa-fw fa-github" - url: "https://github.com/" - - label: "Instagram" - icon: "fab fa-fw fa-instagram" - url: "https://instagram.com/" +## Collections: https://jekyllrb.com/docs/collections/ +collections_dir : _collections +collections: + categories: + output : true + permalink : /:collection/:path + tags: + output : true + permalink : /:collection/:path + langs: + output : true + permalink : /:collection/:path + tools: + output : true + permalink : /:collection/:path + libs: + output : true + permalink : /:collection/:path + projects: + output : true + permalink : /:collection/:path + eso: + output : true + permalink : /:collection/:path + books: + output : true + permalink : /:collection/:path -footer: - links: - - label: "Twitter" - icon: "fab fa-fw fa-twitter-square" - url: "https://twitter.com/" - - label: "GitHub" - icon: "fab fa-fw fa-github" - url: "https://github.com/" - - label: "Instagram" - icon: "fab fa-fw fa-instagram" - url: "https://instagram.com/" +## Front Matter Defaults: https://jekyllrb.com/docs/configuration/front-matter-defaults/ defaults: # _posts - scope: - path: "" - type: posts + path : "" + type : posts values: - layout: single - author_profile: true - read_time: true - comments: true - share: true - related: true + layout : post + read_time : true + comments : true + share : true + related : false + pagination : true + toc: true + toc_sticky : true + sidebar: + nav : sidebar-main # _pages - scope: - path: "_pages" - type: pages + path : "_pages" + type : pages values: - layout: single - author_profile: true + layout : page + classes : wide + sidebar : + main : true + nav : sidebar-main + # _categories + - scope: + path : "" + type : categories + values: + layout : page-category + share : true + classes : wide + sidebar: + main : true + nav : sidebar-main + # _tags + - scope: + path : "" + type : tags + values: + layout : page-tag + share : true + classes : wide + sidebar: + main : true + nav : sidebar-main + # _langs + - scope: + path : "" + type : langs + values : + layout : page-lang + share : true + classes : wide + sidebar: + main : true + nav : sidebar-main + # _tools + - scope: + path : "" + type : tools + values: + layout : page-tool + share : true + classes : wide + sidebar: + main : true + nav : sidebar-main + # _libs + - scope: + path : "" + type : libs + values: + layout : page-lib + share : true + classes : wide + sidebar: + main : true + nav : sidebar-main + # _projects + - scope: + path : "" + type : projects + values: + layout : page-project + share : true + classes : wide + sidebar: + main : true + nav : sidebar-main + # _eso + - scope: + path : "" + type : eso + values: + layout : page-eso + share : true + classes : wide + sidebar: + main : true + nav : sidebar-main + # _books + - scope: + path : "" + type : books + values: + layout : page-book + share : true + classes : wide + sidebar: + main : true + nav : sidebar-main + +# Plugins +plugins: + - jemoji + - jekyll-avatar + - jekyll-coffeescript + - jekyll-commonmark-ghpages + - jekyll-default-layout + - jekyll-feed + - jekyll-gist + - jekyll-github-metadata + - jekyll-include-cache + - jekyll-mentions + - jekyll-optional-front-matter + - jekyll-paginate + - jekyll-readme-index + - jekyll-redirect-from + - jekyll-relative-links + - jekyll-remote-theme + - jekyll-sass-converter + - jekyll-seo-tag + - jekyll-sitemap + - jekyll-titles-from-headings + +## jekyll-commonmark-ghpages +commonmark: + options : ["SMART", "FOOTNOTES"] + extensions : ["strikethrough", "autolink", "table", "tagfilter"] + +## jekyll-mentions +jekyll-mentions: + base_url : "https://twitter.com" + +## jekyll-paginate +paginate : 1 + +## jekyll-remote-theme +remote_theme : twocolumn/minimal-mistakes@gh-pages + +## jekyll-seo-tag +title : "⚡WriteOnly.pl" +tagline : "WriteOnly Haskell, Scala, Jekyll, Git & Bash Blog" +description: >- + Blog o programowaniu w językach Haskell, Scala Native i Scala.js + oraz generatorze stron Jekyll, systemie kontroli wersji Git i użyciu wiersza poleceń CLI +url : +author: + twitter : "TheKamilAdam" + name : "Kamil Adam" + avatar : "/assets/images/kamil.adam.jpg" + bio : "Senior Java/Scala/Kotlin Developer" +twitter: + username : "TheKamilAdam" +facebook: +logo : "/favicon-32x32.png" +social: + name : "Kamil Adam" + links: + - https://github.com/writeonly + - https://www.linkedin.com/company/writeonly-pl + - https://www.facebook.com/WriteOnlyPL + - https://www.instagram.com/degustujacaistota/ + - https://twitter.com/TheKamilAdam + - https://www.tumblr.com/blog/thekamiladam + - https://www.reddit.com/user/WriteOnlyPL + - https://dev.to/kamiladam + +# External systems + +## Compress HTML +compress_html: + clippings : all + comments : all + endings : all + profile : false + startings : [html, head, body] + +## Analytics +analytics: + provider : "google-gtag" + google: + tracking_id : "UA-136426906-1" + anonymize_ip : false + +## Comments +comments: + provider : "disqus-follow" + disqus: + shortname : "writeonly-pl" + +## Search +search : follow +search_follow : true +search_full_content : true +#search_provider : "search-jekyll" +search_provider : "google" +google: + search_engine_id : "bf18084b82c20452c" + instant_search : false # false (default), true + search_instant : true # false (default), true + +ad_sense: + ad_sense_id : "ca-pub-8978320289517812" + all : false + +web_vitals : false + +## Social Sharing +og_image : "/favocon.ico" +footer: + links: + - label : "GitHub" + icon : "fab fa-fw fa-github" + url : "https://github.com/writeonly" + - label : "Linkedin" + icon : "fab fa-fw fa-linkedin" + url : "https://www.linkedin.com/company/writeonly-pl/" + - label : "Facebook" + icon : "fab fa-fw fa-facebook" + url : "https://www.facebook.com/WriteOnlyPL" + - label : "Instagram" + icon : "fab fa-fw fa-instagram" + url : "https://instagram.com/degustujacaistota" + - label : "Twitter" + icon : "fab fa-fw fa-twitter" + url : "https://twitter.com/TheKamilAdam" + - label : "Tumblr" + icon : "fab fa-fw fa-tumblr" + url : "https://writeonly-pl.tumblr.com" + - label : "Reddit" + icon : "fab fa-fw fa-reddit" + url : "https://www.reddit.com/user/WriteOnlyPL" + - label : "Dev.to" + icon : "fab fa-fw fa-dev" + url : "https://dev.to/kamiladam" + +# Theme settings +locale : "pl-PL" + +masthead_title : "Blog o programowaniu w językach Haskell, Scala Native i Scala.js" +subtitle : "oraz generatorze stron Jekyll, systemie kontroli wersji Git i użyciu wiersza poleceń CLI" +email : "kamil.adam.zabinski@gmail.com" + +repository : "writeonly/writeonly.github.io" +twitter_username : "TheKamilAdam" +github_username : "kamil-adam" + +minimal_mistakes_skin : "gold" +breadcrumbs : true +words_per_minute : 100 + +critical_css : true + +## Scripts +scripts: + - https://code.jquery.com/jquery-3.5.1.slim.min.js + - /assets/js/first.min.js + +## Font Awesome +fontawesome: + use : js # "sass", "js" + solid : true + regular : true + brands : true +## Archives category_archive: - type: liquid - path: /categories/ + type : collection + path : /categories/ tag_archive: - type: liquid - path: /tags/ + type : collection + path : /tags/ From 278526b96a05f6a6650e6f1c49d617c73241bd0f Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Tue, 8 Dec 2020 16:28:59 +0100 Subject: [PATCH 016/160] Add eso --- _collections/_eso/eso-c.html | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 _collections/_eso/eso-c.html diff --git a/_collections/_eso/eso-c.html b/_collections/_eso/eso-c.html new file mode 100644 index 00000000..3ef1049e --- /dev/null +++ b/_collections/_eso/eso-c.html @@ -0,0 +1,5 @@ +--- +eso: eso-c +title: Eso C +tags: eso-c +--- From da185ec81e791461bb9a657e590aa221725ca659 Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Sun, 10 May 2020 20:02:24 +0200 Subject: [PATCH 017/160] Add books --- _collections/_books/bdd-w-dzialaniu.html | 10 ++++++++++ .../bootstrap-4-dla-zaawansowanych.html | 10 ++++++++++ ...strap-tworzenie-interfejsow-stron-www.html | 9 +++++++++ ...tworzenie-wlasnych-stylow-graficznych.html | 9 +++++++++ _collections/_books/czysta-architektura.html | 8 ++++++++ _collections/_books/czysty-kod.html | 8 ++++++++ .../ddd-dla-architektow-oprogramowania.html | 9 +++++++++ _collections/_books/ddd.html | 9 +++++++++ _collections/_books/docker-dla-praktykow.html | 11 ++++++++++ ...amowanie-aplikacji-dla-zaawansowanych.html | 10 ++++++++++ _collections/_books/domain-driven-design.html | 9 +++++++++ .../_books/f-4-0-dla-zaawansowanych.html | 11 ++++++++++ _collections/_books/fpmortals.html | 12 +++++++++++ _collections/_books/google-app-engine.html | 10 ++++++++++ _collections/_books/hibernate-search.html | 10 ++++++++++ .../_books/java-programowanie-funkcyjne.html | 9 +++++++++ _collections/_books/jquery.html | 10 ++++++++++ _collections/_books/junit.html | 10 ++++++++++ _collections/_books/kotlin-w-akcji.html | 10 ++++++++++ ...-inzynierii-oprogramowania-wydanie-ii.html | 15 ++++++++++++++ _collections/_books/mistrz-czystego-kodu.html | 8 ++++++++ _collections/_books/nosql-newsql-bigdata.html | 8 ++++++++ .../_books/pragmatyczny-programista.html | 9 +++++++++ ...programowanie-funkcyjne-krok-po-kroku.html | 9 +++++++++ .../_books/programowanie-funkcyjne.html | 9 +++++++++ .../programowanie-w-jezyku-clojure.html | 10 ++++++++++ .../_books/programowanie-w-jezyku-rust.html | 10 ++++++++++ ...lepszanie-struktury-istniejacego-kodu.html | 20 +++++++++++++++++++ _collections/_books/rest.html | 10 ++++++++++ .../_books/scala-nauka-programowania.html | 9 +++++++++ _collections/_books/selenium.html | 10 ++++++++++ _collections/_books/spark.html | 13 ++++++++++++ ...interpretacja-programow-komputerowych.html | 13 ++++++++++++ _collections/_books/tdd.html | 11 ++++++++++ .../testuj-oprogramowanie-jak-google.html | 10 ++++++++++ .../zwinne-wytwarzanie-oprogramowania.html | 8 ++++++++ 36 files changed, 366 insertions(+) create mode 100644 _collections/_books/bdd-w-dzialaniu.html create mode 100644 _collections/_books/bootstrap-4-dla-zaawansowanych.html create mode 100644 _collections/_books/bootstrap-tworzenie-interfejsow-stron-www.html create mode 100644 _collections/_books/bootstrap-tworzenie-wlasnych-stylow-graficznych.html create mode 100644 _collections/_books/czysta-architektura.html create mode 100644 _collections/_books/czysty-kod.html create mode 100644 _collections/_books/ddd-dla-architektow-oprogramowania.html create mode 100644 _collections/_books/ddd.html create mode 100644 _collections/_books/docker-dla-praktykow.html create mode 100644 _collections/_books/docker-programowanie-aplikacji-dla-zaawansowanych.html create mode 100644 _collections/_books/domain-driven-design.html create mode 100644 _collections/_books/f-4-0-dla-zaawansowanych.html create mode 100644 _collections/_books/fpmortals.html create mode 100644 _collections/_books/google-app-engine.html create mode 100644 _collections/_books/hibernate-search.html create mode 100644 _collections/_books/java-programowanie-funkcyjne.html create mode 100644 _collections/_books/jquery.html create mode 100644 _collections/_books/junit.html create mode 100644 _collections/_books/kotlin-w-akcji.html create mode 100644 _collections/_books/legendarny-osobomiesiac-opowiesci-o-inzynierii-oprogramowania-wydanie-ii.html create mode 100644 _collections/_books/mistrz-czystego-kodu.html create mode 100644 _collections/_books/nosql-newsql-bigdata.html create mode 100644 _collections/_books/pragmatyczny-programista.html create mode 100644 _collections/_books/programowanie-funkcyjne-krok-po-kroku.html create mode 100644 _collections/_books/programowanie-funkcyjne.html create mode 100644 _collections/_books/programowanie-w-jezyku-clojure.html create mode 100644 _collections/_books/programowanie-w-jezyku-rust.html create mode 100644 _collections/_books/refaktoryzacja-ulepszanie-struktury-istniejacego-kodu.html create mode 100644 _collections/_books/rest.html create mode 100644 _collections/_books/scala-nauka-programowania.html create mode 100644 _collections/_books/selenium.html create mode 100644 _collections/_books/spark.html create mode 100644 _collections/_books/structura-i-interpretacja-programow-komputerowych.html create mode 100644 _collections/_books/tdd.html create mode 100644 _collections/_books/testuj-oprogramowanie-jak-google.html create mode 100644 _collections/_books/zwinne-wytwarzanie-oprogramowania.html diff --git a/_collections/_books/bdd-w-dzialaniu.html b/_collections/_books/bdd-w-dzialaniu.html new file mode 100644 index 00000000..fff4ba13 --- /dev/null +++ b/_collections/_books/bdd-w-dzialaniu.html @@ -0,0 +1,10 @@ +--- +title-shortcut: 'BDD w działaniu' +title: 'BDD w działaniu. Sterowanie zachowaniem w rozwoju aplikacji' +title-of-original: "BDD in Action: Behavior-Driven Development for the whole software lifecycle" +year-of-publishment: 2015 +authors: + - 'John Ferguson Smart' +langs: java +tags: bdd +--- diff --git a/_collections/_books/bootstrap-4-dla-zaawansowanych.html b/_collections/_books/bootstrap-4-dla-zaawansowanych.html new file mode 100644 index 00000000..6aca159a --- /dev/null +++ b/_collections/_books/bootstrap-4-dla-zaawansowanych.html @@ -0,0 +1,10 @@ +--- +title-shortcut: 'Bootstrap 4 dla zaawansowanych' +title: 'Bootstrap 4 dla zaawansowanych. Jak pisać znakomite aplikacje internetowe. Wydanie II' +title-of-original: "Mastering Bootstrap 4 – Second Edition" +year-of-publishment: 2018 +authors: + - 'Benjamin Jakobus' + - 'Jason Marah' +libs: bootstrap +--- diff --git a/_collections/_books/bootstrap-tworzenie-interfejsow-stron-www.html b/_collections/_books/bootstrap-tworzenie-interfejsow-stron-www.html new file mode 100644 index 00000000..58a340c0 --- /dev/null +++ b/_collections/_books/bootstrap-tworzenie-interfejsow-stron-www.html @@ -0,0 +1,9 @@ +--- +title-shortcut: 'Bootstrap. Tworzenie interfejsow stron www' +title: 'Bootstrap. Tworzenie interfejsow stron www. Technologia na start' +title-of-original: "Jump Start Bootstrap" +year-of-publishment: 2014 +authors: + - 'Syed Fazle Rahman' +libs: bootstrap +--- diff --git a/_collections/_books/bootstrap-tworzenie-wlasnych-stylow-graficznych.html b/_collections/_books/bootstrap-tworzenie-wlasnych-stylow-graficznych.html new file mode 100644 index 00000000..065b19bc --- /dev/null +++ b/_collections/_books/bootstrap-tworzenie-wlasnych-stylow-graficznych.html @@ -0,0 +1,9 @@ +--- +title-shortcut: 'Bootstrap. Tworzenie własnych stylów graficznych' +title: 'Bootstrap. Tworzenie własnych stylów graficznych' +title-of-original: "Bootstrap. Tworzenie własnych stylów graficznych" +year-of-publishment: 2017 +authors: + - 'Radosław Gryczan' +libs: bootstrap +--- diff --git a/_collections/_books/czysta-architektura.html b/_collections/_books/czysta-architektura.html new file mode 100644 index 00000000..eb61aa9f --- /dev/null +++ b/_collections/_books/czysta-architektura.html @@ -0,0 +1,8 @@ +--- +title-shortcut: 'Czysta Architektura' +title: 'Czysta architektura. Struktura i design oprogramowania. Przewodnik dla profesjonalistów' +title-of-original: "Clean Architecture: A Craftsman's Guide to SoftwareStructure and Design (Robert C. Martin Series)" +year-of-publishment: 2018 +authors: + - 'Robert C. Martin' +--- diff --git a/_collections/_books/czysty-kod.html b/_collections/_books/czysty-kod.html new file mode 100644 index 00000000..28f64cd4 --- /dev/null +++ b/_collections/_books/czysty-kod.html @@ -0,0 +1,8 @@ +--- +title-shortcut: 'Czysty kod' +title: 'Czysty kod. Podręcznik dobrego programisty' +title-of-original: "Clean Code: A Handbook of Agile Software Craftsmanship" +year-of-publishment: 2009 +authors: + - 'Robert C. Martin' +--- diff --git a/_collections/_books/ddd-dla-architektow-oprogramowania.html b/_collections/_books/ddd-dla-architektow-oprogramowania.html new file mode 100644 index 00000000..b6f92944 --- /dev/null +++ b/_collections/_books/ddd-dla-architektow-oprogramowania.html @@ -0,0 +1,9 @@ +--- +title-shortcut: 'DDD dla architektów oprogramowania' +title: 'DDD dla architektów oprogramowania' +title-of-original: "Implementing Domain-Driven Design" +year-of-publishment: 2013 +authors: + - 'Vaughn Vernon' +tags: ddd +--- diff --git a/_collections/_books/ddd.html b/_collections/_books/ddd.html new file mode 100644 index 00000000..017edc92 --- /dev/null +++ b/_collections/_books/ddd.html @@ -0,0 +1,9 @@ +--- +title-shortcut: 'DDD' +title: 'DDD. Kompendium wiedzy' +title-of-original: "Domain-Driven Design Distilled" +year-of-publishment: 2016 +authors: + - 'Vaughn Vernon' +tags: ddd +--- diff --git a/_collections/_books/docker-dla-praktykow.html b/_collections/_books/docker-dla-praktykow.html new file mode 100644 index 00000000..0d8b3ab3 --- /dev/null +++ b/_collections/_books/docker-dla-praktykow.html @@ -0,0 +1,11 @@ +--- +title-shortcut: 'Docker dla praktyków' +title: 'Docker dla praktyków. Wydanie II' +title-of-original: "Learning Docker - Second Edition" +year-of-publishment: 2017 +authors: +- 'Jeeva S. Chelladhurai' +- 'Vinod Singh' +- 'Pethuru Raj' +tags: docker +--- diff --git a/_collections/_books/docker-programowanie-aplikacji-dla-zaawansowanych.html b/_collections/_books/docker-programowanie-aplikacji-dla-zaawansowanych.html new file mode 100644 index 00000000..7f059fc5 --- /dev/null +++ b/_collections/_books/docker-programowanie-aplikacji-dla-zaawansowanych.html @@ -0,0 +1,10 @@ +--- +title-shortcut: 'Docker. Programowanie aplikacji dla zaawansowanych' +title: 'Docker. Programowanie aplikacji dla zaawansowanych. Wydanie II' +title-of-original: "Mastering Docker - Second Edition" +year-of-publishment: 2017 +authors: +- 'Russ McKendrick' +- 'Scott Gallagher' +tags: docker +--- diff --git a/_collections/_books/domain-driven-design.html b/_collections/_books/domain-driven-design.html new file mode 100644 index 00000000..e0cf6519 --- /dev/null +++ b/_collections/_books/domain-driven-design.html @@ -0,0 +1,9 @@ +--- +title-shortcut: 'Domain-Driven Design' +title: 'Domain-Driven Design. Zapanuj nad złożonym systemem informatycznym' +title-of-original: "Domain-Driven Design: Tackling Complexity in the Heart of Software" +year-of-publishment: 2004 +authors: + - 'Eric Evans' +tags: ddd +--- diff --git a/_collections/_books/f-4-0-dla-zaawansowanych.html b/_collections/_books/f-4-0-dla-zaawansowanych.html new file mode 100644 index 00000000..02932796 --- /dev/null +++ b/_collections/_books/f-4-0-dla-zaawansowanych.html @@ -0,0 +1,11 @@ +--- +title-shortcut: 'F# 4.0 dla zaawansowanych' +title: 'F# 4.0 dla zaawansowanych. Wydanie IV' +title-of-original: "Expert F# 4.0, 4th Edition" +year-of-publishment: 2015 +authors: + - 'Don Syme' + - 'Adam Granicz' + - 'Antonio Cisternino' +langs: fsharp +--- diff --git a/_collections/_books/fpmortals.html b/_collections/_books/fpmortals.html new file mode 100644 index 00000000..2c4ad5e7 --- /dev/null +++ b/_collections/_books/fpmortals.html @@ -0,0 +1,12 @@ +--- +title-shortcut: 'FP dla dla Śmiertelników' +title: 'Programowanie Funkcyjne dla Śmiertelników ze Scalaz' +title-of-original: "Functional Programming for Mortals with Scalaz" +year-of-publishment: 2019 +authors: + - 'Sam Halliday' + - 'Wojciech Pituła' +langs: haskell scala +libs: scalaz +--- +Programowanie Funkcyjne dla Śmiertelników ze Scalaz \ No newline at end of file diff --git a/_collections/_books/google-app-engine.html b/_collections/_books/google-app-engine.html new file mode 100644 index 00000000..fa475638 --- /dev/null +++ b/_collections/_books/google-app-engine.html @@ -0,0 +1,10 @@ +--- +title-shortcut: 'Google App Engine' +title: 'Google App Engine. Kod w chmurze' +title-of-original: "Code in the Could" +year-of-publishment: 2011 +authors: + - 'Mark C. Chu-Carroll' +langs: java python +libs: gwt +--- diff --git a/_collections/_books/hibernate-search.html b/_collections/_books/hibernate-search.html new file mode 100644 index 00000000..2126b846 --- /dev/null +++ b/_collections/_books/hibernate-search.html @@ -0,0 +1,10 @@ +--- +title-shortcut: 'Hibernate Search' +title: 'Hibernate Search. Skuteczne wyszukiwanie' +title-of-original: "Hibernate Search by Example" +year-of-publishment: 2013 +authors: + - 'Steve Perkins' +langs: java +libs: hibernate +--- diff --git a/_collections/_books/java-programowanie-funkcyjne.html b/_collections/_books/java-programowanie-funkcyjne.html new file mode 100644 index 00000000..e023f978 --- /dev/null +++ b/_collections/_books/java-programowanie-funkcyjne.html @@ -0,0 +1,9 @@ +--- +title-shortcut: 'Java. Programowanie funkcyjne' +title: 'Java. Programowanie funkcyjne' +title-of-original: "Functional Programming in Java: How to improve your Java programs using functional techniques" +year-of-publishment: 2018 +authors: + - 'Pierre-Yves Saumont' +langs: java +--- diff --git a/_collections/_books/jquery.html b/_collections/_books/jquery.html new file mode 100644 index 00000000..d87de0be --- /dev/null +++ b/_collections/_books/jquery.html @@ -0,0 +1,10 @@ +--- +title-shortcut: 'jQuery' +title: 'jQuery. Kod doskonały' +title-of-original: "jQuery. Kod doskonały" +year-of-publishment: 2012 +authors: + - 'Peweł Mikołajewski' +langs: javascript +libs: jquery +--- diff --git a/_collections/_books/junit.html b/_collections/_books/junit.html new file mode 100644 index 00000000..80852230 --- /dev/null +++ b/_collections/_books/junit.html @@ -0,0 +1,10 @@ +--- +title-shortcut: 'JUnit' +title: 'Testowanie aplikacji Java za pomocą JUnit' +title-of-original: "Testowanie aplikacji Java za pomocą JUnit" +year-of-publishment: 2018 +authors: + - 'Radosław Sokół' +langs: java +libs: junit +--- diff --git a/_collections/_books/kotlin-w-akcji.html b/_collections/_books/kotlin-w-akcji.html new file mode 100644 index 00000000..baaf8b5e --- /dev/null +++ b/_collections/_books/kotlin-w-akcji.html @@ -0,0 +1,10 @@ +--- +title-shortcut: 'Kotlin w akcji' +title: 'Kotlin w akcji' +title-of-original: "Kotlin in Action" +year-of-publishment: 2017 +authors: + - 'Dmitry Jemerov' + - 'Svetlana Isakova' +langs: kotlin +--- diff --git a/_collections/_books/legendarny-osobomiesiac-opowiesci-o-inzynierii-oprogramowania-wydanie-ii.html b/_collections/_books/legendarny-osobomiesiac-opowiesci-o-inzynierii-oprogramowania-wydanie-ii.html new file mode 100644 index 00000000..597ffbbd --- /dev/null +++ b/_collections/_books/legendarny-osobomiesiac-opowiesci-o-inzynierii-oprogramowania-wydanie-ii.html @@ -0,0 +1,15 @@ +--- +title-shortcut: 'Legendarny osobomiesiąc' +title: 'Legendarny osobomiesiąc. Opowieści o inżynierii oprogramowania. Wydanie II' +title-of-original: "The Mythical Man-Month: Essays on Software Engineering, Anniversary Edition (2nd Edition)" +year-of-publishment: 1995 +authors: + - 'Frederick P. Brooks Jr.' +--- + + + + + + + diff --git a/_collections/_books/mistrz-czystego-kodu.html b/_collections/_books/mistrz-czystego-kodu.html new file mode 100644 index 00000000..8d56fbc2 --- /dev/null +++ b/_collections/_books/mistrz-czystego-kodu.html @@ -0,0 +1,8 @@ +--- +title-shortcut: 'Mistrz czystego kodu' +title: 'Mistrz czystego kodu. Kodeks postępowania profesjonalnych programistów' +title-of-original: "The Clean Coder: A Code of Conduct for Professional Programmers" +year-of-publishment: 2011 +authors: + - 'Robert C. Martin' +--- diff --git a/_collections/_books/nosql-newsql-bigdata.html b/_collections/_books/nosql-newsql-bigdata.html new file mode 100644 index 00000000..326cb7f0 --- /dev/null +++ b/_collections/_books/nosql-newsql-bigdata.html @@ -0,0 +1,8 @@ +--- +title-shortcut: 'NoSQL, NewSQL i BigData' +title: 'NoSQL, NewSQL i BigData. Bazy danych następnej generacji' +title-of-original: "Next Generation Databases: NoSQL and Big Data" +year-of-publishment: 2015 +authors: + - 'Guy Harrison' +--- diff --git a/_collections/_books/pragmatyczny-programista.html b/_collections/_books/pragmatyczny-programista.html new file mode 100644 index 00000000..bb8b053d --- /dev/null +++ b/_collections/_books/pragmatyczny-programista.html @@ -0,0 +1,9 @@ +--- +title-shortcut: 'Pragmatyczny programista' +title: 'Pragmatyczny programista. Od czeladnika do mistrza' +title-of-original: 'The Pragmatic Programmer. From Journeyman to Master' +year-of-publishment: 2010 +authors: + - 'Andrew Hunt' + - 'David Thomas' +--- diff --git a/_collections/_books/programowanie-funkcyjne-krok-po-kroku.html b/_collections/_books/programowanie-funkcyjne-krok-po-kroku.html new file mode 100644 index 00000000..f5b0f680 --- /dev/null +++ b/_collections/_books/programowanie-funkcyjne-krok-po-kroku.html @@ -0,0 +1,9 @@ +--- +title-shortcut: 'Programowanie funkcyjne. Krok po kroku' +title: 'Programowanie funkcyjne. Krok po kroku' +title-of-original: "Becoming Functional" +year-of-publishment: 2014 +authors: + - 'Joshua Backfield' +langs: java scala +--- diff --git a/_collections/_books/programowanie-funkcyjne.html b/_collections/_books/programowanie-funkcyjne.html new file mode 100644 index 00000000..548ee09c --- /dev/null +++ b/_collections/_books/programowanie-funkcyjne.html @@ -0,0 +1,9 @@ +--- +title-shortcut: 'Programowanie funkcyjne' +title: 'Programowanie funkcyjne. Poznaj Clojure Elixir Haskell Scala Swift' +title-of-original: "Functional Programming: A PragPub Anthology: Exploring Clojure, Elixir, Haskell, Scala, and Swift" +year-of-publishment: 2014 +authors: + - 'Swaine Michael' +langs: clojure elixir haskell scala swift +--- diff --git a/_collections/_books/programowanie-w-jezyku-clojure.html b/_collections/_books/programowanie-w-jezyku-clojure.html new file mode 100644 index 00000000..59bc86e0 --- /dev/null +++ b/_collections/_books/programowanie-w-jezyku-clojure.html @@ -0,0 +1,10 @@ +--- +title-shortcut: 'Programowanie w języku Clojure' +title: 'Programowanie w języku Clojure' +title-of-original: "Programming Clojure" +year-of-publishment: 2012 +authors: + - 'Stuart Halloway' + - 'Aaron Bedra' +langs: clojure +--- diff --git a/_collections/_books/programowanie-w-jezyku-rust.html b/_collections/_books/programowanie-w-jezyku-rust.html new file mode 100644 index 00000000..2abfe99a --- /dev/null +++ b/_collections/_books/programowanie-w-jezyku-rust.html @@ -0,0 +1,10 @@ +--- +title-shortcut: 'Programowanie w języku Rust' +title: 'Programowanie w języku Rust' +title-of-original: "The Rust Programming Language" +year-of-publishment: 2019 +authors: + - 'Klabnik Steve' + - 'Nichols Carol' +langs: rust +--- diff --git a/_collections/_books/refaktoryzacja-ulepszanie-struktury-istniejacego-kodu.html b/_collections/_books/refaktoryzacja-ulepszanie-struktury-istniejacego-kodu.html new file mode 100644 index 00000000..2f61c55b --- /dev/null +++ b/_collections/_books/refaktoryzacja-ulepszanie-struktury-istniejacego-kodu.html @@ -0,0 +1,20 @@ +--- +title-shortcut: 'Refaktoryzacja. Ulepszanie struktury istniejącego kodu' +title: 'Refaktoryzacja. Ulepszanie struktury istniejącego kodu' +title-of-original: "Refactoring: Improving the Design of Existing Code" +year-of-publishment: 1999 +authors: + - 'Martin Fowler' + - 'Kent Beck' + - 'John Brant' + - 'William Opdyke' + - 'Don Roberts' + - 'Erich Gamma' +--- + + + + + + + diff --git a/_collections/_books/rest.html b/_collections/_books/rest.html new file mode 100644 index 00000000..c7ccea9b --- /dev/null +++ b/_collections/_books/rest.html @@ -0,0 +1,10 @@ +--- +title-shortcut: 'REST' +title: 'REST. Najlepsze praktyki i wzorce w języku Java' +title-of-original: "RESTful Java Patterns and Best Practices" +year-of-publishment: 2015 +authors: + - 'Bhakti Mehta' +langs: java +tags: rest +--- diff --git a/_collections/_books/scala-nauka-programowania.html b/_collections/_books/scala-nauka-programowania.html new file mode 100644 index 00000000..133b560d --- /dev/null +++ b/_collections/_books/scala-nauka-programowania.html @@ -0,0 +1,9 @@ +--- +title-shortcut: 'Scala. Nauka programowania' +title: 'Scala. Nauka programowania' +title-of-original: "Learning Scala Programming" +year-of-publishment: 2018 +authors: + - 'Vikash Sharma' +langs: scala +--- diff --git a/_collections/_books/selenium.html b/_collections/_books/selenium.html new file mode 100644 index 00000000..f43b2b30 --- /dev/null +++ b/_collections/_books/selenium.html @@ -0,0 +1,10 @@ +--- +title-shortcut: 'Selenium' +title: 'Selenium. Automatyczne testowanie aplikacji' +title-of-original: "Selenium Essentials" +year-of-publishment: 2015 +authors: + - 'Prashanth' +langs: java +libs: selenium +--- diff --git a/_collections/_books/spark.html b/_collections/_books/spark.html new file mode 100644 index 00000000..a682d25b --- /dev/null +++ b/_collections/_books/spark.html @@ -0,0 +1,13 @@ +--- +title-shortcut: 'Spark' +title: 'Spark. Zaawansowana analiza danych' +title-of-original: "Advanced Analytics with Spark" +year-of-publishment: 2015 +authors: + - 'Sandy Ryza' + - 'Uri Laserson' + - 'Sean Owen' + - 'Josh Wills' +langs: scala +libs: spark +--- diff --git a/_collections/_books/structura-i-interpretacja-programow-komputerowych.html b/_collections/_books/structura-i-interpretacja-programow-komputerowych.html new file mode 100644 index 00000000..c84f05fc --- /dev/null +++ b/_collections/_books/structura-i-interpretacja-programow-komputerowych.html @@ -0,0 +1,13 @@ +--- +title-shortcut: 'Struktura i interpretacja programów komputerowych' +title: 'Struktura i interpretacja programów komputerowych. Klasyka informatyki' +title-of-original: "Structure and Interpretation of Computer Programs" +year-of-publishment: 1996 +authors: + - 'Harold Abelson' + - 'Gerald Jay Sussman' + - 'Julie Sussman' +langs: lisp scheme +redirect_from: + - books/sicp +--- diff --git a/_collections/_books/tdd.html b/_collections/_books/tdd.html new file mode 100644 index 00000000..918ad29f --- /dev/null +++ b/_collections/_books/tdd.html @@ -0,0 +1,11 @@ +--- +title-shortcut: 'TDD' +title: 'TDD. Programowanie w Javie sterowanie testami' +title-of-original: "Test-Driven Java Development" +year-of-publishment: 2015 +authors: + - 'Viktor Farcic' + - 'Alex Garcia' +langs: java +libs: junit +--- diff --git a/_collections/_books/testuj-oprogramowanie-jak-google.html b/_collections/_books/testuj-oprogramowanie-jak-google.html new file mode 100644 index 00000000..f929de0c --- /dev/null +++ b/_collections/_books/testuj-oprogramowanie-jak-google.html @@ -0,0 +1,10 @@ +--- +title-shortcut: 'Testuj oprogramowanie jak Google' +title: 'Testuj oprogramowanie jak Google. Metody automatyzacji' +title-of-original: "How Google Tests Software" +year-of-publishment: 2012 +authors: + - 'James A. Whittaker' + - 'Jason Arbon' + - 'Jeff Carollo' +--- diff --git a/_collections/_books/zwinne-wytwarzanie-oprogramowania.html b/_collections/_books/zwinne-wytwarzanie-oprogramowania.html new file mode 100644 index 00000000..93d58d1a --- /dev/null +++ b/_collections/_books/zwinne-wytwarzanie-oprogramowania.html @@ -0,0 +1,8 @@ +--- +title-shortcut: 'Zwinne wytwarzanie oprogramowania' +title: 'Zwinne wytwarzanie oprogramowania. Najlepsze zasady, wzorce i praktyki' +title-of-original: "Agile Software Development, principles, Patterns and Practices" +year-of-publishment: 2003 +authors: + - 'Robert C. Martin' +--- From 2c1a0f81044464889f63f923a8a9ebee79adc661 Mon Sep 17 00:00:00 2001 From: Kamil Adam Date: Sun, 10 May 2020 20:01:43 +0200 Subject: [PATCH 018/160] Add langs --- _collections/_langs/agda.html | 10 ++ _collections/_langs/ams-js.html | 5 + _collections/_langs/awk.html | 17 ++++ _collections/_langs/ceylon.html | 16 +++ _collections/_langs/clojure.html | 52 ++++++++++ _collections/_langs/coffeescript.html | 21 ++++ _collections/_langs/common-lisp.html | 35 +++++++ _collections/_langs/coq.html | 13 +++ _collections/_langs/crystal.html | 19 ++++ _collections/_langs/dart.html | 16 +++ _collections/_langs/dc.html | 5 + _collections/_langs/eiffel.html | 13 +++ _collections/_langs/elixir.html | 19 ++++ _collections/_langs/elm.html | 33 +++++++ _collections/_langs/emacs-lisp.html | 20 ++++ _collections/_langs/erlang.html | 13 +++ _collections/_langs/eta.html | 41 ++++++++ _collections/_langs/forth.html | 5 + _collections/_langs/frege.html | 20 ++++ _collections/_langs/fsharp.html | 16 +++ _collections/_langs/genie.html | 13 +++ _collections/_langs/go.html | 16 +++ _collections/_langs/hamler.html | 15 +++ _collections/_langs/haskell.html | 85 ++++++++++++++++ _collections/_langs/idris.html | 23 +++++ _collections/_langs/java.html | 5 + _collections/_langs/javascript.html | 7 ++ _collections/_langs/joy.html | 13 +++ _collections/_langs/julia.html | 13 +++ _collections/_langs/kotlin.html | 26 +++++ _collections/_langs/lisp.html | 29 ++++++ _collections/_langs/livescript.html | 18 ++++ _collections/_langs/lua.html | 22 +++++ _collections/_langs/meta-language.html | 48 +++++++++ _collections/_langs/mouse.html | 10 ++ _collections/_langs/ocaml.html | 55 +++++++++++ _collections/_langs/perl.html | 22 +++++ _collections/_langs/pony.html | 23 +++++ _collections/_langs/postscript.html | 10 ++ _collections/_langs/prolog.html | 27 +++++ _collections/_langs/purescript.html | 21 ++++ _collections/_langs/python.html | 16 +++ _collections/_langs/racket.html | 19 ++++ _collections/_langs/reasonml.html | 35 +++++++ _collections/_langs/rpl.html | 5 + _collections/_langs/ruby.html | 22 +++++ _collections/_langs/rust.html | 22 +++++ _collections/_langs/sather.html | 13 +++ _collections/_langs/scala.html | 32 ++++++ _collections/_langs/scheme.html | 131 +++++++++++++++++++++++++ _collections/_langs/smalltalk.html | 32 ++++++ _collections/_langs/standard-ml.html | 22 +++++ _collections/_langs/tcl.html | 25 +++++ _collections/_langs/typed-clojure.html | 13 +++ _collections/_langs/typed-racket.html | 10 ++ _collections/_langs/typescript.html | 21 ++++ _collections/_langs/vala.html | 16 +++ _collections/_langs/webassembly.html | 7 ++ _collections/_langs/zig.html | 5 + 59 files changed, 1336 insertions(+) create mode 100644 _collections/_langs/agda.html create mode 100644 _collections/_langs/ams-js.html create mode 100644 _collections/_langs/awk.html create mode 100644 _collections/_langs/ceylon.html create mode 100644 _collections/_langs/clojure.html create mode 100644 _collections/_langs/coffeescript.html create mode 100644 _collections/_langs/common-lisp.html create mode 100644 _collections/_langs/coq.html create mode 100644 _collections/_langs/crystal.html create mode 100644 _collections/_langs/dart.html create mode 100644 _collections/_langs/dc.html create mode 100644 _collections/_langs/eiffel.html create mode 100644 _collections/_langs/elixir.html create mode 100644 _collections/_langs/elm.html create mode 100644 _collections/_langs/emacs-lisp.html create mode 100644 _collections/_langs/erlang.html create mode 100644 _collections/_langs/eta.html create mode 100644 _collections/_langs/forth.html create mode 100644 _collections/_langs/frege.html create mode 100644 _collections/_langs/fsharp.html create mode 100644 _collections/_langs/genie.html create mode 100644 _collections/_langs/go.html create mode 100644 _collections/_langs/hamler.html create mode 100644 _collections/_langs/haskell.html create mode 100644 _collections/_langs/idris.html create mode 100644 _collections/_langs/java.html create mode 100644 _collections/_langs/javascript.html create mode 100644 _collections/_langs/joy.html create mode 100644 _collections/_langs/julia.html create mode 100644 _collections/_langs/kotlin.html create mode 100644 _collections/_langs/lisp.html create mode 100644 _collections/_langs/livescript.html create mode 100644 _collections/_langs/lua.html create mode 100644 _collections/_langs/meta-language.html create mode 100644 _collections/_langs/mouse.html create mode 100644 _collections/_langs/ocaml.html create mode 100644 _collections/_langs/perl.html create mode 100644 _collections/_langs/pony.html create mode 100644 _collections/_langs/postscript.html create mode 100644 _collections/_langs/prolog.html create mode 100644 _collections/_langs/purescript.html create mode 100644 _collections/_langs/python.html create mode 100644 _collections/_langs/racket.html create mode 100644 _collections/_langs/reasonml.html create mode 100644 _collections/_langs/rpl.html create mode 100644 _collections/_langs/ruby.html create mode 100644 _collections/_langs/rust.html create mode 100644 _collections/_langs/sather.html create mode 100644 _collections/_langs/scala.html create mode 100644 _collections/_langs/scheme.html create mode 100644 _collections/_langs/smalltalk.html create mode 100644 _collections/_langs/standard-ml.html create mode 100644 _collections/_langs/tcl.html create mode 100644 _collections/_langs/typed-clojure.html create mode 100644 _collections/_langs/typed-racket.html create mode 100644 _collections/_langs/typescript.html create mode 100644 _collections/_langs/vala.html create mode 100644 _collections/_langs/webassembly.html create mode 100644 _collections/_langs/zig.html diff --git a/_collections/_langs/agda.html b/_collections/_langs/agda.html new file mode 100644 index 00000000..30c0dee8 --- /dev/null +++ b/_collections/_langs/agda.html @@ -0,0 +1,10 @@ +--- +lang: agda +title: Agda +description: +--- +