# Dobry hex edytor
Fri
27
Feb 2009
W życiu programisty bywa tak, że czasem trzeba obejrzeć albo zmodyfikować plik binarny. Potrzebny jest do tego specjalny edytor, który pokazuje bajty jako liczby szesnastkowe (hex). Pytanie tylko - który jest dobry? Chodzi rzecz jasna o jakiś program okienkowy dla Windows, najlepiej darmowy.
Z tego co widzę, dobrego a darmowego niestety nie ma. Dotychczas byłem zwolennikiem starego dobrego Hex Workshop (jest Shareware).
Ostatnio kolega z pracy (pozdro Bartek!) polecił mi Hex Editor Neo. Ma wersję darmową, ale niestety ona jest tak okrojona, że na niewiele się przyda. Ale już pełna wersja (można ją testować przez 14 dni) jest "wypasiona" i przewyższa funkcjonalnością Hex Workshop. W porównaniu z nim brakuje tylko zamalowania zaznaczonego fragmentu pliku na wybrany kolor.
Przy okazji ciekawostka: Hex Editor Neo pokazuje w swoim okienku taką oto informację jak na obrazku. Teraz możemy mówić: "pisząc optymalny kod pomagasz chronić środowisko" :D

A może znacie jakiś inny dobry hex edytor?
Comments | #tools #humor Share
# Nowy artykuł: Własny VFS - wtyczka do Total Commandera
Tue
24
Feb 2009
Skończyłem właśnie pisać nowy artykuł. Zebrałem w nim swoje doświadczenia z pisania wtyczki do Total Commandera do obsługi własnego formatu VFS. Zainteresowanych zapraszam do lektury: Własny VFS - wtyczka do Total Commandera.
Comments | #libraries #tools #productions Share
# Znajdowanie podobnych stringów
Sun
22
Feb 2009
Kiedy wpisujemy w Google jakieś słowo, które jest ewidentną pomyłką, wyszukiwarka sugeruje jego poprawną wersję (np. Programmowanie). Jak zrobić coś takiego i ogólnie jak wyszukiwać w bazie danych podobne łańcuchy, by uodpornić pisaną stronę WWW na drobne pomyłki we wprowadzonym zapytaniu albo wyświetlać sugestię poprawnej pisowni? Niedawno kolega, którego poznałem przy piwie, zdradził mi kilka ciekawych pomysłów.
Po pierwsze, łańcuch trzeba przeliczyć na Hash - inny łańcuch, który dopiero jest wyszukiwany w bazie danych. Algorytm na ten Hash może wyglądać różnie, np.:
Taki Hash wyszukiwany jest w bazie danych, przy czym z bazy pobierany jest nie jeden pasujący rekord, ale też kilka sąsiednich rekordów (poprzednich i następnych wg kolejności alfabetycznej).
Następnie każdy z wyników zwróconych z bazy danych jest porównywany z hashem słowa wejściowego algorytmem Levenshtein Distance (który zwraca podobieństwo dwóch łańcuchów, tak jakby odległość między nimi). Jego wynik mnożony jest przez częstość występowania danego słowa wyszukanego w bazie (czyli np. po prostu ilość wystąpień w skatalogowanym tekście). Np. Punkty = Częstość_słowa / Levenshtein_distance.
Na koniec wybierane jest to słowo lub słowa spośród wyszukanych z bazy danych, które mają największy ten współczynnik Punkty.
Comments | #webdev #algorithms Share
# Wycinanie komentarzy ze skompilowanego shadera
Thu
19
Feb 2009
Shader Direct3D skompilowany do kodu binarnego (np. funkcją D3DXCompileShaderFromFile) zawiera w sobie nie tylko instrukcje asemblerowe, ale i dodatkowe informacje - komentarze. Te komentarze nie są bezużyteczne. Tam zapisana jest np. tablica stałych, którą można odczytać funkcją D3DXGetShaderConstantTable. Jednak jeśli ona nie jest potrzebna, te komentarze można z kodu wyciąć i wtedy shader staje się dużo mniejszy.
Jak to zrobić? Choć trzeba grzebać wprost w pamięci, to nie jest trudne. Konkretny algorytm opisuje na swoim blogu Jesus de Santos Garcia we wpisie Stripping comments from Shader bytecodes. Ja tutaj streszczę go krótko swoimi słowami.
Format binarny skompilowanych shaderów D3D jest udokumentowany w MSDN, na stronie Direct3D Shader Codes. Składa się z sekwencji 32-bitowych tokenów. Ostatni z nich ma wartość 0x0000FFFF i oznacza koniec kodu. Komentarz natomiast rozpoczyna się tokenem 0x####FFFE, gdzie "####" (starsze dwa bajty) to liczba następujących dalej 32-bitowych wartości stanowiących treść komentarza. Takie komentarze można po prostu wyciąć z kodu shadera i gotowe :)
Comments | #directx #rendering Share
# Konferencja IGK 2009
Tue
17
Feb 2009
20-22 marca 2009 w Akademii Podlaskiej w Siedlcach odbędzie się VI Ogólnopolska Konferencja Inżynierii Gier Komputerowych (zobacz też: wątek na forum.gamedev.pl). Już niedużo czasu zostało na rejestrację. Zachęcam do udziału wszystkich zainteresowanych tworzeniem gier. Zapewne jak co roku będą ciekawe referaty, pełen emocji konkurs Compo oraz niezapomniane wieczory w towarzystwie najfajniejszych ludzi z Warsztatu.
Ja oczywiście jak zawsze się tam zjawię. W tym roku nie przygotowuję żadnego referatu, ale za to po raz drugi poprowadzę konkurs - tym razem już oficjalnie, według ustaleń z organizatorami. Muszę tylko jeszcze ulepszyć potrzebny do tego program i ułożyć nowe pytania. Kto chciałby w tym pomóc, piszcie do mnie na email :)
Comments | #igk #events #warsztat Share
# Algorytm na defragmentację dużego pliku
Sun
15
Feb 2009
SceNtriC na swoim blogu często pisze długie notki, w których opisuje swoje algorytmy, więc ja nie będę gorszy i dzisiaj też tak zrobię :) Problem, który rozwiązywałem niedawno, wyglądał tak: Mamy duży plik - tak duży, że nie chcemy wczytywać go całego do pamięci. W pliku są bloki z danymi, a między nimi dziury (na rysunku zakreskowane). Zadaniem jest tak "zsunąć" te dane, żeby dziur nie było.

