Tagowanie obrazków w Windowsie

Zapewne większość osób zajmująca się tworzeniem grafiki, kolekcjonowaniem zdjęć lub ich robieniem próbowała kiedyś je w jakiś sposób uporządkować. Dobrym sposobem jest użycie mechanizmu tagowania, który pozwalaja dodać do zdjęcia wybrane przez nas słowa kluczowe. Metod tagowania powstało wiele, jedno z nich polega na gromadzeniu w oddzielnej bazie opisów naszych zdjęć. Minusem tego rozwiązania jest to, że po przeniesieniu jakiegokolwiek zdjęcia na inny komputer tracimy te informacje. Drugim sposobem o wiele lepszym jest zamieszczanie tagów w pliku ze zdjęciem. W Windowsie Vista została zaimplementowana druga metoda, a konkretnie opracowany przez firmę Adobe standard XMP (Extensible Metadata Platform). Pozwala on dodawać metadane do wielu popularnych formatów dokumentów, zdjęć i plików wideo, m.in. JPEG, PSD, TIFF, AVI, WAV, MPEG, MP3, MOV, INDD, PS, EPS oraz PNG.

Piszę tutaj o tym, ponieważ zostałem zapytany czy po dodaniu jakiegoś nowego znaczniku do zdjęcia pogarsza się jego jakość. Weźmy na przykład kompresję stratną JPEG. Teoretycznie po każdym ponownym zapisaniu zdjęcia w z jakością mniejszą od najwyższej zawsze tracimy jakieś dane. A dodanie metadanych wiąże się przecież z zapisaniem pliku na nowo, tylko pytanie z jakim stopniem jakości?

Na stronach Adobe dotyczącym XMP można znaleźć informację, że ich aplikacja Adobe Bridge potrafi to robić bez straty na jakości, a jak sobie z tym radzi Photo Gallery z Windows Vista? No cóż.. Niestety nie udało mi się znaleźć bezpośrednio informacji na ten temat (czyżby jedynym rozwiązaniem było wciągnięcie PhotoGallery do .NET Reflectora?), ale postanowiłem wykonać kilka testów. W przypadku gdyby zdjęcie było zapisane z kolejnymi stratami odjęcie zdjęcia oryginalnego od kopii powinno dać w wyniku duży jednokolorowy obszar z plamami. Tak więc wybrałem kilka zdjeć w wysokiej rozdzielczości, a następnie zrobiłem po dwie kopie każdego z nich. Do pierwszej kopii dodałem jakieś znaczniki, a drugą otwarłem w programie do obróbki zdjęć i zapisałem z jakością rzędu 70%.

Następnie otworzyłem program graficzny i po kolei pododawałem na różne warstwy każdą z trójek zdjęć (oryginał, otagowaną kopię i skompresowaną kopię). Następnie wybrałem opcję odejmowania warstw. Kolorem podstawowym był kolor czarny. W przypadku odjęcia oryginału i pierwszej kopii nie dało się gołym okiem zauważyć żadnego piksela odmiennego koloru. Tak więc dla pewności scaliłem wszystkie warstwy i przeszedłem w tryb palety indeksowanej. Po zerknięciu na całą paletę ukazały się tylko dwa kolory biały i czarny, z czego białego piksela nie było ani jednego, ale to jest z kolei związany z tym, że zawsze istnieją co najmniej dwa kolory :) . Tak więć pewnym jest to, że kompresji stratnej nie odnotujemy przy tagowaniu zdjęcia. Następną parą do odstrzału był oryginał oraz wersja skompresowana. Po wykonaniu powyższej operacji już gołym okiem można było zauważyć smugi pikseli o kolorach innych niż czarny. Co kończy dowód;). Druga kopia znacznie różni się od oryginału.

Czytając co nie co na temat standardu XMP natknąłem się na informację, że metadane są trzymane w formacie RDF co w przyszłości pozwoli na dalszy rozwój (a może „umożliwi rozwój”?) Web3.0, czyli semantycznego Internetu. Ale to jest tylko jako ciekawostka :)

Windows Server 2008 RC1, Hyper-V i Internet. Update 2

Kolejny dzień zmagań z konfiguracją maszyn wirtualnych chyba również nie zakończy się sukcesem. Przedstawię może najpierw moją sytuację.

