Rozwiąż poniższą zagadkę:
Rozwiązanie i trochę o permutacjach poniżej. Jednak zachęcam spróbować samodzielnie rozwiązać to zadanie.
Czytaj dalej
Rozwiąż poniższą zagadkę:
Rozwiązanie i trochę o permutacjach poniżej. Jednak zachęcam spróbować samodzielnie rozwiązać to zadanie.
Czytaj dalej
Pod koniec lat dziewięćdziesiątych TV Polsat emitował popularny teleturniej Idź na całość. Główna zasada gry była oparta na paradoksie Monty Halla, a polegała na podjęciu decyzji czy pozostać przy swoim pierwotnym wyborze, czy niewiadomą wymienić na inną.
Poniżej masz do wyboru trzy bramki. Możesz wybrać jedną z nich. Gdy już to zrobisz, ja wskażę w której z nich znajdował się jeden z Zonków. Teraz decyzja należy do Ciebie: zostajesz przy swoim wyborze, czy zmieniasz bramkę. Z pozoru podjęta decyzja wydaje się być bez znaczenia – w końcu zostają dwie bramki więc prawdopodobieństwo wygranej powinno być takie samo. Tak jednak nie jest. Mało tego, jedna z tych dwóch strategi daje dwukrotnie większe prawdopodobieństwo wygrania w stosunku do drugiej.
Spróbuj zagrać kilka razy stosując dwie strategie: pozostając przy swoim pierwszym wyborze oraz zmieniając decyzję po wskazaniu Zonka. Zwróć uwagę jak wygląda prawdopodobieństwo wygrania w zależności od strategii.
Symulację napisałem w Javascript, dlatego ktoś bardziej dociekliwy może wygrać w 100% przypadków. Ale nie o to tu chodzi. Dzięki temu każdy ma możliwość zweryfikowania tego czy program przypadkiem nie oszukuje.
Podczas tworzenia oprogramowania na każdym kroku mamy kontakt z danymi w formacie XML. Opiszę tutaj jeden ze sposobów konwersji danych w obie strony Java <-> XML.
Ale na początek przyjrzyjmy się źródłom słynnego już kalkulatora wyborczego. Twórcy oprogramowania wykazali się dość ciekawym podejściem w generowaniu dokumentów XML, a dokładnie wykorzystali zwykłą konkatenację „stringów”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
... string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"; xml += "<save>"; string hour = ""; ... string text = xml; xml = string.Concat(new string[] { text, "<attendance><attendanceHour>", hour, "</attendanceHour><attendanceValue>", value, "</attendanceValue><currentLwyb>", this.currentLwyb.Text, "</currentLwyb></attendance>" }); xml += "<header>"; xml += this.getHeader(this.header); xml += "</header>"; xml += "</save>"; ... |
Nietrudno można sobie wyobrazić co byłoby w przypadku bardziej skomplikowanej struktury zawierającej wiele węzłów podrzędnych i atrybutów. Programista prawdopodobnie niejednokrotnie pomylił się podczas zamykania znaczników (choćby przez „literówki”). Taki kod jest bardzo ciężki w utrzymaniu. Poza tym dokument będzie niemożliwy do odczytu, jeśli np. zmienna this.currentLwyb.Text zawierałaby jeden ze znaków predefiniowanych w XML encji: &, <, >, „, ‚.
Jest to przykład nierzadko spotykanych złych praktyk, a poniżej przestawię bardziej eleganckie rozwiązanie w Javie.
Pod tym adresem umieszczone są były dane pochodzące ze wszystkich obwodów wyborczych.
Wykonałem w Javie program, który pobrał informacje na temat wszystkich osób pracujących w komisjach wyborczych. Pobieranie wykonałem przeznaczając jeden wątek dla każdego województwa z krótkimi opóźnieniami dla każdego żądania http. Pobrało się ok. 30MB danych (tylko pliki xml z danymi członków komisji).
W poprzednim wpisie opisywałem funkcję rank() jako pierwszą z okienkowych. Kolejną często wykorzystywaną funkcją podczas tworzenia raportów jest suma narastająca.
Czytaj dalej
Funkcja okienkowa wykonuje obliczenia w całym zbiorze wierszy tabeli, które są w jakiś sposób związane z bieżącym wierszem. Jest to porównywalne do rodzaju obliczenia, które mogą być wykonane z funkcją agregującą. Ale w przeciwieństwie do zwykłych funkcji agregujących, korzystanie z funkcji okienkowych nie powoduje, że wiersze zostaną zgrupowane w jednym rzędzie wyjściowym, lecz zachowają swoje odrębne tożsamości.
Krótko podsumowując:
Funkcja okienkowa jest w stanie uzyskać dostęp do więcej niż tylko bieżącego wiersza wyniku zapytania.
W poprzednim wpisie został wykonany serwer chatu, jednak klientem była zwykła strona html zapisana na dysku lokalnym. W tym miejscu rozszerzę chat o udostępnienie serwisu http dla klienta.
Biblioteki:
Node.js jest środowiskiem do tworzenia aplikacji po stronie serwera w języku javascript. Wykorzystuje silnik javascript V8 od Google.
Wykonanie oprogramowania serwera chatu z node.js jest błyskawiczne.
Czytaj dalej
Cel: Oprogramowanie w javie chatu działającego w czasie rzeczywistym bez komunikacji asynchronicznej.