🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.objects
Article #12317

Re: O, to ta grupa jeszcze istnieje?...

#12317
From: jarekr
Date: Sat, 22 Oct 2005 17:14
426 lines
19879 bytes
Sektor van Skijlen napisał:

> 
> Na razie to dywagowaliśmy, jakiej jakości jest "ficzer" generyków dodatny w
> Javie i czy coś to dobrego językowi przyniosło. W tym celu należy porównać
> pisanie z generykami i pisanie tego samego bez nich.

Nie - w tej częsci dyskutowaliśmy o constraintach na parametry w generykach.


>>Tak naprawdę potykałem się najwięcej jak miałem własną firmę krzak dawno 
>>temu. W zasadzie dotyczyło to prób korzystania z różnych ściąganych z 
>>googla bibliotek, algorytmów, źródeł, których chciałem używać... 
>>odkryłem że w C++ to się nie da (z wymienionego powodu) (a javy wtedy 
>>nie znałem za bardzo).
> 
> 
> Nie rozumiem. Znaczy się co, miałeś problem z korzystaniem z tego z uwagi na
> szurnięte użycie przeciążania operatorów?

No jasne. Z uwagi na użycie przeciążania operatórów - w kodzie 
sprowadzanym z zewnątrz, własnym i do tego jeszcze w STL.
Napisz, że zawsze używasz  operatorów w tym samym (semantycznie) sensie.
Sorry już samo cout<<"text"; superuje, że choćby z << jest ... "kłopot".



> 
> Ależ niemożliwość przeciążąnia operatorów niczego ci nie załatwi.
> 
> W Javie można zrobić kupę różnych głupot również z wielu innych powodów. Pod
> tym względem Java może jest mniej harmful, niż C++, ale wcale to nie oznacza,
> że się pod tym względem bardziej nadaje do tworzenia oprogramowania.

Właśnied dokładnie... to JEST dla mnie wzgląd.
> Zresztą dla mnie argument jest z gruntu kuriozalny: chcemy mieć dobre
> oprogramowanie, to zatrudniajmy dobrych programistów i przede wszystkim
> PATRZMY IM NA RĘCE. Nie ma lepszego filtra na dobry kod niż dobry, zaufany
> kierownik; narzędzia do mierzenia złożoności (różne Mckejby i klocworki) kodu
> trochę pomagają, ale tylko trochę.

Rozumiem, że widzisz rozwiązanie - piszmy w C++ tylko patrzmy wszystkim 
na ręce. ( a kto patrzy kierownikowi ? ).
To ja już jednak wolę automatyzację, sporadyczne sprawdzanie itp.
Taniej wychodzi - a w Javie starcza zupełnie. Mogę sobie swobodnie 
wrzucić jakiś absurdalny kod (np. wyprodukowanyw Elbonii fragment 
dotyczący gui)  do projektu i mam pewność, że co najwyżej sam un kod się 
wykrzaczy a reszta programu nie ucierpi ani troche (nikt mi pamięci nie 
pomaże, a jak będzie trzeba to się nawet temu fragmentowi odetnie IO i 
reszte :-) ) .


>>Zawodny.... zgadzam się.
>>Mniej wydajny? w jakim sensie?
> 
> 
> Nie rozśmieszaj mnie nawet. Tłukę ten temat już od dłuższego czasu.

Nie tłucz - napisz konkrety.

> 
> No przecież mówiłeś akurat o problemach, które w C++ by nie zaistniały z
> przyczyn zasadniczych. Więc nie rozumiem, o co ci chodzi z tym
> zacietrzewieniem.

Jak to by nie zaistaniały ? a co to C++ to jakiś inny, bezpieczny język 
jest ?

> 
>>He, he - dokładnie mam to samo tylko u mnie problemy są z ludźmi 
>>wyślizganymi w C (tworzą absurdalny kod) i  C++ (tworzą ciekawe i 
>>sprytne koncepcje... które w javie nie działają, nie mają sensu, albo są 
>>dramatycznie niewydajne).
> 
> 
> No właśnie to mnie interesuje. Jak może programista C++ źle pisać w Javie?
> Przykłady poproszę.

Najczęstszy przykład to jak wygląda walka o tzw. wydajność.

