Rabbids Coding!

Ile to nie zarabiają programiści? No ja się tego tyle nasłuchałem, że aż żałuję iż takim nie jestem. Ale dość o mnie. Wielu owe opowieści inspirują one do zaszczepienia umiejętności kodowania u swoich dzieci. I tu jest ważne pytanie: jak uczyć programowania najmłodszych? Dziś pochylimy się nad odpowiedzią jakiej udzieliła nam firma Ubisoft. Continue reading

JavaScript: Undefined vs. null

Znajomy zapytał mnie dzisiaj czy to dobry kod:

W pierwszym odruchu utwierdziłem go (pytał by się upewnić), że nie, że lepiej byłoby użyć słowa kluczowego null. Argumentowałem nawet, że undefined można sobie swobodnie nadpisać. Wyczytałem to zdaje się na Stackoverflow.

Jednak kiedy, spróbowałem sprawdzić moje własne słowa, znalazłem tą oto małą notkę:

JavaScript 1.8.5 note

Starting in JavaScript 1.8.5 (Firefox 4), undefined is non-writable, as per the ECMAScript 5 specification.

W skrócie: nie można (przynajmniej w nowszych przeglądarkach) nadpisać undefined. Operator === też działa prawidłowo z użyciem undefined. Nie ma więc nie bezpieczeństwa? Czyżbym wpuścił kolegę niechcący w maliny?

Ale dalej mi się to wszystko nie podobało. Należy pamiętać, że:

  • undefined nie jest stałą
  • nie jest też słowem kluczowym języka JavaScript (sprawdźcie sami)
  • nie jest nawet słowem zastrzeżonym pod przyszłe użycie
  • otrzymamy wyjątek jeśli napiszemy coś takiego: if (zmienna_niezadeklarowana_wcześniej === undefined) (trzeba więc użyć operatora typeof)

Czym więc jest undefined? Jest zmienną globalną (choć tylko do odczytu od jakiegoś czasu). Lokalnie (wewnątrz funkcji) możemy ją sobie swobodnie nadpisać. Więc, jeśli nawet nie widać niczego złego przy wywołaniu kodu:

{geshi lang=javascript}var a; var undefined = 42; console.log(a); // undefined console.log(undefined); // undefined console.log(a == undefined); // true

To wystarczy wstawić go do wewnątrz funkcji:

)();

Podsumowanie

Morał jest więc prosty: jeśli cenicie sobie jakość swojego dzieła, nie chcecie, aby się z was koledzy śmiali: używajcie null do inicjacji zmiennych, nie polegajcie na tych małym potworku jakim jest undefined. Jego używamy tylko do analizy np. zmiennych globalnych. Ja widzę też jeszcze powód dla którego lepiej jest użyć null: jeśli chcemy przywrócić pierwotną wartość zmiennej, bardziej naturalne jest przypisanie do niej właśnie null.

Taka jest moja opinia. Bardzo chętnie zapoznam się z jakąś dobrą argumentacją (jeśli jest takowa) przeciw.

Linki

Bash – wybredne kopiowanie

Domyślnym katalogiem na pobieranie plików w moich przeglądarkach, jest pulpit. Stamtąd rozdzielam pliki wedle własnego widzi mi się, jednak pewną klasę plików, życzę sobie mieć zawsze w pewnym specyficznym katalogu. Do tej pory, przenosiłem je tam ręcznie, ale uświadomiłem sobie, że przecież nie jest trudno proces ten zautomatyzować. Po pięciu minutach powstała ta oto linijka:

" = "" ] && cp "$1" ""