Istnieją sobie dwa serwery fizyczne S1 i S3, są ze sobą spięte siecią. Wczoraj na S1 instalowałem kolejny wirutalny serwer S2 na platformie Hyper-V. Dodałem jedną wirtualną kartę sieciową i podłączyłem ją bezpośrednio z kartą fizyczną S1. Teoretycznie wszystko powinno działać, ale niestety nie do końca. Komunikacja z S1 do S3 przebiega bezproblemowo, z S2 do S3 również, z S1 do S2 już niestety nie. Co jest naprawdę dziwne, gdyż według dokumentacji (troszkę lakonicznej) i doświadczenia z sieciami opartymi na oprogramowaniu VMWare powinno wszystko działać..

Microsoft Word 2007 i blog

Jakiś czasem temu wspomniałem o tym, że notki na bloga można dodawać pisząc w Wordzie (w każdym bądź razie w MS Word 2007). Po jego uruchomienu wystarczy wybrać z menu nowy dokument i z listy szablonów „New blog post”. Niestety jest to proces bardzo denerwujący, gdyż odpala się druga instancja aplikacji z nowym szablonem, a stara (z klasycznym dokumentem) dalej zostaje uruchomiona w tle i trzeba to ręcznie zamykać…

Super sprawą byłoby zrobienie odpowiedniego skrótu, aby odrazu przenosił nas do odpowiedniego szablonu… Szperająć trochę w Internecie okazało się, że jest to naprawdę trywialny problem. Oto i jego rozwiązanie:

  1. Stworzyć nowy skrót
  2. Jako obiekt docelowy wybieramy winword.exe (domyślna ścieżka to: „C:\Program Files\Microsoft Office\OFFICE12\WINWORD.EXE” )
  3. Szukamy pliku naszego szablonu blog.dotx (domyślnie: „C:\Program Files\Microsoft Office\Templates\1033\Blog.dotx”)
  4. Łączymy oba ciągi znaków dodająć jeszcze parametr \t przed nazwą szablonu (ostatecznie będzie to coś w stylu :
    „C:\Program Files\Microsoft Office\OFFICE12\WINWORD.EXE” /t”C:\Program Files\Microsoft Office\Templates\1033\Blog.dotx” )
  5. Zapisujemy skrót, nadajemy odpowiednią nazwę i ewentualnie jakąś ikonkę :)
  6. Od teraz możemy się cieszyć większą wygodą podczas tworzenia nowych notek na blogu.

     

Windows Server 2008 RC1, Hyper-V i Internet. Update

Jak to mówią: jak coś nie idzie wróć do problemu później :) . Zrobiłem tak i w tym przypadku.

Problem udostępniania Internetu na wirtualnej maszynie rozwiązałem poprzez ponowne wywołanie kreatora roli Routing and Remote Access. Przedtem o ile wybrałem domyślne ustawienia dla sieci VPN to teraz wybrałem opcję konfiguracji NAT. Po wybraniu interfejsu zewnętrznego oraz interfejsów sieci prywatnych wszystko ładnie automagicznie się skonfigurowało.

Ale tutaj pojawia się kolejna wada sposobu konfiguracji routingu. Aby skorzystać z kreatora należy wpierw wyłączyć usługę Routing and Remote Access (kliknięcie prawym przyciskiem na nazwie w drzewki i wybranie Disable Routing and Remote Access, a następnie włączyć ponownie w sposób analogiczny. W tym momencie ukaże się nam odpowiedni kreator ustawień. Fajnie gdyby odpowiednia opcja pokazała się w menu Action tej usługi.., ale zapewne tak nie będzie.

Teraz zostało mi już tylko skonfigurowanie serwera VPN..

Windows Server 2008 RC1, Hyper-V i Internet

Dzisiaj kolejny raz miałem okazję instalować najnowszą oficjalną wersję testową Windows Server 2008. Moje wrażenia są ogólnie średnie. O ile za pierwszym i drugim podejściem instalacja trwała około 20minut to dzisiaj po połączeniu dysków w RAID0 sama instalacja wydłużyła się do około 35minut. Najpierw 5 minut czekało się zanim do końca odpali się instalator (można było machać tylko myszką, a na ekranie nic nie było…). Kolejne kilka minut zostało straconych na rozpoznanie dysku, ogólnie kiepsko współpracuje z RAIDem.

Po zainstalowaniu pierwsze co zrobiłem to zainstalowałem Hyper-V (tutaj należy dodać, że podczas instalacji systemu nie należy zmieniać lokalizacji na inną niż standardowa – English US – gdyż ta usługa nie będzie działać). Menadżer wirtualnych maszyn jest całkiem całkiem, integracja z konsolą MMC robi swoje;). Następnie stworzyłem nową wirtualną maszynę z dyskiem 35GB, który stworzył względnie szybko, i zainstalowałem kolejny raz Windows Server 2008. Tym razem instalacja wydłużyła się już do prawie godziny z tego już nie jestem zachwycony :) .