Typowy programista (długoletni w C++) widzi świat bardzo statycznie.
Zapominając, że we pomimo, że fragment kodu wygląda:
	(MyObject)list.get(4);
to  w kodzie faktycznie uruchamianym może nie być:
	- wywołania funkcji (inlining automatyczny),
	- sprawdzania zakresu tablicy, (wewnątrz get ),
	- sprawdzania zgodności typów (bo poco - sztuka jest sztuka).

Kompilator HotSpot wie o lokalnym kontekśćie programu o wiele więcej niż 
statyczny kompilator C++ i z tego powodu pewne trywialne operacje... 
mogą po prostu być wymazywane.
Niewiedza o tym prowadzi do konstruowania potworków z omijaniem 
rzutowania itp.
Najgorzej wygląda sprawdzanie wydajności - typowy programista C++ ma 
świadomość, że po skompilowaniu programu już się nie da z niego nic 
wycisnąc... a tu prosze  te opcje, które dotycza wydajności i który taki 
zrozpoczony gość szuka przy opiesie javac są dostępne w komendzie java.
Co gorsza tworzy sie benchmarki, które mierzą (niepotrzebnie) czas 
uruchamiania, kompilacji i potem wyciąga się durne wnioski

Po prawdzie to pamietam, że przechodząc z C++ ileś razy wrypałem sie w 
jakieś bardzo zabawne  pułapki - ale nie przypomnę sobie teraz.
> 
> 
>>I jeśli zostawi się jakąś furtkę to zawsze znajdzie sie ktoś kto w nią 
>>wlizie (bez pozwolenia).
> 
> 
> Zdarzały się takie próby. Jak oglądał to jakiś kierownik w Stanach, to
> faktycznie niektórzy włazili. U nas jednak się to jeszcze nie zdarzyło. U nas
> kierownicy są tak skuteczni, że żadnemu takiemu sabotażyście nie przepuszczą.
> 
> U nas na WSZYSTKO trzeba mieć pozwolenie. Od kierownika. Każdy kawałek kodu,
> który powstaje, albo jest zmieniany, musi przejść przez jego oczy.

No to wam bardzo wspólczuje. Może jednak kierownik każe wam przejś na 
jave jeśli zależy mu na zdrowiu swoich oczu.

>>W takim projekcie jedyną rozsądną formą 
>>sprawdzania jest ... automatyzacja - (kontrola stylu, cyclomatic 
>>complexity,
> 
> 
> Taaa... najnormalniej w świecie oszukujecie się. Faktem jest, że to jest też
> dobre, bo powstrzyma zapędy różnych cwaniaczków od robienia syfu, ale to nie
> jest lekarstwo na wszystkie problemy.
> 
> 
>>unit testy etc.).
> 
> 
> Nie wiem, co takiego jest niezwykłego w UT, przecież to normalny etap pracy
> nad oprogramowaniem.
A pisze, że niezwykłe coś jest?
> 
>>Wybór bardziej koszernego języka jest jedną z form tej automatyzacji.
> 
> 
> Co za szurnięty argument...

Całkiem oczooszczędny :-)
> Jeśli potrzeba nam faktycznie jakiegoś sprawdzania, czy użytkownik nie użył
> czasem takiej-a-takiej zakazanej konstrukcji, to można albo zrobić narzędzie,
> które samo to sprawdzi, albo to tak czy siak wyjdzie na inspekcji.
> 
> To samo dotyczy C++ jak i Javy.

Czy piszesz o tej swojej klasie Value - widzisz w C++ zrobienie czegoś 
zabezpieczającego choćby skutecznego w 95% jest cholernie trudne.

>>W zasadzie myślę, ze nie patrzysz na 
>>problem z tego punktu widzenia co ja. Dla mnie różnice miedzy C++ 
>>(dobrze opakowanym w boost, stl, gc,  itp) a Javą (z puntku widzenia 
>>samego języka) są małe. Jest to ten sam, hakerski, imperatywny, bez 
>>polotu język (tylko przynoszący zysk).
>>Idąc dalej w projektach, gdzie mogę to narzucić nie używam javy ... 
>>tylko jej mocno ograniczonego podzbioru (narzuconego kontrolą stylu, 
>>miarami  itp).
> 
> 
> To ja nie rozumiem, z jakiego punktu widzenia ty patrzysz na problem.
> Mogę to określić w ten sposób:
> 
> Masz zespół kilku programistów, którzy nad kodem nie mają żadnej kontroli (w
> każdej chwili ten kod może wziąć kto inny i namieszać).
To się nazywa kupić. My niestety nie mamy prawa własności do kodu.