# Sortowanie naturalne
Thu
12
Feb 2009
Ciekawym algorytmem jest sortowanie łańcuchów w porządku naturalnym. Chodzi o to, żeby liczby traktowane były jako liczby i sortowały się według wartości. Na przykład nazwy plików posortowane normalnie alfabetycznie (leksykonograficznie) będą w takiej kolejności:
Plik.txt Plik1.txt Plik10.txt Plik2.txt Plik24.txt Plik3.txt
Natomiast posortowane w porządku naturalnym będą w kolejności bardziej przez użytkownika pożądanej:
Plik.txt Plik1.txt Plik2.txt Plik3.txt Plik10.txt Plik24.txt
Oczywiście każdy informatyk wie, że należałoby raczej po prostu dopełniać te liczby zerami (np. Plik01.txt), ale mimo wszystko ten algorytm jest dobry do sortowania nazw plików, serwerów itp.
Jak to działa? Całkiem prosto. Mówiąc ogólnie, trzeba porównywać kolejne znaki dwóch łańcuchów, ale kiedy napotka się cyfry, wtedy trzeba rozpatrzyć je jako całe liczby i porównać ich wartości. Implementację w C++ można znaleźć w mojej bibliotece CommonLib (zobacz pliki Base.hpp i Base.cpp, klasa StringNaturalCompare). W PHP jest standardowo taka funkcja - nazwa się strnatcmp. Opis algorytmu w Internecie można znaleźć m.in. tu: Natural Order String Comparison.
# O wyższości wyszukiwania nad wybieraniem
Tue
10
Feb 2009
Mam wrażenie, że w rozwoju interfejsów użytkownika za szczyt wygody dawniej uważane było pokazanie listy jakiś elementów do wybrania przez kliknięcie myszką. Natomiast teraz jasne staje się, że lepiej pozwolić użytkownikowi zacząć wpisywać jakiś wyraz do wyszukania i od razu pokazywać listę pasujących wyników. Taką możliwość mamy np. w:
Comments | #philosophy #gui Share
# Dobry zakup: Pendrive Kingston DataTraveler 150
Thu
05
Feb 2009
Podobno wielkim wyróżnieniem dla firmy jest, kiedy jej marka staje się nieoficjalną nazwą wszystkich podobnych produktów. Tak było z określeniem "walkman" na przenośny magnetofon czy "adidasy" na wszystkie buty sportowe, tak jest też z określeniem "pendrive" na przenośne pamięci flash.
Taki właśnie pendrive kupiłem sobie ostatnio i gorąco polecam. To Kingston DataTraveler 150. Dałem za niego na Allegro ok. 180 zł. Jego pojemność to 32 GB. Ponadto jest bardzo szybki - jego prędkość to (samodzielnie zmierzona, a nie deklarowana): odczyt 30 MB/s, zapis 15 MB/s. Dla porównania, mój poprzedni Kingston 2 GB miał odczyt 10 MB/s. Poza tym bardzo dobrym rozwiązaniem jest, że na czas podłączenia USB skuwkę można zatknąć od drugiej strony zamiast kłaść ją gdzieś na biurku, gdzie łatwo może się zgubić.

Comments | #hardware #shopping Share
# Pliki INI w WinAPI
Tue
03
Feb 2009
Stare dobre pliki INI to format tekstowy do przechowywania konfiguracji. Na przykład:
[Display] Width=1280 Height=800 FullScreen=true
Czasami ten format może się przydać, a chociaż nie jest skomplikowany, to nie każdy ma ochotę pisać do niego własny parser. Dlatego warto wiedzieć, że WinAPI zawiera proste i wygodne funkcje do obsługi plików INI. Znajdują się na dole listy Registry Functions. Można się domyślać, że z każdym wywołaniem plik jest od nowa otwierany i wczytywany, więc te funkcje nie grzeszą szybkością, ale do prostych zastosowań będą OK. Na przykład wczytanie wartości:
char Buf[256]; GetPrivateProfileString( "Display", // Nazwa sekcji "FullScreen", // Nazwa klucza "false", // Wartość domyślna Buf, _countof(Buf), // Bufor wyjściowy FileName); // Nazwa pliku INI ze ścieżką