freedoku.net ma już rok!Rok temu udostępniłem pierwszą wersję freedoku -- darmowego sudoku przez przeglądarkę. Niedawno przedłużyłem ważność domeny, więc freedoku zostanie z nami na trochę dłużej ;)
A jak to się zaczęło?
Miesiąc temu próbowałem znaleźć sudoku działające w przeglądarce, w które da się dość przyjemnie grać. Niestety, nic nie spełniło moich oczekiwań, więc... zrobiłem własne ;)
Gra nie odniosła ogromnego sukcesu, ale nie spotkała jej też spektakularna porażka ;). Freedoku ma codziennie kilka/kilkanaście wejść, więc nie jest źle. Zwłaszcza, że nie jest w żaden sposób promowane.
W dalszej części garść statystyk z google analytics.
Zmiana systemu kontroli wersjiDotychczas (o ile w ogóle ;)) używałem SVN jako systemu kontroli wersji. Repozytorium trzymałem na swoim komputerze i nawet spełniało to swoje zadanie.
Przyszedł taki czas, że nad projektem potrzebuję pracować sprawnie z kilku komputerów jednocześnie, a komputer na którym miałem repozytorium SVN z pewnych przyczyn nie zawsze może być włączony. Na początku myślałem o wykupieniu jakiegoś taniego VPSa i trzymania tam repozytorium, jednak ostatecznie wybór padł na użycie Gita i hosting na GitHub.
Git jest dość młodym SCM, jednak sprawdził się już przy pracy nad jądrem linuksa (dla tego zadania został stworzony) i wieloma innymi projektami (w tym Ruby on Rails). Dlaczego na niego padł wybór?
Jedną z głównych cech Gita jest to, że jest zdecentralizowany i każdy komputer może być serwerem. Wygląda to w ten sposób, że cały czas pracujemy na repozytorium, które mamy na naszym komputerze, a gdy jakiś feature jest gotowy to dopiero wgrywamy nasze zmiany na serwer.
To dopiero początek mojej przygody z Gitem, ale już teraz wygląda na to, że się zaprzyjaźnimy :)
Przerwa? Nie ma tak dobrzeJuż od miesiąca nie pojawił się żaden nowy wpis na stronie -- wyjazd wakacyjny sprawił, że się trochę rozleniwiłem. Wygląda jednak na to, że się to już poprawia.
Niedługo powinny pojawić się jakieś ciekawe informacje i może uda mi się w końcu przygotować minirecenzję laptopa Hp Pawilon tx2650ew i ciut dłuższy wpis na temat serializacji plików XML w C#. W międzyczasie dłubię przy swoich projektach, jednak po pracy jest na nie zdecydowanie za mało czasu i nie mam pojęcia kiedy będę mógł coś zaprezentować.
Freedoku w wersji do drukuPlansze z freedoku można wydrukować, ale czy nadają się one do druku na ulotce, gazecie itp.? Nie bardzo. Wersja na stronie do druku jest specjalnie uproszczona (oszczędzanie tuszu / tonera) i drukowaniem zajmuje się tak naprawdę przeglądarka.
Potrzebowałem planszę do druku z 300 DPI, a to wymaga przygotowania grafiki w odpowiedniej rozdzielczości -- zwykłe przeskalowanie nie da wystarczająco dobrych rezultatów.
Napisałem program, który generuje plansze z freedoku dla zadanego DPI i boku planszy w cm, a efekt wyszedł całkiem pozytywny. Plansza o boku 7 x 7 cm przy 300 DPI wygląda tak:
Całość zaimplementowana w C#, przy okazji opiszę pewnie jakieś wskazówki odnośnie robienia podobnych rzeczy. A do czego mi potrzebne takie grafiki? W ciągu kilku tygodni powinna pojawić się na to pytanie odpowiedź ;).
Zdradzieckie DPI w plikach PNGBiblioteka GDI+ stara się być czasami sprytniejsza niż byśmy tego chcieli i podczas rysowania uwzględnia informację o DPI zawartą w pliku (jest to chunk pHYs), co czasami może przełożyć się na dziwne rezultaty. Jak dziwne? Weźmy jedną grafikę i narysujmy ją z DPI 72, 96 i 300, efekt jest taki:

Może się przez to okazać, że nasze narzędzia generujące grafiki będą dawać dziwne rezultaty. Na dodatek standardowo używane jest DPI z ustawień systemu (standardowo 96), które użytkownik naszego narzędzia może mieć zmienione.
Niektóre narzędzia przetwarzające obrazy zapisują błędnie informację o DPI, o czym przekonałem się parę dni temu, gdy 1/3 grafik testowych (które sam kiedyś tworzyłem) miała złe DPI.
Jak można temu zaradzić? Jako, że nas będą interesować tylko piksele, możemy zmienić DPI wczytanego obrazu za pomocą metody SetResolution i tak samo zrobić dla obrazu, który generujemy -- dzięki temu wszystkie będą miały takie samo DPI i problem powinien zniknąć.
iPod TouchNiedawno stałem się posiadaczem iPoda Touch (pierwsza generacja). Jako, że uznałem, że nowy sprzęt jest zbyt drogi, kupiłem używanego na allegro w bardzo dobrym stanie i atrakcyjnej cenie. Taki sprzęt można już upolować za ~350 zł.
Do niedawna patrzyłem na iPoda Touch jako na drogą zabawkę, która nie ma dużo więcej zastosowań niż przeciętny odtwarzacz, a w wygodę i sensowność grania nie bardzo wierzyłem. Okazuje się, że się myliłem i sprzęt bardzo pozytywnie mnie zaskoczył.

