10 września 2019

C# - samouczek, część III - proste typy zmiennych i po co komu te cholerne zmienne.

Zacznijmy od tego, czym jest zmienna. Otóż zmienna jest odnośnikiem do pamięci, który akurat przechowuje dane mogące nam się z różnych przyczyn przydać. Mówiąc bardziej po ludzku - to takie nasze myślowe pudełko i jak to z pudełkami bywa, można coś do niego włożyć, przechować i wyjąć gdy będzie potrzebne. Można też gdzieś wysłać gdy jest taka potrzeba. 


Czym są więc typy zmiennych? Typ zmiennych mówi nam jak program ma interpretować dane, które w tej pamięci siedzą. Nie jest wiedzą tajemną, że każda informacja jaką nasz komputer w sobie przechowuje ma postać cyfrową - najczęściej zer i jedynek, natomiast zmienne pozwalają nam zinterpretować te liczby bądź jako ciąg znaków, bądź liczbę, bądź odpowiedź na pytanie o życie wszechświat i całą resztę (nawiasem mówiąc - to 42). 

W przypadku C# powinniśmy sami określać jaki rodzaj danych mają nasze zmienne (i chociaż da się to trochę obejść, to strasznie utrudnia to poprawianie kodu, który zawiera błędy logiczne), co (wracając do pudełkowej analogii) znowuż możemy sobie wyobrazić jako te nieszczęsne styropianowe wkładki, które powodują, że do naszego pudełka włazi tylko jeden konkretny produkt. Niestety tutaj przydatność pudełka jako analogii kompletnie się kończy, ponieważ ze zmiennymi możemy zrobić kilka sztuczek, które nie udadzą się z żadnym kartonikiem, dlatego zacznijmy już nasz krótki przegląd zmiennych. 

Typy całkowite. 

Typy całkowite pozwalają nam przechowywać liczby całkowite. Ponieważ informację o tym, jak wygląda liczba całkowita większość z nas zdążyła zapomnieć gdzieś w 4 klasie szkoły podstawowej przypomnę, że to po prostu liczba, która nie posiada części ułamkowej. 