Ten skrypt oczywiście wykorzystuje do otwierania pliku z poziomu przeglądarki. Najwięcej problemu było ze sprawdzeniem poprawności zadanego parametru ($1). Należało jednak upewnić się, czy parametr jest plikiem (to z pomocą: -f) i czy ma zadane rozszerzenie. Zamieszczam, aby mi się nie zgubiło. Na co warto zwrócić uwagę:

  • ${1##*.} – to wyrażenie zwraca rozszerzenie pliku (tutaj dla zmiennej $1). Dla nazwy np. “nazwa.z.kropkami.txt”, zwróci “txt”. Po sieci można znaleźć wersje z jednym płotkiem (#), ale wtedy wynikiem są wszystkie znaki po pierwszej kropce (szczegóły w załączonych linkach)
  • [ (...) -a (...) ] – I (ang. AND) w składni programu test, używanego przy warunkach w Bashu

Z pomocą: bash String Manipulations i Linux tip: Bash test and comparison functions.

O JPanel w stałym rozmiarze na JFrame

Jakiś czas temu poszukiwałem sposobu, aby zmodyfikowany przeze mnie JPanel zachowywał swój rozmiar niezależnie od wielkości okienka (obiekt JFrame), na którym bezpośrednio leżał. Kosztowało mnie to nieco nerwów. Nie wystarczyły metody setSize, setPreferredSize, setMaximumSize, setMinimumSize, użyte jak w poniższym przykładzie:

setSize(width, height);
setMaximumSize(getSize());
setMinimumSize(getSize());
setPreferredSize(getSize());

Niezależnie od moim starań potomek JPanel rozlewał się na całą powierzchnię obiektu JFrame. Winnym jest tutaj domyślny LayoutMenager obiektów JFrameBorderLayout (wniosek: warto zaglądać do dokumentacji). Osobiście uważam to za drażniące zachowanie rozszerzać na siłę element, łamiąc jego maksymalny ustawiony rozmiar, ale jak się nie ma co się lubi, to się lubi co się ma.

Rozwiązania widzę dwa: pierwsze to zmienić JFrame menadżera rozmieszczania elementów na np. FlowLayout. Drugim rozwiązaniem jest wstawienie naszego obiektu, nazwijmy go MyJPanel, w nowo utworzony obiekt JPanel i dopiero ten wstawić do JFrame. Zilustruje to małym przykładem:

JFrame frame = new JFrame("Test");
JPanel p = new JPanel();
p.add(new MyJPanel());
frame.getContentPane().add(p);

Teraz ten nowy, opakowujący JPanel jest rozszerzany przez obiekt okienka programu, a nasz – właściwy – pozostaje nietknięty. W sumie ta druga metoda to zastosowanie tej pierwszej w nieco inny sposób, ale może się przydać, jeśli z jakiegoś powodu nie mamy pełnego dostępu do obiektu JFrame.

Linki

Jak niektórzy piszą tutoriale

Coś mnie tknęło, aby zgłębić nieco ASP .NET. Technologię tą, spłodził Microsoft, który wiąże z nią duże nadzieje. Naukę rozpocząłem od wyszukania jakiegoś tutorialu, który nauczyłby mnie stawiać pierwsze kroki w wymienionej. Trafiłem tak na drugi link w wynikach wyszukiwarki – stronę: http://www.dotnetspider.com.

Opisywany tutorial podzielony jest na jakieś 71 części – spokojnie, większość z nich to w zasadzie pół ekranu tekstu, do których dołączono zdjęcia. Tutorial rozpoczyna wstęp, gdzie między innymi można wyczytać:

The targetted audience for this tutorials are:

  • Engineering and Computer Science Students
  • Beginner level programmers who want to develop their career in ASP.NET based web development.
  • Senior programmers who like to switch over to ASP.NET web programming.

Potem następuje etap wyjaśnia czym jest np. przeglądarka (ang. browser). Niejako rozumiem, że facet (Tony John) wyjaśnia podstawowe pojęcia, ale bez przesady, nie kierował tego kursu do absolutnych początkujących. Już przy tej przeglądarce ujawniają się skłonności do reklamy firmy Microsoft, od niewinnego zdania: Netscape was the most popular web browser till 4-5 years back, but currently more than 90% of the internet users use “Internet Explorer” to browse the websites. (kurs jest nieco stary).

Dalej pod tym względem jest jeszcze piękniej:

It is very hard to divide applications into any strict categories. There is no clear definition exists to categorize computer applications. However, here is a small list of different types I can think of:

  1. Embedded Systems
  2. Windows applications (also called ‘Desktop applications’)
  3. Web Applications

Czyli: nie ma innego systemu oprócz Windowsa!

Takich kwiatków jest oczywiście jeszcze więcej, ale wystarczy tego. Zupełnie nie rozumiem, czemu inżynier, programista z doświadczeniem, podejmujący się napisania tutorialu musi wykazywać jakieś skłonności tzw. “fanboja”. To nie jest miejsce na reklamę, jak ktoś czyta jego dzieło, to najwyraźniej zamierza korzystać z technologii oferowanej przez wspomnianego monopolistę.

Już lepiej by popracowali nad HTMLem i stylami swojej strony (w ASP .NET notabene) bo aktualnie jest to po prostu okropne. W dodatku niektóre ze stylów (głównie fragmenty kodu) rozwalają się, nawet pod ich ukochaną przeglądarką (specjalnie sprawdziłem).

Podsumujmy więc, opisany tutorial:

  • jest nieco przestarzały
  • … nie wydaje mi się, żeby jakoś bardzo wpłynęło to na opisywane zagadnienia
  • zawiera niepotrzebne wstawki “marketingowe”
  • wyjaśnia wszystko od podstaw …
  • … więc cześć materiału raczej ominiemy
  • przydałoby się, aby autorzy nieco nad nim (i całą stroną) przysiedli, bo tu i ówdzie jest kilka literówek

PS. Jakby ktoś znał jakieś dobre strony z kursami ASP .NET, może podać, przyda mi się pewnie.

Linki

Parsowanie spisu imienin #2

Swego czasu ‘popełniłem’ jeden mały skrypt na użytek własny, który miał mi przerobić listę imienin ściągniętą z Wikipedii (strona: Imieniny) na zbiór zapytań SQL, które potrzebne mi były do jednego projektu. Patrząc z perspektywy czasu napisałem mały koszmarek.

Mimo to, w końcu to nieświadomie, miałem kilka wejść ludzi którzy poszukiwali następujących fraz:

  • skrypt imienin
  • sql z imieninami
  • linux imieniny
  • imiona.txt
  • szablon daty imienin
  • imieniny daty
  • imieniny.sql
  • spis imienin
  • itp…

To właśnie zapotrzebowanie czytelników, choć być może i jednorazowych, skłoniło mnie, w ramach ćwiczeń z Pythonem, do ucywilizowania mojego dzieła. Z marnych 40 linii kodu powstało ich jakieś 200 (ściślej, wliczając komentarze i puste linie 250). Ale mimo to uważam go za lepszy. Przede wszystkim wiem więcej o wyrażeniach regularnych, a kod jest obiektowy, przez co łatwo jest – mam nadzieję – dostosować go do indywidualnych potrzeb użytkownika.

Przykłady uruchomienia

Zamieszczam przykładowe wyniki działania mojego najnowszego dziecka:

Ogólna zasada działania

Ponieważ nie wiem, jaką kto założył sobie bazę danych, jakie ma w niej tablice i relacje między nimi, nie napisałem klasy generującej SQL, ale zakładam, że na podstawie opisów oraz przykładów i przy odrobinie smykałki do Pythona łatwo będzie uzyskać to co tam się komu wymarzy.

Nie mniej jednak oto i krótki kurs: klasą która dostaje i formatuje dane na koniec, jest jakiś potomek klasy AbstractLineParser. Ważne jej metody, które należy przeciążyć to: _setNames oraz _setDates. Należy pamiętać, iż obie dostają jako parametry listy (bo jedno imię zwykle ma wiele dat, a imię też może występować w odmianach). Zawsze też dostaje się najpierw imiona, a potem daty do nich. Resztę można wywnioskować samemu, albo przebrnąć przez komentarze.

Kod skryptu można zobaczyć, lub pobrać z tego oto linka

Słowo końcowe

Cóż, moje testowanie błędów nie wykazało, jednak przestrzegam, przed imieniem: “Apollo(n)” (to chyba jedyny taki przypadek). Ignorowane też są imiona, z których czytelnik został odesłany – np. Adelgunda, zob. Adalgunda. Nie zabraniam modyfikacji, nawet zachęcam, nie biorę odpowiedzialności za wszelakie zło wyrządzone przez ten skrypt (no bez przesady, to tylko trochę kodu w Pythonie).

Na końcu chciałem podziękować (w kolejności chronologicznej): tym którzy komentowali mój poprzedni post, bo ich rady jakoś tam się przydały, następnie mojej Pani, która bez wątpienia zna się na Pythonie lepiej niż ja – bez złośliwości, wiem że to nie jest trudne – za pomoc.

Jak zainstalować obsługę MPI na Ubuntu?

Mam tu na myśli na jednym nie połączonej z innymi maszynami komputerze, który ma tylko jeden rdzeń. Podejrzewam jednak, że zadziała dla posiadaczy kilku.

Problem wydać mógłby się banalny, ale jednak już dwa razy nad nim siedziałem; raz przypadkiem trafiłem, a za drugim nie mogłem sobie przypomnieć co zrobiłem za pierwszym. Dlatego wolę to sobie teraz zapisać.

Message Passing Interface na Ubuntu, czy na innych dystrybucjach, jest zainstalować łatwo, trochę ciężko za to skłonić go emulowania równoległości. Jak instalowałem mpich, czy openmpi, to wyglądało to jakby ten sam program został uruchomiony ileś tam razy, z tym, że każdy z nich nie był połączony z zresztą – każda instancja postrzegała się jako uruchomiona samotnie.

Aby móc cieszyć się poprawnie działającym wynikami działania kompilatora mpicc, należy zainstalować pakiet lam4-dev:

sudo apt-get install lam4-dev

Powinno wystarczyć. Jakby się nie zainstalował automatycznie, to trzeba ręcznie dorzuć pakiet lam-runtime. “Klaster” inicjujemy przez wpisanie lamboot, od tej pory powinno działać polecenie mpirun.

Tak nawiasem: można też skorzystać z dystrybucji PelicanHPC GNU Linux, która jako przerobiony Knoppix uruchamia się z płytki, wzbogacona o liczne narzędzia do programowania równoległego.

Dodane:

Przykładowy plik Hello World dla MPI można znaleźć np. na stronie: Hello World MPI Examples (pierwszym wynik w Google). Uwaga! tam jest: int rank, size, a powinno być: int rank, size;.

Moje poprawki do Arthemia

Lista moich poprawek do szablonu Arthemia. Edytujemy plik style.css.

  • Wystające tagi “em” w miniblogu, w linii 625:

    #sidebar-miniblog em {position: absolute;right:5px;font-style:normal; font-weight: normal; font-size: 0.9em;}

    Należy dopisać h4 przed em:

    #sidebar-miniblog h4 em {position: absolute;right:5px;font-style:normal; font-weight: normal; font-size: 0.9em;}

  • Duża czcionka w polu wpisywania komentarza – z tym to jest jazda, jak zmniejszyłem font-size elementu textarea#commbody do 1.5em to ładnie wyglądało w przeglądarce Firefox, ale czcionka w Operze dalej była za duża. Zmniejszenie do 1em powodowało, że pod Firefox wychodziło to bardzo małe. Tutaj pomógł powrót do korzeni – w tej wersji Arthemia nie posiada żadnych ustawień czcionki w elemencie textarea#commbody.

No, zobaczymy jak radzi sobie miniblog z tagami “code” i “pre”

EDIT: no… wywaliłem elementy pre. To będzie wyższa szkoła jazdy…