> Nikt nie ma kontroli nad tym, jak oni ten kod piszą.
Może musisz podrzucić swojego kierownika ?

> Nikt tego kodu po nich nie ogląda.
Czyżby mieli inne zajęcia po godzinach ?

> Każdy sobie pisze jak mu się podoba i nikt nie sprawdza, co każdy gość
> naskrobał.

Dzięki, ogólnie, ciesze się że tak doskonale znasz moją firmę - jak ktoś 
z moich współpracowników to przeczyta - to się pięknie załamie :-).
Zwłaszcza, że mnóstwo z nich przyszło do nas uciekajac przed niezłym 
syfem w polskich i zagranicznych firemkach.

> Może to, że ja z takim sposobem tworzenia oprogramowania nie miałem do
> czynienia nigdy od czasu rozpoczęcia pracy w mojej bieżącej firmie, powoduje
> właśnie tą różnicę w punktach widzenia.


> Nie obawiaj się o moją świadomość podczas pisania. To akurat mówi każdy, kto
> przeprowadził rzeczową analizę o tym, jakie zmiany w języku wprowadza
> obowiązkowy odśmiecacz i jakie są jego zalety i wady.

No, zacytuje "pusty śmiech" mnie ogarnia. Lepiej zrób analize jakie 
zmiany wprowadza opcjonalny odśmiecacz - albo 4 używane na raz w jednym 
programie w C++.

>>Spędziłem kiedyś parę tygodni poszukując wycieku pamięci w średnim 
>>projekcie w C++ bez odśmiecacza... i znalazłem, że gdzieś było użyte 
>>delete ... zamiast delete[].
> 
> 
> A mogę zapytać, w jaki sposób to znalazłeś? Czy może poprzez debugowanie kodu?
debugowanie w takim przypadku nie pomaga.
zrobiłem coś w stylu zliczania instancji i kontroli pamięci (na wszytkie 
moje typy  -to mogłem łatwo)--  nie pomogło.
sprawa dotyczyła exportowania gdzieś głupiej tablicy 2 doubli.
(nie pamiętam jak znalazłem to w końcu - czy z jakimś narzędziem czy 
przez przypadek  - pamietam, że długo wiedziałem w których kilku 
linijkach jest problem ... ale nie czaiłem co jest nie tak.
w końcu jak się korzysta z stl to się o takich rzeczach jak delete[] 
zapomina dość szybko :-) )

> Jeśli tak, to rzeczywiście, nie dziwię się, dlaczego musisz używać
> "ograniczonych języków".

>>To mi wystarczyło. Nadal pisałem w C++, ale dostawiłem sobie odsmieczacz,
> 
> 
> Typowe podejście w stylu łatania bezpiecznika drutem.
> 
> Odśmiecacz _NIE_ załatwi ci problemu wycieków pamięci. Pozwoli ci tylko co
> najwyżej mieć tą pamięć pod kontrolą, co najczęściej oznacza, że jesteś w
> stanie powstrzymać co najwyżej tzw. progresywne wycieki pamięci. Mające
> znaczenie tylko gdy są faktycznie częste, a aplikacja ma chodzić długo bez
> restartu.
> 
> Jeśli masz jakieś przekonujące argumenty, że jednak odśmiecacz ma zalety, to
> zapoznaj się najpierw z tym poniżej:
> 
> http://warp.povusers.org/grrr/java.html
znowu mnie uczysz javy ? i to puszczając stronke jakiegoś frustrata?
Memory leaks w programach w javie to dla mnie chleb powszedni 
(sprawdzanie głównie czy aby nie ma)- tyle, ze mam dość fajne narzędzia 
do analizy sterty  - które powodują,  że błyskawicznie znajduje się 
winnych (jeśli sa - w javie trzeba się troche postarać).
  Fajne narzędzia to znaczy - umożliwiają np. monitorowanie sterty na 