Najprostszym typem całkowitym jest byte i jego koleżka sbyte (w C# wielkość liter ma znaczenie, więc aby uniknąć konfliktu z moim edytorem tekstu będę się starał nazwy pisane małą literą umieszczać gdzieś w środku zdania). Jak już sama nazwa wskazuje zajmują w naszej cennej pamięci dokładnie jeden, ośmiobitowy bajt (bajty nie zawsze muszą być ośmiobitowe, choć takie się najczęściej stosuje). Nasuwa się pytanie, czym więc się różnią? Literka “s” w sbyte bierze się od angielskiego “signed”, co w tym wypadku oznacza “ze znakiem”. Dzięki temu sbyte umożliwia nam zapisanie liczby ze znakiem. Pierwszy bit zużyjemy więc na opisanie czy nasza liczba jest dodatnia, czy ujemna, zostanie nam więc jeszcze 7 bitów do zapisania liczby. Każdy bit może przyjąć dwa stany - zero lub jeden, a więc możemy zapisać na nim 2 do 7 kombinacji czyli 128. Jedna kombinacja odpada nam na zapisanie liczby zero, dlatego maksimum jakie możemy zapisać to 127. Ponieważ zero nie ma znaku (komputery jednakże dla ułatwienia przyjmują zero za dodatnie), to dla zakresu liczb ujemnych nic nie musimy zabierać i zostaje nam 128 kombinacji. Dlatego pełny zakres sbyte to od -128 przez 0 do 127. Dla odmiany byte nie przechowuje żadnej informacji o znaku i każdą liczbę zapisaną w tym typie zmiennych traktuje jako dodatnią. Mamy więc do dyspozycji 8 bitów, a więc 2 do 8 potęgi kombinacji, czyli 256, minus jedna kombinacja na zapisanie liczby zero. Daje nam to zakres od 0 do 255. 

Przebrnęliśmy jakoś przez te najprostsze typy, ale zasada co do zakresu jest zawsze podobna. I tak przechodząc do zmiennych całkowitych szesnastobitowych mamy short i ushort. Zderzamy się tutaj z rzeczą bardzo, bardzo często spotykaną w wielu językach programowania. Jest ona straszna i czasem doprowadza do białej gorączki - niekonsekwencja. Tym razem ktoś wymyślił, żeby lepiej nie dodawać dodatkowej literki “s” przed nazwą typu który może być ujemny. Zdecydowano dodać “u” od “unsigned” (czyli "bez znaku") przed typem, który nie może ujemny (chociaż tak naprawdę to byte jest tutaj czarną owcą). Reszta podobnie - w short 1 bit na znak, 15 na liczbę co daje nam zakres od -32768 przez 0 do 32767. W ushort wykorzystujemy pełne 16 bitów co daje nam do dyspozycji zakres od 0 65535. 

Następne w kolejności zmienne 32 bitowe to ulubiony przez wszystkich int i jego rzadziej stosowany brat uint. Podobnie jak poprzednio dla int dysponujemy 31 bitami na liczbę plus jeden na znak, co daje nam dość konkretny już zakres od -2 147 483 648 do 2 147 483 647 (z zerem włącznie) i nie mniej poważny dla uint od 0 do 4 294 967 295. 

Na koniec zostają nam już tylko 64-bitowe potwory long i ulong. W pierwszej zapiszemy liczby od -9 223 372 036 854 775 808 do 9 223 372 036 854 775 807, a w drugiej nie mniej poważny zakres od 0 do 18 446 744 073 709 551 615. Są to już naprawdę poważne liczby, ale mimo to mogą się okazać za małe, niestety aby wykroczyć poza nie trzeba już złożonych typów danych i raczej nie planuję poruszać tego tematu w tym samouczku. 

Typy zmiennoprzecinkowe 

Nie samymi jednak liczbami całkowitymi człowiek żyje i czasem musi popełnić jakiś ułamek. Aby uporać się z tym zadaniem wymyślono typy zmiennoprzecinkowe i tej nazwy raczej nie pamiętacie z matematyki, a to dlatego, że to nie to samo co liczby rzeczywiste poznane w szkole. Generalnie rozchodzi się o sposób zapisu w tzw. notacji naukowej. Gdzie np 125,68 zapiszemy jako 1,2568*10^2.

Zapis bitowy liczby zmiennoprzecinkowej to generalnie koszmar, ale warto mieć w pamięci, że ponieważ bity przyjmują tylko dwa stany wszystko rozchodzi się o podnoszenie dwójki do odpowiedniej potęgi. Z ułamkami jest podobnie, tylko jako podstawę przyjmujemy nie 2, a ½ (czyli 2 do -1) i sumujemy ułamki, aż wyjdzie mniej więcej to co trzeba. Im więcej mamy tych ułamków do dyspozycji tym dokładniej będzie opisana nasza liczba. Niestety trudności sprawiają już nawet bardzo nieskomplikowane liczby jak np. ⅕. W zapisie dwójkowym to by było mniej więcej tak: 0 * ½ + 0 * ¼ + 1*⅛ + 1*1/16 = 3/16 ~ ⅕. Im więcej wstawię ułamków, tym bliżej będę pożądanej wartości, ale nigdy jej w 100% nie osiągnę i zawsze gdzieś pojawi się to nieszczęsne zaokrąglenie. Dlatego w ich przypadku istotniejsza jest precyzja zapisu (więcej ułamków) niż zakres. To wszystko jednak nie wyjaśnia dlaczego te liczby nazywają się zmiennoprzecinkowymi - otóż samo zapisanie ułamka to nie wszystko. W końcu liczby rzeczywiste nie ograniczają się do zakresu od 0 do 1. Aby problem rozwiązać, a sprawy nieco skomplikować znowu musimy gdzieś dorzucić bit znaku, a i jeszcze trzeba by zapisać część całkowitą no i gdzieś przechować wykładnik potęgi… Krótko mówiąc koszmar i tyle. 

Mając jednak to wszystko na uwadze trzeba pamiętać, że liczby zmiennoprzecinkowe są prawie zawsze obarczone pewnym błędem i wiele wielu operacji na tych samych zmiennych tylko sprawę pogarsza. 

Wracając jednak do meritum w C# znajdziemy trzy podstawowe typy zmiennych zmiennoprzecinkowych:
float o zakresie od ±1.5 x 10^(−45) do ±3.4 x 10^(38) i dokładności ~6-9 cyfr
double dające od ±5.0 x 10^(−324) do ±1.7 x 10^(308) i dokładności 15-17 cyfr
decimal w zakresie od ±1.0 x 10^(-28) do ±7.9228 x 10^28 i dokładności 28-29 cyfr

Ponieważ w pamięci komputera zapis tych liczb jest bardzo różny w kodzie musimy podawać jakim dokładnie typem się posługujemy. Aby więc pomóc kompilatorowi rozróżnić jakiego typu jest liczba 0.1 dodajemy na jej końcu odpowiednie literki: f lub F dla float, d lub D (albo po prostu liczbę z kropeczką) dla double i aby dobrze nam się kojarzyło z mamoną - m lub M dla decimal.

Których więc używać? Najszybsze są zmienne typu float, ale też najmniej dokładne. Najdokładniejsze są zmienne typu decimal i z tego tytułu zalecane jest ich używanie przy obliczeniach finansowych, ale ze względu na rozmiar operacje na nich są najwolniejsze - no i za ich pomocą można przechować najmniejsze liczby. Złotym środkiem jest double, który daje średni czas operacji, niezłą dokładność i największy zakres. Niestety oficjalna dokumentacja milczy na temat ilości zajmowanej pamięci przez poszczególne typy, nie mniej jednak należy założyć, że im większa precyzja, tym większy rozmiar. Najprawdopodobniej jednak mamy 32 bity na float, 64 na double i 128 na decimal

Typ znakowy. 

I na koniec bliski koleżka typu byte czyli char. Podobnie jak on zajmuje w pamięci 1 bajt, ale jest interpretowany nie jako liczba, a jako znak. Dokładniej pojedynczy, niesformatowany znak z rozszerzonego zakresu ASCII. Same w sobie używane dosyć rzadko, ale za to nieocenione, gdy weźmie się stadko takich znaków i ułoży z nich napis np. “Koniec tej części samouczka, bo już mnie palce bolą od pisania”. 

Lekcja już wyszła dosyć długa, choć temat należał raczej do tych prostszych, nie mniej jednak warto byłoby poruszyć jeszcze jedną kwestię. Otóż jak i gdzie mamy powiedzieć naszemu programowi, że chcemy użyć jakiejś zmiennej? O tym będzie w następnej części (no i pojawią się jakieś przykłady). 

W poprzednim odcinku: Witaj świecie!

4 września 2019

Tajemnica czarnych lakierek.

Wiatr delikatnie poruszał firanką. Kołysała się rytmicznie w przód i w tył jak wahadło. Lubił takie noce.

Odstawił kieliszek w którym zostało kilka ostatnich kropel whiskey, a po chwili namysłu zaniósł go do kuchni i wstawił na górną półkę zmywarki. Wrócił do pokoju, rozejrzał się i przestawił fotel. Zawsze był pedantem i nic nie mogło tego zmienić. Nie chciał zostawić po sobie większego bałaganu niż było trzeba, nawet jeśli nigdy już tu nie wróci. Ostatni raz spojrzał na swoje mieszkanie. Spędził w nim wiele lat, być może nawet zbyt wiele. Upewnił się, że drzwi zostały zamknięte na klucz, zapewne minie kilka miesięcy zanim ktoś się zorientuje, że go nie ma. Wracając do salonu gładził ścianę przedpokoju czując opuszkami palców jej delikatnie chropowatą teksturę i chłód betonu. Nie mógł powstrzymać się od dotknięcia futryny z lakierowanego orzecha, ale w końcu dotarł do drzwi balkonowych. Wyszedł na balkon ostatni raz podziwiając panoramę miasta. Upadek z tej wysokości będzie trwał naprawdę długo i nawet trochę cieszył się z tej perspektywy. Cofając się do wnętrza mieszkania rozchylił firanki do końca - przecież nie chciał którejś z nich zahaczyć i pociągnąć za sobą, wyglądałby wtedy jak idiota.

Doszedłszy do końca pokoju wykonał “w tył zwrot” jakiego nie śmiałby wyśmiać najbardziej okrutny kapral musztrujący swoje koty. Dostawił nogę i przez niewielki ułamek sekundy stał jakby w pozycji “na baczność”. Gdy tylko stopa dotknęła miękkiego dywanu stała się punktem odbicia dla pierwszego kroku. Kolejny krok, potem bieg. Już za chwilę będzie po wszystkim. Każde dotknięcie podłoża to wspomnienie. W tym fotelu całował szyję Anny (a miała naprawdę piękną szyję), przy tamtej lampie kochał się z… a cholera wie jak jej było na imię, ale jej piersi pamiętał dobrze. 

Wreszcie osiągnął próg balkonu i ostatnie wspomnienie związane z tym miejscem mignęło mu przed oczami tak szybko, że bardziej przypomniał sobie emocje jakie mu towarzyszyły niż zobaczył tamto wydarzenie. Może to był Nowy Rok? Teraz już za późno. Wybił się wysoko i szczupakiem przeskoczył barierkę. Mijając ją szybko zerknął czy przypadkiem nie przyczepiła się do niego ta nieznośna firana, ale na szczęście zobaczył tylko czerń swoich butów.

Zimne powietrze zaczęło uderzać w jego twarz i zakradać się pod koszulę. Ręce wyciągnął na boki, aby ustabilizować swój lot ku ziemi. Światła miasta, ulica w dole, pojedynczy, maleńcy ludzie, wszędobylskie samochody, niektóre w ruchu, większość zaparkowanych. Spokojnie przyglądał się temu wszystkiemu i chłonął te widoki po raz ostatni. W końcu już nigdy więcej nie skoczy z tego balkonu. Powietrze w okół niego przyspieszało porywając poły jego marynarki. Miał nadzieję, że wytrzyma, bo nie pomyślał wcześniej aby ją zapiąć. Zresztą zapięta czasem przeszkadzała. Równe płyty chodnika zbliżały się coraz szybciej oświetlone pomarańczowym światłem latarnii. Mrugnął i w tym ułamku sekundy znalazł się już ładnych kilka pięter niżej. Chyba osiągnął prędkość graniczną, bo w ogóle nie odczuwał już przyspieszenia. To jeszcze chwila, jeszcze moment. Uśmiechnął się do siebie wiedząc co za chwilę go czeka. Jeszcze sto metrów, jeszcze pięćdziesiąt.

Już!

Rozpostarł swoje nietoperze skrzydła. Gdy je rozkładał poczuł jak rozrywają koszulę, ale na szczęście marynarkę tylko rozchyliły. Trudno, koszula i tak była gówniana. Kupi sobie lepszą. Gdy skrzydła złapały wiatr, zmienił trochę ich kąt ataku i z człekokształtnego kamienia spadającego ku nieświadomej niczego powierzchni ziemi stał się Ikarem, który przehandlował z diabłem anielskie skrzydła z łabędzich piór na rzecz szatańskich skrzydeł nietoperza.

Jeśli ktoś z ludzi przechadzających się chodnikiem pod nim coś poczuł, to najwyżej niespodziewany podmuch wiatru wiejącego z góry. Zanim taki zaskoczony przechodzień spojrzał w górę zbadać co spowodowało taki ruch powietrza jego już dawno tam nie było.

Do wschodu słońca miał jeszcze kilka godzin, do tego czasu zdąży spokojnie przelecieć nad granicą i uwić sobie nowe gniazdko, być może na kilka kolejnych dziesięcioleci, być może krócej jeśli będzie miał pecha. Tylko też musi znaleźć sobie mieszkanie gdzieś wysoko, żeby móc ponownie poczuć ten wiatr na sobie. Trochę to utrudnia powroty z polowania, ale jeśli tylko nie ubrudził się krwią mógł w zasadzie spokojnie wracać windą. 

Trasę zaplanował sobie już dawno temu, w pamięci miał wszystkie mapy, pamiętał każdą drogę i rzekę wzdłuż których miał lecieć. Pamiętał o każdym punkcie obserwacyjnym. O tam, w dole, dokładnie przed sobą widział światła lotniska. W uszach szumiało mu powietrze, coraz głośniej i głośniej.

- Wieża tu lot H1450 chyba właśnie jakiś ptak wpadł nam do silnika. Prosimy o pozwolenie na awaryjne lądowanie na pasie jeden osiem.
- Jest jeden osiem, lądujcie i niech bóg ma was w swojej opiece.
- Przyjąłem. Dzięki. 

A tajemnicy resztek czarnych lakierek w silniku samolotu, który lądował awaryjnie na pobliskim lotnisku, nigdy nie wyjaśniono. 

29 sierpnia 2019

C# - samouczek, część II - “Witaj Świecie!” czyli omówienie składni na podstawie najprostszego programu

Jakoś tak przyjęło się, że ucząc się nowego języka wypada stworzyć na nim jakiś program. Tradycyjnie jest to aplikacja, której jedynym zadaniem jest przywitać w imieniu użyszkodnika świat. Ponieważ tradycja ta jest nieszkodliwa - i ponieważ tak twierdzi tytuł tego wpisu - także i ja nie zamierzam porzucić tego zwyczaju.


Zacznijmy więc coś kodzić - w poprzednim wpisie poleciłem IDE Microsoftu znane szerszej publiczności jako Visual Studio (wersja dla użytkowników prywatnych ma swojej nazwie słowo Community i jest wystarczająca dla zdecydowanej większości zastosowań). Aby stworzyć program, który umożliwi nam powitanie ze światem musimy w pierwszej kolejności stworzyć sobie nowy projekt (screeny są z VS 2017, ale dla innych wersji zasada jest podobna):


i wybrać jego typ:


Warto od razu wyrobić sobie nawyk porządnego nazywania swoich aplikacji i biblioteki - inaczej szybko grozić nam będzie organizacyjny burdel, który może być szczególnie bolesny, gdy będziemy chcieli znaleźć kawałek kodu do ponownego wykorzystania. Po kilku miesiącach w morzu katalogów ConsoleApp (lub podobnych) jest to nieco trudniejsze niż się człowiek spodziewa. Idąc więc za swoją radą nazwę swój program HelloWorld. 


Po kliknięciu OK naszym pełnym samozadowolenia oczom ukaże się kod prawie gotowego programu. Należy go uzupełnić o dosłownie jedną linijkę by dotrzeć do celu. Aby tego dokonać musimy wiedzieć nie tylko co napisać, ale też i gdzie. Przyjrzyjmy się więc temu, co już mamy:


using System;
using System.Collections.Generic;
using System.Text;
4  
5  namespace HelloWorld
6  {
7      class Program
8      {
9          static void Main(string[] args)
10         {
11         }
12     }
13 }


A jak widać trochę się tutaj dzieje. Na początek na warsztat bierzemy pięć pierwszych linijek:


using System;
using System.Collections.Generic;
using System.Text;
4  
5  namespace HelloWorld


Pierwsze co rzuca się w oczy to słowo kluczowe “using”. Oznacza ono, że posiłkować się będziemy instrukcjami zawartymi klasach, bądź bibliotekach poza przestrzenią nazw zdefiniowaną w piątej linijce naszego programu. Czym są klasy i biblioteki zajmiemy się ciut później. Na tą chwilę wystarczyć powinna wiedza, że ułatwiają one współdzielenie kodu pomiędzy wieloma aplikacjami, a biblioteki dodatkowo mogą być napisane w innym języku niż ten w którym piszemy. Przestrzeń nazw, to takie ustrojstwo, które ułatwia nam trochę smarowanie kodu rozpisanego w kilku klasach. Możemy wtedy trochę mniej szczegółowo opisywać gdzie dokładnie znajduje się instrukcja, której chcemy użyć. Żeby było śmieszniej tak naprawdę już w tych pierwszych linijkach odwołujemy się nie tylko do biblioteki “System”, ale też i do zdefiniowanych w niej przestrzeni nazw “Text” oraz “Collections” i zawartej w niej podprzestrzeni “Generic”. O tym, że schodzimy w dół po zależnościach świadczą użyte w nazwie kropki. 


Jeśli cały powyższy akapit brzmi dla Ciebie jak bełkot możesz to sobie póki co w głowie przedstawić jako różne grupy instrukcji, które nie są normalnie zdefiniowane w czystej wersji języka i nie zagłębiać się w szczegóły. 


Każdy wiersz “Using” kończy się średnikiem, który oznacza koniec instrukcji. Chociaż wydawałoby się, że instrukcję kończyć powinien znak końca linii (czyli tzw. ENTER), to jednak tak nie jest. wielokrotne spacje, tabulatory, czy “entery” właśnie są przez język właściwie ignorowane w większości przypadków. Jak to się więc przekłada na pisanie kodu? Otóż tak, że zarówno taki zapis:


using System; using System.Collections.Generic; using System.Text;


jak i taki zapis:


using 
    System;
using 
    System.Collections.Generic;
using 
    System.Text;


Będą poprawne. Na pierwszy rzut oka może się to wydawać zbędnym utrudnieniem, ale w tym szaleństwie jest metoda - dzięki niej można tak przedstawić kod, aby jego czytanie było w miarę wygodne. Osobiście dość często korzystam z możliwości zapisania wywołania funkcji w kilku wierszach w sytuacji, gdy pokazanie całego kodu wymagałoby przesuwania widoku w oknie na boki.


Następnie mamy mały, ale dość istotny znak:
6         {
oraz jego nieodłączny braciszek:
13        }


Oznaczają one blok kodu. Nie ważne jaki blok - jakiś. To może być zawartość klasy, funkcji, czy zestaw instrukcji do wykonania po spełnieniu jakiegoś warunku. Każdy otwierający nawias musi mieć zamknięcie, każdy zamykający - najpierw musi być otwarty. Od tej zasady nie ma wyjątków, ale na szczęście ani IDE, ani tym bardziej kompilator nam tego nie przepuści. Trzeba zwracać naprawdę dużą uwagę gdzie i jak umieszcza się nawiasy klamrowe - beztroskie ich rozrzucanie tu i tam skończyć się może kilkugodzinną sesją grzebania w kodzie z hasłem “bo mi tu nie działa!”. Aby się nie zagubić w tym bałaganie bardzo pomocne są wcięcia - bloki kodu będące na tym samym poziomie mają identyczną głębokość wcięcia. IDE Visual Studio będzie się starało w tym pomóc, ale nie zawsze sobie samo poradzi.


Wreszcie dochodzimy do:


7      class Program


C# jest językiem obiektowym i naprawdę wszystko jest w nim obiektem. Aby powstał taki obiekt, potrzebna jest instrukcja jego wykonania i tą instrukcją jest właśnie klasa. W tej linii definiujemy więc klasę program, która jest przepisem na wykonanie obiektu. Tak jak w życiu - jeden przepis możemy wykorzystywać wiele razy i tak samo jest w programowaniu obiektowym - jedna klasa może “dać życie” wielu obiektom. Do tego co można zrobić z klasami (i po co) jeszcze wrócimy. Na tą chwilę wiemy już jak ją zadeklarować.


Na koniec zostaje to co najważniejsze:


9          static void Main(string[] args)
10         {
11         }


Deklaracja funkcji. Dzieje się tu naprawdę dużo. Najpierw mamy tutaj słowo kluczowe “static” oznacza ono, że funkcja którą deklarujemy może być wywołana bez tworzenia jakiegoś konkretnego obiektu z naszej klasy. Drugie słowo kluczowe “void”. Normalnie w tym miejscu deklaracji funkcji powinien stać typ zmiennej jaki zwróci nam funkcja. Ponieważ jednak typów zmiennych jeszcze nie znamy (niektórzy być może jeszcze nie wiedzą co to jest zmienna - spokojnie, będzie wyłożone później) nie chcemy, aby nasza funkcja zwracała cokolwiek, albo aby dosłownie zwróciła nam nic - “void” to w angielskim “pustka”, czyli nasze upragnione nic. Następne słowo “Main” to nazwa naszej funkcji. W językach z rodziny C, czy też C-podobnych jest to funkcja wywoływana zawsze na starcie programu. Następnie “(string[] args)”. Tutaj naprawdę dużo się dzieje i bez zahaczenia o typy zmiennych (i to złożone) ciężko będzie dokładnie wytłumaczyć co się dzieje. Wytłumaczę więc rzecz póki co po łebkach, a z czasem wszystko stanie się jaśniejsze. Otóż w tym nawiasie definiujemy co ma być wejściem dla naszej funkcji (najczęściej dane, choć nie zawsze), ale dla nas póki co najwazniejsze, że ten nawias może być też pusty. W tym konkretnym wypadku będą to argumenty jakie można wpisać po wywołaniu programu w linii poleceń.


Skoro więc jesteśmy w głównej (“Main”) funkcji naszego programu, to właśnie tutaj napiszemy linijkę kodu , która pozwoli przywitać nam świat. Wpychamy się więc pomiędzy nasze nawiasy klamrowe i piszemy:


Console.WriteLine(“Hello World”);


Zacznijmy od tego, że wielkość liter jest ważna w większości języków programowania i C# niej jest tutaj wyjątkiem. Czasem może to prowadzić do pomyłek w kodzie, bo łatwiej nam zapamiętać tekst tak jak on brzmi, a nie jak jest napisany. Na szczęście tutaj też IDE okaże się nam wielce pomocne podpowiadając, które nazwy są dostępne z uwzględnieniem wielkości liter. W przypadku VS najważniejszym wg mnie skrótem klawiszowym jest Ctrl+spacja. Włącza on podpowiedzi, które pozwalają szybko ogarnąć jak jeszcze można pomęczyć nasz kod. Dobra, tyle naskrobałem, a ani słowem nie wytłumaczyłem o co chodzi w linii kodu jaką każę wam wpisać.No to jedziemy. “Console” jest to klasa statyczna (czyli zawierająca same funkcje statyczne - a co to jest już wiemy), która pozwala nam pastwić się nad konsolą, czy jak kto woli wierszem poleceń. “WriteLine” dosłownie znaczy “PiszLinię” i dokładnie to robi - wypisuje linię tekstu na konsoli, natomiast jako argument naszej funkcji wpisujemy w nawiasach “Hello World” (razem z cudzysłowami, a dlaczego - o tym przy okazji typów zmiennych).


Możemy teraz radośnie kliknąć ikonkę:
lub wcisnąć klawisz F5.


Zachurkocze, zafurkocze coś tam mignie jakieś czarne okienko i natychmiast zniknie, a w okienku pod kodem przeczytacie coś w stylu:


(kod 0 oznacza, że nasz program skończył się prawidłowo).


Niektórzy z was - ci nie mający okazji dobrze poznać specyfiki systemu Windows - mogą poczuć się oszukani, no bo jak to?! Program się skończył, a nic nie było widać. Otóż było widać - przez ułamek sekundy w czarnym okienku, które nam mignęło na ekranie. Nie trzymając nikogo dłużej w niepewności podpowiem jak się dobrać do tego wyniku. Przesuwamy wzrok na prawą część ekranu i klikamy prawym przyciskiem myszy “Rozwiązanie XXX” (gdzie XXX to nazwa naszego projektu), a następnie wybieramy:


Co otworzy nam okienko eksploratora w lokalizacji, gdzie znajduje się nasz projekt. Musimy jednak dostać się do folderu “Debug” który można odnaleźć według schematu poniżej (lądujemy w folderze zaznaczonym niebieskim tłem, a chcemy się dostać do folderu zaznaczonym niebieską, nieregularną figurą, która miała być piękną elipsą.
Gdy już tam będziemy trzymając klawisz SHIFT klikamy prawym przyciskiem myszy gdzieś w polu naszego okna i otrzymujemy (w zależności od zainstalowanych programów zawartość okienka może się różnić od trochę do bardzo, bardzo):


I klikamy “Otwórz tutaj okno programu PowerShell” - w Windows 7 będzie to coś bardziej w stylu “Otwórz wiersz poleceń tutaj”, ale jako, że siódemki już jakiś czas nie używam, to dokładnie nie pamiętam (ósemki nie używałem wcale, więc kompletnie nie wiem co tam wypisuje). Jeśli wyskoczy nam niebieskie okienko wpisujemy:
.\helloworld 
(wielkość liter nie ma znaczenia), a jeśli czarne to możemy radośnie pominąć dwa pierwsze znaki (przy założeniu, że komputer ma standardową konfigurację).


Jeśli nic nie wybuchło i kod został prawidłowo przeklejony (bo nie wierzę, żeby ktoś go przepisał - a warto, bo wtedy IDE fajnie siecze podpowiedziami) to wtedy nasz program się z nami przywita.


Gratulacje - omówiliśmy Twój pierwszy program (mój jakoś nie - ja jakoś zaczynam naukę nowych języków od napisania symulatora oddziaływań grawitacyjnych, ale ja to w ogóle dziwny jestem).

17 sierpnia 2019

C# - samouczek, część I - wprowadzenie.

C# to (za wikipedią) obiektowy język programowania opracowany przez firmę Microsoft pod koniec XX wieku. Symbol krzyżyka użyty w nazwie ma nawiązywać do przejścia jakościowego podobnego jak pomiędzy C a C++ (gdzie znak krzyżyka ma jest jakby czterema plusami).

Przyznam szczerze, że mając w pamięci upierdliwość programowania w czystym C objawiającym się takimi kwiatkami jak działanie (lub nie) programu w zależności od liczby linii w kodzie (w tym linii zawierających tylko komentarz, bądź tylko znak końca linii) bardzo długo odrzucałem C++ i C# jako języki, których chciałbym się nauczyć. O ile jednak C++ jakoś do tej pory nie stał mi się specjalnie bliski o tyle C# w swojej czystej formie jest dość prosty, lekki, łatwy i przyjemny, więc nauczenie się go było niejako czystą przyjemnością.

C# jest językiem bardzo uniwersalnym. Umożliwia pisanie programów konsolowych (czyli takich, które komunikują się z użytkownikiem za pomocą komunikatów wyświetlanych w linii poleceń), łatwe pisanie programów zawierających elementy graficzne systemu windows (standardowe przyciski, okna dialogowe etc.), oraz niestandardowe elementy interfejsu (ponieważ wszystko jest obiektem do wszystkiego można przypisać odpowiednie zdarzenia i je obsługiwać, w ten sposób np. obrazek może funkcjonalnie stać się przyciskiem). Ponadto język ten umożliwia pisanie aplikacji webowych, obejmując zarówno frontend (to co widać), jak i backend (czyli silnik pod spodem). Ponadto dość łatwo w C# zaimplementować wielowątkowość.

Z ciekawostek - C# jest jednym z języków w którym można pisać skrypty w środowisku do tworzenia gier Unity. C# ma też składnię bardzo podobną (jeśli nie identyczną) do języka JAVA, jednakże jest pozbawiony kilku z jej upierdliwości - m.in. maszyny wirtualnej, która zżera zasoby jak opętana, czy ręcznego zarządzania pamięcią. Zresztą w początkach istnienia tego języka uznawany był za “kolejny, głupi klon JAVY”. C# jest też językiem który nie jest kompilowany do kody wykonywalnego. Jest on kompilowany do kodu pośredniego, który następnie jest wykonywany przez środowisko .NET. Daje to pewną bardzo fajną właściwość, jaką jest możliwość zmiany kodu w trakcie jego wykonywania. Bardzo ułatwia to poszukiwanie błędów w kodzie i ich poprawę.

Na koniec warto by było wspomnieć o tym czego używać do pisania programów w C#. Teoretycznie do pisania kodu używać można jakiegokolwiek edytora tekstu zapisującego pliki w formacie czysto tekstowym. Wygoda takiego rozwiązania pozostawia jednak sporo do życzenia, dlatego moim zdaniem najlepiej korzystać z rozwiązań zwanych IDE (Integrated Developing Environment), czyli zintegrowanych środowisk programistycznych, które oprócz edytora kodu i kompilatora zawierają wiele narzędzi do debugowania (“odpluskwiania”, czyli usuwania błędów) zawierają też dokumentację języka, bądź umożliwiają łatwy dostęp do niej online. Dla C# obecnie najpopularniejsze IDE to Visual Studio (istnieje darmowa, nieźle rozbudowana wersja dla zastosowań edukacyjnych, dla małych przedsiębiorstw i dużych projektów open source) do pobrania ze stron Microsoftu.

W kolejnej części (o ile kiedyś powstanie) - trochę o składni języka na podstawie słynnego “Hello World”.

P.S.
“Prętem po jajach”

10 sierpnia 2019

Bo na zachodzie to…

Ze śmierdzącego śmietnika, nad którym latają muchy wysypują się śmieci. Rzecz dzieje się prawie że w centrum dużego miasta. Założę się, że niejeden by pomyślał - na zachodzie to by się nie zdarzyło, tam dbają o porządek. Inne miasto, tym razem takie niewielkie. Już z daleka słychać idiotę bez tłumika, który najpierw siedzi jakiemuś dziadkowi na zderzaku, a potem z głośnym rykiem silnika i umcy-umcy wydobywającym się przez okno wyprzedza, bo za chwilę z piskiem opon i pasażerów poślizgiem przejechać skrzyżowanie. Na zachodzie - nie do pomyślenia. Kolejne duże miasto. Duże skrzyżowanie poza centrum. Zapala się zielone światło, ktoś zamula ze startem i zostaje natychmiast otrąbiony przez pozostałych. Dzicz, nie to co zachód. 

A jednak zachód. Taki śmietnik i wiele innych identycznych widziałem w Atenach, idiotę w dresowozie widziałem w Reading (pod Londynem), a niecierpliwych kierowców w Hamburgu. Przykłady można mnożyć. Przez wiele lat wierzyliśmy, że Europa Zachodnia to takie nasze Shangri-La - mityczna kraina szczęśliwości, tudzież Eldorado - miasto ze złota. Ale zachód to tacy sami ludzie jak my, z bardzo podobną kulturą pozbawioną po prostu wymuszonych, radzieckich wpływów (u nas też jest ich coraz mniej).

Myślę, że mentalnie już dogoniliśmy, albo prawie dogoniliśmy kraje Europy Zachodniej, żyje się tutaj nie najgorzej, zarabia wreszcie całkiem znośnie, nawet problemy mamy już te z których słynie raczej pierwszy świat. Nie mamy się więc czego wstydzić, nie mamy po co “wstawać z kolan”, ani po co deprecjonować własnych osiągnięć naukowych. Nawet ostatnie badania odnośnie uczciwości wykazały, że nie tylko w niczym nie ustępujemy, ale też przewyższamy naszych kolegów z wydawałoby się uczciwszych krajów starej UE.

Oczywiście nie w każdej dziedzinie jest różowo - ciągle nie potrafimy zrobić porządnego filmu, który byłby w stanie odnieść światowy, komercyjny sukces. Nie mamy swojego przemysłu samochodowego, bardzo mało projektujemy i wytwarzamy produktów z branży zaawansowanych technologii (mimo iż - przynajmniej w teorii - odpowiednią wiedzę mamy).

Podsumowując - nie mamy się czego wstydzić - no może poza turystami napędzanymi 500+, którzy zaczynają nam zdobywać niechcianą sławę na miarę turystów brytyjskich, czy niemieckich. Nie możemy jednak póki co usiąść na dupie i nic więcej nie robić, bo mamy jeszcze sporo do zrobienia w tej materii.

P.S. Jak to wyczytałem w nagłówku jednego z portali “Tylko w Polsce zwykły poseł może odwołać marszałka sejmu”.

30 czerwca 2019

LGBT+



Temat wałkowany wszem i wobec, wszędzie i przez wszystkich, więc i ja postanowiłem wyjawić światu swoje zdanie (i nie, nie uważam swojego zdania za “skromne”).

Do popełnienia dzisiejszej notki natchnęła mnie informacja o tym, że zwolniono pracownika Ikei za krytykę ideologii LGBT. Bliższych szczegółów nie podano, więc ten akurat przypadek w dzisiejszym wpisie jest tylko pretekstem. O wiele ciekawsze wieści kryją się tu i wynika z nich, że aktywiści powiązani z tym ruchem (ciężko mi przychodzi użycie słowa ideologia w tym wypadku, bo ideologia to o wiele więcej niż to kto z kim chodzi do łóżka i po co) bardziej szkodzą niż pomagają osobom z tej grupy. Wynika to z tego, że wpierdalają się dokładnie wszędzie i człowiek zaglądając do lodówki czasem obawia się, że jego wczorajszy obiad zacznie machać do niego tęczową flagą.

Bardzo ciekawa teza postawiona w drugim z przytoczonych artykułów sugeruje, że aktywiści LGBT sami doprowadzają do tego, że ludzie mają ich dość. Zresztą - chuj - dorzućmy do tego samego worka tych wszystkich ludków, którzy wszędzie widzą rasizm, bo choć to zupełnie inna kategoria to ich aktywiści są tak samo pierdolnięci. Problem polega na tym, że nagłaśnianie przypadków błahych, nieistotnych, czy wręcz głupich (w tym głupich pomyłek) powoduje, że zaczynamy bagatelizować problem. W tej chwili po tym, jak ktoś dopatrzył się twarzy murzyna w butach, czy też gdy do zamieszek doprowadziło zdjęcie dziecka w bluzie od H&M, problemy takie jak zabójstwa na tle rasowym przez policjantów z USA lądują w szufladce z napisem “ee tam - przesada, znowu ktoś jest przewrażliwiony” (łatwiej było mi znaleźć przykłady zachowań rasistowskich niż dla ludzi kochających inaczej, ale zasada jest ta sama).

Nie dziwię się więc, gdy ludzie o poglądach znacznie utrudniających im otwarcie się na innych na każdą wzmiankę o częściach rowerowych zaczynają okopywać się na swoich stanowiskach wymyślając niestworzone bajki i nie przyjmując do wiadomości, że dla tych kilku procent społeczeństwa, które z przyczyn niezależnych od siebie stosują niestandardowe kryteria doboru partnerów to jest dramat. Z drugiej strony identycznie zachowują się organizacje broniący praw mniejszości. Zabarykadowani za swoimi przekonaniami za cholerę nie mogą pojąć dlaczego każdy z nas nie ma czarnego homoseksualisty na utrzymaniu, najlepiej jeszcze wyznającego islam czy inaczej pokrzywdzonego przez los. I ci pożal się boże obrońcy nie dostrzegają, że jak w skeczu “W obronie kobiety” w wymianie ciosów obrywają ci, których mieli bronić. Tak jak współczesne feministki, dążą do dominacji, zamiast tolerancji.

Prawda jest taka, że jeśli nikomu nie dzieje się szeroko rozumiana krzywda, a wszystkie zainteresowane strony wyrażają świadomą zgodę to reszcie świata nic do tego. Jeśli dwóch facetów chce, żeby jeden drugiemu ładował coś w odbyt, a dwie panienki lubią czasem poprzytulać się trochę bardziej namiętnie, to ja przepraszam, ale to jest sprawa pomiędzy nimi. Ja akurat nie chcę tego oglądać (przynajmniej w wykonaniu facetów), więc odwrócę wzrok, może nawet dam radę nie rzygnąć (bo nie muszę tego zaakceptować, żeby tolerować), ale nie będę tępił, bo to nie moja sprawa. Działać, tępić mam zamiar dopiero wtedy, gdy komuś będzie działa się krzywda, lub gdy nie będzie świadomie wyrażać zgody na to co się dzieje. I to nie ważne w jakiej konfiguracji płci.

Celowo pomijam tutaj problem kościoła katolickiego (w końcu nie bije się leżącego), ale ten artykuł opisuje to ciut lepiej i na pewno sprawiedliwiej niż ja bym to zrobił.

P.S. Uff jak gorąco.

25 maja 2019

Urząd? A na co to komu?


Przyszło nam żyć w naprawdę ciekawych czasach i to zarówno w naszym, jak i w chińskim rozumieniu tych słów.

Z jednej strony mamy gigantów przemysłu IT, którzy na podstawie tempa klikania lajków na ryjksiążce są w stanie określić twoją płeć i IQ z dokładnością do pół punkta, a także oszacować wagę, oraz poziom uwielbienia dla bitej śmietany, a z drugiej mamy armię urzędników państwowych, którzy bez pisemnego wniosku, pobrania numerka, badania proktologicznego petenta, oraz pełnego drzewa genealogicznego sięgającego do minimum XV wieku (w szczególnych przypadkach do X wieku) nie mogą przenieść informacji z jednego działu do drugiego…

Pędęm biegiem już wyjaśniam o co mi chodzi. Otóż jakiś czas temu jedna z moich dalszych krewnych postanowiła wziąć rozmach i z impetem (w głąb) kopnąć w kalendarz. Często bywa tak, że jak ktoś już został przez los zmuszony do wąchania kwiatków od spodu, na otarcie łez swych najbliższych zostawia im jakiś majątek. Otóż krewna moja była tak miła, że nie tylko majątku nie zostawiła, ale wręcz była poważnie zadłużona. Rodzina, która była nieco bliżej tejże krewnej szła w zaparte twierdząc, że nie wiedzą skąd, ani jak, ani po co (chociaż jak babcia wnusiowi drogi prezent sprawiła to też nikt o nic nie pytał) i dowiedziawszy się, iż ceną za przejęcie kilku pierścionków będzie kwota pięcio, lub może nawet i sześciocyfrowa jak najprędzej zaczęła odrzucać spadek. Drzewo genealogiczne mam dość rozbudowane, ale nie dość, abym gdzieś się na nim zawieruszył siłą więc rzeczy niechciany spadek dotarł i do mnie. Ostrzeżony wiedziałem iż jest to gorący kartofel, którego chciałem się natychmiast pozbyć, co też i zresztą zrobiłem, niestety nie jest to rozwiązanie wszystkich moich problemów, ponieważ mam dzieci i to na dodatek mocno nieletnie.

Nie wiem kto z czytających wie, ale gdyby jakimś cudem znalazł się tu ktoś kto jednak nie wie - prawo polskie zabrania rodzicom ot tak sobie odrzucić spadek w imieniu swoich dzieci. Chujowe prawo, ale prawo - jedyne co pozostaje to wystąpić do sądu o zgodę na taki manewr. Zdaję sobie sprawę, że spora część ludzi to zwykłe kurwy, które są w stanie orżnąć nawet swoich bliskich (w tym dzieci, czy rodziców) i na pewno jakieś zabezpieczenie interesów dzieci, które same nie mają bladego pojęcia o co chodzi (lub po prostu nie mają prawa same o sobie decydować - jak kto woli) to nie taki całkiem głupi pomysł. Dlatego też jakoś jestem w stanie się z tym pogodzić. Okazuje się jednak, że świat oprogramowania i świat prawa mają co najmniej jedną rzecz wspólną - zabezpieczenia najbardziej utrudniają życie ludziom uczciwym.

Okazuje się, że złożenie takiego wniosku, czy pozwu w sądzie (chyba raczej wniosku, bo kogo ja bym niby miał pozwać?) wymaga dołączenia pierdyliona załączników - w tym urzędowych. Pytam się więc - po chuj?! Jeśli nawet informacje zawarte w tych wszystkich papierach są komuś niezbędnie i koniecznie potrzebna do ustalenia jakiegoś faktu, to nie widzę najmniejszego sensu w noszeniu tych wszystkich papierzysk w zębach do okienka w sądzie. Przecież wszystkie tego typu gówna są w rządowych bazach danych, dostępne dla wybrańców za jednym kliknięciem. Nie mogłoby być tak, aby przy składaniu tego nieszczęsnego wniosku złożyć jakieś upoważnienie dla sądu, żeby sobie sam wszystkie niezbędne dla prowadzenia sprawy dokumenty powyciągał skąd tylko potrzebuje? Przecież chodzi tylko o zerknięcie w kilka aktów z USC. Że informacje wrażliwe i naruszenie prywatności? O błagam - Google na pewno i tak już ma listę moich ulubionych pornoli, a pewnie i kamerką nagrał sobie setki godzin bicia niemca po kasku podczas ich oglądania, dzięki czemu już niedługo zaoferuje mi jakiś gadżet, który zrobi to za mnie lepiej i tylko za drobną miesięczną subskrypcją. To jest w ogóle strasznie smutne jak kolejne rządy nie mają pomysłu na administrację - wszyscy świetnie sobie radzą z wymyślaniem nowych zaświadczeń jakie są potrzebne, natomiast mało komu przychodzi do łba, żeby starać się jak najwięcej rzeczy integrować. Może wręcz tak naprawdę wiele z tych rzeczy jest w dzisiejszych czasach niepotrzebne?

Mam taką wizję, że nie muszę chodzić do żadnych urzędów. Chciałbym, aby urzędnicy traktowali mnie jak klienta, a nie jak petenta, aby moje potrzeby kontaktów z administracją przewidywano i z wyprzedzeniem przygotowywano. O ile przyjemniejszy byłby świat, gdyby załatwienie sprawy takiej jak moja wyglądałby następująco:

  1. Dostaję maila z zawiadomieniem o śmierci krewnej, z załączonym raportem długów zmarłej, oraz szacowanej wartości jej majątku. Na końcu maila informacja, że mam jakiś tam czas na zastanowienie się co dalej i że przyjęcie, lub odrzucenie spadku mogę załatwić na poczcie lub w banku, gdzie potwierdzą moją tożsamość biometrycznie.
  2. Za jakiś czas idę sobie do banku, gdzie identyfikuję się choćby poprzez DNA, tęczówkę oka czy próbkę kału - jeden chuj. Odrzucam spadek. Automat, który robi mi w tym czasie orzechowe cappuccino (bo chciałbym chodzić do ba do banku tylko dla kawy, bo wszystko wolałbym załatwiać przez internet ) stwierdza za pomocą swoich algorytmów Big Data, Machine Learning, oraz Skarpetki Śmierdzą Gdy Się Je Długo Nosi, że decyzja w sumie słuszna i zauważa, że powoduje to problem dla moich nieletnich. Po dalszej analizie danych, oraz mojego oddechu z którego wynika, że jestem raczej trzeźwy pyta mnie, czy od razu chciałbym odrzucić spadek w imieniu dzieci. Potwierdzam. Opada kurtyna i wytrąca mi z ręki kawę, którą natychmiast się parzę w dłoń.


Poza automatem robiącym orzechowe cappuccino to wszystko jest w zasadzie w zasięgu dzisiejszej techniki, wymagana jest tylko zmiana podejścia, no ale jakoś tak już od dawna prawo nie nadąża za rzeczywistością.
P.S. Już jestem wnerwiony a to dopiero połowa drogi… P.S. 2. Marsz na wybory!

Wybrałem się do prywatnego szpitala, żebyście wy nie musieli

Odzywam się po przerwie. W sumie co się dzieje w kraju i za granicą to chyba wszyscy wiedzą, nie ma więc sensu tutaj kolejny raz tego przypo...