michu
Reputacja
3,516
Głosów ogółem

- 298

- 33
- Prawdziwe imię
- Michał Chaniewski
- Członek od
- 6 miesięcy, 2 tygodnie
- Ostatnio widziany
- 4 tygodnie, 1 dzień temu
- Witryna
- http://michu3ci...
- Miejscowość
- Gdynia
- Wiek
- 33
O mnie
Programista od 8 roku życia. Przez pierwsze dwa lata pisałem programy w BASICU na platformie "brulion A4". Przez następny rok rozgryzałem, dlaczego moje programy nie działają po wklepaniu w Atari 65XE. Potem już jakoś poszło...
Motto: "Walking on water and developing software from a specification are easy if both are frozen."
Pytania: 1
-
2010-01-24 00:54:19
Dobre przykłady/wzorce fluent api w C#?
Szukam ciekawych przykładów implementacji tzw. fluent API dla języka C# lub wzorców projektowych / artykułów traktującyc
Odpowiedzi: 174
-
2010-01-15 11:23:27 Jakie języki mają przyszłość? [zamknięte]
Cóż. C# zyskuje tempa od lat, w końcu zaczął się pojawiać wokół niego solidny ruch open source. Visual Basic i Visual Basic .NET są od lat najczęściej używanymi językami na świecie, tylko bez wielkiej widoczności - to są typowe środowiska programistyczne używane w korporacjach.
Java jakby pogrążyła się w stagnacji, jako język - i ponoć traci developerów. Tak czy inaczej wciąż jest bardzo silna i warto ją znać.
Ostatnio "na fali" są języki funkcyjne, głównie z uwagi na łatwe skalowanie i dystrybucję programów - tutaj warto zwrócić uwagę np. na Erlanga i F#. Nawet jeżeli nie zamierza się w nich programować, to warto je poznać - koncepcje programowania funkcyjnego to ciekawy paradygmat który, poznany, bardzo korzystnie wpływa na to jak się korzysta z klasycznych języków imperatywnych.
Warto też poznać jakiś język dynamiczny... Osobiście lubię Ruby, za przejrzystość, ekosystem open source, dużą ilość materiałów. Alternatywnie - Python na przykład...
Co jeszcze - językiem roku 2009 z całą pewnością był fatalny, ale wszechobecny JavaScript. Jeżeli ktoś się chce zająć webdevelopmentem, to musi go znać.
Nie stawiałbym na PHP. Język przestarzały, brzydki, a rynek pracy jest tak zatłoczony że trudno o dobre stawki.
No i zawsze jest dobra i dobrze płatna praca dla dobrych programistów C++. Ale to droga usiana cierniami, zwłaszcza jeżeli ktoś poznał najpierw język/środowisko, które robi za niego więcej...
Jeszcze jedno. Warto być specjalistą w czymś, co mało kto zna. COBOL, ktokolwiek? Można zgarnąć naprawdę niezłą fuchę... jeżeli się lubi babrać w takim czymś.
-
2010-01-24 22:20:53 wyważanie otwartych drzwi, czyli pisanie czegoś, co już jest napi
Odpowiedź pragmatyczna: Tylko jeżeli uważasz, że możesz zrobić lepiej (co na ogół przekłada się po prostu na "w sposób lepiej dopasowany do moich potrzeb").
Odpowiedź edukacyjna: Żeby się nauczyć jak coś takiego zrobić.
Odpowiedź romantyczna: Tak, bo programowanie jest cudowne i uwielbiam tworzyć coś z niczego, a w dodatku mam na to czas.
Osobiście uważam, że tworząc projekt w pracy, komercyjnie, im mniej kodu się napisze by osiągnąć dany cel, tym lepiej. Natomiast "po godzinach", wszystko co zrobisz to Twój rozwój. Gdyby nie było warto, to do dzisiaj mielibyśmy jeden framework MVC, jeden mapper ORM, jednego CRM-a, jeden system operacyjny, jedną (pewnie systemową) bibliotekę do pracy z datą i czasem...
No i oczywiście trudno oczekiwać żeby ktoś zabrał się za pisanie na nowo czegoś, co już istnieje, aby osiągnąć dokładnie ten sam efekt - na ogół to wynika z silnych opinii na temat jakiegoś rozwiązania i co można zrobić, by było lepsze. Zatem, odpowiadając wprost na Twoje pytanie - głównie po to żeby zrobić coś lepiej i sprawdzić siebie. Rywalizacji jeszcze nie widziałem w tym kontekście.
-
2010-02-06 00:15:07 Na ile sposobów można wydać 100 zł? :)
Najprościej chyba przez rekurencję. Zaczynasz od 0, w pętli jedziesz po nominałach które nie powodują przekroczenia sumy i dla każdego z tych nominałów wywołujesz rekurencyjnie przekazując jako parametr bieżącą sumę i listę dotychczasowych nominałów. Po osiągnięciu sumy 100 zł wypisujesz listę.
Głębokość rekurencji nie przekroczy 100, więc nie ma problemu ze stosem. Jedyne co może być problematyczne, to że wyniki będą się powtarzać, różniąc tylko kolejnością nominałów. Możesz ten problem zniwelować zaczynając pętlę wewnątrz procedury rekurencyjnej od ostatniego nominału użytego na poprzednim poziomie rekurencji - wtedy ciągi będą zawsze malejące.
EDIT: Rozwiązanie w C# wygląda jakoś tak:
class Kasjer { private readonly int[] _nominaly = new int[] {1, 2, 5, 10, 20, 50, 100}; public void Wydaj(int suma) { Wydaj(suma, 0, new int[suma], -1); } private void Wydaj(int suma, int wydane, int[] ostatnie, int liczba) { foreach(int nominal in _nominaly) { if (liczba != -1 && nominal < ostatnie[liczba]) continue; if(wydane + nominal > suma) break; if(wydane + nominal == suma) { for(int i=0; i<=liczba; i++) { Console.Write(ostatnie[i] + ","); } Console.Write(nominal); Console.WriteLine(); Console.WriteLine(); break; } ostatnie[liczba+1] = nominal; Wydaj(suma, wydane + nominal, ostatnie, liczba+1); } } }Wywołanie rzecz jasna przez
Kasjer k = new Kasjer(); k.Wydaj(100); -
2010-02-04 10:44:47 Czy singleton to zło?
Na początku - co do przykładu z bazą, to wszystko zależy od środowiska. Np. na platformie .NET jest to złe rozwiązanie, bo tam środowisko utrzymuje własną pulę połączeń i tak naprawdę połączenie nie jest otwierane przy każdym użyciu, a jedynie pobierane z puli. Gdzie indziej - to może mieć sens.
Przechodząc do meritum - singleton ma wady i zalety. Zaletą jest to, że ułatwia dostęp do wspólnych danych. Wadą - to, że ułatwia dostęp do wspólnych danych. To powtórzenie to nie pomyłka. Łatwy dostęp do "wspólnych danych" wydaje się być czymś dobrym jeżeli się nie ma wielkiego doświadczenia w projektowaniu obiektowym. Problem jednak leży nie w dostępie, a w samej idei "wspólnych danych".
Uwspólnianie danych to symptom złego projektu aplikacji. Singleton to "nowoczesny" sposób na zmienne globalne w systemie. Co jest złego w zmiennych globalnych? Mianowicie to, że wprowadzają one między komponentami aplikacji zależności, które nie są na pierwszy rzut oka widoczne. Z każdym komponentem który z singletona korzysta, pojawia się kolejne miejsce o które trzeba dbać - w szczęśliwym przypadku modyfikując singletona, w pechowym - modyfikując dowolny z korzystających z niego składników, jeżeli zależności są mocno skomplikowane.
Singleton jest prosty. Jest chyba najłatwiejszym do pojęcia wzorcem projektowym. To co z nim jest nie tak, to fakt, że korzystanie z niego sprowadza nasz kod do ery kamienia łupanego, tzn. programowania strukturalnego - to z tamtych czasów i koncepcji pochodzi idea zmiennych globalnych. Klasy powinny być w miarę możliwości samowystarczalne, a nie zależeć od jakiegoś centralnego obiektu.
Co z singletonami jako klasami udostępniającymi usługę, a nie dane? A to, to już kompletnie niepotrzebna rzecz. Od takich rzeczy mamy metody statyczne. Nie widzę żadnego powodu żeby ładować tego typu funkcjonalności do metod instancji utrzymywanej przez singletona. Co prawda metody statyczne to tak naprawdę w dalszym ciągu singleton... świadomy programista prędzej czy później zrozumie, że tak naprawdę to w swojej aplikacji chce mieć zamiast tego odpowiedni interfejs, fabrykę (być może w postaci konterera IoC) i tyle klas implementujących zadany interfejs, ile będzie potrzebne.
Co jeszcze... Singleton to zajęta pamięć, albo zasób utrzymywany w czasie, gdy niekoniecznie jest potrzebny. To nadmiar powtarzalnego kodu infrastrukturalnego, jeżeli mamy więcej niż jeden taki twór w naszej aplikacji. To klasa, której w żaden sposób nie da się rozszerzyć za pomocą standardowych mechanizmów dziedziczenia. Słowem - to kraj, w którym grasują smoki ;-) Lepiej się tam nie zapuszczać. Chyba że dokładnie się wie co się robi... tylko że tak czy inaczej, tego typu rzeczy lubią z czasem obrastać czymś, czego potem nie chce się dotykać. Dla mnie obecność w kodzie obiektu singleton to tzw. "code smell" - coś tu śmierdzi, coś się rozkłada - na ogół symptom dużo większych problemów w projekcie aplikacji.
-
2010-01-19 05:16:41 img vs. background-image co i kiedy wybrać?
W zasadzie szybka reguła jest bardzo prosta. Jeżeli "obrazek" ma znaczenie w treści strony jako obrazek, tj. na przykład wyświetlasz zdjęcie, to używaj tagu
<img />.Jeżeli jest to jedynie ozdobnik, to raczej staraj się oddzielić rzeczy, które mają związek li tylko z formatowaniem, od zawartości która ma znaczenie - wypchnij więc obrazek do atrybutu
background-imagew CSS. Zdarzają się wyjątki, typowym jest np. obrazek - ikonka wewnątrz tagu<a />- ale to już rób według własnego wyczucia którego z pewnością z czasem nabierzesz.Tak naprawdę w pliku HTML/XHTML w idealnym przypadku nie powinno być ani grama kodu odpowiadającego za formatowanie. Od tego jest CSS. Z tego powodu np. używa się tagów
<strong></strong>i<em></em>zamiast<b></b>i<i></i>- ponieważ one niosą ze sobą pewnie znaczenie, semantykę, podczas gdy bold i italic to jedynie informacje wizualne. Z tego samego też powodu odchodzi się od rozmieszczania bloków na stronie za pomocą tabel - ponieważ tabela ma znaczenie "zawieram dane tabelaryczne" a nie "układam wizualnie tekst na stronie". Z tego powodu używa się znaczników<h1></h1>itp., zamiast<b><font></font></b>- ponieważ mają znaczenie "nagłówek" a nie "pogrub i powiększ czcionkę". I tak dalej.Google Ci za to wszystko podziękuje lepszym zindeksowaniem strony i łatwiejszym pozycjonowaniem, osoby korzystające np. z czytników tekstu dla niewidomych nie będą zasypywane informacjami które nie są treścią, no i jest jeszcze zawsze satysfakcja z bycia w zgodzie ze standardami i best practices.
Jak chcesz więcej poczytać na ten temat, to zajrzyj na stronę Wikipedii, albo poszukaj w google pod hasłem
semantic html. -
2010-01-19 23:51:50 AJAX zmniejsza wyszukiwalność?
No cóż, jeżeli cały content będziesz miał dostępny jedynie dynamicznie - generowany w locie przez javascript - to rzeczywiście wyszukiwalność takiego czegoś będzie znikoma.
Jak to rozwiązać w praktyce aby wilk był syty i owca cała?
Ano tak, żeby każdy stan Twojego interfejsu dało się osiągnąć URL-em. Jeżeli masz stronę ProductDescription.php, która sama z siebie zawiera niewiele więcej niż 5 zakładek Page1 ... Page5, które są ładowane po Ajaxie, to zrób inaczej:
Stwórz sobie stronę ProductDescription.php przyjmującą parametr pageNo, np. w ten sposób: ProductDescription.php?pageNo=3. Kiedy po raz pierwszy wyświetlasz tą stronę, przekaż jej parametr pageNo=1 i statycznie załaduj zawartość pierwszej wyświetlanej zakładki - no bo przecież wiesz, że ją będziesz musiał i tak pokazać. Kliknięcia na kolejne zakładki powodują podmianę zawartości strony po AJAX-ie.
I teraz zrób dwie rzeczy. Niech ProductDescription.php może wyświetlać statycznie (w sensie AJAX-owym oczywiście, dynamicznie po stronie serwera) dowolną z zakładek, na podstawie parametru pageNo.
W tym momencie masz już załatwione dynamiczne zmiany po AJAX-ie, oraz dostępność każdej z zawartości na podstawie URL-a. Pozostaje to połączyć.
Niech więc Twoje klikalne nagłówki zakładek będą tradycyjnymi linkami
<a href="" />. Jeżeli użytkownik będzie miał wyłączony JavaScript, albo będzie korzystał ze screen readera dla niewidomych, albo będzie nim pająk Google - to będzie mógł "kliknąć" i przejść bezpośrednio pod URL kolejnej zakładki.Jeżeli zaś JavaScript będzie włączony, to kontrolę przejmie handler kliknięcia dołączony do takiego linku. Obsłuż w nim ładowanie treści po AJAX-ie, a następnie zwróc
false- zdarzenie kliknięcia linku nie trafi do przeglądarki i ta nie będzie próbować przeładować całej strony.Takie coś dużo łatwiej zrobić, niż wydaje się na pierwszy rzut oka, jeżeli korzysta się z jakiegoś frameworka MVC. W tym przypadku będziesz zwracał te same widoki z tymi samymi danymi, niezależnie od metody wyświetlania treści (statycznie czy AJAX) - zmieni się jedynie użyty layout (w pierwszym przypadku to będzie cały szablon strony, w drugim - nic, albo prosty
divjako wrapper).Co jeszcze... Są piedółki typowo realizowane po AJAXie - dodanie artykułu do ulubionych, ocena wpisu itd. Im też warto dać alternatywę server-side, bez użycia javascriptu - bo bez tego wspomniane już osoby korzystające ze sceen readerów na ogół mogą jedynie pomarzyć o użyciu danej aplikacji.
Powodzenia, w razie wątpliwości pytaj dalej.
-
2010-01-28 00:08:34 Strony które warto znać
hmm, znajdzie się kilka... wrzucam jedynie strony które uważam za wartościowe niezależnie od języka, jakiego się używa - solidna, nie faworyzująca języków wiedza jest zawsze bardziej przydatna, nauczenie się nowej składni to kilka dni, nowych paradygmatów - czasem miesiące...
- Na pewno strona Martina Fowlera (powtarzam się, nie? mój osobisty guru...), a w szczególności blog
- Podsumowanie wykładu "wprowadzenie do algorytmów" na znanej i lubianej uczelni MIT
- A jak już jesteśmy przy MIT to książeczka online Structure and Interpretation of Computer Programs - niech nikogo nie zmyli że dotyczy ona języka Lisp, to jest jedna z obowiązkowych pozycji świadomego programisty
- A jak ktoś jest twardzielem, to ma do dyspozycji również wideo z wykładów opartych na powyższej książce.
- Wiki na temat najlepszych praktyk w wytwarzaniu oprogramowania
- Lista darmowych książek na temat programowania opublikowana przez jakąś dobrą duszę na portalu Stack Overflow
-
2010-01-19 08:34:53 Jaka jest różnica między string a String w C#?
Żadna.
System.Stringto rzeczywisty typ danych, natomiaststringto alias do niego, taki smaczek składniowy dla wygody.Tak samo zresztą jak
System.Booleanibool,System.Int32iint,System.Decimalidecimalitd. -
2010-02-04 12:34:53 Jak dobrze zbudować aplikację o wielu wersjach językowych?
.NET ma wbudowane mechanizmy do tego - a mianowicie pliki zasobów. Jeżeli chodzi o język formularzy, to:
- ustaw w formularzu właściwość Localizable na True
- ustaw wszystkie teksty tak, aby były w języku jaki uważasz za podstawowy
- zmień wartość atrybutu Language na kolejny język
- wprowadź nowe wartości tekstów w formularzu
- powtarzaj dla wszystkich języków jakie potrzebujesz.
Spowoduje to dodanie do formularza kolejnych plików z zasobami w różnych językach.
Co do tekstów "luźnych" tzn. wyświetlanych w okienkach dialogowych, komunikatach itd., to możesz sobie dodać do projektu plik zasobów (typ pliku Resources) i wprowadzić do niego teksty w jednym języku, potem dodać plik o takiej samej nazwie, ale z przyrostkiem będącym symbolem języka, np. pl_PL.resx i w nim wprowadzić teksty w kolejnym języku... Symbole języków możesz sobie podpatrzeć w dokumentacji, albo podejrzeć jak środowisko nazywa automatycznie tworzone pliki zasobów związane z pierwszą częścią tej odpowiedzi (rozwiń plusik przy obiekcie formularza w Solution Explorerze).
Potem łatwo możesz przełączać się między językami za pomocą właściwości
Thread.CurrentCultureoraz
Thread.CurrentUICultureustawianych dla wątku, w którym działa interfejs użytkownika. Pierwsza z nich odpowiada za lokalizację rzeczy typu formatowanie daty czy liczb, druga - za wybieranie odpowiedniego pliku zasobów do wyświetlania tekstów.
-
2010-01-18 13:10:46 Ile zarabiają programiści w Polsce?
Troszkę nieaktualny, bo za 2008 rok, raport o wynagrodzeniach - wkrótce powinien być dostępny za 2009.















1
1
199