Instalacja SQL Servera 2008 na wirtualnej maszynie poszła już całe szczęście dosyć szybko, a w między czasie postanowiłem skonfigurować sieć. I tutaj zaczęły się schody. O ile w konkurencyjnym produkcie VMWare Server (VMWare Workstation) wystarczy włączyć w ustawieniach karty sieciowej opcję NAT i wszystko się robi automatycznie, to tutaj już tak łatwo nie ma. Wpierw należało zainstalować rolę Network Policy and Access a razem z nią NPS (aby stworzyć połączenie VPN – ale to później będę potrzebował) oraz Routing and Remote Access. Jak narazie stanąłem w tym miejscu. Męczyłem się chyba ze dwie godziny kombinując jak tutaj udostępnić Internet na maszynę gościa, ale wszystkie próby zakończyły się niepowodzeniem. Dokumentacji w Internecie jest jeszcze mało, a pomoc systemu Windows o ile w niektórych momentach była bardzo pomocna, to w tym przypadku zawiodła.

Wrócę do tego problemu może trochę później…

XML to XSD? XML to Classes?

Wróciłem po dłuższym czasie do mojego hobbistycznego projektu RubiksCube v2. Zrobiłem ponieważ pojawiła się iskierka nadzieji, że zaliczę na uczelni nim laboratoria z baz danych. Tak więc brakującą częścią do tej pory była cała inteligencja układania kostki. Algorytmy (sekwencje ruchów) już kiedyś postanowiłem przechowywać w pliku XML. Wczoraj dokończyłem projektowanie pliku XML Scheme i.. zacząłem się zastanawiać jak to wykorzystać w projekcie. Rozwiązań było kilka:

  1. Ręcznie parsować plik XML – to już przeszłość…
  2. Skorzystać z zintegrowanego z platformą parsera XML oraz XPath – niestety jest to nadal bardzo wiele roboty i można się zagubić w którymś momencie
  3. Skorzystać z LINQ to XML – to już wygląda dużo lepiej, ale nadal trzeba się odwoływać do elementów poprzez obiekt Xelement, no i brak jest ścisłego typowania obiektów na typy z XSD.
  4. Dzisiaj znalazłem jeszcze taki projekt jak LINQ to XSD. Robi to wszystko co LINQ to XML z jednym małym dodatkiem. Pozwala na ścisłe typowanie obiektów, a to dzięki temu, że sam automatycznie generuje odpowiednie klasy w C#. Niestety wadą uniemożliwiającą skorzystanie z tego cudownego narzędzia jest to, że chwilowo nie jest rozwijany a ostatnia wersja pamięta czasy Visual Studio Orcas beta 1. I z powodu niekompatybilności wersji System.Xml.Linq nie da się tego w prosty sposób uruchomić na wersji RTM. Należy cierpliwie czekać na dalszy bieg wydarzeń…
  5. Szukając dalej znalazłem coś takiego jak CodeXS. Potrafi przekonwertować plik XSD na zestaw klas C# (także VB), a następnie jednym poleceniem wypełnić wszystkie struktury danymi z pliku XML opartego na danym XSD z zachowaniem wszystkich typów (także wyliczeniowych) oraz bardziej skomplikowanych struktur. Na stronie producenta jest dostępna wersja online (wysyłamy plik XSD na serwer i ściągamy archiwum z klasami) oraz postać źródłowa tej aplikacji. W prosty sposób można ją podpiąć pod zdarzenia pre-build w projekcie VS i mamy ładny generator kodu na podstawie XSD. Wadą jest niestety to, że chyba nie będzie można wykorzystać tutaj LINQ, gdyż na pierwszy rzut oka nie ma odpowiedniego wsparcia ze strony IDE. Ale poszukam może jeszcze czegoś na ten temat.

Ostatecznie waham się pomiędy rozwiązaniem trzecim a piątym (czwarte naprawdę niestety odpada). Trzecie na obecną chwilę mimo trochę bardziej skomplikowanej składni pozwala na wygodne przeszukiwanie, piąte natomiast posiada bardzo dobre typowanie danych, a z przeszukiwaniem gorzej.