Fullmetal Alchemist BrotherhoodTym razem coś trochę innego -- chciałbym polecić anime Fullmetal Alchemist Brotherhood ;)
Przez lata oglądałem wiele różnych anime i zdecydowanie w moje gusta bardziej trafiają te trochę mniej ambitne i o lżejszej tematyce (nie, Pokemon się nie kwalifikuje ;>). Kilka lat temu oglądałem anime Fullmetal Alchemist, jednak pozostał spory niedosyt -- tylko do pewnego momentu było związane z mangą, później niestety było jakieś takie mniej spójne i było czuć, że czegoś brakuje.
W tym roku zaczęło powstawać nowe anime, tym razem oparte w pełni na mandze. Muszę przyznać, że zrobiło na mnie duże wrażenie -- począwszy od jakości animacji, kończąc na tempie akcji i spójności fabuły (choć tu zdarzają się drobne wpadki). W tej chwili jest już 20 odcinków i kolejne pojawiają się raz w tygodniu.
Najciekawsze jest to, że można oglądać je w pełni legalnie i za darmo za pośrednictwem serwisu youtube. Na dodatek dostępne są polskie napisy.
Na koniec czołówka dla zachęty ;)
Odtwarzanie dźwięku za pomocą MCIXion pisał ostatnio o odtwarzaniu dźwięku za pomocą PlaySound. Jak dla mnie, ta metoda ma jedną ogromną wadę -- nie pozwala na odtworzenie wielu dźwięków jednocześnie.
Okazuje się też, że dźwięk możemy odtwarzać za pomocą MCI (Media Control Interface). W MSDN można znaleźć szczegółowe informacje na temat użycia. W dalszej części prosty przykład, który potrafi coś odtworzyć.
Dwa nowe projektyPowoli pracuję teraz nad dwoma projektami, o których jeszcze nie było wspominane. Czas najwyższy to zmienić.
GraphIt (zalecana wymowa 'po naszemu' to po prostu grafit ;)) jest biblioteką dla .NET wspierającą rysowanie różnego rodzaju grafów i diagramów. Będzie stanowiła część mojej pracy magisterskiej i docelowo będzie udostępniona na licencji LGPL. Z powodu kilku problemów technicznych powstaje wolniej niż się spodziewałem, ale powinno się to już zmienić. Mam nadzieję, że w przyszły weekend będę mógł pokazać screeny z jakiegoś prostego użycia.
Jestem w trakcie okrajania Wombata, żeby stał się trochę lżejszy i łatwiejszy w użyciu. Trochę rzeczy w oryginalnym projekcie było zrobionych nie do końca dobrze, brakowało też m.in. obsługi dźwięku, którą trzeba w końcu dodać. Przy okazji pracuję nad większym odseparowaniem rzeczy związanych z konkretnym systemem operacyjnym i renderer jest przenoszony na OpenGL. Biblioteka wciąż będzie zamknięta, ale możliwe, że niedługo pojawią się jakieś małe gierki oparte na tej bibliotece (ale za wcześnie jeszcze na szczegóły).
Wszędzie dobrze, ale na localhost najlepiejStrony internetowe zdecydowanie szybciej implementuje się pracując na localhost, zwłaszcza z gotowymi pakietami WAMP, np. XAMPP. Niestety pojawia się kilka problemów, przez które nie jest to aż tak wygodne jakby się chciało.
Pierwszym problemem są subdomeny -- jeżeli pracujemy na czyimś kodzie, gdzie odwołania do plików graficznych/css/podstron zaczynają się po prostu od / będzie nieciekawie. Jeżeli nasza aplikacja będzie na http://localhost/test/, to plik /logo.png jest rozpoznawany jako http://localhost/logo.png. Niby możemy przenieść całą aplikację do głównego katalogu serwera, ale nie jest to zbyt wygodne przy dłuższej pracy.
Drugim problemem jest współpraca z innymi aplikacjami znajdującymi się na domenie, na której będzie docelowo znajdować się aplikacja. Najłatwiej jest ją zrealizować przez ciasteczka (np. sprawdzenie czy użytkownik jest zalogowany). Niestety (a właściwie dobrze) przeglądarki ze względu na bezpieczeństwo, nie pozwalają każdemu odczytywać ciasteczek -- musi się zgadzać domena.
Jak można sobie z tym łatwo poradzić? Odpowiedź na to pytanie znajduje się w dalszej części.