systemie produkcyjnym i to co do ostatniego bajta - nieważne z jakiej 
biblioteki pochodzi.

(BTW> w javie pod tym wzgledem, przeszkadza przyzwyczajenie z C++, w C++ 
jak się da delete na obieklcie który jest w użyciu to sie program 
wywali, i programista C++ jest przyzwyczajony do problemu dokładnie 
odwrotnego - szukania nadmiarowych delete, a nie jak w javie 
nadmiarowych użyć)

>>>Zapominasz znów, że to są problemy Java-specific. W przypadku C++ jeśli kod
>>>"metowy" jest zły, to się po prostu nie skompiluje. Jak się skompiluje, to
>>>najczęściej oznacza, że jest dobry. Natomiast stosowanie metod dynamicznych,
>>
>>Nie jest tak jak piszesz - skompiluje sie i wylezie problem dopiero np. 
>>na testach - podawałem już dlaczego.
> 
> 
> Pokaż mi jak i dlaczego - niczego nie napisałeś jak do tej pory o tym,
> dlaczego tego typu problemy są w C++ przy wzorcach. O ewentualnych przykładach
> nie wspominając.
Sam łatwo napiszesz przykład złośliwy.... tylko po co?
Nie wyciągne teraz odpowiednika z rzeczywistości, ale akurat taki 
problem się może pojawić - koniec.

>>>co jest bardzo powszeche w Javie, oznacza w praktyce konieczność robienia
>>>bardzo rozbudowanych testów jednostkowych zapewniających poprawność. Często
>>>też konieczność debugowania tego, czy te instrukcje w runtime poskładały się
>>>do kupy tak, jak powinny.
>>
>>Dokładnie tak jest w jednym i w drugim języku. Zaczynam poważnie 
>>podejrzewać, że nie masz wielkiej styczności z C++ :-)
> 
> 
> Dokładnie tak jest w jednym i w drugim języku, ale o ile w C++ jest występuje
> to tylko w tych miejscach, w których rzeczywiście dynamizmu używamy, o tyle w
> Javie występują one po prostu WSZĘDZIE, bo WSZĘDZIE używa się dynamizmu.

Ciekawostka.

> Skoro ty nie wiesz takich prostych rzeczy, to pewnie dlatego, że od początku
> traktowałeś C++ jak Javę bez odśmiecacza. Co też odpowiednio świadczy o twojej
> znajomości C++.

Nie mogłem tak traktować, C++ znałem na wylot na długo (lata) zanim 
pierwszy fragment programu w javie zobaczyłem na oczy.

>>>Sam miałbym problemy z ich zaimplementowaniem, mając na uwadze dowolny poziom
>>>zagnieżdżania kontekstów wewnątrz jednej funkcji.
> 
> 
>>Stary, jak to ? przecież w makrach da się wszystko zrobić :-)
> 
> 
> Nie wstawienie odpowiednich kawałków kodu w arbitralnych miejscach.
A nie mozna pokryć makrem { i  } ?(nie wiem to pytanie - nie chce mi sie 
sprawdzać )

>>w C też.
> 
> 
> No jasne, pożartujmy sobie jeszcze.

>>>
>>>W każdym. Zużycie pamięci i mocy procesora.
>>
>>Pomyliłeś się w jednym i drugim.
>>Bo to nie jest takie proste jak Ci się wydaje.
> 
> 
> Oczywiście, że jest proste.
> 
> Jeśli mam choćbyu ten cały stos intów, to overhead na każdy obiekt klasy
> opakowującej doskonale obniża wydajność, jeśli porównać to z używaniem
> "gołych" intów. I to wydajność pod "każdym" względem.
> 
> 
>>Głównym powodem takiej a nie innej implementacji java generics są ... 
>>urządzenia mobilne.
> 
> 
> Taaa.. bardzo jestem ciekawy, skąd ty masz takie informacje.

Widzisz, ja ten projekt oglądałem jak się rozwijał.

>>Chcieli chłopaki objętość programów ograniczyć... bo 
>>stwierdzili, że to może być większy problem niż rozmiar danych.
> 
> 
> Zaraz się chyba rozpłaczę do rozpuku. W sytuacji gdy różnica w objętości
> pomiędzy kodem a danymi liczy się w rzędach wielkości, goście martwią się, że
> im się kod niebezpiecznie rozrasta.

>>(wcale nie mam pewności co do tej tezy  -ale nie ja ją wymyśliłem a nie 
>>jestem specem od oprogramowania małych urządzonych, żeby sie wypowiadać).
> 
> 
> To może powiedz mi, kto ją w takim razie wymyślił.

JSR-14 - to oni.

>>(Fakt, że na normalne komputery do zastosowań nawet desktopowych 
>>objętość kodu programu ma marginalne znaczenie)
> 
> 
> Objętość kodu programu ma marginalne znaczenie w ogóle. Zwłaszcza
> wystarczająco dobrze o tym świadczy popularność optymalizacji przez rozwijanie
> pętli i wywołań.
Czyżby w takim razie wydajność nie miała znaczenia (pisze o rozwijaniu 
pętli) :-) ?

> Z tego, co ja wiem, to generyki są jakie są tylko i wyłącznie dlatego, że jest
> to jedyna metoda, żeby wpasowały się w aktualne reguły wirtualnej maszyny
> (przynajmniej tak twierdził Anders Hejlsberg).

Argument równie sensowny jak ten, że const referencje nie bedą działać 
na AMDkach. JVM to prawie chamski assembler - naprawde ma w ... d - co 
też jest przez kompilator javac tworzone ( i ile jest tego kodu).

Jest jeden ważny ficzer obecnej implementacji - zgodność starego 
skompilowanego kodu z nowym (przy generykach) - ale to nie jest ficzer 
przesądzający. W końcu mogli np. kazać stare biblioteki przekompilować.


>>Co do zużycia procesora - to jest zagadnienie już inne - ale patrząc na 
>>to, że finalnemu kodowi w asemblerze zupełnie zwisa jaki co ma typ to 
>>ten argument jest taki sobie.
> 
> 
> Ale nie zwisa mu to, ile razy dereferuje wskaźnik i ile szurniętych operacji
> musi wykonać, żeby przeprowadzić operację na takich wartościach.
Bzdura - juzo tym pisałem. Po co ma to robić? To nie C++ tu runtime wie 
z czym pracuje.

> 
>>Argument dobry i prawdziwy ale jednak dość specyficzny... lepiej było 
>>stos stu  milionów booleanów podać. (to dopiero byłby dramat).
> 
> 
> Ty chyba jesteś chory. Ale dobra, niech dzisiaj znów będzie dzień dziecka:
> 
> Możliwe, że przykład nt. 100 milionów intów jest mało praktyczny. Ale nie ma
> żadnej różnicy pomiędzy tym, czy mamy jeden zbiornik po 100 milionów, czy dwa
> po 50. Tak? Skoro tak, to znaczy że nie ma również różnicy pomiędzy
> posiadaniem jednego zbiornika, który ma 20 milionów intów, i drugiego, który
> posiada 20 milionów liczb zespolonych?
> 
> I tak rozdrabniając to coraz bardziej, dochodzimy do bardziej praktycznych
> przykładów, a stosunek zajętości pamięci programu w Javie i programu w C++,
> gdzie używa się typów wartościowych, pozostaje prawie taki sam. Może i różnica
> trzykrotnej objętości jest przesadzona, ale weź też pod uwagę, że ta zajętość
> pamięci w przypadku Javy jest i tak wzięta z przesadnym optymizmem. Dlatego w
> najlepszym razie program w Javie może zająć jedynie dwa razy więcej pamięci,
> niż program w C++.
> 
> Jeśli zaś program w C++ zajmuje ci w czasie działania 500 MB pamięci, to
> wykonujący to samo program w Javie...
> 
> No dobra. Koniec dnia dziecka na dzisiaj.
No dobra - tak czy siak zostało mi jeszcze 2 gb wolnego :-)

>>(pomyśl o std::vector<bool> kiedyś ktoś walnął tym samym argumentem co 
>>ty porównując C z C++ :-) ).
> 
> 
> No nie rozumiem o co ci chodzi. Przecież w vector<bool> każdy element zajmuje
> jeden bit. Więc vector<bool> zajmie ci zawsze tyle, co ilość bitów wyrównana
> do pełnych ośmiu plus stały overhead (12 bajtów).
> Nie zawsze też interesuje nas dynamiczny wektor bitowy; czasem pewnie też
> sensownie jest użyć statycznego zbiornika z bitami, czyli bitset.
>>Co za problem zdobyć na tak specyficzny przypadek odpowiednio 
>>przygotowaną implementację.
> 
> 
> Tak, a potem na jeszcze specyficzną i jeszcze specyficzną...
> 
> I pamiętaj tylko potem, że musisz użyć VectorBoolean a nie Vector<boolean>.
Na sto milionów booleanów - będę pamiętał raczej. Jak mi poleci 
OutOfMemory - tym bardziej :-)

>>Fakt jest taki, że java generics ma słabą stronę pod tytułem tablice.
>>(nie wiem czy to będzie zmienione, poprawione w przyszłości- są różne 
>>koncepcje. )
> 
> 
> Ciekawi mnie, dlaczego tak jest, swoją drogą (nb. trzeba przyznać panu AL:
> rzeczywiście "eleganckie rozszerzenie języka").

Zaglądnij na forum java generics na java sun - tam sie to tłucze 3 razy 
dziennie.

-- 
http://www.99-bottles-of-beer.net/language-java-866.html
Technical Details
Message-ID: <djds22$854$1@news.dialog.net.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mail
References: <nfhjk1hl02upbbv345glfvo4kc2fun0nfm@4ax.com> <dj38jh$ot4$1@nemesis.news.tpi.pl> <65bal15agggp87dn5i76d97ahr0gbtpi5u@4ax.com> <dj3frf$q3u$1@atlantis.news.tpi.pl> <dj3tvl$e7f$1@kujawiak.man.lodz.pl> <1129820347.23956@kwintesencja.lan.mareon.com.pl> <dj8hca$1k7$1@kujawiak.man.lodz.pl> <dj8m6j$hc6$1@news.dialog.net.pl> <djbgur$nua$1@kujawiak.man.lodz.pl> <djbmdd$i4e$1@news.dialog.net.pl> <djc203$8n3$1@kujawiak.man.lodz.pl> <djd3nm$jd7$1@news.dialog.net.pl> <djdfl8$414$1@kujawiak.man.lodz.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mail
From: jarekr <jhratajski@popraw.literowki.pzcota.otne.pl>
Newsgroups: pl.comp.objects
Subject: Re: O, to ta grupa jeszcze istnieje?...
Date: Sat, 22 Oct 2005 19:14:53 +0200
Organization: Dialog Net
Lines: 426
Message-ID: <djds22$854$1@news.dialog.net.pl>
References: <nfhjk1hl02upbbv345glfvo4kc2fun0nfm@4ax.com>   <dj38jh$ot4$1@nemesis.news.tpi.pl> <65bal15agggp87dn5i76d97ahr0gbtpi5u@4ax.com> <dj3frf$q3u$1@atlantis.news.tpi.pl> <dj3tvl$e7f$1@kujawiak.man.lodz.pl> <1129820347.23956@kwintesencja.lan.mareon.com.pl> <dj8hca$1k7$1@kujawiak.man.lodz.pl> <dj8m6j$hc6$1@news.dialog.net.pl> <djbgur$nua$1@kujawiak.man.lodz.pl> <djbmdd$i4e$1@news.dialog.net.pl> <djc203$8n3$1@kujawiak.man.lodz.pl> <djd3nm$jd7$1@news.dialog.net.pl> <djdfl8$414$1@kujawiak.man.lodz.pl>
NNTP-Posting-Host: xdsl-7312.wroclaw.dialog.net.pl
Mime-Version: 1.0
X-Trace: news.dialog.net.pl 1130001282 8356 84.40.137.144 (22 Oct 2005 17:14:42 GMT)
X-Complaints-To: abuse@dialog.net.pl
NNTP-Posting-Date: Sat, 22 Oct 2005 17:14:42 +0000 (UTC)
User-Agent: Mozilla Thunderbird 1.0 (Windows/20041206)
X-Accept-Language: pl, en-us, en
In-Reply-To: <djdfl8$414$1@kujawiak.man.lodz.pl>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit